(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 1) { return Math.min(w, nextW); } return w; } function weekOfGivenYear(marker, year, dow, doy) { var firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]); var dayStart = startOfDay(marker); var days = Math.round(diffDays(firstWeekStart, dayStart)); return Math.floor(days / 7) + 1; // zero-indexed } // start-of-first-week - start-of-year function firstWeekOffset(year, dow, doy) { // first-week day -- which january is always in the first week (4 for iso, 1 for other) var fwd = 7 + dow - doy; // first-week day local weekday -- which local weekday is fwd var fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7; return -fwdlw + fwd - 1; } // Array Conversion function dateToLocalArray(date) { return [date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()]; } function arrayToLocalDate(a) { return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month a[3] || 0, a[4] || 0, a[5] || 0); } function dateToUtcArray(date) { return [date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds()]; } function arrayToUtcDate(a) { // according to web standards (and Safari), a month index is required. // massage if only given a year. if (a.length === 1) { a = a.concat([0]); } return new Date(Date.UTC.apply(Date, a)); } // Other Utils function isValidDate(m) { return !isNaN(m.valueOf()); } function timeAsMs(m) { return m.getUTCHours() * 1000 * 60 * 60 + m.getUTCMinutes() * 1000 * 60 + m.getUTCSeconds() * 1000 + m.getUTCMilliseconds(); } function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) { return { instanceId: guid(), defId: defId, range: range, forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo, forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo }; } var hasOwnProperty = Object.prototype.hasOwnProperty; // Merges an array of objects into a single object. // The second argument allows for an array of property names who's object values will be merged together. function mergeProps(propObjs, complexPropsMap) { var dest = {}; if (complexPropsMap) { for (var name_1 in complexPropsMap) { var complexObjs = []; // collect the trailing object values, stopping when a non-object is discovered for (var i = propObjs.length - 1; i >= 0; i -= 1) { var val = propObjs[i][name_1]; if (_typeof(val) === 'object' && val) { // non-null object complexObjs.unshift(val); } else if (val !== undefined) { dest[name_1] = val; // if there were no objects, this value will be used break; } } // if the trailing values were objects, use the merged value if (complexObjs.length) { dest[name_1] = mergeProps(complexObjs); } } } // copy values into the destination, going from last to first for (var i = propObjs.length - 1; i >= 0; i -= 1) { var props = propObjs[i]; for (var name_2 in props) { if (!(name_2 in dest)) { // if already assigned by previous props or complex props, don't reassign dest[name_2] = props[name_2]; } } } return dest; } function filterHash(hash, func) { var filtered = {}; for (var key in hash) { if (func(hash[key], key)) { filtered[key] = hash[key]; } } return filtered; } function mapHash(hash, func) { var newHash = {}; for (var key in hash) { newHash[key] = func(hash[key], key); } return newHash; } function arrayToHash(a) { var hash = {}; for (var _i = 0, a_1 = a; _i < a_1.length; _i++) { var item = a_1[_i]; hash[item] = true; } return hash; } function buildHashFromArray(a, func) { var hash = {}; for (var i = 0; i < a.length; i += 1) { var tuple = func(a[i], i); hash[tuple[0]] = tuple[1]; } return hash; } function hashValuesToArray(obj) { var a = []; for (var key in obj) { a.push(obj[key]); } return a; } function isPropsEqual(obj0, obj1) { if (obj0 === obj1) { return true; } for (var key in obj0) { if (hasOwnProperty.call(obj0, key)) { if (!(key in obj1)) { return false; } } } for (var key in obj1) { if (hasOwnProperty.call(obj1, key)) { if (obj0[key] !== obj1[key]) { return false; } } } return true; } function getUnequalProps(obj0, obj1) { var keys = []; for (var key in obj0) { if (hasOwnProperty.call(obj0, key)) { if (!(key in obj1)) { keys.push(key); } } } for (var key in obj1) { if (hasOwnProperty.call(obj1, key)) { if (obj0[key] !== obj1[key]) { keys.push(key); } } } return keys; } function compareObjs(oldProps, newProps, equalityFuncs) { if (equalityFuncs === void 0) { equalityFuncs = {}; } if (oldProps === newProps) { return true; } for (var key in newProps) { if (key in oldProps && isObjValsEqual(oldProps[key], newProps[key], equalityFuncs[key])) ;else { return false; } } // check for props that were omitted in the new for (var key in oldProps) { if (!(key in newProps)) { return false; } } return true; } /* assumed "true" equality for handler names like "onReceiveSomething" */ function isObjValsEqual(val0, val1, comparator) { if (val0 === val1 || comparator === true) { return true; } if (comparator) { return comparator(val0, val1); } return false; } function collectFromHash(hash, startIndex, endIndex, step) { if (startIndex === void 0) { startIndex = 0; } if (step === void 0) { step = 1; } var res = []; if (endIndex == null) { endIndex = Object.keys(hash).length; } for (var i = startIndex; i < endIndex; i += step) { var val = hash[i]; if (val !== undefined) { // will disregard undefined for sparse arrays res.push(val); } } return res; } function parseRecurring(refined, defaultAllDay, dateEnv, recurringTypes) { for (var i = 0; i < recurringTypes.length; i += 1) { var parsed = recurringTypes[i].parse(refined, dateEnv); if (parsed) { var allDay = refined.allDay; if (allDay == null) { allDay = defaultAllDay; if (allDay == null) { allDay = parsed.allDayGuess; if (allDay == null) { allDay = false; } } } return { allDay: allDay, duration: parsed.duration, typeData: parsed.typeData, typeId: i }; } } return null; } function expandRecurring(eventStore, framingRange, context) { var dateEnv = context.dateEnv, pluginHooks = context.pluginHooks, options = context.options; var defs = eventStore.defs, instances = eventStore.instances; // remove existing recurring instances // TODO: bad. always expand events as a second step instances = filterHash(instances, function (instance) { return !defs[instance.defId].recurringDef; }); for (var defId in defs) { var def = defs[defId]; if (def.recurringDef) { var duration = def.recurringDef.duration; if (!duration) { duration = def.allDay ? options.defaultAllDayEventDuration : options.defaultTimedEventDuration; } var starts = expandRecurringRanges(def, duration, framingRange, dateEnv, pluginHooks.recurringTypes); for (var _i = 0, starts_1 = starts; _i < starts_1.length; _i++) { var start = starts_1[_i]; var instance = createEventInstance(defId, { start: start, end: dateEnv.add(start, duration) }); instances[instance.instanceId] = instance; } } } return { defs: defs, instances: instances }; } /* Event MUST have a recurringDef */ function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) { var typeDef = recurringTypes[eventDef.recurringDef.typeId]; var markers = typeDef.expand(eventDef.recurringDef.typeData, { start: dateEnv.subtract(framingRange.start, duration), end: framingRange.end }, dateEnv); // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to if (eventDef.allDay) { markers = markers.map(startOfDay); } return markers; } var INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds']; var PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/; // Parsing and Creation function createDuration(input, unit) { var _a; if (typeof input === 'string') { return parseString(input); } if (_typeof(input) === 'object' && input) { // non-null object return parseObject(input); } if (typeof input === 'number') { return parseObject((_a = {}, _a[unit || 'milliseconds'] = input, _a)); } return null; } function parseString(s) { var m = PARSE_RE.exec(s); if (m) { var sign = m[1] ? -1 : 1; return { years: 0, months: 0, days: sign * (m[2] ? parseInt(m[2], 10) : 0), milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes (m[5] ? parseInt(m[5], 10) : 0) * 1000 + ( // seconds m[6] ? parseInt(m[6], 10) : 0) // ms ) }; } return null; } function parseObject(obj) { var duration = { years: obj.years || obj.year || 0, months: obj.months || obj.month || 0, days: obj.days || obj.day || 0, milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes (obj.seconds || obj.second || 0) * 1000 + ( // seconds obj.milliseconds || obj.millisecond || obj.ms || 0) // ms }; var weeks = obj.weeks || obj.week; if (weeks) { duration.days += weeks * 7; duration.specifiedWeeks = true; } return duration; } // Equality function durationsEqual(d0, d1) { return d0.years === d1.years && d0.months === d1.months && d0.days === d1.days && d0.milliseconds === d1.milliseconds; } function asCleanDays(dur) { if (!dur.years && !dur.months && !dur.milliseconds) { return dur.days; } return 0; } // Simple Math function addDurations(d0, d1) { return { years: d0.years + d1.years, months: d0.months + d1.months, days: d0.days + d1.days, milliseconds: d0.milliseconds + d1.milliseconds }; } function subtractDurations(d1, d0) { return { years: d1.years - d0.years, months: d1.months - d0.months, days: d1.days - d0.days, milliseconds: d1.milliseconds - d0.milliseconds }; } function multiplyDuration(d, n) { return { years: d.years * n, months: d.months * n, days: d.days * n, milliseconds: d.milliseconds * n }; } // Conversions // "Rough" because they are based on average-case Gregorian months/years function asRoughYears(dur) { return asRoughDays(dur) / 365; } function asRoughMonths(dur) { return asRoughDays(dur) / 30; } function asRoughDays(dur) { return asRoughMs(dur) / 864e5; } function asRoughMinutes(dur) { return asRoughMs(dur) / (1000 * 60); } function asRoughSeconds(dur) { return asRoughMs(dur) / 1000; } function asRoughMs(dur) { return dur.years * (365 * 864e5) + dur.months * (30 * 864e5) + dur.days * 864e5 + dur.milliseconds; } // Advanced Math function wholeDivideDurations(numerator, denominator) { var res = null; for (var i = 0; i < INTERNAL_UNITS.length; i += 1) { var unit = INTERNAL_UNITS[i]; if (denominator[unit]) { var localRes = numerator[unit] / denominator[unit]; if (!isInt(localRes) || res !== null && res !== localRes) { return null; } res = localRes; } else if (numerator[unit]) { // needs to divide by something but can't! return null; } } return res; } function greatestDurationDenominator(dur) { var ms = dur.milliseconds; if (ms) { if (ms % 1000 !== 0) { return { unit: 'millisecond', value: ms }; } if (ms % (1000 * 60) !== 0) { return { unit: 'second', value: ms / 1000 }; } if (ms % (1000 * 60 * 60) !== 0) { return { unit: 'minute', value: ms / (1000 * 60) }; } if (ms) { return { unit: 'hour', value: ms / (1000 * 60 * 60) }; } } if (dur.days) { if (dur.specifiedWeeks && dur.days % 7 === 0) { return { unit: 'week', value: dur.days / 7 }; } return { unit: 'day', value: dur.days }; } if (dur.months) { return { unit: 'month', value: dur.months }; } if (dur.years) { return { unit: 'year', value: dur.years }; } return { unit: 'millisecond', value: 0 }; } // timeZoneOffset is in minutes function buildIsoString(marker, timeZoneOffset, stripZeroTime) { if (stripZeroTime === void 0) { stripZeroTime = false; } var s = marker.toISOString(); s = s.replace('.000', ''); if (stripZeroTime) { s = s.replace('T00:00:00Z', ''); } if (s.length > 10) { // time part wasn't stripped, can add timezone info if (timeZoneOffset == null) { s = s.replace('Z', ''); } else if (timeZoneOffset !== 0) { s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true)); } // otherwise, its UTC-0 and we want to keep the Z } return s; } // formats the date, but with no time part // TODO: somehow merge with buildIsoString and stripZeroTime // TODO: rename. omit "string" function formatDayString(marker) { return marker.toISOString().replace(/T.*$/, ''); } // TODO: use Date::toISOString and use everything after the T? function formatIsoTimeString(marker) { return padStart(marker.getUTCHours(), 2) + ':' + padStart(marker.getUTCMinutes(), 2) + ':' + padStart(marker.getUTCSeconds(), 2); } function formatTimeZoneOffset(minutes, doIso) { if (doIso === void 0) { doIso = false; } var sign = minutes < 0 ? '-' : '+'; var abs = Math.abs(minutes); var hours = Math.floor(abs / 60); var mins = Math.round(abs % 60); if (doIso) { return sign + padStart(hours, 2) + ":" + padStart(mins, 2); } return "GMT" + sign + hours + (mins ? ":" + padStart(mins, 2) : ''); } // TODO: new util arrayify? function removeExact(array, exactVal) { var removeCnt = 0; var i = 0; while (i < array.length) { if (array[i] === exactVal) { array.splice(i, 1); removeCnt += 1; } else { i += 1; } } return removeCnt; } function isArraysEqual(a0, a1, equalityFunc) { if (a0 === a1) { return true; } var len = a0.length; var i; if (len !== a1.length) { // not array? or not same length? return false; } for (i = 0; i < len; i += 1) { if (!(equalityFunc ? equalityFunc(a0[i], a1[i]) : a0[i] === a1[i])) { return false; } } return true; } function memoize(workerFunc, resEquality, teardownFunc) { var currentArgs; var currentRes; return function () { var newArgs = []; for (var _i = 0; _i < arguments.length; _i++) { newArgs[_i] = arguments[_i]; } if (!currentArgs) { currentRes = workerFunc.apply(this, newArgs); } else if (!isArraysEqual(currentArgs, newArgs)) { if (teardownFunc) { teardownFunc(currentRes); } var res = workerFunc.apply(this, newArgs); if (!resEquality || !resEquality(res, currentRes)) { currentRes = res; } } currentArgs = newArgs; return currentRes; }; } function memoizeObjArg(workerFunc, resEquality, teardownFunc) { var _this = this; var currentArg; var currentRes; return function (newArg) { if (!currentArg) { currentRes = workerFunc.call(_this, newArg); } else if (!isPropsEqual(currentArg, newArg)) { if (teardownFunc) { teardownFunc(currentRes); } var res = workerFunc.call(_this, newArg); if (!resEquality || !resEquality(res, currentRes)) { currentRes = res; } } currentArg = newArg; return currentRes; }; } function memoizeArraylike( // used at all? workerFunc, resEquality, teardownFunc) { var _this = this; var currentArgSets = []; var currentResults = []; return function (newArgSets) { var currentLen = currentArgSets.length; var newLen = newArgSets.length; var i = 0; for (; i < currentLen; i += 1) { if (!newArgSets[i]) { // one of the old sets no longer exists if (teardownFunc) { teardownFunc(currentResults[i]); } } else if (!isArraysEqual(currentArgSets[i], newArgSets[i])) { if (teardownFunc) { teardownFunc(currentResults[i]); } var res = workerFunc.apply(_this, newArgSets[i]); if (!resEquality || !resEquality(res, currentResults[i])) { currentResults[i] = res; } } } for (; i < newLen; i += 1) { currentResults[i] = workerFunc.apply(_this, newArgSets[i]); } currentArgSets = newArgSets; currentResults.splice(newLen); // remove excess return currentResults; }; } function memoizeHashlike(workerFunc, resEquality, teardownFunc) { var _this = this; var currentArgHash = {}; var currentResHash = {}; return function (newArgHash) { var newResHash = {}; for (var key in newArgHash) { if (!currentResHash[key]) { newResHash[key] = workerFunc.apply(_this, newArgHash[key]); } else if (!isArraysEqual(currentArgHash[key], newArgHash[key])) { if (teardownFunc) { teardownFunc(currentResHash[key]); } var res = workerFunc.apply(_this, newArgHash[key]); newResHash[key] = resEquality && resEquality(res, currentResHash[key]) ? currentResHash[key] : res; } else { newResHash[key] = currentResHash[key]; } } currentArgHash = newArgHash; currentResHash = newResHash; return newResHash; }; } var EXTENDED_SETTINGS_AND_SEVERITIES = { week: 3, separator: 0, omitZeroMinute: 0, meridiem: 0, omitCommas: 0 }; var STANDARD_DATE_PROP_SEVERITIES = { timeZoneName: 7, era: 6, year: 5, month: 4, day: 2, weekday: 2, hour: 1, minute: 1, second: 1 }; var MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too var COMMA_RE = /,/g; // we need re for globalness var MULTI_SPACE_RE = /\s+/g; var LTR_RE = /\u200e/g; // control character var UTC_RE = /UTC|GMT/; var NativeFormatter = /** @class */ function () { function NativeFormatter(formatSettings) { var standardDateProps = {}; var extendedSettings = {}; var severity = 0; for (var name_1 in formatSettings) { if (name_1 in EXTENDED_SETTINGS_AND_SEVERITIES) { extendedSettings[name_1] = formatSettings[name_1]; severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1], severity); } else { standardDateProps[name_1] = formatSettings[name_1]; if (name_1 in STANDARD_DATE_PROP_SEVERITIES) { // TODO: what about hour12? no severity severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1], severity); } } } this.standardDateProps = standardDateProps; this.extendedSettings = extendedSettings; this.severity = severity; this.buildFormattingFunc = memoize(buildFormattingFunc); } NativeFormatter.prototype.format = function (date, context) { return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date); }; NativeFormatter.prototype.formatRange = function (start, end, context, betterDefaultSeparator) { var _a = this, standardDateProps = _a.standardDateProps, extendedSettings = _a.extendedSettings; var diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem); if (!diffSeverity) { return this.format(start, context); } var biggestUnitForPartial = diffSeverity; if (biggestUnitForPartial > 1 && ( // the two dates are different in a way that's larger scale than time standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') && (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') && (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) { biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time } var full0 = this.format(start, context); var full1 = this.format(end, context); if (full0 === full1) { return full0; } var partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial); var partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context); var partial0 = partialFormattingFunc(start); var partial1 = partialFormattingFunc(end); var insertion = findCommonInsertion(full0, partial0, full1, partial1); var separator = extendedSettings.separator || betterDefaultSeparator || context.defaultSeparator || ''; if (insertion) { return insertion.before + partial0 + separator + partial1 + insertion.after; } return full0 + separator + full1; }; NativeFormatter.prototype.getLargestUnit = function () { switch (this.severity) { case 7: case 6: case 5: return 'year'; case 4: return 'month'; case 3: return 'week'; case 2: return 'day'; default: return 'time'; // really? } }; return NativeFormatter; }(); function buildFormattingFunc(standardDateProps, extendedSettings, context) { var standardDatePropCnt = Object.keys(standardDateProps).length; if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') { return function (date) { return formatTimeZoneOffset(date.timeZoneOffset); }; } if (standardDatePropCnt === 0 && extendedSettings.week) { return function (date) { return formatWeekNumber(context.computeWeekNumber(date.marker), context.weekText, context.weekTextLong, context.locale, extendedSettings.week); }; } return buildNativeFormattingFunc(standardDateProps, extendedSettings, context); } function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) { standardDateProps = tslib.__assign({}, standardDateProps); // copy extendedSettings = tslib.__assign({}, extendedSettings); // copy sanitizeSettings(standardDateProps, extendedSettings); standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers var normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps); var zeroFormat; // needed? if (extendedSettings.omitZeroMinute) { var zeroProps = tslib.__assign({}, standardDateProps); delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps); } return function (date) { var marker = date.marker; var format; if (zeroFormat && !marker.getUTCMinutes()) { format = zeroFormat; } else { format = normalFormat; } var s = format.format(marker); return postProcess(s, date, standardDateProps, extendedSettings, context); }; } function sanitizeSettings(standardDateProps, extendedSettings) { // deal with a browser inconsistency where formatting the timezone // requires that the hour/minute be present. if (standardDateProps.timeZoneName) { if (!standardDateProps.hour) { standardDateProps.hour = '2-digit'; } if (!standardDateProps.minute) { standardDateProps.minute = '2-digit'; } } // only support short timezone names if (standardDateProps.timeZoneName === 'long') { standardDateProps.timeZoneName = 'short'; } // if requesting to display seconds, MUST display minutes if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) { delete extendedSettings.omitZeroMinute; } } function postProcess(s, date, standardDateProps, extendedSettings, context) { s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes if (standardDateProps.timeZoneName === 'short') { s = injectTzoStr(s, context.timeZone === 'UTC' || date.timeZoneOffset == null ? 'UTC' : // important to normalize for IE, which does "GMT" formatTimeZoneOffset(date.timeZoneOffset)); } if (extendedSettings.omitCommas) { s = s.replace(COMMA_RE, '').trim(); } if (extendedSettings.omitZeroMinute) { s = s.replace(':00', ''); // zeroFormat doesn't always achieve this } // ^ do anything that might create adjacent spaces before this point, // because MERIDIEM_RE likes to eat up loading spaces if (extendedSettings.meridiem === false) { s = s.replace(MERIDIEM_RE, '').trim(); } else if (extendedSettings.meridiem === 'narrow') { // a/p s = s.replace(MERIDIEM_RE, function (m0, m1) { return m1.toLocaleLowerCase(); }); } else if (extendedSettings.meridiem === 'short') { // am/pm s = s.replace(MERIDIEM_RE, function (m0, m1) { return m1.toLocaleLowerCase() + "m"; }); } else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase s = s.replace(MERIDIEM_RE, function (m0) { return m0.toLocaleLowerCase(); }); } s = s.replace(MULTI_SPACE_RE, ' '); s = s.trim(); return s; } function injectTzoStr(s, tzoStr) { var replaced = false; s = s.replace(UTC_RE, function () { replaced = true; return tzoStr; }); // IE11 doesn't include UTC/GMT in the original string, so append to end if (!replaced) { s += " " + tzoStr; } return s; } function formatWeekNumber(num, weekText, weekTextLong, locale, display) { var parts = []; if (display === 'long') { parts.push(weekTextLong); } else if (display === 'short' || display === 'narrow') { parts.push(weekText); } if (display === 'long' || display === 'short') { parts.push(' '); } parts.push(locale.simpleNumberFormat.format(num)); if (locale.options.direction === 'rtl') { // TODO: use control characters instead? parts.reverse(); } return parts.join(''); } // Range Formatting Utils // 0 = exactly the same // 1 = different by time // and bigger function computeMarkerDiffSeverity(d0, d1, ca) { if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) { return 5; } if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) { return 4; } if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) { return 2; } if (timeAsMs(d0) !== timeAsMs(d1)) { return 1; } return 0; } function computePartialFormattingOptions(options, biggestUnit) { var partialOptions = {}; for (var name_2 in options) { if (!(name_2 in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone) STANDARD_DATE_PROP_SEVERITIES[name_2] <= biggestUnit) { partialOptions[name_2] = options[name_2]; } } return partialOptions; } function findCommonInsertion(full0, partial0, full1, partial1) { var i0 = 0; while (i0 < full0.length) { var found0 = full0.indexOf(partial0, i0); if (found0 === -1) { break; } var before0 = full0.substr(0, found0); i0 = found0 + partial0.length; var after0 = full0.substr(i0); var i1 = 0; while (i1 < full1.length) { var found1 = full1.indexOf(partial1, i1); if (found1 === -1) { break; } var before1 = full1.substr(0, found1); i1 = found1 + partial1.length; var after1 = full1.substr(i1); if (before0 === before1 && after0 === after1) { return { before: before0, after: after0 }; } } } return null; } function expandZonedMarker(dateInfo, calendarSystem) { var a = calendarSystem.markerToArray(dateInfo.marker); return { marker: dateInfo.marker, timeZoneOffset: dateInfo.timeZoneOffset, array: a, year: a[0], month: a[1], day: a[2], hour: a[3], minute: a[4], second: a[5], millisecond: a[6] }; } function createVerboseFormattingArg(start, end, context, betterDefaultSeparator) { var startInfo = expandZonedMarker(start, context.calendarSystem); var endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null; return { date: startInfo, start: startInfo, end: endInfo, timeZone: context.timeZone, localeCodes: context.locale.codes, defaultSeparator: betterDefaultSeparator || context.defaultSeparator }; } /* TODO: fix the terminology of "formatter" vs "formatting func" */ /* At the time of instantiation, this object does not know which cmd-formatting system it will use. It receives this at the time of formatting, as a setting. */ var CmdFormatter = /** @class */ function () { function CmdFormatter(cmdStr) { this.cmdStr = cmdStr; } CmdFormatter.prototype.format = function (date, context, betterDefaultSeparator) { return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, betterDefaultSeparator)); }; CmdFormatter.prototype.formatRange = function (start, end, context, betterDefaultSeparator) { return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, betterDefaultSeparator)); }; return CmdFormatter; }(); var FuncFormatter = /** @class */ function () { function FuncFormatter(func) { this.func = func; } FuncFormatter.prototype.format = function (date, context, betterDefaultSeparator) { return this.func(createVerboseFormattingArg(date, null, context, betterDefaultSeparator)); }; FuncFormatter.prototype.formatRange = function (start, end, context, betterDefaultSeparator) { return this.func(createVerboseFormattingArg(start, end, context, betterDefaultSeparator)); }; return FuncFormatter; }(); function createFormatter(input) { if (_typeof(input) === 'object' && input) { // non-null object return new NativeFormatter(input); } if (typeof input === 'string') { return new CmdFormatter(input); } if (typeof input === 'function') { return new FuncFormatter(input); } return null; } // base options // ------------ var BASE_OPTION_REFINERS = { navLinkDayClick: identity, navLinkWeekClick: identity, duration: createDuration, bootstrapFontAwesome: identity, buttonIcons: identity, customButtons: identity, defaultAllDayEventDuration: createDuration, defaultTimedEventDuration: createDuration, nextDayThreshold: createDuration, scrollTime: createDuration, scrollTimeReset: Boolean, slotMinTime: createDuration, slotMaxTime: createDuration, dayPopoverFormat: createFormatter, slotDuration: createDuration, snapDuration: createDuration, headerToolbar: identity, footerToolbar: identity, defaultRangeSeparator: String, titleRangeSeparator: String, forceEventDuration: Boolean, dayHeaders: Boolean, dayHeaderFormat: createFormatter, dayHeaderClassNames: identity, dayHeaderContent: identity, dayHeaderDidMount: identity, dayHeaderWillUnmount: identity, dayCellClassNames: identity, dayCellContent: identity, dayCellDidMount: identity, dayCellWillUnmount: identity, initialView: String, aspectRatio: Number, weekends: Boolean, weekNumberCalculation: identity, weekNumbers: Boolean, weekNumberClassNames: identity, weekNumberContent: identity, weekNumberDidMount: identity, weekNumberWillUnmount: identity, editable: Boolean, viewClassNames: identity, viewDidMount: identity, viewWillUnmount: identity, nowIndicator: Boolean, nowIndicatorClassNames: identity, nowIndicatorContent: identity, nowIndicatorDidMount: identity, nowIndicatorWillUnmount: identity, showNonCurrentDates: Boolean, lazyFetching: Boolean, startParam: String, endParam: String, timeZoneParam: String, timeZone: String, locales: identity, locale: identity, themeSystem: String, dragRevertDuration: Number, dragScroll: Boolean, allDayMaintainDuration: Boolean, unselectAuto: Boolean, dropAccept: identity, eventOrder: parseFieldSpecs, eventOrderStrict: Boolean, handleWindowResize: Boolean, windowResizeDelay: Number, longPressDelay: Number, eventDragMinDistance: Number, expandRows: Boolean, height: identity, contentHeight: identity, direction: String, weekNumberFormat: createFormatter, eventResizableFromStart: Boolean, displayEventTime: Boolean, displayEventEnd: Boolean, weekText: String, weekTextLong: String, progressiveEventRendering: Boolean, businessHours: identity, initialDate: identity, now: identity, eventDataTransform: identity, stickyHeaderDates: identity, stickyFooterScrollbar: identity, viewHeight: identity, defaultAllDay: Boolean, eventSourceFailure: identity, eventSourceSuccess: identity, eventDisplay: String, eventStartEditable: Boolean, eventDurationEditable: Boolean, eventOverlap: identity, eventConstraint: identity, eventAllow: identity, eventBackgroundColor: String, eventBorderColor: String, eventTextColor: String, eventColor: String, eventClassNames: identity, eventContent: identity, eventDidMount: identity, eventWillUnmount: identity, selectConstraint: identity, selectOverlap: identity, selectAllow: identity, droppable: Boolean, unselectCancel: String, slotLabelFormat: identity, slotLaneClassNames: identity, slotLaneContent: identity, slotLaneDidMount: identity, slotLaneWillUnmount: identity, slotLabelClassNames: identity, slotLabelContent: identity, slotLabelDidMount: identity, slotLabelWillUnmount: identity, dayMaxEvents: identity, dayMaxEventRows: identity, dayMinWidth: Number, slotLabelInterval: createDuration, allDayText: String, allDayClassNames: identity, allDayContent: identity, allDayDidMount: identity, allDayWillUnmount: identity, slotMinWidth: Number, navLinks: Boolean, eventTimeFormat: createFormatter, rerenderDelay: Number, moreLinkText: identity, moreLinkHint: identity, selectMinDistance: Number, selectable: Boolean, selectLongPressDelay: Number, eventLongPressDelay: Number, selectMirror: Boolean, eventMaxStack: Number, eventMinHeight: Number, eventMinWidth: Number, eventShortHeight: Number, slotEventOverlap: Boolean, plugins: identity, firstDay: Number, dayCount: Number, dateAlignment: String, dateIncrement: createDuration, hiddenDays: identity, monthMode: Boolean, fixedWeekCount: Boolean, validRange: identity, visibleRange: identity, titleFormat: identity, eventInteractive: Boolean, // only used by list-view, but languages define the value, so we need it in base options noEventsText: String, viewHint: identity, navLinkHint: identity, closeHint: String, timeHint: String, eventHint: String, moreLinkClick: identity, moreLinkClassNames: identity, moreLinkContent: identity, moreLinkDidMount: identity, moreLinkWillUnmount: identity }; // do NOT give a type here. need `typeof BASE_OPTION_DEFAULTS` to give real results. // raw values. var BASE_OPTION_DEFAULTS = { eventDisplay: 'auto', defaultRangeSeparator: ' - ', titleRangeSeparator: " \u2013 ", defaultTimedEventDuration: '01:00:00', defaultAllDayEventDuration: { day: 1 }, forceEventDuration: false, nextDayThreshold: '00:00:00', dayHeaders: true, initialView: '', aspectRatio: 1.35, headerToolbar: { start: 'title', center: '', end: 'today prev,next' }, weekends: true, weekNumbers: false, weekNumberCalculation: 'local', editable: false, nowIndicator: false, scrollTime: '06:00:00', scrollTimeReset: true, slotMinTime: '00:00:00', slotMaxTime: '24:00:00', showNonCurrentDates: true, lazyFetching: true, startParam: 'start', endParam: 'end', timeZoneParam: 'timeZone', timeZone: 'local', locales: [], locale: '', themeSystem: 'standard', dragRevertDuration: 500, dragScroll: true, allDayMaintainDuration: false, unselectAuto: true, dropAccept: '*', eventOrder: 'start,-duration,allDay,title', dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' }, handleWindowResize: true, windowResizeDelay: 100, longPressDelay: 1000, eventDragMinDistance: 5, expandRows: false, navLinks: false, selectable: false, eventMinHeight: 15, eventMinWidth: 30, eventShortHeight: 30 }; // calendar listeners // ------------------ var CALENDAR_LISTENER_REFINERS = { datesSet: identity, eventsSet: identity, eventAdd: identity, eventChange: identity, eventRemove: identity, windowResize: identity, eventClick: identity, eventMouseEnter: identity, eventMouseLeave: identity, select: identity, unselect: identity, loading: identity, // internal _unmount: identity, _beforeprint: identity, _afterprint: identity, _noEventDrop: identity, _noEventResize: identity, _resize: identity, _scrollRequest: identity }; // calendar-specific options // ------------------------- var CALENDAR_OPTION_REFINERS = { buttonText: identity, buttonHints: identity, views: identity, plugins: identity, initialEvents: identity, events: identity, eventSources: identity }; var COMPLEX_OPTION_COMPARATORS = { headerToolbar: isMaybeObjectsEqual, footerToolbar: isMaybeObjectsEqual, buttonText: isMaybeObjectsEqual, buttonHints: isMaybeObjectsEqual, buttonIcons: isMaybeObjectsEqual, dateIncrement: isMaybeObjectsEqual }; function isMaybeObjectsEqual(a, b) { if (_typeof(a) === 'object' && _typeof(b) === 'object' && a && b) { // both non-null objects return isPropsEqual(a, b); } return a === b; } // view-specific options // --------------------- var VIEW_OPTION_REFINERS = { type: String, component: identity, buttonText: String, buttonTextKey: String, dateProfileGeneratorClass: identity, usesMinMaxTime: Boolean, classNames: identity, content: identity, didMount: identity, willUnmount: identity }; // util funcs // ---------------------------------------------------------------------------------------------------- function mergeRawOptions(optionSets) { return mergeProps(optionSets, COMPLEX_OPTION_COMPARATORS); } function refineProps(input, refiners) { var refined = {}; var extra = {}; for (var propName in refiners) { if (propName in input) { refined[propName] = refiners[propName](input[propName]); } } for (var propName in input) { if (!(propName in refiners)) { extra[propName] = input[propName]; } } return { refined: refined, extra: extra }; } function identity(raw) { return raw; } function parseEvents(rawEvents, eventSource, context, allowOpenRange) { var eventStore = createEmptyEventStore(); var eventRefiners = buildEventRefiners(context); for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) { var rawEvent = rawEvents_1[_i]; var tuple = parseEvent(rawEvent, eventSource, context, allowOpenRange, eventRefiners); if (tuple) { eventTupleToStore(tuple, eventStore); } } return eventStore; } function eventTupleToStore(tuple, eventStore) { if (eventStore === void 0) { eventStore = createEmptyEventStore(); } eventStore.defs[tuple.def.defId] = tuple.def; if (tuple.instance) { eventStore.instances[tuple.instance.instanceId] = tuple.instance; } return eventStore; } // retrieves events that have the same groupId as the instance specified by `instanceId` // or they are the same as the instance. // why might instanceId not be in the store? an event from another calendar? function getRelevantEvents(eventStore, instanceId) { var instance = eventStore.instances[instanceId]; if (instance) { var def_1 = eventStore.defs[instance.defId]; // get events/instances with same group var newStore = filterEventStoreDefs(eventStore, function (lookDef) { return isEventDefsGrouped(def_1, lookDef); }); // add the original // TODO: wish we could use eventTupleToStore or something like it newStore.defs[def_1.defId] = def_1; newStore.instances[instance.instanceId] = instance; return newStore; } return createEmptyEventStore(); } function isEventDefsGrouped(def0, def1) { return Boolean(def0.groupId && def0.groupId === def1.groupId); } function createEmptyEventStore() { return { defs: {}, instances: {} }; } function mergeEventStores(store0, store1) { return { defs: tslib.__assign(tslib.__assign({}, store0.defs), store1.defs), instances: tslib.__assign(tslib.__assign({}, store0.instances), store1.instances) }; } function filterEventStoreDefs(eventStore, filterFunc) { var defs = filterHash(eventStore.defs, filterFunc); var instances = filterHash(eventStore.instances, function (instance) { return defs[instance.defId] // still exists? ; }); return { defs: defs, instances: instances }; } function excludeSubEventStore(master, sub) { var defs = master.defs, instances = master.instances; var filteredDefs = {}; var filteredInstances = {}; for (var defId in defs) { if (!sub.defs[defId]) { // not explicitly excluded filteredDefs[defId] = defs[defId]; } } for (var instanceId in instances) { if (!sub.instances[instanceId] && // not explicitly excluded filteredDefs[instances[instanceId].defId] // def wasn't filtered away ) { filteredInstances[instanceId] = instances[instanceId]; } } return { defs: filteredDefs, instances: filteredInstances }; } function normalizeConstraint(input, context) { if (Array.isArray(input)) { return parseEvents(input, null, context, true); // allowOpenRange=true } if (_typeof(input) === 'object' && input) { // non-null object return parseEvents([input], null, context, true); // allowOpenRange=true } if (input != null) { return String(input); } return null; } function parseClassNames(raw) { if (Array.isArray(raw)) { return raw; } if (typeof raw === 'string') { return raw.split(/\s+/); } return []; } // TODO: better called "EventSettings" or "EventConfig" // TODO: move this file into structs // TODO: separate constraint/overlap/allow, because selection uses only that, not other props var EVENT_UI_REFINERS = { display: String, editable: Boolean, startEditable: Boolean, durationEditable: Boolean, constraint: identity, overlap: identity, allow: identity, className: parseClassNames, classNames: parseClassNames, color: String, backgroundColor: String, borderColor: String, textColor: String }; var EMPTY_EVENT_UI = { display: null, startEditable: null, durationEditable: null, constraints: [], overlap: null, allows: [], backgroundColor: '', borderColor: '', textColor: '', classNames: [] }; function createEventUi(refined, context) { var constraint = normalizeConstraint(refined.constraint, context); return { display: refined.display || null, startEditable: refined.startEditable != null ? refined.startEditable : refined.editable, durationEditable: refined.durationEditable != null ? refined.durationEditable : refined.editable, constraints: constraint != null ? [constraint] : [], overlap: refined.overlap != null ? refined.overlap : null, allows: refined.allow != null ? [refined.allow] : [], backgroundColor: refined.backgroundColor || refined.color || '', borderColor: refined.borderColor || refined.color || '', textColor: refined.textColor || '', classNames: (refined.className || []).concat(refined.classNames || []) // join singular and plural }; } // TODO: prevent against problems with <2 args! function combineEventUis(uis) { return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI); } function combineTwoEventUis(item0, item1) { return { display: item1.display != null ? item1.display : item0.display, startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable, durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable, constraints: item0.constraints.concat(item1.constraints), overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap, allows: item0.allows.concat(item1.allows), backgroundColor: item1.backgroundColor || item0.backgroundColor, borderColor: item1.borderColor || item0.borderColor, textColor: item1.textColor || item0.textColor, classNames: item0.classNames.concat(item1.classNames) }; } var EVENT_NON_DATE_REFINERS = { id: String, groupId: String, title: String, url: String, interactive: Boolean }; var EVENT_DATE_REFINERS = { start: identity, end: identity, date: identity, allDay: Boolean }; var EVENT_REFINERS = tslib.__assign(tslib.__assign(tslib.__assign({}, EVENT_NON_DATE_REFINERS), EVENT_DATE_REFINERS), { extendedProps: identity }); function parseEvent(raw, eventSource, context, allowOpenRange, refiners) { if (refiners === void 0) { refiners = buildEventRefiners(context); } var _a = refineEventDef(raw, context, refiners), refined = _a.refined, extra = _a.extra; var defaultAllDay = computeIsDefaultAllDay(eventSource, context); var recurringRes = parseRecurring(refined, defaultAllDay, context.dateEnv, context.pluginHooks.recurringTypes); if (recurringRes) { var def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', recurringRes.allDay, Boolean(recurringRes.duration), context); def.recurringDef = { typeId: recurringRes.typeId, typeData: recurringRes.typeData, duration: recurringRes.duration }; return { def: def, instance: null }; } var singleRes = parseSingle(refined, defaultAllDay, context, allowOpenRange); if (singleRes) { var def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', singleRes.allDay, singleRes.hasEnd, context); var instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo); return { def: def, instance: instance }; } return null; } function refineEventDef(raw, context, refiners) { if (refiners === void 0) { refiners = buildEventRefiners(context); } return refineProps(raw, refiners); } function buildEventRefiners(context) { return tslib.__assign(tslib.__assign(tslib.__assign({}, EVENT_UI_REFINERS), EVENT_REFINERS), context.pluginHooks.eventRefiners); } /* Will NOT populate extendedProps with the leftover properties. Will NOT populate date-related props. */ function parseEventDef(refined, extra, sourceId, allDay, hasEnd, context) { var def = { title: refined.title || '', groupId: refined.groupId || '', publicId: refined.id || '', url: refined.url || '', recurringDef: null, defId: guid(), sourceId: sourceId, allDay: allDay, hasEnd: hasEnd, interactive: refined.interactive, ui: createEventUi(refined, context), extendedProps: tslib.__assign(tslib.__assign({}, refined.extendedProps || {}), extra) }; for (var _i = 0, _a = context.pluginHooks.eventDefMemberAdders; _i < _a.length; _i++) { var memberAdder = _a[_i]; tslib.__assign(def, memberAdder(refined)); } // help out EventApi from having user modify props Object.freeze(def.ui.classNames); Object.freeze(def.extendedProps); return def; } function parseSingle(refined, defaultAllDay, context, allowOpenRange) { var allDay = refined.allDay; var startMeta; var startMarker = null; var hasEnd = false; var endMeta; var endMarker = null; var startInput = refined.start != null ? refined.start : refined.date; startMeta = context.dateEnv.createMarkerMeta(startInput); if (startMeta) { startMarker = startMeta.marker; } else if (!allowOpenRange) { return null; } if (refined.end != null) { endMeta = context.dateEnv.createMarkerMeta(refined.end); } if (allDay == null) { if (defaultAllDay != null) { allDay = defaultAllDay; } else { // fall back to the date props LAST allDay = (!startMeta || startMeta.isTimeUnspecified) && (!endMeta || endMeta.isTimeUnspecified); } } if (allDay && startMarker) { startMarker = startOfDay(startMarker); } if (endMeta) { endMarker = endMeta.marker; if (allDay) { endMarker = startOfDay(endMarker); } if (startMarker && endMarker <= startMarker) { endMarker = null; } } if (endMarker) { hasEnd = true; } else if (!allowOpenRange) { hasEnd = context.options.forceEventDuration || false; endMarker = context.dateEnv.add(startMarker, allDay ? context.options.defaultAllDayEventDuration : context.options.defaultTimedEventDuration); } return { allDay: allDay, hasEnd: hasEnd, range: { start: startMarker, end: endMarker }, forcedStartTzo: startMeta ? startMeta.forcedTzo : null, forcedEndTzo: endMeta ? endMeta.forcedTzo : null }; } function computeIsDefaultAllDay(eventSource, context) { var res = null; if (eventSource) { res = eventSource.defaultAllDay; } if (res == null) { res = context.options.defaultAllDay; } return res; } /* Date stuff that doesn't belong in datelib core ----------------------------------------------------------------------------------------------------------------------*/ // given a timed range, computes an all-day range that has the same exact duration, // but whose start time is aligned with the start of the day. function computeAlignedDayRange(timedRange) { var dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1; var start = startOfDay(timedRange.start); var end = addDays(start, dayCnt); return { start: start, end: end }; } // given a timed range, computes an all-day range based on how for the end date bleeds into the next day // TODO: give nextDayThreshold a default arg function computeVisibleDayRange(timedRange, nextDayThreshold) { if (nextDayThreshold === void 0) { nextDayThreshold = createDuration(0); } var startDay = null; var endDay = null; if (timedRange.end) { endDay = startOfDay(timedRange.end); var endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay` // If the end time is actually inclusively part of the next day and is equal to or // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`. // Otherwise, leaving it as inclusive will cause it to exclude `endDay`. if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) { endDay = addDays(endDay, 1); } } if (timedRange.start) { startDay = startOfDay(timedRange.start); // the beginning of the day the range starts // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day. if (endDay && endDay <= startDay) { endDay = addDays(startDay, 1); } } return { start: startDay, end: endDay }; } // spans from one day into another? function isMultiDayRange(range) { var visibleRange = computeVisibleDayRange(range); return diffDays(visibleRange.start, visibleRange.end) > 1; } function diffDates(date0, date1, dateEnv, largeUnit) { if (largeUnit === 'year') { return createDuration(dateEnv.diffWholeYears(date0, date1), 'year'); } if (largeUnit === 'month') { return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month'); } return diffDayAndTime(date0, date1); // returns a duration } function parseRange(input, dateEnv) { var start = null; var end = null; if (input.start) { start = dateEnv.createMarker(input.start); } if (input.end) { end = dateEnv.createMarker(input.end); } if (!start && !end) { return null; } if (start && end && end < start) { return null; } return { start: start, end: end }; } // SIDE-EFFECT: will mutate ranges. // Will return a new array result. function invertRanges(ranges, constraintRange) { var invertedRanges = []; var start = constraintRange.start; // the end of the previous range. the start of the new range var i; var dateRange; // ranges need to be in order. required for our date-walking algorithm ranges.sort(compareRanges); for (i = 0; i < ranges.length; i += 1) { dateRange = ranges[i]; // add the span of time before the event (if there is any) if (dateRange.start > start) { // compare millisecond time (skip any ambig logic) invertedRanges.push({ start: start, end: dateRange.start }); } if (dateRange.end > start) { start = dateRange.end; } } // add the span of time after the last event (if there is any) if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic) invertedRanges.push({ start: start, end: constraintRange.end }); } return invertedRanges; } function compareRanges(range0, range1) { return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first } function intersectRanges(range0, range1) { var start = range0.start, end = range0.end; var newRange = null; if (range1.start !== null) { if (start === null) { start = range1.start; } else { start = new Date(Math.max(start.valueOf(), range1.start.valueOf())); } } if (range1.end != null) { if (end === null) { end = range1.end; } else { end = new Date(Math.min(end.valueOf(), range1.end.valueOf())); } } if (start === null || end === null || start < end) { newRange = { start: start, end: end }; } return newRange; } function rangesEqual(range0, range1) { return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) && (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf()); } function rangesIntersect(range0, range1) { return (range0.end === null || range1.start === null || range0.end > range1.start) && (range0.start === null || range1.end === null || range0.start < range1.end); } function rangeContainsRange(outerRange, innerRange) { return (outerRange.start === null || innerRange.start !== null && innerRange.start >= outerRange.start) && (outerRange.end === null || innerRange.end !== null && innerRange.end <= outerRange.end); } function rangeContainsMarker(range, date) { return (range.start === null || date >= range.start) && (range.end === null || date < range.end); } // If the given date is not within the given range, move it inside. // (If it's past the end, make it one millisecond before the end). function constrainMarkerToRange(date, range) { if (range.start != null && date < range.start) { return range.start; } if (range.end != null && date >= range.end) { return new Date(range.end.valueOf() - 1); } return date; } /* Specifying nextDayThreshold signals that all-day ranges should be sliced. */ function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) { var inverseBgByGroupId = {}; var inverseBgByDefId = {}; var defByGroupId = {}; var bgRanges = []; var fgRanges = []; var eventUis = compileEventUis(eventStore.defs, eventUiBases); for (var defId in eventStore.defs) { var def = eventStore.defs[defId]; var ui = eventUis[def.defId]; if (ui.display === 'inverse-background') { if (def.groupId) { inverseBgByGroupId[def.groupId] = []; if (!defByGroupId[def.groupId]) { defByGroupId[def.groupId] = def; } } else { inverseBgByDefId[defId] = []; } } } for (var instanceId in eventStore.instances) { var instance = eventStore.instances[instanceId]; var def = eventStore.defs[instance.defId]; var ui = eventUis[def.defId]; var origRange = instance.range; var normalRange = !def.allDay && nextDayThreshold ? computeVisibleDayRange(origRange, nextDayThreshold) : origRange; var slicedRange = intersectRanges(normalRange, framingRange); if (slicedRange) { if (ui.display === 'inverse-background') { if (def.groupId) { inverseBgByGroupId[def.groupId].push(slicedRange); } else { inverseBgByDefId[instance.defId].push(slicedRange); } } else if (ui.display !== 'none') { (ui.display === 'background' ? bgRanges : fgRanges).push({ def: def, ui: ui, instance: instance, range: slicedRange, isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(), isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf() }); } } } for (var groupId in inverseBgByGroupId) { // BY GROUP var ranges = inverseBgByGroupId[groupId]; var invertedRanges = invertRanges(ranges, framingRange); for (var _i = 0, invertedRanges_1 = invertedRanges; _i < invertedRanges_1.length; _i++) { var invertedRange = invertedRanges_1[_i]; var def = defByGroupId[groupId]; var ui = eventUis[def.defId]; bgRanges.push({ def: def, ui: ui, instance: null, range: invertedRange, isStart: false, isEnd: false }); } } for (var defId in inverseBgByDefId) { var ranges = inverseBgByDefId[defId]; var invertedRanges = invertRanges(ranges, framingRange); for (var _a = 0, invertedRanges_2 = invertedRanges; _a < invertedRanges_2.length; _a++) { var invertedRange = invertedRanges_2[_a]; bgRanges.push({ def: eventStore.defs[defId], ui: eventUis[defId], instance: null, range: invertedRange, isStart: false, isEnd: false }); } } return { bg: bgRanges, fg: fgRanges }; } function hasBgRendering(def) { return def.ui.display === 'background' || def.ui.display === 'inverse-background'; } function setElSeg(el, seg) { el.fcSeg = seg; } function getElSeg(el) { return el.fcSeg || el.parentNode.fcSeg || // for the harness null; } // event ui computation function compileEventUis(eventDefs, eventUiBases) { return mapHash(eventDefs, function (eventDef) { return compileEventUi(eventDef, eventUiBases); }); } function compileEventUi(eventDef, eventUiBases) { var uis = []; if (eventUiBases['']) { uis.push(eventUiBases['']); } if (eventUiBases[eventDef.defId]) { uis.push(eventUiBases[eventDef.defId]); } uis.push(eventDef.ui); return combineEventUis(uis); } function sortEventSegs(segs, eventOrderSpecs) { var objs = segs.map(buildSegCompareObj); objs.sort(function (obj0, obj1) { return compareByFieldSpecs(obj0, obj1, eventOrderSpecs); }); return objs.map(function (c) { return c._seg; }); } // returns a object with all primitive props that can be compared function buildSegCompareObj(seg) { var eventRange = seg.eventRange; var eventDef = eventRange.def; var range = eventRange.instance ? eventRange.instance.range : eventRange.range; var start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events var end = range.end ? range.end.valueOf() : 0; // " return tslib.__assign(tslib.__assign(tslib.__assign({}, eventDef.extendedProps), eventDef), { id: eventDef.publicId, start: start, end: end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg }); } function computeSegDraggable(seg, context) { var pluginHooks = context.pluginHooks; var transformers = pluginHooks.isDraggableTransformers; var _a = seg.eventRange, def = _a.def, ui = _a.ui; var val = ui.startEditable; for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) { var transformer = transformers_1[_i]; val = transformer(val, def, ui, context); } return val; } function computeSegStartResizable(seg, context) { return seg.isStart && seg.eventRange.ui.durationEditable && context.options.eventResizableFromStart; } function computeSegEndResizable(seg, context) { return seg.isEnd && seg.eventRange.ui.durationEditable; } function buildSegTimeText(seg, timeFormat, context, defaultDisplayEventTime, // defaults to true defaultDisplayEventEnd, // defaults to true startOverride, endOverride) { var dateEnv = context.dateEnv, options = context.options; var displayEventTime = options.displayEventTime, displayEventEnd = options.displayEventEnd; var eventDef = seg.eventRange.def; var eventInstance = seg.eventRange.instance; if (displayEventTime == null) { displayEventTime = defaultDisplayEventTime !== false; } if (displayEventEnd == null) { displayEventEnd = defaultDisplayEventEnd !== false; } var wholeEventStart = eventInstance.range.start; var wholeEventEnd = eventInstance.range.end; var segStart = startOverride || seg.start || seg.eventRange.range.start; var segEnd = endOverride || seg.end || seg.eventRange.range.end; var isStartDay = startOfDay(wholeEventStart).valueOf() === startOfDay(segStart).valueOf(); var isEndDay = startOfDay(addMs(wholeEventEnd, -1)).valueOf() === startOfDay(addMs(segEnd, -1)).valueOf(); if (displayEventTime && !eventDef.allDay && (isStartDay || isEndDay)) { segStart = isStartDay ? wholeEventStart : segStart; segEnd = isEndDay ? wholeEventEnd : segEnd; if (displayEventEnd && eventDef.hasEnd) { return dateEnv.formatRange(segStart, segEnd, timeFormat, { forcedStartTzo: startOverride ? null : eventInstance.forcedStartTzo, forcedEndTzo: endOverride ? null : eventInstance.forcedEndTzo }); } return dateEnv.format(segStart, timeFormat, { forcedTzo: startOverride ? null : eventInstance.forcedStartTzo // nooooo, same }); } return ''; } function getSegMeta(seg, todayRange, nowDate) { var segRange = seg.eventRange.range; return { isPast: segRange.end < (nowDate || todayRange.start), isFuture: segRange.start >= (nowDate || todayRange.end), isToday: todayRange && rangeContainsMarker(todayRange, segRange.start) }; } function getEventClassNames(props) { var classNames = ['fc-event']; if (props.isMirror) { classNames.push('fc-event-mirror'); } if (props.isDraggable) { classNames.push('fc-event-draggable'); } if (props.isStartResizable || props.isEndResizable) { classNames.push('fc-event-resizable'); } if (props.isDragging) { classNames.push('fc-event-dragging'); } if (props.isResizing) { classNames.push('fc-event-resizing'); } if (props.isSelected) { classNames.push('fc-event-selected'); } if (props.isStart) { classNames.push('fc-event-start'); } if (props.isEnd) { classNames.push('fc-event-end'); } if (props.isPast) { classNames.push('fc-event-past'); } if (props.isToday) { classNames.push('fc-event-today'); } if (props.isFuture) { classNames.push('fc-event-future'); } return classNames; } function buildEventRangeKey(eventRange) { return eventRange.instance ? eventRange.instance.instanceId : eventRange.def.defId + ":" + eventRange.range.start.toISOString(); // inverse-background events don't have specific instances. TODO: better solution } function getSegAnchorAttrs(seg, context) { var _a = seg.eventRange, def = _a.def, instance = _a.instance; var url = def.url; if (url) { return { href: url }; } var emitter = context.emitter, options = context.options; var eventInteractive = options.eventInteractive; if (eventInteractive == null) { eventInteractive = def.interactive; if (eventInteractive == null) { eventInteractive = Boolean(emitter.hasHandlers('eventClick')); } } // mock what happens in EventClicking if (eventInteractive) { // only attach keyboard-related handlers because click handler is already done in EventClicking return createAriaKeyboardAttrs(function (ev) { emitter.trigger('eventClick', { el: ev.target, event: new EventApi(context, def, instance), jsEvent: ev, view: context.viewApi }); }); } return {}; } var STANDARD_PROPS = { start: identity, end: identity, allDay: Boolean }; function parseDateSpan(raw, dateEnv, defaultDuration) { var span = parseOpenDateSpan(raw, dateEnv); var range = span.range; if (!range.start) { return null; } if (!range.end) { if (defaultDuration == null) { return null; } range.end = dateEnv.add(range.start, defaultDuration); } return span; } /* TODO: somehow combine with parseRange? Will return null if the start/end props were present but parsed invalidly. */ function parseOpenDateSpan(raw, dateEnv) { var _a = refineProps(raw, STANDARD_PROPS), standardProps = _a.refined, extra = _a.extra; var startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null; var endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null; var allDay = standardProps.allDay; if (allDay == null) { allDay = startMeta && startMeta.isTimeUnspecified && (!endMeta || endMeta.isTimeUnspecified); } return tslib.__assign({ range: { start: startMeta ? startMeta.marker : null, end: endMeta ? endMeta.marker : null }, allDay: allDay }, extra); } function isDateSpansEqual(span0, span1) { return rangesEqual(span0.range, span1.range) && span0.allDay === span1.allDay && isSpanPropsEqual(span0, span1); } // the NON-DATE-RELATED props function isSpanPropsEqual(span0, span1) { for (var propName in span1) { if (propName !== 'range' && propName !== 'allDay') { if (span0[propName] !== span1[propName]) { return false; } } } // are there any props that span0 has that span1 DOESN'T have? // both have range/allDay, so no need to special-case. for (var propName in span0) { if (!(propName in span1)) { return false; } } return true; } function buildDateSpanApi(span, dateEnv) { return tslib.__assign(tslib.__assign({}, buildRangeApi(span.range, dateEnv, span.allDay)), { allDay: span.allDay }); } function buildRangeApiWithTimeZone(range, dateEnv, omitTime) { return tslib.__assign(tslib.__assign({}, buildRangeApi(range, dateEnv, omitTime)), { timeZone: dateEnv.timeZone }); } function buildRangeApi(range, dateEnv, omitTime) { return { start: dateEnv.toDate(range.start), end: dateEnv.toDate(range.end), startStr: dateEnv.formatIso(range.start, { omitTime: omitTime }), endStr: dateEnv.formatIso(range.end, { omitTime: omitTime }) }; } function fabricateEventRange(dateSpan, eventUiBases, context) { var res = refineEventDef({ editable: false }, context); var def = parseEventDef(res.refined, res.extra, '', // sourceId dateSpan.allDay, true, // hasEnd context); return { def: def, ui: compileEventUi(def, eventUiBases), instance: createEventInstance(def.defId, dateSpan.range), range: dateSpan.range, isStart: true, isEnd: true }; } function triggerDateSelect(selection, pev, context) { context.emitter.trigger('select', tslib.__assign(tslib.__assign({}, buildDateSpanApiWithContext(selection, context)), { jsEvent: pev ? pev.origEvent : null, view: context.viewApi || context.calendarApi.view })); } function triggerDateUnselect(pev, context) { context.emitter.trigger('unselect', { jsEvent: pev ? pev.origEvent : null, view: context.viewApi || context.calendarApi.view }); } function buildDateSpanApiWithContext(dateSpan, context) { var props = {}; for (var _i = 0, _a = context.pluginHooks.dateSpanTransforms; _i < _a.length; _i++) { var transform = _a[_i]; tslib.__assign(props, transform(dateSpan, context)); } tslib.__assign(props, buildDateSpanApi(dateSpan, context.dateEnv)); return props; } // Given an event's allDay status and start date, return what its fallback end date should be. // TODO: rename to computeDefaultEventEnd function getDefaultEventEnd(allDay, marker, context) { var dateEnv = context.dateEnv, options = context.options; var end = marker; if (allDay) { end = startOfDay(end); end = dateEnv.add(end, options.defaultAllDayEventDuration); } else { end = dateEnv.add(end, options.defaultTimedEventDuration); } return end; } // applies the mutation to ALL defs/instances within the event store function applyMutationToEventStore(eventStore, eventConfigBase, mutation, context) { var eventConfigs = compileEventUis(eventStore.defs, eventConfigBase); var dest = createEmptyEventStore(); for (var defId in eventStore.defs) { var def = eventStore.defs[defId]; dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, context); } for (var instanceId in eventStore.instances) { var instance = eventStore.instances[instanceId]; var def = dest.defs[instance.defId]; // important to grab the newly modified def dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, context); } return dest; } function applyMutationToEventDef(eventDef, eventConfig, mutation, context) { var standardProps = mutation.standardProps || {}; // if hasEnd has not been specified, guess a good value based on deltas. // if duration will change, there's no way the default duration will persist, // and thus, we need to mark the event as having a real end if (standardProps.hasEnd == null && eventConfig.durationEditable && (mutation.startDelta || mutation.endDelta)) { standardProps.hasEnd = true; // TODO: is this mutation okay? } var copy = tslib.__assign(tslib.__assign(tslib.__assign({}, eventDef), standardProps), { ui: tslib.__assign(tslib.__assign({}, eventDef.ui), standardProps.ui) }); if (mutation.extendedProps) { copy.extendedProps = tslib.__assign(tslib.__assign({}, copy.extendedProps), mutation.extendedProps); } for (var _i = 0, _a = context.pluginHooks.eventDefMutationAppliers; _i < _a.length; _i++) { var applier = _a[_i]; applier(copy, mutation, context); } if (!copy.hasEnd && context.options.forceEventDuration) { copy.hasEnd = true; } return copy; } function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef eventConfig, mutation, context) { var dateEnv = context.dateEnv; var forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true; var clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false; var copy = tslib.__assign({}, eventInstance); if (forceAllDay) { copy.range = computeAlignedDayRange(copy.range); } if (mutation.datesDelta && eventConfig.startEditable) { copy.range = { start: dateEnv.add(copy.range.start, mutation.datesDelta), end: dateEnv.add(copy.range.end, mutation.datesDelta) }; } if (mutation.startDelta && eventConfig.durationEditable) { copy.range = { start: dateEnv.add(copy.range.start, mutation.startDelta), end: copy.range.end }; } if (mutation.endDelta && eventConfig.durationEditable) { copy.range = { start: copy.range.start, end: dateEnv.add(copy.range.end, mutation.endDelta) }; } if (clearEnd) { copy.range = { start: copy.range.start, end: getDefaultEventEnd(eventDef.allDay, copy.range.start, context) }; } // in case event was all-day but the supplied deltas were not // better util for this? if (eventDef.allDay) { copy.range = { start: startOfDay(copy.range.start), end: startOfDay(copy.range.end) }; } // handle invalid durations if (copy.range.end < copy.range.start) { copy.range.end = getDefaultEventEnd(eventDef.allDay, copy.range.start, context); } return copy; } // no public types yet. when there are, export from: // import {} from './api-type-deps' var ViewApi = /** @class */ function () { function ViewApi(type, getCurrentData, dateEnv) { this.type = type; this.getCurrentData = getCurrentData; this.dateEnv = dateEnv; } Object.defineProperty(ViewApi.prototype, "calendar", { get: function get() { return this.getCurrentData().calendarApi; }, enumerable: false, configurable: true }); Object.defineProperty(ViewApi.prototype, "title", { get: function get() { return this.getCurrentData().viewTitle; }, enumerable: false, configurable: true }); Object.defineProperty(ViewApi.prototype, "activeStart", { get: function get() { return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start); }, enumerable: false, configurable: true }); Object.defineProperty(ViewApi.prototype, "activeEnd", { get: function get() { return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end); }, enumerable: false, configurable: true }); Object.defineProperty(ViewApi.prototype, "currentStart", { get: function get() { return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start); }, enumerable: false, configurable: true }); Object.defineProperty(ViewApi.prototype, "currentEnd", { get: function get() { return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end); }, enumerable: false, configurable: true }); ViewApi.prototype.getOption = function (name) { return this.getCurrentData().options[name]; // are the view-specific options }; return ViewApi; }(); var EVENT_SOURCE_REFINERS = { id: String, defaultAllDay: Boolean, url: String, format: String, events: identity, eventDataTransform: identity, // for any network-related sources success: identity, failure: identity }; function parseEventSource(raw, context, refiners) { if (refiners === void 0) { refiners = buildEventSourceRefiners(context); } var rawObj; if (typeof raw === 'string') { rawObj = { url: raw }; } else if (typeof raw === 'function' || Array.isArray(raw)) { rawObj = { events: raw }; } else if (_typeof(raw) === 'object' && raw) { // not null rawObj = raw; } if (rawObj) { var _a = refineProps(rawObj, refiners), refined = _a.refined, extra = _a.extra; var metaRes = buildEventSourceMeta(refined, context); if (metaRes) { return { _raw: raw, isFetching: false, latestFetchId: '', fetchRange: null, defaultAllDay: refined.defaultAllDay, eventDataTransform: refined.eventDataTransform, success: refined.success, failure: refined.failure, publicId: refined.id || '', sourceId: guid(), sourceDefId: metaRes.sourceDefId, meta: metaRes.meta, ui: createEventUi(refined, context), extendedProps: extra }; } } return null; } function buildEventSourceRefiners(context) { return tslib.__assign(tslib.__assign(tslib.__assign({}, EVENT_UI_REFINERS), EVENT_SOURCE_REFINERS), context.pluginHooks.eventSourceRefiners); } function buildEventSourceMeta(raw, context) { var defs = context.pluginHooks.eventSourceDefs; for (var i = defs.length - 1; i >= 0; i -= 1) { // later-added plugins take precedence var def = defs[i]; var meta = def.parseMeta(raw); if (meta) { return { sourceDefId: i, meta: meta }; } } return null; } function reduceCurrentDate(currentDate, action) { switch (action.type) { case 'CHANGE_DATE': return action.dateMarker; default: return currentDate; } } function getInitialDate(options, dateEnv) { var initialDateInput = options.initialDate; // compute the initial ambig-timezone date if (initialDateInput != null) { return dateEnv.createMarker(initialDateInput); } return getNow(options.now, dateEnv); // getNow already returns unzoned } function getNow(nowInput, dateEnv) { if (typeof nowInput === 'function') { nowInput = nowInput(); } if (nowInput == null) { return dateEnv.createNowMarker(); } return dateEnv.createMarker(nowInput); } var CalendarApi = /** @class */ function () { function CalendarApi() {} CalendarApi.prototype.getCurrentData = function () { return this.currentDataManager.getCurrentData(); }; CalendarApi.prototype.dispatch = function (action) { return this.currentDataManager.dispatch(action); }; Object.defineProperty(CalendarApi.prototype, "view", { get: function get() { return this.getCurrentData().viewApi; } // for public API , enumerable: false, configurable: true }); CalendarApi.prototype.batchRendering = function (callback) { callback(); }; CalendarApi.prototype.updateSize = function () { this.trigger('_resize', true); }; // Options // ----------------------------------------------------------------------------------------------------------------- CalendarApi.prototype.setOption = function (name, val) { this.dispatch({ type: 'SET_OPTION', optionName: name, rawOptionValue: val }); }; CalendarApi.prototype.getOption = function (name) { return this.currentDataManager.currentCalendarOptionsInput[name]; }; CalendarApi.prototype.getAvailableLocaleCodes = function () { return Object.keys(this.getCurrentData().availableRawLocales); }; // Trigger // ----------------------------------------------------------------------------------------------------------------- CalendarApi.prototype.on = function (handlerName, handler) { var currentDataManager = this.currentDataManager; if (currentDataManager.currentCalendarOptionsRefiners[handlerName]) { currentDataManager.emitter.on(handlerName, handler); } else { console.warn("Unknown listener name '" + handlerName + "'"); } }; CalendarApi.prototype.off = function (handlerName, handler) { this.currentDataManager.emitter.off(handlerName, handler); }; // not meant for public use CalendarApi.prototype.trigger = function (handlerName) { var _a; var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } (_a = this.currentDataManager.emitter).trigger.apply(_a, tslib.__spreadArray([handlerName], args)); }; // View // ----------------------------------------------------------------------------------------------------------------- CalendarApi.prototype.changeView = function (viewType, dateOrRange) { var _this = this; this.batchRendering(function () { _this.unselect(); if (dateOrRange) { if (dateOrRange.start && dateOrRange.end) { // a range _this.dispatch({ type: 'CHANGE_VIEW_TYPE', viewType: viewType }); _this.dispatch({ type: 'SET_OPTION', optionName: 'visibleRange', rawOptionValue: dateOrRange }); } else { var dateEnv = _this.getCurrentData().dateEnv; _this.dispatch({ type: 'CHANGE_VIEW_TYPE', viewType: viewType, dateMarker: dateEnv.createMarker(dateOrRange) }); } } else { _this.dispatch({ type: 'CHANGE_VIEW_TYPE', viewType: viewType }); } }); }; // Forces navigation to a view for the given date. // `viewType` can be a specific view name or a generic one like "week" or "day". // needs to change CalendarApi.prototype.zoomTo = function (dateMarker, viewType) { var state = this.getCurrentData(); var spec; viewType = viewType || 'day'; // day is default zoom spec = state.viewSpecs[viewType] || this.getUnitViewSpec(viewType); this.unselect(); if (spec) { this.dispatch({ type: 'CHANGE_VIEW_TYPE', viewType: spec.type, dateMarker: dateMarker }); } else { this.dispatch({ type: 'CHANGE_DATE', dateMarker: dateMarker }); } }; // Given a duration singular unit, like "week" or "day", finds a matching view spec. // Preference is given to views that have corresponding buttons. CalendarApi.prototype.getUnitViewSpec = function (unit) { var _a = this.getCurrentData(), viewSpecs = _a.viewSpecs, toolbarConfig = _a.toolbarConfig; var viewTypes = [].concat(toolbarConfig.header ? toolbarConfig.header.viewsWithButtons : [], toolbarConfig.footer ? toolbarConfig.footer.viewsWithButtons : []); var i; var spec; for (var viewType in viewSpecs) { viewTypes.push(viewType); } for (i = 0; i < viewTypes.length; i += 1) { spec = viewSpecs[viewTypes[i]]; if (spec) { if (spec.singleUnit === unit) { return spec; } } } return null; }; // Current Date // ----------------------------------------------------------------------------------------------------------------- CalendarApi.prototype.prev = function () { this.unselect(); this.dispatch({ type: 'PREV' }); }; CalendarApi.prototype.next = function () { this.unselect(); this.dispatch({ type: 'NEXT' }); }; CalendarApi.prototype.prevYear = function () { var state = this.getCurrentData(); this.unselect(); this.dispatch({ type: 'CHANGE_DATE', dateMarker: state.dateEnv.addYears(state.currentDate, -1) }); }; CalendarApi.prototype.nextYear = function () { var state = this.getCurrentData(); this.unselect(); this.dispatch({ type: 'CHANGE_DATE', dateMarker: state.dateEnv.addYears(state.currentDate, 1) }); }; CalendarApi.prototype.today = function () { var state = this.getCurrentData(); this.unselect(); this.dispatch({ type: 'CHANGE_DATE', dateMarker: getNow(state.calendarOptions.now, state.dateEnv) }); }; CalendarApi.prototype.gotoDate = function (zonedDateInput) { var state = this.getCurrentData(); this.unselect(); this.dispatch({ type: 'CHANGE_DATE', dateMarker: state.dateEnv.createMarker(zonedDateInput) }); }; CalendarApi.prototype.incrementDate = function (deltaInput) { var state = this.getCurrentData(); var delta = createDuration(deltaInput); if (delta) { // else, warn about invalid input? this.unselect(); this.dispatch({ type: 'CHANGE_DATE', dateMarker: state.dateEnv.add(state.currentDate, delta) }); } }; // for external API CalendarApi.prototype.getDate = function () { var state = this.getCurrentData(); return state.dateEnv.toDate(state.currentDate); }; // Date Formatting Utils // ----------------------------------------------------------------------------------------------------------------- CalendarApi.prototype.formatDate = function (d, formatter) { var dateEnv = this.getCurrentData().dateEnv; return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter)); }; // `settings` is for formatter AND isEndExclusive CalendarApi.prototype.formatRange = function (d0, d1, settings) { var dateEnv = this.getCurrentData().dateEnv; return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings), settings); }; CalendarApi.prototype.formatIso = function (d, omitTime) { var dateEnv = this.getCurrentData().dateEnv; return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime: omitTime }); }; // Date Selection / Event Selection / DayClick // ----------------------------------------------------------------------------------------------------------------- // this public method receives start/end dates in any format, with any timezone // NOTE: args were changed from v3 CalendarApi.prototype.select = function (dateOrObj, endDate) { var selectionInput; if (endDate == null) { if (dateOrObj.start != null) { selectionInput = dateOrObj; } else { selectionInput = { start: dateOrObj, end: null }; } } else { selectionInput = { start: dateOrObj, end: endDate }; } var state = this.getCurrentData(); var selection = parseDateSpan(selectionInput, state.dateEnv, createDuration({ days: 1 })); if (selection) { // throw parse error otherwise? this.dispatch({ type: 'SELECT_DATES', selection: selection }); triggerDateSelect(selection, null, state); } }; // public method CalendarApi.prototype.unselect = function (pev) { var state = this.getCurrentData(); if (state.dateSelection) { this.dispatch({ type: 'UNSELECT_DATES' }); triggerDateUnselect(pev, state); } }; // Public Events API // ----------------------------------------------------------------------------------------------------------------- CalendarApi.prototype.addEvent = function (eventInput, sourceInput) { if (eventInput instanceof EventApi) { var def = eventInput._def; var instance = eventInput._instance; var currentData = this.getCurrentData(); // not already present? don't want to add an old snapshot if (!currentData.eventStore.defs[def.defId]) { this.dispatch({ type: 'ADD_EVENTS', eventStore: eventTupleToStore({ def: def, instance: instance }) // TODO: better util for two args? }); this.triggerEventAdd(eventInput); } return eventInput; } var state = this.getCurrentData(); var eventSource; if (sourceInput instanceof EventSourceApi) { eventSource = sourceInput.internalEventSource; } else if (typeof sourceInput === 'boolean') { if (sourceInput) { // true. part of the first event source eventSource = hashValuesToArray(state.eventSources)[0]; } } else if (sourceInput != null) { // an ID. accepts a number too var sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function if (!sourceApi) { console.warn("Could not find an event source with ID \"" + sourceInput + "\""); // TODO: test return null; } eventSource = sourceApi.internalEventSource; } var tuple = parseEvent(eventInput, eventSource, state, false); if (tuple) { var newEventApi = new EventApi(state, tuple.def, tuple.def.recurringDef ? null : tuple.instance); this.dispatch({ type: 'ADD_EVENTS', eventStore: eventTupleToStore(tuple) }); this.triggerEventAdd(newEventApi); return newEventApi; } return null; }; CalendarApi.prototype.triggerEventAdd = function (eventApi) { var _this = this; var emitter = this.getCurrentData().emitter; emitter.trigger('eventAdd', { event: eventApi, relatedEvents: [], revert: function revert() { _this.dispatch({ type: 'REMOVE_EVENTS', eventStore: eventApiToStore(eventApi) }); } }); }; // TODO: optimize CalendarApi.prototype.getEventById = function (id) { var state = this.getCurrentData(); var _a = state.eventStore, defs = _a.defs, instances = _a.instances; id = String(id); for (var defId in defs) { var def = defs[defId]; if (def.publicId === id) { if (def.recurringDef) { return new EventApi(state, def, null); } for (var instanceId in instances) { var instance = instances[instanceId]; if (instance.defId === def.defId) { return new EventApi(state, def, instance); } } } } return null; }; CalendarApi.prototype.getEvents = function () { var currentData = this.getCurrentData(); return buildEventApis(currentData.eventStore, currentData); }; CalendarApi.prototype.removeAllEvents = function () { this.dispatch({ type: 'REMOVE_ALL_EVENTS' }); }; // Public Event Sources API // ----------------------------------------------------------------------------------------------------------------- CalendarApi.prototype.getEventSources = function () { var state = this.getCurrentData(); var sourceHash = state.eventSources; var sourceApis = []; for (var internalId in sourceHash) { sourceApis.push(new EventSourceApi(state, sourceHash[internalId])); } return sourceApis; }; CalendarApi.prototype.getEventSourceById = function (id) { var state = this.getCurrentData(); var sourceHash = state.eventSources; id = String(id); for (var sourceId in sourceHash) { if (sourceHash[sourceId].publicId === id) { return new EventSourceApi(state, sourceHash[sourceId]); } } return null; }; CalendarApi.prototype.addEventSource = function (sourceInput) { var state = this.getCurrentData(); if (sourceInput instanceof EventSourceApi) { // not already present? don't want to add an old snapshot if (!state.eventSources[sourceInput.internalEventSource.sourceId]) { this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [sourceInput.internalEventSource] }); } return sourceInput; } var eventSource = parseEventSource(sourceInput, state); if (eventSource) { // TODO: error otherwise? this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] }); return new EventSourceApi(state, eventSource); } return null; }; CalendarApi.prototype.removeAllEventSources = function () { this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' }); }; CalendarApi.prototype.refetchEvents = function () { this.dispatch({ type: 'FETCH_EVENT_SOURCES', isRefetch: true }); }; // Scroll // ----------------------------------------------------------------------------------------------------------------- CalendarApi.prototype.scrollToTime = function (timeInput) { var time = createDuration(timeInput); if (time) { this.trigger('_scrollRequest', { time: time }); } }; return CalendarApi; }(); var EventApi = /** @class */ function () { // instance will be null if expressing a recurring event that has no current instances, // OR if trying to validate an incoming external event that has no dates assigned function EventApi(context, def, instance) { this._context = context; this._def = def; this._instance = instance || null; } /* TODO: make event struct more responsible for this */ EventApi.prototype.setProp = function (name, val) { var _a, _b; if (name in EVENT_DATE_REFINERS) { console.warn('Could not set date-related prop \'name\'. Use one of the date-related methods instead.'); // TODO: make proper aliasing system? } else if (name === 'id') { val = EVENT_NON_DATE_REFINERS[name](val); this.mutate({ standardProps: { publicId: val } // hardcoded internal name }); } else if (name in EVENT_NON_DATE_REFINERS) { val = EVENT_NON_DATE_REFINERS[name](val); this.mutate({ standardProps: (_a = {}, _a[name] = val, _a) }); } else if (name in EVENT_UI_REFINERS) { var ui = EVENT_UI_REFINERS[name](val); if (name === 'color') { ui = { backgroundColor: val, borderColor: val }; } else if (name === 'editable') { ui = { startEditable: val, durationEditable: val }; } else { ui = (_b = {}, _b[name] = val, _b); } this.mutate({ standardProps: { ui: ui } }); } else { console.warn("Could not set prop '" + name + "'. Use setExtendedProp instead."); } }; EventApi.prototype.setExtendedProp = function (name, val) { var _a; this.mutate({ extendedProps: (_a = {}, _a[name] = val, _a) }); }; EventApi.prototype.setStart = function (startInput, options) { if (options === void 0) { options = {}; } var dateEnv = this._context.dateEnv; var start = dateEnv.createMarker(startInput); if (start && this._instance) { // TODO: warning if parsed bad var instanceRange = this._instance.range; var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!? if (options.maintainDuration) { this.mutate({ datesDelta: startDelta }); } else { this.mutate({ startDelta: startDelta }); } } }; EventApi.prototype.setEnd = function (endInput, options) { if (options === void 0) { options = {}; } var dateEnv = this._context.dateEnv; var end; if (endInput != null) { end = dateEnv.createMarker(endInput); if (!end) { return; // TODO: warning if parsed bad } } if (this._instance) { if (end) { var endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity); this.mutate({ endDelta: endDelta }); } else { this.mutate({ standardProps: { hasEnd: false } }); } } }; EventApi.prototype.setDates = function (startInput, endInput, options) { if (options === void 0) { options = {}; } var dateEnv = this._context.dateEnv; var standardProps = { allDay: options.allDay }; var start = dateEnv.createMarker(startInput); var end; if (!start) { return; // TODO: warning if parsed bad } if (endInput != null) { end = dateEnv.createMarker(endInput); if (!end) { // TODO: warning if parsed bad return; } } if (this._instance) { var instanceRange = this._instance.range; // when computing the diff for an event being converted to all-day, // compute diff off of the all-day values the way event-mutation does. if (options.allDay === true) { instanceRange = computeAlignedDayRange(instanceRange); } var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); if (end) { var endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity); if (durationsEqual(startDelta, endDelta)) { this.mutate({ datesDelta: startDelta, standardProps: standardProps }); } else { this.mutate({ startDelta: startDelta, endDelta: endDelta, standardProps: standardProps }); } } else { // means "clear the end" standardProps.hasEnd = false; this.mutate({ datesDelta: startDelta, standardProps: standardProps }); } } }; EventApi.prototype.moveStart = function (deltaInput) { var delta = createDuration(deltaInput); if (delta) { // TODO: warning if parsed bad this.mutate({ startDelta: delta }); } }; EventApi.prototype.moveEnd = function (deltaInput) { var delta = createDuration(deltaInput); if (delta) { // TODO: warning if parsed bad this.mutate({ endDelta: delta }); } }; EventApi.prototype.moveDates = function (deltaInput) { var delta = createDuration(deltaInput); if (delta) { // TODO: warning if parsed bad this.mutate({ datesDelta: delta }); } }; EventApi.prototype.setAllDay = function (allDay, options) { if (options === void 0) { options = {}; } var standardProps = { allDay: allDay }; var maintainDuration = options.maintainDuration; if (maintainDuration == null) { maintainDuration = this._context.options.allDayMaintainDuration; } if (this._def.allDay !== allDay) { standardProps.hasEnd = maintainDuration; } this.mutate({ standardProps: standardProps }); }; EventApi.prototype.formatRange = function (formatInput) { var dateEnv = this._context.dateEnv; var instance = this._instance; var formatter = createFormatter(formatInput); if (this._def.hasEnd) { return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, { forcedStartTzo: instance.forcedStartTzo, forcedEndTzo: instance.forcedEndTzo }); } return dateEnv.format(instance.range.start, formatter, { forcedTzo: instance.forcedStartTzo }); }; EventApi.prototype.mutate = function (mutation) { var instance = this._instance; if (instance) { var def = this._def; var context_1 = this._context; var eventStore_1 = context_1.getCurrentData().eventStore; var relevantEvents = getRelevantEvents(eventStore_1, instance.instanceId); var eventConfigBase = { '': { display: '', startEditable: true, durationEditable: true, constraints: [], overlap: null, allows: [], backgroundColor: '', borderColor: '', textColor: '', classNames: [] } }; relevantEvents = applyMutationToEventStore(relevantEvents, eventConfigBase, mutation, context_1); var oldEvent = new EventApi(context_1, def, instance); // snapshot this._def = relevantEvents.defs[def.defId]; this._instance = relevantEvents.instances[instance.instanceId]; context_1.dispatch({ type: 'MERGE_EVENTS', eventStore: relevantEvents }); context_1.emitter.trigger('eventChange', { oldEvent: oldEvent, event: this, relatedEvents: buildEventApis(relevantEvents, context_1, instance), revert: function revert() { context_1.dispatch({ type: 'RESET_EVENTS', eventStore: eventStore_1 }); } }); } }; EventApi.prototype.remove = function () { var context = this._context; var asStore = eventApiToStore(this); context.dispatch({ type: 'REMOVE_EVENTS', eventStore: asStore }); context.emitter.trigger('eventRemove', { event: this, relatedEvents: [], revert: function revert() { context.dispatch({ type: 'MERGE_EVENTS', eventStore: asStore }); } }); }; Object.defineProperty(EventApi.prototype, "source", { get: function get() { var sourceId = this._def.sourceId; if (sourceId) { return new EventSourceApi(this._context, this._context.getCurrentData().eventSources[sourceId]); } return null; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "start", { get: function get() { return this._instance ? this._context.dateEnv.toDate(this._instance.range.start) : null; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "end", { get: function get() { return this._instance && this._def.hasEnd ? this._context.dateEnv.toDate(this._instance.range.end) : null; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "startStr", { get: function get() { var instance = this._instance; if (instance) { return this._context.dateEnv.formatIso(instance.range.start, { omitTime: this._def.allDay, forcedTzo: instance.forcedStartTzo }); } return ''; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "endStr", { get: function get() { var instance = this._instance; if (instance && this._def.hasEnd) { return this._context.dateEnv.formatIso(instance.range.end, { omitTime: this._def.allDay, forcedTzo: instance.forcedEndTzo }); } return ''; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "id", { // computable props that all access the def // TODO: find a TypeScript-compatible way to do this at scale get: function get() { return this._def.publicId; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "groupId", { get: function get() { return this._def.groupId; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "allDay", { get: function get() { return this._def.allDay; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "title", { get: function get() { return this._def.title; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "url", { get: function get() { return this._def.url; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "display", { get: function get() { return this._def.ui.display || 'auto'; } // bad. just normalize the type earlier , enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "startEditable", { get: function get() { return this._def.ui.startEditable; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "durationEditable", { get: function get() { return this._def.ui.durationEditable; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "constraint", { get: function get() { return this._def.ui.constraints[0] || null; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "overlap", { get: function get() { return this._def.ui.overlap; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "allow", { get: function get() { return this._def.ui.allows[0] || null; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "backgroundColor", { get: function get() { return this._def.ui.backgroundColor; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "borderColor", { get: function get() { return this._def.ui.borderColor; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "textColor", { get: function get() { return this._def.ui.textColor; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "classNames", { // NOTE: user can't modify these because Object.freeze was called in event-def parsing get: function get() { return this._def.ui.classNames; }, enumerable: false, configurable: true }); Object.defineProperty(EventApi.prototype, "extendedProps", { get: function get() { return this._def.extendedProps; }, enumerable: false, configurable: true }); EventApi.prototype.toPlainObject = function (settings) { if (settings === void 0) { settings = {}; } var def = this._def; var ui = def.ui; var _a = this, startStr = _a.startStr, endStr = _a.endStr; var res = {}; if (def.title) { res.title = def.title; } if (startStr) { res.start = startStr; } if (endStr) { res.end = endStr; } if (def.publicId) { res.id = def.publicId; } if (def.groupId) { res.groupId = def.groupId; } if (def.url) { res.url = def.url; } if (ui.display && ui.display !== 'auto') { res.display = ui.display; } // TODO: what about recurring-event properties??? // TODO: include startEditable/durationEditable/constraint/overlap/allow if (settings.collapseColor && ui.backgroundColor && ui.backgroundColor === ui.borderColor) { res.color = ui.backgroundColor; } else { if (ui.backgroundColor) { res.backgroundColor = ui.backgroundColor; } if (ui.borderColor) { res.borderColor = ui.borderColor; } } if (ui.textColor) { res.textColor = ui.textColor; } if (ui.classNames.length) { res.classNames = ui.classNames; } if (Object.keys(def.extendedProps).length) { if (settings.collapseExtendedProps) { tslib.__assign(res, def.extendedProps); } else { res.extendedProps = def.extendedProps; } } return res; }; EventApi.prototype.toJSON = function () { return this.toPlainObject(); }; return EventApi; }(); function eventApiToStore(eventApi) { var _a, _b; var def = eventApi._def; var instance = eventApi._instance; return { defs: (_a = {}, _a[def.defId] = def, _a), instances: instance ? (_b = {}, _b[instance.instanceId] = instance, _b) : {} }; } function buildEventApis(eventStore, context, excludeInstance) { var defs = eventStore.defs, instances = eventStore.instances; var eventApis = []; var excludeInstanceId = excludeInstance ? excludeInstance.instanceId : ''; for (var id in instances) { var instance = instances[id]; var def = defs[instance.defId]; if (instance.instanceId !== excludeInstanceId) { eventApis.push(new EventApi(context, def, instance)); } } return eventApis; } var calendarSystemClassMap = {}; function registerCalendarSystem(name, theClass) { calendarSystemClassMap[name] = theClass; } function createCalendarSystem(name) { return new calendarSystemClassMap[name](); } var GregorianCalendarSystem = /** @class */ function () { function GregorianCalendarSystem() {} GregorianCalendarSystem.prototype.getMarkerYear = function (d) { return d.getUTCFullYear(); }; GregorianCalendarSystem.prototype.getMarkerMonth = function (d) { return d.getUTCMonth(); }; GregorianCalendarSystem.prototype.getMarkerDay = function (d) { return d.getUTCDate(); }; GregorianCalendarSystem.prototype.arrayToMarker = function (arr) { return arrayToUtcDate(arr); }; GregorianCalendarSystem.prototype.markerToArray = function (marker) { return dateToUtcArray(marker); }; return GregorianCalendarSystem; }(); registerCalendarSystem('gregory', GregorianCalendarSystem); var ISO_RE = /^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T ](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/; function parse(str) { var m = ISO_RE.exec(str); if (m) { var marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number("0." + m[12]) * 1000 : 0)); if (isValidDate(marker)) { var timeZoneOffset = null; if (m[13]) { timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 + Number(m[18] || 0)); } return { marker: marker, isTimeUnspecified: !m[6], timeZoneOffset: timeZoneOffset }; } } return null; } var DateEnv = /** @class */ function () { function DateEnv(settings) { var timeZone = this.timeZone = settings.timeZone; var isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC'; if (settings.namedTimeZoneImpl && isNamedTimeZone) { this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone); } this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl); this.calendarSystem = createCalendarSystem(settings.calendarSystem); this.locale = settings.locale; this.weekDow = settings.locale.week.dow; this.weekDoy = settings.locale.week.doy; if (settings.weekNumberCalculation === 'ISO') { this.weekDow = 1; this.weekDoy = 4; } if (typeof settings.firstDay === 'number') { this.weekDow = settings.firstDay; } if (typeof settings.weekNumberCalculation === 'function') { this.weekNumberFunc = settings.weekNumberCalculation; } this.weekText = settings.weekText != null ? settings.weekText : settings.locale.options.weekText; this.weekTextLong = (settings.weekTextLong != null ? settings.weekTextLong : settings.locale.options.weekTextLong) || this.weekText; this.cmdFormatter = settings.cmdFormatter; this.defaultSeparator = settings.defaultSeparator; } // Creating / Parsing DateEnv.prototype.createMarker = function (input) { var meta = this.createMarkerMeta(input); if (meta === null) { return null; } return meta.marker; }; DateEnv.prototype.createNowMarker = function () { if (this.canComputeOffset) { return this.timestampToMarker(new Date().valueOf()); } // if we can't compute the current date val for a timezone, // better to give the current local date vals than UTC return arrayToUtcDate(dateToLocalArray(new Date())); }; DateEnv.prototype.createMarkerMeta = function (input) { if (typeof input === 'string') { return this.parse(input); } var marker = null; if (typeof input === 'number') { marker = this.timestampToMarker(input); } else if (input instanceof Date) { input = input.valueOf(); if (!isNaN(input)) { marker = this.timestampToMarker(input); } } else if (Array.isArray(input)) { marker = arrayToUtcDate(input); } if (marker === null || !isValidDate(marker)) { return null; } return { marker: marker, isTimeUnspecified: false, forcedTzo: null }; }; DateEnv.prototype.parse = function (s) { var parts = parse(s); if (parts === null) { return null; } var marker = parts.marker; var forcedTzo = null; if (parts.timeZoneOffset !== null) { if (this.canComputeOffset) { marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000); } else { forcedTzo = parts.timeZoneOffset; } } return { marker: marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo: forcedTzo }; }; // Accessors DateEnv.prototype.getYear = function (marker) { return this.calendarSystem.getMarkerYear(marker); }; DateEnv.prototype.getMonth = function (marker) { return this.calendarSystem.getMarkerMonth(marker); }; // Adding / Subtracting DateEnv.prototype.add = function (marker, dur) { var a = this.calendarSystem.markerToArray(marker); a[0] += dur.years; a[1] += dur.months; a[2] += dur.days; a[6] += dur.milliseconds; return this.calendarSystem.arrayToMarker(a); }; DateEnv.prototype.subtract = function (marker, dur) { var a = this.calendarSystem.markerToArray(marker); a[0] -= dur.years; a[1] -= dur.months; a[2] -= dur.days; a[6] -= dur.milliseconds; return this.calendarSystem.arrayToMarker(a); }; DateEnv.prototype.addYears = function (marker, n) { var a = this.calendarSystem.markerToArray(marker); a[0] += n; return this.calendarSystem.arrayToMarker(a); }; DateEnv.prototype.addMonths = function (marker, n) { var a = this.calendarSystem.markerToArray(marker); a[1] += n; return this.calendarSystem.arrayToMarker(a); }; // Diffing Whole Units DateEnv.prototype.diffWholeYears = function (m0, m1) { var calendarSystem = this.calendarSystem; if (timeAsMs(m0) === timeAsMs(m1) && calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) && calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) { return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0); } return null; }; DateEnv.prototype.diffWholeMonths = function (m0, m1) { var calendarSystem = this.calendarSystem; if (timeAsMs(m0) === timeAsMs(m1) && calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) { return calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0) + (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12; } return null; }; // Range / Duration DateEnv.prototype.greatestWholeUnit = function (m0, m1) { var n = this.diffWholeYears(m0, m1); if (n !== null) { return { unit: 'year', value: n }; } n = this.diffWholeMonths(m0, m1); if (n !== null) { return { unit: 'month', value: n }; } n = diffWholeWeeks(m0, m1); if (n !== null) { return { unit: 'week', value: n }; } n = diffWholeDays(m0, m1); if (n !== null) { return { unit: 'day', value: n }; } n = diffHours(m0, m1); if (isInt(n)) { return { unit: 'hour', value: n }; } n = diffMinutes(m0, m1); if (isInt(n)) { return { unit: 'minute', value: n }; } n = diffSeconds(m0, m1); if (isInt(n)) { return { unit: 'second', value: n }; } return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() }; }; DateEnv.prototype.countDurationsBetween = function (m0, m1, d) { // TODO: can use greatestWholeUnit var diff; if (d.years) { diff = this.diffWholeYears(m0, m1); if (diff !== null) { return diff / asRoughYears(d); } } if (d.months) { diff = this.diffWholeMonths(m0, m1); if (diff !== null) { return diff / asRoughMonths(d); } } if (d.days) { diff = diffWholeDays(m0, m1); if (diff !== null) { return diff / asRoughDays(d); } } return (m1.valueOf() - m0.valueOf()) / asRoughMs(d); }; // Start-Of // these DON'T return zoned-dates. only UTC start-of dates DateEnv.prototype.startOf = function (m, unit) { if (unit === 'year') { return this.startOfYear(m); } if (unit === 'month') { return this.startOfMonth(m); } if (unit === 'week') { return this.startOfWeek(m); } if (unit === 'day') { return startOfDay(m); } if (unit === 'hour') { return startOfHour(m); } if (unit === 'minute') { return startOfMinute(m); } if (unit === 'second') { return startOfSecond(m); } return null; }; DateEnv.prototype.startOfYear = function (m) { return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(m)]); }; DateEnv.prototype.startOfMonth = function (m) { return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(m), this.calendarSystem.getMarkerMonth(m)]); }; DateEnv.prototype.startOfWeek = function (m) { return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(m), this.calendarSystem.getMarkerMonth(m), m.getUTCDate() - (m.getUTCDay() - this.weekDow + 7) % 7]); }; // Week Number DateEnv.prototype.computeWeekNumber = function (marker) { if (this.weekNumberFunc) { return this.weekNumberFunc(this.toDate(marker)); } return weekOfYear(marker, this.weekDow, this.weekDoy); }; // TODO: choke on timeZoneName: long DateEnv.prototype.format = function (marker, formatter, dateOptions) { if (dateOptions === void 0) { dateOptions = {}; } return formatter.format({ marker: marker, timeZoneOffset: dateOptions.forcedTzo != null ? dateOptions.forcedTzo : this.offsetForMarker(marker) }, this); }; DateEnv.prototype.formatRange = function (start, end, formatter, dateOptions) { if (dateOptions === void 0) { dateOptions = {}; } if (dateOptions.isEndExclusive) { end = addMs(end, -1); } return formatter.formatRange({ marker: start, timeZoneOffset: dateOptions.forcedStartTzo != null ? dateOptions.forcedStartTzo : this.offsetForMarker(start) }, { marker: end, timeZoneOffset: dateOptions.forcedEndTzo != null ? dateOptions.forcedEndTzo : this.offsetForMarker(end) }, this, dateOptions.defaultSeparator); }; /* DUMB: the omitTime arg is dumb. if we omit the time, we want to omit the timezone offset. and if we do that, might as well use buildIsoString or some other util directly */ DateEnv.prototype.formatIso = function (marker, extraOptions) { if (extraOptions === void 0) { extraOptions = {}; } var timeZoneOffset = null; if (!extraOptions.omitTimeZoneOffset) { if (extraOptions.forcedTzo != null) { timeZoneOffset = extraOptions.forcedTzo; } else { timeZoneOffset = this.offsetForMarker(marker); } } return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime); }; // TimeZone DateEnv.prototype.timestampToMarker = function (ms) { if (this.timeZone === 'local') { return arrayToUtcDate(dateToLocalArray(new Date(ms))); } if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) { return new Date(ms); } return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms)); }; DateEnv.prototype.offsetForMarker = function (m) { if (this.timeZone === 'local') { return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert "inverse" offset to "normal" offset } if (this.timeZone === 'UTC') { return 0; } if (this.namedTimeZoneImpl) { return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)); } return null; }; // Conversion DateEnv.prototype.toDate = function (m, forcedTzo) { if (this.timeZone === 'local') { return arrayToLocalDate(dateToUtcArray(m)); } if (this.timeZone === 'UTC') { return new Date(m.valueOf()); // make sure it's a copy } if (!this.namedTimeZoneImpl) { return new Date(m.valueOf() - (forcedTzo || 0)); } return new Date(m.valueOf() - this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60); }; return DateEnv; }(); var globalLocales = []; var MINIMAL_RAW_EN_LOCALE = { code: 'en', week: { dow: 0, doy: 4 // 4 days need to be within the year to be considered the first week }, direction: 'ltr', buttonText: { prev: 'prev', next: 'next', prevYear: 'prev year', nextYear: 'next year', year: 'year', today: 'today', month: 'month', week: 'week', day: 'day', list: 'list' }, weekText: 'W', weekTextLong: 'Week', closeHint: 'Close', timeHint: 'Time', eventHint: 'Event', allDayText: 'all-day', moreLinkText: 'more', noEventsText: 'No events to display' }; var RAW_EN_LOCALE = tslib.__assign(tslib.__assign({}, MINIMAL_RAW_EN_LOCALE), { // Includes things we don't want other locales to inherit, // things that derive from other translatable strings. buttonHints: { prev: 'Previous $0', next: 'Next $0', today: function today(buttonText, unit) { return unit === 'day' ? 'Today' : "This " + buttonText; } }, viewHint: '$0 view', navLinkHint: 'Go to $0', moreLinkHint: function moreLinkHint(eventCnt) { return "Show " + eventCnt + " more event" + (eventCnt === 1 ? '' : 's'); } }); function organizeRawLocales(explicitRawLocales) { var defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en'; var allRawLocales = globalLocales.concat(explicitRawLocales); var rawLocaleMap = { en: RAW_EN_LOCALE }; for (var _i = 0, allRawLocales_1 = allRawLocales; _i < allRawLocales_1.length; _i++) { var rawLocale = allRawLocales_1[_i]; rawLocaleMap[rawLocale.code] = rawLocale; } return { map: rawLocaleMap, defaultCode: defaultCode }; } function buildLocale(inputSingular, available) { if (_typeof(inputSingular) === 'object' && !Array.isArray(inputSingular)) { return parseLocale(inputSingular.code, [inputSingular.code], inputSingular); } return queryLocale(inputSingular, available); } function queryLocale(codeArg, available) { var codes = [].concat(codeArg || []); // will convert to array var raw = queryRawLocale(codes, available) || RAW_EN_LOCALE; return parseLocale(codeArg, codes, raw); } function queryRawLocale(codes, available) { for (var i = 0; i < codes.length; i += 1) { var parts = codes[i].toLocaleLowerCase().split('-'); for (var j = parts.length; j > 0; j -= 1) { var simpleId = parts.slice(0, j).join('-'); if (available[simpleId]) { return available[simpleId]; } } } return null; } function parseLocale(codeArg, codes, raw) { var merged = mergeProps([MINIMAL_RAW_EN_LOCALE, raw], ['buttonText']); delete merged.code; // don't want this part of the options var week = merged.week; delete merged.week; return { codeArg: codeArg, codes: codes, week: week, simpleNumberFormat: new Intl.NumberFormat(codeArg), options: merged }; } function formatDate(dateInput, options) { if (options === void 0) { options = {}; } var dateEnv = buildDateEnv$1(options); var formatter = createFormatter(options); var dateMeta = dateEnv.createMarkerMeta(dateInput); if (!dateMeta) { // TODO: warning? return ''; } return dateEnv.format(dateMeta.marker, formatter, { forcedTzo: dateMeta.forcedTzo }); } function formatRange(startInput, endInput, options) { var dateEnv = buildDateEnv$1(_typeof(options) === 'object' && options ? options : {}); // pass in if non-null object var formatter = createFormatter(options); var startMeta = dateEnv.createMarkerMeta(startInput); var endMeta = dateEnv.createMarkerMeta(endInput); if (!startMeta || !endMeta) { // TODO: warning? return ''; } return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, { forcedStartTzo: startMeta.forcedTzo, forcedEndTzo: endMeta.forcedTzo, isEndExclusive: options.isEndExclusive, defaultSeparator: BASE_OPTION_DEFAULTS.defaultRangeSeparator }); } // TODO: more DRY and optimized function buildDateEnv$1(settings) { var locale = buildLocale(settings.locale || 'en', organizeRawLocales([]).map); // TODO: don't hardcode 'en' everywhere return new DateEnv(tslib.__assign(tslib.__assign({ timeZone: BASE_OPTION_DEFAULTS.timeZone, calendarSystem: 'gregory' }, settings), { locale: locale })); } var DEF_DEFAULTS = { startTime: '09:00', endTime: '17:00', daysOfWeek: [1, 2, 3, 4, 5], display: 'inverse-background', classNames: 'fc-non-business', groupId: '_businessHours' // so multiple defs get grouped }; /* TODO: pass around as EventDefHash!!! */ function parseBusinessHours(input, context) { return parseEvents(refineInputs(input), null, context); } function refineInputs(input) { var rawDefs; if (input === true) { rawDefs = [{}]; // will get DEF_DEFAULTS verbatim } else if (Array.isArray(input)) { // if specifying an array, every sub-definition NEEDS a day-of-week rawDefs = input.filter(function (rawDef) { return rawDef.daysOfWeek; }); } else if (_typeof(input) === 'object' && input) { // non-null object rawDefs = [input]; } else { // is probably false rawDefs = []; } rawDefs = rawDefs.map(function (rawDef) { return tslib.__assign(tslib.__assign({}, DEF_DEFAULTS), rawDef); }); return rawDefs; } function pointInsideRect(point, rect) { return point.left >= rect.left && point.left < rect.right && point.top >= rect.top && point.top < rect.bottom; } // Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false function intersectRects(rect1, rect2) { var res = { left: Math.max(rect1.left, rect2.left), right: Math.min(rect1.right, rect2.right), top: Math.max(rect1.top, rect2.top), bottom: Math.min(rect1.bottom, rect2.bottom) }; if (res.left < res.right && res.top < res.bottom) { return res; } return false; } function translateRect(rect, deltaX, deltaY) { return { left: rect.left + deltaX, right: rect.right + deltaX, top: rect.top + deltaY, bottom: rect.bottom + deltaY }; } // Returns a new point that will have been moved to reside within the given rectangle function constrainPoint(point, rect) { return { left: Math.min(Math.max(point.left, rect.left), rect.right), top: Math.min(Math.max(point.top, rect.top), rect.bottom) }; } // Returns a point that is the center of the given rectangle function getRectCenter(rect) { return { left: (rect.left + rect.right) / 2, top: (rect.top + rect.bottom) / 2 }; } // Subtracts point2's coordinates from point1's coordinates, returning a delta function diffPoints(point1, point2) { return { left: point1.left - point2.left, top: point1.top - point2.top }; } var canVGrowWithinCell; function getCanVGrowWithinCell() { if (canVGrowWithinCell == null) { canVGrowWithinCell = computeCanVGrowWithinCell(); } return canVGrowWithinCell; } function computeCanVGrowWithinCell() { // for SSR, because this function is call immediately at top-level // TODO: just make this logic execute top-level, immediately, instead of doing lazily if (typeof document === 'undefined') { return true; } var el = document.createElement('div'); el.style.position = 'absolute'; el.style.top = '0px'; el.style.left = '0px'; el.innerHTML = '
'; el.querySelector('table').style.height = '100px'; el.querySelector('div').style.height = '100%'; document.body.appendChild(el); var div = el.querySelector('div'); var possible = div.offsetHeight > 0; document.body.removeChild(el); return possible; } var EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere var Splitter = /** @class */ function () { function Splitter() { this.getKeysForEventDefs = memoize(this._getKeysForEventDefs); this.splitDateSelection = memoize(this._splitDateSpan); this.splitEventStore = memoize(this._splitEventStore); this.splitIndividualUi = memoize(this._splitIndividualUi); this.splitEventDrag = memoize(this._splitInteraction); this.splitEventResize = memoize(this._splitInteraction); this.eventUiBuilders = {}; // TODO: typescript protection } Splitter.prototype.splitProps = function (props) { var _this = this; var keyInfos = this.getKeyInfo(props); var defKeys = this.getKeysForEventDefs(props.eventStore); var dateSelections = this.splitDateSelection(props.dateSelection); var individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases* var eventStores = this.splitEventStore(props.eventStore, defKeys); var eventDrags = this.splitEventDrag(props.eventDrag); var eventResizes = this.splitEventResize(props.eventResize); var splitProps = {}; this.eventUiBuilders = mapHash(keyInfos, function (info, key) { return _this.eventUiBuilders[key] || memoize(buildEventUiForKey); }); for (var key in keyInfos) { var keyInfo = keyInfos[key]; var eventStore = eventStores[key] || EMPTY_EVENT_STORE; var buildEventUi = this.eventUiBuilders[key]; splitProps[key] = { businessHours: keyInfo.businessHours || props.businessHours, dateSelection: dateSelections[key] || null, eventStore: eventStore, eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]), eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '', eventDrag: eventDrags[key] || null, eventResize: eventResizes[key] || null }; } return splitProps; }; Splitter.prototype._splitDateSpan = function (dateSpan) { var dateSpans = {}; if (dateSpan) { var keys = this.getKeysForDateSpan(dateSpan); for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) { var key = keys_1[_i]; dateSpans[key] = dateSpan; } } return dateSpans; }; Splitter.prototype._getKeysForEventDefs = function (eventStore) { var _this = this; return mapHash(eventStore.defs, function (eventDef) { return _this.getKeysForEventDef(eventDef); }); }; Splitter.prototype._splitEventStore = function (eventStore, defKeys) { var defs = eventStore.defs, instances = eventStore.instances; var splitStores = {}; for (var defId in defs) { for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) { var key = _a[_i]; if (!splitStores[key]) { splitStores[key] = createEmptyEventStore(); } splitStores[key].defs[defId] = defs[defId]; } } for (var instanceId in instances) { var instance = instances[instanceId]; for (var _b = 0, _c = defKeys[instance.defId]; _b < _c.length; _b++) { var key = _c[_b]; if (splitStores[key]) { // must have already been created splitStores[key].instances[instanceId] = instance; } } } return splitStores; }; Splitter.prototype._splitIndividualUi = function (eventUiBases, defKeys) { var splitHashes = {}; for (var defId in eventUiBases) { if (defId) { // not the '' key for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) { var key = _a[_i]; if (!splitHashes[key]) { splitHashes[key] = {}; } splitHashes[key][defId] = eventUiBases[defId]; } } } return splitHashes; }; Splitter.prototype._splitInteraction = function (interaction) { var splitStates = {}; if (interaction) { var affectedStores_1 = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents)); // can't rely on defKeys because event data is mutated var mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents); var mutatedStores_1 = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId); var populate = function populate(key) { if (!splitStates[key]) { splitStates[key] = { affectedEvents: affectedStores_1[key] || EMPTY_EVENT_STORE, mutatedEvents: mutatedStores_1[key] || EMPTY_EVENT_STORE, isEvent: interaction.isEvent }; } }; for (var key in affectedStores_1) { populate(key); } for (var key in mutatedStores_1) { populate(key); } } return splitStates; }; return Splitter; }(); function buildEventUiForKey(allUi, eventUiForKey, individualUi) { var baseParts = []; if (allUi) { baseParts.push(allUi); } if (eventUiForKey) { baseParts.push(eventUiForKey); } var stuff = { '': combineEventUis(baseParts) }; if (individualUi) { tslib.__assign(stuff, individualUi); } return stuff; } function getDateMeta(date, todayRange, nowDate, dateProfile) { return { dow: date.getUTCDay(), isDisabled: Boolean(dateProfile && !rangeContainsMarker(dateProfile.activeRange, date)), isOther: Boolean(dateProfile && !rangeContainsMarker(dateProfile.currentRange, date)), isToday: Boolean(todayRange && rangeContainsMarker(todayRange, date)), isPast: Boolean(nowDate ? date < nowDate : todayRange ? date < todayRange.start : false), isFuture: Boolean(nowDate ? date > nowDate : todayRange ? date >= todayRange.end : false) }; } function getDayClassNames(meta, theme) { var classNames = ['fc-day', "fc-day-" + DAY_IDS[meta.dow]]; if (meta.isDisabled) { classNames.push('fc-day-disabled'); } else { if (meta.isToday) { classNames.push('fc-day-today'); classNames.push(theme.getClass('today')); } if (meta.isPast) { classNames.push('fc-day-past'); } if (meta.isFuture) { classNames.push('fc-day-future'); } if (meta.isOther) { classNames.push('fc-day-other'); } } return classNames; } function getSlotClassNames(meta, theme) { var classNames = ['fc-slot', "fc-slot-" + DAY_IDS[meta.dow]]; if (meta.isDisabled) { classNames.push('fc-slot-disabled'); } else { if (meta.isToday) { classNames.push('fc-slot-today'); classNames.push(theme.getClass('today')); } if (meta.isPast) { classNames.push('fc-slot-past'); } if (meta.isFuture) { classNames.push('fc-slot-future'); } } return classNames; } var DAY_FORMAT = createFormatter({ year: 'numeric', month: 'long', day: 'numeric' }); var WEEK_FORMAT = createFormatter({ week: 'long' }); function buildNavLinkAttrs(context, dateMarker, viewType, isTabbable) { if (viewType === void 0) { viewType = 'day'; } if (isTabbable === void 0) { isTabbable = true; } var dateEnv = context.dateEnv, options = context.options, calendarApi = context.calendarApi; var dateStr = dateEnv.format(dateMarker, viewType === 'week' ? WEEK_FORMAT : DAY_FORMAT); if (options.navLinks) { var zonedDate = dateEnv.toDate(dateMarker); var handleInteraction = function handleInteraction(ev) { var customAction = viewType === 'day' ? options.navLinkDayClick : viewType === 'week' ? options.navLinkWeekClick : null; if (typeof customAction === 'function') { customAction.call(calendarApi, dateEnv.toDate(dateMarker), ev); } else { if (typeof customAction === 'string') { viewType = customAction; } calendarApi.zoomTo(dateMarker, viewType); } }; return tslib.__assign({ title: formatWithOrdinals(options.navLinkHint, [dateStr, zonedDate], dateStr), 'data-navlink': '' }, isTabbable ? createAriaClickAttrs(handleInteraction) : { onClick: handleInteraction }); } return { 'aria-label': dateStr }; } var _isRtlScrollbarOnLeft = null; function getIsRtlScrollbarOnLeft() { if (_isRtlScrollbarOnLeft === null) { _isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft(); } return _isRtlScrollbarOnLeft; } function computeIsRtlScrollbarOnLeft() { var outerEl = document.createElement('div'); applyStyle(outerEl, { position: 'absolute', top: -1000, left: 0, border: 0, padding: 0, overflow: 'scroll', direction: 'rtl' }); outerEl.innerHTML = '
'; document.body.appendChild(outerEl); var innerEl = outerEl.firstChild; var res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left; removeElement(outerEl); return res; } var _scrollbarWidths; function getScrollbarWidths() { if (!_scrollbarWidths) { _scrollbarWidths = computeScrollbarWidths(); } return _scrollbarWidths; } function computeScrollbarWidths() { var el = document.createElement('div'); el.style.overflow = 'scroll'; el.style.position = 'absolute'; el.style.top = '-9999px'; el.style.left = '-9999px'; document.body.appendChild(el); var res = computeScrollbarWidthsForEl(el); document.body.removeChild(el); return res; } // WARNING: will include border function computeScrollbarWidthsForEl(el) { return { x: el.offsetHeight - el.clientHeight, y: el.offsetWidth - el.clientWidth }; } function computeEdges(el, getPadding) { if (getPadding === void 0) { getPadding = false; } var computedStyle = window.getComputedStyle(el); var borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0; var borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0; var borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0; var borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0; var badScrollbarWidths = computeScrollbarWidthsForEl(el); // includes border! var scrollbarLeftRight = badScrollbarWidths.y - borderLeft - borderRight; var scrollbarBottom = badScrollbarWidths.x - borderTop - borderBottom; var res = { borderLeft: borderLeft, borderRight: borderRight, borderTop: borderTop, borderBottom: borderBottom, scrollbarBottom: scrollbarBottom, scrollbarLeft: 0, scrollbarRight: 0 }; if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side? res.scrollbarLeft = scrollbarLeftRight; } else { res.scrollbarRight = scrollbarLeftRight; } if (getPadding) { res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0; res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0; res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0; res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0; } return res; } function computeInnerRect(el, goWithinPadding, doFromWindowViewport) { if (goWithinPadding === void 0) { goWithinPadding = false; } var outerRect = doFromWindowViewport ? el.getBoundingClientRect() : computeRect(el); var edges = computeEdges(el, goWithinPadding); var res = { left: outerRect.left + edges.borderLeft + edges.scrollbarLeft, right: outerRect.right - edges.borderRight - edges.scrollbarRight, top: outerRect.top + edges.borderTop, bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom }; if (goWithinPadding) { res.left += edges.paddingLeft; res.right -= edges.paddingRight; res.top += edges.paddingTop; res.bottom -= edges.paddingBottom; } return res; } function computeRect(el) { var rect = el.getBoundingClientRect(); return { left: rect.left + window.pageXOffset, top: rect.top + window.pageYOffset, right: rect.right + window.pageXOffset, bottom: rect.bottom + window.pageYOffset }; } function computeClippedClientRect(el) { var clippingParents = getClippingParents(el); var rect = el.getBoundingClientRect(); for (var _i = 0, clippingParents_1 = clippingParents; _i < clippingParents_1.length; _i++) { var clippingParent = clippingParents_1[_i]; var intersection = intersectRects(rect, clippingParent.getBoundingClientRect()); if (intersection) { rect = intersection; } else { return null; } } return rect; } function computeHeightAndMargins(el) { return el.getBoundingClientRect().height + computeVMargins(el); } function computeVMargins(el) { var computed = window.getComputedStyle(el); return parseInt(computed.marginTop, 10) + parseInt(computed.marginBottom, 10); } // does not return window function getClippingParents(el) { var parents = []; while (el instanceof HTMLElement) { // will stop when gets to document or null var computedStyle = window.getComputedStyle(el); if (computedStyle.position === 'fixed') { break; } if (/(auto|scroll)/.test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) { parents.push(el); } el = el.parentNode; } return parents; } // given a function that resolves a result asynchronously. // the function can either call passed-in success and failure callbacks, // or it can return a promise. // if you need to pass additional params to func, bind them first. function unpromisify(func, success, failure) { // guard against success/failure callbacks being called more than once // and guard against a promise AND callback being used together. var isResolved = false; var wrappedSuccess = function wrappedSuccess() { if (!isResolved) { isResolved = true; success.apply(this, arguments); // eslint-disable-line prefer-rest-params } }; var wrappedFailure = function wrappedFailure() { if (!isResolved) { isResolved = true; if (failure) { failure.apply(this, arguments); // eslint-disable-line prefer-rest-params } } }; var res = func(wrappedSuccess, wrappedFailure); if (res && typeof res.then === 'function') { res.then(wrappedSuccess, wrappedFailure); } } var Emitter = /** @class */ function () { function Emitter() { this.handlers = {}; this.thisContext = null; } Emitter.prototype.setThisContext = function (thisContext) { this.thisContext = thisContext; }; Emitter.prototype.setOptions = function (options) { this.options = options; }; Emitter.prototype.on = function (type, handler) { addToHash(this.handlers, type, handler); }; Emitter.prototype.off = function (type, handler) { removeFromHash(this.handlers, type, handler); }; Emitter.prototype.trigger = function (type) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } var attachedHandlers = this.handlers[type] || []; var optionHandler = this.options && this.options[type]; var handlers = [].concat(optionHandler || [], attachedHandlers); for (var _a = 0, handlers_1 = handlers; _a < handlers_1.length; _a++) { var handler = handlers_1[_a]; handler.apply(this.thisContext, args); } }; Emitter.prototype.hasHandlers = function (type) { return Boolean(this.handlers[type] && this.handlers[type].length || this.options && this.options[type]); }; return Emitter; }(); function addToHash(hash, type, handler) { (hash[type] || (hash[type] = [])).push(handler); } function removeFromHash(hash, type, handler) { if (handler) { if (hash[type]) { hash[type] = hash[type].filter(function (func) { return func !== handler; }); } } else { delete hash[type]; // remove all handler funcs for this type } } /* Records offset information for a set of elements, relative to an origin element. Can record the left/right OR the top/bottom OR both. Provides methods for querying the cache by position. */ var PositionCache = /** @class */ function () { function PositionCache(originEl, els, isHorizontal, isVertical) { this.els = els; var originClientRect = this.originClientRect = originEl.getBoundingClientRect(); // relative to viewport top-left if (isHorizontal) { this.buildElHorizontals(originClientRect.left); } if (isVertical) { this.buildElVerticals(originClientRect.top); } } // Populates the left/right internal coordinate arrays PositionCache.prototype.buildElHorizontals = function (originClientLeft) { var lefts = []; var rights = []; for (var _i = 0, _a = this.els; _i < _a.length; _i++) { var el = _a[_i]; var rect = el.getBoundingClientRect(); lefts.push(rect.left - originClientLeft); rights.push(rect.right - originClientLeft); } this.lefts = lefts; this.rights = rights; }; // Populates the top/bottom internal coordinate arrays PositionCache.prototype.buildElVerticals = function (originClientTop) { var tops = []; var bottoms = []; for (var _i = 0, _a = this.els; _i < _a.length; _i++) { var el = _a[_i]; var rect = el.getBoundingClientRect(); tops.push(rect.top - originClientTop); bottoms.push(rect.bottom - originClientTop); } this.tops = tops; this.bottoms = bottoms; }; // Given a left offset (from document left), returns the index of the el that it horizontally intersects. // If no intersection is made, returns undefined. PositionCache.prototype.leftToIndex = function (leftPosition) { var _a = this, lefts = _a.lefts, rights = _a.rights; var len = lefts.length; var i; for (i = 0; i < len; i += 1) { if (leftPosition >= lefts[i] && leftPosition < rights[i]) { return i; } } return undefined; // TODO: better }; // Given a top offset (from document top), returns the index of the el that it vertically intersects. // If no intersection is made, returns undefined. PositionCache.prototype.topToIndex = function (topPosition) { var _a = this, tops = _a.tops, bottoms = _a.bottoms; var len = tops.length; var i; for (i = 0; i < len; i += 1) { if (topPosition >= tops[i] && topPosition < bottoms[i]) { return i; } } return undefined; // TODO: better }; // Gets the width of the element at the given index PositionCache.prototype.getWidth = function (leftIndex) { return this.rights[leftIndex] - this.lefts[leftIndex]; }; // Gets the height of the element at the given index PositionCache.prototype.getHeight = function (topIndex) { return this.bottoms[topIndex] - this.tops[topIndex]; }; return PositionCache; }(); /* eslint max-classes-per-file: "off" */ /* An object for getting/setting scroll-related information for an element. Internally, this is done very differently for window versus DOM element, so this object serves as a common interface. */ var ScrollController = /** @class */ function () { function ScrollController() {} ScrollController.prototype.getMaxScrollTop = function () { return this.getScrollHeight() - this.getClientHeight(); }; ScrollController.prototype.getMaxScrollLeft = function () { return this.getScrollWidth() - this.getClientWidth(); }; ScrollController.prototype.canScrollVertically = function () { return this.getMaxScrollTop() > 0; }; ScrollController.prototype.canScrollHorizontally = function () { return this.getMaxScrollLeft() > 0; }; ScrollController.prototype.canScrollUp = function () { return this.getScrollTop() > 0; }; ScrollController.prototype.canScrollDown = function () { return this.getScrollTop() < this.getMaxScrollTop(); }; ScrollController.prototype.canScrollLeft = function () { return this.getScrollLeft() > 0; }; ScrollController.prototype.canScrollRight = function () { return this.getScrollLeft() < this.getMaxScrollLeft(); }; return ScrollController; }(); var ElementScrollController = /** @class */ function (_super) { tslib.__extends(ElementScrollController, _super); function ElementScrollController(el) { var _this = _super.call(this) || this; _this.el = el; return _this; } ElementScrollController.prototype.getScrollTop = function () { return this.el.scrollTop; }; ElementScrollController.prototype.getScrollLeft = function () { return this.el.scrollLeft; }; ElementScrollController.prototype.setScrollTop = function (top) { this.el.scrollTop = top; }; ElementScrollController.prototype.setScrollLeft = function (left) { this.el.scrollLeft = left; }; ElementScrollController.prototype.getScrollWidth = function () { return this.el.scrollWidth; }; ElementScrollController.prototype.getScrollHeight = function () { return this.el.scrollHeight; }; ElementScrollController.prototype.getClientHeight = function () { return this.el.clientHeight; }; ElementScrollController.prototype.getClientWidth = function () { return this.el.clientWidth; }; return ElementScrollController; }(ScrollController); var WindowScrollController = /** @class */ function (_super) { tslib.__extends(WindowScrollController, _super); function WindowScrollController() { return _super !== null && _super.apply(this, arguments) || this; } WindowScrollController.prototype.getScrollTop = function () { return window.pageYOffset; }; WindowScrollController.prototype.getScrollLeft = function () { return window.pageXOffset; }; WindowScrollController.prototype.setScrollTop = function (n) { window.scroll(window.pageXOffset, n); }; WindowScrollController.prototype.setScrollLeft = function (n) { window.scroll(n, window.pageYOffset); }; WindowScrollController.prototype.getScrollWidth = function () { return document.documentElement.scrollWidth; }; WindowScrollController.prototype.getScrollHeight = function () { return document.documentElement.scrollHeight; }; WindowScrollController.prototype.getClientHeight = function () { return document.documentElement.clientHeight; }; WindowScrollController.prototype.getClientWidth = function () { return document.documentElement.clientWidth; }; return WindowScrollController; }(ScrollController); var Theme = /** @class */ function () { function Theme(calendarOptions) { if (this.iconOverrideOption) { this.setIconOverride(calendarOptions[this.iconOverrideOption]); } } Theme.prototype.setIconOverride = function (iconOverrideHash) { var iconClassesCopy; var buttonName; if (_typeof(iconOverrideHash) === 'object' && iconOverrideHash) { // non-null object iconClassesCopy = tslib.__assign({}, this.iconClasses); for (buttonName in iconOverrideHash) { iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]); } this.iconClasses = iconClassesCopy; } else if (iconOverrideHash === false) { this.iconClasses = {}; } }; Theme.prototype.applyIconOverridePrefix = function (className) { var prefix = this.iconOverridePrefix; if (prefix && className.indexOf(prefix) !== 0) { // if not already present className = prefix + className; } return className; }; Theme.prototype.getClass = function (key) { return this.classes[key] || ''; }; Theme.prototype.getIconClass = function (buttonName, isRtl) { var className; if (isRtl && this.rtlIconClasses) { className = this.rtlIconClasses[buttonName] || this.iconClasses[buttonName]; } else { className = this.iconClasses[buttonName]; } if (className) { return this.baseIconClass + " " + className; } return ''; }; Theme.prototype.getCustomButtonIconClass = function (customButtonProps) { var className; if (this.iconOverrideCustomButtonOption) { className = customButtonProps[this.iconOverrideCustomButtonOption]; if (className) { return this.baseIconClass + " " + this.applyIconOverridePrefix(className); } } return ''; }; return Theme; }(); Theme.prototype.classes = {}; Theme.prototype.iconClasses = {}; Theme.prototype.baseIconClass = ''; Theme.prototype.iconOverridePrefix = ''; var ScrollResponder = /** @class */ function () { function ScrollResponder(execFunc, emitter, scrollTime, scrollTimeReset) { var _this = this; this.execFunc = execFunc; this.emitter = emitter; this.scrollTime = scrollTime; this.scrollTimeReset = scrollTimeReset; this.handleScrollRequest = function (request) { _this.queuedRequest = tslib.__assign({}, _this.queuedRequest || {}, request); _this.drain(); }; emitter.on('_scrollRequest', this.handleScrollRequest); this.fireInitialScroll(); } ScrollResponder.prototype.detach = function () { this.emitter.off('_scrollRequest', this.handleScrollRequest); }; ScrollResponder.prototype.update = function (isDatesNew) { if (isDatesNew && this.scrollTimeReset) { this.fireInitialScroll(); // will drain } else { this.drain(); } }; ScrollResponder.prototype.fireInitialScroll = function () { this.handleScrollRequest({ time: this.scrollTime }); }; ScrollResponder.prototype.drain = function () { if (this.queuedRequest && this.execFunc(this.queuedRequest)) { this.queuedRequest = null; } }; return ScrollResponder; }(); var ViewContextType = vdom_cjs.createContext({}); // for Components function buildViewContext(viewSpec, viewApi, viewOptions, dateProfileGenerator, dateEnv, theme, pluginHooks, dispatch, getCurrentData, emitter, calendarApi, registerInteractiveComponent, unregisterInteractiveComponent) { return { dateEnv: dateEnv, options: viewOptions, pluginHooks: pluginHooks, emitter: emitter, dispatch: dispatch, getCurrentData: getCurrentData, calendarApi: calendarApi, viewSpec: viewSpec, viewApi: viewApi, dateProfileGenerator: dateProfileGenerator, theme: theme, isRtl: viewOptions.direction === 'rtl', addResizeHandler: function addResizeHandler(handler) { emitter.on('_resize', handler); }, removeResizeHandler: function removeResizeHandler(handler) { emitter.off('_resize', handler); }, createScrollResponder: function createScrollResponder(execFunc) { return new ScrollResponder(execFunc, emitter, createDuration(viewOptions.scrollTime), viewOptions.scrollTimeReset); }, registerInteractiveComponent: registerInteractiveComponent, unregisterInteractiveComponent: unregisterInteractiveComponent }; } /* eslint max-classes-per-file: off */ var PureComponent = /** @class */ function (_super) { tslib.__extends(PureComponent, _super); function PureComponent() { return _super !== null && _super.apply(this, arguments) || this; } PureComponent.prototype.shouldComponentUpdate = function (nextProps, nextState) { if (this.debug) { // eslint-disable-next-line no-console console.log(getUnequalProps(nextProps, this.props), getUnequalProps(nextState, this.state)); } return !compareObjs(this.props, nextProps, this.propEquality) || !compareObjs(this.state, nextState, this.stateEquality); }; // HACK for freakin' React StrictMode PureComponent.prototype.safeSetState = function (newState) { if (!compareObjs(this.state, tslib.__assign(tslib.__assign({}, this.state), newState), this.stateEquality)) { this.setState(newState); } }; PureComponent.addPropsEquality = addPropsEquality; PureComponent.addStateEquality = addStateEquality; PureComponent.contextType = ViewContextType; return PureComponent; }(vdom_cjs.Component); PureComponent.prototype.propEquality = {}; PureComponent.prototype.stateEquality = {}; var BaseComponent = /** @class */ function (_super) { tslib.__extends(BaseComponent, _super); function BaseComponent() { return _super !== null && _super.apply(this, arguments) || this; } BaseComponent.contextType = ViewContextType; return BaseComponent; }(PureComponent); function addPropsEquality(propEquality) { var hash = Object.create(this.prototype.propEquality); tslib.__assign(hash, propEquality); this.prototype.propEquality = hash; } function addStateEquality(stateEquality) { var hash = Object.create(this.prototype.stateEquality); tslib.__assign(hash, stateEquality); this.prototype.stateEquality = hash; } // use other one function setRef(ref, current) { if (typeof ref === 'function') { ref(current); } else if (ref) { // see https://github.com/facebook/react/issues/13029 ref.current = current; } } /* an INTERACTABLE date component PURPOSES: - hook up to fg, fill, and mirror renderers - interface for dragging and hits */ var DateComponent = /** @class */ function (_super) { tslib.__extends(DateComponent, _super); function DateComponent() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.uid = guid(); return _this; } // Hit System // ----------------------------------------------------------------------------------------------------------------- DateComponent.prototype.prepareHits = function () {}; DateComponent.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) { return null; // this should be abstract }; // Pointer Interaction Utils // ----------------------------------------------------------------------------------------------------------------- DateComponent.prototype.isValidSegDownEl = function (el) { return !this.props.eventDrag && // HACK !this.props.eventResize && // HACK !elementClosest(el, '.fc-event-mirror'); }; DateComponent.prototype.isValidDateDownEl = function (el) { return !elementClosest(el, '.fc-event:not(.fc-bg-event)') && !elementClosest(el, '.fc-more-link') && // a "more.." link !elementClosest(el, 'a[data-navlink]') && // a clickable nav link !elementClosest(el, '.fc-popover'); // hack }; return DateComponent; }(BaseComponent); // TODO: easier way to add new hooks? need to update a million things function createPlugin(input) { return { id: guid(), deps: input.deps || [], reducers: input.reducers || [], isLoadingFuncs: input.isLoadingFuncs || [], contextInit: [].concat(input.contextInit || []), eventRefiners: input.eventRefiners || {}, eventDefMemberAdders: input.eventDefMemberAdders || [], eventSourceRefiners: input.eventSourceRefiners || {}, isDraggableTransformers: input.isDraggableTransformers || [], eventDragMutationMassagers: input.eventDragMutationMassagers || [], eventDefMutationAppliers: input.eventDefMutationAppliers || [], dateSelectionTransformers: input.dateSelectionTransformers || [], datePointTransforms: input.datePointTransforms || [], dateSpanTransforms: input.dateSpanTransforms || [], views: input.views || {}, viewPropsTransformers: input.viewPropsTransformers || [], isPropsValid: input.isPropsValid || null, externalDefTransforms: input.externalDefTransforms || [], viewContainerAppends: input.viewContainerAppends || [], eventDropTransformers: input.eventDropTransformers || [], componentInteractions: input.componentInteractions || [], calendarInteractions: input.calendarInteractions || [], themeClasses: input.themeClasses || {}, eventSourceDefs: input.eventSourceDefs || [], cmdFormatter: input.cmdFormatter, recurringTypes: input.recurringTypes || [], namedTimeZonedImpl: input.namedTimeZonedImpl, initialView: input.initialView || '', elementDraggingImpl: input.elementDraggingImpl, optionChangeHandlers: input.optionChangeHandlers || {}, scrollGridImpl: input.scrollGridImpl || null, contentTypeHandlers: input.contentTypeHandlers || {}, listenerRefiners: input.listenerRefiners || {}, optionRefiners: input.optionRefiners || {}, propSetHandlers: input.propSetHandlers || {} }; } function buildPluginHooks(pluginDefs, globalDefs) { var isAdded = {}; var hooks = { reducers: [], isLoadingFuncs: [], contextInit: [], eventRefiners: {}, eventDefMemberAdders: [], eventSourceRefiners: {}, isDraggableTransformers: [], eventDragMutationMassagers: [], eventDefMutationAppliers: [], dateSelectionTransformers: [], datePointTransforms: [], dateSpanTransforms: [], views: {}, viewPropsTransformers: [], isPropsValid: null, externalDefTransforms: [], viewContainerAppends: [], eventDropTransformers: [], componentInteractions: [], calendarInteractions: [], themeClasses: {}, eventSourceDefs: [], cmdFormatter: null, recurringTypes: [], namedTimeZonedImpl: null, initialView: '', elementDraggingImpl: null, optionChangeHandlers: {}, scrollGridImpl: null, contentTypeHandlers: {}, listenerRefiners: {}, optionRefiners: {}, propSetHandlers: {} }; function addDefs(defs) { for (var _i = 0, defs_1 = defs; _i < defs_1.length; _i++) { var def = defs_1[_i]; if (!isAdded[def.id]) { isAdded[def.id] = true; addDefs(def.deps); hooks = combineHooks(hooks, def); } } } if (pluginDefs) { addDefs(pluginDefs); } addDefs(globalDefs); return hooks; } function buildBuildPluginHooks() { var currentOverrideDefs = []; var currentGlobalDefs = []; var currentHooks; return function (overrideDefs, globalDefs) { if (!currentHooks || !isArraysEqual(overrideDefs, currentOverrideDefs) || !isArraysEqual(globalDefs, currentGlobalDefs)) { currentHooks = buildPluginHooks(overrideDefs, globalDefs); } currentOverrideDefs = overrideDefs; currentGlobalDefs = globalDefs; return currentHooks; }; } function combineHooks(hooks0, hooks1) { return { reducers: hooks0.reducers.concat(hooks1.reducers), isLoadingFuncs: hooks0.isLoadingFuncs.concat(hooks1.isLoadingFuncs), contextInit: hooks0.contextInit.concat(hooks1.contextInit), eventRefiners: tslib.__assign(tslib.__assign({}, hooks0.eventRefiners), hooks1.eventRefiners), eventDefMemberAdders: hooks0.eventDefMemberAdders.concat(hooks1.eventDefMemberAdders), eventSourceRefiners: tslib.__assign(tslib.__assign({}, hooks0.eventSourceRefiners), hooks1.eventSourceRefiners), isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers), eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers), eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers), dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers), datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms), dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms), views: tslib.__assign(tslib.__assign({}, hooks0.views), hooks1.views), viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers), isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid, externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms), viewContainerAppends: hooks0.viewContainerAppends.concat(hooks1.viewContainerAppends), eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers), calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions), componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions), themeClasses: tslib.__assign(tslib.__assign({}, hooks0.themeClasses), hooks1.themeClasses), eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs), cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter, recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes), namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl, initialView: hooks0.initialView || hooks1.initialView, elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl, optionChangeHandlers: tslib.__assign(tslib.__assign({}, hooks0.optionChangeHandlers), hooks1.optionChangeHandlers), scrollGridImpl: hooks1.scrollGridImpl || hooks0.scrollGridImpl, contentTypeHandlers: tslib.__assign(tslib.__assign({}, hooks0.contentTypeHandlers), hooks1.contentTypeHandlers), listenerRefiners: tslib.__assign(tslib.__assign({}, hooks0.listenerRefiners), hooks1.listenerRefiners), optionRefiners: tslib.__assign(tslib.__assign({}, hooks0.optionRefiners), hooks1.optionRefiners), propSetHandlers: tslib.__assign(tslib.__assign({}, hooks0.propSetHandlers), hooks1.propSetHandlers) }; } var StandardTheme = /** @class */ function (_super) { tslib.__extends(StandardTheme, _super); function StandardTheme() { return _super !== null && _super.apply(this, arguments) || this; } return StandardTheme; }(Theme); StandardTheme.prototype.classes = { root: 'fc-theme-standard', tableCellShaded: 'fc-cell-shaded', buttonGroup: 'fc-button-group', button: 'fc-button fc-button-primary', buttonActive: 'fc-button-active' }; StandardTheme.prototype.baseIconClass = 'fc-icon'; StandardTheme.prototype.iconClasses = { close: 'fc-icon-x', prev: 'fc-icon-chevron-left', next: 'fc-icon-chevron-right', prevYear: 'fc-icon-chevrons-left', nextYear: 'fc-icon-chevrons-right' }; StandardTheme.prototype.rtlIconClasses = { prev: 'fc-icon-chevron-right', next: 'fc-icon-chevron-left', prevYear: 'fc-icon-chevrons-right', nextYear: 'fc-icon-chevrons-left' }; StandardTheme.prototype.iconOverrideOption = 'buttonIcons'; // TODO: make TS-friendly StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon'; StandardTheme.prototype.iconOverridePrefix = 'fc-icon-'; function compileViewDefs(defaultConfigs, overrideConfigs) { var hash = {}; var viewType; for (viewType in defaultConfigs) { ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs); } for (viewType in overrideConfigs) { ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs); } return hash; } function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) { if (hash[viewType]) { return hash[viewType]; } var viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs); if (viewDef) { hash[viewType] = viewDef; } return viewDef; } function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) { var defaultConfig = defaultConfigs[viewType]; var overrideConfig = overrideConfigs[viewType]; var queryProp = function queryProp(name) { return defaultConfig && defaultConfig[name] !== null ? defaultConfig[name] : overrideConfig && overrideConfig[name] !== null ? overrideConfig[name] : null; }; var theComponent = queryProp('component'); var superType = queryProp('superType'); var superDef = null; if (superType) { if (superType === viewType) { throw new Error('Can\'t have a custom view type that references itself'); } superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs); } if (!theComponent && superDef) { theComponent = superDef.component; } if (!theComponent) { return null; // don't throw a warning, might be settings for a single-unit view } return { type: viewType, component: theComponent, defaults: tslib.__assign(tslib.__assign({}, superDef ? superDef.defaults : {}), defaultConfig ? defaultConfig.rawOptions : {}), overrides: tslib.__assign(tslib.__assign({}, superDef ? superDef.overrides : {}), overrideConfig ? overrideConfig.rawOptions : {}) }; } /* eslint max-classes-per-file: off */ // NOTE: in JSX, you should always use this class with arg. otherwise, will default to any??? var RenderHook = /** @class */ function (_super) { tslib.__extends(RenderHook, _super); function RenderHook() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.rootElRef = vdom_cjs.createRef(); _this.handleRootEl = function (el) { setRef(_this.rootElRef, el); if (_this.props.elRef) { setRef(_this.props.elRef, el); } }; return _this; } RenderHook.prototype.render = function () { var _this = this; var props = this.props; var hookProps = props.hookProps; return vdom_cjs.createElement(MountHook, { hookProps: hookProps, didMount: props.didMount, willUnmount: props.willUnmount, elRef: this.handleRootEl }, function (rootElRef) { return vdom_cjs.createElement(ContentHook, { hookProps: hookProps, content: props.content, defaultContent: props.defaultContent, backupElRef: _this.rootElRef }, function (innerElRef, innerContent) { return props.children(rootElRef, normalizeClassNames(props.classNames, hookProps), innerElRef, innerContent); }); }); }; return RenderHook; }(BaseComponent); // TODO: rename to be about function, not default. use in above type // for forcing rerender of components that use the ContentHook var CustomContentRenderContext = vdom_cjs.createContext(0); function ContentHook(props) { return vdom_cjs.createElement(CustomContentRenderContext.Consumer, null, function (renderId) { return vdom_cjs.createElement(ContentHookInner, tslib.__assign({ renderId: renderId }, props)); }); } var ContentHookInner = /** @class */ function (_super) { tslib.__extends(ContentHookInner, _super); function ContentHookInner() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.innerElRef = vdom_cjs.createRef(); return _this; } ContentHookInner.prototype.render = function () { return this.props.children(this.innerElRef, this.renderInnerContent()); }; ContentHookInner.prototype.componentDidMount = function () { this.updateCustomContent(); }; ContentHookInner.prototype.componentDidUpdate = function () { this.updateCustomContent(); }; ContentHookInner.prototype.componentWillUnmount = function () { if (this.customContentInfo && this.customContentInfo.destroy) { this.customContentInfo.destroy(); } }; ContentHookInner.prototype.renderInnerContent = function () { var customContentInfo = this.customContentInfo; // only populated if using non-[p]react node(s) var innerContent = this.getInnerContent(); var meta = this.getContentMeta(innerContent); // initial run, or content-type changing? (from vue -> react for example) if (!customContentInfo || customContentInfo.contentKey !== meta.contentKey) { // clearing old value if (customContentInfo) { if (customContentInfo.destroy) { customContentInfo.destroy(); } customContentInfo = this.customContentInfo = null; } // assigning new value if (meta.contentKey) { customContentInfo = this.customContentInfo = tslib.__assign({ contentKey: meta.contentKey, contentVal: innerContent[meta.contentKey] }, meta.buildLifecycleFuncs()); } // updating } else if (customContentInfo) { customContentInfo.contentVal = innerContent[meta.contentKey]; } return customContentInfo ? [] // signal that something was specified : innerContent; // assume a [p]react vdom node. use it }; ContentHookInner.prototype.getInnerContent = function () { var props = this.props; var innerContent = normalizeContent(props.content, props.hookProps); if (innerContent === undefined) { // use the default innerContent = normalizeContent(props.defaultContent, props.hookProps); } return innerContent == null ? null : innerContent; // convert undefined to null (better for React) }; ContentHookInner.prototype.getContentMeta = function (innerContent) { var contentTypeHandlers = this.context.pluginHooks.contentTypeHandlers; var contentKey = ''; var buildLifecycleFuncs = null; if (innerContent) { // allowed to be null, for convenience to caller for (var searchKey in contentTypeHandlers) { if (innerContent[searchKey] !== undefined) { contentKey = searchKey; buildLifecycleFuncs = contentTypeHandlers[searchKey]; break; } } } return { contentKey: contentKey, buildLifecycleFuncs: buildLifecycleFuncs }; }; ContentHookInner.prototype.updateCustomContent = function () { if (this.customContentInfo) { // for non-[p]react this.customContentInfo.render(this.innerElRef.current || this.props.backupElRef.current, // the element to render into this.customContentInfo.contentVal); } }; return ContentHookInner; }(BaseComponent); var MountHook = /** @class */ function (_super) { tslib.__extends(MountHook, _super); function MountHook() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.handleRootEl = function (rootEl) { _this.rootEl = rootEl; if (_this.props.elRef) { setRef(_this.props.elRef, rootEl); } }; return _this; } MountHook.prototype.render = function () { return this.props.children(this.handleRootEl); }; MountHook.prototype.componentDidMount = function () { var callback = this.props.didMount; if (callback) { callback(tslib.__assign(tslib.__assign({}, this.props.hookProps), { el: this.rootEl })); } }; MountHook.prototype.componentWillUnmount = function () { var callback = this.props.willUnmount; if (callback) { callback(tslib.__assign(tslib.__assign({}, this.props.hookProps), { el: this.rootEl })); } }; return MountHook; }(BaseComponent); function buildClassNameNormalizer() { var currentGenerator; var currentHookProps; var currentClassNames = []; return function (generator, hookProps) { if (!currentHookProps || !isPropsEqual(currentHookProps, hookProps) || generator !== currentGenerator) { currentGenerator = generator; currentHookProps = hookProps; currentClassNames = normalizeClassNames(generator, hookProps); } return currentClassNames; }; } function normalizeClassNames(classNames, hookProps) { if (typeof classNames === 'function') { classNames = classNames(hookProps); } return parseClassNames(classNames); } function normalizeContent(input, hookProps) { if (typeof input === 'function') { return input(hookProps, vdom_cjs.createElement); // give the function the vdom-creation func } return input; } var ViewRoot = /** @class */ function (_super) { tslib.__extends(ViewRoot, _super); function ViewRoot() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.normalizeClassNames = buildClassNameNormalizer(); return _this; } ViewRoot.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; var options = context.options; var hookProps = { view: context.viewApi }; var customClassNames = this.normalizeClassNames(options.viewClassNames, hookProps); return vdom_cjs.createElement(MountHook, { hookProps: hookProps, didMount: options.viewDidMount, willUnmount: options.viewWillUnmount, elRef: props.elRef }, function (rootElRef) { return props.children(rootElRef, ["fc-" + props.viewSpec.type + "-view", 'fc-view'].concat(customClassNames)); }); }; return ViewRoot; }(BaseComponent); function parseViewConfigs(inputs) { return mapHash(inputs, parseViewConfig); } function parseViewConfig(input) { var rawOptions = typeof input === 'function' ? { component: input } : input; var component = rawOptions.component; if (rawOptions.content) { component = createViewHookComponent(rawOptions); // TODO: remove content/classNames/didMount/etc from options? } return { superType: rawOptions.type, component: component, rawOptions: rawOptions }; } function createViewHookComponent(options) { return function (viewProps) { return vdom_cjs.createElement(ViewContextType.Consumer, null, function (context) { return vdom_cjs.createElement(ViewRoot, { viewSpec: context.viewSpec }, function (viewElRef, viewClassNames) { var hookProps = tslib.__assign(tslib.__assign({}, viewProps), { nextDayThreshold: context.options.nextDayThreshold }); return vdom_cjs.createElement(RenderHook, { hookProps: hookProps, classNames: options.classNames, content: options.content, didMount: options.didMount, willUnmount: options.willUnmount, elRef: viewElRef }, function (rootElRef, customClassNames, innerElRef, innerContent) { return vdom_cjs.createElement("div", { className: viewClassNames.concat(customClassNames).join(' '), ref: rootElRef }, innerContent); }); }); }); }; } function buildViewSpecs(defaultInputs, optionOverrides, dynamicOptionOverrides, localeDefaults) { var defaultConfigs = parseViewConfigs(defaultInputs); var overrideConfigs = parseViewConfigs(optionOverrides.views); var viewDefs = compileViewDefs(defaultConfigs, overrideConfigs); return mapHash(viewDefs, function (viewDef) { return buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults); }); } function buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults) { var durationInput = viewDef.overrides.duration || viewDef.defaults.duration || dynamicOptionOverrides.duration || optionOverrides.duration; var duration = null; var durationUnit = ''; var singleUnit = ''; var singleUnitOverrides = {}; if (durationInput) { duration = createDurationCached(durationInput); if (duration) { // valid? var denom = greatestDurationDenominator(duration); durationUnit = denom.unit; if (denom.value === 1) { singleUnit = durationUnit; singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].rawOptions : {}; } } } var queryButtonText = function queryButtonText(optionsSubset) { var buttonTextMap = optionsSubset.buttonText || {}; var buttonTextKey = viewDef.defaults.buttonTextKey; if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) { return buttonTextMap[buttonTextKey]; } if (buttonTextMap[viewDef.type] != null) { return buttonTextMap[viewDef.type]; } if (buttonTextMap[singleUnit] != null) { return buttonTextMap[singleUnit]; } return null; }; var queryButtonTitle = function queryButtonTitle(optionsSubset) { var buttonHints = optionsSubset.buttonHints || {}; var buttonKey = viewDef.defaults.buttonTextKey; // use same key as text if (buttonKey != null && buttonHints[buttonKey] != null) { return buttonHints[buttonKey]; } if (buttonHints[viewDef.type] != null) { return buttonHints[viewDef.type]; } if (buttonHints[singleUnit] != null) { return buttonHints[singleUnit]; } return null; }; return { type: viewDef.type, component: viewDef.component, duration: duration, durationUnit: durationUnit, singleUnit: singleUnit, optionDefaults: viewDef.defaults, optionOverrides: tslib.__assign(tslib.__assign({}, singleUnitOverrides), viewDef.overrides), buttonTextOverride: queryButtonText(dynamicOptionOverrides) || queryButtonText(optionOverrides) || // constructor-specified buttonText lookup hash takes precedence viewDef.overrides.buttonText, buttonTextDefault: queryButtonText(localeDefaults) || viewDef.defaults.buttonText || queryButtonText(BASE_OPTION_DEFAULTS) || viewDef.type, // not DRY buttonTitleOverride: queryButtonTitle(dynamicOptionOverrides) || queryButtonTitle(optionOverrides) || viewDef.overrides.buttonHint, buttonTitleDefault: queryButtonTitle(localeDefaults) || viewDef.defaults.buttonHint || queryButtonTitle(BASE_OPTION_DEFAULTS) // will eventually fall back to buttonText }; } // hack to get memoization working var durationInputMap = {}; function createDurationCached(durationInput) { var json = JSON.stringify(durationInput); var res = durationInputMap[json]; if (res === undefined) { res = createDuration(durationInput); durationInputMap[json] = res; } return res; } var DateProfileGenerator = /** @class */ function () { function DateProfileGenerator(props) { this.props = props; this.nowDate = getNow(props.nowInput, props.dateEnv); this.initHiddenDays(); } /* Date Range Computation ------------------------------------------------------------------------------------------------------------------*/ // Builds a structure with info about what the dates/ranges will be for the "prev" view. DateProfileGenerator.prototype.buildPrev = function (currentDateProfile, currentDate, forceToValid) { var dateEnv = this.props.dateEnv; var prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month currentDateProfile.dateIncrement); return this.build(prevDate, -1, forceToValid); }; // Builds a structure with info about what the dates/ranges will be for the "next" view. DateProfileGenerator.prototype.buildNext = function (currentDateProfile, currentDate, forceToValid) { var dateEnv = this.props.dateEnv; var nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month currentDateProfile.dateIncrement); return this.build(nextDate, 1, forceToValid); }; // Builds a structure holding dates/ranges for rendering around the given date. // Optional direction param indicates whether the date is being incremented/decremented // from its previous value. decremented = -1, incremented = 1 (default). DateProfileGenerator.prototype.build = function (currentDate, direction, forceToValid) { if (forceToValid === void 0) { forceToValid = true; } var props = this.props; var validRange; var currentInfo; var isRangeAllDay; var renderRange; var activeRange; var isValid; validRange = this.buildValidRange(); validRange = this.trimHiddenDays(validRange); if (forceToValid) { currentDate = constrainMarkerToRange(currentDate, validRange); } currentInfo = this.buildCurrentRangeInfo(currentDate, direction); isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit); renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay); renderRange = this.trimHiddenDays(renderRange); activeRange = renderRange; if (!props.showNonCurrentDates) { activeRange = intersectRanges(activeRange, currentInfo.range); } activeRange = this.adjustActiveRange(activeRange); activeRange = intersectRanges(activeRange, validRange); // might return null // it's invalid if the originally requested date is not contained, // or if the range is completely outside of the valid range. isValid = rangesIntersect(currentInfo.range, validRange); return { // constraint for where prev/next operations can go and where events can be dragged/resized to. // an object with optional start and end properties. validRange: validRange, // range the view is formally responsible for. // for example, a month view might have 1st-31st, excluding padded dates currentRange: currentInfo.range, // name of largest unit being displayed, like "month" or "week" currentRangeUnit: currentInfo.unit, isRangeAllDay: isRangeAllDay, // dates that display events and accept drag-n-drop // will be `null` if no dates accept events activeRange: activeRange, // date range with a rendered skeleton // includes not-active days that need some sort of DOM renderRange: renderRange, // Duration object that denotes the first visible time of any given day slotMinTime: props.slotMinTime, // Duration object that denotes the exclusive visible end time of any given day slotMaxTime: props.slotMaxTime, isValid: isValid, // how far the current date will move for a prev/next operation dateIncrement: this.buildDateIncrement(currentInfo.duration) // pass a fallback (might be null) ^ }; }; // Builds an object with optional start/end properties. // Indicates the minimum/maximum dates to display. // not responsible for trimming hidden days. DateProfileGenerator.prototype.buildValidRange = function () { var input = this.props.validRangeInput; var simpleInput = typeof input === 'function' ? input.call(this.props.calendarApi, this.nowDate) : input; return this.refineRange(simpleInput) || { start: null, end: null }; // completely open-ended }; // Builds a structure with info about the "current" range, the range that is // highlighted as being the current month for example. // See build() for a description of `direction`. // Guaranteed to have `range` and `unit` properties. `duration` is optional. DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) { var props = this.props; var duration = null; var unit = null; var range = null; var dayCount; if (props.duration) { duration = props.duration; unit = props.durationUnit; range = this.buildRangeFromDuration(date, direction, duration, unit); } else if (dayCount = this.props.dayCount) { unit = 'day'; range = this.buildRangeFromDayCount(date, direction, dayCount); } else if (range = this.buildCustomVisibleRange(date)) { unit = props.dateEnv.greatestWholeUnit(range.start, range.end).unit; } else { duration = this.getFallbackDuration(); unit = greatestDurationDenominator(duration).unit; range = this.buildRangeFromDuration(date, direction, duration, unit); } return { duration: duration, unit: unit, range: range }; }; DateProfileGenerator.prototype.getFallbackDuration = function () { return createDuration({ day: 1 }); }; // Returns a new activeRange to have time values (un-ambiguate) // slotMinTime or slotMaxTime causes the range to expand. DateProfileGenerator.prototype.adjustActiveRange = function (range) { var _a = this.props, dateEnv = _a.dateEnv, usesMinMaxTime = _a.usesMinMaxTime, slotMinTime = _a.slotMinTime, slotMaxTime = _a.slotMaxTime; var start = range.start, end = range.end; if (usesMinMaxTime) { // expand active range if slotMinTime is negative (why not when positive?) if (asRoughDays(slotMinTime) < 0) { start = startOfDay(start); // necessary? start = dateEnv.add(start, slotMinTime); } // expand active range if slotMaxTime is beyond one day (why not when negative?) if (asRoughDays(slotMaxTime) > 1) { end = startOfDay(end); // necessary? end = addDays(end, -1); end = dateEnv.add(end, slotMaxTime); } } return { start: start, end: end }; }; // Builds the "current" range when it is specified as an explicit duration. // `unit` is the already-computed greatestDurationDenominator unit of duration. DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) { var _a = this.props, dateEnv = _a.dateEnv, dateAlignment = _a.dateAlignment; var start; var end; var res; // compute what the alignment should be if (!dateAlignment) { var dateIncrement = this.props.dateIncrement; if (dateIncrement) { // use the smaller of the two units if (asRoughMs(dateIncrement) < asRoughMs(duration)) { dateAlignment = greatestDurationDenominator(dateIncrement).unit; } else { dateAlignment = unit; } } else { dateAlignment = unit; } } // if the view displays a single day or smaller if (asRoughDays(duration) <= 1) { if (this.isHiddenDay(start)) { start = this.skipHiddenDays(start, direction); start = startOfDay(start); } } function computeRes() { start = dateEnv.startOf(date, dateAlignment); end = dateEnv.add(start, duration); res = { start: start, end: end }; } computeRes(); // if range is completely enveloped by hidden days, go past the hidden days if (!this.trimHiddenDays(res)) { date = this.skipHiddenDays(date, direction); computeRes(); } return res; }; // Builds the "current" range when a dayCount is specified. DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) { var _a = this.props, dateEnv = _a.dateEnv, dateAlignment = _a.dateAlignment; var runningCount = 0; var start = date; var end; if (dateAlignment) { start = dateEnv.startOf(start, dateAlignment); } start = startOfDay(start); start = this.skipHiddenDays(start, direction); end = start; do { end = addDays(end, 1); if (!this.isHiddenDay(end)) { runningCount += 1; } } while (runningCount < dayCount); return { start: start, end: end }; }; // Builds a normalized range object for the "visible" range, // which is a way to define the currentRange and activeRange at the same time. DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) { var props = this.props; var input = props.visibleRangeInput; var simpleInput = typeof input === 'function' ? input.call(props.calendarApi, props.dateEnv.toDate(date)) : input; var range = this.refineRange(simpleInput); if (range && (range.start == null || range.end == null)) { return null; } return range; }; // Computes the range that will represent the element/cells for *rendering*, // but which may have voided days/times. // not responsible for trimming hidden days. DateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) { return currentRange; }; // Compute the duration value that should be added/substracted to the current date // when a prev/next operation happens. DateProfileGenerator.prototype.buildDateIncrement = function (fallback) { var dateIncrement = this.props.dateIncrement; var customAlignment; if (dateIncrement) { return dateIncrement; } if (customAlignment = this.props.dateAlignment) { return createDuration(1, customAlignment); } if (fallback) { return fallback; } return createDuration({ days: 1 }); }; DateProfileGenerator.prototype.refineRange = function (rangeInput) { if (rangeInput) { var range = parseRange(rangeInput, this.props.dateEnv); if (range) { range = computeVisibleDayRange(range); } return range; } return null; }; /* Hidden Days ------------------------------------------------------------------------------------------------------------------*/ // Initializes internal variables related to calculating hidden days-of-week DateProfileGenerator.prototype.initHiddenDays = function () { var hiddenDays = this.props.hiddenDays || []; // array of day-of-week indices that are hidden var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool) var dayCnt = 0; var i; if (this.props.weekends === false) { hiddenDays.push(0, 6); // 0=sunday, 6=saturday } for (i = 0; i < 7; i += 1) { if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) { dayCnt += 1; } } if (!dayCnt) { throw new Error('invalid hiddenDays'); // all days were hidden? bad. } this.isHiddenDayHash = isHiddenDayHash; }; // Remove days from the beginning and end of the range that are computed as hidden. // If the whole range is trimmed off, returns null DateProfileGenerator.prototype.trimHiddenDays = function (range) { var start = range.start, end = range.end; if (start) { start = this.skipHiddenDays(start); } if (end) { end = this.skipHiddenDays(end, -1, true); } if (start == null || end == null || start < end) { return { start: start, end: end }; } return null; }; // Is the current day hidden? // `day` is a day-of-week index (0-6), or a Date (used for UTC) DateProfileGenerator.prototype.isHiddenDay = function (day) { if (day instanceof Date) { day = day.getUTCDay(); } return this.isHiddenDayHash[day]; }; // Incrementing the current day until it is no longer a hidden day, returning a copy. // DOES NOT CONSIDER validRange! // If the initial value of `date` is not a hidden day, don't do anything. // Pass `isExclusive` as `true` if you are dealing with an end date. // `inc` defaults to `1` (increment one day forward each time) DateProfileGenerator.prototype.skipHiddenDays = function (date, inc, isExclusive) { if (inc === void 0) { inc = 1; } if (isExclusive === void 0) { isExclusive = false; } while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) { date = addDays(date, inc); } return date; }; return DateProfileGenerator; }(); function reduceViewType(viewType, action) { switch (action.type) { case 'CHANGE_VIEW_TYPE': viewType = action.viewType; } return viewType; } function reduceDynamicOptionOverrides(dynamicOptionOverrides, action) { var _a; switch (action.type) { case 'SET_OPTION': return tslib.__assign(tslib.__assign({}, dynamicOptionOverrides), (_a = {}, _a[action.optionName] = action.rawOptionValue, _a)); default: return dynamicOptionOverrides; } } function reduceDateProfile(currentDateProfile, action, currentDate, dateProfileGenerator) { var dp; switch (action.type) { case 'CHANGE_VIEW_TYPE': return dateProfileGenerator.build(action.dateMarker || currentDate); case 'CHANGE_DATE': return dateProfileGenerator.build(action.dateMarker); case 'PREV': dp = dateProfileGenerator.buildPrev(currentDateProfile, currentDate); if (dp.isValid) { return dp; } break; case 'NEXT': dp = dateProfileGenerator.buildNext(currentDateProfile, currentDate); if (dp.isValid) { return dp; } break; } return currentDateProfile; } function initEventSources(calendarOptions, dateProfile, context) { var activeRange = dateProfile ? dateProfile.activeRange : null; return addSources({}, parseInitialSources(calendarOptions, context), activeRange, context); } function reduceEventSources(eventSources, action, dateProfile, context) { var activeRange = dateProfile ? dateProfile.activeRange : null; // need this check? switch (action.type) { case 'ADD_EVENT_SOURCES': // already parsed return addSources(eventSources, action.sources, activeRange, context); case 'REMOVE_EVENT_SOURCE': return removeSource(eventSources, action.sourceId); case 'PREV': // TODO: how do we track all actions that affect dateProfile :( case 'NEXT': case 'CHANGE_DATE': case 'CHANGE_VIEW_TYPE': if (dateProfile) { return fetchDirtySources(eventSources, activeRange, context); } return eventSources; case 'FETCH_EVENT_SOURCES': return fetchSourcesByIds(eventSources, action.sourceIds ? // why no type? arrayToHash(action.sourceIds) : excludeStaticSources(eventSources, context), activeRange, action.isRefetch || false, context); case 'RECEIVE_EVENTS': case 'RECEIVE_EVENT_ERROR': return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange); case 'REMOVE_ALL_EVENT_SOURCES': return {}; default: return eventSources; } } function reduceEventSourcesNewTimeZone(eventSources, dateProfile, context) { var activeRange = dateProfile ? dateProfile.activeRange : null; // need this check? return fetchSourcesByIds(eventSources, excludeStaticSources(eventSources, context), activeRange, true, context); } function computeEventSourcesLoading(eventSources) { for (var sourceId in eventSources) { if (eventSources[sourceId].isFetching) { return true; } } return false; } function addSources(eventSourceHash, sources, fetchRange, context) { var hash = {}; for (var _i = 0, sources_1 = sources; _i < sources_1.length; _i++) { var source = sources_1[_i]; hash[source.sourceId] = source; } if (fetchRange) { hash = fetchDirtySources(hash, fetchRange, context); } return tslib.__assign(tslib.__assign({}, eventSourceHash), hash); } function removeSource(eventSourceHash, sourceId) { return filterHash(eventSourceHash, function (eventSource) { return eventSource.sourceId !== sourceId; }); } function fetchDirtySources(sourceHash, fetchRange, context) { return fetchSourcesByIds(sourceHash, filterHash(sourceHash, function (eventSource) { return isSourceDirty(eventSource, fetchRange, context); }), fetchRange, false, context); } function isSourceDirty(eventSource, fetchRange, context) { if (!doesSourceNeedRange(eventSource, context)) { return !eventSource.latestFetchId; } return !context.options.lazyFetching || !eventSource.fetchRange || eventSource.isFetching || // always cancel outdated in-progress fetches fetchRange.start < eventSource.fetchRange.start || fetchRange.end > eventSource.fetchRange.end; } function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, isRefetch, context) { var nextSources = {}; for (var sourceId in prevSources) { var source = prevSources[sourceId]; if (sourceIdHash[sourceId]) { nextSources[sourceId] = fetchSource(source, fetchRange, isRefetch, context); } else { nextSources[sourceId] = source; } } return nextSources; } function fetchSource(eventSource, fetchRange, isRefetch, context) { var options = context.options, calendarApi = context.calendarApi; var sourceDef = context.pluginHooks.eventSourceDefs[eventSource.sourceDefId]; var fetchId = guid(); sourceDef.fetch({ eventSource: eventSource, range: fetchRange, isRefetch: isRefetch, context: context }, function (res) { var rawEvents = res.rawEvents; if (options.eventSourceSuccess) { rawEvents = options.eventSourceSuccess.call(calendarApi, rawEvents, res.xhr) || rawEvents; } if (eventSource.success) { rawEvents = eventSource.success.call(calendarApi, rawEvents, res.xhr) || rawEvents; } context.dispatch({ type: 'RECEIVE_EVENTS', sourceId: eventSource.sourceId, fetchId: fetchId, fetchRange: fetchRange, rawEvents: rawEvents }); }, function (error) { console.warn(error.message, error); if (options.eventSourceFailure) { options.eventSourceFailure.call(calendarApi, error); } if (eventSource.failure) { eventSource.failure(error); } context.dispatch({ type: 'RECEIVE_EVENT_ERROR', sourceId: eventSource.sourceId, fetchId: fetchId, fetchRange: fetchRange, error: error }); }); return tslib.__assign(tslib.__assign({}, eventSource), { isFetching: true, latestFetchId: fetchId }); } function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) { var _a; var eventSource = sourceHash[sourceId]; if (eventSource && // not already removed fetchId === eventSource.latestFetchId) { return tslib.__assign(tslib.__assign({}, sourceHash), (_a = {}, _a[sourceId] = tslib.__assign(tslib.__assign({}, eventSource), { isFetching: false, fetchRange: fetchRange }), _a)); } return sourceHash; } function excludeStaticSources(eventSources, context) { return filterHash(eventSources, function (eventSource) { return doesSourceNeedRange(eventSource, context); }); } function parseInitialSources(rawOptions, context) { var refiners = buildEventSourceRefiners(context); var rawSources = [].concat(rawOptions.eventSources || []); var sources = []; // parsed if (rawOptions.initialEvents) { rawSources.unshift(rawOptions.initialEvents); } if (rawOptions.events) { rawSources.unshift(rawOptions.events); } for (var _i = 0, rawSources_1 = rawSources; _i < rawSources_1.length; _i++) { var rawSource = rawSources_1[_i]; var source = parseEventSource(rawSource, context, refiners); if (source) { sources.push(source); } } return sources; } function doesSourceNeedRange(eventSource, context) { var defs = context.pluginHooks.eventSourceDefs; return !defs[eventSource.sourceDefId].ignoreRange; } function reduceEventStore(eventStore, action, eventSources, dateProfile, context) { switch (action.type) { case 'RECEIVE_EVENTS': // raw return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, context); case 'ADD_EVENTS': // already parsed, but not expanded return addEvent(eventStore, action.eventStore, // new ones dateProfile ? dateProfile.activeRange : null, context); case 'RESET_EVENTS': return action.eventStore; case 'MERGE_EVENTS': // already parsed and expanded return mergeEventStores(eventStore, action.eventStore); case 'PREV': // TODO: how do we track all actions that affect dateProfile :( case 'NEXT': case 'CHANGE_DATE': case 'CHANGE_VIEW_TYPE': if (dateProfile) { return expandRecurring(eventStore, dateProfile.activeRange, context); } return eventStore; case 'REMOVE_EVENTS': return excludeSubEventStore(eventStore, action.eventStore); case 'REMOVE_EVENT_SOURCE': return excludeEventsBySourceId(eventStore, action.sourceId); case 'REMOVE_ALL_EVENT_SOURCES': return filterEventStoreDefs(eventStore, function (eventDef) { return !eventDef.sourceId // only keep events with no source id ; }); case 'REMOVE_ALL_EVENTS': return createEmptyEventStore(); default: return eventStore; } } function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, context) { if (eventSource && // not already removed fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources ) { var subset = parseEvents(transformRawEvents(rawEvents, eventSource, context), eventSource, context); if (fetchRange) { subset = expandRecurring(subset, fetchRange, context); } return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset); } return eventStore; } function transformRawEvents(rawEvents, eventSource, context) { var calEachTransform = context.options.eventDataTransform; var sourceEachTransform = eventSource ? eventSource.eventDataTransform : null; if (sourceEachTransform) { rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform); } if (calEachTransform) { rawEvents = transformEachRawEvent(rawEvents, calEachTransform); } return rawEvents; } function transformEachRawEvent(rawEvents, func) { var refinedEvents; if (!func) { refinedEvents = rawEvents; } else { refinedEvents = []; for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) { var rawEvent = rawEvents_1[_i]; var refinedEvent = func(rawEvent); if (refinedEvent) { refinedEvents.push(refinedEvent); } else if (refinedEvent == null) { refinedEvents.push(rawEvent); } // if a different falsy value, do nothing } } return refinedEvents; } function addEvent(eventStore, subset, expandRange, context) { if (expandRange) { subset = expandRecurring(subset, expandRange, context); } return mergeEventStores(eventStore, subset); } function rezoneEventStoreDates(eventStore, oldDateEnv, newDateEnv) { var defs = eventStore.defs; var instances = mapHash(eventStore.instances, function (instance) { var def = defs[instance.defId]; if (def.allDay || def.recurringDef) { return instance; // isn't dependent on timezone } return tslib.__assign(tslib.__assign({}, instance), { range: { start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)), end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo)) }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo }); }); return { defs: defs, instances: instances }; } function excludeEventsBySourceId(eventStore, sourceId) { return filterEventStoreDefs(eventStore, function (eventDef) { return eventDef.sourceId !== sourceId; }); } // QUESTION: why not just return instances? do a general object-property-exclusion util function excludeInstances(eventStore, removals) { return { defs: eventStore.defs, instances: filterHash(eventStore.instances, function (instance) { return !removals[instance.instanceId]; }) }; } function reduceDateSelection(currentSelection, action) { switch (action.type) { case 'UNSELECT_DATES': return null; case 'SELECT_DATES': return action.selection; default: return currentSelection; } } function reduceSelectedEvent(currentInstanceId, action) { switch (action.type) { case 'UNSELECT_EVENT': return ''; case 'SELECT_EVENT': return action.eventInstanceId; default: return currentInstanceId; } } function reduceEventDrag(currentDrag, action) { var newDrag; switch (action.type) { case 'UNSET_EVENT_DRAG': return null; case 'SET_EVENT_DRAG': newDrag = action.state; return { affectedEvents: newDrag.affectedEvents, mutatedEvents: newDrag.mutatedEvents, isEvent: newDrag.isEvent }; default: return currentDrag; } } function reduceEventResize(currentResize, action) { var newResize; switch (action.type) { case 'UNSET_EVENT_RESIZE': return null; case 'SET_EVENT_RESIZE': newResize = action.state; return { affectedEvents: newResize.affectedEvents, mutatedEvents: newResize.mutatedEvents, isEvent: newResize.isEvent }; default: return currentResize; } } function parseToolbars(calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) { var header = calendarOptions.headerToolbar ? parseToolbar(calendarOptions.headerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null; var footer = calendarOptions.footerToolbar ? parseToolbar(calendarOptions.footerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) : null; return { header: header, footer: footer }; } function parseToolbar(sectionStrHash, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) { var sectionWidgets = {}; var viewsWithButtons = []; var hasTitle = false; for (var sectionName in sectionStrHash) { var sectionStr = sectionStrHash[sectionName]; var sectionRes = parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi); sectionWidgets[sectionName] = sectionRes.widgets; viewsWithButtons.push.apply(viewsWithButtons, sectionRes.viewsWithButtons); hasTitle = hasTitle || sectionRes.hasTitle; } return { sectionWidgets: sectionWidgets, viewsWithButtons: viewsWithButtons, hasTitle: hasTitle }; } /* BAD: querying icons and text here. should be done at render time */ function parseSection(sectionStr, calendarOptions, // defaults+overrides, then refined calendarOptionOverrides, // overrides only!, unrefined :( theme, viewSpecs, calendarApi) { var isRtl = calendarOptions.direction === 'rtl'; var calendarCustomButtons = calendarOptions.customButtons || {}; var calendarButtonTextOverrides = calendarOptionOverrides.buttonText || {}; var calendarButtonText = calendarOptions.buttonText || {}; var calendarButtonHintOverrides = calendarOptionOverrides.buttonHints || {}; var calendarButtonHints = calendarOptions.buttonHints || {}; var sectionSubstrs = sectionStr ? sectionStr.split(' ') : []; var viewsWithButtons = []; var hasTitle = false; var widgets = sectionSubstrs.map(function (buttonGroupStr) { return buttonGroupStr.split(',').map(function (buttonName) { if (buttonName === 'title') { hasTitle = true; return { buttonName: buttonName }; } var customButtonProps; var viewSpec; var buttonClick; var buttonIcon; // only one of these will be set var buttonText; // " var buttonHint; // ^ for the title="" attribute, for accessibility if (customButtonProps = calendarCustomButtons[buttonName]) { buttonClick = function buttonClick(ev) { if (customButtonProps.click) { customButtonProps.click.call(ev.target, ev, ev.target); // TODO: use Calendar this context? } }; (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) || (buttonIcon = theme.getIconClass(buttonName, isRtl)) || (buttonText = customButtonProps.text); buttonHint = customButtonProps.hint || customButtonProps.text; } else if (viewSpec = viewSpecs[buttonName]) { viewsWithButtons.push(buttonName); buttonClick = function buttonClick() { calendarApi.changeView(buttonName); }; (buttonText = viewSpec.buttonTextOverride) || (buttonIcon = theme.getIconClass(buttonName, isRtl)) || (buttonText = viewSpec.buttonTextDefault); var textFallback = viewSpec.buttonTextOverride || viewSpec.buttonTextDefault; buttonHint = formatWithOrdinals(viewSpec.buttonTitleOverride || viewSpec.buttonTitleDefault || calendarOptions.viewHint, [textFallback, buttonName], // view-name = buttonName textFallback); } else if (calendarApi[buttonName]) { // a calendarApi method buttonClick = function buttonClick() { calendarApi[buttonName](); }; (buttonText = calendarButtonTextOverrides[buttonName]) || (buttonIcon = theme.getIconClass(buttonName, isRtl)) || (buttonText = calendarButtonText[buttonName]); // everything else is considered default if (buttonName === 'prevYear' || buttonName === 'nextYear') { var prevOrNext = buttonName === 'prevYear' ? 'prev' : 'next'; buttonHint = formatWithOrdinals(calendarButtonHintOverrides[prevOrNext] || calendarButtonHints[prevOrNext], [calendarButtonText.year || 'year', 'year'], calendarButtonText[buttonName]); } else { buttonHint = function buttonHint(navUnit) { return formatWithOrdinals(calendarButtonHintOverrides[buttonName] || calendarButtonHints[buttonName], [calendarButtonText[navUnit] || navUnit, navUnit], calendarButtonText[buttonName]); }; } } return { buttonName: buttonName, buttonClick: buttonClick, buttonIcon: buttonIcon, buttonText: buttonText, buttonHint: buttonHint }; }); }); return { widgets: widgets, viewsWithButtons: viewsWithButtons, hasTitle: hasTitle }; } var eventSourceDef$2 = { ignoreRange: true, parseMeta: function parseMeta(refined) { if (Array.isArray(refined.events)) { return refined.events; } return null; }, fetch: function fetch(arg, success) { success({ rawEvents: arg.eventSource.meta }); } }; var arrayEventSourcePlugin = createPlugin({ eventSourceDefs: [eventSourceDef$2] }); var eventSourceDef$1 = { parseMeta: function parseMeta(refined) { if (typeof refined.events === 'function') { return refined.events; } return null; }, fetch: function fetch(arg, success, failure) { var dateEnv = arg.context.dateEnv; var func = arg.eventSource.meta; unpromisify(func.bind(null, buildRangeApiWithTimeZone(arg.range, dateEnv)), function (rawEvents) { success({ rawEvents: rawEvents }); // needs an object response }, failure); } }; var funcEventSourcePlugin = createPlugin({ eventSourceDefs: [eventSourceDef$1] }); function requestJson(method, url, params, successCallback, failureCallback) { method = method.toUpperCase(); var body = null; if (method === 'GET') { url = injectQueryStringParams(url, params); } else { body = encodeParams(params); } var xhr = new XMLHttpRequest(); xhr.open(method, url, true); if (method !== 'GET') { xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); } xhr.onload = function () { if (xhr.status >= 200 && xhr.status < 400) { var parsed = false; var res = void 0; try { res = JSON.parse(xhr.responseText); parsed = true; } catch (err) {// will handle parsed=false } if (parsed) { successCallback(res, xhr); } else { failureCallback('Failure parsing JSON', xhr); } } else { failureCallback('Request failed', xhr); } }; xhr.onerror = function () { failureCallback('Request failed', xhr); }; xhr.send(body); } function injectQueryStringParams(url, params) { return url + (url.indexOf('?') === -1 ? '?' : '&') + encodeParams(params); } function encodeParams(params) { var parts = []; for (var key in params) { parts.push(encodeURIComponent(key) + "=" + encodeURIComponent(params[key])); } return parts.join('&'); } var JSON_FEED_EVENT_SOURCE_REFINERS = { method: String, extraParams: identity, startParam: String, endParam: String, timeZoneParam: String }; var eventSourceDef = { parseMeta: function parseMeta(refined) { if (refined.url && (refined.format === 'json' || !refined.format)) { return { url: refined.url, format: 'json', method: (refined.method || 'GET').toUpperCase(), extraParams: refined.extraParams, startParam: refined.startParam, endParam: refined.endParam, timeZoneParam: refined.timeZoneParam }; } return null; }, fetch: function fetch(arg, success, failure) { var meta = arg.eventSource.meta; var requestParams = buildRequestParams(meta, arg.range, arg.context); requestJson(meta.method, meta.url, requestParams, function (rawEvents, xhr) { success({ rawEvents: rawEvents, xhr: xhr }); }, function (errorMessage, xhr) { failure({ message: errorMessage, xhr: xhr }); }); } }; var jsonFeedEventSourcePlugin = createPlugin({ eventSourceRefiners: JSON_FEED_EVENT_SOURCE_REFINERS, eventSourceDefs: [eventSourceDef] }); function buildRequestParams(meta, range, context) { var dateEnv = context.dateEnv, options = context.options; var startParam; var endParam; var timeZoneParam; var customRequestParams; var params = {}; startParam = meta.startParam; if (startParam == null) { startParam = options.startParam; } endParam = meta.endParam; if (endParam == null) { endParam = options.endParam; } timeZoneParam = meta.timeZoneParam; if (timeZoneParam == null) { timeZoneParam = options.timeZoneParam; } // retrieve any outbound GET/POST data from the options if (typeof meta.extraParams === 'function') { // supplied as a function that returns a key/value object customRequestParams = meta.extraParams(); } else { // probably supplied as a straight key/value object customRequestParams = meta.extraParams || {}; } tslib.__assign(params, customRequestParams); params[startParam] = dateEnv.formatIso(range.start); params[endParam] = dateEnv.formatIso(range.end); if (dateEnv.timeZone !== 'local') { params[timeZoneParam] = dateEnv.timeZone; } return params; } var SIMPLE_RECURRING_REFINERS = { daysOfWeek: identity, startTime: createDuration, endTime: createDuration, duration: createDuration, startRecur: identity, endRecur: identity }; var recurring = { parse: function parse(refined, dateEnv) { if (refined.daysOfWeek || refined.startTime || refined.endTime || refined.startRecur || refined.endRecur) { var recurringData = { daysOfWeek: refined.daysOfWeek || null, startTime: refined.startTime || null, endTime: refined.endTime || null, startRecur: refined.startRecur ? dateEnv.createMarker(refined.startRecur) : null, endRecur: refined.endRecur ? dateEnv.createMarker(refined.endRecur) : null }; var duration = void 0; if (refined.duration) { duration = refined.duration; } if (!duration && refined.startTime && refined.endTime) { duration = subtractDurations(refined.endTime, refined.startTime); } return { allDayGuess: Boolean(!refined.startTime && !refined.endTime), duration: duration, typeData: recurringData // doesn't need endTime anymore but oh well }; } return null; }, expand: function expand(typeData, framingRange, dateEnv) { var clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur }); if (clippedFramingRange) { return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv); } return []; } }; var simpleRecurringEventsPlugin = createPlugin({ recurringTypes: [recurring], eventRefiners: SIMPLE_RECURRING_REFINERS }); function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) { var dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null; var dayMarker = startOfDay(framingRange.start); var endMarker = framingRange.end; var instanceStarts = []; while (dayMarker < endMarker) { var instanceStart // if everyday, or this particular day-of-week = void 0; // if everyday, or this particular day-of-week if (!dowHash || dowHash[dayMarker.getUTCDay()]) { if (startTime) { instanceStart = dateEnv.add(dayMarker, startTime); } else { instanceStart = dayMarker; } instanceStarts.push(instanceStart); } dayMarker = addDays(dayMarker, 1); } return instanceStarts; } var changeHandlerPlugin = createPlugin({ optionChangeHandlers: { events: function events(_events, context) { handleEventSources([_events], context); }, eventSources: handleEventSources } }); /* BUG: if `event` was supplied, all previously-given `eventSources` will be wiped out */ function handleEventSources(inputs, context) { var unfoundSources = hashValuesToArray(context.getCurrentData().eventSources); var newInputs = []; for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) { var input = inputs_1[_i]; var inputFound = false; for (var i = 0; i < unfoundSources.length; i += 1) { if (unfoundSources[i]._raw === input) { unfoundSources.splice(i, 1); // delete inputFound = true; break; } } if (!inputFound) { newInputs.push(input); } } for (var _a = 0, unfoundSources_1 = unfoundSources; _a < unfoundSources_1.length; _a++) { var unfoundSource = unfoundSources_1[_a]; context.dispatch({ type: 'REMOVE_EVENT_SOURCE', sourceId: unfoundSource.sourceId }); } for (var _b = 0, newInputs_1 = newInputs; _b < newInputs_1.length; _b++) { var newInput = newInputs_1[_b]; context.calendarApi.addEventSource(newInput); } } function handleDateProfile(dateProfile, context) { context.emitter.trigger('datesSet', tslib.__assign(tslib.__assign({}, buildRangeApiWithTimeZone(dateProfile.activeRange, context.dateEnv)), { view: context.viewApi })); } function handleEventStore(eventStore, context) { var emitter = context.emitter; if (emitter.hasHandlers('eventsSet')) { emitter.trigger('eventsSet', buildEventApis(eventStore, context)); } } /* this array is exposed on the root namespace so that UMD plugins can add to it. see the rollup-bundles script. */ var globalPlugins = [arrayEventSourcePlugin, funcEventSourcePlugin, jsonFeedEventSourcePlugin, simpleRecurringEventsPlugin, changeHandlerPlugin, createPlugin({ isLoadingFuncs: [function (state) { return computeEventSourcesLoading(state.eventSources); }], contentTypeHandlers: { html: buildHtmlRenderer, domNodes: buildDomNodeRenderer }, propSetHandlers: { dateProfile: handleDateProfile, eventStore: handleEventStore } })]; function buildHtmlRenderer() { var currentEl = null; var currentHtml = ''; function render(el, html) { if (el !== currentEl || html !== currentHtml) { el.innerHTML = html; } currentEl = el; currentHtml = html; } function destroy() { currentEl.innerHTML = ''; currentEl = null; currentHtml = ''; } return { render: render, destroy: destroy }; } function buildDomNodeRenderer() { var currentEl = null; var currentDomNodes = []; function render(el, domNodes) { var newDomNodes = Array.prototype.slice.call(domNodes); if (el !== currentEl || !isArraysEqual(currentDomNodes, newDomNodes)) { // append first, remove second (for scroll resetting) for (var _i = 0, newDomNodes_1 = newDomNodes; _i < newDomNodes_1.length; _i++) { var newNode = newDomNodes_1[_i]; el.appendChild(newNode); } destroy(); } currentEl = el; currentDomNodes = newDomNodes; } function destroy() { currentDomNodes.forEach(removeElement); currentDomNodes = []; currentEl = null; } return { render: render, destroy: destroy }; } var DelayedRunner = /** @class */ function () { function DelayedRunner(drainedOption) { this.drainedOption = drainedOption; this.isRunning = false; this.isDirty = false; this.pauseDepths = {}; this.timeoutId = 0; } DelayedRunner.prototype.request = function (delay) { this.isDirty = true; if (!this.isPaused()) { this.clearTimeout(); if (delay == null) { this.tryDrain(); } else { this.timeoutId = setTimeout( // NOT OPTIMAL! TODO: look at debounce this.tryDrain.bind(this), delay); } } }; DelayedRunner.prototype.pause = function (scope) { if (scope === void 0) { scope = ''; } var pauseDepths = this.pauseDepths; pauseDepths[scope] = (pauseDepths[scope] || 0) + 1; this.clearTimeout(); }; DelayedRunner.prototype.resume = function (scope, force) { if (scope === void 0) { scope = ''; } var pauseDepths = this.pauseDepths; if (scope in pauseDepths) { if (force) { delete pauseDepths[scope]; } else { pauseDepths[scope] -= 1; var depth = pauseDepths[scope]; if (depth <= 0) { delete pauseDepths[scope]; } } this.tryDrain(); } }; DelayedRunner.prototype.isPaused = function () { return Object.keys(this.pauseDepths).length; }; DelayedRunner.prototype.tryDrain = function () { if (!this.isRunning && !this.isPaused()) { this.isRunning = true; while (this.isDirty) { this.isDirty = false; this.drained(); // might set isDirty to true again } this.isRunning = false; } }; DelayedRunner.prototype.clear = function () { this.clearTimeout(); this.isDirty = false; this.pauseDepths = {}; }; DelayedRunner.prototype.clearTimeout = function () { if (this.timeoutId) { clearTimeout(this.timeoutId); this.timeoutId = 0; } }; DelayedRunner.prototype.drained = function () { if (this.drainedOption) { this.drainedOption(); } }; return DelayedRunner; }(); var TaskRunner = /** @class */ function () { function TaskRunner(runTaskOption, drainedOption) { this.runTaskOption = runTaskOption; this.drainedOption = drainedOption; this.queue = []; this.delayedRunner = new DelayedRunner(this.drain.bind(this)); } TaskRunner.prototype.request = function (task, delay) { this.queue.push(task); this.delayedRunner.request(delay); }; TaskRunner.prototype.pause = function (scope) { this.delayedRunner.pause(scope); }; TaskRunner.prototype.resume = function (scope, force) { this.delayedRunner.resume(scope, force); }; TaskRunner.prototype.drain = function () { var queue = this.queue; while (queue.length) { var completedTasks = []; var task = void 0; while (task = queue.shift()) { this.runTask(task); completedTasks.push(task); } this.drained(completedTasks); } // keep going, in case new tasks were added in the drained handler }; TaskRunner.prototype.runTask = function (task) { if (this.runTaskOption) { this.runTaskOption(task); } }; TaskRunner.prototype.drained = function (completedTasks) { if (this.drainedOption) { this.drainedOption(completedTasks); } }; return TaskRunner; }(); // Computes what the title at the top of the calendarApi should be for this view function buildTitle(dateProfile, viewOptions, dateEnv) { var range; // for views that span a large unit of time, show the proper interval, ignoring stray days before and after if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) { range = dateProfile.currentRange; } else { // for day units or smaller, use the actual day range range = dateProfile.activeRange; } return dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || buildTitleFormat(dateProfile)), { isEndExclusive: dateProfile.isRangeAllDay, defaultSeparator: viewOptions.titleRangeSeparator }); } // Generates the format string that should be used to generate the title for the current date range. // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`. function buildTitleFormat(dateProfile) { var currentRangeUnit = dateProfile.currentRangeUnit; if (currentRangeUnit === 'year') { return { year: 'numeric' }; } if (currentRangeUnit === 'month') { return { year: 'numeric', month: 'long' }; // like "September 2014" } var days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end); if (days !== null && days > 1) { // multi-day range. shorter, like "Sep 9 - 10 2014" return { year: 'numeric', month: 'short', day: 'numeric' }; } // one day. longer, like "September 9 2014" return { year: 'numeric', month: 'long', day: 'numeric' }; } // in future refactor, do the redux-style function(state=initial) for initial-state // also, whatever is happening in constructor, have it happen in action queue too var CalendarDataManager = /** @class */ function () { function CalendarDataManager(props) { var _this = this; this.computeOptionsData = memoize(this._computeOptionsData); this.computeCurrentViewData = memoize(this._computeCurrentViewData); this.organizeRawLocales = memoize(organizeRawLocales); this.buildLocale = memoize(buildLocale); this.buildPluginHooks = buildBuildPluginHooks(); this.buildDateEnv = memoize(buildDateEnv); this.buildTheme = memoize(buildTheme); this.parseToolbars = memoize(parseToolbars); this.buildViewSpecs = memoize(buildViewSpecs); this.buildDateProfileGenerator = memoizeObjArg(buildDateProfileGenerator); this.buildViewApi = memoize(buildViewApi); this.buildViewUiProps = memoizeObjArg(buildViewUiProps); this.buildEventUiBySource = memoize(buildEventUiBySource, isPropsEqual); this.buildEventUiBases = memoize(buildEventUiBases); this.parseContextBusinessHours = memoizeObjArg(parseContextBusinessHours); this.buildTitle = memoize(buildTitle); this.emitter = new Emitter(); this.actionRunner = new TaskRunner(this._handleAction.bind(this), this.updateData.bind(this)); this.currentCalendarOptionsInput = {}; this.currentCalendarOptionsRefined = {}; this.currentViewOptionsInput = {}; this.currentViewOptionsRefined = {}; this.currentCalendarOptionsRefiners = {}; this.getCurrentData = function () { return _this.data; }; this.dispatch = function (action) { _this.actionRunner.request(action); // protects against recursive calls to _handleAction }; this.props = props; this.actionRunner.pause(); var dynamicOptionOverrides = {}; var optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi); var currentViewType = optionsData.calendarOptions.initialView || optionsData.pluginHooks.initialView; var currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides); // wire things up // TODO: not DRY props.calendarApi.currentDataManager = this; this.emitter.setThisContext(props.calendarApi); this.emitter.setOptions(currentViewData.options); var currentDate = getInitialDate(optionsData.calendarOptions, optionsData.dateEnv); var dateProfile = currentViewData.dateProfileGenerator.build(currentDate); if (!rangeContainsMarker(dateProfile.activeRange, currentDate)) { currentDate = dateProfile.currentRange.start; } var calendarContext = { dateEnv: optionsData.dateEnv, options: optionsData.calendarOptions, pluginHooks: optionsData.pluginHooks, calendarApi: props.calendarApi, dispatch: this.dispatch, emitter: this.emitter, getCurrentData: this.getCurrentData }; // needs to be after setThisContext for (var _i = 0, _a = optionsData.pluginHooks.contextInit; _i < _a.length; _i++) { var callback = _a[_i]; callback(calendarContext); } // NOT DRY var eventSources = initEventSources(optionsData.calendarOptions, dateProfile, calendarContext); var initialState = { dynamicOptionOverrides: dynamicOptionOverrides, currentViewType: currentViewType, currentDate: currentDate, dateProfile: dateProfile, businessHours: this.parseContextBusinessHours(calendarContext), eventSources: eventSources, eventUiBases: {}, eventStore: createEmptyEventStore(), renderableEventStore: createEmptyEventStore(), dateSelection: null, eventSelection: '', eventDrag: null, eventResize: null, selectionConfig: this.buildViewUiProps(calendarContext).selectionConfig }; var contextAndState = tslib.__assign(tslib.__assign({}, calendarContext), initialState); for (var _b = 0, _c = optionsData.pluginHooks.reducers; _b < _c.length; _b++) { var reducer = _c[_b]; tslib.__assign(initialState, reducer(null, null, contextAndState)); } if (computeIsLoading(initialState, calendarContext)) { this.emitter.trigger('loading', true); // NOT DRY } this.state = initialState; this.updateData(); this.actionRunner.resume(); } CalendarDataManager.prototype.resetOptions = function (optionOverrides, append) { var props = this.props; props.optionOverrides = append ? tslib.__assign(tslib.__assign({}, props.optionOverrides), optionOverrides) : optionOverrides; this.actionRunner.request({ type: 'NOTHING' }); }; CalendarDataManager.prototype._handleAction = function (action) { var _a = this, props = _a.props, state = _a.state, emitter = _a.emitter; var dynamicOptionOverrides = reduceDynamicOptionOverrides(state.dynamicOptionOverrides, action); var optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi); var currentViewType = reduceViewType(state.currentViewType, action); var currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides); // wire things up // TODO: not DRY props.calendarApi.currentDataManager = this; emitter.setThisContext(props.calendarApi); emitter.setOptions(currentViewData.options); var calendarContext = { dateEnv: optionsData.dateEnv, options: optionsData.calendarOptions, pluginHooks: optionsData.pluginHooks, calendarApi: props.calendarApi, dispatch: this.dispatch, emitter: emitter, getCurrentData: this.getCurrentData }; var currentDate = state.currentDate, dateProfile = state.dateProfile; if (this.data && this.data.dateProfileGenerator !== currentViewData.dateProfileGenerator) { // hack dateProfile = currentViewData.dateProfileGenerator.build(currentDate); } currentDate = reduceCurrentDate(currentDate, action); dateProfile = reduceDateProfile(dateProfile, action, currentDate, currentViewData.dateProfileGenerator); if (action.type === 'PREV' || // TODO: move this logic into DateProfileGenerator action.type === 'NEXT' || // " !rangeContainsMarker(dateProfile.currentRange, currentDate)) { currentDate = dateProfile.currentRange.start; } var eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendarContext); var eventStore = reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendarContext); var isEventsLoading = computeEventSourcesLoading(eventSources); // BAD. also called in this func in computeIsLoading var renderableEventStore = isEventsLoading && !currentViewData.options.progressiveEventRendering ? state.renderableEventStore || eventStore : // try from previous state eventStore; var _b = this.buildViewUiProps(calendarContext), eventUiSingleBase = _b.eventUiSingleBase, selectionConfig = _b.selectionConfig; // will memoize obj var eventUiBySource = this.buildEventUiBySource(eventSources); var eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource); var newState = { dynamicOptionOverrides: dynamicOptionOverrides, currentViewType: currentViewType, currentDate: currentDate, dateProfile: dateProfile, eventSources: eventSources, eventStore: eventStore, renderableEventStore: renderableEventStore, selectionConfig: selectionConfig, eventUiBases: eventUiBases, businessHours: this.parseContextBusinessHours(calendarContext), dateSelection: reduceDateSelection(state.dateSelection, action), eventSelection: reduceSelectedEvent(state.eventSelection, action), eventDrag: reduceEventDrag(state.eventDrag, action), eventResize: reduceEventResize(state.eventResize, action) }; var contextAndState = tslib.__assign(tslib.__assign({}, calendarContext), newState); for (var _i = 0, _c = optionsData.pluginHooks.reducers; _i < _c.length; _i++) { var reducer = _c[_i]; tslib.__assign(newState, reducer(state, action, contextAndState)); // give the OLD state, for old value } var wasLoading = computeIsLoading(state, calendarContext); var isLoading = computeIsLoading(newState, calendarContext); // TODO: use propSetHandlers in plugin system if (!wasLoading && isLoading) { emitter.trigger('loading', true); } else if (wasLoading && !isLoading) { emitter.trigger('loading', false); } this.state = newState; if (props.onAction) { props.onAction(action); } }; CalendarDataManager.prototype.updateData = function () { var _a = this, props = _a.props, state = _a.state; var oldData = this.data; var optionsData = this.computeOptionsData(props.optionOverrides, state.dynamicOptionOverrides, props.calendarApi); var currentViewData = this.computeCurrentViewData(state.currentViewType, optionsData, props.optionOverrides, state.dynamicOptionOverrides); var data = this.data = tslib.__assign(tslib.__assign(tslib.__assign({ viewTitle: this.buildTitle(state.dateProfile, currentViewData.options, optionsData.dateEnv), calendarApi: props.calendarApi, dispatch: this.dispatch, emitter: this.emitter, getCurrentData: this.getCurrentData }, optionsData), currentViewData), state); var changeHandlers = optionsData.pluginHooks.optionChangeHandlers; var oldCalendarOptions = oldData && oldData.calendarOptions; var newCalendarOptions = optionsData.calendarOptions; if (oldCalendarOptions && oldCalendarOptions !== newCalendarOptions) { if (oldCalendarOptions.timeZone !== newCalendarOptions.timeZone) { // hack state.eventSources = data.eventSources = reduceEventSourcesNewTimeZone(data.eventSources, state.dateProfile, data); state.eventStore = data.eventStore = rezoneEventStoreDates(data.eventStore, oldData.dateEnv, data.dateEnv); } for (var optionName in changeHandlers) { if (oldCalendarOptions[optionName] !== newCalendarOptions[optionName]) { changeHandlers[optionName](newCalendarOptions[optionName], data); } } } if (props.onData) { props.onData(data); } }; CalendarDataManager.prototype._computeOptionsData = function (optionOverrides, dynamicOptionOverrides, calendarApi) { // TODO: blacklist options that are handled by optionChangeHandlers var _a = this.processRawCalendarOptions(optionOverrides, dynamicOptionOverrides), refinedOptions = _a.refinedOptions, pluginHooks = _a.pluginHooks, localeDefaults = _a.localeDefaults, availableLocaleData = _a.availableLocaleData, extra = _a.extra; warnUnknownOptions(extra); var dateEnv = this.buildDateEnv(refinedOptions.timeZone, refinedOptions.locale, refinedOptions.weekNumberCalculation, refinedOptions.firstDay, refinedOptions.weekText, pluginHooks, availableLocaleData, refinedOptions.defaultRangeSeparator); var viewSpecs = this.buildViewSpecs(pluginHooks.views, optionOverrides, dynamicOptionOverrides, localeDefaults); var theme = this.buildTheme(refinedOptions, pluginHooks); var toolbarConfig = this.parseToolbars(refinedOptions, optionOverrides, theme, viewSpecs, calendarApi); return { calendarOptions: refinedOptions, pluginHooks: pluginHooks, dateEnv: dateEnv, viewSpecs: viewSpecs, theme: theme, toolbarConfig: toolbarConfig, localeDefaults: localeDefaults, availableRawLocales: availableLocaleData.map }; }; // always called from behind a memoizer CalendarDataManager.prototype.processRawCalendarOptions = function (optionOverrides, dynamicOptionOverrides) { var _a = mergeRawOptions([BASE_OPTION_DEFAULTS, optionOverrides, dynamicOptionOverrides]), locales = _a.locales, locale = _a.locale; var availableLocaleData = this.organizeRawLocales(locales); var availableRawLocales = availableLocaleData.map; var localeDefaults = this.buildLocale(locale || availableLocaleData.defaultCode, availableRawLocales).options; var pluginHooks = this.buildPluginHooks(optionOverrides.plugins || [], globalPlugins); var refiners = this.currentCalendarOptionsRefiners = tslib.__assign(tslib.__assign(tslib.__assign(tslib.__assign(tslib.__assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners); var extra = {}; var raw = mergeRawOptions([BASE_OPTION_DEFAULTS, localeDefaults, optionOverrides, dynamicOptionOverrides]); var refined = {}; var currentRaw = this.currentCalendarOptionsInput; var currentRefined = this.currentCalendarOptionsRefined; var anyChanges = false; for (var optionName in raw) { if (optionName !== 'plugins') { // because plugins is special-cased if (raw[optionName] === currentRaw[optionName] || COMPLEX_OPTION_COMPARATORS[optionName] && optionName in currentRaw && COMPLEX_OPTION_COMPARATORS[optionName](currentRaw[optionName], raw[optionName])) { refined[optionName] = currentRefined[optionName]; } else if (refiners[optionName]) { refined[optionName] = refiners[optionName](raw[optionName]); anyChanges = true; } else { extra[optionName] = currentRaw[optionName]; } } } if (anyChanges) { this.currentCalendarOptionsInput = raw; this.currentCalendarOptionsRefined = refined; } return { rawOptions: this.currentCalendarOptionsInput, refinedOptions: this.currentCalendarOptionsRefined, pluginHooks: pluginHooks, availableLocaleData: availableLocaleData, localeDefaults: localeDefaults, extra: extra }; }; CalendarDataManager.prototype._computeCurrentViewData = function (viewType, optionsData, optionOverrides, dynamicOptionOverrides) { var viewSpec = optionsData.viewSpecs[viewType]; if (!viewSpec) { throw new Error("viewType \"" + viewType + "\" is not available. Please make sure you've loaded all neccessary plugins"); } var _a = this.processRawViewOptions(viewSpec, optionsData.pluginHooks, optionsData.localeDefaults, optionOverrides, dynamicOptionOverrides), refinedOptions = _a.refinedOptions, extra = _a.extra; warnUnknownOptions(extra); var dateProfileGenerator = this.buildDateProfileGenerator({ dateProfileGeneratorClass: viewSpec.optionDefaults.dateProfileGeneratorClass, duration: viewSpec.duration, durationUnit: viewSpec.durationUnit, usesMinMaxTime: viewSpec.optionDefaults.usesMinMaxTime, dateEnv: optionsData.dateEnv, calendarApi: this.props.calendarApi, slotMinTime: refinedOptions.slotMinTime, slotMaxTime: refinedOptions.slotMaxTime, showNonCurrentDates: refinedOptions.showNonCurrentDates, dayCount: refinedOptions.dayCount, dateAlignment: refinedOptions.dateAlignment, dateIncrement: refinedOptions.dateIncrement, hiddenDays: refinedOptions.hiddenDays, weekends: refinedOptions.weekends, nowInput: refinedOptions.now, validRangeInput: refinedOptions.validRange, visibleRangeInput: refinedOptions.visibleRange, monthMode: refinedOptions.monthMode, fixedWeekCount: refinedOptions.fixedWeekCount }); var viewApi = this.buildViewApi(viewType, this.getCurrentData, optionsData.dateEnv); return { viewSpec: viewSpec, options: refinedOptions, dateProfileGenerator: dateProfileGenerator, viewApi: viewApi }; }; CalendarDataManager.prototype.processRawViewOptions = function (viewSpec, pluginHooks, localeDefaults, optionOverrides, dynamicOptionOverrides) { var raw = mergeRawOptions([BASE_OPTION_DEFAULTS, viewSpec.optionDefaults, localeDefaults, optionOverrides, viewSpec.optionOverrides, dynamicOptionOverrides]); var refiners = tslib.__assign(tslib.__assign(tslib.__assign(tslib.__assign(tslib.__assign(tslib.__assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), VIEW_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners); var refined = {}; var currentRaw = this.currentViewOptionsInput; var currentRefined = this.currentViewOptionsRefined; var anyChanges = false; var extra = {}; for (var optionName in raw) { if (raw[optionName] === currentRaw[optionName] || COMPLEX_OPTION_COMPARATORS[optionName] && COMPLEX_OPTION_COMPARATORS[optionName](raw[optionName], currentRaw[optionName])) { refined[optionName] = currentRefined[optionName]; } else { if (raw[optionName] === this.currentCalendarOptionsInput[optionName] || COMPLEX_OPTION_COMPARATORS[optionName] && COMPLEX_OPTION_COMPARATORS[optionName](raw[optionName], this.currentCalendarOptionsInput[optionName])) { if (optionName in this.currentCalendarOptionsRefined) { // might be an "extra" prop refined[optionName] = this.currentCalendarOptionsRefined[optionName]; } } else if (refiners[optionName]) { refined[optionName] = refiners[optionName](raw[optionName]); } else { extra[optionName] = raw[optionName]; } anyChanges = true; } } if (anyChanges) { this.currentViewOptionsInput = raw; this.currentViewOptionsRefined = refined; } return { rawOptions: this.currentViewOptionsInput, refinedOptions: this.currentViewOptionsRefined, extra: extra }; }; return CalendarDataManager; }(); function buildDateEnv(timeZone, explicitLocale, weekNumberCalculation, firstDay, weekText, pluginHooks, availableLocaleData, defaultSeparator) { var locale = buildLocale(explicitLocale || availableLocaleData.defaultCode, availableLocaleData.map); return new DateEnv({ calendarSystem: 'gregory', timeZone: timeZone, namedTimeZoneImpl: pluginHooks.namedTimeZonedImpl, locale: locale, weekNumberCalculation: weekNumberCalculation, firstDay: firstDay, weekText: weekText, cmdFormatter: pluginHooks.cmdFormatter, defaultSeparator: defaultSeparator }); } function buildTheme(options, pluginHooks) { var ThemeClass = pluginHooks.themeClasses[options.themeSystem] || StandardTheme; return new ThemeClass(options); } function buildDateProfileGenerator(props) { var DateProfileGeneratorClass = props.dateProfileGeneratorClass || DateProfileGenerator; return new DateProfileGeneratorClass(props); } function buildViewApi(type, getCurrentData, dateEnv) { return new ViewApi(type, getCurrentData, dateEnv); } function buildEventUiBySource(eventSources) { return mapHash(eventSources, function (eventSource) { return eventSource.ui; }); } function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) { var eventUiBases = { '': eventUiSingleBase }; for (var defId in eventDefs) { var def = eventDefs[defId]; if (def.sourceId && eventUiBySource[def.sourceId]) { eventUiBases[defId] = eventUiBySource[def.sourceId]; } } return eventUiBases; } function buildViewUiProps(calendarContext) { var options = calendarContext.options; return { eventUiSingleBase: createEventUi({ display: options.eventDisplay, editable: options.editable, startEditable: options.eventStartEditable, durationEditable: options.eventDurationEditable, constraint: options.eventConstraint, overlap: typeof options.eventOverlap === 'boolean' ? options.eventOverlap : undefined, allow: options.eventAllow, backgroundColor: options.eventBackgroundColor, borderColor: options.eventBorderColor, textColor: options.eventTextColor, color: options.eventColor // classNames: options.eventClassNames // render hook will handle this }, calendarContext), selectionConfig: createEventUi({ constraint: options.selectConstraint, overlap: typeof options.selectOverlap === 'boolean' ? options.selectOverlap : undefined, allow: options.selectAllow }, calendarContext) }; } function computeIsLoading(state, context) { for (var _i = 0, _a = context.pluginHooks.isLoadingFuncs; _i < _a.length; _i++) { var isLoadingFunc = _a[_i]; if (isLoadingFunc(state)) { return true; } } return false; } function parseContextBusinessHours(calendarContext) { return parseBusinessHours(calendarContext.options.businessHours, calendarContext); } function warnUnknownOptions(options, viewName) { for (var optionName in options) { console.warn("Unknown option '" + optionName + "'" + (viewName ? " for view '" + viewName + "'" : '')); } } // TODO: move this to react plugin? var CalendarDataProvider = /** @class */ function (_super) { tslib.__extends(CalendarDataProvider, _super); function CalendarDataProvider(props) { var _this = _super.call(this, props) || this; _this.handleData = function (data) { if (!_this.dataManager) { // still within initial run, before assignment in constructor // eslint-disable-next-line react/no-direct-mutation-state _this.state = data; // can't use setState yet } else { _this.setState(data); } }; _this.dataManager = new CalendarDataManager({ optionOverrides: props.optionOverrides, calendarApi: props.calendarApi, onData: _this.handleData }); return _this; } CalendarDataProvider.prototype.render = function () { return this.props.children(this.state); }; CalendarDataProvider.prototype.componentDidUpdate = function (prevProps) { var newOptionOverrides = this.props.optionOverrides; if (newOptionOverrides !== prevProps.optionOverrides) { // prevent recursive handleData this.dataManager.resetOptions(newOptionOverrides); } }; return CalendarDataProvider; }(vdom_cjs.Component); // HELPERS /* if nextDayThreshold is specified, slicing is done in an all-day fashion. you can get nextDayThreshold from context.nextDayThreshold */ function sliceEvents(props, allDay) { return sliceEventStore(props.eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? props.nextDayThreshold : null).fg; } var NamedTimeZoneImpl = /** @class */ function () { function NamedTimeZoneImpl(timeZoneName) { this.timeZoneName = timeZoneName; } return NamedTimeZoneImpl; }(); var SegHierarchy = /** @class */ function () { function SegHierarchy() { // settings this.strictOrder = false; this.allowReslicing = false; this.maxCoord = -1; // -1 means no max this.maxStackCnt = -1; // -1 means no max this.levelCoords = []; // ordered this.entriesByLevel = []; // parallel with levelCoords this.stackCnts = {}; // TODO: use better technique!? } SegHierarchy.prototype.addSegs = function (inputs) { var hiddenEntries = []; for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) { var input = inputs_1[_i]; this.insertEntry(input, hiddenEntries); } return hiddenEntries; }; SegHierarchy.prototype.insertEntry = function (entry, hiddenEntries) { var insertion = this.findInsertion(entry); if (this.isInsertionValid(insertion, entry)) { this.insertEntryAt(entry, insertion); return 1; } return this.handleInvalidInsertion(insertion, entry, hiddenEntries); }; SegHierarchy.prototype.isInsertionValid = function (insertion, entry) { return (this.maxCoord === -1 || insertion.levelCoord + entry.thickness <= this.maxCoord) && (this.maxStackCnt === -1 || insertion.stackCnt < this.maxStackCnt); }; // returns number of new entries inserted SegHierarchy.prototype.handleInvalidInsertion = function (insertion, entry, hiddenEntries) { if (this.allowReslicing && insertion.touchingEntry) { return this.splitEntry(entry, insertion.touchingEntry, hiddenEntries); } hiddenEntries.push(entry); return 0; }; SegHierarchy.prototype.splitEntry = function (entry, barrier, hiddenEntries) { var partCnt = 0; var splitHiddenEntries = []; var entrySpan = entry.span; var barrierSpan = barrier.span; if (entrySpan.start < barrierSpan.start) { partCnt += this.insertEntry({ index: entry.index, thickness: entry.thickness, span: { start: entrySpan.start, end: barrierSpan.start } }, splitHiddenEntries); } if (entrySpan.end > barrierSpan.end) { partCnt += this.insertEntry({ index: entry.index, thickness: entry.thickness, span: { start: barrierSpan.end, end: entrySpan.end } }, splitHiddenEntries); } if (partCnt) { hiddenEntries.push.apply(hiddenEntries, tslib.__spreadArray([{ index: entry.index, thickness: entry.thickness, span: intersectSpans(barrierSpan, entrySpan) // guaranteed to intersect }], splitHiddenEntries)); return partCnt; } hiddenEntries.push(entry); return 0; }; SegHierarchy.prototype.insertEntryAt = function (entry, insertion) { var _a = this, entriesByLevel = _a.entriesByLevel, levelCoords = _a.levelCoords; if (insertion.lateral === -1) { // create a new level insertAt(levelCoords, insertion.level, insertion.levelCoord); insertAt(entriesByLevel, insertion.level, [entry]); } else { // insert into existing level insertAt(entriesByLevel[insertion.level], insertion.lateral, entry); } this.stackCnts[buildEntryKey(entry)] = insertion.stackCnt; }; SegHierarchy.prototype.findInsertion = function (newEntry) { var _a = this, levelCoords = _a.levelCoords, entriesByLevel = _a.entriesByLevel, strictOrder = _a.strictOrder, stackCnts = _a.stackCnts; var levelCnt = levelCoords.length; var candidateCoord = 0; var touchingLevel = -1; var touchingLateral = -1; var touchingEntry = null; var stackCnt = 0; for (var trackingLevel = 0; trackingLevel < levelCnt; trackingLevel += 1) { var trackingCoord = levelCoords[trackingLevel]; // if the current level is past the placed entry, we have found a good empty space and can stop. // if strictOrder, keep finding more lateral intersections. if (!strictOrder && trackingCoord >= candidateCoord + newEntry.thickness) { break; } var trackingEntries = entriesByLevel[trackingLevel]; var trackingEntry = void 0; var searchRes = binarySearch(trackingEntries, newEntry.span.start, getEntrySpanEnd); // find first entry after newEntry's end var lateralIndex = searchRes[0] + searchRes[1]; // if exact match (which doesn't collide), go to next one while ( // loop through entries that horizontally intersect (trackingEntry = trackingEntries[lateralIndex]) && // but not past the whole entry list trackingEntry.span.start < newEntry.span.end // and not entirely past newEntry ) { var trackingEntryBottom = trackingCoord + trackingEntry.thickness; // intersects into the top of the candidate? if (trackingEntryBottom > candidateCoord) { candidateCoord = trackingEntryBottom; touchingEntry = trackingEntry; touchingLevel = trackingLevel; touchingLateral = lateralIndex; } // butts up against top of candidate? (will happen if just intersected as well) if (trackingEntryBottom === candidateCoord) { // accumulate the highest possible stackCnt of the trackingEntries that butt up stackCnt = Math.max(stackCnt, stackCnts[buildEntryKey(trackingEntry)] + 1); } lateralIndex += 1; } } // the destination level will be after touchingEntry's level. find it var destLevel = 0; if (touchingEntry) { destLevel = touchingLevel + 1; while (destLevel < levelCnt && levelCoords[destLevel] < candidateCoord) { destLevel += 1; } } // if adding to an existing level, find where to insert var destLateral = -1; if (destLevel < levelCnt && levelCoords[destLevel] === candidateCoord) { destLateral = binarySearch(entriesByLevel[destLevel], newEntry.span.end, getEntrySpanEnd)[0]; } return { touchingLevel: touchingLevel, touchingLateral: touchingLateral, touchingEntry: touchingEntry, stackCnt: stackCnt, levelCoord: candidateCoord, level: destLevel, lateral: destLateral }; }; // sorted by levelCoord (lowest to highest) SegHierarchy.prototype.toRects = function () { var _a = this, entriesByLevel = _a.entriesByLevel, levelCoords = _a.levelCoords; var levelCnt = entriesByLevel.length; var rects = []; for (var level = 0; level < levelCnt; level += 1) { var entries = entriesByLevel[level]; var levelCoord = levelCoords[level]; for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) { var entry = entries_1[_i]; rects.push(tslib.__assign(tslib.__assign({}, entry), { levelCoord: levelCoord })); } } return rects; }; return SegHierarchy; }(); function getEntrySpanEnd(entry) { return entry.span.end; } function buildEntryKey(entry) { return entry.index + ':' + entry.span.start; } // returns groups with entries sorted by input order function groupIntersectingEntries(entries) { var merges = []; for (var _i = 0, entries_2 = entries; _i < entries_2.length; _i++) { var entry = entries_2[_i]; var filteredMerges = []; var hungryMerge = { span: entry.span, entries: [entry] }; for (var _a = 0, merges_1 = merges; _a < merges_1.length; _a++) { var merge = merges_1[_a]; if (intersectSpans(merge.span, hungryMerge.span)) { hungryMerge = { entries: merge.entries.concat(hungryMerge.entries), span: joinSpans(merge.span, hungryMerge.span) }; } else { filteredMerges.push(merge); } } filteredMerges.push(hungryMerge); merges = filteredMerges; } return merges; } function joinSpans(span0, span1) { return { start: Math.min(span0.start, span1.start), end: Math.max(span0.end, span1.end) }; } function intersectSpans(span0, span1) { var start = Math.max(span0.start, span1.start); var end = Math.min(span0.end, span1.end); if (start < end) { return { start: start, end: end }; } return null; } // general util // --------------------------------------------------------------------------------------------------------------------- function insertAt(arr, index, item) { arr.splice(index, 0, item); } function binarySearch(a, searchVal, getItemVal) { var startIndex = 0; var endIndex = a.length; // exclusive if (!endIndex || searchVal < getItemVal(a[startIndex])) { // no items OR before first item return [0, 0]; } if (searchVal > getItemVal(a[endIndex - 1])) { // after last item return [endIndex, 0]; } while (startIndex < endIndex) { var middleIndex = Math.floor(startIndex + (endIndex - startIndex) / 2); var middleVal = getItemVal(a[middleIndex]); if (searchVal < middleVal) { endIndex = middleIndex; } else if (searchVal > middleVal) { startIndex = middleIndex + 1; } else { // equal! return [middleIndex, 1]; } } return [startIndex, 0]; } var Interaction = /** @class */ function () { function Interaction(settings) { this.component = settings.component; this.isHitComboAllowed = settings.isHitComboAllowed || null; } Interaction.prototype.destroy = function () {}; return Interaction; }(); function parseInteractionSettings(component, input) { return { component: component, el: input.el, useEventCenter: input.useEventCenter != null ? input.useEventCenter : true, isHitComboAllowed: input.isHitComboAllowed || null }; } function interactionSettingsToStore(settings) { var _a; return _a = {}, _a[settings.component.uid] = settings, _a; } // global state var interactionSettingsStore = {}; /* An abstraction for a dragging interaction originating on an event. Does higher-level things than PointerDragger, such as possibly: - a "mirror" that moves with the pointer - a minimum number of pixels or other criteria for a true drag to begin subclasses must emit: - pointerdown - dragstart - dragmove - pointerup - dragend */ var ElementDragging = /** @class */ function () { function ElementDragging(el, selector) { this.emitter = new Emitter(); } ElementDragging.prototype.destroy = function () {}; ElementDragging.prototype.setMirrorIsVisible = function (bool) {// optional if subclass doesn't want to support a mirror }; ElementDragging.prototype.setMirrorNeedsRevert = function (bool) {// optional if subclass doesn't want to support a mirror }; ElementDragging.prototype.setAutoScrollEnabled = function (bool) {// optional }; return ElementDragging; }(); // TODO: get rid of this in favor of options system, // tho it's really easy to access this globally rather than pass thru options. var config = {}; /* Information about what will happen when an external element is dragged-and-dropped onto a calendar. Contains information for creating an event. */ var DRAG_META_REFINERS = { startTime: createDuration, duration: createDuration, create: Boolean, sourceId: String }; function parseDragMeta(raw) { var _a = refineProps(raw, DRAG_META_REFINERS), refined = _a.refined, extra = _a.extra; return { startTime: refined.startTime || null, duration: refined.duration || null, create: refined.create != null ? refined.create : true, sourceId: refined.sourceId, leftoverProps: extra }; } var ToolbarSection = /** @class */ function (_super) { tslib.__extends(ToolbarSection, _super); function ToolbarSection() { return _super !== null && _super.apply(this, arguments) || this; } ToolbarSection.prototype.render = function () { var _this = this; var children = this.props.widgetGroups.map(function (widgetGroup) { return _this.renderWidgetGroup(widgetGroup); }); return vdom_cjs.createElement.apply(void 0, tslib.__spreadArray(['div', { className: 'fc-toolbar-chunk' }], children)); }; ToolbarSection.prototype.renderWidgetGroup = function (widgetGroup) { var props = this.props; var theme = this.context.theme; var children = []; var isOnlyButtons = true; for (var _i = 0, widgetGroup_1 = widgetGroup; _i < widgetGroup_1.length; _i++) { var widget = widgetGroup_1[_i]; var buttonName = widget.buttonName, buttonClick = widget.buttonClick, buttonText = widget.buttonText, buttonIcon = widget.buttonIcon, buttonHint = widget.buttonHint; if (buttonName === 'title') { isOnlyButtons = false; children.push(vdom_cjs.createElement("h2", { className: "fc-toolbar-title", id: props.titleId }, props.title)); } else { var isPressed = buttonName === props.activeButton; var isDisabled = !props.isTodayEnabled && buttonName === 'today' || !props.isPrevEnabled && buttonName === 'prev' || !props.isNextEnabled && buttonName === 'next'; var buttonClasses = ["fc-" + buttonName + "-button", theme.getClass('button')]; if (isPressed) { buttonClasses.push(theme.getClass('buttonActive')); } children.push(vdom_cjs.createElement("button", { type: "button", title: typeof buttonHint === 'function' ? buttonHint(props.navUnit) : buttonHint, disabled: isDisabled, "aria-pressed": isPressed, className: buttonClasses.join(' '), onClick: buttonClick }, buttonText || (buttonIcon ? vdom_cjs.createElement("span", { className: buttonIcon }) : ''))); } } if (children.length > 1) { var groupClassName = isOnlyButtons && theme.getClass('buttonGroup') || ''; return vdom_cjs.createElement.apply(void 0, tslib.__spreadArray(['div', { className: groupClassName }], children)); } return children[0]; }; return ToolbarSection; }(BaseComponent); var Toolbar = /** @class */ function (_super) { tslib.__extends(Toolbar, _super); function Toolbar() { return _super !== null && _super.apply(this, arguments) || this; } Toolbar.prototype.render = function () { var _a = this.props, model = _a.model, extraClassName = _a.extraClassName; var forceLtr = false; var startContent; var endContent; var sectionWidgets = model.sectionWidgets; var centerContent = sectionWidgets.center; if (sectionWidgets.left) { forceLtr = true; startContent = sectionWidgets.left; } else { startContent = sectionWidgets.start; } if (sectionWidgets.right) { forceLtr = true; endContent = sectionWidgets.right; } else { endContent = sectionWidgets.end; } var classNames = [extraClassName || '', 'fc-toolbar', forceLtr ? 'fc-toolbar-ltr' : '']; return vdom_cjs.createElement("div", { className: classNames.join(' ') }, this.renderSection('start', startContent || []), this.renderSection('center', centerContent || []), this.renderSection('end', endContent || [])); }; Toolbar.prototype.renderSection = function (key, widgetGroups) { var props = this.props; return vdom_cjs.createElement(ToolbarSection, { key: key, widgetGroups: widgetGroups, title: props.title, navUnit: props.navUnit, activeButton: props.activeButton, isTodayEnabled: props.isTodayEnabled, isPrevEnabled: props.isPrevEnabled, isNextEnabled: props.isNextEnabled, titleId: props.titleId }); }; return Toolbar; }(BaseComponent); // TODO: do function component? var ViewContainer = /** @class */ function (_super) { tslib.__extends(ViewContainer, _super); function ViewContainer() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.state = { availableWidth: null }; _this.handleEl = function (el) { _this.el = el; setRef(_this.props.elRef, el); _this.updateAvailableWidth(); }; _this.handleResize = function () { _this.updateAvailableWidth(); }; return _this; } ViewContainer.prototype.render = function () { var _a = this, props = _a.props, state = _a.state; var aspectRatio = props.aspectRatio; var classNames = ['fc-view-harness', aspectRatio || props.liquid || props.height ? 'fc-view-harness-active' // harness controls the height : 'fc-view-harness-passive' // let the view do the height ]; var height = ''; var paddingBottom = ''; if (aspectRatio) { if (state.availableWidth !== null) { height = state.availableWidth / aspectRatio; } else { // while waiting to know availableWidth, we can't set height to *zero* // because will cause lots of unnecessary scrollbars within scrollgrid. // BETTER: don't start rendering ANYTHING yet until we know container width // NOTE: why not always use paddingBottom? Causes height oscillation (issue 5606) paddingBottom = 1 / aspectRatio * 100 + "%"; } } else { height = props.height || ''; } return vdom_cjs.createElement("div", { "aria-labelledby": props.labeledById, ref: this.handleEl, className: classNames.join(' '), style: { height: height, paddingBottom: paddingBottom } }, props.children); }; ViewContainer.prototype.componentDidMount = function () { this.context.addResizeHandler(this.handleResize); }; ViewContainer.prototype.componentWillUnmount = function () { this.context.removeResizeHandler(this.handleResize); }; ViewContainer.prototype.updateAvailableWidth = function () { if (this.el && // needed. but why? this.props.aspectRatio // aspectRatio is the only height setting that needs availableWidth ) { this.setState({ availableWidth: this.el.offsetWidth }); } }; return ViewContainer; }(BaseComponent); /* Detects when the user clicks on an event within a DateComponent */ var EventClicking = /** @class */ function (_super) { tslib.__extends(EventClicking, _super); function EventClicking(settings) { var _this = _super.call(this, settings) || this; _this.handleSegClick = function (ev, segEl) { var component = _this.component; var context = component.context; var seg = getElSeg(segEl); if (seg && // might be the
surrounding the more link component.isValidSegDownEl(ev.target)) { // our way to simulate a link click for elements that can't be tags // grab before trigger fired in case trigger trashes DOM thru rerendering var hasUrlContainer = elementClosest(ev.target, '.fc-event-forced-url'); var url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : ''; context.emitter.trigger('eventClick', { el: segEl, event: new EventApi(component.context, seg.eventRange.def, seg.eventRange.instance), jsEvent: ev, view: context.viewApi }); if (url && !ev.defaultPrevented) { window.location.href = url; } } }; _this.destroy = listenBySelector(settings.el, 'click', '.fc-event', // on both fg and bg events _this.handleSegClick); return _this; } return EventClicking; }(Interaction); /* Triggers events and adds/removes core classNames when the user's pointer enters/leaves event-elements of a component. */ var EventHovering = /** @class */ function (_super) { tslib.__extends(EventHovering, _super); function EventHovering(settings) { var _this = _super.call(this, settings) || this; // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it _this.handleEventElRemove = function (el) { if (el === _this.currentSegEl) { _this.handleSegLeave(null, _this.currentSegEl); } }; _this.handleSegEnter = function (ev, segEl) { if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper _this.currentSegEl = segEl; _this.triggerEvent('eventMouseEnter', ev, segEl); } }; _this.handleSegLeave = function (ev, segEl) { if (_this.currentSegEl) { _this.currentSegEl = null; _this.triggerEvent('eventMouseLeave', ev, segEl); } }; _this.removeHoverListeners = listenToHoverBySelector(settings.el, '.fc-event', // on both fg and bg events _this.handleSegEnter, _this.handleSegLeave); return _this; } EventHovering.prototype.destroy = function () { this.removeHoverListeners(); }; EventHovering.prototype.triggerEvent = function (publicEvName, ev, segEl) { var component = this.component; var context = component.context; var seg = getElSeg(segEl); if (!ev || component.isValidSegDownEl(ev.target)) { context.emitter.trigger(publicEvName, { el: segEl, event: new EventApi(context, seg.eventRange.def, seg.eventRange.instance), jsEvent: ev, view: context.viewApi }); } }; return EventHovering; }(Interaction); var CalendarContent = /** @class */ function (_super) { tslib.__extends(CalendarContent, _super); function CalendarContent() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.buildViewContext = memoize(buildViewContext); _this.buildViewPropTransformers = memoize(buildViewPropTransformers); _this.buildToolbarProps = memoize(buildToolbarProps); _this.headerRef = vdom_cjs.createRef(); _this.footerRef = vdom_cjs.createRef(); _this.interactionsStore = {}; // eslint-disable-next-line _this.state = { viewLabelId: getUniqueDomId() }; // Component Registration // ----------------------------------------------------------------------------------------------------------------- _this.registerInteractiveComponent = function (component, settingsInput) { var settings = parseInteractionSettings(component, settingsInput); var DEFAULT_INTERACTIONS = [EventClicking, EventHovering]; var interactionClasses = DEFAULT_INTERACTIONS.concat(_this.props.pluginHooks.componentInteractions); var interactions = interactionClasses.map(function (TheInteractionClass) { return new TheInteractionClass(settings); }); _this.interactionsStore[component.uid] = interactions; interactionSettingsStore[component.uid] = settings; }; _this.unregisterInteractiveComponent = function (component) { var listeners = _this.interactionsStore[component.uid]; if (listeners) { for (var _i = 0, listeners_1 = listeners; _i < listeners_1.length; _i++) { var listener = listeners_1[_i]; listener.destroy(); } delete _this.interactionsStore[component.uid]; } delete interactionSettingsStore[component.uid]; }; // Resizing // ----------------------------------------------------------------------------------------------------------------- _this.resizeRunner = new DelayedRunner(function () { _this.props.emitter.trigger('_resize', true); // should window resizes be considered "forced" ? _this.props.emitter.trigger('windowResize', { view: _this.props.viewApi }); }); _this.handleWindowResize = function (ev) { var options = _this.props.options; if (options.handleWindowResize && ev.target === window // avoid jqui events ) { _this.resizeRunner.request(options.windowResizeDelay); } }; return _this; } /* renders INSIDE of an outer div */ CalendarContent.prototype.render = function () { var props = this.props; var toolbarConfig = props.toolbarConfig, options = props.options; var toolbarProps = this.buildToolbarProps(props.viewSpec, props.dateProfile, props.dateProfileGenerator, props.currentDate, getNow(props.options.now, props.dateEnv), // TODO: use NowTimer???? props.viewTitle); var viewVGrow = false; var viewHeight = ''; var viewAspectRatio; if (props.isHeightAuto || props.forPrint) { viewHeight = ''; } else if (options.height != null) { viewVGrow = true; } else if (options.contentHeight != null) { viewHeight = options.contentHeight; } else { viewAspectRatio = Math.max(options.aspectRatio, 0.5); // prevent from getting too tall } var viewContext = this.buildViewContext(props.viewSpec, props.viewApi, props.options, props.dateProfileGenerator, props.dateEnv, props.theme, props.pluginHooks, props.dispatch, props.getCurrentData, props.emitter, props.calendarApi, this.registerInteractiveComponent, this.unregisterInteractiveComponent); var viewLabelId = toolbarConfig.header && toolbarConfig.header.hasTitle ? this.state.viewLabelId : ''; return vdom_cjs.createElement(ViewContextType.Provider, { value: viewContext }, toolbarConfig.header && vdom_cjs.createElement(Toolbar, tslib.__assign({ ref: this.headerRef, extraClassName: "fc-header-toolbar", model: toolbarConfig.header, titleId: viewLabelId }, toolbarProps)), vdom_cjs.createElement(ViewContainer, { liquid: viewVGrow, height: viewHeight, aspectRatio: viewAspectRatio, labeledById: viewLabelId }, this.renderView(props), this.buildAppendContent()), toolbarConfig.footer && vdom_cjs.createElement(Toolbar, tslib.__assign({ ref: this.footerRef, extraClassName: "fc-footer-toolbar", model: toolbarConfig.footer, titleId: "" }, toolbarProps))); }; CalendarContent.prototype.componentDidMount = function () { var props = this.props; this.calendarInteractions = props.pluginHooks.calendarInteractions.map(function (CalendarInteractionClass) { return new CalendarInteractionClass(props); }); window.addEventListener('resize', this.handleWindowResize); var propSetHandlers = props.pluginHooks.propSetHandlers; for (var propName in propSetHandlers) { propSetHandlers[propName](props[propName], props); } }; CalendarContent.prototype.componentDidUpdate = function (prevProps) { var props = this.props; var propSetHandlers = props.pluginHooks.propSetHandlers; for (var propName in propSetHandlers) { if (props[propName] !== prevProps[propName]) { propSetHandlers[propName](props[propName], props); } } }; CalendarContent.prototype.componentWillUnmount = function () { window.removeEventListener('resize', this.handleWindowResize); this.resizeRunner.clear(); for (var _i = 0, _a = this.calendarInteractions; _i < _a.length; _i++) { var interaction = _a[_i]; interaction.destroy(); } this.props.emitter.trigger('_unmount'); }; CalendarContent.prototype.buildAppendContent = function () { var props = this.props; var children = props.pluginHooks.viewContainerAppends.map(function (buildAppendContent) { return buildAppendContent(props); }); return vdom_cjs.createElement.apply(void 0, tslib.__spreadArray([vdom_cjs.Fragment, {}], children)); }; CalendarContent.prototype.renderView = function (props) { var pluginHooks = props.pluginHooks; var viewSpec = props.viewSpec; var viewProps = { dateProfile: props.dateProfile, businessHours: props.businessHours, eventStore: props.renderableEventStore, eventUiBases: props.eventUiBases, dateSelection: props.dateSelection, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, isHeightAuto: props.isHeightAuto, forPrint: props.forPrint }; var transformers = this.buildViewPropTransformers(pluginHooks.viewPropsTransformers); for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) { var transformer = transformers_1[_i]; tslib.__assign(viewProps, transformer.transform(viewProps, props)); } var ViewComponent = viewSpec.component; return vdom_cjs.createElement(ViewComponent, tslib.__assign({}, viewProps)); }; return CalendarContent; }(PureComponent); function buildToolbarProps(viewSpec, dateProfile, dateProfileGenerator, currentDate, now, title) { // don't force any date-profiles to valid date profiles (the `false`) so that we can tell if it's invalid var todayInfo = dateProfileGenerator.build(now, undefined, false); // TODO: need `undefined` or else INFINITE LOOP for some reason var prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate, false); var nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate, false); return { title: title, activeButton: viewSpec.type, navUnit: viewSpec.singleUnit, isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now), isPrevEnabled: prevInfo.isValid, isNextEnabled: nextInfo.isValid }; } // Plugin // ----------------------------------------------------------------------------------------------------------------- function buildViewPropTransformers(theClasses) { return theClasses.map(function (TheClass) { return new TheClass(); }); } var CalendarRoot = /** @class */ function (_super) { tslib.__extends(CalendarRoot, _super); function CalendarRoot() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.state = { forPrint: false }; _this.handleBeforePrint = function () { _this.setState({ forPrint: true }); }; _this.handleAfterPrint = function () { _this.setState({ forPrint: false }); }; return _this; } CalendarRoot.prototype.render = function () { var props = this.props; var options = props.options; var forPrint = this.state.forPrint; var isHeightAuto = forPrint || options.height === 'auto' || options.contentHeight === 'auto'; var height = !isHeightAuto && options.height != null ? options.height : ''; var classNames = ['fc', forPrint ? 'fc-media-print' : 'fc-media-screen', "fc-direction-" + options.direction, props.theme.getClass('root')]; if (!getCanVGrowWithinCell()) { classNames.push('fc-liquid-hack'); } return props.children(classNames, height, isHeightAuto, forPrint); }; CalendarRoot.prototype.componentDidMount = function () { var emitter = this.props.emitter; emitter.on('_beforeprint', this.handleBeforePrint); emitter.on('_afterprint', this.handleAfterPrint); }; CalendarRoot.prototype.componentWillUnmount = function () { var emitter = this.props.emitter; emitter.off('_beforeprint', this.handleBeforePrint); emitter.off('_afterprint', this.handleAfterPrint); }; return CalendarRoot; }(BaseComponent); // Computes a default column header formatting string if `colFormat` is not explicitly defined function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) { // if more than one week row, or if there are a lot of columns with not much space, // put just the day numbers will be in each cell if (!datesRepDistinctDays || dayCnt > 10) { return createFormatter({ weekday: 'short' }); // "Sat" } if (dayCnt > 1) { return createFormatter({ weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }); // "Sat 11/12" } return createFormatter({ weekday: 'long' }); // "Saturday" } var CLASS_NAME = 'fc-col-header-cell'; // do the cushion too? no function renderInner$1(hookProps) { return hookProps.text; } var TableDateCell = /** @class */ function (_super) { tslib.__extends(TableDateCell, _super); function TableDateCell() { return _super !== null && _super.apply(this, arguments) || this; } TableDateCell.prototype.render = function () { var _a = this.context, dateEnv = _a.dateEnv, options = _a.options, theme = _a.theme, viewApi = _a.viewApi; var props = this.props; var date = props.date, dateProfile = props.dateProfile; var dayMeta = getDateMeta(date, props.todayRange, null, dateProfile); var classNames = [CLASS_NAME].concat(getDayClassNames(dayMeta, theme)); var text = dateEnv.format(date, props.dayHeaderFormat); // if colCnt is 1, we are already in a day-view and don't need a navlink var navLinkAttrs = !dayMeta.isDisabled && props.colCnt > 1 ? buildNavLinkAttrs(this.context, date) : {}; var hookProps = tslib.__assign(tslib.__assign(tslib.__assign({ date: dateEnv.toDate(date), view: viewApi }, props.extraHookProps), { text: text }), dayMeta); return vdom_cjs.createElement(RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInner$1, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return vdom_cjs.createElement("th", tslib.__assign({ ref: rootElRef, role: "columnheader", className: classNames.concat(customClassNames).join(' '), "data-date": !dayMeta.isDisabled ? formatDayString(date) : undefined, colSpan: props.colSpan }, props.extraDataAttrs), vdom_cjs.createElement("div", { className: "fc-scrollgrid-sync-inner" }, !dayMeta.isDisabled && vdom_cjs.createElement("a", tslib.__assign({ ref: innerElRef, className: ['fc-col-header-cell-cushion', props.isSticky ? 'fc-sticky' : ''].join(' ') }, navLinkAttrs), innerContent))); }); }; return TableDateCell; }(BaseComponent); var WEEKDAY_FORMAT = createFormatter({ weekday: 'long' }); var TableDowCell = /** @class */ function (_super) { tslib.__extends(TableDowCell, _super); function TableDowCell() { return _super !== null && _super.apply(this, arguments) || this; } TableDowCell.prototype.render = function () { var props = this.props; var _a = this.context, dateEnv = _a.dateEnv, theme = _a.theme, viewApi = _a.viewApi, options = _a.options; var date = addDays(new Date(259200000), props.dow); // start with Sun, 04 Jan 1970 00:00:00 GMT var dateMeta = { dow: props.dow, isDisabled: false, isFuture: false, isPast: false, isToday: false, isOther: false }; var classNames = [CLASS_NAME].concat(getDayClassNames(dateMeta, theme), props.extraClassNames || []); var text = dateEnv.format(date, props.dayHeaderFormat); var hookProps = tslib.__assign(tslib.__assign(tslib.__assign(tslib.__assign({ // TODO: make this public? date: date }, dateMeta), { view: viewApi }), props.extraHookProps), { text: text }); return vdom_cjs.createElement(RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInner$1, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return vdom_cjs.createElement("th", tslib.__assign({ ref: rootElRef, role: "columnheader", className: classNames.concat(customClassNames).join(' '), colSpan: props.colSpan }, props.extraDataAttrs), vdom_cjs.createElement("div", { className: "fc-scrollgrid-sync-inner" }, vdom_cjs.createElement("a", { "aria-label": dateEnv.format(date, WEEKDAY_FORMAT), className: ['fc-col-header-cell-cushion', props.isSticky ? 'fc-sticky' : ''].join(' '), ref: innerElRef }, innerContent))); }); }; return TableDowCell; }(BaseComponent); var NowTimer = /** @class */ function (_super) { tslib.__extends(NowTimer, _super); function NowTimer(props, context) { var _this = _super.call(this, props, context) || this; _this.initialNowDate = getNow(context.options.now, context.dateEnv); _this.initialNowQueriedMs = new Date().valueOf(); _this.state = _this.computeTiming().currentState; return _this; } NowTimer.prototype.render = function () { var _a = this, props = _a.props, state = _a.state; return props.children(state.nowDate, state.todayRange); }; NowTimer.prototype.componentDidMount = function () { this.setTimeout(); }; NowTimer.prototype.componentDidUpdate = function (prevProps) { if (prevProps.unit !== this.props.unit) { this.clearTimeout(); this.setTimeout(); } }; NowTimer.prototype.componentWillUnmount = function () { this.clearTimeout(); }; NowTimer.prototype.computeTiming = function () { var _a = this, props = _a.props, context = _a.context; var unroundedNow = addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs); var currentUnitStart = context.dateEnv.startOf(unroundedNow, props.unit); var nextUnitStart = context.dateEnv.add(currentUnitStart, createDuration(1, props.unit)); var waitMs = nextUnitStart.valueOf() - unroundedNow.valueOf(); // there is a max setTimeout ms value (https://stackoverflow.com/a/3468650/96342) // ensure no longer than a day waitMs = Math.min(1000 * 60 * 60 * 24, waitMs); return { currentState: { nowDate: currentUnitStart, todayRange: buildDayRange(currentUnitStart) }, nextState: { nowDate: nextUnitStart, todayRange: buildDayRange(nextUnitStart) }, waitMs: waitMs }; }; NowTimer.prototype.setTimeout = function () { var _this = this; var _a = this.computeTiming(), nextState = _a.nextState, waitMs = _a.waitMs; this.timeoutId = setTimeout(function () { _this.setState(nextState, function () { _this.setTimeout(); }); }, waitMs); }; NowTimer.prototype.clearTimeout = function () { if (this.timeoutId) { clearTimeout(this.timeoutId); } }; NowTimer.contextType = ViewContextType; return NowTimer; }(vdom_cjs.Component); function buildDayRange(date) { var start = startOfDay(date); var end = addDays(start, 1); return { start: start, end: end }; } var DayHeader = /** @class */ function (_super) { tslib.__extends(DayHeader, _super); function DayHeader() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.createDayHeaderFormatter = memoize(createDayHeaderFormatter); return _this; } DayHeader.prototype.render = function () { var context = this.context; var _a = this.props, dates = _a.dates, dateProfile = _a.dateProfile, datesRepDistinctDays = _a.datesRepDistinctDays, renderIntro = _a.renderIntro; var dayHeaderFormat = this.createDayHeaderFormatter(context.options.dayHeaderFormat, datesRepDistinctDays, dates.length); return vdom_cjs.createElement(NowTimer, { unit: "day" }, function (nowDate, todayRange) { return vdom_cjs.createElement("tr", { role: "row" }, renderIntro && renderIntro('day'), dates.map(function (date) { return datesRepDistinctDays ? vdom_cjs.createElement(TableDateCell, { key: date.toISOString(), date: date, dateProfile: dateProfile, todayRange: todayRange, colCnt: dates.length, dayHeaderFormat: dayHeaderFormat }) : vdom_cjs.createElement(TableDowCell, { key: date.getUTCDay(), dow: date.getUTCDay(), dayHeaderFormat: dayHeaderFormat }); })); }); }; return DayHeader; }(BaseComponent); function createDayHeaderFormatter(explicitFormat, datesRepDistinctDays, dateCnt) { return explicitFormat || computeFallbackHeaderFormat(datesRepDistinctDays, dateCnt); } var DaySeriesModel = /** @class */ function () { function DaySeriesModel(range, dateProfileGenerator) { var date = range.start; var end = range.end; var indices = []; var dates = []; var dayIndex = -1; while (date < end) { // loop each day from start to end if (dateProfileGenerator.isHiddenDay(date)) { indices.push(dayIndex + 0.5); // mark that it's between indices } else { dayIndex += 1; indices.push(dayIndex); dates.push(date); } date = addDays(date, 1); } this.dates = dates; this.indices = indices; this.cnt = dates.length; } DaySeriesModel.prototype.sliceRange = function (range) { var firstIndex = this.getDateDayIndex(range.start); // inclusive first index var lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index var clippedFirstIndex = Math.max(0, firstIndex); var clippedLastIndex = Math.min(this.cnt - 1, lastIndex); // deal with in-between indices clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell if (clippedFirstIndex <= clippedLastIndex) { return { firstIndex: clippedFirstIndex, lastIndex: clippedLastIndex, isStart: firstIndex === clippedFirstIndex, isEnd: lastIndex === clippedLastIndex }; } return null; }; // Given a date, returns its chronolocial cell-index from the first cell of the grid. // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets. // If before the first offset, returns a negative number. // If after the last offset, returns an offset past the last cell offset. // Only works for *start* dates of cells. Will not work for exclusive end dates for cells. DaySeriesModel.prototype.getDateDayIndex = function (date) { var indices = this.indices; var dayOffset = Math.floor(diffDays(this.dates[0], date)); if (dayOffset < 0) { return indices[0] - 1; } if (dayOffset >= indices.length) { return indices[indices.length - 1] + 1; } return indices[dayOffset]; }; return DaySeriesModel; }(); var DayTableModel = /** @class */ function () { function DayTableModel(daySeries, breakOnWeeks) { var dates = daySeries.dates; var daysPerRow; var firstDay; var rowCnt; if (breakOnWeeks) { // count columns until the day-of-week repeats firstDay = dates[0].getUTCDay(); for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow += 1) { if (dates[daysPerRow].getUTCDay() === firstDay) { break; } } rowCnt = Math.ceil(dates.length / daysPerRow); } else { rowCnt = 1; daysPerRow = dates.length; } this.rowCnt = rowCnt; this.colCnt = daysPerRow; this.daySeries = daySeries; this.cells = this.buildCells(); this.headerDates = this.buildHeaderDates(); } DayTableModel.prototype.buildCells = function () { var rows = []; for (var row = 0; row < this.rowCnt; row += 1) { var cells = []; for (var col = 0; col < this.colCnt; col += 1) { cells.push(this.buildCell(row, col)); } rows.push(cells); } return rows; }; DayTableModel.prototype.buildCell = function (row, col) { var date = this.daySeries.dates[row * this.colCnt + col]; return { key: date.toISOString(), date: date }; }; DayTableModel.prototype.buildHeaderDates = function () { var dates = []; for (var col = 0; col < this.colCnt; col += 1) { dates.push(this.cells[0][col].date); } return dates; }; DayTableModel.prototype.sliceRange = function (range) { var colCnt = this.colCnt; var seriesSeg = this.daySeries.sliceRange(range); var segs = []; if (seriesSeg) { var firstIndex = seriesSeg.firstIndex, lastIndex = seriesSeg.lastIndex; var index = firstIndex; while (index <= lastIndex) { var row = Math.floor(index / colCnt); var nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1); segs.push({ row: row, firstCol: index % colCnt, lastCol: (nextIndex - 1) % colCnt, isStart: seriesSeg.isStart && index === firstIndex, isEnd: seriesSeg.isEnd && nextIndex - 1 === lastIndex }); index = nextIndex; } } return segs; }; return DayTableModel; }(); var Slicer = /** @class */ function () { function Slicer() { this.sliceBusinessHours = memoize(this._sliceBusinessHours); this.sliceDateSelection = memoize(this._sliceDateSpan); this.sliceEventStore = memoize(this._sliceEventStore); this.sliceEventDrag = memoize(this._sliceInteraction); this.sliceEventResize = memoize(this._sliceInteraction); this.forceDayIfListItem = false; // hack } Slicer.prototype.sliceProps = function (props, dateProfile, nextDayThreshold, context) { var extraArgs = []; for (var _i = 4; _i < arguments.length; _i++) { extraArgs[_i - 4] = arguments[_i]; } var eventUiBases = props.eventUiBases; var eventSegs = this.sliceEventStore.apply(this, tslib.__spreadArray([props.eventStore, eventUiBases, dateProfile, nextDayThreshold], extraArgs)); return { dateSelectionSegs: this.sliceDateSelection.apply(this, tslib.__spreadArray([props.dateSelection, eventUiBases, context], extraArgs)), businessHourSegs: this.sliceBusinessHours.apply(this, tslib.__spreadArray([props.businessHours, dateProfile, nextDayThreshold, context], extraArgs)), fgEventSegs: eventSegs.fg, bgEventSegs: eventSegs.bg, eventDrag: this.sliceEventDrag.apply(this, tslib.__spreadArray([props.eventDrag, eventUiBases, dateProfile, nextDayThreshold], extraArgs)), eventResize: this.sliceEventResize.apply(this, tslib.__spreadArray([props.eventResize, eventUiBases, dateProfile, nextDayThreshold], extraArgs)), eventSelection: props.eventSelection }; // TODO: give interactionSegs? }; Slicer.prototype.sliceNowDate = function ( // does not memoize date, context) { var extraArgs = []; for (var _i = 2; _i < arguments.length; _i++) { extraArgs[_i - 2] = arguments[_i]; } return this._sliceDateSpan.apply(this, tslib.__spreadArray([{ range: { start: date, end: addMs(date, 1) }, allDay: false }, {}, context], extraArgs)); }; Slicer.prototype._sliceBusinessHours = function (businessHours, dateProfile, nextDayThreshold, context) { var extraArgs = []; for (var _i = 4; _i < arguments.length; _i++) { extraArgs[_i - 4] = arguments[_i]; } if (!businessHours) { return []; } return this._sliceEventStore.apply(this, tslib.__spreadArray([expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), context), {}, dateProfile, nextDayThreshold], extraArgs)).bg; }; Slicer.prototype._sliceEventStore = function (eventStore, eventUiBases, dateProfile, nextDayThreshold) { var extraArgs = []; for (var _i = 4; _i < arguments.length; _i++) { extraArgs[_i - 4] = arguments[_i]; } if (eventStore) { var rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold); return { bg: this.sliceEventRanges(rangeRes.bg, extraArgs), fg: this.sliceEventRanges(rangeRes.fg, extraArgs) }; } return { bg: [], fg: [] }; }; Slicer.prototype._sliceInteraction = function (interaction, eventUiBases, dateProfile, nextDayThreshold) { var extraArgs = []; for (var _i = 4; _i < arguments.length; _i++) { extraArgs[_i - 4] = arguments[_i]; } if (!interaction) { return null; } var rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold); return { segs: this.sliceEventRanges(rangeRes.fg, extraArgs), affectedInstances: interaction.affectedEvents.instances, isEvent: interaction.isEvent }; }; Slicer.prototype._sliceDateSpan = function (dateSpan, eventUiBases, context) { var extraArgs = []; for (var _i = 3; _i < arguments.length; _i++) { extraArgs[_i - 3] = arguments[_i]; } if (!dateSpan) { return []; } var eventRange = fabricateEventRange(dateSpan, eventUiBases, context); var segs = this.sliceRange.apply(this, tslib.__spreadArray([dateSpan.range], extraArgs)); for (var _a = 0, segs_1 = segs; _a < segs_1.length; _a++) { var seg = segs_1[_a]; seg.eventRange = eventRange; } return segs; }; /* "complete" seg means it has component and eventRange */ Slicer.prototype.sliceEventRanges = function (eventRanges, extraArgs) { var segs = []; for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) { var eventRange = eventRanges_1[_i]; segs.push.apply(segs, this.sliceEventRange(eventRange, extraArgs)); } return segs; }; /* "complete" seg means it has component and eventRange */ Slicer.prototype.sliceEventRange = function (eventRange, extraArgs) { var dateRange = eventRange.range; // hack to make multi-day events that are being force-displayed as list-items to take up only one day if (this.forceDayIfListItem && eventRange.ui.display === 'list-item') { dateRange = { start: dateRange.start, end: addDays(dateRange.start, 1) }; } var segs = this.sliceRange.apply(this, tslib.__spreadArray([dateRange], extraArgs)); for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) { var seg = segs_2[_i]; seg.eventRange = eventRange; seg.isStart = eventRange.isStart && seg.isStart; seg.isEnd = eventRange.isEnd && seg.isEnd; } return segs; }; return Slicer; }(); /* for incorporating slotMinTime/slotMaxTime if appropriate TODO: should be part of DateProfile! TimelineDateProfile already does this btw */ function computeActiveRange(dateProfile, isComponentAllDay) { var range = dateProfile.activeRange; if (isComponentAllDay) { return range; } return { start: addMs(range.start, dateProfile.slotMinTime.milliseconds), end: addMs(range.end, dateProfile.slotMaxTime.milliseconds - 864e5) // 864e5 = ms in a day }; } // high-level segmenting-aware tester functions // ------------------------------------------------------------------------------------------------------------------------ function isInteractionValid(interaction, dateProfile, context) { var instances = interaction.mutatedEvents.instances; for (var instanceId in instances) { if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) { return false; } } return isNewPropsValid({ eventDrag: interaction }, context); // HACK: the eventDrag props is used for ALL interactions } function isDateSelectionValid(dateSelection, dateProfile, context) { if (!rangeContainsRange(dateProfile.validRange, dateSelection.range)) { return false; } return isNewPropsValid({ dateSelection: dateSelection }, context); } function isNewPropsValid(newProps, context) { var calendarState = context.getCurrentData(); var props = tslib.__assign({ businessHours: calendarState.businessHours, dateSelection: '', eventStore: calendarState.eventStore, eventUiBases: calendarState.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps); return (context.pluginHooks.isPropsValid || isPropsValid)(props, context); } function isPropsValid(state, context, dateSpanMeta, filterConfig) { if (dateSpanMeta === void 0) { dateSpanMeta = {}; } if (state.eventDrag && !isInteractionPropsValid(state, context, dateSpanMeta, filterConfig)) { return false; } if (state.dateSelection && !isDateSelectionPropsValid(state, context, dateSpanMeta, filterConfig)) { return false; } return true; } // Moving Event Validation // ------------------------------------------------------------------------------------------------------------------------ function isInteractionPropsValid(state, context, dateSpanMeta, filterConfig) { var currentState = context.getCurrentData(); var interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions var subjectEventStore = interaction.mutatedEvents; var subjectDefs = subjectEventStore.defs; var subjectInstances = subjectEventStore.instances; var subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ? state.eventUiBases : { '': currentState.selectionConfig }); if (filterConfig) { subjectConfigs = mapHash(subjectConfigs, filterConfig); } // exclude the subject events. TODO: exclude defs too? var otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances); var otherDefs = otherEventStore.defs; var otherInstances = otherEventStore.instances; var otherConfigs = compileEventUis(otherDefs, state.eventUiBases); for (var subjectInstanceId in subjectInstances) { var subjectInstance = subjectInstances[subjectInstanceId]; var subjectRange = subjectInstance.range; var subjectConfig = subjectConfigs[subjectInstance.defId]; var subjectDef = subjectDefs[subjectInstance.defId]; // constraint if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, context)) { return false; } // overlap var eventOverlap = context.options.eventOverlap; var eventOverlapFunc = typeof eventOverlap === 'function' ? eventOverlap : null; for (var otherInstanceId in otherInstances) { var otherInstance = otherInstances[otherInstanceId]; // intersect! evaluate if (rangesIntersect(subjectRange, otherInstance.range)) { var otherOverlap = otherConfigs[otherInstance.defId].overlap; // consider the other event's overlap. only do this if the subject event is a "real" event if (otherOverlap === false && interaction.isEvent) { return false; } if (subjectConfig.overlap === false) { return false; } if (eventOverlapFunc && !eventOverlapFunc(new EventApi(context, otherDefs[otherInstance.defId], otherInstance), // still event new EventApi(context, subjectDef, subjectInstance))) { return false; } } } // allow (a function) var calendarEventStore = currentState.eventStore; // need global-to-calendar, not local to component (splittable)state for (var _i = 0, _a = subjectConfig.allows; _i < _a.length; _i++) { var subjectAllow = _a[_i]; var subjectDateSpan = tslib.__assign(tslib.__assign({}, dateSpanMeta), { range: subjectInstance.range, allDay: subjectDef.allDay }); var origDef = calendarEventStore.defs[subjectDef.defId]; var origInstance = calendarEventStore.instances[subjectInstanceId]; var eventApi = void 0; if (origDef) { // was previously in the calendar eventApi = new EventApi(context, origDef, origInstance); } else { // was an external event eventApi = new EventApi(context, subjectDef); // no instance, because had no dates } if (!subjectAllow(buildDateSpanApiWithContext(subjectDateSpan, context), eventApi)) { return false; } } } return true; } // Date Selection Validation // ------------------------------------------------------------------------------------------------------------------------ function isDateSelectionPropsValid(state, context, dateSpanMeta, filterConfig) { var relevantEventStore = state.eventStore; var relevantDefs = relevantEventStore.defs; var relevantInstances = relevantEventStore.instances; var selection = state.dateSelection; var selectionRange = selection.range; var selectionConfig = context.getCurrentData().selectionConfig; if (filterConfig) { selectionConfig = filterConfig(selectionConfig); } // constraint if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, context)) { return false; } // overlap var selectOverlap = context.options.selectOverlap; var selectOverlapFunc = typeof selectOverlap === 'function' ? selectOverlap : null; for (var relevantInstanceId in relevantInstances) { var relevantInstance = relevantInstances[relevantInstanceId]; // intersect! evaluate if (rangesIntersect(selectionRange, relevantInstance.range)) { if (selectionConfig.overlap === false) { return false; } if (selectOverlapFunc && !selectOverlapFunc(new EventApi(context, relevantDefs[relevantInstance.defId], relevantInstance), null)) { return false; } } } // allow (a function) for (var _i = 0, _a = selectionConfig.allows; _i < _a.length; _i++) { var selectionAllow = _a[_i]; var fullDateSpan = tslib.__assign(tslib.__assign({}, dateSpanMeta), selection); if (!selectionAllow(buildDateSpanApiWithContext(fullDateSpan, context), null)) { return false; } } return true; } // Constraint Utils // ------------------------------------------------------------------------------------------------------------------------ function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, context) { for (var _i = 0, constraints_1 = constraints; _i < constraints_1.length; _i++) { var constraint = constraints_1[_i]; if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, context), subjectRange)) { return false; } } return true; } function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours otherEventStore, // for if constraint is an even group ID businessHoursUnexpanded, // for if constraint is 'businessHours' context) { if (constraint === 'businessHours') { return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, context)); } if (typeof constraint === 'string') { // an group ID return eventStoreToRanges(filterEventStoreDefs(otherEventStore, function (eventDef) { return eventDef.groupId === constraint; })); } if (_typeof(constraint) === 'object' && constraint) { // non-null object return eventStoreToRanges(expandRecurring(constraint, subjectRange, context)); } return []; // if it's false } // TODO: move to event-store file? function eventStoreToRanges(eventStore) { var instances = eventStore.instances; var ranges = []; for (var instanceId in instances) { ranges.push(instances[instanceId].range); } return ranges; } // TODO: move to geom file? function anyRangesContainRange(outerRanges, innerRange) { for (var _i = 0, outerRanges_1 = outerRanges; _i < outerRanges_1.length; _i++) { var outerRange = outerRanges_1[_i]; if (rangeContainsRange(outerRange, innerRange)) { return true; } } return false; } var VISIBLE_HIDDEN_RE = /^(visible|hidden)$/; var Scroller = /** @class */ function (_super) { tslib.__extends(Scroller, _super); function Scroller() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.handleEl = function (el) { _this.el = el; setRef(_this.props.elRef, el); }; return _this; } Scroller.prototype.render = function () { var props = this.props; var liquid = props.liquid, liquidIsAbsolute = props.liquidIsAbsolute; var isAbsolute = liquid && liquidIsAbsolute; var className = ['fc-scroller']; if (liquid) { if (liquidIsAbsolute) { className.push('fc-scroller-liquid-absolute'); } else { className.push('fc-scroller-liquid'); } } return vdom_cjs.createElement("div", { ref: this.handleEl, className: className.join(' '), style: { overflowX: props.overflowX, overflowY: props.overflowY, left: isAbsolute && -(props.overcomeLeft || 0) || '', right: isAbsolute && -(props.overcomeRight || 0) || '', bottom: isAbsolute && -(props.overcomeBottom || 0) || '', marginLeft: !isAbsolute && -(props.overcomeLeft || 0) || '', marginRight: !isAbsolute && -(props.overcomeRight || 0) || '', marginBottom: !isAbsolute && -(props.overcomeBottom || 0) || '', maxHeight: props.maxHeight || '' } }, props.children); }; Scroller.prototype.needsXScrolling = function () { if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) { return false; } // testing scrollWidth>clientWidth is unreliable cross-browser when pixel heights aren't integers. // much more reliable to see if children are taller than the scroller, even tho doesn't account for // inner-child margins and absolute positioning var el = this.el; var realClientWidth = this.el.getBoundingClientRect().width - this.getYScrollbarWidth(); var children = el.children; for (var i = 0; i < children.length; i += 1) { var childEl = children[i]; if (childEl.getBoundingClientRect().width > realClientWidth) { return true; } } return false; }; Scroller.prototype.needsYScrolling = function () { if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) { return false; } // testing scrollHeight>clientHeight is unreliable cross-browser when pixel heights aren't integers. // much more reliable to see if children are taller than the scroller, even tho doesn't account for // inner-child margins and absolute positioning var el = this.el; var realClientHeight = this.el.getBoundingClientRect().height - this.getXScrollbarWidth(); var children = el.children; for (var i = 0; i < children.length; i += 1) { var childEl = children[i]; if (childEl.getBoundingClientRect().height > realClientHeight) { return true; } } return false; }; Scroller.prototype.getXScrollbarWidth = function () { if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) { return 0; } return this.el.offsetHeight - this.el.clientHeight; // only works because we guarantee no borders. TODO: add to CSS with important? }; Scroller.prototype.getYScrollbarWidth = function () { if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) { return 0; } return this.el.offsetWidth - this.el.clientWidth; // only works because we guarantee no borders. TODO: add to CSS with important? }; return Scroller; }(BaseComponent); /* TODO: somehow infer OtherArgs from masterCallback? TODO: infer RefType from masterCallback if provided */ var RefMap = /** @class */ function () { function RefMap(masterCallback) { var _this = this; this.masterCallback = masterCallback; this.currentMap = {}; this.depths = {}; this.callbackMap = {}; this.handleValue = function (val, key) { var _a = _this, depths = _a.depths, currentMap = _a.currentMap; var removed = false; var added = false; if (val !== null) { // for bug... ACTUALLY: can probably do away with this now that callers don't share numeric indices anymore removed = key in currentMap; currentMap[key] = val; depths[key] = (depths[key] || 0) + 1; added = true; } else { depths[key] -= 1; if (!depths[key]) { delete currentMap[key]; delete _this.callbackMap[key]; removed = true; } } if (_this.masterCallback) { if (removed) { _this.masterCallback(null, String(key)); } if (added) { _this.masterCallback(val, String(key)); } } }; } RefMap.prototype.createRef = function (key) { var _this = this; var refCallback = this.callbackMap[key]; if (!refCallback) { refCallback = this.callbackMap[key] = function (val) { _this.handleValue(val, String(key)); }; } return refCallback; }; // TODO: check callers that don't care about order. should use getAll instead // NOTE: this method has become less valuable now that we are encouraged to map order by some other index // TODO: provide ONE array-export function, buildArray, which fails on non-numeric indexes. caller can manipulate and "collect" RefMap.prototype.collect = function (startIndex, endIndex, step) { return collectFromHash(this.currentMap, startIndex, endIndex, step); }; RefMap.prototype.getAll = function () { return hashValuesToArray(this.currentMap); }; return RefMap; }(); function computeShrinkWidth(chunkEls) { var shrinkCells = findElements(chunkEls, '.fc-scrollgrid-shrink'); var largestWidth = 0; for (var _i = 0, shrinkCells_1 = shrinkCells; _i < shrinkCells_1.length; _i++) { var shrinkCell = shrinkCells_1[_i]; largestWidth = Math.max(largestWidth, computeSmallestCellWidth(shrinkCell)); } return Math.ceil(largestWidth); // elements work best with integers. round up to ensure contents fits } function getSectionHasLiquidHeight(props, sectionConfig) { return props.liquid && sectionConfig.liquid; // does the section do liquid-height? (need to have whole scrollgrid liquid-height as well) } function getAllowYScrolling(props, sectionConfig) { return sectionConfig.maxHeight != null || // if its possible for the height to max out, we might need scrollbars getSectionHasLiquidHeight(props, sectionConfig); // if the section is liquid height, it might condense enough to require scrollbars } // TODO: ONLY use `arg`. force out internal function to use same API function renderChunkContent(sectionConfig, chunkConfig, arg, isHeader) { var expandRows = arg.expandRows; var content = typeof chunkConfig.content === 'function' ? chunkConfig.content(arg) : vdom_cjs.createElement('table', { role: 'presentation', className: [chunkConfig.tableClassName, sectionConfig.syncRowHeights ? 'fc-scrollgrid-sync-table' : ''].join(' '), style: { minWidth: arg.tableMinWidth, width: arg.clientWidth, height: expandRows ? arg.clientHeight : '' // css `height` on a
serves as a min-height } }, arg.tableColGroupNode, vdom_cjs.createElement(isHeader ? 'thead' : 'tbody', { role: 'presentation' }, typeof chunkConfig.rowContent === 'function' ? chunkConfig.rowContent(arg) : chunkConfig.rowContent)); return content; } function isColPropsEqual(cols0, cols1) { return isArraysEqual(cols0, cols1, isPropsEqual); } function renderMicroColGroup(cols, shrinkWidth) { var colNodes = []; /* for ColProps with spans, it would have been great to make a single HOWEVER, Chrome was getting messing up distributing the width to elements makes Chrome behave. */ for (var _i = 0, cols_1 = cols; _i < cols_1.length; _i++) { var colProps = cols_1[_i]; var span = colProps.span || 1; for (var i = 0; i < span; i += 1) { colNodes.push(vdom_cjs.createElement("col", { style: { width: colProps.width === 'shrink' ? sanitizeShrinkWidth(shrinkWidth) : colProps.width || '', minWidth: colProps.minWidth || '' } })); } } return vdom_cjs.createElement.apply(void 0, tslib.__spreadArray(['colgroup', {}], colNodes)); } function sanitizeShrinkWidth(shrinkWidth) { /* why 4? if we do 0, it will kill any border, which are needed for computeSmallestCellWidth 4 accounts for 2 2-pixel borders. TODO: better solution? */ return shrinkWidth == null ? 4 : shrinkWidth; } function hasShrinkWidth(cols) { for (var _i = 0, cols_2 = cols; _i < cols_2.length; _i++) { var col = cols_2[_i]; if (col.width === 'shrink') { return true; } } return false; } function getScrollGridClassNames(liquid, context) { var classNames = ['fc-scrollgrid', context.theme.getClass('table')]; if (liquid) { classNames.push('fc-scrollgrid-liquid'); } return classNames; } function getSectionClassNames(sectionConfig, wholeTableVGrow) { var classNames = ['fc-scrollgrid-section', "fc-scrollgrid-section-" + sectionConfig.type, sectionConfig.className // used? ]; if (wholeTableVGrow && sectionConfig.liquid && sectionConfig.maxHeight == null) { classNames.push('fc-scrollgrid-section-liquid'); } if (sectionConfig.isSticky) { classNames.push('fc-scrollgrid-section-sticky'); } return classNames; } function renderScrollShim(arg) { return vdom_cjs.createElement("div", { className: "fc-scrollgrid-sticky-shim", style: { width: arg.clientWidth, minWidth: arg.tableMinWidth } }); } function getStickyHeaderDates(options) { var stickyHeaderDates = options.stickyHeaderDates; if (stickyHeaderDates == null || stickyHeaderDates === 'auto') { stickyHeaderDates = options.height === 'auto' || options.viewHeight === 'auto'; } return stickyHeaderDates; } function getStickyFooterScrollbar(options) { var stickyFooterScrollbar = options.stickyFooterScrollbar; if (stickyFooterScrollbar == null || stickyFooterScrollbar === 'auto') { stickyFooterScrollbar = options.height === 'auto' || options.viewHeight === 'auto'; } return stickyFooterScrollbar; } var SimpleScrollGrid = /** @class */ function (_super) { tslib.__extends(SimpleScrollGrid, _super); function SimpleScrollGrid() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.processCols = memoize(function (a) { return a; }, isColPropsEqual); // so we get same `cols` props every time // yucky to memoize VNodes, but much more efficient for consumers _this.renderMicroColGroup = memoize(renderMicroColGroup); _this.scrollerRefs = new RefMap(); _this.scrollerElRefs = new RefMap(_this._handleScrollerEl.bind(_this)); _this.state = { shrinkWidth: null, forceYScrollbars: false, scrollerClientWidths: {}, scrollerClientHeights: {} }; // TODO: can do a really simple print-view. dont need to join rows _this.handleSizing = function () { _this.safeSetState(tslib.__assign({ shrinkWidth: _this.computeShrinkWidth() }, _this.computeScrollerDims())); }; return _this; } SimpleScrollGrid.prototype.render = function () { var _a = this, props = _a.props, state = _a.state, context = _a.context; var sectionConfigs = props.sections || []; var cols = this.processCols(props.cols); var microColGroupNode = this.renderMicroColGroup(cols, state.shrinkWidth); var classNames = getScrollGridClassNames(props.liquid, context); if (props.collapsibleWidth) { classNames.push('fc-scrollgrid-collapsible'); } // TODO: make DRY var configCnt = sectionConfigs.length; var configI = 0; var currentConfig; var headSectionNodes = []; var bodySectionNodes = []; var footSectionNodes = []; while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'header') { headSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true)); configI += 1; } while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'body') { bodySectionNodes.push(this.renderSection(currentConfig, microColGroupNode, false)); configI += 1; } while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'footer') { footSectionNodes.push(this.renderSection(currentConfig, microColGroupNode, true)); configI += 1; } // firefox bug: when setting height on table and there is a thead or tfoot, // the necessary height:100% on the liquid-height body section forces the *whole* table to be taller. (bug #5524) // use getCanVGrowWithinCell as a way to detect table-stupid firefox. // if so, use a simpler dom structure, jam everything into a lone tbody. var isBuggy = !getCanVGrowWithinCell(); var roleAttrs = { role: 'rowgroup' }; return vdom_cjs.createElement('table', { role: 'grid', className: classNames.join(' '), style: { height: props.height } }, Boolean(!isBuggy && headSectionNodes.length) && vdom_cjs.createElement.apply(void 0, tslib.__spreadArray(['thead', roleAttrs], headSectionNodes)), Boolean(!isBuggy && bodySectionNodes.length) && vdom_cjs.createElement.apply(void 0, tslib.__spreadArray(['tbody', roleAttrs], bodySectionNodes)), Boolean(!isBuggy && footSectionNodes.length) && vdom_cjs.createElement.apply(void 0, tslib.__spreadArray(['tfoot', roleAttrs], footSectionNodes)), isBuggy && vdom_cjs.createElement.apply(void 0, tslib.__spreadArray(tslib.__spreadArray(tslib.__spreadArray(['tbody', roleAttrs], headSectionNodes), bodySectionNodes), footSectionNodes))); }; SimpleScrollGrid.prototype.renderSection = function (sectionConfig, microColGroupNode, isHeader) { if ('outerContent' in sectionConfig) { return vdom_cjs.createElement(vdom_cjs.Fragment, { key: sectionConfig.key }, sectionConfig.outerContent); } return vdom_cjs.createElement("tr", { key: sectionConfig.key, role: "presentation", className: getSectionClassNames(sectionConfig, this.props.liquid).join(' ') }, this.renderChunkTd(sectionConfig, microColGroupNode, sectionConfig.chunk, isHeader)); }; SimpleScrollGrid.prototype.renderChunkTd = function (sectionConfig, microColGroupNode, chunkConfig, isHeader) { if ('outerContent' in chunkConfig) { return chunkConfig.outerContent; } var props = this.props; var _a = this.state, forceYScrollbars = _a.forceYScrollbars, scrollerClientWidths = _a.scrollerClientWidths, scrollerClientHeights = _a.scrollerClientHeights; var needsYScrolling = getAllowYScrolling(props, sectionConfig); // TODO: do lazily. do in section config? var isLiquid = getSectionHasLiquidHeight(props, sectionConfig); // for `!props.liquid` - is WHOLE scrollgrid natural height? // TODO: do same thing in advanced scrollgrid? prolly not b/c always has horizontal scrollbars var overflowY = !props.liquid ? 'visible' : forceYScrollbars ? 'scroll' : !needsYScrolling ? 'hidden' : 'auto'; var sectionKey = sectionConfig.key; var content = renderChunkContent(sectionConfig, chunkConfig, { tableColGroupNode: microColGroupNode, tableMinWidth: '', clientWidth: !props.collapsibleWidth && scrollerClientWidths[sectionKey] !== undefined ? scrollerClientWidths[sectionKey] : null, clientHeight: scrollerClientHeights[sectionKey] !== undefined ? scrollerClientHeights[sectionKey] : null, expandRows: sectionConfig.expandRows, syncRowHeights: false, rowSyncHeights: [], reportRowHeightChange: function reportRowHeightChange() {} }, isHeader); return vdom_cjs.createElement(isHeader ? 'th' : 'td', { ref: chunkConfig.elRef, role: 'presentation' }, vdom_cjs.createElement("div", { className: "fc-scroller-harness" + (isLiquid ? ' fc-scroller-harness-liquid' : '') }, vdom_cjs.createElement(Scroller, { ref: this.scrollerRefs.createRef(sectionKey), elRef: this.scrollerElRefs.createRef(sectionKey), overflowY: overflowY, overflowX: !props.liquid ? 'visible' : 'hidden' /* natural height? */ , maxHeight: sectionConfig.maxHeight, liquid: isLiquid, liquidIsAbsolute // because its within a harness : true }, content))); }; SimpleScrollGrid.prototype._handleScrollerEl = function (scrollerEl, key) { var section = getSectionByKey(this.props.sections, key); if (section) { setRef(section.chunk.scrollerElRef, scrollerEl); } }; SimpleScrollGrid.prototype.componentDidMount = function () { this.handleSizing(); this.context.addResizeHandler(this.handleSizing); }; SimpleScrollGrid.prototype.componentDidUpdate = function () { // TODO: need better solution when state contains non-sizing things this.handleSizing(); }; SimpleScrollGrid.prototype.componentWillUnmount = function () { this.context.removeResizeHandler(this.handleSizing); }; SimpleScrollGrid.prototype.computeShrinkWidth = function () { return hasShrinkWidth(this.props.cols) ? computeShrinkWidth(this.scrollerElRefs.getAll()) : 0; }; SimpleScrollGrid.prototype.computeScrollerDims = function () { var scrollbarWidth = getScrollbarWidths(); var _a = this, scrollerRefs = _a.scrollerRefs, scrollerElRefs = _a.scrollerElRefs; var forceYScrollbars = false; var scrollerClientWidths = {}; var scrollerClientHeights = {}; for (var sectionKey in scrollerRefs.currentMap) { var scroller = scrollerRefs.currentMap[sectionKey]; if (scroller && scroller.needsYScrolling()) { forceYScrollbars = true; break; } } for (var _i = 0, _b = this.props.sections; _i < _b.length; _i++) { var section = _b[_i]; var sectionKey = section.key; var scrollerEl = scrollerElRefs.currentMap[sectionKey]; if (scrollerEl) { var harnessEl = scrollerEl.parentNode; // TODO: weird way to get this. need harness b/c doesn't include table borders scrollerClientWidths[sectionKey] = Math.floor(harnessEl.getBoundingClientRect().width - (forceYScrollbars ? scrollbarWidth.y // use global because scroller might not have scrollbars yet but will need them in future : 0)); scrollerClientHeights[sectionKey] = Math.floor(harnessEl.getBoundingClientRect().height); } } return { forceYScrollbars: forceYScrollbars, scrollerClientWidths: scrollerClientWidths, scrollerClientHeights: scrollerClientHeights }; }; return SimpleScrollGrid; }(BaseComponent); SimpleScrollGrid.addStateEquality({ scrollerClientWidths: isPropsEqual, scrollerClientHeights: isPropsEqual }); function getSectionByKey(sections, key) { for (var _i = 0, sections_1 = sections; _i < sections_1.length; _i++) { var section = sections_1[_i]; if (section.key === key) { return section; } } return null; } var EventRoot = /** @class */ function (_super) { tslib.__extends(EventRoot, _super); function EventRoot() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.elRef = vdom_cjs.createRef(); return _this; } EventRoot.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; var options = context.options; var seg = props.seg; var eventRange = seg.eventRange; var ui = eventRange.ui; var hookProps = { event: new EventApi(context, eventRange.def, eventRange.instance), view: context.viewApi, timeText: props.timeText, textColor: ui.textColor, backgroundColor: ui.backgroundColor, borderColor: ui.borderColor, isDraggable: !props.disableDragging && computeSegDraggable(seg, context), isStartResizable: !props.disableResizing && computeSegStartResizable(seg, context), isEndResizable: !props.disableResizing && computeSegEndResizable(seg), isMirror: Boolean(props.isDragging || props.isResizing || props.isDateSelecting), isStart: Boolean(seg.isStart), isEnd: Boolean(seg.isEnd), isPast: Boolean(props.isPast), isFuture: Boolean(props.isFuture), isToday: Boolean(props.isToday), isSelected: Boolean(props.isSelected), isDragging: Boolean(props.isDragging), isResizing: Boolean(props.isResizing) }; var standardClassNames = getEventClassNames(hookProps).concat(ui.classNames); return vdom_cjs.createElement(RenderHook, { hookProps: hookProps, classNames: options.eventClassNames, content: options.eventContent, defaultContent: props.defaultContent, didMount: options.eventDidMount, willUnmount: options.eventWillUnmount, elRef: this.elRef }, function (rootElRef, customClassNames, innerElRef, innerContent) { return props.children(rootElRef, standardClassNames.concat(customClassNames), innerElRef, innerContent, hookProps); }); }; EventRoot.prototype.componentDidMount = function () { setElSeg(this.elRef.current, this.props.seg); }; /* need to re-assign seg to the element if seg changes, even if the element is the same */ EventRoot.prototype.componentDidUpdate = function (prevProps) { var seg = this.props.seg; if (seg !== prevProps.seg) { setElSeg(this.elRef.current, seg); } }; return EventRoot; }(BaseComponent); // should not be a purecomponent var StandardEvent = /** @class */ function (_super) { tslib.__extends(StandardEvent, _super); function StandardEvent() { return _super !== null && _super.apply(this, arguments) || this; } StandardEvent.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; var seg = props.seg; var timeFormat = context.options.eventTimeFormat || props.defaultTimeFormat; var timeText = buildSegTimeText(seg, timeFormat, context, props.defaultDisplayEventTime, props.defaultDisplayEventEnd); return vdom_cjs.createElement(EventRoot, { seg: seg, timeText: timeText, disableDragging: props.disableDragging, disableResizing: props.disableResizing, defaultContent: props.defaultContent || renderInnerContent$1, isDragging: props.isDragging, isResizing: props.isResizing, isDateSelecting: props.isDateSelecting, isSelected: props.isSelected, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return vdom_cjs.createElement("a", tslib.__assign({ className: props.extraClassNames.concat(classNames).join(' '), style: { borderColor: hookProps.borderColor, backgroundColor: hookProps.backgroundColor }, ref: rootElRef }, getSegAnchorAttrs(seg, context)), vdom_cjs.createElement("div", { className: "fc-event-main", ref: innerElRef, style: { color: hookProps.textColor } }, innerContent), hookProps.isStartResizable && vdom_cjs.createElement("div", { className: "fc-event-resizer fc-event-resizer-start" }), hookProps.isEndResizable && vdom_cjs.createElement("div", { className: "fc-event-resizer fc-event-resizer-end" })); }); }; return StandardEvent; }(BaseComponent); function renderInnerContent$1(innerProps) { return vdom_cjs.createElement("div", { className: "fc-event-main-frame" }, innerProps.timeText && vdom_cjs.createElement("div", { className: "fc-event-time" }, innerProps.timeText), vdom_cjs.createElement("div", { className: "fc-event-title-container" }, vdom_cjs.createElement("div", { className: "fc-event-title fc-sticky" }, innerProps.event.title || vdom_cjs.createElement(vdom_cjs.Fragment, null, "\xA0")))); } var NowIndicatorRoot = function NowIndicatorRoot(props) { return vdom_cjs.createElement(ViewContextType.Consumer, null, function (context) { var options = context.options; var hookProps = { isAxis: props.isAxis, date: context.dateEnv.toDate(props.date), view: context.viewApi }; return vdom_cjs.createElement(RenderHook, { hookProps: hookProps, classNames: options.nowIndicatorClassNames, content: options.nowIndicatorContent, didMount: options.nowIndicatorDidMount, willUnmount: options.nowIndicatorWillUnmount }, props.children); }); }; var DAY_NUM_FORMAT = createFormatter({ day: 'numeric' }); var DayCellContent = /** @class */ function (_super) { tslib.__extends(DayCellContent, _super); function DayCellContent() { return _super !== null && _super.apply(this, arguments) || this; } DayCellContent.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; var options = context.options; var hookProps = refineDayCellHookProps({ date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraProps: props.extraHookProps, viewApi: context.viewApi, dateEnv: context.dateEnv }); return vdom_cjs.createElement(ContentHook, { hookProps: hookProps, content: options.dayCellContent, defaultContent: props.defaultContent }, props.children); }; return DayCellContent; }(BaseComponent); function refineDayCellHookProps(raw) { var date = raw.date, dateEnv = raw.dateEnv; var dayMeta = getDateMeta(date, raw.todayRange, null, raw.dateProfile); return tslib.__assign(tslib.__assign(tslib.__assign({ date: dateEnv.toDate(date), view: raw.viewApi }, dayMeta), { dayNumberText: raw.showDayNumber ? dateEnv.format(date, DAY_NUM_FORMAT) : '' }), raw.extraProps); } var DayCellRoot = /** @class */ function (_super) { tslib.__extends(DayCellRoot, _super); function DayCellRoot() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.refineHookProps = memoizeObjArg(refineDayCellHookProps); _this.normalizeClassNames = buildClassNameNormalizer(); return _this; } DayCellRoot.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; var options = context.options; var hookProps = this.refineHookProps({ date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraProps: props.extraHookProps, viewApi: context.viewApi, dateEnv: context.dateEnv }); var classNames = getDayClassNames(hookProps, context.theme).concat(hookProps.isDisabled ? [] // don't use custom classNames if disabled : this.normalizeClassNames(options.dayCellClassNames, hookProps)); var dataAttrs = hookProps.isDisabled ? {} : { 'data-date': formatDayString(props.date) }; return vdom_cjs.createElement(MountHook, { hookProps: hookProps, didMount: options.dayCellDidMount, willUnmount: options.dayCellWillUnmount, elRef: props.elRef }, function (rootElRef) { return props.children(rootElRef, classNames, dataAttrs, hookProps.isDisabled); }); }; return DayCellRoot; }(BaseComponent); function renderFill(fillType) { return vdom_cjs.createElement("div", { className: "fc-" + fillType }); } var BgEvent = function BgEvent(props) { return vdom_cjs.createElement(EventRoot, { defaultContent: renderInnerContent, seg: props.seg /* uselesss i think */ , timeText: "", disableDragging: true, disableResizing: true, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return vdom_cjs.createElement("div", { ref: rootElRef, className: ['fc-bg-event'].concat(classNames).join(' '), style: { backgroundColor: hookProps.backgroundColor } }, innerContent); }); }; function renderInnerContent(props) { var title = props.event.title; return title && vdom_cjs.createElement("div", { className: "fc-event-title" }, props.event.title); } var WeekNumberRoot = function WeekNumberRoot(props) { return vdom_cjs.createElement(ViewContextType.Consumer, null, function (context) { var dateEnv = context.dateEnv, options = context.options; var date = props.date; var format = options.weekNumberFormat || props.defaultFormat; var num = dateEnv.computeWeekNumber(date); // TODO: somehow use for formatting as well? var text = dateEnv.format(date, format); var hookProps = { num: num, text: text, date: date }; return vdom_cjs.createElement(RenderHook, { hookProps: hookProps, classNames: options.weekNumberClassNames, content: options.weekNumberContent, defaultContent: renderInner, didMount: options.weekNumberDidMount, willUnmount: options.weekNumberWillUnmount }, props.children); }); }; function renderInner(innerProps) { return innerProps.text; } var PADDING_FROM_VIEWPORT = 10; var Popover = /** @class */ function (_super) { tslib.__extends(Popover, _super); function Popover() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.state = { titleId: getUniqueDomId() }; _this.handleRootEl = function (el) { _this.rootEl = el; if (_this.props.elRef) { setRef(_this.props.elRef, el); } }; // Triggered when the user clicks *anywhere* in the document, for the autoHide feature _this.handleDocumentMouseDown = function (ev) { // only hide the popover if the click happened outside the popover var target = getEventTargetViaRoot(ev); if (!_this.rootEl.contains(target)) { _this.handleCloseClick(); } }; _this.handleDocumentKeyDown = function (ev) { if (ev.key === 'Escape') { _this.handleCloseClick(); } }; _this.handleCloseClick = function () { var onClose = _this.props.onClose; if (onClose) { onClose(); } }; return _this; } Popover.prototype.render = function () { var _a = this.context, theme = _a.theme, options = _a.options; var _b = this, props = _b.props, state = _b.state; var classNames = ['fc-popover', theme.getClass('popover')].concat(props.extraClassNames || []); return vdom_cjs.createPortal(vdom_cjs.createElement("div", tslib.__assign({ id: props.id, className: classNames.join(' '), "aria-labelledby": state.titleId }, props.extraAttrs, { ref: this.handleRootEl }), vdom_cjs.createElement("div", { className: 'fc-popover-header ' + theme.getClass('popoverHeader') }, vdom_cjs.createElement("span", { className: "fc-popover-title", id: state.titleId }, props.title), vdom_cjs.createElement("span", { className: 'fc-popover-close ' + theme.getIconClass('close'), title: options.closeHint, onClick: this.handleCloseClick })), vdom_cjs.createElement("div", { className: 'fc-popover-body ' + theme.getClass('popoverContent') }, props.children)), props.parentEl); }; Popover.prototype.componentDidMount = function () { document.addEventListener('mousedown', this.handleDocumentMouseDown); document.addEventListener('keydown', this.handleDocumentKeyDown); this.updateSize(); }; Popover.prototype.componentWillUnmount = function () { document.removeEventListener('mousedown', this.handleDocumentMouseDown); document.removeEventListener('keydown', this.handleDocumentKeyDown); }; Popover.prototype.updateSize = function () { var isRtl = this.context.isRtl; var _a = this.props, alignmentEl = _a.alignmentEl, alignGridTop = _a.alignGridTop; var rootEl = this.rootEl; var alignmentRect = computeClippedClientRect(alignmentEl); if (alignmentRect) { var popoverDims = rootEl.getBoundingClientRect(); // position relative to viewport var popoverTop = alignGridTop ? elementClosest(alignmentEl, '.fc-scrollgrid').getBoundingClientRect().top : alignmentRect.top; var popoverLeft = isRtl ? alignmentRect.right - popoverDims.width : alignmentRect.left; // constrain popoverTop = Math.max(popoverTop, PADDING_FROM_VIEWPORT); popoverLeft = Math.min(popoverLeft, document.documentElement.clientWidth - PADDING_FROM_VIEWPORT - popoverDims.width); popoverLeft = Math.max(popoverLeft, PADDING_FROM_VIEWPORT); var origin_1 = rootEl.offsetParent.getBoundingClientRect(); applyStyle(rootEl, { top: popoverTop - origin_1.top, left: popoverLeft - origin_1.left }); } }; return Popover; }(BaseComponent); var MorePopover = /** @class */ function (_super) { tslib.__extends(MorePopover, _super); function MorePopover() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.handleRootEl = function (rootEl) { _this.rootEl = rootEl; if (rootEl) { _this.context.registerInteractiveComponent(_this, { el: rootEl, useEventCenter: false }); } else { _this.context.unregisterInteractiveComponent(_this); } }; return _this; } MorePopover.prototype.render = function () { var _a = this.context, options = _a.options, dateEnv = _a.dateEnv; var props = this.props; var startDate = props.startDate, todayRange = props.todayRange, dateProfile = props.dateProfile; var title = dateEnv.format(startDate, options.dayPopoverFormat); return vdom_cjs.createElement(DayCellRoot, { date: startDate, dateProfile: dateProfile, todayRange: todayRange, elRef: this.handleRootEl }, function (rootElRef, dayClassNames, dataAttrs) { return vdom_cjs.createElement(Popover, { elRef: rootElRef, id: props.id, title: title, extraClassNames: ['fc-more-popover'].concat(dayClassNames), extraAttrs: dataAttrs /* TODO: make these time-based when not whole-day? */ , parentEl: props.parentEl, alignmentEl: props.alignmentEl, alignGridTop: props.alignGridTop, onClose: props.onClose }, vdom_cjs.createElement(DayCellContent, { date: startDate, dateProfile: dateProfile, todayRange: todayRange }, function (innerElRef, innerContent) { return innerContent && vdom_cjs.createElement("div", { className: "fc-more-popover-misc", ref: innerElRef }, innerContent); }), props.children); }); }; MorePopover.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) { var _a = this, rootEl = _a.rootEl, props = _a.props; if (positionLeft >= 0 && positionLeft < elWidth && positionTop >= 0 && positionTop < elHeight) { return { dateProfile: props.dateProfile, dateSpan: tslib.__assign({ allDay: true, range: { start: props.startDate, end: props.endDate } }, props.extraDateSpan), dayEl: rootEl, rect: { left: 0, top: 0, right: elWidth, bottom: elHeight }, layer: 1 // important when comparing with hits from other components }; } return null; }; return MorePopover; }(DateComponent); var MoreLinkRoot = /** @class */ function (_super) { tslib.__extends(MoreLinkRoot, _super); function MoreLinkRoot() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.linkElRef = vdom_cjs.createRef(); _this.state = { isPopoverOpen: false, popoverId: getUniqueDomId() }; _this.handleClick = function (ev) { var _a = _this, props = _a.props, context = _a.context; var moreLinkClick = context.options.moreLinkClick; var date = computeRange(props).start; function buildPublicSeg(seg) { var _a = seg.eventRange, def = _a.def, instance = _a.instance, range = _a.range; return { event: new EventApi(context, def, instance), start: context.dateEnv.toDate(range.start), end: context.dateEnv.toDate(range.end), isStart: seg.isStart, isEnd: seg.isEnd }; } if (typeof moreLinkClick === 'function') { moreLinkClick = moreLinkClick({ date: date, allDay: Boolean(props.allDayDate), allSegs: props.allSegs.map(buildPublicSeg), hiddenSegs: props.hiddenSegs.map(buildPublicSeg), jsEvent: ev, view: context.viewApi }); } if (!moreLinkClick || moreLinkClick === 'popover') { _this.setState({ isPopoverOpen: true }); } else if (typeof moreLinkClick === 'string') { // a view name context.calendarApi.zoomTo(date, moreLinkClick); } }; _this.handlePopoverClose = function () { _this.setState({ isPopoverOpen: false }); }; return _this; } MoreLinkRoot.prototype.render = function () { var _this = this; var _a = this, props = _a.props, state = _a.state; return vdom_cjs.createElement(ViewContextType.Consumer, null, function (context) { var viewApi = context.viewApi, options = context.options, calendarApi = context.calendarApi; var moreLinkText = options.moreLinkText; var moreCnt = props.moreCnt; var range = computeRange(props); var text = typeof moreLinkText === 'function' // TODO: eventually use formatWithOrdinals ? moreLinkText.call(calendarApi, moreCnt) : "+" + moreCnt + " " + moreLinkText; var title = formatWithOrdinals(options.moreLinkHint, [moreCnt], text); var hookProps = { num: moreCnt, shortText: "+" + moreCnt, text: text, view: viewApi }; return vdom_cjs.createElement(vdom_cjs.Fragment, null, Boolean(props.moreCnt) && vdom_cjs.createElement(RenderHook, { elRef: _this.linkElRef, hookProps: hookProps, classNames: options.moreLinkClassNames, content: options.moreLinkContent, defaultContent: props.defaultContent || renderMoreLinkInner, didMount: options.moreLinkDidMount, willUnmount: options.moreLinkWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return props.children(rootElRef, ['fc-more-link'].concat(customClassNames), innerElRef, innerContent, _this.handleClick, title, state.isPopoverOpen, state.isPopoverOpen ? state.popoverId : ''); }), state.isPopoverOpen && vdom_cjs.createElement(MorePopover, { id: state.popoverId, startDate: range.start, endDate: range.end, dateProfile: props.dateProfile, todayRange: props.todayRange, extraDateSpan: props.extraDateSpan, parentEl: _this.parentEl, alignmentEl: props.alignmentElRef.current, alignGridTop: props.alignGridTop, onClose: _this.handlePopoverClose }, props.popoverContent())); }); }; MoreLinkRoot.prototype.componentDidMount = function () { this.updateParentEl(); }; MoreLinkRoot.prototype.componentDidUpdate = function () { this.updateParentEl(); }; MoreLinkRoot.prototype.updateParentEl = function () { if (this.linkElRef.current) { this.parentEl = elementClosest(this.linkElRef.current, '.fc-view-harness'); } }; return MoreLinkRoot; }(BaseComponent); function renderMoreLinkInner(props) { return props.text; } function computeRange(props) { if (props.allDayDate) { return { start: props.allDayDate, end: addDays(props.allDayDate, 1) }; } var hiddenSegs = props.hiddenSegs; return { start: computeEarliestSegStart(hiddenSegs), end: computeLatestSegEnd(hiddenSegs) }; } function computeEarliestSegStart(segs) { return segs.reduce(pickEarliestStart).eventRange.range.start; } function pickEarliestStart(seg0, seg1) { return seg0.eventRange.range.start < seg1.eventRange.range.start ? seg0 : seg1; } function computeLatestSegEnd(segs) { return segs.reduce(pickLatestEnd).eventRange.range.end; } function pickLatestEnd(seg0, seg1) { return seg0.eventRange.range.end > seg1.eventRange.range.end ? seg0 : seg1; } // exports // -------------------------------------------------------------------------------------------------- var version = '5.11.2'; // important to type it, so .d.ts has generic string exports.BASE_OPTION_DEFAULTS = BASE_OPTION_DEFAULTS; exports.BASE_OPTION_REFINERS = BASE_OPTION_REFINERS; exports.BaseComponent = BaseComponent; exports.BgEvent = BgEvent; exports.CalendarApi = CalendarApi; exports.CalendarContent = CalendarContent; exports.CalendarDataManager = CalendarDataManager; exports.CalendarDataProvider = CalendarDataProvider; exports.CalendarRoot = CalendarRoot; exports.ContentHook = ContentHook; exports.CustomContentRenderContext = CustomContentRenderContext; exports.DateComponent = DateComponent; exports.DateEnv = DateEnv; exports.DateProfileGenerator = DateProfileGenerator; exports.DayCellContent = DayCellContent; exports.DayCellRoot = DayCellRoot; exports.DayHeader = DayHeader; exports.DaySeriesModel = DaySeriesModel; exports.DayTableModel = DayTableModel; exports.DelayedRunner = DelayedRunner; exports.ElementDragging = ElementDragging; exports.ElementScrollController = ElementScrollController; exports.Emitter = Emitter; exports.EventApi = EventApi; exports.EventRoot = EventRoot; exports.EventSourceApi = EventSourceApi; exports.Interaction = Interaction; exports.MoreLinkRoot = MoreLinkRoot; exports.MountHook = MountHook; exports.NamedTimeZoneImpl = NamedTimeZoneImpl; exports.NowIndicatorRoot = NowIndicatorRoot; exports.NowTimer = NowTimer; exports.PositionCache = PositionCache; exports.RefMap = RefMap; exports.RenderHook = RenderHook; exports.ScrollController = ScrollController; exports.ScrollResponder = ScrollResponder; exports.Scroller = Scroller; exports.SegHierarchy = SegHierarchy; exports.SimpleScrollGrid = SimpleScrollGrid; exports.Slicer = Slicer; exports.Splitter = Splitter; exports.StandardEvent = StandardEvent; exports.TableDateCell = TableDateCell; exports.TableDowCell = TableDowCell; exports.Theme = Theme; exports.ViewApi = ViewApi; exports.ViewContextType = ViewContextType; exports.ViewRoot = ViewRoot; exports.WeekNumberRoot = WeekNumberRoot; exports.WindowScrollController = WindowScrollController; exports.addDays = addDays; exports.addDurations = addDurations; exports.addMs = addMs; exports.addWeeks = addWeeks; exports.allowContextMenu = allowContextMenu; exports.allowSelection = allowSelection; exports.applyMutationToEventStore = applyMutationToEventStore; exports.applyStyle = applyStyle; exports.applyStyleProp = applyStyleProp; exports.asCleanDays = asCleanDays; exports.asRoughMinutes = asRoughMinutes; exports.asRoughMs = asRoughMs; exports.asRoughSeconds = asRoughSeconds; exports.binarySearch = binarySearch; exports.buildClassNameNormalizer = buildClassNameNormalizer; exports.buildEntryKey = buildEntryKey; exports.buildEventApis = buildEventApis; exports.buildEventRangeKey = buildEventRangeKey; exports.buildHashFromArray = buildHashFromArray; exports.buildIsoString = buildIsoString; exports.buildNavLinkAttrs = buildNavLinkAttrs; exports.buildSegCompareObj = buildSegCompareObj; exports.buildSegTimeText = buildSegTimeText; exports.collectFromHash = collectFromHash; exports.combineEventUis = combineEventUis; exports.compareByFieldSpec = compareByFieldSpec; exports.compareByFieldSpecs = compareByFieldSpecs; exports.compareNumbers = compareNumbers; exports.compareObjs = compareObjs; exports.computeEarliestSegStart = computeEarliestSegStart; exports.computeEdges = computeEdges; exports.computeFallbackHeaderFormat = computeFallbackHeaderFormat; exports.computeHeightAndMargins = computeHeightAndMargins; exports.computeInnerRect = computeInnerRect; exports.computeRect = computeRect; exports.computeSegDraggable = computeSegDraggable; exports.computeSegEndResizable = computeSegEndResizable; exports.computeSegStartResizable = computeSegStartResizable; exports.computeShrinkWidth = computeShrinkWidth; exports.computeSmallestCellWidth = computeSmallestCellWidth; exports.computeVisibleDayRange = computeVisibleDayRange; exports.config = config; exports.constrainPoint = constrainPoint; exports.createAriaClickAttrs = createAriaClickAttrs; exports.createDuration = createDuration; exports.createEmptyEventStore = createEmptyEventStore; exports.createEventInstance = createEventInstance; exports.createEventUi = createEventUi; exports.createFormatter = createFormatter; exports.createPlugin = createPlugin; exports.diffDates = diffDates; exports.diffDayAndTime = diffDayAndTime; exports.diffDays = diffDays; exports.diffPoints = diffPoints; exports.diffWeeks = diffWeeks; exports.diffWholeDays = diffWholeDays; exports.diffWholeWeeks = diffWholeWeeks; exports.disableCursor = disableCursor; exports.elementClosest = elementClosest; exports.elementMatches = elementMatches; exports.enableCursor = enableCursor; exports.eventTupleToStore = eventTupleToStore; exports.filterEventStoreDefs = filterEventStoreDefs; exports.filterHash = filterHash; exports.findDirectChildren = findDirectChildren; exports.findElements = findElements; exports.flexibleCompare = flexibleCompare; exports.formatDate = formatDate; exports.formatDayString = formatDayString; exports.formatIsoTimeString = formatIsoTimeString; exports.formatRange = formatRange; exports.getAllowYScrolling = getAllowYScrolling; exports.getCanVGrowWithinCell = getCanVGrowWithinCell; exports.getClippingParents = getClippingParents; exports.getDateMeta = getDateMeta; exports.getDayClassNames = getDayClassNames; exports.getDefaultEventEnd = getDefaultEventEnd; exports.getElRoot = getElRoot; exports.getElSeg = getElSeg; exports.getEntrySpanEnd = getEntrySpanEnd; exports.getEventClassNames = getEventClassNames; exports.getEventTargetViaRoot = getEventTargetViaRoot; exports.getIsRtlScrollbarOnLeft = getIsRtlScrollbarOnLeft; exports.getRectCenter = getRectCenter; exports.getRelevantEvents = getRelevantEvents; exports.getScrollGridClassNames = getScrollGridClassNames; exports.getScrollbarWidths = getScrollbarWidths; exports.getSectionClassNames = getSectionClassNames; exports.getSectionHasLiquidHeight = getSectionHasLiquidHeight; exports.getSegAnchorAttrs = getSegAnchorAttrs; exports.getSegMeta = getSegMeta; exports.getSlotClassNames = getSlotClassNames; exports.getStickyFooterScrollbar = getStickyFooterScrollbar; exports.getStickyHeaderDates = getStickyHeaderDates; exports.getUnequalProps = getUnequalProps; exports.getUniqueDomId = getUniqueDomId; exports.globalLocales = globalLocales; exports.globalPlugins = globalPlugins; exports.greatestDurationDenominator = greatestDurationDenominator; exports.groupIntersectingEntries = groupIntersectingEntries; exports.guid = guid; exports.hasBgRendering = hasBgRendering; exports.hasShrinkWidth = hasShrinkWidth; exports.identity = identity; exports.interactionSettingsStore = interactionSettingsStore; exports.interactionSettingsToStore = interactionSettingsToStore; exports.intersectRanges = intersectRanges; exports.intersectRects = intersectRects; exports.intersectSpans = intersectSpans; exports.isArraysEqual = isArraysEqual; exports.isColPropsEqual = isColPropsEqual; exports.isDateSelectionValid = isDateSelectionValid; exports.isDateSpansEqual = isDateSpansEqual; exports.isInt = isInt; exports.isInteractionValid = isInteractionValid; exports.isMultiDayRange = isMultiDayRange; exports.isPropsEqual = isPropsEqual; exports.isPropsValid = isPropsValid; exports.isValidDate = isValidDate; exports.joinSpans = joinSpans; exports.listenBySelector = listenBySelector; exports.mapHash = mapHash; exports.memoize = memoize; exports.memoizeArraylike = memoizeArraylike; exports.memoizeHashlike = memoizeHashlike; exports.memoizeObjArg = memoizeObjArg; exports.mergeEventStores = mergeEventStores; exports.multiplyDuration = multiplyDuration; exports.padStart = padStart; exports.parseBusinessHours = parseBusinessHours; exports.parseClassNames = parseClassNames; exports.parseDragMeta = parseDragMeta; exports.parseEventDef = parseEventDef; exports.parseFieldSpecs = parseFieldSpecs; exports.parseMarker = parse; exports.pointInsideRect = pointInsideRect; exports.preventContextMenu = preventContextMenu; exports.preventDefault = preventDefault; exports.preventSelection = preventSelection; exports.rangeContainsMarker = rangeContainsMarker; exports.rangeContainsRange = rangeContainsRange; exports.rangesEqual = rangesEqual; exports.rangesIntersect = rangesIntersect; exports.refineEventDef = refineEventDef; exports.refineProps = refineProps; exports.removeElement = removeElement; exports.removeExact = removeExact; exports.renderChunkContent = renderChunkContent; exports.renderFill = renderFill; exports.renderMicroColGroup = renderMicroColGroup; exports.renderScrollShim = renderScrollShim; exports.requestJson = requestJson; exports.sanitizeShrinkWidth = sanitizeShrinkWidth; exports.setElSeg = setElSeg; exports.setRef = setRef; exports.sliceEventStore = sliceEventStore; exports.sliceEvents = sliceEvents; exports.sortEventSegs = sortEventSegs; exports.startOfDay = startOfDay; exports.translateRect = translateRect; exports.triggerDateSelect = triggerDateSelect; exports.unpromisify = unpromisify; exports.version = version; exports.whenTransitionDone = whenTransitionDone; exports.wholeDivideDurations = wholeDivideDurations; Object.keys(vdom_cjs).forEach(function (k) { if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { enumerable: true, get: function get() { return vdom_cjs[k]; } }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsInRzbGliIiwicmVxdWlyZSIsInZkb21fY2pzIiwiRXZlbnRTb3VyY2VBcGkiLCJjb250ZXh0IiwiaW50ZXJuYWxFdmVudFNvdXJjZSIsInByb3RvdHlwZSIsInJlbW92ZSIsImRpc3BhdGNoIiwidHlwZSIsInNvdXJjZUlkIiwicmVmZXRjaCIsInNvdXJjZUlkcyIsImlzUmVmZXRjaCIsImdldCIsInB1YmxpY0lkIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIm1ldGEiLCJ1cmwiLCJmb3JtYXQiLCJyZW1vdmVFbGVtZW50IiwiZWwiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJlbGVtZW50Q2xvc2VzdCIsInNlbGVjdG9yIiwiY2xvc2VzdCIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50IiwiY29udGFpbnMiLCJlbGVtZW50TWF0Y2hlcyIsInBhcmVudEVsZW1lbnQiLCJub2RlVHlwZSIsIm1ldGhvZCIsIm1hdGNoZXMiLCJtYXRjaGVzU2VsZWN0b3IiLCJtc01hdGNoZXNTZWxlY3RvciIsImNhbGwiLCJmaW5kRWxlbWVudHMiLCJjb250YWluZXIiLCJjb250YWluZXJzIiwiSFRNTEVsZW1lbnQiLCJhbGxNYXRjaGVzIiwiaSIsImxlbmd0aCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJqIiwicHVzaCIsImZpbmREaXJlY3RDaGlsZHJlbiIsInBhcmVudCIsInBhcmVudHMiLCJjaGlsZE5vZGVzIiwiY2hpbGRyZW4iLCJjaGlsZE5vZGUiLCJQSVhFTF9QUk9QX1JFIiwiYXBwbHlTdHlsZSIsInByb3BzIiwicHJvcE5hbWUiLCJhcHBseVN0eWxlUHJvcCIsIm5hbWUiLCJ2YWwiLCJzdHlsZSIsInRlc3QiLCJnZXRFdmVudFRhcmdldFZpYVJvb3QiLCJldiIsIl9hIiwiX2IiLCJjb21wb3NlZFBhdGgiLCJ0YXJnZXQiLCJnZXRFbFJvb3QiLCJnZXRSb290Tm9kZSIsImd1aWQkMSIsImdldFVuaXF1ZURvbUlkIiwicHJldmVudERlZmF1bHQiLCJidWlsZERlbGVnYXRpb25IYW5kbGVyIiwiaGFuZGxlciIsIm1hdGNoZWRDaGlsZCIsImxpc3RlbkJ5U2VsZWN0b3IiLCJldmVudFR5cGUiLCJhdHRhY2hlZEhhbmRsZXIiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImxpc3RlblRvSG92ZXJCeVNlbGVjdG9yIiwib25Nb3VzZUVudGVyIiwib25Nb3VzZUxlYXZlIiwiY3VycmVudE1hdGNoZWRDaGlsZCIsIm1vdXNlT3ZlckV2IiwicmVhbE9uTW91c2VMZWF2ZV8xIiwibW91c2VMZWF2ZUV2IiwidHJhbnNpdGlvbkV2ZW50TmFtZXMiLCJ3aGVuVHJhbnNpdGlvbkRvbmUiLCJjYWxsYmFjayIsInJlYWxDYWxsYmFjayIsImZvckVhY2giLCJldmVudE5hbWUiLCJjcmVhdGVBcmlhQ2xpY2tBdHRycyIsIl9fYXNzaWduIiwib25DbGljayIsImNyZWF0ZUFyaWFLZXlib2FyZEF0dHJzIiwidGFiSW5kZXgiLCJvbktleURvd24iLCJrZXkiLCJndWlkTnVtYmVyIiwiZ3VpZCIsIlN0cmluZyIsImRpc2FibGVDdXJzb3IiLCJib2R5IiwiY2xhc3NMaXN0IiwiYWRkIiwiZW5hYmxlQ3Vyc29yIiwicHJldmVudFNlbGVjdGlvbiIsImFsbG93U2VsZWN0aW9uIiwicHJldmVudENvbnRleHRNZW51IiwiYWxsb3dDb250ZXh0TWVudSIsInBhcnNlRmllbGRTcGVjcyIsImlucHV0Iiwic3BlY3MiLCJ0b2tlbnMiLCJ0b2tlbiIsInNwbGl0IiwiQXJyYXkiLCJpc0FycmF5IiwiY2hhckF0IiwiZmllbGQiLCJzdWJzdHJpbmciLCJvcmRlciIsImZ1bmMiLCJjb21wYXJlQnlGaWVsZFNwZWNzIiwib2JqMCIsIm9iajEiLCJmaWVsZFNwZWNzIiwiY21wIiwiY29tcGFyZUJ5RmllbGRTcGVjIiwiZmllbGRTcGVjIiwiZmxleGlibGVDb21wYXJlIiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwicGFkU3RhcnQiLCJsZW4iLCJzIiwic3Vic3RyIiwiZm9ybWF0V2l0aE9yZGluYWxzIiwiZm9ybWF0dGVyIiwiYXJncyIsImZhbGxiYWNrVGV4dCIsImFwcGx5IiwicmVkdWNlIiwic3RyIiwiYXJnIiwiaW5kZXgiLCJyZXBsYWNlIiwiY29tcGFyZU51bWJlcnMiLCJpc0ludCIsIm4iLCJjb21wdXRlU21hbGxlc3RDZWxsV2lkdGgiLCJjZWxsRWwiLCJhbGxXaWR0aEVsIiwicXVlcnlTZWxlY3RvciIsImNvbnRlbnRXaWR0aEVsIiwiRXJyb3IiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ3aWR0aCIsIkRBWV9JRFMiLCJhZGRXZWVrcyIsIm0iLCJkYXRlVG9VdGNBcnJheSIsImFycmF5VG9VdGNEYXRlIiwiYWRkRGF5cyIsImFkZE1zIiwiZGlmZldlZWtzIiwibTAiLCJtMSIsImRpZmZEYXlzIiwidmFsdWVPZiIsImRpZmZIb3VycyIsImRpZmZNaW51dGVzIiwiZGlmZlNlY29uZHMiLCJkaWZmRGF5QW5kVGltZSIsIm0wZGF5Iiwic3RhcnRPZkRheSIsIm0xZGF5IiwieWVhcnMiLCJtb250aHMiLCJkYXlzIiwiTWF0aCIsInJvdW5kIiwibWlsbGlzZWNvbmRzIiwiZGlmZldob2xlV2Vla3MiLCJkIiwiZGlmZldob2xlRGF5cyIsInRpbWVBc01zIiwiZ2V0VVRDRnVsbFllYXIiLCJnZXRVVENNb250aCIsImdldFVUQ0RhdGUiLCJzdGFydE9mSG91ciIsImdldFVUQ0hvdXJzIiwic3RhcnRPZk1pbnV0ZSIsImdldFVUQ01pbnV0ZXMiLCJzdGFydE9mU2Vjb25kIiwiZ2V0VVRDU2Vjb25kcyIsIndlZWtPZlllYXIiLCJtYXJrZXIiLCJkb3ciLCJkb3kiLCJ5IiwidyIsIndlZWtPZkdpdmVuWWVhciIsIm5leHRXIiwibWluIiwieWVhciIsImZpcnN0V2Vla1N0YXJ0IiwiZmlyc3RXZWVrT2Zmc2V0IiwiZGF5U3RhcnQiLCJmbG9vciIsImZ3ZCIsImZ3ZGx3IiwiZ2V0VVRDRGF5IiwiZGF0ZVRvTG9jYWxBcnJheSIsImRhdGUiLCJnZXRGdWxsWWVhciIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJnZXRNaWxsaXNlY29uZHMiLCJhcnJheVRvTG9jYWxEYXRlIiwiRGF0ZSIsImdldFVUQ01pbGxpc2Vjb25kcyIsImNvbmNhdCIsIlVUQyIsImlzVmFsaWREYXRlIiwiaXNOYU4iLCJjcmVhdGVFdmVudEluc3RhbmNlIiwiZGVmSWQiLCJyYW5nZSIsImZvcmNlZFN0YXJ0VHpvIiwiZm9yY2VkRW5kVHpvIiwiaW5zdGFuY2VJZCIsImhhc093blByb3BlcnR5IiwibWVyZ2VQcm9wcyIsInByb3BPYmpzIiwiY29tcGxleFByb3BzTWFwIiwiZGVzdCIsIm5hbWVfMSIsImNvbXBsZXhPYmpzIiwidW5zaGlmdCIsInVuZGVmaW5lZCIsIm5hbWVfMiIsImZpbHRlckhhc2giLCJoYXNoIiwiZmlsdGVyZWQiLCJtYXBIYXNoIiwibmV3SGFzaCIsImFycmF5VG9IYXNoIiwiX2kiLCJhXzEiLCJpdGVtIiwiYnVpbGRIYXNoRnJvbUFycmF5IiwidHVwbGUiLCJoYXNoVmFsdWVzVG9BcnJheSIsIm9iaiIsImlzUHJvcHNFcXVhbCIsImdldFVuZXF1YWxQcm9wcyIsImtleXMiLCJjb21wYXJlT2JqcyIsIm9sZFByb3BzIiwibmV3UHJvcHMiLCJlcXVhbGl0eUZ1bmNzIiwiaXNPYmpWYWxzRXF1YWwiLCJ2YWwwIiwidmFsMSIsImNvbXBhcmF0b3IiLCJjb2xsZWN0RnJvbUhhc2giLCJzdGFydEluZGV4IiwiZW5kSW5kZXgiLCJzdGVwIiwicmVzIiwicGFyc2VSZWN1cnJpbmciLCJyZWZpbmVkIiwiZGVmYXVsdEFsbERheSIsImRhdGVFbnYiLCJyZWN1cnJpbmdUeXBlcyIsInBhcnNlZCIsInBhcnNlIiwiYWxsRGF5IiwiYWxsRGF5R3Vlc3MiLCJkdXJhdGlvbiIsInR5cGVEYXRhIiwidHlwZUlkIiwiZXhwYW5kUmVjdXJyaW5nIiwiZXZlbnRTdG9yZSIsImZyYW1pbmdSYW5nZSIsInBsdWdpbkhvb2tzIiwib3B0aW9ucyIsImRlZnMiLCJpbnN0YW5jZXMiLCJpbnN0YW5jZSIsInJlY3VycmluZ0RlZiIsImRlZiIsImRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uIiwiZGVmYXVsdFRpbWVkRXZlbnREdXJhdGlvbiIsInN0YXJ0cyIsImV4cGFuZFJlY3VycmluZ1JhbmdlcyIsInN0YXJ0c18xIiwic3RhcnQiLCJlbmQiLCJldmVudERlZiIsInR5cGVEZWYiLCJtYXJrZXJzIiwiZXhwYW5kIiwic3VidHJhY3QiLCJtYXAiLCJJTlRFUk5BTF9VTklUUyIsIlBBUlNFX1JFIiwiY3JlYXRlRHVyYXRpb24iLCJ1bml0IiwicGFyc2VTdHJpbmciLCJwYXJzZU9iamVjdCIsImV4ZWMiLCJzaWduIiwicGFyc2VJbnQiLCJtb250aCIsImRheSIsImhvdXJzIiwiaG91ciIsIm1pbnV0ZXMiLCJtaW51dGUiLCJzZWNvbmRzIiwic2Vjb25kIiwibWlsbGlzZWNvbmQiLCJtcyIsIndlZWtzIiwid2VlayIsInNwZWNpZmllZFdlZWtzIiwiZHVyYXRpb25zRXF1YWwiLCJkMCIsImQxIiwiYXNDbGVhbkRheXMiLCJkdXIiLCJhZGREdXJhdGlvbnMiLCJzdWJ0cmFjdER1cmF0aW9ucyIsIm11bHRpcGx5RHVyYXRpb24iLCJhc1JvdWdoWWVhcnMiLCJhc1JvdWdoRGF5cyIsImFzUm91Z2hNb250aHMiLCJhc1JvdWdoTXMiLCJhc1JvdWdoTWludXRlcyIsImFzUm91Z2hTZWNvbmRzIiwid2hvbGVEaXZpZGVEdXJhdGlvbnMiLCJudW1lcmF0b3IiLCJkZW5vbWluYXRvciIsImxvY2FsUmVzIiwiZ3JlYXRlc3REdXJhdGlvbkRlbm9taW5hdG9yIiwiYnVpbGRJc29TdHJpbmciLCJ0aW1lWm9uZU9mZnNldCIsInN0cmlwWmVyb1RpbWUiLCJ0b0lTT1N0cmluZyIsImZvcm1hdFRpbWVab25lT2Zmc2V0IiwiZm9ybWF0RGF5U3RyaW5nIiwiZm9ybWF0SXNvVGltZVN0cmluZyIsImRvSXNvIiwiYWJzIiwibWlucyIsInJlbW92ZUV4YWN0IiwiYXJyYXkiLCJleGFjdFZhbCIsInJlbW92ZUNudCIsInNwbGljZSIsImlzQXJyYXlzRXF1YWwiLCJhMCIsImExIiwiZXF1YWxpdHlGdW5jIiwibWVtb2l6ZSIsIndvcmtlckZ1bmMiLCJyZXNFcXVhbGl0eSIsInRlYXJkb3duRnVuYyIsImN1cnJlbnRBcmdzIiwiY3VycmVudFJlcyIsIm5ld0FyZ3MiLCJhcmd1bWVudHMiLCJtZW1vaXplT2JqQXJnIiwiX3RoaXMiLCJjdXJyZW50QXJnIiwibmV3QXJnIiwibWVtb2l6ZUFycmF5bGlrZSIsImN1cnJlbnRBcmdTZXRzIiwiY3VycmVudFJlc3VsdHMiLCJuZXdBcmdTZXRzIiwiY3VycmVudExlbiIsIm5ld0xlbiIsIm1lbW9pemVIYXNobGlrZSIsImN1cnJlbnRBcmdIYXNoIiwiY3VycmVudFJlc0hhc2giLCJuZXdBcmdIYXNoIiwibmV3UmVzSGFzaCIsIkVYVEVOREVEX1NFVFRJTkdTX0FORF9TRVZFUklUSUVTIiwic2VwYXJhdG9yIiwib21pdFplcm9NaW51dGUiLCJtZXJpZGllbSIsIm9taXRDb21tYXMiLCJTVEFOREFSRF9EQVRFX1BST1BfU0VWRVJJVElFUyIsInRpbWVab25lTmFtZSIsImVyYSIsIndlZWtkYXkiLCJNRVJJRElFTV9SRSIsIkNPTU1BX1JFIiwiTVVMVElfU1BBQ0VfUkUiLCJMVFJfUkUiLCJVVENfUkUiLCJOYXRpdmVGb3JtYXR0ZXIiLCJmb3JtYXRTZXR0aW5ncyIsInN0YW5kYXJkRGF0ZVByb3BzIiwiZXh0ZW5kZWRTZXR0aW5ncyIsInNldmVyaXR5IiwibWF4IiwiYnVpbGRGb3JtYXR0aW5nRnVuYyIsImZvcm1hdFJhbmdlIiwiYmV0dGVyRGVmYXVsdFNlcGFyYXRvciIsImRpZmZTZXZlcml0eSIsImNvbXB1dGVNYXJrZXJEaWZmU2V2ZXJpdHkiLCJjYWxlbmRhclN5c3RlbSIsImJpZ2dlc3RVbml0Rm9yUGFydGlhbCIsImZ1bGwwIiwiZnVsbDEiLCJwYXJ0aWFsRGF0ZVByb3BzIiwiY29tcHV0ZVBhcnRpYWxGb3JtYXR0aW5nT3B0aW9ucyIsInBhcnRpYWxGb3JtYXR0aW5nRnVuYyIsInBhcnRpYWwwIiwicGFydGlhbDEiLCJpbnNlcnRpb24iLCJmaW5kQ29tbW9uSW5zZXJ0aW9uIiwiZGVmYXVsdFNlcGFyYXRvciIsImJlZm9yZSIsImFmdGVyIiwiZ2V0TGFyZ2VzdFVuaXQiLCJzdGFuZGFyZERhdGVQcm9wQ250IiwiZm9ybWF0V2Vla051bWJlciIsImNvbXB1dGVXZWVrTnVtYmVyIiwid2Vla1RleHQiLCJ3ZWVrVGV4dExvbmciLCJsb2NhbGUiLCJidWlsZE5hdGl2ZUZvcm1hdHRpbmdGdW5jIiwic2FuaXRpemVTZXR0aW5ncyIsInRpbWVab25lIiwibm9ybWFsRm9ybWF0IiwiSW50bCIsIkRhdGVUaW1lRm9ybWF0IiwiY29kZXMiLCJ6ZXJvRm9ybWF0IiwiemVyb1Byb3BzIiwicG9zdFByb2Nlc3MiLCJpbmplY3RUem9TdHIiLCJ0cmltIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJ0em9TdHIiLCJyZXBsYWNlZCIsIm51bSIsImRpc3BsYXkiLCJwYXJ0cyIsInNpbXBsZU51bWJlckZvcm1hdCIsImRpcmVjdGlvbiIsInJldmVyc2UiLCJqb2luIiwiY2EiLCJnZXRNYXJrZXJZZWFyIiwiZ2V0TWFya2VyTW9udGgiLCJnZXRNYXJrZXJEYXkiLCJiaWdnZXN0VW5pdCIsInBhcnRpYWxPcHRpb25zIiwiaTAiLCJmb3VuZDAiLCJpbmRleE9mIiwiYmVmb3JlMCIsImFmdGVyMCIsImkxIiwiZm91bmQxIiwiYmVmb3JlMSIsImFmdGVyMSIsImV4cGFuZFpvbmVkTWFya2VyIiwiZGF0ZUluZm8iLCJtYXJrZXJUb0FycmF5IiwiY3JlYXRlVmVyYm9zZUZvcm1hdHRpbmdBcmciLCJzdGFydEluZm8iLCJlbmRJbmZvIiwibG9jYWxlQ29kZXMiLCJDbWRGb3JtYXR0ZXIiLCJjbWRTdHIiLCJjbWRGb3JtYXR0ZXIiLCJGdW5jRm9ybWF0dGVyIiwiY3JlYXRlRm9ybWF0dGVyIiwiQkFTRV9PUFRJT05fUkVGSU5FUlMiLCJuYXZMaW5rRGF5Q2xpY2siLCJpZGVudGl0eSIsIm5hdkxpbmtXZWVrQ2xpY2siLCJib290c3RyYXBGb250QXdlc29tZSIsImJ1dHRvbkljb25zIiwiY3VzdG9tQnV0dG9ucyIsIm5leHREYXlUaHJlc2hvbGQiLCJzY3JvbGxUaW1lIiwic2Nyb2xsVGltZVJlc2V0IiwiQm9vbGVhbiIsInNsb3RNaW5UaW1lIiwic2xvdE1heFRpbWUiLCJkYXlQb3BvdmVyRm9ybWF0Iiwic2xvdER1cmF0aW9uIiwic25hcER1cmF0aW9uIiwiaGVhZGVyVG9vbGJhciIsImZvb3RlclRvb2xiYXIiLCJkZWZhdWx0UmFuZ2VTZXBhcmF0b3IiLCJ0aXRsZVJhbmdlU2VwYXJhdG9yIiwiZm9yY2VFdmVudER1cmF0aW9uIiwiZGF5SGVhZGVycyIsImRheUhlYWRlckZvcm1hdCIsImRheUhlYWRlckNsYXNzTmFtZXMiLCJkYXlIZWFkZXJDb250ZW50IiwiZGF5SGVhZGVyRGlkTW91bnQiLCJkYXlIZWFkZXJXaWxsVW5tb3VudCIsImRheUNlbGxDbGFzc05hbWVzIiwiZGF5Q2VsbENvbnRlbnQiLCJkYXlDZWxsRGlkTW91bnQiLCJkYXlDZWxsV2lsbFVubW91bnQiLCJpbml0aWFsVmlldyIsImFzcGVjdFJhdGlvIiwiTnVtYmVyIiwid2Vla2VuZHMiLCJ3ZWVrTnVtYmVyQ2FsY3VsYXRpb24iLCJ3ZWVrTnVtYmVycyIsIndlZWtOdW1iZXJDbGFzc05hbWVzIiwid2Vla051bWJlckNvbnRlbnQiLCJ3ZWVrTnVtYmVyRGlkTW91bnQiLCJ3ZWVrTnVtYmVyV2lsbFVubW91bnQiLCJlZGl0YWJsZSIsInZpZXdDbGFzc05hbWVzIiwidmlld0RpZE1vdW50Iiwidmlld1dpbGxVbm1vdW50Iiwibm93SW5kaWNhdG9yIiwibm93SW5kaWNhdG9yQ2xhc3NOYW1lcyIsIm5vd0luZGljYXRvckNvbnRlbnQiLCJub3dJbmRpY2F0b3JEaWRNb3VudCIsIm5vd0luZGljYXRvcldpbGxVbm1vdW50Iiwic2hvd05vbkN1cnJlbnREYXRlcyIsImxhenlGZXRjaGluZyIsInN0YXJ0UGFyYW0iLCJlbmRQYXJhbSIsInRpbWVab25lUGFyYW0iLCJsb2NhbGVzIiwidGhlbWVTeXN0ZW0iLCJkcmFnUmV2ZXJ0RHVyYXRpb24iLCJkcmFnU2Nyb2xsIiwiYWxsRGF5TWFpbnRhaW5EdXJhdGlvbiIsInVuc2VsZWN0QXV0byIsImRyb3BBY2NlcHQiLCJldmVudE9yZGVyIiwiZXZlbnRPcmRlclN0cmljdCIsImhhbmRsZVdpbmRvd1Jlc2l6ZSIsIndpbmRvd1Jlc2l6ZURlbGF5IiwibG9uZ1ByZXNzRGVsYXkiLCJldmVudERyYWdNaW5EaXN0YW5jZSIsImV4cGFuZFJvd3MiLCJoZWlnaHQiLCJjb250ZW50SGVpZ2h0Iiwid2Vla051bWJlckZvcm1hdCIsImV2ZW50UmVzaXphYmxlRnJvbVN0YXJ0IiwiZGlzcGxheUV2ZW50VGltZSIsImRpc3BsYXlFdmVudEVuZCIsInByb2dyZXNzaXZlRXZlbnRSZW5kZXJpbmciLCJidXNpbmVzc0hvdXJzIiwiaW5pdGlhbERhdGUiLCJub3ciLCJldmVudERhdGFUcmFuc2Zvcm0iLCJzdGlja3lIZWFkZXJEYXRlcyIsInN0aWNreUZvb3RlclNjcm9sbGJhciIsInZpZXdIZWlnaHQiLCJldmVudFNvdXJjZUZhaWx1cmUiLCJldmVudFNvdXJjZVN1Y2Nlc3MiLCJldmVudERpc3BsYXkiLCJldmVudFN0YXJ0RWRpdGFibGUiLCJldmVudER1cmF0aW9uRWRpdGFibGUiLCJldmVudE92ZXJsYXAiLCJldmVudENvbnN0cmFpbnQiLCJldmVudEFsbG93IiwiZXZlbnRCYWNrZ3JvdW5kQ29sb3IiLCJldmVudEJvcmRlckNvbG9yIiwiZXZlbnRUZXh0Q29sb3IiLCJldmVudENvbG9yIiwiZXZlbnRDbGFzc05hbWVzIiwiZXZlbnRDb250ZW50IiwiZXZlbnREaWRNb3VudCIsImV2ZW50V2lsbFVubW91bnQiLCJzZWxlY3RDb25zdHJhaW50Iiwic2VsZWN0T3ZlcmxhcCIsInNlbGVjdEFsbG93IiwiZHJvcHBhYmxlIiwidW5zZWxlY3RDYW5jZWwiLCJzbG90TGFiZWxGb3JtYXQiLCJzbG90TGFuZUNsYXNzTmFtZXMiLCJzbG90TGFuZUNvbnRlbnQiLCJzbG90TGFuZURpZE1vdW50Iiwic2xvdExhbmVXaWxsVW5tb3VudCIsInNsb3RMYWJlbENsYXNzTmFtZXMiLCJzbG90TGFiZWxDb250ZW50Iiwic2xvdExhYmVsRGlkTW91bnQiLCJzbG90TGFiZWxXaWxsVW5tb3VudCIsImRheU1heEV2ZW50cyIsImRheU1heEV2ZW50Um93cyIsImRheU1pbldpZHRoIiwic2xvdExhYmVsSW50ZXJ2YWwiLCJhbGxEYXlUZXh0IiwiYWxsRGF5Q2xhc3NOYW1lcyIsImFsbERheUNvbnRlbnQiLCJhbGxEYXlEaWRNb3VudCIsImFsbERheVdpbGxVbm1vdW50Iiwic2xvdE1pbldpZHRoIiwibmF2TGlua3MiLCJldmVudFRpbWVGb3JtYXQiLCJyZXJlbmRlckRlbGF5IiwibW9yZUxpbmtUZXh0IiwibW9yZUxpbmtIaW50Iiwic2VsZWN0TWluRGlzdGFuY2UiLCJzZWxlY3RhYmxlIiwic2VsZWN0TG9uZ1ByZXNzRGVsYXkiLCJldmVudExvbmdQcmVzc0RlbGF5Iiwic2VsZWN0TWlycm9yIiwiZXZlbnRNYXhTdGFjayIsImV2ZW50TWluSGVpZ2h0IiwiZXZlbnRNaW5XaWR0aCIsImV2ZW50U2hvcnRIZWlnaHQiLCJzbG90RXZlbnRPdmVybGFwIiwicGx1Z2lucyIsImZpcnN0RGF5IiwiZGF5Q291bnQiLCJkYXRlQWxpZ25tZW50IiwiZGF0ZUluY3JlbWVudCIsImhpZGRlbkRheXMiLCJtb250aE1vZGUiLCJmaXhlZFdlZWtDb3VudCIsInZhbGlkUmFuZ2UiLCJ2aXNpYmxlUmFuZ2UiLCJ0aXRsZUZvcm1hdCIsImV2ZW50SW50ZXJhY3RpdmUiLCJub0V2ZW50c1RleHQiLCJ2aWV3SGludCIsIm5hdkxpbmtIaW50IiwiY2xvc2VIaW50IiwidGltZUhpbnQiLCJldmVudEhpbnQiLCJtb3JlTGlua0NsaWNrIiwibW9yZUxpbmtDbGFzc05hbWVzIiwibW9yZUxpbmtDb250ZW50IiwibW9yZUxpbmtEaWRNb3VudCIsIm1vcmVMaW5rV2lsbFVubW91bnQiLCJCQVNFX09QVElPTl9ERUZBVUxUUyIsImNlbnRlciIsIkNBTEVOREFSX0xJU1RFTkVSX1JFRklORVJTIiwiZGF0ZXNTZXQiLCJldmVudHNTZXQiLCJldmVudEFkZCIsImV2ZW50Q2hhbmdlIiwiZXZlbnRSZW1vdmUiLCJ3aW5kb3dSZXNpemUiLCJldmVudENsaWNrIiwiZXZlbnRNb3VzZUVudGVyIiwiZXZlbnRNb3VzZUxlYXZlIiwic2VsZWN0IiwidW5zZWxlY3QiLCJsb2FkaW5nIiwiX3VubW91bnQiLCJfYmVmb3JlcHJpbnQiLCJfYWZ0ZXJwcmludCIsIl9ub0V2ZW50RHJvcCIsIl9ub0V2ZW50UmVzaXplIiwiX3Jlc2l6ZSIsIl9zY3JvbGxSZXF1ZXN0IiwiQ0FMRU5EQVJfT1BUSU9OX1JFRklORVJTIiwiYnV0dG9uVGV4dCIsImJ1dHRvbkhpbnRzIiwidmlld3MiLCJpbml0aWFsRXZlbnRzIiwiZXZlbnRzIiwiZXZlbnRTb3VyY2VzIiwiQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlMiLCJpc01heWJlT2JqZWN0c0VxdWFsIiwiVklFV19PUFRJT05fUkVGSU5FUlMiLCJjb21wb25lbnQiLCJidXR0b25UZXh0S2V5IiwiZGF0ZVByb2ZpbGVHZW5lcmF0b3JDbGFzcyIsInVzZXNNaW5NYXhUaW1lIiwiY2xhc3NOYW1lcyIsImNvbnRlbnQiLCJkaWRNb3VudCIsIndpbGxVbm1vdW50IiwibWVyZ2VSYXdPcHRpb25zIiwib3B0aW9uU2V0cyIsInJlZmluZVByb3BzIiwicmVmaW5lcnMiLCJleHRyYSIsInJhdyIsInBhcnNlRXZlbnRzIiwicmF3RXZlbnRzIiwiZXZlbnRTb3VyY2UiLCJhbGxvd09wZW5SYW5nZSIsImNyZWF0ZUVtcHR5RXZlbnRTdG9yZSIsImV2ZW50UmVmaW5lcnMiLCJidWlsZEV2ZW50UmVmaW5lcnMiLCJyYXdFdmVudHNfMSIsInJhd0V2ZW50IiwicGFyc2VFdmVudCIsImV2ZW50VHVwbGVUb1N0b3JlIiwiZ2V0UmVsZXZhbnRFdmVudHMiLCJkZWZfMSIsIm5ld1N0b3JlIiwiZmlsdGVyRXZlbnRTdG9yZURlZnMiLCJsb29rRGVmIiwiaXNFdmVudERlZnNHcm91cGVkIiwiZGVmMCIsImRlZjEiLCJncm91cElkIiwibWVyZ2VFdmVudFN0b3JlcyIsInN0b3JlMCIsInN0b3JlMSIsImZpbHRlckZ1bmMiLCJleGNsdWRlU3ViRXZlbnRTdG9yZSIsIm1hc3RlciIsInN1YiIsImZpbHRlcmVkRGVmcyIsImZpbHRlcmVkSW5zdGFuY2VzIiwibm9ybWFsaXplQ29uc3RyYWludCIsInBhcnNlQ2xhc3NOYW1lcyIsIkVWRU5UX1VJX1JFRklORVJTIiwic3RhcnRFZGl0YWJsZSIsImR1cmF0aW9uRWRpdGFibGUiLCJjb25zdHJhaW50Iiwib3ZlcmxhcCIsImFsbG93IiwiY2xhc3NOYW1lIiwiY29sb3IiLCJiYWNrZ3JvdW5kQ29sb3IiLCJib3JkZXJDb2xvciIsInRleHRDb2xvciIsIkVNUFRZX0VWRU5UX1VJIiwiY29uc3RyYWludHMiLCJhbGxvd3MiLCJjcmVhdGVFdmVudFVpIiwiY29tYmluZUV2ZW50VWlzIiwidWlzIiwiY29tYmluZVR3b0V2ZW50VWlzIiwiaXRlbTAiLCJpdGVtMSIsIkVWRU5UX05PTl9EQVRFX1JFRklORVJTIiwiaWQiLCJ0aXRsZSIsImludGVyYWN0aXZlIiwiRVZFTlRfREFURV9SRUZJTkVSUyIsIkVWRU5UX1JFRklORVJTIiwiZXh0ZW5kZWRQcm9wcyIsInJlZmluZUV2ZW50RGVmIiwiY29tcHV0ZUlzRGVmYXVsdEFsbERheSIsInJlY3VycmluZ1JlcyIsInBhcnNlRXZlbnREZWYiLCJzaW5nbGVSZXMiLCJwYXJzZVNpbmdsZSIsImhhc0VuZCIsInVpIiwiZXZlbnREZWZNZW1iZXJBZGRlcnMiLCJtZW1iZXJBZGRlciIsImZyZWV6ZSIsInN0YXJ0TWV0YSIsInN0YXJ0TWFya2VyIiwiZW5kTWV0YSIsImVuZE1hcmtlciIsInN0YXJ0SW5wdXQiLCJjcmVhdGVNYXJrZXJNZXRhIiwiaXNUaW1lVW5zcGVjaWZpZWQiLCJmb3JjZWRUem8iLCJjb21wdXRlQWxpZ25lZERheVJhbmdlIiwidGltZWRSYW5nZSIsImRheUNudCIsImNvbXB1dGVWaXNpYmxlRGF5UmFuZ2UiLCJzdGFydERheSIsImVuZERheSIsImVuZFRpbWVNUyIsImlzTXVsdGlEYXlSYW5nZSIsImRpZmZEYXRlcyIsImRhdGUwIiwiZGF0ZTEiLCJsYXJnZVVuaXQiLCJkaWZmV2hvbGVZZWFycyIsImRpZmZXaG9sZU1vbnRocyIsInBhcnNlUmFuZ2UiLCJjcmVhdGVNYXJrZXIiLCJpbnZlcnRSYW5nZXMiLCJyYW5nZXMiLCJjb25zdHJhaW50UmFuZ2UiLCJpbnZlcnRlZFJhbmdlcyIsImRhdGVSYW5nZSIsInNvcnQiLCJjb21wYXJlUmFuZ2VzIiwicmFuZ2UwIiwicmFuZ2UxIiwiaW50ZXJzZWN0UmFuZ2VzIiwibmV3UmFuZ2UiLCJyYW5nZXNFcXVhbCIsInJhbmdlc0ludGVyc2VjdCIsInJhbmdlQ29udGFpbnNSYW5nZSIsIm91dGVyUmFuZ2UiLCJpbm5lclJhbmdlIiwicmFuZ2VDb250YWluc01hcmtlciIsImNvbnN0cmFpbk1hcmtlclRvUmFuZ2UiLCJzbGljZUV2ZW50U3RvcmUiLCJldmVudFVpQmFzZXMiLCJpbnZlcnNlQmdCeUdyb3VwSWQiLCJpbnZlcnNlQmdCeURlZklkIiwiZGVmQnlHcm91cElkIiwiYmdSYW5nZXMiLCJmZ1JhbmdlcyIsImV2ZW50VWlzIiwiY29tcGlsZUV2ZW50VWlzIiwib3JpZ1JhbmdlIiwibm9ybWFsUmFuZ2UiLCJzbGljZWRSYW5nZSIsImlzU3RhcnQiLCJpc0VuZCIsImludmVydGVkUmFuZ2VzXzEiLCJpbnZlcnRlZFJhbmdlIiwiaW52ZXJ0ZWRSYW5nZXNfMiIsImJnIiwiZmciLCJoYXNCZ1JlbmRlcmluZyIsInNldEVsU2VnIiwic2VnIiwiZmNTZWciLCJnZXRFbFNlZyIsImV2ZW50RGVmcyIsImNvbXBpbGVFdmVudFVpIiwic29ydEV2ZW50U2VncyIsInNlZ3MiLCJldmVudE9yZGVyU3BlY3MiLCJvYmpzIiwiYnVpbGRTZWdDb21wYXJlT2JqIiwiYyIsIl9zZWciLCJldmVudFJhbmdlIiwiY29tcHV0ZVNlZ0RyYWdnYWJsZSIsInRyYW5zZm9ybWVycyIsImlzRHJhZ2dhYmxlVHJhbnNmb3JtZXJzIiwidHJhbnNmb3JtZXJzXzEiLCJ0cmFuc2Zvcm1lciIsImNvbXB1dGVTZWdTdGFydFJlc2l6YWJsZSIsImNvbXB1dGVTZWdFbmRSZXNpemFibGUiLCJidWlsZFNlZ1RpbWVUZXh0IiwidGltZUZvcm1hdCIsImRlZmF1bHREaXNwbGF5RXZlbnRUaW1lIiwiZGVmYXVsdERpc3BsYXlFdmVudEVuZCIsInN0YXJ0T3ZlcnJpZGUiLCJlbmRPdmVycmlkZSIsImV2ZW50SW5zdGFuY2UiLCJ3aG9sZUV2ZW50U3RhcnQiLCJ3aG9sZUV2ZW50RW5kIiwic2VnU3RhcnQiLCJzZWdFbmQiLCJpc1N0YXJ0RGF5IiwiaXNFbmREYXkiLCJnZXRTZWdNZXRhIiwidG9kYXlSYW5nZSIsIm5vd0RhdGUiLCJzZWdSYW5nZSIsImlzUGFzdCIsImlzRnV0dXJlIiwiaXNUb2RheSIsImdldEV2ZW50Q2xhc3NOYW1lcyIsImlzTWlycm9yIiwiaXNEcmFnZ2FibGUiLCJpc1N0YXJ0UmVzaXphYmxlIiwiaXNFbmRSZXNpemFibGUiLCJpc0RyYWdnaW5nIiwiaXNSZXNpemluZyIsImlzU2VsZWN0ZWQiLCJidWlsZEV2ZW50UmFuZ2VLZXkiLCJnZXRTZWdBbmNob3JBdHRycyIsImhyZWYiLCJlbWl0dGVyIiwiaGFzSGFuZGxlcnMiLCJ0cmlnZ2VyIiwiZXZlbnQiLCJFdmVudEFwaSIsImpzRXZlbnQiLCJ2aWV3Iiwidmlld0FwaSIsIlNUQU5EQVJEX1BST1BTIiwicGFyc2VEYXRlU3BhbiIsImRlZmF1bHREdXJhdGlvbiIsInNwYW4iLCJwYXJzZU9wZW5EYXRlU3BhbiIsInN0YW5kYXJkUHJvcHMiLCJpc0RhdGVTcGFuc0VxdWFsIiwic3BhbjAiLCJzcGFuMSIsImlzU3BhblByb3BzRXF1YWwiLCJidWlsZERhdGVTcGFuQXBpIiwiYnVpbGRSYW5nZUFwaSIsImJ1aWxkUmFuZ2VBcGlXaXRoVGltZVpvbmUiLCJvbWl0VGltZSIsInRvRGF0ZSIsInN0YXJ0U3RyIiwiZm9ybWF0SXNvIiwiZW5kU3RyIiwiZmFicmljYXRlRXZlbnRSYW5nZSIsImRhdGVTcGFuIiwidHJpZ2dlckRhdGVTZWxlY3QiLCJzZWxlY3Rpb24iLCJwZXYiLCJidWlsZERhdGVTcGFuQXBpV2l0aENvbnRleHQiLCJvcmlnRXZlbnQiLCJjYWxlbmRhckFwaSIsInRyaWdnZXJEYXRlVW5zZWxlY3QiLCJkYXRlU3BhblRyYW5zZm9ybXMiLCJ0cmFuc2Zvcm0iLCJnZXREZWZhdWx0RXZlbnRFbmQiLCJhcHBseU11dGF0aW9uVG9FdmVudFN0b3JlIiwiZXZlbnRDb25maWdCYXNlIiwibXV0YXRpb24iLCJldmVudENvbmZpZ3MiLCJhcHBseU11dGF0aW9uVG9FdmVudERlZiIsImFwcGx5TXV0YXRpb25Ub0V2ZW50SW5zdGFuY2UiLCJldmVudENvbmZpZyIsInN0YXJ0RGVsdGEiLCJlbmREZWx0YSIsImNvcHkiLCJldmVudERlZk11dGF0aW9uQXBwbGllcnMiLCJhcHBsaWVyIiwiZm9yY2VBbGxEYXkiLCJjbGVhckVuZCIsImRhdGVzRGVsdGEiLCJWaWV3QXBpIiwiZ2V0Q3VycmVudERhdGEiLCJ2aWV3VGl0bGUiLCJkYXRlUHJvZmlsZSIsImFjdGl2ZVJhbmdlIiwiY3VycmVudFJhbmdlIiwiZ2V0T3B0aW9uIiwiRVZFTlRfU09VUkNFX1JFRklORVJTIiwic3VjY2VzcyIsImZhaWx1cmUiLCJwYXJzZUV2ZW50U291cmNlIiwiYnVpbGRFdmVudFNvdXJjZVJlZmluZXJzIiwicmF3T2JqIiwibWV0YVJlcyIsImJ1aWxkRXZlbnRTb3VyY2VNZXRhIiwiX3JhdyIsImlzRmV0Y2hpbmciLCJsYXRlc3RGZXRjaElkIiwiZmV0Y2hSYW5nZSIsInNvdXJjZURlZklkIiwiZXZlbnRTb3VyY2VSZWZpbmVycyIsImV2ZW50U291cmNlRGVmcyIsInBhcnNlTWV0YSIsInJlZHVjZUN1cnJlbnREYXRlIiwiY3VycmVudERhdGUiLCJhY3Rpb24iLCJkYXRlTWFya2VyIiwiZ2V0SW5pdGlhbERhdGUiLCJpbml0aWFsRGF0ZUlucHV0IiwiZ2V0Tm93Iiwibm93SW5wdXQiLCJjcmVhdGVOb3dNYXJrZXIiLCJDYWxlbmRhckFwaSIsImN1cnJlbnREYXRhTWFuYWdlciIsImJhdGNoUmVuZGVyaW5nIiwidXBkYXRlU2l6ZSIsInNldE9wdGlvbiIsIm9wdGlvbk5hbWUiLCJyYXdPcHRpb25WYWx1ZSIsImN1cnJlbnRDYWxlbmRhck9wdGlvbnNJbnB1dCIsImdldEF2YWlsYWJsZUxvY2FsZUNvZGVzIiwiYXZhaWxhYmxlUmF3TG9jYWxlcyIsIm9uIiwiaGFuZGxlck5hbWUiLCJjdXJyZW50Q2FsZW5kYXJPcHRpb25zUmVmaW5lcnMiLCJjb25zb2xlIiwid2FybiIsIm9mZiIsIl9fc3ByZWFkQXJyYXkiLCJjaGFuZ2VWaWV3Iiwidmlld1R5cGUiLCJkYXRlT3JSYW5nZSIsInpvb21UbyIsInN0YXRlIiwic3BlYyIsInZpZXdTcGVjcyIsImdldFVuaXRWaWV3U3BlYyIsInRvb2xiYXJDb25maWciLCJ2aWV3VHlwZXMiLCJoZWFkZXIiLCJ2aWV3c1dpdGhCdXR0b25zIiwiZm9vdGVyIiwic2luZ2xlVW5pdCIsInByZXYiLCJuZXh0IiwicHJldlllYXIiLCJhZGRZZWFycyIsIm5leHRZZWFyIiwidG9kYXkiLCJjYWxlbmRhck9wdGlvbnMiLCJnb3RvRGF0ZSIsInpvbmVkRGF0ZUlucHV0IiwiaW5jcmVtZW50RGF0ZSIsImRlbHRhSW5wdXQiLCJkZWx0YSIsImZvcm1hdERhdGUiLCJzZXR0aW5ncyIsImRhdGVPck9iaiIsImVuZERhdGUiLCJzZWxlY3Rpb25JbnB1dCIsImRhdGVTZWxlY3Rpb24iLCJhZGRFdmVudCIsImV2ZW50SW5wdXQiLCJzb3VyY2VJbnB1dCIsIl9kZWYiLCJfaW5zdGFuY2UiLCJjdXJyZW50RGF0YSIsInRyaWdnZXJFdmVudEFkZCIsInNvdXJjZUFwaSIsImdldEV2ZW50U291cmNlQnlJZCIsIm5ld0V2ZW50QXBpIiwiZXZlbnRBcGkiLCJyZWxhdGVkRXZlbnRzIiwicmV2ZXJ0IiwiZXZlbnRBcGlUb1N0b3JlIiwiZ2V0RXZlbnRCeUlkIiwiZ2V0RXZlbnRzIiwiYnVpbGRFdmVudEFwaXMiLCJyZW1vdmVBbGxFdmVudHMiLCJnZXRFdmVudFNvdXJjZXMiLCJzb3VyY2VIYXNoIiwic291cmNlQXBpcyIsImludGVybmFsSWQiLCJhZGRFdmVudFNvdXJjZSIsInNvdXJjZXMiLCJyZW1vdmVBbGxFdmVudFNvdXJjZXMiLCJyZWZldGNoRXZlbnRzIiwic2Nyb2xsVG9UaW1lIiwidGltZUlucHV0IiwidGltZSIsIl9jb250ZXh0Iiwic2V0UHJvcCIsIm11dGF0ZSIsInNldEV4dGVuZGVkUHJvcCIsInNldFN0YXJ0IiwiaW5zdGFuY2VSYW5nZSIsImdyYW51bGFyaXR5IiwibWFpbnRhaW5EdXJhdGlvbiIsInNldEVuZCIsImVuZElucHV0Iiwic2V0RGF0ZXMiLCJtb3ZlU3RhcnQiLCJtb3ZlRW5kIiwibW92ZURhdGVzIiwic2V0QWxsRGF5IiwiZm9ybWF0SW5wdXQiLCJjb250ZXh0XzEiLCJldmVudFN0b3JlXzEiLCJyZWxldmFudEV2ZW50cyIsIm9sZEV2ZW50IiwiYXNTdG9yZSIsInRvUGxhaW5PYmplY3QiLCJjb2xsYXBzZUNvbG9yIiwiY29sbGFwc2VFeHRlbmRlZFByb3BzIiwidG9KU09OIiwiZXhjbHVkZUluc3RhbmNlIiwiZXZlbnRBcGlzIiwiZXhjbHVkZUluc3RhbmNlSWQiLCJjYWxlbmRhclN5c3RlbUNsYXNzTWFwIiwicmVnaXN0ZXJDYWxlbmRhclN5c3RlbSIsInRoZUNsYXNzIiwiY3JlYXRlQ2FsZW5kYXJTeXN0ZW0iLCJHcmVnb3JpYW5DYWxlbmRhclN5c3RlbSIsImFycmF5VG9NYXJrZXIiLCJhcnIiLCJJU09fUkUiLCJEYXRlRW52IiwiaXNOYW1lZFRpbWVab25lIiwibmFtZWRUaW1lWm9uZUltcGwiLCJjYW5Db21wdXRlT2Zmc2V0Iiwid2Vla0RvdyIsIndlZWtEb3kiLCJ3ZWVrTnVtYmVyRnVuYyIsInRpbWVzdGFtcFRvTWFya2VyIiwiZ2V0WWVhciIsImFkZE1vbnRocyIsImdyZWF0ZXN0V2hvbGVVbml0IiwiY291bnREdXJhdGlvbnNCZXR3ZWVuIiwiZGlmZiIsInN0YXJ0T2YiLCJzdGFydE9mWWVhciIsInN0YXJ0T2ZNb250aCIsInN0YXJ0T2ZXZWVrIiwiZGF0ZU9wdGlvbnMiLCJvZmZzZXRGb3JNYXJrZXIiLCJpc0VuZEV4Y2x1c2l2ZSIsImV4dHJhT3B0aW9ucyIsIm9taXRUaW1lWm9uZU9mZnNldCIsInRpbWVzdGFtcFRvQXJyYXkiLCJnZXRUaW1lem9uZU9mZnNldCIsIm9mZnNldEZvckFycmF5IiwiZ2xvYmFsTG9jYWxlcyIsIk1JTklNQUxfUkFXX0VOX0xPQ0FMRSIsImNvZGUiLCJsaXN0IiwiUkFXX0VOX0xPQ0FMRSIsImV2ZW50Q250Iiwib3JnYW5pemVSYXdMb2NhbGVzIiwiZXhwbGljaXRSYXdMb2NhbGVzIiwiZGVmYXVsdENvZGUiLCJhbGxSYXdMb2NhbGVzIiwicmF3TG9jYWxlTWFwIiwiZW4iLCJhbGxSYXdMb2NhbGVzXzEiLCJyYXdMb2NhbGUiLCJidWlsZExvY2FsZSIsImlucHV0U2luZ3VsYXIiLCJhdmFpbGFibGUiLCJwYXJzZUxvY2FsZSIsInF1ZXJ5TG9jYWxlIiwiY29kZUFyZyIsInF1ZXJ5UmF3TG9jYWxlIiwic2ltcGxlSWQiLCJzbGljZSIsIm1lcmdlZCIsIk51bWJlckZvcm1hdCIsImRhdGVJbnB1dCIsImJ1aWxkRGF0ZUVudiQxIiwiZGF0ZU1ldGEiLCJERUZfREVGQVVMVFMiLCJzdGFydFRpbWUiLCJlbmRUaW1lIiwiZGF5c09mV2VlayIsInBhcnNlQnVzaW5lc3NIb3VycyIsInJlZmluZUlucHV0cyIsInJhd0RlZnMiLCJmaWx0ZXIiLCJyYXdEZWYiLCJwb2ludEluc2lkZVJlY3QiLCJwb2ludCIsInJlY3QiLCJsZWZ0IiwicmlnaHQiLCJ0b3AiLCJib3R0b20iLCJpbnRlcnNlY3RSZWN0cyIsInJlY3QxIiwicmVjdDIiLCJ0cmFuc2xhdGVSZWN0IiwiZGVsdGFYIiwiZGVsdGFZIiwiY29uc3RyYWluUG9pbnQiLCJnZXRSZWN0Q2VudGVyIiwiZGlmZlBvaW50cyIsInBvaW50MSIsInBvaW50MiIsImNhblZHcm93V2l0aGluQ2VsbCIsImdldENhblZHcm93V2l0aGluQ2VsbCIsImNvbXB1dGVDYW5WR3Jvd1dpdGhpbkNlbGwiLCJjcmVhdGVFbGVtZW50IiwicG9zaXRpb24iLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsImRpdiIsInBvc3NpYmxlIiwib2Zmc2V0SGVpZ2h0IiwiRU1QVFlfRVZFTlRfU1RPUkUiLCJTcGxpdHRlciIsImdldEtleXNGb3JFdmVudERlZnMiLCJfZ2V0S2V5c0ZvckV2ZW50RGVmcyIsInNwbGl0RGF0ZVNlbGVjdGlvbiIsIl9zcGxpdERhdGVTcGFuIiwic3BsaXRFdmVudFN0b3JlIiwiX3NwbGl0RXZlbnRTdG9yZSIsInNwbGl0SW5kaXZpZHVhbFVpIiwiX3NwbGl0SW5kaXZpZHVhbFVpIiwic3BsaXRFdmVudERyYWciLCJfc3BsaXRJbnRlcmFjdGlvbiIsInNwbGl0RXZlbnRSZXNpemUiLCJldmVudFVpQnVpbGRlcnMiLCJzcGxpdFByb3BzIiwia2V5SW5mb3MiLCJnZXRLZXlJbmZvIiwiZGVmS2V5cyIsImRhdGVTZWxlY3Rpb25zIiwiaW5kaXZpZHVhbFVpIiwiZXZlbnRTdG9yZXMiLCJldmVudERyYWdzIiwiZXZlbnREcmFnIiwiZXZlbnRSZXNpemVzIiwiZXZlbnRSZXNpemUiLCJpbmZvIiwiYnVpbGRFdmVudFVpRm9yS2V5Iiwia2V5SW5mbyIsImJ1aWxkRXZlbnRVaSIsImV2ZW50U2VsZWN0aW9uIiwiZGF0ZVNwYW5zIiwiZ2V0S2V5c0ZvckRhdGVTcGFuIiwia2V5c18xIiwiZ2V0S2V5c0ZvckV2ZW50RGVmIiwic3BsaXRTdG9yZXMiLCJfYyIsInNwbGl0SGFzaGVzIiwiaW50ZXJhY3Rpb24iLCJzcGxpdFN0YXRlcyIsImFmZmVjdGVkU3RvcmVzXzEiLCJhZmZlY3RlZEV2ZW50cyIsIm11dGF0ZWRLZXlzQnlEZWZJZCIsIm11dGF0ZWRFdmVudHMiLCJtdXRhdGVkU3RvcmVzXzEiLCJwb3B1bGF0ZSIsImlzRXZlbnQiLCJhbGxVaSIsImV2ZW50VWlGb3JLZXkiLCJiYXNlUGFydHMiLCJzdHVmZiIsImdldERhdGVNZXRhIiwiaXNEaXNhYmxlZCIsImlzT3RoZXIiLCJnZXREYXlDbGFzc05hbWVzIiwidGhlbWUiLCJnZXRDbGFzcyIsImdldFNsb3RDbGFzc05hbWVzIiwiREFZX0ZPUk1BVCIsIldFRUtfRk9STUFUIiwiYnVpbGROYXZMaW5rQXR0cnMiLCJpc1RhYmJhYmxlIiwiZGF0ZVN0ciIsInpvbmVkRGF0ZSIsImhhbmRsZUludGVyYWN0aW9uIiwiY3VzdG9tQWN0aW9uIiwiX2lzUnRsU2Nyb2xsYmFyT25MZWZ0IiwiZ2V0SXNSdGxTY3JvbGxiYXJPbkxlZnQiLCJjb21wdXRlSXNSdGxTY3JvbGxiYXJPbkxlZnQiLCJvdXRlckVsIiwiYm9yZGVyIiwicGFkZGluZyIsIm92ZXJmbG93IiwiaW5uZXJFbCIsImZpcnN0Q2hpbGQiLCJfc2Nyb2xsYmFyV2lkdGhzIiwiZ2V0U2Nyb2xsYmFyV2lkdGhzIiwiY29tcHV0ZVNjcm9sbGJhcldpZHRocyIsImNvbXB1dGVTY3JvbGxiYXJXaWR0aHNGb3JFbCIsIngiLCJjbGllbnRIZWlnaHQiLCJvZmZzZXRXaWR0aCIsImNsaWVudFdpZHRoIiwiY29tcHV0ZUVkZ2VzIiwiZ2V0UGFkZGluZyIsImNvbXB1dGVkU3R5bGUiLCJ3aW5kb3ciLCJnZXRDb21wdXRlZFN0eWxlIiwiYm9yZGVyTGVmdCIsImJvcmRlckxlZnRXaWR0aCIsImJvcmRlclJpZ2h0IiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlclRvcCIsImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyQm90dG9tIiwiYm9yZGVyQm90dG9tV2lkdGgiLCJiYWRTY3JvbGxiYXJXaWR0aHMiLCJzY3JvbGxiYXJMZWZ0UmlnaHQiLCJzY3JvbGxiYXJCb3R0b20iLCJzY3JvbGxiYXJMZWZ0Iiwic2Nyb2xsYmFyUmlnaHQiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCIsInBhZGRpbmdUb3AiLCJwYWRkaW5nQm90dG9tIiwiY29tcHV0ZUlubmVyUmVjdCIsImdvV2l0aGluUGFkZGluZyIsImRvRnJvbVdpbmRvd1ZpZXdwb3J0Iiwib3V0ZXJSZWN0IiwiY29tcHV0ZVJlY3QiLCJlZGdlcyIsInBhZ2VYT2Zmc2V0IiwicGFnZVlPZmZzZXQiLCJjb21wdXRlQ2xpcHBlZENsaWVudFJlY3QiLCJjbGlwcGluZ1BhcmVudHMiLCJnZXRDbGlwcGluZ1BhcmVudHMiLCJjbGlwcGluZ1BhcmVudHNfMSIsImNsaXBwaW5nUGFyZW50IiwiaW50ZXJzZWN0aW9uIiwiY29tcHV0ZUhlaWdodEFuZE1hcmdpbnMiLCJjb21wdXRlVk1hcmdpbnMiLCJjb21wdXRlZCIsIm1hcmdpblRvcCIsIm1hcmdpbkJvdHRvbSIsIm92ZXJmbG93WSIsIm92ZXJmbG93WCIsInVucHJvbWlzaWZ5IiwiaXNSZXNvbHZlZCIsIndyYXBwZWRTdWNjZXNzIiwid3JhcHBlZEZhaWx1cmUiLCJ0aGVuIiwiRW1pdHRlciIsImhhbmRsZXJzIiwidGhpc0NvbnRleHQiLCJzZXRUaGlzQ29udGV4dCIsInNldE9wdGlvbnMiLCJhZGRUb0hhc2giLCJyZW1vdmVGcm9tSGFzaCIsImF0dGFjaGVkSGFuZGxlcnMiLCJvcHRpb25IYW5kbGVyIiwiaGFuZGxlcnNfMSIsIlBvc2l0aW9uQ2FjaGUiLCJvcmlnaW5FbCIsImVscyIsImlzSG9yaXpvbnRhbCIsImlzVmVydGljYWwiLCJvcmlnaW5DbGllbnRSZWN0IiwiYnVpbGRFbEhvcml6b250YWxzIiwiYnVpbGRFbFZlcnRpY2FscyIsIm9yaWdpbkNsaWVudExlZnQiLCJsZWZ0cyIsInJpZ2h0cyIsIm9yaWdpbkNsaWVudFRvcCIsInRvcHMiLCJib3R0b21zIiwibGVmdFRvSW5kZXgiLCJsZWZ0UG9zaXRpb24iLCJ0b3BUb0luZGV4IiwidG9wUG9zaXRpb24iLCJnZXRXaWR0aCIsImxlZnRJbmRleCIsImdldEhlaWdodCIsInRvcEluZGV4IiwiU2Nyb2xsQ29udHJvbGxlciIsImdldE1heFNjcm9sbFRvcCIsImdldFNjcm9sbEhlaWdodCIsImdldENsaWVudEhlaWdodCIsImdldE1heFNjcm9sbExlZnQiLCJnZXRTY3JvbGxXaWR0aCIsImdldENsaWVudFdpZHRoIiwiY2FuU2Nyb2xsVmVydGljYWxseSIsImNhblNjcm9sbEhvcml6b250YWxseSIsImNhblNjcm9sbFVwIiwiZ2V0U2Nyb2xsVG9wIiwiY2FuU2Nyb2xsRG93biIsImNhblNjcm9sbExlZnQiLCJnZXRTY3JvbGxMZWZ0IiwiY2FuU2Nyb2xsUmlnaHQiLCJFbGVtZW50U2Nyb2xsQ29udHJvbGxlciIsIl9zdXBlciIsIl9fZXh0ZW5kcyIsInNjcm9sbFRvcCIsInNjcm9sbExlZnQiLCJzZXRTY3JvbGxUb3AiLCJzZXRTY3JvbGxMZWZ0Iiwic2Nyb2xsV2lkdGgiLCJzY3JvbGxIZWlnaHQiLCJXaW5kb3dTY3JvbGxDb250cm9sbGVyIiwic2Nyb2xsIiwiVGhlbWUiLCJpY29uT3ZlcnJpZGVPcHRpb24iLCJzZXRJY29uT3ZlcnJpZGUiLCJpY29uT3ZlcnJpZGVIYXNoIiwiaWNvbkNsYXNzZXNDb3B5IiwiYnV0dG9uTmFtZSIsImljb25DbGFzc2VzIiwiYXBwbHlJY29uT3ZlcnJpZGVQcmVmaXgiLCJwcmVmaXgiLCJpY29uT3ZlcnJpZGVQcmVmaXgiLCJjbGFzc2VzIiwiZ2V0SWNvbkNsYXNzIiwiaXNSdGwiLCJydGxJY29uQ2xhc3NlcyIsImJhc2VJY29uQ2xhc3MiLCJnZXRDdXN0b21CdXR0b25JY29uQ2xhc3MiLCJjdXN0b21CdXR0b25Qcm9wcyIsImljb25PdmVycmlkZUN1c3RvbUJ1dHRvbk9wdGlvbiIsIlNjcm9sbFJlc3BvbmRlciIsImV4ZWNGdW5jIiwiaGFuZGxlU2Nyb2xsUmVxdWVzdCIsInJlcXVlc3QiLCJxdWV1ZWRSZXF1ZXN0IiwiZHJhaW4iLCJmaXJlSW5pdGlhbFNjcm9sbCIsImRldGFjaCIsInVwZGF0ZSIsImlzRGF0ZXNOZXciLCJWaWV3Q29udGV4dFR5cGUiLCJjcmVhdGVDb250ZXh0IiwiYnVpbGRWaWV3Q29udGV4dCIsInZpZXdTcGVjIiwidmlld09wdGlvbnMiLCJkYXRlUHJvZmlsZUdlbmVyYXRvciIsInJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQiLCJ1bnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQiLCJhZGRSZXNpemVIYW5kbGVyIiwicmVtb3ZlUmVzaXplSGFuZGxlciIsImNyZWF0ZVNjcm9sbFJlc3BvbmRlciIsIlB1cmVDb21wb25lbnQiLCJzaG91bGRDb21wb25lbnRVcGRhdGUiLCJuZXh0UHJvcHMiLCJuZXh0U3RhdGUiLCJkZWJ1ZyIsImxvZyIsInByb3BFcXVhbGl0eSIsInN0YXRlRXF1YWxpdHkiLCJzYWZlU2V0U3RhdGUiLCJuZXdTdGF0ZSIsInNldFN0YXRlIiwiYWRkUHJvcHNFcXVhbGl0eSIsImFkZFN0YXRlRXF1YWxpdHkiLCJjb250ZXh0VHlwZSIsIkNvbXBvbmVudCIsIkJhc2VDb21wb25lbnQiLCJjcmVhdGUiLCJzZXRSZWYiLCJyZWYiLCJjdXJyZW50IiwiRGF0ZUNvbXBvbmVudCIsInVpZCIsInByZXBhcmVIaXRzIiwicXVlcnlIaXQiLCJwb3NpdGlvbkxlZnQiLCJwb3NpdGlvblRvcCIsImVsV2lkdGgiLCJlbEhlaWdodCIsImlzVmFsaWRTZWdEb3duRWwiLCJpc1ZhbGlkRGF0ZURvd25FbCIsImNyZWF0ZVBsdWdpbiIsImRlcHMiLCJyZWR1Y2VycyIsImlzTG9hZGluZ0Z1bmNzIiwiY29udGV4dEluaXQiLCJldmVudERyYWdNdXRhdGlvbk1hc3NhZ2VycyIsImRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnMiLCJkYXRlUG9pbnRUcmFuc2Zvcm1zIiwidmlld1Byb3BzVHJhbnNmb3JtZXJzIiwiaXNQcm9wc1ZhbGlkIiwiZXh0ZXJuYWxEZWZUcmFuc2Zvcm1zIiwidmlld0NvbnRhaW5lckFwcGVuZHMiLCJldmVudERyb3BUcmFuc2Zvcm1lcnMiLCJjb21wb25lbnRJbnRlcmFjdGlvbnMiLCJjYWxlbmRhckludGVyYWN0aW9ucyIsInRoZW1lQ2xhc3NlcyIsIm5hbWVkVGltZVpvbmVkSW1wbCIsImVsZW1lbnREcmFnZ2luZ0ltcGwiLCJvcHRpb25DaGFuZ2VIYW5kbGVycyIsInNjcm9sbEdyaWRJbXBsIiwiY29udGVudFR5cGVIYW5kbGVycyIsImxpc3RlbmVyUmVmaW5lcnMiLCJvcHRpb25SZWZpbmVycyIsInByb3BTZXRIYW5kbGVycyIsImJ1aWxkUGx1Z2luSG9va3MiLCJwbHVnaW5EZWZzIiwiZ2xvYmFsRGVmcyIsImlzQWRkZWQiLCJob29rcyIsImFkZERlZnMiLCJkZWZzXzEiLCJjb21iaW5lSG9va3MiLCJidWlsZEJ1aWxkUGx1Z2luSG9va3MiLCJjdXJyZW50T3ZlcnJpZGVEZWZzIiwiY3VycmVudEdsb2JhbERlZnMiLCJjdXJyZW50SG9va3MiLCJvdmVycmlkZURlZnMiLCJob29rczAiLCJob29rczEiLCJTdGFuZGFyZFRoZW1lIiwicm9vdCIsInRhYmxlQ2VsbFNoYWRlZCIsImJ1dHRvbkdyb3VwIiwiYnV0dG9uIiwiYnV0dG9uQWN0aXZlIiwiY2xvc2UiLCJjb21waWxlVmlld0RlZnMiLCJkZWZhdWx0Q29uZmlncyIsIm92ZXJyaWRlQ29uZmlncyIsImVuc3VyZVZpZXdEZWYiLCJ2aWV3RGVmIiwiYnVpbGRWaWV3RGVmIiwiZGVmYXVsdENvbmZpZyIsIm92ZXJyaWRlQ29uZmlnIiwicXVlcnlQcm9wIiwidGhlQ29tcG9uZW50Iiwic3VwZXJUeXBlIiwic3VwZXJEZWYiLCJkZWZhdWx0cyIsInJhd09wdGlvbnMiLCJvdmVycmlkZXMiLCJSZW5kZXJIb29rIiwicm9vdEVsUmVmIiwiY3JlYXRlUmVmIiwiaGFuZGxlUm9vdEVsIiwiZWxSZWYiLCJyZW5kZXIiLCJob29rUHJvcHMiLCJNb3VudEhvb2siLCJDb250ZW50SG9vayIsImRlZmF1bHRDb250ZW50IiwiYmFja3VwRWxSZWYiLCJpbm5lckVsUmVmIiwiaW5uZXJDb250ZW50Iiwibm9ybWFsaXplQ2xhc3NOYW1lcyIsIkN1c3RvbUNvbnRlbnRSZW5kZXJDb250ZXh0IiwiQ29uc3VtZXIiLCJyZW5kZXJJZCIsIkNvbnRlbnRIb29rSW5uZXIiLCJyZW5kZXJJbm5lckNvbnRlbnQiLCJjb21wb25lbnREaWRNb3VudCIsInVwZGF0ZUN1c3RvbUNvbnRlbnQiLCJjb21wb25lbnREaWRVcGRhdGUiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsImN1c3RvbUNvbnRlbnRJbmZvIiwiZGVzdHJveSIsImdldElubmVyQ29udGVudCIsImdldENvbnRlbnRNZXRhIiwiY29udGVudEtleSIsImNvbnRlbnRWYWwiLCJidWlsZExpZmVjeWNsZUZ1bmNzIiwibm9ybWFsaXplQ29udGVudCIsInNlYXJjaEtleSIsInJvb3RFbCIsImJ1aWxkQ2xhc3NOYW1lTm9ybWFsaXplciIsImN1cnJlbnRHZW5lcmF0b3IiLCJjdXJyZW50SG9va1Byb3BzIiwiY3VycmVudENsYXNzTmFtZXMiLCJnZW5lcmF0b3IiLCJWaWV3Um9vdCIsImN1c3RvbUNsYXNzTmFtZXMiLCJwYXJzZVZpZXdDb25maWdzIiwiaW5wdXRzIiwicGFyc2VWaWV3Q29uZmlnIiwiY3JlYXRlVmlld0hvb2tDb21wb25lbnQiLCJ2aWV3UHJvcHMiLCJ2aWV3RWxSZWYiLCJidWlsZFZpZXdTcGVjcyIsImRlZmF1bHRJbnB1dHMiLCJvcHRpb25PdmVycmlkZXMiLCJkeW5hbWljT3B0aW9uT3ZlcnJpZGVzIiwibG9jYWxlRGVmYXVsdHMiLCJ2aWV3RGVmcyIsImJ1aWxkVmlld1NwZWMiLCJkdXJhdGlvbklucHV0IiwiZHVyYXRpb25Vbml0Iiwic2luZ2xlVW5pdE92ZXJyaWRlcyIsImNyZWF0ZUR1cmF0aW9uQ2FjaGVkIiwiZGVub20iLCJxdWVyeUJ1dHRvblRleHQiLCJvcHRpb25zU3Vic2V0IiwiYnV0dG9uVGV4dE1hcCIsInF1ZXJ5QnV0dG9uVGl0bGUiLCJidXR0b25LZXkiLCJvcHRpb25EZWZhdWx0cyIsImJ1dHRvblRleHRPdmVycmlkZSIsImJ1dHRvblRleHREZWZhdWx0IiwiYnV0dG9uVGl0bGVPdmVycmlkZSIsImJ1dHRvbkhpbnQiLCJidXR0b25UaXRsZURlZmF1bHQiLCJkdXJhdGlvbklucHV0TWFwIiwianNvbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJEYXRlUHJvZmlsZUdlbmVyYXRvciIsImluaXRIaWRkZW5EYXlzIiwiYnVpbGRQcmV2IiwiY3VycmVudERhdGVQcm9maWxlIiwiZm9yY2VUb1ZhbGlkIiwicHJldkRhdGUiLCJjdXJyZW50UmFuZ2VVbml0IiwiYnVpbGQiLCJidWlsZE5leHQiLCJuZXh0RGF0ZSIsImN1cnJlbnRJbmZvIiwiaXNSYW5nZUFsbERheSIsInJlbmRlclJhbmdlIiwiaXNWYWxpZCIsImJ1aWxkVmFsaWRSYW5nZSIsInRyaW1IaWRkZW5EYXlzIiwiYnVpbGRDdXJyZW50UmFuZ2VJbmZvIiwiYnVpbGRSZW5kZXJSYW5nZSIsImFkanVzdEFjdGl2ZVJhbmdlIiwiYnVpbGREYXRlSW5jcmVtZW50IiwidmFsaWRSYW5nZUlucHV0Iiwic2ltcGxlSW5wdXQiLCJyZWZpbmVSYW5nZSIsImJ1aWxkUmFuZ2VGcm9tRHVyYXRpb24iLCJidWlsZFJhbmdlRnJvbURheUNvdW50IiwiYnVpbGRDdXN0b21WaXNpYmxlUmFuZ2UiLCJnZXRGYWxsYmFja0R1cmF0aW9uIiwiaXNIaWRkZW5EYXkiLCJza2lwSGlkZGVuRGF5cyIsImNvbXB1dGVSZXMiLCJydW5uaW5nQ291bnQiLCJ2aXNpYmxlUmFuZ2VJbnB1dCIsImZhbGxiYWNrIiwiY3VzdG9tQWxpZ25tZW50IiwicmFuZ2VJbnB1dCIsImlzSGlkZGVuRGF5SGFzaCIsImluYyIsImlzRXhjbHVzaXZlIiwicmVkdWNlVmlld1R5cGUiLCJyZWR1Y2VEeW5hbWljT3B0aW9uT3ZlcnJpZGVzIiwicmVkdWNlRGF0ZVByb2ZpbGUiLCJkcCIsImluaXRFdmVudFNvdXJjZXMiLCJhZGRTb3VyY2VzIiwicGFyc2VJbml0aWFsU291cmNlcyIsInJlZHVjZUV2ZW50U291cmNlcyIsInJlbW92ZVNvdXJjZSIsImZldGNoRGlydHlTb3VyY2VzIiwiZmV0Y2hTb3VyY2VzQnlJZHMiLCJleGNsdWRlU3RhdGljU291cmNlcyIsInJlY2VpdmVSZXNwb25zZSIsImZldGNoSWQiLCJyZWR1Y2VFdmVudFNvdXJjZXNOZXdUaW1lWm9uZSIsImNvbXB1dGVFdmVudFNvdXJjZXNMb2FkaW5nIiwiZXZlbnRTb3VyY2VIYXNoIiwic291cmNlc18xIiwic291cmNlIiwiaXNTb3VyY2VEaXJ0eSIsImRvZXNTb3VyY2VOZWVkUmFuZ2UiLCJwcmV2U291cmNlcyIsInNvdXJjZUlkSGFzaCIsIm5leHRTb3VyY2VzIiwiZmV0Y2hTb3VyY2UiLCJzb3VyY2VEZWYiLCJmZXRjaCIsInhociIsImVycm9yIiwibWVzc2FnZSIsInJhd1NvdXJjZXMiLCJyYXdTb3VyY2VzXzEiLCJyYXdTb3VyY2UiLCJpZ25vcmVSYW5nZSIsInJlZHVjZUV2ZW50U3RvcmUiLCJyZWNlaXZlUmF3RXZlbnRzIiwiZXhjbHVkZUV2ZW50c0J5U291cmNlSWQiLCJzdWJzZXQiLCJ0cmFuc2Zvcm1SYXdFdmVudHMiLCJjYWxFYWNoVHJhbnNmb3JtIiwic291cmNlRWFjaFRyYW5zZm9ybSIsInRyYW5zZm9ybUVhY2hSYXdFdmVudCIsInJlZmluZWRFdmVudHMiLCJyZWZpbmVkRXZlbnQiLCJleHBhbmRSYW5nZSIsInJlem9uZUV2ZW50U3RvcmVEYXRlcyIsIm9sZERhdGVFbnYiLCJuZXdEYXRlRW52IiwiZXhjbHVkZUluc3RhbmNlcyIsInJlbW92YWxzIiwicmVkdWNlRGF0ZVNlbGVjdGlvbiIsImN1cnJlbnRTZWxlY3Rpb24iLCJyZWR1Y2VTZWxlY3RlZEV2ZW50IiwiY3VycmVudEluc3RhbmNlSWQiLCJldmVudEluc3RhbmNlSWQiLCJyZWR1Y2VFdmVudERyYWciLCJjdXJyZW50RHJhZyIsIm5ld0RyYWciLCJyZWR1Y2VFdmVudFJlc2l6ZSIsImN1cnJlbnRSZXNpemUiLCJuZXdSZXNpemUiLCJwYXJzZVRvb2xiYXJzIiwiY2FsZW5kYXJPcHRpb25PdmVycmlkZXMiLCJwYXJzZVRvb2xiYXIiLCJzZWN0aW9uU3RySGFzaCIsInNlY3Rpb25XaWRnZXRzIiwiaGFzVGl0bGUiLCJzZWN0aW9uTmFtZSIsInNlY3Rpb25TdHIiLCJzZWN0aW9uUmVzIiwicGFyc2VTZWN0aW9uIiwid2lkZ2V0cyIsImNhbGVuZGFyQ3VzdG9tQnV0dG9ucyIsImNhbGVuZGFyQnV0dG9uVGV4dE92ZXJyaWRlcyIsImNhbGVuZGFyQnV0dG9uVGV4dCIsImNhbGVuZGFyQnV0dG9uSGludE92ZXJyaWRlcyIsImNhbGVuZGFyQnV0dG9uSGludHMiLCJzZWN0aW9uU3Vic3RycyIsImJ1dHRvbkdyb3VwU3RyIiwiYnV0dG9uQ2xpY2siLCJidXR0b25JY29uIiwiY2xpY2siLCJ0ZXh0IiwiaGludCIsInRleHRGYWxsYmFjayIsInByZXZPck5leHQiLCJuYXZVbml0IiwiZXZlbnRTb3VyY2VEZWYkMiIsImFycmF5RXZlbnRTb3VyY2VQbHVnaW4iLCJldmVudFNvdXJjZURlZiQxIiwiYmluZCIsImZ1bmNFdmVudFNvdXJjZVBsdWdpbiIsInJlcXVlc3RKc29uIiwicGFyYW1zIiwic3VjY2Vzc0NhbGxiYWNrIiwiZmFpbHVyZUNhbGxiYWNrIiwidG9VcHBlckNhc2UiLCJpbmplY3RRdWVyeVN0cmluZ1BhcmFtcyIsImVuY29kZVBhcmFtcyIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInNldFJlcXVlc3RIZWFkZXIiLCJvbmxvYWQiLCJzdGF0dXMiLCJyZXNwb25zZVRleHQiLCJlcnIiLCJvbmVycm9yIiwic2VuZCIsImVuY29kZVVSSUNvbXBvbmVudCIsIkpTT05fRkVFRF9FVkVOVF9TT1VSQ0VfUkVGSU5FUlMiLCJleHRyYVBhcmFtcyIsImV2ZW50U291cmNlRGVmIiwicmVxdWVzdFBhcmFtcyIsImJ1aWxkUmVxdWVzdFBhcmFtcyIsImVycm9yTWVzc2FnZSIsImpzb25GZWVkRXZlbnRTb3VyY2VQbHVnaW4iLCJjdXN0b21SZXF1ZXN0UGFyYW1zIiwiU0lNUExFX1JFQ1VSUklOR19SRUZJTkVSUyIsInN0YXJ0UmVjdXIiLCJlbmRSZWN1ciIsInJlY3VycmluZyIsInJlY3VycmluZ0RhdGEiLCJjbGlwcGVkRnJhbWluZ1JhbmdlIiwiZXhwYW5kUmFuZ2VzIiwic2ltcGxlUmVjdXJyaW5nRXZlbnRzUGx1Z2luIiwiZG93SGFzaCIsImRheU1hcmtlciIsImluc3RhbmNlU3RhcnRzIiwiaW5zdGFuY2VTdGFydCIsImNoYW5nZUhhbmRsZXJQbHVnaW4iLCJoYW5kbGVFdmVudFNvdXJjZXMiLCJ1bmZvdW5kU291cmNlcyIsIm5ld0lucHV0cyIsImlucHV0c18xIiwiaW5wdXRGb3VuZCIsInVuZm91bmRTb3VyY2VzXzEiLCJ1bmZvdW5kU291cmNlIiwibmV3SW5wdXRzXzEiLCJuZXdJbnB1dCIsImhhbmRsZURhdGVQcm9maWxlIiwiaGFuZGxlRXZlbnRTdG9yZSIsImdsb2JhbFBsdWdpbnMiLCJodG1sIiwiYnVpbGRIdG1sUmVuZGVyZXIiLCJkb21Ob2RlcyIsImJ1aWxkRG9tTm9kZVJlbmRlcmVyIiwiY3VycmVudEVsIiwiY3VycmVudEh0bWwiLCJjdXJyZW50RG9tTm9kZXMiLCJuZXdEb21Ob2RlcyIsIm5ld0RvbU5vZGVzXzEiLCJuZXdOb2RlIiwiRGVsYXllZFJ1bm5lciIsImRyYWluZWRPcHRpb24iLCJpc1J1bm5pbmciLCJpc0RpcnR5IiwicGF1c2VEZXB0aHMiLCJ0aW1lb3V0SWQiLCJkZWxheSIsImlzUGF1c2VkIiwiY2xlYXJUaW1lb3V0IiwidHJ5RHJhaW4iLCJzZXRUaW1lb3V0IiwicGF1c2UiLCJzY29wZSIsInJlc3VtZSIsImZvcmNlIiwiZGVwdGgiLCJkcmFpbmVkIiwiY2xlYXIiLCJUYXNrUnVubmVyIiwicnVuVGFza09wdGlvbiIsInF1ZXVlIiwiZGVsYXllZFJ1bm5lciIsInRhc2siLCJjb21wbGV0ZWRUYXNrcyIsInNoaWZ0IiwicnVuVGFzayIsImJ1aWxkVGl0bGUiLCJidWlsZFRpdGxlRm9ybWF0IiwiQ2FsZW5kYXJEYXRhTWFuYWdlciIsImNvbXB1dGVPcHRpb25zRGF0YSIsIl9jb21wdXRlT3B0aW9uc0RhdGEiLCJjb21wdXRlQ3VycmVudFZpZXdEYXRhIiwiX2NvbXB1dGVDdXJyZW50Vmlld0RhdGEiLCJidWlsZERhdGVFbnYiLCJidWlsZFRoZW1lIiwiYnVpbGREYXRlUHJvZmlsZUdlbmVyYXRvciIsImJ1aWxkVmlld0FwaSIsImJ1aWxkVmlld1VpUHJvcHMiLCJidWlsZEV2ZW50VWlCeVNvdXJjZSIsImJ1aWxkRXZlbnRVaUJhc2VzIiwicGFyc2VDb250ZXh0QnVzaW5lc3NIb3VycyIsImFjdGlvblJ1bm5lciIsIl9oYW5kbGVBY3Rpb24iLCJ1cGRhdGVEYXRhIiwiY3VycmVudENhbGVuZGFyT3B0aW9uc1JlZmluZWQiLCJjdXJyZW50Vmlld09wdGlvbnNJbnB1dCIsImN1cnJlbnRWaWV3T3B0aW9uc1JlZmluZWQiLCJkYXRhIiwib3B0aW9uc0RhdGEiLCJjdXJyZW50Vmlld1R5cGUiLCJjdXJyZW50Vmlld0RhdGEiLCJjYWxlbmRhckNvbnRleHQiLCJpbml0aWFsU3RhdGUiLCJyZW5kZXJhYmxlRXZlbnRTdG9yZSIsInNlbGVjdGlvbkNvbmZpZyIsImNvbnRleHRBbmRTdGF0ZSIsInJlZHVjZXIiLCJjb21wdXRlSXNMb2FkaW5nIiwicmVzZXRPcHRpb25zIiwiYXBwZW5kIiwiaXNFdmVudHNMb2FkaW5nIiwiZXZlbnRVaVNpbmdsZUJhc2UiLCJldmVudFVpQnlTb3VyY2UiLCJ3YXNMb2FkaW5nIiwiaXNMb2FkaW5nIiwib25BY3Rpb24iLCJvbGREYXRhIiwiY2hhbmdlSGFuZGxlcnMiLCJvbGRDYWxlbmRhck9wdGlvbnMiLCJuZXdDYWxlbmRhck9wdGlvbnMiLCJvbkRhdGEiLCJwcm9jZXNzUmF3Q2FsZW5kYXJPcHRpb25zIiwicmVmaW5lZE9wdGlvbnMiLCJhdmFpbGFibGVMb2NhbGVEYXRhIiwid2FyblVua25vd25PcHRpb25zIiwiY3VycmVudFJhdyIsImN1cnJlbnRSZWZpbmVkIiwiYW55Q2hhbmdlcyIsInByb2Nlc3NSYXdWaWV3T3B0aW9ucyIsImV4cGxpY2l0TG9jYWxlIiwiVGhlbWVDbGFzcyIsIkRhdGVQcm9maWxlR2VuZXJhdG9yQ2xhc3MiLCJpc0xvYWRpbmdGdW5jIiwidmlld05hbWUiLCJDYWxlbmRhckRhdGFQcm92aWRlciIsImhhbmRsZURhdGEiLCJkYXRhTWFuYWdlciIsInByZXZQcm9wcyIsIm5ld09wdGlvbk92ZXJyaWRlcyIsInNsaWNlRXZlbnRzIiwiTmFtZWRUaW1lWm9uZUltcGwiLCJTZWdIaWVyYXJjaHkiLCJzdHJpY3RPcmRlciIsImFsbG93UmVzbGljaW5nIiwibWF4Q29vcmQiLCJtYXhTdGFja0NudCIsImxldmVsQ29vcmRzIiwiZW50cmllc0J5TGV2ZWwiLCJzdGFja0NudHMiLCJhZGRTZWdzIiwiaGlkZGVuRW50cmllcyIsImluc2VydEVudHJ5IiwiZW50cnkiLCJmaW5kSW5zZXJ0aW9uIiwiaXNJbnNlcnRpb25WYWxpZCIsImluc2VydEVudHJ5QXQiLCJoYW5kbGVJbnZhbGlkSW5zZXJ0aW9uIiwibGV2ZWxDb29yZCIsInRoaWNrbmVzcyIsInN0YWNrQ250IiwidG91Y2hpbmdFbnRyeSIsInNwbGl0RW50cnkiLCJiYXJyaWVyIiwicGFydENudCIsInNwbGl0SGlkZGVuRW50cmllcyIsImVudHJ5U3BhbiIsImJhcnJpZXJTcGFuIiwiaW50ZXJzZWN0U3BhbnMiLCJsYXRlcmFsIiwiaW5zZXJ0QXQiLCJsZXZlbCIsImJ1aWxkRW50cnlLZXkiLCJuZXdFbnRyeSIsImxldmVsQ250IiwiY2FuZGlkYXRlQ29vcmQiLCJ0b3VjaGluZ0xldmVsIiwidG91Y2hpbmdMYXRlcmFsIiwidHJhY2tpbmdMZXZlbCIsInRyYWNraW5nQ29vcmQiLCJ0cmFja2luZ0VudHJpZXMiLCJ0cmFja2luZ0VudHJ5Iiwic2VhcmNoUmVzIiwiYmluYXJ5U2VhcmNoIiwiZ2V0RW50cnlTcGFuRW5kIiwibGF0ZXJhbEluZGV4IiwidHJhY2tpbmdFbnRyeUJvdHRvbSIsImRlc3RMZXZlbCIsImRlc3RMYXRlcmFsIiwidG9SZWN0cyIsInJlY3RzIiwiZW50cmllcyIsImVudHJpZXNfMSIsImdyb3VwSW50ZXJzZWN0aW5nRW50cmllcyIsIm1lcmdlcyIsImVudHJpZXNfMiIsImZpbHRlcmVkTWVyZ2VzIiwiaHVuZ3J5TWVyZ2UiLCJtZXJnZXNfMSIsIm1lcmdlIiwiam9pblNwYW5zIiwic2VhcmNoVmFsIiwiZ2V0SXRlbVZhbCIsIm1pZGRsZUluZGV4IiwibWlkZGxlVmFsIiwiSW50ZXJhY3Rpb24iLCJpc0hpdENvbWJvQWxsb3dlZCIsInBhcnNlSW50ZXJhY3Rpb25TZXR0aW5ncyIsInVzZUV2ZW50Q2VudGVyIiwiaW50ZXJhY3Rpb25TZXR0aW5nc1RvU3RvcmUiLCJpbnRlcmFjdGlvblNldHRpbmdzU3RvcmUiLCJFbGVtZW50RHJhZ2dpbmciLCJzZXRNaXJyb3JJc1Zpc2libGUiLCJib29sIiwic2V0TWlycm9yTmVlZHNSZXZlcnQiLCJzZXRBdXRvU2Nyb2xsRW5hYmxlZCIsImNvbmZpZyIsIkRSQUdfTUVUQV9SRUZJTkVSUyIsInBhcnNlRHJhZ01ldGEiLCJsZWZ0b3ZlclByb3BzIiwiVG9vbGJhclNlY3Rpb24iLCJ3aWRnZXRHcm91cHMiLCJ3aWRnZXRHcm91cCIsInJlbmRlcldpZGdldEdyb3VwIiwiaXNPbmx5QnV0dG9ucyIsIndpZGdldEdyb3VwXzEiLCJ3aWRnZXQiLCJ0aXRsZUlkIiwiaXNQcmVzc2VkIiwiYWN0aXZlQnV0dG9uIiwiaXNUb2RheUVuYWJsZWQiLCJpc1ByZXZFbmFibGVkIiwiaXNOZXh0RW5hYmxlZCIsImJ1dHRvbkNsYXNzZXMiLCJkaXNhYmxlZCIsImdyb3VwQ2xhc3NOYW1lIiwiVG9vbGJhciIsIm1vZGVsIiwiZXh0cmFDbGFzc05hbWUiLCJmb3JjZUx0ciIsInN0YXJ0Q29udGVudCIsImVuZENvbnRlbnQiLCJjZW50ZXJDb250ZW50IiwicmVuZGVyU2VjdGlvbiIsIlZpZXdDb250YWluZXIiLCJhdmFpbGFibGVXaWR0aCIsImhhbmRsZUVsIiwidXBkYXRlQXZhaWxhYmxlV2lkdGgiLCJoYW5kbGVSZXNpemUiLCJsaXF1aWQiLCJsYWJlbGVkQnlJZCIsIkV2ZW50Q2xpY2tpbmciLCJoYW5kbGVTZWdDbGljayIsInNlZ0VsIiwiaGFzVXJsQ29udGFpbmVyIiwiZGVmYXVsdFByZXZlbnRlZCIsImxvY2F0aW9uIiwiRXZlbnRIb3ZlcmluZyIsImhhbmRsZUV2ZW50RWxSZW1vdmUiLCJjdXJyZW50U2VnRWwiLCJoYW5kbGVTZWdMZWF2ZSIsImhhbmRsZVNlZ0VudGVyIiwidHJpZ2dlckV2ZW50IiwicmVtb3ZlSG92ZXJMaXN0ZW5lcnMiLCJwdWJsaWNFdk5hbWUiLCJDYWxlbmRhckNvbnRlbnQiLCJidWlsZFZpZXdQcm9wVHJhbnNmb3JtZXJzIiwiYnVpbGRUb29sYmFyUHJvcHMiLCJoZWFkZXJSZWYiLCJmb290ZXJSZWYiLCJpbnRlcmFjdGlvbnNTdG9yZSIsInZpZXdMYWJlbElkIiwic2V0dGluZ3NJbnB1dCIsIkRFRkFVTFRfSU5URVJBQ1RJT05TIiwiaW50ZXJhY3Rpb25DbGFzc2VzIiwiaW50ZXJhY3Rpb25zIiwiVGhlSW50ZXJhY3Rpb25DbGFzcyIsImxpc3RlbmVycyIsImxpc3RlbmVyc18xIiwibGlzdGVuZXIiLCJyZXNpemVSdW5uZXIiLCJ0b29sYmFyUHJvcHMiLCJ2aWV3Vkdyb3ciLCJ2aWV3QXNwZWN0UmF0aW8iLCJpc0hlaWdodEF1dG8iLCJmb3JQcmludCIsInZpZXdDb250ZXh0IiwiUHJvdmlkZXIiLCJyZW5kZXJWaWV3IiwiYnVpbGRBcHBlbmRDb250ZW50IiwiQ2FsZW5kYXJJbnRlcmFjdGlvbkNsYXNzIiwiRnJhZ21lbnQiLCJWaWV3Q29tcG9uZW50IiwidG9kYXlJbmZvIiwicHJldkluZm8iLCJuZXh0SW5mbyIsInRoZUNsYXNzZXMiLCJUaGVDbGFzcyIsIkNhbGVuZGFyUm9vdCIsImhhbmRsZUJlZm9yZVByaW50IiwiaGFuZGxlQWZ0ZXJQcmludCIsImNvbXB1dGVGYWxsYmFja0hlYWRlckZvcm1hdCIsImRhdGVzUmVwRGlzdGluY3REYXlzIiwiQ0xBU1NfTkFNRSIsInJlbmRlcklubmVyJDEiLCJUYWJsZURhdGVDZWxsIiwiZGF5TWV0YSIsIm5hdkxpbmtBdHRycyIsImNvbENudCIsImV4dHJhSG9va1Byb3BzIiwicm9sZSIsImNvbFNwYW4iLCJleHRyYURhdGFBdHRycyIsImlzU3RpY2t5IiwiV0VFS0RBWV9GT1JNQVQiLCJUYWJsZURvd0NlbGwiLCJleHRyYUNsYXNzTmFtZXMiLCJOb3dUaW1lciIsImluaXRpYWxOb3dEYXRlIiwiaW5pdGlhbE5vd1F1ZXJpZWRNcyIsImNvbXB1dGVUaW1pbmciLCJjdXJyZW50U3RhdGUiLCJ1bnJvdW5kZWROb3ciLCJjdXJyZW50VW5pdFN0YXJ0IiwibmV4dFVuaXRTdGFydCIsIndhaXRNcyIsImJ1aWxkRGF5UmFuZ2UiLCJEYXlIZWFkZXIiLCJjcmVhdGVEYXlIZWFkZXJGb3JtYXR0ZXIiLCJkYXRlcyIsInJlbmRlckludHJvIiwiZXhwbGljaXRGb3JtYXQiLCJkYXRlQ250IiwiRGF5U2VyaWVzTW9kZWwiLCJpbmRpY2VzIiwiZGF5SW5kZXgiLCJjbnQiLCJzbGljZVJhbmdlIiwiZmlyc3RJbmRleCIsImdldERhdGVEYXlJbmRleCIsImxhc3RJbmRleCIsImNsaXBwZWRGaXJzdEluZGV4IiwiY2xpcHBlZExhc3RJbmRleCIsImNlaWwiLCJkYXlPZmZzZXQiLCJEYXlUYWJsZU1vZGVsIiwiZGF5U2VyaWVzIiwiYnJlYWtPbldlZWtzIiwiZGF5c1BlclJvdyIsInJvd0NudCIsImNlbGxzIiwiYnVpbGRDZWxscyIsImhlYWRlckRhdGVzIiwiYnVpbGRIZWFkZXJEYXRlcyIsInJvd3MiLCJyb3ciLCJjb2wiLCJidWlsZENlbGwiLCJzZXJpZXNTZWciLCJuZXh0SW5kZXgiLCJmaXJzdENvbCIsImxhc3RDb2wiLCJTbGljZXIiLCJzbGljZUJ1c2luZXNzSG91cnMiLCJfc2xpY2VCdXNpbmVzc0hvdXJzIiwic2xpY2VEYXRlU2VsZWN0aW9uIiwiX3NsaWNlRGF0ZVNwYW4iLCJfc2xpY2VFdmVudFN0b3JlIiwic2xpY2VFdmVudERyYWciLCJfc2xpY2VJbnRlcmFjdGlvbiIsInNsaWNlRXZlbnRSZXNpemUiLCJmb3JjZURheUlmTGlzdEl0ZW0iLCJzbGljZVByb3BzIiwiZXh0cmFBcmdzIiwiZXZlbnRTZWdzIiwiZGF0ZVNlbGVjdGlvblNlZ3MiLCJidXNpbmVzc0hvdXJTZWdzIiwiZmdFdmVudFNlZ3MiLCJiZ0V2ZW50U2VncyIsInNsaWNlTm93RGF0ZSIsImNvbXB1dGVBY3RpdmVSYW5nZSIsInJhbmdlUmVzIiwic2xpY2VFdmVudFJhbmdlcyIsImFmZmVjdGVkSW5zdGFuY2VzIiwic2Vnc18xIiwiZXZlbnRSYW5nZXMiLCJldmVudFJhbmdlc18xIiwic2xpY2VFdmVudFJhbmdlIiwic2Vnc18yIiwiaXNDb21wb25lbnRBbGxEYXkiLCJpc0ludGVyYWN0aW9uVmFsaWQiLCJpc05ld1Byb3BzVmFsaWQiLCJpc0RhdGVTZWxlY3Rpb25WYWxpZCIsImNhbGVuZGFyU3RhdGUiLCJkYXRlU3Bhbk1ldGEiLCJmaWx0ZXJDb25maWciLCJpc0ludGVyYWN0aW9uUHJvcHNWYWxpZCIsImlzRGF0ZVNlbGVjdGlvblByb3BzVmFsaWQiLCJzdWJqZWN0RXZlbnRTdG9yZSIsInN1YmplY3REZWZzIiwic3ViamVjdEluc3RhbmNlcyIsInN1YmplY3RDb25maWdzIiwib3RoZXJFdmVudFN0b3JlIiwib3RoZXJEZWZzIiwib3RoZXJJbnN0YW5jZXMiLCJvdGhlckNvbmZpZ3MiLCJzdWJqZWN0SW5zdGFuY2VJZCIsInN1YmplY3RJbnN0YW5jZSIsInN1YmplY3RSYW5nZSIsInN1YmplY3RDb25maWciLCJzdWJqZWN0RGVmIiwiYWxsQ29uc3RyYWludHNQYXNzIiwiZXZlbnRPdmVybGFwRnVuYyIsIm90aGVySW5zdGFuY2VJZCIsIm90aGVySW5zdGFuY2UiLCJvdGhlck92ZXJsYXAiLCJjYWxlbmRhckV2ZW50U3RvcmUiLCJzdWJqZWN0QWxsb3ciLCJzdWJqZWN0RGF0ZVNwYW4iLCJvcmlnRGVmIiwib3JpZ0luc3RhbmNlIiwicmVsZXZhbnRFdmVudFN0b3JlIiwicmVsZXZhbnREZWZzIiwicmVsZXZhbnRJbnN0YW5jZXMiLCJzZWxlY3Rpb25SYW5nZSIsInNlbGVjdE92ZXJsYXBGdW5jIiwicmVsZXZhbnRJbnN0YW5jZUlkIiwicmVsZXZhbnRJbnN0YW5jZSIsInNlbGVjdGlvbkFsbG93IiwiZnVsbERhdGVTcGFuIiwiYnVzaW5lc3NIb3Vyc1VuZXhwYW5kZWQiLCJjb25zdHJhaW50c18xIiwiYW55UmFuZ2VzQ29udGFpblJhbmdlIiwiY29uc3RyYWludFRvUmFuZ2VzIiwiZXZlbnRTdG9yZVRvUmFuZ2VzIiwib3V0ZXJSYW5nZXMiLCJvdXRlclJhbmdlc18xIiwiVklTSUJMRV9ISURERU5fUkUiLCJTY3JvbGxlciIsImxpcXVpZElzQWJzb2x1dGUiLCJpc0Fic29sdXRlIiwib3ZlcmNvbWVMZWZ0Iiwib3ZlcmNvbWVSaWdodCIsIm92ZXJjb21lQm90dG9tIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwibWF4SGVpZ2h0IiwibmVlZHNYU2Nyb2xsaW5nIiwicmVhbENsaWVudFdpZHRoIiwiZ2V0WVNjcm9sbGJhcldpZHRoIiwiY2hpbGRFbCIsIm5lZWRzWVNjcm9sbGluZyIsInJlYWxDbGllbnRIZWlnaHQiLCJnZXRYU2Nyb2xsYmFyV2lkdGgiLCJSZWZNYXAiLCJtYXN0ZXJDYWxsYmFjayIsImN1cnJlbnRNYXAiLCJkZXB0aHMiLCJjYWxsYmFja01hcCIsImhhbmRsZVZhbHVlIiwicmVtb3ZlZCIsImFkZGVkIiwicmVmQ2FsbGJhY2siLCJjb2xsZWN0IiwiZ2V0QWxsIiwiY29tcHV0ZVNocmlua1dpZHRoIiwiY2h1bmtFbHMiLCJzaHJpbmtDZWxscyIsImxhcmdlc3RXaWR0aCIsInNocmlua0NlbGxzXzEiLCJzaHJpbmtDZWxsIiwiZ2V0U2VjdGlvbkhhc0xpcXVpZEhlaWdodCIsInNlY3Rpb25Db25maWciLCJnZXRBbGxvd1lTY3JvbGxpbmciLCJyZW5kZXJDaHVua0NvbnRlbnQiLCJjaHVua0NvbmZpZyIsImlzSGVhZGVyIiwidGFibGVDbGFzc05hbWUiLCJzeW5jUm93SGVpZ2h0cyIsIm1pbldpZHRoIiwidGFibGVNaW5XaWR0aCIsInRhYmxlQ29sR3JvdXBOb2RlIiwicm93Q29udGVudCIsImlzQ29sUHJvcHNFcXVhbCIsImNvbHMwIiwiY29sczEiLCJyZW5kZXJNaWNyb0NvbEdyb3VwIiwiY29scyIsInNocmlua1dpZHRoIiwiY29sTm9kZXMiLCJjb2xzXzEiLCJjb2xQcm9wcyIsInNhbml0aXplU2hyaW5rV2lkdGgiLCJoYXNTaHJpbmtXaWR0aCIsImNvbHNfMiIsImdldFNjcm9sbEdyaWRDbGFzc05hbWVzIiwiZ2V0U2VjdGlvbkNsYXNzTmFtZXMiLCJ3aG9sZVRhYmxlVkdyb3ciLCJyZW5kZXJTY3JvbGxTaGltIiwiZ2V0U3RpY2t5SGVhZGVyRGF0ZXMiLCJnZXRTdGlja3lGb290ZXJTY3JvbGxiYXIiLCJTaW1wbGVTY3JvbGxHcmlkIiwicHJvY2Vzc0NvbHMiLCJzY3JvbGxlclJlZnMiLCJzY3JvbGxlckVsUmVmcyIsIl9oYW5kbGVTY3JvbGxlckVsIiwiZm9yY2VZU2Nyb2xsYmFycyIsInNjcm9sbGVyQ2xpZW50V2lkdGhzIiwic2Nyb2xsZXJDbGllbnRIZWlnaHRzIiwiaGFuZGxlU2l6aW5nIiwiY29tcHV0ZVNjcm9sbGVyRGltcyIsInNlY3Rpb25Db25maWdzIiwic2VjdGlvbnMiLCJtaWNyb0NvbEdyb3VwTm9kZSIsImNvbGxhcHNpYmxlV2lkdGgiLCJjb25maWdDbnQiLCJjb25maWdJIiwiY3VycmVudENvbmZpZyIsImhlYWRTZWN0aW9uTm9kZXMiLCJib2R5U2VjdGlvbk5vZGVzIiwiZm9vdFNlY3Rpb25Ob2RlcyIsImlzQnVnZ3kiLCJyb2xlQXR0cnMiLCJvdXRlckNvbnRlbnQiLCJyZW5kZXJDaHVua1RkIiwiY2h1bmsiLCJpc0xpcXVpZCIsInNlY3Rpb25LZXkiLCJyb3dTeW5jSGVpZ2h0cyIsInJlcG9ydFJvd0hlaWdodENoYW5nZSIsInNjcm9sbGVyRWwiLCJzZWN0aW9uIiwiZ2V0U2VjdGlvbkJ5S2V5Iiwic2Nyb2xsZXJFbFJlZiIsInNjcm9sbGJhcldpZHRoIiwic2Nyb2xsZXIiLCJoYXJuZXNzRWwiLCJzZWN0aW9uc18xIiwiRXZlbnRSb290IiwidGltZVRleHQiLCJkaXNhYmxlRHJhZ2dpbmciLCJkaXNhYmxlUmVzaXppbmciLCJpc0RhdGVTZWxlY3RpbmciLCJzdGFuZGFyZENsYXNzTmFtZXMiLCJTdGFuZGFyZEV2ZW50IiwiZGVmYXVsdFRpbWVGb3JtYXQiLCJyZW5kZXJJbm5lckNvbnRlbnQkMSIsImlubmVyUHJvcHMiLCJOb3dJbmRpY2F0b3JSb290IiwiaXNBeGlzIiwiREFZX05VTV9GT1JNQVQiLCJEYXlDZWxsQ29udGVudCIsInJlZmluZURheUNlbGxIb29rUHJvcHMiLCJzaG93RGF5TnVtYmVyIiwiZXh0cmFQcm9wcyIsImRheU51bWJlclRleHQiLCJEYXlDZWxsUm9vdCIsInJlZmluZUhvb2tQcm9wcyIsImRhdGFBdHRycyIsInJlbmRlckZpbGwiLCJmaWxsVHlwZSIsIkJnRXZlbnQiLCJXZWVrTnVtYmVyUm9vdCIsImRlZmF1bHRGb3JtYXQiLCJyZW5kZXJJbm5lciIsIlBBRERJTkdfRlJPTV9WSUVXUE9SVCIsIlBvcG92ZXIiLCJoYW5kbGVEb2N1bWVudE1vdXNlRG93biIsImhhbmRsZUNsb3NlQ2xpY2siLCJoYW5kbGVEb2N1bWVudEtleURvd24iLCJvbkNsb3NlIiwiY3JlYXRlUG9ydGFsIiwiZXh0cmFBdHRycyIsInBhcmVudEVsIiwiYWxpZ25tZW50RWwiLCJhbGlnbkdyaWRUb3AiLCJhbGlnbm1lbnRSZWN0IiwicG9wb3ZlckRpbXMiLCJwb3BvdmVyVG9wIiwicG9wb3ZlckxlZnQiLCJvcmlnaW5fMSIsIm9mZnNldFBhcmVudCIsIk1vcmVQb3BvdmVyIiwic3RhcnREYXRlIiwiZGF5Q2xhc3NOYW1lcyIsImV4dHJhRGF0ZVNwYW4iLCJkYXlFbCIsImxheWVyIiwiTW9yZUxpbmtSb290IiwibGlua0VsUmVmIiwiaXNQb3BvdmVyT3BlbiIsInBvcG92ZXJJZCIsImhhbmRsZUNsaWNrIiwiY29tcHV0ZVJhbmdlIiwiYnVpbGRQdWJsaWNTZWciLCJhbGxEYXlEYXRlIiwiYWxsU2VncyIsImhpZGRlblNlZ3MiLCJoYW5kbGVQb3BvdmVyQ2xvc2UiLCJtb3JlQ250Iiwic2hvcnRUZXh0IiwicmVuZGVyTW9yZUxpbmtJbm5lciIsImFsaWdubWVudEVsUmVmIiwicG9wb3ZlckNvbnRlbnQiLCJ1cGRhdGVQYXJlbnRFbCIsImNvbXB1dGVFYXJsaWVzdFNlZ1N0YXJ0IiwiY29tcHV0ZUxhdGVzdFNlZ0VuZCIsInBpY2tFYXJsaWVzdFN0YXJ0Iiwic2VnMCIsInNlZzEiLCJwaWNrTGF0ZXN0RW5kIiwidmVyc2lvbiIsInBhcnNlTWFya2VyIiwiayJdLCJzb3VyY2VzIjpbIm1haW4uY2pzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuRnVsbENhbGVuZGFyIHY1LjExLjJcbkRvY3MgJiBMaWNlbnNlOiBodHRwczovL2Z1bGxjYWxlbmRhci5pby9cbihjKSAyMDIyIEFkYW0gU2hhd1xuKi9cbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuO1xudmFyIHRzbGliID0gcmVxdWlyZSgndHNsaWInKTtcbnZhciB2ZG9tX2NqcyA9IHJlcXVpcmUoJy4vdmRvbS5janMnKTtcblxuLy8gbm8gcHVibGljIHR5cGVzIHlldC4gd2hlbiB0aGVyZSBhcmUsIGV4cG9ydCBmcm9tOlxuLy8gaW1wb3J0IHt9IGZyb20gJy4vYXBpLXR5cGUtZGVwcydcbnZhciBFdmVudFNvdXJjZUFwaSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFdmVudFNvdXJjZUFwaShjb250ZXh0LCBpbnRlcm5hbEV2ZW50U291cmNlKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxFdmVudFNvdXJjZSA9IGludGVybmFsRXZlbnRTb3VyY2U7XG4gICAgfVxuICAgIEV2ZW50U291cmNlQXBpLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiAnUkVNT1ZFX0VWRU5UX1NPVVJDRScsXG4gICAgICAgICAgICBzb3VyY2VJZDogdGhpcy5pbnRlcm5hbEV2ZW50U291cmNlLnNvdXJjZUlkLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEV2ZW50U291cmNlQXBpLnByb3RvdHlwZS5yZWZldGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ0ZFVENIX0VWRU5UX1NPVVJDRVMnLFxuICAgICAgICAgICAgc291cmNlSWRzOiBbdGhpcy5pbnRlcm5hbEV2ZW50U291cmNlLnNvdXJjZUlkXSxcbiAgICAgICAgICAgIGlzUmVmZXRjaDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRTb3VyY2VBcGkucHJvdG90eXBlLCBcImlkXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEV2ZW50U291cmNlLnB1YmxpY0lkO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50U291cmNlQXBpLnByb3RvdHlwZSwgXCJ1cmxcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVybmFsRXZlbnRTb3VyY2UubWV0YS51cmw7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRTb3VyY2VBcGkucHJvdG90eXBlLCBcImZvcm1hdFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxFdmVudFNvdXJjZS5tZXRhLmZvcm1hdDsgLy8gVE9ETzogYmFkLiBub3QgZ3VhcmFudGVlZFxuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIEV2ZW50U291cmNlQXBpO1xufSgpKTtcblxuZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbCkge1xuICAgIGlmIChlbC5wYXJlbnROb2RlKSB7XG4gICAgICAgIGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIH1cbn1cbi8vIFF1ZXJ5aW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBlbGVtZW50Q2xvc2VzdChlbCwgc2VsZWN0b3IpIHtcbiAgICBpZiAoZWwuY2xvc2VzdCkge1xuICAgICAgICByZXR1cm4gZWwuY2xvc2VzdChzZWxlY3Rvcik7XG4gICAgICAgIC8vIHJlYWxseSBiYWQgZmFsbGJhY2sgZm9yIElFXG4gICAgICAgIC8vIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvY2xvc2VzdFxuICAgIH1cbiAgICBpZiAoIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyhlbCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGRvIHtcbiAgICAgICAgaWYgKGVsZW1lbnRNYXRjaGVzKGVsLCBzZWxlY3RvcikpIHtcbiAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgfVxuICAgICAgICBlbCA9IChlbC5wYXJlbnRFbGVtZW50IHx8IGVsLnBhcmVudE5vZGUpO1xuICAgIH0gd2hpbGUgKGVsICE9PSBudWxsICYmIGVsLm5vZGVUeXBlID09PSAxKTtcbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVzKGVsLCBzZWxlY3Rvcikge1xuICAgIHZhciBtZXRob2QgPSBlbC5tYXRjaGVzIHx8IGVsLm1hdGNoZXNTZWxlY3RvciB8fCBlbC5tc01hdGNoZXNTZWxlY3RvcjtcbiAgICByZXR1cm4gbWV0aG9kLmNhbGwoZWwsIHNlbGVjdG9yKTtcbn1cbi8vIGFjY2VwdHMgbXVsdGlwbGUgc3ViamVjdCBlbHNcbi8vIHJldHVybnMgYSByZWFsIGFycmF5LiBnb29kIGZvciBtZXRob2RzIGxpa2UgZm9yRWFjaFxuLy8gVE9ETzogYWNjZXB0IHRoZSBkb2N1bWVudFxuZnVuY3Rpb24gZmluZEVsZW1lbnRzKGNvbnRhaW5lciwgc2VsZWN0b3IpIHtcbiAgICB2YXIgY29udGFpbmVycyA9IGNvbnRhaW5lciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gW2NvbnRhaW5lcl0gOiBjb250YWluZXI7XG4gICAgdmFyIGFsbE1hdGNoZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRhaW5lcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIG1hdGNoZXMgPSBjb250YWluZXJzW2ldLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1hdGNoZXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICAgIGFsbE1hdGNoZXMucHVzaChtYXRjaGVzW2pdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWxsTWF0Y2hlcztcbn1cbi8vIGFjY2VwdHMgbXVsdGlwbGUgc3ViamVjdCBlbHNcbi8vIG9ubHkgcXVlcmllcyBkaXJlY3QgY2hpbGQgZWxlbWVudHMgLy8gVE9ETzogcmVuYW1lIHRvIGZpbmREaXJlY3RDaGlsZHJlbiFcbmZ1bmN0aW9uIGZpbmREaXJlY3RDaGlsZHJlbihwYXJlbnQsIHNlbGVjdG9yKSB7XG4gICAgdmFyIHBhcmVudHMgPSBwYXJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IFtwYXJlbnRdIDogcGFyZW50O1xuICAgIHZhciBhbGxNYXRjaGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBjaGlsZE5vZGVzID0gcGFyZW50c1tpXS5jaGlsZHJlbjsgLy8gb25seSBldmVyIGVsZW1lbnRzXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgICAgdmFyIGNoaWxkTm9kZSA9IGNoaWxkTm9kZXNbal07XG4gICAgICAgICAgICBpZiAoIXNlbGVjdG9yIHx8IGVsZW1lbnRNYXRjaGVzKGNoaWxkTm9kZSwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgICAgICAgYWxsTWF0Y2hlcy5wdXNoKGNoaWxkTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFsbE1hdGNoZXM7XG59XG4vLyBTdHlsZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIFBJWEVMX1BST1BfUkUgPSAvKHRvcHxsZWZ0fHJpZ2h0fGJvdHRvbXx3aWR0aHxoZWlnaHQpJC9pO1xuZnVuY3Rpb24gYXBwbHlTdHlsZShlbCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBwcm9wcykge1xuICAgICAgICBhcHBseVN0eWxlUHJvcChlbCwgcHJvcE5hbWUsIHByb3BzW3Byb3BOYW1lXSk7XG4gICAgfVxufVxuZnVuY3Rpb24gYXBwbHlTdHlsZVByb3AoZWwsIG5hbWUsIHZhbCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICBlbC5zdHlsZVtuYW1lXSA9ICcnO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiBQSVhFTF9QUk9QX1JFLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZWwuc3R5bGVbbmFtZV0gPSB2YWwgKyBcInB4XCI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBlbC5zdHlsZVtuYW1lXSA9IHZhbDtcbiAgICB9XG59XG4vLyBFdmVudCBIYW5kbGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gaWYgaW50ZXJjZXB0aW5nIGJ1YmJsZWQgZXZlbnRzIGF0IHRoZSBkb2N1bWVudC93aW5kb3cvYm9keSBsZXZlbCxcbi8vIGFuZCB3YW50IHRvIHNlZSBvcmlnaW5hdGluZyBlbGVtZW50ICh0aGUgJ3RhcmdldCcpLCB1c2UgdGhpcyB1dGlsIGluc3RlYWRcbi8vIG9mIGBldi50YXJnZXRgIGJlY2F1c2UgaXQgZ29lcyB3aXRoaW4gd2ViLWNvbXBvbmVudCBib3VuZGFyaWVzLlxuZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXRWaWFSb290KGV2KSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gKF9iID0gKF9hID0gZXYuY29tcG9zZWRQYXRoKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChldilbMF0pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGV2LnRhcmdldDtcbn1cbi8vIFNoYWRvdyBET00gY29uc3VkZXJhdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGdldEVsUm9vdChlbCkge1xuICAgIHJldHVybiBlbC5nZXRSb290Tm9kZSA/IGVsLmdldFJvb3ROb2RlKCkgOiBkb2N1bWVudDtcbn1cbi8vIFVuaXF1ZSBJRCBmb3IgRE9NIGF0dHJpYnV0ZVxudmFyIGd1aWQkMSA9IDA7XG5mdW5jdGlvbiBnZXRVbmlxdWVEb21JZCgpIHtcbiAgICBndWlkJDEgKz0gMTtcbiAgICByZXR1cm4gJ2ZjLWRvbS0nICsgZ3VpZCQxO1xufVxuXG4vLyBTdG9wcyBhIG1vdXNlL3RvdWNoIGV2ZW50IGZyb20gZG9pbmcgaXQncyBuYXRpdmUgYnJvd3NlciBhY3Rpb25cbmZ1bmN0aW9uIHByZXZlbnREZWZhdWx0KGV2KSB7XG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbn1cbi8vIEV2ZW50IERlbGVnYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGJ1aWxkRGVsZWdhdGlvbkhhbmRsZXIoc2VsZWN0b3IsIGhhbmRsZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIHZhciBtYXRjaGVkQ2hpbGQgPSBlbGVtZW50Q2xvc2VzdChldi50YXJnZXQsIHNlbGVjdG9yKTtcbiAgICAgICAgaWYgKG1hdGNoZWRDaGlsZCkge1xuICAgICAgICAgICAgaGFuZGxlci5jYWxsKG1hdGNoZWRDaGlsZCwgZXYsIG1hdGNoZWRDaGlsZCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gbGlzdGVuQnlTZWxlY3Rvcihjb250YWluZXIsIGV2ZW50VHlwZSwgc2VsZWN0b3IsIGhhbmRsZXIpIHtcbiAgICB2YXIgYXR0YWNoZWRIYW5kbGVyID0gYnVpbGREZWxlZ2F0aW9uSGFuZGxlcihzZWxlY3RvciwgaGFuZGxlcik7XG4gICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBhdHRhY2hlZEhhbmRsZXIpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgYXR0YWNoZWRIYW5kbGVyKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gbGlzdGVuVG9Ib3ZlckJ5U2VsZWN0b3IoY29udGFpbmVyLCBzZWxlY3Rvciwgb25Nb3VzZUVudGVyLCBvbk1vdXNlTGVhdmUpIHtcbiAgICB2YXIgY3VycmVudE1hdGNoZWRDaGlsZDtcbiAgICByZXR1cm4gbGlzdGVuQnlTZWxlY3Rvcihjb250YWluZXIsICdtb3VzZW92ZXInLCBzZWxlY3RvciwgZnVuY3Rpb24gKG1vdXNlT3ZlckV2LCBtYXRjaGVkQ2hpbGQpIHtcbiAgICAgICAgaWYgKG1hdGNoZWRDaGlsZCAhPT0gY3VycmVudE1hdGNoZWRDaGlsZCkge1xuICAgICAgICAgICAgY3VycmVudE1hdGNoZWRDaGlsZCA9IG1hdGNoZWRDaGlsZDtcbiAgICAgICAgICAgIG9uTW91c2VFbnRlcihtb3VzZU92ZXJFdiwgbWF0Y2hlZENoaWxkKTtcbiAgICAgICAgICAgIHZhciByZWFsT25Nb3VzZUxlYXZlXzEgPSBmdW5jdGlvbiAobW91c2VMZWF2ZUV2KSB7XG4gICAgICAgICAgICAgICAgY3VycmVudE1hdGNoZWRDaGlsZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgb25Nb3VzZUxlYXZlKG1vdXNlTGVhdmVFdiwgbWF0Y2hlZENoaWxkKTtcbiAgICAgICAgICAgICAgICBtYXRjaGVkQ2hpbGQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHJlYWxPbk1vdXNlTGVhdmVfMSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gbGlzdGVuIHRvIHRoZSBuZXh0IG1vdXNlbGVhdmUsIGFuZCB0aGVuIHVuYXR0YWNoXG4gICAgICAgICAgICBtYXRjaGVkQ2hpbGQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHJlYWxPbk1vdXNlTGVhdmVfMSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIEFuaW1hdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIHRyYW5zaXRpb25FdmVudE5hbWVzID0gW1xuICAgICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcbiAgICAnb3RyYW5zaXRpb25lbmQnLFxuICAgICdvVHJhbnNpdGlvbkVuZCcsXG4gICAgJ21zVHJhbnNpdGlvbkVuZCcsXG4gICAgJ3RyYW5zaXRpb25lbmQnLFxuXTtcbi8vIHRyaWdnZXJlZCBvbmx5IHdoZW4gdGhlIG5leHQgc2luZ2xlIHN1YnNlcXVlbnQgdHJhbnNpdGlvbiBmaW5pc2hlc1xuZnVuY3Rpb24gd2hlblRyYW5zaXRpb25Eb25lKGVsLCBjYWxsYmFjaykge1xuICAgIHZhciByZWFsQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgY2FsbGJhY2soZXYpO1xuICAgICAgICB0cmFuc2l0aW9uRXZlbnROYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCByZWFsQ2FsbGJhY2spO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHRyYW5zaXRpb25FdmVudE5hbWVzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgcmVhbENhbGxiYWNrKTsgLy8gY3Jvc3MtYnJvd3NlciB3YXkgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHRyYW5zaXRpb24gZmluaXNoZXNcbiAgICB9KTtcbn1cbi8vIEFSSUEgd29ya2Fyb3VuZHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGNyZWF0ZUFyaWFDbGlja0F0dHJzKGhhbmRsZXIpIHtcbiAgICByZXR1cm4gdHNsaWIuX19hc3NpZ24oeyBvbkNsaWNrOiBoYW5kbGVyIH0sIGNyZWF0ZUFyaWFLZXlib2FyZEF0dHJzKGhhbmRsZXIpKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUFyaWFLZXlib2FyZEF0dHJzKGhhbmRsZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0YWJJbmRleDogMCxcbiAgICAgICAgb25LZXlEb3duOiBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIGlmIChldi5rZXkgPT09ICdFbnRlcicgfHwgZXYua2V5ID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGV2KTtcbiAgICAgICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpOyAvLyBpZiBzcGFjZSwgZG9uJ3Qgc2Nyb2xsIGRvd24gcGFnZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH07XG59XG5cbnZhciBndWlkTnVtYmVyID0gMDtcbmZ1bmN0aW9uIGd1aWQoKSB7XG4gICAgZ3VpZE51bWJlciArPSAxO1xuICAgIHJldHVybiBTdHJpbmcoZ3VpZE51bWJlcik7XG59XG4vKiBGdWxsQ2FsZW5kYXItc3BlY2lmaWMgRE9NIFV0aWxpdGllc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vLyBNYWtlIHRoZSBtb3VzZSBjdXJzb3IgZXhwcmVzcyB0aGF0IGFuIGV2ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRoZSBjdXJyZW50IGFyZWFcbmZ1bmN0aW9uIGRpc2FibGVDdXJzb3IoKSB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdmYy1ub3QtYWxsb3dlZCcpO1xufVxuLy8gUmV0dXJucyB0aGUgbW91c2UgY3Vyc29yIHRvIGl0cyBvcmlnaW5hbCBsb29rXG5mdW5jdGlvbiBlbmFibGVDdXJzb3IoKSB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdmYy1ub3QtYWxsb3dlZCcpO1xufVxuLyogU2VsZWN0aW9uXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmZ1bmN0aW9uIHByZXZlbnRTZWxlY3Rpb24oZWwpIHtcbiAgICBlbC5jbGFzc0xpc3QuYWRkKCdmYy11bnNlbGVjdGFibGUnKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3RzdGFydCcsIHByZXZlbnREZWZhdWx0KTtcbn1cbmZ1bmN0aW9uIGFsbG93U2VsZWN0aW9uKGVsKSB7XG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnZmMtdW5zZWxlY3RhYmxlJyk7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2VsZWN0c3RhcnQnLCBwcmV2ZW50RGVmYXVsdCk7XG59XG4vKiBDb250ZXh0IE1lbnVcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuZnVuY3Rpb24gcHJldmVudENvbnRleHRNZW51KGVsKSB7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBwcmV2ZW50RGVmYXVsdCk7XG59XG5mdW5jdGlvbiBhbGxvd0NvbnRleHRNZW51KGVsKSB7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBwcmV2ZW50RGVmYXVsdCk7XG59XG5mdW5jdGlvbiBwYXJzZUZpZWxkU3BlY3MoaW5wdXQpIHtcbiAgICB2YXIgc3BlY3MgPSBbXTtcbiAgICB2YXIgdG9rZW5zID0gW107XG4gICAgdmFyIGk7XG4gICAgdmFyIHRva2VuO1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRva2VucyA9IGlucHV0LnNwbGl0KC9cXHMqLFxccyovKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRva2VucyA9IFtpbnB1dF07XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIHRva2VucyA9IGlucHV0O1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc3BlY3MucHVzaCh0b2tlbi5jaGFyQXQoMCkgPT09ICctJyA/XG4gICAgICAgICAgICAgICAgeyBmaWVsZDogdG9rZW4uc3Vic3RyaW5nKDEpLCBvcmRlcjogLTEgfSA6XG4gICAgICAgICAgICAgICAgeyBmaWVsZDogdG9rZW4sIG9yZGVyOiAxIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3BlY3MucHVzaCh7IGZ1bmM6IHRva2VuIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGVjcztcbn1cbmZ1bmN0aW9uIGNvbXBhcmVCeUZpZWxkU3BlY3Mob2JqMCwgb2JqMSwgZmllbGRTcGVjcykge1xuICAgIHZhciBpO1xuICAgIHZhciBjbXA7XG4gICAgZm9yIChpID0gMDsgaSA8IGZpZWxkU3BlY3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY21wID0gY29tcGFyZUJ5RmllbGRTcGVjKG9iajAsIG9iajEsIGZpZWxkU3BlY3NbaV0pO1xuICAgICAgICBpZiAoY21wKSB7XG4gICAgICAgICAgICByZXR1cm4gY21wO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xufVxuZnVuY3Rpb24gY29tcGFyZUJ5RmllbGRTcGVjKG9iajAsIG9iajEsIGZpZWxkU3BlYykge1xuICAgIGlmIChmaWVsZFNwZWMuZnVuYykge1xuICAgICAgICByZXR1cm4gZmllbGRTcGVjLmZ1bmMob2JqMCwgb2JqMSk7XG4gICAgfVxuICAgIHJldHVybiBmbGV4aWJsZUNvbXBhcmUob2JqMFtmaWVsZFNwZWMuZmllbGRdLCBvYmoxW2ZpZWxkU3BlYy5maWVsZF0pXG4gICAgICAgICogKGZpZWxkU3BlYy5vcmRlciB8fCAxKTtcbn1cbmZ1bmN0aW9uIGZsZXhpYmxlQ29tcGFyZShhLCBiKSB7XG4gICAgaWYgKCFhICYmICFiKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAoYiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgaWYgKGEgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhhKS5sb2NhbGVDb21wYXJlKFN0cmluZyhiKSk7XG4gICAgfVxuICAgIHJldHVybiBhIC0gYjtcbn1cbi8qIFN0cmluZyBVdGlsaXRpZXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuZnVuY3Rpb24gcGFkU3RhcnQodmFsLCBsZW4pIHtcbiAgICB2YXIgcyA9IFN0cmluZyh2YWwpO1xuICAgIHJldHVybiAnMDAwJy5zdWJzdHIoMCwgbGVuIC0gcy5sZW5ndGgpICsgcztcbn1cbmZ1bmN0aW9uIGZvcm1hdFdpdGhPcmRpbmFscyhmb3JtYXR0ZXIsIGFyZ3MsIGZhbGxiYWNrVGV4dCkge1xuICAgIGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXR0ZXIuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmb3JtYXR0ZXIgPT09ICdzdHJpbmcnKSB7IC8vIG5vbi1ibGFuayBzdHJpbmdcbiAgICAgICAgcmV0dXJuIGFyZ3MucmVkdWNlKGZ1bmN0aW9uIChzdHIsIGFyZywgaW5kZXgpIHsgcmV0dXJuIChzdHIucmVwbGFjZSgnJCcgKyBpbmRleCwgYXJnIHx8ICcnKSk7IH0sIGZvcm1hdHRlcik7XG4gICAgfVxuICAgIHJldHVybiBmYWxsYmFja1RleHQ7XG59XG4vKiBOdW1iZXIgVXRpbGl0aWVzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmZ1bmN0aW9uIGNvbXBhcmVOdW1iZXJzKGEsIGIpIHtcbiAgICByZXR1cm4gYSAtIGI7XG59XG5mdW5jdGlvbiBpc0ludChuKSB7XG4gICAgcmV0dXJuIG4gJSAxID09PSAwO1xufVxuLyogRkMtc3BlY2lmaWMgRE9NIGRpbWVuc2lvbiBzdHVmZlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5mdW5jdGlvbiBjb21wdXRlU21hbGxlc3RDZWxsV2lkdGgoY2VsbEVsKSB7XG4gICAgdmFyIGFsbFdpZHRoRWwgPSBjZWxsRWwucXVlcnlTZWxlY3RvcignLmZjLXNjcm9sbGdyaWQtc2hyaW5rLWZyYW1lJyk7XG4gICAgdmFyIGNvbnRlbnRXaWR0aEVsID0gY2VsbEVsLnF1ZXJ5U2VsZWN0b3IoJy5mYy1zY3JvbGxncmlkLXNocmluay1jdXNoaW9uJyk7XG4gICAgaWYgKCFhbGxXaWR0aEVsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbmVlZHMgZmMtc2Nyb2xsZ3JpZC1zaHJpbmstZnJhbWUgY2xhc3NOYW1lJyk7IC8vIFRPRE86IHVzZSBjb25zdFxuICAgIH1cbiAgICBpZiAoIWNvbnRlbnRXaWR0aEVsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbmVlZHMgZmMtc2Nyb2xsZ3JpZC1zaHJpbmstY3VzaGlvbiBjbGFzc05hbWUnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNlbGxFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIGFsbFdpZHRoRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggKyAvLyB0aGUgY2VsbCBwYWRkaW5nK2JvcmRlclxuICAgICAgICBjb250ZW50V2lkdGhFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbn1cblxudmFyIERBWV9JRFMgPSBbJ3N1bicsICdtb24nLCAndHVlJywgJ3dlZCcsICd0aHUnLCAnZnJpJywgJ3NhdCddO1xuLy8gQWRkaW5nXG5mdW5jdGlvbiBhZGRXZWVrcyhtLCBuKSB7XG4gICAgdmFyIGEgPSBkYXRlVG9VdGNBcnJheShtKTtcbiAgICBhWzJdICs9IG4gKiA3O1xuICAgIHJldHVybiBhcnJheVRvVXRjRGF0ZShhKTtcbn1cbmZ1bmN0aW9uIGFkZERheXMobSwgbikge1xuICAgIHZhciBhID0gZGF0ZVRvVXRjQXJyYXkobSk7XG4gICAgYVsyXSArPSBuO1xuICAgIHJldHVybiBhcnJheVRvVXRjRGF0ZShhKTtcbn1cbmZ1bmN0aW9uIGFkZE1zKG0sIG4pIHtcbiAgICB2YXIgYSA9IGRhdGVUb1V0Y0FycmF5KG0pO1xuICAgIGFbNl0gKz0gbjtcbiAgICByZXR1cm4gYXJyYXlUb1V0Y0RhdGUoYSk7XG59XG4vLyBEaWZmaW5nIChhbGwgcmV0dXJuIGZsb2F0cylcbi8vIFRPRE86IHdoeSBub3QgdXNlIHJhbmdlcz9cbmZ1bmN0aW9uIGRpZmZXZWVrcyhtMCwgbTEpIHtcbiAgICByZXR1cm4gZGlmZkRheXMobTAsIG0xKSAvIDc7XG59XG5mdW5jdGlvbiBkaWZmRGF5cyhtMCwgbTEpIHtcbiAgICByZXR1cm4gKG0xLnZhbHVlT2YoKSAtIG0wLnZhbHVlT2YoKSkgLyAoMTAwMCAqIDYwICogNjAgKiAyNCk7XG59XG5mdW5jdGlvbiBkaWZmSG91cnMobTAsIG0xKSB7XG4gICAgcmV0dXJuIChtMS52YWx1ZU9mKCkgLSBtMC52YWx1ZU9mKCkpIC8gKDEwMDAgKiA2MCAqIDYwKTtcbn1cbmZ1bmN0aW9uIGRpZmZNaW51dGVzKG0wLCBtMSkge1xuICAgIHJldHVybiAobTEudmFsdWVPZigpIC0gbTAudmFsdWVPZigpKSAvICgxMDAwICogNjApO1xufVxuZnVuY3Rpb24gZGlmZlNlY29uZHMobTAsIG0xKSB7XG4gICAgcmV0dXJuIChtMS52YWx1ZU9mKCkgLSBtMC52YWx1ZU9mKCkpIC8gMTAwMDtcbn1cbmZ1bmN0aW9uIGRpZmZEYXlBbmRUaW1lKG0wLCBtMSkge1xuICAgIHZhciBtMGRheSA9IHN0YXJ0T2ZEYXkobTApO1xuICAgIHZhciBtMWRheSA9IHN0YXJ0T2ZEYXkobTEpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHllYXJzOiAwLFxuICAgICAgICBtb250aHM6IDAsXG4gICAgICAgIGRheXM6IE1hdGgucm91bmQoZGlmZkRheXMobTBkYXksIG0xZGF5KSksXG4gICAgICAgIG1pbGxpc2Vjb25kczogKG0xLnZhbHVlT2YoKSAtIG0xZGF5LnZhbHVlT2YoKSkgLSAobTAudmFsdWVPZigpIC0gbTBkYXkudmFsdWVPZigpKSxcbiAgICB9O1xufVxuLy8gRGlmZmluZyBXaG9sZSBVbml0c1xuZnVuY3Rpb24gZGlmZldob2xlV2Vla3MobTAsIG0xKSB7XG4gICAgdmFyIGQgPSBkaWZmV2hvbGVEYXlzKG0wLCBtMSk7XG4gICAgaWYgKGQgIT09IG51bGwgJiYgZCAlIDcgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGQgLyA3O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGRpZmZXaG9sZURheXMobTAsIG0xKSB7XG4gICAgaWYgKHRpbWVBc01zKG0wKSA9PT0gdGltZUFzTXMobTEpKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGRpZmZEYXlzKG0wLCBtMSkpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8vIFN0YXJ0LU9mXG5mdW5jdGlvbiBzdGFydE9mRGF5KG0pIHtcbiAgICByZXR1cm4gYXJyYXlUb1V0Y0RhdGUoW1xuICAgICAgICBtLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgICAgIG0uZ2V0VVRDTW9udGgoKSxcbiAgICAgICAgbS5nZXRVVENEYXRlKCksXG4gICAgXSk7XG59XG5mdW5jdGlvbiBzdGFydE9mSG91cihtKSB7XG4gICAgcmV0dXJuIGFycmF5VG9VdGNEYXRlKFtcbiAgICAgICAgbS5nZXRVVENGdWxsWWVhcigpLFxuICAgICAgICBtLmdldFVUQ01vbnRoKCksXG4gICAgICAgIG0uZ2V0VVRDRGF0ZSgpLFxuICAgICAgICBtLmdldFVUQ0hvdXJzKCksXG4gICAgXSk7XG59XG5mdW5jdGlvbiBzdGFydE9mTWludXRlKG0pIHtcbiAgICByZXR1cm4gYXJyYXlUb1V0Y0RhdGUoW1xuICAgICAgICBtLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgICAgIG0uZ2V0VVRDTW9udGgoKSxcbiAgICAgICAgbS5nZXRVVENEYXRlKCksXG4gICAgICAgIG0uZ2V0VVRDSG91cnMoKSxcbiAgICAgICAgbS5nZXRVVENNaW51dGVzKCksXG4gICAgXSk7XG59XG5mdW5jdGlvbiBzdGFydE9mU2Vjb25kKG0pIHtcbiAgICByZXR1cm4gYXJyYXlUb1V0Y0RhdGUoW1xuICAgICAgICBtLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgICAgIG0uZ2V0VVRDTW9udGgoKSxcbiAgICAgICAgbS5nZXRVVENEYXRlKCksXG4gICAgICAgIG0uZ2V0VVRDSG91cnMoKSxcbiAgICAgICAgbS5nZXRVVENNaW51dGVzKCksXG4gICAgICAgIG0uZ2V0VVRDU2Vjb25kcygpLFxuICAgIF0pO1xufVxuLy8gV2VlayBDb21wdXRhdGlvblxuZnVuY3Rpb24gd2Vla09mWWVhcihtYXJrZXIsIGRvdywgZG95KSB7XG4gICAgdmFyIHkgPSBtYXJrZXIuZ2V0VVRDRnVsbFllYXIoKTtcbiAgICB2YXIgdyA9IHdlZWtPZkdpdmVuWWVhcihtYXJrZXIsIHksIGRvdywgZG95KTtcbiAgICBpZiAodyA8IDEpIHtcbiAgICAgICAgcmV0dXJuIHdlZWtPZkdpdmVuWWVhcihtYXJrZXIsIHkgLSAxLCBkb3csIGRveSk7XG4gICAgfVxuICAgIHZhciBuZXh0VyA9IHdlZWtPZkdpdmVuWWVhcihtYXJrZXIsIHkgKyAxLCBkb3csIGRveSk7XG4gICAgaWYgKG5leHRXID49IDEpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHcsIG5leHRXKTtcbiAgICB9XG4gICAgcmV0dXJuIHc7XG59XG5mdW5jdGlvbiB3ZWVrT2ZHaXZlblllYXIobWFya2VyLCB5ZWFyLCBkb3csIGRveSkge1xuICAgIHZhciBmaXJzdFdlZWtTdGFydCA9IGFycmF5VG9VdGNEYXRlKFt5ZWFyLCAwLCAxICsgZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KV0pO1xuICAgIHZhciBkYXlTdGFydCA9IHN0YXJ0T2ZEYXkobWFya2VyKTtcbiAgICB2YXIgZGF5cyA9IE1hdGgucm91bmQoZGlmZkRheXMoZmlyc3RXZWVrU3RhcnQsIGRheVN0YXJ0KSk7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoZGF5cyAvIDcpICsgMTsgLy8gemVyby1pbmRleGVkXG59XG4vLyBzdGFydC1vZi1maXJzdC13ZWVrIC0gc3RhcnQtb2YteWVhclxuZnVuY3Rpb24gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSB7XG4gICAgLy8gZmlyc3Qtd2VlayBkYXkgLS0gd2hpY2ggamFudWFyeSBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgKDQgZm9yIGlzbywgMSBmb3Igb3RoZXIpXG4gICAgdmFyIGZ3ZCA9IDcgKyBkb3cgLSBkb3k7XG4gICAgLy8gZmlyc3Qtd2VlayBkYXkgbG9jYWwgd2Vla2RheSAtLSB3aGljaCBsb2NhbCB3ZWVrZGF5IGlzIGZ3ZFxuICAgIHZhciBmd2RsdyA9ICg3ICsgYXJyYXlUb1V0Y0RhdGUoW3llYXIsIDAsIGZ3ZF0pLmdldFVUQ0RheSgpIC0gZG93KSAlIDc7XG4gICAgcmV0dXJuIC1md2RsdyArIGZ3ZCAtIDE7XG59XG4vLyBBcnJheSBDb252ZXJzaW9uXG5mdW5jdGlvbiBkYXRlVG9Mb2NhbEFycmF5KGRhdGUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIGRhdGUuZ2V0TW9udGgoKSxcbiAgICAgICAgZGF0ZS5nZXREYXRlKCksXG4gICAgICAgIGRhdGUuZ2V0SG91cnMoKSxcbiAgICAgICAgZGF0ZS5nZXRNaW51dGVzKCksXG4gICAgICAgIGRhdGUuZ2V0U2Vjb25kcygpLFxuICAgICAgICBkYXRlLmdldE1pbGxpc2Vjb25kcygpLFxuICAgIF07XG59XG5mdW5jdGlvbiBhcnJheVRvTG9jYWxEYXRlKGEpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoYVswXSwgYVsxXSB8fCAwLCBhWzJdID09IG51bGwgPyAxIDogYVsyXSwgLy8gZGF5IG9mIG1vbnRoXG4gICAgYVszXSB8fCAwLCBhWzRdIHx8IDAsIGFbNV0gfHwgMCk7XG59XG5mdW5jdGlvbiBkYXRlVG9VdGNBcnJheShkYXRlKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgZGF0ZS5nZXRVVENGdWxsWWVhcigpLFxuICAgICAgICBkYXRlLmdldFVUQ01vbnRoKCksXG4gICAgICAgIGRhdGUuZ2V0VVRDRGF0ZSgpLFxuICAgICAgICBkYXRlLmdldFVUQ0hvdXJzKCksXG4gICAgICAgIGRhdGUuZ2V0VVRDTWludXRlcygpLFxuICAgICAgICBkYXRlLmdldFVUQ1NlY29uZHMoKSxcbiAgICAgICAgZGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKSxcbiAgICBdO1xufVxuZnVuY3Rpb24gYXJyYXlUb1V0Y0RhdGUoYSkge1xuICAgIC8vIGFjY29yZGluZyB0byB3ZWIgc3RhbmRhcmRzIChhbmQgU2FmYXJpKSwgYSBtb250aCBpbmRleCBpcyByZXF1aXJlZC5cbiAgICAvLyBtYXNzYWdlIGlmIG9ubHkgZ2l2ZW4gYSB5ZWFyLlxuICAgIGlmIChhLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBhID0gYS5jb25jYXQoWzBdKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KERhdGUsIGEpKTtcbn1cbi8vIE90aGVyIFV0aWxzXG5mdW5jdGlvbiBpc1ZhbGlkRGF0ZShtKSB7XG4gICAgcmV0dXJuICFpc05hTihtLnZhbHVlT2YoKSk7XG59XG5mdW5jdGlvbiB0aW1lQXNNcyhtKSB7XG4gICAgcmV0dXJuIG0uZ2V0VVRDSG91cnMoKSAqIDEwMDAgKiA2MCAqIDYwICtcbiAgICAgICAgbS5nZXRVVENNaW51dGVzKCkgKiAxMDAwICogNjAgK1xuICAgICAgICBtLmdldFVUQ1NlY29uZHMoKSAqIDEwMDAgK1xuICAgICAgICBtLmdldFVUQ01pbGxpc2Vjb25kcygpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVFdmVudEluc3RhbmNlKGRlZklkLCByYW5nZSwgZm9yY2VkU3RhcnRUem8sIGZvcmNlZEVuZFR6bykge1xuICAgIHJldHVybiB7XG4gICAgICAgIGluc3RhbmNlSWQ6IGd1aWQoKSxcbiAgICAgICAgZGVmSWQ6IGRlZklkLFxuICAgICAgICByYW5nZTogcmFuZ2UsXG4gICAgICAgIGZvcmNlZFN0YXJ0VHpvOiBmb3JjZWRTdGFydFR6byA9PSBudWxsID8gbnVsbCA6IGZvcmNlZFN0YXJ0VHpvLFxuICAgICAgICBmb3JjZWRFbmRUem86IGZvcmNlZEVuZFR6byA9PSBudWxsID8gbnVsbCA6IGZvcmNlZEVuZFR6byxcbiAgICB9O1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuLy8gTWVyZ2VzIGFuIGFycmF5IG9mIG9iamVjdHMgaW50byBhIHNpbmdsZSBvYmplY3QuXG4vLyBUaGUgc2Vjb25kIGFyZ3VtZW50IGFsbG93cyBmb3IgYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgd2hvJ3Mgb2JqZWN0IHZhbHVlcyB3aWxsIGJlIG1lcmdlZCB0b2dldGhlci5cbmZ1bmN0aW9uIG1lcmdlUHJvcHMocHJvcE9ianMsIGNvbXBsZXhQcm9wc01hcCkge1xuICAgIHZhciBkZXN0ID0ge307XG4gICAgaWYgKGNvbXBsZXhQcm9wc01hcCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lXzEgaW4gY29tcGxleFByb3BzTWFwKSB7XG4gICAgICAgICAgICB2YXIgY29tcGxleE9ianMgPSBbXTtcbiAgICAgICAgICAgIC8vIGNvbGxlY3QgdGhlIHRyYWlsaW5nIG9iamVjdCB2YWx1ZXMsIHN0b3BwaW5nIHdoZW4gYSBub24tb2JqZWN0IGlzIGRpc2NvdmVyZWRcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBwcm9wT2Jqcy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICAgICAgICAgIHZhciB2YWwgPSBwcm9wT2Jqc1tpXVtuYW1lXzFdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwpIHsgLy8gbm9uLW51bGwgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXhPYmpzLnVuc2hpZnQodmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzdFtuYW1lXzFdID0gdmFsOyAvLyBpZiB0aGVyZSB3ZXJlIG5vIG9iamVjdHMsIHRoaXMgdmFsdWUgd2lsbCBiZSB1c2VkXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIHRoZSB0cmFpbGluZyB2YWx1ZXMgd2VyZSBvYmplY3RzLCB1c2UgdGhlIG1lcmdlZCB2YWx1ZVxuICAgICAgICAgICAgaWYgKGNvbXBsZXhPYmpzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGRlc3RbbmFtZV8xXSA9IG1lcmdlUHJvcHMoY29tcGxleE9ianMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGNvcHkgdmFsdWVzIGludG8gdGhlIGRlc3RpbmF0aW9uLCBnb2luZyBmcm9tIGxhc3QgdG8gZmlyc3RcbiAgICBmb3IgKHZhciBpID0gcHJvcE9ianMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgICAgdmFyIHByb3BzID0gcHJvcE9ianNbaV07XG4gICAgICAgIGZvciAodmFyIG5hbWVfMiBpbiBwcm9wcykge1xuICAgICAgICAgICAgaWYgKCEobmFtZV8yIGluIGRlc3QpKSB7IC8vIGlmIGFscmVhZHkgYXNzaWduZWQgYnkgcHJldmlvdXMgcHJvcHMgb3IgY29tcGxleCBwcm9wcywgZG9uJ3QgcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBkZXN0W25hbWVfMl0gPSBwcm9wc1tuYW1lXzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xufVxuZnVuY3Rpb24gZmlsdGVySGFzaChoYXNoLCBmdW5jKSB7XG4gICAgdmFyIGZpbHRlcmVkID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIGhhc2gpIHtcbiAgICAgICAgaWYgKGZ1bmMoaGFzaFtrZXldLCBrZXkpKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZFtrZXldID0gaGFzaFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaWx0ZXJlZDtcbn1cbmZ1bmN0aW9uIG1hcEhhc2goaGFzaCwgZnVuYykge1xuICAgIHZhciBuZXdIYXNoID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIGhhc2gpIHtcbiAgICAgICAgbmV3SGFzaFtrZXldID0gZnVuYyhoYXNoW2tleV0sIGtleSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdIYXNoO1xufVxuZnVuY3Rpb24gYXJyYXlUb0hhc2goYSkge1xuICAgIHZhciBoYXNoID0ge307XG4gICAgZm9yICh2YXIgX2kgPSAwLCBhXzEgPSBhOyBfaSA8IGFfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBhXzFbX2ldO1xuICAgICAgICBoYXNoW2l0ZW1dID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc2g7XG59XG5mdW5jdGlvbiBidWlsZEhhc2hGcm9tQXJyYXkoYSwgZnVuYykge1xuICAgIHZhciBoYXNoID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciB0dXBsZSA9IGZ1bmMoYVtpXSwgaSk7XG4gICAgICAgIGhhc2hbdHVwbGVbMF1dID0gdHVwbGVbMV07XG4gICAgfVxuICAgIHJldHVybiBoYXNoO1xufVxuZnVuY3Rpb24gaGFzaFZhbHVlc1RvQXJyYXkob2JqKSB7XG4gICAgdmFyIGEgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGEucHVzaChvYmpba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiBhO1xufVxuZnVuY3Rpb24gaXNQcm9wc0VxdWFsKG9iajAsIG9iajEpIHtcbiAgICBpZiAob2JqMCA9PT0gb2JqMSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZm9yICh2YXIga2V5IGluIG9iajApIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqMCwga2V5KSkge1xuICAgICAgICAgICAgaWYgKCEoa2V5IGluIG9iajEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGtleSBpbiBvYmoxKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iajEsIGtleSkpIHtcbiAgICAgICAgICAgIGlmIChvYmowW2tleV0gIT09IG9iajFba2V5XSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGdldFVuZXF1YWxQcm9wcyhvYmowLCBvYmoxKSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqMCkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmowLCBrZXkpKSB7XG4gICAgICAgICAgICBpZiAoIShrZXkgaW4gb2JqMSkpIHtcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqMSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmoxLCBrZXkpKSB7XG4gICAgICAgICAgICBpZiAob2JqMFtrZXldICE9PSBvYmoxW2tleV0pIHtcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbn1cbmZ1bmN0aW9uIGNvbXBhcmVPYmpzKG9sZFByb3BzLCBuZXdQcm9wcywgZXF1YWxpdHlGdW5jcykge1xuICAgIGlmIChlcXVhbGl0eUZ1bmNzID09PSB2b2lkIDApIHsgZXF1YWxpdHlGdW5jcyA9IHt9OyB9XG4gICAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZm9yICh2YXIga2V5IGluIG5ld1Byb3BzKSB7XG4gICAgICAgIGlmIChrZXkgaW4gb2xkUHJvcHMgJiYgaXNPYmpWYWxzRXF1YWwob2xkUHJvcHNba2V5XSwgbmV3UHJvcHNba2V5XSwgZXF1YWxpdHlGdW5jc1trZXldKSkgO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBjaGVjayBmb3IgcHJvcHMgdGhhdCB3ZXJlIG9taXR0ZWQgaW4gdGhlIG5ld1xuICAgIGZvciAodmFyIGtleSBpbiBvbGRQcm9wcykge1xuICAgICAgICBpZiAoIShrZXkgaW4gbmV3UHJvcHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vKlxuYXNzdW1lZCBcInRydWVcIiBlcXVhbGl0eSBmb3IgaGFuZGxlciBuYW1lcyBsaWtlIFwib25SZWNlaXZlU29tZXRoaW5nXCJcbiovXG5mdW5jdGlvbiBpc09ialZhbHNFcXVhbCh2YWwwLCB2YWwxLCBjb21wYXJhdG9yKSB7XG4gICAgaWYgKHZhbDAgPT09IHZhbDEgfHwgY29tcGFyYXRvciA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IodmFsMCwgdmFsMSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNvbGxlY3RGcm9tSGFzaChoYXNoLCBzdGFydEluZGV4LCBlbmRJbmRleCwgc3RlcCkge1xuICAgIGlmIChzdGFydEluZGV4ID09PSB2b2lkIDApIHsgc3RhcnRJbmRleCA9IDA7IH1cbiAgICBpZiAoc3RlcCA9PT0gdm9pZCAwKSB7IHN0ZXAgPSAxOyB9XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGlmIChlbmRJbmRleCA9PSBudWxsKSB7XG4gICAgICAgIGVuZEluZGV4ID0gT2JqZWN0LmtleXMoaGFzaCkubGVuZ3RoO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IGVuZEluZGV4OyBpICs9IHN0ZXApIHtcbiAgICAgICAgdmFyIHZhbCA9IGhhc2hbaV07XG4gICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkgeyAvLyB3aWxsIGRpc3JlZ2FyZCB1bmRlZmluZWQgZm9yIHNwYXJzZSBhcnJheXNcbiAgICAgICAgICAgIHJlcy5wdXNoKHZhbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWN1cnJpbmcocmVmaW5lZCwgZGVmYXVsdEFsbERheSwgZGF0ZUVudiwgcmVjdXJyaW5nVHlwZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlY3VycmluZ1R5cGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBwYXJzZWQgPSByZWN1cnJpbmdUeXBlc1tpXS5wYXJzZShyZWZpbmVkLCBkYXRlRW52KTtcbiAgICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICAgICAgdmFyIGFsbERheSA9IHJlZmluZWQuYWxsRGF5O1xuICAgICAgICAgICAgaWYgKGFsbERheSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYWxsRGF5ID0gZGVmYXVsdEFsbERheTtcbiAgICAgICAgICAgICAgICBpZiAoYWxsRGF5ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGF5ID0gcGFyc2VkLmFsbERheUd1ZXNzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsRGF5ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbERheSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhbGxEYXk6IGFsbERheSxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogcGFyc2VkLmR1cmF0aW9uLFxuICAgICAgICAgICAgICAgIHR5cGVEYXRhOiBwYXJzZWQudHlwZURhdGEsXG4gICAgICAgICAgICAgICAgdHlwZUlkOiBpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGV4cGFuZFJlY3VycmluZyhldmVudFN0b3JlLCBmcmFtaW5nUmFuZ2UsIGNvbnRleHQpIHtcbiAgICB2YXIgZGF0ZUVudiA9IGNvbnRleHQuZGF0ZUVudiwgcGx1Z2luSG9va3MgPSBjb250ZXh0LnBsdWdpbkhvb2tzLCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zO1xuICAgIHZhciBkZWZzID0gZXZlbnRTdG9yZS5kZWZzLCBpbnN0YW5jZXMgPSBldmVudFN0b3JlLmluc3RhbmNlcztcbiAgICAvLyByZW1vdmUgZXhpc3RpbmcgcmVjdXJyaW5nIGluc3RhbmNlc1xuICAgIC8vIFRPRE86IGJhZC4gYWx3YXlzIGV4cGFuZCBldmVudHMgYXMgYSBzZWNvbmQgc3RlcFxuICAgIGluc3RhbmNlcyA9IGZpbHRlckhhc2goaW5zdGFuY2VzLCBmdW5jdGlvbiAoaW5zdGFuY2UpIHsgcmV0dXJuICFkZWZzW2luc3RhbmNlLmRlZklkXS5yZWN1cnJpbmdEZWY7IH0pO1xuICAgIGZvciAodmFyIGRlZklkIGluIGRlZnMpIHtcbiAgICAgICAgdmFyIGRlZiA9IGRlZnNbZGVmSWRdO1xuICAgICAgICBpZiAoZGVmLnJlY3VycmluZ0RlZikge1xuICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gZGVmLnJlY3VycmluZ0RlZi5kdXJhdGlvbjtcbiAgICAgICAgICAgIGlmICghZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGRlZi5hbGxEYXkgP1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uIDpcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kZWZhdWx0VGltZWRFdmVudER1cmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHN0YXJ0cyA9IGV4cGFuZFJlY3VycmluZ1JhbmdlcyhkZWYsIGR1cmF0aW9uLCBmcmFtaW5nUmFuZ2UsIGRhdGVFbnYsIHBsdWdpbkhvb2tzLnJlY3VycmluZ1R5cGVzKTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgc3RhcnRzXzEgPSBzdGFydHM7IF9pIDwgc3RhcnRzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc3RhcnRzXzFbX2ldO1xuICAgICAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGNyZWF0ZUV2ZW50SW5zdGFuY2UoZGVmSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IGRhdGVFbnYuYWRkKHN0YXJ0LCBkdXJhdGlvbiksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VzW2luc3RhbmNlLmluc3RhbmNlSWRdID0gaW5zdGFuY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgZGVmczogZGVmcywgaW5zdGFuY2VzOiBpbnN0YW5jZXMgfTtcbn1cbi8qXG5FdmVudCBNVVNUIGhhdmUgYSByZWN1cnJpbmdEZWZcbiovXG5mdW5jdGlvbiBleHBhbmRSZWN1cnJpbmdSYW5nZXMoZXZlbnREZWYsIGR1cmF0aW9uLCBmcmFtaW5nUmFuZ2UsIGRhdGVFbnYsIHJlY3VycmluZ1R5cGVzKSB7XG4gICAgdmFyIHR5cGVEZWYgPSByZWN1cnJpbmdUeXBlc1tldmVudERlZi5yZWN1cnJpbmdEZWYudHlwZUlkXTtcbiAgICB2YXIgbWFya2VycyA9IHR5cGVEZWYuZXhwYW5kKGV2ZW50RGVmLnJlY3VycmluZ0RlZi50eXBlRGF0YSwge1xuICAgICAgICBzdGFydDogZGF0ZUVudi5zdWJ0cmFjdChmcmFtaW5nUmFuZ2Uuc3RhcnQsIGR1cmF0aW9uKSxcbiAgICAgICAgZW5kOiBmcmFtaW5nUmFuZ2UuZW5kLFxuICAgIH0sIGRhdGVFbnYpO1xuICAgIC8vIHRoZSByZWN1cnJlbmNlIHBsdWdpbnMgZG9uJ3QgZ3VhcmFudGVlIHRoYXQgYWxsLWRheSBldmVudHMgYXJlIHN0YXJ0LW9mLWRheSwgc28gd2UgaGF2ZSB0b1xuICAgIGlmIChldmVudERlZi5hbGxEYXkpIHtcbiAgICAgICAgbWFya2VycyA9IG1hcmtlcnMubWFwKHN0YXJ0T2ZEYXkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFya2Vycztcbn1cblxudmFyIElOVEVSTkFMX1VOSVRTID0gWyd5ZWFycycsICdtb250aHMnLCAnZGF5cycsICdtaWxsaXNlY29uZHMnXTtcbnZhciBQQVJTRV9SRSA9IC9eKC0/KSg/OihcXGQrKVxcLik/KFxcZCspOihcXGRcXGQpKD86OihcXGRcXGQpKD86XFwuKFxcZFxcZFxcZCkpPyk/Lztcbi8vIFBhcnNpbmcgYW5kIENyZWF0aW9uXG5mdW5jdGlvbiBjcmVhdGVEdXJhdGlvbihpbnB1dCwgdW5pdCkge1xuICAgIHZhciBfYTtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gcGFyc2VTdHJpbmcoaW5wdXQpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiBpbnB1dCkgeyAvLyBub24tbnVsbCBvYmplY3RcbiAgICAgICAgcmV0dXJuIHBhcnNlT2JqZWN0KGlucHV0KTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlT2JqZWN0KChfYSA9IHt9LCBfYVt1bml0IHx8ICdtaWxsaXNlY29uZHMnXSA9IGlucHV0LCBfYSkpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nKHMpIHtcbiAgICB2YXIgbSA9IFBBUlNFX1JFLmV4ZWMocyk7XG4gICAgaWYgKG0pIHtcbiAgICAgICAgdmFyIHNpZ24gPSBtWzFdID8gLTEgOiAxO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeWVhcnM6IDAsXG4gICAgICAgICAgICBtb250aHM6IDAsXG4gICAgICAgICAgICBkYXlzOiBzaWduICogKG1bMl0gPyBwYXJzZUludChtWzJdLCAxMCkgOiAwKSxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kczogc2lnbiAqICgobVszXSA/IHBhcnNlSW50KG1bM10sIDEwKSA6IDApICogNjAgKiA2MCAqIDEwMDAgKyAvLyBob3Vyc1xuICAgICAgICAgICAgICAgIChtWzRdID8gcGFyc2VJbnQobVs0XSwgMTApIDogMCkgKiA2MCAqIDEwMDAgKyAvLyBtaW51dGVzXG4gICAgICAgICAgICAgICAgKG1bNV0gPyBwYXJzZUludChtWzVdLCAxMCkgOiAwKSAqIDEwMDAgKyAvLyBzZWNvbmRzXG4gICAgICAgICAgICAgICAgKG1bNl0gPyBwYXJzZUludChtWzZdLCAxMCkgOiAwKSAvLyBtc1xuICAgICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBwYXJzZU9iamVjdChvYmopIHtcbiAgICB2YXIgZHVyYXRpb24gPSB7XG4gICAgICAgIHllYXJzOiBvYmoueWVhcnMgfHwgb2JqLnllYXIgfHwgMCxcbiAgICAgICAgbW9udGhzOiBvYmoubW9udGhzIHx8IG9iai5tb250aCB8fCAwLFxuICAgICAgICBkYXlzOiBvYmouZGF5cyB8fCBvYmouZGF5IHx8IDAsXG4gICAgICAgIG1pbGxpc2Vjb25kczogKG9iai5ob3VycyB8fCBvYmouaG91ciB8fCAwKSAqIDYwICogNjAgKiAxMDAwICsgLy8gaG91cnNcbiAgICAgICAgICAgIChvYmoubWludXRlcyB8fCBvYmoubWludXRlIHx8IDApICogNjAgKiAxMDAwICsgLy8gbWludXRlc1xuICAgICAgICAgICAgKG9iai5zZWNvbmRzIHx8IG9iai5zZWNvbmQgfHwgMCkgKiAxMDAwICsgLy8gc2Vjb25kc1xuICAgICAgICAgICAgKG9iai5taWxsaXNlY29uZHMgfHwgb2JqLm1pbGxpc2Vjb25kIHx8IG9iai5tcyB8fCAwKSwgLy8gbXNcbiAgICB9O1xuICAgIHZhciB3ZWVrcyA9IG9iai53ZWVrcyB8fCBvYmoud2VlaztcbiAgICBpZiAod2Vla3MpIHtcbiAgICAgICAgZHVyYXRpb24uZGF5cyArPSB3ZWVrcyAqIDc7XG4gICAgICAgIGR1cmF0aW9uLnNwZWNpZmllZFdlZWtzID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGR1cmF0aW9uO1xufVxuLy8gRXF1YWxpdHlcbmZ1bmN0aW9uIGR1cmF0aW9uc0VxdWFsKGQwLCBkMSkge1xuICAgIHJldHVybiBkMC55ZWFycyA9PT0gZDEueWVhcnMgJiZcbiAgICAgICAgZDAubW9udGhzID09PSBkMS5tb250aHMgJiZcbiAgICAgICAgZDAuZGF5cyA9PT0gZDEuZGF5cyAmJlxuICAgICAgICBkMC5taWxsaXNlY29uZHMgPT09IGQxLm1pbGxpc2Vjb25kcztcbn1cbmZ1bmN0aW9uIGFzQ2xlYW5EYXlzKGR1cikge1xuICAgIGlmICghZHVyLnllYXJzICYmICFkdXIubW9udGhzICYmICFkdXIubWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHJldHVybiBkdXIuZGF5cztcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG4vLyBTaW1wbGUgTWF0aFxuZnVuY3Rpb24gYWRkRHVyYXRpb25zKGQwLCBkMSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHllYXJzOiBkMC55ZWFycyArIGQxLnllYXJzLFxuICAgICAgICBtb250aHM6IGQwLm1vbnRocyArIGQxLm1vbnRocyxcbiAgICAgICAgZGF5czogZDAuZGF5cyArIGQxLmRheXMsXG4gICAgICAgIG1pbGxpc2Vjb25kczogZDAubWlsbGlzZWNvbmRzICsgZDEubWlsbGlzZWNvbmRzLFxuICAgIH07XG59XG5mdW5jdGlvbiBzdWJ0cmFjdER1cmF0aW9ucyhkMSwgZDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB5ZWFyczogZDEueWVhcnMgLSBkMC55ZWFycyxcbiAgICAgICAgbW9udGhzOiBkMS5tb250aHMgLSBkMC5tb250aHMsXG4gICAgICAgIGRheXM6IGQxLmRheXMgLSBkMC5kYXlzLFxuICAgICAgICBtaWxsaXNlY29uZHM6IGQxLm1pbGxpc2Vjb25kcyAtIGQwLm1pbGxpc2Vjb25kcyxcbiAgICB9O1xufVxuZnVuY3Rpb24gbXVsdGlwbHlEdXJhdGlvbihkLCBuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeWVhcnM6IGQueWVhcnMgKiBuLFxuICAgICAgICBtb250aHM6IGQubW9udGhzICogbixcbiAgICAgICAgZGF5czogZC5kYXlzICogbixcbiAgICAgICAgbWlsbGlzZWNvbmRzOiBkLm1pbGxpc2Vjb25kcyAqIG4sXG4gICAgfTtcbn1cbi8vIENvbnZlcnNpb25zXG4vLyBcIlJvdWdoXCIgYmVjYXVzZSB0aGV5IGFyZSBiYXNlZCBvbiBhdmVyYWdlLWNhc2UgR3JlZ29yaWFuIG1vbnRocy95ZWFyc1xuZnVuY3Rpb24gYXNSb3VnaFllYXJzKGR1cikge1xuICAgIHJldHVybiBhc1JvdWdoRGF5cyhkdXIpIC8gMzY1O1xufVxuZnVuY3Rpb24gYXNSb3VnaE1vbnRocyhkdXIpIHtcbiAgICByZXR1cm4gYXNSb3VnaERheXMoZHVyKSAvIDMwO1xufVxuZnVuY3Rpb24gYXNSb3VnaERheXMoZHVyKSB7XG4gICAgcmV0dXJuIGFzUm91Z2hNcyhkdXIpIC8gODY0ZTU7XG59XG5mdW5jdGlvbiBhc1JvdWdoTWludXRlcyhkdXIpIHtcbiAgICByZXR1cm4gYXNSb3VnaE1zKGR1cikgLyAoMTAwMCAqIDYwKTtcbn1cbmZ1bmN0aW9uIGFzUm91Z2hTZWNvbmRzKGR1cikge1xuICAgIHJldHVybiBhc1JvdWdoTXMoZHVyKSAvIDEwMDA7XG59XG5mdW5jdGlvbiBhc1JvdWdoTXMoZHVyKSB7XG4gICAgcmV0dXJuIGR1ci55ZWFycyAqICgzNjUgKiA4NjRlNSkgK1xuICAgICAgICBkdXIubW9udGhzICogKDMwICogODY0ZTUpICtcbiAgICAgICAgZHVyLmRheXMgKiA4NjRlNSArXG4gICAgICAgIGR1ci5taWxsaXNlY29uZHM7XG59XG4vLyBBZHZhbmNlZCBNYXRoXG5mdW5jdGlvbiB3aG9sZURpdmlkZUR1cmF0aW9ucyhudW1lcmF0b3IsIGRlbm9taW5hdG9yKSB7XG4gICAgdmFyIHJlcyA9IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBJTlRFUk5BTF9VTklUUy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgdW5pdCA9IElOVEVSTkFMX1VOSVRTW2ldO1xuICAgICAgICBpZiAoZGVub21pbmF0b3JbdW5pdF0pIHtcbiAgICAgICAgICAgIHZhciBsb2NhbFJlcyA9IG51bWVyYXRvclt1bml0XSAvIGRlbm9taW5hdG9yW3VuaXRdO1xuICAgICAgICAgICAgaWYgKCFpc0ludChsb2NhbFJlcykgfHwgKHJlcyAhPT0gbnVsbCAmJiByZXMgIT09IGxvY2FsUmVzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzID0gbG9jYWxSZXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobnVtZXJhdG9yW3VuaXRdKSB7XG4gICAgICAgICAgICAvLyBuZWVkcyB0byBkaXZpZGUgYnkgc29tZXRoaW5nIGJ1dCBjYW4ndCFcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBncmVhdGVzdER1cmF0aW9uRGVub21pbmF0b3IoZHVyKSB7XG4gICAgdmFyIG1zID0gZHVyLm1pbGxpc2Vjb25kcztcbiAgICBpZiAobXMpIHtcbiAgICAgICAgaWYgKG1zICUgMTAwMCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdW5pdDogJ21pbGxpc2Vjb25kJywgdmFsdWU6IG1zIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1zICUgKDEwMDAgKiA2MCkgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVuaXQ6ICdzZWNvbmQnLCB2YWx1ZTogbXMgLyAxMDAwIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1zICUgKDEwMDAgKiA2MCAqIDYwKSAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdW5pdDogJ21pbnV0ZScsIHZhbHVlOiBtcyAvICgxMDAwICogNjApIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1zKSB7XG4gICAgICAgICAgICByZXR1cm4geyB1bml0OiAnaG91cicsIHZhbHVlOiBtcyAvICgxMDAwICogNjAgKiA2MCkgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZHVyLmRheXMpIHtcbiAgICAgICAgaWYgKGR1ci5zcGVjaWZpZWRXZWVrcyAmJiBkdXIuZGF5cyAlIDcgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVuaXQ6ICd3ZWVrJywgdmFsdWU6IGR1ci5kYXlzIC8gNyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHVuaXQ6ICdkYXknLCB2YWx1ZTogZHVyLmRheXMgfTtcbiAgICB9XG4gICAgaWYgKGR1ci5tb250aHMpIHtcbiAgICAgICAgcmV0dXJuIHsgdW5pdDogJ21vbnRoJywgdmFsdWU6IGR1ci5tb250aHMgfTtcbiAgICB9XG4gICAgaWYgKGR1ci55ZWFycykge1xuICAgICAgICByZXR1cm4geyB1bml0OiAneWVhcicsIHZhbHVlOiBkdXIueWVhcnMgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdW5pdDogJ21pbGxpc2Vjb25kJywgdmFsdWU6IDAgfTtcbn1cblxuLy8gdGltZVpvbmVPZmZzZXQgaXMgaW4gbWludXRlc1xuZnVuY3Rpb24gYnVpbGRJc29TdHJpbmcobWFya2VyLCB0aW1lWm9uZU9mZnNldCwgc3RyaXBaZXJvVGltZSkge1xuICAgIGlmIChzdHJpcFplcm9UaW1lID09PSB2b2lkIDApIHsgc3RyaXBaZXJvVGltZSA9IGZhbHNlOyB9XG4gICAgdmFyIHMgPSBtYXJrZXIudG9JU09TdHJpbmcoKTtcbiAgICBzID0gcy5yZXBsYWNlKCcuMDAwJywgJycpO1xuICAgIGlmIChzdHJpcFplcm9UaW1lKSB7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoJ1QwMDowMDowMFonLCAnJyk7XG4gICAgfVxuICAgIGlmIChzLmxlbmd0aCA+IDEwKSB7IC8vIHRpbWUgcGFydCB3YXNuJ3Qgc3RyaXBwZWQsIGNhbiBhZGQgdGltZXpvbmUgaW5mb1xuICAgICAgICBpZiAodGltZVpvbmVPZmZzZXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgnWicsICcnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aW1lWm9uZU9mZnNldCAhPT0gMCkge1xuICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgnWicsIGZvcm1hdFRpbWVab25lT2Zmc2V0KHRpbWVab25lT2Zmc2V0LCB0cnVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBpdHMgVVRDLTAgYW5kIHdlIHdhbnQgdG8ga2VlcCB0aGUgWlxuICAgIH1cbiAgICByZXR1cm4gcztcbn1cbi8vIGZvcm1hdHMgdGhlIGRhdGUsIGJ1dCB3aXRoIG5vIHRpbWUgcGFydFxuLy8gVE9ETzogc29tZWhvdyBtZXJnZSB3aXRoIGJ1aWxkSXNvU3RyaW5nIGFuZCBzdHJpcFplcm9UaW1lXG4vLyBUT0RPOiByZW5hbWUuIG9taXQgXCJzdHJpbmdcIlxuZnVuY3Rpb24gZm9ybWF0RGF5U3RyaW5nKG1hcmtlcikge1xuICAgIHJldHVybiBtYXJrZXIudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9ULiokLywgJycpO1xufVxuLy8gVE9ETzogdXNlIERhdGU6OnRvSVNPU3RyaW5nIGFuZCB1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgVD9cbmZ1bmN0aW9uIGZvcm1hdElzb1RpbWVTdHJpbmcobWFya2VyKSB7XG4gICAgcmV0dXJuIHBhZFN0YXJ0KG1hcmtlci5nZXRVVENIb3VycygpLCAyKSArICc6JyArXG4gICAgICAgIHBhZFN0YXJ0KG1hcmtlci5nZXRVVENNaW51dGVzKCksIDIpICsgJzonICtcbiAgICAgICAgcGFkU3RhcnQobWFya2VyLmdldFVUQ1NlY29uZHMoKSwgMik7XG59XG5mdW5jdGlvbiBmb3JtYXRUaW1lWm9uZU9mZnNldChtaW51dGVzLCBkb0lzbykge1xuICAgIGlmIChkb0lzbyA9PT0gdm9pZCAwKSB7IGRvSXNvID0gZmFsc2U7IH1cbiAgICB2YXIgc2lnbiA9IG1pbnV0ZXMgPCAwID8gJy0nIDogJysnO1xuICAgIHZhciBhYnMgPSBNYXRoLmFicyhtaW51dGVzKTtcbiAgICB2YXIgaG91cnMgPSBNYXRoLmZsb29yKGFicyAvIDYwKTtcbiAgICB2YXIgbWlucyA9IE1hdGgucm91bmQoYWJzICUgNjApO1xuICAgIGlmIChkb0lzbykge1xuICAgICAgICByZXR1cm4gc2lnbiArIHBhZFN0YXJ0KGhvdXJzLCAyKSArIFwiOlwiICsgcGFkU3RhcnQobWlucywgMik7XG4gICAgfVxuICAgIHJldHVybiBcIkdNVFwiICsgc2lnbiArIGhvdXJzICsgKG1pbnMgPyBcIjpcIiArIHBhZFN0YXJ0KG1pbnMsIDIpIDogJycpO1xufVxuXG4vLyBUT0RPOiBuZXcgdXRpbCBhcnJheWlmeT9cbmZ1bmN0aW9uIHJlbW92ZUV4YWN0KGFycmF5LCBleGFjdFZhbCkge1xuICAgIHZhciByZW1vdmVDbnQgPSAwO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGFycmF5Lmxlbmd0aCkge1xuICAgICAgICBpZiAoYXJyYXlbaV0gPT09IGV4YWN0VmFsKSB7XG4gICAgICAgICAgICBhcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICByZW1vdmVDbnQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVtb3ZlQ250O1xufVxuZnVuY3Rpb24gaXNBcnJheXNFcXVhbChhMCwgYTEsIGVxdWFsaXR5RnVuYykge1xuICAgIGlmIChhMCA9PT0gYTEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBsZW4gPSBhMC5sZW5ndGg7XG4gICAgdmFyIGk7XG4gICAgaWYgKGxlbiAhPT0gYTEubGVuZ3RoKSB7IC8vIG5vdCBhcnJheT8gb3Igbm90IHNhbWUgbGVuZ3RoP1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBpZiAoIShlcXVhbGl0eUZ1bmMgPyBlcXVhbGl0eUZ1bmMoYTBbaV0sIGExW2ldKSA6IGEwW2ldID09PSBhMVtpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbWVtb2l6ZSh3b3JrZXJGdW5jLCByZXNFcXVhbGl0eSwgdGVhcmRvd25GdW5jKSB7XG4gICAgdmFyIGN1cnJlbnRBcmdzO1xuICAgIHZhciBjdXJyZW50UmVzO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBuZXdBcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBuZXdBcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjdXJyZW50QXJncykge1xuICAgICAgICAgICAgY3VycmVudFJlcyA9IHdvcmtlckZ1bmMuYXBwbHkodGhpcywgbmV3QXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWlzQXJyYXlzRXF1YWwoY3VycmVudEFyZ3MsIG5ld0FyZ3MpKSB7XG4gICAgICAgICAgICBpZiAodGVhcmRvd25GdW5jKSB7XG4gICAgICAgICAgICAgICAgdGVhcmRvd25GdW5jKGN1cnJlbnRSZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlcyA9IHdvcmtlckZ1bmMuYXBwbHkodGhpcywgbmV3QXJncyk7XG4gICAgICAgICAgICBpZiAoIXJlc0VxdWFsaXR5IHx8ICFyZXNFcXVhbGl0eShyZXMsIGN1cnJlbnRSZXMpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFJlcyA9IHJlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50QXJncyA9IG5ld0FyZ3M7XG4gICAgICAgIHJldHVybiBjdXJyZW50UmVzO1xuICAgIH07XG59XG5mdW5jdGlvbiBtZW1vaXplT2JqQXJnKHdvcmtlckZ1bmMsIHJlc0VxdWFsaXR5LCB0ZWFyZG93bkZ1bmMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBjdXJyZW50QXJnO1xuICAgIHZhciBjdXJyZW50UmVzO1xuICAgIHJldHVybiBmdW5jdGlvbiAobmV3QXJnKSB7XG4gICAgICAgIGlmICghY3VycmVudEFyZykge1xuICAgICAgICAgICAgY3VycmVudFJlcyA9IHdvcmtlckZ1bmMuY2FsbChfdGhpcywgbmV3QXJnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaXNQcm9wc0VxdWFsKGN1cnJlbnRBcmcsIG5ld0FyZykpIHtcbiAgICAgICAgICAgIGlmICh0ZWFyZG93bkZ1bmMpIHtcbiAgICAgICAgICAgICAgICB0ZWFyZG93bkZ1bmMoY3VycmVudFJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmVzID0gd29ya2VyRnVuYy5jYWxsKF90aGlzLCBuZXdBcmcpO1xuICAgICAgICAgICAgaWYgKCFyZXNFcXVhbGl0eSB8fCAhcmVzRXF1YWxpdHkocmVzLCBjdXJyZW50UmVzKSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRSZXMgPSByZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudEFyZyA9IG5ld0FyZztcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXM7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG1lbW9pemVBcnJheWxpa2UoLy8gdXNlZCBhdCBhbGw/XG53b3JrZXJGdW5jLCByZXNFcXVhbGl0eSwgdGVhcmRvd25GdW5jKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB2YXIgY3VycmVudEFyZ1NldHMgPSBbXTtcbiAgICB2YXIgY3VycmVudFJlc3VsdHMgPSBbXTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG5ld0FyZ1NldHMpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRMZW4gPSBjdXJyZW50QXJnU2V0cy5sZW5ndGg7XG4gICAgICAgIHZhciBuZXdMZW4gPSBuZXdBcmdTZXRzLmxlbmd0aDtcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICBmb3IgKDsgaSA8IGN1cnJlbnRMZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKCFuZXdBcmdTZXRzW2ldKSB7IC8vIG9uZSBvZiB0aGUgb2xkIHNldHMgbm8gbG9uZ2VyIGV4aXN0c1xuICAgICAgICAgICAgICAgIGlmICh0ZWFyZG93bkZ1bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVhcmRvd25GdW5jKGN1cnJlbnRSZXN1bHRzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghaXNBcnJheXNFcXVhbChjdXJyZW50QXJnU2V0c1tpXSwgbmV3QXJnU2V0c1tpXSkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGVhcmRvd25GdW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlYXJkb3duRnVuYyhjdXJyZW50UmVzdWx0c1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciByZXMgPSB3b3JrZXJGdW5jLmFwcGx5KF90aGlzLCBuZXdBcmdTZXRzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc0VxdWFsaXR5IHx8ICFyZXNFcXVhbGl0eShyZXMsIGN1cnJlbnRSZXN1bHRzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVzdWx0c1tpXSA9IHJlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7IGkgPCBuZXdMZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgY3VycmVudFJlc3VsdHNbaV0gPSB3b3JrZXJGdW5jLmFwcGx5KF90aGlzLCBuZXdBcmdTZXRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50QXJnU2V0cyA9IG5ld0FyZ1NldHM7XG4gICAgICAgIGN1cnJlbnRSZXN1bHRzLnNwbGljZShuZXdMZW4pOyAvLyByZW1vdmUgZXhjZXNzXG4gICAgICAgIHJldHVybiBjdXJyZW50UmVzdWx0cztcbiAgICB9O1xufVxuZnVuY3Rpb24gbWVtb2l6ZUhhc2hsaWtlKHdvcmtlckZ1bmMsIHJlc0VxdWFsaXR5LCB0ZWFyZG93bkZ1bmMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBjdXJyZW50QXJnSGFzaCA9IHt9O1xuICAgIHZhciBjdXJyZW50UmVzSGFzaCA9IHt9O1xuICAgIHJldHVybiBmdW5jdGlvbiAobmV3QXJnSGFzaCkge1xuICAgICAgICB2YXIgbmV3UmVzSGFzaCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gbmV3QXJnSGFzaCkge1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50UmVzSGFzaFtrZXldKSB7XG4gICAgICAgICAgICAgICAgbmV3UmVzSGFzaFtrZXldID0gd29ya2VyRnVuYy5hcHBseShfdGhpcywgbmV3QXJnSGFzaFtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFpc0FycmF5c0VxdWFsKGN1cnJlbnRBcmdIYXNoW2tleV0sIG5ld0FyZ0hhc2hba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGVhcmRvd25GdW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlYXJkb3duRnVuYyhjdXJyZW50UmVzSGFzaFtrZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJlcyA9IHdvcmtlckZ1bmMuYXBwbHkoX3RoaXMsIG5ld0FyZ0hhc2hba2V5XSk7XG4gICAgICAgICAgICAgICAgbmV3UmVzSGFzaFtrZXldID0gKHJlc0VxdWFsaXR5ICYmIHJlc0VxdWFsaXR5KHJlcywgY3VycmVudFJlc0hhc2hba2V5XSkpXG4gICAgICAgICAgICAgICAgICAgID8gY3VycmVudFJlc0hhc2hba2V5XVxuICAgICAgICAgICAgICAgICAgICA6IHJlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1Jlc0hhc2hba2V5XSA9IGN1cnJlbnRSZXNIYXNoW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudEFyZ0hhc2ggPSBuZXdBcmdIYXNoO1xuICAgICAgICBjdXJyZW50UmVzSGFzaCA9IG5ld1Jlc0hhc2g7XG4gICAgICAgIHJldHVybiBuZXdSZXNIYXNoO1xuICAgIH07XG59XG5cbnZhciBFWFRFTkRFRF9TRVRUSU5HU19BTkRfU0VWRVJJVElFUyA9IHtcbiAgICB3ZWVrOiAzLFxuICAgIHNlcGFyYXRvcjogMCxcbiAgICBvbWl0WmVyb01pbnV0ZTogMCxcbiAgICBtZXJpZGllbTogMCxcbiAgICBvbWl0Q29tbWFzOiAwLFxufTtcbnZhciBTVEFOREFSRF9EQVRFX1BST1BfU0VWRVJJVElFUyA9IHtcbiAgICB0aW1lWm9uZU5hbWU6IDcsXG4gICAgZXJhOiA2LFxuICAgIHllYXI6IDUsXG4gICAgbW9udGg6IDQsXG4gICAgZGF5OiAyLFxuICAgIHdlZWtkYXk6IDIsXG4gICAgaG91cjogMSxcbiAgICBtaW51dGU6IDEsXG4gICAgc2Vjb25kOiAxLFxufTtcbnZhciBNRVJJRElFTV9SRSA9IC9cXHMqKFthcF0pXFwuP21cXC4/L2k7IC8vIGVhdHMgdXAgbGVhZGluZyBzcGFjZXMgdG9vXG52YXIgQ09NTUFfUkUgPSAvLC9nOyAvLyB3ZSBuZWVkIHJlIGZvciBnbG9iYWxuZXNzXG52YXIgTVVMVElfU1BBQ0VfUkUgPSAvXFxzKy9nO1xudmFyIExUUl9SRSA9IC9cXHUyMDBlL2c7IC8vIGNvbnRyb2wgY2hhcmFjdGVyXG52YXIgVVRDX1JFID0gL1VUQ3xHTVQvO1xudmFyIE5hdGl2ZUZvcm1hdHRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOYXRpdmVGb3JtYXR0ZXIoZm9ybWF0U2V0dGluZ3MpIHtcbiAgICAgICAgdmFyIHN0YW5kYXJkRGF0ZVByb3BzID0ge307XG4gICAgICAgIHZhciBleHRlbmRlZFNldHRpbmdzID0ge307XG4gICAgICAgIHZhciBzZXZlcml0eSA9IDA7XG4gICAgICAgIGZvciAodmFyIG5hbWVfMSBpbiBmb3JtYXRTZXR0aW5ncykge1xuICAgICAgICAgICAgaWYgKG5hbWVfMSBpbiBFWFRFTkRFRF9TRVRUSU5HU19BTkRfU0VWRVJJVElFUykge1xuICAgICAgICAgICAgICAgIGV4dGVuZGVkU2V0dGluZ3NbbmFtZV8xXSA9IGZvcm1hdFNldHRpbmdzW25hbWVfMV07XG4gICAgICAgICAgICAgICAgc2V2ZXJpdHkgPSBNYXRoLm1heChFWFRFTkRFRF9TRVRUSU5HU19BTkRfU0VWRVJJVElFU1tuYW1lXzFdLCBzZXZlcml0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGFuZGFyZERhdGVQcm9wc1tuYW1lXzFdID0gZm9ybWF0U2V0dGluZ3NbbmFtZV8xXTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZV8xIGluIFNUQU5EQVJEX0RBVEVfUFJPUF9TRVZFUklUSUVTKSB7IC8vIFRPRE86IHdoYXQgYWJvdXQgaG91cjEyPyBubyBzZXZlcml0eVxuICAgICAgICAgICAgICAgICAgICBzZXZlcml0eSA9IE1hdGgubWF4KFNUQU5EQVJEX0RBVEVfUFJPUF9TRVZFUklUSUVTW25hbWVfMV0sIHNldmVyaXR5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGFuZGFyZERhdGVQcm9wcyA9IHN0YW5kYXJkRGF0ZVByb3BzO1xuICAgICAgICB0aGlzLmV4dGVuZGVkU2V0dGluZ3MgPSBleHRlbmRlZFNldHRpbmdzO1xuICAgICAgICB0aGlzLnNldmVyaXR5ID0gc2V2ZXJpdHk7XG4gICAgICAgIHRoaXMuYnVpbGRGb3JtYXR0aW5nRnVuYyA9IG1lbW9pemUoYnVpbGRGb3JtYXR0aW5nRnVuYyk7XG4gICAgfVxuICAgIE5hdGl2ZUZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKGRhdGUsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRGb3JtYXR0aW5nRnVuYyh0aGlzLnN0YW5kYXJkRGF0ZVByb3BzLCB0aGlzLmV4dGVuZGVkU2V0dGluZ3MsIGNvbnRleHQpKGRhdGUpO1xuICAgIH07XG4gICAgTmF0aXZlRm9ybWF0dGVyLnByb3RvdHlwZS5mb3JtYXRSYW5nZSA9IGZ1bmN0aW9uIChzdGFydCwgZW5kLCBjb250ZXh0LCBiZXR0ZXJEZWZhdWx0U2VwYXJhdG9yKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHN0YW5kYXJkRGF0ZVByb3BzID0gX2Euc3RhbmRhcmREYXRlUHJvcHMsIGV4dGVuZGVkU2V0dGluZ3MgPSBfYS5leHRlbmRlZFNldHRpbmdzO1xuICAgICAgICB2YXIgZGlmZlNldmVyaXR5ID0gY29tcHV0ZU1hcmtlckRpZmZTZXZlcml0eShzdGFydC5tYXJrZXIsIGVuZC5tYXJrZXIsIGNvbnRleHQuY2FsZW5kYXJTeXN0ZW0pO1xuICAgICAgICBpZiAoIWRpZmZTZXZlcml0eSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KHN0YXJ0LCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYmlnZ2VzdFVuaXRGb3JQYXJ0aWFsID0gZGlmZlNldmVyaXR5O1xuICAgICAgICBpZiAoYmlnZ2VzdFVuaXRGb3JQYXJ0aWFsID4gMSAmJiAvLyB0aGUgdHdvIGRhdGVzIGFyZSBkaWZmZXJlbnQgaW4gYSB3YXkgdGhhdCdzIGxhcmdlciBzY2FsZSB0aGFuIHRpbWVcbiAgICAgICAgICAgIChzdGFuZGFyZERhdGVQcm9wcy55ZWFyID09PSAnbnVtZXJpYycgfHwgc3RhbmRhcmREYXRlUHJvcHMueWVhciA9PT0gJzItZGlnaXQnKSAmJlxuICAgICAgICAgICAgKHN0YW5kYXJkRGF0ZVByb3BzLm1vbnRoID09PSAnbnVtZXJpYycgfHwgc3RhbmRhcmREYXRlUHJvcHMubW9udGggPT09ICcyLWRpZ2l0JykgJiZcbiAgICAgICAgICAgIChzdGFuZGFyZERhdGVQcm9wcy5kYXkgPT09ICdudW1lcmljJyB8fCBzdGFuZGFyZERhdGVQcm9wcy5kYXkgPT09ICcyLWRpZ2l0JykpIHtcbiAgICAgICAgICAgIGJpZ2dlc3RVbml0Rm9yUGFydGlhbCA9IDE7IC8vIG1ha2UgaXQgbG9vayBsaWtlIHRoZSBkYXRlcyBhcmUgb25seSBkaWZmZXJlbnQgaW4gdGVybXMgb2YgdGltZVxuICAgICAgICB9XG4gICAgICAgIHZhciBmdWxsMCA9IHRoaXMuZm9ybWF0KHN0YXJ0LCBjb250ZXh0KTtcbiAgICAgICAgdmFyIGZ1bGwxID0gdGhpcy5mb3JtYXQoZW5kLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGZ1bGwwID09PSBmdWxsMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bGwwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJ0aWFsRGF0ZVByb3BzID0gY29tcHV0ZVBhcnRpYWxGb3JtYXR0aW5nT3B0aW9ucyhzdGFuZGFyZERhdGVQcm9wcywgYmlnZ2VzdFVuaXRGb3JQYXJ0aWFsKTtcbiAgICAgICAgdmFyIHBhcnRpYWxGb3JtYXR0aW5nRnVuYyA9IGJ1aWxkRm9ybWF0dGluZ0Z1bmMocGFydGlhbERhdGVQcm9wcywgZXh0ZW5kZWRTZXR0aW5ncywgY29udGV4dCk7XG4gICAgICAgIHZhciBwYXJ0aWFsMCA9IHBhcnRpYWxGb3JtYXR0aW5nRnVuYyhzdGFydCk7XG4gICAgICAgIHZhciBwYXJ0aWFsMSA9IHBhcnRpYWxGb3JtYXR0aW5nRnVuYyhlbmQpO1xuICAgICAgICB2YXIgaW5zZXJ0aW9uID0gZmluZENvbW1vbkluc2VydGlvbihmdWxsMCwgcGFydGlhbDAsIGZ1bGwxLCBwYXJ0aWFsMSk7XG4gICAgICAgIHZhciBzZXBhcmF0b3IgPSBleHRlbmRlZFNldHRpbmdzLnNlcGFyYXRvciB8fCBiZXR0ZXJEZWZhdWx0U2VwYXJhdG9yIHx8IGNvbnRleHQuZGVmYXVsdFNlcGFyYXRvciB8fCAnJztcbiAgICAgICAgaWYgKGluc2VydGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGluc2VydGlvbi5iZWZvcmUgKyBwYXJ0aWFsMCArIHNlcGFyYXRvciArIHBhcnRpYWwxICsgaW5zZXJ0aW9uLmFmdGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdWxsMCArIHNlcGFyYXRvciArIGZ1bGwxO1xuICAgIH07XG4gICAgTmF0aXZlRm9ybWF0dGVyLnByb3RvdHlwZS5nZXRMYXJnZXN0VW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnNldmVyaXR5KSB7XG4gICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICd5ZWFyJztcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21vbnRoJztcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3dlZWsnO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZGF5JztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICd0aW1lJzsgLy8gcmVhbGx5P1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gTmF0aXZlRm9ybWF0dGVyO1xufSgpKTtcbmZ1bmN0aW9uIGJ1aWxkRm9ybWF0dGluZ0Z1bmMoc3RhbmRhcmREYXRlUHJvcHMsIGV4dGVuZGVkU2V0dGluZ3MsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhbmRhcmREYXRlUHJvcENudCA9IE9iamVjdC5rZXlzKHN0YW5kYXJkRGF0ZVByb3BzKS5sZW5ndGg7XG4gICAgaWYgKHN0YW5kYXJkRGF0ZVByb3BDbnQgPT09IDEgJiYgc3RhbmRhcmREYXRlUHJvcHMudGltZVpvbmVOYW1lID09PSAnc2hvcnQnKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZGF0ZSkgeyByZXR1cm4gKGZvcm1hdFRpbWVab25lT2Zmc2V0KGRhdGUudGltZVpvbmVPZmZzZXQpKTsgfTtcbiAgICB9XG4gICAgaWYgKHN0YW5kYXJkRGF0ZVByb3BDbnQgPT09IDAgJiYgZXh0ZW5kZWRTZXR0aW5ncy53ZWVrKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZGF0ZSkgeyByZXR1cm4gKGZvcm1hdFdlZWtOdW1iZXIoY29udGV4dC5jb21wdXRlV2Vla051bWJlcihkYXRlLm1hcmtlciksIGNvbnRleHQud2Vla1RleHQsIGNvbnRleHQud2Vla1RleHRMb25nLCBjb250ZXh0LmxvY2FsZSwgZXh0ZW5kZWRTZXR0aW5ncy53ZWVrKSk7IH07XG4gICAgfVxuICAgIHJldHVybiBidWlsZE5hdGl2ZUZvcm1hdHRpbmdGdW5jKHN0YW5kYXJkRGF0ZVByb3BzLCBleHRlbmRlZFNldHRpbmdzLCBjb250ZXh0KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkTmF0aXZlRm9ybWF0dGluZ0Z1bmMoc3RhbmRhcmREYXRlUHJvcHMsIGV4dGVuZGVkU2V0dGluZ3MsIGNvbnRleHQpIHtcbiAgICBzdGFuZGFyZERhdGVQcm9wcyA9IHRzbGliLl9fYXNzaWduKHt9LCBzdGFuZGFyZERhdGVQcm9wcyk7IC8vIGNvcHlcbiAgICBleHRlbmRlZFNldHRpbmdzID0gdHNsaWIuX19hc3NpZ24oe30sIGV4dGVuZGVkU2V0dGluZ3MpOyAvLyBjb3B5XG4gICAgc2FuaXRpemVTZXR0aW5ncyhzdGFuZGFyZERhdGVQcm9wcywgZXh0ZW5kZWRTZXR0aW5ncyk7XG4gICAgc3RhbmRhcmREYXRlUHJvcHMudGltZVpvbmUgPSAnVVRDJzsgLy8gd2UgbGV2ZXJhZ2UgdGhlIG9ubHkgZ3VhcmFudGVlZCB0aW1lWm9uZSBmb3Igb3VyIFVUQyBtYXJrZXJzXG4gICAgdmFyIG5vcm1hbEZvcm1hdCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGNvbnRleHQubG9jYWxlLmNvZGVzLCBzdGFuZGFyZERhdGVQcm9wcyk7XG4gICAgdmFyIHplcm9Gb3JtYXQ7IC8vIG5lZWRlZD9cbiAgICBpZiAoZXh0ZW5kZWRTZXR0aW5ncy5vbWl0WmVyb01pbnV0ZSkge1xuICAgICAgICB2YXIgemVyb1Byb3BzID0gdHNsaWIuX19hc3NpZ24oe30sIHN0YW5kYXJkRGF0ZVByb3BzKTtcbiAgICAgICAgZGVsZXRlIHplcm9Qcm9wcy5taW51dGU7IC8vIHNlY29uZHMgYW5kIG1zIHdlcmUgYWxyZWFkeSBjb25zaWRlcmVkIGluIHNhbml0aXplU2V0dGluZ3NcbiAgICAgICAgemVyb0Zvcm1hdCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGNvbnRleHQubG9jYWxlLmNvZGVzLCB6ZXJvUHJvcHMpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKGRhdGUpIHtcbiAgICAgICAgdmFyIG1hcmtlciA9IGRhdGUubWFya2VyO1xuICAgICAgICB2YXIgZm9ybWF0O1xuICAgICAgICBpZiAoemVyb0Zvcm1hdCAmJiAhbWFya2VyLmdldFVUQ01pbnV0ZXMoKSkge1xuICAgICAgICAgICAgZm9ybWF0ID0gemVyb0Zvcm1hdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IG5vcm1hbEZvcm1hdDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcyA9IGZvcm1hdC5mb3JtYXQobWFya2VyKTtcbiAgICAgICAgcmV0dXJuIHBvc3RQcm9jZXNzKHMsIGRhdGUsIHN0YW5kYXJkRGF0ZVByb3BzLCBleHRlbmRlZFNldHRpbmdzLCBjb250ZXh0KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gc2FuaXRpemVTZXR0aW5ncyhzdGFuZGFyZERhdGVQcm9wcywgZXh0ZW5kZWRTZXR0aW5ncykge1xuICAgIC8vIGRlYWwgd2l0aCBhIGJyb3dzZXIgaW5jb25zaXN0ZW5jeSB3aGVyZSBmb3JtYXR0aW5nIHRoZSB0aW1lem9uZVxuICAgIC8vIHJlcXVpcmVzIHRoYXQgdGhlIGhvdXIvbWludXRlIGJlIHByZXNlbnQuXG4gICAgaWYgKHN0YW5kYXJkRGF0ZVByb3BzLnRpbWVab25lTmFtZSkge1xuICAgICAgICBpZiAoIXN0YW5kYXJkRGF0ZVByb3BzLmhvdXIpIHtcbiAgICAgICAgICAgIHN0YW5kYXJkRGF0ZVByb3BzLmhvdXIgPSAnMi1kaWdpdCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdGFuZGFyZERhdGVQcm9wcy5taW51dGUpIHtcbiAgICAgICAgICAgIHN0YW5kYXJkRGF0ZVByb3BzLm1pbnV0ZSA9ICcyLWRpZ2l0JztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBvbmx5IHN1cHBvcnQgc2hvcnQgdGltZXpvbmUgbmFtZXNcbiAgICBpZiAoc3RhbmRhcmREYXRlUHJvcHMudGltZVpvbmVOYW1lID09PSAnbG9uZycpIHtcbiAgICAgICAgc3RhbmRhcmREYXRlUHJvcHMudGltZVpvbmVOYW1lID0gJ3Nob3J0JztcbiAgICB9XG4gICAgLy8gaWYgcmVxdWVzdGluZyB0byBkaXNwbGF5IHNlY29uZHMsIE1VU1QgZGlzcGxheSBtaW51dGVzXG4gICAgaWYgKGV4dGVuZGVkU2V0dGluZ3Mub21pdFplcm9NaW51dGUgJiYgKHN0YW5kYXJkRGF0ZVByb3BzLnNlY29uZCB8fCBzdGFuZGFyZERhdGVQcm9wcy5taWxsaXNlY29uZCkpIHtcbiAgICAgICAgZGVsZXRlIGV4dGVuZGVkU2V0dGluZ3Mub21pdFplcm9NaW51dGU7XG4gICAgfVxufVxuZnVuY3Rpb24gcG9zdFByb2Nlc3MocywgZGF0ZSwgc3RhbmRhcmREYXRlUHJvcHMsIGV4dGVuZGVkU2V0dGluZ3MsIGNvbnRleHQpIHtcbiAgICBzID0gcy5yZXBsYWNlKExUUl9SRSwgJycpOyAvLyByZW1vdmUgbGVmdC10by1yaWdodCBjb250cm9sIGNoYXJzLiBkbyBmaXJzdC4gZ29vZCBmb3Igb3RoZXIgcmVnZXhlc1xuICAgIGlmIChzdGFuZGFyZERhdGVQcm9wcy50aW1lWm9uZU5hbWUgPT09ICdzaG9ydCcpIHtcbiAgICAgICAgcyA9IGluamVjdFR6b1N0cihzLCAoY29udGV4dC50aW1lWm9uZSA9PT0gJ1VUQycgfHwgZGF0ZS50aW1lWm9uZU9mZnNldCA9PSBudWxsKSA/XG4gICAgICAgICAgICAnVVRDJyA6IC8vIGltcG9ydGFudCB0byBub3JtYWxpemUgZm9yIElFLCB3aGljaCBkb2VzIFwiR01UXCJcbiAgICAgICAgICAgIGZvcm1hdFRpbWVab25lT2Zmc2V0KGRhdGUudGltZVpvbmVPZmZzZXQpKTtcbiAgICB9XG4gICAgaWYgKGV4dGVuZGVkU2V0dGluZ3Mub21pdENvbW1hcykge1xuICAgICAgICBzID0gcy5yZXBsYWNlKENPTU1BX1JFLCAnJykudHJpbSgpO1xuICAgIH1cbiAgICBpZiAoZXh0ZW5kZWRTZXR0aW5ncy5vbWl0WmVyb01pbnV0ZSkge1xuICAgICAgICBzID0gcy5yZXBsYWNlKCc6MDAnLCAnJyk7IC8vIHplcm9Gb3JtYXQgZG9lc24ndCBhbHdheXMgYWNoaWV2ZSB0aGlzXG4gICAgfVxuICAgIC8vIF4gZG8gYW55dGhpbmcgdGhhdCBtaWdodCBjcmVhdGUgYWRqYWNlbnQgc3BhY2VzIGJlZm9yZSB0aGlzIHBvaW50LFxuICAgIC8vIGJlY2F1c2UgTUVSSURJRU1fUkUgbGlrZXMgdG8gZWF0IHVwIGxvYWRpbmcgc3BhY2VzXG4gICAgaWYgKGV4dGVuZGVkU2V0dGluZ3MubWVyaWRpZW0gPT09IGZhbHNlKSB7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoTUVSSURJRU1fUkUsICcnKS50cmltKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV4dGVuZGVkU2V0dGluZ3MubWVyaWRpZW0gPT09ICduYXJyb3cnKSB7IC8vIGEvcFxuICAgICAgICBzID0gcy5yZXBsYWNlKE1FUklESUVNX1JFLCBmdW5jdGlvbiAobTAsIG0xKSB7IHJldHVybiBtMS50b0xvY2FsZUxvd2VyQ2FzZSgpOyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXh0ZW5kZWRTZXR0aW5ncy5tZXJpZGllbSA9PT0gJ3Nob3J0JykgeyAvLyBhbS9wbVxuICAgICAgICBzID0gcy5yZXBsYWNlKE1FUklESUVNX1JFLCBmdW5jdGlvbiAobTAsIG0xKSB7IHJldHVybiBtMS50b0xvY2FsZUxvd2VyQ2FzZSgpICsgXCJtXCI7IH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChleHRlbmRlZFNldHRpbmdzLm1lcmlkaWVtID09PSAnbG93ZXJjYXNlJykgeyAvLyBvdGhlciBtZXJpZGllbSB0cmFuc2Zvcm1lcnMgYWxyZWFkeSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlXG4gICAgICAgIHMgPSBzLnJlcGxhY2UoTUVSSURJRU1fUkUsIGZ1bmN0aW9uIChtMCkgeyByZXR1cm4gbTAudG9Mb2NhbGVMb3dlckNhc2UoKTsgfSk7XG4gICAgfVxuICAgIHMgPSBzLnJlcGxhY2UoTVVMVElfU1BBQ0VfUkUsICcgJyk7XG4gICAgcyA9IHMudHJpbSgpO1xuICAgIHJldHVybiBzO1xufVxuZnVuY3Rpb24gaW5qZWN0VHpvU3RyKHMsIHR6b1N0cikge1xuICAgIHZhciByZXBsYWNlZCA9IGZhbHNlO1xuICAgIHMgPSBzLnJlcGxhY2UoVVRDX1JFLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlcGxhY2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHR6b1N0cjtcbiAgICB9KTtcbiAgICAvLyBJRTExIGRvZXNuJ3QgaW5jbHVkZSBVVEMvR01UIGluIHRoZSBvcmlnaW5hbCBzdHJpbmcsIHNvIGFwcGVuZCB0byBlbmRcbiAgICBpZiAoIXJlcGxhY2VkKSB7XG4gICAgICAgIHMgKz0gXCIgXCIgKyB0em9TdHI7XG4gICAgfVxuICAgIHJldHVybiBzO1xufVxuZnVuY3Rpb24gZm9ybWF0V2Vla051bWJlcihudW0sIHdlZWtUZXh0LCB3ZWVrVGV4dExvbmcsIGxvY2FsZSwgZGlzcGxheSkge1xuICAgIHZhciBwYXJ0cyA9IFtdO1xuICAgIGlmIChkaXNwbGF5ID09PSAnbG9uZycpIHtcbiAgICAgICAgcGFydHMucHVzaCh3ZWVrVGV4dExvbmcpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkaXNwbGF5ID09PSAnc2hvcnQnIHx8IGRpc3BsYXkgPT09ICduYXJyb3cnKSB7XG4gICAgICAgIHBhcnRzLnB1c2god2Vla1RleHQpO1xuICAgIH1cbiAgICBpZiAoZGlzcGxheSA9PT0gJ2xvbmcnIHx8IGRpc3BsYXkgPT09ICdzaG9ydCcpIHtcbiAgICAgICAgcGFydHMucHVzaCgnICcpO1xuICAgIH1cbiAgICBwYXJ0cy5wdXNoKGxvY2FsZS5zaW1wbGVOdW1iZXJGb3JtYXQuZm9ybWF0KG51bSkpO1xuICAgIGlmIChsb2NhbGUub3B0aW9ucy5kaXJlY3Rpb24gPT09ICdydGwnKSB7IC8vIFRPRE86IHVzZSBjb250cm9sIGNoYXJhY3RlcnMgaW5zdGVhZD9cbiAgICAgICAgcGFydHMucmV2ZXJzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHMuam9pbignJyk7XG59XG4vLyBSYW5nZSBGb3JtYXR0aW5nIFV0aWxzXG4vLyAwID0gZXhhY3RseSB0aGUgc2FtZVxuLy8gMSA9IGRpZmZlcmVudCBieSB0aW1lXG4vLyBhbmQgYmlnZ2VyXG5mdW5jdGlvbiBjb21wdXRlTWFya2VyRGlmZlNldmVyaXR5KGQwLCBkMSwgY2EpIHtcbiAgICBpZiAoY2EuZ2V0TWFya2VyWWVhcihkMCkgIT09IGNhLmdldE1hcmtlclllYXIoZDEpKSB7XG4gICAgICAgIHJldHVybiA1O1xuICAgIH1cbiAgICBpZiAoY2EuZ2V0TWFya2VyTW9udGgoZDApICE9PSBjYS5nZXRNYXJrZXJNb250aChkMSkpIHtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgfVxuICAgIGlmIChjYS5nZXRNYXJrZXJEYXkoZDApICE9PSBjYS5nZXRNYXJrZXJEYXkoZDEpKSB7XG4gICAgICAgIHJldHVybiAyO1xuICAgIH1cbiAgICBpZiAodGltZUFzTXMoZDApICE9PSB0aW1lQXNNcyhkMSkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xufVxuZnVuY3Rpb24gY29tcHV0ZVBhcnRpYWxGb3JtYXR0aW5nT3B0aW9ucyhvcHRpb25zLCBiaWdnZXN0VW5pdCkge1xuICAgIHZhciBwYXJ0aWFsT3B0aW9ucyA9IHt9O1xuICAgIGZvciAodmFyIG5hbWVfMiBpbiBvcHRpb25zKSB7XG4gICAgICAgIGlmICghKG5hbWVfMiBpbiBTVEFOREFSRF9EQVRFX1BST1BfU0VWRVJJVElFUykgfHwgLy8gbm90IGEgZGF0ZSBwYXJ0IHByb3AgKGxpa2UgdGltZVpvbmUpXG4gICAgICAgICAgICBTVEFOREFSRF9EQVRFX1BST1BfU0VWRVJJVElFU1tuYW1lXzJdIDw9IGJpZ2dlc3RVbml0KSB7XG4gICAgICAgICAgICBwYXJ0aWFsT3B0aW9uc1tuYW1lXzJdID0gb3B0aW9uc1tuYW1lXzJdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJ0aWFsT3B0aW9ucztcbn1cbmZ1bmN0aW9uIGZpbmRDb21tb25JbnNlcnRpb24oZnVsbDAsIHBhcnRpYWwwLCBmdWxsMSwgcGFydGlhbDEpIHtcbiAgICB2YXIgaTAgPSAwO1xuICAgIHdoaWxlIChpMCA8IGZ1bGwwLmxlbmd0aCkge1xuICAgICAgICB2YXIgZm91bmQwID0gZnVsbDAuaW5kZXhPZihwYXJ0aWFsMCwgaTApO1xuICAgICAgICBpZiAoZm91bmQwID09PSAtMSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJlZm9yZTAgPSBmdWxsMC5zdWJzdHIoMCwgZm91bmQwKTtcbiAgICAgICAgaTAgPSBmb3VuZDAgKyBwYXJ0aWFsMC5sZW5ndGg7XG4gICAgICAgIHZhciBhZnRlcjAgPSBmdWxsMC5zdWJzdHIoaTApO1xuICAgICAgICB2YXIgaTEgPSAwO1xuICAgICAgICB3aGlsZSAoaTEgPCBmdWxsMS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBmb3VuZDEgPSBmdWxsMS5pbmRleE9mKHBhcnRpYWwxLCBpMSk7XG4gICAgICAgICAgICBpZiAoZm91bmQxID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGJlZm9yZTEgPSBmdWxsMS5zdWJzdHIoMCwgZm91bmQxKTtcbiAgICAgICAgICAgIGkxID0gZm91bmQxICsgcGFydGlhbDEubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGFmdGVyMSA9IGZ1bGwxLnN1YnN0cihpMSk7XG4gICAgICAgICAgICBpZiAoYmVmb3JlMCA9PT0gYmVmb3JlMSAmJiBhZnRlcjAgPT09IGFmdGVyMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZTogYmVmb3JlMCxcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXI6IGFmdGVyMCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBleHBhbmRab25lZE1hcmtlcihkYXRlSW5mbywgY2FsZW5kYXJTeXN0ZW0pIHtcbiAgICB2YXIgYSA9IGNhbGVuZGFyU3lzdGVtLm1hcmtlclRvQXJyYXkoZGF0ZUluZm8ubWFya2VyKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBtYXJrZXI6IGRhdGVJbmZvLm1hcmtlcixcbiAgICAgICAgdGltZVpvbmVPZmZzZXQ6IGRhdGVJbmZvLnRpbWVab25lT2Zmc2V0LFxuICAgICAgICBhcnJheTogYSxcbiAgICAgICAgeWVhcjogYVswXSxcbiAgICAgICAgbW9udGg6IGFbMV0sXG4gICAgICAgIGRheTogYVsyXSxcbiAgICAgICAgaG91cjogYVszXSxcbiAgICAgICAgbWludXRlOiBhWzRdLFxuICAgICAgICBzZWNvbmQ6IGFbNV0sXG4gICAgICAgIG1pbGxpc2Vjb25kOiBhWzZdLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZlcmJvc2VGb3JtYXR0aW5nQXJnKHN0YXJ0LCBlbmQsIGNvbnRleHQsIGJldHRlckRlZmF1bHRTZXBhcmF0b3IpIHtcbiAgICB2YXIgc3RhcnRJbmZvID0gZXhwYW5kWm9uZWRNYXJrZXIoc3RhcnQsIGNvbnRleHQuY2FsZW5kYXJTeXN0ZW0pO1xuICAgIHZhciBlbmRJbmZvID0gZW5kID8gZXhwYW5kWm9uZWRNYXJrZXIoZW5kLCBjb250ZXh0LmNhbGVuZGFyU3lzdGVtKSA6IG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGF0ZTogc3RhcnRJbmZvLFxuICAgICAgICBzdGFydDogc3RhcnRJbmZvLFxuICAgICAgICBlbmQ6IGVuZEluZm8sXG4gICAgICAgIHRpbWVab25lOiBjb250ZXh0LnRpbWVab25lLFxuICAgICAgICBsb2NhbGVDb2RlczogY29udGV4dC5sb2NhbGUuY29kZXMsXG4gICAgICAgIGRlZmF1bHRTZXBhcmF0b3I6IGJldHRlckRlZmF1bHRTZXBhcmF0b3IgfHwgY29udGV4dC5kZWZhdWx0U2VwYXJhdG9yLFxuICAgIH07XG59XG5cbi8qXG5UT0RPOiBmaXggdGhlIHRlcm1pbm9sb2d5IG9mIFwiZm9ybWF0dGVyXCIgdnMgXCJmb3JtYXR0aW5nIGZ1bmNcIlxuKi9cbi8qXG5BdCB0aGUgdGltZSBvZiBpbnN0YW50aWF0aW9uLCB0aGlzIG9iamVjdCBkb2VzIG5vdCBrbm93IHdoaWNoIGNtZC1mb3JtYXR0aW5nIHN5c3RlbSBpdCB3aWxsIHVzZS5cbkl0IHJlY2VpdmVzIHRoaXMgYXQgdGhlIHRpbWUgb2YgZm9ybWF0dGluZywgYXMgYSBzZXR0aW5nLlxuKi9cbnZhciBDbWRGb3JtYXR0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ21kRm9ybWF0dGVyKGNtZFN0cikge1xuICAgICAgICB0aGlzLmNtZFN0ciA9IGNtZFN0cjtcbiAgICB9XG4gICAgQ21kRm9ybWF0dGVyLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbiAoZGF0ZSwgY29udGV4dCwgYmV0dGVyRGVmYXVsdFNlcGFyYXRvcikge1xuICAgICAgICByZXR1cm4gY29udGV4dC5jbWRGb3JtYXR0ZXIodGhpcy5jbWRTdHIsIGNyZWF0ZVZlcmJvc2VGb3JtYXR0aW5nQXJnKGRhdGUsIG51bGwsIGNvbnRleHQsIGJldHRlckRlZmF1bHRTZXBhcmF0b3IpKTtcbiAgICB9O1xuICAgIENtZEZvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0UmFuZ2UgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCwgY29udGV4dCwgYmV0dGVyRGVmYXVsdFNlcGFyYXRvcikge1xuICAgICAgICByZXR1cm4gY29udGV4dC5jbWRGb3JtYXR0ZXIodGhpcy5jbWRTdHIsIGNyZWF0ZVZlcmJvc2VGb3JtYXR0aW5nQXJnKHN0YXJ0LCBlbmQsIGNvbnRleHQsIGJldHRlckRlZmF1bHRTZXBhcmF0b3IpKTtcbiAgICB9O1xuICAgIHJldHVybiBDbWRGb3JtYXR0ZXI7XG59KCkpO1xuXG52YXIgRnVuY0Zvcm1hdHRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGdW5jRm9ybWF0dGVyKGZ1bmMpIHtcbiAgICAgICAgdGhpcy5mdW5jID0gZnVuYztcbiAgICB9XG4gICAgRnVuY0Zvcm1hdHRlci5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKGRhdGUsIGNvbnRleHQsIGJldHRlckRlZmF1bHRTZXBhcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnVuYyhjcmVhdGVWZXJib3NlRm9ybWF0dGluZ0FyZyhkYXRlLCBudWxsLCBjb250ZXh0LCBiZXR0ZXJEZWZhdWx0U2VwYXJhdG9yKSk7XG4gICAgfTtcbiAgICBGdW5jRm9ybWF0dGVyLnByb3RvdHlwZS5mb3JtYXRSYW5nZSA9IGZ1bmN0aW9uIChzdGFydCwgZW5kLCBjb250ZXh0LCBiZXR0ZXJEZWZhdWx0U2VwYXJhdG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bmMoY3JlYXRlVmVyYm9zZUZvcm1hdHRpbmdBcmcoc3RhcnQsIGVuZCwgY29udGV4dCwgYmV0dGVyRGVmYXVsdFNlcGFyYXRvcikpO1xuICAgIH07XG4gICAgcmV0dXJuIEZ1bmNGb3JtYXR0ZXI7XG59KCkpO1xuXG5mdW5jdGlvbiBjcmVhdGVGb3JtYXR0ZXIoaW5wdXQpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiBpbnB1dCkgeyAvLyBub24tbnVsbCBvYmplY3RcbiAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVGb3JtYXR0ZXIoaW5wdXQpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gbmV3IENtZEZvcm1hdHRlcihpbnB1dCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGdW5jRm9ybWF0dGVyKGlucHV0KTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbi8vIGJhc2Ugb3B0aW9uc1xuLy8gLS0tLS0tLS0tLS0tXG52YXIgQkFTRV9PUFRJT05fUkVGSU5FUlMgPSB7XG4gICAgbmF2TGlua0RheUNsaWNrOiBpZGVudGl0eSxcbiAgICBuYXZMaW5rV2Vla0NsaWNrOiBpZGVudGl0eSxcbiAgICBkdXJhdGlvbjogY3JlYXRlRHVyYXRpb24sXG4gICAgYm9vdHN0cmFwRm9udEF3ZXNvbWU6IGlkZW50aXR5LFxuICAgIGJ1dHRvbkljb25zOiBpZGVudGl0eSxcbiAgICBjdXN0b21CdXR0b25zOiBpZGVudGl0eSxcbiAgICBkZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbjogY3JlYXRlRHVyYXRpb24sXG4gICAgZGVmYXVsdFRpbWVkRXZlbnREdXJhdGlvbjogY3JlYXRlRHVyYXRpb24sXG4gICAgbmV4dERheVRocmVzaG9sZDogY3JlYXRlRHVyYXRpb24sXG4gICAgc2Nyb2xsVGltZTogY3JlYXRlRHVyYXRpb24sXG4gICAgc2Nyb2xsVGltZVJlc2V0OiBCb29sZWFuLFxuICAgIHNsb3RNaW5UaW1lOiBjcmVhdGVEdXJhdGlvbixcbiAgICBzbG90TWF4VGltZTogY3JlYXRlRHVyYXRpb24sXG4gICAgZGF5UG9wb3ZlckZvcm1hdDogY3JlYXRlRm9ybWF0dGVyLFxuICAgIHNsb3REdXJhdGlvbjogY3JlYXRlRHVyYXRpb24sXG4gICAgc25hcER1cmF0aW9uOiBjcmVhdGVEdXJhdGlvbixcbiAgICBoZWFkZXJUb29sYmFyOiBpZGVudGl0eSxcbiAgICBmb290ZXJUb29sYmFyOiBpZGVudGl0eSxcbiAgICBkZWZhdWx0UmFuZ2VTZXBhcmF0b3I6IFN0cmluZyxcbiAgICB0aXRsZVJhbmdlU2VwYXJhdG9yOiBTdHJpbmcsXG4gICAgZm9yY2VFdmVudER1cmF0aW9uOiBCb29sZWFuLFxuICAgIGRheUhlYWRlcnM6IEJvb2xlYW4sXG4gICAgZGF5SGVhZGVyRm9ybWF0OiBjcmVhdGVGb3JtYXR0ZXIsXG4gICAgZGF5SGVhZGVyQ2xhc3NOYW1lczogaWRlbnRpdHksXG4gICAgZGF5SGVhZGVyQ29udGVudDogaWRlbnRpdHksXG4gICAgZGF5SGVhZGVyRGlkTW91bnQ6IGlkZW50aXR5LFxuICAgIGRheUhlYWRlcldpbGxVbm1vdW50OiBpZGVudGl0eSxcbiAgICBkYXlDZWxsQ2xhc3NOYW1lczogaWRlbnRpdHksXG4gICAgZGF5Q2VsbENvbnRlbnQ6IGlkZW50aXR5LFxuICAgIGRheUNlbGxEaWRNb3VudDogaWRlbnRpdHksXG4gICAgZGF5Q2VsbFdpbGxVbm1vdW50OiBpZGVudGl0eSxcbiAgICBpbml0aWFsVmlldzogU3RyaW5nLFxuICAgIGFzcGVjdFJhdGlvOiBOdW1iZXIsXG4gICAgd2Vla2VuZHM6IEJvb2xlYW4sXG4gICAgd2Vla051bWJlckNhbGN1bGF0aW9uOiBpZGVudGl0eSxcbiAgICB3ZWVrTnVtYmVyczogQm9vbGVhbixcbiAgICB3ZWVrTnVtYmVyQ2xhc3NOYW1lczogaWRlbnRpdHksXG4gICAgd2Vla051bWJlckNvbnRlbnQ6IGlkZW50aXR5LFxuICAgIHdlZWtOdW1iZXJEaWRNb3VudDogaWRlbnRpdHksXG4gICAgd2Vla051bWJlcldpbGxVbm1vdW50OiBpZGVudGl0eSxcbiAgICBlZGl0YWJsZTogQm9vbGVhbixcbiAgICB2aWV3Q2xhc3NOYW1lczogaWRlbnRpdHksXG4gICAgdmlld0RpZE1vdW50OiBpZGVudGl0eSxcbiAgICB2aWV3V2lsbFVubW91bnQ6IGlkZW50aXR5LFxuICAgIG5vd0luZGljYXRvcjogQm9vbGVhbixcbiAgICBub3dJbmRpY2F0b3JDbGFzc05hbWVzOiBpZGVudGl0eSxcbiAgICBub3dJbmRpY2F0b3JDb250ZW50OiBpZGVudGl0eSxcbiAgICBub3dJbmRpY2F0b3JEaWRNb3VudDogaWRlbnRpdHksXG4gICAgbm93SW5kaWNhdG9yV2lsbFVubW91bnQ6IGlkZW50aXR5LFxuICAgIHNob3dOb25DdXJyZW50RGF0ZXM6IEJvb2xlYW4sXG4gICAgbGF6eUZldGNoaW5nOiBCb29sZWFuLFxuICAgIHN0YXJ0UGFyYW06IFN0cmluZyxcbiAgICBlbmRQYXJhbTogU3RyaW5nLFxuICAgIHRpbWVab25lUGFyYW06IFN0cmluZyxcbiAgICB0aW1lWm9uZTogU3RyaW5nLFxuICAgIGxvY2FsZXM6IGlkZW50aXR5LFxuICAgIGxvY2FsZTogaWRlbnRpdHksXG4gICAgdGhlbWVTeXN0ZW06IFN0cmluZyxcbiAgICBkcmFnUmV2ZXJ0RHVyYXRpb246IE51bWJlcixcbiAgICBkcmFnU2Nyb2xsOiBCb29sZWFuLFxuICAgIGFsbERheU1haW50YWluRHVyYXRpb246IEJvb2xlYW4sXG4gICAgdW5zZWxlY3RBdXRvOiBCb29sZWFuLFxuICAgIGRyb3BBY2NlcHQ6IGlkZW50aXR5LFxuICAgIGV2ZW50T3JkZXI6IHBhcnNlRmllbGRTcGVjcyxcbiAgICBldmVudE9yZGVyU3RyaWN0OiBCb29sZWFuLFxuICAgIGhhbmRsZVdpbmRvd1Jlc2l6ZTogQm9vbGVhbixcbiAgICB3aW5kb3dSZXNpemVEZWxheTogTnVtYmVyLFxuICAgIGxvbmdQcmVzc0RlbGF5OiBOdW1iZXIsXG4gICAgZXZlbnREcmFnTWluRGlzdGFuY2U6IE51bWJlcixcbiAgICBleHBhbmRSb3dzOiBCb29sZWFuLFxuICAgIGhlaWdodDogaWRlbnRpdHksXG4gICAgY29udGVudEhlaWdodDogaWRlbnRpdHksXG4gICAgZGlyZWN0aW9uOiBTdHJpbmcsXG4gICAgd2Vla051bWJlckZvcm1hdDogY3JlYXRlRm9ybWF0dGVyLFxuICAgIGV2ZW50UmVzaXphYmxlRnJvbVN0YXJ0OiBCb29sZWFuLFxuICAgIGRpc3BsYXlFdmVudFRpbWU6IEJvb2xlYW4sXG4gICAgZGlzcGxheUV2ZW50RW5kOiBCb29sZWFuLFxuICAgIHdlZWtUZXh0OiBTdHJpbmcsXG4gICAgd2Vla1RleHRMb25nOiBTdHJpbmcsXG4gICAgcHJvZ3Jlc3NpdmVFdmVudFJlbmRlcmluZzogQm9vbGVhbixcbiAgICBidXNpbmVzc0hvdXJzOiBpZGVudGl0eSxcbiAgICBpbml0aWFsRGF0ZTogaWRlbnRpdHksXG4gICAgbm93OiBpZGVudGl0eSxcbiAgICBldmVudERhdGFUcmFuc2Zvcm06IGlkZW50aXR5LFxuICAgIHN0aWNreUhlYWRlckRhdGVzOiBpZGVudGl0eSxcbiAgICBzdGlja3lGb290ZXJTY3JvbGxiYXI6IGlkZW50aXR5LFxuICAgIHZpZXdIZWlnaHQ6IGlkZW50aXR5LFxuICAgIGRlZmF1bHRBbGxEYXk6IEJvb2xlYW4sXG4gICAgZXZlbnRTb3VyY2VGYWlsdXJlOiBpZGVudGl0eSxcbiAgICBldmVudFNvdXJjZVN1Y2Nlc3M6IGlkZW50aXR5LFxuICAgIGV2ZW50RGlzcGxheTogU3RyaW5nLFxuICAgIGV2ZW50U3RhcnRFZGl0YWJsZTogQm9vbGVhbixcbiAgICBldmVudER1cmF0aW9uRWRpdGFibGU6IEJvb2xlYW4sXG4gICAgZXZlbnRPdmVybGFwOiBpZGVudGl0eSxcbiAgICBldmVudENvbnN0cmFpbnQ6IGlkZW50aXR5LFxuICAgIGV2ZW50QWxsb3c6IGlkZW50aXR5LFxuICAgIGV2ZW50QmFja2dyb3VuZENvbG9yOiBTdHJpbmcsXG4gICAgZXZlbnRCb3JkZXJDb2xvcjogU3RyaW5nLFxuICAgIGV2ZW50VGV4dENvbG9yOiBTdHJpbmcsXG4gICAgZXZlbnRDb2xvcjogU3RyaW5nLFxuICAgIGV2ZW50Q2xhc3NOYW1lczogaWRlbnRpdHksXG4gICAgZXZlbnRDb250ZW50OiBpZGVudGl0eSxcbiAgICBldmVudERpZE1vdW50OiBpZGVudGl0eSxcbiAgICBldmVudFdpbGxVbm1vdW50OiBpZGVudGl0eSxcbiAgICBzZWxlY3RDb25zdHJhaW50OiBpZGVudGl0eSxcbiAgICBzZWxlY3RPdmVybGFwOiBpZGVudGl0eSxcbiAgICBzZWxlY3RBbGxvdzogaWRlbnRpdHksXG4gICAgZHJvcHBhYmxlOiBCb29sZWFuLFxuICAgIHVuc2VsZWN0Q2FuY2VsOiBTdHJpbmcsXG4gICAgc2xvdExhYmVsRm9ybWF0OiBpZGVudGl0eSxcbiAgICBzbG90TGFuZUNsYXNzTmFtZXM6IGlkZW50aXR5LFxuICAgIHNsb3RMYW5lQ29udGVudDogaWRlbnRpdHksXG4gICAgc2xvdExhbmVEaWRNb3VudDogaWRlbnRpdHksXG4gICAgc2xvdExhbmVXaWxsVW5tb3VudDogaWRlbnRpdHksXG4gICAgc2xvdExhYmVsQ2xhc3NOYW1lczogaWRlbnRpdHksXG4gICAgc2xvdExhYmVsQ29udGVudDogaWRlbnRpdHksXG4gICAgc2xvdExhYmVsRGlkTW91bnQ6IGlkZW50aXR5LFxuICAgIHNsb3RMYWJlbFdpbGxVbm1vdW50OiBpZGVudGl0eSxcbiAgICBkYXlNYXhFdmVudHM6IGlkZW50aXR5LFxuICAgIGRheU1heEV2ZW50Um93czogaWRlbnRpdHksXG4gICAgZGF5TWluV2lkdGg6IE51bWJlcixcbiAgICBzbG90TGFiZWxJbnRlcnZhbDogY3JlYXRlRHVyYXRpb24sXG4gICAgYWxsRGF5VGV4dDogU3RyaW5nLFxuICAgIGFsbERheUNsYXNzTmFtZXM6IGlkZW50aXR5LFxuICAgIGFsbERheUNvbnRlbnQ6IGlkZW50aXR5LFxuICAgIGFsbERheURpZE1vdW50OiBpZGVudGl0eSxcbiAgICBhbGxEYXlXaWxsVW5tb3VudDogaWRlbnRpdHksXG4gICAgc2xvdE1pbldpZHRoOiBOdW1iZXIsXG4gICAgbmF2TGlua3M6IEJvb2xlYW4sXG4gICAgZXZlbnRUaW1lRm9ybWF0OiBjcmVhdGVGb3JtYXR0ZXIsXG4gICAgcmVyZW5kZXJEZWxheTogTnVtYmVyLFxuICAgIG1vcmVMaW5rVGV4dDogaWRlbnRpdHksXG4gICAgbW9yZUxpbmtIaW50OiBpZGVudGl0eSxcbiAgICBzZWxlY3RNaW5EaXN0YW5jZTogTnVtYmVyLFxuICAgIHNlbGVjdGFibGU6IEJvb2xlYW4sXG4gICAgc2VsZWN0TG9uZ1ByZXNzRGVsYXk6IE51bWJlcixcbiAgICBldmVudExvbmdQcmVzc0RlbGF5OiBOdW1iZXIsXG4gICAgc2VsZWN0TWlycm9yOiBCb29sZWFuLFxuICAgIGV2ZW50TWF4U3RhY2s6IE51bWJlcixcbiAgICBldmVudE1pbkhlaWdodDogTnVtYmVyLFxuICAgIGV2ZW50TWluV2lkdGg6IE51bWJlcixcbiAgICBldmVudFNob3J0SGVpZ2h0OiBOdW1iZXIsXG4gICAgc2xvdEV2ZW50T3ZlcmxhcDogQm9vbGVhbixcbiAgICBwbHVnaW5zOiBpZGVudGl0eSxcbiAgICBmaXJzdERheTogTnVtYmVyLFxuICAgIGRheUNvdW50OiBOdW1iZXIsXG4gICAgZGF0ZUFsaWdubWVudDogU3RyaW5nLFxuICAgIGRhdGVJbmNyZW1lbnQ6IGNyZWF0ZUR1cmF0aW9uLFxuICAgIGhpZGRlbkRheXM6IGlkZW50aXR5LFxuICAgIG1vbnRoTW9kZTogQm9vbGVhbixcbiAgICBmaXhlZFdlZWtDb3VudDogQm9vbGVhbixcbiAgICB2YWxpZFJhbmdlOiBpZGVudGl0eSxcbiAgICB2aXNpYmxlUmFuZ2U6IGlkZW50aXR5LFxuICAgIHRpdGxlRm9ybWF0OiBpZGVudGl0eSxcbiAgICBldmVudEludGVyYWN0aXZlOiBCb29sZWFuLFxuICAgIC8vIG9ubHkgdXNlZCBieSBsaXN0LXZpZXcsIGJ1dCBsYW5ndWFnZXMgZGVmaW5lIHRoZSB2YWx1ZSwgc28gd2UgbmVlZCBpdCBpbiBiYXNlIG9wdGlvbnNcbiAgICBub0V2ZW50c1RleHQ6IFN0cmluZyxcbiAgICB2aWV3SGludDogaWRlbnRpdHksXG4gICAgbmF2TGlua0hpbnQ6IGlkZW50aXR5LFxuICAgIGNsb3NlSGludDogU3RyaW5nLFxuICAgIHRpbWVIaW50OiBTdHJpbmcsXG4gICAgZXZlbnRIaW50OiBTdHJpbmcsXG4gICAgbW9yZUxpbmtDbGljazogaWRlbnRpdHksXG4gICAgbW9yZUxpbmtDbGFzc05hbWVzOiBpZGVudGl0eSxcbiAgICBtb3JlTGlua0NvbnRlbnQ6IGlkZW50aXR5LFxuICAgIG1vcmVMaW5rRGlkTW91bnQ6IGlkZW50aXR5LFxuICAgIG1vcmVMaW5rV2lsbFVubW91bnQ6IGlkZW50aXR5LFxufTtcbi8vIGRvIE5PVCBnaXZlIGEgdHlwZSBoZXJlLiBuZWVkIGB0eXBlb2YgQkFTRV9PUFRJT05fREVGQVVMVFNgIHRvIGdpdmUgcmVhbCByZXN1bHRzLlxuLy8gcmF3IHZhbHVlcy5cbnZhciBCQVNFX09QVElPTl9ERUZBVUxUUyA9IHtcbiAgICBldmVudERpc3BsYXk6ICdhdXRvJyxcbiAgICBkZWZhdWx0UmFuZ2VTZXBhcmF0b3I6ICcgLSAnLFxuICAgIHRpdGxlUmFuZ2VTZXBhcmF0b3I6ICcgXFx1MjAxMyAnLFxuICAgIGRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb246ICcwMTowMDowMCcsXG4gICAgZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb246IHsgZGF5OiAxIH0sXG4gICAgZm9yY2VFdmVudER1cmF0aW9uOiBmYWxzZSxcbiAgICBuZXh0RGF5VGhyZXNob2xkOiAnMDA6MDA6MDAnLFxuICAgIGRheUhlYWRlcnM6IHRydWUsXG4gICAgaW5pdGlhbFZpZXc6ICcnLFxuICAgIGFzcGVjdFJhdGlvOiAxLjM1LFxuICAgIGhlYWRlclRvb2xiYXI6IHtcbiAgICAgICAgc3RhcnQ6ICd0aXRsZScsXG4gICAgICAgIGNlbnRlcjogJycsXG4gICAgICAgIGVuZDogJ3RvZGF5IHByZXYsbmV4dCcsXG4gICAgfSxcbiAgICB3ZWVrZW5kczogdHJ1ZSxcbiAgICB3ZWVrTnVtYmVyczogZmFsc2UsXG4gICAgd2Vla051bWJlckNhbGN1bGF0aW9uOiAnbG9jYWwnLFxuICAgIGVkaXRhYmxlOiBmYWxzZSxcbiAgICBub3dJbmRpY2F0b3I6IGZhbHNlLFxuICAgIHNjcm9sbFRpbWU6ICcwNjowMDowMCcsXG4gICAgc2Nyb2xsVGltZVJlc2V0OiB0cnVlLFxuICAgIHNsb3RNaW5UaW1lOiAnMDA6MDA6MDAnLFxuICAgIHNsb3RNYXhUaW1lOiAnMjQ6MDA6MDAnLFxuICAgIHNob3dOb25DdXJyZW50RGF0ZXM6IHRydWUsXG4gICAgbGF6eUZldGNoaW5nOiB0cnVlLFxuICAgIHN0YXJ0UGFyYW06ICdzdGFydCcsXG4gICAgZW5kUGFyYW06ICdlbmQnLFxuICAgIHRpbWVab25lUGFyYW06ICd0aW1lWm9uZScsXG4gICAgdGltZVpvbmU6ICdsb2NhbCcsXG4gICAgbG9jYWxlczogW10sXG4gICAgbG9jYWxlOiAnJyxcbiAgICB0aGVtZVN5c3RlbTogJ3N0YW5kYXJkJyxcbiAgICBkcmFnUmV2ZXJ0RHVyYXRpb246IDUwMCxcbiAgICBkcmFnU2Nyb2xsOiB0cnVlLFxuICAgIGFsbERheU1haW50YWluRHVyYXRpb246IGZhbHNlLFxuICAgIHVuc2VsZWN0QXV0bzogdHJ1ZSxcbiAgICBkcm9wQWNjZXB0OiAnKicsXG4gICAgZXZlbnRPcmRlcjogJ3N0YXJ0LC1kdXJhdGlvbixhbGxEYXksdGl0bGUnLFxuICAgIGRheVBvcG92ZXJGb3JtYXQ6IHsgbW9udGg6ICdsb25nJywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICdudW1lcmljJyB9LFxuICAgIGhhbmRsZVdpbmRvd1Jlc2l6ZTogdHJ1ZSxcbiAgICB3aW5kb3dSZXNpemVEZWxheTogMTAwLFxuICAgIGxvbmdQcmVzc0RlbGF5OiAxMDAwLFxuICAgIGV2ZW50RHJhZ01pbkRpc3RhbmNlOiA1LFxuICAgIGV4cGFuZFJvd3M6IGZhbHNlLFxuICAgIG5hdkxpbmtzOiBmYWxzZSxcbiAgICBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICBldmVudE1pbkhlaWdodDogMTUsXG4gICAgZXZlbnRNaW5XaWR0aDogMzAsXG4gICAgZXZlbnRTaG9ydEhlaWdodDogMzAsXG59O1xuLy8gY2FsZW5kYXIgbGlzdGVuZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBDQUxFTkRBUl9MSVNURU5FUl9SRUZJTkVSUyA9IHtcbiAgICBkYXRlc1NldDogaWRlbnRpdHksXG4gICAgZXZlbnRzU2V0OiBpZGVudGl0eSxcbiAgICBldmVudEFkZDogaWRlbnRpdHksXG4gICAgZXZlbnRDaGFuZ2U6IGlkZW50aXR5LFxuICAgIGV2ZW50UmVtb3ZlOiBpZGVudGl0eSxcbiAgICB3aW5kb3dSZXNpemU6IGlkZW50aXR5LFxuICAgIGV2ZW50Q2xpY2s6IGlkZW50aXR5LFxuICAgIGV2ZW50TW91c2VFbnRlcjogaWRlbnRpdHksXG4gICAgZXZlbnRNb3VzZUxlYXZlOiBpZGVudGl0eSxcbiAgICBzZWxlY3Q6IGlkZW50aXR5LFxuICAgIHVuc2VsZWN0OiBpZGVudGl0eSxcbiAgICBsb2FkaW5nOiBpZGVudGl0eSxcbiAgICAvLyBpbnRlcm5hbFxuICAgIF91bm1vdW50OiBpZGVudGl0eSxcbiAgICBfYmVmb3JlcHJpbnQ6IGlkZW50aXR5LFxuICAgIF9hZnRlcnByaW50OiBpZGVudGl0eSxcbiAgICBfbm9FdmVudERyb3A6IGlkZW50aXR5LFxuICAgIF9ub0V2ZW50UmVzaXplOiBpZGVudGl0eSxcbiAgICBfcmVzaXplOiBpZGVudGl0eSxcbiAgICBfc2Nyb2xsUmVxdWVzdDogaWRlbnRpdHksXG59O1xuLy8gY2FsZW5kYXItc3BlY2lmaWMgb3B0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIENBTEVOREFSX09QVElPTl9SRUZJTkVSUyA9IHtcbiAgICBidXR0b25UZXh0OiBpZGVudGl0eSxcbiAgICBidXR0b25IaW50czogaWRlbnRpdHksXG4gICAgdmlld3M6IGlkZW50aXR5LFxuICAgIHBsdWdpbnM6IGlkZW50aXR5LFxuICAgIGluaXRpYWxFdmVudHM6IGlkZW50aXR5LFxuICAgIGV2ZW50czogaWRlbnRpdHksXG4gICAgZXZlbnRTb3VyY2VzOiBpZGVudGl0eSxcbn07XG52YXIgQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlMgPSB7XG4gICAgaGVhZGVyVG9vbGJhcjogaXNNYXliZU9iamVjdHNFcXVhbCxcbiAgICBmb290ZXJUb29sYmFyOiBpc01heWJlT2JqZWN0c0VxdWFsLFxuICAgIGJ1dHRvblRleHQ6IGlzTWF5YmVPYmplY3RzRXF1YWwsXG4gICAgYnV0dG9uSGludHM6IGlzTWF5YmVPYmplY3RzRXF1YWwsXG4gICAgYnV0dG9uSWNvbnM6IGlzTWF5YmVPYmplY3RzRXF1YWwsXG4gICAgZGF0ZUluY3JlbWVudDogaXNNYXliZU9iamVjdHNFcXVhbCxcbn07XG5mdW5jdGlvbiBpc01heWJlT2JqZWN0c0VxdWFsKGEsIGIpIHtcbiAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnICYmIHR5cGVvZiBiID09PSAnb2JqZWN0JyAmJiBhICYmIGIpIHsgLy8gYm90aCBub24tbnVsbCBvYmplY3RzXG4gICAgICAgIHJldHVybiBpc1Byb3BzRXF1YWwoYSwgYik7XG4gICAgfVxuICAgIHJldHVybiBhID09PSBiO1xufVxuLy8gdmlldy1zcGVjaWZpYyBvcHRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBWSUVXX09QVElPTl9SRUZJTkVSUyA9IHtcbiAgICB0eXBlOiBTdHJpbmcsXG4gICAgY29tcG9uZW50OiBpZGVudGl0eSxcbiAgICBidXR0b25UZXh0OiBTdHJpbmcsXG4gICAgYnV0dG9uVGV4dEtleTogU3RyaW5nLFxuICAgIGRhdGVQcm9maWxlR2VuZXJhdG9yQ2xhc3M6IGlkZW50aXR5LFxuICAgIHVzZXNNaW5NYXhUaW1lOiBCb29sZWFuLFxuICAgIGNsYXNzTmFtZXM6IGlkZW50aXR5LFxuICAgIGNvbnRlbnQ6IGlkZW50aXR5LFxuICAgIGRpZE1vdW50OiBpZGVudGl0eSxcbiAgICB3aWxsVW5tb3VudDogaWRlbnRpdHksXG59O1xuLy8gdXRpbCBmdW5jc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gbWVyZ2VSYXdPcHRpb25zKG9wdGlvblNldHMpIHtcbiAgICByZXR1cm4gbWVyZ2VQcm9wcyhvcHRpb25TZXRzLCBDT01QTEVYX09QVElPTl9DT01QQVJBVE9SUyk7XG59XG5mdW5jdGlvbiByZWZpbmVQcm9wcyhpbnB1dCwgcmVmaW5lcnMpIHtcbiAgICB2YXIgcmVmaW5lZCA9IHt9O1xuICAgIHZhciBleHRyYSA9IHt9O1xuICAgIGZvciAodmFyIHByb3BOYW1lIGluIHJlZmluZXJzKSB7XG4gICAgICAgIGlmIChwcm9wTmFtZSBpbiBpbnB1dCkge1xuICAgICAgICAgICAgcmVmaW5lZFtwcm9wTmFtZV0gPSByZWZpbmVyc1twcm9wTmFtZV0oaW5wdXRbcHJvcE5hbWVdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBpbnB1dCkge1xuICAgICAgICBpZiAoIShwcm9wTmFtZSBpbiByZWZpbmVycykpIHtcbiAgICAgICAgICAgIGV4dHJhW3Byb3BOYW1lXSA9IGlucHV0W3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyByZWZpbmVkOiByZWZpbmVkLCBleHRyYTogZXh0cmEgfTtcbn1cbmZ1bmN0aW9uIGlkZW50aXR5KHJhdykge1xuICAgIHJldHVybiByYXc7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXZlbnRzKHJhd0V2ZW50cywgZXZlbnRTb3VyY2UsIGNvbnRleHQsIGFsbG93T3BlblJhbmdlKSB7XG4gICAgdmFyIGV2ZW50U3RvcmUgPSBjcmVhdGVFbXB0eUV2ZW50U3RvcmUoKTtcbiAgICB2YXIgZXZlbnRSZWZpbmVycyA9IGJ1aWxkRXZlbnRSZWZpbmVycyhjb250ZXh0KTtcbiAgICBmb3IgKHZhciBfaSA9IDAsIHJhd0V2ZW50c18xID0gcmF3RXZlbnRzOyBfaSA8IHJhd0V2ZW50c18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgcmF3RXZlbnQgPSByYXdFdmVudHNfMVtfaV07XG4gICAgICAgIHZhciB0dXBsZSA9IHBhcnNlRXZlbnQocmF3RXZlbnQsIGV2ZW50U291cmNlLCBjb250ZXh0LCBhbGxvd09wZW5SYW5nZSwgZXZlbnRSZWZpbmVycyk7XG4gICAgICAgIGlmICh0dXBsZSkge1xuICAgICAgICAgICAgZXZlbnRUdXBsZVRvU3RvcmUodHVwbGUsIGV2ZW50U3RvcmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBldmVudFN0b3JlO1xufVxuZnVuY3Rpb24gZXZlbnRUdXBsZVRvU3RvcmUodHVwbGUsIGV2ZW50U3RvcmUpIHtcbiAgICBpZiAoZXZlbnRTdG9yZSA9PT0gdm9pZCAwKSB7IGV2ZW50U3RvcmUgPSBjcmVhdGVFbXB0eUV2ZW50U3RvcmUoKTsgfVxuICAgIGV2ZW50U3RvcmUuZGVmc1t0dXBsZS5kZWYuZGVmSWRdID0gdHVwbGUuZGVmO1xuICAgIGlmICh0dXBsZS5pbnN0YW5jZSkge1xuICAgICAgICBldmVudFN0b3JlLmluc3RhbmNlc1t0dXBsZS5pbnN0YW5jZS5pbnN0YW5jZUlkXSA9IHR1cGxlLmluc3RhbmNlO1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnRTdG9yZTtcbn1cbi8vIHJldHJpZXZlcyBldmVudHMgdGhhdCBoYXZlIHRoZSBzYW1lIGdyb3VwSWQgYXMgdGhlIGluc3RhbmNlIHNwZWNpZmllZCBieSBgaW5zdGFuY2VJZGBcbi8vIG9yIHRoZXkgYXJlIHRoZSBzYW1lIGFzIHRoZSBpbnN0YW5jZS5cbi8vIHdoeSBtaWdodCBpbnN0YW5jZUlkIG5vdCBiZSBpbiB0aGUgc3RvcmU/IGFuIGV2ZW50IGZyb20gYW5vdGhlciBjYWxlbmRhcj9cbmZ1bmN0aW9uIGdldFJlbGV2YW50RXZlbnRzKGV2ZW50U3RvcmUsIGluc3RhbmNlSWQpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBldmVudFN0b3JlLmluc3RhbmNlc1tpbnN0YW5jZUlkXTtcbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgdmFyIGRlZl8xID0gZXZlbnRTdG9yZS5kZWZzW2luc3RhbmNlLmRlZklkXTtcbiAgICAgICAgLy8gZ2V0IGV2ZW50cy9pbnN0YW5jZXMgd2l0aCBzYW1lIGdyb3VwXG4gICAgICAgIHZhciBuZXdTdG9yZSA9IGZpbHRlckV2ZW50U3RvcmVEZWZzKGV2ZW50U3RvcmUsIGZ1bmN0aW9uIChsb29rRGVmKSB7IHJldHVybiBpc0V2ZW50RGVmc0dyb3VwZWQoZGVmXzEsIGxvb2tEZWYpOyB9KTtcbiAgICAgICAgLy8gYWRkIHRoZSBvcmlnaW5hbFxuICAgICAgICAvLyBUT0RPOiB3aXNoIHdlIGNvdWxkIHVzZSBldmVudFR1cGxlVG9TdG9yZSBvciBzb21ldGhpbmcgbGlrZSBpdFxuICAgICAgICBuZXdTdG9yZS5kZWZzW2RlZl8xLmRlZklkXSA9IGRlZl8xO1xuICAgICAgICBuZXdTdG9yZS5pbnN0YW5jZXNbaW5zdGFuY2UuaW5zdGFuY2VJZF0gPSBpbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIG5ld1N0b3JlO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlRW1wdHlFdmVudFN0b3JlKCk7XG59XG5mdW5jdGlvbiBpc0V2ZW50RGVmc0dyb3VwZWQoZGVmMCwgZGVmMSkge1xuICAgIHJldHVybiBCb29sZWFuKGRlZjAuZ3JvdXBJZCAmJiBkZWYwLmdyb3VwSWQgPT09IGRlZjEuZ3JvdXBJZCk7XG59XG5mdW5jdGlvbiBjcmVhdGVFbXB0eUV2ZW50U3RvcmUoKSB7XG4gICAgcmV0dXJuIHsgZGVmczoge30sIGluc3RhbmNlczoge30gfTtcbn1cbmZ1bmN0aW9uIG1lcmdlRXZlbnRTdG9yZXMoc3RvcmUwLCBzdG9yZTEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkZWZzOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgc3RvcmUwLmRlZnMpLCBzdG9yZTEuZGVmcyksXG4gICAgICAgIGluc3RhbmNlczogdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIHN0b3JlMC5pbnN0YW5jZXMpLCBzdG9yZTEuaW5zdGFuY2VzKSxcbiAgICB9O1xufVxuZnVuY3Rpb24gZmlsdGVyRXZlbnRTdG9yZURlZnMoZXZlbnRTdG9yZSwgZmlsdGVyRnVuYykge1xuICAgIHZhciBkZWZzID0gZmlsdGVySGFzaChldmVudFN0b3JlLmRlZnMsIGZpbHRlckZ1bmMpO1xuICAgIHZhciBpbnN0YW5jZXMgPSBmaWx0ZXJIYXNoKGV2ZW50U3RvcmUuaW5zdGFuY2VzLCBmdW5jdGlvbiAoaW5zdGFuY2UpIHsgcmV0dXJuIChkZWZzW2luc3RhbmNlLmRlZklkXSAvLyBzdGlsbCBleGlzdHM/XG4gICAgKTsgfSk7XG4gICAgcmV0dXJuIHsgZGVmczogZGVmcywgaW5zdGFuY2VzOiBpbnN0YW5jZXMgfTtcbn1cbmZ1bmN0aW9uIGV4Y2x1ZGVTdWJFdmVudFN0b3JlKG1hc3Rlciwgc3ViKSB7XG4gICAgdmFyIGRlZnMgPSBtYXN0ZXIuZGVmcywgaW5zdGFuY2VzID0gbWFzdGVyLmluc3RhbmNlcztcbiAgICB2YXIgZmlsdGVyZWREZWZzID0ge307XG4gICAgdmFyIGZpbHRlcmVkSW5zdGFuY2VzID0ge307XG4gICAgZm9yICh2YXIgZGVmSWQgaW4gZGVmcykge1xuICAgICAgICBpZiAoIXN1Yi5kZWZzW2RlZklkXSkgeyAvLyBub3QgZXhwbGljaXRseSBleGNsdWRlZFxuICAgICAgICAgICAgZmlsdGVyZWREZWZzW2RlZklkXSA9IGRlZnNbZGVmSWRdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGluc3RhbmNlSWQgaW4gaW5zdGFuY2VzKSB7XG4gICAgICAgIGlmICghc3ViLmluc3RhbmNlc1tpbnN0YW5jZUlkXSAmJiAvLyBub3QgZXhwbGljaXRseSBleGNsdWRlZFxuICAgICAgICAgICAgZmlsdGVyZWREZWZzW2luc3RhbmNlc1tpbnN0YW5jZUlkXS5kZWZJZF0gLy8gZGVmIHdhc24ndCBmaWx0ZXJlZCBhd2F5XG4gICAgICAgICkge1xuICAgICAgICAgICAgZmlsdGVyZWRJbnN0YW5jZXNbaW5zdGFuY2VJZF0gPSBpbnN0YW5jZXNbaW5zdGFuY2VJZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVmczogZmlsdGVyZWREZWZzLFxuICAgICAgICBpbnN0YW5jZXM6IGZpbHRlcmVkSW5zdGFuY2VzLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnN0cmFpbnQoaW5wdXQsIGNvbnRleHQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRXZlbnRzKGlucHV0LCBudWxsLCBjb250ZXh0LCB0cnVlKTsgLy8gYWxsb3dPcGVuUmFuZ2U9dHJ1ZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiBpbnB1dCkgeyAvLyBub24tbnVsbCBvYmplY3RcbiAgICAgICAgcmV0dXJuIHBhcnNlRXZlbnRzKFtpbnB1dF0sIG51bGwsIGNvbnRleHQsIHRydWUpOyAvLyBhbGxvd09wZW5SYW5nZT10cnVlXG4gICAgfVxuICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoaW5wdXQpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcGFyc2VDbGFzc05hbWVzKHJhdykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJhdykpIHtcbiAgICAgICAgcmV0dXJuIHJhdztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByYXcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiByYXcuc3BsaXQoL1xccysvKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xufVxuXG4vLyBUT0RPOiBiZXR0ZXIgY2FsbGVkIFwiRXZlbnRTZXR0aW5nc1wiIG9yIFwiRXZlbnRDb25maWdcIlxuLy8gVE9ETzogbW92ZSB0aGlzIGZpbGUgaW50byBzdHJ1Y3RzXG4vLyBUT0RPOiBzZXBhcmF0ZSBjb25zdHJhaW50L292ZXJsYXAvYWxsb3csIGJlY2F1c2Ugc2VsZWN0aW9uIHVzZXMgb25seSB0aGF0LCBub3Qgb3RoZXIgcHJvcHNcbnZhciBFVkVOVF9VSV9SRUZJTkVSUyA9IHtcbiAgICBkaXNwbGF5OiBTdHJpbmcsXG4gICAgZWRpdGFibGU6IEJvb2xlYW4sXG4gICAgc3RhcnRFZGl0YWJsZTogQm9vbGVhbixcbiAgICBkdXJhdGlvbkVkaXRhYmxlOiBCb29sZWFuLFxuICAgIGNvbnN0cmFpbnQ6IGlkZW50aXR5LFxuICAgIG92ZXJsYXA6IGlkZW50aXR5LFxuICAgIGFsbG93OiBpZGVudGl0eSxcbiAgICBjbGFzc05hbWU6IHBhcnNlQ2xhc3NOYW1lcyxcbiAgICBjbGFzc05hbWVzOiBwYXJzZUNsYXNzTmFtZXMsXG4gICAgY29sb3I6IFN0cmluZyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IFN0cmluZyxcbiAgICBib3JkZXJDb2xvcjogU3RyaW5nLFxuICAgIHRleHRDb2xvcjogU3RyaW5nLFxufTtcbnZhciBFTVBUWV9FVkVOVF9VSSA9IHtcbiAgICBkaXNwbGF5OiBudWxsLFxuICAgIHN0YXJ0RWRpdGFibGU6IG51bGwsXG4gICAgZHVyYXRpb25FZGl0YWJsZTogbnVsbCxcbiAgICBjb25zdHJhaW50czogW10sXG4gICAgb3ZlcmxhcDogbnVsbCxcbiAgICBhbGxvd3M6IFtdLFxuICAgIGJhY2tncm91bmRDb2xvcjogJycsXG4gICAgYm9yZGVyQ29sb3I6ICcnLFxuICAgIHRleHRDb2xvcjogJycsXG4gICAgY2xhc3NOYW1lczogW10sXG59O1xuZnVuY3Rpb24gY3JlYXRlRXZlbnRVaShyZWZpbmVkLCBjb250ZXh0KSB7XG4gICAgdmFyIGNvbnN0cmFpbnQgPSBub3JtYWxpemVDb25zdHJhaW50KHJlZmluZWQuY29uc3RyYWludCwgY29udGV4dCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGlzcGxheTogcmVmaW5lZC5kaXNwbGF5IHx8IG51bGwsXG4gICAgICAgIHN0YXJ0RWRpdGFibGU6IHJlZmluZWQuc3RhcnRFZGl0YWJsZSAhPSBudWxsID8gcmVmaW5lZC5zdGFydEVkaXRhYmxlIDogcmVmaW5lZC5lZGl0YWJsZSxcbiAgICAgICAgZHVyYXRpb25FZGl0YWJsZTogcmVmaW5lZC5kdXJhdGlvbkVkaXRhYmxlICE9IG51bGwgPyByZWZpbmVkLmR1cmF0aW9uRWRpdGFibGUgOiByZWZpbmVkLmVkaXRhYmxlLFxuICAgICAgICBjb25zdHJhaW50czogY29uc3RyYWludCAhPSBudWxsID8gW2NvbnN0cmFpbnRdIDogW10sXG4gICAgICAgIG92ZXJsYXA6IHJlZmluZWQub3ZlcmxhcCAhPSBudWxsID8gcmVmaW5lZC5vdmVybGFwIDogbnVsbCxcbiAgICAgICAgYWxsb3dzOiByZWZpbmVkLmFsbG93ICE9IG51bGwgPyBbcmVmaW5lZC5hbGxvd10gOiBbXSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiByZWZpbmVkLmJhY2tncm91bmRDb2xvciB8fCByZWZpbmVkLmNvbG9yIHx8ICcnLFxuICAgICAgICBib3JkZXJDb2xvcjogcmVmaW5lZC5ib3JkZXJDb2xvciB8fCByZWZpbmVkLmNvbG9yIHx8ICcnLFxuICAgICAgICB0ZXh0Q29sb3I6IHJlZmluZWQudGV4dENvbG9yIHx8ICcnLFxuICAgICAgICBjbGFzc05hbWVzOiAocmVmaW5lZC5jbGFzc05hbWUgfHwgW10pLmNvbmNhdChyZWZpbmVkLmNsYXNzTmFtZXMgfHwgW10pLCAvLyBqb2luIHNpbmd1bGFyIGFuZCBwbHVyYWxcbiAgICB9O1xufVxuLy8gVE9ETzogcHJldmVudCBhZ2FpbnN0IHByb2JsZW1zIHdpdGggPDIgYXJncyFcbmZ1bmN0aW9uIGNvbWJpbmVFdmVudFVpcyh1aXMpIHtcbiAgICByZXR1cm4gdWlzLnJlZHVjZShjb21iaW5lVHdvRXZlbnRVaXMsIEVNUFRZX0VWRU5UX1VJKTtcbn1cbmZ1bmN0aW9uIGNvbWJpbmVUd29FdmVudFVpcyhpdGVtMCwgaXRlbTEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkaXNwbGF5OiBpdGVtMS5kaXNwbGF5ICE9IG51bGwgPyBpdGVtMS5kaXNwbGF5IDogaXRlbTAuZGlzcGxheSxcbiAgICAgICAgc3RhcnRFZGl0YWJsZTogaXRlbTEuc3RhcnRFZGl0YWJsZSAhPSBudWxsID8gaXRlbTEuc3RhcnRFZGl0YWJsZSA6IGl0ZW0wLnN0YXJ0RWRpdGFibGUsXG4gICAgICAgIGR1cmF0aW9uRWRpdGFibGU6IGl0ZW0xLmR1cmF0aW9uRWRpdGFibGUgIT0gbnVsbCA/IGl0ZW0xLmR1cmF0aW9uRWRpdGFibGUgOiBpdGVtMC5kdXJhdGlvbkVkaXRhYmxlLFxuICAgICAgICBjb25zdHJhaW50czogaXRlbTAuY29uc3RyYWludHMuY29uY2F0KGl0ZW0xLmNvbnN0cmFpbnRzKSxcbiAgICAgICAgb3ZlcmxhcDogdHlwZW9mIGl0ZW0xLm92ZXJsYXAgPT09ICdib29sZWFuJyA/IGl0ZW0xLm92ZXJsYXAgOiBpdGVtMC5vdmVybGFwLFxuICAgICAgICBhbGxvd3M6IGl0ZW0wLmFsbG93cy5jb25jYXQoaXRlbTEuYWxsb3dzKSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBpdGVtMS5iYWNrZ3JvdW5kQ29sb3IgfHwgaXRlbTAuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICBib3JkZXJDb2xvcjogaXRlbTEuYm9yZGVyQ29sb3IgfHwgaXRlbTAuYm9yZGVyQ29sb3IsXG4gICAgICAgIHRleHRDb2xvcjogaXRlbTEudGV4dENvbG9yIHx8IGl0ZW0wLnRleHRDb2xvcixcbiAgICAgICAgY2xhc3NOYW1lczogaXRlbTAuY2xhc3NOYW1lcy5jb25jYXQoaXRlbTEuY2xhc3NOYW1lcyksXG4gICAgfTtcbn1cblxudmFyIEVWRU5UX05PTl9EQVRFX1JFRklORVJTID0ge1xuICAgIGlkOiBTdHJpbmcsXG4gICAgZ3JvdXBJZDogU3RyaW5nLFxuICAgIHRpdGxlOiBTdHJpbmcsXG4gICAgdXJsOiBTdHJpbmcsXG4gICAgaW50ZXJhY3RpdmU6IEJvb2xlYW4sXG59O1xudmFyIEVWRU5UX0RBVEVfUkVGSU5FUlMgPSB7XG4gICAgc3RhcnQ6IGlkZW50aXR5LFxuICAgIGVuZDogaWRlbnRpdHksXG4gICAgZGF0ZTogaWRlbnRpdHksXG4gICAgYWxsRGF5OiBCb29sZWFuLFxufTtcbnZhciBFVkVOVF9SRUZJTkVSUyA9IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBFVkVOVF9OT05fREFURV9SRUZJTkVSUyksIEVWRU5UX0RBVEVfUkVGSU5FUlMpLCB7IGV4dGVuZGVkUHJvcHM6IGlkZW50aXR5IH0pO1xuZnVuY3Rpb24gcGFyc2VFdmVudChyYXcsIGV2ZW50U291cmNlLCBjb250ZXh0LCBhbGxvd09wZW5SYW5nZSwgcmVmaW5lcnMpIHtcbiAgICBpZiAocmVmaW5lcnMgPT09IHZvaWQgMCkgeyByZWZpbmVycyA9IGJ1aWxkRXZlbnRSZWZpbmVycyhjb250ZXh0KTsgfVxuICAgIHZhciBfYSA9IHJlZmluZUV2ZW50RGVmKHJhdywgY29udGV4dCwgcmVmaW5lcnMpLCByZWZpbmVkID0gX2EucmVmaW5lZCwgZXh0cmEgPSBfYS5leHRyYTtcbiAgICB2YXIgZGVmYXVsdEFsbERheSA9IGNvbXB1dGVJc0RlZmF1bHRBbGxEYXkoZXZlbnRTb3VyY2UsIGNvbnRleHQpO1xuICAgIHZhciByZWN1cnJpbmdSZXMgPSBwYXJzZVJlY3VycmluZyhyZWZpbmVkLCBkZWZhdWx0QWxsRGF5LCBjb250ZXh0LmRhdGVFbnYsIGNvbnRleHQucGx1Z2luSG9va3MucmVjdXJyaW5nVHlwZXMpO1xuICAgIGlmIChyZWN1cnJpbmdSZXMpIHtcbiAgICAgICAgdmFyIGRlZiA9IHBhcnNlRXZlbnREZWYocmVmaW5lZCwgZXh0cmEsIGV2ZW50U291cmNlID8gZXZlbnRTb3VyY2Uuc291cmNlSWQgOiAnJywgcmVjdXJyaW5nUmVzLmFsbERheSwgQm9vbGVhbihyZWN1cnJpbmdSZXMuZHVyYXRpb24pLCBjb250ZXh0KTtcbiAgICAgICAgZGVmLnJlY3VycmluZ0RlZiA9IHtcbiAgICAgICAgICAgIHR5cGVJZDogcmVjdXJyaW5nUmVzLnR5cGVJZCxcbiAgICAgICAgICAgIHR5cGVEYXRhOiByZWN1cnJpbmdSZXMudHlwZURhdGEsXG4gICAgICAgICAgICBkdXJhdGlvbjogcmVjdXJyaW5nUmVzLmR1cmF0aW9uLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyBkZWY6IGRlZiwgaW5zdGFuY2U6IG51bGwgfTtcbiAgICB9XG4gICAgdmFyIHNpbmdsZVJlcyA9IHBhcnNlU2luZ2xlKHJlZmluZWQsIGRlZmF1bHRBbGxEYXksIGNvbnRleHQsIGFsbG93T3BlblJhbmdlKTtcbiAgICBpZiAoc2luZ2xlUmVzKSB7XG4gICAgICAgIHZhciBkZWYgPSBwYXJzZUV2ZW50RGVmKHJlZmluZWQsIGV4dHJhLCBldmVudFNvdXJjZSA/IGV2ZW50U291cmNlLnNvdXJjZUlkIDogJycsIHNpbmdsZVJlcy5hbGxEYXksIHNpbmdsZVJlcy5oYXNFbmQsIGNvbnRleHQpO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBjcmVhdGVFdmVudEluc3RhbmNlKGRlZi5kZWZJZCwgc2luZ2xlUmVzLnJhbmdlLCBzaW5nbGVSZXMuZm9yY2VkU3RhcnRUem8sIHNpbmdsZVJlcy5mb3JjZWRFbmRUem8pO1xuICAgICAgICByZXR1cm4geyBkZWY6IGRlZiwgaW5zdGFuY2U6IGluc3RhbmNlIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gcmVmaW5lRXZlbnREZWYocmF3LCBjb250ZXh0LCByZWZpbmVycykge1xuICAgIGlmIChyZWZpbmVycyA9PT0gdm9pZCAwKSB7IHJlZmluZXJzID0gYnVpbGRFdmVudFJlZmluZXJzKGNvbnRleHQpOyB9XG4gICAgcmV0dXJuIHJlZmluZVByb3BzKHJhdywgcmVmaW5lcnMpO1xufVxuZnVuY3Rpb24gYnVpbGRFdmVudFJlZmluZXJzKGNvbnRleHQpIHtcbiAgICByZXR1cm4gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIEVWRU5UX1VJX1JFRklORVJTKSwgRVZFTlRfUkVGSU5FUlMpLCBjb250ZXh0LnBsdWdpbkhvb2tzLmV2ZW50UmVmaW5lcnMpO1xufVxuLypcbldpbGwgTk9UIHBvcHVsYXRlIGV4dGVuZGVkUHJvcHMgd2l0aCB0aGUgbGVmdG92ZXIgcHJvcGVydGllcy5cbldpbGwgTk9UIHBvcHVsYXRlIGRhdGUtcmVsYXRlZCBwcm9wcy5cbiovXG5mdW5jdGlvbiBwYXJzZUV2ZW50RGVmKHJlZmluZWQsIGV4dHJhLCBzb3VyY2VJZCwgYWxsRGF5LCBoYXNFbmQsIGNvbnRleHQpIHtcbiAgICB2YXIgZGVmID0ge1xuICAgICAgICB0aXRsZTogcmVmaW5lZC50aXRsZSB8fCAnJyxcbiAgICAgICAgZ3JvdXBJZDogcmVmaW5lZC5ncm91cElkIHx8ICcnLFxuICAgICAgICBwdWJsaWNJZDogcmVmaW5lZC5pZCB8fCAnJyxcbiAgICAgICAgdXJsOiByZWZpbmVkLnVybCB8fCAnJyxcbiAgICAgICAgcmVjdXJyaW5nRGVmOiBudWxsLFxuICAgICAgICBkZWZJZDogZ3VpZCgpLFxuICAgICAgICBzb3VyY2VJZDogc291cmNlSWQsXG4gICAgICAgIGFsbERheTogYWxsRGF5LFxuICAgICAgICBoYXNFbmQ6IGhhc0VuZCxcbiAgICAgICAgaW50ZXJhY3RpdmU6IHJlZmluZWQuaW50ZXJhY3RpdmUsXG4gICAgICAgIHVpOiBjcmVhdGVFdmVudFVpKHJlZmluZWQsIGNvbnRleHQpLFxuICAgICAgICBleHRlbmRlZFByb3BzOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgKHJlZmluZWQuZXh0ZW5kZWRQcm9wcyB8fCB7fSkpLCBleHRyYSksXG4gICAgfTtcbiAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gY29udGV4dC5wbHVnaW5Ib29rcy5ldmVudERlZk1lbWJlckFkZGVyczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIG1lbWJlckFkZGVyID0gX2FbX2ldO1xuICAgICAgICB0c2xpYi5fX2Fzc2lnbihkZWYsIG1lbWJlckFkZGVyKHJlZmluZWQpKTtcbiAgICB9XG4gICAgLy8gaGVscCBvdXQgRXZlbnRBcGkgZnJvbSBoYXZpbmcgdXNlciBtb2RpZnkgcHJvcHNcbiAgICBPYmplY3QuZnJlZXplKGRlZi51aS5jbGFzc05hbWVzKTtcbiAgICBPYmplY3QuZnJlZXplKGRlZi5leHRlbmRlZFByb3BzKTtcbiAgICByZXR1cm4gZGVmO1xufVxuZnVuY3Rpb24gcGFyc2VTaW5nbGUocmVmaW5lZCwgZGVmYXVsdEFsbERheSwgY29udGV4dCwgYWxsb3dPcGVuUmFuZ2UpIHtcbiAgICB2YXIgYWxsRGF5ID0gcmVmaW5lZC5hbGxEYXk7XG4gICAgdmFyIHN0YXJ0TWV0YTtcbiAgICB2YXIgc3RhcnRNYXJrZXIgPSBudWxsO1xuICAgIHZhciBoYXNFbmQgPSBmYWxzZTtcbiAgICB2YXIgZW5kTWV0YTtcbiAgICB2YXIgZW5kTWFya2VyID0gbnVsbDtcbiAgICB2YXIgc3RhcnRJbnB1dCA9IHJlZmluZWQuc3RhcnQgIT0gbnVsbCA/IHJlZmluZWQuc3RhcnQgOiByZWZpbmVkLmRhdGU7XG4gICAgc3RhcnRNZXRhID0gY29udGV4dC5kYXRlRW52LmNyZWF0ZU1hcmtlck1ldGEoc3RhcnRJbnB1dCk7XG4gICAgaWYgKHN0YXJ0TWV0YSkge1xuICAgICAgICBzdGFydE1hcmtlciA9IHN0YXJ0TWV0YS5tYXJrZXI7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFhbGxvd09wZW5SYW5nZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHJlZmluZWQuZW5kICE9IG51bGwpIHtcbiAgICAgICAgZW5kTWV0YSA9IGNvbnRleHQuZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKHJlZmluZWQuZW5kKTtcbiAgICB9XG4gICAgaWYgKGFsbERheSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChkZWZhdWx0QWxsRGF5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGFsbERheSA9IGRlZmF1bHRBbGxEYXk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBmYWxsIGJhY2sgdG8gdGhlIGRhdGUgcHJvcHMgTEFTVFxuICAgICAgICAgICAgYWxsRGF5ID0gKCFzdGFydE1ldGEgfHwgc3RhcnRNZXRhLmlzVGltZVVuc3BlY2lmaWVkKSAmJlxuICAgICAgICAgICAgICAgICghZW5kTWV0YSB8fCBlbmRNZXRhLmlzVGltZVVuc3BlY2lmaWVkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWxsRGF5ICYmIHN0YXJ0TWFya2VyKSB7XG4gICAgICAgIHN0YXJ0TWFya2VyID0gc3RhcnRPZkRheShzdGFydE1hcmtlcik7XG4gICAgfVxuICAgIGlmIChlbmRNZXRhKSB7XG4gICAgICAgIGVuZE1hcmtlciA9IGVuZE1ldGEubWFya2VyO1xuICAgICAgICBpZiAoYWxsRGF5KSB7XG4gICAgICAgICAgICBlbmRNYXJrZXIgPSBzdGFydE9mRGF5KGVuZE1hcmtlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0TWFya2VyICYmIGVuZE1hcmtlciA8PSBzdGFydE1hcmtlcikge1xuICAgICAgICAgICAgZW5kTWFya2VyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5kTWFya2VyKSB7XG4gICAgICAgIGhhc0VuZCA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFhbGxvd09wZW5SYW5nZSkge1xuICAgICAgICBoYXNFbmQgPSBjb250ZXh0Lm9wdGlvbnMuZm9yY2VFdmVudER1cmF0aW9uIHx8IGZhbHNlO1xuICAgICAgICBlbmRNYXJrZXIgPSBjb250ZXh0LmRhdGVFbnYuYWRkKHN0YXJ0TWFya2VyLCBhbGxEYXkgP1xuICAgICAgICAgICAgY29udGV4dC5vcHRpb25zLmRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uIDpcbiAgICAgICAgICAgIGNvbnRleHQub3B0aW9ucy5kZWZhdWx0VGltZWRFdmVudER1cmF0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWxsRGF5OiBhbGxEYXksXG4gICAgICAgIGhhc0VuZDogaGFzRW5kLFxuICAgICAgICByYW5nZTogeyBzdGFydDogc3RhcnRNYXJrZXIsIGVuZDogZW5kTWFya2VyIH0sXG4gICAgICAgIGZvcmNlZFN0YXJ0VHpvOiBzdGFydE1ldGEgPyBzdGFydE1ldGEuZm9yY2VkVHpvIDogbnVsbCxcbiAgICAgICAgZm9yY2VkRW5kVHpvOiBlbmRNZXRhID8gZW5kTWV0YS5mb3JjZWRUem8gOiBudWxsLFxuICAgIH07XG59XG5mdW5jdGlvbiBjb21wdXRlSXNEZWZhdWx0QWxsRGF5KGV2ZW50U291cmNlLCBjb250ZXh0KSB7XG4gICAgdmFyIHJlcyA9IG51bGw7XG4gICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgIHJlcyA9IGV2ZW50U291cmNlLmRlZmF1bHRBbGxEYXk7XG4gICAgfVxuICAgIGlmIChyZXMgPT0gbnVsbCkge1xuICAgICAgICByZXMgPSBjb250ZXh0Lm9wdGlvbnMuZGVmYXVsdEFsbERheTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuLyogRGF0ZSBzdHVmZiB0aGF0IGRvZXNuJ3QgYmVsb25nIGluIGRhdGVsaWIgY29yZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vLyBnaXZlbiBhIHRpbWVkIHJhbmdlLCBjb21wdXRlcyBhbiBhbGwtZGF5IHJhbmdlIHRoYXQgaGFzIHRoZSBzYW1lIGV4YWN0IGR1cmF0aW9uLFxuLy8gYnV0IHdob3NlIHN0YXJ0IHRpbWUgaXMgYWxpZ25lZCB3aXRoIHRoZSBzdGFydCBvZiB0aGUgZGF5LlxuZnVuY3Rpb24gY29tcHV0ZUFsaWduZWREYXlSYW5nZSh0aW1lZFJhbmdlKSB7XG4gICAgdmFyIGRheUNudCA9IE1hdGguZmxvb3IoZGlmZkRheXModGltZWRSYW5nZS5zdGFydCwgdGltZWRSYW5nZS5lbmQpKSB8fCAxO1xuICAgIHZhciBzdGFydCA9IHN0YXJ0T2ZEYXkodGltZWRSYW5nZS5zdGFydCk7XG4gICAgdmFyIGVuZCA9IGFkZERheXMoc3RhcnQsIGRheUNudCk7XG4gICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9O1xufVxuLy8gZ2l2ZW4gYSB0aW1lZCByYW5nZSwgY29tcHV0ZXMgYW4gYWxsLWRheSByYW5nZSBiYXNlZCBvbiBob3cgZm9yIHRoZSBlbmQgZGF0ZSBibGVlZHMgaW50byB0aGUgbmV4dCBkYXlcbi8vIFRPRE86IGdpdmUgbmV4dERheVRocmVzaG9sZCBhIGRlZmF1bHQgYXJnXG5mdW5jdGlvbiBjb21wdXRlVmlzaWJsZURheVJhbmdlKHRpbWVkUmFuZ2UsIG5leHREYXlUaHJlc2hvbGQpIHtcbiAgICBpZiAobmV4dERheVRocmVzaG9sZCA9PT0gdm9pZCAwKSB7IG5leHREYXlUaHJlc2hvbGQgPSBjcmVhdGVEdXJhdGlvbigwKTsgfVxuICAgIHZhciBzdGFydERheSA9IG51bGw7XG4gICAgdmFyIGVuZERheSA9IG51bGw7XG4gICAgaWYgKHRpbWVkUmFuZ2UuZW5kKSB7XG4gICAgICAgIGVuZERheSA9IHN0YXJ0T2ZEYXkodGltZWRSYW5nZS5lbmQpO1xuICAgICAgICB2YXIgZW5kVGltZU1TID0gdGltZWRSYW5nZS5lbmQudmFsdWVPZigpIC0gZW5kRGF5LnZhbHVlT2YoKTsgLy8gIyBvZiBtaWxsaXNlY29uZHMgaW50byBgZW5kRGF5YFxuICAgICAgICAvLyBJZiB0aGUgZW5kIHRpbWUgaXMgYWN0dWFsbHkgaW5jbHVzaXZlbHkgcGFydCBvZiB0aGUgbmV4dCBkYXkgYW5kIGlzIGVxdWFsIHRvIG9yXG4gICAgICAgIC8vIGJleW9uZCB0aGUgbmV4dCBkYXkgdGhyZXNob2xkLCBhZGp1c3QgdGhlIGVuZCB0byBiZSB0aGUgZXhjbHVzaXZlIGVuZCBvZiBgZW5kRGF5YC5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBsZWF2aW5nIGl0IGFzIGluY2x1c2l2ZSB3aWxsIGNhdXNlIGl0IHRvIGV4Y2x1ZGUgYGVuZERheWAuXG4gICAgICAgIGlmIChlbmRUaW1lTVMgJiYgZW5kVGltZU1TID49IGFzUm91Z2hNcyhuZXh0RGF5VGhyZXNob2xkKSkge1xuICAgICAgICAgICAgZW5kRGF5ID0gYWRkRGF5cyhlbmREYXksIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0aW1lZFJhbmdlLnN0YXJ0KSB7XG4gICAgICAgIHN0YXJ0RGF5ID0gc3RhcnRPZkRheSh0aW1lZFJhbmdlLnN0YXJ0KTsgLy8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF5IHRoZSByYW5nZSBzdGFydHNcbiAgICAgICAgLy8gSWYgZW5kIGlzIHdpdGhpbiBgc3RhcnREYXlgIGJ1dCBub3QgcGFzdCBuZXh0RGF5VGhyZXNob2xkLCBhc3NpZ24gdGhlIGRlZmF1bHQgZHVyYXRpb24gb2Ygb25lIGRheS5cbiAgICAgICAgaWYgKGVuZERheSAmJiBlbmREYXkgPD0gc3RhcnREYXkpIHtcbiAgICAgICAgICAgIGVuZERheSA9IGFkZERheXMoc3RhcnREYXksIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydERheSwgZW5kOiBlbmREYXkgfTtcbn1cbi8vIHNwYW5zIGZyb20gb25lIGRheSBpbnRvIGFub3RoZXI/XG5mdW5jdGlvbiBpc011bHRpRGF5UmFuZ2UocmFuZ2UpIHtcbiAgICB2YXIgdmlzaWJsZVJhbmdlID0gY29tcHV0ZVZpc2libGVEYXlSYW5nZShyYW5nZSk7XG4gICAgcmV0dXJuIGRpZmZEYXlzKHZpc2libGVSYW5nZS5zdGFydCwgdmlzaWJsZVJhbmdlLmVuZCkgPiAxO1xufVxuZnVuY3Rpb24gZGlmZkRhdGVzKGRhdGUwLCBkYXRlMSwgZGF0ZUVudiwgbGFyZ2VVbml0KSB7XG4gICAgaWYgKGxhcmdlVW5pdCA9PT0gJ3llYXInKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbihkYXRlRW52LmRpZmZXaG9sZVllYXJzKGRhdGUwLCBkYXRlMSksICd5ZWFyJyk7XG4gICAgfVxuICAgIGlmIChsYXJnZVVuaXQgPT09ICdtb250aCcpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKGRhdGVFbnYuZGlmZldob2xlTW9udGhzKGRhdGUwLCBkYXRlMSksICdtb250aCcpO1xuICAgIH1cbiAgICByZXR1cm4gZGlmZkRheUFuZFRpbWUoZGF0ZTAsIGRhdGUxKTsgLy8gcmV0dXJucyBhIGR1cmF0aW9uXG59XG5cbmZ1bmN0aW9uIHBhcnNlUmFuZ2UoaW5wdXQsIGRhdGVFbnYpIHtcbiAgICB2YXIgc3RhcnQgPSBudWxsO1xuICAgIHZhciBlbmQgPSBudWxsO1xuICAgIGlmIChpbnB1dC5zdGFydCkge1xuICAgICAgICBzdGFydCA9IGRhdGVFbnYuY3JlYXRlTWFya2VyKGlucHV0LnN0YXJ0KTtcbiAgICB9XG4gICAgaWYgKGlucHV0LmVuZCkge1xuICAgICAgICBlbmQgPSBkYXRlRW52LmNyZWF0ZU1hcmtlcihpbnB1dC5lbmQpO1xuICAgIH1cbiAgICBpZiAoIXN0YXJ0ICYmICFlbmQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChzdGFydCAmJiBlbmQgJiYgZW5kIDwgc3RhcnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfTtcbn1cbi8vIFNJREUtRUZGRUNUOiB3aWxsIG11dGF0ZSByYW5nZXMuXG4vLyBXaWxsIHJldHVybiBhIG5ldyBhcnJheSByZXN1bHQuXG5mdW5jdGlvbiBpbnZlcnRSYW5nZXMocmFuZ2VzLCBjb25zdHJhaW50UmFuZ2UpIHtcbiAgICB2YXIgaW52ZXJ0ZWRSYW5nZXMgPSBbXTtcbiAgICB2YXIgc3RhcnQgPSBjb25zdHJhaW50UmFuZ2Uuc3RhcnQ7IC8vIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIHJhbmdlLiB0aGUgc3RhcnQgb2YgdGhlIG5ldyByYW5nZVxuICAgIHZhciBpO1xuICAgIHZhciBkYXRlUmFuZ2U7XG4gICAgLy8gcmFuZ2VzIG5lZWQgdG8gYmUgaW4gb3JkZXIuIHJlcXVpcmVkIGZvciBvdXIgZGF0ZS13YWxraW5nIGFsZ29yaXRobVxuICAgIHJhbmdlcy5zb3J0KGNvbXBhcmVSYW5nZXMpO1xuICAgIGZvciAoaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgZGF0ZVJhbmdlID0gcmFuZ2VzW2ldO1xuICAgICAgICAvLyBhZGQgdGhlIHNwYW4gb2YgdGltZSBiZWZvcmUgdGhlIGV2ZW50IChpZiB0aGVyZSBpcyBhbnkpXG4gICAgICAgIGlmIChkYXRlUmFuZ2Uuc3RhcnQgPiBzdGFydCkgeyAvLyBjb21wYXJlIG1pbGxpc2Vjb25kIHRpbWUgKHNraXAgYW55IGFtYmlnIGxvZ2ljKVxuICAgICAgICAgICAgaW52ZXJ0ZWRSYW5nZXMucHVzaCh7IHN0YXJ0OiBzdGFydCwgZW5kOiBkYXRlUmFuZ2Uuc3RhcnQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGVSYW5nZS5lbmQgPiBzdGFydCkge1xuICAgICAgICAgICAgc3RhcnQgPSBkYXRlUmFuZ2UuZW5kO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGFkZCB0aGUgc3BhbiBvZiB0aW1lIGFmdGVyIHRoZSBsYXN0IGV2ZW50IChpZiB0aGVyZSBpcyBhbnkpXG4gICAgaWYgKHN0YXJ0IDwgY29uc3RyYWludFJhbmdlLmVuZCkgeyAvLyBjb21wYXJlIG1pbGxpc2Vjb25kIHRpbWUgKHNraXAgYW55IGFtYmlnIGxvZ2ljKVxuICAgICAgICBpbnZlcnRlZFJhbmdlcy5wdXNoKHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGNvbnN0cmFpbnRSYW5nZS5lbmQgfSk7XG4gICAgfVxuICAgIHJldHVybiBpbnZlcnRlZFJhbmdlcztcbn1cbmZ1bmN0aW9uIGNvbXBhcmVSYW5nZXMocmFuZ2UwLCByYW5nZTEpIHtcbiAgICByZXR1cm4gcmFuZ2UwLnN0YXJ0LnZhbHVlT2YoKSAtIHJhbmdlMS5zdGFydC52YWx1ZU9mKCk7IC8vIGVhcmxpZXIgcmFuZ2VzIGdvIGZpcnN0XG59XG5mdW5jdGlvbiBpbnRlcnNlY3RSYW5nZXMocmFuZ2UwLCByYW5nZTEpIHtcbiAgICB2YXIgc3RhcnQgPSByYW5nZTAuc3RhcnQsIGVuZCA9IHJhbmdlMC5lbmQ7XG4gICAgdmFyIG5ld1JhbmdlID0gbnVsbDtcbiAgICBpZiAocmFuZ2UxLnN0YXJ0ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc3RhcnQgPSByYW5nZTEuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGFydCA9IG5ldyBEYXRlKE1hdGgubWF4KHN0YXJ0LnZhbHVlT2YoKSwgcmFuZ2UxLnN0YXJ0LnZhbHVlT2YoKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyYW5nZTEuZW5kICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGVuZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgZW5kID0gcmFuZ2UxLmVuZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVuZCA9IG5ldyBEYXRlKE1hdGgubWluKGVuZC52YWx1ZU9mKCksIHJhbmdlMS5lbmQudmFsdWVPZigpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YXJ0ID09PSBudWxsIHx8IGVuZCA9PT0gbnVsbCB8fCBzdGFydCA8IGVuZCkge1xuICAgICAgICBuZXdSYW5nZSA9IHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9O1xuICAgIH1cbiAgICByZXR1cm4gbmV3UmFuZ2U7XG59XG5mdW5jdGlvbiByYW5nZXNFcXVhbChyYW5nZTAsIHJhbmdlMSkge1xuICAgIHJldHVybiAocmFuZ2UwLnN0YXJ0ID09PSBudWxsID8gbnVsbCA6IHJhbmdlMC5zdGFydC52YWx1ZU9mKCkpID09PSAocmFuZ2UxLnN0YXJ0ID09PSBudWxsID8gbnVsbCA6IHJhbmdlMS5zdGFydC52YWx1ZU9mKCkpICYmXG4gICAgICAgIChyYW5nZTAuZW5kID09PSBudWxsID8gbnVsbCA6IHJhbmdlMC5lbmQudmFsdWVPZigpKSA9PT0gKHJhbmdlMS5lbmQgPT09IG51bGwgPyBudWxsIDogcmFuZ2UxLmVuZC52YWx1ZU9mKCkpO1xufVxuZnVuY3Rpb24gcmFuZ2VzSW50ZXJzZWN0KHJhbmdlMCwgcmFuZ2UxKSB7XG4gICAgcmV0dXJuIChyYW5nZTAuZW5kID09PSBudWxsIHx8IHJhbmdlMS5zdGFydCA9PT0gbnVsbCB8fCByYW5nZTAuZW5kID4gcmFuZ2UxLnN0YXJ0KSAmJlxuICAgICAgICAocmFuZ2UwLnN0YXJ0ID09PSBudWxsIHx8IHJhbmdlMS5lbmQgPT09IG51bGwgfHwgcmFuZ2UwLnN0YXJ0IDwgcmFuZ2UxLmVuZCk7XG59XG5mdW5jdGlvbiByYW5nZUNvbnRhaW5zUmFuZ2Uob3V0ZXJSYW5nZSwgaW5uZXJSYW5nZSkge1xuICAgIHJldHVybiAob3V0ZXJSYW5nZS5zdGFydCA9PT0gbnVsbCB8fCAoaW5uZXJSYW5nZS5zdGFydCAhPT0gbnVsbCAmJiBpbm5lclJhbmdlLnN0YXJ0ID49IG91dGVyUmFuZ2Uuc3RhcnQpKSAmJlxuICAgICAgICAob3V0ZXJSYW5nZS5lbmQgPT09IG51bGwgfHwgKGlubmVyUmFuZ2UuZW5kICE9PSBudWxsICYmIGlubmVyUmFuZ2UuZW5kIDw9IG91dGVyUmFuZ2UuZW5kKSk7XG59XG5mdW5jdGlvbiByYW5nZUNvbnRhaW5zTWFya2VyKHJhbmdlLCBkYXRlKSB7XG4gICAgcmV0dXJuIChyYW5nZS5zdGFydCA9PT0gbnVsbCB8fCBkYXRlID49IHJhbmdlLnN0YXJ0KSAmJlxuICAgICAgICAocmFuZ2UuZW5kID09PSBudWxsIHx8IGRhdGUgPCByYW5nZS5lbmQpO1xufVxuLy8gSWYgdGhlIGdpdmVuIGRhdGUgaXMgbm90IHdpdGhpbiB0aGUgZ2l2ZW4gcmFuZ2UsIG1vdmUgaXQgaW5zaWRlLlxuLy8gKElmIGl0J3MgcGFzdCB0aGUgZW5kLCBtYWtlIGl0IG9uZSBtaWxsaXNlY29uZCBiZWZvcmUgdGhlIGVuZCkuXG5mdW5jdGlvbiBjb25zdHJhaW5NYXJrZXJUb1JhbmdlKGRhdGUsIHJhbmdlKSB7XG4gICAgaWYgKHJhbmdlLnN0YXJ0ICE9IG51bGwgJiYgZGF0ZSA8IHJhbmdlLnN0YXJ0KSB7XG4gICAgICAgIHJldHVybiByYW5nZS5zdGFydDtcbiAgICB9XG4gICAgaWYgKHJhbmdlLmVuZCAhPSBudWxsICYmIGRhdGUgPj0gcmFuZ2UuZW5kKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShyYW5nZS5lbmQudmFsdWVPZigpIC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlO1xufVxuXG4vKlxuU3BlY2lmeWluZyBuZXh0RGF5VGhyZXNob2xkIHNpZ25hbHMgdGhhdCBhbGwtZGF5IHJhbmdlcyBzaG91bGQgYmUgc2xpY2VkLlxuKi9cbmZ1bmN0aW9uIHNsaWNlRXZlbnRTdG9yZShldmVudFN0b3JlLCBldmVudFVpQmFzZXMsIGZyYW1pbmdSYW5nZSwgbmV4dERheVRocmVzaG9sZCkge1xuICAgIHZhciBpbnZlcnNlQmdCeUdyb3VwSWQgPSB7fTtcbiAgICB2YXIgaW52ZXJzZUJnQnlEZWZJZCA9IHt9O1xuICAgIHZhciBkZWZCeUdyb3VwSWQgPSB7fTtcbiAgICB2YXIgYmdSYW5nZXMgPSBbXTtcbiAgICB2YXIgZmdSYW5nZXMgPSBbXTtcbiAgICB2YXIgZXZlbnRVaXMgPSBjb21waWxlRXZlbnRVaXMoZXZlbnRTdG9yZS5kZWZzLCBldmVudFVpQmFzZXMpO1xuICAgIGZvciAodmFyIGRlZklkIGluIGV2ZW50U3RvcmUuZGVmcykge1xuICAgICAgICB2YXIgZGVmID0gZXZlbnRTdG9yZS5kZWZzW2RlZklkXTtcbiAgICAgICAgdmFyIHVpID0gZXZlbnRVaXNbZGVmLmRlZklkXTtcbiAgICAgICAgaWYgKHVpLmRpc3BsYXkgPT09ICdpbnZlcnNlLWJhY2tncm91bmQnKSB7XG4gICAgICAgICAgICBpZiAoZGVmLmdyb3VwSWQpIHtcbiAgICAgICAgICAgICAgICBpbnZlcnNlQmdCeUdyb3VwSWRbZGVmLmdyb3VwSWRdID0gW107XG4gICAgICAgICAgICAgICAgaWYgKCFkZWZCeUdyb3VwSWRbZGVmLmdyb3VwSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZkJ5R3JvdXBJZFtkZWYuZ3JvdXBJZF0gPSBkZWY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW52ZXJzZUJnQnlEZWZJZFtkZWZJZF0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBpbnN0YW5jZUlkIGluIGV2ZW50U3RvcmUuaW5zdGFuY2VzKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGV2ZW50U3RvcmUuaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICAgICAgICB2YXIgZGVmID0gZXZlbnRTdG9yZS5kZWZzW2luc3RhbmNlLmRlZklkXTtcbiAgICAgICAgdmFyIHVpID0gZXZlbnRVaXNbZGVmLmRlZklkXTtcbiAgICAgICAgdmFyIG9yaWdSYW5nZSA9IGluc3RhbmNlLnJhbmdlO1xuICAgICAgICB2YXIgbm9ybWFsUmFuZ2UgPSAoIWRlZi5hbGxEYXkgJiYgbmV4dERheVRocmVzaG9sZCkgP1xuICAgICAgICAgICAgY29tcHV0ZVZpc2libGVEYXlSYW5nZShvcmlnUmFuZ2UsIG5leHREYXlUaHJlc2hvbGQpIDpcbiAgICAgICAgICAgIG9yaWdSYW5nZTtcbiAgICAgICAgdmFyIHNsaWNlZFJhbmdlID0gaW50ZXJzZWN0UmFuZ2VzKG5vcm1hbFJhbmdlLCBmcmFtaW5nUmFuZ2UpO1xuICAgICAgICBpZiAoc2xpY2VkUmFuZ2UpIHtcbiAgICAgICAgICAgIGlmICh1aS5kaXNwbGF5ID09PSAnaW52ZXJzZS1iYWNrZ3JvdW5kJykge1xuICAgICAgICAgICAgICAgIGlmIChkZWYuZ3JvdXBJZCkge1xuICAgICAgICAgICAgICAgICAgICBpbnZlcnNlQmdCeUdyb3VwSWRbZGVmLmdyb3VwSWRdLnB1c2goc2xpY2VkUmFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW52ZXJzZUJnQnlEZWZJZFtpbnN0YW5jZS5kZWZJZF0ucHVzaChzbGljZWRSYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodWkuZGlzcGxheSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgKHVpLmRpc3BsYXkgPT09ICdiYWNrZ3JvdW5kJyA/IGJnUmFuZ2VzIDogZmdSYW5nZXMpLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBkZWY6IGRlZixcbiAgICAgICAgICAgICAgICAgICAgdWk6IHVpLFxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlOiBzbGljZWRSYW5nZSxcbiAgICAgICAgICAgICAgICAgICAgaXNTdGFydDogbm9ybWFsUmFuZ2Uuc3RhcnQgJiYgbm9ybWFsUmFuZ2Uuc3RhcnQudmFsdWVPZigpID09PSBzbGljZWRSYW5nZS5zdGFydC52YWx1ZU9mKCksXG4gICAgICAgICAgICAgICAgICAgIGlzRW5kOiBub3JtYWxSYW5nZS5lbmQgJiYgbm9ybWFsUmFuZ2UuZW5kLnZhbHVlT2YoKSA9PT0gc2xpY2VkUmFuZ2UuZW5kLnZhbHVlT2YoKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBncm91cElkIGluIGludmVyc2VCZ0J5R3JvdXBJZCkgeyAvLyBCWSBHUk9VUFxuICAgICAgICB2YXIgcmFuZ2VzID0gaW52ZXJzZUJnQnlHcm91cElkW2dyb3VwSWRdO1xuICAgICAgICB2YXIgaW52ZXJ0ZWRSYW5nZXMgPSBpbnZlcnRSYW5nZXMocmFuZ2VzLCBmcmFtaW5nUmFuZ2UpO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGludmVydGVkUmFuZ2VzXzEgPSBpbnZlcnRlZFJhbmdlczsgX2kgPCBpbnZlcnRlZFJhbmdlc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIGludmVydGVkUmFuZ2UgPSBpbnZlcnRlZFJhbmdlc18xW19pXTtcbiAgICAgICAgICAgIHZhciBkZWYgPSBkZWZCeUdyb3VwSWRbZ3JvdXBJZF07XG4gICAgICAgICAgICB2YXIgdWkgPSBldmVudFVpc1tkZWYuZGVmSWRdO1xuICAgICAgICAgICAgYmdSYW5nZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZGVmOiBkZWYsXG4gICAgICAgICAgICAgICAgdWk6IHVpLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlOiBudWxsLFxuICAgICAgICAgICAgICAgIHJhbmdlOiBpbnZlcnRlZFJhbmdlLFxuICAgICAgICAgICAgICAgIGlzU3RhcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzRW5kOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGRlZklkIGluIGludmVyc2VCZ0J5RGVmSWQpIHtcbiAgICAgICAgdmFyIHJhbmdlcyA9IGludmVyc2VCZ0J5RGVmSWRbZGVmSWRdO1xuICAgICAgICB2YXIgaW52ZXJ0ZWRSYW5nZXMgPSBpbnZlcnRSYW5nZXMocmFuZ2VzLCBmcmFtaW5nUmFuZ2UpO1xuICAgICAgICBmb3IgKHZhciBfYSA9IDAsIGludmVydGVkUmFuZ2VzXzIgPSBpbnZlcnRlZFJhbmdlczsgX2EgPCBpbnZlcnRlZFJhbmdlc18yLmxlbmd0aDsgX2ErKykge1xuICAgICAgICAgICAgdmFyIGludmVydGVkUmFuZ2UgPSBpbnZlcnRlZFJhbmdlc18yW19hXTtcbiAgICAgICAgICAgIGJnUmFuZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgIGRlZjogZXZlbnRTdG9yZS5kZWZzW2RlZklkXSxcbiAgICAgICAgICAgICAgICB1aTogZXZlbnRVaXNbZGVmSWRdLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlOiBudWxsLFxuICAgICAgICAgICAgICAgIHJhbmdlOiBpbnZlcnRlZFJhbmdlLFxuICAgICAgICAgICAgICAgIGlzU3RhcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzRW5kOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGJnOiBiZ1JhbmdlcywgZmc6IGZnUmFuZ2VzIH07XG59XG5mdW5jdGlvbiBoYXNCZ1JlbmRlcmluZyhkZWYpIHtcbiAgICByZXR1cm4gZGVmLnVpLmRpc3BsYXkgPT09ICdiYWNrZ3JvdW5kJyB8fCBkZWYudWkuZGlzcGxheSA9PT0gJ2ludmVyc2UtYmFja2dyb3VuZCc7XG59XG5mdW5jdGlvbiBzZXRFbFNlZyhlbCwgc2VnKSB7XG4gICAgZWwuZmNTZWcgPSBzZWc7XG59XG5mdW5jdGlvbiBnZXRFbFNlZyhlbCkge1xuICAgIHJldHVybiBlbC5mY1NlZyB8fFxuICAgICAgICBlbC5wYXJlbnROb2RlLmZjU2VnIHx8IC8vIGZvciB0aGUgaGFybmVzc1xuICAgICAgICBudWxsO1xufVxuLy8gZXZlbnQgdWkgY29tcHV0YXRpb25cbmZ1bmN0aW9uIGNvbXBpbGVFdmVudFVpcyhldmVudERlZnMsIGV2ZW50VWlCYXNlcykge1xuICAgIHJldHVybiBtYXBIYXNoKGV2ZW50RGVmcywgZnVuY3Rpb24gKGV2ZW50RGVmKSB7IHJldHVybiBjb21waWxlRXZlbnRVaShldmVudERlZiwgZXZlbnRVaUJhc2VzKTsgfSk7XG59XG5mdW5jdGlvbiBjb21waWxlRXZlbnRVaShldmVudERlZiwgZXZlbnRVaUJhc2VzKSB7XG4gICAgdmFyIHVpcyA9IFtdO1xuICAgIGlmIChldmVudFVpQmFzZXNbJyddKSB7XG4gICAgICAgIHVpcy5wdXNoKGV2ZW50VWlCYXNlc1snJ10pO1xuICAgIH1cbiAgICBpZiAoZXZlbnRVaUJhc2VzW2V2ZW50RGVmLmRlZklkXSkge1xuICAgICAgICB1aXMucHVzaChldmVudFVpQmFzZXNbZXZlbnREZWYuZGVmSWRdKTtcbiAgICB9XG4gICAgdWlzLnB1c2goZXZlbnREZWYudWkpO1xuICAgIHJldHVybiBjb21iaW5lRXZlbnRVaXModWlzKTtcbn1cbmZ1bmN0aW9uIHNvcnRFdmVudFNlZ3Moc2VncywgZXZlbnRPcmRlclNwZWNzKSB7XG4gICAgdmFyIG9ianMgPSBzZWdzLm1hcChidWlsZFNlZ0NvbXBhcmVPYmopO1xuICAgIG9ianMuc29ydChmdW5jdGlvbiAob2JqMCwgb2JqMSkgeyByZXR1cm4gY29tcGFyZUJ5RmllbGRTcGVjcyhvYmowLCBvYmoxLCBldmVudE9yZGVyU3BlY3MpOyB9KTtcbiAgICByZXR1cm4gb2Jqcy5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMuX3NlZzsgfSk7XG59XG4vLyByZXR1cm5zIGEgb2JqZWN0IHdpdGggYWxsIHByaW1pdGl2ZSBwcm9wcyB0aGF0IGNhbiBiZSBjb21wYXJlZFxuZnVuY3Rpb24gYnVpbGRTZWdDb21wYXJlT2JqKHNlZykge1xuICAgIHZhciBldmVudFJhbmdlID0gc2VnLmV2ZW50UmFuZ2U7XG4gICAgdmFyIGV2ZW50RGVmID0gZXZlbnRSYW5nZS5kZWY7XG4gICAgdmFyIHJhbmdlID0gZXZlbnRSYW5nZS5pbnN0YW5jZSA/IGV2ZW50UmFuZ2UuaW5zdGFuY2UucmFuZ2UgOiBldmVudFJhbmdlLnJhbmdlO1xuICAgIHZhciBzdGFydCA9IHJhbmdlLnN0YXJ0ID8gcmFuZ2Uuc3RhcnQudmFsdWVPZigpIDogMDsgLy8gVE9ETzogYmV0dGVyIHN1cHBvcnQgZm9yIG9wZW4tcmFuZ2UgZXZlbnRzXG4gICAgdmFyIGVuZCA9IHJhbmdlLmVuZCA/IHJhbmdlLmVuZC52YWx1ZU9mKCkgOiAwOyAvLyBcIlxuICAgIHJldHVybiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgZXZlbnREZWYuZXh0ZW5kZWRQcm9wcyksIGV2ZW50RGVmKSwgeyBpZDogZXZlbnREZWYucHVibGljSWQsIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgZW5kOiBlbmQsIGR1cmF0aW9uOiBlbmQgLSBzdGFydCwgYWxsRGF5OiBOdW1iZXIoZXZlbnREZWYuYWxsRGF5KSwgX3NlZzogc2VnIH0pO1xufVxuZnVuY3Rpb24gY29tcHV0ZVNlZ0RyYWdnYWJsZShzZWcsIGNvbnRleHQpIHtcbiAgICB2YXIgcGx1Z2luSG9va3MgPSBjb250ZXh0LnBsdWdpbkhvb2tzO1xuICAgIHZhciB0cmFuc2Zvcm1lcnMgPSBwbHVnaW5Ib29rcy5pc0RyYWdnYWJsZVRyYW5zZm9ybWVycztcbiAgICB2YXIgX2EgPSBzZWcuZXZlbnRSYW5nZSwgZGVmID0gX2EuZGVmLCB1aSA9IF9hLnVpO1xuICAgIHZhciB2YWwgPSB1aS5zdGFydEVkaXRhYmxlO1xuICAgIGZvciAodmFyIF9pID0gMCwgdHJhbnNmb3JtZXJzXzEgPSB0cmFuc2Zvcm1lcnM7IF9pIDwgdHJhbnNmb3JtZXJzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyc18xW19pXTtcbiAgICAgICAgdmFsID0gdHJhbnNmb3JtZXIodmFsLCBkZWYsIHVpLCBjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVTZWdTdGFydFJlc2l6YWJsZShzZWcsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gc2VnLmlzU3RhcnQgJiYgc2VnLmV2ZW50UmFuZ2UudWkuZHVyYXRpb25FZGl0YWJsZSAmJiBjb250ZXh0Lm9wdGlvbnMuZXZlbnRSZXNpemFibGVGcm9tU3RhcnQ7XG59XG5mdW5jdGlvbiBjb21wdXRlU2VnRW5kUmVzaXphYmxlKHNlZywgY29udGV4dCkge1xuICAgIHJldHVybiBzZWcuaXNFbmQgJiYgc2VnLmV2ZW50UmFuZ2UudWkuZHVyYXRpb25FZGl0YWJsZTtcbn1cbmZ1bmN0aW9uIGJ1aWxkU2VnVGltZVRleHQoc2VnLCB0aW1lRm9ybWF0LCBjb250ZXh0LCBkZWZhdWx0RGlzcGxheUV2ZW50VGltZSwgLy8gZGVmYXVsdHMgdG8gdHJ1ZVxuZGVmYXVsdERpc3BsYXlFdmVudEVuZCwgLy8gZGVmYXVsdHMgdG8gdHJ1ZVxuc3RhcnRPdmVycmlkZSwgZW5kT3ZlcnJpZGUpIHtcbiAgICB2YXIgZGF0ZUVudiA9IGNvbnRleHQuZGF0ZUVudiwgb3B0aW9ucyA9IGNvbnRleHQub3B0aW9ucztcbiAgICB2YXIgZGlzcGxheUV2ZW50VGltZSA9IG9wdGlvbnMuZGlzcGxheUV2ZW50VGltZSwgZGlzcGxheUV2ZW50RW5kID0gb3B0aW9ucy5kaXNwbGF5RXZlbnRFbmQ7XG4gICAgdmFyIGV2ZW50RGVmID0gc2VnLmV2ZW50UmFuZ2UuZGVmO1xuICAgIHZhciBldmVudEluc3RhbmNlID0gc2VnLmV2ZW50UmFuZ2UuaW5zdGFuY2U7XG4gICAgaWYgKGRpc3BsYXlFdmVudFRpbWUgPT0gbnVsbCkge1xuICAgICAgICBkaXNwbGF5RXZlbnRUaW1lID0gZGVmYXVsdERpc3BsYXlFdmVudFRpbWUgIT09IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZGlzcGxheUV2ZW50RW5kID09IG51bGwpIHtcbiAgICAgICAgZGlzcGxheUV2ZW50RW5kID0gZGVmYXVsdERpc3BsYXlFdmVudEVuZCAhPT0gZmFsc2U7XG4gICAgfVxuICAgIHZhciB3aG9sZUV2ZW50U3RhcnQgPSBldmVudEluc3RhbmNlLnJhbmdlLnN0YXJ0O1xuICAgIHZhciB3aG9sZUV2ZW50RW5kID0gZXZlbnRJbnN0YW5jZS5yYW5nZS5lbmQ7XG4gICAgdmFyIHNlZ1N0YXJ0ID0gc3RhcnRPdmVycmlkZSB8fCBzZWcuc3RhcnQgfHwgc2VnLmV2ZW50UmFuZ2UucmFuZ2Uuc3RhcnQ7XG4gICAgdmFyIHNlZ0VuZCA9IGVuZE92ZXJyaWRlIHx8IHNlZy5lbmQgfHwgc2VnLmV2ZW50UmFuZ2UucmFuZ2UuZW5kO1xuICAgIHZhciBpc1N0YXJ0RGF5ID0gc3RhcnRPZkRheSh3aG9sZUV2ZW50U3RhcnQpLnZhbHVlT2YoKSA9PT0gc3RhcnRPZkRheShzZWdTdGFydCkudmFsdWVPZigpO1xuICAgIHZhciBpc0VuZERheSA9IHN0YXJ0T2ZEYXkoYWRkTXMod2hvbGVFdmVudEVuZCwgLTEpKS52YWx1ZU9mKCkgPT09IHN0YXJ0T2ZEYXkoYWRkTXMoc2VnRW5kLCAtMSkpLnZhbHVlT2YoKTtcbiAgICBpZiAoZGlzcGxheUV2ZW50VGltZSAmJiAhZXZlbnREZWYuYWxsRGF5ICYmIChpc1N0YXJ0RGF5IHx8IGlzRW5kRGF5KSkge1xuICAgICAgICBzZWdTdGFydCA9IGlzU3RhcnREYXkgPyB3aG9sZUV2ZW50U3RhcnQgOiBzZWdTdGFydDtcbiAgICAgICAgc2VnRW5kID0gaXNFbmREYXkgPyB3aG9sZUV2ZW50RW5kIDogc2VnRW5kO1xuICAgICAgICBpZiAoZGlzcGxheUV2ZW50RW5kICYmIGV2ZW50RGVmLmhhc0VuZCkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0UmFuZ2Uoc2VnU3RhcnQsIHNlZ0VuZCwgdGltZUZvcm1hdCwge1xuICAgICAgICAgICAgICAgIGZvcmNlZFN0YXJ0VHpvOiBzdGFydE92ZXJyaWRlID8gbnVsbCA6IGV2ZW50SW5zdGFuY2UuZm9yY2VkU3RhcnRUem8sXG4gICAgICAgICAgICAgICAgZm9yY2VkRW5kVHpvOiBlbmRPdmVycmlkZSA/IG51bGwgOiBldmVudEluc3RhbmNlLmZvcmNlZEVuZFR6byxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlRW52LmZvcm1hdChzZWdTdGFydCwgdGltZUZvcm1hdCwge1xuICAgICAgICAgICAgZm9yY2VkVHpvOiBzdGFydE92ZXJyaWRlID8gbnVsbCA6IGV2ZW50SW5zdGFuY2UuZm9yY2VkU3RhcnRUem8sIC8vIG5vb29vbywgc2FtZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuZnVuY3Rpb24gZ2V0U2VnTWV0YShzZWcsIHRvZGF5UmFuZ2UsIG5vd0RhdGUpIHtcbiAgICB2YXIgc2VnUmFuZ2UgPSBzZWcuZXZlbnRSYW5nZS5yYW5nZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpc1Bhc3Q6IHNlZ1JhbmdlLmVuZCA8IChub3dEYXRlIHx8IHRvZGF5UmFuZ2Uuc3RhcnQpLFxuICAgICAgICBpc0Z1dHVyZTogc2VnUmFuZ2Uuc3RhcnQgPj0gKG5vd0RhdGUgfHwgdG9kYXlSYW5nZS5lbmQpLFxuICAgICAgICBpc1RvZGF5OiB0b2RheVJhbmdlICYmIHJhbmdlQ29udGFpbnNNYXJrZXIodG9kYXlSYW5nZSwgc2VnUmFuZ2Uuc3RhcnQpLFxuICAgIH07XG59XG5mdW5jdGlvbiBnZXRFdmVudENsYXNzTmFtZXMocHJvcHMpIHtcbiAgICB2YXIgY2xhc3NOYW1lcyA9IFsnZmMtZXZlbnQnXTtcbiAgICBpZiAocHJvcHMuaXNNaXJyb3IpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1ldmVudC1taXJyb3InKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzRHJhZ2dhYmxlKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtZHJhZ2dhYmxlJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5pc1N0YXJ0UmVzaXphYmxlIHx8IHByb3BzLmlzRW5kUmVzaXphYmxlKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtcmVzaXphYmxlJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtZHJhZ2dpbmcnKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzUmVzaXppbmcpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1ldmVudC1yZXNpemluZycpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuaXNTZWxlY3RlZCkge1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLWV2ZW50LXNlbGVjdGVkJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5pc1N0YXJ0KSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtc3RhcnQnKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzRW5kKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtZW5kJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5pc1Bhc3QpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1ldmVudC1wYXN0Jyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5pc1RvZGF5KSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtdG9kYXknKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzRnV0dXJlKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtZnV0dXJlJyk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWVzO1xufVxuZnVuY3Rpb24gYnVpbGRFdmVudFJhbmdlS2V5KGV2ZW50UmFuZ2UpIHtcbiAgICByZXR1cm4gZXZlbnRSYW5nZS5pbnN0YW5jZVxuICAgICAgICA/IGV2ZW50UmFuZ2UuaW5zdGFuY2UuaW5zdGFuY2VJZFxuICAgICAgICA6IGV2ZW50UmFuZ2UuZGVmLmRlZklkICsgXCI6XCIgKyBldmVudFJhbmdlLnJhbmdlLnN0YXJ0LnRvSVNPU3RyaW5nKCk7XG4gICAgLy8gaW52ZXJzZS1iYWNrZ3JvdW5kIGV2ZW50cyBkb24ndCBoYXZlIHNwZWNpZmljIGluc3RhbmNlcy4gVE9ETzogYmV0dGVyIHNvbHV0aW9uXG59XG5mdW5jdGlvbiBnZXRTZWdBbmNob3JBdHRycyhzZWcsIGNvbnRleHQpIHtcbiAgICB2YXIgX2EgPSBzZWcuZXZlbnRSYW5nZSwgZGVmID0gX2EuZGVmLCBpbnN0YW5jZSA9IF9hLmluc3RhbmNlO1xuICAgIHZhciB1cmwgPSBkZWYudXJsO1xuICAgIGlmICh1cmwpIHtcbiAgICAgICAgcmV0dXJuIHsgaHJlZjogdXJsIH07XG4gICAgfVxuICAgIHZhciBlbWl0dGVyID0gY29udGV4dC5lbWl0dGVyLCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zO1xuICAgIHZhciBldmVudEludGVyYWN0aXZlID0gb3B0aW9ucy5ldmVudEludGVyYWN0aXZlO1xuICAgIGlmIChldmVudEludGVyYWN0aXZlID09IG51bGwpIHtcbiAgICAgICAgZXZlbnRJbnRlcmFjdGl2ZSA9IGRlZi5pbnRlcmFjdGl2ZTtcbiAgICAgICAgaWYgKGV2ZW50SW50ZXJhY3RpdmUgPT0gbnVsbCkge1xuICAgICAgICAgICAgZXZlbnRJbnRlcmFjdGl2ZSA9IEJvb2xlYW4oZW1pdHRlci5oYXNIYW5kbGVycygnZXZlbnRDbGljaycpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBtb2NrIHdoYXQgaGFwcGVucyBpbiBFdmVudENsaWNraW5nXG4gICAgaWYgKGV2ZW50SW50ZXJhY3RpdmUpIHtcbiAgICAgICAgLy8gb25seSBhdHRhY2gga2V5Ym9hcmQtcmVsYXRlZCBoYW5kbGVycyBiZWNhdXNlIGNsaWNrIGhhbmRsZXIgaXMgYWxyZWFkeSBkb25lIGluIEV2ZW50Q2xpY2tpbmdcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFyaWFLZXlib2FyZEF0dHJzKGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgZW1pdHRlci50cmlnZ2VyKCdldmVudENsaWNrJywge1xuICAgICAgICAgICAgICAgIGVsOiBldi50YXJnZXQsXG4gICAgICAgICAgICAgICAgZXZlbnQ6IG5ldyBFdmVudEFwaShjb250ZXh0LCBkZWYsIGluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICBqc0V2ZW50OiBldixcbiAgICAgICAgICAgICAgICB2aWV3OiBjb250ZXh0LnZpZXdBcGksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbn1cblxudmFyIFNUQU5EQVJEX1BST1BTID0ge1xuICAgIHN0YXJ0OiBpZGVudGl0eSxcbiAgICBlbmQ6IGlkZW50aXR5LFxuICAgIGFsbERheTogQm9vbGVhbixcbn07XG5mdW5jdGlvbiBwYXJzZURhdGVTcGFuKHJhdywgZGF0ZUVudiwgZGVmYXVsdER1cmF0aW9uKSB7XG4gICAgdmFyIHNwYW4gPSBwYXJzZU9wZW5EYXRlU3BhbihyYXcsIGRhdGVFbnYpO1xuICAgIHZhciByYW5nZSA9IHNwYW4ucmFuZ2U7XG4gICAgaWYgKCFyYW5nZS5zdGFydCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKCFyYW5nZS5lbmQpIHtcbiAgICAgICAgaWYgKGRlZmF1bHREdXJhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByYW5nZS5lbmQgPSBkYXRlRW52LmFkZChyYW5nZS5zdGFydCwgZGVmYXVsdER1cmF0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHNwYW47XG59XG4vKlxuVE9ETzogc29tZWhvdyBjb21iaW5lIHdpdGggcGFyc2VSYW5nZT9cbldpbGwgcmV0dXJuIG51bGwgaWYgdGhlIHN0YXJ0L2VuZCBwcm9wcyB3ZXJlIHByZXNlbnQgYnV0IHBhcnNlZCBpbnZhbGlkbHkuXG4qL1xuZnVuY3Rpb24gcGFyc2VPcGVuRGF0ZVNwYW4ocmF3LCBkYXRlRW52KSB7XG4gICAgdmFyIF9hID0gcmVmaW5lUHJvcHMocmF3LCBTVEFOREFSRF9QUk9QUyksIHN0YW5kYXJkUHJvcHMgPSBfYS5yZWZpbmVkLCBleHRyYSA9IF9hLmV4dHJhO1xuICAgIHZhciBzdGFydE1ldGEgPSBzdGFuZGFyZFByb3BzLnN0YXJ0ID8gZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKHN0YW5kYXJkUHJvcHMuc3RhcnQpIDogbnVsbDtcbiAgICB2YXIgZW5kTWV0YSA9IHN0YW5kYXJkUHJvcHMuZW5kID8gZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKHN0YW5kYXJkUHJvcHMuZW5kKSA6IG51bGw7XG4gICAgdmFyIGFsbERheSA9IHN0YW5kYXJkUHJvcHMuYWxsRGF5O1xuICAgIGlmIChhbGxEYXkgPT0gbnVsbCkge1xuICAgICAgICBhbGxEYXkgPSAoc3RhcnRNZXRhICYmIHN0YXJ0TWV0YS5pc1RpbWVVbnNwZWNpZmllZCkgJiZcbiAgICAgICAgICAgICghZW5kTWV0YSB8fCBlbmRNZXRhLmlzVGltZVVuc3BlY2lmaWVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRzbGliLl9fYXNzaWduKHsgcmFuZ2U6IHtcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydE1ldGEgPyBzdGFydE1ldGEubWFya2VyIDogbnVsbCxcbiAgICAgICAgICAgIGVuZDogZW5kTWV0YSA/IGVuZE1ldGEubWFya2VyIDogbnVsbCxcbiAgICAgICAgfSwgYWxsRGF5OiBhbGxEYXkgfSwgZXh0cmEpO1xufVxuZnVuY3Rpb24gaXNEYXRlU3BhbnNFcXVhbChzcGFuMCwgc3BhbjEpIHtcbiAgICByZXR1cm4gcmFuZ2VzRXF1YWwoc3BhbjAucmFuZ2UsIHNwYW4xLnJhbmdlKSAmJlxuICAgICAgICBzcGFuMC5hbGxEYXkgPT09IHNwYW4xLmFsbERheSAmJlxuICAgICAgICBpc1NwYW5Qcm9wc0VxdWFsKHNwYW4wLCBzcGFuMSk7XG59XG4vLyB0aGUgTk9OLURBVEUtUkVMQVRFRCBwcm9wc1xuZnVuY3Rpb24gaXNTcGFuUHJvcHNFcXVhbChzcGFuMCwgc3BhbjEpIHtcbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBzcGFuMSkge1xuICAgICAgICBpZiAocHJvcE5hbWUgIT09ICdyYW5nZScgJiYgcHJvcE5hbWUgIT09ICdhbGxEYXknKSB7XG4gICAgICAgICAgICBpZiAoc3BhbjBbcHJvcE5hbWVdICE9PSBzcGFuMVtwcm9wTmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYXJlIHRoZXJlIGFueSBwcm9wcyB0aGF0IHNwYW4wIGhhcyB0aGF0IHNwYW4xIERPRVNOJ1QgaGF2ZT9cbiAgICAvLyBib3RoIGhhdmUgcmFuZ2UvYWxsRGF5LCBzbyBubyBuZWVkIHRvIHNwZWNpYWwtY2FzZS5cbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBzcGFuMCkge1xuICAgICAgICBpZiAoIShwcm9wTmFtZSBpbiBzcGFuMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRGF0ZVNwYW5BcGkoc3BhbiwgZGF0ZUVudikge1xuICAgIHJldHVybiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgYnVpbGRSYW5nZUFwaShzcGFuLnJhbmdlLCBkYXRlRW52LCBzcGFuLmFsbERheSkpLCB7IGFsbERheTogc3Bhbi5hbGxEYXkgfSk7XG59XG5mdW5jdGlvbiBidWlsZFJhbmdlQXBpV2l0aFRpbWVab25lKHJhbmdlLCBkYXRlRW52LCBvbWl0VGltZSkge1xuICAgIHJldHVybiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgYnVpbGRSYW5nZUFwaShyYW5nZSwgZGF0ZUVudiwgb21pdFRpbWUpKSwgeyB0aW1lWm9uZTogZGF0ZUVudi50aW1lWm9uZSB9KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkUmFuZ2VBcGkocmFuZ2UsIGRhdGVFbnYsIG9taXRUaW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IGRhdGVFbnYudG9EYXRlKHJhbmdlLnN0YXJ0KSxcbiAgICAgICAgZW5kOiBkYXRlRW52LnRvRGF0ZShyYW5nZS5lbmQpLFxuICAgICAgICBzdGFydFN0cjogZGF0ZUVudi5mb3JtYXRJc28ocmFuZ2Uuc3RhcnQsIHsgb21pdFRpbWU6IG9taXRUaW1lIH0pLFxuICAgICAgICBlbmRTdHI6IGRhdGVFbnYuZm9ybWF0SXNvKHJhbmdlLmVuZCwgeyBvbWl0VGltZTogb21pdFRpbWUgfSksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGZhYnJpY2F0ZUV2ZW50UmFuZ2UoZGF0ZVNwYW4sIGV2ZW50VWlCYXNlcywgY29udGV4dCkge1xuICAgIHZhciByZXMgPSByZWZpbmVFdmVudERlZih7IGVkaXRhYmxlOiBmYWxzZSB9LCBjb250ZXh0KTtcbiAgICB2YXIgZGVmID0gcGFyc2VFdmVudERlZihyZXMucmVmaW5lZCwgcmVzLmV4dHJhLCAnJywgLy8gc291cmNlSWRcbiAgICBkYXRlU3Bhbi5hbGxEYXksIHRydWUsIC8vIGhhc0VuZFxuICAgIGNvbnRleHQpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGRlZjogZGVmLFxuICAgICAgICB1aTogY29tcGlsZUV2ZW50VWkoZGVmLCBldmVudFVpQmFzZXMpLFxuICAgICAgICBpbnN0YW5jZTogY3JlYXRlRXZlbnRJbnN0YW5jZShkZWYuZGVmSWQsIGRhdGVTcGFuLnJhbmdlKSxcbiAgICAgICAgcmFuZ2U6IGRhdGVTcGFuLnJhbmdlLFxuICAgICAgICBpc1N0YXJ0OiB0cnVlLFxuICAgICAgICBpc0VuZDogdHJ1ZSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiB0cmlnZ2VyRGF0ZVNlbGVjdChzZWxlY3Rpb24sIHBldiwgY29udGV4dCkge1xuICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdzZWxlY3QnLCB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgYnVpbGREYXRlU3BhbkFwaVdpdGhDb250ZXh0KHNlbGVjdGlvbiwgY29udGV4dCkpLCB7IGpzRXZlbnQ6IHBldiA/IHBldi5vcmlnRXZlbnQgOiBudWxsLCB2aWV3OiBjb250ZXh0LnZpZXdBcGkgfHwgY29udGV4dC5jYWxlbmRhckFwaS52aWV3IH0pKTtcbn1cbmZ1bmN0aW9uIHRyaWdnZXJEYXRlVW5zZWxlY3QocGV2LCBjb250ZXh0KSB7XG4gICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ3Vuc2VsZWN0Jywge1xuICAgICAgICBqc0V2ZW50OiBwZXYgPyBwZXYub3JpZ0V2ZW50IDogbnVsbCxcbiAgICAgICAgdmlldzogY29udGV4dC52aWV3QXBpIHx8IGNvbnRleHQuY2FsZW5kYXJBcGkudmlldyxcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRGF0ZVNwYW5BcGlXaXRoQ29udGV4dChkYXRlU3BhbiwgY29udGV4dCkge1xuICAgIHZhciBwcm9wcyA9IHt9O1xuICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBjb250ZXh0LnBsdWdpbkhvb2tzLmRhdGVTcGFuVHJhbnNmb3JtczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IF9hW19pXTtcbiAgICAgICAgdHNsaWIuX19hc3NpZ24ocHJvcHMsIHRyYW5zZm9ybShkYXRlU3BhbiwgY29udGV4dCkpO1xuICAgIH1cbiAgICB0c2xpYi5fX2Fzc2lnbihwcm9wcywgYnVpbGREYXRlU3BhbkFwaShkYXRlU3BhbiwgY29udGV4dC5kYXRlRW52KSk7XG4gICAgcmV0dXJuIHByb3BzO1xufVxuLy8gR2l2ZW4gYW4gZXZlbnQncyBhbGxEYXkgc3RhdHVzIGFuZCBzdGFydCBkYXRlLCByZXR1cm4gd2hhdCBpdHMgZmFsbGJhY2sgZW5kIGRhdGUgc2hvdWxkIGJlLlxuLy8gVE9ETzogcmVuYW1lIHRvIGNvbXB1dGVEZWZhdWx0RXZlbnRFbmRcbmZ1bmN0aW9uIGdldERlZmF1bHRFdmVudEVuZChhbGxEYXksIG1hcmtlciwgY29udGV4dCkge1xuICAgIHZhciBkYXRlRW52ID0gY29udGV4dC5kYXRlRW52LCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zO1xuICAgIHZhciBlbmQgPSBtYXJrZXI7XG4gICAgaWYgKGFsbERheSkge1xuICAgICAgICBlbmQgPSBzdGFydE9mRGF5KGVuZCk7XG4gICAgICAgIGVuZCA9IGRhdGVFbnYuYWRkKGVuZCwgb3B0aW9ucy5kZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBlbmQgPSBkYXRlRW52LmFkZChlbmQsIG9wdGlvbnMuZGVmYXVsdFRpbWVkRXZlbnREdXJhdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBlbmQ7XG59XG5cbi8vIGFwcGxpZXMgdGhlIG11dGF0aW9uIHRvIEFMTCBkZWZzL2luc3RhbmNlcyB3aXRoaW4gdGhlIGV2ZW50IHN0b3JlXG5mdW5jdGlvbiBhcHBseU11dGF0aW9uVG9FdmVudFN0b3JlKGV2ZW50U3RvcmUsIGV2ZW50Q29uZmlnQmFzZSwgbXV0YXRpb24sIGNvbnRleHQpIHtcbiAgICB2YXIgZXZlbnRDb25maWdzID0gY29tcGlsZUV2ZW50VWlzKGV2ZW50U3RvcmUuZGVmcywgZXZlbnRDb25maWdCYXNlKTtcbiAgICB2YXIgZGVzdCA9IGNyZWF0ZUVtcHR5RXZlbnRTdG9yZSgpO1xuICAgIGZvciAodmFyIGRlZklkIGluIGV2ZW50U3RvcmUuZGVmcykge1xuICAgICAgICB2YXIgZGVmID0gZXZlbnRTdG9yZS5kZWZzW2RlZklkXTtcbiAgICAgICAgZGVzdC5kZWZzW2RlZklkXSA9IGFwcGx5TXV0YXRpb25Ub0V2ZW50RGVmKGRlZiwgZXZlbnRDb25maWdzW2RlZklkXSwgbXV0YXRpb24sIGNvbnRleHQpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpbnN0YW5jZUlkIGluIGV2ZW50U3RvcmUuaW5zdGFuY2VzKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGV2ZW50U3RvcmUuaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICAgICAgICB2YXIgZGVmID0gZGVzdC5kZWZzW2luc3RhbmNlLmRlZklkXTsgLy8gaW1wb3J0YW50IHRvIGdyYWIgdGhlIG5ld2x5IG1vZGlmaWVkIGRlZlxuICAgICAgICBkZXN0Lmluc3RhbmNlc1tpbnN0YW5jZUlkXSA9IGFwcGx5TXV0YXRpb25Ub0V2ZW50SW5zdGFuY2UoaW5zdGFuY2UsIGRlZiwgZXZlbnRDb25maWdzW2luc3RhbmNlLmRlZklkXSwgbXV0YXRpb24sIGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbn1cbmZ1bmN0aW9uIGFwcGx5TXV0YXRpb25Ub0V2ZW50RGVmKGV2ZW50RGVmLCBldmVudENvbmZpZywgbXV0YXRpb24sIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhbmRhcmRQcm9wcyA9IG11dGF0aW9uLnN0YW5kYXJkUHJvcHMgfHwge307XG4gICAgLy8gaWYgaGFzRW5kIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQsIGd1ZXNzIGEgZ29vZCB2YWx1ZSBiYXNlZCBvbiBkZWx0YXMuXG4gICAgLy8gaWYgZHVyYXRpb24gd2lsbCBjaGFuZ2UsIHRoZXJlJ3Mgbm8gd2F5IHRoZSBkZWZhdWx0IGR1cmF0aW9uIHdpbGwgcGVyc2lzdCxcbiAgICAvLyBhbmQgdGh1cywgd2UgbmVlZCB0byBtYXJrIHRoZSBldmVudCBhcyBoYXZpbmcgYSByZWFsIGVuZFxuICAgIGlmIChzdGFuZGFyZFByb3BzLmhhc0VuZCA9PSBudWxsICYmXG4gICAgICAgIGV2ZW50Q29uZmlnLmR1cmF0aW9uRWRpdGFibGUgJiZcbiAgICAgICAgKG11dGF0aW9uLnN0YXJ0RGVsdGEgfHwgbXV0YXRpb24uZW5kRGVsdGEpKSB7XG4gICAgICAgIHN0YW5kYXJkUHJvcHMuaGFzRW5kID0gdHJ1ZTsgLy8gVE9ETzogaXMgdGhpcyBtdXRhdGlvbiBva2F5P1xuICAgIH1cbiAgICB2YXIgY29weSA9IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBldmVudERlZiksIHN0YW5kYXJkUHJvcHMpLCB7IHVpOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgZXZlbnREZWYudWkpLCBzdGFuZGFyZFByb3BzLnVpKSB9KTtcbiAgICBpZiAobXV0YXRpb24uZXh0ZW5kZWRQcm9wcykge1xuICAgICAgICBjb3B5LmV4dGVuZGVkUHJvcHMgPSB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgY29weS5leHRlbmRlZFByb3BzKSwgbXV0YXRpb24uZXh0ZW5kZWRQcm9wcyk7XG4gICAgfVxuICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBjb250ZXh0LnBsdWdpbkhvb2tzLmV2ZW50RGVmTXV0YXRpb25BcHBsaWVyczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGFwcGxpZXIgPSBfYVtfaV07XG4gICAgICAgIGFwcGxpZXIoY29weSwgbXV0YXRpb24sIGNvbnRleHQpO1xuICAgIH1cbiAgICBpZiAoIWNvcHkuaGFzRW5kICYmIGNvbnRleHQub3B0aW9ucy5mb3JjZUV2ZW50RHVyYXRpb24pIHtcbiAgICAgICAgY29weS5oYXNFbmQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gY29weTtcbn1cbmZ1bmN0aW9uIGFwcGx5TXV0YXRpb25Ub0V2ZW50SW5zdGFuY2UoZXZlbnRJbnN0YW5jZSwgZXZlbnREZWYsIC8vIG11c3QgZmlyc3QgYmUgbW9kaWZpZWQgYnkgYXBwbHlNdXRhdGlvblRvRXZlbnREZWZcbmV2ZW50Q29uZmlnLCBtdXRhdGlvbiwgY29udGV4dCkge1xuICAgIHZhciBkYXRlRW52ID0gY29udGV4dC5kYXRlRW52O1xuICAgIHZhciBmb3JjZUFsbERheSA9IG11dGF0aW9uLnN0YW5kYXJkUHJvcHMgJiYgbXV0YXRpb24uc3RhbmRhcmRQcm9wcy5hbGxEYXkgPT09IHRydWU7XG4gICAgdmFyIGNsZWFyRW5kID0gbXV0YXRpb24uc3RhbmRhcmRQcm9wcyAmJiBtdXRhdGlvbi5zdGFuZGFyZFByb3BzLmhhc0VuZCA9PT0gZmFsc2U7XG4gICAgdmFyIGNvcHkgPSB0c2xpYi5fX2Fzc2lnbih7fSwgZXZlbnRJbnN0YW5jZSk7XG4gICAgaWYgKGZvcmNlQWxsRGF5KSB7XG4gICAgICAgIGNvcHkucmFuZ2UgPSBjb21wdXRlQWxpZ25lZERheVJhbmdlKGNvcHkucmFuZ2UpO1xuICAgIH1cbiAgICBpZiAobXV0YXRpb24uZGF0ZXNEZWx0YSAmJiBldmVudENvbmZpZy5zdGFydEVkaXRhYmxlKSB7XG4gICAgICAgIGNvcHkucmFuZ2UgPSB7XG4gICAgICAgICAgICBzdGFydDogZGF0ZUVudi5hZGQoY29weS5yYW5nZS5zdGFydCwgbXV0YXRpb24uZGF0ZXNEZWx0YSksXG4gICAgICAgICAgICBlbmQ6IGRhdGVFbnYuYWRkKGNvcHkucmFuZ2UuZW5kLCBtdXRhdGlvbi5kYXRlc0RlbHRhKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG11dGF0aW9uLnN0YXJ0RGVsdGEgJiYgZXZlbnRDb25maWcuZHVyYXRpb25FZGl0YWJsZSkge1xuICAgICAgICBjb3B5LnJhbmdlID0ge1xuICAgICAgICAgICAgc3RhcnQ6IGRhdGVFbnYuYWRkKGNvcHkucmFuZ2Uuc3RhcnQsIG11dGF0aW9uLnN0YXJ0RGVsdGEpLFxuICAgICAgICAgICAgZW5kOiBjb3B5LnJhbmdlLmVuZCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG11dGF0aW9uLmVuZERlbHRhICYmIGV2ZW50Q29uZmlnLmR1cmF0aW9uRWRpdGFibGUpIHtcbiAgICAgICAgY29weS5yYW5nZSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBjb3B5LnJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBkYXRlRW52LmFkZChjb3B5LnJhbmdlLmVuZCwgbXV0YXRpb24uZW5kRGVsdGEpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoY2xlYXJFbmQpIHtcbiAgICAgICAgY29weS5yYW5nZSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBjb3B5LnJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBnZXREZWZhdWx0RXZlbnRFbmQoZXZlbnREZWYuYWxsRGF5LCBjb3B5LnJhbmdlLnN0YXJ0LCBjb250ZXh0KSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gaW4gY2FzZSBldmVudCB3YXMgYWxsLWRheSBidXQgdGhlIHN1cHBsaWVkIGRlbHRhcyB3ZXJlIG5vdFxuICAgIC8vIGJldHRlciB1dGlsIGZvciB0aGlzP1xuICAgIGlmIChldmVudERlZi5hbGxEYXkpIHtcbiAgICAgICAgY29weS5yYW5nZSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydE9mRGF5KGNvcHkucmFuZ2Uuc3RhcnQpLFxuICAgICAgICAgICAgZW5kOiBzdGFydE9mRGF5KGNvcHkucmFuZ2UuZW5kKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gaGFuZGxlIGludmFsaWQgZHVyYXRpb25zXG4gICAgaWYgKGNvcHkucmFuZ2UuZW5kIDwgY29weS5yYW5nZS5zdGFydCkge1xuICAgICAgICBjb3B5LnJhbmdlLmVuZCA9IGdldERlZmF1bHRFdmVudEVuZChldmVudERlZi5hbGxEYXksIGNvcHkucmFuZ2Uuc3RhcnQsIGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gY29weTtcbn1cblxuLy8gbm8gcHVibGljIHR5cGVzIHlldC4gd2hlbiB0aGVyZSBhcmUsIGV4cG9ydCBmcm9tOlxuLy8gaW1wb3J0IHt9IGZyb20gJy4vYXBpLXR5cGUtZGVwcydcbnZhciBWaWV3QXBpID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFZpZXdBcGkodHlwZSwgZ2V0Q3VycmVudERhdGEsIGRhdGVFbnYpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5nZXRDdXJyZW50RGF0YSA9IGdldEN1cnJlbnREYXRhO1xuICAgICAgICB0aGlzLmRhdGVFbnYgPSBkYXRlRW52O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVmlld0FwaS5wcm90b3R5cGUsIFwiY2FsZW5kYXJcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnREYXRhKCkuY2FsZW5kYXJBcGk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVmlld0FwaS5wcm90b3R5cGUsIFwidGl0bGVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnREYXRhKCkudmlld1RpdGxlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpZXdBcGkucHJvdG90eXBlLCBcImFjdGl2ZVN0YXJ0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlRW52LnRvRGF0ZSh0aGlzLmdldEN1cnJlbnREYXRhKCkuZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2Uuc3RhcnQpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpZXdBcGkucHJvdG90eXBlLCBcImFjdGl2ZUVuZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZUVudi50b0RhdGUodGhpcy5nZXRDdXJyZW50RGF0YSgpLmRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlLmVuZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVmlld0FwaS5wcm90b3R5cGUsIFwiY3VycmVudFN0YXJ0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlRW52LnRvRGF0ZSh0aGlzLmdldEN1cnJlbnREYXRhKCkuZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlLnN0YXJ0KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWV3QXBpLnByb3RvdHlwZSwgXCJjdXJyZW50RW5kXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlRW52LnRvRGF0ZSh0aGlzLmdldEN1cnJlbnREYXRhKCkuZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlLmVuZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBWaWV3QXBpLnByb3RvdHlwZS5nZXRPcHRpb24gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDdXJyZW50RGF0YSgpLm9wdGlvbnNbbmFtZV07IC8vIGFyZSB0aGUgdmlldy1zcGVjaWZpYyBvcHRpb25zXG4gICAgfTtcbiAgICByZXR1cm4gVmlld0FwaTtcbn0oKSk7XG5cbnZhciBFVkVOVF9TT1VSQ0VfUkVGSU5FUlMgPSB7XG4gICAgaWQ6IFN0cmluZyxcbiAgICBkZWZhdWx0QWxsRGF5OiBCb29sZWFuLFxuICAgIHVybDogU3RyaW5nLFxuICAgIGZvcm1hdDogU3RyaW5nLFxuICAgIGV2ZW50czogaWRlbnRpdHksXG4gICAgZXZlbnREYXRhVHJhbnNmb3JtOiBpZGVudGl0eSxcbiAgICAvLyBmb3IgYW55IG5ldHdvcmstcmVsYXRlZCBzb3VyY2VzXG4gICAgc3VjY2VzczogaWRlbnRpdHksXG4gICAgZmFpbHVyZTogaWRlbnRpdHksXG59O1xuZnVuY3Rpb24gcGFyc2VFdmVudFNvdXJjZShyYXcsIGNvbnRleHQsIHJlZmluZXJzKSB7XG4gICAgaWYgKHJlZmluZXJzID09PSB2b2lkIDApIHsgcmVmaW5lcnMgPSBidWlsZEV2ZW50U291cmNlUmVmaW5lcnMoY29udGV4dCk7IH1cbiAgICB2YXIgcmF3T2JqO1xuICAgIGlmICh0eXBlb2YgcmF3ID09PSAnc3RyaW5nJykge1xuICAgICAgICByYXdPYmogPSB7IHVybDogcmF3IH07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiByYXcgPT09ICdmdW5jdGlvbicgfHwgQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgICAgIHJhd09iaiA9IHsgZXZlbnRzOiByYXcgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHJhdyA9PT0gJ29iamVjdCcgJiYgcmF3KSB7IC8vIG5vdCBudWxsXG4gICAgICAgIHJhd09iaiA9IHJhdztcbiAgICB9XG4gICAgaWYgKHJhd09iaikge1xuICAgICAgICB2YXIgX2EgPSByZWZpbmVQcm9wcyhyYXdPYmosIHJlZmluZXJzKSwgcmVmaW5lZCA9IF9hLnJlZmluZWQsIGV4dHJhID0gX2EuZXh0cmE7XG4gICAgICAgIHZhciBtZXRhUmVzID0gYnVpbGRFdmVudFNvdXJjZU1ldGEocmVmaW5lZCwgY29udGV4dCk7XG4gICAgICAgIGlmIChtZXRhUmVzKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIF9yYXc6IHJhdyxcbiAgICAgICAgICAgICAgICBpc0ZldGNoaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYXRlc3RGZXRjaElkOiAnJyxcbiAgICAgICAgICAgICAgICBmZXRjaFJhbmdlOiBudWxsLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRBbGxEYXk6IHJlZmluZWQuZGVmYXVsdEFsbERheSxcbiAgICAgICAgICAgICAgICBldmVudERhdGFUcmFuc2Zvcm06IHJlZmluZWQuZXZlbnREYXRhVHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHJlZmluZWQuc3VjY2VzcyxcbiAgICAgICAgICAgICAgICBmYWlsdXJlOiByZWZpbmVkLmZhaWx1cmUsXG4gICAgICAgICAgICAgICAgcHVibGljSWQ6IHJlZmluZWQuaWQgfHwgJycsXG4gICAgICAgICAgICAgICAgc291cmNlSWQ6IGd1aWQoKSxcbiAgICAgICAgICAgICAgICBzb3VyY2VEZWZJZDogbWV0YVJlcy5zb3VyY2VEZWZJZCxcbiAgICAgICAgICAgICAgICBtZXRhOiBtZXRhUmVzLm1ldGEsXG4gICAgICAgICAgICAgICAgdWk6IGNyZWF0ZUV2ZW50VWkocmVmaW5lZCwgY29udGV4dCksXG4gICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9wczogZXh0cmEsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gYnVpbGRFdmVudFNvdXJjZVJlZmluZXJzKGNvbnRleHQpIHtcbiAgICByZXR1cm4gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIEVWRU5UX1VJX1JFRklORVJTKSwgRVZFTlRfU09VUkNFX1JFRklORVJTKSwgY29udGV4dC5wbHVnaW5Ib29rcy5ldmVudFNvdXJjZVJlZmluZXJzKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRXZlbnRTb3VyY2VNZXRhKHJhdywgY29udGV4dCkge1xuICAgIHZhciBkZWZzID0gY29udGV4dC5wbHVnaW5Ib29rcy5ldmVudFNvdXJjZURlZnM7XG4gICAgZm9yICh2YXIgaSA9IGRlZnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHsgLy8gbGF0ZXItYWRkZWQgcGx1Z2lucyB0YWtlIHByZWNlZGVuY2VcbiAgICAgICAgdmFyIGRlZiA9IGRlZnNbaV07XG4gICAgICAgIHZhciBtZXRhID0gZGVmLnBhcnNlTWV0YShyYXcpO1xuICAgICAgICBpZiAobWV0YSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc291cmNlRGVmSWQ6IGksIG1ldGE6IG1ldGEgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVkdWNlQ3VycmVudERhdGUoY3VycmVudERhdGUsIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQ0hBTkdFX0RBVEUnOlxuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5kYXRlTWFya2VyO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEluaXRpYWxEYXRlKG9wdGlvbnMsIGRhdGVFbnYpIHtcbiAgICB2YXIgaW5pdGlhbERhdGVJbnB1dCA9IG9wdGlvbnMuaW5pdGlhbERhdGU7XG4gICAgLy8gY29tcHV0ZSB0aGUgaW5pdGlhbCBhbWJpZy10aW1lem9uZSBkYXRlXG4gICAgaWYgKGluaXRpYWxEYXRlSW5wdXQgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZGF0ZUVudi5jcmVhdGVNYXJrZXIoaW5pdGlhbERhdGVJbnB1dCk7XG4gICAgfVxuICAgIHJldHVybiBnZXROb3cob3B0aW9ucy5ub3csIGRhdGVFbnYpOyAvLyBnZXROb3cgYWxyZWFkeSByZXR1cm5zIHVuem9uZWRcbn1cbmZ1bmN0aW9uIGdldE5vdyhub3dJbnB1dCwgZGF0ZUVudikge1xuICAgIGlmICh0eXBlb2Ygbm93SW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbm93SW5wdXQgPSBub3dJbnB1dCgpO1xuICAgIH1cbiAgICBpZiAobm93SW5wdXQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZGF0ZUVudi5jcmVhdGVOb3dNYXJrZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGVFbnYuY3JlYXRlTWFya2VyKG5vd0lucHV0KTtcbn1cblxudmFyIENhbGVuZGFyQXBpID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENhbGVuZGFyQXBpKCkge1xuICAgIH1cbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUuZ2V0Q3VycmVudERhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnREYXRhTWFuYWdlci5nZXRDdXJyZW50RGF0YSgpO1xuICAgIH07XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmRpc3BhdGNoID0gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0YU1hbmFnZXIuZGlzcGF0Y2goYWN0aW9uKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDYWxlbmRhckFwaS5wcm90b3R5cGUsIFwidmlld1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5nZXRDdXJyZW50RGF0YSgpLnZpZXdBcGk7IH0gLy8gZm9yIHB1YmxpYyBBUElcbiAgICAgICAgLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmJhdGNoUmVuZGVyaW5nID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfTtcbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUudXBkYXRlU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdfcmVzaXplJywgdHJ1ZSk7XG4gICAgfTtcbiAgICAvLyBPcHRpb25zXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUuc2V0T3B0aW9uID0gZnVuY3Rpb24gKG5hbWUsIHZhbCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdTRVRfT1BUSU9OJyxcbiAgICAgICAgICAgIG9wdGlvbk5hbWU6IG5hbWUsXG4gICAgICAgICAgICByYXdPcHRpb25WYWx1ZTogdmFsLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5nZXRPcHRpb24gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0YU1hbmFnZXIuY3VycmVudENhbGVuZGFyT3B0aW9uc0lucHV0W25hbWVdO1xuICAgIH07XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmdldEF2YWlsYWJsZUxvY2FsZUNvZGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5nZXRDdXJyZW50RGF0YSgpLmF2YWlsYWJsZVJhd0xvY2FsZXMpO1xuICAgIH07XG4gICAgLy8gVHJpZ2dlclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGhhbmRsZXJOYW1lLCBoYW5kbGVyKSB7XG4gICAgICAgIHZhciBjdXJyZW50RGF0YU1hbmFnZXIgPSB0aGlzLmN1cnJlbnREYXRhTWFuYWdlcjtcbiAgICAgICAgaWYgKGN1cnJlbnREYXRhTWFuYWdlci5jdXJyZW50Q2FsZW5kYXJPcHRpb25zUmVmaW5lcnNbaGFuZGxlck5hbWVdKSB7XG4gICAgICAgICAgICBjdXJyZW50RGF0YU1hbmFnZXIuZW1pdHRlci5vbihoYW5kbGVyTmFtZSwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJVbmtub3duIGxpc3RlbmVyIG5hbWUgJ1wiICsgaGFuZGxlck5hbWUgKyBcIidcIik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbiAoaGFuZGxlck5hbWUsIGhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50RGF0YU1hbmFnZXIuZW1pdHRlci5vZmYoaGFuZGxlck5hbWUsIGhhbmRsZXIpO1xuICAgIH07XG4gICAgLy8gbm90IG1lYW50IGZvciBwdWJsaWMgdXNlXG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLnRyaWdnZXIgPSBmdW5jdGlvbiAoaGFuZGxlck5hbWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICAoX2EgPSB0aGlzLmN1cnJlbnREYXRhTWFuYWdlci5lbWl0dGVyKS50cmlnZ2VyLmFwcGx5KF9hLCB0c2xpYi5fX3NwcmVhZEFycmF5KFtoYW5kbGVyTmFtZV0sIGFyZ3MpKTtcbiAgICB9O1xuICAgIC8vIFZpZXdcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5jaGFuZ2VWaWV3ID0gZnVuY3Rpb24gKHZpZXdUeXBlLCBkYXRlT3JSYW5nZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmJhdGNoUmVuZGVyaW5nKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLnVuc2VsZWN0KCk7XG4gICAgICAgICAgICBpZiAoZGF0ZU9yUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0ZU9yUmFuZ2Uuc3RhcnQgJiYgZGF0ZU9yUmFuZ2UuZW5kKSB7IC8vIGEgcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NIQU5HRV9WSUVXX1RZUEUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld1R5cGU6IHZpZXdUeXBlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1NFVF9PUFRJT04nLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTmFtZTogJ3Zpc2libGVSYW5nZScsXG4gICAgICAgICAgICAgICAgICAgICAgICByYXdPcHRpb25WYWx1ZTogZGF0ZU9yUmFuZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVFbnYgPSBfdGhpcy5nZXRDdXJyZW50RGF0YSgpLmRhdGVFbnY7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfVklFV19UWVBFJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdUeXBlOiB2aWV3VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVNYXJrZXI6IGRhdGVFbnYuY3JlYXRlTWFya2VyKGRhdGVPclJhbmdlKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQ0hBTkdFX1ZJRVdfVFlQRScsXG4gICAgICAgICAgICAgICAgICAgIHZpZXdUeXBlOiB2aWV3VHlwZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBGb3JjZXMgbmF2aWdhdGlvbiB0byBhIHZpZXcgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICAgIC8vIGB2aWV3VHlwZWAgY2FuIGJlIGEgc3BlY2lmaWMgdmlldyBuYW1lIG9yIGEgZ2VuZXJpYyBvbmUgbGlrZSBcIndlZWtcIiBvciBcImRheVwiLlxuICAgIC8vIG5lZWRzIHRvIGNoYW5nZVxuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS56b29tVG8gPSBmdW5jdGlvbiAoZGF0ZU1hcmtlciwgdmlld1R5cGUpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICB2YXIgc3BlYztcbiAgICAgICAgdmlld1R5cGUgPSB2aWV3VHlwZSB8fCAnZGF5JzsgLy8gZGF5IGlzIGRlZmF1bHQgem9vbVxuICAgICAgICBzcGVjID0gc3RhdGUudmlld1NwZWNzW3ZpZXdUeXBlXSB8fCB0aGlzLmdldFVuaXRWaWV3U3BlYyh2aWV3VHlwZSk7XG4gICAgICAgIHRoaXMudW5zZWxlY3QoKTtcbiAgICAgICAgaWYgKHNwZWMpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfVklFV19UWVBFJyxcbiAgICAgICAgICAgICAgICB2aWV3VHlwZTogc3BlYy50eXBlLFxuICAgICAgICAgICAgICAgIGRhdGVNYXJrZXI6IGRhdGVNYXJrZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfREFURScsXG4gICAgICAgICAgICAgICAgZGF0ZU1hcmtlcjogZGF0ZU1hcmtlcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBHaXZlbiBhIGR1cmF0aW9uIHNpbmd1bGFyIHVuaXQsIGxpa2UgXCJ3ZWVrXCIgb3IgXCJkYXlcIiwgZmluZHMgYSBtYXRjaGluZyB2aWV3IHNwZWMuXG4gICAgLy8gUHJlZmVyZW5jZSBpcyBnaXZlbiB0byB2aWV3cyB0aGF0IGhhdmUgY29ycmVzcG9uZGluZyBidXR0b25zLlxuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5nZXRVbml0Vmlld1NwZWMgPSBmdW5jdGlvbiAodW5pdCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmdldEN1cnJlbnREYXRhKCksIHZpZXdTcGVjcyA9IF9hLnZpZXdTcGVjcywgdG9vbGJhckNvbmZpZyA9IF9hLnRvb2xiYXJDb25maWc7XG4gICAgICAgIHZhciB2aWV3VHlwZXMgPSBbXS5jb25jYXQodG9vbGJhckNvbmZpZy5oZWFkZXIgPyB0b29sYmFyQ29uZmlnLmhlYWRlci52aWV3c1dpdGhCdXR0b25zIDogW10sIHRvb2xiYXJDb25maWcuZm9vdGVyID8gdG9vbGJhckNvbmZpZy5mb290ZXIudmlld3NXaXRoQnV0dG9ucyA6IFtdKTtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIHZhciBzcGVjO1xuICAgICAgICBmb3IgKHZhciB2aWV3VHlwZSBpbiB2aWV3U3BlY3MpIHtcbiAgICAgICAgICAgIHZpZXdUeXBlcy5wdXNoKHZpZXdUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmlld1R5cGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBzcGVjID0gdmlld1NwZWNzW3ZpZXdUeXBlc1tpXV07XG4gICAgICAgICAgICBpZiAoc3BlYykge1xuICAgICAgICAgICAgICAgIGlmIChzcGVjLnNpbmdsZVVuaXQgPT09IHVuaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwZWM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgLy8gQ3VycmVudCBEYXRlXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUucHJldiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdCgpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ1BSRVYnIH0pO1xuICAgIH07XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudW5zZWxlY3QoKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdORVhUJyB9KTtcbiAgICB9O1xuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5wcmV2WWVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICB0aGlzLnVuc2VsZWN0KCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ0NIQU5HRV9EQVRFJyxcbiAgICAgICAgICAgIGRhdGVNYXJrZXI6IHN0YXRlLmRhdGVFbnYuYWRkWWVhcnMoc3RhdGUuY3VycmVudERhdGUsIC0xKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUubmV4dFllYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgdGhpcy51bnNlbGVjdCgpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfREFURScsXG4gICAgICAgICAgICBkYXRlTWFya2VyOiBzdGF0ZS5kYXRlRW52LmFkZFllYXJzKHN0YXRlLmN1cnJlbnREYXRlLCAxKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUudG9kYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgdGhpcy51bnNlbGVjdCgpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfREFURScsXG4gICAgICAgICAgICBkYXRlTWFya2VyOiBnZXROb3coc3RhdGUuY2FsZW5kYXJPcHRpb25zLm5vdywgc3RhdGUuZGF0ZUVudiksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmdvdG9EYXRlID0gZnVuY3Rpb24gKHpvbmVkRGF0ZUlucHV0KSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgdGhpcy51bnNlbGVjdCgpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfREFURScsXG4gICAgICAgICAgICBkYXRlTWFya2VyOiBzdGF0ZS5kYXRlRW52LmNyZWF0ZU1hcmtlcih6b25lZERhdGVJbnB1dCksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmluY3JlbWVudERhdGUgPSBmdW5jdGlvbiAoZGVsdGFJbnB1dCkge1xuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIHZhciBkZWx0YSA9IGNyZWF0ZUR1cmF0aW9uKGRlbHRhSW5wdXQpO1xuICAgICAgICBpZiAoZGVsdGEpIHsgLy8gZWxzZSwgd2FybiBhYm91dCBpbnZhbGlkIGlucHV0P1xuICAgICAgICAgICAgdGhpcy51bnNlbGVjdCgpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0NIQU5HRV9EQVRFJyxcbiAgICAgICAgICAgICAgICBkYXRlTWFya2VyOiBzdGF0ZS5kYXRlRW52LmFkZChzdGF0ZS5jdXJyZW50RGF0ZSwgZGVsdGEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIGZvciBleHRlcm5hbCBBUElcbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUuZ2V0RGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICByZXR1cm4gc3RhdGUuZGF0ZUVudi50b0RhdGUoc3RhdGUuY3VycmVudERhdGUpO1xuICAgIH07XG4gICAgLy8gRGF0ZSBGb3JtYXR0aW5nIFV0aWxzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUuZm9ybWF0RGF0ZSA9IGZ1bmN0aW9uIChkLCBmb3JtYXR0ZXIpIHtcbiAgICAgICAgdmFyIGRhdGVFbnYgPSB0aGlzLmdldEN1cnJlbnREYXRhKCkuZGF0ZUVudjtcbiAgICAgICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0KGRhdGVFbnYuY3JlYXRlTWFya2VyKGQpLCBjcmVhdGVGb3JtYXR0ZXIoZm9ybWF0dGVyKSk7XG4gICAgfTtcbiAgICAvLyBgc2V0dGluZ3NgIGlzIGZvciBmb3JtYXR0ZXIgQU5EIGlzRW5kRXhjbHVzaXZlXG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmZvcm1hdFJhbmdlID0gZnVuY3Rpb24gKGQwLCBkMSwgc2V0dGluZ3MpIHtcbiAgICAgICAgdmFyIGRhdGVFbnYgPSB0aGlzLmdldEN1cnJlbnREYXRhKCkuZGF0ZUVudjtcbiAgICAgICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0UmFuZ2UoZGF0ZUVudi5jcmVhdGVNYXJrZXIoZDApLCBkYXRlRW52LmNyZWF0ZU1hcmtlcihkMSksIGNyZWF0ZUZvcm1hdHRlcihzZXR0aW5ncyksIHNldHRpbmdzKTtcbiAgICB9O1xuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5mb3JtYXRJc28gPSBmdW5jdGlvbiAoZCwgb21pdFRpbWUpIHtcbiAgICAgICAgdmFyIGRhdGVFbnYgPSB0aGlzLmdldEN1cnJlbnREYXRhKCkuZGF0ZUVudjtcbiAgICAgICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0SXNvKGRhdGVFbnYuY3JlYXRlTWFya2VyKGQpLCB7IG9taXRUaW1lOiBvbWl0VGltZSB9KTtcbiAgICB9O1xuICAgIC8vIERhdGUgU2VsZWN0aW9uIC8gRXZlbnQgU2VsZWN0aW9uIC8gRGF5Q2xpY2tcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIHRoaXMgcHVibGljIG1ldGhvZCByZWNlaXZlcyBzdGFydC9lbmQgZGF0ZXMgaW4gYW55IGZvcm1hdCwgd2l0aCBhbnkgdGltZXpvbmVcbiAgICAvLyBOT1RFOiBhcmdzIHdlcmUgY2hhbmdlZCBmcm9tIHYzXG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uIChkYXRlT3JPYmosIGVuZERhdGUpIHtcbiAgICAgICAgdmFyIHNlbGVjdGlvbklucHV0O1xuICAgICAgICBpZiAoZW5kRGF0ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZGF0ZU9yT2JqLnN0YXJ0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25JbnB1dCA9IGRhdGVPck9iajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbklucHV0ID0ge1xuICAgICAgICAgICAgICAgICAgICBzdGFydDogZGF0ZU9yT2JqLFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbklucHV0ID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBkYXRlT3JPYmosXG4gICAgICAgICAgICAgICAgZW5kOiBlbmREYXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIHZhciBzZWxlY3Rpb24gPSBwYXJzZURhdGVTcGFuKHNlbGVjdGlvbklucHV0LCBzdGF0ZS5kYXRlRW52LCBjcmVhdGVEdXJhdGlvbih7IGRheXM6IDEgfSkpO1xuICAgICAgICBpZiAoc2VsZWN0aW9uKSB7IC8vIHRocm93IHBhcnNlIGVycm9yIG90aGVyd2lzZT9cbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnU0VMRUNUX0RBVEVTJywgc2VsZWN0aW9uOiBzZWxlY3Rpb24gfSk7XG4gICAgICAgICAgICB0cmlnZ2VyRGF0ZVNlbGVjdChzZWxlY3Rpb24sIG51bGwsIHN0YXRlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gcHVibGljIG1ldGhvZFxuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS51bnNlbGVjdCA9IGZ1bmN0aW9uIChwZXYpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICBpZiAoc3RhdGUuZGF0ZVNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFTEVDVF9EQVRFUycgfSk7XG4gICAgICAgICAgICB0cmlnZ2VyRGF0ZVVuc2VsZWN0KHBldiwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBQdWJsaWMgRXZlbnRzIEFQSVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmFkZEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50SW5wdXQsIHNvdXJjZUlucHV0KSB7XG4gICAgICAgIGlmIChldmVudElucHV0IGluc3RhbmNlb2YgRXZlbnRBcGkpIHtcbiAgICAgICAgICAgIHZhciBkZWYgPSBldmVudElucHV0Ll9kZWY7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBldmVudElucHV0Ll9pbnN0YW5jZTtcbiAgICAgICAgICAgIHZhciBjdXJyZW50RGF0YSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgICAgIC8vIG5vdCBhbHJlYWR5IHByZXNlbnQ/IGRvbid0IHdhbnQgdG8gYWRkIGFuIG9sZCBzbmFwc2hvdFxuICAgICAgICAgICAgaWYgKCFjdXJyZW50RGF0YS5ldmVudFN0b3JlLmRlZnNbZGVmLmRlZklkXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQUREX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IGV2ZW50VHVwbGVUb1N0b3JlKHsgZGVmOiBkZWYsIGluc3RhbmNlOiBpbnN0YW5jZSB9KSwgLy8gVE9ETzogYmV0dGVyIHV0aWwgZm9yIHR3byBhcmdzP1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50QWRkKGV2ZW50SW5wdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV2ZW50SW5wdXQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICB2YXIgZXZlbnRTb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2VJbnB1dCBpbnN0YW5jZW9mIEV2ZW50U291cmNlQXBpKSB7XG4gICAgICAgICAgICBldmVudFNvdXJjZSA9IHNvdXJjZUlucHV0LmludGVybmFsRXZlbnRTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHNvdXJjZUlucHV0ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGlmIChzb3VyY2VJbnB1dCkgeyAvLyB0cnVlLiBwYXJ0IG9mIHRoZSBmaXJzdCBldmVudCBzb3VyY2VcbiAgICAgICAgICAgICAgICBldmVudFNvdXJjZSA9IGhhc2hWYWx1ZXNUb0FycmF5KHN0YXRlLmV2ZW50U291cmNlcylbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc291cmNlSW5wdXQgIT0gbnVsbCkgeyAvLyBhbiBJRC4gYWNjZXB0cyBhIG51bWJlciB0b29cbiAgICAgICAgICAgIHZhciBzb3VyY2VBcGkgPSB0aGlzLmdldEV2ZW50U291cmNlQnlJZChzb3VyY2VJbnB1dCk7IC8vIFRPRE86IHVzZSBhbiBpbnRlcm5hbCBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKCFzb3VyY2VBcGkpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgZmluZCBhbiBldmVudCBzb3VyY2Ugd2l0aCBJRCBcXFwiXCIgKyBzb3VyY2VJbnB1dCArIFwiXFxcIlwiKTsgLy8gVE9ETzogdGVzdFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXZlbnRTb3VyY2UgPSBzb3VyY2VBcGkuaW50ZXJuYWxFdmVudFNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHVwbGUgPSBwYXJzZUV2ZW50KGV2ZW50SW5wdXQsIGV2ZW50U291cmNlLCBzdGF0ZSwgZmFsc2UpO1xuICAgICAgICBpZiAodHVwbGUpIHtcbiAgICAgICAgICAgIHZhciBuZXdFdmVudEFwaSA9IG5ldyBFdmVudEFwaShzdGF0ZSwgdHVwbGUuZGVmLCB0dXBsZS5kZWYucmVjdXJyaW5nRGVmID8gbnVsbCA6IHR1cGxlLmluc3RhbmNlKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdBRERfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICBldmVudFN0b3JlOiBldmVudFR1cGxlVG9TdG9yZSh0dXBsZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50QWRkKG5ld0V2ZW50QXBpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdFdmVudEFwaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS50cmlnZ2VyRXZlbnRBZGQgPSBmdW5jdGlvbiAoZXZlbnRBcGkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGVtaXR0ZXIgPSB0aGlzLmdldEN1cnJlbnREYXRhKCkuZW1pdHRlcjtcbiAgICAgICAgZW1pdHRlci50cmlnZ2VyKCdldmVudEFkZCcsIHtcbiAgICAgICAgICAgIGV2ZW50OiBldmVudEFwaSxcbiAgICAgICAgICAgIHJlbGF0ZWRFdmVudHM6IFtdLFxuICAgICAgICAgICAgcmV2ZXJ0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUkVNT1ZFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IGV2ZW50QXBpVG9TdG9yZShldmVudEFwaSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8vIFRPRE86IG9wdGltaXplXG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmdldEV2ZW50QnlJZCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIHZhciBfYSA9IHN0YXRlLmV2ZW50U3RvcmUsIGRlZnMgPSBfYS5kZWZzLCBpbnN0YW5jZXMgPSBfYS5pbnN0YW5jZXM7XG4gICAgICAgIGlkID0gU3RyaW5nKGlkKTtcbiAgICAgICAgZm9yICh2YXIgZGVmSWQgaW4gZGVmcykge1xuICAgICAgICAgICAgdmFyIGRlZiA9IGRlZnNbZGVmSWRdO1xuICAgICAgICAgICAgaWYgKGRlZi5wdWJsaWNJZCA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVmLnJlY3VycmluZ0RlZikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV2ZW50QXBpKHN0YXRlLCBkZWYsIG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpbnN0YW5jZUlkIGluIGluc3RhbmNlcykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBpbnN0YW5jZXNbaW5zdGFuY2VJZF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5kZWZJZCA9PT0gZGVmLmRlZklkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV2ZW50QXBpKHN0YXRlLCBkZWYsIGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5nZXRFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjdXJyZW50RGF0YSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkRXZlbnRBcGlzKGN1cnJlbnREYXRhLmV2ZW50U3RvcmUsIGN1cnJlbnREYXRhKTtcbiAgICB9O1xuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5yZW1vdmVBbGxFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnUkVNT1ZFX0FMTF9FVkVOVFMnIH0pO1xuICAgIH07XG4gICAgLy8gUHVibGljIEV2ZW50IFNvdXJjZXMgQVBJXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBDYWxlbmRhckFwaS5wcm90b3R5cGUuZ2V0RXZlbnRTb3VyY2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIHZhciBzb3VyY2VIYXNoID0gc3RhdGUuZXZlbnRTb3VyY2VzO1xuICAgICAgICB2YXIgc291cmNlQXBpcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpbnRlcm5hbElkIGluIHNvdXJjZUhhc2gpIHtcbiAgICAgICAgICAgIHNvdXJjZUFwaXMucHVzaChuZXcgRXZlbnRTb3VyY2VBcGkoc3RhdGUsIHNvdXJjZUhhc2hbaW50ZXJuYWxJZF0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlQXBpcztcbiAgICB9O1xuICAgIENhbGVuZGFyQXBpLnByb3RvdHlwZS5nZXRFdmVudFNvdXJjZUJ5SWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICB2YXIgc291cmNlSGFzaCA9IHN0YXRlLmV2ZW50U291cmNlcztcbiAgICAgICAgaWQgPSBTdHJpbmcoaWQpO1xuICAgICAgICBmb3IgKHZhciBzb3VyY2VJZCBpbiBzb3VyY2VIYXNoKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlSGFzaFtzb3VyY2VJZF0ucHVibGljSWQgPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFdmVudFNvdXJjZUFwaShzdGF0ZSwgc291cmNlSGFzaFtzb3VyY2VJZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLmFkZEV2ZW50U291cmNlID0gZnVuY3Rpb24gKHNvdXJjZUlucHV0KSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgaWYgKHNvdXJjZUlucHV0IGluc3RhbmNlb2YgRXZlbnRTb3VyY2VBcGkpIHtcbiAgICAgICAgICAgIC8vIG5vdCBhbHJlYWR5IHByZXNlbnQ/IGRvbid0IHdhbnQgdG8gYWRkIGFuIG9sZCBzbmFwc2hvdFxuICAgICAgICAgICAgaWYgKCFzdGF0ZS5ldmVudFNvdXJjZXNbc291cmNlSW5wdXQuaW50ZXJuYWxFdmVudFNvdXJjZS5zb3VyY2VJZF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0FERF9FVkVOVF9TT1VSQ0VTJyxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlczogW3NvdXJjZUlucHV0LmludGVybmFsRXZlbnRTb3VyY2VdLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZUlucHV0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBldmVudFNvdXJjZSA9IHBhcnNlRXZlbnRTb3VyY2Uoc291cmNlSW5wdXQsIHN0YXRlKTtcbiAgICAgICAgaWYgKGV2ZW50U291cmNlKSB7IC8vIFRPRE86IGVycm9yIG90aGVyd2lzZT9cbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnQUREX0VWRU5UX1NPVVJDRVMnLCBzb3VyY2VzOiBbZXZlbnRTb3VyY2VdIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFdmVudFNvdXJjZUFwaShzdGF0ZSwgZXZlbnRTb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLnJlbW92ZUFsbEV2ZW50U291cmNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdSRU1PVkVfQUxMX0VWRU5UX1NPVVJDRVMnIH0pO1xuICAgIH07XG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLnJlZmV0Y2hFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnRkVUQ0hfRVZFTlRfU09VUkNFUycsIGlzUmVmZXRjaDogdHJ1ZSB9KTtcbiAgICB9O1xuICAgIC8vIFNjcm9sbFxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgQ2FsZW5kYXJBcGkucHJvdG90eXBlLnNjcm9sbFRvVGltZSA9IGZ1bmN0aW9uICh0aW1lSW5wdXQpIHtcbiAgICAgICAgdmFyIHRpbWUgPSBjcmVhdGVEdXJhdGlvbih0aW1lSW5wdXQpO1xuICAgICAgICBpZiAodGltZSkge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdfc2Nyb2xsUmVxdWVzdCcsIHsgdGltZTogdGltZSB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIENhbGVuZGFyQXBpO1xufSgpKTtcblxudmFyIEV2ZW50QXBpID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIGluc3RhbmNlIHdpbGwgYmUgbnVsbCBpZiBleHByZXNzaW5nIGEgcmVjdXJyaW5nIGV2ZW50IHRoYXQgaGFzIG5vIGN1cnJlbnQgaW5zdGFuY2VzLFxuICAgIC8vIE9SIGlmIHRyeWluZyB0byB2YWxpZGF0ZSBhbiBpbmNvbWluZyBleHRlcm5hbCBldmVudCB0aGF0IGhhcyBubyBkYXRlcyBhc3NpZ25lZFxuICAgIGZ1bmN0aW9uIEV2ZW50QXBpKGNvbnRleHQsIGRlZiwgaW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuX2RlZiA9IGRlZjtcbiAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBpbnN0YW5jZSB8fCBudWxsO1xuICAgIH1cbiAgICAvKlxuICAgIFRPRE86IG1ha2UgZXZlbnQgc3RydWN0IG1vcmUgcmVzcG9uc2libGUgZm9yIHRoaXNcbiAgICAqL1xuICAgIEV2ZW50QXBpLnByb3RvdHlwZS5zZXRQcm9wID0gZnVuY3Rpb24gKG5hbWUsIHZhbCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBpZiAobmFtZSBpbiBFVkVOVF9EQVRFX1JFRklORVJTKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBzZXQgZGF0ZS1yZWxhdGVkIHByb3AgXFwnbmFtZVxcJy4gVXNlIG9uZSBvZiB0aGUgZGF0ZS1yZWxhdGVkIG1ldGhvZHMgaW5zdGVhZC4nKTtcbiAgICAgICAgICAgIC8vIFRPRE86IG1ha2UgcHJvcGVyIGFsaWFzaW5nIHN5c3RlbT9cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lID09PSAnaWQnKSB7XG4gICAgICAgICAgICB2YWwgPSBFVkVOVF9OT05fREFURV9SRUZJTkVSU1tuYW1lXSh2YWwpO1xuICAgICAgICAgICAgdGhpcy5tdXRhdGUoe1xuICAgICAgICAgICAgICAgIHN0YW5kYXJkUHJvcHM6IHsgcHVibGljSWQ6IHZhbCB9LCAvLyBoYXJkY29kZWQgaW50ZXJuYWwgbmFtZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZSBpbiBFVkVOVF9OT05fREFURV9SRUZJTkVSUykge1xuICAgICAgICAgICAgdmFsID0gRVZFTlRfTk9OX0RBVEVfUkVGSU5FUlNbbmFtZV0odmFsKTtcbiAgICAgICAgICAgIHRoaXMubXV0YXRlKHtcbiAgICAgICAgICAgICAgICBzdGFuZGFyZFByb3BzOiAoX2EgPSB7fSwgX2FbbmFtZV0gPSB2YWwsIF9hKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWUgaW4gRVZFTlRfVUlfUkVGSU5FUlMpIHtcbiAgICAgICAgICAgIHZhciB1aSA9IEVWRU5UX1VJX1JFRklORVJTW25hbWVdKHZhbCk7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgICAgIHVpID0geyBiYWNrZ3JvdW5kQ29sb3I6IHZhbCwgYm9yZGVyQ29sb3I6IHZhbCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmFtZSA9PT0gJ2VkaXRhYmxlJykge1xuICAgICAgICAgICAgICAgIHVpID0geyBzdGFydEVkaXRhYmxlOiB2YWwsIGR1cmF0aW9uRWRpdGFibGU6IHZhbCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdWkgPSAoX2IgPSB7fSwgX2JbbmFtZV0gPSB2YWwsIF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubXV0YXRlKHtcbiAgICAgICAgICAgICAgICBzdGFuZGFyZFByb3BzOiB7IHVpOiB1aSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3Qgc2V0IHByb3AgJ1wiICsgbmFtZSArIFwiJy4gVXNlIHNldEV4dGVuZGVkUHJvcCBpbnN0ZWFkLlwiKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRXZlbnRBcGkucHJvdG90eXBlLnNldEV4dGVuZGVkUHJvcCA9IGZ1bmN0aW9uIChuYW1lLCB2YWwpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLm11dGF0ZSh7XG4gICAgICAgICAgICBleHRlbmRlZFByb3BzOiAoX2EgPSB7fSwgX2FbbmFtZV0gPSB2YWwsIF9hKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBFdmVudEFwaS5wcm90b3R5cGUuc2V0U3RhcnQgPSBmdW5jdGlvbiAoc3RhcnRJbnB1dCwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB2YXIgZGF0ZUVudiA9IHRoaXMuX2NvbnRleHQuZGF0ZUVudjtcbiAgICAgICAgdmFyIHN0YXJ0ID0gZGF0ZUVudi5jcmVhdGVNYXJrZXIoc3RhcnRJbnB1dCk7XG4gICAgICAgIGlmIChzdGFydCAmJiB0aGlzLl9pbnN0YW5jZSkgeyAvLyBUT0RPOiB3YXJuaW5nIGlmIHBhcnNlZCBiYWRcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZVJhbmdlID0gdGhpcy5faW5zdGFuY2UucmFuZ2U7XG4gICAgICAgICAgICB2YXIgc3RhcnREZWx0YSA9IGRpZmZEYXRlcyhpbnN0YW5jZVJhbmdlLnN0YXJ0LCBzdGFydCwgZGF0ZUVudiwgb3B0aW9ucy5ncmFudWxhcml0eSk7IC8vIHdoYXQgaWYgcGFyc2VkIGJhZCE/XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5tYWludGFpbkR1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBkYXRlc0RlbHRhOiBzdGFydERlbHRhIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBzdGFydERlbHRhOiBzdGFydERlbHRhIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBFdmVudEFwaS5wcm90b3R5cGUuc2V0RW5kID0gZnVuY3Rpb24gKGVuZElucHV0LCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHZhciBkYXRlRW52ID0gdGhpcy5fY29udGV4dC5kYXRlRW52O1xuICAgICAgICB2YXIgZW5kO1xuICAgICAgICBpZiAoZW5kSW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgZW5kID0gZGF0ZUVudi5jcmVhdGVNYXJrZXIoZW5kSW5wdXQpO1xuICAgICAgICAgICAgaWYgKCFlbmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47IC8vIFRPRE86IHdhcm5pbmcgaWYgcGFyc2VkIGJhZFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICAgICAgaWYgKGVuZCkge1xuICAgICAgICAgICAgICAgIHZhciBlbmREZWx0YSA9IGRpZmZEYXRlcyh0aGlzLl9pbnN0YW5jZS5yYW5nZS5lbmQsIGVuZCwgZGF0ZUVudiwgb3B0aW9ucy5ncmFudWxhcml0eSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBlbmREZWx0YTogZW5kRGVsdGEgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm11dGF0ZSh7IHN0YW5kYXJkUHJvcHM6IHsgaGFzRW5kOiBmYWxzZSB9IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBFdmVudEFwaS5wcm90b3R5cGUuc2V0RGF0ZXMgPSBmdW5jdGlvbiAoc3RhcnRJbnB1dCwgZW5kSW5wdXQsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIGRhdGVFbnYgPSB0aGlzLl9jb250ZXh0LmRhdGVFbnY7XG4gICAgICAgIHZhciBzdGFuZGFyZFByb3BzID0geyBhbGxEYXk6IG9wdGlvbnMuYWxsRGF5IH07XG4gICAgICAgIHZhciBzdGFydCA9IGRhdGVFbnYuY3JlYXRlTWFya2VyKHN0YXJ0SW5wdXQpO1xuICAgICAgICB2YXIgZW5kO1xuICAgICAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIFRPRE86IHdhcm5pbmcgaWYgcGFyc2VkIGJhZFxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmRJbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBlbmQgPSBkYXRlRW52LmNyZWF0ZU1hcmtlcihlbmRJbnB1dCk7XG4gICAgICAgICAgICBpZiAoIWVuZCkgeyAvLyBUT0RPOiB3YXJuaW5nIGlmIHBhcnNlZCBiYWRcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2VSYW5nZSA9IHRoaXMuX2luc3RhbmNlLnJhbmdlO1xuICAgICAgICAgICAgLy8gd2hlbiBjb21wdXRpbmcgdGhlIGRpZmYgZm9yIGFuIGV2ZW50IGJlaW5nIGNvbnZlcnRlZCB0byBhbGwtZGF5LFxuICAgICAgICAgICAgLy8gY29tcHV0ZSBkaWZmIG9mZiBvZiB0aGUgYWxsLWRheSB2YWx1ZXMgdGhlIHdheSBldmVudC1tdXRhdGlvbiBkb2VzLlxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWxsRGF5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VSYW5nZSA9IGNvbXB1dGVBbGlnbmVkRGF5UmFuZ2UoaW5zdGFuY2VSYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3RhcnREZWx0YSA9IGRpZmZEYXRlcyhpbnN0YW5jZVJhbmdlLnN0YXJ0LCBzdGFydCwgZGF0ZUVudiwgb3B0aW9ucy5ncmFudWxhcml0eSk7XG4gICAgICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVuZERlbHRhID0gZGlmZkRhdGVzKGluc3RhbmNlUmFuZ2UuZW5kLCBlbmQsIGRhdGVFbnYsIG9wdGlvbnMuZ3JhbnVsYXJpdHkpO1xuICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvbnNFcXVhbChzdGFydERlbHRhLCBlbmREZWx0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBkYXRlc0RlbHRhOiBzdGFydERlbHRhLCBzdGFuZGFyZFByb3BzOiBzdGFuZGFyZFByb3BzIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBzdGFydERlbHRhOiBzdGFydERlbHRhLCBlbmREZWx0YTogZW5kRGVsdGEsIHN0YW5kYXJkUHJvcHM6IHN0YW5kYXJkUHJvcHMgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIG1lYW5zIFwiY2xlYXIgdGhlIGVuZFwiXG4gICAgICAgICAgICAgICAgc3RhbmRhcmRQcm9wcy5oYXNFbmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLm11dGF0ZSh7IGRhdGVzRGVsdGE6IHN0YXJ0RGVsdGEsIHN0YW5kYXJkUHJvcHM6IHN0YW5kYXJkUHJvcHMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEV2ZW50QXBpLnByb3RvdHlwZS5tb3ZlU3RhcnQgPSBmdW5jdGlvbiAoZGVsdGFJbnB1dCkge1xuICAgICAgICB2YXIgZGVsdGEgPSBjcmVhdGVEdXJhdGlvbihkZWx0YUlucHV0KTtcbiAgICAgICAgaWYgKGRlbHRhKSB7IC8vIFRPRE86IHdhcm5pbmcgaWYgcGFyc2VkIGJhZFxuICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBzdGFydERlbHRhOiBkZWx0YSB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRXZlbnRBcGkucHJvdG90eXBlLm1vdmVFbmQgPSBmdW5jdGlvbiAoZGVsdGFJbnB1dCkge1xuICAgICAgICB2YXIgZGVsdGEgPSBjcmVhdGVEdXJhdGlvbihkZWx0YUlucHV0KTtcbiAgICAgICAgaWYgKGRlbHRhKSB7IC8vIFRPRE86IHdhcm5pbmcgaWYgcGFyc2VkIGJhZFxuICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBlbmREZWx0YTogZGVsdGEgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEV2ZW50QXBpLnByb3RvdHlwZS5tb3ZlRGF0ZXMgPSBmdW5jdGlvbiAoZGVsdGFJbnB1dCkge1xuICAgICAgICB2YXIgZGVsdGEgPSBjcmVhdGVEdXJhdGlvbihkZWx0YUlucHV0KTtcbiAgICAgICAgaWYgKGRlbHRhKSB7IC8vIFRPRE86IHdhcm5pbmcgaWYgcGFyc2VkIGJhZFxuICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBkYXRlc0RlbHRhOiBkZWx0YSB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRXZlbnRBcGkucHJvdG90eXBlLnNldEFsbERheSA9IGZ1bmN0aW9uIChhbGxEYXksIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIHN0YW5kYXJkUHJvcHMgPSB7IGFsbERheTogYWxsRGF5IH07XG4gICAgICAgIHZhciBtYWludGFpbkR1cmF0aW9uID0gb3B0aW9ucy5tYWludGFpbkR1cmF0aW9uO1xuICAgICAgICBpZiAobWFpbnRhaW5EdXJhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICBtYWludGFpbkR1cmF0aW9uID0gdGhpcy5fY29udGV4dC5vcHRpb25zLmFsbERheU1haW50YWluRHVyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RlZi5hbGxEYXkgIT09IGFsbERheSkge1xuICAgICAgICAgICAgc3RhbmRhcmRQcm9wcy5oYXNFbmQgPSBtYWludGFpbkR1cmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubXV0YXRlKHsgc3RhbmRhcmRQcm9wczogc3RhbmRhcmRQcm9wcyB9KTtcbiAgICB9O1xuICAgIEV2ZW50QXBpLnByb3RvdHlwZS5mb3JtYXRSYW5nZSA9IGZ1bmN0aW9uIChmb3JtYXRJbnB1dCkge1xuICAgICAgICB2YXIgZGF0ZUVudiA9IHRoaXMuX2NvbnRleHQuZGF0ZUVudjtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5faW5zdGFuY2U7XG4gICAgICAgIHZhciBmb3JtYXR0ZXIgPSBjcmVhdGVGb3JtYXR0ZXIoZm9ybWF0SW5wdXQpO1xuICAgICAgICBpZiAodGhpcy5fZGVmLmhhc0VuZCkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0UmFuZ2UoaW5zdGFuY2UucmFuZ2Uuc3RhcnQsIGluc3RhbmNlLnJhbmdlLmVuZCwgZm9ybWF0dGVyLCB7XG4gICAgICAgICAgICAgICAgZm9yY2VkU3RhcnRUem86IGluc3RhbmNlLmZvcmNlZFN0YXJ0VHpvLFxuICAgICAgICAgICAgICAgIGZvcmNlZEVuZFR6bzogaW5zdGFuY2UuZm9yY2VkRW5kVHpvLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0KGluc3RhbmNlLnJhbmdlLnN0YXJ0LCBmb3JtYXR0ZXIsIHtcbiAgICAgICAgICAgIGZvcmNlZFR6bzogaW5zdGFuY2UuZm9yY2VkU3RhcnRUem8sXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRXZlbnRBcGkucHJvdG90eXBlLm11dGF0ZSA9IGZ1bmN0aW9uIChtdXRhdGlvbikge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLl9pbnN0YW5jZTtcbiAgICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgICAgICB2YXIgZGVmID0gdGhpcy5fZGVmO1xuICAgICAgICAgICAgdmFyIGNvbnRleHRfMSA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICAgICAgICB2YXIgZXZlbnRTdG9yZV8xID0gY29udGV4dF8xLmdldEN1cnJlbnREYXRhKCkuZXZlbnRTdG9yZTtcbiAgICAgICAgICAgIHZhciByZWxldmFudEV2ZW50cyA9IGdldFJlbGV2YW50RXZlbnRzKGV2ZW50U3RvcmVfMSwgaW5zdGFuY2UuaW5zdGFuY2VJZCk7XG4gICAgICAgICAgICB2YXIgZXZlbnRDb25maWdCYXNlID0ge1xuICAgICAgICAgICAgICAgICcnOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICcnLFxuICAgICAgICAgICAgICAgICAgICBzdGFydEVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbkVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50czogW10sXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93czogW10sXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJycsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgdGV4dENvbG9yOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lczogW10sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWxldmFudEV2ZW50cyA9IGFwcGx5TXV0YXRpb25Ub0V2ZW50U3RvcmUocmVsZXZhbnRFdmVudHMsIGV2ZW50Q29uZmlnQmFzZSwgbXV0YXRpb24sIGNvbnRleHRfMSk7XG4gICAgICAgICAgICB2YXIgb2xkRXZlbnQgPSBuZXcgRXZlbnRBcGkoY29udGV4dF8xLCBkZWYsIGluc3RhbmNlKTsgLy8gc25hcHNob3RcbiAgICAgICAgICAgIHRoaXMuX2RlZiA9IHJlbGV2YW50RXZlbnRzLmRlZnNbZGVmLmRlZklkXTtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gcmVsZXZhbnRFdmVudHMuaW5zdGFuY2VzW2luc3RhbmNlLmluc3RhbmNlSWRdO1xuICAgICAgICAgICAgY29udGV4dF8xLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnTUVSR0VfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICBldmVudFN0b3JlOiByZWxldmFudEV2ZW50cyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGV4dF8xLmVtaXR0ZXIudHJpZ2dlcignZXZlbnRDaGFuZ2UnLCB7XG4gICAgICAgICAgICAgICAgb2xkRXZlbnQ6IG9sZEV2ZW50LFxuICAgICAgICAgICAgICAgIGV2ZW50OiB0aGlzLFxuICAgICAgICAgICAgICAgIHJlbGF0ZWRFdmVudHM6IGJ1aWxkRXZlbnRBcGlzKHJlbGV2YW50RXZlbnRzLCBjb250ZXh0XzEsIGluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICByZXZlcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dF8xLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSRVNFVF9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogZXZlbnRTdG9yZV8xLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEV2ZW50QXBpLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5fY29udGV4dDtcbiAgICAgICAgdmFyIGFzU3RvcmUgPSBldmVudEFwaVRvU3RvcmUodGhpcyk7XG4gICAgICAgIGNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ1JFTU9WRV9FVkVOVFMnLFxuICAgICAgICAgICAgZXZlbnRTdG9yZTogYXNTdG9yZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdldmVudFJlbW92ZScsIHtcbiAgICAgICAgICAgIGV2ZW50OiB0aGlzLFxuICAgICAgICAgICAgcmVsYXRlZEV2ZW50czogW10sXG4gICAgICAgICAgICByZXZlcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01FUkdFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IGFzU3RvcmUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwic291cmNlXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc291cmNlSWQgPSB0aGlzLl9kZWYuc291cmNlSWQ7XG4gICAgICAgICAgICBpZiAoc291cmNlSWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV2ZW50U291cmNlQXBpKHRoaXMuX2NvbnRleHQsIHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudERhdGEoKS5ldmVudFNvdXJjZXNbc291cmNlSWRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50QXBpLnByb3RvdHlwZSwgXCJzdGFydFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlID9cbiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LmRhdGVFbnYudG9EYXRlKHRoaXMuX2luc3RhbmNlLnJhbmdlLnN0YXJ0KSA6XG4gICAgICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwiZW5kXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuX2luc3RhbmNlICYmIHRoaXMuX2RlZi5oYXNFbmQpID9cbiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LmRhdGVFbnYudG9EYXRlKHRoaXMuX2luc3RhbmNlLnJhbmdlLmVuZCkgOlxuICAgICAgICAgICAgICAgIG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRBcGkucHJvdG90eXBlLCBcInN0YXJ0U3RyXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLl9pbnN0YW5jZTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZXh0LmRhdGVFbnYuZm9ybWF0SXNvKGluc3RhbmNlLnJhbmdlLnN0YXJ0LCB7XG4gICAgICAgICAgICAgICAgICAgIG9taXRUaW1lOiB0aGlzLl9kZWYuYWxsRGF5LFxuICAgICAgICAgICAgICAgICAgICBmb3JjZWRUem86IGluc3RhbmNlLmZvcmNlZFN0YXJ0VHpvLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50QXBpLnByb3RvdHlwZSwgXCJlbmRTdHJcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuX2luc3RhbmNlO1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlICYmIHRoaXMuX2RlZi5oYXNFbmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGV4dC5kYXRlRW52LmZvcm1hdElzbyhpbnN0YW5jZS5yYW5nZS5lbmQsIHtcbiAgICAgICAgICAgICAgICAgICAgb21pdFRpbWU6IHRoaXMuX2RlZi5hbGxEYXksXG4gICAgICAgICAgICAgICAgICAgIGZvcmNlZFR6bzogaW5zdGFuY2UuZm9yY2VkRW5kVHpvLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50QXBpLnByb3RvdHlwZSwgXCJpZFwiLCB7XG4gICAgICAgIC8vIGNvbXB1dGFibGUgcHJvcHMgdGhhdCBhbGwgYWNjZXNzIHRoZSBkZWZcbiAgICAgICAgLy8gVE9ETzogZmluZCBhIFR5cGVTY3JpcHQtY29tcGF0aWJsZSB3YXkgdG8gZG8gdGhpcyBhdCBzY2FsZVxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RlZi5wdWJsaWNJZDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwiZ3JvdXBJZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVmLmdyb3VwSWQ7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRBcGkucHJvdG90eXBlLCBcImFsbERheVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVmLmFsbERheTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwidGl0bGVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RlZi50aXRsZTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwidXJsXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kZWYudXJsOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50QXBpLnByb3RvdHlwZSwgXCJkaXNwbGF5XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kZWYudWkuZGlzcGxheSB8fCAnYXV0byc7IH0gLy8gYmFkLiBqdXN0IG5vcm1hbGl6ZSB0aGUgdHlwZSBlYXJsaWVyXG4gICAgICAgICxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwic3RhcnRFZGl0YWJsZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVmLnVpLnN0YXJ0RWRpdGFibGU7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRBcGkucHJvdG90eXBlLCBcImR1cmF0aW9uRWRpdGFibGVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RlZi51aS5kdXJhdGlvbkVkaXRhYmxlOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50QXBpLnByb3RvdHlwZSwgXCJjb25zdHJhaW50XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kZWYudWkuY29uc3RyYWludHNbMF0gfHwgbnVsbDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwib3ZlcmxhcFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVmLnVpLm92ZXJsYXA7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRBcGkucHJvdG90eXBlLCBcImFsbG93XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kZWYudWkuYWxsb3dzWzBdIHx8IG51bGw7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRBcGkucHJvdG90eXBlLCBcImJhY2tncm91bmRDb2xvclwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVmLnVpLmJhY2tncm91bmRDb2xvcjsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwiYm9yZGVyQ29sb3JcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RlZi51aS5ib3JkZXJDb2xvcjsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwidGV4dENvbG9yXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kZWYudWkudGV4dENvbG9yOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50QXBpLnByb3RvdHlwZSwgXCJjbGFzc05hbWVzXCIsIHtcbiAgICAgICAgLy8gTk9URTogdXNlciBjYW4ndCBtb2RpZnkgdGhlc2UgYmVjYXVzZSBPYmplY3QuZnJlZXplIHdhcyBjYWxsZWQgaW4gZXZlbnQtZGVmIHBhcnNpbmdcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kZWYudWkuY2xhc3NOYW1lczsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEFwaS5wcm90b3R5cGUsIFwiZXh0ZW5kZWRQcm9wc1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVmLmV4dGVuZGVkUHJvcHM7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBFdmVudEFwaS5wcm90b3R5cGUudG9QbGFpbk9iamVjdCA9IGZ1bmN0aW9uIChzZXR0aW5ncykge1xuICAgICAgICBpZiAoc2V0dGluZ3MgPT09IHZvaWQgMCkgeyBzZXR0aW5ncyA9IHt9OyB9XG4gICAgICAgIHZhciBkZWYgPSB0aGlzLl9kZWY7XG4gICAgICAgIHZhciB1aSA9IGRlZi51aTtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgc3RhcnRTdHIgPSBfYS5zdGFydFN0ciwgZW5kU3RyID0gX2EuZW5kU3RyO1xuICAgICAgICB2YXIgcmVzID0ge307XG4gICAgICAgIGlmIChkZWYudGl0bGUpIHtcbiAgICAgICAgICAgIHJlcy50aXRsZSA9IGRlZi50aXRsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnRTdHIpIHtcbiAgICAgICAgICAgIHJlcy5zdGFydCA9IHN0YXJ0U3RyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmRTdHIpIHtcbiAgICAgICAgICAgIHJlcy5lbmQgPSBlbmRTdHI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5wdWJsaWNJZCkge1xuICAgICAgICAgICAgcmVzLmlkID0gZGVmLnB1YmxpY0lkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYuZ3JvdXBJZCkge1xuICAgICAgICAgICAgcmVzLmdyb3VwSWQgPSBkZWYuZ3JvdXBJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLnVybCkge1xuICAgICAgICAgICAgcmVzLnVybCA9IGRlZi51cmw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVpLmRpc3BsYXkgJiYgdWkuZGlzcGxheSAhPT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICByZXMuZGlzcGxheSA9IHVpLmRpc3BsYXk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogd2hhdCBhYm91dCByZWN1cnJpbmctZXZlbnQgcHJvcGVydGllcz8/P1xuICAgICAgICAvLyBUT0RPOiBpbmNsdWRlIHN0YXJ0RWRpdGFibGUvZHVyYXRpb25FZGl0YWJsZS9jb25zdHJhaW50L292ZXJsYXAvYWxsb3dcbiAgICAgICAgaWYgKHNldHRpbmdzLmNvbGxhcHNlQ29sb3IgJiYgdWkuYmFja2dyb3VuZENvbG9yICYmIHVpLmJhY2tncm91bmRDb2xvciA9PT0gdWkuYm9yZGVyQ29sb3IpIHtcbiAgICAgICAgICAgIHJlcy5jb2xvciA9IHVpLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh1aS5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgICAgICByZXMuYmFja2dyb3VuZENvbG9yID0gdWkuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVpLmJvcmRlckNvbG9yKSB7XG4gICAgICAgICAgICAgICAgcmVzLmJvcmRlckNvbG9yID0gdWkuYm9yZGVyQ29sb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVpLnRleHRDb2xvcikge1xuICAgICAgICAgICAgcmVzLnRleHRDb2xvciA9IHVpLnRleHRDb2xvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodWkuY2xhc3NOYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlcy5jbGFzc05hbWVzID0gdWkuY2xhc3NOYW1lcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGVmLmV4dGVuZGVkUHJvcHMpLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHNldHRpbmdzLmNvbGxhcHNlRXh0ZW5kZWRQcm9wcykge1xuICAgICAgICAgICAgICAgIHRzbGliLl9fYXNzaWduKHJlcywgZGVmLmV4dGVuZGVkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzLmV4dGVuZGVkUHJvcHMgPSBkZWYuZXh0ZW5kZWRQcm9wcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgRXZlbnRBcGkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9QbGFpbk9iamVjdCgpO1xuICAgIH07XG4gICAgcmV0dXJuIEV2ZW50QXBpO1xufSgpKTtcbmZ1bmN0aW9uIGV2ZW50QXBpVG9TdG9yZShldmVudEFwaSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgdmFyIGRlZiA9IGV2ZW50QXBpLl9kZWY7XG4gICAgdmFyIGluc3RhbmNlID0gZXZlbnRBcGkuX2luc3RhbmNlO1xuICAgIHJldHVybiB7XG4gICAgICAgIGRlZnM6IChfYSA9IHt9LCBfYVtkZWYuZGVmSWRdID0gZGVmLCBfYSksXG4gICAgICAgIGluc3RhbmNlczogaW5zdGFuY2VcbiAgICAgICAgICAgID8gKF9iID0ge30sIF9iW2luc3RhbmNlLmluc3RhbmNlSWRdID0gaW5zdGFuY2UsIF9iKSA6IHt9LFxuICAgIH07XG59XG5mdW5jdGlvbiBidWlsZEV2ZW50QXBpcyhldmVudFN0b3JlLCBjb250ZXh0LCBleGNsdWRlSW5zdGFuY2UpIHtcbiAgICB2YXIgZGVmcyA9IGV2ZW50U3RvcmUuZGVmcywgaW5zdGFuY2VzID0gZXZlbnRTdG9yZS5pbnN0YW5jZXM7XG4gICAgdmFyIGV2ZW50QXBpcyA9IFtdO1xuICAgIHZhciBleGNsdWRlSW5zdGFuY2VJZCA9IGV4Y2x1ZGVJbnN0YW5jZSA/IGV4Y2x1ZGVJbnN0YW5jZS5pbnN0YW5jZUlkIDogJyc7XG4gICAgZm9yICh2YXIgaWQgaW4gaW5zdGFuY2VzKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGluc3RhbmNlc1tpZF07XG4gICAgICAgIHZhciBkZWYgPSBkZWZzW2luc3RhbmNlLmRlZklkXTtcbiAgICAgICAgaWYgKGluc3RhbmNlLmluc3RhbmNlSWQgIT09IGV4Y2x1ZGVJbnN0YW5jZUlkKSB7XG4gICAgICAgICAgICBldmVudEFwaXMucHVzaChuZXcgRXZlbnRBcGkoY29udGV4dCwgZGVmLCBpbnN0YW5jZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBldmVudEFwaXM7XG59XG5cbnZhciBjYWxlbmRhclN5c3RlbUNsYXNzTWFwID0ge307XG5mdW5jdGlvbiByZWdpc3RlckNhbGVuZGFyU3lzdGVtKG5hbWUsIHRoZUNsYXNzKSB7XG4gICAgY2FsZW5kYXJTeXN0ZW1DbGFzc01hcFtuYW1lXSA9IHRoZUNsYXNzO1xufVxuZnVuY3Rpb24gY3JlYXRlQ2FsZW5kYXJTeXN0ZW0obmFtZSkge1xuICAgIHJldHVybiBuZXcgY2FsZW5kYXJTeXN0ZW1DbGFzc01hcFtuYW1lXSgpO1xufVxudmFyIEdyZWdvcmlhbkNhbGVuZGFyU3lzdGVtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEdyZWdvcmlhbkNhbGVuZGFyU3lzdGVtKCkge1xuICAgIH1cbiAgICBHcmVnb3JpYW5DYWxlbmRhclN5c3RlbS5wcm90b3R5cGUuZ2V0TWFya2VyWWVhciA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmdldFVUQ0Z1bGxZZWFyKCk7XG4gICAgfTtcbiAgICBHcmVnb3JpYW5DYWxlbmRhclN5c3RlbS5wcm90b3R5cGUuZ2V0TWFya2VyTW9udGggPSBmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5nZXRVVENNb250aCgpO1xuICAgIH07XG4gICAgR3JlZ29yaWFuQ2FsZW5kYXJTeXN0ZW0ucHJvdG90eXBlLmdldE1hcmtlckRheSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmdldFVUQ0RhdGUoKTtcbiAgICB9O1xuICAgIEdyZWdvcmlhbkNhbGVuZGFyU3lzdGVtLnByb3RvdHlwZS5hcnJheVRvTWFya2VyID0gZnVuY3Rpb24gKGFycikge1xuICAgICAgICByZXR1cm4gYXJyYXlUb1V0Y0RhdGUoYXJyKTtcbiAgICB9O1xuICAgIEdyZWdvcmlhbkNhbGVuZGFyU3lzdGVtLnByb3RvdHlwZS5tYXJrZXJUb0FycmF5ID0gZnVuY3Rpb24gKG1hcmtlcikge1xuICAgICAgICByZXR1cm4gZGF0ZVRvVXRjQXJyYXkobWFya2VyKTtcbiAgICB9O1xuICAgIHJldHVybiBHcmVnb3JpYW5DYWxlbmRhclN5c3RlbTtcbn0oKSk7XG5yZWdpc3RlckNhbGVuZGFyU3lzdGVtKCdncmVnb3J5JywgR3JlZ29yaWFuQ2FsZW5kYXJTeXN0ZW0pO1xuXG52YXIgSVNPX1JFID0gL15cXHMqKFxcZHs0fSkoLT8oXFxkezJ9KSgtPyhcXGR7Mn0pKFtUIF0oXFxkezJ9KTo/KFxcZHsyfSkoOj8oXFxkezJ9KShcXC4oXFxkKykpPyk/KFp8KChbLStdKShcXGR7Mn0pKDo/KFxcZHsyfSkpPykpPyk/KT8pPyQvO1xuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gICAgdmFyIG0gPSBJU09fUkUuZXhlYyhzdHIpO1xuICAgIGlmIChtKSB7XG4gICAgICAgIHZhciBtYXJrZXIgPSBuZXcgRGF0ZShEYXRlLlVUQyhOdW1iZXIobVsxXSksIG1bM10gPyBOdW1iZXIobVszXSkgLSAxIDogMCwgTnVtYmVyKG1bNV0gfHwgMSksIE51bWJlcihtWzddIHx8IDApLCBOdW1iZXIobVs4XSB8fCAwKSwgTnVtYmVyKG1bMTBdIHx8IDApLCBtWzEyXSA/IE51bWJlcihcIjAuXCIgKyBtWzEyXSkgKiAxMDAwIDogMCkpO1xuICAgICAgICBpZiAoaXNWYWxpZERhdGUobWFya2VyKSkge1xuICAgICAgICAgICAgdmFyIHRpbWVab25lT2Zmc2V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChtWzEzXSkge1xuICAgICAgICAgICAgICAgIHRpbWVab25lT2Zmc2V0ID0gKG1bMTVdID09PSAnLScgPyAtMSA6IDEpICogKE51bWJlcihtWzE2XSB8fCAwKSAqIDYwICtcbiAgICAgICAgICAgICAgICAgICAgTnVtYmVyKG1bMThdIHx8IDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWFya2VyOiBtYXJrZXIsXG4gICAgICAgICAgICAgICAgaXNUaW1lVW5zcGVjaWZpZWQ6ICFtWzZdLFxuICAgICAgICAgICAgICAgIHRpbWVab25lT2Zmc2V0OiB0aW1lWm9uZU9mZnNldCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBEYXRlRW52ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERhdGVFbnYoc2V0dGluZ3MpIHtcbiAgICAgICAgdmFyIHRpbWVab25lID0gdGhpcy50aW1lWm9uZSA9IHNldHRpbmdzLnRpbWVab25lO1xuICAgICAgICB2YXIgaXNOYW1lZFRpbWVab25lID0gdGltZVpvbmUgIT09ICdsb2NhbCcgJiYgdGltZVpvbmUgIT09ICdVVEMnO1xuICAgICAgICBpZiAoc2V0dGluZ3MubmFtZWRUaW1lWm9uZUltcGwgJiYgaXNOYW1lZFRpbWVab25lKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWVkVGltZVpvbmVJbXBsID0gbmV3IHNldHRpbmdzLm5hbWVkVGltZVpvbmVJbXBsKHRpbWVab25lKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbkNvbXB1dGVPZmZzZXQgPSBCb29sZWFuKCFpc05hbWVkVGltZVpvbmUgfHwgdGhpcy5uYW1lZFRpbWVab25lSW1wbCk7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJTeXN0ZW0gPSBjcmVhdGVDYWxlbmRhclN5c3RlbShzZXR0aW5ncy5jYWxlbmRhclN5c3RlbSk7XG4gICAgICAgIHRoaXMubG9jYWxlID0gc2V0dGluZ3MubG9jYWxlO1xuICAgICAgICB0aGlzLndlZWtEb3cgPSBzZXR0aW5ncy5sb2NhbGUud2Vlay5kb3c7XG4gICAgICAgIHRoaXMud2Vla0RveSA9IHNldHRpbmdzLmxvY2FsZS53ZWVrLmRveTtcbiAgICAgICAgaWYgKHNldHRpbmdzLndlZWtOdW1iZXJDYWxjdWxhdGlvbiA9PT0gJ0lTTycpIHtcbiAgICAgICAgICAgIHRoaXMud2Vla0RvdyA9IDE7XG4gICAgICAgICAgICB0aGlzLndlZWtEb3kgPSA0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MuZmlyc3REYXkgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLndlZWtEb3cgPSBzZXR0aW5ncy5maXJzdERheTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzLndlZWtOdW1iZXJDYWxjdWxhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy53ZWVrTnVtYmVyRnVuYyA9IHNldHRpbmdzLndlZWtOdW1iZXJDYWxjdWxhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndlZWtUZXh0ID0gc2V0dGluZ3Mud2Vla1RleHQgIT0gbnVsbCA/IHNldHRpbmdzLndlZWtUZXh0IDogc2V0dGluZ3MubG9jYWxlLm9wdGlvbnMud2Vla1RleHQ7XG4gICAgICAgIHRoaXMud2Vla1RleHRMb25nID0gKHNldHRpbmdzLndlZWtUZXh0TG9uZyAhPSBudWxsID8gc2V0dGluZ3Mud2Vla1RleHRMb25nIDogc2V0dGluZ3MubG9jYWxlLm9wdGlvbnMud2Vla1RleHRMb25nKSB8fCB0aGlzLndlZWtUZXh0O1xuICAgICAgICB0aGlzLmNtZEZvcm1hdHRlciA9IHNldHRpbmdzLmNtZEZvcm1hdHRlcjtcbiAgICAgICAgdGhpcy5kZWZhdWx0U2VwYXJhdG9yID0gc2V0dGluZ3MuZGVmYXVsdFNlcGFyYXRvcjtcbiAgICB9XG4gICAgLy8gQ3JlYXRpbmcgLyBQYXJzaW5nXG4gICAgRGF0ZUVudi5wcm90b3R5cGUuY3JlYXRlTWFya2VyID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIHZhciBtZXRhID0gdGhpcy5jcmVhdGVNYXJrZXJNZXRhKGlucHV0KTtcbiAgICAgICAgaWYgKG1ldGEgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXRhLm1hcmtlcjtcbiAgICB9O1xuICAgIERhdGVFbnYucHJvdG90eXBlLmNyZWF0ZU5vd01hcmtlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuQ29tcHV0ZU9mZnNldCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGltZXN0YW1wVG9NYXJrZXIobmV3IERhdGUoKS52YWx1ZU9mKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHdlIGNhbid0IGNvbXB1dGUgdGhlIGN1cnJlbnQgZGF0ZSB2YWwgZm9yIGEgdGltZXpvbmUsXG4gICAgICAgIC8vIGJldHRlciB0byBnaXZlIHRoZSBjdXJyZW50IGxvY2FsIGRhdGUgdmFscyB0aGFuIFVUQ1xuICAgICAgICByZXR1cm4gYXJyYXlUb1V0Y0RhdGUoZGF0ZVRvTG9jYWxBcnJheShuZXcgRGF0ZSgpKSk7XG4gICAgfTtcbiAgICBEYXRlRW52LnByb3RvdHlwZS5jcmVhdGVNYXJrZXJNZXRhID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZShpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1hcmtlciA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBtYXJrZXIgPSB0aGlzLnRpbWVzdGFtcFRvTWFya2VyKGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIGlucHV0ID0gaW5wdXQudmFsdWVPZigpO1xuICAgICAgICAgICAgaWYgKCFpc05hTihpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICBtYXJrZXIgPSB0aGlzLnRpbWVzdGFtcFRvTWFya2VyKGlucHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgbWFya2VyID0gYXJyYXlUb1V0Y0RhdGUoaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXJrZXIgPT09IG51bGwgfHwgIWlzVmFsaWREYXRlKG1hcmtlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1hcmtlcjogbWFya2VyLCBpc1RpbWVVbnNwZWNpZmllZDogZmFsc2UsIGZvcmNlZFR6bzogbnVsbCB9O1xuICAgIH07XG4gICAgRGF0ZUVudi5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAocykge1xuICAgICAgICB2YXIgcGFydHMgPSBwYXJzZShzKTtcbiAgICAgICAgaWYgKHBhcnRzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWFya2VyID0gcGFydHMubWFya2VyO1xuICAgICAgICB2YXIgZm9yY2VkVHpvID0gbnVsbDtcbiAgICAgICAgaWYgKHBhcnRzLnRpbWVab25lT2Zmc2V0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jYW5Db21wdXRlT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgbWFya2VyID0gdGhpcy50aW1lc3RhbXBUb01hcmtlcihtYXJrZXIudmFsdWVPZigpIC0gcGFydHMudGltZVpvbmVPZmZzZXQgKiA2MCAqIDEwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yY2VkVHpvID0gcGFydHMudGltZVpvbmVPZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbWFya2VyOiBtYXJrZXIsIGlzVGltZVVuc3BlY2lmaWVkOiBwYXJ0cy5pc1RpbWVVbnNwZWNpZmllZCwgZm9yY2VkVHpvOiBmb3JjZWRUem8gfTtcbiAgICB9O1xuICAgIC8vIEFjY2Vzc29yc1xuICAgIERhdGVFbnYucHJvdG90eXBlLmdldFllYXIgPSBmdW5jdGlvbiAobWFya2VyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyU3lzdGVtLmdldE1hcmtlclllYXIobWFya2VyKTtcbiAgICB9O1xuICAgIERhdGVFbnYucHJvdG90eXBlLmdldE1vbnRoID0gZnVuY3Rpb24gKG1hcmtlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJNb250aChtYXJrZXIpO1xuICAgIH07XG4gICAgLy8gQWRkaW5nIC8gU3VidHJhY3RpbmdcbiAgICBEYXRlRW52LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAobWFya2VyLCBkdXIpIHtcbiAgICAgICAgdmFyIGEgPSB0aGlzLmNhbGVuZGFyU3lzdGVtLm1hcmtlclRvQXJyYXkobWFya2VyKTtcbiAgICAgICAgYVswXSArPSBkdXIueWVhcnM7XG4gICAgICAgIGFbMV0gKz0gZHVyLm1vbnRocztcbiAgICAgICAgYVsyXSArPSBkdXIuZGF5cztcbiAgICAgICAgYVs2XSArPSBkdXIubWlsbGlzZWNvbmRzO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5hcnJheVRvTWFya2VyKGEpO1xuICAgIH07XG4gICAgRGF0ZUVudi5wcm90b3R5cGUuc3VidHJhY3QgPSBmdW5jdGlvbiAobWFya2VyLCBkdXIpIHtcbiAgICAgICAgdmFyIGEgPSB0aGlzLmNhbGVuZGFyU3lzdGVtLm1hcmtlclRvQXJyYXkobWFya2VyKTtcbiAgICAgICAgYVswXSAtPSBkdXIueWVhcnM7XG4gICAgICAgIGFbMV0gLT0gZHVyLm1vbnRocztcbiAgICAgICAgYVsyXSAtPSBkdXIuZGF5cztcbiAgICAgICAgYVs2XSAtPSBkdXIubWlsbGlzZWNvbmRzO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5hcnJheVRvTWFya2VyKGEpO1xuICAgIH07XG4gICAgRGF0ZUVudi5wcm90b3R5cGUuYWRkWWVhcnMgPSBmdW5jdGlvbiAobWFya2VyLCBuKSB7XG4gICAgICAgIHZhciBhID0gdGhpcy5jYWxlbmRhclN5c3RlbS5tYXJrZXJUb0FycmF5KG1hcmtlcik7XG4gICAgICAgIGFbMF0gKz0gbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJTeXN0ZW0uYXJyYXlUb01hcmtlcihhKTtcbiAgICB9O1xuICAgIERhdGVFbnYucHJvdG90eXBlLmFkZE1vbnRocyA9IGZ1bmN0aW9uIChtYXJrZXIsIG4pIHtcbiAgICAgICAgdmFyIGEgPSB0aGlzLmNhbGVuZGFyU3lzdGVtLm1hcmtlclRvQXJyYXkobWFya2VyKTtcbiAgICAgICAgYVsxXSArPSBuO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5hcnJheVRvTWFya2VyKGEpO1xuICAgIH07XG4gICAgLy8gRGlmZmluZyBXaG9sZSBVbml0c1xuICAgIERhdGVFbnYucHJvdG90eXBlLmRpZmZXaG9sZVllYXJzID0gZnVuY3Rpb24gKG0wLCBtMSkge1xuICAgICAgICB2YXIgY2FsZW5kYXJTeXN0ZW0gPSB0aGlzLmNhbGVuZGFyU3lzdGVtO1xuICAgICAgICBpZiAodGltZUFzTXMobTApID09PSB0aW1lQXNNcyhtMSkgJiZcbiAgICAgICAgICAgIGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlckRheShtMCkgPT09IGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlckRheShtMSkgJiZcbiAgICAgICAgICAgIGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlck1vbnRoKG0wKSA9PT0gY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyTW9udGgobTEpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyWWVhcihtMSkgLSBjYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJZZWFyKG0wKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIERhdGVFbnYucHJvdG90eXBlLmRpZmZXaG9sZU1vbnRocyA9IGZ1bmN0aW9uIChtMCwgbTEpIHtcbiAgICAgICAgdmFyIGNhbGVuZGFyU3lzdGVtID0gdGhpcy5jYWxlbmRhclN5c3RlbTtcbiAgICAgICAgaWYgKHRpbWVBc01zKG0wKSA9PT0gdGltZUFzTXMobTEpICYmXG4gICAgICAgICAgICBjYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJEYXkobTApID09PSBjYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJEYXkobTEpKSB7XG4gICAgICAgICAgICByZXR1cm4gKGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlck1vbnRoKG0xKSAtIGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlck1vbnRoKG0wKSkgK1xuICAgICAgICAgICAgICAgIChjYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJZZWFyKG0xKSAtIGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlclllYXIobTApKSAqIDEyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgLy8gUmFuZ2UgLyBEdXJhdGlvblxuICAgIERhdGVFbnYucHJvdG90eXBlLmdyZWF0ZXN0V2hvbGVVbml0ID0gZnVuY3Rpb24gKG0wLCBtMSkge1xuICAgICAgICB2YXIgbiA9IHRoaXMuZGlmZldob2xlWWVhcnMobTAsIG0xKTtcbiAgICAgICAgaWYgKG4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVuaXQ6ICd5ZWFyJywgdmFsdWU6IG4gfTtcbiAgICAgICAgfVxuICAgICAgICBuID0gdGhpcy5kaWZmV2hvbGVNb250aHMobTAsIG0xKTtcbiAgICAgICAgaWYgKG4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVuaXQ6ICdtb250aCcsIHZhbHVlOiBuIH07XG4gICAgICAgIH1cbiAgICAgICAgbiA9IGRpZmZXaG9sZVdlZWtzKG0wLCBtMSk7XG4gICAgICAgIGlmIChuICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4geyB1bml0OiAnd2VlaycsIHZhbHVlOiBuIH07XG4gICAgICAgIH1cbiAgICAgICAgbiA9IGRpZmZXaG9sZURheXMobTAsIG0xKTtcbiAgICAgICAgaWYgKG4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVuaXQ6ICdkYXknLCB2YWx1ZTogbiB9O1xuICAgICAgICB9XG4gICAgICAgIG4gPSBkaWZmSG91cnMobTAsIG0xKTtcbiAgICAgICAgaWYgKGlzSW50KG4pKSB7XG4gICAgICAgICAgICByZXR1cm4geyB1bml0OiAnaG91cicsIHZhbHVlOiBuIH07XG4gICAgICAgIH1cbiAgICAgICAgbiA9IGRpZmZNaW51dGVzKG0wLCBtMSk7XG4gICAgICAgIGlmIChpc0ludChuKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdW5pdDogJ21pbnV0ZScsIHZhbHVlOiBuIH07XG4gICAgICAgIH1cbiAgICAgICAgbiA9IGRpZmZTZWNvbmRzKG0wLCBtMSk7XG4gICAgICAgIGlmIChpc0ludChuKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdW5pdDogJ3NlY29uZCcsIHZhbHVlOiBuIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdW5pdDogJ21pbGxpc2Vjb25kJywgdmFsdWU6IG0xLnZhbHVlT2YoKSAtIG0wLnZhbHVlT2YoKSB9O1xuICAgIH07XG4gICAgRGF0ZUVudi5wcm90b3R5cGUuY291bnREdXJhdGlvbnNCZXR3ZWVuID0gZnVuY3Rpb24gKG0wLCBtMSwgZCkge1xuICAgICAgICAvLyBUT0RPOiBjYW4gdXNlIGdyZWF0ZXN0V2hvbGVVbml0XG4gICAgICAgIHZhciBkaWZmO1xuICAgICAgICBpZiAoZC55ZWFycykge1xuICAgICAgICAgICAgZGlmZiA9IHRoaXMuZGlmZldob2xlWWVhcnMobTAsIG0xKTtcbiAgICAgICAgICAgIGlmIChkaWZmICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpZmYgLyBhc1JvdWdoWWVhcnMoZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGQubW9udGhzKSB7XG4gICAgICAgICAgICBkaWZmID0gdGhpcy5kaWZmV2hvbGVNb250aHMobTAsIG0xKTtcbiAgICAgICAgICAgIGlmIChkaWZmICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpZmYgLyBhc1JvdWdoTW9udGhzKGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkLmRheXMpIHtcbiAgICAgICAgICAgIGRpZmYgPSBkaWZmV2hvbGVEYXlzKG0wLCBtMSk7XG4gICAgICAgICAgICBpZiAoZGlmZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkaWZmIC8gYXNSb3VnaERheXMoZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChtMS52YWx1ZU9mKCkgLSBtMC52YWx1ZU9mKCkpIC8gYXNSb3VnaE1zKGQpO1xuICAgIH07XG4gICAgLy8gU3RhcnQtT2ZcbiAgICAvLyB0aGVzZSBET04nVCByZXR1cm4gem9uZWQtZGF0ZXMuIG9ubHkgVVRDIHN0YXJ0LW9mIGRhdGVzXG4gICAgRGF0ZUVudi5wcm90b3R5cGUuc3RhcnRPZiA9IGZ1bmN0aW9uIChtLCB1bml0KSB7XG4gICAgICAgIGlmICh1bml0ID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0T2ZZZWFyKG0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bml0ID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydE9mTW9udGgobSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuaXQgPT09ICd3ZWVrJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZldlZWsobSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuaXQgPT09ICdkYXknKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhcnRPZkRheShtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pdCA9PT0gJ2hvdXInKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhcnRPZkhvdXIobSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuaXQgPT09ICdtaW51dGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhcnRPZk1pbnV0ZShtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pdCA9PT0gJ3NlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGFydE9mU2Vjb25kKG0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgRGF0ZUVudi5wcm90b3R5cGUuc3RhcnRPZlllYXIgPSBmdW5jdGlvbiAobSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5hcnJheVRvTWFya2VyKFtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyWWVhcihtKSxcbiAgICAgICAgXSk7XG4gICAgfTtcbiAgICBEYXRlRW52LnByb3RvdHlwZS5zdGFydE9mTW9udGggPSBmdW5jdGlvbiAobSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5hcnJheVRvTWFya2VyKFtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyWWVhcihtKSxcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyTW9udGgobSksXG4gICAgICAgIF0pO1xuICAgIH07XG4gICAgRGF0ZUVudi5wcm90b3R5cGUuc3RhcnRPZldlZWsgPSBmdW5jdGlvbiAobSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5hcnJheVRvTWFya2VyKFtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyWWVhcihtKSxcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyTW9udGgobSksXG4gICAgICAgICAgICBtLmdldFVUQ0RhdGUoKSAtICgobS5nZXRVVENEYXkoKSAtIHRoaXMud2Vla0RvdyArIDcpICUgNyksXG4gICAgICAgIF0pO1xuICAgIH07XG4gICAgLy8gV2VlayBOdW1iZXJcbiAgICBEYXRlRW52LnByb3RvdHlwZS5jb21wdXRlV2Vla051bWJlciA9IGZ1bmN0aW9uIChtYXJrZXIpIHtcbiAgICAgICAgaWYgKHRoaXMud2Vla051bWJlckZ1bmMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndlZWtOdW1iZXJGdW5jKHRoaXMudG9EYXRlKG1hcmtlcikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3ZWVrT2ZZZWFyKG1hcmtlciwgdGhpcy53ZWVrRG93LCB0aGlzLndlZWtEb3kpO1xuICAgIH07XG4gICAgLy8gVE9ETzogY2hva2Ugb24gdGltZVpvbmVOYW1lOiBsb25nXG4gICAgRGF0ZUVudi5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKG1hcmtlciwgZm9ybWF0dGVyLCBkYXRlT3B0aW9ucykge1xuICAgICAgICBpZiAoZGF0ZU9wdGlvbnMgPT09IHZvaWQgMCkgeyBkYXRlT3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KHtcbiAgICAgICAgICAgIG1hcmtlcjogbWFya2VyLFxuICAgICAgICAgICAgdGltZVpvbmVPZmZzZXQ6IGRhdGVPcHRpb25zLmZvcmNlZFR6byAhPSBudWxsID9cbiAgICAgICAgICAgICAgICBkYXRlT3B0aW9ucy5mb3JjZWRUem8gOlxuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0Rm9yTWFya2VyKG1hcmtlciksXG4gICAgICAgIH0sIHRoaXMpO1xuICAgIH07XG4gICAgRGF0ZUVudi5wcm90b3R5cGUuZm9ybWF0UmFuZ2UgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCwgZm9ybWF0dGVyLCBkYXRlT3B0aW9ucykge1xuICAgICAgICBpZiAoZGF0ZU9wdGlvbnMgPT09IHZvaWQgMCkgeyBkYXRlT3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIGlmIChkYXRlT3B0aW9ucy5pc0VuZEV4Y2x1c2l2ZSkge1xuICAgICAgICAgICAgZW5kID0gYWRkTXMoZW5kLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlci5mb3JtYXRSYW5nZSh7XG4gICAgICAgICAgICBtYXJrZXI6IHN0YXJ0LFxuICAgICAgICAgICAgdGltZVpvbmVPZmZzZXQ6IGRhdGVPcHRpb25zLmZvcmNlZFN0YXJ0VHpvICE9IG51bGwgP1xuICAgICAgICAgICAgICAgIGRhdGVPcHRpb25zLmZvcmNlZFN0YXJ0VHpvIDpcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldEZvck1hcmtlcihzdGFydCksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIG1hcmtlcjogZW5kLFxuICAgICAgICAgICAgdGltZVpvbmVPZmZzZXQ6IGRhdGVPcHRpb25zLmZvcmNlZEVuZFR6byAhPSBudWxsID9cbiAgICAgICAgICAgICAgICBkYXRlT3B0aW9ucy5mb3JjZWRFbmRUem8gOlxuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0Rm9yTWFya2VyKGVuZCksXG4gICAgICAgIH0sIHRoaXMsIGRhdGVPcHRpb25zLmRlZmF1bHRTZXBhcmF0b3IpO1xuICAgIH07XG4gICAgLypcbiAgICBEVU1COiB0aGUgb21pdFRpbWUgYXJnIGlzIGR1bWIuIGlmIHdlIG9taXQgdGhlIHRpbWUsIHdlIHdhbnQgdG8gb21pdCB0aGUgdGltZXpvbmUgb2Zmc2V0LiBhbmQgaWYgd2UgZG8gdGhhdCxcbiAgICBtaWdodCBhcyB3ZWxsIHVzZSBidWlsZElzb1N0cmluZyBvciBzb21lIG90aGVyIHV0aWwgZGlyZWN0bHlcbiAgICAqL1xuICAgIERhdGVFbnYucHJvdG90eXBlLmZvcm1hdElzbyA9IGZ1bmN0aW9uIChtYXJrZXIsIGV4dHJhT3B0aW9ucykge1xuICAgICAgICBpZiAoZXh0cmFPcHRpb25zID09PSB2b2lkIDApIHsgZXh0cmFPcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIHRpbWVab25lT2Zmc2V0ID0gbnVsbDtcbiAgICAgICAgaWYgKCFleHRyYU9wdGlvbnMub21pdFRpbWVab25lT2Zmc2V0KSB7XG4gICAgICAgICAgICBpZiAoZXh0cmFPcHRpb25zLmZvcmNlZFR6byAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGltZVpvbmVPZmZzZXQgPSBleHRyYU9wdGlvbnMuZm9yY2VkVHpvO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGltZVpvbmVPZmZzZXQgPSB0aGlzLm9mZnNldEZvck1hcmtlcihtYXJrZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZElzb1N0cmluZyhtYXJrZXIsIHRpbWVab25lT2Zmc2V0LCBleHRyYU9wdGlvbnMub21pdFRpbWUpO1xuICAgIH07XG4gICAgLy8gVGltZVpvbmVcbiAgICBEYXRlRW52LnByb3RvdHlwZS50aW1lc3RhbXBUb01hcmtlciA9IGZ1bmN0aW9uIChtcykge1xuICAgICAgICBpZiAodGhpcy50aW1lWm9uZSA9PT0gJ2xvY2FsJykge1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9VdGNEYXRlKGRhdGVUb0xvY2FsQXJyYXkobmV3IERhdGUobXMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGltZVpvbmUgPT09ICdVVEMnIHx8ICF0aGlzLm5hbWVkVGltZVpvbmVJbXBsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUobXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheVRvVXRjRGF0ZSh0aGlzLm5hbWVkVGltZVpvbmVJbXBsLnRpbWVzdGFtcFRvQXJyYXkobXMpKTtcbiAgICB9O1xuICAgIERhdGVFbnYucHJvdG90eXBlLm9mZnNldEZvck1hcmtlciA9IGZ1bmN0aW9uIChtKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVab25lID09PSAnbG9jYWwnKSB7XG4gICAgICAgICAgICByZXR1cm4gLWFycmF5VG9Mb2NhbERhdGUoZGF0ZVRvVXRjQXJyYXkobSkpLmdldFRpbWV6b25lT2Zmc2V0KCk7IC8vIGNvbnZlcnQgXCJpbnZlcnNlXCIgb2Zmc2V0IHRvIFwibm9ybWFsXCIgb2Zmc2V0XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGltZVpvbmUgPT09ICdVVEMnKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5uYW1lZFRpbWVab25lSW1wbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZWRUaW1lWm9uZUltcGwub2Zmc2V0Rm9yQXJyYXkoZGF0ZVRvVXRjQXJyYXkobSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgLy8gQ29udmVyc2lvblxuICAgIERhdGVFbnYucHJvdG90eXBlLnRvRGF0ZSA9IGZ1bmN0aW9uIChtLCBmb3JjZWRUem8pIHtcbiAgICAgICAgaWYgKHRoaXMudGltZVpvbmUgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgICAgIHJldHVybiBhcnJheVRvTG9jYWxEYXRlKGRhdGVUb1V0Y0FycmF5KG0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50aW1lWm9uZSA9PT0gJ1VUQycpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShtLnZhbHVlT2YoKSk7IC8vIG1ha2Ugc3VyZSBpdCdzIGEgY29weVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5uYW1lZFRpbWVab25lSW1wbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG0udmFsdWVPZigpIC0gKGZvcmNlZFR6byB8fCAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG0udmFsdWVPZigpIC1cbiAgICAgICAgICAgIHRoaXMubmFtZWRUaW1lWm9uZUltcGwub2Zmc2V0Rm9yQXJyYXkoZGF0ZVRvVXRjQXJyYXkobSkpICogMTAwMCAqIDYwKTtcbiAgICB9O1xuICAgIHJldHVybiBEYXRlRW52O1xufSgpKTtcblxudmFyIGdsb2JhbExvY2FsZXMgPSBbXTtcblxudmFyIE1JTklNQUxfUkFXX0VOX0xPQ0FMRSA9IHtcbiAgICBjb2RlOiAnZW4nLFxuICAgIHdlZWs6IHtcbiAgICAgICAgZG93OiAwLFxuICAgICAgICBkb3k6IDQsIC8vIDQgZGF5cyBuZWVkIHRvIGJlIHdpdGhpbiB0aGUgeWVhciB0byBiZSBjb25zaWRlcmVkIHRoZSBmaXJzdCB3ZWVrXG4gICAgfSxcbiAgICBkaXJlY3Rpb246ICdsdHInLFxuICAgIGJ1dHRvblRleHQ6IHtcbiAgICAgICAgcHJldjogJ3ByZXYnLFxuICAgICAgICBuZXh0OiAnbmV4dCcsXG4gICAgICAgIHByZXZZZWFyOiAncHJldiB5ZWFyJyxcbiAgICAgICAgbmV4dFllYXI6ICduZXh0IHllYXInLFxuICAgICAgICB5ZWFyOiAneWVhcicsXG4gICAgICAgIHRvZGF5OiAndG9kYXknLFxuICAgICAgICBtb250aDogJ21vbnRoJyxcbiAgICAgICAgd2VlazogJ3dlZWsnLFxuICAgICAgICBkYXk6ICdkYXknLFxuICAgICAgICBsaXN0OiAnbGlzdCcsXG4gICAgfSxcbiAgICB3ZWVrVGV4dDogJ1cnLFxuICAgIHdlZWtUZXh0TG9uZzogJ1dlZWsnLFxuICAgIGNsb3NlSGludDogJ0Nsb3NlJyxcbiAgICB0aW1lSGludDogJ1RpbWUnLFxuICAgIGV2ZW50SGludDogJ0V2ZW50JyxcbiAgICBhbGxEYXlUZXh0OiAnYWxsLWRheScsXG4gICAgbW9yZUxpbmtUZXh0OiAnbW9yZScsXG4gICAgbm9FdmVudHNUZXh0OiAnTm8gZXZlbnRzIHRvIGRpc3BsYXknLFxufTtcbnZhciBSQVdfRU5fTE9DQUxFID0gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIE1JTklNQUxfUkFXX0VOX0xPQ0FMRSksIHsgXG4gICAgLy8gSW5jbHVkZXMgdGhpbmdzIHdlIGRvbid0IHdhbnQgb3RoZXIgbG9jYWxlcyB0byBpbmhlcml0LFxuICAgIC8vIHRoaW5ncyB0aGF0IGRlcml2ZSBmcm9tIG90aGVyIHRyYW5zbGF0YWJsZSBzdHJpbmdzLlxuICAgIGJ1dHRvbkhpbnRzOiB7XG4gICAgICAgIHByZXY6ICdQcmV2aW91cyAkMCcsXG4gICAgICAgIG5leHQ6ICdOZXh0ICQwJyxcbiAgICAgICAgdG9kYXk6IGZ1bmN0aW9uIChidXR0b25UZXh0LCB1bml0KSB7XG4gICAgICAgICAgICByZXR1cm4gKHVuaXQgPT09ICdkYXknKVxuICAgICAgICAgICAgICAgID8gJ1RvZGF5J1xuICAgICAgICAgICAgICAgIDogXCJUaGlzIFwiICsgYnV0dG9uVGV4dDtcbiAgICAgICAgfSxcbiAgICB9LCB2aWV3SGludDogJyQwIHZpZXcnLCBuYXZMaW5rSGludDogJ0dvIHRvICQwJywgbW9yZUxpbmtIaW50OiBmdW5jdGlvbiAoZXZlbnRDbnQpIHtcbiAgICAgICAgcmV0dXJuIFwiU2hvdyBcIiArIGV2ZW50Q250ICsgXCIgbW9yZSBldmVudFwiICsgKGV2ZW50Q250ID09PSAxID8gJycgOiAncycpO1xuICAgIH0gfSk7XG5mdW5jdGlvbiBvcmdhbml6ZVJhd0xvY2FsZXMoZXhwbGljaXRSYXdMb2NhbGVzKSB7XG4gICAgdmFyIGRlZmF1bHRDb2RlID0gZXhwbGljaXRSYXdMb2NhbGVzLmxlbmd0aCA+IDAgPyBleHBsaWNpdFJhd0xvY2FsZXNbMF0uY29kZSA6ICdlbic7XG4gICAgdmFyIGFsbFJhd0xvY2FsZXMgPSBnbG9iYWxMb2NhbGVzLmNvbmNhdChleHBsaWNpdFJhd0xvY2FsZXMpO1xuICAgIHZhciByYXdMb2NhbGVNYXAgPSB7XG4gICAgICAgIGVuOiBSQVdfRU5fTE9DQUxFLFxuICAgIH07XG4gICAgZm9yICh2YXIgX2kgPSAwLCBhbGxSYXdMb2NhbGVzXzEgPSBhbGxSYXdMb2NhbGVzOyBfaSA8IGFsbFJhd0xvY2FsZXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHJhd0xvY2FsZSA9IGFsbFJhd0xvY2FsZXNfMVtfaV07XG4gICAgICAgIHJhd0xvY2FsZU1hcFtyYXdMb2NhbGUuY29kZV0gPSByYXdMb2NhbGU7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIG1hcDogcmF3TG9jYWxlTWFwLFxuICAgICAgICBkZWZhdWx0Q29kZTogZGVmYXVsdENvZGUsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGJ1aWxkTG9jYWxlKGlucHV0U2luZ3VsYXIsIGF2YWlsYWJsZSkge1xuICAgIGlmICh0eXBlb2YgaW5wdXRTaW5ndWxhciA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaW5wdXRTaW5ndWxhcikpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlTG9jYWxlKGlucHV0U2luZ3VsYXIuY29kZSwgW2lucHV0U2luZ3VsYXIuY29kZV0sIGlucHV0U2luZ3VsYXIpO1xuICAgIH1cbiAgICByZXR1cm4gcXVlcnlMb2NhbGUoaW5wdXRTaW5ndWxhciwgYXZhaWxhYmxlKTtcbn1cbmZ1bmN0aW9uIHF1ZXJ5TG9jYWxlKGNvZGVBcmcsIGF2YWlsYWJsZSkge1xuICAgIHZhciBjb2RlcyA9IFtdLmNvbmNhdChjb2RlQXJnIHx8IFtdKTsgLy8gd2lsbCBjb252ZXJ0IHRvIGFycmF5XG4gICAgdmFyIHJhdyA9IHF1ZXJ5UmF3TG9jYWxlKGNvZGVzLCBhdmFpbGFibGUpIHx8IFJBV19FTl9MT0NBTEU7XG4gICAgcmV0dXJuIHBhcnNlTG9jYWxlKGNvZGVBcmcsIGNvZGVzLCByYXcpO1xufVxuZnVuY3Rpb24gcXVlcnlSYXdMb2NhbGUoY29kZXMsIGF2YWlsYWJsZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIHBhcnRzID0gY29kZXNbaV0udG9Mb2NhbGVMb3dlckNhc2UoKS5zcGxpdCgnLScpO1xuICAgICAgICBmb3IgKHZhciBqID0gcGFydHMubGVuZ3RoOyBqID4gMDsgaiAtPSAxKSB7XG4gICAgICAgICAgICB2YXIgc2ltcGxlSWQgPSBwYXJ0cy5zbGljZSgwLCBqKS5qb2luKCctJyk7XG4gICAgICAgICAgICBpZiAoYXZhaWxhYmxlW3NpbXBsZUlkXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGVbc2ltcGxlSWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gcGFyc2VMb2NhbGUoY29kZUFyZywgY29kZXMsIHJhdykge1xuICAgIHZhciBtZXJnZWQgPSBtZXJnZVByb3BzKFtNSU5JTUFMX1JBV19FTl9MT0NBTEUsIHJhd10sIFsnYnV0dG9uVGV4dCddKTtcbiAgICBkZWxldGUgbWVyZ2VkLmNvZGU7IC8vIGRvbid0IHdhbnQgdGhpcyBwYXJ0IG9mIHRoZSBvcHRpb25zXG4gICAgdmFyIHdlZWsgPSBtZXJnZWQud2VlaztcbiAgICBkZWxldGUgbWVyZ2VkLndlZWs7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29kZUFyZzogY29kZUFyZyxcbiAgICAgICAgY29kZXM6IGNvZGVzLFxuICAgICAgICB3ZWVrOiB3ZWVrLFxuICAgICAgICBzaW1wbGVOdW1iZXJGb3JtYXQ6IG5ldyBJbnRsLk51bWJlckZvcm1hdChjb2RlQXJnKSxcbiAgICAgICAgb3B0aW9uczogbWVyZ2VkLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZUlucHV0LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICB2YXIgZGF0ZUVudiA9IGJ1aWxkRGF0ZUVudiQxKG9wdGlvbnMpO1xuICAgIHZhciBmb3JtYXR0ZXIgPSBjcmVhdGVGb3JtYXR0ZXIob3B0aW9ucyk7XG4gICAgdmFyIGRhdGVNZXRhID0gZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKGRhdGVJbnB1dCk7XG4gICAgaWYgKCFkYXRlTWV0YSkgeyAvLyBUT0RPOiB3YXJuaW5nP1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBkYXRlRW52LmZvcm1hdChkYXRlTWV0YS5tYXJrZXIsIGZvcm1hdHRlciwge1xuICAgICAgICBmb3JjZWRUem86IGRhdGVNZXRhLmZvcmNlZFR6byxcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGZvcm1hdFJhbmdlKHN0YXJ0SW5wdXQsIGVuZElucHV0LCBvcHRpb25zKSB7XG4gICAgdmFyIGRhdGVFbnYgPSBidWlsZERhdGVFbnYkMSh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyA/IG9wdGlvbnMgOiB7fSk7IC8vIHBhc3MgaW4gaWYgbm9uLW51bGwgb2JqZWN0XG4gICAgdmFyIGZvcm1hdHRlciA9IGNyZWF0ZUZvcm1hdHRlcihvcHRpb25zKTtcbiAgICB2YXIgc3RhcnRNZXRhID0gZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKHN0YXJ0SW5wdXQpO1xuICAgIHZhciBlbmRNZXRhID0gZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKGVuZElucHV0KTtcbiAgICBpZiAoIXN0YXJ0TWV0YSB8fCAhZW5kTWV0YSkgeyAvLyBUT0RPOiB3YXJuaW5nP1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBkYXRlRW52LmZvcm1hdFJhbmdlKHN0YXJ0TWV0YS5tYXJrZXIsIGVuZE1ldGEubWFya2VyLCBmb3JtYXR0ZXIsIHtcbiAgICAgICAgZm9yY2VkU3RhcnRUem86IHN0YXJ0TWV0YS5mb3JjZWRUem8sXG4gICAgICAgIGZvcmNlZEVuZFR6bzogZW5kTWV0YS5mb3JjZWRUem8sXG4gICAgICAgIGlzRW5kRXhjbHVzaXZlOiBvcHRpb25zLmlzRW5kRXhjbHVzaXZlLFxuICAgICAgICBkZWZhdWx0U2VwYXJhdG9yOiBCQVNFX09QVElPTl9ERUZBVUxUUy5kZWZhdWx0UmFuZ2VTZXBhcmF0b3IsXG4gICAgfSk7XG59XG4vLyBUT0RPOiBtb3JlIERSWSBhbmQgb3B0aW1pemVkXG5mdW5jdGlvbiBidWlsZERhdGVFbnYkMShzZXR0aW5ncykge1xuICAgIHZhciBsb2NhbGUgPSBidWlsZExvY2FsZShzZXR0aW5ncy5sb2NhbGUgfHwgJ2VuJywgb3JnYW5pemVSYXdMb2NhbGVzKFtdKS5tYXApOyAvLyBUT0RPOiBkb24ndCBoYXJkY29kZSAnZW4nIGV2ZXJ5d2hlcmVcbiAgICByZXR1cm4gbmV3IERhdGVFbnYodHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oeyB0aW1lWm9uZTogQkFTRV9PUFRJT05fREVGQVVMVFMudGltZVpvbmUsIGNhbGVuZGFyU3lzdGVtOiAnZ3JlZ29yeScgfSwgc2V0dGluZ3MpLCB7IGxvY2FsZTogbG9jYWxlIH0pKTtcbn1cblxudmFyIERFRl9ERUZBVUxUUyA9IHtcbiAgICBzdGFydFRpbWU6ICcwOTowMCcsXG4gICAgZW5kVGltZTogJzE3OjAwJyxcbiAgICBkYXlzT2ZXZWVrOiBbMSwgMiwgMywgNCwgNV0sXG4gICAgZGlzcGxheTogJ2ludmVyc2UtYmFja2dyb3VuZCcsXG4gICAgY2xhc3NOYW1lczogJ2ZjLW5vbi1idXNpbmVzcycsXG4gICAgZ3JvdXBJZDogJ19idXNpbmVzc0hvdXJzJywgLy8gc28gbXVsdGlwbGUgZGVmcyBnZXQgZ3JvdXBlZFxufTtcbi8qXG5UT0RPOiBwYXNzIGFyb3VuZCBhcyBFdmVudERlZkhhc2ghISFcbiovXG5mdW5jdGlvbiBwYXJzZUJ1c2luZXNzSG91cnMoaW5wdXQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gcGFyc2VFdmVudHMocmVmaW5lSW5wdXRzKGlucHV0KSwgbnVsbCwgY29udGV4dCk7XG59XG5mdW5jdGlvbiByZWZpbmVJbnB1dHMoaW5wdXQpIHtcbiAgICB2YXIgcmF3RGVmcztcbiAgICBpZiAoaW5wdXQgPT09IHRydWUpIHtcbiAgICAgICAgcmF3RGVmcyA9IFt7fV07IC8vIHdpbGwgZ2V0IERFRl9ERUZBVUxUUyB2ZXJiYXRpbVxuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICAvLyBpZiBzcGVjaWZ5aW5nIGFuIGFycmF5LCBldmVyeSBzdWItZGVmaW5pdGlvbiBORUVEUyBhIGRheS1vZi13ZWVrXG4gICAgICAgIHJhd0RlZnMgPSBpbnB1dC5maWx0ZXIoZnVuY3Rpb24gKHJhd0RlZikgeyByZXR1cm4gcmF3RGVmLmRheXNPZldlZWs7IH0pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIGlucHV0KSB7IC8vIG5vbi1udWxsIG9iamVjdFxuICAgICAgICByYXdEZWZzID0gW2lucHV0XTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIGlzIHByb2JhYmx5IGZhbHNlXG4gICAgICAgIHJhd0RlZnMgPSBbXTtcbiAgICB9XG4gICAgcmF3RGVmcyA9IHJhd0RlZnMubWFwKGZ1bmN0aW9uIChyYXdEZWYpIHsgcmV0dXJuICh0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgREVGX0RFRkFVTFRTKSwgcmF3RGVmKSk7IH0pO1xuICAgIHJldHVybiByYXdEZWZzO1xufVxuXG5mdW5jdGlvbiBwb2ludEluc2lkZVJlY3QocG9pbnQsIHJlY3QpIHtcbiAgICByZXR1cm4gcG9pbnQubGVmdCA+PSByZWN0LmxlZnQgJiZcbiAgICAgICAgcG9pbnQubGVmdCA8IHJlY3QucmlnaHQgJiZcbiAgICAgICAgcG9pbnQudG9wID49IHJlY3QudG9wICYmXG4gICAgICAgIHBvaW50LnRvcCA8IHJlY3QuYm90dG9tO1xufVxuLy8gUmV0dXJucyBhIG5ldyByZWN0YW5nbGUgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gcmVjdGFuZ2xlcy4gSWYgdGhleSBkb24ndCBpbnRlcnNlY3QsIHJldHVybnMgZmFsc2VcbmZ1bmN0aW9uIGludGVyc2VjdFJlY3RzKHJlY3QxLCByZWN0Mikge1xuICAgIHZhciByZXMgPSB7XG4gICAgICAgIGxlZnQ6IE1hdGgubWF4KHJlY3QxLmxlZnQsIHJlY3QyLmxlZnQpLFxuICAgICAgICByaWdodDogTWF0aC5taW4ocmVjdDEucmlnaHQsIHJlY3QyLnJpZ2h0KSxcbiAgICAgICAgdG9wOiBNYXRoLm1heChyZWN0MS50b3AsIHJlY3QyLnRvcCksXG4gICAgICAgIGJvdHRvbTogTWF0aC5taW4ocmVjdDEuYm90dG9tLCByZWN0Mi5ib3R0b20pLFxuICAgIH07XG4gICAgaWYgKHJlcy5sZWZ0IDwgcmVzLnJpZ2h0ICYmIHJlcy50b3AgPCByZXMuYm90dG9tKSB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHRyYW5zbGF0ZVJlY3QocmVjdCwgZGVsdGFYLCBkZWx0YVkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiByZWN0LmxlZnQgKyBkZWx0YVgsXG4gICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0ICsgZGVsdGFYLFxuICAgICAgICB0b3A6IHJlY3QudG9wICsgZGVsdGFZLFxuICAgICAgICBib3R0b206IHJlY3QuYm90dG9tICsgZGVsdGFZLFxuICAgIH07XG59XG4vLyBSZXR1cm5zIGEgbmV3IHBvaW50IHRoYXQgd2lsbCBoYXZlIGJlZW4gbW92ZWQgdG8gcmVzaWRlIHdpdGhpbiB0aGUgZ2l2ZW4gcmVjdGFuZ2xlXG5mdW5jdGlvbiBjb25zdHJhaW5Qb2ludChwb2ludCwgcmVjdCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6IE1hdGgubWluKE1hdGgubWF4KHBvaW50LmxlZnQsIHJlY3QubGVmdCksIHJlY3QucmlnaHQpLFxuICAgICAgICB0b3A6IE1hdGgubWluKE1hdGgubWF4KHBvaW50LnRvcCwgcmVjdC50b3ApLCByZWN0LmJvdHRvbSksXG4gICAgfTtcbn1cbi8vIFJldHVybnMgYSBwb2ludCB0aGF0IGlzIHRoZSBjZW50ZXIgb2YgdGhlIGdpdmVuIHJlY3RhbmdsZVxuZnVuY3Rpb24gZ2V0UmVjdENlbnRlcihyZWN0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMixcbiAgICAgICAgdG9wOiAocmVjdC50b3AgKyByZWN0LmJvdHRvbSkgLyAyLFxuICAgIH07XG59XG4vLyBTdWJ0cmFjdHMgcG9pbnQyJ3MgY29vcmRpbmF0ZXMgZnJvbSBwb2ludDEncyBjb29yZGluYXRlcywgcmV0dXJuaW5nIGEgZGVsdGFcbmZ1bmN0aW9uIGRpZmZQb2ludHMocG9pbnQxLCBwb2ludDIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiBwb2ludDEubGVmdCAtIHBvaW50Mi5sZWZ0LFxuICAgICAgICB0b3A6IHBvaW50MS50b3AgLSBwb2ludDIudG9wLFxuICAgIH07XG59XG5cbnZhciBjYW5WR3Jvd1dpdGhpbkNlbGw7XG5mdW5jdGlvbiBnZXRDYW5WR3Jvd1dpdGhpbkNlbGwoKSB7XG4gICAgaWYgKGNhblZHcm93V2l0aGluQ2VsbCA9PSBudWxsKSB7XG4gICAgICAgIGNhblZHcm93V2l0aGluQ2VsbCA9IGNvbXB1dGVDYW5WR3Jvd1dpdGhpbkNlbGwoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhblZHcm93V2l0aGluQ2VsbDtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVDYW5WR3Jvd1dpdGhpbkNlbGwoKSB7XG4gICAgLy8gZm9yIFNTUiwgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGwgaW1tZWRpYXRlbHkgYXQgdG9wLWxldmVsXG4gICAgLy8gVE9ETzoganVzdCBtYWtlIHRoaXMgbG9naWMgZXhlY3V0ZSB0b3AtbGV2ZWwsIGltbWVkaWF0ZWx5LCBpbnN0ZWFkIG9mIGRvaW5nIGxhemlseVxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgZWwuc3R5bGUudG9wID0gJzBweCc7XG4gICAgZWwuc3R5bGUubGVmdCA9ICcwcHgnO1xuICAgIGVsLmlubmVySFRNTCA9ICc8dGFibGU+PHRyPjx0ZD48ZGl2PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPic7XG4gICAgZWwucXVlcnlTZWxlY3RvcigndGFibGUnKS5zdHlsZS5oZWlnaHQgPSAnMTAwcHgnO1xuICAgIGVsLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsKTtcbiAgICB2YXIgZGl2ID0gZWwucXVlcnlTZWxlY3RvcignZGl2Jyk7XG4gICAgdmFyIHBvc3NpYmxlID0gZGl2Lm9mZnNldEhlaWdodCA+IDA7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbCk7XG4gICAgcmV0dXJuIHBvc3NpYmxlO1xufVxuXG52YXIgRU1QVFlfRVZFTlRfU1RPUkUgPSBjcmVhdGVFbXB0eUV2ZW50U3RvcmUoKTsgLy8gZm9yIHB1cmVjb21wb25lbnRzLiBUT0RPOiBrZWVwIGVsc2V3aGVyZVxudmFyIFNwbGl0dGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNwbGl0dGVyKCkge1xuICAgICAgICB0aGlzLmdldEtleXNGb3JFdmVudERlZnMgPSBtZW1vaXplKHRoaXMuX2dldEtleXNGb3JFdmVudERlZnMpO1xuICAgICAgICB0aGlzLnNwbGl0RGF0ZVNlbGVjdGlvbiA9IG1lbW9pemUodGhpcy5fc3BsaXREYXRlU3Bhbik7XG4gICAgICAgIHRoaXMuc3BsaXRFdmVudFN0b3JlID0gbWVtb2l6ZSh0aGlzLl9zcGxpdEV2ZW50U3RvcmUpO1xuICAgICAgICB0aGlzLnNwbGl0SW5kaXZpZHVhbFVpID0gbWVtb2l6ZSh0aGlzLl9zcGxpdEluZGl2aWR1YWxVaSk7XG4gICAgICAgIHRoaXMuc3BsaXRFdmVudERyYWcgPSBtZW1vaXplKHRoaXMuX3NwbGl0SW50ZXJhY3Rpb24pO1xuICAgICAgICB0aGlzLnNwbGl0RXZlbnRSZXNpemUgPSBtZW1vaXplKHRoaXMuX3NwbGl0SW50ZXJhY3Rpb24pO1xuICAgICAgICB0aGlzLmV2ZW50VWlCdWlsZGVycyA9IHt9OyAvLyBUT0RPOiB0eXBlc2NyaXB0IHByb3RlY3Rpb25cbiAgICB9XG4gICAgU3BsaXR0ZXIucHJvdG90eXBlLnNwbGl0UHJvcHMgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGtleUluZm9zID0gdGhpcy5nZXRLZXlJbmZvKHByb3BzKTtcbiAgICAgICAgdmFyIGRlZktleXMgPSB0aGlzLmdldEtleXNGb3JFdmVudERlZnMocHJvcHMuZXZlbnRTdG9yZSk7XG4gICAgICAgIHZhciBkYXRlU2VsZWN0aW9ucyA9IHRoaXMuc3BsaXREYXRlU2VsZWN0aW9uKHByb3BzLmRhdGVTZWxlY3Rpb24pO1xuICAgICAgICB2YXIgaW5kaXZpZHVhbFVpID0gdGhpcy5zcGxpdEluZGl2aWR1YWxVaShwcm9wcy5ldmVudFVpQmFzZXMsIGRlZktleXMpOyAvLyB0aGUgaW5kaXZpZHVhbCAqYmFzZXMqXG4gICAgICAgIHZhciBldmVudFN0b3JlcyA9IHRoaXMuc3BsaXRFdmVudFN0b3JlKHByb3BzLmV2ZW50U3RvcmUsIGRlZktleXMpO1xuICAgICAgICB2YXIgZXZlbnREcmFncyA9IHRoaXMuc3BsaXRFdmVudERyYWcocHJvcHMuZXZlbnREcmFnKTtcbiAgICAgICAgdmFyIGV2ZW50UmVzaXplcyA9IHRoaXMuc3BsaXRFdmVudFJlc2l6ZShwcm9wcy5ldmVudFJlc2l6ZSk7XG4gICAgICAgIHZhciBzcGxpdFByb3BzID0ge307XG4gICAgICAgIHRoaXMuZXZlbnRVaUJ1aWxkZXJzID0gbWFwSGFzaChrZXlJbmZvcywgZnVuY3Rpb24gKGluZm8sIGtleSkgeyByZXR1cm4gX3RoaXMuZXZlbnRVaUJ1aWxkZXJzW2tleV0gfHwgbWVtb2l6ZShidWlsZEV2ZW50VWlGb3JLZXkpOyB9KTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGtleUluZm9zKSB7XG4gICAgICAgICAgICB2YXIga2V5SW5mbyA9IGtleUluZm9zW2tleV07XG4gICAgICAgICAgICB2YXIgZXZlbnRTdG9yZSA9IGV2ZW50U3RvcmVzW2tleV0gfHwgRU1QVFlfRVZFTlRfU1RPUkU7XG4gICAgICAgICAgICB2YXIgYnVpbGRFdmVudFVpID0gdGhpcy5ldmVudFVpQnVpbGRlcnNba2V5XTtcbiAgICAgICAgICAgIHNwbGl0UHJvcHNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICBidXNpbmVzc0hvdXJzOiBrZXlJbmZvLmJ1c2luZXNzSG91cnMgfHwgcHJvcHMuYnVzaW5lc3NIb3VycyxcbiAgICAgICAgICAgICAgICBkYXRlU2VsZWN0aW9uOiBkYXRlU2VsZWN0aW9uc1trZXldIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogZXZlbnRTdG9yZSxcbiAgICAgICAgICAgICAgICBldmVudFVpQmFzZXM6IGJ1aWxkRXZlbnRVaShwcm9wcy5ldmVudFVpQmFzZXNbJyddLCBrZXlJbmZvLnVpLCBpbmRpdmlkdWFsVWlba2V5XSksXG4gICAgICAgICAgICAgICAgZXZlbnRTZWxlY3Rpb246IGV2ZW50U3RvcmUuaW5zdGFuY2VzW3Byb3BzLmV2ZW50U2VsZWN0aW9uXSA/IHByb3BzLmV2ZW50U2VsZWN0aW9uIDogJycsXG4gICAgICAgICAgICAgICAgZXZlbnREcmFnOiBldmVudERyYWdzW2tleV0gfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBldmVudFJlc2l6ZTogZXZlbnRSZXNpemVzW2tleV0gfHwgbnVsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNwbGl0UHJvcHM7XG4gICAgfTtcbiAgICBTcGxpdHRlci5wcm90b3R5cGUuX3NwbGl0RGF0ZVNwYW4gPSBmdW5jdGlvbiAoZGF0ZVNwYW4pIHtcbiAgICAgICAgdmFyIGRhdGVTcGFucyA9IHt9O1xuICAgICAgICBpZiAoZGF0ZVNwYW4pIHtcbiAgICAgICAgICAgIHZhciBrZXlzID0gdGhpcy5nZXRLZXlzRm9yRGF0ZVNwYW4oZGF0ZVNwYW4pO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBrZXlzXzEgPSBrZXlzOyBfaSA8IGtleXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0ga2V5c18xW19pXTtcbiAgICAgICAgICAgICAgICBkYXRlU3BhbnNba2V5XSA9IGRhdGVTcGFuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlU3BhbnM7XG4gICAgfTtcbiAgICBTcGxpdHRlci5wcm90b3R5cGUuX2dldEtleXNGb3JFdmVudERlZnMgPSBmdW5jdGlvbiAoZXZlbnRTdG9yZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbWFwSGFzaChldmVudFN0b3JlLmRlZnMsIGZ1bmN0aW9uIChldmVudERlZikgeyByZXR1cm4gX3RoaXMuZ2V0S2V5c0ZvckV2ZW50RGVmKGV2ZW50RGVmKTsgfSk7XG4gICAgfTtcbiAgICBTcGxpdHRlci5wcm90b3R5cGUuX3NwbGl0RXZlbnRTdG9yZSA9IGZ1bmN0aW9uIChldmVudFN0b3JlLCBkZWZLZXlzKSB7XG4gICAgICAgIHZhciBkZWZzID0gZXZlbnRTdG9yZS5kZWZzLCBpbnN0YW5jZXMgPSBldmVudFN0b3JlLmluc3RhbmNlcztcbiAgICAgICAgdmFyIHNwbGl0U3RvcmVzID0ge307XG4gICAgICAgIGZvciAodmFyIGRlZklkIGluIGRlZnMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBkZWZLZXlzW2RlZklkXTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gX2FbX2ldO1xuICAgICAgICAgICAgICAgIGlmICghc3BsaXRTdG9yZXNba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBzcGxpdFN0b3Jlc1trZXldID0gY3JlYXRlRW1wdHlFdmVudFN0b3JlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNwbGl0U3RvcmVzW2tleV0uZGVmc1tkZWZJZF0gPSBkZWZzW2RlZklkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpbnN0YW5jZUlkIGluIGluc3RhbmNlcykge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSAwLCBfYyA9IGRlZktleXNbaW5zdGFuY2UuZGVmSWRdOyBfYiA8IF9jLmxlbmd0aDsgX2IrKykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBfY1tfYl07XG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0U3RvcmVzW2tleV0pIHsgLy8gbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBjcmVhdGVkXG4gICAgICAgICAgICAgICAgICAgIHNwbGl0U3RvcmVzW2tleV0uaW5zdGFuY2VzW2luc3RhbmNlSWRdID0gaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcGxpdFN0b3JlcztcbiAgICB9O1xuICAgIFNwbGl0dGVyLnByb3RvdHlwZS5fc3BsaXRJbmRpdmlkdWFsVWkgPSBmdW5jdGlvbiAoZXZlbnRVaUJhc2VzLCBkZWZLZXlzKSB7XG4gICAgICAgIHZhciBzcGxpdEhhc2hlcyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBkZWZJZCBpbiBldmVudFVpQmFzZXMpIHtcbiAgICAgICAgICAgIGlmIChkZWZJZCkgeyAvLyBub3QgdGhlICcnIGtleVxuICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBkZWZLZXlzW2RlZklkXTsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IF9hW19pXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzcGxpdEhhc2hlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGxpdEhhc2hlc1trZXldID0ge307XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3BsaXRIYXNoZXNba2V5XVtkZWZJZF0gPSBldmVudFVpQmFzZXNbZGVmSWRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3BsaXRIYXNoZXM7XG4gICAgfTtcbiAgICBTcGxpdHRlci5wcm90b3R5cGUuX3NwbGl0SW50ZXJhY3Rpb24gPSBmdW5jdGlvbiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgdmFyIHNwbGl0U3RhdGVzID0ge307XG4gICAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICAgICAgdmFyIGFmZmVjdGVkU3RvcmVzXzEgPSB0aGlzLl9zcGxpdEV2ZW50U3RvcmUoaW50ZXJhY3Rpb24uYWZmZWN0ZWRFdmVudHMsIHRoaXMuX2dldEtleXNGb3JFdmVudERlZnMoaW50ZXJhY3Rpb24uYWZmZWN0ZWRFdmVudHMpKTtcbiAgICAgICAgICAgIC8vIGNhbid0IHJlbHkgb24gZGVmS2V5cyBiZWNhdXNlIGV2ZW50IGRhdGEgaXMgbXV0YXRlZFxuICAgICAgICAgICAgdmFyIG11dGF0ZWRLZXlzQnlEZWZJZCA9IHRoaXMuX2dldEtleXNGb3JFdmVudERlZnMoaW50ZXJhY3Rpb24ubXV0YXRlZEV2ZW50cyk7XG4gICAgICAgICAgICB2YXIgbXV0YXRlZFN0b3Jlc18xID0gdGhpcy5fc3BsaXRFdmVudFN0b3JlKGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHMsIG11dGF0ZWRLZXlzQnlEZWZJZCk7XG4gICAgICAgICAgICB2YXIgcG9wdWxhdGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzcGxpdFN0YXRlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHNwbGl0U3RhdGVzW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZmZlY3RlZEV2ZW50czogYWZmZWN0ZWRTdG9yZXNfMVtrZXldIHx8IEVNUFRZX0VWRU5UX1NUT1JFLFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlZEV2ZW50czogbXV0YXRlZFN0b3Jlc18xW2tleV0gfHwgRU1QVFlfRVZFTlRfU1RPUkUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0V2ZW50OiBpbnRlcmFjdGlvbi5pc0V2ZW50LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYWZmZWN0ZWRTdG9yZXNfMSkge1xuICAgICAgICAgICAgICAgIHBvcHVsYXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gbXV0YXRlZFN0b3Jlc18xKSB7XG4gICAgICAgICAgICAgICAgcG9wdWxhdGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3BsaXRTdGF0ZXM7XG4gICAgfTtcbiAgICByZXR1cm4gU3BsaXR0ZXI7XG59KCkpO1xuZnVuY3Rpb24gYnVpbGRFdmVudFVpRm9yS2V5KGFsbFVpLCBldmVudFVpRm9yS2V5LCBpbmRpdmlkdWFsVWkpIHtcbiAgICB2YXIgYmFzZVBhcnRzID0gW107XG4gICAgaWYgKGFsbFVpKSB7XG4gICAgICAgIGJhc2VQYXJ0cy5wdXNoKGFsbFVpKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50VWlGb3JLZXkpIHtcbiAgICAgICAgYmFzZVBhcnRzLnB1c2goZXZlbnRVaUZvcktleSk7XG4gICAgfVxuICAgIHZhciBzdHVmZiA9IHtcbiAgICAgICAgJyc6IGNvbWJpbmVFdmVudFVpcyhiYXNlUGFydHMpLFxuICAgIH07XG4gICAgaWYgKGluZGl2aWR1YWxVaSkge1xuICAgICAgICB0c2xpYi5fX2Fzc2lnbihzdHVmZiwgaW5kaXZpZHVhbFVpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0dWZmO1xufVxuXG5mdW5jdGlvbiBnZXREYXRlTWV0YShkYXRlLCB0b2RheVJhbmdlLCBub3dEYXRlLCBkYXRlUHJvZmlsZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRvdzogZGF0ZS5nZXRVVENEYXkoKSxcbiAgICAgICAgaXNEaXNhYmxlZDogQm9vbGVhbihkYXRlUHJvZmlsZSAmJiAhcmFuZ2VDb250YWluc01hcmtlcihkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZSwgZGF0ZSkpLFxuICAgICAgICBpc090aGVyOiBCb29sZWFuKGRhdGVQcm9maWxlICYmICFyYW5nZUNvbnRhaW5zTWFya2VyKGRhdGVQcm9maWxlLmN1cnJlbnRSYW5nZSwgZGF0ZSkpLFxuICAgICAgICBpc1RvZGF5OiBCb29sZWFuKHRvZGF5UmFuZ2UgJiYgcmFuZ2VDb250YWluc01hcmtlcih0b2RheVJhbmdlLCBkYXRlKSksXG4gICAgICAgIGlzUGFzdDogQm9vbGVhbihub3dEYXRlID8gKGRhdGUgPCBub3dEYXRlKSA6IHRvZGF5UmFuZ2UgPyAoZGF0ZSA8IHRvZGF5UmFuZ2Uuc3RhcnQpIDogZmFsc2UpLFxuICAgICAgICBpc0Z1dHVyZTogQm9vbGVhbihub3dEYXRlID8gKGRhdGUgPiBub3dEYXRlKSA6IHRvZGF5UmFuZ2UgPyAoZGF0ZSA+PSB0b2RheVJhbmdlLmVuZCkgOiBmYWxzZSksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldERheUNsYXNzTmFtZXMobWV0YSwgdGhlbWUpIHtcbiAgICB2YXIgY2xhc3NOYW1lcyA9IFtcbiAgICAgICAgJ2ZjLWRheScsXG4gICAgICAgIFwiZmMtZGF5LVwiICsgREFZX0lEU1ttZXRhLmRvd10sXG4gICAgXTtcbiAgICBpZiAobWV0YS5pc0Rpc2FibGVkKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZGF5LWRpc2FibGVkJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAobWV0YS5pc1RvZGF5KSB7XG4gICAgICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLWRheS10b2RheScpO1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKHRoZW1lLmdldENsYXNzKCd0b2RheScpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YS5pc1Bhc3QpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZGF5LXBhc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YS5pc0Z1dHVyZSkge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1kYXktZnV0dXJlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGEuaXNPdGhlcikge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1kYXktb3RoZXInKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xhc3NOYW1lcztcbn1cbmZ1bmN0aW9uIGdldFNsb3RDbGFzc05hbWVzKG1ldGEsIHRoZW1lKSB7XG4gICAgdmFyIGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICdmYy1zbG90JyxcbiAgICAgICAgXCJmYy1zbG90LVwiICsgREFZX0lEU1ttZXRhLmRvd10sXG4gICAgXTtcbiAgICBpZiAobWV0YS5pc0Rpc2FibGVkKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtc2xvdC1kaXNhYmxlZCcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKG1ldGEuaXNUb2RheSkge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1zbG90LXRvZGF5Jyk7XG4gICAgICAgICAgICBjbGFzc05hbWVzLnB1c2godGhlbWUuZ2V0Q2xhc3MoJ3RvZGF5JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhLmlzUGFzdCkge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1zbG90LXBhc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YS5pc0Z1dHVyZSkge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1zbG90LWZ1dHVyZScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWVzO1xufVxuXG52YXIgREFZX0ZPUk1BVCA9IGNyZWF0ZUZvcm1hdHRlcih7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJywgZGF5OiAnbnVtZXJpYycgfSk7XG52YXIgV0VFS19GT1JNQVQgPSBjcmVhdGVGb3JtYXR0ZXIoeyB3ZWVrOiAnbG9uZycgfSk7XG5mdW5jdGlvbiBidWlsZE5hdkxpbmtBdHRycyhjb250ZXh0LCBkYXRlTWFya2VyLCB2aWV3VHlwZSwgaXNUYWJiYWJsZSkge1xuICAgIGlmICh2aWV3VHlwZSA9PT0gdm9pZCAwKSB7IHZpZXdUeXBlID0gJ2RheSc7IH1cbiAgICBpZiAoaXNUYWJiYWJsZSA9PT0gdm9pZCAwKSB7IGlzVGFiYmFibGUgPSB0cnVlOyB9XG4gICAgdmFyIGRhdGVFbnYgPSBjb250ZXh0LmRhdGVFbnYsIG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnMsIGNhbGVuZGFyQXBpID0gY29udGV4dC5jYWxlbmRhckFwaTtcbiAgICB2YXIgZGF0ZVN0ciA9IGRhdGVFbnYuZm9ybWF0KGRhdGVNYXJrZXIsIHZpZXdUeXBlID09PSAnd2VlaycgPyBXRUVLX0ZPUk1BVCA6IERBWV9GT1JNQVQpO1xuICAgIGlmIChvcHRpb25zLm5hdkxpbmtzKSB7XG4gICAgICAgIHZhciB6b25lZERhdGUgPSBkYXRlRW52LnRvRGF0ZShkYXRlTWFya2VyKTtcbiAgICAgICAgdmFyIGhhbmRsZUludGVyYWN0aW9uID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgY3VzdG9tQWN0aW9uID0gdmlld1R5cGUgPT09ICdkYXknID8gb3B0aW9ucy5uYXZMaW5rRGF5Q2xpY2sgOlxuICAgICAgICAgICAgICAgIHZpZXdUeXBlID09PSAnd2VlaycgPyBvcHRpb25zLm5hdkxpbmtXZWVrQ2xpY2sgOiBudWxsO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXN0b21BY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb24uY2FsbChjYWxlbmRhckFwaSwgZGF0ZUVudi50b0RhdGUoZGF0ZU1hcmtlciksIGV2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VzdG9tQWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB2aWV3VHlwZSA9IGN1c3RvbUFjdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsZW5kYXJBcGkuem9vbVRvKGRhdGVNYXJrZXIsIHZpZXdUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRzbGliLl9fYXNzaWduKHsgdGl0bGU6IGZvcm1hdFdpdGhPcmRpbmFscyhvcHRpb25zLm5hdkxpbmtIaW50LCBbZGF0ZVN0ciwgem9uZWREYXRlXSwgZGF0ZVN0ciksICdkYXRhLW5hdmxpbmsnOiAnJyB9LCAoaXNUYWJiYWJsZVxuICAgICAgICAgICAgPyBjcmVhdGVBcmlhQ2xpY2tBdHRycyhoYW5kbGVJbnRlcmFjdGlvbilcbiAgICAgICAgICAgIDogeyBvbkNsaWNrOiBoYW5kbGVJbnRlcmFjdGlvbiB9KSk7XG4gICAgfVxuICAgIHJldHVybiB7ICdhcmlhLWxhYmVsJzogZGF0ZVN0ciB9O1xufVxuXG52YXIgX2lzUnRsU2Nyb2xsYmFyT25MZWZ0ID0gbnVsbDtcbmZ1bmN0aW9uIGdldElzUnRsU2Nyb2xsYmFyT25MZWZ0KCkge1xuICAgIGlmIChfaXNSdGxTY3JvbGxiYXJPbkxlZnQgPT09IG51bGwpIHtcbiAgICAgICAgX2lzUnRsU2Nyb2xsYmFyT25MZWZ0ID0gY29tcHV0ZUlzUnRsU2Nyb2xsYmFyT25MZWZ0KCk7XG4gICAgfVxuICAgIHJldHVybiBfaXNSdGxTY3JvbGxiYXJPbkxlZnQ7XG59XG5mdW5jdGlvbiBjb21wdXRlSXNSdGxTY3JvbGxiYXJPbkxlZnQoKSB7XG4gICAgdmFyIG91dGVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBhcHBseVN0eWxlKG91dGVyRWwsIHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogLTEwMDAsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIGJvcmRlcjogMCxcbiAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgb3ZlcmZsb3c6ICdzY3JvbGwnLFxuICAgICAgICBkaXJlY3Rpb246ICdydGwnLFxuICAgIH0pO1xuICAgIG91dGVyRWwuaW5uZXJIVE1MID0gJzxkaXY+PC9kaXY+JztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG91dGVyRWwpO1xuICAgIHZhciBpbm5lckVsID0gb3V0ZXJFbC5maXJzdENoaWxkO1xuICAgIHZhciByZXMgPSBpbm5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgPiBvdXRlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgcmVtb3ZlRWxlbWVudChvdXRlckVsKTtcbiAgICByZXR1cm4gcmVzO1xufVxuXG52YXIgX3Njcm9sbGJhcldpZHRocztcbmZ1bmN0aW9uIGdldFNjcm9sbGJhcldpZHRocygpIHtcbiAgICBpZiAoIV9zY3JvbGxiYXJXaWR0aHMpIHtcbiAgICAgICAgX3Njcm9sbGJhcldpZHRocyA9IGNvbXB1dGVTY3JvbGxiYXJXaWR0aHMoKTtcbiAgICB9XG4gICAgcmV0dXJuIF9zY3JvbGxiYXJXaWR0aHM7XG59XG5mdW5jdGlvbiBjb21wdXRlU2Nyb2xsYmFyV2lkdGhzKCkge1xuICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsLnN0eWxlLm92ZXJmbG93ID0gJ3Njcm9sbCc7XG4gICAgZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGVsLnN0eWxlLnRvcCA9ICctOTk5OXB4JztcbiAgICBlbC5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIHZhciByZXMgPSBjb21wdXRlU2Nyb2xsYmFyV2lkdGhzRm9yRWwoZWwpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIHJldHVybiByZXM7XG59XG4vLyBXQVJOSU5HOiB3aWxsIGluY2x1ZGUgYm9yZGVyXG5mdW5jdGlvbiBjb21wdXRlU2Nyb2xsYmFyV2lkdGhzRm9yRWwoZWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBlbC5vZmZzZXRIZWlnaHQgLSBlbC5jbGllbnRIZWlnaHQsXG4gICAgICAgIHk6IGVsLm9mZnNldFdpZHRoIC0gZWwuY2xpZW50V2lkdGgsXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUVkZ2VzKGVsLCBnZXRQYWRkaW5nKSB7XG4gICAgaWYgKGdldFBhZGRpbmcgPT09IHZvaWQgMCkgeyBnZXRQYWRkaW5nID0gZmFsc2U7IH1cbiAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTtcbiAgICB2YXIgYm9yZGVyTGVmdCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoLCAxMCkgfHwgMDtcbiAgICB2YXIgYm9yZGVyUmlnaHQgPSBwYXJzZUludChjb21wdXRlZFN0eWxlLmJvcmRlclJpZ2h0V2lkdGgsIDEwKSB8fCAwO1xuICAgIHZhciBib3JkZXJUb3AgPSBwYXJzZUludChjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoLCAxMCkgfHwgMDtcbiAgICB2YXIgYm9yZGVyQm90dG9tID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5ib3JkZXJCb3R0b21XaWR0aCwgMTApIHx8IDA7XG4gICAgdmFyIGJhZFNjcm9sbGJhcldpZHRocyA9IGNvbXB1dGVTY3JvbGxiYXJXaWR0aHNGb3JFbChlbCk7IC8vIGluY2x1ZGVzIGJvcmRlciFcbiAgICB2YXIgc2Nyb2xsYmFyTGVmdFJpZ2h0ID0gYmFkU2Nyb2xsYmFyV2lkdGhzLnkgLSBib3JkZXJMZWZ0IC0gYm9yZGVyUmlnaHQ7XG4gICAgdmFyIHNjcm9sbGJhckJvdHRvbSA9IGJhZFNjcm9sbGJhcldpZHRocy54IC0gYm9yZGVyVG9wIC0gYm9yZGVyQm90dG9tO1xuICAgIHZhciByZXMgPSB7XG4gICAgICAgIGJvcmRlckxlZnQ6IGJvcmRlckxlZnQsXG4gICAgICAgIGJvcmRlclJpZ2h0OiBib3JkZXJSaWdodCxcbiAgICAgICAgYm9yZGVyVG9wOiBib3JkZXJUb3AsXG4gICAgICAgIGJvcmRlckJvdHRvbTogYm9yZGVyQm90dG9tLFxuICAgICAgICBzY3JvbGxiYXJCb3R0b206IHNjcm9sbGJhckJvdHRvbSxcbiAgICAgICAgc2Nyb2xsYmFyTGVmdDogMCxcbiAgICAgICAgc2Nyb2xsYmFyUmlnaHQ6IDAsXG4gICAgfTtcbiAgICBpZiAoZ2V0SXNSdGxTY3JvbGxiYXJPbkxlZnQoKSAmJiBjb21wdXRlZFN0eWxlLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHsgLy8gaXMgdGhlIHNjcm9sbGJhciBvbiB0aGUgbGVmdCBzaWRlP1xuICAgICAgICByZXMuc2Nyb2xsYmFyTGVmdCA9IHNjcm9sbGJhckxlZnRSaWdodDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlcy5zY3JvbGxiYXJSaWdodCA9IHNjcm9sbGJhckxlZnRSaWdodDtcbiAgICB9XG4gICAgaWYgKGdldFBhZGRpbmcpIHtcbiAgICAgICAgcmVzLnBhZGRpbmdMZWZ0ID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nTGVmdCwgMTApIHx8IDA7XG4gICAgICAgIHJlcy5wYWRkaW5nUmlnaHQgPSBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdSaWdodCwgMTApIHx8IDA7XG4gICAgICAgIHJlcy5wYWRkaW5nVG9wID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nVG9wLCAxMCkgfHwgMDtcbiAgICAgICAgcmVzLnBhZGRpbmdCb3R0b20gPSBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdCb3R0b20sIDEwKSB8fCAwO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gY29tcHV0ZUlubmVyUmVjdChlbCwgZ29XaXRoaW5QYWRkaW5nLCBkb0Zyb21XaW5kb3dWaWV3cG9ydCkge1xuICAgIGlmIChnb1dpdGhpblBhZGRpbmcgPT09IHZvaWQgMCkgeyBnb1dpdGhpblBhZGRpbmcgPSBmYWxzZTsgfVxuICAgIHZhciBvdXRlclJlY3QgPSBkb0Zyb21XaW5kb3dWaWV3cG9ydCA/IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogY29tcHV0ZVJlY3QoZWwpO1xuICAgIHZhciBlZGdlcyA9IGNvbXB1dGVFZGdlcyhlbCwgZ29XaXRoaW5QYWRkaW5nKTtcbiAgICB2YXIgcmVzID0ge1xuICAgICAgICBsZWZ0OiBvdXRlclJlY3QubGVmdCArIGVkZ2VzLmJvcmRlckxlZnQgKyBlZGdlcy5zY3JvbGxiYXJMZWZ0LFxuICAgICAgICByaWdodDogb3V0ZXJSZWN0LnJpZ2h0IC0gZWRnZXMuYm9yZGVyUmlnaHQgLSBlZGdlcy5zY3JvbGxiYXJSaWdodCxcbiAgICAgICAgdG9wOiBvdXRlclJlY3QudG9wICsgZWRnZXMuYm9yZGVyVG9wLFxuICAgICAgICBib3R0b206IG91dGVyUmVjdC5ib3R0b20gLSBlZGdlcy5ib3JkZXJCb3R0b20gLSBlZGdlcy5zY3JvbGxiYXJCb3R0b20sXG4gICAgfTtcbiAgICBpZiAoZ29XaXRoaW5QYWRkaW5nKSB7XG4gICAgICAgIHJlcy5sZWZ0ICs9IGVkZ2VzLnBhZGRpbmdMZWZ0O1xuICAgICAgICByZXMucmlnaHQgLT0gZWRnZXMucGFkZGluZ1JpZ2h0O1xuICAgICAgICByZXMudG9wICs9IGVkZ2VzLnBhZGRpbmdUb3A7XG4gICAgICAgIHJlcy5ib3R0b20gLT0gZWRnZXMucGFkZGluZ0JvdHRvbTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGNvbXB1dGVSZWN0KGVsKSB7XG4gICAgdmFyIHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiByZWN0LmxlZnQgKyB3aW5kb3cucGFnZVhPZmZzZXQsXG4gICAgICAgIHRvcDogcmVjdC50b3AgKyB3aW5kb3cucGFnZVlPZmZzZXQsXG4gICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0ICsgd2luZG93LnBhZ2VYT2Zmc2V0LFxuICAgICAgICBib3R0b206IHJlY3QuYm90dG9tICsgd2luZG93LnBhZ2VZT2Zmc2V0LFxuICAgIH07XG59XG5mdW5jdGlvbiBjb21wdXRlQ2xpcHBlZENsaWVudFJlY3QoZWwpIHtcbiAgICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsKTtcbiAgICB2YXIgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGZvciAodmFyIF9pID0gMCwgY2xpcHBpbmdQYXJlbnRzXzEgPSBjbGlwcGluZ1BhcmVudHM7IF9pIDwgY2xpcHBpbmdQYXJlbnRzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBjbGlwcGluZ1BhcmVudCA9IGNsaXBwaW5nUGFyZW50c18xW19pXTtcbiAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGludGVyc2VjdFJlY3RzKHJlY3QsIGNsaXBwaW5nUGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICAgICAgaWYgKGludGVyc2VjdGlvbikge1xuICAgICAgICAgICAgcmVjdCA9IGludGVyc2VjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZWN0O1xufVxuZnVuY3Rpb24gY29tcHV0ZUhlaWdodEFuZE1hcmdpbnMoZWwpIHtcbiAgICByZXR1cm4gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICsgY29tcHV0ZVZNYXJnaW5zKGVsKTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVWTWFyZ2lucyhlbCkge1xuICAgIHZhciBjb21wdXRlZCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTtcbiAgICByZXR1cm4gcGFyc2VJbnQoY29tcHV0ZWQubWFyZ2luVG9wLCAxMCkgK1xuICAgICAgICBwYXJzZUludChjb21wdXRlZC5tYXJnaW5Cb3R0b20sIDEwKTtcbn1cbi8vIGRvZXMgbm90IHJldHVybiB3aW5kb3dcbmZ1bmN0aW9uIGdldENsaXBwaW5nUGFyZW50cyhlbCkge1xuICAgIHZhciBwYXJlbnRzID0gW107XG4gICAgd2hpbGUgKGVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHsgLy8gd2lsbCBzdG9wIHdoZW4gZ2V0cyB0byBkb2N1bWVudCBvciBudWxsXG4gICAgICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpO1xuICAgICAgICBpZiAoY29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCgvKGF1dG98c2Nyb2xsKS8pLnRlc3QoY29tcHV0ZWRTdHlsZS5vdmVyZmxvdyArIGNvbXB1dGVkU3R5bGUub3ZlcmZsb3dZICsgY29tcHV0ZWRTdHlsZS5vdmVyZmxvd1gpKSB7XG4gICAgICAgICAgICBwYXJlbnRzLnB1c2goZWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsID0gZWwucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmVudHM7XG59XG5cbi8vIGdpdmVuIGEgZnVuY3Rpb24gdGhhdCByZXNvbHZlcyBhIHJlc3VsdCBhc3luY2hyb25vdXNseS5cbi8vIHRoZSBmdW5jdGlvbiBjYW4gZWl0aGVyIGNhbGwgcGFzc2VkLWluIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgY2FsbGJhY2tzLFxuLy8gb3IgaXQgY2FuIHJldHVybiBhIHByb21pc2UuXG4vLyBpZiB5b3UgbmVlZCB0byBwYXNzIGFkZGl0aW9uYWwgcGFyYW1zIHRvIGZ1bmMsIGJpbmQgdGhlbSBmaXJzdC5cbmZ1bmN0aW9uIHVucHJvbWlzaWZ5KGZ1bmMsIHN1Y2Nlc3MsIGZhaWx1cmUpIHtcbiAgICAvLyBndWFyZCBhZ2FpbnN0IHN1Y2Nlc3MvZmFpbHVyZSBjYWxsYmFja3MgYmVpbmcgY2FsbGVkIG1vcmUgdGhhbiBvbmNlXG4gICAgLy8gYW5kIGd1YXJkIGFnYWluc3QgYSBwcm9taXNlIEFORCBjYWxsYmFjayBiZWluZyB1c2VkIHRvZ2V0aGVyLlxuICAgIHZhciBpc1Jlc29sdmVkID0gZmFsc2U7XG4gICAgdmFyIHdyYXBwZWRTdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIWlzUmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIGlzUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgc3VjY2Vzcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgICAgICB9XG4gICAgfTtcbiAgICB2YXIgd3JhcHBlZEZhaWx1cmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghaXNSZXNvbHZlZCkge1xuICAgICAgICAgICAgaXNSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZmFpbHVyZSkge1xuICAgICAgICAgICAgICAgIGZhaWx1cmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgdmFyIHJlcyA9IGZ1bmMod3JhcHBlZFN1Y2Nlc3MsIHdyYXBwZWRGYWlsdXJlKTtcbiAgICBpZiAocmVzICYmIHR5cGVvZiByZXMudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXMudGhlbih3cmFwcGVkU3VjY2Vzcywgd3JhcHBlZEZhaWx1cmUpO1xuICAgIH1cbn1cblxudmFyIEVtaXR0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRW1pdHRlcigpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgICAgICB0aGlzLnRoaXNDb250ZXh0ID0gbnVsbDtcbiAgICB9XG4gICAgRW1pdHRlci5wcm90b3R5cGUuc2V0VGhpc0NvbnRleHQgPSBmdW5jdGlvbiAodGhpc0NvbnRleHQpIHtcbiAgICAgICAgdGhpcy50aGlzQ29udGV4dCA9IHRoaXNDb250ZXh0O1xuICAgIH07XG4gICAgRW1pdHRlci5wcm90b3R5cGUuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfTtcbiAgICBFbWl0dGVyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uICh0eXBlLCBoYW5kbGVyKSB7XG4gICAgICAgIGFkZFRvSGFzaCh0aGlzLmhhbmRsZXJzLCB0eXBlLCBoYW5kbGVyKTtcbiAgICB9O1xuICAgIEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uICh0eXBlLCBoYW5kbGVyKSB7XG4gICAgICAgIHJlbW92ZUZyb21IYXNoKHRoaXMuaGFuZGxlcnMsIHR5cGUsIGhhbmRsZXIpO1xuICAgIH07XG4gICAgRW1pdHRlci5wcm90b3R5cGUudHJpZ2dlciA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhdHRhY2hlZEhhbmRsZXJzID0gdGhpcy5oYW5kbGVyc1t0eXBlXSB8fCBbXTtcbiAgICAgICAgdmFyIG9wdGlvbkhhbmRsZXIgPSB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zW3R5cGVdO1xuICAgICAgICB2YXIgaGFuZGxlcnMgPSBbXS5jb25jYXQob3B0aW9uSGFuZGxlciB8fCBbXSwgYXR0YWNoZWRIYW5kbGVycyk7XG4gICAgICAgIGZvciAodmFyIF9hID0gMCwgaGFuZGxlcnNfMSA9IGhhbmRsZXJzOyBfYSA8IGhhbmRsZXJzXzEubGVuZ3RoOyBfYSsrKSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJzXzFbX2FdO1xuICAgICAgICAgICAgaGFuZGxlci5hcHBseSh0aGlzLnRoaXNDb250ZXh0LCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRW1pdHRlci5wcm90b3R5cGUuaGFzSGFuZGxlcnMgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbigodGhpcy5oYW5kbGVyc1t0eXBlXSAmJiB0aGlzLmhhbmRsZXJzW3R5cGVdLmxlbmd0aCkgfHxcbiAgICAgICAgICAgICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zW3R5cGVdKSk7XG4gICAgfTtcbiAgICByZXR1cm4gRW1pdHRlcjtcbn0oKSk7XG5mdW5jdGlvbiBhZGRUb0hhc2goaGFzaCwgdHlwZSwgaGFuZGxlcikge1xuICAgIChoYXNoW3R5cGVdIHx8IChoYXNoW3R5cGVdID0gW10pKVxuICAgICAgICAucHVzaChoYW5kbGVyKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUZyb21IYXNoKGhhc2gsIHR5cGUsIGhhbmRsZXIpIHtcbiAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICBpZiAoaGFzaFt0eXBlXSkge1xuICAgICAgICAgICAgaGFzaFt0eXBlXSA9IGhhc2hbdHlwZV0uZmlsdGVyKGZ1bmN0aW9uIChmdW5jKSB7IHJldHVybiBmdW5jICE9PSBoYW5kbGVyOyB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGhhc2hbdHlwZV07IC8vIHJlbW92ZSBhbGwgaGFuZGxlciBmdW5jcyBmb3IgdGhpcyB0eXBlXG4gICAgfVxufVxuXG4vKlxuUmVjb3JkcyBvZmZzZXQgaW5mb3JtYXRpb24gZm9yIGEgc2V0IG9mIGVsZW1lbnRzLCByZWxhdGl2ZSB0byBhbiBvcmlnaW4gZWxlbWVudC5cbkNhbiByZWNvcmQgdGhlIGxlZnQvcmlnaHQgT1IgdGhlIHRvcC9ib3R0b20gT1IgYm90aC5cblByb3ZpZGVzIG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIHRoZSBjYWNoZSBieSBwb3NpdGlvbi5cbiovXG52YXIgUG9zaXRpb25DYWNoZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQb3NpdGlvbkNhY2hlKG9yaWdpbkVsLCBlbHMsIGlzSG9yaXpvbnRhbCwgaXNWZXJ0aWNhbCkge1xuICAgICAgICB0aGlzLmVscyA9IGVscztcbiAgICAgICAgdmFyIG9yaWdpbkNsaWVudFJlY3QgPSB0aGlzLm9yaWdpbkNsaWVudFJlY3QgPSBvcmlnaW5FbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgLy8gcmVsYXRpdmUgdG8gdmlld3BvcnQgdG9wLWxlZnRcbiAgICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgdGhpcy5idWlsZEVsSG9yaXpvbnRhbHMob3JpZ2luQ2xpZW50UmVjdC5sZWZ0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNWZXJ0aWNhbCkge1xuICAgICAgICAgICAgdGhpcy5idWlsZEVsVmVydGljYWxzKG9yaWdpbkNsaWVudFJlY3QudG9wKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBQb3B1bGF0ZXMgdGhlIGxlZnQvcmlnaHQgaW50ZXJuYWwgY29vcmRpbmF0ZSBhcnJheXNcbiAgICBQb3NpdGlvbkNhY2hlLnByb3RvdHlwZS5idWlsZEVsSG9yaXpvbnRhbHMgPSBmdW5jdGlvbiAob3JpZ2luQ2xpZW50TGVmdCkge1xuICAgICAgICB2YXIgbGVmdHMgPSBbXTtcbiAgICAgICAgdmFyIHJpZ2h0cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGhpcy5lbHM7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgZWwgPSBfYVtfaV07XG4gICAgICAgICAgICB2YXIgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgbGVmdHMucHVzaChyZWN0LmxlZnQgLSBvcmlnaW5DbGllbnRMZWZ0KTtcbiAgICAgICAgICAgIHJpZ2h0cy5wdXNoKHJlY3QucmlnaHQgLSBvcmlnaW5DbGllbnRMZWZ0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxlZnRzID0gbGVmdHM7XG4gICAgICAgIHRoaXMucmlnaHRzID0gcmlnaHRzO1xuICAgIH07XG4gICAgLy8gUG9wdWxhdGVzIHRoZSB0b3AvYm90dG9tIGludGVybmFsIGNvb3JkaW5hdGUgYXJyYXlzXG4gICAgUG9zaXRpb25DYWNoZS5wcm90b3R5cGUuYnVpbGRFbFZlcnRpY2FscyA9IGZ1bmN0aW9uIChvcmlnaW5DbGllbnRUb3ApIHtcbiAgICAgICAgdmFyIHRvcHMgPSBbXTtcbiAgICAgICAgdmFyIGJvdHRvbXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMuZWxzOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIGVsID0gX2FbX2ldO1xuICAgICAgICAgICAgdmFyIHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHRvcHMucHVzaChyZWN0LnRvcCAtIG9yaWdpbkNsaWVudFRvcCk7XG4gICAgICAgICAgICBib3R0b21zLnB1c2gocmVjdC5ib3R0b20gLSBvcmlnaW5DbGllbnRUb3ApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9wcyA9IHRvcHM7XG4gICAgICAgIHRoaXMuYm90dG9tcyA9IGJvdHRvbXM7XG4gICAgfTtcbiAgICAvLyBHaXZlbiBhIGxlZnQgb2Zmc2V0IChmcm9tIGRvY3VtZW50IGxlZnQpLCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZWwgdGhhdCBpdCBob3Jpem9udGFsbHkgaW50ZXJzZWN0cy5cbiAgICAvLyBJZiBubyBpbnRlcnNlY3Rpb24gaXMgbWFkZSwgcmV0dXJucyB1bmRlZmluZWQuXG4gICAgUG9zaXRpb25DYWNoZS5wcm90b3R5cGUubGVmdFRvSW5kZXggPSBmdW5jdGlvbiAobGVmdFBvc2l0aW9uKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIGxlZnRzID0gX2EubGVmdHMsIHJpZ2h0cyA9IF9hLnJpZ2h0cztcbiAgICAgICAgdmFyIGxlbiA9IGxlZnRzLmxlbmd0aDtcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKGxlZnRQb3NpdGlvbiA+PSBsZWZ0c1tpXSAmJiBsZWZ0UG9zaXRpb24gPCByaWdodHNbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBUT0RPOiBiZXR0ZXJcbiAgICB9O1xuICAgIC8vIEdpdmVuIGEgdG9wIG9mZnNldCAoZnJvbSBkb2N1bWVudCB0b3ApLCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZWwgdGhhdCBpdCB2ZXJ0aWNhbGx5IGludGVyc2VjdHMuXG4gICAgLy8gSWYgbm8gaW50ZXJzZWN0aW9uIGlzIG1hZGUsIHJldHVybnMgdW5kZWZpbmVkLlxuICAgIFBvc2l0aW9uQ2FjaGUucHJvdG90eXBlLnRvcFRvSW5kZXggPSBmdW5jdGlvbiAodG9wUG9zaXRpb24pIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgdG9wcyA9IF9hLnRvcHMsIGJvdHRvbXMgPSBfYS5ib3R0b21zO1xuICAgICAgICB2YXIgbGVuID0gdG9wcy5sZW5ndGg7XG4gICAgICAgIHZhciBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmICh0b3BQb3NpdGlvbiA+PSB0b3BzW2ldICYmIHRvcFBvc2l0aW9uIDwgYm90dG9tc1tpXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIFRPRE86IGJldHRlclxuICAgIH07XG4gICAgLy8gR2V0cyB0aGUgd2lkdGggb2YgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4XG4gICAgUG9zaXRpb25DYWNoZS5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbiAobGVmdEluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJpZ2h0c1tsZWZ0SW5kZXhdIC0gdGhpcy5sZWZ0c1tsZWZ0SW5kZXhdO1xuICAgIH07XG4gICAgLy8gR2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleFxuICAgIFBvc2l0aW9uQ2FjaGUucHJvdG90eXBlLmdldEhlaWdodCA9IGZ1bmN0aW9uICh0b3BJbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ib3R0b21zW3RvcEluZGV4XSAtIHRoaXMudG9wc1t0b3BJbmRleF07XG4gICAgfTtcbiAgICByZXR1cm4gUG9zaXRpb25DYWNoZTtcbn0oKSk7XG5cbi8qIGVzbGludCBtYXgtY2xhc3Nlcy1wZXItZmlsZTogXCJvZmZcIiAqL1xuLypcbkFuIG9iamVjdCBmb3IgZ2V0dGluZy9zZXR0aW5nIHNjcm9sbC1yZWxhdGVkIGluZm9ybWF0aW9uIGZvciBhbiBlbGVtZW50LlxuSW50ZXJuYWxseSwgdGhpcyBpcyBkb25lIHZlcnkgZGlmZmVyZW50bHkgZm9yIHdpbmRvdyB2ZXJzdXMgRE9NIGVsZW1lbnQsXG5zbyB0aGlzIG9iamVjdCBzZXJ2ZXMgYXMgYSBjb21tb24gaW50ZXJmYWNlLlxuKi9cbnZhciBTY3JvbGxDb250cm9sbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNjcm9sbENvbnRyb2xsZXIoKSB7XG4gICAgfVxuICAgIFNjcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmdldE1heFNjcm9sbFRvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2Nyb2xsSGVpZ2h0KCkgLSB0aGlzLmdldENsaWVudEhlaWdodCgpO1xuICAgIH07XG4gICAgU2Nyb2xsQ29udHJvbGxlci5wcm90b3R5cGUuZ2V0TWF4U2Nyb2xsTGVmdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2Nyb2xsV2lkdGgoKSAtIHRoaXMuZ2V0Q2xpZW50V2lkdGgoKTtcbiAgICB9O1xuICAgIFNjcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmNhblNjcm9sbFZlcnRpY2FsbHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE1heFNjcm9sbFRvcCgpID4gMDtcbiAgICB9O1xuICAgIFNjcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmNhblNjcm9sbEhvcml6b250YWxseSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWF4U2Nyb2xsTGVmdCgpID4gMDtcbiAgICB9O1xuICAgIFNjcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmNhblNjcm9sbFVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTY3JvbGxUb3AoKSA+IDA7XG4gICAgfTtcbiAgICBTY3JvbGxDb250cm9sbGVyLnByb3RvdHlwZS5jYW5TY3JvbGxEb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTY3JvbGxUb3AoKSA8IHRoaXMuZ2V0TWF4U2Nyb2xsVG9wKCk7XG4gICAgfTtcbiAgICBTY3JvbGxDb250cm9sbGVyLnByb3RvdHlwZS5jYW5TY3JvbGxMZWZ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTY3JvbGxMZWZ0KCkgPiAwO1xuICAgIH07XG4gICAgU2Nyb2xsQ29udHJvbGxlci5wcm90b3R5cGUuY2FuU2Nyb2xsUmlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNjcm9sbExlZnQoKSA8IHRoaXMuZ2V0TWF4U2Nyb2xsTGVmdCgpO1xuICAgIH07XG4gICAgcmV0dXJuIFNjcm9sbENvbnRyb2xsZXI7XG59KCkpO1xudmFyIEVsZW1lbnRTY3JvbGxDb250cm9sbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhFbGVtZW50U2Nyb2xsQ29udHJvbGxlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFbGVtZW50U2Nyb2xsQ29udHJvbGxlcihlbCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5lbCA9IGVsO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEVsZW1lbnRTY3JvbGxDb250cm9sbGVyLnByb3RvdHlwZS5nZXRTY3JvbGxUb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsLnNjcm9sbFRvcDtcbiAgICB9O1xuICAgIEVsZW1lbnRTY3JvbGxDb250cm9sbGVyLnByb3RvdHlwZS5nZXRTY3JvbGxMZWZ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbC5zY3JvbGxMZWZ0O1xuICAgIH07XG4gICAgRWxlbWVudFNjcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLnNldFNjcm9sbFRvcCA9IGZ1bmN0aW9uICh0b3ApIHtcbiAgICAgICAgdGhpcy5lbC5zY3JvbGxUb3AgPSB0b3A7XG4gICAgfTtcbiAgICBFbGVtZW50U2Nyb2xsQ29udHJvbGxlci5wcm90b3R5cGUuc2V0U2Nyb2xsTGVmdCA9IGZ1bmN0aW9uIChsZWZ0KSB7XG4gICAgICAgIHRoaXMuZWwuc2Nyb2xsTGVmdCA9IGxlZnQ7XG4gICAgfTtcbiAgICBFbGVtZW50U2Nyb2xsQ29udHJvbGxlci5wcm90b3R5cGUuZ2V0U2Nyb2xsV2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsLnNjcm9sbFdpZHRoO1xuICAgIH07XG4gICAgRWxlbWVudFNjcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmdldFNjcm9sbEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWwuc2Nyb2xsSGVpZ2h0O1xuICAgIH07XG4gICAgRWxlbWVudFNjcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmdldENsaWVudEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWwuY2xpZW50SGVpZ2h0O1xuICAgIH07XG4gICAgRWxlbWVudFNjcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmdldENsaWVudFdpZHRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbC5jbGllbnRXaWR0aDtcbiAgICB9O1xuICAgIHJldHVybiBFbGVtZW50U2Nyb2xsQ29udHJvbGxlcjtcbn0oU2Nyb2xsQ29udHJvbGxlcikpO1xudmFyIFdpbmRvd1Njcm9sbENvbnRyb2xsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFdpbmRvd1Njcm9sbENvbnRyb2xsZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gV2luZG93U2Nyb2xsQ29udHJvbGxlcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBXaW5kb3dTY3JvbGxDb250cm9sbGVyLnByb3RvdHlwZS5nZXRTY3JvbGxUb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gICAgfTtcbiAgICBXaW5kb3dTY3JvbGxDb250cm9sbGVyLnByb3RvdHlwZS5nZXRTY3JvbGxMZWZ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LnBhZ2VYT2Zmc2V0O1xuICAgIH07XG4gICAgV2luZG93U2Nyb2xsQ29udHJvbGxlci5wcm90b3R5cGUuc2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgd2luZG93LnNjcm9sbCh3aW5kb3cucGFnZVhPZmZzZXQsIG4pO1xuICAgIH07XG4gICAgV2luZG93U2Nyb2xsQ29udHJvbGxlci5wcm90b3R5cGUuc2V0U2Nyb2xsTGVmdCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGwobiwgd2luZG93LnBhZ2VZT2Zmc2V0KTtcbiAgICB9O1xuICAgIFdpbmRvd1Njcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmdldFNjcm9sbFdpZHRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgIH07XG4gICAgV2luZG93U2Nyb2xsQ29udHJvbGxlci5wcm90b3R5cGUuZ2V0U2Nyb2xsSGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICB9O1xuICAgIFdpbmRvd1Njcm9sbENvbnRyb2xsZXIucHJvdG90eXBlLmdldENsaWVudEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgfTtcbiAgICBXaW5kb3dTY3JvbGxDb250cm9sbGVyLnByb3RvdHlwZS5nZXRDbGllbnRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICB9O1xuICAgIHJldHVybiBXaW5kb3dTY3JvbGxDb250cm9sbGVyO1xufShTY3JvbGxDb250cm9sbGVyKSk7XG5cbnZhciBUaGVtZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUaGVtZShjYWxlbmRhck9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuaWNvbk92ZXJyaWRlT3B0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNldEljb25PdmVycmlkZShjYWxlbmRhck9wdGlvbnNbdGhpcy5pY29uT3ZlcnJpZGVPcHRpb25dKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUaGVtZS5wcm90b3R5cGUuc2V0SWNvbk92ZXJyaWRlID0gZnVuY3Rpb24gKGljb25PdmVycmlkZUhhc2gpIHtcbiAgICAgICAgdmFyIGljb25DbGFzc2VzQ29weTtcbiAgICAgICAgdmFyIGJ1dHRvbk5hbWU7XG4gICAgICAgIGlmICh0eXBlb2YgaWNvbk92ZXJyaWRlSGFzaCA9PT0gJ29iamVjdCcgJiYgaWNvbk92ZXJyaWRlSGFzaCkgeyAvLyBub24tbnVsbCBvYmplY3RcbiAgICAgICAgICAgIGljb25DbGFzc2VzQ29weSA9IHRzbGliLl9fYXNzaWduKHt9LCB0aGlzLmljb25DbGFzc2VzKTtcbiAgICAgICAgICAgIGZvciAoYnV0dG9uTmFtZSBpbiBpY29uT3ZlcnJpZGVIYXNoKSB7XG4gICAgICAgICAgICAgICAgaWNvbkNsYXNzZXNDb3B5W2J1dHRvbk5hbWVdID0gdGhpcy5hcHBseUljb25PdmVycmlkZVByZWZpeChpY29uT3ZlcnJpZGVIYXNoW2J1dHRvbk5hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaWNvbkNsYXNzZXMgPSBpY29uQ2xhc3Nlc0NvcHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaWNvbk92ZXJyaWRlSGFzaCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuaWNvbkNsYXNzZXMgPSB7fTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVGhlbWUucHJvdG90eXBlLmFwcGx5SWNvbk92ZXJyaWRlUHJlZml4ID0gZnVuY3Rpb24gKGNsYXNzTmFtZSkge1xuICAgICAgICB2YXIgcHJlZml4ID0gdGhpcy5pY29uT3ZlcnJpZGVQcmVmaXg7XG4gICAgICAgIGlmIChwcmVmaXggJiYgY2xhc3NOYW1lLmluZGV4T2YocHJlZml4KSAhPT0gMCkgeyAvLyBpZiBub3QgYWxyZWFkeSBwcmVzZW50XG4gICAgICAgICAgICBjbGFzc05hbWUgPSBwcmVmaXggKyBjbGFzc05hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTtcbiAgICB9O1xuICAgIFRoZW1lLnByb3RvdHlwZS5nZXRDbGFzcyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3Nlc1trZXldIHx8ICcnO1xuICAgIH07XG4gICAgVGhlbWUucHJvdG90eXBlLmdldEljb25DbGFzcyA9IGZ1bmN0aW9uIChidXR0b25OYW1lLCBpc1J0bCkge1xuICAgICAgICB2YXIgY2xhc3NOYW1lO1xuICAgICAgICBpZiAoaXNSdGwgJiYgdGhpcy5ydGxJY29uQ2xhc3Nlcykge1xuICAgICAgICAgICAgY2xhc3NOYW1lID0gdGhpcy5ydGxJY29uQ2xhc3Nlc1tidXR0b25OYW1lXSB8fCB0aGlzLmljb25DbGFzc2VzW2J1dHRvbk5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2xhc3NOYW1lID0gdGhpcy5pY29uQ2xhc3Nlc1tidXR0b25OYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlSWNvbkNsYXNzICsgXCIgXCIgKyBjbGFzc05hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH07XG4gICAgVGhlbWUucHJvdG90eXBlLmdldEN1c3RvbUJ1dHRvbkljb25DbGFzcyA9IGZ1bmN0aW9uIChjdXN0b21CdXR0b25Qcm9wcykge1xuICAgICAgICB2YXIgY2xhc3NOYW1lO1xuICAgICAgICBpZiAodGhpcy5pY29uT3ZlcnJpZGVDdXN0b21CdXR0b25PcHRpb24pIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZSA9IGN1c3RvbUJ1dHRvblByb3BzW3RoaXMuaWNvbk92ZXJyaWRlQ3VzdG9tQnV0dG9uT3B0aW9uXTtcbiAgICAgICAgICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlSWNvbkNsYXNzICsgXCIgXCIgKyB0aGlzLmFwcGx5SWNvbk92ZXJyaWRlUHJlZml4KGNsYXNzTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH07XG4gICAgcmV0dXJuIFRoZW1lO1xufSgpKTtcblRoZW1lLnByb3RvdHlwZS5jbGFzc2VzID0ge307XG5UaGVtZS5wcm90b3R5cGUuaWNvbkNsYXNzZXMgPSB7fTtcblRoZW1lLnByb3RvdHlwZS5iYXNlSWNvbkNsYXNzID0gJyc7XG5UaGVtZS5wcm90b3R5cGUuaWNvbk92ZXJyaWRlUHJlZml4ID0gJyc7XG5cbnZhciBTY3JvbGxSZXNwb25kZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2Nyb2xsUmVzcG9uZGVyKGV4ZWNGdW5jLCBlbWl0dGVyLCBzY3JvbGxUaW1lLCBzY3JvbGxUaW1lUmVzZXQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5leGVjRnVuYyA9IGV4ZWNGdW5jO1xuICAgICAgICB0aGlzLmVtaXR0ZXIgPSBlbWl0dGVyO1xuICAgICAgICB0aGlzLnNjcm9sbFRpbWUgPSBzY3JvbGxUaW1lO1xuICAgICAgICB0aGlzLnNjcm9sbFRpbWVSZXNldCA9IHNjcm9sbFRpbWVSZXNldDtcbiAgICAgICAgdGhpcy5oYW5kbGVTY3JvbGxSZXF1ZXN0ID0gZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgICAgIF90aGlzLnF1ZXVlZFJlcXVlc3QgPSB0c2xpYi5fX2Fzc2lnbih7fSwgX3RoaXMucXVldWVkUmVxdWVzdCB8fCB7fSwgcmVxdWVzdCk7XG4gICAgICAgICAgICBfdGhpcy5kcmFpbigpO1xuICAgICAgICB9O1xuICAgICAgICBlbWl0dGVyLm9uKCdfc2Nyb2xsUmVxdWVzdCcsIHRoaXMuaGFuZGxlU2Nyb2xsUmVxdWVzdCk7XG4gICAgICAgIHRoaXMuZmlyZUluaXRpYWxTY3JvbGwoKTtcbiAgICB9XG4gICAgU2Nyb2xsUmVzcG9uZGVyLnByb3RvdHlwZS5kZXRhY2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlci5vZmYoJ19zY3JvbGxSZXF1ZXN0JywgdGhpcy5oYW5kbGVTY3JvbGxSZXF1ZXN0KTtcbiAgICB9O1xuICAgIFNjcm9sbFJlc3BvbmRlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKGlzRGF0ZXNOZXcpIHtcbiAgICAgICAgaWYgKGlzRGF0ZXNOZXcgJiYgdGhpcy5zY3JvbGxUaW1lUmVzZXQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZUluaXRpYWxTY3JvbGwoKTsgLy8gd2lsbCBkcmFpblxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kcmFpbigpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTY3JvbGxSZXNwb25kZXIucHJvdG90eXBlLmZpcmVJbml0aWFsU2Nyb2xsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbFJlcXVlc3Qoe1xuICAgICAgICAgICAgdGltZTogdGhpcy5zY3JvbGxUaW1lLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFNjcm9sbFJlc3BvbmRlci5wcm90b3R5cGUuZHJhaW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlZFJlcXVlc3QgJiYgdGhpcy5leGVjRnVuYyh0aGlzLnF1ZXVlZFJlcXVlc3QpKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlZFJlcXVlc3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gU2Nyb2xsUmVzcG9uZGVyO1xufSgpKTtcblxudmFyIFZpZXdDb250ZXh0VHlwZSA9IHZkb21fY2pzLmNyZWF0ZUNvbnRleHQoe30pOyAvLyBmb3IgQ29tcG9uZW50c1xuZnVuY3Rpb24gYnVpbGRWaWV3Q29udGV4dCh2aWV3U3BlYywgdmlld0FwaSwgdmlld09wdGlvbnMsIGRhdGVQcm9maWxlR2VuZXJhdG9yLCBkYXRlRW52LCB0aGVtZSwgcGx1Z2luSG9va3MsIGRpc3BhdGNoLCBnZXRDdXJyZW50RGF0YSwgZW1pdHRlciwgY2FsZW5kYXJBcGksIHJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQsIHVucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRhdGVFbnY6IGRhdGVFbnYsXG4gICAgICAgIG9wdGlvbnM6IHZpZXdPcHRpb25zLFxuICAgICAgICBwbHVnaW5Ib29rczogcGx1Z2luSG9va3MsXG4gICAgICAgIGVtaXR0ZXI6IGVtaXR0ZXIsXG4gICAgICAgIGRpc3BhdGNoOiBkaXNwYXRjaCxcbiAgICAgICAgZ2V0Q3VycmVudERhdGE6IGdldEN1cnJlbnREYXRhLFxuICAgICAgICBjYWxlbmRhckFwaTogY2FsZW5kYXJBcGksXG4gICAgICAgIHZpZXdTcGVjOiB2aWV3U3BlYyxcbiAgICAgICAgdmlld0FwaTogdmlld0FwaSxcbiAgICAgICAgZGF0ZVByb2ZpbGVHZW5lcmF0b3I6IGRhdGVQcm9maWxlR2VuZXJhdG9yLFxuICAgICAgICB0aGVtZTogdGhlbWUsXG4gICAgICAgIGlzUnRsOiB2aWV3T3B0aW9ucy5kaXJlY3Rpb24gPT09ICdydGwnLFxuICAgICAgICBhZGRSZXNpemVIYW5kbGVyOiBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICAgICAgZW1pdHRlci5vbignX3Jlc2l6ZScsIGhhbmRsZXIpO1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmVSZXNpemVIYW5kbGVyOiBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICAgICAgZW1pdHRlci5vZmYoJ19yZXNpemUnLCBoYW5kbGVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgY3JlYXRlU2Nyb2xsUmVzcG9uZGVyOiBmdW5jdGlvbiAoZXhlY0Z1bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2Nyb2xsUmVzcG9uZGVyKGV4ZWNGdW5jLCBlbWl0dGVyLCBjcmVhdGVEdXJhdGlvbih2aWV3T3B0aW9ucy5zY3JvbGxUaW1lKSwgdmlld09wdGlvbnMuc2Nyb2xsVGltZVJlc2V0KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudDogcmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCxcbiAgICAgICAgdW5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50OiB1bnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQsXG4gICAgfTtcbn1cblxuLyogZXNsaW50IG1heC1jbGFzc2VzLXBlci1maWxlOiBvZmYgKi9cbnZhciBQdXJlQ29tcG9uZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhQdXJlQ29tcG9uZW50LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFB1cmVDb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUHVyZUNvbXBvbmVudC5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgY29uc29sZS5sb2coZ2V0VW5lcXVhbFByb3BzKG5leHRQcm9wcywgdGhpcy5wcm9wcyksIGdldFVuZXF1YWxQcm9wcyhuZXh0U3RhdGUsIHRoaXMuc3RhdGUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWNvbXBhcmVPYmpzKHRoaXMucHJvcHMsIG5leHRQcm9wcywgdGhpcy5wcm9wRXF1YWxpdHkpIHx8XG4gICAgICAgICAgICAhY29tcGFyZU9ianModGhpcy5zdGF0ZSwgbmV4dFN0YXRlLCB0aGlzLnN0YXRlRXF1YWxpdHkpO1xuICAgIH07XG4gICAgLy8gSEFDSyBmb3IgZnJlYWtpbicgUmVhY3QgU3RyaWN0TW9kZVxuICAgIFB1cmVDb21wb25lbnQucHJvdG90eXBlLnNhZmVTZXRTdGF0ZSA9IGZ1bmN0aW9uIChuZXdTdGF0ZSkge1xuICAgICAgICBpZiAoIWNvbXBhcmVPYmpzKHRoaXMuc3RhdGUsIHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCB0aGlzLnN0YXRlKSwgbmV3U3RhdGUpLCB0aGlzLnN0YXRlRXF1YWxpdHkpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUHVyZUNvbXBvbmVudC5hZGRQcm9wc0VxdWFsaXR5ID0gYWRkUHJvcHNFcXVhbGl0eTtcbiAgICBQdXJlQ29tcG9uZW50LmFkZFN0YXRlRXF1YWxpdHkgPSBhZGRTdGF0ZUVxdWFsaXR5O1xuICAgIFB1cmVDb21wb25lbnQuY29udGV4dFR5cGUgPSBWaWV3Q29udGV4dFR5cGU7XG4gICAgcmV0dXJuIFB1cmVDb21wb25lbnQ7XG59KHZkb21fY2pzLkNvbXBvbmVudCkpO1xuUHVyZUNvbXBvbmVudC5wcm90b3R5cGUucHJvcEVxdWFsaXR5ID0ge307XG5QdXJlQ29tcG9uZW50LnByb3RvdHlwZS5zdGF0ZUVxdWFsaXR5ID0ge307XG52YXIgQmFzZUNvbXBvbmVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoQmFzZUNvbXBvbmVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCYXNlQ29tcG9uZW50KCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIEJhc2VDb21wb25lbnQuY29udGV4dFR5cGUgPSBWaWV3Q29udGV4dFR5cGU7XG4gICAgcmV0dXJuIEJhc2VDb21wb25lbnQ7XG59KFB1cmVDb21wb25lbnQpKTtcbmZ1bmN0aW9uIGFkZFByb3BzRXF1YWxpdHkocHJvcEVxdWFsaXR5KSB7XG4gICAgdmFyIGhhc2ggPSBPYmplY3QuY3JlYXRlKHRoaXMucHJvdG90eXBlLnByb3BFcXVhbGl0eSk7XG4gICAgdHNsaWIuX19hc3NpZ24oaGFzaCwgcHJvcEVxdWFsaXR5KTtcbiAgICB0aGlzLnByb3RvdHlwZS5wcm9wRXF1YWxpdHkgPSBoYXNoO1xufVxuZnVuY3Rpb24gYWRkU3RhdGVFcXVhbGl0eShzdGF0ZUVxdWFsaXR5KSB7XG4gICAgdmFyIGhhc2ggPSBPYmplY3QuY3JlYXRlKHRoaXMucHJvdG90eXBlLnN0YXRlRXF1YWxpdHkpO1xuICAgIHRzbGliLl9fYXNzaWduKGhhc2gsIHN0YXRlRXF1YWxpdHkpO1xuICAgIHRoaXMucHJvdG90eXBlLnN0YXRlRXF1YWxpdHkgPSBoYXNoO1xufVxuLy8gdXNlIG90aGVyIG9uZVxuZnVuY3Rpb24gc2V0UmVmKHJlZiwgY3VycmVudCkge1xuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlZihjdXJyZW50KTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmVmKSB7XG4gICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMDI5XG4gICAgICAgIHJlZi5jdXJyZW50ID0gY3VycmVudDtcbiAgICB9XG59XG5cbi8qXG5hbiBJTlRFUkFDVEFCTEUgZGF0ZSBjb21wb25lbnRcblxuUFVSUE9TRVM6XG4tIGhvb2sgdXAgdG8gZmcsIGZpbGwsIGFuZCBtaXJyb3IgcmVuZGVyZXJzXG4tIGludGVyZmFjZSBmb3IgZHJhZ2dpbmcgYW5kIGhpdHNcbiovXG52YXIgRGF0ZUNvbXBvbmVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRGF0ZUNvbXBvbmVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEYXRlQ29tcG9uZW50KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMudWlkID0gZ3VpZCgpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8vIEhpdCBTeXN0ZW1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIERhdGVDb21wb25lbnQucHJvdG90eXBlLnByZXBhcmVIaXRzID0gZnVuY3Rpb24gKCkge1xuICAgIH07XG4gICAgRGF0ZUNvbXBvbmVudC5wcm90b3R5cGUucXVlcnlIaXQgPSBmdW5jdGlvbiAocG9zaXRpb25MZWZ0LCBwb3NpdGlvblRvcCwgZWxXaWR0aCwgZWxIZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7IC8vIHRoaXMgc2hvdWxkIGJlIGFic3RyYWN0XG4gICAgfTtcbiAgICAvLyBQb2ludGVyIEludGVyYWN0aW9uIFV0aWxzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBEYXRlQ29tcG9uZW50LnByb3RvdHlwZS5pc1ZhbGlkU2VnRG93bkVsID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5wcm9wcy5ldmVudERyYWcgJiYgLy8gSEFDS1xuICAgICAgICAgICAgIXRoaXMucHJvcHMuZXZlbnRSZXNpemUgJiYgLy8gSEFDS1xuICAgICAgICAgICAgIWVsZW1lbnRDbG9zZXN0KGVsLCAnLmZjLWV2ZW50LW1pcnJvcicpO1xuICAgIH07XG4gICAgRGF0ZUNvbXBvbmVudC5wcm90b3R5cGUuaXNWYWxpZERhdGVEb3duRWwgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgcmV0dXJuICFlbGVtZW50Q2xvc2VzdChlbCwgJy5mYy1ldmVudDpub3QoLmZjLWJnLWV2ZW50KScpICYmXG4gICAgICAgICAgICAhZWxlbWVudENsb3Nlc3QoZWwsICcuZmMtbW9yZS1saW5rJykgJiYgLy8gYSBcIm1vcmUuLlwiIGxpbmtcbiAgICAgICAgICAgICFlbGVtZW50Q2xvc2VzdChlbCwgJ2FbZGF0YS1uYXZsaW5rXScpICYmIC8vIGEgY2xpY2thYmxlIG5hdiBsaW5rXG4gICAgICAgICAgICAhZWxlbWVudENsb3Nlc3QoZWwsICcuZmMtcG9wb3ZlcicpOyAvLyBoYWNrXG4gICAgfTtcbiAgICByZXR1cm4gRGF0ZUNvbXBvbmVudDtcbn0oQmFzZUNvbXBvbmVudCkpO1xuXG4vLyBUT0RPOiBlYXNpZXIgd2F5IHRvIGFkZCBuZXcgaG9va3M/IG5lZWQgdG8gdXBkYXRlIGEgbWlsbGlvbiB0aGluZ3NcbmZ1bmN0aW9uIGNyZWF0ZVBsdWdpbihpbnB1dCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBndWlkKCksXG4gICAgICAgIGRlcHM6IGlucHV0LmRlcHMgfHwgW10sXG4gICAgICAgIHJlZHVjZXJzOiBpbnB1dC5yZWR1Y2VycyB8fCBbXSxcbiAgICAgICAgaXNMb2FkaW5nRnVuY3M6IGlucHV0LmlzTG9hZGluZ0Z1bmNzIHx8IFtdLFxuICAgICAgICBjb250ZXh0SW5pdDogW10uY29uY2F0KGlucHV0LmNvbnRleHRJbml0IHx8IFtdKSxcbiAgICAgICAgZXZlbnRSZWZpbmVyczogaW5wdXQuZXZlbnRSZWZpbmVycyB8fCB7fSxcbiAgICAgICAgZXZlbnREZWZNZW1iZXJBZGRlcnM6IGlucHV0LmV2ZW50RGVmTWVtYmVyQWRkZXJzIHx8IFtdLFxuICAgICAgICBldmVudFNvdXJjZVJlZmluZXJzOiBpbnB1dC5ldmVudFNvdXJjZVJlZmluZXJzIHx8IHt9LFxuICAgICAgICBpc0RyYWdnYWJsZVRyYW5zZm9ybWVyczogaW5wdXQuaXNEcmFnZ2FibGVUcmFuc2Zvcm1lcnMgfHwgW10sXG4gICAgICAgIGV2ZW50RHJhZ011dGF0aW9uTWFzc2FnZXJzOiBpbnB1dC5ldmVudERyYWdNdXRhdGlvbk1hc3NhZ2VycyB8fCBbXSxcbiAgICAgICAgZXZlbnREZWZNdXRhdGlvbkFwcGxpZXJzOiBpbnB1dC5ldmVudERlZk11dGF0aW9uQXBwbGllcnMgfHwgW10sXG4gICAgICAgIGRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnM6IGlucHV0LmRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnMgfHwgW10sXG4gICAgICAgIGRhdGVQb2ludFRyYW5zZm9ybXM6IGlucHV0LmRhdGVQb2ludFRyYW5zZm9ybXMgfHwgW10sXG4gICAgICAgIGRhdGVTcGFuVHJhbnNmb3JtczogaW5wdXQuZGF0ZVNwYW5UcmFuc2Zvcm1zIHx8IFtdLFxuICAgICAgICB2aWV3czogaW5wdXQudmlld3MgfHwge30sXG4gICAgICAgIHZpZXdQcm9wc1RyYW5zZm9ybWVyczogaW5wdXQudmlld1Byb3BzVHJhbnNmb3JtZXJzIHx8IFtdLFxuICAgICAgICBpc1Byb3BzVmFsaWQ6IGlucHV0LmlzUHJvcHNWYWxpZCB8fCBudWxsLFxuICAgICAgICBleHRlcm5hbERlZlRyYW5zZm9ybXM6IGlucHV0LmV4dGVybmFsRGVmVHJhbnNmb3JtcyB8fCBbXSxcbiAgICAgICAgdmlld0NvbnRhaW5lckFwcGVuZHM6IGlucHV0LnZpZXdDb250YWluZXJBcHBlbmRzIHx8IFtdLFxuICAgICAgICBldmVudERyb3BUcmFuc2Zvcm1lcnM6IGlucHV0LmV2ZW50RHJvcFRyYW5zZm9ybWVycyB8fCBbXSxcbiAgICAgICAgY29tcG9uZW50SW50ZXJhY3Rpb25zOiBpbnB1dC5jb21wb25lbnRJbnRlcmFjdGlvbnMgfHwgW10sXG4gICAgICAgIGNhbGVuZGFySW50ZXJhY3Rpb25zOiBpbnB1dC5jYWxlbmRhckludGVyYWN0aW9ucyB8fCBbXSxcbiAgICAgICAgdGhlbWVDbGFzc2VzOiBpbnB1dC50aGVtZUNsYXNzZXMgfHwge30sXG4gICAgICAgIGV2ZW50U291cmNlRGVmczogaW5wdXQuZXZlbnRTb3VyY2VEZWZzIHx8IFtdLFxuICAgICAgICBjbWRGb3JtYXR0ZXI6IGlucHV0LmNtZEZvcm1hdHRlcixcbiAgICAgICAgcmVjdXJyaW5nVHlwZXM6IGlucHV0LnJlY3VycmluZ1R5cGVzIHx8IFtdLFxuICAgICAgICBuYW1lZFRpbWVab25lZEltcGw6IGlucHV0Lm5hbWVkVGltZVpvbmVkSW1wbCxcbiAgICAgICAgaW5pdGlhbFZpZXc6IGlucHV0LmluaXRpYWxWaWV3IHx8ICcnLFxuICAgICAgICBlbGVtZW50RHJhZ2dpbmdJbXBsOiBpbnB1dC5lbGVtZW50RHJhZ2dpbmdJbXBsLFxuICAgICAgICBvcHRpb25DaGFuZ2VIYW5kbGVyczogaW5wdXQub3B0aW9uQ2hhbmdlSGFuZGxlcnMgfHwge30sXG4gICAgICAgIHNjcm9sbEdyaWRJbXBsOiBpbnB1dC5zY3JvbGxHcmlkSW1wbCB8fCBudWxsLFxuICAgICAgICBjb250ZW50VHlwZUhhbmRsZXJzOiBpbnB1dC5jb250ZW50VHlwZUhhbmRsZXJzIHx8IHt9LFxuICAgICAgICBsaXN0ZW5lclJlZmluZXJzOiBpbnB1dC5saXN0ZW5lclJlZmluZXJzIHx8IHt9LFxuICAgICAgICBvcHRpb25SZWZpbmVyczogaW5wdXQub3B0aW9uUmVmaW5lcnMgfHwge30sXG4gICAgICAgIHByb3BTZXRIYW5kbGVyczogaW5wdXQucHJvcFNldEhhbmRsZXJzIHx8IHt9LFxuICAgIH07XG59XG5mdW5jdGlvbiBidWlsZFBsdWdpbkhvb2tzKHBsdWdpbkRlZnMsIGdsb2JhbERlZnMpIHtcbiAgICB2YXIgaXNBZGRlZCA9IHt9O1xuICAgIHZhciBob29rcyA9IHtcbiAgICAgICAgcmVkdWNlcnM6IFtdLFxuICAgICAgICBpc0xvYWRpbmdGdW5jczogW10sXG4gICAgICAgIGNvbnRleHRJbml0OiBbXSxcbiAgICAgICAgZXZlbnRSZWZpbmVyczoge30sXG4gICAgICAgIGV2ZW50RGVmTWVtYmVyQWRkZXJzOiBbXSxcbiAgICAgICAgZXZlbnRTb3VyY2VSZWZpbmVyczoge30sXG4gICAgICAgIGlzRHJhZ2dhYmxlVHJhbnNmb3JtZXJzOiBbXSxcbiAgICAgICAgZXZlbnREcmFnTXV0YXRpb25NYXNzYWdlcnM6IFtdLFxuICAgICAgICBldmVudERlZk11dGF0aW9uQXBwbGllcnM6IFtdLFxuICAgICAgICBkYXRlU2VsZWN0aW9uVHJhbnNmb3JtZXJzOiBbXSxcbiAgICAgICAgZGF0ZVBvaW50VHJhbnNmb3JtczogW10sXG4gICAgICAgIGRhdGVTcGFuVHJhbnNmb3JtczogW10sXG4gICAgICAgIHZpZXdzOiB7fSxcbiAgICAgICAgdmlld1Byb3BzVHJhbnNmb3JtZXJzOiBbXSxcbiAgICAgICAgaXNQcm9wc1ZhbGlkOiBudWxsLFxuICAgICAgICBleHRlcm5hbERlZlRyYW5zZm9ybXM6IFtdLFxuICAgICAgICB2aWV3Q29udGFpbmVyQXBwZW5kczogW10sXG4gICAgICAgIGV2ZW50RHJvcFRyYW5zZm9ybWVyczogW10sXG4gICAgICAgIGNvbXBvbmVudEludGVyYWN0aW9uczogW10sXG4gICAgICAgIGNhbGVuZGFySW50ZXJhY3Rpb25zOiBbXSxcbiAgICAgICAgdGhlbWVDbGFzc2VzOiB7fSxcbiAgICAgICAgZXZlbnRTb3VyY2VEZWZzOiBbXSxcbiAgICAgICAgY21kRm9ybWF0dGVyOiBudWxsLFxuICAgICAgICByZWN1cnJpbmdUeXBlczogW10sXG4gICAgICAgIG5hbWVkVGltZVpvbmVkSW1wbDogbnVsbCxcbiAgICAgICAgaW5pdGlhbFZpZXc6ICcnLFxuICAgICAgICBlbGVtZW50RHJhZ2dpbmdJbXBsOiBudWxsLFxuICAgICAgICBvcHRpb25DaGFuZ2VIYW5kbGVyczoge30sXG4gICAgICAgIHNjcm9sbEdyaWRJbXBsOiBudWxsLFxuICAgICAgICBjb250ZW50VHlwZUhhbmRsZXJzOiB7fSxcbiAgICAgICAgbGlzdGVuZXJSZWZpbmVyczoge30sXG4gICAgICAgIG9wdGlvblJlZmluZXJzOiB7fSxcbiAgICAgICAgcHJvcFNldEhhbmRsZXJzOiB7fSxcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGFkZERlZnMoZGVmcykge1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGRlZnNfMSA9IGRlZnM7IF9pIDwgZGVmc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIGRlZiA9IGRlZnNfMVtfaV07XG4gICAgICAgICAgICBpZiAoIWlzQWRkZWRbZGVmLmlkXSkge1xuICAgICAgICAgICAgICAgIGlzQWRkZWRbZGVmLmlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYWRkRGVmcyhkZWYuZGVwcyk7XG4gICAgICAgICAgICAgICAgaG9va3MgPSBjb21iaW5lSG9va3MoaG9va3MsIGRlZik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBsdWdpbkRlZnMpIHtcbiAgICAgICAgYWRkRGVmcyhwbHVnaW5EZWZzKTtcbiAgICB9XG4gICAgYWRkRGVmcyhnbG9iYWxEZWZzKTtcbiAgICByZXR1cm4gaG9va3M7XG59XG5mdW5jdGlvbiBidWlsZEJ1aWxkUGx1Z2luSG9va3MoKSB7XG4gICAgdmFyIGN1cnJlbnRPdmVycmlkZURlZnMgPSBbXTtcbiAgICB2YXIgY3VycmVudEdsb2JhbERlZnMgPSBbXTtcbiAgICB2YXIgY3VycmVudEhvb2tzO1xuICAgIHJldHVybiBmdW5jdGlvbiAob3ZlcnJpZGVEZWZzLCBnbG9iYWxEZWZzKSB7XG4gICAgICAgIGlmICghY3VycmVudEhvb2tzIHx8ICFpc0FycmF5c0VxdWFsKG92ZXJyaWRlRGVmcywgY3VycmVudE92ZXJyaWRlRGVmcykgfHwgIWlzQXJyYXlzRXF1YWwoZ2xvYmFsRGVmcywgY3VycmVudEdsb2JhbERlZnMpKSB7XG4gICAgICAgICAgICBjdXJyZW50SG9va3MgPSBidWlsZFBsdWdpbkhvb2tzKG92ZXJyaWRlRGVmcywgZ2xvYmFsRGVmcyk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudE92ZXJyaWRlRGVmcyA9IG92ZXJyaWRlRGVmcztcbiAgICAgICAgY3VycmVudEdsb2JhbERlZnMgPSBnbG9iYWxEZWZzO1xuICAgICAgICByZXR1cm4gY3VycmVudEhvb2tzO1xuICAgIH07XG59XG5mdW5jdGlvbiBjb21iaW5lSG9va3MoaG9va3MwLCBob29rczEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICByZWR1Y2VyczogaG9va3MwLnJlZHVjZXJzLmNvbmNhdChob29rczEucmVkdWNlcnMpLFxuICAgICAgICBpc0xvYWRpbmdGdW5jczogaG9va3MwLmlzTG9hZGluZ0Z1bmNzLmNvbmNhdChob29rczEuaXNMb2FkaW5nRnVuY3MpLFxuICAgICAgICBjb250ZXh0SW5pdDogaG9va3MwLmNvbnRleHRJbml0LmNvbmNhdChob29rczEuY29udGV4dEluaXQpLFxuICAgICAgICBldmVudFJlZmluZXJzOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgaG9va3MwLmV2ZW50UmVmaW5lcnMpLCBob29rczEuZXZlbnRSZWZpbmVycyksXG4gICAgICAgIGV2ZW50RGVmTWVtYmVyQWRkZXJzOiBob29rczAuZXZlbnREZWZNZW1iZXJBZGRlcnMuY29uY2F0KGhvb2tzMS5ldmVudERlZk1lbWJlckFkZGVycyksXG4gICAgICAgIGV2ZW50U291cmNlUmVmaW5lcnM6IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBob29rczAuZXZlbnRTb3VyY2VSZWZpbmVycyksIGhvb2tzMS5ldmVudFNvdXJjZVJlZmluZXJzKSxcbiAgICAgICAgaXNEcmFnZ2FibGVUcmFuc2Zvcm1lcnM6IGhvb2tzMC5pc0RyYWdnYWJsZVRyYW5zZm9ybWVycy5jb25jYXQoaG9va3MxLmlzRHJhZ2dhYmxlVHJhbnNmb3JtZXJzKSxcbiAgICAgICAgZXZlbnREcmFnTXV0YXRpb25NYXNzYWdlcnM6IGhvb2tzMC5ldmVudERyYWdNdXRhdGlvbk1hc3NhZ2Vycy5jb25jYXQoaG9va3MxLmV2ZW50RHJhZ011dGF0aW9uTWFzc2FnZXJzKSxcbiAgICAgICAgZXZlbnREZWZNdXRhdGlvbkFwcGxpZXJzOiBob29rczAuZXZlbnREZWZNdXRhdGlvbkFwcGxpZXJzLmNvbmNhdChob29rczEuZXZlbnREZWZNdXRhdGlvbkFwcGxpZXJzKSxcbiAgICAgICAgZGF0ZVNlbGVjdGlvblRyYW5zZm9ybWVyczogaG9va3MwLmRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnMuY29uY2F0KGhvb2tzMS5kYXRlU2VsZWN0aW9uVHJhbnNmb3JtZXJzKSxcbiAgICAgICAgZGF0ZVBvaW50VHJhbnNmb3JtczogaG9va3MwLmRhdGVQb2ludFRyYW5zZm9ybXMuY29uY2F0KGhvb2tzMS5kYXRlUG9pbnRUcmFuc2Zvcm1zKSxcbiAgICAgICAgZGF0ZVNwYW5UcmFuc2Zvcm1zOiBob29rczAuZGF0ZVNwYW5UcmFuc2Zvcm1zLmNvbmNhdChob29rczEuZGF0ZVNwYW5UcmFuc2Zvcm1zKSxcbiAgICAgICAgdmlld3M6IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBob29rczAudmlld3MpLCBob29rczEudmlld3MpLFxuICAgICAgICB2aWV3UHJvcHNUcmFuc2Zvcm1lcnM6IGhvb2tzMC52aWV3UHJvcHNUcmFuc2Zvcm1lcnMuY29uY2F0KGhvb2tzMS52aWV3UHJvcHNUcmFuc2Zvcm1lcnMpLFxuICAgICAgICBpc1Byb3BzVmFsaWQ6IGhvb2tzMS5pc1Byb3BzVmFsaWQgfHwgaG9va3MwLmlzUHJvcHNWYWxpZCxcbiAgICAgICAgZXh0ZXJuYWxEZWZUcmFuc2Zvcm1zOiBob29rczAuZXh0ZXJuYWxEZWZUcmFuc2Zvcm1zLmNvbmNhdChob29rczEuZXh0ZXJuYWxEZWZUcmFuc2Zvcm1zKSxcbiAgICAgICAgdmlld0NvbnRhaW5lckFwcGVuZHM6IGhvb2tzMC52aWV3Q29udGFpbmVyQXBwZW5kcy5jb25jYXQoaG9va3MxLnZpZXdDb250YWluZXJBcHBlbmRzKSxcbiAgICAgICAgZXZlbnREcm9wVHJhbnNmb3JtZXJzOiBob29rczAuZXZlbnREcm9wVHJhbnNmb3JtZXJzLmNvbmNhdChob29rczEuZXZlbnREcm9wVHJhbnNmb3JtZXJzKSxcbiAgICAgICAgY2FsZW5kYXJJbnRlcmFjdGlvbnM6IGhvb2tzMC5jYWxlbmRhckludGVyYWN0aW9ucy5jb25jYXQoaG9va3MxLmNhbGVuZGFySW50ZXJhY3Rpb25zKSxcbiAgICAgICAgY29tcG9uZW50SW50ZXJhY3Rpb25zOiBob29rczAuY29tcG9uZW50SW50ZXJhY3Rpb25zLmNvbmNhdChob29rczEuY29tcG9uZW50SW50ZXJhY3Rpb25zKSxcbiAgICAgICAgdGhlbWVDbGFzc2VzOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgaG9va3MwLnRoZW1lQ2xhc3NlcyksIGhvb2tzMS50aGVtZUNsYXNzZXMpLFxuICAgICAgICBldmVudFNvdXJjZURlZnM6IGhvb2tzMC5ldmVudFNvdXJjZURlZnMuY29uY2F0KGhvb2tzMS5ldmVudFNvdXJjZURlZnMpLFxuICAgICAgICBjbWRGb3JtYXR0ZXI6IGhvb2tzMS5jbWRGb3JtYXR0ZXIgfHwgaG9va3MwLmNtZEZvcm1hdHRlcixcbiAgICAgICAgcmVjdXJyaW5nVHlwZXM6IGhvb2tzMC5yZWN1cnJpbmdUeXBlcy5jb25jYXQoaG9va3MxLnJlY3VycmluZ1R5cGVzKSxcbiAgICAgICAgbmFtZWRUaW1lWm9uZWRJbXBsOiBob29rczEubmFtZWRUaW1lWm9uZWRJbXBsIHx8IGhvb2tzMC5uYW1lZFRpbWVab25lZEltcGwsXG4gICAgICAgIGluaXRpYWxWaWV3OiBob29rczAuaW5pdGlhbFZpZXcgfHwgaG9va3MxLmluaXRpYWxWaWV3LFxuICAgICAgICBlbGVtZW50RHJhZ2dpbmdJbXBsOiBob29rczAuZWxlbWVudERyYWdnaW5nSW1wbCB8fCBob29rczEuZWxlbWVudERyYWdnaW5nSW1wbCxcbiAgICAgICAgb3B0aW9uQ2hhbmdlSGFuZGxlcnM6IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBob29rczAub3B0aW9uQ2hhbmdlSGFuZGxlcnMpLCBob29rczEub3B0aW9uQ2hhbmdlSGFuZGxlcnMpLFxuICAgICAgICBzY3JvbGxHcmlkSW1wbDogaG9va3MxLnNjcm9sbEdyaWRJbXBsIHx8IGhvb2tzMC5zY3JvbGxHcmlkSW1wbCxcbiAgICAgICAgY29udGVudFR5cGVIYW5kbGVyczogdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGhvb2tzMC5jb250ZW50VHlwZUhhbmRsZXJzKSwgaG9va3MxLmNvbnRlbnRUeXBlSGFuZGxlcnMpLFxuICAgICAgICBsaXN0ZW5lclJlZmluZXJzOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgaG9va3MwLmxpc3RlbmVyUmVmaW5lcnMpLCBob29rczEubGlzdGVuZXJSZWZpbmVycyksXG4gICAgICAgIG9wdGlvblJlZmluZXJzOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgaG9va3MwLm9wdGlvblJlZmluZXJzKSwgaG9va3MxLm9wdGlvblJlZmluZXJzKSxcbiAgICAgICAgcHJvcFNldEhhbmRsZXJzOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgaG9va3MwLnByb3BTZXRIYW5kbGVycyksIGhvb2tzMS5wcm9wU2V0SGFuZGxlcnMpLFxuICAgIH07XG59XG5cbnZhciBTdGFuZGFyZFRoZW1lID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhTdGFuZGFyZFRoZW1lLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFN0YW5kYXJkVGhlbWUoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFN0YW5kYXJkVGhlbWU7XG59KFRoZW1lKSk7XG5TdGFuZGFyZFRoZW1lLnByb3RvdHlwZS5jbGFzc2VzID0ge1xuICAgIHJvb3Q6ICdmYy10aGVtZS1zdGFuZGFyZCcsXG4gICAgdGFibGVDZWxsU2hhZGVkOiAnZmMtY2VsbC1zaGFkZWQnLFxuICAgIGJ1dHRvbkdyb3VwOiAnZmMtYnV0dG9uLWdyb3VwJyxcbiAgICBidXR0b246ICdmYy1idXR0b24gZmMtYnV0dG9uLXByaW1hcnknLFxuICAgIGJ1dHRvbkFjdGl2ZTogJ2ZjLWJ1dHRvbi1hY3RpdmUnLFxufTtcblN0YW5kYXJkVGhlbWUucHJvdG90eXBlLmJhc2VJY29uQ2xhc3MgPSAnZmMtaWNvbic7XG5TdGFuZGFyZFRoZW1lLnByb3RvdHlwZS5pY29uQ2xhc3NlcyA9IHtcbiAgICBjbG9zZTogJ2ZjLWljb24teCcsXG4gICAgcHJldjogJ2ZjLWljb24tY2hldnJvbi1sZWZ0JyxcbiAgICBuZXh0OiAnZmMtaWNvbi1jaGV2cm9uLXJpZ2h0JyxcbiAgICBwcmV2WWVhcjogJ2ZjLWljb24tY2hldnJvbnMtbGVmdCcsXG4gICAgbmV4dFllYXI6ICdmYy1pY29uLWNoZXZyb25zLXJpZ2h0Jyxcbn07XG5TdGFuZGFyZFRoZW1lLnByb3RvdHlwZS5ydGxJY29uQ2xhc3NlcyA9IHtcbiAgICBwcmV2OiAnZmMtaWNvbi1jaGV2cm9uLXJpZ2h0JyxcbiAgICBuZXh0OiAnZmMtaWNvbi1jaGV2cm9uLWxlZnQnLFxuICAgIHByZXZZZWFyOiAnZmMtaWNvbi1jaGV2cm9ucy1yaWdodCcsXG4gICAgbmV4dFllYXI6ICdmYy1pY29uLWNoZXZyb25zLWxlZnQnLFxufTtcblN0YW5kYXJkVGhlbWUucHJvdG90eXBlLmljb25PdmVycmlkZU9wdGlvbiA9ICdidXR0b25JY29ucyc7IC8vIFRPRE86IG1ha2UgVFMtZnJpZW5kbHlcblN0YW5kYXJkVGhlbWUucHJvdG90eXBlLmljb25PdmVycmlkZUN1c3RvbUJ1dHRvbk9wdGlvbiA9ICdpY29uJztcblN0YW5kYXJkVGhlbWUucHJvdG90eXBlLmljb25PdmVycmlkZVByZWZpeCA9ICdmYy1pY29uLSc7XG5cbmZ1bmN0aW9uIGNvbXBpbGVWaWV3RGVmcyhkZWZhdWx0Q29uZmlncywgb3ZlcnJpZGVDb25maWdzKSB7XG4gICAgdmFyIGhhc2ggPSB7fTtcbiAgICB2YXIgdmlld1R5cGU7XG4gICAgZm9yICh2aWV3VHlwZSBpbiBkZWZhdWx0Q29uZmlncykge1xuICAgICAgICBlbnN1cmVWaWV3RGVmKHZpZXdUeXBlLCBoYXNoLCBkZWZhdWx0Q29uZmlncywgb3ZlcnJpZGVDb25maWdzKTtcbiAgICB9XG4gICAgZm9yICh2aWV3VHlwZSBpbiBvdmVycmlkZUNvbmZpZ3MpIHtcbiAgICAgICAgZW5zdXJlVmlld0RlZih2aWV3VHlwZSwgaGFzaCwgZGVmYXVsdENvbmZpZ3MsIG92ZXJyaWRlQ29uZmlncyk7XG4gICAgfVxuICAgIHJldHVybiBoYXNoO1xufVxuZnVuY3Rpb24gZW5zdXJlVmlld0RlZih2aWV3VHlwZSwgaGFzaCwgZGVmYXVsdENvbmZpZ3MsIG92ZXJyaWRlQ29uZmlncykge1xuICAgIGlmIChoYXNoW3ZpZXdUeXBlXSkge1xuICAgICAgICByZXR1cm4gaGFzaFt2aWV3VHlwZV07XG4gICAgfVxuICAgIHZhciB2aWV3RGVmID0gYnVpbGRWaWV3RGVmKHZpZXdUeXBlLCBoYXNoLCBkZWZhdWx0Q29uZmlncywgb3ZlcnJpZGVDb25maWdzKTtcbiAgICBpZiAodmlld0RlZikge1xuICAgICAgICBoYXNoW3ZpZXdUeXBlXSA9IHZpZXdEZWY7XG4gICAgfVxuICAgIHJldHVybiB2aWV3RGVmO1xufVxuZnVuY3Rpb24gYnVpbGRWaWV3RGVmKHZpZXdUeXBlLCBoYXNoLCBkZWZhdWx0Q29uZmlncywgb3ZlcnJpZGVDb25maWdzKSB7XG4gICAgdmFyIGRlZmF1bHRDb25maWcgPSBkZWZhdWx0Q29uZmlnc1t2aWV3VHlwZV07XG4gICAgdmFyIG92ZXJyaWRlQ29uZmlnID0gb3ZlcnJpZGVDb25maWdzW3ZpZXdUeXBlXTtcbiAgICB2YXIgcXVlcnlQcm9wID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuICgoZGVmYXVsdENvbmZpZyAmJiBkZWZhdWx0Q29uZmlnW25hbWVdICE9PSBudWxsKSA/IGRlZmF1bHRDb25maWdbbmFtZV0gOlxuICAgICAgICAoKG92ZXJyaWRlQ29uZmlnICYmIG92ZXJyaWRlQ29uZmlnW25hbWVdICE9PSBudWxsKSA/IG92ZXJyaWRlQ29uZmlnW25hbWVdIDogbnVsbCkpOyB9O1xuICAgIHZhciB0aGVDb21wb25lbnQgPSBxdWVyeVByb3AoJ2NvbXBvbmVudCcpO1xuICAgIHZhciBzdXBlclR5cGUgPSBxdWVyeVByb3AoJ3N1cGVyVHlwZScpO1xuICAgIHZhciBzdXBlckRlZiA9IG51bGw7XG4gICAgaWYgKHN1cGVyVHlwZSkge1xuICAgICAgICBpZiAoc3VwZXJUeXBlID09PSB2aWV3VHlwZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGhhdmUgYSBjdXN0b20gdmlldyB0eXBlIHRoYXQgcmVmZXJlbmNlcyBpdHNlbGYnKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlckRlZiA9IGVuc3VyZVZpZXdEZWYoc3VwZXJUeXBlLCBoYXNoLCBkZWZhdWx0Q29uZmlncywgb3ZlcnJpZGVDb25maWdzKTtcbiAgICB9XG4gICAgaWYgKCF0aGVDb21wb25lbnQgJiYgc3VwZXJEZWYpIHtcbiAgICAgICAgdGhlQ29tcG9uZW50ID0gc3VwZXJEZWYuY29tcG9uZW50O1xuICAgIH1cbiAgICBpZiAoIXRoZUNvbXBvbmVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDsgLy8gZG9uJ3QgdGhyb3cgYSB3YXJuaW5nLCBtaWdodCBiZSBzZXR0aW5ncyBmb3IgYSBzaW5nbGUtdW5pdCB2aWV3XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHZpZXdUeXBlLFxuICAgICAgICBjb21wb25lbnQ6IHRoZUNvbXBvbmVudCxcbiAgICAgICAgZGVmYXVsdHM6IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCAoc3VwZXJEZWYgPyBzdXBlckRlZi5kZWZhdWx0cyA6IHt9KSksIChkZWZhdWx0Q29uZmlnID8gZGVmYXVsdENvbmZpZy5yYXdPcHRpb25zIDoge30pKSxcbiAgICAgICAgb3ZlcnJpZGVzOiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgKHN1cGVyRGVmID8gc3VwZXJEZWYub3ZlcnJpZGVzIDoge30pKSwgKG92ZXJyaWRlQ29uZmlnID8gb3ZlcnJpZGVDb25maWcucmF3T3B0aW9ucyA6IHt9KSksXG4gICAgfTtcbn1cblxuLyogZXNsaW50IG1heC1jbGFzc2VzLXBlci1maWxlOiBvZmYgKi9cbi8vIE5PVEU6IGluIEpTWCwgeW91IHNob3VsZCBhbHdheXMgdXNlIHRoaXMgY2xhc3Mgd2l0aCA8SG9va1Byb3BzPiBhcmcuIG90aGVyd2lzZSwgd2lsbCBkZWZhdWx0IHRvIGFueT8/P1xudmFyIFJlbmRlckhvb2sgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFJlbmRlckhvb2ssIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVuZGVySG9vaygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnJvb3RFbFJlZiA9IHZkb21fY2pzLmNyZWF0ZVJlZigpO1xuICAgICAgICBfdGhpcy5oYW5kbGVSb290RWwgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIHNldFJlZihfdGhpcy5yb290RWxSZWYsIGVsKTtcbiAgICAgICAgICAgIGlmIChfdGhpcy5wcm9wcy5lbFJlZikge1xuICAgICAgICAgICAgICAgIHNldFJlZihfdGhpcy5wcm9wcy5lbFJlZiwgZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFJlbmRlckhvb2sucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdmFyIGhvb2tQcm9wcyA9IHByb3BzLmhvb2tQcm9wcztcbiAgICAgICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KE1vdW50SG9vaywgeyBob29rUHJvcHM6IGhvb2tQcm9wcywgZGlkTW91bnQ6IHByb3BzLmRpZE1vdW50LCB3aWxsVW5tb3VudDogcHJvcHMud2lsbFVubW91bnQsIGVsUmVmOiB0aGlzLmhhbmRsZVJvb3RFbCB9LCBmdW5jdGlvbiAocm9vdEVsUmVmKSB7IHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChDb250ZW50SG9vaywgeyBob29rUHJvcHM6IGhvb2tQcm9wcywgY29udGVudDogcHJvcHMuY29udGVudCwgZGVmYXVsdENvbnRlbnQ6IHByb3BzLmRlZmF1bHRDb250ZW50LCBiYWNrdXBFbFJlZjogX3RoaXMucm9vdEVsUmVmIH0sIGZ1bmN0aW9uIChpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpIHsgcmV0dXJuIHByb3BzLmNoaWxkcmVuKHJvb3RFbFJlZiwgbm9ybWFsaXplQ2xhc3NOYW1lcyhwcm9wcy5jbGFzc05hbWVzLCBob29rUHJvcHMpLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpOyB9KSk7IH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBSZW5kZXJIb29rO1xufShCYXNlQ29tcG9uZW50KSk7XG4vLyBUT0RPOiByZW5hbWUgdG8gYmUgYWJvdXQgZnVuY3Rpb24sIG5vdCBkZWZhdWx0LiB1c2UgaW4gYWJvdmUgdHlwZVxuLy8gZm9yIGZvcmNpbmcgcmVyZW5kZXIgb2YgY29tcG9uZW50cyB0aGF0IHVzZSB0aGUgQ29udGVudEhvb2tcbnZhciBDdXN0b21Db250ZW50UmVuZGVyQ29udGV4dCA9IHZkb21fY2pzLmNyZWF0ZUNvbnRleHQoMCk7XG5mdW5jdGlvbiBDb250ZW50SG9vayhwcm9wcykge1xuICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChDdXN0b21Db250ZW50UmVuZGVyQ29udGV4dC5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKHJlbmRlcklkKSB7IHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChDb250ZW50SG9va0lubmVyLCB0c2xpYi5fX2Fzc2lnbih7IHJlbmRlcklkOiByZW5kZXJJZCB9LCBwcm9wcykpKTsgfSkpO1xufVxudmFyIENvbnRlbnRIb29rSW5uZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKENvbnRlbnRIb29rSW5uZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29udGVudEhvb2tJbm5lcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmlubmVyRWxSZWYgPSB2ZG9tX2Nqcy5jcmVhdGVSZWYoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBDb250ZW50SG9va0lubmVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuKHRoaXMuaW5uZXJFbFJlZiwgdGhpcy5yZW5kZXJJbm5lckNvbnRlbnQoKSk7XG4gICAgfTtcbiAgICBDb250ZW50SG9va0lubmVyLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVDdXN0b21Db250ZW50KCk7XG4gICAgfTtcbiAgICBDb250ZW50SG9va0lubmVyLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ3VzdG9tQ29udGVudCgpO1xuICAgIH07XG4gICAgQ29udGVudEhvb2tJbm5lci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmN1c3RvbUNvbnRlbnRJbmZvICYmIHRoaXMuY3VzdG9tQ29udGVudEluZm8uZGVzdHJveSkge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21Db250ZW50SW5mby5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbnRlbnRIb29rSW5uZXIucHJvdG90eXBlLnJlbmRlcklubmVyQ29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGN1c3RvbUNvbnRlbnRJbmZvID0gdGhpcy5jdXN0b21Db250ZW50SW5mbzsgLy8gb25seSBwb3B1bGF0ZWQgaWYgdXNpbmcgbm9uLVtwXXJlYWN0IG5vZGUocylcbiAgICAgICAgdmFyIGlubmVyQ29udGVudCA9IHRoaXMuZ2V0SW5uZXJDb250ZW50KCk7XG4gICAgICAgIHZhciBtZXRhID0gdGhpcy5nZXRDb250ZW50TWV0YShpbm5lckNvbnRlbnQpO1xuICAgICAgICAvLyBpbml0aWFsIHJ1biwgb3IgY29udGVudC10eXBlIGNoYW5naW5nPyAoZnJvbSB2dWUgLT4gcmVhY3QgZm9yIGV4YW1wbGUpXG4gICAgICAgIGlmICghY3VzdG9tQ29udGVudEluZm8gfHwgY3VzdG9tQ29udGVudEluZm8uY29udGVudEtleSAhPT0gbWV0YS5jb250ZW50S2V5KSB7XG4gICAgICAgICAgICAvLyBjbGVhcmluZyBvbGQgdmFsdWVcbiAgICAgICAgICAgIGlmIChjdXN0b21Db250ZW50SW5mbykge1xuICAgICAgICAgICAgICAgIGlmIChjdXN0b21Db250ZW50SW5mby5kZXN0cm95KSB7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUNvbnRlbnRJbmZvLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VzdG9tQ29udGVudEluZm8gPSB0aGlzLmN1c3RvbUNvbnRlbnRJbmZvID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFzc2lnbmluZyBuZXcgdmFsdWVcbiAgICAgICAgICAgIGlmIChtZXRhLmNvbnRlbnRLZXkpIHtcbiAgICAgICAgICAgICAgICBjdXN0b21Db250ZW50SW5mbyA9IHRoaXMuY3VzdG9tQ29udGVudEluZm8gPSB0c2xpYi5fX2Fzc2lnbih7IGNvbnRlbnRLZXk6IG1ldGEuY29udGVudEtleSwgY29udGVudFZhbDogaW5uZXJDb250ZW50W21ldGEuY29udGVudEtleV0gfSwgbWV0YS5idWlsZExpZmVjeWNsZUZ1bmNzKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdXBkYXRpbmdcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdXN0b21Db250ZW50SW5mbykge1xuICAgICAgICAgICAgY3VzdG9tQ29udGVudEluZm8uY29udGVudFZhbCA9IGlubmVyQ29udGVudFttZXRhLmNvbnRlbnRLZXldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjdXN0b21Db250ZW50SW5mb1xuICAgICAgICAgICAgPyBbXSAvLyBzaWduYWwgdGhhdCBzb21ldGhpbmcgd2FzIHNwZWNpZmllZFxuICAgICAgICAgICAgOiBpbm5lckNvbnRlbnQ7IC8vIGFzc3VtZSBhIFtwXXJlYWN0IHZkb20gbm9kZS4gdXNlIGl0XG4gICAgfTtcbiAgICBDb250ZW50SG9va0lubmVyLnByb3RvdHlwZS5nZXRJbm5lckNvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHZhciBpbm5lckNvbnRlbnQgPSBub3JtYWxpemVDb250ZW50KHByb3BzLmNvbnRlbnQsIHByb3BzLmhvb2tQcm9wcyk7XG4gICAgICAgIGlmIChpbm5lckNvbnRlbnQgPT09IHVuZGVmaW5lZCkgeyAvLyB1c2UgdGhlIGRlZmF1bHRcbiAgICAgICAgICAgIGlubmVyQ29udGVudCA9IG5vcm1hbGl6ZUNvbnRlbnQocHJvcHMuZGVmYXVsdENvbnRlbnQsIHByb3BzLmhvb2tQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlubmVyQ29udGVudCA9PSBudWxsID8gbnVsbCA6IGlubmVyQ29udGVudDsgLy8gY29udmVydCB1bmRlZmluZWQgdG8gbnVsbCAoYmV0dGVyIGZvciBSZWFjdClcbiAgICB9O1xuICAgIENvbnRlbnRIb29rSW5uZXIucHJvdG90eXBlLmdldENvbnRlbnRNZXRhID0gZnVuY3Rpb24gKGlubmVyQ29udGVudCkge1xuICAgICAgICB2YXIgY29udGVudFR5cGVIYW5kbGVycyA9IHRoaXMuY29udGV4dC5wbHVnaW5Ib29rcy5jb250ZW50VHlwZUhhbmRsZXJzO1xuICAgICAgICB2YXIgY29udGVudEtleSA9ICcnO1xuICAgICAgICB2YXIgYnVpbGRMaWZlY3ljbGVGdW5jcyA9IG51bGw7XG4gICAgICAgIGlmIChpbm5lckNvbnRlbnQpIHsgLy8gYWxsb3dlZCB0byBiZSBudWxsLCBmb3IgY29udmVuaWVuY2UgdG8gY2FsbGVyXG4gICAgICAgICAgICBmb3IgKHZhciBzZWFyY2hLZXkgaW4gY29udGVudFR5cGVIYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGlmIChpbm5lckNvbnRlbnRbc2VhcmNoS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRLZXkgPSBzZWFyY2hLZXk7XG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkTGlmZWN5Y2xlRnVuY3MgPSBjb250ZW50VHlwZUhhbmRsZXJzW3NlYXJjaEtleV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBjb250ZW50S2V5OiBjb250ZW50S2V5LCBidWlsZExpZmVjeWNsZUZ1bmNzOiBidWlsZExpZmVjeWNsZUZ1bmNzIH07XG4gICAgfTtcbiAgICBDb250ZW50SG9va0lubmVyLnByb3RvdHlwZS51cGRhdGVDdXN0b21Db250ZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21Db250ZW50SW5mbykgeyAvLyBmb3Igbm9uLVtwXXJlYWN0XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUNvbnRlbnRJbmZvLnJlbmRlcih0aGlzLmlubmVyRWxSZWYuY3VycmVudCB8fCB0aGlzLnByb3BzLmJhY2t1cEVsUmVmLmN1cnJlbnQsIC8vIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpbnRvXG4gICAgICAgICAgICB0aGlzLmN1c3RvbUNvbnRlbnRJbmZvLmNvbnRlbnRWYWwpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQ29udGVudEhvb2tJbm5lcjtcbn0oQmFzZUNvbXBvbmVudCkpO1xudmFyIE1vdW50SG9vayA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoTW91bnRIb29rLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1vdW50SG9vaygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmhhbmRsZVJvb3RFbCA9IGZ1bmN0aW9uIChyb290RWwpIHtcbiAgICAgICAgICAgIF90aGlzLnJvb3RFbCA9IHJvb3RFbDtcbiAgICAgICAgICAgIGlmIChfdGhpcy5wcm9wcy5lbFJlZikge1xuICAgICAgICAgICAgICAgIHNldFJlZihfdGhpcy5wcm9wcy5lbFJlZiwgcm9vdEVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBNb3VudEhvb2sucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW4odGhpcy5oYW5kbGVSb290RWwpO1xuICAgIH07XG4gICAgTW91bnRIb29rLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdGhpcy5wcm9wcy5kaWRNb3VudDtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgdGhpcy5wcm9wcy5ob29rUHJvcHMpLCB7IGVsOiB0aGlzLnJvb3RFbCB9KSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE1vdW50SG9vay5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHRoaXMucHJvcHMud2lsbFVubW91bnQ7XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sodHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIHRoaXMucHJvcHMuaG9va1Byb3BzKSwgeyBlbDogdGhpcy5yb290RWwgfSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gTW91bnRIb29rO1xufShCYXNlQ29tcG9uZW50KSk7XG5mdW5jdGlvbiBidWlsZENsYXNzTmFtZU5vcm1hbGl6ZXIoKSB7XG4gICAgdmFyIGN1cnJlbnRHZW5lcmF0b3I7XG4gICAgdmFyIGN1cnJlbnRIb29rUHJvcHM7XG4gICAgdmFyIGN1cnJlbnRDbGFzc05hbWVzID0gW107XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChnZW5lcmF0b3IsIGhvb2tQcm9wcykge1xuICAgICAgICBpZiAoIWN1cnJlbnRIb29rUHJvcHMgfHwgIWlzUHJvcHNFcXVhbChjdXJyZW50SG9va1Byb3BzLCBob29rUHJvcHMpIHx8IGdlbmVyYXRvciAhPT0gY3VycmVudEdlbmVyYXRvcikge1xuICAgICAgICAgICAgY3VycmVudEdlbmVyYXRvciA9IGdlbmVyYXRvcjtcbiAgICAgICAgICAgIGN1cnJlbnRIb29rUHJvcHMgPSBob29rUHJvcHM7XG4gICAgICAgICAgICBjdXJyZW50Q2xhc3NOYW1lcyA9IG5vcm1hbGl6ZUNsYXNzTmFtZXMoZ2VuZXJhdG9yLCBob29rUHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjdXJyZW50Q2xhc3NOYW1lcztcbiAgICB9O1xufVxuZnVuY3Rpb24gbm9ybWFsaXplQ2xhc3NOYW1lcyhjbGFzc05hbWVzLCBob29rUHJvcHMpIHtcbiAgICBpZiAodHlwZW9mIGNsYXNzTmFtZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2xhc3NOYW1lcyA9IGNsYXNzTmFtZXMoaG9va1Byb3BzKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlQ2xhc3NOYW1lcyhjbGFzc05hbWVzKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnRlbnQoaW5wdXQsIGhvb2tQcm9wcykge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0KGhvb2tQcm9wcywgdmRvbV9janMuY3JlYXRlRWxlbWVudCk7IC8vIGdpdmUgdGhlIGZ1bmN0aW9uIHRoZSB2ZG9tLWNyZWF0aW9uIGZ1bmNcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0O1xufVxuXG52YXIgVmlld1Jvb3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFZpZXdSb290LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFZpZXdSb290KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubm9ybWFsaXplQ2xhc3NOYW1lcyA9IGJ1aWxkQ2xhc3NOYW1lTm9ybWFsaXplcigpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFZpZXdSb290LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgb3B0aW9ucyA9IGNvbnRleHQub3B0aW9ucztcbiAgICAgICAgdmFyIGhvb2tQcm9wcyA9IHsgdmlldzogY29udGV4dC52aWV3QXBpIH07XG4gICAgICAgIHZhciBjdXN0b21DbGFzc05hbWVzID0gdGhpcy5ub3JtYWxpemVDbGFzc05hbWVzKG9wdGlvbnMudmlld0NsYXNzTmFtZXMsIGhvb2tQcm9wcyk7XG4gICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChNb3VudEhvb2ssIHsgaG9va1Byb3BzOiBob29rUHJvcHMsIGRpZE1vdW50OiBvcHRpb25zLnZpZXdEaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMudmlld1dpbGxVbm1vdW50LCBlbFJlZjogcHJvcHMuZWxSZWYgfSwgZnVuY3Rpb24gKHJvb3RFbFJlZikgeyByZXR1cm4gcHJvcHMuY2hpbGRyZW4ocm9vdEVsUmVmLCBbXCJmYy1cIiArIHByb3BzLnZpZXdTcGVjLnR5cGUgKyBcIi12aWV3XCIsICdmYy12aWV3J10uY29uY2F0KGN1c3RvbUNsYXNzTmFtZXMpKTsgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFZpZXdSb290O1xufShCYXNlQ29tcG9uZW50KSk7XG5cbmZ1bmN0aW9uIHBhcnNlVmlld0NvbmZpZ3MoaW5wdXRzKSB7XG4gICAgcmV0dXJuIG1hcEhhc2goaW5wdXRzLCBwYXJzZVZpZXdDb25maWcpO1xufVxuZnVuY3Rpb24gcGFyc2VWaWV3Q29uZmlnKGlucHV0KSB7XG4gICAgdmFyIHJhd09wdGlvbnMgPSB0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbicgP1xuICAgICAgICB7IGNvbXBvbmVudDogaW5wdXQgfSA6XG4gICAgICAgIGlucHV0O1xuICAgIHZhciBjb21wb25lbnQgPSByYXdPcHRpb25zLmNvbXBvbmVudDtcbiAgICBpZiAocmF3T3B0aW9ucy5jb250ZW50KSB7XG4gICAgICAgIGNvbXBvbmVudCA9IGNyZWF0ZVZpZXdIb29rQ29tcG9uZW50KHJhd09wdGlvbnMpO1xuICAgICAgICAvLyBUT0RPOiByZW1vdmUgY29udGVudC9jbGFzc05hbWVzL2RpZE1vdW50L2V0YyBmcm9tIG9wdGlvbnM/XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHN1cGVyVHlwZTogcmF3T3B0aW9ucy50eXBlLFxuICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCxcbiAgICAgICAgcmF3T3B0aW9uczogcmF3T3B0aW9ucyxcbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlVmlld0hvb2tDb21wb25lbnQob3B0aW9ucykge1xuICAgIHJldHVybiBmdW5jdGlvbiAodmlld1Byb3BzKSB7IHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChWaWV3Q29udGV4dFR5cGUuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChjb250ZXh0KSB7IHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChWaWV3Um9vdCwgeyB2aWV3U3BlYzogY29udGV4dC52aWV3U3BlYyB9LCBmdW5jdGlvbiAodmlld0VsUmVmLCB2aWV3Q2xhc3NOYW1lcykge1xuICAgICAgICB2YXIgaG9va1Byb3BzID0gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIHZpZXdQcm9wcyksIHsgbmV4dERheVRocmVzaG9sZDogY29udGV4dC5vcHRpb25zLm5leHREYXlUaHJlc2hvbGQgfSk7XG4gICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChSZW5kZXJIb29rLCB7IGhvb2tQcm9wczogaG9va1Byb3BzLCBjbGFzc05hbWVzOiBvcHRpb25zLmNsYXNzTmFtZXMsIGNvbnRlbnQ6IG9wdGlvbnMuY29udGVudCwgZGlkTW91bnQ6IG9wdGlvbnMuZGlkTW91bnQsIHdpbGxVbm1vdW50OiBvcHRpb25zLndpbGxVbm1vdW50LCBlbFJlZjogdmlld0VsUmVmIH0sIGZ1bmN0aW9uIChyb290RWxSZWYsIGN1c3RvbUNsYXNzTmFtZXMsIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IHZpZXdDbGFzc05hbWVzLmNvbmNhdChjdXN0b21DbGFzc05hbWVzKS5qb2luKCcgJyksIHJlZjogcm9vdEVsUmVmIH0sIGlubmVyQ29udGVudCkpOyB9KSk7XG4gICAgfSkpOyB9KSk7IH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVmlld1NwZWNzKGRlZmF1bHRJbnB1dHMsIG9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcywgbG9jYWxlRGVmYXVsdHMpIHtcbiAgICB2YXIgZGVmYXVsdENvbmZpZ3MgPSBwYXJzZVZpZXdDb25maWdzKGRlZmF1bHRJbnB1dHMpO1xuICAgIHZhciBvdmVycmlkZUNvbmZpZ3MgPSBwYXJzZVZpZXdDb25maWdzKG9wdGlvbk92ZXJyaWRlcy52aWV3cyk7XG4gICAgdmFyIHZpZXdEZWZzID0gY29tcGlsZVZpZXdEZWZzKGRlZmF1bHRDb25maWdzLCBvdmVycmlkZUNvbmZpZ3MpO1xuICAgIHJldHVybiBtYXBIYXNoKHZpZXdEZWZzLCBmdW5jdGlvbiAodmlld0RlZikgeyByZXR1cm4gYnVpbGRWaWV3U3BlYyh2aWV3RGVmLCBvdmVycmlkZUNvbmZpZ3MsIG9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcywgbG9jYWxlRGVmYXVsdHMpOyB9KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkVmlld1NwZWModmlld0RlZiwgb3ZlcnJpZGVDb25maWdzLCBvcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsIGxvY2FsZURlZmF1bHRzKSB7XG4gICAgdmFyIGR1cmF0aW9uSW5wdXQgPSB2aWV3RGVmLm92ZXJyaWRlcy5kdXJhdGlvbiB8fFxuICAgICAgICB2aWV3RGVmLmRlZmF1bHRzLmR1cmF0aW9uIHx8XG4gICAgICAgIGR5bmFtaWNPcHRpb25PdmVycmlkZXMuZHVyYXRpb24gfHxcbiAgICAgICAgb3B0aW9uT3ZlcnJpZGVzLmR1cmF0aW9uO1xuICAgIHZhciBkdXJhdGlvbiA9IG51bGw7XG4gICAgdmFyIGR1cmF0aW9uVW5pdCA9ICcnO1xuICAgIHZhciBzaW5nbGVVbml0ID0gJyc7XG4gICAgdmFyIHNpbmdsZVVuaXRPdmVycmlkZXMgPSB7fTtcbiAgICBpZiAoZHVyYXRpb25JbnB1dCkge1xuICAgICAgICBkdXJhdGlvbiA9IGNyZWF0ZUR1cmF0aW9uQ2FjaGVkKGR1cmF0aW9uSW5wdXQpO1xuICAgICAgICBpZiAoZHVyYXRpb24pIHsgLy8gdmFsaWQ/XG4gICAgICAgICAgICB2YXIgZGVub20gPSBncmVhdGVzdER1cmF0aW9uRGVub21pbmF0b3IoZHVyYXRpb24pO1xuICAgICAgICAgICAgZHVyYXRpb25Vbml0ID0gZGVub20udW5pdDtcbiAgICAgICAgICAgIGlmIChkZW5vbS52YWx1ZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHNpbmdsZVVuaXQgPSBkdXJhdGlvblVuaXQ7XG4gICAgICAgICAgICAgICAgc2luZ2xlVW5pdE92ZXJyaWRlcyA9IG92ZXJyaWRlQ29uZmlnc1tkdXJhdGlvblVuaXRdID8gb3ZlcnJpZGVDb25maWdzW2R1cmF0aW9uVW5pdF0ucmF3T3B0aW9ucyA6IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBxdWVyeUJ1dHRvblRleHQgPSBmdW5jdGlvbiAob3B0aW9uc1N1YnNldCkge1xuICAgICAgICB2YXIgYnV0dG9uVGV4dE1hcCA9IG9wdGlvbnNTdWJzZXQuYnV0dG9uVGV4dCB8fCB7fTtcbiAgICAgICAgdmFyIGJ1dHRvblRleHRLZXkgPSB2aWV3RGVmLmRlZmF1bHRzLmJ1dHRvblRleHRLZXk7XG4gICAgICAgIGlmIChidXR0b25UZXh0S2V5ICE9IG51bGwgJiYgYnV0dG9uVGV4dE1hcFtidXR0b25UZXh0S2V5XSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYnV0dG9uVGV4dE1hcFtidXR0b25UZXh0S2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnV0dG9uVGV4dE1hcFt2aWV3RGVmLnR5cGVdICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBidXR0b25UZXh0TWFwW3ZpZXdEZWYudHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1dHRvblRleHRNYXBbc2luZ2xlVW5pdF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1dHRvblRleHRNYXBbc2luZ2xlVW5pdF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICB2YXIgcXVlcnlCdXR0b25UaXRsZSA9IGZ1bmN0aW9uIChvcHRpb25zU3Vic2V0KSB7XG4gICAgICAgIHZhciBidXR0b25IaW50cyA9IG9wdGlvbnNTdWJzZXQuYnV0dG9uSGludHMgfHwge307XG4gICAgICAgIHZhciBidXR0b25LZXkgPSB2aWV3RGVmLmRlZmF1bHRzLmJ1dHRvblRleHRLZXk7IC8vIHVzZSBzYW1lIGtleSBhcyB0ZXh0XG4gICAgICAgIGlmIChidXR0b25LZXkgIT0gbnVsbCAmJiBidXR0b25IaW50c1tidXR0b25LZXldICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBidXR0b25IaW50c1tidXR0b25LZXldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidXR0b25IaW50c1t2aWV3RGVmLnR5cGVdICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBidXR0b25IaW50c1t2aWV3RGVmLnR5cGVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidXR0b25IaW50c1tzaW5nbGVVbml0XSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYnV0dG9uSGludHNbc2luZ2xlVW5pdF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiB2aWV3RGVmLnR5cGUsXG4gICAgICAgIGNvbXBvbmVudDogdmlld0RlZi5jb21wb25lbnQsXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgZHVyYXRpb25Vbml0OiBkdXJhdGlvblVuaXQsXG4gICAgICAgIHNpbmdsZVVuaXQ6IHNpbmdsZVVuaXQsXG4gICAgICAgIG9wdGlvbkRlZmF1bHRzOiB2aWV3RGVmLmRlZmF1bHRzLFxuICAgICAgICBvcHRpb25PdmVycmlkZXM6IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBzaW5nbGVVbml0T3ZlcnJpZGVzKSwgdmlld0RlZi5vdmVycmlkZXMpLFxuICAgICAgICBidXR0b25UZXh0T3ZlcnJpZGU6IHF1ZXJ5QnV0dG9uVGV4dChkeW5hbWljT3B0aW9uT3ZlcnJpZGVzKSB8fFxuICAgICAgICAgICAgcXVlcnlCdXR0b25UZXh0KG9wdGlvbk92ZXJyaWRlcykgfHwgLy8gY29uc3RydWN0b3Itc3BlY2lmaWVkIGJ1dHRvblRleHQgbG9va3VwIGhhc2ggdGFrZXMgcHJlY2VkZW5jZVxuICAgICAgICAgICAgdmlld0RlZi5vdmVycmlkZXMuYnV0dG9uVGV4dCxcbiAgICAgICAgYnV0dG9uVGV4dERlZmF1bHQ6IHF1ZXJ5QnV0dG9uVGV4dChsb2NhbGVEZWZhdWx0cykgfHxcbiAgICAgICAgICAgIHZpZXdEZWYuZGVmYXVsdHMuYnV0dG9uVGV4dCB8fFxuICAgICAgICAgICAgcXVlcnlCdXR0b25UZXh0KEJBU0VfT1BUSU9OX0RFRkFVTFRTKSB8fFxuICAgICAgICAgICAgdmlld0RlZi50eXBlLFxuICAgICAgICAvLyBub3QgRFJZXG4gICAgICAgIGJ1dHRvblRpdGxlT3ZlcnJpZGU6IHF1ZXJ5QnV0dG9uVGl0bGUoZHluYW1pY09wdGlvbk92ZXJyaWRlcykgfHxcbiAgICAgICAgICAgIHF1ZXJ5QnV0dG9uVGl0bGUob3B0aW9uT3ZlcnJpZGVzKSB8fFxuICAgICAgICAgICAgdmlld0RlZi5vdmVycmlkZXMuYnV0dG9uSGludCxcbiAgICAgICAgYnV0dG9uVGl0bGVEZWZhdWx0OiBxdWVyeUJ1dHRvblRpdGxlKGxvY2FsZURlZmF1bHRzKSB8fFxuICAgICAgICAgICAgdmlld0RlZi5kZWZhdWx0cy5idXR0b25IaW50IHx8XG4gICAgICAgICAgICBxdWVyeUJ1dHRvblRpdGxlKEJBU0VfT1BUSU9OX0RFRkFVTFRTKSxcbiAgICAgICAgLy8gd2lsbCBldmVudHVhbGx5IGZhbGwgYmFjayB0byBidXR0b25UZXh0XG4gICAgfTtcbn1cbi8vIGhhY2sgdG8gZ2V0IG1lbW9pemF0aW9uIHdvcmtpbmdcbnZhciBkdXJhdGlvbklucHV0TWFwID0ge307XG5mdW5jdGlvbiBjcmVhdGVEdXJhdGlvbkNhY2hlZChkdXJhdGlvbklucHV0KSB7XG4gICAgdmFyIGpzb24gPSBKU09OLnN0cmluZ2lmeShkdXJhdGlvbklucHV0KTtcbiAgICB2YXIgcmVzID0gZHVyYXRpb25JbnB1dE1hcFtqc29uXTtcbiAgICBpZiAocmVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzID0gY3JlYXRlRHVyYXRpb24oZHVyYXRpb25JbnB1dCk7XG4gICAgICAgIGR1cmF0aW9uSW5wdXRNYXBbanNvbl0gPSByZXM7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbnZhciBEYXRlUHJvZmlsZUdlbmVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEYXRlUHJvZmlsZUdlbmVyYXRvcihwcm9wcykge1xuICAgICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgICAgIHRoaXMubm93RGF0ZSA9IGdldE5vdyhwcm9wcy5ub3dJbnB1dCwgcHJvcHMuZGF0ZUVudik7XG4gICAgICAgIHRoaXMuaW5pdEhpZGRlbkRheXMoKTtcbiAgICB9XG4gICAgLyogRGF0ZSBSYW5nZSBDb21wdXRhdGlvblxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4gICAgLy8gQnVpbGRzIGEgc3RydWN0dXJlIHdpdGggaW5mbyBhYm91dCB3aGF0IHRoZSBkYXRlcy9yYW5nZXMgd2lsbCBiZSBmb3IgdGhlIFwicHJldlwiIHZpZXcuXG4gICAgRGF0ZVByb2ZpbGVHZW5lcmF0b3IucHJvdG90eXBlLmJ1aWxkUHJldiA9IGZ1bmN0aW9uIChjdXJyZW50RGF0ZVByb2ZpbGUsIGN1cnJlbnREYXRlLCBmb3JjZVRvVmFsaWQpIHtcbiAgICAgICAgdmFyIGRhdGVFbnYgPSB0aGlzLnByb3BzLmRhdGVFbnY7XG4gICAgICAgIHZhciBwcmV2RGF0ZSA9IGRhdGVFbnYuc3VidHJhY3QoZGF0ZUVudi5zdGFydE9mKGN1cnJlbnREYXRlLCBjdXJyZW50RGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlVW5pdCksIC8vIGltcG9ydGFudCBmb3Igc3RhcnQtb2YtbW9udGhcbiAgICAgICAgY3VycmVudERhdGVQcm9maWxlLmRhdGVJbmNyZW1lbnQpO1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZChwcmV2RGF0ZSwgLTEsIGZvcmNlVG9WYWxpZCk7XG4gICAgfTtcbiAgICAvLyBCdWlsZHMgYSBzdHJ1Y3R1cmUgd2l0aCBpbmZvIGFib3V0IHdoYXQgdGhlIGRhdGVzL3JhbmdlcyB3aWxsIGJlIGZvciB0aGUgXCJuZXh0XCIgdmlldy5cbiAgICBEYXRlUHJvZmlsZUdlbmVyYXRvci5wcm90b3R5cGUuYnVpbGROZXh0ID0gZnVuY3Rpb24gKGN1cnJlbnREYXRlUHJvZmlsZSwgY3VycmVudERhdGUsIGZvcmNlVG9WYWxpZCkge1xuICAgICAgICB2YXIgZGF0ZUVudiA9IHRoaXMucHJvcHMuZGF0ZUVudjtcbiAgICAgICAgdmFyIG5leHREYXRlID0gZGF0ZUVudi5hZGQoZGF0ZUVudi5zdGFydE9mKGN1cnJlbnREYXRlLCBjdXJyZW50RGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlVW5pdCksIC8vIGltcG9ydGFudCBmb3Igc3RhcnQtb2YtbW9udGhcbiAgICAgICAgY3VycmVudERhdGVQcm9maWxlLmRhdGVJbmNyZW1lbnQpO1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZChuZXh0RGF0ZSwgMSwgZm9yY2VUb1ZhbGlkKTtcbiAgICB9O1xuICAgIC8vIEJ1aWxkcyBhIHN0cnVjdHVyZSBob2xkaW5nIGRhdGVzL3JhbmdlcyBmb3IgcmVuZGVyaW5nIGFyb3VuZCB0aGUgZ2l2ZW4gZGF0ZS5cbiAgICAvLyBPcHRpb25hbCBkaXJlY3Rpb24gcGFyYW0gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGUgaXMgYmVpbmcgaW5jcmVtZW50ZWQvZGVjcmVtZW50ZWRcbiAgICAvLyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gZGVjcmVtZW50ZWQgPSAtMSwgaW5jcmVtZW50ZWQgPSAxIChkZWZhdWx0KS5cbiAgICBEYXRlUHJvZmlsZUdlbmVyYXRvci5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoY3VycmVudERhdGUsIGRpcmVjdGlvbiwgZm9yY2VUb1ZhbGlkKSB7XG4gICAgICAgIGlmIChmb3JjZVRvVmFsaWQgPT09IHZvaWQgMCkgeyBmb3JjZVRvVmFsaWQgPSB0cnVlOyB9XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHZhciB2YWxpZFJhbmdlO1xuICAgICAgICB2YXIgY3VycmVudEluZm87XG4gICAgICAgIHZhciBpc1JhbmdlQWxsRGF5O1xuICAgICAgICB2YXIgcmVuZGVyUmFuZ2U7XG4gICAgICAgIHZhciBhY3RpdmVSYW5nZTtcbiAgICAgICAgdmFyIGlzVmFsaWQ7XG4gICAgICAgIHZhbGlkUmFuZ2UgPSB0aGlzLmJ1aWxkVmFsaWRSYW5nZSgpO1xuICAgICAgICB2YWxpZFJhbmdlID0gdGhpcy50cmltSGlkZGVuRGF5cyh2YWxpZFJhbmdlKTtcbiAgICAgICAgaWYgKGZvcmNlVG9WYWxpZCkge1xuICAgICAgICAgICAgY3VycmVudERhdGUgPSBjb25zdHJhaW5NYXJrZXJUb1JhbmdlKGN1cnJlbnREYXRlLCB2YWxpZFJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50SW5mbyA9IHRoaXMuYnVpbGRDdXJyZW50UmFuZ2VJbmZvKGN1cnJlbnREYXRlLCBkaXJlY3Rpb24pO1xuICAgICAgICBpc1JhbmdlQWxsRGF5ID0gL14oeWVhcnxtb250aHx3ZWVrfGRheSkkLy50ZXN0KGN1cnJlbnRJbmZvLnVuaXQpO1xuICAgICAgICByZW5kZXJSYW5nZSA9IHRoaXMuYnVpbGRSZW5kZXJSYW5nZSh0aGlzLnRyaW1IaWRkZW5EYXlzKGN1cnJlbnRJbmZvLnJhbmdlKSwgY3VycmVudEluZm8udW5pdCwgaXNSYW5nZUFsbERheSk7XG4gICAgICAgIHJlbmRlclJhbmdlID0gdGhpcy50cmltSGlkZGVuRGF5cyhyZW5kZXJSYW5nZSk7XG4gICAgICAgIGFjdGl2ZVJhbmdlID0gcmVuZGVyUmFuZ2U7XG4gICAgICAgIGlmICghcHJvcHMuc2hvd05vbkN1cnJlbnREYXRlcykge1xuICAgICAgICAgICAgYWN0aXZlUmFuZ2UgPSBpbnRlcnNlY3RSYW5nZXMoYWN0aXZlUmFuZ2UsIGN1cnJlbnRJbmZvLnJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICBhY3RpdmVSYW5nZSA9IHRoaXMuYWRqdXN0QWN0aXZlUmFuZ2UoYWN0aXZlUmFuZ2UpO1xuICAgICAgICBhY3RpdmVSYW5nZSA9IGludGVyc2VjdFJhbmdlcyhhY3RpdmVSYW5nZSwgdmFsaWRSYW5nZSk7IC8vIG1pZ2h0IHJldHVybiBudWxsXG4gICAgICAgIC8vIGl0J3MgaW52YWxpZCBpZiB0aGUgb3JpZ2luYWxseSByZXF1ZXN0ZWQgZGF0ZSBpcyBub3QgY29udGFpbmVkLFxuICAgICAgICAvLyBvciBpZiB0aGUgcmFuZ2UgaXMgY29tcGxldGVseSBvdXRzaWRlIG9mIHRoZSB2YWxpZCByYW5nZS5cbiAgICAgICAgaXNWYWxpZCA9IHJhbmdlc0ludGVyc2VjdChjdXJyZW50SW5mby5yYW5nZSwgdmFsaWRSYW5nZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvLyBjb25zdHJhaW50IGZvciB3aGVyZSBwcmV2L25leHQgb3BlcmF0aW9ucyBjYW4gZ28gYW5kIHdoZXJlIGV2ZW50cyBjYW4gYmUgZHJhZ2dlZC9yZXNpemVkIHRvLlxuICAgICAgICAgICAgLy8gYW4gb2JqZWN0IHdpdGggb3B0aW9uYWwgc3RhcnQgYW5kIGVuZCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgdmFsaWRSYW5nZTogdmFsaWRSYW5nZSxcbiAgICAgICAgICAgIC8vIHJhbmdlIHRoZSB2aWV3IGlzIGZvcm1hbGx5IHJlc3BvbnNpYmxlIGZvci5cbiAgICAgICAgICAgIC8vIGZvciBleGFtcGxlLCBhIG1vbnRoIHZpZXcgbWlnaHQgaGF2ZSAxc3QtMzFzdCwgZXhjbHVkaW5nIHBhZGRlZCBkYXRlc1xuICAgICAgICAgICAgY3VycmVudFJhbmdlOiBjdXJyZW50SW5mby5yYW5nZSxcbiAgICAgICAgICAgIC8vIG5hbWUgb2YgbGFyZ2VzdCB1bml0IGJlaW5nIGRpc3BsYXllZCwgbGlrZSBcIm1vbnRoXCIgb3IgXCJ3ZWVrXCJcbiAgICAgICAgICAgIGN1cnJlbnRSYW5nZVVuaXQ6IGN1cnJlbnRJbmZvLnVuaXQsXG4gICAgICAgICAgICBpc1JhbmdlQWxsRGF5OiBpc1JhbmdlQWxsRGF5LFxuICAgICAgICAgICAgLy8gZGF0ZXMgdGhhdCBkaXNwbGF5IGV2ZW50cyBhbmQgYWNjZXB0IGRyYWctbi1kcm9wXG4gICAgICAgICAgICAvLyB3aWxsIGJlIGBudWxsYCBpZiBubyBkYXRlcyBhY2NlcHQgZXZlbnRzXG4gICAgICAgICAgICBhY3RpdmVSYW5nZTogYWN0aXZlUmFuZ2UsXG4gICAgICAgICAgICAvLyBkYXRlIHJhbmdlIHdpdGggYSByZW5kZXJlZCBza2VsZXRvblxuICAgICAgICAgICAgLy8gaW5jbHVkZXMgbm90LWFjdGl2ZSBkYXlzIHRoYXQgbmVlZCBzb21lIHNvcnQgb2YgRE9NXG4gICAgICAgICAgICByZW5kZXJSYW5nZTogcmVuZGVyUmFuZ2UsXG4gICAgICAgICAgICAvLyBEdXJhdGlvbiBvYmplY3QgdGhhdCBkZW5vdGVzIHRoZSBmaXJzdCB2aXNpYmxlIHRpbWUgb2YgYW55IGdpdmVuIGRheVxuICAgICAgICAgICAgc2xvdE1pblRpbWU6IHByb3BzLnNsb3RNaW5UaW1lLFxuICAgICAgICAgICAgLy8gRHVyYXRpb24gb2JqZWN0IHRoYXQgZGVub3RlcyB0aGUgZXhjbHVzaXZlIHZpc2libGUgZW5kIHRpbWUgb2YgYW55IGdpdmVuIGRheVxuICAgICAgICAgICAgc2xvdE1heFRpbWU6IHByb3BzLnNsb3RNYXhUaW1lLFxuICAgICAgICAgICAgaXNWYWxpZDogaXNWYWxpZCxcbiAgICAgICAgICAgIC8vIGhvdyBmYXIgdGhlIGN1cnJlbnQgZGF0ZSB3aWxsIG1vdmUgZm9yIGEgcHJldi9uZXh0IG9wZXJhdGlvblxuICAgICAgICAgICAgZGF0ZUluY3JlbWVudDogdGhpcy5idWlsZERhdGVJbmNyZW1lbnQoY3VycmVudEluZm8uZHVyYXRpb24pLFxuICAgICAgICAgICAgLy8gcGFzcyBhIGZhbGxiYWNrIChtaWdodCBiZSBudWxsKSBeXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvLyBCdWlsZHMgYW4gb2JqZWN0IHdpdGggb3B0aW9uYWwgc3RhcnQvZW5kIHByb3BlcnRpZXMuXG4gICAgLy8gSW5kaWNhdGVzIHRoZSBtaW5pbXVtL21heGltdW0gZGF0ZXMgdG8gZGlzcGxheS5cbiAgICAvLyBub3QgcmVzcG9uc2libGUgZm9yIHRyaW1taW5nIGhpZGRlbiBkYXlzLlxuICAgIERhdGVQcm9maWxlR2VuZXJhdG9yLnByb3RvdHlwZS5idWlsZFZhbGlkUmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IHRoaXMucHJvcHMudmFsaWRSYW5nZUlucHV0O1xuICAgICAgICB2YXIgc2ltcGxlSW5wdXQgPSB0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gaW5wdXQuY2FsbCh0aGlzLnByb3BzLmNhbGVuZGFyQXBpLCB0aGlzLm5vd0RhdGUpXG4gICAgICAgICAgICA6IGlucHV0O1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZpbmVSYW5nZShzaW1wbGVJbnB1dCkgfHxcbiAgICAgICAgICAgIHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9OyAvLyBjb21wbGV0ZWx5IG9wZW4tZW5kZWRcbiAgICB9O1xuICAgIC8vIEJ1aWxkcyBhIHN0cnVjdHVyZSB3aXRoIGluZm8gYWJvdXQgdGhlIFwiY3VycmVudFwiIHJhbmdlLCB0aGUgcmFuZ2UgdGhhdCBpc1xuICAgIC8vIGhpZ2hsaWdodGVkIGFzIGJlaW5nIHRoZSBjdXJyZW50IG1vbnRoIGZvciBleGFtcGxlLlxuICAgIC8vIFNlZSBidWlsZCgpIGZvciBhIGRlc2NyaXB0aW9uIG9mIGBkaXJlY3Rpb25gLlxuICAgIC8vIEd1YXJhbnRlZWQgdG8gaGF2ZSBgcmFuZ2VgIGFuZCBgdW5pdGAgcHJvcGVydGllcy4gYGR1cmF0aW9uYCBpcyBvcHRpb25hbC5cbiAgICBEYXRlUHJvZmlsZUdlbmVyYXRvci5wcm90b3R5cGUuYnVpbGRDdXJyZW50UmFuZ2VJbmZvID0gZnVuY3Rpb24gKGRhdGUsIGRpcmVjdGlvbikge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBudWxsO1xuICAgICAgICB2YXIgdW5pdCA9IG51bGw7XG4gICAgICAgIHZhciByYW5nZSA9IG51bGw7XG4gICAgICAgIHZhciBkYXlDb3VudDtcbiAgICAgICAgaWYgKHByb3BzLmR1cmF0aW9uKSB7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHByb3BzLmR1cmF0aW9uO1xuICAgICAgICAgICAgdW5pdCA9IHByb3BzLmR1cmF0aW9uVW5pdDtcbiAgICAgICAgICAgIHJhbmdlID0gdGhpcy5idWlsZFJhbmdlRnJvbUR1cmF0aW9uKGRhdGUsIGRpcmVjdGlvbiwgZHVyYXRpb24sIHVuaXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChkYXlDb3VudCA9IHRoaXMucHJvcHMuZGF5Q291bnQpKSB7XG4gICAgICAgICAgICB1bml0ID0gJ2RheSc7XG4gICAgICAgICAgICByYW5nZSA9IHRoaXMuYnVpbGRSYW5nZUZyb21EYXlDb3VudChkYXRlLCBkaXJlY3Rpb24sIGRheUNvdW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgocmFuZ2UgPSB0aGlzLmJ1aWxkQ3VzdG9tVmlzaWJsZVJhbmdlKGRhdGUpKSkge1xuICAgICAgICAgICAgdW5pdCA9IHByb3BzLmRhdGVFbnYuZ3JlYXRlc3RXaG9sZVVuaXQocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCkudW5pdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0gdGhpcy5nZXRGYWxsYmFja0R1cmF0aW9uKCk7XG4gICAgICAgICAgICB1bml0ID0gZ3JlYXRlc3REdXJhdGlvbkRlbm9taW5hdG9yKGR1cmF0aW9uKS51bml0O1xuICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLmJ1aWxkUmFuZ2VGcm9tRHVyYXRpb24oZGF0ZSwgZGlyZWN0aW9uLCBkdXJhdGlvbiwgdW5pdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZHVyYXRpb246IGR1cmF0aW9uLCB1bml0OiB1bml0LCByYW5nZTogcmFuZ2UgfTtcbiAgICB9O1xuICAgIERhdGVQcm9maWxlR2VuZXJhdG9yLnByb3RvdHlwZS5nZXRGYWxsYmFja0R1cmF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oeyBkYXk6IDEgfSk7XG4gICAgfTtcbiAgICAvLyBSZXR1cm5zIGEgbmV3IGFjdGl2ZVJhbmdlIHRvIGhhdmUgdGltZSB2YWx1ZXMgKHVuLWFtYmlndWF0ZSlcbiAgICAvLyBzbG90TWluVGltZSBvciBzbG90TWF4VGltZSBjYXVzZXMgdGhlIHJhbmdlIHRvIGV4cGFuZC5cbiAgICBEYXRlUHJvZmlsZUdlbmVyYXRvci5wcm90b3R5cGUuYWRqdXN0QWN0aXZlUmFuZ2UgPSBmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5wcm9wcywgZGF0ZUVudiA9IF9hLmRhdGVFbnYsIHVzZXNNaW5NYXhUaW1lID0gX2EudXNlc01pbk1heFRpbWUsIHNsb3RNaW5UaW1lID0gX2Euc2xvdE1pblRpbWUsIHNsb3RNYXhUaW1lID0gX2Euc2xvdE1heFRpbWU7XG4gICAgICAgIHZhciBzdGFydCA9IHJhbmdlLnN0YXJ0LCBlbmQgPSByYW5nZS5lbmQ7XG4gICAgICAgIGlmICh1c2VzTWluTWF4VGltZSkge1xuICAgICAgICAgICAgLy8gZXhwYW5kIGFjdGl2ZSByYW5nZSBpZiBzbG90TWluVGltZSBpcyBuZWdhdGl2ZSAod2h5IG5vdCB3aGVuIHBvc2l0aXZlPylcbiAgICAgICAgICAgIGlmIChhc1JvdWdoRGF5cyhzbG90TWluVGltZSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBzdGFydE9mRGF5KHN0YXJ0KTsgLy8gbmVjZXNzYXJ5P1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gZGF0ZUVudi5hZGQoc3RhcnQsIHNsb3RNaW5UaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGV4cGFuZCBhY3RpdmUgcmFuZ2UgaWYgc2xvdE1heFRpbWUgaXMgYmV5b25kIG9uZSBkYXkgKHdoeSBub3Qgd2hlbiBuZWdhdGl2ZT8pXG4gICAgICAgICAgICBpZiAoYXNSb3VnaERheXMoc2xvdE1heFRpbWUpID4gMSkge1xuICAgICAgICAgICAgICAgIGVuZCA9IHN0YXJ0T2ZEYXkoZW5kKTsgLy8gbmVjZXNzYXJ5P1xuICAgICAgICAgICAgICAgIGVuZCA9IGFkZERheXMoZW5kLCAtMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0ZUVudi5hZGQoZW5kLCBzbG90TWF4VGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9O1xuICAgIH07XG4gICAgLy8gQnVpbGRzIHRoZSBcImN1cnJlbnRcIiByYW5nZSB3aGVuIGl0IGlzIHNwZWNpZmllZCBhcyBhbiBleHBsaWNpdCBkdXJhdGlvbi5cbiAgICAvLyBgdW5pdGAgaXMgdGhlIGFscmVhZHktY29tcHV0ZWQgZ3JlYXRlc3REdXJhdGlvbkRlbm9taW5hdG9yIHVuaXQgb2YgZHVyYXRpb24uXG4gICAgRGF0ZVByb2ZpbGVHZW5lcmF0b3IucHJvdG90eXBlLmJ1aWxkUmFuZ2VGcm9tRHVyYXRpb24gPSBmdW5jdGlvbiAoZGF0ZSwgZGlyZWN0aW9uLCBkdXJhdGlvbiwgdW5pdCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLnByb3BzLCBkYXRlRW52ID0gX2EuZGF0ZUVudiwgZGF0ZUFsaWdubWVudCA9IF9hLmRhdGVBbGlnbm1lbnQ7XG4gICAgICAgIHZhciBzdGFydDtcbiAgICAgICAgdmFyIGVuZDtcbiAgICAgICAgdmFyIHJlcztcbiAgICAgICAgLy8gY29tcHV0ZSB3aGF0IHRoZSBhbGlnbm1lbnQgc2hvdWxkIGJlXG4gICAgICAgIGlmICghZGF0ZUFsaWdubWVudCkge1xuICAgICAgICAgICAgdmFyIGRhdGVJbmNyZW1lbnQgPSB0aGlzLnByb3BzLmRhdGVJbmNyZW1lbnQ7XG4gICAgICAgICAgICBpZiAoZGF0ZUluY3JlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgc21hbGxlciBvZiB0aGUgdHdvIHVuaXRzXG4gICAgICAgICAgICAgICAgaWYgKGFzUm91Z2hNcyhkYXRlSW5jcmVtZW50KSA8IGFzUm91Z2hNcyhkdXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUFsaWdubWVudCA9IGdyZWF0ZXN0RHVyYXRpb25EZW5vbWluYXRvcihkYXRlSW5jcmVtZW50KS51bml0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUFsaWdubWVudCA9IHVuaXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0ZUFsaWdubWVudCA9IHVuaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgdGhlIHZpZXcgZGlzcGxheXMgYSBzaW5nbGUgZGF5IG9yIHNtYWxsZXJcbiAgICAgICAgaWYgKGFzUm91Z2hEYXlzKGR1cmF0aW9uKSA8PSAxKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0hpZGRlbkRheShzdGFydCkpIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IHRoaXMuc2tpcEhpZGRlbkRheXMoc3RhcnQsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBzdGFydE9mRGF5KHN0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBjb21wdXRlUmVzKCkge1xuICAgICAgICAgICAgc3RhcnQgPSBkYXRlRW52LnN0YXJ0T2YoZGF0ZSwgZGF0ZUFsaWdubWVudCk7XG4gICAgICAgICAgICBlbmQgPSBkYXRlRW52LmFkZChzdGFydCwgZHVyYXRpb24pO1xuICAgICAgICAgICAgcmVzID0geyBzdGFydDogc3RhcnQsIGVuZDogZW5kIH07XG4gICAgICAgIH1cbiAgICAgICAgY29tcHV0ZVJlcygpO1xuICAgICAgICAvLyBpZiByYW5nZSBpcyBjb21wbGV0ZWx5IGVudmVsb3BlZCBieSBoaWRkZW4gZGF5cywgZ28gcGFzdCB0aGUgaGlkZGVuIGRheXNcbiAgICAgICAgaWYgKCF0aGlzLnRyaW1IaWRkZW5EYXlzKHJlcykpIHtcbiAgICAgICAgICAgIGRhdGUgPSB0aGlzLnNraXBIaWRkZW5EYXlzKGRhdGUsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICBjb21wdXRlUmVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIC8vIEJ1aWxkcyB0aGUgXCJjdXJyZW50XCIgcmFuZ2Ugd2hlbiBhIGRheUNvdW50IGlzIHNwZWNpZmllZC5cbiAgICBEYXRlUHJvZmlsZUdlbmVyYXRvci5wcm90b3R5cGUuYnVpbGRSYW5nZUZyb21EYXlDb3VudCA9IGZ1bmN0aW9uIChkYXRlLCBkaXJlY3Rpb24sIGRheUNvdW50KSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsIGRhdGVFbnYgPSBfYS5kYXRlRW52LCBkYXRlQWxpZ25tZW50ID0gX2EuZGF0ZUFsaWdubWVudDtcbiAgICAgICAgdmFyIHJ1bm5pbmdDb3VudCA9IDA7XG4gICAgICAgIHZhciBzdGFydCA9IGRhdGU7XG4gICAgICAgIHZhciBlbmQ7XG4gICAgICAgIGlmIChkYXRlQWxpZ25tZW50KSB7XG4gICAgICAgICAgICBzdGFydCA9IGRhdGVFbnYuc3RhcnRPZihzdGFydCwgZGF0ZUFsaWdubWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnQgPSBzdGFydE9mRGF5KHN0YXJ0KTtcbiAgICAgICAgc3RhcnQgPSB0aGlzLnNraXBIaWRkZW5EYXlzKHN0YXJ0LCBkaXJlY3Rpb24pO1xuICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgZW5kID0gYWRkRGF5cyhlbmQsIDEpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzSGlkZGVuRGF5KGVuZCkpIHtcbiAgICAgICAgICAgICAgICBydW5uaW5nQ291bnQgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAocnVubmluZ0NvdW50IDwgZGF5Q291bnQpO1xuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnQsIGVuZDogZW5kIH07XG4gICAgfTtcbiAgICAvLyBCdWlsZHMgYSBub3JtYWxpemVkIHJhbmdlIG9iamVjdCBmb3IgdGhlIFwidmlzaWJsZVwiIHJhbmdlLFxuICAgIC8vIHdoaWNoIGlzIGEgd2F5IHRvIGRlZmluZSB0aGUgY3VycmVudFJhbmdlIGFuZCBhY3RpdmVSYW5nZSBhdCB0aGUgc2FtZSB0aW1lLlxuICAgIERhdGVQcm9maWxlR2VuZXJhdG9yLnByb3RvdHlwZS5idWlsZEN1c3RvbVZpc2libGVSYW5nZSA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHZhciBpbnB1dCA9IHByb3BzLnZpc2libGVSYW5nZUlucHV0O1xuICAgICAgICB2YXIgc2ltcGxlSW5wdXQgPSB0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gaW5wdXQuY2FsbChwcm9wcy5jYWxlbmRhckFwaSwgcHJvcHMuZGF0ZUVudi50b0RhdGUoZGF0ZSkpXG4gICAgICAgICAgICA6IGlucHV0O1xuICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLnJlZmluZVJhbmdlKHNpbXBsZUlucHV0KTtcbiAgICAgICAgaWYgKHJhbmdlICYmIChyYW5nZS5zdGFydCA9PSBudWxsIHx8IHJhbmdlLmVuZCA9PSBudWxsKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJhbmdlO1xuICAgIH07XG4gICAgLy8gQ29tcHV0ZXMgdGhlIHJhbmdlIHRoYXQgd2lsbCByZXByZXNlbnQgdGhlIGVsZW1lbnQvY2VsbHMgZm9yICpyZW5kZXJpbmcqLFxuICAgIC8vIGJ1dCB3aGljaCBtYXkgaGF2ZSB2b2lkZWQgZGF5cy90aW1lcy5cbiAgICAvLyBub3QgcmVzcG9uc2libGUgZm9yIHRyaW1taW5nIGhpZGRlbiBkYXlzLlxuICAgIERhdGVQcm9maWxlR2VuZXJhdG9yLnByb3RvdHlwZS5idWlsZFJlbmRlclJhbmdlID0gZnVuY3Rpb24gKGN1cnJlbnRSYW5nZSwgY3VycmVudFJhbmdlVW5pdCwgaXNSYW5nZUFsbERheSkge1xuICAgICAgICByZXR1cm4gY3VycmVudFJhbmdlO1xuICAgIH07XG4gICAgLy8gQ29tcHV0ZSB0aGUgZHVyYXRpb24gdmFsdWUgdGhhdCBzaG91bGQgYmUgYWRkZWQvc3Vic3RyYWN0ZWQgdG8gdGhlIGN1cnJlbnQgZGF0ZVxuICAgIC8vIHdoZW4gYSBwcmV2L25leHQgb3BlcmF0aW9uIGhhcHBlbnMuXG4gICAgRGF0ZVByb2ZpbGVHZW5lcmF0b3IucHJvdG90eXBlLmJ1aWxkRGF0ZUluY3JlbWVudCA9IGZ1bmN0aW9uIChmYWxsYmFjaykge1xuICAgICAgICB2YXIgZGF0ZUluY3JlbWVudCA9IHRoaXMucHJvcHMuZGF0ZUluY3JlbWVudDtcbiAgICAgICAgdmFyIGN1c3RvbUFsaWdubWVudDtcbiAgICAgICAgaWYgKGRhdGVJbmNyZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRlSW5jcmVtZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICgoY3VzdG9tQWxpZ25tZW50ID0gdGhpcy5wcm9wcy5kYXRlQWxpZ25tZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKDEsIGN1c3RvbUFsaWdubWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKHsgZGF5czogMSB9KTtcbiAgICB9O1xuICAgIERhdGVQcm9maWxlR2VuZXJhdG9yLnByb3RvdHlwZS5yZWZpbmVSYW5nZSA9IGZ1bmN0aW9uIChyYW5nZUlucHV0KSB7XG4gICAgICAgIGlmIChyYW5nZUlucHV0KSB7XG4gICAgICAgICAgICB2YXIgcmFuZ2UgPSBwYXJzZVJhbmdlKHJhbmdlSW5wdXQsIHRoaXMucHJvcHMuZGF0ZUVudik7XG4gICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICByYW5nZSA9IGNvbXB1dGVWaXNpYmxlRGF5UmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJhbmdlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgLyogSGlkZGVuIERheXNcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuICAgIC8vIEluaXRpYWxpemVzIGludGVybmFsIHZhcmlhYmxlcyByZWxhdGVkIHRvIGNhbGN1bGF0aW5nIGhpZGRlbiBkYXlzLW9mLXdlZWtcbiAgICBEYXRlUHJvZmlsZUdlbmVyYXRvci5wcm90b3R5cGUuaW5pdEhpZGRlbkRheXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBoaWRkZW5EYXlzID0gdGhpcy5wcm9wcy5oaWRkZW5EYXlzIHx8IFtdOyAvLyBhcnJheSBvZiBkYXktb2Ytd2VlayBpbmRpY2VzIHRoYXQgYXJlIGhpZGRlblxuICAgICAgICB2YXIgaXNIaWRkZW5EYXlIYXNoID0gW107IC8vIGlzIHRoZSBkYXktb2Ytd2VlayBoaWRkZW4/IChoYXNoIHdpdGggZGF5LW9mLXdlZWstaW5kZXggLT4gYm9vbClcbiAgICAgICAgdmFyIGRheUNudCA9IDA7XG4gICAgICAgIHZhciBpO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy53ZWVrZW5kcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGhpZGRlbkRheXMucHVzaCgwLCA2KTsgLy8gMD1zdW5kYXksIDY9c2F0dXJkYXlcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSArPSAxKSB7XG4gICAgICAgICAgICBpZiAoIShpc0hpZGRlbkRheUhhc2hbaV0gPSBoaWRkZW5EYXlzLmluZGV4T2YoaSkgIT09IC0xKSkge1xuICAgICAgICAgICAgICAgIGRheUNudCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZGF5Q250KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaGlkZGVuRGF5cycpOyAvLyBhbGwgZGF5cyB3ZXJlIGhpZGRlbj8gYmFkLlxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNIaWRkZW5EYXlIYXNoID0gaXNIaWRkZW5EYXlIYXNoO1xuICAgIH07XG4gICAgLy8gUmVtb3ZlIGRheXMgZnJvbSB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIHJhbmdlIHRoYXQgYXJlIGNvbXB1dGVkIGFzIGhpZGRlbi5cbiAgICAvLyBJZiB0aGUgd2hvbGUgcmFuZ2UgaXMgdHJpbW1lZCBvZmYsIHJldHVybnMgbnVsbFxuICAgIERhdGVQcm9maWxlR2VuZXJhdG9yLnByb3RvdHlwZS50cmltSGlkZGVuRGF5cyA9IGZ1bmN0aW9uIChyYW5nZSkge1xuICAgICAgICB2YXIgc3RhcnQgPSByYW5nZS5zdGFydCwgZW5kID0gcmFuZ2UuZW5kO1xuICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5za2lwSGlkZGVuRGF5cyhzdGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZCkge1xuICAgICAgICAgICAgZW5kID0gdGhpcy5za2lwSGlkZGVuRGF5cyhlbmQsIC0xLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBlbmQgPT0gbnVsbCB8fCBzdGFydCA8IGVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgLy8gSXMgdGhlIGN1cnJlbnQgZGF5IGhpZGRlbj9cbiAgICAvLyBgZGF5YCBpcyBhIGRheS1vZi13ZWVrIGluZGV4ICgwLTYpLCBvciBhIERhdGUgKHVzZWQgZm9yIFVUQylcbiAgICBEYXRlUHJvZmlsZUdlbmVyYXRvci5wcm90b3R5cGUuaXNIaWRkZW5EYXkgPSBmdW5jdGlvbiAoZGF5KSB7XG4gICAgICAgIGlmIChkYXkgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICBkYXkgPSBkYXkuZ2V0VVRDRGF5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNIaWRkZW5EYXlIYXNoW2RheV07XG4gICAgfTtcbiAgICAvLyBJbmNyZW1lbnRpbmcgdGhlIGN1cnJlbnQgZGF5IHVudGlsIGl0IGlzIG5vIGxvbmdlciBhIGhpZGRlbiBkYXksIHJldHVybmluZyBhIGNvcHkuXG4gICAgLy8gRE9FUyBOT1QgQ09OU0lERVIgdmFsaWRSYW5nZSFcbiAgICAvLyBJZiB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBgZGF0ZWAgaXMgbm90IGEgaGlkZGVuIGRheSwgZG9uJ3QgZG8gYW55dGhpbmcuXG4gICAgLy8gUGFzcyBgaXNFeGNsdXNpdmVgIGFzIGB0cnVlYCBpZiB5b3UgYXJlIGRlYWxpbmcgd2l0aCBhbiBlbmQgZGF0ZS5cbiAgICAvLyBgaW5jYCBkZWZhdWx0cyB0byBgMWAgKGluY3JlbWVudCBvbmUgZGF5IGZvcndhcmQgZWFjaCB0aW1lKVxuICAgIERhdGVQcm9maWxlR2VuZXJhdG9yLnByb3RvdHlwZS5za2lwSGlkZGVuRGF5cyA9IGZ1bmN0aW9uIChkYXRlLCBpbmMsIGlzRXhjbHVzaXZlKSB7XG4gICAgICAgIGlmIChpbmMgPT09IHZvaWQgMCkgeyBpbmMgPSAxOyB9XG4gICAgICAgIGlmIChpc0V4Y2x1c2l2ZSA9PT0gdm9pZCAwKSB7IGlzRXhjbHVzaXZlID0gZmFsc2U7IH1cbiAgICAgICAgd2hpbGUgKHRoaXMuaXNIaWRkZW5EYXlIYXNoWyhkYXRlLmdldFVUQ0RheSgpICsgKGlzRXhjbHVzaXZlID8gaW5jIDogMCkgKyA3KSAlIDddKSB7XG4gICAgICAgICAgICBkYXRlID0gYWRkRGF5cyhkYXRlLCBpbmMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH07XG4gICAgcmV0dXJuIERhdGVQcm9maWxlR2VuZXJhdG9yO1xufSgpKTtcblxuZnVuY3Rpb24gcmVkdWNlVmlld1R5cGUodmlld1R5cGUsIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQ0hBTkdFX1ZJRVdfVFlQRSc6XG4gICAgICAgICAgICB2aWV3VHlwZSA9IGFjdGlvbi52aWV3VHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXdUeXBlO1xufVxuXG5mdW5jdGlvbiByZWR1Y2VEeW5hbWljT3B0aW9uT3ZlcnJpZGVzKGR5bmFtaWNPcHRpb25PdmVycmlkZXMsIGFjdGlvbikge1xuICAgIHZhciBfYTtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1NFVF9PUFRJT04nOlxuICAgICAgICAgICAgcmV0dXJuIHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzKSwgKF9hID0ge30sIF9hW2FjdGlvbi5vcHRpb25OYW1lXSA9IGFjdGlvbi5yYXdPcHRpb25WYWx1ZSwgX2EpKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVkdWNlRGF0ZVByb2ZpbGUoY3VycmVudERhdGVQcm9maWxlLCBhY3Rpb24sIGN1cnJlbnREYXRlLCBkYXRlUHJvZmlsZUdlbmVyYXRvcikge1xuICAgIHZhciBkcDtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0NIQU5HRV9WSUVXX1RZUEUnOlxuICAgICAgICAgICAgcmV0dXJuIGRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkKGFjdGlvbi5kYXRlTWFya2VyIHx8IGN1cnJlbnREYXRlKTtcbiAgICAgICAgY2FzZSAnQ0hBTkdFX0RBVEUnOlxuICAgICAgICAgICAgcmV0dXJuIGRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkKGFjdGlvbi5kYXRlTWFya2VyKTtcbiAgICAgICAgY2FzZSAnUFJFVic6XG4gICAgICAgICAgICBkcCA9IGRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkUHJldihjdXJyZW50RGF0ZVByb2ZpbGUsIGN1cnJlbnREYXRlKTtcbiAgICAgICAgICAgIGlmIChkcC5pc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ05FWFQnOlxuICAgICAgICAgICAgZHAgPSBkYXRlUHJvZmlsZUdlbmVyYXRvci5idWlsZE5leHQoY3VycmVudERhdGVQcm9maWxlLCBjdXJyZW50RGF0ZSk7XG4gICAgICAgICAgICBpZiAoZHAuaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudERhdGVQcm9maWxlO1xufVxuXG5mdW5jdGlvbiBpbml0RXZlbnRTb3VyY2VzKGNhbGVuZGFyT3B0aW9ucywgZGF0ZVByb2ZpbGUsIGNvbnRleHQpIHtcbiAgICB2YXIgYWN0aXZlUmFuZ2UgPSBkYXRlUHJvZmlsZSA/IGRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlIDogbnVsbDtcbiAgICByZXR1cm4gYWRkU291cmNlcyh7fSwgcGFyc2VJbml0aWFsU291cmNlcyhjYWxlbmRhck9wdGlvbnMsIGNvbnRleHQpLCBhY3RpdmVSYW5nZSwgY29udGV4dCk7XG59XG5mdW5jdGlvbiByZWR1Y2VFdmVudFNvdXJjZXMoZXZlbnRTb3VyY2VzLCBhY3Rpb24sIGRhdGVQcm9maWxlLCBjb250ZXh0KSB7XG4gICAgdmFyIGFjdGl2ZVJhbmdlID0gZGF0ZVByb2ZpbGUgPyBkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZSA6IG51bGw7IC8vIG5lZWQgdGhpcyBjaGVjaz9cbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0FERF9FVkVOVF9TT1VSQ0VTJzogLy8gYWxyZWFkeSBwYXJzZWRcbiAgICAgICAgICAgIHJldHVybiBhZGRTb3VyY2VzKGV2ZW50U291cmNlcywgYWN0aW9uLnNvdXJjZXMsIGFjdGl2ZVJhbmdlLCBjb250ZXh0KTtcbiAgICAgICAgY2FzZSAnUkVNT1ZFX0VWRU5UX1NPVVJDRSc6XG4gICAgICAgICAgICByZXR1cm4gcmVtb3ZlU291cmNlKGV2ZW50U291cmNlcywgYWN0aW9uLnNvdXJjZUlkKTtcbiAgICAgICAgY2FzZSAnUFJFVic6IC8vIFRPRE86IGhvdyBkbyB3ZSB0cmFjayBhbGwgYWN0aW9ucyB0aGF0IGFmZmVjdCBkYXRlUHJvZmlsZSA6KFxuICAgICAgICBjYXNlICdORVhUJzpcbiAgICAgICAgY2FzZSAnQ0hBTkdFX0RBVEUnOlxuICAgICAgICBjYXNlICdDSEFOR0VfVklFV19UWVBFJzpcbiAgICAgICAgICAgIGlmIChkYXRlUHJvZmlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaERpcnR5U291cmNlcyhldmVudFNvdXJjZXMsIGFjdGl2ZVJhbmdlLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBldmVudFNvdXJjZXM7XG4gICAgICAgIGNhc2UgJ0ZFVENIX0VWRU5UX1NPVVJDRVMnOlxuICAgICAgICAgICAgcmV0dXJuIGZldGNoU291cmNlc0J5SWRzKGV2ZW50U291cmNlcywgYWN0aW9uLnNvdXJjZUlkcyA/IC8vIHdoeSBubyB0eXBlP1xuICAgICAgICAgICAgICAgIGFycmF5VG9IYXNoKGFjdGlvbi5zb3VyY2VJZHMpIDpcbiAgICAgICAgICAgICAgICBleGNsdWRlU3RhdGljU291cmNlcyhldmVudFNvdXJjZXMsIGNvbnRleHQpLCBhY3RpdmVSYW5nZSwgYWN0aW9uLmlzUmVmZXRjaCB8fCBmYWxzZSwgY29udGV4dCk7XG4gICAgICAgIGNhc2UgJ1JFQ0VJVkVfRVZFTlRTJzpcbiAgICAgICAgY2FzZSAnUkVDRUlWRV9FVkVOVF9FUlJPUic6XG4gICAgICAgICAgICByZXR1cm4gcmVjZWl2ZVJlc3BvbnNlKGV2ZW50U291cmNlcywgYWN0aW9uLnNvdXJjZUlkLCBhY3Rpb24uZmV0Y2hJZCwgYWN0aW9uLmZldGNoUmFuZ2UpO1xuICAgICAgICBjYXNlICdSRU1PVkVfQUxMX0VWRU5UX1NPVVJDRVMnOlxuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGV2ZW50U291cmNlcztcbiAgICB9XG59XG5mdW5jdGlvbiByZWR1Y2VFdmVudFNvdXJjZXNOZXdUaW1lWm9uZShldmVudFNvdXJjZXMsIGRhdGVQcm9maWxlLCBjb250ZXh0KSB7XG4gICAgdmFyIGFjdGl2ZVJhbmdlID0gZGF0ZVByb2ZpbGUgPyBkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZSA6IG51bGw7IC8vIG5lZWQgdGhpcyBjaGVjaz9cbiAgICByZXR1cm4gZmV0Y2hTb3VyY2VzQnlJZHMoZXZlbnRTb3VyY2VzLCBleGNsdWRlU3RhdGljU291cmNlcyhldmVudFNvdXJjZXMsIGNvbnRleHQpLCBhY3RpdmVSYW5nZSwgdHJ1ZSwgY29udGV4dCk7XG59XG5mdW5jdGlvbiBjb21wdXRlRXZlbnRTb3VyY2VzTG9hZGluZyhldmVudFNvdXJjZXMpIHtcbiAgICBmb3IgKHZhciBzb3VyY2VJZCBpbiBldmVudFNvdXJjZXMpIHtcbiAgICAgICAgaWYgKGV2ZW50U291cmNlc1tzb3VyY2VJZF0uaXNGZXRjaGluZykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gYWRkU291cmNlcyhldmVudFNvdXJjZUhhc2gsIHNvdXJjZXMsIGZldGNoUmFuZ2UsIGNvbnRleHQpIHtcbiAgICB2YXIgaGFzaCA9IHt9O1xuICAgIGZvciAodmFyIF9pID0gMCwgc291cmNlc18xID0gc291cmNlczsgX2kgPCBzb3VyY2VzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzXzFbX2ldO1xuICAgICAgICBoYXNoW3NvdXJjZS5zb3VyY2VJZF0gPSBzb3VyY2U7XG4gICAgfVxuICAgIGlmIChmZXRjaFJhbmdlKSB7XG4gICAgICAgIGhhc2ggPSBmZXRjaERpcnR5U291cmNlcyhoYXNoLCBmZXRjaFJhbmdlLCBjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBldmVudFNvdXJjZUhhc2gpLCBoYXNoKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVNvdXJjZShldmVudFNvdXJjZUhhc2gsIHNvdXJjZUlkKSB7XG4gICAgcmV0dXJuIGZpbHRlckhhc2goZXZlbnRTb3VyY2VIYXNoLCBmdW5jdGlvbiAoZXZlbnRTb3VyY2UpIHsgcmV0dXJuIGV2ZW50U291cmNlLnNvdXJjZUlkICE9PSBzb3VyY2VJZDsgfSk7XG59XG5mdW5jdGlvbiBmZXRjaERpcnR5U291cmNlcyhzb3VyY2VIYXNoLCBmZXRjaFJhbmdlLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGZldGNoU291cmNlc0J5SWRzKHNvdXJjZUhhc2gsIGZpbHRlckhhc2goc291cmNlSGFzaCwgZnVuY3Rpb24gKGV2ZW50U291cmNlKSB7IHJldHVybiBpc1NvdXJjZURpcnR5KGV2ZW50U291cmNlLCBmZXRjaFJhbmdlLCBjb250ZXh0KTsgfSksIGZldGNoUmFuZ2UsIGZhbHNlLCBjb250ZXh0KTtcbn1cbmZ1bmN0aW9uIGlzU291cmNlRGlydHkoZXZlbnRTb3VyY2UsIGZldGNoUmFuZ2UsIGNvbnRleHQpIHtcbiAgICBpZiAoIWRvZXNTb3VyY2VOZWVkUmFuZ2UoZXZlbnRTb3VyY2UsIGNvbnRleHQpKSB7XG4gICAgICAgIHJldHVybiAhZXZlbnRTb3VyY2UubGF0ZXN0RmV0Y2hJZDtcbiAgICB9XG4gICAgcmV0dXJuICFjb250ZXh0Lm9wdGlvbnMubGF6eUZldGNoaW5nIHx8XG4gICAgICAgICFldmVudFNvdXJjZS5mZXRjaFJhbmdlIHx8XG4gICAgICAgIGV2ZW50U291cmNlLmlzRmV0Y2hpbmcgfHwgLy8gYWx3YXlzIGNhbmNlbCBvdXRkYXRlZCBpbi1wcm9ncmVzcyBmZXRjaGVzXG4gICAgICAgIGZldGNoUmFuZ2Uuc3RhcnQgPCBldmVudFNvdXJjZS5mZXRjaFJhbmdlLnN0YXJ0IHx8XG4gICAgICAgIGZldGNoUmFuZ2UuZW5kID4gZXZlbnRTb3VyY2UuZmV0Y2hSYW5nZS5lbmQ7XG59XG5mdW5jdGlvbiBmZXRjaFNvdXJjZXNCeUlkcyhwcmV2U291cmNlcywgc291cmNlSWRIYXNoLCBmZXRjaFJhbmdlLCBpc1JlZmV0Y2gsIGNvbnRleHQpIHtcbiAgICB2YXIgbmV4dFNvdXJjZXMgPSB7fTtcbiAgICBmb3IgKHZhciBzb3VyY2VJZCBpbiBwcmV2U291cmNlcykge1xuICAgICAgICB2YXIgc291cmNlID0gcHJldlNvdXJjZXNbc291cmNlSWRdO1xuICAgICAgICBpZiAoc291cmNlSWRIYXNoW3NvdXJjZUlkXSkge1xuICAgICAgICAgICAgbmV4dFNvdXJjZXNbc291cmNlSWRdID0gZmV0Y2hTb3VyY2Uoc291cmNlLCBmZXRjaFJhbmdlLCBpc1JlZmV0Y2gsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV4dFNvdXJjZXNbc291cmNlSWRdID0gc291cmNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXh0U291cmNlcztcbn1cbmZ1bmN0aW9uIGZldGNoU291cmNlKGV2ZW50U291cmNlLCBmZXRjaFJhbmdlLCBpc1JlZmV0Y2gsIGNvbnRleHQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGNvbnRleHQub3B0aW9ucywgY2FsZW5kYXJBcGkgPSBjb250ZXh0LmNhbGVuZGFyQXBpO1xuICAgIHZhciBzb3VyY2VEZWYgPSBjb250ZXh0LnBsdWdpbkhvb2tzLmV2ZW50U291cmNlRGVmc1tldmVudFNvdXJjZS5zb3VyY2VEZWZJZF07XG4gICAgdmFyIGZldGNoSWQgPSBndWlkKCk7XG4gICAgc291cmNlRGVmLmZldGNoKHtcbiAgICAgICAgZXZlbnRTb3VyY2U6IGV2ZW50U291cmNlLFxuICAgICAgICByYW5nZTogZmV0Y2hSYW5nZSxcbiAgICAgICAgaXNSZWZldGNoOiBpc1JlZmV0Y2gsXG4gICAgICAgIGNvbnRleHQ6IGNvbnRleHQsXG4gICAgfSwgZnVuY3Rpb24gKHJlcykge1xuICAgICAgICB2YXIgcmF3RXZlbnRzID0gcmVzLnJhd0V2ZW50cztcbiAgICAgICAgaWYgKG9wdGlvbnMuZXZlbnRTb3VyY2VTdWNjZXNzKSB7XG4gICAgICAgICAgICByYXdFdmVudHMgPSBvcHRpb25zLmV2ZW50U291cmNlU3VjY2Vzcy5jYWxsKGNhbGVuZGFyQXBpLCByYXdFdmVudHMsIHJlcy54aHIpIHx8IHJhd0V2ZW50cztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnRTb3VyY2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgcmF3RXZlbnRzID0gZXZlbnRTb3VyY2Uuc3VjY2Vzcy5jYWxsKGNhbGVuZGFyQXBpLCByYXdFdmVudHMsIHJlcy54aHIpIHx8IHJhd0V2ZW50cztcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdSRUNFSVZFX0VWRU5UUycsXG4gICAgICAgICAgICBzb3VyY2VJZDogZXZlbnRTb3VyY2Uuc291cmNlSWQsXG4gICAgICAgICAgICBmZXRjaElkOiBmZXRjaElkLFxuICAgICAgICAgICAgZmV0Y2hSYW5nZTogZmV0Y2hSYW5nZSxcbiAgICAgICAgICAgIHJhd0V2ZW50czogcmF3RXZlbnRzLFxuICAgICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGVycm9yLm1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZXZlbnRTb3VyY2VGYWlsdXJlKSB7XG4gICAgICAgICAgICBvcHRpb25zLmV2ZW50U291cmNlRmFpbHVyZS5jYWxsKGNhbGVuZGFyQXBpLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50U291cmNlLmZhaWx1cmUpIHtcbiAgICAgICAgICAgIGV2ZW50U291cmNlLmZhaWx1cmUoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ1JFQ0VJVkVfRVZFTlRfRVJST1InLFxuICAgICAgICAgICAgc291cmNlSWQ6IGV2ZW50U291cmNlLnNvdXJjZUlkLFxuICAgICAgICAgICAgZmV0Y2hJZDogZmV0Y2hJZCxcbiAgICAgICAgICAgIGZldGNoUmFuZ2U6IGZldGNoUmFuZ2UsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgZXZlbnRTb3VyY2UpLCB7IGlzRmV0Y2hpbmc6IHRydWUsIGxhdGVzdEZldGNoSWQ6IGZldGNoSWQgfSk7XG59XG5mdW5jdGlvbiByZWNlaXZlUmVzcG9uc2Uoc291cmNlSGFzaCwgc291cmNlSWQsIGZldGNoSWQsIGZldGNoUmFuZ2UpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGV2ZW50U291cmNlID0gc291cmNlSGFzaFtzb3VyY2VJZF07XG4gICAgaWYgKGV2ZW50U291cmNlICYmIC8vIG5vdCBhbHJlYWR5IHJlbW92ZWRcbiAgICAgICAgZmV0Y2hJZCA9PT0gZXZlbnRTb3VyY2UubGF0ZXN0RmV0Y2hJZCkge1xuICAgICAgICByZXR1cm4gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIHNvdXJjZUhhc2gpLCAoX2EgPSB7fSwgX2Fbc291cmNlSWRdID0gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGV2ZW50U291cmNlKSwgeyBpc0ZldGNoaW5nOiBmYWxzZSwgZmV0Y2hSYW5nZTogZmV0Y2hSYW5nZSB9KSwgX2EpKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZUhhc2g7XG59XG5mdW5jdGlvbiBleGNsdWRlU3RhdGljU291cmNlcyhldmVudFNvdXJjZXMsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gZmlsdGVySGFzaChldmVudFNvdXJjZXMsIGZ1bmN0aW9uIChldmVudFNvdXJjZSkgeyByZXR1cm4gZG9lc1NvdXJjZU5lZWRSYW5nZShldmVudFNvdXJjZSwgY29udGV4dCk7IH0pO1xufVxuZnVuY3Rpb24gcGFyc2VJbml0aWFsU291cmNlcyhyYXdPcHRpb25zLCBjb250ZXh0KSB7XG4gICAgdmFyIHJlZmluZXJzID0gYnVpbGRFdmVudFNvdXJjZVJlZmluZXJzKGNvbnRleHQpO1xuICAgIHZhciByYXdTb3VyY2VzID0gW10uY29uY2F0KHJhd09wdGlvbnMuZXZlbnRTb3VyY2VzIHx8IFtdKTtcbiAgICB2YXIgc291cmNlcyA9IFtdOyAvLyBwYXJzZWRcbiAgICBpZiAocmF3T3B0aW9ucy5pbml0aWFsRXZlbnRzKSB7XG4gICAgICAgIHJhd1NvdXJjZXMudW5zaGlmdChyYXdPcHRpb25zLmluaXRpYWxFdmVudHMpO1xuICAgIH1cbiAgICBpZiAocmF3T3B0aW9ucy5ldmVudHMpIHtcbiAgICAgICAgcmF3U291cmNlcy51bnNoaWZ0KHJhd09wdGlvbnMuZXZlbnRzKTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2kgPSAwLCByYXdTb3VyY2VzXzEgPSByYXdTb3VyY2VzOyBfaSA8IHJhd1NvdXJjZXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHJhd1NvdXJjZSA9IHJhd1NvdXJjZXNfMVtfaV07XG4gICAgICAgIHZhciBzb3VyY2UgPSBwYXJzZUV2ZW50U291cmNlKHJhd1NvdXJjZSwgY29udGV4dCwgcmVmaW5lcnMpO1xuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc291cmNlcztcbn1cbmZ1bmN0aW9uIGRvZXNTb3VyY2VOZWVkUmFuZ2UoZXZlbnRTb3VyY2UsIGNvbnRleHQpIHtcbiAgICB2YXIgZGVmcyA9IGNvbnRleHQucGx1Z2luSG9va3MuZXZlbnRTb3VyY2VEZWZzO1xuICAgIHJldHVybiAhZGVmc1tldmVudFNvdXJjZS5zb3VyY2VEZWZJZF0uaWdub3JlUmFuZ2U7XG59XG5cbmZ1bmN0aW9uIHJlZHVjZUV2ZW50U3RvcmUoZXZlbnRTdG9yZSwgYWN0aW9uLCBldmVudFNvdXJjZXMsIGRhdGVQcm9maWxlLCBjb250ZXh0KSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdSRUNFSVZFX0VWRU5UUyc6IC8vIHJhd1xuICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVSYXdFdmVudHMoZXZlbnRTdG9yZSwgZXZlbnRTb3VyY2VzW2FjdGlvbi5zb3VyY2VJZF0sIGFjdGlvbi5mZXRjaElkLCBhY3Rpb24uZmV0Y2hSYW5nZSwgYWN0aW9uLnJhd0V2ZW50cywgY29udGV4dCk7XG4gICAgICAgIGNhc2UgJ0FERF9FVkVOVFMnOiAvLyBhbHJlYWR5IHBhcnNlZCwgYnV0IG5vdCBleHBhbmRlZFxuICAgICAgICAgICAgcmV0dXJuIGFkZEV2ZW50KGV2ZW50U3RvcmUsIGFjdGlvbi5ldmVudFN0b3JlLCAvLyBuZXcgb25lc1xuICAgICAgICAgICAgZGF0ZVByb2ZpbGUgPyBkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZSA6IG51bGwsIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdSRVNFVF9FVkVOVFMnOlxuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5ldmVudFN0b3JlO1xuICAgICAgICBjYXNlICdNRVJHRV9FVkVOVFMnOiAvLyBhbHJlYWR5IHBhcnNlZCBhbmQgZXhwYW5kZWRcbiAgICAgICAgICAgIHJldHVybiBtZXJnZUV2ZW50U3RvcmVzKGV2ZW50U3RvcmUsIGFjdGlvbi5ldmVudFN0b3JlKTtcbiAgICAgICAgY2FzZSAnUFJFVic6IC8vIFRPRE86IGhvdyBkbyB3ZSB0cmFjayBhbGwgYWN0aW9ucyB0aGF0IGFmZmVjdCBkYXRlUHJvZmlsZSA6KFxuICAgICAgICBjYXNlICdORVhUJzpcbiAgICAgICAgY2FzZSAnQ0hBTkdFX0RBVEUnOlxuICAgICAgICBjYXNlICdDSEFOR0VfVklFV19UWVBFJzpcbiAgICAgICAgICAgIGlmIChkYXRlUHJvZmlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHBhbmRSZWN1cnJpbmcoZXZlbnRTdG9yZSwgZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2UsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV2ZW50U3RvcmU7XG4gICAgICAgIGNhc2UgJ1JFTU9WRV9FVkVOVFMnOlxuICAgICAgICAgICAgcmV0dXJuIGV4Y2x1ZGVTdWJFdmVudFN0b3JlKGV2ZW50U3RvcmUsIGFjdGlvbi5ldmVudFN0b3JlKTtcbiAgICAgICAgY2FzZSAnUkVNT1ZFX0VWRU5UX1NPVVJDRSc6XG4gICAgICAgICAgICByZXR1cm4gZXhjbHVkZUV2ZW50c0J5U291cmNlSWQoZXZlbnRTdG9yZSwgYWN0aW9uLnNvdXJjZUlkKTtcbiAgICAgICAgY2FzZSAnUkVNT1ZFX0FMTF9FVkVOVF9TT1VSQ0VTJzpcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJFdmVudFN0b3JlRGVmcyhldmVudFN0b3JlLCBmdW5jdGlvbiAoZXZlbnREZWYpIHsgcmV0dXJuICghZXZlbnREZWYuc291cmNlSWQgLy8gb25seSBrZWVwIGV2ZW50cyB3aXRoIG5vIHNvdXJjZSBpZFxuICAgICAgICAgICAgKTsgfSk7XG4gICAgICAgIGNhc2UgJ1JFTU9WRV9BTExfRVZFTlRTJzpcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVFbXB0eUV2ZW50U3RvcmUoKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBldmVudFN0b3JlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlY2VpdmVSYXdFdmVudHMoZXZlbnRTdG9yZSwgZXZlbnRTb3VyY2UsIGZldGNoSWQsIGZldGNoUmFuZ2UsIHJhd0V2ZW50cywgY29udGV4dCkge1xuICAgIGlmIChldmVudFNvdXJjZSAmJiAvLyBub3QgYWxyZWFkeSByZW1vdmVkXG4gICAgICAgIGZldGNoSWQgPT09IGV2ZW50U291cmNlLmxhdGVzdEZldGNoSWQgLy8gVE9ETzogd2lzaCB0aGlzIGxvZ2ljIHdhcyBhbHdheXMgaW4gZXZlbnQtc291cmNlc1xuICAgICkge1xuICAgICAgICB2YXIgc3Vic2V0ID0gcGFyc2VFdmVudHModHJhbnNmb3JtUmF3RXZlbnRzKHJhd0V2ZW50cywgZXZlbnRTb3VyY2UsIGNvbnRleHQpLCBldmVudFNvdXJjZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChmZXRjaFJhbmdlKSB7XG4gICAgICAgICAgICBzdWJzZXQgPSBleHBhbmRSZWN1cnJpbmcoc3Vic2V0LCBmZXRjaFJhbmdlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVyZ2VFdmVudFN0b3JlcyhleGNsdWRlRXZlbnRzQnlTb3VyY2VJZChldmVudFN0b3JlLCBldmVudFNvdXJjZS5zb3VyY2VJZCksIHN1YnNldCk7XG4gICAgfVxuICAgIHJldHVybiBldmVudFN0b3JlO1xufVxuZnVuY3Rpb24gdHJhbnNmb3JtUmF3RXZlbnRzKHJhd0V2ZW50cywgZXZlbnRTb3VyY2UsIGNvbnRleHQpIHtcbiAgICB2YXIgY2FsRWFjaFRyYW5zZm9ybSA9IGNvbnRleHQub3B0aW9ucy5ldmVudERhdGFUcmFuc2Zvcm07XG4gICAgdmFyIHNvdXJjZUVhY2hUcmFuc2Zvcm0gPSBldmVudFNvdXJjZSA/IGV2ZW50U291cmNlLmV2ZW50RGF0YVRyYW5zZm9ybSA6IG51bGw7XG4gICAgaWYgKHNvdXJjZUVhY2hUcmFuc2Zvcm0pIHtcbiAgICAgICAgcmF3RXZlbnRzID0gdHJhbnNmb3JtRWFjaFJhd0V2ZW50KHJhd0V2ZW50cywgc291cmNlRWFjaFRyYW5zZm9ybSk7XG4gICAgfVxuICAgIGlmIChjYWxFYWNoVHJhbnNmb3JtKSB7XG4gICAgICAgIHJhd0V2ZW50cyA9IHRyYW5zZm9ybUVhY2hSYXdFdmVudChyYXdFdmVudHMsIGNhbEVhY2hUcmFuc2Zvcm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmF3RXZlbnRzO1xufVxuZnVuY3Rpb24gdHJhbnNmb3JtRWFjaFJhd0V2ZW50KHJhd0V2ZW50cywgZnVuYykge1xuICAgIHZhciByZWZpbmVkRXZlbnRzO1xuICAgIGlmICghZnVuYykge1xuICAgICAgICByZWZpbmVkRXZlbnRzID0gcmF3RXZlbnRzO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVmaW5lZEV2ZW50cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIHJhd0V2ZW50c18xID0gcmF3RXZlbnRzOyBfaSA8IHJhd0V2ZW50c18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIHJhd0V2ZW50ID0gcmF3RXZlbnRzXzFbX2ldO1xuICAgICAgICAgICAgdmFyIHJlZmluZWRFdmVudCA9IGZ1bmMocmF3RXZlbnQpO1xuICAgICAgICAgICAgaWYgKHJlZmluZWRFdmVudCkge1xuICAgICAgICAgICAgICAgIHJlZmluZWRFdmVudHMucHVzaChyZWZpbmVkRXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVmaW5lZEV2ZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZWZpbmVkRXZlbnRzLnB1c2gocmF3RXZlbnQpO1xuICAgICAgICAgICAgfSAvLyBpZiBhIGRpZmZlcmVudCBmYWxzeSB2YWx1ZSwgZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZWZpbmVkRXZlbnRzO1xufVxuZnVuY3Rpb24gYWRkRXZlbnQoZXZlbnRTdG9yZSwgc3Vic2V0LCBleHBhbmRSYW5nZSwgY29udGV4dCkge1xuICAgIGlmIChleHBhbmRSYW5nZSkge1xuICAgICAgICBzdWJzZXQgPSBleHBhbmRSZWN1cnJpbmcoc3Vic2V0LCBleHBhbmRSYW5nZSwgY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBtZXJnZUV2ZW50U3RvcmVzKGV2ZW50U3RvcmUsIHN1YnNldCk7XG59XG5mdW5jdGlvbiByZXpvbmVFdmVudFN0b3JlRGF0ZXMoZXZlbnRTdG9yZSwgb2xkRGF0ZUVudiwgbmV3RGF0ZUVudikge1xuICAgIHZhciBkZWZzID0gZXZlbnRTdG9yZS5kZWZzO1xuICAgIHZhciBpbnN0YW5jZXMgPSBtYXBIYXNoKGV2ZW50U3RvcmUuaW5zdGFuY2VzLCBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgdmFyIGRlZiA9IGRlZnNbaW5zdGFuY2UuZGVmSWRdO1xuICAgICAgICBpZiAoZGVmLmFsbERheSB8fCBkZWYucmVjdXJyaW5nRGVmKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7IC8vIGlzbid0IGRlcGVuZGVudCBvbiB0aW1lem9uZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgaW5zdGFuY2UpLCB7IHJhbmdlOiB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IG5ld0RhdGVFbnYuY3JlYXRlTWFya2VyKG9sZERhdGVFbnYudG9EYXRlKGluc3RhbmNlLnJhbmdlLnN0YXJ0LCBpbnN0YW5jZS5mb3JjZWRTdGFydFR6bykpLFxuICAgICAgICAgICAgICAgIGVuZDogbmV3RGF0ZUVudi5jcmVhdGVNYXJrZXIob2xkRGF0ZUVudi50b0RhdGUoaW5zdGFuY2UucmFuZ2UuZW5kLCBpbnN0YW5jZS5mb3JjZWRFbmRUem8pKSxcbiAgICAgICAgICAgIH0sIGZvcmNlZFN0YXJ0VHpvOiBuZXdEYXRlRW52LmNhbkNvbXB1dGVPZmZzZXQgPyBudWxsIDogaW5zdGFuY2UuZm9yY2VkU3RhcnRUem8sIGZvcmNlZEVuZFR6bzogbmV3RGF0ZUVudi5jYW5Db21wdXRlT2Zmc2V0ID8gbnVsbCA6IGluc3RhbmNlLmZvcmNlZEVuZFR6byB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4geyBkZWZzOiBkZWZzLCBpbnN0YW5jZXM6IGluc3RhbmNlcyB9O1xufVxuZnVuY3Rpb24gZXhjbHVkZUV2ZW50c0J5U291cmNlSWQoZXZlbnRTdG9yZSwgc291cmNlSWQpIHtcbiAgICByZXR1cm4gZmlsdGVyRXZlbnRTdG9yZURlZnMoZXZlbnRTdG9yZSwgZnVuY3Rpb24gKGV2ZW50RGVmKSB7IHJldHVybiBldmVudERlZi5zb3VyY2VJZCAhPT0gc291cmNlSWQ7IH0pO1xufVxuLy8gUVVFU1RJT046IHdoeSBub3QganVzdCByZXR1cm4gaW5zdGFuY2VzPyBkbyBhIGdlbmVyYWwgb2JqZWN0LXByb3BlcnR5LWV4Y2x1c2lvbiB1dGlsXG5mdW5jdGlvbiBleGNsdWRlSW5zdGFuY2VzKGV2ZW50U3RvcmUsIHJlbW92YWxzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVmczogZXZlbnRTdG9yZS5kZWZzLFxuICAgICAgICBpbnN0YW5jZXM6IGZpbHRlckhhc2goZXZlbnRTdG9yZS5pbnN0YW5jZXMsIGZ1bmN0aW9uIChpbnN0YW5jZSkgeyByZXR1cm4gIXJlbW92YWxzW2luc3RhbmNlLmluc3RhbmNlSWRdOyB9KSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiByZWR1Y2VEYXRlU2VsZWN0aW9uKGN1cnJlbnRTZWxlY3Rpb24sIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnVU5TRUxFQ1RfREFURVMnOlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgJ1NFTEVDVF9EQVRFUyc6XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnNlbGVjdGlvbjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVkdWNlU2VsZWN0ZWRFdmVudChjdXJyZW50SW5zdGFuY2VJZCwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdVTlNFTEVDVF9FVkVOVCc6XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIGNhc2UgJ1NFTEVDVF9FVkVOVCc6XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uLmV2ZW50SW5zdGFuY2VJZDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50SW5zdGFuY2VJZDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlZHVjZUV2ZW50RHJhZyhjdXJyZW50RHJhZywgYWN0aW9uKSB7XG4gICAgdmFyIG5ld0RyYWc7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdVTlNFVF9FVkVOVF9EUkFHJzpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBjYXNlICdTRVRfRVZFTlRfRFJBRyc6XG4gICAgICAgICAgICBuZXdEcmFnID0gYWN0aW9uLnN0YXRlO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhZmZlY3RlZEV2ZW50czogbmV3RHJhZy5hZmZlY3RlZEV2ZW50cyxcbiAgICAgICAgICAgICAgICBtdXRhdGVkRXZlbnRzOiBuZXdEcmFnLm11dGF0ZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgaXNFdmVudDogbmV3RHJhZy5pc0V2ZW50LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RHJhZztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlZHVjZUV2ZW50UmVzaXplKGN1cnJlbnRSZXNpemUsIGFjdGlvbikge1xuICAgIHZhciBuZXdSZXNpemU7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdVTlNFVF9FVkVOVF9SRVNJWkUnOlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgJ1NFVF9FVkVOVF9SRVNJWkUnOlxuICAgICAgICAgICAgbmV3UmVzaXplID0gYWN0aW9uLnN0YXRlO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhZmZlY3RlZEV2ZW50czogbmV3UmVzaXplLmFmZmVjdGVkRXZlbnRzLFxuICAgICAgICAgICAgICAgIG11dGF0ZWRFdmVudHM6IG5ld1Jlc2l6ZS5tdXRhdGVkRXZlbnRzLFxuICAgICAgICAgICAgICAgIGlzRXZlbnQ6IG5ld1Jlc2l6ZS5pc0V2ZW50LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UmVzaXplO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VUb29sYmFycyhjYWxlbmRhck9wdGlvbnMsIGNhbGVuZGFyT3B0aW9uT3ZlcnJpZGVzLCB0aGVtZSwgdmlld1NwZWNzLCBjYWxlbmRhckFwaSkge1xuICAgIHZhciBoZWFkZXIgPSBjYWxlbmRhck9wdGlvbnMuaGVhZGVyVG9vbGJhciA/IHBhcnNlVG9vbGJhcihjYWxlbmRhck9wdGlvbnMuaGVhZGVyVG9vbGJhciwgY2FsZW5kYXJPcHRpb25zLCBjYWxlbmRhck9wdGlvbk92ZXJyaWRlcywgdGhlbWUsIHZpZXdTcGVjcywgY2FsZW5kYXJBcGkpIDogbnVsbDtcbiAgICB2YXIgZm9vdGVyID0gY2FsZW5kYXJPcHRpb25zLmZvb3RlclRvb2xiYXIgPyBwYXJzZVRvb2xiYXIoY2FsZW5kYXJPcHRpb25zLmZvb3RlclRvb2xiYXIsIGNhbGVuZGFyT3B0aW9ucywgY2FsZW5kYXJPcHRpb25PdmVycmlkZXMsIHRoZW1lLCB2aWV3U3BlY3MsIGNhbGVuZGFyQXBpKSA6IG51bGw7XG4gICAgcmV0dXJuIHsgaGVhZGVyOiBoZWFkZXIsIGZvb3RlcjogZm9vdGVyIH07XG59XG5mdW5jdGlvbiBwYXJzZVRvb2xiYXIoc2VjdGlvblN0ckhhc2gsIGNhbGVuZGFyT3B0aW9ucywgY2FsZW5kYXJPcHRpb25PdmVycmlkZXMsIHRoZW1lLCB2aWV3U3BlY3MsIGNhbGVuZGFyQXBpKSB7XG4gICAgdmFyIHNlY3Rpb25XaWRnZXRzID0ge307XG4gICAgdmFyIHZpZXdzV2l0aEJ1dHRvbnMgPSBbXTtcbiAgICB2YXIgaGFzVGl0bGUgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBzZWN0aW9uTmFtZSBpbiBzZWN0aW9uU3RySGFzaCkge1xuICAgICAgICB2YXIgc2VjdGlvblN0ciA9IHNlY3Rpb25TdHJIYXNoW3NlY3Rpb25OYW1lXTtcbiAgICAgICAgdmFyIHNlY3Rpb25SZXMgPSBwYXJzZVNlY3Rpb24oc2VjdGlvblN0ciwgY2FsZW5kYXJPcHRpb25zLCBjYWxlbmRhck9wdGlvbk92ZXJyaWRlcywgdGhlbWUsIHZpZXdTcGVjcywgY2FsZW5kYXJBcGkpO1xuICAgICAgICBzZWN0aW9uV2lkZ2V0c1tzZWN0aW9uTmFtZV0gPSBzZWN0aW9uUmVzLndpZGdldHM7XG4gICAgICAgIHZpZXdzV2l0aEJ1dHRvbnMucHVzaC5hcHBseSh2aWV3c1dpdGhCdXR0b25zLCBzZWN0aW9uUmVzLnZpZXdzV2l0aEJ1dHRvbnMpO1xuICAgICAgICBoYXNUaXRsZSA9IGhhc1RpdGxlIHx8IHNlY3Rpb25SZXMuaGFzVGl0bGU7XG4gICAgfVxuICAgIHJldHVybiB7IHNlY3Rpb25XaWRnZXRzOiBzZWN0aW9uV2lkZ2V0cywgdmlld3NXaXRoQnV0dG9uczogdmlld3NXaXRoQnV0dG9ucywgaGFzVGl0bGU6IGhhc1RpdGxlIH07XG59XG4vKlxuQkFEOiBxdWVyeWluZyBpY29ucyBhbmQgdGV4dCBoZXJlLiBzaG91bGQgYmUgZG9uZSBhdCByZW5kZXIgdGltZVxuKi9cbmZ1bmN0aW9uIHBhcnNlU2VjdGlvbihzZWN0aW9uU3RyLCBjYWxlbmRhck9wdGlvbnMsIC8vIGRlZmF1bHRzK292ZXJyaWRlcywgdGhlbiByZWZpbmVkXG5jYWxlbmRhck9wdGlvbk92ZXJyaWRlcywgLy8gb3ZlcnJpZGVzIG9ubHkhLCB1bnJlZmluZWQgOihcbnRoZW1lLCB2aWV3U3BlY3MsIGNhbGVuZGFyQXBpKSB7XG4gICAgdmFyIGlzUnRsID0gY2FsZW5kYXJPcHRpb25zLmRpcmVjdGlvbiA9PT0gJ3J0bCc7XG4gICAgdmFyIGNhbGVuZGFyQ3VzdG9tQnV0dG9ucyA9IGNhbGVuZGFyT3B0aW9ucy5jdXN0b21CdXR0b25zIHx8IHt9O1xuICAgIHZhciBjYWxlbmRhckJ1dHRvblRleHRPdmVycmlkZXMgPSBjYWxlbmRhck9wdGlvbk92ZXJyaWRlcy5idXR0b25UZXh0IHx8IHt9O1xuICAgIHZhciBjYWxlbmRhckJ1dHRvblRleHQgPSBjYWxlbmRhck9wdGlvbnMuYnV0dG9uVGV4dCB8fCB7fTtcbiAgICB2YXIgY2FsZW5kYXJCdXR0b25IaW50T3ZlcnJpZGVzID0gY2FsZW5kYXJPcHRpb25PdmVycmlkZXMuYnV0dG9uSGludHMgfHwge307XG4gICAgdmFyIGNhbGVuZGFyQnV0dG9uSGludHMgPSBjYWxlbmRhck9wdGlvbnMuYnV0dG9uSGludHMgfHwge307XG4gICAgdmFyIHNlY3Rpb25TdWJzdHJzID0gc2VjdGlvblN0ciA/IHNlY3Rpb25TdHIuc3BsaXQoJyAnKSA6IFtdO1xuICAgIHZhciB2aWV3c1dpdGhCdXR0b25zID0gW107XG4gICAgdmFyIGhhc1RpdGxlID0gZmFsc2U7XG4gICAgdmFyIHdpZGdldHMgPSBzZWN0aW9uU3Vic3Rycy5tYXAoZnVuY3Rpb24gKGJ1dHRvbkdyb3VwU3RyKSB7IHJldHVybiAoYnV0dG9uR3JvdXBTdHIuc3BsaXQoJywnKS5tYXAoZnVuY3Rpb24gKGJ1dHRvbk5hbWUpIHtcbiAgICAgICAgaWYgKGJ1dHRvbk5hbWUgPT09ICd0aXRsZScpIHtcbiAgICAgICAgICAgIGhhc1RpdGxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB7IGJ1dHRvbk5hbWU6IGJ1dHRvbk5hbWUgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3VzdG9tQnV0dG9uUHJvcHM7XG4gICAgICAgIHZhciB2aWV3U3BlYztcbiAgICAgICAgdmFyIGJ1dHRvbkNsaWNrO1xuICAgICAgICB2YXIgYnV0dG9uSWNvbjsgLy8gb25seSBvbmUgb2YgdGhlc2Ugd2lsbCBiZSBzZXRcbiAgICAgICAgdmFyIGJ1dHRvblRleHQ7IC8vIFwiXG4gICAgICAgIHZhciBidXR0b25IaW50O1xuICAgICAgICAvLyBeIGZvciB0aGUgdGl0bGU9XCJcIiBhdHRyaWJ1dGUsIGZvciBhY2Nlc3NpYmlsaXR5XG4gICAgICAgIGlmICgoY3VzdG9tQnV0dG9uUHJvcHMgPSBjYWxlbmRhckN1c3RvbUJ1dHRvbnNbYnV0dG9uTmFtZV0pKSB7XG4gICAgICAgICAgICBidXR0b25DbGljayA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgICAgIGlmIChjdXN0b21CdXR0b25Qcm9wcy5jbGljaykge1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21CdXR0b25Qcm9wcy5jbGljay5jYWxsKGV2LnRhcmdldCwgZXYsIGV2LnRhcmdldCk7IC8vIFRPRE86IHVzZSBDYWxlbmRhciB0aGlzIGNvbnRleHQ/XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIChidXR0b25JY29uID0gdGhlbWUuZ2V0Q3VzdG9tQnV0dG9uSWNvbkNsYXNzKGN1c3RvbUJ1dHRvblByb3BzKSkgfHxcbiAgICAgICAgICAgICAgICAoYnV0dG9uSWNvbiA9IHRoZW1lLmdldEljb25DbGFzcyhidXR0b25OYW1lLCBpc1J0bCkpIHx8XG4gICAgICAgICAgICAgICAgKGJ1dHRvblRleHQgPSBjdXN0b21CdXR0b25Qcm9wcy50ZXh0KTtcbiAgICAgICAgICAgIGJ1dHRvbkhpbnQgPSBjdXN0b21CdXR0b25Qcm9wcy5oaW50IHx8IGN1c3RvbUJ1dHRvblByb3BzLnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKHZpZXdTcGVjID0gdmlld1NwZWNzW2J1dHRvbk5hbWVdKSkge1xuICAgICAgICAgICAgdmlld3NXaXRoQnV0dG9ucy5wdXNoKGJ1dHRvbk5hbWUpO1xuICAgICAgICAgICAgYnV0dG9uQ2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY2FsZW5kYXJBcGkuY2hhbmdlVmlldyhidXR0b25OYW1lKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAoYnV0dG9uVGV4dCA9IHZpZXdTcGVjLmJ1dHRvblRleHRPdmVycmlkZSkgfHxcbiAgICAgICAgICAgICAgICAoYnV0dG9uSWNvbiA9IHRoZW1lLmdldEljb25DbGFzcyhidXR0b25OYW1lLCBpc1J0bCkpIHx8XG4gICAgICAgICAgICAgICAgKGJ1dHRvblRleHQgPSB2aWV3U3BlYy5idXR0b25UZXh0RGVmYXVsdCk7XG4gICAgICAgICAgICB2YXIgdGV4dEZhbGxiYWNrID0gdmlld1NwZWMuYnV0dG9uVGV4dE92ZXJyaWRlIHx8XG4gICAgICAgICAgICAgICAgdmlld1NwZWMuYnV0dG9uVGV4dERlZmF1bHQ7XG4gICAgICAgICAgICBidXR0b25IaW50ID0gZm9ybWF0V2l0aE9yZGluYWxzKHZpZXdTcGVjLmJ1dHRvblRpdGxlT3ZlcnJpZGUgfHxcbiAgICAgICAgICAgICAgICB2aWV3U3BlYy5idXR0b25UaXRsZURlZmF1bHQgfHxcbiAgICAgICAgICAgICAgICBjYWxlbmRhck9wdGlvbnMudmlld0hpbnQsIFt0ZXh0RmFsbGJhY2ssIGJ1dHRvbk5hbWVdLCAvLyB2aWV3LW5hbWUgPSBidXR0b25OYW1lXG4gICAgICAgICAgICB0ZXh0RmFsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNhbGVuZGFyQXBpW2J1dHRvbk5hbWVdKSB7IC8vIGEgY2FsZW5kYXJBcGkgbWV0aG9kXG4gICAgICAgICAgICBidXR0b25DbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjYWxlbmRhckFwaVtidXR0b25OYW1lXSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIChidXR0b25UZXh0ID0gY2FsZW5kYXJCdXR0b25UZXh0T3ZlcnJpZGVzW2J1dHRvbk5hbWVdKSB8fFxuICAgICAgICAgICAgICAgIChidXR0b25JY29uID0gdGhlbWUuZ2V0SWNvbkNsYXNzKGJ1dHRvbk5hbWUsIGlzUnRsKSkgfHxcbiAgICAgICAgICAgICAgICAoYnV0dG9uVGV4dCA9IGNhbGVuZGFyQnV0dG9uVGV4dFtidXR0b25OYW1lXSk7IC8vIGV2ZXJ5dGhpbmcgZWxzZSBpcyBjb25zaWRlcmVkIGRlZmF1bHRcbiAgICAgICAgICAgIGlmIChidXR0b25OYW1lID09PSAncHJldlllYXInIHx8IGJ1dHRvbk5hbWUgPT09ICduZXh0WWVhcicpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJldk9yTmV4dCA9IGJ1dHRvbk5hbWUgPT09ICdwcmV2WWVhcicgPyAncHJldicgOiAnbmV4dCc7XG4gICAgICAgICAgICAgICAgYnV0dG9uSGludCA9IGZvcm1hdFdpdGhPcmRpbmFscyhjYWxlbmRhckJ1dHRvbkhpbnRPdmVycmlkZXNbcHJldk9yTmV4dF0gfHxcbiAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJCdXR0b25IaW50c1twcmV2T3JOZXh0XSwgW1xuICAgICAgICAgICAgICAgICAgICBjYWxlbmRhckJ1dHRvblRleHQueWVhciB8fCAneWVhcicsXG4gICAgICAgICAgICAgICAgICAgICd5ZWFyJyxcbiAgICAgICAgICAgICAgICBdLCBjYWxlbmRhckJ1dHRvblRleHRbYnV0dG9uTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnV0dG9uSGludCA9IGZ1bmN0aW9uIChuYXZVbml0KSB7IHJldHVybiBmb3JtYXRXaXRoT3JkaW5hbHMoY2FsZW5kYXJCdXR0b25IaW50T3ZlcnJpZGVzW2J1dHRvbk5hbWVdIHx8XG4gICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyQnV0dG9uSGludHNbYnV0dG9uTmFtZV0sIFtcbiAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJCdXR0b25UZXh0W25hdlVuaXRdIHx8IG5hdlVuaXQsXG4gICAgICAgICAgICAgICAgICAgIG5hdlVuaXQsXG4gICAgICAgICAgICAgICAgXSwgY2FsZW5kYXJCdXR0b25UZXh0W2J1dHRvbk5hbWVdKTsgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBidXR0b25OYW1lOiBidXR0b25OYW1lLCBidXR0b25DbGljazogYnV0dG9uQ2xpY2ssIGJ1dHRvbkljb246IGJ1dHRvbkljb24sIGJ1dHRvblRleHQ6IGJ1dHRvblRleHQsIGJ1dHRvbkhpbnQ6IGJ1dHRvbkhpbnQgfTtcbiAgICB9KSk7IH0pO1xuICAgIHJldHVybiB7IHdpZGdldHM6IHdpZGdldHMsIHZpZXdzV2l0aEJ1dHRvbnM6IHZpZXdzV2l0aEJ1dHRvbnMsIGhhc1RpdGxlOiBoYXNUaXRsZSB9O1xufVxuXG52YXIgZXZlbnRTb3VyY2VEZWYkMiA9IHtcbiAgICBpZ25vcmVSYW5nZTogdHJ1ZSxcbiAgICBwYXJzZU1ldGE6IGZ1bmN0aW9uIChyZWZpbmVkKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlZmluZWQuZXZlbnRzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlZmluZWQuZXZlbnRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgZmV0Y2g6IGZ1bmN0aW9uIChhcmcsIHN1Y2Nlc3MpIHtcbiAgICAgICAgc3VjY2Vzcyh7XG4gICAgICAgICAgICByYXdFdmVudHM6IGFyZy5ldmVudFNvdXJjZS5tZXRhLFxuICAgICAgICB9KTtcbiAgICB9LFxufTtcbnZhciBhcnJheUV2ZW50U291cmNlUGx1Z2luID0gY3JlYXRlUGx1Z2luKHtcbiAgICBldmVudFNvdXJjZURlZnM6IFtldmVudFNvdXJjZURlZiQyXSxcbn0pO1xuXG52YXIgZXZlbnRTb3VyY2VEZWYkMSA9IHtcbiAgICBwYXJzZU1ldGE6IGZ1bmN0aW9uIChyZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVmaW5lZC5ldmVudHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiByZWZpbmVkLmV2ZW50cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIGZldGNoOiBmdW5jdGlvbiAoYXJnLCBzdWNjZXNzLCBmYWlsdXJlKSB7XG4gICAgICAgIHZhciBkYXRlRW52ID0gYXJnLmNvbnRleHQuZGF0ZUVudjtcbiAgICAgICAgdmFyIGZ1bmMgPSBhcmcuZXZlbnRTb3VyY2UubWV0YTtcbiAgICAgICAgdW5wcm9taXNpZnkoZnVuYy5iaW5kKG51bGwsIGJ1aWxkUmFuZ2VBcGlXaXRoVGltZVpvbmUoYXJnLnJhbmdlLCBkYXRlRW52KSksIGZ1bmN0aW9uIChyYXdFdmVudHMpIHtcbiAgICAgICAgICAgIHN1Y2Nlc3MoeyByYXdFdmVudHM6IHJhd0V2ZW50cyB9KTsgLy8gbmVlZHMgYW4gb2JqZWN0IHJlc3BvbnNlXG4gICAgICAgIH0sIGZhaWx1cmUpO1xuICAgIH0sXG59O1xudmFyIGZ1bmNFdmVudFNvdXJjZVBsdWdpbiA9IGNyZWF0ZVBsdWdpbih7XG4gICAgZXZlbnRTb3VyY2VEZWZzOiBbZXZlbnRTb3VyY2VEZWYkMV0sXG59KTtcblxuZnVuY3Rpb24gcmVxdWVzdEpzb24obWV0aG9kLCB1cmwsIHBhcmFtcywgc3VjY2Vzc0NhbGxiYWNrLCBmYWlsdXJlQ2FsbGJhY2spIHtcbiAgICBtZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICB2YXIgYm9keSA9IG51bGw7XG4gICAgaWYgKG1ldGhvZCA9PT0gJ0dFVCcpIHtcbiAgICAgICAgdXJsID0gaW5qZWN0UXVlcnlTdHJpbmdQYXJhbXModXJsLCBwYXJhbXMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYm9keSA9IGVuY29kZVBhcmFtcyhwYXJhbXMpO1xuICAgIH1cbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyLm9wZW4obWV0aG9kLCB1cmwsIHRydWUpO1xuICAgIGlmIChtZXRob2QgIT09ICdHRVQnKSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgfVxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgICAgICB2YXIgcGFyc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgcmVzID0gdm9pZCAwO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXMgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgIHBhcnNlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gd2lsbCBoYW5kbGUgcGFyc2VkPWZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFyc2VkKSB7XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHJlcywgeGhyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZhaWx1cmVDYWxsYmFjaygnRmFpbHVyZSBwYXJzaW5nIEpTT04nLCB4aHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZmFpbHVyZUNhbGxiYWNrKCdSZXF1ZXN0IGZhaWxlZCcsIHhocik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmYWlsdXJlQ2FsbGJhY2soJ1JlcXVlc3QgZmFpbGVkJywgeGhyKTtcbiAgICB9O1xuICAgIHhoci5zZW5kKGJvZHkpO1xufVxuZnVuY3Rpb24gaW5qZWN0UXVlcnlTdHJpbmdQYXJhbXModXJsLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gdXJsICtcbiAgICAgICAgKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArXG4gICAgICAgIGVuY29kZVBhcmFtcyhwYXJhbXMpO1xufVxuZnVuY3Rpb24gZW5jb2RlUGFyYW1zKHBhcmFtcykge1xuICAgIHZhciBwYXJ0cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBwYXJhbXMpIHtcbiAgICAgICAgcGFydHMucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtc1trZXldKSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcmJyk7XG59XG5cbnZhciBKU09OX0ZFRURfRVZFTlRfU09VUkNFX1JFRklORVJTID0ge1xuICAgIG1ldGhvZDogU3RyaW5nLFxuICAgIGV4dHJhUGFyYW1zOiBpZGVudGl0eSxcbiAgICBzdGFydFBhcmFtOiBTdHJpbmcsXG4gICAgZW5kUGFyYW06IFN0cmluZyxcbiAgICB0aW1lWm9uZVBhcmFtOiBTdHJpbmcsXG59O1xuXG52YXIgZXZlbnRTb3VyY2VEZWYgPSB7XG4gICAgcGFyc2VNZXRhOiBmdW5jdGlvbiAocmVmaW5lZCkge1xuICAgICAgICBpZiAocmVmaW5lZC51cmwgJiYgKHJlZmluZWQuZm9ybWF0ID09PSAnanNvbicgfHwgIXJlZmluZWQuZm9ybWF0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHJlZmluZWQudXJsLFxuICAgICAgICAgICAgICAgIGZvcm1hdDogJ2pzb24nLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogKHJlZmluZWQubWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpLFxuICAgICAgICAgICAgICAgIGV4dHJhUGFyYW1zOiByZWZpbmVkLmV4dHJhUGFyYW1zLFxuICAgICAgICAgICAgICAgIHN0YXJ0UGFyYW06IHJlZmluZWQuc3RhcnRQYXJhbSxcbiAgICAgICAgICAgICAgICBlbmRQYXJhbTogcmVmaW5lZC5lbmRQYXJhbSxcbiAgICAgICAgICAgICAgICB0aW1lWm9uZVBhcmFtOiByZWZpbmVkLnRpbWVab25lUGFyYW0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgZmV0Y2g6IGZ1bmN0aW9uIChhcmcsIHN1Y2Nlc3MsIGZhaWx1cmUpIHtcbiAgICAgICAgdmFyIG1ldGEgPSBhcmcuZXZlbnRTb3VyY2UubWV0YTtcbiAgICAgICAgdmFyIHJlcXVlc3RQYXJhbXMgPSBidWlsZFJlcXVlc3RQYXJhbXMobWV0YSwgYXJnLnJhbmdlLCBhcmcuY29udGV4dCk7XG4gICAgICAgIHJlcXVlc3RKc29uKG1ldGEubWV0aG9kLCBtZXRhLnVybCwgcmVxdWVzdFBhcmFtcywgZnVuY3Rpb24gKHJhd0V2ZW50cywgeGhyKSB7XG4gICAgICAgICAgICBzdWNjZXNzKHsgcmF3RXZlbnRzOiByYXdFdmVudHMsIHhocjogeGhyIH0pO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3JNZXNzYWdlLCB4aHIpIHtcbiAgICAgICAgICAgIGZhaWx1cmUoeyBtZXNzYWdlOiBlcnJvck1lc3NhZ2UsIHhocjogeGhyIH0pO1xuICAgICAgICB9KTtcbiAgICB9LFxufTtcbnZhciBqc29uRmVlZEV2ZW50U291cmNlUGx1Z2luID0gY3JlYXRlUGx1Z2luKHtcbiAgICBldmVudFNvdXJjZVJlZmluZXJzOiBKU09OX0ZFRURfRVZFTlRfU09VUkNFX1JFRklORVJTLFxuICAgIGV2ZW50U291cmNlRGVmczogW2V2ZW50U291cmNlRGVmXSxcbn0pO1xuZnVuY3Rpb24gYnVpbGRSZXF1ZXN0UGFyYW1zKG1ldGEsIHJhbmdlLCBjb250ZXh0KSB7XG4gICAgdmFyIGRhdGVFbnYgPSBjb250ZXh0LmRhdGVFbnYsIG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgdmFyIHN0YXJ0UGFyYW07XG4gICAgdmFyIGVuZFBhcmFtO1xuICAgIHZhciB0aW1lWm9uZVBhcmFtO1xuICAgIHZhciBjdXN0b21SZXF1ZXN0UGFyYW1zO1xuICAgIHZhciBwYXJhbXMgPSB7fTtcbiAgICBzdGFydFBhcmFtID0gbWV0YS5zdGFydFBhcmFtO1xuICAgIGlmIChzdGFydFBhcmFtID09IG51bGwpIHtcbiAgICAgICAgc3RhcnRQYXJhbSA9IG9wdGlvbnMuc3RhcnRQYXJhbTtcbiAgICB9XG4gICAgZW5kUGFyYW0gPSBtZXRhLmVuZFBhcmFtO1xuICAgIGlmIChlbmRQYXJhbSA9PSBudWxsKSB7XG4gICAgICAgIGVuZFBhcmFtID0gb3B0aW9ucy5lbmRQYXJhbTtcbiAgICB9XG4gICAgdGltZVpvbmVQYXJhbSA9IG1ldGEudGltZVpvbmVQYXJhbTtcbiAgICBpZiAodGltZVpvbmVQYXJhbSA9PSBudWxsKSB7XG4gICAgICAgIHRpbWVab25lUGFyYW0gPSBvcHRpb25zLnRpbWVab25lUGFyYW07XG4gICAgfVxuICAgIC8vIHJldHJpZXZlIGFueSBvdXRib3VuZCBHRVQvUE9TVCBkYXRhIGZyb20gdGhlIG9wdGlvbnNcbiAgICBpZiAodHlwZW9mIG1ldGEuZXh0cmFQYXJhbXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gc3VwcGxpZWQgYXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBrZXkvdmFsdWUgb2JqZWN0XG4gICAgICAgIGN1c3RvbVJlcXVlc3RQYXJhbXMgPSBtZXRhLmV4dHJhUGFyYW1zKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBwcm9iYWJseSBzdXBwbGllZCBhcyBhIHN0cmFpZ2h0IGtleS92YWx1ZSBvYmplY3RcbiAgICAgICAgY3VzdG9tUmVxdWVzdFBhcmFtcyA9IG1ldGEuZXh0cmFQYXJhbXMgfHwge307XG4gICAgfVxuICAgIHRzbGliLl9fYXNzaWduKHBhcmFtcywgY3VzdG9tUmVxdWVzdFBhcmFtcyk7XG4gICAgcGFyYW1zW3N0YXJ0UGFyYW1dID0gZGF0ZUVudi5mb3JtYXRJc28ocmFuZ2Uuc3RhcnQpO1xuICAgIHBhcmFtc1tlbmRQYXJhbV0gPSBkYXRlRW52LmZvcm1hdElzbyhyYW5nZS5lbmQpO1xuICAgIGlmIChkYXRlRW52LnRpbWVab25lICE9PSAnbG9jYWwnKSB7XG4gICAgICAgIHBhcmFtc1t0aW1lWm9uZVBhcmFtXSA9IGRhdGVFbnYudGltZVpvbmU7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG59XG5cbnZhciBTSU1QTEVfUkVDVVJSSU5HX1JFRklORVJTID0ge1xuICAgIGRheXNPZldlZWs6IGlkZW50aXR5LFxuICAgIHN0YXJ0VGltZTogY3JlYXRlRHVyYXRpb24sXG4gICAgZW5kVGltZTogY3JlYXRlRHVyYXRpb24sXG4gICAgZHVyYXRpb246IGNyZWF0ZUR1cmF0aW9uLFxuICAgIHN0YXJ0UmVjdXI6IGlkZW50aXR5LFxuICAgIGVuZFJlY3VyOiBpZGVudGl0eSxcbn07XG5cbnZhciByZWN1cnJpbmcgPSB7XG4gICAgcGFyc2U6IGZ1bmN0aW9uIChyZWZpbmVkLCBkYXRlRW52KSB7XG4gICAgICAgIGlmIChyZWZpbmVkLmRheXNPZldlZWsgfHwgcmVmaW5lZC5zdGFydFRpbWUgfHwgcmVmaW5lZC5lbmRUaW1lIHx8IHJlZmluZWQuc3RhcnRSZWN1ciB8fCByZWZpbmVkLmVuZFJlY3VyKSB7XG4gICAgICAgICAgICB2YXIgcmVjdXJyaW5nRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBkYXlzT2ZXZWVrOiByZWZpbmVkLmRheXNPZldlZWsgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBzdGFydFRpbWU6IHJlZmluZWQuc3RhcnRUaW1lIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgZW5kVGltZTogcmVmaW5lZC5lbmRUaW1lIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgc3RhcnRSZWN1cjogcmVmaW5lZC5zdGFydFJlY3VyID8gZGF0ZUVudi5jcmVhdGVNYXJrZXIocmVmaW5lZC5zdGFydFJlY3VyKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgZW5kUmVjdXI6IHJlZmluZWQuZW5kUmVjdXIgPyBkYXRlRW52LmNyZWF0ZU1hcmtlcihyZWZpbmVkLmVuZFJlY3VyKSA6IG51bGwsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKHJlZmluZWQuZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IHJlZmluZWQuZHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWR1cmF0aW9uICYmIHJlZmluZWQuc3RhcnRUaW1lICYmIHJlZmluZWQuZW5kVGltZSkge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gc3VidHJhY3REdXJhdGlvbnMocmVmaW5lZC5lbmRUaW1lLCByZWZpbmVkLnN0YXJ0VGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFsbERheUd1ZXNzOiBCb29sZWFuKCFyZWZpbmVkLnN0YXJ0VGltZSAmJiAhcmVmaW5lZC5lbmRUaW1lKSxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgdHlwZURhdGE6IHJlY3VycmluZ0RhdGEsIC8vIGRvZXNuJ3QgbmVlZCBlbmRUaW1lIGFueW1vcmUgYnV0IG9oIHdlbGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICBleHBhbmQ6IGZ1bmN0aW9uICh0eXBlRGF0YSwgZnJhbWluZ1JhbmdlLCBkYXRlRW52KSB7XG4gICAgICAgIHZhciBjbGlwcGVkRnJhbWluZ1JhbmdlID0gaW50ZXJzZWN0UmFuZ2VzKGZyYW1pbmdSYW5nZSwgeyBzdGFydDogdHlwZURhdGEuc3RhcnRSZWN1ciwgZW5kOiB0eXBlRGF0YS5lbmRSZWN1ciB9KTtcbiAgICAgICAgaWYgKGNsaXBwZWRGcmFtaW5nUmFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBleHBhbmRSYW5nZXModHlwZURhdGEuZGF5c09mV2VlaywgdHlwZURhdGEuc3RhcnRUaW1lLCBjbGlwcGVkRnJhbWluZ1JhbmdlLCBkYXRlRW52KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfSxcbn07XG52YXIgc2ltcGxlUmVjdXJyaW5nRXZlbnRzUGx1Z2luID0gY3JlYXRlUGx1Z2luKHtcbiAgICByZWN1cnJpbmdUeXBlczogW3JlY3VycmluZ10sXG4gICAgZXZlbnRSZWZpbmVyczogU0lNUExFX1JFQ1VSUklOR19SRUZJTkVSUyxcbn0pO1xuZnVuY3Rpb24gZXhwYW5kUmFuZ2VzKGRheXNPZldlZWssIHN0YXJ0VGltZSwgZnJhbWluZ1JhbmdlLCBkYXRlRW52KSB7XG4gICAgdmFyIGRvd0hhc2ggPSBkYXlzT2ZXZWVrID8gYXJyYXlUb0hhc2goZGF5c09mV2VlaykgOiBudWxsO1xuICAgIHZhciBkYXlNYXJrZXIgPSBzdGFydE9mRGF5KGZyYW1pbmdSYW5nZS5zdGFydCk7XG4gICAgdmFyIGVuZE1hcmtlciA9IGZyYW1pbmdSYW5nZS5lbmQ7XG4gICAgdmFyIGluc3RhbmNlU3RhcnRzID0gW107XG4gICAgd2hpbGUgKGRheU1hcmtlciA8IGVuZE1hcmtlcikge1xuICAgICAgICB2YXIgaW5zdGFuY2VTdGFydCBcbiAgICAgICAgLy8gaWYgZXZlcnlkYXksIG9yIHRoaXMgcGFydGljdWxhciBkYXktb2Ytd2Vla1xuICAgICAgICA9IHZvaWQgMDtcbiAgICAgICAgLy8gaWYgZXZlcnlkYXksIG9yIHRoaXMgcGFydGljdWxhciBkYXktb2Ytd2Vla1xuICAgICAgICBpZiAoIWRvd0hhc2ggfHwgZG93SGFzaFtkYXlNYXJrZXIuZ2V0VVRDRGF5KCldKSB7XG4gICAgICAgICAgICBpZiAoc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VTdGFydCA9IGRhdGVFbnYuYWRkKGRheU1hcmtlciwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlU3RhcnQgPSBkYXlNYXJrZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnN0YW5jZVN0YXJ0cy5wdXNoKGluc3RhbmNlU3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIGRheU1hcmtlciA9IGFkZERheXMoZGF5TWFya2VyLCAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlU3RhcnRzO1xufVxuXG52YXIgY2hhbmdlSGFuZGxlclBsdWdpbiA9IGNyZWF0ZVBsdWdpbih7XG4gICAgb3B0aW9uQ2hhbmdlSGFuZGxlcnM6IHtcbiAgICAgICAgZXZlbnRzOiBmdW5jdGlvbiAoZXZlbnRzLCBjb250ZXh0KSB7XG4gICAgICAgICAgICBoYW5kbGVFdmVudFNvdXJjZXMoW2V2ZW50c10sIGNvbnRleHQpO1xuICAgICAgICB9LFxuICAgICAgICBldmVudFNvdXJjZXM6IGhhbmRsZUV2ZW50U291cmNlcyxcbiAgICB9LFxufSk7XG4vKlxuQlVHOiBpZiBgZXZlbnRgIHdhcyBzdXBwbGllZCwgYWxsIHByZXZpb3VzbHktZ2l2ZW4gYGV2ZW50U291cmNlc2Agd2lsbCBiZSB3aXBlZCBvdXRcbiovXG5mdW5jdGlvbiBoYW5kbGVFdmVudFNvdXJjZXMoaW5wdXRzLCBjb250ZXh0KSB7XG4gICAgdmFyIHVuZm91bmRTb3VyY2VzID0gaGFzaFZhbHVlc1RvQXJyYXkoY29udGV4dC5nZXRDdXJyZW50RGF0YSgpLmV2ZW50U291cmNlcyk7XG4gICAgdmFyIG5ld0lucHV0cyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMCwgaW5wdXRzXzEgPSBpbnB1dHM7IF9pIDwgaW5wdXRzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGlucHV0c18xW19pXTtcbiAgICAgICAgdmFyIGlucHV0Rm91bmQgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1bmZvdW5kU291cmNlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKHVuZm91bmRTb3VyY2VzW2ldLl9yYXcgPT09IGlucHV0KSB7XG4gICAgICAgICAgICAgICAgdW5mb3VuZFNvdXJjZXMuc3BsaWNlKGksIDEpOyAvLyBkZWxldGVcbiAgICAgICAgICAgICAgICBpbnB1dEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlucHV0Rm91bmQpIHtcbiAgICAgICAgICAgIG5ld0lucHV0cy5wdXNoKGlucHV0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBfYSA9IDAsIHVuZm91bmRTb3VyY2VzXzEgPSB1bmZvdW5kU291cmNlczsgX2EgPCB1bmZvdW5kU291cmNlc18xLmxlbmd0aDsgX2ErKykge1xuICAgICAgICB2YXIgdW5mb3VuZFNvdXJjZSA9IHVuZm91bmRTb3VyY2VzXzFbX2FdO1xuICAgICAgICBjb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdSRU1PVkVfRVZFTlRfU09VUkNFJyxcbiAgICAgICAgICAgIHNvdXJjZUlkOiB1bmZvdW5kU291cmNlLnNvdXJjZUlkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2IgPSAwLCBuZXdJbnB1dHNfMSA9IG5ld0lucHV0czsgX2IgPCBuZXdJbnB1dHNfMS5sZW5ndGg7IF9iKyspIHtcbiAgICAgICAgdmFyIG5ld0lucHV0ID0gbmV3SW5wdXRzXzFbX2JdO1xuICAgICAgICBjb250ZXh0LmNhbGVuZGFyQXBpLmFkZEV2ZW50U291cmNlKG5ld0lucHV0KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZURhdGVQcm9maWxlKGRhdGVQcm9maWxlLCBjb250ZXh0KSB7XG4gICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2RhdGVzU2V0JywgdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGJ1aWxkUmFuZ2VBcGlXaXRoVGltZVpvbmUoZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2UsIGNvbnRleHQuZGF0ZUVudikpLCB7IHZpZXc6IGNvbnRleHQudmlld0FwaSB9KSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50U3RvcmUoZXZlbnRTdG9yZSwgY29udGV4dCkge1xuICAgIHZhciBlbWl0dGVyID0gY29udGV4dC5lbWl0dGVyO1xuICAgIGlmIChlbWl0dGVyLmhhc0hhbmRsZXJzKCdldmVudHNTZXQnKSkge1xuICAgICAgICBlbWl0dGVyLnRyaWdnZXIoJ2V2ZW50c1NldCcsIGJ1aWxkRXZlbnRBcGlzKGV2ZW50U3RvcmUsIGNvbnRleHQpKTtcbiAgICB9XG59XG5cbi8qXG50aGlzIGFycmF5IGlzIGV4cG9zZWQgb24gdGhlIHJvb3QgbmFtZXNwYWNlIHNvIHRoYXQgVU1EIHBsdWdpbnMgY2FuIGFkZCB0byBpdC5cbnNlZSB0aGUgcm9sbHVwLWJ1bmRsZXMgc2NyaXB0LlxuKi9cbnZhciBnbG9iYWxQbHVnaW5zID0gW1xuICAgIGFycmF5RXZlbnRTb3VyY2VQbHVnaW4sXG4gICAgZnVuY0V2ZW50U291cmNlUGx1Z2luLFxuICAgIGpzb25GZWVkRXZlbnRTb3VyY2VQbHVnaW4sXG4gICAgc2ltcGxlUmVjdXJyaW5nRXZlbnRzUGx1Z2luLFxuICAgIGNoYW5nZUhhbmRsZXJQbHVnaW4sXG4gICAgY3JlYXRlUGx1Z2luKHtcbiAgICAgICAgaXNMb2FkaW5nRnVuY3M6IFtcbiAgICAgICAgICAgIGZ1bmN0aW9uIChzdGF0ZSkgeyByZXR1cm4gY29tcHV0ZUV2ZW50U291cmNlc0xvYWRpbmcoc3RhdGUuZXZlbnRTb3VyY2VzKTsgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29udGVudFR5cGVIYW5kbGVyczoge1xuICAgICAgICAgICAgaHRtbDogYnVpbGRIdG1sUmVuZGVyZXIsXG4gICAgICAgICAgICBkb21Ob2RlczogYnVpbGREb21Ob2RlUmVuZGVyZXIsXG4gICAgICAgIH0sXG4gICAgICAgIHByb3BTZXRIYW5kbGVyczoge1xuICAgICAgICAgICAgZGF0ZVByb2ZpbGU6IGhhbmRsZURhdGVQcm9maWxlLFxuICAgICAgICAgICAgZXZlbnRTdG9yZTogaGFuZGxlRXZlbnRTdG9yZSxcbiAgICAgICAgfSxcbiAgICB9KSxcbl07XG5mdW5jdGlvbiBidWlsZEh0bWxSZW5kZXJlcigpIHtcbiAgICB2YXIgY3VycmVudEVsID0gbnVsbDtcbiAgICB2YXIgY3VycmVudEh0bWwgPSAnJztcbiAgICBmdW5jdGlvbiByZW5kZXIoZWwsIGh0bWwpIHtcbiAgICAgICAgaWYgKGVsICE9PSBjdXJyZW50RWwgfHwgaHRtbCAhPT0gY3VycmVudEh0bWwpIHtcbiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudEVsID0gZWw7XG4gICAgICAgIGN1cnJlbnRIdG1sID0gaHRtbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgY3VycmVudEVsLmlubmVySFRNTCA9ICcnO1xuICAgICAgICBjdXJyZW50RWwgPSBudWxsO1xuICAgICAgICBjdXJyZW50SHRtbCA9ICcnO1xuICAgIH1cbiAgICByZXR1cm4geyByZW5kZXI6IHJlbmRlciwgZGVzdHJveTogZGVzdHJveSB9O1xufVxuZnVuY3Rpb24gYnVpbGREb21Ob2RlUmVuZGVyZXIoKSB7XG4gICAgdmFyIGN1cnJlbnRFbCA9IG51bGw7XG4gICAgdmFyIGN1cnJlbnREb21Ob2RlcyA9IFtdO1xuICAgIGZ1bmN0aW9uIHJlbmRlcihlbCwgZG9tTm9kZXMpIHtcbiAgICAgICAgdmFyIG5ld0RvbU5vZGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9tTm9kZXMpO1xuICAgICAgICBpZiAoZWwgIT09IGN1cnJlbnRFbCB8fCAhaXNBcnJheXNFcXVhbChjdXJyZW50RG9tTm9kZXMsIG5ld0RvbU5vZGVzKSkge1xuICAgICAgICAgICAgLy8gYXBwZW5kIGZpcnN0LCByZW1vdmUgc2Vjb25kIChmb3Igc2Nyb2xsIHJlc2V0dGluZylcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgbmV3RG9tTm9kZXNfMSA9IG5ld0RvbU5vZGVzOyBfaSA8IG5ld0RvbU5vZGVzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld05vZGUgPSBuZXdEb21Ob2Rlc18xW19pXTtcbiAgICAgICAgICAgICAgICBlbC5hcHBlbmRDaGlsZChuZXdOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50RWwgPSBlbDtcbiAgICAgICAgY3VycmVudERvbU5vZGVzID0gbmV3RG9tTm9kZXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIGN1cnJlbnREb21Ob2Rlcy5mb3JFYWNoKHJlbW92ZUVsZW1lbnQpO1xuICAgICAgICBjdXJyZW50RG9tTm9kZXMgPSBbXTtcbiAgICAgICAgY3VycmVudEVsID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHsgcmVuZGVyOiByZW5kZXIsIGRlc3Ryb3k6IGRlc3Ryb3kgfTtcbn1cblxudmFyIERlbGF5ZWRSdW5uZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVsYXllZFJ1bm5lcihkcmFpbmVkT3B0aW9uKSB7XG4gICAgICAgIHRoaXMuZHJhaW5lZE9wdGlvbiA9IGRyYWluZWRPcHRpb247XG4gICAgICAgIHRoaXMuaXNSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNEaXJ0eSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBhdXNlRGVwdGhzID0ge307XG4gICAgICAgIHRoaXMudGltZW91dElkID0gMDtcbiAgICB9XG4gICAgRGVsYXllZFJ1bm5lci5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uIChkZWxheSkge1xuICAgICAgICB0aGlzLmlzRGlydHkgPSB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMuaXNQYXVzZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVvdXQoKTtcbiAgICAgICAgICAgIGlmIChkZWxheSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cnlEcmFpbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KC8vIE5PVCBPUFRJTUFMISBUT0RPOiBsb29rIGF0IGRlYm91bmNlXG4gICAgICAgICAgICAgICAgdGhpcy50cnlEcmFpbi5iaW5kKHRoaXMpLCBkZWxheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERlbGF5ZWRSdW5uZXIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICAgIGlmIChzY29wZSA9PT0gdm9pZCAwKSB7IHNjb3BlID0gJyc7IH1cbiAgICAgICAgdmFyIHBhdXNlRGVwdGhzID0gdGhpcy5wYXVzZURlcHRocztcbiAgICAgICAgcGF1c2VEZXB0aHNbc2NvcGVdID0gKHBhdXNlRGVwdGhzW3Njb3BlXSB8fCAwKSArIDE7XG4gICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG4gICAgfTtcbiAgICBEZWxheWVkUnVubmVyLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoc2NvcGUsIGZvcmNlKSB7XG4gICAgICAgIGlmIChzY29wZSA9PT0gdm9pZCAwKSB7IHNjb3BlID0gJyc7IH1cbiAgICAgICAgdmFyIHBhdXNlRGVwdGhzID0gdGhpcy5wYXVzZURlcHRocztcbiAgICAgICAgaWYgKHNjb3BlIGluIHBhdXNlRGVwdGhzKSB7XG4gICAgICAgICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgcGF1c2VEZXB0aHNbc2NvcGVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGF1c2VEZXB0aHNbc2NvcGVdIC09IDE7XG4gICAgICAgICAgICAgICAgdmFyIGRlcHRoID0gcGF1c2VEZXB0aHNbc2NvcGVdO1xuICAgICAgICAgICAgICAgIGlmIChkZXB0aCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXVzZURlcHRoc1tzY29wZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50cnlEcmFpbigpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWxheWVkUnVubmVyLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucGF1c2VEZXB0aHMpLmxlbmd0aDtcbiAgICB9O1xuICAgIERlbGF5ZWRSdW5uZXIucHJvdG90eXBlLnRyeURyYWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNSdW5uaW5nICYmICF0aGlzLmlzUGF1c2VkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuaXNSdW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLmlzRGlydHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzRGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWluZWQoKTsgLy8gbWlnaHQgc2V0IGlzRGlydHkgdG8gdHJ1ZSBhZ2FpblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVsYXllZFJ1bm5lci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuaXNEaXJ0eSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBhdXNlRGVwdGhzID0ge307XG4gICAgfTtcbiAgICBEZWxheWVkUnVubmVyLnByb3RvdHlwZS5jbGVhclRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVvdXRJZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKTtcbiAgICAgICAgICAgIHRoaXMudGltZW91dElkID0gMDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVsYXllZFJ1bm5lci5wcm90b3R5cGUuZHJhaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhaW5lZE9wdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kcmFpbmVkT3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBEZWxheWVkUnVubmVyO1xufSgpKTtcblxudmFyIFRhc2tSdW5uZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGFza1J1bm5lcihydW5UYXNrT3B0aW9uLCBkcmFpbmVkT3B0aW9uKSB7XG4gICAgICAgIHRoaXMucnVuVGFza09wdGlvbiA9IHJ1blRhc2tPcHRpb247XG4gICAgICAgIHRoaXMuZHJhaW5lZE9wdGlvbiA9IGRyYWluZWRPcHRpb247XG4gICAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5kZWxheWVkUnVubmVyID0gbmV3IERlbGF5ZWRSdW5uZXIodGhpcy5kcmFpbi5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgVGFza1J1bm5lci5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uICh0YXNrLCBkZWxheSkge1xuICAgICAgICB0aGlzLnF1ZXVlLnB1c2godGFzayk7XG4gICAgICAgIHRoaXMuZGVsYXllZFJ1bm5lci5yZXF1ZXN0KGRlbGF5KTtcbiAgICB9O1xuICAgIFRhc2tSdW5uZXIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICAgIHRoaXMuZGVsYXllZFJ1bm5lci5wYXVzZShzY29wZSk7XG4gICAgfTtcbiAgICBUYXNrUnVubmVyLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoc2NvcGUsIGZvcmNlKSB7XG4gICAgICAgIHRoaXMuZGVsYXllZFJ1bm5lci5yZXN1bWUoc2NvcGUsIGZvcmNlKTtcbiAgICB9O1xuICAgIFRhc2tSdW5uZXIucHJvdG90eXBlLmRyYWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcXVldWUgPSB0aGlzLnF1ZXVlO1xuICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgY29tcGxldGVkVGFza3MgPSBbXTtcbiAgICAgICAgICAgIHZhciB0YXNrID0gdm9pZCAwO1xuICAgICAgICAgICAgd2hpbGUgKCh0YXNrID0gcXVldWUuc2hpZnQoKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1blRhc2sodGFzayk7XG4gICAgICAgICAgICAgICAgY29tcGxldGVkVGFza3MucHVzaCh0YXNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZHJhaW5lZChjb21wbGV0ZWRUYXNrcyk7XG4gICAgICAgIH0gLy8ga2VlcCBnb2luZywgaW4gY2FzZSBuZXcgdGFza3Mgd2VyZSBhZGRlZCBpbiB0aGUgZHJhaW5lZCBoYW5kbGVyXG4gICAgfTtcbiAgICBUYXNrUnVubmVyLnByb3RvdHlwZS5ydW5UYXNrID0gZnVuY3Rpb24gKHRhc2spIHtcbiAgICAgICAgaWYgKHRoaXMucnVuVGFza09wdGlvbikge1xuICAgICAgICAgICAgdGhpcy5ydW5UYXNrT3B0aW9uKHRhc2spO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUYXNrUnVubmVyLnByb3RvdHlwZS5kcmFpbmVkID0gZnVuY3Rpb24gKGNvbXBsZXRlZFRhc2tzKSB7XG4gICAgICAgIGlmICh0aGlzLmRyYWluZWRPcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZHJhaW5lZE9wdGlvbihjb21wbGV0ZWRUYXNrcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBUYXNrUnVubmVyO1xufSgpKTtcblxuLy8gQ29tcHV0ZXMgd2hhdCB0aGUgdGl0bGUgYXQgdGhlIHRvcCBvZiB0aGUgY2FsZW5kYXJBcGkgc2hvdWxkIGJlIGZvciB0aGlzIHZpZXdcbmZ1bmN0aW9uIGJ1aWxkVGl0bGUoZGF0ZVByb2ZpbGUsIHZpZXdPcHRpb25zLCBkYXRlRW52KSB7XG4gICAgdmFyIHJhbmdlO1xuICAgIC8vIGZvciB2aWV3cyB0aGF0IHNwYW4gYSBsYXJnZSB1bml0IG9mIHRpbWUsIHNob3cgdGhlIHByb3BlciBpbnRlcnZhbCwgaWdub3Jpbmcgc3RyYXkgZGF5cyBiZWZvcmUgYW5kIGFmdGVyXG4gICAgaWYgKC9eKHllYXJ8bW9udGgpJC8udGVzdChkYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2VVbml0KSkge1xuICAgICAgICByYW5nZSA9IGRhdGVQcm9maWxlLmN1cnJlbnRSYW5nZTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIGZvciBkYXkgdW5pdHMgb3Igc21hbGxlciwgdXNlIHRoZSBhY3R1YWwgZGF5IHJhbmdlXG4gICAgICAgIHJhbmdlID0gZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2U7XG4gICAgfVxuICAgIHJldHVybiBkYXRlRW52LmZvcm1hdFJhbmdlKHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQsIGNyZWF0ZUZvcm1hdHRlcih2aWV3T3B0aW9ucy50aXRsZUZvcm1hdCB8fCBidWlsZFRpdGxlRm9ybWF0KGRhdGVQcm9maWxlKSksIHtcbiAgICAgICAgaXNFbmRFeGNsdXNpdmU6IGRhdGVQcm9maWxlLmlzUmFuZ2VBbGxEYXksXG4gICAgICAgIGRlZmF1bHRTZXBhcmF0b3I6IHZpZXdPcHRpb25zLnRpdGxlUmFuZ2VTZXBhcmF0b3IsXG4gICAgfSk7XG59XG4vLyBHZW5lcmF0ZXMgdGhlIGZvcm1hdCBzdHJpbmcgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdGl0bGUgZm9yIHRoZSBjdXJyZW50IGRhdGUgcmFuZ2UuXG4vLyBBdHRlbXB0cyB0byBjb21wdXRlIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGZvcm1hdCBpZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQgd2l0aCBgdGl0bGVGb3JtYXRgLlxuZnVuY3Rpb24gYnVpbGRUaXRsZUZvcm1hdChkYXRlUHJvZmlsZSkge1xuICAgIHZhciBjdXJyZW50UmFuZ2VVbml0ID0gZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlVW5pdDtcbiAgICBpZiAoY3VycmVudFJhbmdlVW5pdCA9PT0gJ3llYXInKSB7XG4gICAgICAgIHJldHVybiB7IHllYXI6ICdudW1lcmljJyB9O1xuICAgIH1cbiAgICBpZiAoY3VycmVudFJhbmdlVW5pdCA9PT0gJ21vbnRoJykge1xuICAgICAgICByZXR1cm4geyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycgfTsgLy8gbGlrZSBcIlNlcHRlbWJlciAyMDE0XCJcbiAgICB9XG4gICAgdmFyIGRheXMgPSBkaWZmV2hvbGVEYXlzKGRhdGVQcm9maWxlLmN1cnJlbnRSYW5nZS5zdGFydCwgZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlLmVuZCk7XG4gICAgaWYgKGRheXMgIT09IG51bGwgJiYgZGF5cyA+IDEpIHtcbiAgICAgICAgLy8gbXVsdGktZGF5IHJhbmdlLiBzaG9ydGVyLCBsaWtlIFwiU2VwIDkgLSAxMCAyMDE0XCJcbiAgICAgICAgcmV0dXJuIHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycgfTtcbiAgICB9XG4gICAgLy8gb25lIGRheS4gbG9uZ2VyLCBsaWtlIFwiU2VwdGVtYmVyIDkgMjAxNFwiXG4gICAgcmV0dXJuIHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ2xvbmcnLCBkYXk6ICdudW1lcmljJyB9O1xufVxuXG4vLyBpbiBmdXR1cmUgcmVmYWN0b3IsIGRvIHRoZSByZWR1eC1zdHlsZSBmdW5jdGlvbihzdGF0ZT1pbml0aWFsKSBmb3IgaW5pdGlhbC1zdGF0ZVxuLy8gYWxzbywgd2hhdGV2ZXIgaXMgaGFwcGVuaW5nIGluIGNvbnN0cnVjdG9yLCBoYXZlIGl0IGhhcHBlbiBpbiBhY3Rpb24gcXVldWUgdG9vXG52YXIgQ2FsZW5kYXJEYXRhTWFuYWdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDYWxlbmRhckRhdGFNYW5hZ2VyKHByb3BzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuY29tcHV0ZU9wdGlvbnNEYXRhID0gbWVtb2l6ZSh0aGlzLl9jb21wdXRlT3B0aW9uc0RhdGEpO1xuICAgICAgICB0aGlzLmNvbXB1dGVDdXJyZW50Vmlld0RhdGEgPSBtZW1vaXplKHRoaXMuX2NvbXB1dGVDdXJyZW50Vmlld0RhdGEpO1xuICAgICAgICB0aGlzLm9yZ2FuaXplUmF3TG9jYWxlcyA9IG1lbW9pemUob3JnYW5pemVSYXdMb2NhbGVzKTtcbiAgICAgICAgdGhpcy5idWlsZExvY2FsZSA9IG1lbW9pemUoYnVpbGRMb2NhbGUpO1xuICAgICAgICB0aGlzLmJ1aWxkUGx1Z2luSG9va3MgPSBidWlsZEJ1aWxkUGx1Z2luSG9va3MoKTtcbiAgICAgICAgdGhpcy5idWlsZERhdGVFbnYgPSBtZW1vaXplKGJ1aWxkRGF0ZUVudik7XG4gICAgICAgIHRoaXMuYnVpbGRUaGVtZSA9IG1lbW9pemUoYnVpbGRUaGVtZSk7XG4gICAgICAgIHRoaXMucGFyc2VUb29sYmFycyA9IG1lbW9pemUocGFyc2VUb29sYmFycyk7XG4gICAgICAgIHRoaXMuYnVpbGRWaWV3U3BlY3MgPSBtZW1vaXplKGJ1aWxkVmlld1NwZWNzKTtcbiAgICAgICAgdGhpcy5idWlsZERhdGVQcm9maWxlR2VuZXJhdG9yID0gbWVtb2l6ZU9iakFyZyhidWlsZERhdGVQcm9maWxlR2VuZXJhdG9yKTtcbiAgICAgICAgdGhpcy5idWlsZFZpZXdBcGkgPSBtZW1vaXplKGJ1aWxkVmlld0FwaSk7XG4gICAgICAgIHRoaXMuYnVpbGRWaWV3VWlQcm9wcyA9IG1lbW9pemVPYmpBcmcoYnVpbGRWaWV3VWlQcm9wcyk7XG4gICAgICAgIHRoaXMuYnVpbGRFdmVudFVpQnlTb3VyY2UgPSBtZW1vaXplKGJ1aWxkRXZlbnRVaUJ5U291cmNlLCBpc1Byb3BzRXF1YWwpO1xuICAgICAgICB0aGlzLmJ1aWxkRXZlbnRVaUJhc2VzID0gbWVtb2l6ZShidWlsZEV2ZW50VWlCYXNlcyk7XG4gICAgICAgIHRoaXMucGFyc2VDb250ZXh0QnVzaW5lc3NIb3VycyA9IG1lbW9pemVPYmpBcmcocGFyc2VDb250ZXh0QnVzaW5lc3NIb3Vycyk7XG4gICAgICAgIHRoaXMuYnVpbGRUaXRsZSA9IG1lbW9pemUoYnVpbGRUaXRsZSk7XG4gICAgICAgIHRoaXMuZW1pdHRlciA9IG5ldyBFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuYWN0aW9uUnVubmVyID0gbmV3IFRhc2tSdW5uZXIodGhpcy5faGFuZGxlQWN0aW9uLmJpbmQodGhpcyksIHRoaXMudXBkYXRlRGF0YS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsZW5kYXJPcHRpb25zSW5wdXQgPSB7fTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsZW5kYXJPcHRpb25zUmVmaW5lZCA9IHt9O1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3T3B0aW9uc0lucHV0ID0ge307XG4gICAgICAgIHRoaXMuY3VycmVudFZpZXdPcHRpb25zUmVmaW5lZCA9IHt9O1xuICAgICAgICB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVycyA9IHt9O1xuICAgICAgICB0aGlzLmdldEN1cnJlbnREYXRhID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuZGF0YTsgfTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCA9IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgICAgIF90aGlzLmFjdGlvblJ1bm5lci5yZXF1ZXN0KGFjdGlvbik7IC8vIHByb3RlY3RzIGFnYWluc3QgcmVjdXJzaXZlIGNhbGxzIHRvIF9oYW5kbGVBY3Rpb25cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgICAgICB0aGlzLmFjdGlvblJ1bm5lci5wYXVzZSgpO1xuICAgICAgICB2YXIgZHluYW1pY09wdGlvbk92ZXJyaWRlcyA9IHt9O1xuICAgICAgICB2YXIgb3B0aW9uc0RhdGEgPSB0aGlzLmNvbXB1dGVPcHRpb25zRGF0YShwcm9wcy5vcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsIHByb3BzLmNhbGVuZGFyQXBpKTtcbiAgICAgICAgdmFyIGN1cnJlbnRWaWV3VHlwZSA9IG9wdGlvbnNEYXRhLmNhbGVuZGFyT3B0aW9ucy5pbml0aWFsVmlldyB8fCBvcHRpb25zRGF0YS5wbHVnaW5Ib29rcy5pbml0aWFsVmlldztcbiAgICAgICAgdmFyIGN1cnJlbnRWaWV3RGF0YSA9IHRoaXMuY29tcHV0ZUN1cnJlbnRWaWV3RGF0YShjdXJyZW50Vmlld1R5cGUsIG9wdGlvbnNEYXRhLCBwcm9wcy5vcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMpO1xuICAgICAgICAvLyB3aXJlIHRoaW5ncyB1cFxuICAgICAgICAvLyBUT0RPOiBub3QgRFJZXG4gICAgICAgIHByb3BzLmNhbGVuZGFyQXBpLmN1cnJlbnREYXRhTWFuYWdlciA9IHRoaXM7XG4gICAgICAgIHRoaXMuZW1pdHRlci5zZXRUaGlzQ29udGV4dChwcm9wcy5jYWxlbmRhckFwaSk7XG4gICAgICAgIHRoaXMuZW1pdHRlci5zZXRPcHRpb25zKGN1cnJlbnRWaWV3RGF0YS5vcHRpb25zKTtcbiAgICAgICAgdmFyIGN1cnJlbnREYXRlID0gZ2V0SW5pdGlhbERhdGUob3B0aW9uc0RhdGEuY2FsZW5kYXJPcHRpb25zLCBvcHRpb25zRGF0YS5kYXRlRW52KTtcbiAgICAgICAgdmFyIGRhdGVQcm9maWxlID0gY3VycmVudFZpZXdEYXRhLmRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkKGN1cnJlbnREYXRlKTtcbiAgICAgICAgaWYgKCFyYW5nZUNvbnRhaW5zTWFya2VyKGRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlLCBjdXJyZW50RGF0ZSkpIHtcbiAgICAgICAgICAgIGN1cnJlbnREYXRlID0gZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlLnN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBjYWxlbmRhckNvbnRleHQgPSB7XG4gICAgICAgICAgICBkYXRlRW52OiBvcHRpb25zRGF0YS5kYXRlRW52LFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc0RhdGEuY2FsZW5kYXJPcHRpb25zLFxuICAgICAgICAgICAgcGx1Z2luSG9va3M6IG9wdGlvbnNEYXRhLnBsdWdpbkhvb2tzLFxuICAgICAgICAgICAgY2FsZW5kYXJBcGk6IHByb3BzLmNhbGVuZGFyQXBpLFxuICAgICAgICAgICAgZGlzcGF0Y2g6IHRoaXMuZGlzcGF0Y2gsXG4gICAgICAgICAgICBlbWl0dGVyOiB0aGlzLmVtaXR0ZXIsXG4gICAgICAgICAgICBnZXRDdXJyZW50RGF0YTogdGhpcy5nZXRDdXJyZW50RGF0YSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gbmVlZHMgdG8gYmUgYWZ0ZXIgc2V0VGhpc0NvbnRleHRcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IG9wdGlvbnNEYXRhLnBsdWdpbkhvb2tzLmNvbnRleHRJbml0OyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gX2FbX2ldO1xuICAgICAgICAgICAgY2FsbGJhY2soY2FsZW5kYXJDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOT1QgRFJZXG4gICAgICAgIHZhciBldmVudFNvdXJjZXMgPSBpbml0RXZlbnRTb3VyY2VzKG9wdGlvbnNEYXRhLmNhbGVuZGFyT3B0aW9ucywgZGF0ZVByb2ZpbGUsIGNhbGVuZGFyQ29udGV4dCk7XG4gICAgICAgIHZhciBpbml0aWFsU3RhdGUgPSB7XG4gICAgICAgICAgICBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzOiBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzLFxuICAgICAgICAgICAgY3VycmVudFZpZXdUeXBlOiBjdXJyZW50Vmlld1R5cGUsXG4gICAgICAgICAgICBjdXJyZW50RGF0ZTogY3VycmVudERhdGUsXG4gICAgICAgICAgICBkYXRlUHJvZmlsZTogZGF0ZVByb2ZpbGUsXG4gICAgICAgICAgICBidXNpbmVzc0hvdXJzOiB0aGlzLnBhcnNlQ29udGV4dEJ1c2luZXNzSG91cnMoY2FsZW5kYXJDb250ZXh0KSxcbiAgICAgICAgICAgIGV2ZW50U291cmNlczogZXZlbnRTb3VyY2VzLFxuICAgICAgICAgICAgZXZlbnRVaUJhc2VzOiB7fSxcbiAgICAgICAgICAgIGV2ZW50U3RvcmU6IGNyZWF0ZUVtcHR5RXZlbnRTdG9yZSgpLFxuICAgICAgICAgICAgcmVuZGVyYWJsZUV2ZW50U3RvcmU6IGNyZWF0ZUVtcHR5RXZlbnRTdG9yZSgpLFxuICAgICAgICAgICAgZGF0ZVNlbGVjdGlvbjogbnVsbCxcbiAgICAgICAgICAgIGV2ZW50U2VsZWN0aW9uOiAnJyxcbiAgICAgICAgICAgIGV2ZW50RHJhZzogbnVsbCxcbiAgICAgICAgICAgIGV2ZW50UmVzaXplOiBudWxsLFxuICAgICAgICAgICAgc2VsZWN0aW9uQ29uZmlnOiB0aGlzLmJ1aWxkVmlld1VpUHJvcHMoY2FsZW5kYXJDb250ZXh0KS5zZWxlY3Rpb25Db25maWcsXG4gICAgICAgIH07XG4gICAgICAgIHZhciBjb250ZXh0QW5kU3RhdGUgPSB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgY2FsZW5kYXJDb250ZXh0KSwgaW5pdGlhbFN0YXRlKTtcbiAgICAgICAgZm9yICh2YXIgX2IgPSAwLCBfYyA9IG9wdGlvbnNEYXRhLnBsdWdpbkhvb2tzLnJlZHVjZXJzOyBfYiA8IF9jLmxlbmd0aDsgX2IrKykge1xuICAgICAgICAgICAgdmFyIHJlZHVjZXIgPSBfY1tfYl07XG4gICAgICAgICAgICB0c2xpYi5fX2Fzc2lnbihpbml0aWFsU3RhdGUsIHJlZHVjZXIobnVsbCwgbnVsbCwgY29udGV4dEFuZFN0YXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXB1dGVJc0xvYWRpbmcoaW5pdGlhbFN0YXRlLCBjYWxlbmRhckNvbnRleHQpKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcignbG9hZGluZycsIHRydWUpOyAvLyBOT1QgRFJZXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgICAgICAgdGhpcy51cGRhdGVEYXRhKCk7XG4gICAgICAgIHRoaXMuYWN0aW9uUnVubmVyLnJlc3VtZSgpO1xuICAgIH1cbiAgICBDYWxlbmRhckRhdGFNYW5hZ2VyLnByb3RvdHlwZS5yZXNldE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9uT3ZlcnJpZGVzLCBhcHBlbmQpIHtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgcHJvcHMub3B0aW9uT3ZlcnJpZGVzID0gYXBwZW5kXG4gICAgICAgICAgICA/IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBwcm9wcy5vcHRpb25PdmVycmlkZXMpLCBvcHRpb25PdmVycmlkZXMpIDogb3B0aW9uT3ZlcnJpZGVzO1xuICAgICAgICB0aGlzLmFjdGlvblJ1bm5lci5yZXF1ZXN0KHtcbiAgICAgICAgICAgIHR5cGU6ICdOT1RISU5HJyxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDYWxlbmRhckRhdGFNYW5hZ2VyLnByb3RvdHlwZS5faGFuZGxlQWN0aW9uID0gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBzdGF0ZSA9IF9hLnN0YXRlLCBlbWl0dGVyID0gX2EuZW1pdHRlcjtcbiAgICAgICAgdmFyIGR5bmFtaWNPcHRpb25PdmVycmlkZXMgPSByZWR1Y2VEeW5hbWljT3B0aW9uT3ZlcnJpZGVzKHN0YXRlLmR5bmFtaWNPcHRpb25PdmVycmlkZXMsIGFjdGlvbik7XG4gICAgICAgIHZhciBvcHRpb25zRGF0YSA9IHRoaXMuY29tcHV0ZU9wdGlvbnNEYXRhKHByb3BzLm9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcywgcHJvcHMuY2FsZW5kYXJBcGkpO1xuICAgICAgICB2YXIgY3VycmVudFZpZXdUeXBlID0gcmVkdWNlVmlld1R5cGUoc3RhdGUuY3VycmVudFZpZXdUeXBlLCBhY3Rpb24pO1xuICAgICAgICB2YXIgY3VycmVudFZpZXdEYXRhID0gdGhpcy5jb21wdXRlQ3VycmVudFZpZXdEYXRhKGN1cnJlbnRWaWV3VHlwZSwgb3B0aW9uc0RhdGEsIHByb3BzLm9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcyk7XG4gICAgICAgIC8vIHdpcmUgdGhpbmdzIHVwXG4gICAgICAgIC8vIFRPRE86IG5vdCBEUllcbiAgICAgICAgcHJvcHMuY2FsZW5kYXJBcGkuY3VycmVudERhdGFNYW5hZ2VyID0gdGhpcztcbiAgICAgICAgZW1pdHRlci5zZXRUaGlzQ29udGV4dChwcm9wcy5jYWxlbmRhckFwaSk7XG4gICAgICAgIGVtaXR0ZXIuc2V0T3B0aW9ucyhjdXJyZW50Vmlld0RhdGEub3B0aW9ucyk7XG4gICAgICAgIHZhciBjYWxlbmRhckNvbnRleHQgPSB7XG4gICAgICAgICAgICBkYXRlRW52OiBvcHRpb25zRGF0YS5kYXRlRW52LFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc0RhdGEuY2FsZW5kYXJPcHRpb25zLFxuICAgICAgICAgICAgcGx1Z2luSG9va3M6IG9wdGlvbnNEYXRhLnBsdWdpbkhvb2tzLFxuICAgICAgICAgICAgY2FsZW5kYXJBcGk6IHByb3BzLmNhbGVuZGFyQXBpLFxuICAgICAgICAgICAgZGlzcGF0Y2g6IHRoaXMuZGlzcGF0Y2gsXG4gICAgICAgICAgICBlbWl0dGVyOiBlbWl0dGVyLFxuICAgICAgICAgICAgZ2V0Q3VycmVudERhdGE6IHRoaXMuZ2V0Q3VycmVudERhdGEsXG4gICAgICAgIH07XG4gICAgICAgIHZhciBjdXJyZW50RGF0ZSA9IHN0YXRlLmN1cnJlbnREYXRlLCBkYXRlUHJvZmlsZSA9IHN0YXRlLmRhdGVQcm9maWxlO1xuICAgICAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5kYXRlUHJvZmlsZUdlbmVyYXRvciAhPT0gY3VycmVudFZpZXdEYXRhLmRhdGVQcm9maWxlR2VuZXJhdG9yKSB7IC8vIGhhY2tcbiAgICAgICAgICAgIGRhdGVQcm9maWxlID0gY3VycmVudFZpZXdEYXRhLmRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkKGN1cnJlbnREYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50RGF0ZSA9IHJlZHVjZUN1cnJlbnREYXRlKGN1cnJlbnREYXRlLCBhY3Rpb24pO1xuICAgICAgICBkYXRlUHJvZmlsZSA9IHJlZHVjZURhdGVQcm9maWxlKGRhdGVQcm9maWxlLCBhY3Rpb24sIGN1cnJlbnREYXRlLCBjdXJyZW50Vmlld0RhdGEuZGF0ZVByb2ZpbGVHZW5lcmF0b3IpO1xuICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdQUkVWJyB8fCAvLyBUT0RPOiBtb3ZlIHRoaXMgbG9naWMgaW50byBEYXRlUHJvZmlsZUdlbmVyYXRvclxuICAgICAgICAgICAgYWN0aW9uLnR5cGUgPT09ICdORVhUJyB8fCAvLyBcIlxuICAgICAgICAgICAgIXJhbmdlQ29udGFpbnNNYXJrZXIoZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlLCBjdXJyZW50RGF0ZSkpIHtcbiAgICAgICAgICAgIGN1cnJlbnREYXRlID0gZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlLnN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBldmVudFNvdXJjZXMgPSByZWR1Y2VFdmVudFNvdXJjZXMoc3RhdGUuZXZlbnRTb3VyY2VzLCBhY3Rpb24sIGRhdGVQcm9maWxlLCBjYWxlbmRhckNvbnRleHQpO1xuICAgICAgICB2YXIgZXZlbnRTdG9yZSA9IHJlZHVjZUV2ZW50U3RvcmUoc3RhdGUuZXZlbnRTdG9yZSwgYWN0aW9uLCBldmVudFNvdXJjZXMsIGRhdGVQcm9maWxlLCBjYWxlbmRhckNvbnRleHQpO1xuICAgICAgICB2YXIgaXNFdmVudHNMb2FkaW5nID0gY29tcHV0ZUV2ZW50U291cmNlc0xvYWRpbmcoZXZlbnRTb3VyY2VzKTsgLy8gQkFELiBhbHNvIGNhbGxlZCBpbiB0aGlzIGZ1bmMgaW4gY29tcHV0ZUlzTG9hZGluZ1xuICAgICAgICB2YXIgcmVuZGVyYWJsZUV2ZW50U3RvcmUgPSAoaXNFdmVudHNMb2FkaW5nICYmICFjdXJyZW50Vmlld0RhdGEub3B0aW9ucy5wcm9ncmVzc2l2ZUV2ZW50UmVuZGVyaW5nKSA/XG4gICAgICAgICAgICAoc3RhdGUucmVuZGVyYWJsZUV2ZW50U3RvcmUgfHwgZXZlbnRTdG9yZSkgOiAvLyB0cnkgZnJvbSBwcmV2aW91cyBzdGF0ZVxuICAgICAgICAgICAgZXZlbnRTdG9yZTtcbiAgICAgICAgdmFyIF9iID0gdGhpcy5idWlsZFZpZXdVaVByb3BzKGNhbGVuZGFyQ29udGV4dCksIGV2ZW50VWlTaW5nbGVCYXNlID0gX2IuZXZlbnRVaVNpbmdsZUJhc2UsIHNlbGVjdGlvbkNvbmZpZyA9IF9iLnNlbGVjdGlvbkNvbmZpZzsgLy8gd2lsbCBtZW1vaXplIG9ialxuICAgICAgICB2YXIgZXZlbnRVaUJ5U291cmNlID0gdGhpcy5idWlsZEV2ZW50VWlCeVNvdXJjZShldmVudFNvdXJjZXMpO1xuICAgICAgICB2YXIgZXZlbnRVaUJhc2VzID0gdGhpcy5idWlsZEV2ZW50VWlCYXNlcyhyZW5kZXJhYmxlRXZlbnRTdG9yZS5kZWZzLCBldmVudFVpU2luZ2xlQmFzZSwgZXZlbnRVaUJ5U291cmNlKTtcbiAgICAgICAgdmFyIG5ld1N0YXRlID0ge1xuICAgICAgICAgICAgZHluYW1pY09wdGlvbk92ZXJyaWRlczogZHluYW1pY09wdGlvbk92ZXJyaWRlcyxcbiAgICAgICAgICAgIGN1cnJlbnRWaWV3VHlwZTogY3VycmVudFZpZXdUeXBlLFxuICAgICAgICAgICAgY3VycmVudERhdGU6IGN1cnJlbnREYXRlLFxuICAgICAgICAgICAgZGF0ZVByb2ZpbGU6IGRhdGVQcm9maWxlLFxuICAgICAgICAgICAgZXZlbnRTb3VyY2VzOiBldmVudFNvdXJjZXMsXG4gICAgICAgICAgICBldmVudFN0b3JlOiBldmVudFN0b3JlLFxuICAgICAgICAgICAgcmVuZGVyYWJsZUV2ZW50U3RvcmU6IHJlbmRlcmFibGVFdmVudFN0b3JlLFxuICAgICAgICAgICAgc2VsZWN0aW9uQ29uZmlnOiBzZWxlY3Rpb25Db25maWcsXG4gICAgICAgICAgICBldmVudFVpQmFzZXM6IGV2ZW50VWlCYXNlcyxcbiAgICAgICAgICAgIGJ1c2luZXNzSG91cnM6IHRoaXMucGFyc2VDb250ZXh0QnVzaW5lc3NIb3VycyhjYWxlbmRhckNvbnRleHQpLFxuICAgICAgICAgICAgZGF0ZVNlbGVjdGlvbjogcmVkdWNlRGF0ZVNlbGVjdGlvbihzdGF0ZS5kYXRlU2VsZWN0aW9uLCBhY3Rpb24pLFxuICAgICAgICAgICAgZXZlbnRTZWxlY3Rpb246IHJlZHVjZVNlbGVjdGVkRXZlbnQoc3RhdGUuZXZlbnRTZWxlY3Rpb24sIGFjdGlvbiksXG4gICAgICAgICAgICBldmVudERyYWc6IHJlZHVjZUV2ZW50RHJhZyhzdGF0ZS5ldmVudERyYWcsIGFjdGlvbiksXG4gICAgICAgICAgICBldmVudFJlc2l6ZTogcmVkdWNlRXZlbnRSZXNpemUoc3RhdGUuZXZlbnRSZXNpemUsIGFjdGlvbiksXG4gICAgICAgIH07XG4gICAgICAgIHZhciBjb250ZXh0QW5kU3RhdGUgPSB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgY2FsZW5kYXJDb250ZXh0KSwgbmV3U3RhdGUpO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9jID0gb3B0aW9uc0RhdGEucGx1Z2luSG9va3MucmVkdWNlcnM7IF9pIDwgX2MubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgcmVkdWNlciA9IF9jW19pXTtcbiAgICAgICAgICAgIHRzbGliLl9fYXNzaWduKG5ld1N0YXRlLCByZWR1Y2VyKHN0YXRlLCBhY3Rpb24sIGNvbnRleHRBbmRTdGF0ZSkpOyAvLyBnaXZlIHRoZSBPTEQgc3RhdGUsIGZvciBvbGQgdmFsdWVcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2FzTG9hZGluZyA9IGNvbXB1dGVJc0xvYWRpbmcoc3RhdGUsIGNhbGVuZGFyQ29udGV4dCk7XG4gICAgICAgIHZhciBpc0xvYWRpbmcgPSBjb21wdXRlSXNMb2FkaW5nKG5ld1N0YXRlLCBjYWxlbmRhckNvbnRleHQpO1xuICAgICAgICAvLyBUT0RPOiB1c2UgcHJvcFNldEhhbmRsZXJzIGluIHBsdWdpbiBzeXN0ZW1cbiAgICAgICAgaWYgKCF3YXNMb2FkaW5nICYmIGlzTG9hZGluZykge1xuICAgICAgICAgICAgZW1pdHRlci50cmlnZ2VyKCdsb2FkaW5nJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAod2FzTG9hZGluZyAmJiAhaXNMb2FkaW5nKSB7XG4gICAgICAgICAgICBlbWl0dGVyLnRyaWdnZXIoJ2xvYWRpbmcnLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICBpZiAocHJvcHMub25BY3Rpb24pIHtcbiAgICAgICAgICAgIHByb3BzLm9uQWN0aW9uKGFjdGlvbik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENhbGVuZGFyRGF0YU1hbmFnZXIucHJvdG90eXBlLnVwZGF0ZURhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIHN0YXRlID0gX2Euc3RhdGU7XG4gICAgICAgIHZhciBvbGREYXRhID0gdGhpcy5kYXRhO1xuICAgICAgICB2YXIgb3B0aW9uc0RhdGEgPSB0aGlzLmNvbXB1dGVPcHRpb25zRGF0YShwcm9wcy5vcHRpb25PdmVycmlkZXMsIHN0YXRlLmR5bmFtaWNPcHRpb25PdmVycmlkZXMsIHByb3BzLmNhbGVuZGFyQXBpKTtcbiAgICAgICAgdmFyIGN1cnJlbnRWaWV3RGF0YSA9IHRoaXMuY29tcHV0ZUN1cnJlbnRWaWV3RGF0YShzdGF0ZS5jdXJyZW50Vmlld1R5cGUsIG9wdGlvbnNEYXRhLCBwcm9wcy5vcHRpb25PdmVycmlkZXMsIHN0YXRlLmR5bmFtaWNPcHRpb25PdmVycmlkZXMpO1xuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSA9IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHsgdmlld1RpdGxlOiB0aGlzLmJ1aWxkVGl0bGUoc3RhdGUuZGF0ZVByb2ZpbGUsIGN1cnJlbnRWaWV3RGF0YS5vcHRpb25zLCBvcHRpb25zRGF0YS5kYXRlRW52KSwgY2FsZW5kYXJBcGk6IHByb3BzLmNhbGVuZGFyQXBpLCBkaXNwYXRjaDogdGhpcy5kaXNwYXRjaCwgZW1pdHRlcjogdGhpcy5lbWl0dGVyLCBnZXRDdXJyZW50RGF0YTogdGhpcy5nZXRDdXJyZW50RGF0YSB9LCBvcHRpb25zRGF0YSksIGN1cnJlbnRWaWV3RGF0YSksIHN0YXRlKTtcbiAgICAgICAgdmFyIGNoYW5nZUhhbmRsZXJzID0gb3B0aW9uc0RhdGEucGx1Z2luSG9va3Mub3B0aW9uQ2hhbmdlSGFuZGxlcnM7XG4gICAgICAgIHZhciBvbGRDYWxlbmRhck9wdGlvbnMgPSBvbGREYXRhICYmIG9sZERhdGEuY2FsZW5kYXJPcHRpb25zO1xuICAgICAgICB2YXIgbmV3Q2FsZW5kYXJPcHRpb25zID0gb3B0aW9uc0RhdGEuY2FsZW5kYXJPcHRpb25zO1xuICAgICAgICBpZiAob2xkQ2FsZW5kYXJPcHRpb25zICYmIG9sZENhbGVuZGFyT3B0aW9ucyAhPT0gbmV3Q2FsZW5kYXJPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAob2xkQ2FsZW5kYXJPcHRpb25zLnRpbWVab25lICE9PSBuZXdDYWxlbmRhck9wdGlvbnMudGltZVpvbmUpIHtcbiAgICAgICAgICAgICAgICAvLyBoYWNrXG4gICAgICAgICAgICAgICAgc3RhdGUuZXZlbnRTb3VyY2VzID0gZGF0YS5ldmVudFNvdXJjZXMgPSByZWR1Y2VFdmVudFNvdXJjZXNOZXdUaW1lWm9uZShkYXRhLmV2ZW50U291cmNlcywgc3RhdGUuZGF0ZVByb2ZpbGUsIGRhdGEpO1xuICAgICAgICAgICAgICAgIHN0YXRlLmV2ZW50U3RvcmUgPSBkYXRhLmV2ZW50U3RvcmUgPSByZXpvbmVFdmVudFN0b3JlRGF0ZXMoZGF0YS5ldmVudFN0b3JlLCBvbGREYXRhLmRhdGVFbnYsIGRhdGEuZGF0ZUVudik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBvcHRpb25OYW1lIGluIGNoYW5nZUhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZENhbGVuZGFyT3B0aW9uc1tvcHRpb25OYW1lXSAhPT0gbmV3Q2FsZW5kYXJPcHRpb25zW29wdGlvbk5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZUhhbmRsZXJzW29wdGlvbk5hbWVdKG5ld0NhbGVuZGFyT3B0aW9uc1tvcHRpb25OYW1lXSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wcy5vbkRhdGEpIHtcbiAgICAgICAgICAgIHByb3BzLm9uRGF0YShkYXRhKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ2FsZW5kYXJEYXRhTWFuYWdlci5wcm90b3R5cGUuX2NvbXB1dGVPcHRpb25zRGF0YSA9IGZ1bmN0aW9uIChvcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsIGNhbGVuZGFyQXBpKSB7XG4gICAgICAgIC8vIFRPRE86IGJsYWNrbGlzdCBvcHRpb25zIHRoYXQgYXJlIGhhbmRsZWQgYnkgb3B0aW9uQ2hhbmdlSGFuZGxlcnNcbiAgICAgICAgdmFyIF9hID0gdGhpcy5wcm9jZXNzUmF3Q2FsZW5kYXJPcHRpb25zKG9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcyksIHJlZmluZWRPcHRpb25zID0gX2EucmVmaW5lZE9wdGlvbnMsIHBsdWdpbkhvb2tzID0gX2EucGx1Z2luSG9va3MsIGxvY2FsZURlZmF1bHRzID0gX2EubG9jYWxlRGVmYXVsdHMsIGF2YWlsYWJsZUxvY2FsZURhdGEgPSBfYS5hdmFpbGFibGVMb2NhbGVEYXRhLCBleHRyYSA9IF9hLmV4dHJhO1xuICAgICAgICB3YXJuVW5rbm93bk9wdGlvbnMoZXh0cmEpO1xuICAgICAgICB2YXIgZGF0ZUVudiA9IHRoaXMuYnVpbGREYXRlRW52KHJlZmluZWRPcHRpb25zLnRpbWVab25lLCByZWZpbmVkT3B0aW9ucy5sb2NhbGUsIHJlZmluZWRPcHRpb25zLndlZWtOdW1iZXJDYWxjdWxhdGlvbiwgcmVmaW5lZE9wdGlvbnMuZmlyc3REYXksIHJlZmluZWRPcHRpb25zLndlZWtUZXh0LCBwbHVnaW5Ib29rcywgYXZhaWxhYmxlTG9jYWxlRGF0YSwgcmVmaW5lZE9wdGlvbnMuZGVmYXVsdFJhbmdlU2VwYXJhdG9yKTtcbiAgICAgICAgdmFyIHZpZXdTcGVjcyA9IHRoaXMuYnVpbGRWaWV3U3BlY3MocGx1Z2luSG9va3Mudmlld3MsIG9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcywgbG9jYWxlRGVmYXVsdHMpO1xuICAgICAgICB2YXIgdGhlbWUgPSB0aGlzLmJ1aWxkVGhlbWUocmVmaW5lZE9wdGlvbnMsIHBsdWdpbkhvb2tzKTtcbiAgICAgICAgdmFyIHRvb2xiYXJDb25maWcgPSB0aGlzLnBhcnNlVG9vbGJhcnMocmVmaW5lZE9wdGlvbnMsIG9wdGlvbk92ZXJyaWRlcywgdGhlbWUsIHZpZXdTcGVjcywgY2FsZW5kYXJBcGkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2FsZW5kYXJPcHRpb25zOiByZWZpbmVkT3B0aW9ucyxcbiAgICAgICAgICAgIHBsdWdpbkhvb2tzOiBwbHVnaW5Ib29rcyxcbiAgICAgICAgICAgIGRhdGVFbnY6IGRhdGVFbnYsXG4gICAgICAgICAgICB2aWV3U3BlY3M6IHZpZXdTcGVjcyxcbiAgICAgICAgICAgIHRoZW1lOiB0aGVtZSxcbiAgICAgICAgICAgIHRvb2xiYXJDb25maWc6IHRvb2xiYXJDb25maWcsXG4gICAgICAgICAgICBsb2NhbGVEZWZhdWx0czogbG9jYWxlRGVmYXVsdHMsXG4gICAgICAgICAgICBhdmFpbGFibGVSYXdMb2NhbGVzOiBhdmFpbGFibGVMb2NhbGVEYXRhLm1hcCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8vIGFsd2F5cyBjYWxsZWQgZnJvbSBiZWhpbmQgYSBtZW1vaXplclxuICAgIENhbGVuZGFyRGF0YU1hbmFnZXIucHJvdG90eXBlLnByb2Nlc3NSYXdDYWxlbmRhck9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9uT3ZlcnJpZGVzLCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzKSB7XG4gICAgICAgIHZhciBfYSA9IG1lcmdlUmF3T3B0aW9ucyhbXG4gICAgICAgICAgICBCQVNFX09QVElPTl9ERUZBVUxUUyxcbiAgICAgICAgICAgIG9wdGlvbk92ZXJyaWRlcyxcbiAgICAgICAgICAgIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsXG4gICAgICAgIF0pLCBsb2NhbGVzID0gX2EubG9jYWxlcywgbG9jYWxlID0gX2EubG9jYWxlO1xuICAgICAgICB2YXIgYXZhaWxhYmxlTG9jYWxlRGF0YSA9IHRoaXMub3JnYW5pemVSYXdMb2NhbGVzKGxvY2FsZXMpO1xuICAgICAgICB2YXIgYXZhaWxhYmxlUmF3TG9jYWxlcyA9IGF2YWlsYWJsZUxvY2FsZURhdGEubWFwO1xuICAgICAgICB2YXIgbG9jYWxlRGVmYXVsdHMgPSB0aGlzLmJ1aWxkTG9jYWxlKGxvY2FsZSB8fCBhdmFpbGFibGVMb2NhbGVEYXRhLmRlZmF1bHRDb2RlLCBhdmFpbGFibGVSYXdMb2NhbGVzKS5vcHRpb25zO1xuICAgICAgICB2YXIgcGx1Z2luSG9va3MgPSB0aGlzLmJ1aWxkUGx1Z2luSG9va3Mob3B0aW9uT3ZlcnJpZGVzLnBsdWdpbnMgfHwgW10sIGdsb2JhbFBsdWdpbnMpO1xuICAgICAgICB2YXIgcmVmaW5lcnMgPSB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVycyA9IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBCQVNFX09QVElPTl9SRUZJTkVSUyksIENBTEVOREFSX0xJU1RFTkVSX1JFRklORVJTKSwgQ0FMRU5EQVJfT1BUSU9OX1JFRklORVJTKSwgcGx1Z2luSG9va3MubGlzdGVuZXJSZWZpbmVycyksIHBsdWdpbkhvb2tzLm9wdGlvblJlZmluZXJzKTtcbiAgICAgICAgdmFyIGV4dHJhID0ge307XG4gICAgICAgIHZhciByYXcgPSBtZXJnZVJhd09wdGlvbnMoW1xuICAgICAgICAgICAgQkFTRV9PUFRJT05fREVGQVVMVFMsXG4gICAgICAgICAgICBsb2NhbGVEZWZhdWx0cyxcbiAgICAgICAgICAgIG9wdGlvbk92ZXJyaWRlcyxcbiAgICAgICAgICAgIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsXG4gICAgICAgIF0pO1xuICAgICAgICB2YXIgcmVmaW5lZCA9IHt9O1xuICAgICAgICB2YXIgY3VycmVudFJhdyA9IHRoaXMuY3VycmVudENhbGVuZGFyT3B0aW9uc0lucHV0O1xuICAgICAgICB2YXIgY3VycmVudFJlZmluZWQgPSB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVkO1xuICAgICAgICB2YXIgYW55Q2hhbmdlcyA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBvcHRpb25OYW1lIGluIHJhdykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbk5hbWUgIT09ICdwbHVnaW5zJykgeyAvLyBiZWNhdXNlIHBsdWdpbnMgaXMgc3BlY2lhbC1jYXNlZFxuICAgICAgICAgICAgICAgIGlmIChyYXdbb3B0aW9uTmFtZV0gPT09IGN1cnJlbnRSYXdbb3B0aW9uTmFtZV0gfHxcbiAgICAgICAgICAgICAgICAgICAgKENPTVBMRVhfT1BUSU9OX0NPTVBBUkFUT1JTW29wdGlvbk5hbWVdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uTmFtZSBpbiBjdXJyZW50UmF3KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlNbb3B0aW9uTmFtZV0oY3VycmVudFJhd1tvcHRpb25OYW1lXSwgcmF3W29wdGlvbk5hbWVdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmaW5lZFtvcHRpb25OYW1lXSA9IGN1cnJlbnRSZWZpbmVkW29wdGlvbk5hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZpbmVyc1tvcHRpb25OYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICByZWZpbmVkW29wdGlvbk5hbWVdID0gcmVmaW5lcnNbb3B0aW9uTmFtZV0ocmF3W29wdGlvbk5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgYW55Q2hhbmdlcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBleHRyYVtvcHRpb25OYW1lXSA9IGN1cnJlbnRSYXdbb3B0aW9uTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhbnlDaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNJbnB1dCA9IHJhdztcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGVuZGFyT3B0aW9uc1JlZmluZWQgPSByZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByYXdPcHRpb25zOiB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNJbnB1dCxcbiAgICAgICAgICAgIHJlZmluZWRPcHRpb25zOiB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVkLFxuICAgICAgICAgICAgcGx1Z2luSG9va3M6IHBsdWdpbkhvb2tzLFxuICAgICAgICAgICAgYXZhaWxhYmxlTG9jYWxlRGF0YTogYXZhaWxhYmxlTG9jYWxlRGF0YSxcbiAgICAgICAgICAgIGxvY2FsZURlZmF1bHRzOiBsb2NhbGVEZWZhdWx0cyxcbiAgICAgICAgICAgIGV4dHJhOiBleHRyYSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIENhbGVuZGFyRGF0YU1hbmFnZXIucHJvdG90eXBlLl9jb21wdXRlQ3VycmVudFZpZXdEYXRhID0gZnVuY3Rpb24gKHZpZXdUeXBlLCBvcHRpb25zRGF0YSwgb3B0aW9uT3ZlcnJpZGVzLCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzKSB7XG4gICAgICAgIHZhciB2aWV3U3BlYyA9IG9wdGlvbnNEYXRhLnZpZXdTcGVjc1t2aWV3VHlwZV07XG4gICAgICAgIGlmICghdmlld1NwZWMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInZpZXdUeXBlIFxcXCJcIiArIHZpZXdUeXBlICsgXCJcXFwiIGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBtYWtlIHN1cmUgeW91J3ZlIGxvYWRlZCBhbGwgbmVjY2Vzc2FyeSBwbHVnaW5zXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfYSA9IHRoaXMucHJvY2Vzc1Jhd1ZpZXdPcHRpb25zKHZpZXdTcGVjLCBvcHRpb25zRGF0YS5wbHVnaW5Ib29rcywgb3B0aW9uc0RhdGEubG9jYWxlRGVmYXVsdHMsIG9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcyksIHJlZmluZWRPcHRpb25zID0gX2EucmVmaW5lZE9wdGlvbnMsIGV4dHJhID0gX2EuZXh0cmE7XG4gICAgICAgIHdhcm5Vbmtub3duT3B0aW9ucyhleHRyYSk7XG4gICAgICAgIHZhciBkYXRlUHJvZmlsZUdlbmVyYXRvciA9IHRoaXMuYnVpbGREYXRlUHJvZmlsZUdlbmVyYXRvcih7XG4gICAgICAgICAgICBkYXRlUHJvZmlsZUdlbmVyYXRvckNsYXNzOiB2aWV3U3BlYy5vcHRpb25EZWZhdWx0cy5kYXRlUHJvZmlsZUdlbmVyYXRvckNsYXNzLFxuICAgICAgICAgICAgZHVyYXRpb246IHZpZXdTcGVjLmR1cmF0aW9uLFxuICAgICAgICAgICAgZHVyYXRpb25Vbml0OiB2aWV3U3BlYy5kdXJhdGlvblVuaXQsXG4gICAgICAgICAgICB1c2VzTWluTWF4VGltZTogdmlld1NwZWMub3B0aW9uRGVmYXVsdHMudXNlc01pbk1heFRpbWUsXG4gICAgICAgICAgICBkYXRlRW52OiBvcHRpb25zRGF0YS5kYXRlRW52LFxuICAgICAgICAgICAgY2FsZW5kYXJBcGk6IHRoaXMucHJvcHMuY2FsZW5kYXJBcGksXG4gICAgICAgICAgICBzbG90TWluVGltZTogcmVmaW5lZE9wdGlvbnMuc2xvdE1pblRpbWUsXG4gICAgICAgICAgICBzbG90TWF4VGltZTogcmVmaW5lZE9wdGlvbnMuc2xvdE1heFRpbWUsXG4gICAgICAgICAgICBzaG93Tm9uQ3VycmVudERhdGVzOiByZWZpbmVkT3B0aW9ucy5zaG93Tm9uQ3VycmVudERhdGVzLFxuICAgICAgICAgICAgZGF5Q291bnQ6IHJlZmluZWRPcHRpb25zLmRheUNvdW50LFxuICAgICAgICAgICAgZGF0ZUFsaWdubWVudDogcmVmaW5lZE9wdGlvbnMuZGF0ZUFsaWdubWVudCxcbiAgICAgICAgICAgIGRhdGVJbmNyZW1lbnQ6IHJlZmluZWRPcHRpb25zLmRhdGVJbmNyZW1lbnQsXG4gICAgICAgICAgICBoaWRkZW5EYXlzOiByZWZpbmVkT3B0aW9ucy5oaWRkZW5EYXlzLFxuICAgICAgICAgICAgd2Vla2VuZHM6IHJlZmluZWRPcHRpb25zLndlZWtlbmRzLFxuICAgICAgICAgICAgbm93SW5wdXQ6IHJlZmluZWRPcHRpb25zLm5vdyxcbiAgICAgICAgICAgIHZhbGlkUmFuZ2VJbnB1dDogcmVmaW5lZE9wdGlvbnMudmFsaWRSYW5nZSxcbiAgICAgICAgICAgIHZpc2libGVSYW5nZUlucHV0OiByZWZpbmVkT3B0aW9ucy52aXNpYmxlUmFuZ2UsXG4gICAgICAgICAgICBtb250aE1vZGU6IHJlZmluZWRPcHRpb25zLm1vbnRoTW9kZSxcbiAgICAgICAgICAgIGZpeGVkV2Vla0NvdW50OiByZWZpbmVkT3B0aW9ucy5maXhlZFdlZWtDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB2aWV3QXBpID0gdGhpcy5idWlsZFZpZXdBcGkodmlld1R5cGUsIHRoaXMuZ2V0Q3VycmVudERhdGEsIG9wdGlvbnNEYXRhLmRhdGVFbnYpO1xuICAgICAgICByZXR1cm4geyB2aWV3U3BlYzogdmlld1NwZWMsIG9wdGlvbnM6IHJlZmluZWRPcHRpb25zLCBkYXRlUHJvZmlsZUdlbmVyYXRvcjogZGF0ZVByb2ZpbGVHZW5lcmF0b3IsIHZpZXdBcGk6IHZpZXdBcGkgfTtcbiAgICB9O1xuICAgIENhbGVuZGFyRGF0YU1hbmFnZXIucHJvdG90eXBlLnByb2Nlc3NSYXdWaWV3T3B0aW9ucyA9IGZ1bmN0aW9uICh2aWV3U3BlYywgcGx1Z2luSG9va3MsIGxvY2FsZURlZmF1bHRzLCBvcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMpIHtcbiAgICAgICAgdmFyIHJhdyA9IG1lcmdlUmF3T3B0aW9ucyhbXG4gICAgICAgICAgICBCQVNFX09QVElPTl9ERUZBVUxUUyxcbiAgICAgICAgICAgIHZpZXdTcGVjLm9wdGlvbkRlZmF1bHRzLFxuICAgICAgICAgICAgbG9jYWxlRGVmYXVsdHMsXG4gICAgICAgICAgICBvcHRpb25PdmVycmlkZXMsXG4gICAgICAgICAgICB2aWV3U3BlYy5vcHRpb25PdmVycmlkZXMsXG4gICAgICAgICAgICBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzLFxuICAgICAgICBdKTtcbiAgICAgICAgdmFyIHJlZmluZXJzID0gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIEJBU0VfT1BUSU9OX1JFRklORVJTKSwgQ0FMRU5EQVJfTElTVEVORVJfUkVGSU5FUlMpLCBDQUxFTkRBUl9PUFRJT05fUkVGSU5FUlMpLCBWSUVXX09QVElPTl9SRUZJTkVSUyksIHBsdWdpbkhvb2tzLmxpc3RlbmVyUmVmaW5lcnMpLCBwbHVnaW5Ib29rcy5vcHRpb25SZWZpbmVycyk7XG4gICAgICAgIHZhciByZWZpbmVkID0ge307XG4gICAgICAgIHZhciBjdXJyZW50UmF3ID0gdGhpcy5jdXJyZW50Vmlld09wdGlvbnNJbnB1dDtcbiAgICAgICAgdmFyIGN1cnJlbnRSZWZpbmVkID0gdGhpcy5jdXJyZW50Vmlld09wdGlvbnNSZWZpbmVkO1xuICAgICAgICB2YXIgYW55Q2hhbmdlcyA9IGZhbHNlO1xuICAgICAgICB2YXIgZXh0cmEgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgb3B0aW9uTmFtZSBpbiByYXcpIHtcbiAgICAgICAgICAgIGlmIChyYXdbb3B0aW9uTmFtZV0gPT09IGN1cnJlbnRSYXdbb3B0aW9uTmFtZV0gfHxcbiAgICAgICAgICAgICAgICAoQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlNbb3B0aW9uTmFtZV0gJiZcbiAgICAgICAgICAgICAgICAgICAgQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlNbb3B0aW9uTmFtZV0ocmF3W29wdGlvbk5hbWVdLCBjdXJyZW50UmF3W29wdGlvbk5hbWVdKSkpIHtcbiAgICAgICAgICAgICAgICByZWZpbmVkW29wdGlvbk5hbWVdID0gY3VycmVudFJlZmluZWRbb3B0aW9uTmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmF3W29wdGlvbk5hbWVdID09PSB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNJbnB1dFtvcHRpb25OYW1lXSB8fFxuICAgICAgICAgICAgICAgICAgICAoQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlNbb3B0aW9uTmFtZV0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIENPTVBMRVhfT1BUSU9OX0NPTVBBUkFUT1JTW29wdGlvbk5hbWVdKHJhd1tvcHRpb25OYW1lXSwgdGhpcy5jdXJyZW50Q2FsZW5kYXJPcHRpb25zSW5wdXRbb3B0aW9uTmFtZV0pKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTmFtZSBpbiB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVkKSB7IC8vIG1pZ2h0IGJlIGFuIFwiZXh0cmFcIiBwcm9wXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZpbmVkW29wdGlvbk5hbWVdID0gdGhpcy5jdXJyZW50Q2FsZW5kYXJPcHRpb25zUmVmaW5lZFtvcHRpb25OYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZpbmVyc1tvcHRpb25OYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICByZWZpbmVkW29wdGlvbk5hbWVdID0gcmVmaW5lcnNbb3B0aW9uTmFtZV0ocmF3W29wdGlvbk5hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhW29wdGlvbk5hbWVdID0gcmF3W29wdGlvbk5hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhbnlDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYW55Q2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Vmlld09wdGlvbnNJbnB1dCA9IHJhdztcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZXdPcHRpb25zUmVmaW5lZCA9IHJlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhd09wdGlvbnM6IHRoaXMuY3VycmVudFZpZXdPcHRpb25zSW5wdXQsXG4gICAgICAgICAgICByZWZpbmVkT3B0aW9uczogdGhpcy5jdXJyZW50Vmlld09wdGlvbnNSZWZpbmVkLFxuICAgICAgICAgICAgZXh0cmE6IGV4dHJhLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIENhbGVuZGFyRGF0YU1hbmFnZXI7XG59KCkpO1xuZnVuY3Rpb24gYnVpbGREYXRlRW52KHRpbWVab25lLCBleHBsaWNpdExvY2FsZSwgd2Vla051bWJlckNhbGN1bGF0aW9uLCBmaXJzdERheSwgd2Vla1RleHQsIHBsdWdpbkhvb2tzLCBhdmFpbGFibGVMb2NhbGVEYXRhLCBkZWZhdWx0U2VwYXJhdG9yKSB7XG4gICAgdmFyIGxvY2FsZSA9IGJ1aWxkTG9jYWxlKGV4cGxpY2l0TG9jYWxlIHx8IGF2YWlsYWJsZUxvY2FsZURhdGEuZGVmYXVsdENvZGUsIGF2YWlsYWJsZUxvY2FsZURhdGEubWFwKTtcbiAgICByZXR1cm4gbmV3IERhdGVFbnYoe1xuICAgICAgICBjYWxlbmRhclN5c3RlbTogJ2dyZWdvcnknLFxuICAgICAgICB0aW1lWm9uZTogdGltZVpvbmUsXG4gICAgICAgIG5hbWVkVGltZVpvbmVJbXBsOiBwbHVnaW5Ib29rcy5uYW1lZFRpbWVab25lZEltcGwsXG4gICAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgICB3ZWVrTnVtYmVyQ2FsY3VsYXRpb246IHdlZWtOdW1iZXJDYWxjdWxhdGlvbixcbiAgICAgICAgZmlyc3REYXk6IGZpcnN0RGF5LFxuICAgICAgICB3ZWVrVGV4dDogd2Vla1RleHQsXG4gICAgICAgIGNtZEZvcm1hdHRlcjogcGx1Z2luSG9va3MuY21kRm9ybWF0dGVyLFxuICAgICAgICBkZWZhdWx0U2VwYXJhdG9yOiBkZWZhdWx0U2VwYXJhdG9yLFxuICAgIH0pO1xufVxuZnVuY3Rpb24gYnVpbGRUaGVtZShvcHRpb25zLCBwbHVnaW5Ib29rcykge1xuICAgIHZhciBUaGVtZUNsYXNzID0gcGx1Z2luSG9va3MudGhlbWVDbGFzc2VzW29wdGlvbnMudGhlbWVTeXN0ZW1dIHx8IFN0YW5kYXJkVGhlbWU7XG4gICAgcmV0dXJuIG5ldyBUaGVtZUNsYXNzKG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gYnVpbGREYXRlUHJvZmlsZUdlbmVyYXRvcihwcm9wcykge1xuICAgIHZhciBEYXRlUHJvZmlsZUdlbmVyYXRvckNsYXNzID0gcHJvcHMuZGF0ZVByb2ZpbGVHZW5lcmF0b3JDbGFzcyB8fCBEYXRlUHJvZmlsZUdlbmVyYXRvcjtcbiAgICByZXR1cm4gbmV3IERhdGVQcm9maWxlR2VuZXJhdG9yQ2xhc3MocHJvcHMpO1xufVxuZnVuY3Rpb24gYnVpbGRWaWV3QXBpKHR5cGUsIGdldEN1cnJlbnREYXRhLCBkYXRlRW52KSB7XG4gICAgcmV0dXJuIG5ldyBWaWV3QXBpKHR5cGUsIGdldEN1cnJlbnREYXRhLCBkYXRlRW52KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRXZlbnRVaUJ5U291cmNlKGV2ZW50U291cmNlcykge1xuICAgIHJldHVybiBtYXBIYXNoKGV2ZW50U291cmNlcywgZnVuY3Rpb24gKGV2ZW50U291cmNlKSB7IHJldHVybiBldmVudFNvdXJjZS51aTsgfSk7XG59XG5mdW5jdGlvbiBidWlsZEV2ZW50VWlCYXNlcyhldmVudERlZnMsIGV2ZW50VWlTaW5nbGVCYXNlLCBldmVudFVpQnlTb3VyY2UpIHtcbiAgICB2YXIgZXZlbnRVaUJhc2VzID0geyAnJzogZXZlbnRVaVNpbmdsZUJhc2UgfTtcbiAgICBmb3IgKHZhciBkZWZJZCBpbiBldmVudERlZnMpIHtcbiAgICAgICAgdmFyIGRlZiA9IGV2ZW50RGVmc1tkZWZJZF07XG4gICAgICAgIGlmIChkZWYuc291cmNlSWQgJiYgZXZlbnRVaUJ5U291cmNlW2RlZi5zb3VyY2VJZF0pIHtcbiAgICAgICAgICAgIGV2ZW50VWlCYXNlc1tkZWZJZF0gPSBldmVudFVpQnlTb3VyY2VbZGVmLnNvdXJjZUlkXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXZlbnRVaUJhc2VzO1xufVxuZnVuY3Rpb24gYnVpbGRWaWV3VWlQcm9wcyhjYWxlbmRhckNvbnRleHQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGNhbGVuZGFyQ29udGV4dC5vcHRpb25zO1xuICAgIHJldHVybiB7XG4gICAgICAgIGV2ZW50VWlTaW5nbGVCYXNlOiBjcmVhdGVFdmVudFVpKHtcbiAgICAgICAgICAgIGRpc3BsYXk6IG9wdGlvbnMuZXZlbnREaXNwbGF5LFxuICAgICAgICAgICAgZWRpdGFibGU6IG9wdGlvbnMuZWRpdGFibGUsXG4gICAgICAgICAgICBzdGFydEVkaXRhYmxlOiBvcHRpb25zLmV2ZW50U3RhcnRFZGl0YWJsZSxcbiAgICAgICAgICAgIGR1cmF0aW9uRWRpdGFibGU6IG9wdGlvbnMuZXZlbnREdXJhdGlvbkVkaXRhYmxlLFxuICAgICAgICAgICAgY29uc3RyYWludDogb3B0aW9ucy5ldmVudENvbnN0cmFpbnQsXG4gICAgICAgICAgICBvdmVybGFwOiB0eXBlb2Ygb3B0aW9ucy5ldmVudE92ZXJsYXAgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuZXZlbnRPdmVybGFwIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYWxsb3c6IG9wdGlvbnMuZXZlbnRBbGxvdyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5ldmVudEJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmV2ZW50Qm9yZGVyQ29sb3IsXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IG9wdGlvbnMuZXZlbnRUZXh0Q29sb3IsXG4gICAgICAgICAgICBjb2xvcjogb3B0aW9ucy5ldmVudENvbG9yLFxuICAgICAgICAgICAgLy8gY2xhc3NOYW1lczogb3B0aW9ucy5ldmVudENsYXNzTmFtZXMgLy8gcmVuZGVyIGhvb2sgd2lsbCBoYW5kbGUgdGhpc1xuICAgICAgICB9LCBjYWxlbmRhckNvbnRleHQpLFxuICAgICAgICBzZWxlY3Rpb25Db25maWc6IGNyZWF0ZUV2ZW50VWkoe1xuICAgICAgICAgICAgY29uc3RyYWludDogb3B0aW9ucy5zZWxlY3RDb25zdHJhaW50LFxuICAgICAgICAgICAgb3ZlcmxhcDogdHlwZW9mIG9wdGlvbnMuc2VsZWN0T3ZlcmxhcCA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5zZWxlY3RPdmVybGFwIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYWxsb3c6IG9wdGlvbnMuc2VsZWN0QWxsb3csXG4gICAgICAgIH0sIGNhbGVuZGFyQ29udGV4dCksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVJc0xvYWRpbmcoc3RhdGUsIGNvbnRleHQpIHtcbiAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gY29udGV4dC5wbHVnaW5Ib29rcy5pc0xvYWRpbmdGdW5jczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGlzTG9hZGluZ0Z1bmMgPSBfYVtfaV07XG4gICAgICAgIGlmIChpc0xvYWRpbmdGdW5jKHN0YXRlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gcGFyc2VDb250ZXh0QnVzaW5lc3NIb3VycyhjYWxlbmRhckNvbnRleHQpIHtcbiAgICByZXR1cm4gcGFyc2VCdXNpbmVzc0hvdXJzKGNhbGVuZGFyQ29udGV4dC5vcHRpb25zLmJ1c2luZXNzSG91cnMsIGNhbGVuZGFyQ29udGV4dCk7XG59XG5mdW5jdGlvbiB3YXJuVW5rbm93bk9wdGlvbnMob3B0aW9ucywgdmlld05hbWUpIHtcbiAgICBmb3IgKHZhciBvcHRpb25OYW1lIGluIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiVW5rbm93biBvcHRpb24gJ1wiICsgb3B0aW9uTmFtZSArIFwiJ1wiICtcbiAgICAgICAgICAgICh2aWV3TmFtZSA/IFwiIGZvciB2aWV3ICdcIiArIHZpZXdOYW1lICsgXCInXCIgOiAnJykpO1xuICAgIH1cbn1cblxuLy8gVE9ETzogbW92ZSB0aGlzIHRvIHJlYWN0IHBsdWdpbj9cbnZhciBDYWxlbmRhckRhdGFQcm92aWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoQ2FsZW5kYXJEYXRhUHJvdmlkZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ2FsZW5kYXJEYXRhUHJvdmlkZXIocHJvcHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcHJvcHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmhhbmRsZURhdGEgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5kYXRhTWFuYWdlcikgeyAvLyBzdGlsbCB3aXRoaW4gaW5pdGlhbCBydW4sIGJlZm9yZSBhc3NpZ25tZW50IGluIGNvbnN0cnVjdG9yXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWRpcmVjdC1tdXRhdGlvbi1zdGF0ZVxuICAgICAgICAgICAgICAgIF90aGlzLnN0YXRlID0gZGF0YTsgLy8gY2FuJ3QgdXNlIHNldFN0YXRlIHlldFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuc2V0U3RhdGUoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmRhdGFNYW5hZ2VyID0gbmV3IENhbGVuZGFyRGF0YU1hbmFnZXIoe1xuICAgICAgICAgICAgb3B0aW9uT3ZlcnJpZGVzOiBwcm9wcy5vcHRpb25PdmVycmlkZXMsXG4gICAgICAgICAgICBjYWxlbmRhckFwaTogcHJvcHMuY2FsZW5kYXJBcGksXG4gICAgICAgICAgICBvbkRhdGE6IF90aGlzLmhhbmRsZURhdGEsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIENhbGVuZGFyRGF0YVByb3ZpZGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuKHRoaXMuc3RhdGUpO1xuICAgIH07XG4gICAgQ2FsZW5kYXJEYXRhUHJvdmlkZXIucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIChwcmV2UHJvcHMpIHtcbiAgICAgICAgdmFyIG5ld09wdGlvbk92ZXJyaWRlcyA9IHRoaXMucHJvcHMub3B0aW9uT3ZlcnJpZGVzO1xuICAgICAgICBpZiAobmV3T3B0aW9uT3ZlcnJpZGVzICE9PSBwcmV2UHJvcHMub3B0aW9uT3ZlcnJpZGVzKSB7IC8vIHByZXZlbnQgcmVjdXJzaXZlIGhhbmRsZURhdGFcbiAgICAgICAgICAgIHRoaXMuZGF0YU1hbmFnZXIucmVzZXRPcHRpb25zKG5ld09wdGlvbk92ZXJyaWRlcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDYWxlbmRhckRhdGFQcm92aWRlcjtcbn0odmRvbV9janMuQ29tcG9uZW50KSk7XG5cbi8vIEhFTFBFUlNcbi8qXG5pZiBuZXh0RGF5VGhyZXNob2xkIGlzIHNwZWNpZmllZCwgc2xpY2luZyBpcyBkb25lIGluIGFuIGFsbC1kYXkgZmFzaGlvbi5cbnlvdSBjYW4gZ2V0IG5leHREYXlUaHJlc2hvbGQgZnJvbSBjb250ZXh0Lm5leHREYXlUaHJlc2hvbGRcbiovXG5mdW5jdGlvbiBzbGljZUV2ZW50cyhwcm9wcywgYWxsRGF5KSB7XG4gICAgcmV0dXJuIHNsaWNlRXZlbnRTdG9yZShwcm9wcy5ldmVudFN0b3JlLCBwcm9wcy5ldmVudFVpQmFzZXMsIHByb3BzLmRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlLCBhbGxEYXkgPyBwcm9wcy5uZXh0RGF5VGhyZXNob2xkIDogbnVsbCkuZmc7XG59XG5cbnZhciBOYW1lZFRpbWVab25lSW1wbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOYW1lZFRpbWVab25lSW1wbCh0aW1lWm9uZU5hbWUpIHtcbiAgICAgICAgdGhpcy50aW1lWm9uZU5hbWUgPSB0aW1lWm9uZU5hbWU7XG4gICAgfVxuICAgIHJldHVybiBOYW1lZFRpbWVab25lSW1wbDtcbn0oKSk7XG5cbnZhciBTZWdIaWVyYXJjaHkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2VnSGllcmFyY2h5KCkge1xuICAgICAgICAvLyBzZXR0aW5nc1xuICAgICAgICB0aGlzLnN0cmljdE9yZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWxsb3dSZXNsaWNpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tYXhDb29yZCA9IC0xOyAvLyAtMSBtZWFucyBubyBtYXhcbiAgICAgICAgdGhpcy5tYXhTdGFja0NudCA9IC0xOyAvLyAtMSBtZWFucyBubyBtYXhcbiAgICAgICAgdGhpcy5sZXZlbENvb3JkcyA9IFtdOyAvLyBvcmRlcmVkXG4gICAgICAgIHRoaXMuZW50cmllc0J5TGV2ZWwgPSBbXTsgLy8gcGFyYWxsZWwgd2l0aCBsZXZlbENvb3Jkc1xuICAgICAgICB0aGlzLnN0YWNrQ250cyA9IHt9OyAvLyBUT0RPOiB1c2UgYmV0dGVyIHRlY2huaXF1ZSE/XG4gICAgfVxuICAgIFNlZ0hpZXJhcmNoeS5wcm90b3R5cGUuYWRkU2VncyA9IGZ1bmN0aW9uIChpbnB1dHMpIHtcbiAgICAgICAgdmFyIGhpZGRlbkVudHJpZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBpbnB1dHNfMSA9IGlucHV0czsgX2kgPCBpbnB1dHNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBpbnB1dCA9IGlucHV0c18xW19pXTtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0RW50cnkoaW5wdXQsIGhpZGRlbkVudHJpZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoaWRkZW5FbnRyaWVzO1xuICAgIH07XG4gICAgU2VnSGllcmFyY2h5LnByb3RvdHlwZS5pbnNlcnRFbnRyeSA9IGZ1bmN0aW9uIChlbnRyeSwgaGlkZGVuRW50cmllcykge1xuICAgICAgICB2YXIgaW5zZXJ0aW9uID0gdGhpcy5maW5kSW5zZXJ0aW9uKGVudHJ5KTtcbiAgICAgICAgaWYgKHRoaXMuaXNJbnNlcnRpb25WYWxpZChpbnNlcnRpb24sIGVudHJ5KSkge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRFbnRyeUF0KGVudHJ5LCBpbnNlcnRpb24pO1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlSW52YWxpZEluc2VydGlvbihpbnNlcnRpb24sIGVudHJ5LCBoaWRkZW5FbnRyaWVzKTtcbiAgICB9O1xuICAgIFNlZ0hpZXJhcmNoeS5wcm90b3R5cGUuaXNJbnNlcnRpb25WYWxpZCA9IGZ1bmN0aW9uIChpbnNlcnRpb24sIGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAodGhpcy5tYXhDb29yZCA9PT0gLTEgfHwgaW5zZXJ0aW9uLmxldmVsQ29vcmQgKyBlbnRyeS50aGlja25lc3MgPD0gdGhpcy5tYXhDb29yZCkgJiZcbiAgICAgICAgICAgICh0aGlzLm1heFN0YWNrQ250ID09PSAtMSB8fCBpbnNlcnRpb24uc3RhY2tDbnQgPCB0aGlzLm1heFN0YWNrQ250KTtcbiAgICB9O1xuICAgIC8vIHJldHVybnMgbnVtYmVyIG9mIG5ldyBlbnRyaWVzIGluc2VydGVkXG4gICAgU2VnSGllcmFyY2h5LnByb3RvdHlwZS5oYW5kbGVJbnZhbGlkSW5zZXJ0aW9uID0gZnVuY3Rpb24gKGluc2VydGlvbiwgZW50cnksIGhpZGRlbkVudHJpZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dSZXNsaWNpbmcgJiYgaW5zZXJ0aW9uLnRvdWNoaW5nRW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNwbGl0RW50cnkoZW50cnksIGluc2VydGlvbi50b3VjaGluZ0VudHJ5LCBoaWRkZW5FbnRyaWVzKTtcbiAgICAgICAgfVxuICAgICAgICBoaWRkZW5FbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9O1xuICAgIFNlZ0hpZXJhcmNoeS5wcm90b3R5cGUuc3BsaXRFbnRyeSA9IGZ1bmN0aW9uIChlbnRyeSwgYmFycmllciwgaGlkZGVuRW50cmllcykge1xuICAgICAgICB2YXIgcGFydENudCA9IDA7XG4gICAgICAgIHZhciBzcGxpdEhpZGRlbkVudHJpZXMgPSBbXTtcbiAgICAgICAgdmFyIGVudHJ5U3BhbiA9IGVudHJ5LnNwYW47XG4gICAgICAgIHZhciBiYXJyaWVyU3BhbiA9IGJhcnJpZXIuc3BhbjtcbiAgICAgICAgaWYgKGVudHJ5U3Bhbi5zdGFydCA8IGJhcnJpZXJTcGFuLnN0YXJ0KSB7XG4gICAgICAgICAgICBwYXJ0Q250ICs9IHRoaXMuaW5zZXJ0RW50cnkoe1xuICAgICAgICAgICAgICAgIGluZGV4OiBlbnRyeS5pbmRleCxcbiAgICAgICAgICAgICAgICB0aGlja25lc3M6IGVudHJ5LnRoaWNrbmVzcyxcbiAgICAgICAgICAgICAgICBzcGFuOiB7IHN0YXJ0OiBlbnRyeVNwYW4uc3RhcnQsIGVuZDogYmFycmllclNwYW4uc3RhcnQgfSxcbiAgICAgICAgICAgIH0sIHNwbGl0SGlkZGVuRW50cmllcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5U3Bhbi5lbmQgPiBiYXJyaWVyU3Bhbi5lbmQpIHtcbiAgICAgICAgICAgIHBhcnRDbnQgKz0gdGhpcy5pbnNlcnRFbnRyeSh7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGVudHJ5LmluZGV4LFxuICAgICAgICAgICAgICAgIHRoaWNrbmVzczogZW50cnkudGhpY2tuZXNzLFxuICAgICAgICAgICAgICAgIHNwYW46IHsgc3RhcnQ6IGJhcnJpZXJTcGFuLmVuZCwgZW5kOiBlbnRyeVNwYW4uZW5kIH0sXG4gICAgICAgICAgICB9LCBzcGxpdEhpZGRlbkVudHJpZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0Q250KSB7XG4gICAgICAgICAgICBoaWRkZW5FbnRyaWVzLnB1c2guYXBwbHkoaGlkZGVuRW50cmllcywgdHNsaWIuX19zcHJlYWRBcnJheShbe1xuICAgICAgICAgICAgICAgICAgICBpbmRleDogZW50cnkuaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHRoaWNrbmVzczogZW50cnkudGhpY2tuZXNzLFxuICAgICAgICAgICAgICAgICAgICBzcGFuOiBpbnRlcnNlY3RTcGFucyhiYXJyaWVyU3BhbiwgZW50cnlTcGFuKSwgLy8gZ3VhcmFudGVlZCB0byBpbnRlcnNlY3RcbiAgICAgICAgICAgICAgICB9XSwgc3BsaXRIaWRkZW5FbnRyaWVzKSk7XG4gICAgICAgICAgICByZXR1cm4gcGFydENudDtcbiAgICAgICAgfVxuICAgICAgICBoaWRkZW5FbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9O1xuICAgIFNlZ0hpZXJhcmNoeS5wcm90b3R5cGUuaW5zZXJ0RW50cnlBdCA9IGZ1bmN0aW9uIChlbnRyeSwgaW5zZXJ0aW9uKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIGVudHJpZXNCeUxldmVsID0gX2EuZW50cmllc0J5TGV2ZWwsIGxldmVsQ29vcmRzID0gX2EubGV2ZWxDb29yZHM7XG4gICAgICAgIGlmIChpbnNlcnRpb24ubGF0ZXJhbCA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBsZXZlbFxuICAgICAgICAgICAgaW5zZXJ0QXQobGV2ZWxDb29yZHMsIGluc2VydGlvbi5sZXZlbCwgaW5zZXJ0aW9uLmxldmVsQ29vcmQpO1xuICAgICAgICAgICAgaW5zZXJ0QXQoZW50cmllc0J5TGV2ZWwsIGluc2VydGlvbi5sZXZlbCwgW2VudHJ5XSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBpbnNlcnQgaW50byBleGlzdGluZyBsZXZlbFxuICAgICAgICAgICAgaW5zZXJ0QXQoZW50cmllc0J5TGV2ZWxbaW5zZXJ0aW9uLmxldmVsXSwgaW5zZXJ0aW9uLmxhdGVyYWwsIGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YWNrQ250c1tidWlsZEVudHJ5S2V5KGVudHJ5KV0gPSBpbnNlcnRpb24uc3RhY2tDbnQ7XG4gICAgfTtcbiAgICBTZWdIaWVyYXJjaHkucHJvdG90eXBlLmZpbmRJbnNlcnRpb24gPSBmdW5jdGlvbiAobmV3RW50cnkpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgbGV2ZWxDb29yZHMgPSBfYS5sZXZlbENvb3JkcywgZW50cmllc0J5TGV2ZWwgPSBfYS5lbnRyaWVzQnlMZXZlbCwgc3RyaWN0T3JkZXIgPSBfYS5zdHJpY3RPcmRlciwgc3RhY2tDbnRzID0gX2Euc3RhY2tDbnRzO1xuICAgICAgICB2YXIgbGV2ZWxDbnQgPSBsZXZlbENvb3Jkcy5sZW5ndGg7XG4gICAgICAgIHZhciBjYW5kaWRhdGVDb29yZCA9IDA7XG4gICAgICAgIHZhciB0b3VjaGluZ0xldmVsID0gLTE7XG4gICAgICAgIHZhciB0b3VjaGluZ0xhdGVyYWwgPSAtMTtcbiAgICAgICAgdmFyIHRvdWNoaW5nRW50cnkgPSBudWxsO1xuICAgICAgICB2YXIgc3RhY2tDbnQgPSAwO1xuICAgICAgICBmb3IgKHZhciB0cmFja2luZ0xldmVsID0gMDsgdHJhY2tpbmdMZXZlbCA8IGxldmVsQ250OyB0cmFja2luZ0xldmVsICs9IDEpIHtcbiAgICAgICAgICAgIHZhciB0cmFja2luZ0Nvb3JkID0gbGV2ZWxDb29yZHNbdHJhY2tpbmdMZXZlbF07XG4gICAgICAgICAgICAvLyBpZiB0aGUgY3VycmVudCBsZXZlbCBpcyBwYXN0IHRoZSBwbGFjZWQgZW50cnksIHdlIGhhdmUgZm91bmQgYSBnb29kIGVtcHR5IHNwYWNlIGFuZCBjYW4gc3RvcC5cbiAgICAgICAgICAgIC8vIGlmIHN0cmljdE9yZGVyLCBrZWVwIGZpbmRpbmcgbW9yZSBsYXRlcmFsIGludGVyc2VjdGlvbnMuXG4gICAgICAgICAgICBpZiAoIXN0cmljdE9yZGVyICYmIHRyYWNraW5nQ29vcmQgPj0gY2FuZGlkYXRlQ29vcmQgKyBuZXdFbnRyeS50aGlja25lc3MpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB0cmFja2luZ0VudHJpZXMgPSBlbnRyaWVzQnlMZXZlbFt0cmFja2luZ0xldmVsXTtcbiAgICAgICAgICAgIHZhciB0cmFja2luZ0VudHJ5ID0gdm9pZCAwO1xuICAgICAgICAgICAgdmFyIHNlYXJjaFJlcyA9IGJpbmFyeVNlYXJjaCh0cmFja2luZ0VudHJpZXMsIG5ld0VudHJ5LnNwYW4uc3RhcnQsIGdldEVudHJ5U3BhbkVuZCk7IC8vIGZpbmQgZmlyc3QgZW50cnkgYWZ0ZXIgbmV3RW50cnkncyBlbmRcbiAgICAgICAgICAgIHZhciBsYXRlcmFsSW5kZXggPSBzZWFyY2hSZXNbMF0gKyBzZWFyY2hSZXNbMV07IC8vIGlmIGV4YWN0IG1hdGNoICh3aGljaCBkb2Vzbid0IGNvbGxpZGUpLCBnbyB0byBuZXh0IG9uZVxuICAgICAgICAgICAgd2hpbGUgKCAvLyBsb29wIHRocm91Z2ggZW50cmllcyB0aGF0IGhvcml6b250YWxseSBpbnRlcnNlY3RcbiAgICAgICAgICAgICh0cmFja2luZ0VudHJ5ID0gdHJhY2tpbmdFbnRyaWVzW2xhdGVyYWxJbmRleF0pICYmIC8vIGJ1dCBub3QgcGFzdCB0aGUgd2hvbGUgZW50cnkgbGlzdFxuICAgICAgICAgICAgICAgIHRyYWNraW5nRW50cnkuc3Bhbi5zdGFydCA8IG5ld0VudHJ5LnNwYW4uZW5kIC8vIGFuZCBub3QgZW50aXJlbHkgcGFzdCBuZXdFbnRyeVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRyYWNraW5nRW50cnlCb3R0b20gPSB0cmFja2luZ0Nvb3JkICsgdHJhY2tpbmdFbnRyeS50aGlja25lc3M7XG4gICAgICAgICAgICAgICAgLy8gaW50ZXJzZWN0cyBpbnRvIHRoZSB0b3Agb2YgdGhlIGNhbmRpZGF0ZT9cbiAgICAgICAgICAgICAgICBpZiAodHJhY2tpbmdFbnRyeUJvdHRvbSA+IGNhbmRpZGF0ZUNvb3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZUNvb3JkID0gdHJhY2tpbmdFbnRyeUJvdHRvbTtcbiAgICAgICAgICAgICAgICAgICAgdG91Y2hpbmdFbnRyeSA9IHRyYWNraW5nRW50cnk7XG4gICAgICAgICAgICAgICAgICAgIHRvdWNoaW5nTGV2ZWwgPSB0cmFja2luZ0xldmVsO1xuICAgICAgICAgICAgICAgICAgICB0b3VjaGluZ0xhdGVyYWwgPSBsYXRlcmFsSW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGJ1dHRzIHVwIGFnYWluc3QgdG9wIG9mIGNhbmRpZGF0ZT8gKHdpbGwgaGFwcGVuIGlmIGp1c3QgaW50ZXJzZWN0ZWQgYXMgd2VsbClcbiAgICAgICAgICAgICAgICBpZiAodHJhY2tpbmdFbnRyeUJvdHRvbSA9PT0gY2FuZGlkYXRlQ29vcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYWNjdW11bGF0ZSB0aGUgaGlnaGVzdCBwb3NzaWJsZSBzdGFja0NudCBvZiB0aGUgdHJhY2tpbmdFbnRyaWVzIHRoYXQgYnV0dCB1cFxuICAgICAgICAgICAgICAgICAgICBzdGFja0NudCA9IE1hdGgubWF4KHN0YWNrQ250LCBzdGFja0NudHNbYnVpbGRFbnRyeUtleSh0cmFja2luZ0VudHJ5KV0gKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGF0ZXJhbEluZGV4ICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhlIGRlc3RpbmF0aW9uIGxldmVsIHdpbGwgYmUgYWZ0ZXIgdG91Y2hpbmdFbnRyeSdzIGxldmVsLiBmaW5kIGl0XG4gICAgICAgIHZhciBkZXN0TGV2ZWwgPSAwO1xuICAgICAgICBpZiAodG91Y2hpbmdFbnRyeSkge1xuICAgICAgICAgICAgZGVzdExldmVsID0gdG91Y2hpbmdMZXZlbCArIDE7XG4gICAgICAgICAgICB3aGlsZSAoZGVzdExldmVsIDwgbGV2ZWxDbnQgJiYgbGV2ZWxDb29yZHNbZGVzdExldmVsXSA8IGNhbmRpZGF0ZUNvb3JkKSB7XG4gICAgICAgICAgICAgICAgZGVzdExldmVsICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYWRkaW5nIHRvIGFuIGV4aXN0aW5nIGxldmVsLCBmaW5kIHdoZXJlIHRvIGluc2VydFxuICAgICAgICB2YXIgZGVzdExhdGVyYWwgPSAtMTtcbiAgICAgICAgaWYgKGRlc3RMZXZlbCA8IGxldmVsQ250ICYmIGxldmVsQ29vcmRzW2Rlc3RMZXZlbF0gPT09IGNhbmRpZGF0ZUNvb3JkKSB7XG4gICAgICAgICAgICBkZXN0TGF0ZXJhbCA9IGJpbmFyeVNlYXJjaChlbnRyaWVzQnlMZXZlbFtkZXN0TGV2ZWxdLCBuZXdFbnRyeS5zcGFuLmVuZCwgZ2V0RW50cnlTcGFuRW5kKVswXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG91Y2hpbmdMZXZlbDogdG91Y2hpbmdMZXZlbCxcbiAgICAgICAgICAgIHRvdWNoaW5nTGF0ZXJhbDogdG91Y2hpbmdMYXRlcmFsLFxuICAgICAgICAgICAgdG91Y2hpbmdFbnRyeTogdG91Y2hpbmdFbnRyeSxcbiAgICAgICAgICAgIHN0YWNrQ250OiBzdGFja0NudCxcbiAgICAgICAgICAgIGxldmVsQ29vcmQ6IGNhbmRpZGF0ZUNvb3JkLFxuICAgICAgICAgICAgbGV2ZWw6IGRlc3RMZXZlbCxcbiAgICAgICAgICAgIGxhdGVyYWw6IGRlc3RMYXRlcmFsLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgLy8gc29ydGVkIGJ5IGxldmVsQ29vcmQgKGxvd2VzdCB0byBoaWdoZXN0KVxuICAgIFNlZ0hpZXJhcmNoeS5wcm90b3R5cGUudG9SZWN0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgZW50cmllc0J5TGV2ZWwgPSBfYS5lbnRyaWVzQnlMZXZlbCwgbGV2ZWxDb29yZHMgPSBfYS5sZXZlbENvb3JkcztcbiAgICAgICAgdmFyIGxldmVsQ250ID0gZW50cmllc0J5TGV2ZWwubGVuZ3RoO1xuICAgICAgICB2YXIgcmVjdHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgbGV2ZWwgPSAwOyBsZXZlbCA8IGxldmVsQ250OyBsZXZlbCArPSAxKSB7XG4gICAgICAgICAgICB2YXIgZW50cmllcyA9IGVudHJpZXNCeUxldmVsW2xldmVsXTtcbiAgICAgICAgICAgIHZhciBsZXZlbENvb3JkID0gbGV2ZWxDb29yZHNbbGV2ZWxdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBlbnRyaWVzXzEgPSBlbnRyaWVzOyBfaSA8IGVudHJpZXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzXzFbX2ldO1xuICAgICAgICAgICAgICAgIHJlY3RzLnB1c2godHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGVudHJ5KSwgeyBsZXZlbENvb3JkOiBsZXZlbENvb3JkIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjdHM7XG4gICAgfTtcbiAgICByZXR1cm4gU2VnSGllcmFyY2h5O1xufSgpKTtcbmZ1bmN0aW9uIGdldEVudHJ5U3BhbkVuZChlbnRyeSkge1xuICAgIHJldHVybiBlbnRyeS5zcGFuLmVuZDtcbn1cbmZ1bmN0aW9uIGJ1aWxkRW50cnlLZXkoZW50cnkpIHtcbiAgICByZXR1cm4gZW50cnkuaW5kZXggKyAnOicgKyBlbnRyeS5zcGFuLnN0YXJ0O1xufVxuLy8gcmV0dXJucyBncm91cHMgd2l0aCBlbnRyaWVzIHNvcnRlZCBieSBpbnB1dCBvcmRlclxuZnVuY3Rpb24gZ3JvdXBJbnRlcnNlY3RpbmdFbnRyaWVzKGVudHJpZXMpIHtcbiAgICB2YXIgbWVyZ2VzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwLCBlbnRyaWVzXzIgPSBlbnRyaWVzOyBfaSA8IGVudHJpZXNfMi5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc18yW19pXTtcbiAgICAgICAgdmFyIGZpbHRlcmVkTWVyZ2VzID0gW107XG4gICAgICAgIHZhciBodW5ncnlNZXJnZSA9IHtcbiAgICAgICAgICAgIHNwYW46IGVudHJ5LnNwYW4sXG4gICAgICAgICAgICBlbnRyaWVzOiBbZW50cnldLFxuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciBfYSA9IDAsIG1lcmdlc18xID0gbWVyZ2VzOyBfYSA8IG1lcmdlc18xLmxlbmd0aDsgX2ErKykge1xuICAgICAgICAgICAgdmFyIG1lcmdlID0gbWVyZ2VzXzFbX2FdO1xuICAgICAgICAgICAgaWYgKGludGVyc2VjdFNwYW5zKG1lcmdlLnNwYW4sIGh1bmdyeU1lcmdlLnNwYW4pKSB7XG4gICAgICAgICAgICAgICAgaHVuZ3J5TWVyZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIGVudHJpZXM6IG1lcmdlLmVudHJpZXMuY29uY2F0KGh1bmdyeU1lcmdlLmVudHJpZXMpLFxuICAgICAgICAgICAgICAgICAgICBzcGFuOiBqb2luU3BhbnMobWVyZ2Uuc3BhbiwgaHVuZ3J5TWVyZ2Uuc3BhbiksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbHRlcmVkTWVyZ2VzLnB1c2gobWVyZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbHRlcmVkTWVyZ2VzLnB1c2goaHVuZ3J5TWVyZ2UpO1xuICAgICAgICBtZXJnZXMgPSBmaWx0ZXJlZE1lcmdlcztcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlcztcbn1cbmZ1bmN0aW9uIGpvaW5TcGFucyhzcGFuMCwgc3BhbjEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogTWF0aC5taW4oc3BhbjAuc3RhcnQsIHNwYW4xLnN0YXJ0KSxcbiAgICAgICAgZW5kOiBNYXRoLm1heChzcGFuMC5lbmQsIHNwYW4xLmVuZCksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdFNwYW5zKHNwYW4wLCBzcGFuMSkge1xuICAgIHZhciBzdGFydCA9IE1hdGgubWF4KHNwYW4wLnN0YXJ0LCBzcGFuMS5zdGFydCk7XG4gICAgdmFyIGVuZCA9IE1hdGgubWluKHNwYW4wLmVuZCwgc3BhbjEuZW5kKTtcbiAgICBpZiAoc3RhcnQgPCBlbmQpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8vIGdlbmVyYWwgdXRpbFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBpbnNlcnRBdChhcnIsIGluZGV4LCBpdGVtKSB7XG4gICAgYXJyLnNwbGljZShpbmRleCwgMCwgaXRlbSk7XG59XG5mdW5jdGlvbiBiaW5hcnlTZWFyY2goYSwgc2VhcmNoVmFsLCBnZXRJdGVtVmFsKSB7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSAwO1xuICAgIHZhciBlbmRJbmRleCA9IGEubGVuZ3RoOyAvLyBleGNsdXNpdmVcbiAgICBpZiAoIWVuZEluZGV4IHx8IHNlYXJjaFZhbCA8IGdldEl0ZW1WYWwoYVtzdGFydEluZGV4XSkpIHsgLy8gbm8gaXRlbXMgT1IgYmVmb3JlIGZpcnN0IGl0ZW1cbiAgICAgICAgcmV0dXJuIFswLCAwXTtcbiAgICB9XG4gICAgaWYgKHNlYXJjaFZhbCA+IGdldEl0ZW1WYWwoYVtlbmRJbmRleCAtIDFdKSkgeyAvLyBhZnRlciBsYXN0IGl0ZW1cbiAgICAgICAgcmV0dXJuIFtlbmRJbmRleCwgMF07XG4gICAgfVxuICAgIHdoaWxlIChzdGFydEluZGV4IDwgZW5kSW5kZXgpIHtcbiAgICAgICAgdmFyIG1pZGRsZUluZGV4ID0gTWF0aC5mbG9vcihzdGFydEluZGV4ICsgKGVuZEluZGV4IC0gc3RhcnRJbmRleCkgLyAyKTtcbiAgICAgICAgdmFyIG1pZGRsZVZhbCA9IGdldEl0ZW1WYWwoYVttaWRkbGVJbmRleF0pO1xuICAgICAgICBpZiAoc2VhcmNoVmFsIDwgbWlkZGxlVmFsKSB7XG4gICAgICAgICAgICBlbmRJbmRleCA9IG1pZGRsZUluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNlYXJjaFZhbCA+IG1pZGRsZVZhbCkge1xuICAgICAgICAgICAgc3RhcnRJbmRleCA9IG1pZGRsZUluZGV4ICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gZXF1YWwhXG4gICAgICAgICAgICByZXR1cm4gW21pZGRsZUluZGV4LCAxXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3N0YXJ0SW5kZXgsIDBdO1xufVxuXG52YXIgSW50ZXJhY3Rpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSW50ZXJhY3Rpb24oc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnQgPSBzZXR0aW5ncy5jb21wb25lbnQ7XG4gICAgICAgIHRoaXMuaXNIaXRDb21ib0FsbG93ZWQgPSBzZXR0aW5ncy5pc0hpdENvbWJvQWxsb3dlZCB8fCBudWxsO1xuICAgIH1cbiAgICBJbnRlcmFjdGlvbi5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB9O1xuICAgIHJldHVybiBJbnRlcmFjdGlvbjtcbn0oKSk7XG5mdW5jdGlvbiBwYXJzZUludGVyYWN0aW9uU2V0dGluZ3MoY29tcG9uZW50LCBpbnB1dCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50LFxuICAgICAgICBlbDogaW5wdXQuZWwsXG4gICAgICAgIHVzZUV2ZW50Q2VudGVyOiBpbnB1dC51c2VFdmVudENlbnRlciAhPSBudWxsID8gaW5wdXQudXNlRXZlbnRDZW50ZXIgOiB0cnVlLFxuICAgICAgICBpc0hpdENvbWJvQWxsb3dlZDogaW5wdXQuaXNIaXRDb21ib0FsbG93ZWQgfHwgbnVsbCxcbiAgICB9O1xufVxuZnVuY3Rpb24gaW50ZXJhY3Rpb25TZXR0aW5nc1RvU3RvcmUoc2V0dGluZ3MpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIF9hID0ge30sXG4gICAgICAgIF9hW3NldHRpbmdzLmNvbXBvbmVudC51aWRdID0gc2V0dGluZ3MsXG4gICAgICAgIF9hO1xufVxuLy8gZ2xvYmFsIHN0YXRlXG52YXIgaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlID0ge307XG5cbi8qXG5BbiBhYnN0cmFjdGlvbiBmb3IgYSBkcmFnZ2luZyBpbnRlcmFjdGlvbiBvcmlnaW5hdGluZyBvbiBhbiBldmVudC5cbkRvZXMgaGlnaGVyLWxldmVsIHRoaW5ncyB0aGFuIFBvaW50ZXJEcmFnZ2VyLCBzdWNoIGFzIHBvc3NpYmx5OlxuLSBhIFwibWlycm9yXCIgdGhhdCBtb3ZlcyB3aXRoIHRoZSBwb2ludGVyXG4tIGEgbWluaW11bSBudW1iZXIgb2YgcGl4ZWxzIG9yIG90aGVyIGNyaXRlcmlhIGZvciBhIHRydWUgZHJhZyB0byBiZWdpblxuXG5zdWJjbGFzc2VzIG11c3QgZW1pdDpcbi0gcG9pbnRlcmRvd25cbi0gZHJhZ3N0YXJ0XG4tIGRyYWdtb3ZlXG4tIHBvaW50ZXJ1cFxuLSBkcmFnZW5kXG4qL1xudmFyIEVsZW1lbnREcmFnZ2luZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFbGVtZW50RHJhZ2dpbmcoZWwsIHNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlciA9IG5ldyBFbWl0dGVyKCk7XG4gICAgfVxuICAgIEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB9O1xuICAgIEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUuc2V0TWlycm9ySXNWaXNpYmxlID0gZnVuY3Rpb24gKGJvb2wpIHtcbiAgICAgICAgLy8gb3B0aW9uYWwgaWYgc3ViY2xhc3MgZG9lc24ndCB3YW50IHRvIHN1cHBvcnQgYSBtaXJyb3JcbiAgICB9O1xuICAgIEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUuc2V0TWlycm9yTmVlZHNSZXZlcnQgPSBmdW5jdGlvbiAoYm9vbCkge1xuICAgICAgICAvLyBvcHRpb25hbCBpZiBzdWJjbGFzcyBkb2Vzbid0IHdhbnQgdG8gc3VwcG9ydCBhIG1pcnJvclxuICAgIH07XG4gICAgRWxlbWVudERyYWdnaW5nLnByb3RvdHlwZS5zZXRBdXRvU2Nyb2xsRW5hYmxlZCA9IGZ1bmN0aW9uIChib29sKSB7XG4gICAgICAgIC8vIG9wdGlvbmFsXG4gICAgfTtcbiAgICByZXR1cm4gRWxlbWVudERyYWdnaW5nO1xufSgpKTtcblxuLy8gVE9ETzogZ2V0IHJpZCBvZiB0aGlzIGluIGZhdm9yIG9mIG9wdGlvbnMgc3lzdGVtLFxuLy8gdGhvIGl0J3MgcmVhbGx5IGVhc3kgdG8gYWNjZXNzIHRoaXMgZ2xvYmFsbHkgcmF0aGVyIHRoYW4gcGFzcyB0aHJ1IG9wdGlvbnMuXG52YXIgY29uZmlnID0ge307XG5cbi8qXG5JbmZvcm1hdGlvbiBhYm91dCB3aGF0IHdpbGwgaGFwcGVuIHdoZW4gYW4gZXh0ZXJuYWwgZWxlbWVudCBpcyBkcmFnZ2VkLWFuZC1kcm9wcGVkXG5vbnRvIGEgY2FsZW5kYXIuIENvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBjcmVhdGluZyBhbiBldmVudC5cbiovXG52YXIgRFJBR19NRVRBX1JFRklORVJTID0ge1xuICAgIHN0YXJ0VGltZTogY3JlYXRlRHVyYXRpb24sXG4gICAgZHVyYXRpb246IGNyZWF0ZUR1cmF0aW9uLFxuICAgIGNyZWF0ZTogQm9vbGVhbixcbiAgICBzb3VyY2VJZDogU3RyaW5nLFxufTtcbmZ1bmN0aW9uIHBhcnNlRHJhZ01ldGEocmF3KSB7XG4gICAgdmFyIF9hID0gcmVmaW5lUHJvcHMocmF3LCBEUkFHX01FVEFfUkVGSU5FUlMpLCByZWZpbmVkID0gX2EucmVmaW5lZCwgZXh0cmEgPSBfYS5leHRyYTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydFRpbWU6IHJlZmluZWQuc3RhcnRUaW1lIHx8IG51bGwsXG4gICAgICAgIGR1cmF0aW9uOiByZWZpbmVkLmR1cmF0aW9uIHx8IG51bGwsXG4gICAgICAgIGNyZWF0ZTogcmVmaW5lZC5jcmVhdGUgIT0gbnVsbCA/IHJlZmluZWQuY3JlYXRlIDogdHJ1ZSxcbiAgICAgICAgc291cmNlSWQ6IHJlZmluZWQuc291cmNlSWQsXG4gICAgICAgIGxlZnRvdmVyUHJvcHM6IGV4dHJhLFxuICAgIH07XG59XG5cbnZhciBUb29sYmFyU2VjdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVG9vbGJhclNlY3Rpb24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVG9vbGJhclNlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgVG9vbGJhclNlY3Rpb24ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5wcm9wcy53aWRnZXRHcm91cHMubWFwKGZ1bmN0aW9uICh3aWRnZXRHcm91cCkgeyByZXR1cm4gX3RoaXMucmVuZGVyV2lkZ2V0R3JvdXAod2lkZ2V0R3JvdXApOyB9KTtcbiAgICAgICAgcmV0dXJuIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQuYXBwbHkodm9pZCAwLCB0c2xpYi5fX3NwcmVhZEFycmF5KFsnZGl2JywgeyBjbGFzc05hbWU6ICdmYy10b29sYmFyLWNodW5rJyB9XSwgY2hpbGRyZW4pKTtcbiAgICB9O1xuICAgIFRvb2xiYXJTZWN0aW9uLnByb3RvdHlwZS5yZW5kZXJXaWRnZXRHcm91cCA9IGZ1bmN0aW9uICh3aWRnZXRHcm91cCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgdGhlbWUgPSB0aGlzLmNvbnRleHQudGhlbWU7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuICAgICAgICB2YXIgaXNPbmx5QnV0dG9ucyA9IHRydWU7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgd2lkZ2V0R3JvdXBfMSA9IHdpZGdldEdyb3VwOyBfaSA8IHdpZGdldEdyb3VwXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgd2lkZ2V0ID0gd2lkZ2V0R3JvdXBfMVtfaV07XG4gICAgICAgICAgICB2YXIgYnV0dG9uTmFtZSA9IHdpZGdldC5idXR0b25OYW1lLCBidXR0b25DbGljayA9IHdpZGdldC5idXR0b25DbGljaywgYnV0dG9uVGV4dCA9IHdpZGdldC5idXR0b25UZXh0LCBidXR0b25JY29uID0gd2lkZ2V0LmJ1dHRvbkljb24sIGJ1dHRvbkhpbnQgPSB3aWRnZXQuYnV0dG9uSGludDtcbiAgICAgICAgICAgIGlmIChidXR0b25OYW1lID09PSAndGl0bGUnKSB7XG4gICAgICAgICAgICAgICAgaXNPbmx5QnV0dG9ucyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godmRvbV9janMuY3JlYXRlRWxlbWVudChcImgyXCIsIHsgY2xhc3NOYW1lOiBcImZjLXRvb2xiYXItdGl0bGVcIiwgaWQ6IHByb3BzLnRpdGxlSWQgfSwgcHJvcHMudGl0bGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBpc1ByZXNzZWQgPSBidXR0b25OYW1lID09PSBwcm9wcy5hY3RpdmVCdXR0b247XG4gICAgICAgICAgICAgICAgdmFyIGlzRGlzYWJsZWQgPSAoIXByb3BzLmlzVG9kYXlFbmFibGVkICYmIGJ1dHRvbk5hbWUgPT09ICd0b2RheScpIHx8XG4gICAgICAgICAgICAgICAgICAgICghcHJvcHMuaXNQcmV2RW5hYmxlZCAmJiBidXR0b25OYW1lID09PSAncHJldicpIHx8XG4gICAgICAgICAgICAgICAgICAgICghcHJvcHMuaXNOZXh0RW5hYmxlZCAmJiBidXR0b25OYW1lID09PSAnbmV4dCcpO1xuICAgICAgICAgICAgICAgIHZhciBidXR0b25DbGFzc2VzID0gW1wiZmMtXCIgKyBidXR0b25OYW1lICsgXCItYnV0dG9uXCIsIHRoZW1lLmdldENsYXNzKCdidXR0b24nKV07XG4gICAgICAgICAgICAgICAgaWYgKGlzUHJlc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICBidXR0b25DbGFzc2VzLnB1c2godGhlbWUuZ2V0Q2xhc3MoJ2J1dHRvbkFjdGl2ZScpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHsgdHlwZTogXCJidXR0b25cIiwgdGl0bGU6IHR5cGVvZiBidXR0b25IaW50ID09PSAnZnVuY3Rpb24nID8gYnV0dG9uSGludChwcm9wcy5uYXZVbml0KSA6IGJ1dHRvbkhpbnQsIGRpc2FibGVkOiBpc0Rpc2FibGVkLCBcImFyaWEtcHJlc3NlZFwiOiBpc1ByZXNzZWQsIGNsYXNzTmFtZTogYnV0dG9uQ2xhc3Nlcy5qb2luKCcgJyksIG9uQ2xpY2s6IGJ1dHRvbkNsaWNrIH0sIGJ1dHRvblRleHQgfHwgKGJ1dHRvbkljb24gPyB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogYnV0dG9uSWNvbiB9KSA6ICcnKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgZ3JvdXBDbGFzc05hbWUgPSAoaXNPbmx5QnV0dG9ucyAmJiB0aGVtZS5nZXRDbGFzcygnYnV0dG9uR3JvdXAnKSkgfHwgJyc7XG4gICAgICAgICAgICByZXR1cm4gdmRvbV9janMuY3JlYXRlRWxlbWVudC5hcHBseSh2b2lkIDAsIHRzbGliLl9fc3ByZWFkQXJyYXkoWydkaXYnLCB7IGNsYXNzTmFtZTogZ3JvdXBDbGFzc05hbWUgfV0sIGNoaWxkcmVuKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuWzBdO1xuICAgIH07XG4gICAgcmV0dXJuIFRvb2xiYXJTZWN0aW9uO1xufShCYXNlQ29tcG9uZW50KSk7XG5cbnZhciBUb29sYmFyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhUb29sYmFyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRvb2xiYXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgVG9vbGJhci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLnByb3BzLCBtb2RlbCA9IF9hLm1vZGVsLCBleHRyYUNsYXNzTmFtZSA9IF9hLmV4dHJhQ2xhc3NOYW1lO1xuICAgICAgICB2YXIgZm9yY2VMdHIgPSBmYWxzZTtcbiAgICAgICAgdmFyIHN0YXJ0Q29udGVudDtcbiAgICAgICAgdmFyIGVuZENvbnRlbnQ7XG4gICAgICAgIHZhciBzZWN0aW9uV2lkZ2V0cyA9IG1vZGVsLnNlY3Rpb25XaWRnZXRzO1xuICAgICAgICB2YXIgY2VudGVyQ29udGVudCA9IHNlY3Rpb25XaWRnZXRzLmNlbnRlcjtcbiAgICAgICAgaWYgKHNlY3Rpb25XaWRnZXRzLmxlZnQpIHtcbiAgICAgICAgICAgIGZvcmNlTHRyID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXJ0Q29udGVudCA9IHNlY3Rpb25XaWRnZXRzLmxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGFydENvbnRlbnQgPSBzZWN0aW9uV2lkZ2V0cy5zdGFydDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VjdGlvbldpZGdldHMucmlnaHQpIHtcbiAgICAgICAgICAgIGZvcmNlTHRyID0gdHJ1ZTtcbiAgICAgICAgICAgIGVuZENvbnRlbnQgPSBzZWN0aW9uV2lkZ2V0cy5yaWdodDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVuZENvbnRlbnQgPSBzZWN0aW9uV2lkZ2V0cy5lbmQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICAgICBleHRyYUNsYXNzTmFtZSB8fCAnJyxcbiAgICAgICAgICAgICdmYy10b29sYmFyJyxcbiAgICAgICAgICAgIGZvcmNlTHRyID8gJ2ZjLXRvb2xiYXItbHRyJyA6ICcnLFxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMuam9pbignICcpIH0sXG4gICAgICAgICAgICB0aGlzLnJlbmRlclNlY3Rpb24oJ3N0YXJ0Jywgc3RhcnRDb250ZW50IHx8IFtdKSxcbiAgICAgICAgICAgIHRoaXMucmVuZGVyU2VjdGlvbignY2VudGVyJywgY2VudGVyQ29udGVudCB8fCBbXSksXG4gICAgICAgICAgICB0aGlzLnJlbmRlclNlY3Rpb24oJ2VuZCcsIGVuZENvbnRlbnQgfHwgW10pKSk7XG4gICAgfTtcbiAgICBUb29sYmFyLnByb3RvdHlwZS5yZW5kZXJTZWN0aW9uID0gZnVuY3Rpb24gKGtleSwgd2lkZ2V0R3JvdXBzKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChUb29sYmFyU2VjdGlvbiwgeyBrZXk6IGtleSwgd2lkZ2V0R3JvdXBzOiB3aWRnZXRHcm91cHMsIHRpdGxlOiBwcm9wcy50aXRsZSwgbmF2VW5pdDogcHJvcHMubmF2VW5pdCwgYWN0aXZlQnV0dG9uOiBwcm9wcy5hY3RpdmVCdXR0b24sIGlzVG9kYXlFbmFibGVkOiBwcm9wcy5pc1RvZGF5RW5hYmxlZCwgaXNQcmV2RW5hYmxlZDogcHJvcHMuaXNQcmV2RW5hYmxlZCwgaXNOZXh0RW5hYmxlZDogcHJvcHMuaXNOZXh0RW5hYmxlZCwgdGl0bGVJZDogcHJvcHMudGl0bGVJZCB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gVG9vbGJhcjtcbn0oQmFzZUNvbXBvbmVudCkpO1xuXG4vLyBUT0RPOiBkbyBmdW5jdGlvbiBjb21wb25lbnQ/XG52YXIgVmlld0NvbnRhaW5lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVmlld0NvbnRhaW5lciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBWaWV3Q29udGFpbmVyKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBhdmFpbGFibGVXaWR0aDogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlRWwgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIF90aGlzLmVsID0gZWw7XG4gICAgICAgICAgICBzZXRSZWYoX3RoaXMucHJvcHMuZWxSZWYsIGVsKTtcbiAgICAgICAgICAgIF90aGlzLnVwZGF0ZUF2YWlsYWJsZVdpZHRoKCk7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmhhbmRsZVJlc2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLnVwZGF0ZUF2YWlsYWJsZVdpZHRoKCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgVmlld0NvbnRhaW5lci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBzdGF0ZSA9IF9hLnN0YXRlO1xuICAgICAgICB2YXIgYXNwZWN0UmF0aW8gPSBwcm9wcy5hc3BlY3RSYXRpbztcbiAgICAgICAgdmFyIGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICAgICAnZmMtdmlldy1oYXJuZXNzJyxcbiAgICAgICAgICAgIChhc3BlY3RSYXRpbyB8fCBwcm9wcy5saXF1aWQgfHwgcHJvcHMuaGVpZ2h0KVxuICAgICAgICAgICAgICAgID8gJ2ZjLXZpZXctaGFybmVzcy1hY3RpdmUnIC8vIGhhcm5lc3MgY29udHJvbHMgdGhlIGhlaWdodFxuICAgICAgICAgICAgICAgIDogJ2ZjLXZpZXctaGFybmVzcy1wYXNzaXZlJywgLy8gbGV0IHRoZSB2aWV3IGRvIHRoZSBoZWlnaHRcbiAgICAgICAgXTtcbiAgICAgICAgdmFyIGhlaWdodCA9ICcnO1xuICAgICAgICB2YXIgcGFkZGluZ0JvdHRvbSA9ICcnO1xuICAgICAgICBpZiAoYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5hdmFpbGFibGVXaWR0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGhlaWdodCA9IHN0YXRlLmF2YWlsYWJsZVdpZHRoIC8gYXNwZWN0UmF0aW87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB3aGlsZSB3YWl0aW5nIHRvIGtub3cgYXZhaWxhYmxlV2lkdGgsIHdlIGNhbid0IHNldCBoZWlnaHQgdG8gKnplcm8qXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB3aWxsIGNhdXNlIGxvdHMgb2YgdW5uZWNlc3Nhcnkgc2Nyb2xsYmFycyB3aXRoaW4gc2Nyb2xsZ3JpZC5cbiAgICAgICAgICAgICAgICAvLyBCRVRURVI6IGRvbid0IHN0YXJ0IHJlbmRlcmluZyBBTllUSElORyB5ZXQgdW50aWwgd2Uga25vdyBjb250YWluZXIgd2lkdGhcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiB3aHkgbm90IGFsd2F5cyB1c2UgcGFkZGluZ0JvdHRvbT8gQ2F1c2VzIGhlaWdodCBvc2NpbGxhdGlvbiAoaXNzdWUgNTYwNilcbiAgICAgICAgICAgICAgICBwYWRkaW5nQm90dG9tID0gKDEgLyBhc3BlY3RSYXRpbykgKiAxMDAgKyBcIiVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCB8fCAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBcImFyaWEtbGFiZWxsZWRieVwiOiBwcm9wcy5sYWJlbGVkQnlJZCwgcmVmOiB0aGlzLmhhbmRsZUVsLCBjbGFzc05hbWU6IGNsYXNzTmFtZXMuam9pbignICcpLCBzdHlsZTogeyBoZWlnaHQ6IGhlaWdodCwgcGFkZGluZ0JvdHRvbTogcGFkZGluZ0JvdHRvbSB9IH0sIHByb3BzLmNoaWxkcmVuKSk7XG4gICAgfTtcbiAgICBWaWV3Q29udGFpbmVyLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmFkZFJlc2l6ZUhhbmRsZXIodGhpcy5oYW5kbGVSZXNpemUpO1xuICAgIH07XG4gICAgVmlld0NvbnRhaW5lci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5yZW1vdmVSZXNpemVIYW5kbGVyKHRoaXMuaGFuZGxlUmVzaXplKTtcbiAgICB9O1xuICAgIFZpZXdDb250YWluZXIucHJvdG90eXBlLnVwZGF0ZUF2YWlsYWJsZVdpZHRoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5lbCAmJiAvLyBuZWVkZWQuIGJ1dCB3aHk/XG4gICAgICAgICAgICB0aGlzLnByb3BzLmFzcGVjdFJhdGlvIC8vIGFzcGVjdFJhdGlvIGlzIHRoZSBvbmx5IGhlaWdodCBzZXR0aW5nIHRoYXQgbmVlZHMgYXZhaWxhYmxlV2lkdGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgYXZhaWxhYmxlV2lkdGg6IHRoaXMuZWwub2Zmc2V0V2lkdGggfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBWaWV3Q29udGFpbmVyO1xufShCYXNlQ29tcG9uZW50KSk7XG5cbi8qXG5EZXRlY3RzIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIGFuIGV2ZW50IHdpdGhpbiBhIERhdGVDb21wb25lbnRcbiovXG52YXIgRXZlbnRDbGlja2luZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRXZlbnRDbGlja2luZywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFdmVudENsaWNraW5nKHNldHRpbmdzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNldHRpbmdzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5oYW5kbGVTZWdDbGljayA9IGZ1bmN0aW9uIChldiwgc2VnRWwpIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSBfdGhpcy5jb21wb25lbnQ7XG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbXBvbmVudC5jb250ZXh0O1xuICAgICAgICAgICAgdmFyIHNlZyA9IGdldEVsU2VnKHNlZ0VsKTtcbiAgICAgICAgICAgIGlmIChzZWcgJiYgLy8gbWlnaHQgYmUgdGhlIDxkaXY+IHN1cnJvdW5kaW5nIHRoZSBtb3JlIGxpbmtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaXNWYWxpZFNlZ0Rvd25FbChldi50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgLy8gb3VyIHdheSB0byBzaW11bGF0ZSBhIGxpbmsgY2xpY2sgZm9yIGVsZW1lbnRzIHRoYXQgY2FuJ3QgYmUgPGE+IHRhZ3NcbiAgICAgICAgICAgICAgICAvLyBncmFiIGJlZm9yZSB0cmlnZ2VyIGZpcmVkIGluIGNhc2UgdHJpZ2dlciB0cmFzaGVzIERPTSB0aHJ1IHJlcmVuZGVyaW5nXG4gICAgICAgICAgICAgICAgdmFyIGhhc1VybENvbnRhaW5lciA9IGVsZW1lbnRDbG9zZXN0KGV2LnRhcmdldCwgJy5mYy1ldmVudC1mb3JjZWQtdXJsJyk7XG4gICAgICAgICAgICAgICAgdmFyIHVybCA9IGhhc1VybENvbnRhaW5lciA/IGhhc1VybENvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdhW2hyZWZdJykuaHJlZiA6ICcnO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdldmVudENsaWNrJywge1xuICAgICAgICAgICAgICAgICAgICBlbDogc2VnRWwsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBuZXcgRXZlbnRBcGkoY29tcG9uZW50LmNvbnRleHQsIHNlZy5ldmVudFJhbmdlLmRlZiwgc2VnLmV2ZW50UmFuZ2UuaW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICBqc0V2ZW50OiBldixcbiAgICAgICAgICAgICAgICAgICAgdmlldzogY29udGV4dC52aWV3QXBpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh1cmwgJiYgIWV2LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5kZXN0cm95ID0gbGlzdGVuQnlTZWxlY3RvcihzZXR0aW5ncy5lbCwgJ2NsaWNrJywgJy5mYy1ldmVudCcsIC8vIG9uIGJvdGggZmcgYW5kIGJnIGV2ZW50c1xuICAgICAgICBfdGhpcy5oYW5kbGVTZWdDbGljayk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIEV2ZW50Q2xpY2tpbmc7XG59KEludGVyYWN0aW9uKSk7XG5cbi8qXG5UcmlnZ2VycyBldmVudHMgYW5kIGFkZHMvcmVtb3ZlcyBjb3JlIGNsYXNzTmFtZXMgd2hlbiB0aGUgdXNlcidzIHBvaW50ZXJcbmVudGVycy9sZWF2ZXMgZXZlbnQtZWxlbWVudHMgb2YgYSBjb21wb25lbnQuXG4qL1xudmFyIEV2ZW50SG92ZXJpbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKEV2ZW50SG92ZXJpbmcsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRXZlbnRIb3ZlcmluZyhzZXR0aW5ncykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzZXR0aW5ncykgfHwgdGhpcztcbiAgICAgICAgLy8gZm9yIHNpbXVsYXRpbmcgYW4gZXZlbnRNb3VzZUxlYXZlIHdoZW4gdGhlIGV2ZW50IGVsIGlzIGRlc3Ryb3llZCB3aGlsZSBtb3VzZSBpcyBvdmVyIGl0XG4gICAgICAgIF90aGlzLmhhbmRsZUV2ZW50RWxSZW1vdmUgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIGlmIChlbCA9PT0gX3RoaXMuY3VycmVudFNlZ0VsKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuaGFuZGxlU2VnTGVhdmUobnVsbCwgX3RoaXMuY3VycmVudFNlZ0VsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlU2VnRW50ZXIgPSBmdW5jdGlvbiAoZXYsIHNlZ0VsKSB7XG4gICAgICAgICAgICBpZiAoZ2V0RWxTZWcoc2VnRWwpKSB7IC8vIFRPRE86IGJldHRlciB3YXkgdG8gbWFrZSBzdXJlIG5vdCBob3ZlcmluZyBvdmVyIG1vcmUrIGxpbmsgb3IgaXRzIHdyYXBwZXJcbiAgICAgICAgICAgICAgICBfdGhpcy5jdXJyZW50U2VnRWwgPSBzZWdFbDtcbiAgICAgICAgICAgICAgICBfdGhpcy50cmlnZ2VyRXZlbnQoJ2V2ZW50TW91c2VFbnRlcicsIGV2LCBzZWdFbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmhhbmRsZVNlZ0xlYXZlID0gZnVuY3Rpb24gKGV2LCBzZWdFbCkge1xuICAgICAgICAgICAgaWYgKF90aGlzLmN1cnJlbnRTZWdFbCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmN1cnJlbnRTZWdFbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgX3RoaXMudHJpZ2dlckV2ZW50KCdldmVudE1vdXNlTGVhdmUnLCBldiwgc2VnRWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5yZW1vdmVIb3Zlckxpc3RlbmVycyA9IGxpc3RlblRvSG92ZXJCeVNlbGVjdG9yKHNldHRpbmdzLmVsLCAnLmZjLWV2ZW50JywgLy8gb24gYm90aCBmZyBhbmQgYmcgZXZlbnRzXG4gICAgICAgIF90aGlzLmhhbmRsZVNlZ0VudGVyLCBfdGhpcy5oYW5kbGVTZWdMZWF2ZSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgRXZlbnRIb3ZlcmluZy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVIb3Zlckxpc3RlbmVycygpO1xuICAgIH07XG4gICAgRXZlbnRIb3ZlcmluZy5wcm90b3R5cGUudHJpZ2dlckV2ZW50ID0gZnVuY3Rpb24gKHB1YmxpY0V2TmFtZSwgZXYsIHNlZ0VsKSB7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudDtcbiAgICAgICAgdmFyIGNvbnRleHQgPSBjb21wb25lbnQuY29udGV4dDtcbiAgICAgICAgdmFyIHNlZyA9IGdldEVsU2VnKHNlZ0VsKTtcbiAgICAgICAgaWYgKCFldiB8fCBjb21wb25lbnQuaXNWYWxpZFNlZ0Rvd25FbChldi50YXJnZXQpKSB7XG4gICAgICAgICAgICBjb250ZXh0LmVtaXR0ZXIudHJpZ2dlcihwdWJsaWNFdk5hbWUsIHtcbiAgICAgICAgICAgICAgICBlbDogc2VnRWwsXG4gICAgICAgICAgICAgICAgZXZlbnQ6IG5ldyBFdmVudEFwaShjb250ZXh0LCBzZWcuZXZlbnRSYW5nZS5kZWYsIHNlZy5ldmVudFJhbmdlLmluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICBqc0V2ZW50OiBldixcbiAgICAgICAgICAgICAgICB2aWV3OiBjb250ZXh0LnZpZXdBcGksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEV2ZW50SG92ZXJpbmc7XG59KEludGVyYWN0aW9uKSk7XG5cbnZhciBDYWxlbmRhckNvbnRlbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKENhbGVuZGFyQ29udGVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDYWxlbmRhckNvbnRlbnQoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5idWlsZFZpZXdDb250ZXh0ID0gbWVtb2l6ZShidWlsZFZpZXdDb250ZXh0KTtcbiAgICAgICAgX3RoaXMuYnVpbGRWaWV3UHJvcFRyYW5zZm9ybWVycyA9IG1lbW9pemUoYnVpbGRWaWV3UHJvcFRyYW5zZm9ybWVycyk7XG4gICAgICAgIF90aGlzLmJ1aWxkVG9vbGJhclByb3BzID0gbWVtb2l6ZShidWlsZFRvb2xiYXJQcm9wcyk7XG4gICAgICAgIF90aGlzLmhlYWRlclJlZiA9IHZkb21fY2pzLmNyZWF0ZVJlZigpO1xuICAgICAgICBfdGhpcy5mb290ZXJSZWYgPSB2ZG9tX2Nqcy5jcmVhdGVSZWYoKTtcbiAgICAgICAgX3RoaXMuaW50ZXJhY3Rpb25zU3RvcmUgPSB7fTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgdmlld0xhYmVsSWQ6IGdldFVuaXF1ZURvbUlkKCksXG4gICAgICAgIH07XG4gICAgICAgIC8vIENvbXBvbmVudCBSZWdpc3RyYXRpb25cbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgX3RoaXMucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCA9IGZ1bmN0aW9uIChjb21wb25lbnQsIHNldHRpbmdzSW5wdXQpIHtcbiAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IHBhcnNlSW50ZXJhY3Rpb25TZXR0aW5ncyhjb21wb25lbnQsIHNldHRpbmdzSW5wdXQpO1xuICAgICAgICAgICAgdmFyIERFRkFVTFRfSU5URVJBQ1RJT05TID0gW1xuICAgICAgICAgICAgICAgIEV2ZW50Q2xpY2tpbmcsXG4gICAgICAgICAgICAgICAgRXZlbnRIb3ZlcmluZyxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB2YXIgaW50ZXJhY3Rpb25DbGFzc2VzID0gREVGQVVMVF9JTlRFUkFDVElPTlMuY29uY2F0KF90aGlzLnByb3BzLnBsdWdpbkhvb2tzLmNvbXBvbmVudEludGVyYWN0aW9ucyk7XG4gICAgICAgICAgICB2YXIgaW50ZXJhY3Rpb25zID0gaW50ZXJhY3Rpb25DbGFzc2VzLm1hcChmdW5jdGlvbiAoVGhlSW50ZXJhY3Rpb25DbGFzcykgeyByZXR1cm4gbmV3IFRoZUludGVyYWN0aW9uQ2xhc3Moc2V0dGluZ3MpOyB9KTtcbiAgICAgICAgICAgIF90aGlzLmludGVyYWN0aW9uc1N0b3JlW2NvbXBvbmVudC51aWRdID0gaW50ZXJhY3Rpb25zO1xuICAgICAgICAgICAgaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlW2NvbXBvbmVudC51aWRdID0gc2V0dGluZ3M7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLnVucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCA9IGZ1bmN0aW9uIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgIHZhciBsaXN0ZW5lcnMgPSBfdGhpcy5pbnRlcmFjdGlvbnNTdG9yZVtjb21wb25lbnQudWlkXTtcbiAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGxpc3RlbmVyc18xID0gbGlzdGVuZXJzOyBfaSA8IGxpc3RlbmVyc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNfMVtfaV07XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIF90aGlzLmludGVyYWN0aW9uc1N0b3JlW2NvbXBvbmVudC51aWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIGludGVyYWN0aW9uU2V0dGluZ3NTdG9yZVtjb21wb25lbnQudWlkXTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gUmVzaXppbmdcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgX3RoaXMucmVzaXplUnVubmVyID0gbmV3IERlbGF5ZWRSdW5uZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMucHJvcHMuZW1pdHRlci50cmlnZ2VyKCdfcmVzaXplJywgdHJ1ZSk7IC8vIHNob3VsZCB3aW5kb3cgcmVzaXplcyBiZSBjb25zaWRlcmVkIFwiZm9yY2VkXCIgP1xuICAgICAgICAgICAgX3RoaXMucHJvcHMuZW1pdHRlci50cmlnZ2VyKCd3aW5kb3dSZXNpemUnLCB7IHZpZXc6IF90aGlzLnByb3BzLnZpZXdBcGkgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBfdGhpcy5oYW5kbGVXaW5kb3dSZXNpemUgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIHZhciBvcHRpb25zID0gX3RoaXMucHJvcHMub3B0aW9ucztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmhhbmRsZVdpbmRvd1Jlc2l6ZSAmJlxuICAgICAgICAgICAgICAgIGV2LnRhcmdldCA9PT0gd2luZG93IC8vIGF2b2lkIGpxdWkgZXZlbnRzXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5yZXNpemVSdW5uZXIucmVxdWVzdChvcHRpb25zLndpbmRvd1Jlc2l6ZURlbGF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKlxuICAgIHJlbmRlcnMgSU5TSURFIG9mIGFuIG91dGVyIGRpdlxuICAgICovXG4gICAgQ2FsZW5kYXJDb250ZW50LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHZhciB0b29sYmFyQ29uZmlnID0gcHJvcHMudG9vbGJhckNvbmZpZywgb3B0aW9ucyA9IHByb3BzLm9wdGlvbnM7XG4gICAgICAgIHZhciB0b29sYmFyUHJvcHMgPSB0aGlzLmJ1aWxkVG9vbGJhclByb3BzKHByb3BzLnZpZXdTcGVjLCBwcm9wcy5kYXRlUHJvZmlsZSwgcHJvcHMuZGF0ZVByb2ZpbGVHZW5lcmF0b3IsIHByb3BzLmN1cnJlbnREYXRlLCBnZXROb3cocHJvcHMub3B0aW9ucy5ub3csIHByb3BzLmRhdGVFbnYpLCAvLyBUT0RPOiB1c2UgTm93VGltZXI/Pz8/XG4gICAgICAgIHByb3BzLnZpZXdUaXRsZSk7XG4gICAgICAgIHZhciB2aWV3Vkdyb3cgPSBmYWxzZTtcbiAgICAgICAgdmFyIHZpZXdIZWlnaHQgPSAnJztcbiAgICAgICAgdmFyIHZpZXdBc3BlY3RSYXRpbztcbiAgICAgICAgaWYgKHByb3BzLmlzSGVpZ2h0QXV0byB8fCBwcm9wcy5mb3JQcmludCkge1xuICAgICAgICAgICAgdmlld0hlaWdodCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaGVpZ2h0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZpZXdWR3JvdyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5jb250ZW50SGVpZ2h0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZpZXdIZWlnaHQgPSBvcHRpb25zLmNvbnRlbnRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2aWV3QXNwZWN0UmF0aW8gPSBNYXRoLm1heChvcHRpb25zLmFzcGVjdFJhdGlvLCAwLjUpOyAvLyBwcmV2ZW50IGZyb20gZ2V0dGluZyB0b28gdGFsbFxuICAgICAgICB9XG4gICAgICAgIHZhciB2aWV3Q29udGV4dCA9IHRoaXMuYnVpbGRWaWV3Q29udGV4dChwcm9wcy52aWV3U3BlYywgcHJvcHMudmlld0FwaSwgcHJvcHMub3B0aW9ucywgcHJvcHMuZGF0ZVByb2ZpbGVHZW5lcmF0b3IsIHByb3BzLmRhdGVFbnYsIHByb3BzLnRoZW1lLCBwcm9wcy5wbHVnaW5Ib29rcywgcHJvcHMuZGlzcGF0Y2gsIHByb3BzLmdldEN1cnJlbnREYXRhLCBwcm9wcy5lbWl0dGVyLCBwcm9wcy5jYWxlbmRhckFwaSwgdGhpcy5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50LCB0aGlzLnVucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCk7XG4gICAgICAgIHZhciB2aWV3TGFiZWxJZCA9ICh0b29sYmFyQ29uZmlnLmhlYWRlciAmJiB0b29sYmFyQ29uZmlnLmhlYWRlci5oYXNUaXRsZSlcbiAgICAgICAgICAgID8gdGhpcy5zdGF0ZS52aWV3TGFiZWxJZFxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFZpZXdDb250ZXh0VHlwZS5Qcm92aWRlciwgeyB2YWx1ZTogdmlld0NvbnRleHQgfSxcbiAgICAgICAgICAgIHRvb2xiYXJDb25maWcuaGVhZGVyICYmICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFRvb2xiYXIsIHRzbGliLl9fYXNzaWduKHsgcmVmOiB0aGlzLmhlYWRlclJlZiwgZXh0cmFDbGFzc05hbWU6IFwiZmMtaGVhZGVyLXRvb2xiYXJcIiwgbW9kZWw6IHRvb2xiYXJDb25maWcuaGVhZGVyLCB0aXRsZUlkOiB2aWV3TGFiZWxJZCB9LCB0b29sYmFyUHJvcHMpKSksXG4gICAgICAgICAgICB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFZpZXdDb250YWluZXIsIHsgbGlxdWlkOiB2aWV3Vkdyb3csIGhlaWdodDogdmlld0hlaWdodCwgYXNwZWN0UmF0aW86IHZpZXdBc3BlY3RSYXRpbywgbGFiZWxlZEJ5SWQ6IHZpZXdMYWJlbElkIH0sXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJWaWV3KHByb3BzKSxcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkQXBwZW5kQ29udGVudCgpKSxcbiAgICAgICAgICAgIHRvb2xiYXJDb25maWcuZm9vdGVyICYmICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFRvb2xiYXIsIHRzbGliLl9fYXNzaWduKHsgcmVmOiB0aGlzLmZvb3RlclJlZiwgZXh0cmFDbGFzc05hbWU6IFwiZmMtZm9vdGVyLXRvb2xiYXJcIiwgbW9kZWw6IHRvb2xiYXJDb25maWcuZm9vdGVyLCB0aXRsZUlkOiBcIlwiIH0sIHRvb2xiYXJQcm9wcykpKSkpO1xuICAgIH07XG4gICAgQ2FsZW5kYXJDb250ZW50LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdGhpcy5jYWxlbmRhckludGVyYWN0aW9ucyA9IHByb3BzLnBsdWdpbkhvb2tzLmNhbGVuZGFySW50ZXJhY3Rpb25zXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChDYWxlbmRhckludGVyYWN0aW9uQ2xhc3MpIHsgcmV0dXJuIG5ldyBDYWxlbmRhckludGVyYWN0aW9uQ2xhc3MocHJvcHMpOyB9KTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuaGFuZGxlV2luZG93UmVzaXplKTtcbiAgICAgICAgdmFyIHByb3BTZXRIYW5kbGVycyA9IHByb3BzLnBsdWdpbkhvb2tzLnByb3BTZXRIYW5kbGVycztcbiAgICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gcHJvcFNldEhhbmRsZXJzKSB7XG4gICAgICAgICAgICBwcm9wU2V0SGFuZGxlcnNbcHJvcE5hbWVdKHByb3BzW3Byb3BOYW1lXSwgcHJvcHMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDYWxlbmRhckNvbnRlbnQucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIChwcmV2UHJvcHMpIHtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdmFyIHByb3BTZXRIYW5kbGVycyA9IHByb3BzLnBsdWdpbkhvb2tzLnByb3BTZXRIYW5kbGVycztcbiAgICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gcHJvcFNldEhhbmRsZXJzKSB7XG4gICAgICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdICE9PSBwcmV2UHJvcHNbcHJvcE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgcHJvcFNldEhhbmRsZXJzW3Byb3BOYW1lXShwcm9wc1twcm9wTmFtZV0sIHByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgQ2FsZW5kYXJDb250ZW50LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuaGFuZGxlV2luZG93UmVzaXplKTtcbiAgICAgICAgdGhpcy5yZXNpemVSdW5uZXIuY2xlYXIoKTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMuY2FsZW5kYXJJbnRlcmFjdGlvbnM7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgaW50ZXJhY3Rpb24gPSBfYVtfaV07XG4gICAgICAgICAgICBpbnRlcmFjdGlvbi5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9wcy5lbWl0dGVyLnRyaWdnZXIoJ191bm1vdW50Jyk7XG4gICAgfTtcbiAgICBDYWxlbmRhckNvbnRlbnQucHJvdG90eXBlLmJ1aWxkQXBwZW5kQ29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gcHJvcHMucGx1Z2luSG9va3Mudmlld0NvbnRhaW5lckFwcGVuZHMubWFwKGZ1bmN0aW9uIChidWlsZEFwcGVuZENvbnRlbnQpIHsgcmV0dXJuIGJ1aWxkQXBwZW5kQ29udGVudChwcm9wcyk7IH0pO1xuICAgICAgICByZXR1cm4gdmRvbV9janMuY3JlYXRlRWxlbWVudC5hcHBseSh2b2lkIDAsIHRzbGliLl9fc3ByZWFkQXJyYXkoW3Zkb21fY2pzLkZyYWdtZW50LCB7fV0sIGNoaWxkcmVuKSk7XG4gICAgfTtcbiAgICBDYWxlbmRhckNvbnRlbnQucHJvdG90eXBlLnJlbmRlclZpZXcgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgICAgdmFyIHBsdWdpbkhvb2tzID0gcHJvcHMucGx1Z2luSG9va3M7XG4gICAgICAgIHZhciB2aWV3U3BlYyA9IHByb3BzLnZpZXdTcGVjO1xuICAgICAgICB2YXIgdmlld1Byb3BzID0ge1xuICAgICAgICAgICAgZGF0ZVByb2ZpbGU6IHByb3BzLmRhdGVQcm9maWxlLFxuICAgICAgICAgICAgYnVzaW5lc3NIb3VyczogcHJvcHMuYnVzaW5lc3NIb3VycyxcbiAgICAgICAgICAgIGV2ZW50U3RvcmU6IHByb3BzLnJlbmRlcmFibGVFdmVudFN0b3JlLFxuICAgICAgICAgICAgZXZlbnRVaUJhc2VzOiBwcm9wcy5ldmVudFVpQmFzZXMsXG4gICAgICAgICAgICBkYXRlU2VsZWN0aW9uOiBwcm9wcy5kYXRlU2VsZWN0aW9uLFxuICAgICAgICAgICAgZXZlbnRTZWxlY3Rpb246IHByb3BzLmV2ZW50U2VsZWN0aW9uLFxuICAgICAgICAgICAgZXZlbnREcmFnOiBwcm9wcy5ldmVudERyYWcsXG4gICAgICAgICAgICBldmVudFJlc2l6ZTogcHJvcHMuZXZlbnRSZXNpemUsXG4gICAgICAgICAgICBpc0hlaWdodEF1dG86IHByb3BzLmlzSGVpZ2h0QXV0byxcbiAgICAgICAgICAgIGZvclByaW50OiBwcm9wcy5mb3JQcmludCxcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHRyYW5zZm9ybWVycyA9IHRoaXMuYnVpbGRWaWV3UHJvcFRyYW5zZm9ybWVycyhwbHVnaW5Ib29rcy52aWV3UHJvcHNUcmFuc2Zvcm1lcnMpO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIHRyYW5zZm9ybWVyc18xID0gdHJhbnNmb3JtZXJzOyBfaSA8IHRyYW5zZm9ybWVyc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJzXzFbX2ldO1xuICAgICAgICAgICAgdHNsaWIuX19hc3NpZ24odmlld1Byb3BzLCB0cmFuc2Zvcm1lci50cmFuc2Zvcm0odmlld1Byb3BzLCBwcm9wcykpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBWaWV3Q29tcG9uZW50ID0gdmlld1NwZWMuY29tcG9uZW50O1xuICAgICAgICByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoVmlld0NvbXBvbmVudCwgdHNsaWIuX19hc3NpZ24oe30sIHZpZXdQcm9wcykpKTtcbiAgICB9O1xuICAgIHJldHVybiBDYWxlbmRhckNvbnRlbnQ7XG59KFB1cmVDb21wb25lbnQpKTtcbmZ1bmN0aW9uIGJ1aWxkVG9vbGJhclByb3BzKHZpZXdTcGVjLCBkYXRlUHJvZmlsZSwgZGF0ZVByb2ZpbGVHZW5lcmF0b3IsIGN1cnJlbnREYXRlLCBub3csIHRpdGxlKSB7XG4gICAgLy8gZG9uJ3QgZm9yY2UgYW55IGRhdGUtcHJvZmlsZXMgdG8gdmFsaWQgZGF0ZSBwcm9maWxlcyAodGhlIGBmYWxzZWApIHNvIHRoYXQgd2UgY2FuIHRlbGwgaWYgaXQncyBpbnZhbGlkXG4gICAgdmFyIHRvZGF5SW5mbyA9IGRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkKG5vdywgdW5kZWZpbmVkLCBmYWxzZSk7IC8vIFRPRE86IG5lZWQgYHVuZGVmaW5lZGAgb3IgZWxzZSBJTkZJTklURSBMT09QIGZvciBzb21lIHJlYXNvblxuICAgIHZhciBwcmV2SW5mbyA9IGRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkUHJldihkYXRlUHJvZmlsZSwgY3VycmVudERhdGUsIGZhbHNlKTtcbiAgICB2YXIgbmV4dEluZm8gPSBkYXRlUHJvZmlsZUdlbmVyYXRvci5idWlsZE5leHQoZGF0ZVByb2ZpbGUsIGN1cnJlbnREYXRlLCBmYWxzZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICBhY3RpdmVCdXR0b246IHZpZXdTcGVjLnR5cGUsXG4gICAgICAgIG5hdlVuaXQ6IHZpZXdTcGVjLnNpbmdsZVVuaXQsXG4gICAgICAgIGlzVG9kYXlFbmFibGVkOiB0b2RheUluZm8uaXNWYWxpZCAmJiAhcmFuZ2VDb250YWluc01hcmtlcihkYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2UsIG5vdyksXG4gICAgICAgIGlzUHJldkVuYWJsZWQ6IHByZXZJbmZvLmlzVmFsaWQsXG4gICAgICAgIGlzTmV4dEVuYWJsZWQ6IG5leHRJbmZvLmlzVmFsaWQsXG4gICAgfTtcbn1cbi8vIFBsdWdpblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGJ1aWxkVmlld1Byb3BUcmFuc2Zvcm1lcnModGhlQ2xhc3Nlcykge1xuICAgIHJldHVybiB0aGVDbGFzc2VzLm1hcChmdW5jdGlvbiAoVGhlQ2xhc3MpIHsgcmV0dXJuIG5ldyBUaGVDbGFzcygpOyB9KTtcbn1cblxudmFyIENhbGVuZGFyUm9vdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoQ2FsZW5kYXJSb290LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENhbGVuZGFyUm9vdCgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgZm9yUHJpbnQ6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVCZWZvcmVQcmludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLnNldFN0YXRlKHsgZm9yUHJpbnQ6IHRydWUgfSk7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmhhbmRsZUFmdGVyUHJpbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7IGZvclByaW50OiBmYWxzZSB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBDYWxlbmRhclJvb3QucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBwcm9wcy5vcHRpb25zO1xuICAgICAgICB2YXIgZm9yUHJpbnQgPSB0aGlzLnN0YXRlLmZvclByaW50O1xuICAgICAgICB2YXIgaXNIZWlnaHRBdXRvID0gZm9yUHJpbnQgfHwgb3B0aW9ucy5oZWlnaHQgPT09ICdhdXRvJyB8fCBvcHRpb25zLmNvbnRlbnRIZWlnaHQgPT09ICdhdXRvJztcbiAgICAgICAgdmFyIGhlaWdodCA9ICghaXNIZWlnaHRBdXRvICYmIG9wdGlvbnMuaGVpZ2h0ICE9IG51bGwpID8gb3B0aW9ucy5oZWlnaHQgOiAnJztcbiAgICAgICAgdmFyIGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICAgICAnZmMnLFxuICAgICAgICAgICAgZm9yUHJpbnQgPyAnZmMtbWVkaWEtcHJpbnQnIDogJ2ZjLW1lZGlhLXNjcmVlbicsXG4gICAgICAgICAgICBcImZjLWRpcmVjdGlvbi1cIiArIG9wdGlvbnMuZGlyZWN0aW9uLFxuICAgICAgICAgICAgcHJvcHMudGhlbWUuZ2V0Q2xhc3MoJ3Jvb3QnKSxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKCFnZXRDYW5WR3Jvd1dpdGhpbkNlbGwoKSkge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1saXF1aWQtaGFjaycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wcy5jaGlsZHJlbihjbGFzc05hbWVzLCBoZWlnaHQsIGlzSGVpZ2h0QXV0bywgZm9yUHJpbnQpO1xuICAgIH07XG4gICAgQ2FsZW5kYXJSb290LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVtaXR0ZXIgPSB0aGlzLnByb3BzLmVtaXR0ZXI7XG4gICAgICAgIGVtaXR0ZXIub24oJ19iZWZvcmVwcmludCcsIHRoaXMuaGFuZGxlQmVmb3JlUHJpbnQpO1xuICAgICAgICBlbWl0dGVyLm9uKCdfYWZ0ZXJwcmludCcsIHRoaXMuaGFuZGxlQWZ0ZXJQcmludCk7XG4gICAgfTtcbiAgICBDYWxlbmRhclJvb3QucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZW1pdHRlciA9IHRoaXMucHJvcHMuZW1pdHRlcjtcbiAgICAgICAgZW1pdHRlci5vZmYoJ19iZWZvcmVwcmludCcsIHRoaXMuaGFuZGxlQmVmb3JlUHJpbnQpO1xuICAgICAgICBlbWl0dGVyLm9mZignX2FmdGVycHJpbnQnLCB0aGlzLmhhbmRsZUFmdGVyUHJpbnQpO1xuICAgIH07XG4gICAgcmV0dXJuIENhbGVuZGFyUm9vdDtcbn0oQmFzZUNvbXBvbmVudCkpO1xuXG4vLyBDb21wdXRlcyBhIGRlZmF1bHQgY29sdW1uIGhlYWRlciBmb3JtYXR0aW5nIHN0cmluZyBpZiBgY29sRm9ybWF0YCBpcyBub3QgZXhwbGljaXRseSBkZWZpbmVkXG5mdW5jdGlvbiBjb21wdXRlRmFsbGJhY2tIZWFkZXJGb3JtYXQoZGF0ZXNSZXBEaXN0aW5jdERheXMsIGRheUNudCkge1xuICAgIC8vIGlmIG1vcmUgdGhhbiBvbmUgd2VlayByb3csIG9yIGlmIHRoZXJlIGFyZSBhIGxvdCBvZiBjb2x1bW5zIHdpdGggbm90IG11Y2ggc3BhY2UsXG4gICAgLy8gcHV0IGp1c3QgdGhlIGRheSBudW1iZXJzIHdpbGwgYmUgaW4gZWFjaCBjZWxsXG4gICAgaWYgKCFkYXRlc1JlcERpc3RpbmN0RGF5cyB8fCBkYXlDbnQgPiAxMCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRm9ybWF0dGVyKHsgd2Vla2RheTogJ3Nob3J0JyB9KTsgLy8gXCJTYXRcIlxuICAgIH1cbiAgICBpZiAoZGF5Q250ID4gMSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRm9ybWF0dGVyKHsgd2Vla2RheTogJ3Nob3J0JywgbW9udGg6ICdudW1lcmljJywgZGF5OiAnbnVtZXJpYycsIG9taXRDb21tYXM6IHRydWUgfSk7IC8vIFwiU2F0IDExLzEyXCJcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUZvcm1hdHRlcih7IHdlZWtkYXk6ICdsb25nJyB9KTsgLy8gXCJTYXR1cmRheVwiXG59XG5cbnZhciBDTEFTU19OQU1FID0gJ2ZjLWNvbC1oZWFkZXItY2VsbCc7IC8vIGRvIHRoZSBjdXNoaW9uIHRvbz8gbm9cbmZ1bmN0aW9uIHJlbmRlcklubmVyJDEoaG9va1Byb3BzKSB7XG4gICAgcmV0dXJuIGhvb2tQcm9wcy50ZXh0O1xufVxuXG52YXIgVGFibGVEYXRlQ2VsbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVGFibGVEYXRlQ2VsbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUYWJsZURhdGVDZWxsKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFRhYmxlRGF0ZUNlbGwucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5jb250ZXh0LCBkYXRlRW52ID0gX2EuZGF0ZUVudiwgb3B0aW9ucyA9IF9hLm9wdGlvbnMsIHRoZW1lID0gX2EudGhlbWUsIHZpZXdBcGkgPSBfYS52aWV3QXBpO1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgZGF0ZSA9IHByb3BzLmRhdGUsIGRhdGVQcm9maWxlID0gcHJvcHMuZGF0ZVByb2ZpbGU7XG4gICAgICAgIHZhciBkYXlNZXRhID0gZ2V0RGF0ZU1ldGEoZGF0ZSwgcHJvcHMudG9kYXlSYW5nZSwgbnVsbCwgZGF0ZVByb2ZpbGUpO1xuICAgICAgICB2YXIgY2xhc3NOYW1lcyA9IFtDTEFTU19OQU1FXS5jb25jYXQoZ2V0RGF5Q2xhc3NOYW1lcyhkYXlNZXRhLCB0aGVtZSkpO1xuICAgICAgICB2YXIgdGV4dCA9IGRhdGVFbnYuZm9ybWF0KGRhdGUsIHByb3BzLmRheUhlYWRlckZvcm1hdCk7XG4gICAgICAgIC8vIGlmIGNvbENudCBpcyAxLCB3ZSBhcmUgYWxyZWFkeSBpbiBhIGRheS12aWV3IGFuZCBkb24ndCBuZWVkIGEgbmF2bGlua1xuICAgICAgICB2YXIgbmF2TGlua0F0dHJzID0gKCFkYXlNZXRhLmlzRGlzYWJsZWQgJiYgcHJvcHMuY29sQ250ID4gMSlcbiAgICAgICAgICAgID8gYnVpbGROYXZMaW5rQXR0cnModGhpcy5jb250ZXh0LCBkYXRlKVxuICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgdmFyIGhvb2tQcm9wcyA9IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHsgZGF0ZTogZGF0ZUVudi50b0RhdGUoZGF0ZSksIHZpZXc6IHZpZXdBcGkgfSwgcHJvcHMuZXh0cmFIb29rUHJvcHMpLCB7IHRleHQ6IHRleHQgfSksIGRheU1ldGEpO1xuICAgICAgICByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoUmVuZGVySG9vaywgeyBob29rUHJvcHM6IGhvb2tQcm9wcywgY2xhc3NOYW1lczogb3B0aW9ucy5kYXlIZWFkZXJDbGFzc05hbWVzLCBjb250ZW50OiBvcHRpb25zLmRheUhlYWRlckNvbnRlbnQsIGRlZmF1bHRDb250ZW50OiByZW5kZXJJbm5lciQxLCBkaWRNb3VudDogb3B0aW9ucy5kYXlIZWFkZXJEaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMuZGF5SGVhZGVyV2lsbFVubW91bnQgfSwgZnVuY3Rpb24gKHJvb3RFbFJlZiwgY3VzdG9tQ2xhc3NOYW1lcywgaW5uZXJFbFJlZiwgaW5uZXJDb250ZW50KSB7IHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChcInRoXCIsIHRzbGliLl9fYXNzaWduKHsgcmVmOiByb290RWxSZWYsIHJvbGU6IFwiY29sdW1uaGVhZGVyXCIsIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5jb25jYXQoY3VzdG9tQ2xhc3NOYW1lcykuam9pbignICcpLCBcImRhdGEtZGF0ZVwiOiAhZGF5TWV0YS5pc0Rpc2FibGVkID8gZm9ybWF0RGF5U3RyaW5nKGRhdGUpIDogdW5kZWZpbmVkLCBjb2xTcGFuOiBwcm9wcy5jb2xTcGFuIH0sIHByb3BzLmV4dHJhRGF0YUF0dHJzKSxcbiAgICAgICAgICAgIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtc2Nyb2xsZ3JpZC1zeW5jLWlubmVyXCIgfSwgIWRheU1ldGEuaXNEaXNhYmxlZCAmJiAodmRvbV9janMuY3JlYXRlRWxlbWVudChcImFcIiwgdHNsaWIuX19hc3NpZ24oeyByZWY6IGlubmVyRWxSZWYsIGNsYXNzTmFtZTogW1xuICAgICAgICAgICAgICAgICAgICAnZmMtY29sLWhlYWRlci1jZWxsLWN1c2hpb24nLFxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5pc1N0aWNreSA/ICdmYy1zdGlja3knIDogJycsXG4gICAgICAgICAgICAgICAgXS5qb2luKCcgJykgfSwgbmF2TGlua0F0dHJzKSwgaW5uZXJDb250ZW50KSkpKSk7IH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZURhdGVDZWxsO1xufShCYXNlQ29tcG9uZW50KSk7XG5cbnZhciBXRUVLREFZX0ZPUk1BVCA9IGNyZWF0ZUZvcm1hdHRlcih7IHdlZWtkYXk6ICdsb25nJyB9KTtcbnZhciBUYWJsZURvd0NlbGwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFRhYmxlRG93Q2VsbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUYWJsZURvd0NlbGwoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgVGFibGVEb3dDZWxsLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuY29udGV4dCwgZGF0ZUVudiA9IF9hLmRhdGVFbnYsIHRoZW1lID0gX2EudGhlbWUsIHZpZXdBcGkgPSBfYS52aWV3QXBpLCBvcHRpb25zID0gX2Eub3B0aW9ucztcbiAgICAgICAgdmFyIGRhdGUgPSBhZGREYXlzKG5ldyBEYXRlKDI1OTIwMDAwMCksIHByb3BzLmRvdyk7IC8vIHN0YXJ0IHdpdGggU3VuLCAwNCBKYW4gMTk3MCAwMDowMDowMCBHTVRcbiAgICAgICAgdmFyIGRhdGVNZXRhID0ge1xuICAgICAgICAgICAgZG93OiBwcm9wcy5kb3csXG4gICAgICAgICAgICBpc0Rpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGlzRnV0dXJlOiBmYWxzZSxcbiAgICAgICAgICAgIGlzUGFzdDogZmFsc2UsXG4gICAgICAgICAgICBpc1RvZGF5OiBmYWxzZSxcbiAgICAgICAgICAgIGlzT3RoZXI6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgICB2YXIgY2xhc3NOYW1lcyA9IFtDTEFTU19OQU1FXS5jb25jYXQoZ2V0RGF5Q2xhc3NOYW1lcyhkYXRlTWV0YSwgdGhlbWUpLCBwcm9wcy5leHRyYUNsYXNzTmFtZXMgfHwgW10pO1xuICAgICAgICB2YXIgdGV4dCA9IGRhdGVFbnYuZm9ybWF0KGRhdGUsIHByb3BzLmRheUhlYWRlckZvcm1hdCk7XG4gICAgICAgIHZhciBob29rUHJvcHMgPSB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7IC8vIFRPRE86IG1ha2UgdGhpcyBwdWJsaWM/XG4gICAgICAgICAgICBkYXRlOiBkYXRlIH0sIGRhdGVNZXRhKSwgeyB2aWV3OiB2aWV3QXBpIH0pLCBwcm9wcy5leHRyYUhvb2tQcm9wcyksIHsgdGV4dDogdGV4dCB9KTtcbiAgICAgICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFJlbmRlckhvb2ssIHsgaG9va1Byb3BzOiBob29rUHJvcHMsIGNsYXNzTmFtZXM6IG9wdGlvbnMuZGF5SGVhZGVyQ2xhc3NOYW1lcywgY29udGVudDogb3B0aW9ucy5kYXlIZWFkZXJDb250ZW50LCBkZWZhdWx0Q29udGVudDogcmVuZGVySW5uZXIkMSwgZGlkTW91bnQ6IG9wdGlvbnMuZGF5SGVhZGVyRGlkTW91bnQsIHdpbGxVbm1vdW50OiBvcHRpb25zLmRheUhlYWRlcldpbGxVbm1vdW50IH0sIGZ1bmN0aW9uIChyb290RWxSZWYsIGN1c3RvbUNsYXNzTmFtZXMsIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJ0aFwiLCB0c2xpYi5fX2Fzc2lnbih7IHJlZjogcm9vdEVsUmVmLCByb2xlOiBcImNvbHVtbmhlYWRlclwiLCBjbGFzc05hbWU6IGNsYXNzTmFtZXMuY29uY2F0KGN1c3RvbUNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgY29sU3BhbjogcHJvcHMuY29sU3BhbiB9LCBwcm9wcy5leHRyYURhdGFBdHRycyksXG4gICAgICAgICAgICB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLXNjcm9sbGdyaWQtc3luYy1pbm5lclwiIH0sXG4gICAgICAgICAgICAgICAgdmRvbV9janMuY3JlYXRlRWxlbWVudChcImFcIiwgeyBcImFyaWEtbGFiZWxcIjogZGF0ZUVudi5mb3JtYXQoZGF0ZSwgV0VFS0RBWV9GT1JNQVQpLCBjbGFzc05hbWU6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdmYy1jb2wtaGVhZGVyLWNlbGwtY3VzaGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5pc1N0aWNreSA/ICdmYy1zdGlja3knIDogJycsXG4gICAgICAgICAgICAgICAgICAgIF0uam9pbignICcpLCByZWY6IGlubmVyRWxSZWYgfSwgaW5uZXJDb250ZW50KSkpKTsgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFRhYmxlRG93Q2VsbDtcbn0oQmFzZUNvbXBvbmVudCkpO1xuXG52YXIgTm93VGltZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKE5vd1RpbWVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE5vd1RpbWVyKHByb3BzLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5pbml0aWFsTm93RGF0ZSA9IGdldE5vdyhjb250ZXh0Lm9wdGlvbnMubm93LCBjb250ZXh0LmRhdGVFbnYpO1xuICAgICAgICBfdGhpcy5pbml0aWFsTm93UXVlcmllZE1zID0gbmV3IERhdGUoKS52YWx1ZU9mKCk7XG4gICAgICAgIF90aGlzLnN0YXRlID0gX3RoaXMuY29tcHV0ZVRpbWluZygpLmN1cnJlbnRTdGF0ZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBOb3dUaW1lci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBzdGF0ZSA9IF9hLnN0YXRlO1xuICAgICAgICByZXR1cm4gcHJvcHMuY2hpbGRyZW4oc3RhdGUubm93RGF0ZSwgc3RhdGUudG9kYXlSYW5nZSk7XG4gICAgfTtcbiAgICBOb3dUaW1lci5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2V0VGltZW91dCgpO1xuICAgIH07XG4gICAgTm93VGltZXIucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIChwcmV2UHJvcHMpIHtcbiAgICAgICAgaWYgKHByZXZQcm9wcy51bml0ICE9PSB0aGlzLnByb3BzLnVuaXQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG4gICAgICAgICAgICB0aGlzLnNldFRpbWVvdXQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTm93VGltZXIucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNsZWFyVGltZW91dCgpO1xuICAgIH07XG4gICAgTm93VGltZXIucHJvdG90eXBlLmNvbXB1dGVUaW1pbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgdW5yb3VuZGVkTm93ID0gYWRkTXModGhpcy5pbml0aWFsTm93RGF0ZSwgbmV3IERhdGUoKS52YWx1ZU9mKCkgLSB0aGlzLmluaXRpYWxOb3dRdWVyaWVkTXMpO1xuICAgICAgICB2YXIgY3VycmVudFVuaXRTdGFydCA9IGNvbnRleHQuZGF0ZUVudi5zdGFydE9mKHVucm91bmRlZE5vdywgcHJvcHMudW5pdCk7XG4gICAgICAgIHZhciBuZXh0VW5pdFN0YXJ0ID0gY29udGV4dC5kYXRlRW52LmFkZChjdXJyZW50VW5pdFN0YXJ0LCBjcmVhdGVEdXJhdGlvbigxLCBwcm9wcy51bml0KSk7XG4gICAgICAgIHZhciB3YWl0TXMgPSBuZXh0VW5pdFN0YXJ0LnZhbHVlT2YoKSAtIHVucm91bmRlZE5vdy52YWx1ZU9mKCk7XG4gICAgICAgIC8vIHRoZXJlIGlzIGEgbWF4IHNldFRpbWVvdXQgbXMgdmFsdWUgKGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNDY4NjUwLzk2MzQyKVxuICAgICAgICAvLyBlbnN1cmUgbm8gbG9uZ2VyIHRoYW4gYSBkYXlcbiAgICAgICAgd2FpdE1zID0gTWF0aC5taW4oMTAwMCAqIDYwICogNjAgKiAyNCwgd2FpdE1zKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGN1cnJlbnRTdGF0ZTogeyBub3dEYXRlOiBjdXJyZW50VW5pdFN0YXJ0LCB0b2RheVJhbmdlOiBidWlsZERheVJhbmdlKGN1cnJlbnRVbml0U3RhcnQpIH0sXG4gICAgICAgICAgICBuZXh0U3RhdGU6IHsgbm93RGF0ZTogbmV4dFVuaXRTdGFydCwgdG9kYXlSYW5nZTogYnVpbGREYXlSYW5nZShuZXh0VW5pdFN0YXJ0KSB9LFxuICAgICAgICAgICAgd2FpdE1zOiB3YWl0TXMsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBOb3dUaW1lci5wcm90b3R5cGUuc2V0VGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9hID0gdGhpcy5jb21wdXRlVGltaW5nKCksIG5leHRTdGF0ZSA9IF9hLm5leHRTdGF0ZSwgd2FpdE1zID0gX2Eud2FpdE1zO1xuICAgICAgICB0aGlzLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuc2V0U3RhdGUobmV4dFN0YXRlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuc2V0VGltZW91dCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIHdhaXRNcyk7XG4gICAgfTtcbiAgICBOb3dUaW1lci5wcm90b3R5cGUuY2xlYXJUaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy50aW1lb3V0SWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE5vd1RpbWVyLmNvbnRleHRUeXBlID0gVmlld0NvbnRleHRUeXBlO1xuICAgIHJldHVybiBOb3dUaW1lcjtcbn0odmRvbV9janMuQ29tcG9uZW50KSk7XG5mdW5jdGlvbiBidWlsZERheVJhbmdlKGRhdGUpIHtcbiAgICB2YXIgc3RhcnQgPSBzdGFydE9mRGF5KGRhdGUpO1xuICAgIHZhciBlbmQgPSBhZGREYXlzKHN0YXJ0LCAxKTtcbiAgICByZXR1cm4geyBzdGFydDogc3RhcnQsIGVuZDogZW5kIH07XG59XG5cbnZhciBEYXlIZWFkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKERheUhlYWRlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEYXlIZWFkZXIoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jcmVhdGVEYXlIZWFkZXJGb3JtYXR0ZXIgPSBtZW1vaXplKGNyZWF0ZURheUhlYWRlckZvcm1hdHRlcik7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgRGF5SGVhZGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICB2YXIgX2EgPSB0aGlzLnByb3BzLCBkYXRlcyA9IF9hLmRhdGVzLCBkYXRlUHJvZmlsZSA9IF9hLmRhdGVQcm9maWxlLCBkYXRlc1JlcERpc3RpbmN0RGF5cyA9IF9hLmRhdGVzUmVwRGlzdGluY3REYXlzLCByZW5kZXJJbnRybyA9IF9hLnJlbmRlckludHJvO1xuICAgICAgICB2YXIgZGF5SGVhZGVyRm9ybWF0ID0gdGhpcy5jcmVhdGVEYXlIZWFkZXJGb3JtYXR0ZXIoY29udGV4dC5vcHRpb25zLmRheUhlYWRlckZvcm1hdCwgZGF0ZXNSZXBEaXN0aW5jdERheXMsIGRhdGVzLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChOb3dUaW1lciwgeyB1bml0OiBcImRheVwiIH0sIGZ1bmN0aW9uIChub3dEYXRlLCB0b2RheVJhbmdlKSB7IHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChcInRyXCIsIHsgcm9sZTogXCJyb3dcIiB9LFxuICAgICAgICAgICAgcmVuZGVySW50cm8gJiYgcmVuZGVySW50cm8oJ2RheScpLFxuICAgICAgICAgICAgZGF0ZXMubWFwKGZ1bmN0aW9uIChkYXRlKSB7IHJldHVybiAoZGF0ZXNSZXBEaXN0aW5jdERheXMgPyAodmRvbV9janMuY3JlYXRlRWxlbWVudChUYWJsZURhdGVDZWxsLCB7IGtleTogZGF0ZS50b0lTT1N0cmluZygpLCBkYXRlOiBkYXRlLCBkYXRlUHJvZmlsZTogZGF0ZVByb2ZpbGUsIHRvZGF5UmFuZ2U6IHRvZGF5UmFuZ2UsIGNvbENudDogZGF0ZXMubGVuZ3RoLCBkYXlIZWFkZXJGb3JtYXQ6IGRheUhlYWRlckZvcm1hdCB9KSkgOiAodmRvbV9janMuY3JlYXRlRWxlbWVudChUYWJsZURvd0NlbGwsIHsga2V5OiBkYXRlLmdldFVUQ0RheSgpLCBkb3c6IGRhdGUuZ2V0VVRDRGF5KCksIGRheUhlYWRlckZvcm1hdDogZGF5SGVhZGVyRm9ybWF0IH0pKSk7IH0pKSk7IH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBEYXlIZWFkZXI7XG59KEJhc2VDb21wb25lbnQpKTtcbmZ1bmN0aW9uIGNyZWF0ZURheUhlYWRlckZvcm1hdHRlcihleHBsaWNpdEZvcm1hdCwgZGF0ZXNSZXBEaXN0aW5jdERheXMsIGRhdGVDbnQpIHtcbiAgICByZXR1cm4gZXhwbGljaXRGb3JtYXQgfHwgY29tcHV0ZUZhbGxiYWNrSGVhZGVyRm9ybWF0KGRhdGVzUmVwRGlzdGluY3REYXlzLCBkYXRlQ250KTtcbn1cblxudmFyIERheVNlcmllc01vZGVsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERheVNlcmllc01vZGVsKHJhbmdlLCBkYXRlUHJvZmlsZUdlbmVyYXRvcikge1xuICAgICAgICB2YXIgZGF0ZSA9IHJhbmdlLnN0YXJ0O1xuICAgICAgICB2YXIgZW5kID0gcmFuZ2UuZW5kO1xuICAgICAgICB2YXIgaW5kaWNlcyA9IFtdO1xuICAgICAgICB2YXIgZGF0ZXMgPSBbXTtcbiAgICAgICAgdmFyIGRheUluZGV4ID0gLTE7XG4gICAgICAgIHdoaWxlIChkYXRlIDwgZW5kKSB7IC8vIGxvb3AgZWFjaCBkYXkgZnJvbSBzdGFydCB0byBlbmRcbiAgICAgICAgICAgIGlmIChkYXRlUHJvZmlsZUdlbmVyYXRvci5pc0hpZGRlbkRheShkYXRlKSkge1xuICAgICAgICAgICAgICAgIGluZGljZXMucHVzaChkYXlJbmRleCArIDAuNSk7IC8vIG1hcmsgdGhhdCBpdCdzIGJldHdlZW4gaW5kaWNlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF5SW5kZXggKz0gMTtcbiAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goZGF5SW5kZXgpO1xuICAgICAgICAgICAgICAgIGRhdGVzLnB1c2goZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRlID0gYWRkRGF5cyhkYXRlLCAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGVzID0gZGF0ZXM7XG4gICAgICAgIHRoaXMuaW5kaWNlcyA9IGluZGljZXM7XG4gICAgICAgIHRoaXMuY250ID0gZGF0ZXMubGVuZ3RoO1xuICAgIH1cbiAgICBEYXlTZXJpZXNNb2RlbC5wcm90b3R5cGUuc2xpY2VSYW5nZSA9IGZ1bmN0aW9uIChyYW5nZSkge1xuICAgICAgICB2YXIgZmlyc3RJbmRleCA9IHRoaXMuZ2V0RGF0ZURheUluZGV4KHJhbmdlLnN0YXJ0KTsgLy8gaW5jbHVzaXZlIGZpcnN0IGluZGV4XG4gICAgICAgIHZhciBsYXN0SW5kZXggPSB0aGlzLmdldERhdGVEYXlJbmRleChhZGREYXlzKHJhbmdlLmVuZCwgLTEpKTsgLy8gaW5jbHVzaXZlIGxhc3QgaW5kZXhcbiAgICAgICAgdmFyIGNsaXBwZWRGaXJzdEluZGV4ID0gTWF0aC5tYXgoMCwgZmlyc3RJbmRleCk7XG4gICAgICAgIHZhciBjbGlwcGVkTGFzdEluZGV4ID0gTWF0aC5taW4odGhpcy5jbnQgLSAxLCBsYXN0SW5kZXgpO1xuICAgICAgICAvLyBkZWFsIHdpdGggaW4tYmV0d2VlbiBpbmRpY2VzXG4gICAgICAgIGNsaXBwZWRGaXJzdEluZGV4ID0gTWF0aC5jZWlsKGNsaXBwZWRGaXJzdEluZGV4KTsgLy8gaW4tYmV0d2VlbiBzdGFydHMgcm91bmQgdG8gbmV4dCBjZWxsXG4gICAgICAgIGNsaXBwZWRMYXN0SW5kZXggPSBNYXRoLmZsb29yKGNsaXBwZWRMYXN0SW5kZXgpOyAvLyBpbi1iZXR3ZWVuIGVuZHMgcm91bmQgdG8gcHJldiBjZWxsXG4gICAgICAgIGlmIChjbGlwcGVkRmlyc3RJbmRleCA8PSBjbGlwcGVkTGFzdEluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZpcnN0SW5kZXg6IGNsaXBwZWRGaXJzdEluZGV4LFxuICAgICAgICAgICAgICAgIGxhc3RJbmRleDogY2xpcHBlZExhc3RJbmRleCxcbiAgICAgICAgICAgICAgICBpc1N0YXJ0OiBmaXJzdEluZGV4ID09PSBjbGlwcGVkRmlyc3RJbmRleCxcbiAgICAgICAgICAgICAgICBpc0VuZDogbGFzdEluZGV4ID09PSBjbGlwcGVkTGFzdEluZGV4LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIC8vIEdpdmVuIGEgZGF0ZSwgcmV0dXJucyBpdHMgY2hyb25vbG9jaWFsIGNlbGwtaW5kZXggZnJvbSB0aGUgZmlyc3QgY2VsbCBvZiB0aGUgZ3JpZC5cbiAgICAvLyBJZiB0aGUgZGF0ZSBsaWVzIGJldHdlZW4gY2VsbHMgKGJlY2F1c2Ugb2YgaGlkZGVuRGF5cyksIHJldHVybnMgYSBmbG9hdGluZy1wb2ludCB2YWx1ZSBiZXR3ZWVuIG9mZnNldHMuXG4gICAgLy8gSWYgYmVmb3JlIHRoZSBmaXJzdCBvZmZzZXQsIHJldHVybnMgYSBuZWdhdGl2ZSBudW1iZXIuXG4gICAgLy8gSWYgYWZ0ZXIgdGhlIGxhc3Qgb2Zmc2V0LCByZXR1cm5zIGFuIG9mZnNldCBwYXN0IHRoZSBsYXN0IGNlbGwgb2Zmc2V0LlxuICAgIC8vIE9ubHkgd29ya3MgZm9yICpzdGFydCogZGF0ZXMgb2YgY2VsbHMuIFdpbGwgbm90IHdvcmsgZm9yIGV4Y2x1c2l2ZSBlbmQgZGF0ZXMgZm9yIGNlbGxzLlxuICAgIERheVNlcmllc01vZGVsLnByb3RvdHlwZS5nZXREYXRlRGF5SW5kZXggPSBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICB2YXIgaW5kaWNlcyA9IHRoaXMuaW5kaWNlcztcbiAgICAgICAgdmFyIGRheU9mZnNldCA9IE1hdGguZmxvb3IoZGlmZkRheXModGhpcy5kYXRlc1swXSwgZGF0ZSkpO1xuICAgICAgICBpZiAoZGF5T2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGluZGljZXNbMF0gLSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXlPZmZzZXQgPj0gaW5kaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV0gKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmRpY2VzW2RheU9mZnNldF07XG4gICAgfTtcbiAgICByZXR1cm4gRGF5U2VyaWVzTW9kZWw7XG59KCkpO1xuXG52YXIgRGF5VGFibGVNb2RlbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEYXlUYWJsZU1vZGVsKGRheVNlcmllcywgYnJlYWtPbldlZWtzKSB7XG4gICAgICAgIHZhciBkYXRlcyA9IGRheVNlcmllcy5kYXRlcztcbiAgICAgICAgdmFyIGRheXNQZXJSb3c7XG4gICAgICAgIHZhciBmaXJzdERheTtcbiAgICAgICAgdmFyIHJvd0NudDtcbiAgICAgICAgaWYgKGJyZWFrT25XZWVrcykge1xuICAgICAgICAgICAgLy8gY291bnQgY29sdW1ucyB1bnRpbCB0aGUgZGF5LW9mLXdlZWsgcmVwZWF0c1xuICAgICAgICAgICAgZmlyc3REYXkgPSBkYXRlc1swXS5nZXRVVENEYXkoKTtcbiAgICAgICAgICAgIGZvciAoZGF5c1BlclJvdyA9IDE7IGRheXNQZXJSb3cgPCBkYXRlcy5sZW5ndGg7IGRheXNQZXJSb3cgKz0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRlc1tkYXlzUGVyUm93XS5nZXRVVENEYXkoKSA9PT0gZmlyc3REYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93Q250ID0gTWF0aC5jZWlsKGRhdGVzLmxlbmd0aCAvIGRheXNQZXJSb3cpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcm93Q250ID0gMTtcbiAgICAgICAgICAgIGRheXNQZXJSb3cgPSBkYXRlcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb3dDbnQgPSByb3dDbnQ7XG4gICAgICAgIHRoaXMuY29sQ250ID0gZGF5c1BlclJvdztcbiAgICAgICAgdGhpcy5kYXlTZXJpZXMgPSBkYXlTZXJpZXM7XG4gICAgICAgIHRoaXMuY2VsbHMgPSB0aGlzLmJ1aWxkQ2VsbHMoKTtcbiAgICAgICAgdGhpcy5oZWFkZXJEYXRlcyA9IHRoaXMuYnVpbGRIZWFkZXJEYXRlcygpO1xuICAgIH1cbiAgICBEYXlUYWJsZU1vZGVsLnByb3RvdHlwZS5idWlsZENlbGxzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcm93cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCB0aGlzLnJvd0NudDsgcm93ICs9IDEpIHtcbiAgICAgICAgICAgIHZhciBjZWxscyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgdGhpcy5jb2xDbnQ7IGNvbCArPSAxKSB7XG4gICAgICAgICAgICAgICAgY2VsbHMucHVzaCh0aGlzLmJ1aWxkQ2VsbChyb3csIGNvbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93cy5wdXNoKGNlbGxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93cztcbiAgICB9O1xuICAgIERheVRhYmxlTW9kZWwucHJvdG90eXBlLmJ1aWxkQ2VsbCA9IGZ1bmN0aW9uIChyb3csIGNvbCkge1xuICAgICAgICB2YXIgZGF0ZSA9IHRoaXMuZGF5U2VyaWVzLmRhdGVzW3JvdyAqIHRoaXMuY29sQ250ICsgY29sXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleTogZGF0ZS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgZGF0ZTogZGF0ZSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIERheVRhYmxlTW9kZWwucHJvdG90eXBlLmJ1aWxkSGVhZGVyRGF0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYXRlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCB0aGlzLmNvbENudDsgY29sICs9IDEpIHtcbiAgICAgICAgICAgIGRhdGVzLnB1c2godGhpcy5jZWxsc1swXVtjb2xdLmRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlcztcbiAgICB9O1xuICAgIERheVRhYmxlTW9kZWwucHJvdG90eXBlLnNsaWNlUmFuZ2UgPSBmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICAgICAgdmFyIGNvbENudCA9IHRoaXMuY29sQ250O1xuICAgICAgICB2YXIgc2VyaWVzU2VnID0gdGhpcy5kYXlTZXJpZXMuc2xpY2VSYW5nZShyYW5nZSk7XG4gICAgICAgIHZhciBzZWdzID0gW107XG4gICAgICAgIGlmIChzZXJpZXNTZWcpIHtcbiAgICAgICAgICAgIHZhciBmaXJzdEluZGV4ID0gc2VyaWVzU2VnLmZpcnN0SW5kZXgsIGxhc3RJbmRleCA9IHNlcmllc1NlZy5sYXN0SW5kZXg7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBmaXJzdEluZGV4O1xuICAgICAgICAgICAgd2hpbGUgKGluZGV4IDw9IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgIHZhciByb3cgPSBNYXRoLmZsb29yKGluZGV4IC8gY29sQ250KTtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dEluZGV4ID0gTWF0aC5taW4oKHJvdyArIDEpICogY29sQ250LCBsYXN0SW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICBzZWdzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb2w6IGluZGV4ICUgY29sQ250LFxuICAgICAgICAgICAgICAgICAgICBsYXN0Q29sOiAobmV4dEluZGV4IC0gMSkgJSBjb2xDbnQsXG4gICAgICAgICAgICAgICAgICAgIGlzU3RhcnQ6IHNlcmllc1NlZy5pc1N0YXJ0ICYmIGluZGV4ID09PSBmaXJzdEluZGV4LFxuICAgICAgICAgICAgICAgICAgICBpc0VuZDogc2VyaWVzU2VnLmlzRW5kICYmIChuZXh0SW5kZXggLSAxKSA9PT0gbGFzdEluZGV4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWdzO1xuICAgIH07XG4gICAgcmV0dXJuIERheVRhYmxlTW9kZWw7XG59KCkpO1xuXG52YXIgU2xpY2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNsaWNlcigpIHtcbiAgICAgICAgdGhpcy5zbGljZUJ1c2luZXNzSG91cnMgPSBtZW1vaXplKHRoaXMuX3NsaWNlQnVzaW5lc3NIb3Vycyk7XG4gICAgICAgIHRoaXMuc2xpY2VEYXRlU2VsZWN0aW9uID0gbWVtb2l6ZSh0aGlzLl9zbGljZURhdGVTcGFuKTtcbiAgICAgICAgdGhpcy5zbGljZUV2ZW50U3RvcmUgPSBtZW1vaXplKHRoaXMuX3NsaWNlRXZlbnRTdG9yZSk7XG4gICAgICAgIHRoaXMuc2xpY2VFdmVudERyYWcgPSBtZW1vaXplKHRoaXMuX3NsaWNlSW50ZXJhY3Rpb24pO1xuICAgICAgICB0aGlzLnNsaWNlRXZlbnRSZXNpemUgPSBtZW1vaXplKHRoaXMuX3NsaWNlSW50ZXJhY3Rpb24pO1xuICAgICAgICB0aGlzLmZvcmNlRGF5SWZMaXN0SXRlbSA9IGZhbHNlOyAvLyBoYWNrXG4gICAgfVxuICAgIFNsaWNlci5wcm90b3R5cGUuc2xpY2VQcm9wcyA9IGZ1bmN0aW9uIChwcm9wcywgZGF0ZVByb2ZpbGUsIG5leHREYXlUaHJlc2hvbGQsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGV4dHJhQXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDQ7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgZXh0cmFBcmdzW19pIC0gNF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBldmVudFVpQmFzZXMgPSBwcm9wcy5ldmVudFVpQmFzZXM7XG4gICAgICAgIHZhciBldmVudFNlZ3MgPSB0aGlzLnNsaWNlRXZlbnRTdG9yZS5hcHBseSh0aGlzLCB0c2xpYi5fX3NwcmVhZEFycmF5KFtwcm9wcy5ldmVudFN0b3JlLCBldmVudFVpQmFzZXMsIGRhdGVQcm9maWxlLCBuZXh0RGF5VGhyZXNob2xkXSwgZXh0cmFBcmdzKSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRlU2VsZWN0aW9uU2VnczogdGhpcy5zbGljZURhdGVTZWxlY3Rpb24uYXBwbHkodGhpcywgdHNsaWIuX19zcHJlYWRBcnJheShbcHJvcHMuZGF0ZVNlbGVjdGlvbiwgZXZlbnRVaUJhc2VzLCBjb250ZXh0XSwgZXh0cmFBcmdzKSksXG4gICAgICAgICAgICBidXNpbmVzc0hvdXJTZWdzOiB0aGlzLnNsaWNlQnVzaW5lc3NIb3Vycy5hcHBseSh0aGlzLCB0c2xpYi5fX3NwcmVhZEFycmF5KFtwcm9wcy5idXNpbmVzc0hvdXJzLCBkYXRlUHJvZmlsZSwgbmV4dERheVRocmVzaG9sZCwgY29udGV4dF0sIGV4dHJhQXJncykpLFxuICAgICAgICAgICAgZmdFdmVudFNlZ3M6IGV2ZW50U2Vncy5mZyxcbiAgICAgICAgICAgIGJnRXZlbnRTZWdzOiBldmVudFNlZ3MuYmcsXG4gICAgICAgICAgICBldmVudERyYWc6IHRoaXMuc2xpY2VFdmVudERyYWcuYXBwbHkodGhpcywgdHNsaWIuX19zcHJlYWRBcnJheShbcHJvcHMuZXZlbnREcmFnLCBldmVudFVpQmFzZXMsIGRhdGVQcm9maWxlLCBuZXh0RGF5VGhyZXNob2xkXSwgZXh0cmFBcmdzKSksXG4gICAgICAgICAgICBldmVudFJlc2l6ZTogdGhpcy5zbGljZUV2ZW50UmVzaXplLmFwcGx5KHRoaXMsIHRzbGliLl9fc3ByZWFkQXJyYXkoW3Byb3BzLmV2ZW50UmVzaXplLCBldmVudFVpQmFzZXMsIGRhdGVQcm9maWxlLCBuZXh0RGF5VGhyZXNob2xkXSwgZXh0cmFBcmdzKSksXG4gICAgICAgICAgICBldmVudFNlbGVjdGlvbjogcHJvcHMuZXZlbnRTZWxlY3Rpb24sXG4gICAgICAgIH07IC8vIFRPRE86IGdpdmUgaW50ZXJhY3Rpb25TZWdzP1xuICAgIH07XG4gICAgU2xpY2VyLnByb3RvdHlwZS5zbGljZU5vd0RhdGUgPSBmdW5jdGlvbiAoLy8gZG9lcyBub3QgbWVtb2l6ZVxuICAgIGRhdGUsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGV4dHJhQXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgZXh0cmFBcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zbGljZURhdGVTcGFuLmFwcGx5KHRoaXMsIHRzbGliLl9fc3ByZWFkQXJyYXkoW3sgcmFuZ2U6IHsgc3RhcnQ6IGRhdGUsIGVuZDogYWRkTXMoZGF0ZSwgMSkgfSwgYWxsRGF5OiBmYWxzZSB9LFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBjb250ZXh0XSwgZXh0cmFBcmdzKSk7XG4gICAgfTtcbiAgICBTbGljZXIucHJvdG90eXBlLl9zbGljZUJ1c2luZXNzSG91cnMgPSBmdW5jdGlvbiAoYnVzaW5lc3NIb3VycywgZGF0ZVByb2ZpbGUsIG5leHREYXlUaHJlc2hvbGQsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGV4dHJhQXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDQ7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgZXh0cmFBcmdzW19pIC0gNF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYnVzaW5lc3NIb3Vycykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zbGljZUV2ZW50U3RvcmUuYXBwbHkodGhpcywgdHNsaWIuX19zcHJlYWRBcnJheShbZXhwYW5kUmVjdXJyaW5nKGJ1c2luZXNzSG91cnMsIGNvbXB1dGVBY3RpdmVSYW5nZShkYXRlUHJvZmlsZSwgQm9vbGVhbihuZXh0RGF5VGhyZXNob2xkKSksIGNvbnRleHQpLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBkYXRlUHJvZmlsZSxcbiAgICAgICAgICAgIG5leHREYXlUaHJlc2hvbGRdLCBleHRyYUFyZ3MpKS5iZztcbiAgICB9O1xuICAgIFNsaWNlci5wcm90b3R5cGUuX3NsaWNlRXZlbnRTdG9yZSA9IGZ1bmN0aW9uIChldmVudFN0b3JlLCBldmVudFVpQmFzZXMsIGRhdGVQcm9maWxlLCBuZXh0RGF5VGhyZXNob2xkKSB7XG4gICAgICAgIHZhciBleHRyYUFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSA0OyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGV4dHJhQXJnc1tfaSAtIDRdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnRTdG9yZSkge1xuICAgICAgICAgICAgdmFyIHJhbmdlUmVzID0gc2xpY2VFdmVudFN0b3JlKGV2ZW50U3RvcmUsIGV2ZW50VWlCYXNlcywgY29tcHV0ZUFjdGl2ZVJhbmdlKGRhdGVQcm9maWxlLCBCb29sZWFuKG5leHREYXlUaHJlc2hvbGQpKSwgbmV4dERheVRocmVzaG9sZCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJnOiB0aGlzLnNsaWNlRXZlbnRSYW5nZXMocmFuZ2VSZXMuYmcsIGV4dHJhQXJncyksXG4gICAgICAgICAgICAgICAgZmc6IHRoaXMuc2xpY2VFdmVudFJhbmdlcyhyYW5nZVJlcy5mZywgZXh0cmFBcmdzKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgYmc6IFtdLCBmZzogW10gfTtcbiAgICB9O1xuICAgIFNsaWNlci5wcm90b3R5cGUuX3NsaWNlSW50ZXJhY3Rpb24gPSBmdW5jdGlvbiAoaW50ZXJhY3Rpb24sIGV2ZW50VWlCYXNlcywgZGF0ZVByb2ZpbGUsIG5leHREYXlUaHJlc2hvbGQpIHtcbiAgICAgICAgdmFyIGV4dHJhQXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDQ7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgZXh0cmFBcmdzW19pIC0gNF0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciByYW5nZVJlcyA9IHNsaWNlRXZlbnRTdG9yZShpbnRlcmFjdGlvbi5tdXRhdGVkRXZlbnRzLCBldmVudFVpQmFzZXMsIGNvbXB1dGVBY3RpdmVSYW5nZShkYXRlUHJvZmlsZSwgQm9vbGVhbihuZXh0RGF5VGhyZXNob2xkKSksIG5leHREYXlUaHJlc2hvbGQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2VnczogdGhpcy5zbGljZUV2ZW50UmFuZ2VzKHJhbmdlUmVzLmZnLCBleHRyYUFyZ3MpLFxuICAgICAgICAgICAgYWZmZWN0ZWRJbnN0YW5jZXM6IGludGVyYWN0aW9uLmFmZmVjdGVkRXZlbnRzLmluc3RhbmNlcyxcbiAgICAgICAgICAgIGlzRXZlbnQ6IGludGVyYWN0aW9uLmlzRXZlbnQsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBTbGljZXIucHJvdG90eXBlLl9zbGljZURhdGVTcGFuID0gZnVuY3Rpb24gKGRhdGVTcGFuLCBldmVudFVpQmFzZXMsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGV4dHJhQXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDM7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgZXh0cmFBcmdzW19pIC0gM10gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGF0ZVNwYW4pIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXZlbnRSYW5nZSA9IGZhYnJpY2F0ZUV2ZW50UmFuZ2UoZGF0ZVNwYW4sIGV2ZW50VWlCYXNlcywgY29udGV4dCk7XG4gICAgICAgIHZhciBzZWdzID0gdGhpcy5zbGljZVJhbmdlLmFwcGx5KHRoaXMsIHRzbGliLl9fc3ByZWFkQXJyYXkoW2RhdGVTcGFuLnJhbmdlXSwgZXh0cmFBcmdzKSk7XG4gICAgICAgIGZvciAodmFyIF9hID0gMCwgc2Vnc18xID0gc2VnczsgX2EgPCBzZWdzXzEubGVuZ3RoOyBfYSsrKSB7XG4gICAgICAgICAgICB2YXIgc2VnID0gc2Vnc18xW19hXTtcbiAgICAgICAgICAgIHNlZy5ldmVudFJhbmdlID0gZXZlbnRSYW5nZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VncztcbiAgICB9O1xuICAgIC8qXG4gICAgXCJjb21wbGV0ZVwiIHNlZyBtZWFucyBpdCBoYXMgY29tcG9uZW50IGFuZCBldmVudFJhbmdlXG4gICAgKi9cbiAgICBTbGljZXIucHJvdG90eXBlLnNsaWNlRXZlbnRSYW5nZXMgPSBmdW5jdGlvbiAoZXZlbnRSYW5nZXMsIGV4dHJhQXJncykge1xuICAgICAgICB2YXIgc2VncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGV2ZW50UmFuZ2VzXzEgPSBldmVudFJhbmdlczsgX2kgPCBldmVudFJhbmdlc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIGV2ZW50UmFuZ2UgPSBldmVudFJhbmdlc18xW19pXTtcbiAgICAgICAgICAgIHNlZ3MucHVzaC5hcHBseShzZWdzLCB0aGlzLnNsaWNlRXZlbnRSYW5nZShldmVudFJhbmdlLCBleHRyYUFyZ3MpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VncztcbiAgICB9O1xuICAgIC8qXG4gICAgXCJjb21wbGV0ZVwiIHNlZyBtZWFucyBpdCBoYXMgY29tcG9uZW50IGFuZCBldmVudFJhbmdlXG4gICAgKi9cbiAgICBTbGljZXIucHJvdG90eXBlLnNsaWNlRXZlbnRSYW5nZSA9IGZ1bmN0aW9uIChldmVudFJhbmdlLCBleHRyYUFyZ3MpIHtcbiAgICAgICAgdmFyIGRhdGVSYW5nZSA9IGV2ZW50UmFuZ2UucmFuZ2U7XG4gICAgICAgIC8vIGhhY2sgdG8gbWFrZSBtdWx0aS1kYXkgZXZlbnRzIHRoYXQgYXJlIGJlaW5nIGZvcmNlLWRpc3BsYXllZCBhcyBsaXN0LWl0ZW1zIHRvIHRha2UgdXAgb25seSBvbmUgZGF5XG4gICAgICAgIGlmICh0aGlzLmZvcmNlRGF5SWZMaXN0SXRlbSAmJiBldmVudFJhbmdlLnVpLmRpc3BsYXkgPT09ICdsaXN0LWl0ZW0nKSB7XG4gICAgICAgICAgICBkYXRlUmFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IGRhdGVSYW5nZS5zdGFydCxcbiAgICAgICAgICAgICAgICBlbmQ6IGFkZERheXMoZGF0ZVJhbmdlLnN0YXJ0LCAxKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNlZ3MgPSB0aGlzLnNsaWNlUmFuZ2UuYXBwbHkodGhpcywgdHNsaWIuX19zcHJlYWRBcnJheShbZGF0ZVJhbmdlXSwgZXh0cmFBcmdzKSk7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgc2Vnc18yID0gc2VnczsgX2kgPCBzZWdzXzIubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgc2VnID0gc2Vnc18yW19pXTtcbiAgICAgICAgICAgIHNlZy5ldmVudFJhbmdlID0gZXZlbnRSYW5nZTtcbiAgICAgICAgICAgIHNlZy5pc1N0YXJ0ID0gZXZlbnRSYW5nZS5pc1N0YXJ0ICYmIHNlZy5pc1N0YXJ0O1xuICAgICAgICAgICAgc2VnLmlzRW5kID0gZXZlbnRSYW5nZS5pc0VuZCAmJiBzZWcuaXNFbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlZ3M7XG4gICAgfTtcbiAgICByZXR1cm4gU2xpY2VyO1xufSgpKTtcbi8qXG5mb3IgaW5jb3Jwb3JhdGluZyBzbG90TWluVGltZS9zbG90TWF4VGltZSBpZiBhcHByb3ByaWF0ZVxuVE9ETzogc2hvdWxkIGJlIHBhcnQgb2YgRGF0ZVByb2ZpbGUhXG5UaW1lbGluZURhdGVQcm9maWxlIGFscmVhZHkgZG9lcyB0aGlzIGJ0d1xuKi9cbmZ1bmN0aW9uIGNvbXB1dGVBY3RpdmVSYW5nZShkYXRlUHJvZmlsZSwgaXNDb21wb25lbnRBbGxEYXkpIHtcbiAgICB2YXIgcmFuZ2UgPSBkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZTtcbiAgICBpZiAoaXNDb21wb25lbnRBbGxEYXkpIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogYWRkTXMocmFuZ2Uuc3RhcnQsIGRhdGVQcm9maWxlLnNsb3RNaW5UaW1lLm1pbGxpc2Vjb25kcyksXG4gICAgICAgIGVuZDogYWRkTXMocmFuZ2UuZW5kLCBkYXRlUHJvZmlsZS5zbG90TWF4VGltZS5taWxsaXNlY29uZHMgLSA4NjRlNSksIC8vIDg2NGU1ID0gbXMgaW4gYSBkYXlcbiAgICB9O1xufVxuXG4vLyBoaWdoLWxldmVsIHNlZ21lbnRpbmctYXdhcmUgdGVzdGVyIGZ1bmN0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBpc0ludGVyYWN0aW9uVmFsaWQoaW50ZXJhY3Rpb24sIGRhdGVQcm9maWxlLCBjb250ZXh0KSB7XG4gICAgdmFyIGluc3RhbmNlcyA9IGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHMuaW5zdGFuY2VzO1xuICAgIGZvciAodmFyIGluc3RhbmNlSWQgaW4gaW5zdGFuY2VzKSB7XG4gICAgICAgIGlmICghcmFuZ2VDb250YWluc1JhbmdlKGRhdGVQcm9maWxlLnZhbGlkUmFuZ2UsIGluc3RhbmNlc1tpbnN0YW5jZUlkXS5yYW5nZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNOZXdQcm9wc1ZhbGlkKHsgZXZlbnREcmFnOiBpbnRlcmFjdGlvbiB9LCBjb250ZXh0KTsgLy8gSEFDSzogdGhlIGV2ZW50RHJhZyBwcm9wcyBpcyB1c2VkIGZvciBBTEwgaW50ZXJhY3Rpb25zXG59XG5mdW5jdGlvbiBpc0RhdGVTZWxlY3Rpb25WYWxpZChkYXRlU2VsZWN0aW9uLCBkYXRlUHJvZmlsZSwgY29udGV4dCkge1xuICAgIGlmICghcmFuZ2VDb250YWluc1JhbmdlKGRhdGVQcm9maWxlLnZhbGlkUmFuZ2UsIGRhdGVTZWxlY3Rpb24ucmFuZ2UpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzTmV3UHJvcHNWYWxpZCh7IGRhdGVTZWxlY3Rpb246IGRhdGVTZWxlY3Rpb24gfSwgY29udGV4dCk7XG59XG5mdW5jdGlvbiBpc05ld1Byb3BzVmFsaWQobmV3UHJvcHMsIGNvbnRleHQpIHtcbiAgICB2YXIgY2FsZW5kYXJTdGF0ZSA9IGNvbnRleHQuZ2V0Q3VycmVudERhdGEoKTtcbiAgICB2YXIgcHJvcHMgPSB0c2xpYi5fX2Fzc2lnbih7IGJ1c2luZXNzSG91cnM6IGNhbGVuZGFyU3RhdGUuYnVzaW5lc3NIb3VycywgZGF0ZVNlbGVjdGlvbjogJycsIGV2ZW50U3RvcmU6IGNhbGVuZGFyU3RhdGUuZXZlbnRTdG9yZSwgZXZlbnRVaUJhc2VzOiBjYWxlbmRhclN0YXRlLmV2ZW50VWlCYXNlcywgZXZlbnRTZWxlY3Rpb246ICcnLCBldmVudERyYWc6IG51bGwsIGV2ZW50UmVzaXplOiBudWxsIH0sIG5ld1Byb3BzKTtcbiAgICByZXR1cm4gKGNvbnRleHQucGx1Z2luSG9va3MuaXNQcm9wc1ZhbGlkIHx8IGlzUHJvcHNWYWxpZCkocHJvcHMsIGNvbnRleHQpO1xufVxuZnVuY3Rpb24gaXNQcm9wc1ZhbGlkKHN0YXRlLCBjb250ZXh0LCBkYXRlU3Bhbk1ldGEsIGZpbHRlckNvbmZpZykge1xuICAgIGlmIChkYXRlU3Bhbk1ldGEgPT09IHZvaWQgMCkgeyBkYXRlU3Bhbk1ldGEgPSB7fTsgfVxuICAgIGlmIChzdGF0ZS5ldmVudERyYWcgJiYgIWlzSW50ZXJhY3Rpb25Qcm9wc1ZhbGlkKHN0YXRlLCBjb250ZXh0LCBkYXRlU3Bhbk1ldGEsIGZpbHRlckNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuZGF0ZVNlbGVjdGlvbiAmJiAhaXNEYXRlU2VsZWN0aW9uUHJvcHNWYWxpZChzdGF0ZSwgY29udGV4dCwgZGF0ZVNwYW5NZXRhLCBmaWx0ZXJDb25maWcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBNb3ZpbmcgRXZlbnQgVmFsaWRhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBpc0ludGVyYWN0aW9uUHJvcHNWYWxpZChzdGF0ZSwgY29udGV4dCwgZGF0ZVNwYW5NZXRhLCBmaWx0ZXJDb25maWcpIHtcbiAgICB2YXIgY3VycmVudFN0YXRlID0gY29udGV4dC5nZXRDdXJyZW50RGF0YSgpO1xuICAgIHZhciBpbnRlcmFjdGlvbiA9IHN0YXRlLmV2ZW50RHJhZzsgLy8gSEFDSzogdGhlIGV2ZW50RHJhZyBwcm9wcyBpcyB1c2VkIGZvciBBTEwgaW50ZXJhY3Rpb25zXG4gICAgdmFyIHN1YmplY3RFdmVudFN0b3JlID0gaW50ZXJhY3Rpb24ubXV0YXRlZEV2ZW50cztcbiAgICB2YXIgc3ViamVjdERlZnMgPSBzdWJqZWN0RXZlbnRTdG9yZS5kZWZzO1xuICAgIHZhciBzdWJqZWN0SW5zdGFuY2VzID0gc3ViamVjdEV2ZW50U3RvcmUuaW5zdGFuY2VzO1xuICAgIHZhciBzdWJqZWN0Q29uZmlncyA9IGNvbXBpbGVFdmVudFVpcyhzdWJqZWN0RGVmcywgaW50ZXJhY3Rpb24uaXNFdmVudCA/XG4gICAgICAgIHN0YXRlLmV2ZW50VWlCYXNlcyA6XG4gICAgICAgIHsgJyc6IGN1cnJlbnRTdGF0ZS5zZWxlY3Rpb25Db25maWcgfSk7XG4gICAgaWYgKGZpbHRlckNvbmZpZykge1xuICAgICAgICBzdWJqZWN0Q29uZmlncyA9IG1hcEhhc2goc3ViamVjdENvbmZpZ3MsIGZpbHRlckNvbmZpZyk7XG4gICAgfVxuICAgIC8vIGV4Y2x1ZGUgdGhlIHN1YmplY3QgZXZlbnRzLiBUT0RPOiBleGNsdWRlIGRlZnMgdG9vP1xuICAgIHZhciBvdGhlckV2ZW50U3RvcmUgPSBleGNsdWRlSW5zdGFuY2VzKHN0YXRlLmV2ZW50U3RvcmUsIGludGVyYWN0aW9uLmFmZmVjdGVkRXZlbnRzLmluc3RhbmNlcyk7XG4gICAgdmFyIG90aGVyRGVmcyA9IG90aGVyRXZlbnRTdG9yZS5kZWZzO1xuICAgIHZhciBvdGhlckluc3RhbmNlcyA9IG90aGVyRXZlbnRTdG9yZS5pbnN0YW5jZXM7XG4gICAgdmFyIG90aGVyQ29uZmlncyA9IGNvbXBpbGVFdmVudFVpcyhvdGhlckRlZnMsIHN0YXRlLmV2ZW50VWlCYXNlcyk7XG4gICAgZm9yICh2YXIgc3ViamVjdEluc3RhbmNlSWQgaW4gc3ViamVjdEluc3RhbmNlcykge1xuICAgICAgICB2YXIgc3ViamVjdEluc3RhbmNlID0gc3ViamVjdEluc3RhbmNlc1tzdWJqZWN0SW5zdGFuY2VJZF07XG4gICAgICAgIHZhciBzdWJqZWN0UmFuZ2UgPSBzdWJqZWN0SW5zdGFuY2UucmFuZ2U7XG4gICAgICAgIHZhciBzdWJqZWN0Q29uZmlnID0gc3ViamVjdENvbmZpZ3Nbc3ViamVjdEluc3RhbmNlLmRlZklkXTtcbiAgICAgICAgdmFyIHN1YmplY3REZWYgPSBzdWJqZWN0RGVmc1tzdWJqZWN0SW5zdGFuY2UuZGVmSWRdO1xuICAgICAgICAvLyBjb25zdHJhaW50XG4gICAgICAgIGlmICghYWxsQ29uc3RyYWludHNQYXNzKHN1YmplY3RDb25maWcuY29uc3RyYWludHMsIHN1YmplY3RSYW5nZSwgb3RoZXJFdmVudFN0b3JlLCBzdGF0ZS5idXNpbmVzc0hvdXJzLCBjb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIG92ZXJsYXBcbiAgICAgICAgdmFyIGV2ZW50T3ZlcmxhcCA9IGNvbnRleHQub3B0aW9ucy5ldmVudE92ZXJsYXA7XG4gICAgICAgIHZhciBldmVudE92ZXJsYXBGdW5jID0gdHlwZW9mIGV2ZW50T3ZlcmxhcCA9PT0gJ2Z1bmN0aW9uJyA/IGV2ZW50T3ZlcmxhcCA6IG51bGw7XG4gICAgICAgIGZvciAodmFyIG90aGVySW5zdGFuY2VJZCBpbiBvdGhlckluc3RhbmNlcykge1xuICAgICAgICAgICAgdmFyIG90aGVySW5zdGFuY2UgPSBvdGhlckluc3RhbmNlc1tvdGhlckluc3RhbmNlSWRdO1xuICAgICAgICAgICAgLy8gaW50ZXJzZWN0ISBldmFsdWF0ZVxuICAgICAgICAgICAgaWYgKHJhbmdlc0ludGVyc2VjdChzdWJqZWN0UmFuZ2UsIG90aGVySW5zdGFuY2UucmFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG90aGVyT3ZlcmxhcCA9IG90aGVyQ29uZmlnc1tvdGhlckluc3RhbmNlLmRlZklkXS5vdmVybGFwO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyIHRoZSBvdGhlciBldmVudCdzIG92ZXJsYXAuIG9ubHkgZG8gdGhpcyBpZiB0aGUgc3ViamVjdCBldmVudCBpcyBhIFwicmVhbFwiIGV2ZW50XG4gICAgICAgICAgICAgICAgaWYgKG90aGVyT3ZlcmxhcCA9PT0gZmFsc2UgJiYgaW50ZXJhY3Rpb24uaXNFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0Q29uZmlnLm92ZXJsYXAgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50T3ZlcmxhcEZ1bmMgJiYgIWV2ZW50T3ZlcmxhcEZ1bmMobmV3IEV2ZW50QXBpKGNvbnRleHQsIG90aGVyRGVmc1tvdGhlckluc3RhbmNlLmRlZklkXSwgb3RoZXJJbnN0YW5jZSksIC8vIHN0aWxsIGV2ZW50XG4gICAgICAgICAgICAgICAgbmV3IEV2ZW50QXBpKGNvbnRleHQsIHN1YmplY3REZWYsIHN1YmplY3RJbnN0YW5jZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gYWxsb3cgKGEgZnVuY3Rpb24pXG4gICAgICAgIHZhciBjYWxlbmRhckV2ZW50U3RvcmUgPSBjdXJyZW50U3RhdGUuZXZlbnRTdG9yZTsgLy8gbmVlZCBnbG9iYWwtdG8tY2FsZW5kYXIsIG5vdCBsb2NhbCB0byBjb21wb25lbnQgKHNwbGl0dGFibGUpc3RhdGVcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHN1YmplY3RDb25maWcuYWxsb3dzOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIHN1YmplY3RBbGxvdyA9IF9hW19pXTtcbiAgICAgICAgICAgIHZhciBzdWJqZWN0RGF0ZVNwYW4gPSB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgZGF0ZVNwYW5NZXRhKSwgeyByYW5nZTogc3ViamVjdEluc3RhbmNlLnJhbmdlLCBhbGxEYXk6IHN1YmplY3REZWYuYWxsRGF5IH0pO1xuICAgICAgICAgICAgdmFyIG9yaWdEZWYgPSBjYWxlbmRhckV2ZW50U3RvcmUuZGVmc1tzdWJqZWN0RGVmLmRlZklkXTtcbiAgICAgICAgICAgIHZhciBvcmlnSW5zdGFuY2UgPSBjYWxlbmRhckV2ZW50U3RvcmUuaW5zdGFuY2VzW3N1YmplY3RJbnN0YW5jZUlkXTtcbiAgICAgICAgICAgIHZhciBldmVudEFwaSA9IHZvaWQgMDtcbiAgICAgICAgICAgIGlmIChvcmlnRGVmKSB7IC8vIHdhcyBwcmV2aW91c2x5IGluIHRoZSBjYWxlbmRhclxuICAgICAgICAgICAgICAgIGV2ZW50QXBpID0gbmV3IEV2ZW50QXBpKGNvbnRleHQsIG9yaWdEZWYsIG9yaWdJbnN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgLy8gd2FzIGFuIGV4dGVybmFsIGV2ZW50XG4gICAgICAgICAgICAgICAgZXZlbnRBcGkgPSBuZXcgRXZlbnRBcGkoY29udGV4dCwgc3ViamVjdERlZik7IC8vIG5vIGluc3RhbmNlLCBiZWNhdXNlIGhhZCBubyBkYXRlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzdWJqZWN0QWxsb3coYnVpbGREYXRlU3BhbkFwaVdpdGhDb250ZXh0KHN1YmplY3REYXRlU3BhbiwgY29udGV4dCksIGV2ZW50QXBpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIERhdGUgU2VsZWN0aW9uIFZhbGlkYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gaXNEYXRlU2VsZWN0aW9uUHJvcHNWYWxpZChzdGF0ZSwgY29udGV4dCwgZGF0ZVNwYW5NZXRhLCBmaWx0ZXJDb25maWcpIHtcbiAgICB2YXIgcmVsZXZhbnRFdmVudFN0b3JlID0gc3RhdGUuZXZlbnRTdG9yZTtcbiAgICB2YXIgcmVsZXZhbnREZWZzID0gcmVsZXZhbnRFdmVudFN0b3JlLmRlZnM7XG4gICAgdmFyIHJlbGV2YW50SW5zdGFuY2VzID0gcmVsZXZhbnRFdmVudFN0b3JlLmluc3RhbmNlcztcbiAgICB2YXIgc2VsZWN0aW9uID0gc3RhdGUuZGF0ZVNlbGVjdGlvbjtcbiAgICB2YXIgc2VsZWN0aW9uUmFuZ2UgPSBzZWxlY3Rpb24ucmFuZ2U7XG4gICAgdmFyIHNlbGVjdGlvbkNvbmZpZyA9IGNvbnRleHQuZ2V0Q3VycmVudERhdGEoKS5zZWxlY3Rpb25Db25maWc7XG4gICAgaWYgKGZpbHRlckNvbmZpZykge1xuICAgICAgICBzZWxlY3Rpb25Db25maWcgPSBmaWx0ZXJDb25maWcoc2VsZWN0aW9uQ29uZmlnKTtcbiAgICB9XG4gICAgLy8gY29uc3RyYWludFxuICAgIGlmICghYWxsQ29uc3RyYWludHNQYXNzKHNlbGVjdGlvbkNvbmZpZy5jb25zdHJhaW50cywgc2VsZWN0aW9uUmFuZ2UsIHJlbGV2YW50RXZlbnRTdG9yZSwgc3RhdGUuYnVzaW5lc3NIb3VycywgY29udGV4dCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBvdmVybGFwXG4gICAgdmFyIHNlbGVjdE92ZXJsYXAgPSBjb250ZXh0Lm9wdGlvbnMuc2VsZWN0T3ZlcmxhcDtcbiAgICB2YXIgc2VsZWN0T3ZlcmxhcEZ1bmMgPSB0eXBlb2Ygc2VsZWN0T3ZlcmxhcCA9PT0gJ2Z1bmN0aW9uJyA/IHNlbGVjdE92ZXJsYXAgOiBudWxsO1xuICAgIGZvciAodmFyIHJlbGV2YW50SW5zdGFuY2VJZCBpbiByZWxldmFudEluc3RhbmNlcykge1xuICAgICAgICB2YXIgcmVsZXZhbnRJbnN0YW5jZSA9IHJlbGV2YW50SW5zdGFuY2VzW3JlbGV2YW50SW5zdGFuY2VJZF07XG4gICAgICAgIC8vIGludGVyc2VjdCEgZXZhbHVhdGVcbiAgICAgICAgaWYgKHJhbmdlc0ludGVyc2VjdChzZWxlY3Rpb25SYW5nZSwgcmVsZXZhbnRJbnN0YW5jZS5yYW5nZSkpIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb25Db25maWcub3ZlcmxhcCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VsZWN0T3ZlcmxhcEZ1bmMgJiYgIXNlbGVjdE92ZXJsYXBGdW5jKG5ldyBFdmVudEFwaShjb250ZXh0LCByZWxldmFudERlZnNbcmVsZXZhbnRJbnN0YW5jZS5kZWZJZF0sIHJlbGV2YW50SW5zdGFuY2UpLCBudWxsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBhbGxvdyAoYSBmdW5jdGlvbilcbiAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gc2VsZWN0aW9uQ29uZmlnLmFsbG93czsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHNlbGVjdGlvbkFsbG93ID0gX2FbX2ldO1xuICAgICAgICB2YXIgZnVsbERhdGVTcGFuID0gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGRhdGVTcGFuTWV0YSksIHNlbGVjdGlvbik7XG4gICAgICAgIGlmICghc2VsZWN0aW9uQWxsb3coYnVpbGREYXRlU3BhbkFwaVdpdGhDb250ZXh0KGZ1bGxEYXRlU3BhbiwgY29udGV4dCksIG51bGwpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBDb25zdHJhaW50IFV0aWxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGFsbENvbnN0cmFpbnRzUGFzcyhjb25zdHJhaW50cywgc3ViamVjdFJhbmdlLCBvdGhlckV2ZW50U3RvcmUsIGJ1c2luZXNzSG91cnNVbmV4cGFuZGVkLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgX2kgPSAwLCBjb25zdHJhaW50c18xID0gY29uc3RyYWludHM7IF9pIDwgY29uc3RyYWludHNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGNvbnN0cmFpbnQgPSBjb25zdHJhaW50c18xW19pXTtcbiAgICAgICAgaWYgKCFhbnlSYW5nZXNDb250YWluUmFuZ2UoY29uc3RyYWludFRvUmFuZ2VzKGNvbnN0cmFpbnQsIHN1YmplY3RSYW5nZSwgb3RoZXJFdmVudFN0b3JlLCBidXNpbmVzc0hvdXJzVW5leHBhbmRlZCwgY29udGV4dCksIHN1YmplY3RSYW5nZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGNvbnN0cmFpbnRUb1Jhbmdlcyhjb25zdHJhaW50LCBzdWJqZWN0UmFuZ2UsIC8vIGZvciBleHBhbmRpbmcgYSByZWN1cnJpbmcgY29uc3RyYWludCwgb3IgZXhwYW5kaW5nIGJ1c2luZXNzIGhvdXJzXG5vdGhlckV2ZW50U3RvcmUsIC8vIGZvciBpZiBjb25zdHJhaW50IGlzIGFuIGV2ZW4gZ3JvdXAgSURcbmJ1c2luZXNzSG91cnNVbmV4cGFuZGVkLCAvLyBmb3IgaWYgY29uc3RyYWludCBpcyAnYnVzaW5lc3NIb3VycydcbmNvbnRleHQpIHtcbiAgICBpZiAoY29uc3RyYWludCA9PT0gJ2J1c2luZXNzSG91cnMnKSB7XG4gICAgICAgIHJldHVybiBldmVudFN0b3JlVG9SYW5nZXMoZXhwYW5kUmVjdXJyaW5nKGJ1c2luZXNzSG91cnNVbmV4cGFuZGVkLCBzdWJqZWN0UmFuZ2UsIGNvbnRleHQpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25zdHJhaW50ID09PSAnc3RyaW5nJykgeyAvLyBhbiBncm91cCBJRFxuICAgICAgICByZXR1cm4gZXZlbnRTdG9yZVRvUmFuZ2VzKGZpbHRlckV2ZW50U3RvcmVEZWZzKG90aGVyRXZlbnRTdG9yZSwgZnVuY3Rpb24gKGV2ZW50RGVmKSB7IHJldHVybiBldmVudERlZi5ncm91cElkID09PSBjb25zdHJhaW50OyB9KSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29uc3RyYWludCA9PT0gJ29iamVjdCcgJiYgY29uc3RyYWludCkgeyAvLyBub24tbnVsbCBvYmplY3RcbiAgICAgICAgcmV0dXJuIGV2ZW50U3RvcmVUb1JhbmdlcyhleHBhbmRSZWN1cnJpbmcoY29uc3RyYWludCwgc3ViamVjdFJhbmdlLCBjb250ZXh0KSk7XG4gICAgfVxuICAgIHJldHVybiBbXTsgLy8gaWYgaXQncyBmYWxzZVxufVxuLy8gVE9ETzogbW92ZSB0byBldmVudC1zdG9yZSBmaWxlP1xuZnVuY3Rpb24gZXZlbnRTdG9yZVRvUmFuZ2VzKGV2ZW50U3RvcmUpIHtcbiAgICB2YXIgaW5zdGFuY2VzID0gZXZlbnRTdG9yZS5pbnN0YW5jZXM7XG4gICAgdmFyIHJhbmdlcyA9IFtdO1xuICAgIGZvciAodmFyIGluc3RhbmNlSWQgaW4gaW5zdGFuY2VzKSB7XG4gICAgICAgIHJhbmdlcy5wdXNoKGluc3RhbmNlc1tpbnN0YW5jZUlkXS5yYW5nZSk7XG4gICAgfVxuICAgIHJldHVybiByYW5nZXM7XG59XG4vLyBUT0RPOiBtb3ZlIHRvIGdlb20gZmlsZT9cbmZ1bmN0aW9uIGFueVJhbmdlc0NvbnRhaW5SYW5nZShvdXRlclJhbmdlcywgaW5uZXJSYW5nZSkge1xuICAgIGZvciAodmFyIF9pID0gMCwgb3V0ZXJSYW5nZXNfMSA9IG91dGVyUmFuZ2VzOyBfaSA8IG91dGVyUmFuZ2VzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBvdXRlclJhbmdlID0gb3V0ZXJSYW5nZXNfMVtfaV07XG4gICAgICAgIGlmIChyYW5nZUNvbnRhaW5zUmFuZ2Uob3V0ZXJSYW5nZSwgaW5uZXJSYW5nZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxudmFyIFZJU0lCTEVfSElEREVOX1JFID0gL14odmlzaWJsZXxoaWRkZW4pJC87XG52YXIgU2Nyb2xsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFNjcm9sbGVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFNjcm9sbGVyKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuaGFuZGxlRWwgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIF90aGlzLmVsID0gZWw7XG4gICAgICAgICAgICBzZXRSZWYoX3RoaXMucHJvcHMuZWxSZWYsIGVsKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBTY3JvbGxlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgbGlxdWlkID0gcHJvcHMubGlxdWlkLCBsaXF1aWRJc0Fic29sdXRlID0gcHJvcHMubGlxdWlkSXNBYnNvbHV0ZTtcbiAgICAgICAgdmFyIGlzQWJzb2x1dGUgPSBsaXF1aWQgJiYgbGlxdWlkSXNBYnNvbHV0ZTtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IFsnZmMtc2Nyb2xsZXInXTtcbiAgICAgICAgaWYgKGxpcXVpZCkge1xuICAgICAgICAgICAgaWYgKGxpcXVpZElzQWJzb2x1dGUpIHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWUucHVzaCgnZmMtc2Nyb2xsZXItbGlxdWlkLWFic29sdXRlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWUucHVzaCgnZmMtc2Nyb2xsZXItbGlxdWlkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgcmVmOiB0aGlzLmhhbmRsZUVsLCBjbGFzc05hbWU6IGNsYXNzTmFtZS5qb2luKCcgJyksIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3dYOiBwcm9wcy5vdmVyZmxvd1gsXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3dZOiBwcm9wcy5vdmVyZmxvd1ksXG4gICAgICAgICAgICAgICAgbGVmdDogKGlzQWJzb2x1dGUgJiYgLShwcm9wcy5vdmVyY29tZUxlZnQgfHwgMCkpIHx8ICcnLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiAoaXNBYnNvbHV0ZSAmJiAtKHByb3BzLm92ZXJjb21lUmlnaHQgfHwgMCkpIHx8ICcnLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogKGlzQWJzb2x1dGUgJiYgLShwcm9wcy5vdmVyY29tZUJvdHRvbSB8fCAwKSkgfHwgJycsXG4gICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogKCFpc0Fic29sdXRlICYmIC0ocHJvcHMub3ZlcmNvbWVMZWZ0IHx8IDApKSB8fCAnJyxcbiAgICAgICAgICAgICAgICBtYXJnaW5SaWdodDogKCFpc0Fic29sdXRlICYmIC0ocHJvcHMub3ZlcmNvbWVSaWdodCB8fCAwKSkgfHwgJycsXG4gICAgICAgICAgICAgICAgbWFyZ2luQm90dG9tOiAoIWlzQWJzb2x1dGUgJiYgLShwcm9wcy5vdmVyY29tZUJvdHRvbSB8fCAwKSkgfHwgJycsXG4gICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiBwcm9wcy5tYXhIZWlnaHQgfHwgJycsXG4gICAgICAgICAgICB9IH0sIHByb3BzLmNoaWxkcmVuKSk7XG4gICAgfTtcbiAgICBTY3JvbGxlci5wcm90b3R5cGUubmVlZHNYU2Nyb2xsaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoVklTSUJMRV9ISURERU5fUkUudGVzdCh0aGlzLnByb3BzLm92ZXJmbG93WCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0ZXN0aW5nIHNjcm9sbFdpZHRoPmNsaWVudFdpZHRoIGlzIHVucmVsaWFibGUgY3Jvc3MtYnJvd3NlciB3aGVuIHBpeGVsIGhlaWdodHMgYXJlbid0IGludGVnZXJzLlxuICAgICAgICAvLyBtdWNoIG1vcmUgcmVsaWFibGUgdG8gc2VlIGlmIGNoaWxkcmVuIGFyZSB0YWxsZXIgdGhhbiB0aGUgc2Nyb2xsZXIsIGV2ZW4gdGhvIGRvZXNuJ3QgYWNjb3VudCBmb3JcbiAgICAgICAgLy8gaW5uZXItY2hpbGQgbWFyZ2lucyBhbmQgYWJzb2x1dGUgcG9zaXRpb25pbmdcbiAgICAgICAgdmFyIGVsID0gdGhpcy5lbDtcbiAgICAgICAgdmFyIHJlYWxDbGllbnRXaWR0aCA9IHRoaXMuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSB0aGlzLmdldFlTY3JvbGxiYXJXaWR0aCgpO1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBlbC5jaGlsZHJlbjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgdmFyIGNoaWxkRWwgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChjaGlsZEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoID4gcmVhbENsaWVudFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgU2Nyb2xsZXIucHJvdG90eXBlLm5lZWRzWVNjcm9sbGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKFZJU0lCTEVfSElEREVOX1JFLnRlc3QodGhpcy5wcm9wcy5vdmVyZmxvd1kpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGVzdGluZyBzY3JvbGxIZWlnaHQ+Y2xpZW50SGVpZ2h0IGlzIHVucmVsaWFibGUgY3Jvc3MtYnJvd3NlciB3aGVuIHBpeGVsIGhlaWdodHMgYXJlbid0IGludGVnZXJzLlxuICAgICAgICAvLyBtdWNoIG1vcmUgcmVsaWFibGUgdG8gc2VlIGlmIGNoaWxkcmVuIGFyZSB0YWxsZXIgdGhhbiB0aGUgc2Nyb2xsZXIsIGV2ZW4gdGhvIGRvZXNuJ3QgYWNjb3VudCBmb3JcbiAgICAgICAgLy8gaW5uZXItY2hpbGQgbWFyZ2lucyBhbmQgYWJzb2x1dGUgcG9zaXRpb25pbmdcbiAgICAgICAgdmFyIGVsID0gdGhpcy5lbDtcbiAgICAgICAgdmFyIHJlYWxDbGllbnRIZWlnaHQgPSB0aGlzLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCAtIHRoaXMuZ2V0WFNjcm9sbGJhcldpZHRoKCk7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IGVsLmNoaWxkcmVuO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRFbCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGNoaWxkRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ID4gcmVhbENsaWVudEhlaWdodCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIFNjcm9sbGVyLnByb3RvdHlwZS5nZXRYU2Nyb2xsYmFyV2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChWSVNJQkxFX0hJRERFTl9SRS50ZXN0KHRoaXMucHJvcHMub3ZlcmZsb3dYKSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZWwub2Zmc2V0SGVpZ2h0IC0gdGhpcy5lbC5jbGllbnRIZWlnaHQ7IC8vIG9ubHkgd29ya3MgYmVjYXVzZSB3ZSBndWFyYW50ZWUgbm8gYm9yZGVycy4gVE9ETzogYWRkIHRvIENTUyB3aXRoIGltcG9ydGFudD9cbiAgICB9O1xuICAgIFNjcm9sbGVyLnByb3RvdHlwZS5nZXRZU2Nyb2xsYmFyV2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChWSVNJQkxFX0hJRERFTl9SRS50ZXN0KHRoaXMucHJvcHMub3ZlcmZsb3dZKSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZWwub2Zmc2V0V2lkdGggLSB0aGlzLmVsLmNsaWVudFdpZHRoOyAvLyBvbmx5IHdvcmtzIGJlY2F1c2Ugd2UgZ3VhcmFudGVlIG5vIGJvcmRlcnMuIFRPRE86IGFkZCB0byBDU1Mgd2l0aCBpbXBvcnRhbnQ/XG4gICAgfTtcbiAgICByZXR1cm4gU2Nyb2xsZXI7XG59KEJhc2VDb21wb25lbnQpKTtcblxuLypcblRPRE86IHNvbWVob3cgaW5mZXIgT3RoZXJBcmdzIGZyb20gbWFzdGVyQ2FsbGJhY2s/XG5UT0RPOiBpbmZlciBSZWZUeXBlIGZyb20gbWFzdGVyQ2FsbGJhY2sgaWYgcHJvdmlkZWRcbiovXG52YXIgUmVmTWFwID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlZk1hcChtYXN0ZXJDYWxsYmFjaykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLm1hc3RlckNhbGxiYWNrID0gbWFzdGVyQ2FsbGJhY2s7XG4gICAgICAgIHRoaXMuY3VycmVudE1hcCA9IHt9O1xuICAgICAgICB0aGlzLmRlcHRocyA9IHt9O1xuICAgICAgICB0aGlzLmNhbGxiYWNrTWFwID0ge307XG4gICAgICAgIHRoaXMuaGFuZGxlVmFsdWUgPSBmdW5jdGlvbiAodmFsLCBrZXkpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IF90aGlzLCBkZXB0aHMgPSBfYS5kZXB0aHMsIGN1cnJlbnRNYXAgPSBfYS5jdXJyZW50TWFwO1xuICAgICAgICAgICAgdmFyIHJlbW92ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBhZGRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHZhbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBidWcuLi4gQUNUVUFMTFk6IGNhbiBwcm9iYWJseSBkbyBhd2F5IHdpdGggdGhpcyBub3cgdGhhdCBjYWxsZXJzIGRvbid0IHNoYXJlIG51bWVyaWMgaW5kaWNlcyBhbnltb3JlXG4gICAgICAgICAgICAgICAgcmVtb3ZlZCA9IChrZXkgaW4gY3VycmVudE1hcCk7XG4gICAgICAgICAgICAgICAgY3VycmVudE1hcFtrZXldID0gdmFsO1xuICAgICAgICAgICAgICAgIGRlcHRoc1trZXldID0gKGRlcHRoc1trZXldIHx8IDApICsgMTtcbiAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZXB0aHNba2V5XSAtPSAxO1xuICAgICAgICAgICAgICAgIGlmICghZGVwdGhzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGN1cnJlbnRNYXBba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIF90aGlzLmNhbGxiYWNrTWFwW2tleV07XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfdGhpcy5tYXN0ZXJDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm1hc3RlckNhbGxiYWNrKG51bGwsIFN0cmluZyhrZXkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFkZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm1hc3RlckNhbGxiYWNrKHZhbCwgU3RyaW5nKGtleSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgUmVmTWFwLnByb3RvdHlwZS5jcmVhdGVSZWYgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciByZWZDYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tNYXBba2V5XTtcbiAgICAgICAgaWYgKCFyZWZDYWxsYmFjaykge1xuICAgICAgICAgICAgcmVmQ2FsbGJhY2sgPSB0aGlzLmNhbGxiYWNrTWFwW2tleV0gPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuaGFuZGxlVmFsdWUodmFsLCBTdHJpbmcoa2V5KSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWZDYWxsYmFjaztcbiAgICB9O1xuICAgIC8vIFRPRE86IGNoZWNrIGNhbGxlcnMgdGhhdCBkb24ndCBjYXJlIGFib3V0IG9yZGVyLiBzaG91bGQgdXNlIGdldEFsbCBpbnN0ZWFkXG4gICAgLy8gTk9URTogdGhpcyBtZXRob2QgaGFzIGJlY29tZSBsZXNzIHZhbHVhYmxlIG5vdyB0aGF0IHdlIGFyZSBlbmNvdXJhZ2VkIHRvIG1hcCBvcmRlciBieSBzb21lIG90aGVyIGluZGV4XG4gICAgLy8gVE9ETzogcHJvdmlkZSBPTkUgYXJyYXktZXhwb3J0IGZ1bmN0aW9uLCBidWlsZEFycmF5LCB3aGljaCBmYWlscyBvbiBub24tbnVtZXJpYyBpbmRleGVzLiBjYWxsZXIgY2FuIG1hbmlwdWxhdGUgYW5kIFwiY29sbGVjdFwiXG4gICAgUmVmTWFwLnByb3RvdHlwZS5jb2xsZWN0ID0gZnVuY3Rpb24gKHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBzdGVwKSB7XG4gICAgICAgIHJldHVybiBjb2xsZWN0RnJvbUhhc2godGhpcy5jdXJyZW50TWFwLCBzdGFydEluZGV4LCBlbmRJbmRleCwgc3RlcCk7XG4gICAgfTtcbiAgICBSZWZNYXAucHJvdG90eXBlLmdldEFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGhhc2hWYWx1ZXNUb0FycmF5KHRoaXMuY3VycmVudE1hcCk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVmTWFwO1xufSgpKTtcblxuZnVuY3Rpb24gY29tcHV0ZVNocmlua1dpZHRoKGNodW5rRWxzKSB7XG4gICAgdmFyIHNocmlua0NlbGxzID0gZmluZEVsZW1lbnRzKGNodW5rRWxzLCAnLmZjLXNjcm9sbGdyaWQtc2hyaW5rJyk7XG4gICAgdmFyIGxhcmdlc3RXaWR0aCA9IDA7XG4gICAgZm9yICh2YXIgX2kgPSAwLCBzaHJpbmtDZWxsc18xID0gc2hyaW5rQ2VsbHM7IF9pIDwgc2hyaW5rQ2VsbHNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHNocmlua0NlbGwgPSBzaHJpbmtDZWxsc18xW19pXTtcbiAgICAgICAgbGFyZ2VzdFdpZHRoID0gTWF0aC5tYXgobGFyZ2VzdFdpZHRoLCBjb21wdXRlU21hbGxlc3RDZWxsV2lkdGgoc2hyaW5rQ2VsbCkpO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5jZWlsKGxhcmdlc3RXaWR0aCk7IC8vIDx0YWJsZT4gZWxlbWVudHMgd29yayBiZXN0IHdpdGggaW50ZWdlcnMuIHJvdW5kIHVwIHRvIGVuc3VyZSBjb250ZW50cyBmaXRzXG59XG5mdW5jdGlvbiBnZXRTZWN0aW9uSGFzTGlxdWlkSGVpZ2h0KHByb3BzLCBzZWN0aW9uQ29uZmlnKSB7XG4gICAgcmV0dXJuIHByb3BzLmxpcXVpZCAmJiBzZWN0aW9uQ29uZmlnLmxpcXVpZDsgLy8gZG9lcyB0aGUgc2VjdGlvbiBkbyBsaXF1aWQtaGVpZ2h0PyAobmVlZCB0byBoYXZlIHdob2xlIHNjcm9sbGdyaWQgbGlxdWlkLWhlaWdodCBhcyB3ZWxsKVxufVxuZnVuY3Rpb24gZ2V0QWxsb3dZU2Nyb2xsaW5nKHByb3BzLCBzZWN0aW9uQ29uZmlnKSB7XG4gICAgcmV0dXJuIHNlY3Rpb25Db25maWcubWF4SGVpZ2h0ICE9IG51bGwgfHwgLy8gaWYgaXRzIHBvc3NpYmxlIGZvciB0aGUgaGVpZ2h0IHRvIG1heCBvdXQsIHdlIG1pZ2h0IG5lZWQgc2Nyb2xsYmFyc1xuICAgICAgICBnZXRTZWN0aW9uSGFzTGlxdWlkSGVpZ2h0KHByb3BzLCBzZWN0aW9uQ29uZmlnKTsgLy8gaWYgdGhlIHNlY3Rpb24gaXMgbGlxdWlkIGhlaWdodCwgaXQgbWlnaHQgY29uZGVuc2UgZW5vdWdoIHRvIHJlcXVpcmUgc2Nyb2xsYmFyc1xufVxuLy8gVE9ETzogT05MWSB1c2UgYGFyZ2AuIGZvcmNlIG91dCBpbnRlcm5hbCBmdW5jdGlvbiB0byB1c2Ugc2FtZSBBUElcbmZ1bmN0aW9uIHJlbmRlckNodW5rQ29udGVudChzZWN0aW9uQ29uZmlnLCBjaHVua0NvbmZpZywgYXJnLCBpc0hlYWRlcikge1xuICAgIHZhciBleHBhbmRSb3dzID0gYXJnLmV4cGFuZFJvd3M7XG4gICAgdmFyIGNvbnRlbnQgPSB0eXBlb2YgY2h1bmtDb25maWcuY29udGVudCA9PT0gJ2Z1bmN0aW9uJyA/XG4gICAgICAgIGNodW5rQ29uZmlnLmNvbnRlbnQoYXJnKSA6XG4gICAgICAgIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJywge1xuICAgICAgICAgICAgcm9sZTogJ3ByZXNlbnRhdGlvbicsXG4gICAgICAgICAgICBjbGFzc05hbWU6IFtcbiAgICAgICAgICAgICAgICBjaHVua0NvbmZpZy50YWJsZUNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICBzZWN0aW9uQ29uZmlnLnN5bmNSb3dIZWlnaHRzID8gJ2ZjLXNjcm9sbGdyaWQtc3luYy10YWJsZScgOiAnJyxcbiAgICAgICAgICAgIF0uam9pbignICcpLFxuICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICBtaW5XaWR0aDogYXJnLnRhYmxlTWluV2lkdGgsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGFyZy5jbGllbnRXaWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGV4cGFuZFJvd3MgPyBhcmcuY2xpZW50SGVpZ2h0IDogJycsIC8vIGNzcyBgaGVpZ2h0YCBvbiBhIDx0YWJsZT4gc2VydmVzIGFzIGEgbWluLWhlaWdodFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSwgYXJnLnRhYmxlQ29sR3JvdXBOb2RlLCB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KGlzSGVhZGVyID8gJ3RoZWFkJyA6ICd0Ym9keScsIHtcbiAgICAgICAgICAgIHJvbGU6ICdwcmVzZW50YXRpb24nLFxuICAgICAgICB9LCB0eXBlb2YgY2h1bmtDb25maWcucm93Q29udGVudCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBjaHVua0NvbmZpZy5yb3dDb250ZW50KGFyZylcbiAgICAgICAgICAgIDogY2h1bmtDb25maWcucm93Q29udGVudCkpO1xuICAgIHJldHVybiBjb250ZW50O1xufVxuZnVuY3Rpb24gaXNDb2xQcm9wc0VxdWFsKGNvbHMwLCBjb2xzMSkge1xuICAgIHJldHVybiBpc0FycmF5c0VxdWFsKGNvbHMwLCBjb2xzMSwgaXNQcm9wc0VxdWFsKTtcbn1cbmZ1bmN0aW9uIHJlbmRlck1pY3JvQ29sR3JvdXAoY29scywgc2hyaW5rV2lkdGgpIHtcbiAgICB2YXIgY29sTm9kZXMgPSBbXTtcbiAgICAvKlxuICAgIGZvciBDb2xQcm9wcyB3aXRoIHNwYW5zLCBpdCB3b3VsZCBoYXZlIGJlZW4gZ3JlYXQgdG8gbWFrZSBhIHNpbmdsZSA8Y29sIHNwYW49XCJcIj5cbiAgICBIT1dFVkVSLCBDaHJvbWUgd2FzIGdldHRpbmcgbWVzc2luZyB1cCBkaXN0cmlidXRpbmcgdGhlIHdpZHRoIHRvIDx0ZD4vPHRoPiBlbGVtZW50cyB3aXRoIGNvbHNwYW5zLlxuICAgIFNPTFVUSU9OOiBtYWtpbmcgaW5kaXZpZHVhbCA8Y29sPiBlbGVtZW50cyBtYWtlcyBDaHJvbWUgYmVoYXZlLlxuICAgICovXG4gICAgZm9yICh2YXIgX2kgPSAwLCBjb2xzXzEgPSBjb2xzOyBfaSA8IGNvbHNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIGNvbFByb3BzID0gY29sc18xW19pXTtcbiAgICAgICAgdmFyIHNwYW4gPSBjb2xQcm9wcy5zcGFuIHx8IDE7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbjsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb2xOb2Rlcy5wdXNoKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJjb2xcIiwgeyBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogY29sUHJvcHMud2lkdGggPT09ICdzaHJpbmsnID8gc2FuaXRpemVTaHJpbmtXaWR0aChzaHJpbmtXaWR0aCkgOiAoY29sUHJvcHMud2lkdGggfHwgJycpLFxuICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogY29sUHJvcHMubWluV2lkdGggfHwgJycsXG4gICAgICAgICAgICAgICAgfSB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQuYXBwbHkodm9pZCAwLCB0c2xpYi5fX3NwcmVhZEFycmF5KFsnY29sZ3JvdXAnLCB7fV0sIGNvbE5vZGVzKSk7XG59XG5mdW5jdGlvbiBzYW5pdGl6ZVNocmlua1dpZHRoKHNocmlua1dpZHRoKSB7XG4gICAgLyogd2h5IDQ/IGlmIHdlIGRvIDAsIGl0IHdpbGwga2lsbCBhbnkgYm9yZGVyLCB3aGljaCBhcmUgbmVlZGVkIGZvciBjb21wdXRlU21hbGxlc3RDZWxsV2lkdGhcbiAgICA0IGFjY291bnRzIGZvciAyIDItcGl4ZWwgYm9yZGVycy4gVE9ETzogYmV0dGVyIHNvbHV0aW9uPyAqL1xuICAgIHJldHVybiBzaHJpbmtXaWR0aCA9PSBudWxsID8gNCA6IHNocmlua1dpZHRoO1xufVxuZnVuY3Rpb24gaGFzU2hyaW5rV2lkdGgoY29scykge1xuICAgIGZvciAodmFyIF9pID0gMCwgY29sc18yID0gY29sczsgX2kgPCBjb2xzXzIubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBjb2wgPSBjb2xzXzJbX2ldO1xuICAgICAgICBpZiAoY29sLndpZHRoID09PSAnc2hyaW5rJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0U2Nyb2xsR3JpZENsYXNzTmFtZXMobGlxdWlkLCBjb250ZXh0KSB7XG4gICAgdmFyIGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICdmYy1zY3JvbGxncmlkJyxcbiAgICAgICAgY29udGV4dC50aGVtZS5nZXRDbGFzcygndGFibGUnKSxcbiAgICBdO1xuICAgIGlmIChsaXF1aWQpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1zY3JvbGxncmlkLWxpcXVpZCcpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NOYW1lcztcbn1cbmZ1bmN0aW9uIGdldFNlY3Rpb25DbGFzc05hbWVzKHNlY3Rpb25Db25maWcsIHdob2xlVGFibGVWR3Jvdykge1xuICAgIHZhciBjbGFzc05hbWVzID0gW1xuICAgICAgICAnZmMtc2Nyb2xsZ3JpZC1zZWN0aW9uJyxcbiAgICAgICAgXCJmYy1zY3JvbGxncmlkLXNlY3Rpb24tXCIgKyBzZWN0aW9uQ29uZmlnLnR5cGUsXG4gICAgICAgIHNlY3Rpb25Db25maWcuY2xhc3NOYW1lLCAvLyB1c2VkP1xuICAgIF07XG4gICAgaWYgKHdob2xlVGFibGVWR3JvdyAmJiBzZWN0aW9uQ29uZmlnLmxpcXVpZCAmJiBzZWN0aW9uQ29uZmlnLm1heEhlaWdodCA9PSBudWxsKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtc2Nyb2xsZ3JpZC1zZWN0aW9uLWxpcXVpZCcpO1xuICAgIH1cbiAgICBpZiAoc2VjdGlvbkNvbmZpZy5pc1N0aWNreSkge1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLXNjcm9sbGdyaWQtc2VjdGlvbi1zdGlja3knKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzTmFtZXM7XG59XG5mdW5jdGlvbiByZW5kZXJTY3JvbGxTaGltKGFyZykge1xuICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1zY3JvbGxncmlkLXN0aWNreS1zaGltXCIsIHN0eWxlOiB7XG4gICAgICAgICAgICB3aWR0aDogYXJnLmNsaWVudFdpZHRoLFxuICAgICAgICAgICAgbWluV2lkdGg6IGFyZy50YWJsZU1pbldpZHRoLFxuICAgICAgICB9IH0pKTtcbn1cbmZ1bmN0aW9uIGdldFN0aWNreUhlYWRlckRhdGVzKG9wdGlvbnMpIHtcbiAgICB2YXIgc3RpY2t5SGVhZGVyRGF0ZXMgPSBvcHRpb25zLnN0aWNreUhlYWRlckRhdGVzO1xuICAgIGlmIChzdGlja3lIZWFkZXJEYXRlcyA9PSBudWxsIHx8IHN0aWNreUhlYWRlckRhdGVzID09PSAnYXV0bycpIHtcbiAgICAgICAgc3RpY2t5SGVhZGVyRGF0ZXMgPSBvcHRpb25zLmhlaWdodCA9PT0gJ2F1dG8nIHx8IG9wdGlvbnMudmlld0hlaWdodCA9PT0gJ2F1dG8nO1xuICAgIH1cbiAgICByZXR1cm4gc3RpY2t5SGVhZGVyRGF0ZXM7XG59XG5mdW5jdGlvbiBnZXRTdGlja3lGb290ZXJTY3JvbGxiYXIob3B0aW9ucykge1xuICAgIHZhciBzdGlja3lGb290ZXJTY3JvbGxiYXIgPSBvcHRpb25zLnN0aWNreUZvb3RlclNjcm9sbGJhcjtcbiAgICBpZiAoc3RpY2t5Rm9vdGVyU2Nyb2xsYmFyID09IG51bGwgfHwgc3RpY2t5Rm9vdGVyU2Nyb2xsYmFyID09PSAnYXV0bycpIHtcbiAgICAgICAgc3RpY2t5Rm9vdGVyU2Nyb2xsYmFyID0gb3B0aW9ucy5oZWlnaHQgPT09ICdhdXRvJyB8fCBvcHRpb25zLnZpZXdIZWlnaHQgPT09ICdhdXRvJztcbiAgICB9XG4gICAgcmV0dXJuIHN0aWNreUZvb3RlclNjcm9sbGJhcjtcbn1cblxudmFyIFNpbXBsZVNjcm9sbEdyaWQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFNpbXBsZVNjcm9sbEdyaWQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU2ltcGxlU2Nyb2xsR3JpZCgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnByb2Nlc3NDb2xzID0gbWVtb2l6ZShmdW5jdGlvbiAoYSkgeyByZXR1cm4gYTsgfSwgaXNDb2xQcm9wc0VxdWFsKTsgLy8gc28gd2UgZ2V0IHNhbWUgYGNvbHNgIHByb3BzIGV2ZXJ5IHRpbWVcbiAgICAgICAgLy8geXVja3kgdG8gbWVtb2l6ZSBWTm9kZXMsIGJ1dCBtdWNoIG1vcmUgZWZmaWNpZW50IGZvciBjb25zdW1lcnNcbiAgICAgICAgX3RoaXMucmVuZGVyTWljcm9Db2xHcm91cCA9IG1lbW9pemUocmVuZGVyTWljcm9Db2xHcm91cCk7XG4gICAgICAgIF90aGlzLnNjcm9sbGVyUmVmcyA9IG5ldyBSZWZNYXAoKTtcbiAgICAgICAgX3RoaXMuc2Nyb2xsZXJFbFJlZnMgPSBuZXcgUmVmTWFwKF90aGlzLl9oYW5kbGVTY3JvbGxlckVsLmJpbmQoX3RoaXMpKTtcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBzaHJpbmtXaWR0aDogbnVsbCxcbiAgICAgICAgICAgIGZvcmNlWVNjcm9sbGJhcnM6IGZhbHNlLFxuICAgICAgICAgICAgc2Nyb2xsZXJDbGllbnRXaWR0aHM6IHt9LFxuICAgICAgICAgICAgc2Nyb2xsZXJDbGllbnRIZWlnaHRzOiB7fSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gVE9ETzogY2FuIGRvIGEgcmVhbGx5IHNpbXBsZSBwcmludC12aWV3LiBkb250IG5lZWQgdG8gam9pbiByb3dzXG4gICAgICAgIF90aGlzLmhhbmRsZVNpemluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLnNhZmVTZXRTdGF0ZSh0c2xpYi5fX2Fzc2lnbih7IHNocmlua1dpZHRoOiBfdGhpcy5jb21wdXRlU2hyaW5rV2lkdGgoKSB9LCBfdGhpcy5jb21wdXRlU2Nyb2xsZXJEaW1zKCkpKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBTaW1wbGVTY3JvbGxHcmlkLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIHN0YXRlID0gX2Euc3RhdGUsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgc2VjdGlvbkNvbmZpZ3MgPSBwcm9wcy5zZWN0aW9ucyB8fCBbXTtcbiAgICAgICAgdmFyIGNvbHMgPSB0aGlzLnByb2Nlc3NDb2xzKHByb3BzLmNvbHMpO1xuICAgICAgICB2YXIgbWljcm9Db2xHcm91cE5vZGUgPSB0aGlzLnJlbmRlck1pY3JvQ29sR3JvdXAoY29scywgc3RhdGUuc2hyaW5rV2lkdGgpO1xuICAgICAgICB2YXIgY2xhc3NOYW1lcyA9IGdldFNjcm9sbEdyaWRDbGFzc05hbWVzKHByb3BzLmxpcXVpZCwgY29udGV4dCk7XG4gICAgICAgIGlmIChwcm9wcy5jb2xsYXBzaWJsZVdpZHRoKSB7XG4gICAgICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLXNjcm9sbGdyaWQtY29sbGFwc2libGUnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBtYWtlIERSWVxuICAgICAgICB2YXIgY29uZmlnQ250ID0gc2VjdGlvbkNvbmZpZ3MubGVuZ3RoO1xuICAgICAgICB2YXIgY29uZmlnSSA9IDA7XG4gICAgICAgIHZhciBjdXJyZW50Q29uZmlnO1xuICAgICAgICB2YXIgaGVhZFNlY3Rpb25Ob2RlcyA9IFtdO1xuICAgICAgICB2YXIgYm9keVNlY3Rpb25Ob2RlcyA9IFtdO1xuICAgICAgICB2YXIgZm9vdFNlY3Rpb25Ob2RlcyA9IFtdO1xuICAgICAgICB3aGlsZSAoY29uZmlnSSA8IGNvbmZpZ0NudCAmJiAoY3VycmVudENvbmZpZyA9IHNlY3Rpb25Db25maWdzW2NvbmZpZ0ldKS50eXBlID09PSAnaGVhZGVyJykge1xuICAgICAgICAgICAgaGVhZFNlY3Rpb25Ob2Rlcy5wdXNoKHRoaXMucmVuZGVyU2VjdGlvbihjdXJyZW50Q29uZmlnLCBtaWNyb0NvbEdyb3VwTm9kZSwgdHJ1ZSkpO1xuICAgICAgICAgICAgY29uZmlnSSArPSAxO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChjb25maWdJIDwgY29uZmlnQ250ICYmIChjdXJyZW50Q29uZmlnID0gc2VjdGlvbkNvbmZpZ3NbY29uZmlnSV0pLnR5cGUgPT09ICdib2R5Jykge1xuICAgICAgICAgICAgYm9keVNlY3Rpb25Ob2Rlcy5wdXNoKHRoaXMucmVuZGVyU2VjdGlvbihjdXJyZW50Q29uZmlnLCBtaWNyb0NvbEdyb3VwTm9kZSwgZmFsc2UpKTtcbiAgICAgICAgICAgIGNvbmZpZ0kgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoY29uZmlnSSA8IGNvbmZpZ0NudCAmJiAoY3VycmVudENvbmZpZyA9IHNlY3Rpb25Db25maWdzW2NvbmZpZ0ldKS50eXBlID09PSAnZm9vdGVyJykge1xuICAgICAgICAgICAgZm9vdFNlY3Rpb25Ob2Rlcy5wdXNoKHRoaXMucmVuZGVyU2VjdGlvbihjdXJyZW50Q29uZmlnLCBtaWNyb0NvbEdyb3VwTm9kZSwgdHJ1ZSkpO1xuICAgICAgICAgICAgY29uZmlnSSArPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZpcmVmb3ggYnVnOiB3aGVuIHNldHRpbmcgaGVpZ2h0IG9uIHRhYmxlIGFuZCB0aGVyZSBpcyBhIHRoZWFkIG9yIHRmb290LFxuICAgICAgICAvLyB0aGUgbmVjZXNzYXJ5IGhlaWdodDoxMDAlIG9uIHRoZSBsaXF1aWQtaGVpZ2h0IGJvZHkgc2VjdGlvbiBmb3JjZXMgdGhlICp3aG9sZSogdGFibGUgdG8gYmUgdGFsbGVyLiAoYnVnICM1NTI0KVxuICAgICAgICAvLyB1c2UgZ2V0Q2FuVkdyb3dXaXRoaW5DZWxsIGFzIGEgd2F5IHRvIGRldGVjdCB0YWJsZS1zdHVwaWQgZmlyZWZveC5cbiAgICAgICAgLy8gaWYgc28sIHVzZSBhIHNpbXBsZXIgZG9tIHN0cnVjdHVyZSwgamFtIGV2ZXJ5dGhpbmcgaW50byBhIGxvbmUgdGJvZHkuXG4gICAgICAgIHZhciBpc0J1Z2d5ID0gIWdldENhblZHcm93V2l0aGluQ2VsbCgpO1xuICAgICAgICB2YXIgcm9sZUF0dHJzID0geyByb2xlOiAncm93Z3JvdXAnIH07XG4gICAgICAgIHJldHVybiB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KCd0YWJsZScsIHtcbiAgICAgICAgICAgIHJvbGU6ICdncmlkJyxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKCcgJyksXG4gICAgICAgICAgICBzdHlsZTogeyBoZWlnaHQ6IHByb3BzLmhlaWdodCB9LFxuICAgICAgICB9LCBCb29sZWFuKCFpc0J1Z2d5ICYmIGhlYWRTZWN0aW9uTm9kZXMubGVuZ3RoKSAmJiB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50LmFwcGx5KHZvaWQgMCwgdHNsaWIuX19zcHJlYWRBcnJheShbJ3RoZWFkJywgcm9sZUF0dHJzXSwgaGVhZFNlY3Rpb25Ob2RlcykpLCBCb29sZWFuKCFpc0J1Z2d5ICYmIGJvZHlTZWN0aW9uTm9kZXMubGVuZ3RoKSAmJiB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50LmFwcGx5KHZvaWQgMCwgdHNsaWIuX19zcHJlYWRBcnJheShbJ3Rib2R5Jywgcm9sZUF0dHJzXSwgYm9keVNlY3Rpb25Ob2RlcykpLCBCb29sZWFuKCFpc0J1Z2d5ICYmIGZvb3RTZWN0aW9uTm9kZXMubGVuZ3RoKSAmJiB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50LmFwcGx5KHZvaWQgMCwgdHNsaWIuX19zcHJlYWRBcnJheShbJ3Rmb290Jywgcm9sZUF0dHJzXSwgZm9vdFNlY3Rpb25Ob2RlcykpLCBpc0J1Z2d5ICYmIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQuYXBwbHkodm9pZCAwLCB0c2xpYi5fX3NwcmVhZEFycmF5KHRzbGliLl9fc3ByZWFkQXJyYXkodHNsaWIuX19zcHJlYWRBcnJheShbJ3Rib2R5Jywgcm9sZUF0dHJzXSwgaGVhZFNlY3Rpb25Ob2RlcyksIGJvZHlTZWN0aW9uTm9kZXMpLCBmb290U2VjdGlvbk5vZGVzKSkpO1xuICAgIH07XG4gICAgU2ltcGxlU2Nyb2xsR3JpZC5wcm90b3R5cGUucmVuZGVyU2VjdGlvbiA9IGZ1bmN0aW9uIChzZWN0aW9uQ29uZmlnLCBtaWNyb0NvbEdyb3VwTm9kZSwgaXNIZWFkZXIpIHtcbiAgICAgICAgaWYgKCdvdXRlckNvbnRlbnQnIGluIHNlY3Rpb25Db25maWcpIHtcbiAgICAgICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudCh2ZG9tX2Nqcy5GcmFnbWVudCwgeyBrZXk6IHNlY3Rpb25Db25maWcua2V5IH0sIHNlY3Rpb25Db25maWcub3V0ZXJDb250ZW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwidHJcIiwgeyBrZXk6IHNlY3Rpb25Db25maWcua2V5LCByb2xlOiBcInByZXNlbnRhdGlvblwiLCBjbGFzc05hbWU6IGdldFNlY3Rpb25DbGFzc05hbWVzKHNlY3Rpb25Db25maWcsIHRoaXMucHJvcHMubGlxdWlkKS5qb2luKCcgJykgfSwgdGhpcy5yZW5kZXJDaHVua1RkKHNlY3Rpb25Db25maWcsIG1pY3JvQ29sR3JvdXBOb2RlLCBzZWN0aW9uQ29uZmlnLmNodW5rLCBpc0hlYWRlcikpKTtcbiAgICB9O1xuICAgIFNpbXBsZVNjcm9sbEdyaWQucHJvdG90eXBlLnJlbmRlckNodW5rVGQgPSBmdW5jdGlvbiAoc2VjdGlvbkNvbmZpZywgbWljcm9Db2xHcm91cE5vZGUsIGNodW5rQ29uZmlnLCBpc0hlYWRlcikge1xuICAgICAgICBpZiAoJ291dGVyQ29udGVudCcgaW4gY2h1bmtDb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybiBjaHVua0NvbmZpZy5vdXRlckNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdmFyIF9hID0gdGhpcy5zdGF0ZSwgZm9yY2VZU2Nyb2xsYmFycyA9IF9hLmZvcmNlWVNjcm9sbGJhcnMsIHNjcm9sbGVyQ2xpZW50V2lkdGhzID0gX2Euc2Nyb2xsZXJDbGllbnRXaWR0aHMsIHNjcm9sbGVyQ2xpZW50SGVpZ2h0cyA9IF9hLnNjcm9sbGVyQ2xpZW50SGVpZ2h0cztcbiAgICAgICAgdmFyIG5lZWRzWVNjcm9sbGluZyA9IGdldEFsbG93WVNjcm9sbGluZyhwcm9wcywgc2VjdGlvbkNvbmZpZyk7IC8vIFRPRE86IGRvIGxhemlseS4gZG8gaW4gc2VjdGlvbiBjb25maWc/XG4gICAgICAgIHZhciBpc0xpcXVpZCA9IGdldFNlY3Rpb25IYXNMaXF1aWRIZWlnaHQocHJvcHMsIHNlY3Rpb25Db25maWcpO1xuICAgICAgICAvLyBmb3IgYCFwcm9wcy5saXF1aWRgIC0gaXMgV0hPTEUgc2Nyb2xsZ3JpZCBuYXR1cmFsIGhlaWdodD9cbiAgICAgICAgLy8gVE9ETzogZG8gc2FtZSB0aGluZyBpbiBhZHZhbmNlZCBzY3JvbGxncmlkPyBwcm9sbHkgbm90IGIvYyBhbHdheXMgaGFzIGhvcml6b250YWwgc2Nyb2xsYmFyc1xuICAgICAgICB2YXIgb3ZlcmZsb3dZID0gIXByb3BzLmxpcXVpZCA/ICd2aXNpYmxlJyA6XG4gICAgICAgICAgICBmb3JjZVlTY3JvbGxiYXJzID8gJ3Njcm9sbCcgOlxuICAgICAgICAgICAgICAgICFuZWVkc1lTY3JvbGxpbmcgPyAnaGlkZGVuJyA6XG4gICAgICAgICAgICAgICAgICAgICdhdXRvJztcbiAgICAgICAgdmFyIHNlY3Rpb25LZXkgPSBzZWN0aW9uQ29uZmlnLmtleTtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSByZW5kZXJDaHVua0NvbnRlbnQoc2VjdGlvbkNvbmZpZywgY2h1bmtDb25maWcsIHtcbiAgICAgICAgICAgIHRhYmxlQ29sR3JvdXBOb2RlOiBtaWNyb0NvbEdyb3VwTm9kZSxcbiAgICAgICAgICAgIHRhYmxlTWluV2lkdGg6ICcnLFxuICAgICAgICAgICAgY2xpZW50V2lkdGg6ICghcHJvcHMuY29sbGFwc2libGVXaWR0aCAmJiBzY3JvbGxlckNsaWVudFdpZHRoc1tzZWN0aW9uS2V5XSAhPT0gdW5kZWZpbmVkKSA/IHNjcm9sbGVyQ2xpZW50V2lkdGhzW3NlY3Rpb25LZXldIDogbnVsbCxcbiAgICAgICAgICAgIGNsaWVudEhlaWdodDogc2Nyb2xsZXJDbGllbnRIZWlnaHRzW3NlY3Rpb25LZXldICE9PSB1bmRlZmluZWQgPyBzY3JvbGxlckNsaWVudEhlaWdodHNbc2VjdGlvbktleV0gOiBudWxsLFxuICAgICAgICAgICAgZXhwYW5kUm93czogc2VjdGlvbkNvbmZpZy5leHBhbmRSb3dzLFxuICAgICAgICAgICAgc3luY1Jvd0hlaWdodHM6IGZhbHNlLFxuICAgICAgICAgICAgcm93U3luY0hlaWdodHM6IFtdLFxuICAgICAgICAgICAgcmVwb3J0Um93SGVpZ2h0Q2hhbmdlOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIH0sIGlzSGVhZGVyKTtcbiAgICAgICAgcmV0dXJuIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoaXNIZWFkZXIgPyAndGgnIDogJ3RkJywge1xuICAgICAgICAgICAgcmVmOiBjaHVua0NvbmZpZy5lbFJlZixcbiAgICAgICAgICAgIHJvbGU6ICdwcmVzZW50YXRpb24nLFxuICAgICAgICB9LCB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLXNjcm9sbGVyLWhhcm5lc3NcIiArIChpc0xpcXVpZCA/ICcgZmMtc2Nyb2xsZXItaGFybmVzcy1saXF1aWQnIDogJycpIH0sXG4gICAgICAgICAgICB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFNjcm9sbGVyLCB7IHJlZjogdGhpcy5zY3JvbGxlclJlZnMuY3JlYXRlUmVmKHNlY3Rpb25LZXkpLCBlbFJlZjogdGhpcy5zY3JvbGxlckVsUmVmcy5jcmVhdGVSZWYoc2VjdGlvbktleSksIG92ZXJmbG93WTogb3ZlcmZsb3dZLCBvdmVyZmxvd1g6ICFwcm9wcy5saXF1aWQgPyAndmlzaWJsZScgOiAnaGlkZGVuJyAvKiBuYXR1cmFsIGhlaWdodD8gKi8sIG1heEhlaWdodDogc2VjdGlvbkNvbmZpZy5tYXhIZWlnaHQsIGxpcXVpZDogaXNMaXF1aWQsIGxpcXVpZElzQWJzb2x1dGUgLy8gYmVjYXVzZSBpdHMgd2l0aGluIGEgaGFybmVzc1xuICAgICAgICAgICAgICAgIDogdHJ1ZSB9LCBjb250ZW50KSkpO1xuICAgIH07XG4gICAgU2ltcGxlU2Nyb2xsR3JpZC5wcm90b3R5cGUuX2hhbmRsZVNjcm9sbGVyRWwgPSBmdW5jdGlvbiAoc2Nyb2xsZXJFbCwga2V5KSB7XG4gICAgICAgIHZhciBzZWN0aW9uID0gZ2V0U2VjdGlvbkJ5S2V5KHRoaXMucHJvcHMuc2VjdGlvbnMsIGtleSk7XG4gICAgICAgIGlmIChzZWN0aW9uKSB7XG4gICAgICAgICAgICBzZXRSZWYoc2VjdGlvbi5jaHVuay5zY3JvbGxlckVsUmVmLCBzY3JvbGxlckVsKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU2ltcGxlU2Nyb2xsR3JpZC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlU2l6aW5nKCk7XG4gICAgICAgIHRoaXMuY29udGV4dC5hZGRSZXNpemVIYW5kbGVyKHRoaXMuaGFuZGxlU2l6aW5nKTtcbiAgICB9O1xuICAgIFNpbXBsZVNjcm9sbEdyaWQucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gVE9ETzogbmVlZCBiZXR0ZXIgc29sdXRpb24gd2hlbiBzdGF0ZSBjb250YWlucyBub24tc2l6aW5nIHRoaW5nc1xuICAgICAgICB0aGlzLmhhbmRsZVNpemluZygpO1xuICAgIH07XG4gICAgU2ltcGxlU2Nyb2xsR3JpZC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5yZW1vdmVSZXNpemVIYW5kbGVyKHRoaXMuaGFuZGxlU2l6aW5nKTtcbiAgICB9O1xuICAgIFNpbXBsZVNjcm9sbEdyaWQucHJvdG90eXBlLmNvbXB1dGVTaHJpbmtXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGhhc1Nocmlua1dpZHRoKHRoaXMucHJvcHMuY29scylcbiAgICAgICAgICAgID8gY29tcHV0ZVNocmlua1dpZHRoKHRoaXMuc2Nyb2xsZXJFbFJlZnMuZ2V0QWxsKCkpXG4gICAgICAgICAgICA6IDA7XG4gICAgfTtcbiAgICBTaW1wbGVTY3JvbGxHcmlkLnByb3RvdHlwZS5jb21wdXRlU2Nyb2xsZXJEaW1zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2Nyb2xsYmFyV2lkdGggPSBnZXRTY3JvbGxiYXJXaWR0aHMoKTtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgc2Nyb2xsZXJSZWZzID0gX2Euc2Nyb2xsZXJSZWZzLCBzY3JvbGxlckVsUmVmcyA9IF9hLnNjcm9sbGVyRWxSZWZzO1xuICAgICAgICB2YXIgZm9yY2VZU2Nyb2xsYmFycyA9IGZhbHNlO1xuICAgICAgICB2YXIgc2Nyb2xsZXJDbGllbnRXaWR0aHMgPSB7fTtcbiAgICAgICAgdmFyIHNjcm9sbGVyQ2xpZW50SGVpZ2h0cyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBzZWN0aW9uS2V5IGluIHNjcm9sbGVyUmVmcy5jdXJyZW50TWFwKSB7XG4gICAgICAgICAgICB2YXIgc2Nyb2xsZXIgPSBzY3JvbGxlclJlZnMuY3VycmVudE1hcFtzZWN0aW9uS2V5XTtcbiAgICAgICAgICAgIGlmIChzY3JvbGxlciAmJiBzY3JvbGxlci5uZWVkc1lTY3JvbGxpbmcoKSkge1xuICAgICAgICAgICAgICAgIGZvcmNlWVNjcm9sbGJhcnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2IgPSB0aGlzLnByb3BzLnNlY3Rpb25zOyBfaSA8IF9iLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIHNlY3Rpb24gPSBfYltfaV07XG4gICAgICAgICAgICB2YXIgc2VjdGlvbktleSA9IHNlY3Rpb24ua2V5O1xuICAgICAgICAgICAgdmFyIHNjcm9sbGVyRWwgPSBzY3JvbGxlckVsUmVmcy5jdXJyZW50TWFwW3NlY3Rpb25LZXldO1xuICAgICAgICAgICAgaWYgKHNjcm9sbGVyRWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgaGFybmVzc0VsID0gc2Nyb2xsZXJFbC5wYXJlbnROb2RlOyAvLyBUT0RPOiB3ZWlyZCB3YXkgdG8gZ2V0IHRoaXMuIG5lZWQgaGFybmVzcyBiL2MgZG9lc24ndCBpbmNsdWRlIHRhYmxlIGJvcmRlcnNcbiAgICAgICAgICAgICAgICBzY3JvbGxlckNsaWVudFdpZHRoc1tzZWN0aW9uS2V5XSA9IE1hdGguZmxvb3IoaGFybmVzc0VsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC0gKGZvcmNlWVNjcm9sbGJhcnNcbiAgICAgICAgICAgICAgICAgICAgPyBzY3JvbGxiYXJXaWR0aC55IC8vIHVzZSBnbG9iYWwgYmVjYXVzZSBzY3JvbGxlciBtaWdodCBub3QgaGF2ZSBzY3JvbGxiYXJzIHlldCBidXQgd2lsbCBuZWVkIHRoZW0gaW4gZnV0dXJlXG4gICAgICAgICAgICAgICAgICAgIDogMCkpO1xuICAgICAgICAgICAgICAgIHNjcm9sbGVyQ2xpZW50SGVpZ2h0c1tzZWN0aW9uS2V5XSA9IE1hdGguZmxvb3IoaGFybmVzc0VsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZm9yY2VZU2Nyb2xsYmFyczogZm9yY2VZU2Nyb2xsYmFycywgc2Nyb2xsZXJDbGllbnRXaWR0aHM6IHNjcm9sbGVyQ2xpZW50V2lkdGhzLCBzY3JvbGxlckNsaWVudEhlaWdodHM6IHNjcm9sbGVyQ2xpZW50SGVpZ2h0cyB9O1xuICAgIH07XG4gICAgcmV0dXJuIFNpbXBsZVNjcm9sbEdyaWQ7XG59KEJhc2VDb21wb25lbnQpKTtcblNpbXBsZVNjcm9sbEdyaWQuYWRkU3RhdGVFcXVhbGl0eSh7XG4gICAgc2Nyb2xsZXJDbGllbnRXaWR0aHM6IGlzUHJvcHNFcXVhbCxcbiAgICBzY3JvbGxlckNsaWVudEhlaWdodHM6IGlzUHJvcHNFcXVhbCxcbn0pO1xuZnVuY3Rpb24gZ2V0U2VjdGlvbkJ5S2V5KHNlY3Rpb25zLCBrZXkpIHtcbiAgICBmb3IgKHZhciBfaSA9IDAsIHNlY3Rpb25zXzEgPSBzZWN0aW9uczsgX2kgPCBzZWN0aW9uc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgc2VjdGlvbiA9IHNlY3Rpb25zXzFbX2ldO1xuICAgICAgICBpZiAoc2VjdGlvbi5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlY3Rpb247XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBFdmVudFJvb3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKEV2ZW50Um9vdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFdmVudFJvb3QoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5lbFJlZiA9IHZkb21fY2pzLmNyZWF0ZVJlZigpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEV2ZW50Um9vdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBjb250ZXh0ID0gX2EuY29udGV4dDtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgICAgIHZhciBzZWcgPSBwcm9wcy5zZWc7XG4gICAgICAgIHZhciBldmVudFJhbmdlID0gc2VnLmV2ZW50UmFuZ2U7XG4gICAgICAgIHZhciB1aSA9IGV2ZW50UmFuZ2UudWk7XG4gICAgICAgIHZhciBob29rUHJvcHMgPSB7XG4gICAgICAgICAgICBldmVudDogbmV3IEV2ZW50QXBpKGNvbnRleHQsIGV2ZW50UmFuZ2UuZGVmLCBldmVudFJhbmdlLmluc3RhbmNlKSxcbiAgICAgICAgICAgIHZpZXc6IGNvbnRleHQudmlld0FwaSxcbiAgICAgICAgICAgIHRpbWVUZXh0OiBwcm9wcy50aW1lVGV4dCxcbiAgICAgICAgICAgIHRleHRDb2xvcjogdWkudGV4dENvbG9yLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB1aS5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogdWkuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICBpc0RyYWdnYWJsZTogIXByb3BzLmRpc2FibGVEcmFnZ2luZyAmJiBjb21wdXRlU2VnRHJhZ2dhYmxlKHNlZywgY29udGV4dCksXG4gICAgICAgICAgICBpc1N0YXJ0UmVzaXphYmxlOiAhcHJvcHMuZGlzYWJsZVJlc2l6aW5nICYmIGNvbXB1dGVTZWdTdGFydFJlc2l6YWJsZShzZWcsIGNvbnRleHQpLFxuICAgICAgICAgICAgaXNFbmRSZXNpemFibGU6ICFwcm9wcy5kaXNhYmxlUmVzaXppbmcgJiYgY29tcHV0ZVNlZ0VuZFJlc2l6YWJsZShzZWcpLFxuICAgICAgICAgICAgaXNNaXJyb3I6IEJvb2xlYW4ocHJvcHMuaXNEcmFnZ2luZyB8fCBwcm9wcy5pc1Jlc2l6aW5nIHx8IHByb3BzLmlzRGF0ZVNlbGVjdGluZyksXG4gICAgICAgICAgICBpc1N0YXJ0OiBCb29sZWFuKHNlZy5pc1N0YXJ0KSxcbiAgICAgICAgICAgIGlzRW5kOiBCb29sZWFuKHNlZy5pc0VuZCksXG4gICAgICAgICAgICBpc1Bhc3Q6IEJvb2xlYW4ocHJvcHMuaXNQYXN0KSxcbiAgICAgICAgICAgIGlzRnV0dXJlOiBCb29sZWFuKHByb3BzLmlzRnV0dXJlKSxcbiAgICAgICAgICAgIGlzVG9kYXk6IEJvb2xlYW4ocHJvcHMuaXNUb2RheSksXG4gICAgICAgICAgICBpc1NlbGVjdGVkOiBCb29sZWFuKHByb3BzLmlzU2VsZWN0ZWQpLFxuICAgICAgICAgICAgaXNEcmFnZ2luZzogQm9vbGVhbihwcm9wcy5pc0RyYWdnaW5nKSxcbiAgICAgICAgICAgIGlzUmVzaXppbmc6IEJvb2xlYW4ocHJvcHMuaXNSZXNpemluZyksXG4gICAgICAgIH07XG4gICAgICAgIHZhciBzdGFuZGFyZENsYXNzTmFtZXMgPSBnZXRFdmVudENsYXNzTmFtZXMoaG9va1Byb3BzKS5jb25jYXQodWkuY2xhc3NOYW1lcyk7XG4gICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChSZW5kZXJIb29rLCB7IGhvb2tQcm9wczogaG9va1Byb3BzLCBjbGFzc05hbWVzOiBvcHRpb25zLmV2ZW50Q2xhc3NOYW1lcywgY29udGVudDogb3B0aW9ucy5ldmVudENvbnRlbnQsIGRlZmF1bHRDb250ZW50OiBwcm9wcy5kZWZhdWx0Q29udGVudCwgZGlkTW91bnQ6IG9wdGlvbnMuZXZlbnREaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMuZXZlbnRXaWxsVW5tb3VudCwgZWxSZWY6IHRoaXMuZWxSZWYgfSwgZnVuY3Rpb24gKHJvb3RFbFJlZiwgY3VzdG9tQ2xhc3NOYW1lcywgaW5uZXJFbFJlZiwgaW5uZXJDb250ZW50KSB7IHJldHVybiBwcm9wcy5jaGlsZHJlbihyb290RWxSZWYsIHN0YW5kYXJkQ2xhc3NOYW1lcy5jb25jYXQoY3VzdG9tQ2xhc3NOYW1lcyksIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCwgaG9va1Byb3BzKTsgfSkpO1xuICAgIH07XG4gICAgRXZlbnRSb290LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0RWxTZWcodGhpcy5lbFJlZi5jdXJyZW50LCB0aGlzLnByb3BzLnNlZyk7XG4gICAgfTtcbiAgICAvKlxuICAgIG5lZWQgdG8gcmUtYXNzaWduIHNlZyB0byB0aGUgZWxlbWVudCBpZiBzZWcgY2hhbmdlcywgZXZlbiBpZiB0aGUgZWxlbWVudCBpcyB0aGUgc2FtZVxuICAgICovXG4gICAgRXZlbnRSb290LnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiAocHJldlByb3BzKSB7XG4gICAgICAgIHZhciBzZWcgPSB0aGlzLnByb3BzLnNlZztcbiAgICAgICAgaWYgKHNlZyAhPT0gcHJldlByb3BzLnNlZykge1xuICAgICAgICAgICAgc2V0RWxTZWcodGhpcy5lbFJlZi5jdXJyZW50LCBzZWcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRXZlbnRSb290O1xufShCYXNlQ29tcG9uZW50KSk7XG5cbi8vIHNob3VsZCBub3QgYmUgYSBwdXJlY29tcG9uZW50XG52YXIgU3RhbmRhcmRFdmVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoU3RhbmRhcmRFdmVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTdGFuZGFyZEV2ZW50KCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFN0YW5kYXJkRXZlbnQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgcHJvcHMgPSBfYS5wcm9wcywgY29udGV4dCA9IF9hLmNvbnRleHQ7XG4gICAgICAgIHZhciBzZWcgPSBwcm9wcy5zZWc7XG4gICAgICAgIHZhciB0aW1lRm9ybWF0ID0gY29udGV4dC5vcHRpb25zLmV2ZW50VGltZUZvcm1hdCB8fCBwcm9wcy5kZWZhdWx0VGltZUZvcm1hdDtcbiAgICAgICAgdmFyIHRpbWVUZXh0ID0gYnVpbGRTZWdUaW1lVGV4dChzZWcsIHRpbWVGb3JtYXQsIGNvbnRleHQsIHByb3BzLmRlZmF1bHREaXNwbGF5RXZlbnRUaW1lLCBwcm9wcy5kZWZhdWx0RGlzcGxheUV2ZW50RW5kKTtcbiAgICAgICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KEV2ZW50Um9vdCwgeyBzZWc6IHNlZywgdGltZVRleHQ6IHRpbWVUZXh0LCBkaXNhYmxlRHJhZ2dpbmc6IHByb3BzLmRpc2FibGVEcmFnZ2luZywgZGlzYWJsZVJlc2l6aW5nOiBwcm9wcy5kaXNhYmxlUmVzaXppbmcsIGRlZmF1bHRDb250ZW50OiBwcm9wcy5kZWZhdWx0Q29udGVudCB8fCByZW5kZXJJbm5lckNvbnRlbnQkMSwgaXNEcmFnZ2luZzogcHJvcHMuaXNEcmFnZ2luZywgaXNSZXNpemluZzogcHJvcHMuaXNSZXNpemluZywgaXNEYXRlU2VsZWN0aW5nOiBwcm9wcy5pc0RhdGVTZWxlY3RpbmcsIGlzU2VsZWN0ZWQ6IHByb3BzLmlzU2VsZWN0ZWQsIGlzUGFzdDogcHJvcHMuaXNQYXN0LCBpc0Z1dHVyZTogcHJvcHMuaXNGdXR1cmUsIGlzVG9kYXk6IHByb3BzLmlzVG9kYXkgfSwgZnVuY3Rpb24gKHJvb3RFbFJlZiwgY2xhc3NOYW1lcywgaW5uZXJFbFJlZiwgaW5uZXJDb250ZW50LCBob29rUHJvcHMpIHsgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwiYVwiLCB0c2xpYi5fX2Fzc2lnbih7IGNsYXNzTmFtZTogcHJvcHMuZXh0cmFDbGFzc05hbWVzLmNvbmNhdChjbGFzc05hbWVzKS5qb2luKCcgJyksIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGhvb2tQcm9wcy5ib3JkZXJDb2xvcixcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGhvb2tQcm9wcy5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICB9LCByZWY6IHJvb3RFbFJlZiB9LCBnZXRTZWdBbmNob3JBdHRycyhzZWcsIGNvbnRleHQpKSxcbiAgICAgICAgICAgIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZXZlbnQtbWFpblwiLCByZWY6IGlubmVyRWxSZWYsIHN0eWxlOiB7IGNvbG9yOiBob29rUHJvcHMudGV4dENvbG9yIH0gfSwgaW5uZXJDb250ZW50KSxcbiAgICAgICAgICAgIGhvb2tQcm9wcy5pc1N0YXJ0UmVzaXphYmxlICYmXG4gICAgICAgICAgICAgICAgdmRvbV9janMuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1ldmVudC1yZXNpemVyIGZjLWV2ZW50LXJlc2l6ZXItc3RhcnRcIiB9KSxcbiAgICAgICAgICAgIGhvb2tQcm9wcy5pc0VuZFJlc2l6YWJsZSAmJlxuICAgICAgICAgICAgICAgIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZXZlbnQtcmVzaXplciBmYy1ldmVudC1yZXNpemVyLWVuZFwiIH0pKSk7IH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBTdGFuZGFyZEV2ZW50O1xufShCYXNlQ29tcG9uZW50KSk7XG5mdW5jdGlvbiByZW5kZXJJbm5lckNvbnRlbnQkMShpbm5lclByb3BzKSB7XG4gICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWV2ZW50LW1haW4tZnJhbWVcIiB9LFxuICAgICAgICBpbm5lclByb3BzLnRpbWVUZXh0ICYmICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWV2ZW50LXRpbWVcIiB9LCBpbm5lclByb3BzLnRpbWVUZXh0KSksXG4gICAgICAgIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZXZlbnQtdGl0bGUtY29udGFpbmVyXCIgfSxcbiAgICAgICAgICAgIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZXZlbnQtdGl0bGUgZmMtc3RpY2t5XCIgfSwgaW5uZXJQcm9wcy5ldmVudC50aXRsZSB8fCB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KHZkb21fY2pzLkZyYWdtZW50LCBudWxsLCBcIlxcdTAwQTBcIikpKSkpO1xufVxuXG52YXIgTm93SW5kaWNhdG9yUm9vdCA9IGZ1bmN0aW9uIChwcm9wcykgeyByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoVmlld0NvbnRleHRUeXBlLkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIHZhciBvcHRpb25zID0gY29udGV4dC5vcHRpb25zO1xuICAgIHZhciBob29rUHJvcHMgPSB7XG4gICAgICAgIGlzQXhpczogcHJvcHMuaXNBeGlzLFxuICAgICAgICBkYXRlOiBjb250ZXh0LmRhdGVFbnYudG9EYXRlKHByb3BzLmRhdGUpLFxuICAgICAgICB2aWV3OiBjb250ZXh0LnZpZXdBcGksXG4gICAgfTtcbiAgICByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoUmVuZGVySG9vaywgeyBob29rUHJvcHM6IGhvb2tQcm9wcywgY2xhc3NOYW1lczogb3B0aW9ucy5ub3dJbmRpY2F0b3JDbGFzc05hbWVzLCBjb250ZW50OiBvcHRpb25zLm5vd0luZGljYXRvckNvbnRlbnQsIGRpZE1vdW50OiBvcHRpb25zLm5vd0luZGljYXRvckRpZE1vdW50LCB3aWxsVW5tb3VudDogb3B0aW9ucy5ub3dJbmRpY2F0b3JXaWxsVW5tb3VudCB9LCBwcm9wcy5jaGlsZHJlbikpO1xufSkpOyB9O1xuXG52YXIgREFZX05VTV9GT1JNQVQgPSBjcmVhdGVGb3JtYXR0ZXIoeyBkYXk6ICdudW1lcmljJyB9KTtcbnZhciBEYXlDZWxsQ29udGVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRGF5Q2VsbENvbnRlbnQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRGF5Q2VsbENvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgRGF5Q2VsbENvbnRlbnQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgcHJvcHMgPSBfYS5wcm9wcywgY29udGV4dCA9IF9hLmNvbnRleHQ7XG4gICAgICAgIHZhciBvcHRpb25zID0gY29udGV4dC5vcHRpb25zO1xuICAgICAgICB2YXIgaG9va1Byb3BzID0gcmVmaW5lRGF5Q2VsbEhvb2tQcm9wcyh7XG4gICAgICAgICAgICBkYXRlOiBwcm9wcy5kYXRlLFxuICAgICAgICAgICAgZGF0ZVByb2ZpbGU6IHByb3BzLmRhdGVQcm9maWxlLFxuICAgICAgICAgICAgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSxcbiAgICAgICAgICAgIHNob3dEYXlOdW1iZXI6IHByb3BzLnNob3dEYXlOdW1iZXIsXG4gICAgICAgICAgICBleHRyYVByb3BzOiBwcm9wcy5leHRyYUhvb2tQcm9wcyxcbiAgICAgICAgICAgIHZpZXdBcGk6IGNvbnRleHQudmlld0FwaSxcbiAgICAgICAgICAgIGRhdGVFbnY6IGNvbnRleHQuZGF0ZUVudixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChDb250ZW50SG9vaywgeyBob29rUHJvcHM6IGhvb2tQcm9wcywgY29udGVudDogb3B0aW9ucy5kYXlDZWxsQ29udGVudCwgZGVmYXVsdENvbnRlbnQ6IHByb3BzLmRlZmF1bHRDb250ZW50IH0sIHByb3BzLmNoaWxkcmVuKSk7XG4gICAgfTtcbiAgICByZXR1cm4gRGF5Q2VsbENvbnRlbnQ7XG59KEJhc2VDb21wb25lbnQpKTtcbmZ1bmN0aW9uIHJlZmluZURheUNlbGxIb29rUHJvcHMocmF3KSB7XG4gICAgdmFyIGRhdGUgPSByYXcuZGF0ZSwgZGF0ZUVudiA9IHJhdy5kYXRlRW52O1xuICAgIHZhciBkYXlNZXRhID0gZ2V0RGF0ZU1ldGEoZGF0ZSwgcmF3LnRvZGF5UmFuZ2UsIG51bGwsIHJhdy5kYXRlUHJvZmlsZSk7XG4gICAgcmV0dXJuIHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHsgZGF0ZTogZGF0ZUVudi50b0RhdGUoZGF0ZSksIHZpZXc6IHJhdy52aWV3QXBpIH0sIGRheU1ldGEpLCB7IGRheU51bWJlclRleHQ6IHJhdy5zaG93RGF5TnVtYmVyID8gZGF0ZUVudi5mb3JtYXQoZGF0ZSwgREFZX05VTV9GT1JNQVQpIDogJycgfSksIHJhdy5leHRyYVByb3BzKTtcbn1cblxudmFyIERheUNlbGxSb290ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhEYXlDZWxsUm9vdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEYXlDZWxsUm9vdCgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnJlZmluZUhvb2tQcm9wcyA9IG1lbW9pemVPYmpBcmcocmVmaW5lRGF5Q2VsbEhvb2tQcm9wcyk7XG4gICAgICAgIF90aGlzLm5vcm1hbGl6ZUNsYXNzTmFtZXMgPSBidWlsZENsYXNzTmFtZU5vcm1hbGl6ZXIoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBEYXlDZWxsUm9vdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBjb250ZXh0ID0gX2EuY29udGV4dDtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgICAgIHZhciBob29rUHJvcHMgPSB0aGlzLnJlZmluZUhvb2tQcm9wcyh7XG4gICAgICAgICAgICBkYXRlOiBwcm9wcy5kYXRlLFxuICAgICAgICAgICAgZGF0ZVByb2ZpbGU6IHByb3BzLmRhdGVQcm9maWxlLFxuICAgICAgICAgICAgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSxcbiAgICAgICAgICAgIHNob3dEYXlOdW1iZXI6IHByb3BzLnNob3dEYXlOdW1iZXIsXG4gICAgICAgICAgICBleHRyYVByb3BzOiBwcm9wcy5leHRyYUhvb2tQcm9wcyxcbiAgICAgICAgICAgIHZpZXdBcGk6IGNvbnRleHQudmlld0FwaSxcbiAgICAgICAgICAgIGRhdGVFbnY6IGNvbnRleHQuZGF0ZUVudixcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBjbGFzc05hbWVzID0gZ2V0RGF5Q2xhc3NOYW1lcyhob29rUHJvcHMsIGNvbnRleHQudGhlbWUpLmNvbmNhdChob29rUHJvcHMuaXNEaXNhYmxlZFxuICAgICAgICAgICAgPyBbXSAvLyBkb24ndCB1c2UgY3VzdG9tIGNsYXNzTmFtZXMgaWYgZGlzYWJsZWRcbiAgICAgICAgICAgIDogdGhpcy5ub3JtYWxpemVDbGFzc05hbWVzKG9wdGlvbnMuZGF5Q2VsbENsYXNzTmFtZXMsIGhvb2tQcm9wcykpO1xuICAgICAgICB2YXIgZGF0YUF0dHJzID0gaG9va1Byb3BzLmlzRGlzYWJsZWQgPyB7fSA6IHtcbiAgICAgICAgICAgICdkYXRhLWRhdGUnOiBmb3JtYXREYXlTdHJpbmcocHJvcHMuZGF0ZSksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChNb3VudEhvb2ssIHsgaG9va1Byb3BzOiBob29rUHJvcHMsIGRpZE1vdW50OiBvcHRpb25zLmRheUNlbGxEaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMuZGF5Q2VsbFdpbGxVbm1vdW50LCBlbFJlZjogcHJvcHMuZWxSZWYgfSwgZnVuY3Rpb24gKHJvb3RFbFJlZikgeyByZXR1cm4gcHJvcHMuY2hpbGRyZW4ocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBkYXRhQXR0cnMsIGhvb2tQcm9wcy5pc0Rpc2FibGVkKTsgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIERheUNlbGxSb290O1xufShCYXNlQ29tcG9uZW50KSk7XG5cbmZ1bmN0aW9uIHJlbmRlckZpbGwoZmlsbFR5cGUpIHtcbiAgICByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtXCIgKyBmaWxsVHlwZSB9KSk7XG59XG52YXIgQmdFdmVudCA9IGZ1bmN0aW9uIChwcm9wcykgeyByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoRXZlbnRSb290LCB7IGRlZmF1bHRDb250ZW50OiByZW5kZXJJbm5lckNvbnRlbnQsIHNlZzogcHJvcHMuc2VnIC8qIHVzZWxlc3NzIGkgdGhpbmsgKi8sIHRpbWVUZXh0OiBcIlwiLCBkaXNhYmxlRHJhZ2dpbmc6IHRydWUsIGRpc2FibGVSZXNpemluZzogdHJ1ZSwgaXNEcmFnZ2luZzogZmFsc2UsIGlzUmVzaXppbmc6IGZhbHNlLCBpc0RhdGVTZWxlY3Rpbmc6IGZhbHNlLCBpc1NlbGVjdGVkOiBmYWxzZSwgaXNQYXN0OiBwcm9wcy5pc1Bhc3QsIGlzRnV0dXJlOiBwcm9wcy5pc0Z1dHVyZSwgaXNUb2RheTogcHJvcHMuaXNUb2RheSB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQsIGhvb2tQcm9wcykgeyByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyByZWY6IHJvb3RFbFJlZiwgY2xhc3NOYW1lOiBbJ2ZjLWJnLWV2ZW50J10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgc3R5bGU6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBob29rUHJvcHMuYmFja2dyb3VuZENvbG9yLFxuICAgIH0gfSwgaW5uZXJDb250ZW50KSk7IH0pKTsgfTtcbmZ1bmN0aW9uIHJlbmRlcklubmVyQ29udGVudChwcm9wcykge1xuICAgIHZhciB0aXRsZSA9IHByb3BzLmV2ZW50LnRpdGxlO1xuICAgIHJldHVybiB0aXRsZSAmJiAodmRvbV9janMuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1ldmVudC10aXRsZVwiIH0sIHByb3BzLmV2ZW50LnRpdGxlKSk7XG59XG5cbnZhciBXZWVrTnVtYmVyUm9vdCA9IGZ1bmN0aW9uIChwcm9wcykgeyByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoVmlld0NvbnRleHRUeXBlLkNvbnN1bWVyLCBudWxsLCBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgIHZhciBkYXRlRW52ID0gY29udGV4dC5kYXRlRW52LCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zO1xuICAgIHZhciBkYXRlID0gcHJvcHMuZGF0ZTtcbiAgICB2YXIgZm9ybWF0ID0gb3B0aW9ucy53ZWVrTnVtYmVyRm9ybWF0IHx8IHByb3BzLmRlZmF1bHRGb3JtYXQ7XG4gICAgdmFyIG51bSA9IGRhdGVFbnYuY29tcHV0ZVdlZWtOdW1iZXIoZGF0ZSk7IC8vIFRPRE86IHNvbWVob3cgdXNlIGZvciBmb3JtYXR0aW5nIGFzIHdlbGw/XG4gICAgdmFyIHRleHQgPSBkYXRlRW52LmZvcm1hdChkYXRlLCBmb3JtYXQpO1xuICAgIHZhciBob29rUHJvcHMgPSB7IG51bTogbnVtLCB0ZXh0OiB0ZXh0LCBkYXRlOiBkYXRlIH07XG4gICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFJlbmRlckhvb2ssIHsgaG9va1Byb3BzOiBob29rUHJvcHMsIGNsYXNzTmFtZXM6IG9wdGlvbnMud2Vla051bWJlckNsYXNzTmFtZXMsIGNvbnRlbnQ6IG9wdGlvbnMud2Vla051bWJlckNvbnRlbnQsIGRlZmF1bHRDb250ZW50OiByZW5kZXJJbm5lciwgZGlkTW91bnQ6IG9wdGlvbnMud2Vla051bWJlckRpZE1vdW50LCB3aWxsVW5tb3VudDogb3B0aW9ucy53ZWVrTnVtYmVyV2lsbFVubW91bnQgfSwgcHJvcHMuY2hpbGRyZW4pKTtcbn0pKTsgfTtcbmZ1bmN0aW9uIHJlbmRlcklubmVyKGlubmVyUHJvcHMpIHtcbiAgICByZXR1cm4gaW5uZXJQcm9wcy50ZXh0O1xufVxuXG52YXIgUEFERElOR19GUk9NX1ZJRVdQT1JUID0gMTA7XG52YXIgUG9wb3ZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoUG9wb3ZlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQb3BvdmVyKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICB0aXRsZUlkOiBnZXRVbmlxdWVEb21JZCgpLFxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVSb290RWwgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIF90aGlzLnJvb3RFbCA9IGVsO1xuICAgICAgICAgICAgaWYgKF90aGlzLnByb3BzLmVsUmVmKSB7XG4gICAgICAgICAgICAgICAgc2V0UmVmKF90aGlzLnByb3BzLmVsUmVmLCBlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIFRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyAqYW55d2hlcmUqIGluIHRoZSBkb2N1bWVudCwgZm9yIHRoZSBhdXRvSGlkZSBmZWF0dXJlXG4gICAgICAgIF90aGlzLmhhbmRsZURvY3VtZW50TW91c2VEb3duID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICAvLyBvbmx5IGhpZGUgdGhlIHBvcG92ZXIgaWYgdGhlIGNsaWNrIGhhcHBlbmVkIG91dHNpZGUgdGhlIHBvcG92ZXJcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSBnZXRFdmVudFRhcmdldFZpYVJvb3QoZXYpO1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5yb290RWwuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIF90aGlzLmhhbmRsZUNsb3NlQ2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlRG9jdW1lbnRLZXlEb3duID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBpZiAoZXYua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgICAgICAgIF90aGlzLmhhbmRsZUNsb3NlQ2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlQ2xvc2VDbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvbkNsb3NlID0gX3RoaXMucHJvcHMub25DbG9zZTtcbiAgICAgICAgICAgIGlmIChvbkNsb3NlKSB7XG4gICAgICAgICAgICAgICAgb25DbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBvcG92ZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5jb250ZXh0LCB0aGVtZSA9IF9hLnRoZW1lLCBvcHRpb25zID0gX2Eub3B0aW9ucztcbiAgICAgICAgdmFyIF9iID0gdGhpcywgcHJvcHMgPSBfYi5wcm9wcywgc3RhdGUgPSBfYi5zdGF0ZTtcbiAgICAgICAgdmFyIGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICAgICAnZmMtcG9wb3ZlcicsXG4gICAgICAgICAgICB0aGVtZS5nZXRDbGFzcygncG9wb3ZlcicpLFxuICAgICAgICBdLmNvbmNhdChwcm9wcy5leHRyYUNsYXNzTmFtZXMgfHwgW10pO1xuICAgICAgICByZXR1cm4gdmRvbV9janMuY3JlYXRlUG9ydGFsKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgdHNsaWIuX19hc3NpZ24oeyBpZDogcHJvcHMuaWQsIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKCcgJyksIFwiYXJpYS1sYWJlbGxlZGJ5XCI6IHN0YXRlLnRpdGxlSWQgfSwgcHJvcHMuZXh0cmFBdHRycywgeyByZWY6IHRoaXMuaGFuZGxlUm9vdEVsIH0pLFxuICAgICAgICAgICAgdmRvbV9janMuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogJ2ZjLXBvcG92ZXItaGVhZGVyICcgKyB0aGVtZS5nZXRDbGFzcygncG9wb3ZlckhlYWRlcicpIH0sXG4gICAgICAgICAgICAgICAgdmRvbV9janMuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IFwiZmMtcG9wb3Zlci10aXRsZVwiLCBpZDogc3RhdGUudGl0bGVJZCB9LCBwcm9wcy50aXRsZSksXG4gICAgICAgICAgICAgICAgdmRvbV9janMuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6ICdmYy1wb3BvdmVyLWNsb3NlICcgKyB0aGVtZS5nZXRJY29uQ2xhc3MoJ2Nsb3NlJyksIHRpdGxlOiBvcHRpb25zLmNsb3NlSGludCwgb25DbGljazogdGhpcy5oYW5kbGVDbG9zZUNsaWNrIH0pKSxcbiAgICAgICAgICAgIHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6ICdmYy1wb3BvdmVyLWJvZHkgJyArIHRoZW1lLmdldENsYXNzKCdwb3BvdmVyQ29udGVudCcpIH0sIHByb3BzLmNoaWxkcmVuKSksIHByb3BzLnBhcmVudEVsKTtcbiAgICB9O1xuICAgIFBvcG92ZXIucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZURvY3VtZW50TW91c2VEb3duKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlRG9jdW1lbnRLZXlEb3duKTtcbiAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgfTtcbiAgICBQb3BvdmVyLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5oYW5kbGVEb2N1bWVudE1vdXNlRG93bik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZURvY3VtZW50S2V5RG93bik7XG4gICAgfTtcbiAgICBQb3BvdmVyLnByb3RvdHlwZS51cGRhdGVTaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaXNSdGwgPSB0aGlzLmNvbnRleHQuaXNSdGw7XG4gICAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsIGFsaWdubWVudEVsID0gX2EuYWxpZ25tZW50RWwsIGFsaWduR3JpZFRvcCA9IF9hLmFsaWduR3JpZFRvcDtcbiAgICAgICAgdmFyIHJvb3RFbCA9IHRoaXMucm9vdEVsO1xuICAgICAgICB2YXIgYWxpZ25tZW50UmVjdCA9IGNvbXB1dGVDbGlwcGVkQ2xpZW50UmVjdChhbGlnbm1lbnRFbCk7XG4gICAgICAgIGlmIChhbGlnbm1lbnRSZWN0KSB7XG4gICAgICAgICAgICB2YXIgcG9wb3ZlckRpbXMgPSByb290RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAvLyBwb3NpdGlvbiByZWxhdGl2ZSB0byB2aWV3cG9ydFxuICAgICAgICAgICAgdmFyIHBvcG92ZXJUb3AgPSBhbGlnbkdyaWRUb3BcbiAgICAgICAgICAgICAgICA/IGVsZW1lbnRDbG9zZXN0KGFsaWdubWVudEVsLCAnLmZjLXNjcm9sbGdyaWQnKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICAgICAgICAgICAgICA6IGFsaWdubWVudFJlY3QudG9wO1xuICAgICAgICAgICAgdmFyIHBvcG92ZXJMZWZ0ID0gaXNSdGwgPyBhbGlnbm1lbnRSZWN0LnJpZ2h0IC0gcG9wb3ZlckRpbXMud2lkdGggOiBhbGlnbm1lbnRSZWN0LmxlZnQ7XG4gICAgICAgICAgICAvLyBjb25zdHJhaW5cbiAgICAgICAgICAgIHBvcG92ZXJUb3AgPSBNYXRoLm1heChwb3BvdmVyVG9wLCBQQURESU5HX0ZST01fVklFV1BPUlQpO1xuICAgICAgICAgICAgcG9wb3ZlckxlZnQgPSBNYXRoLm1pbihwb3BvdmVyTGVmdCwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIC0gUEFERElOR19GUk9NX1ZJRVdQT1JUIC0gcG9wb3ZlckRpbXMud2lkdGgpO1xuICAgICAgICAgICAgcG9wb3ZlckxlZnQgPSBNYXRoLm1heChwb3BvdmVyTGVmdCwgUEFERElOR19GUk9NX1ZJRVdQT1JUKTtcbiAgICAgICAgICAgIHZhciBvcmlnaW5fMSA9IHJvb3RFbC5vZmZzZXRQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBhcHBseVN0eWxlKHJvb3RFbCwge1xuICAgICAgICAgICAgICAgIHRvcDogcG9wb3ZlclRvcCAtIG9yaWdpbl8xLnRvcCxcbiAgICAgICAgICAgICAgICBsZWZ0OiBwb3BvdmVyTGVmdCAtIG9yaWdpbl8xLmxlZnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFBvcG92ZXI7XG59KEJhc2VDb21wb25lbnQpKTtcblxudmFyIE1vcmVQb3BvdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhNb3JlUG9wb3ZlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNb3JlUG9wb3ZlcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmhhbmRsZVJvb3RFbCA9IGZ1bmN0aW9uIChyb290RWwpIHtcbiAgICAgICAgICAgIF90aGlzLnJvb3RFbCA9IHJvb3RFbDtcbiAgICAgICAgICAgIGlmIChyb290RWwpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5jb250ZXh0LnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQoX3RoaXMsIHtcbiAgICAgICAgICAgICAgICAgICAgZWw6IHJvb3RFbCxcbiAgICAgICAgICAgICAgICAgICAgdXNlRXZlbnRDZW50ZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY29udGV4dC51bnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQoX3RoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE1vcmVQb3BvdmVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuY29udGV4dCwgb3B0aW9ucyA9IF9hLm9wdGlvbnMsIGRhdGVFbnYgPSBfYS5kYXRlRW52O1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgc3RhcnREYXRlID0gcHJvcHMuc3RhcnREYXRlLCB0b2RheVJhbmdlID0gcHJvcHMudG9kYXlSYW5nZSwgZGF0ZVByb2ZpbGUgPSBwcm9wcy5kYXRlUHJvZmlsZTtcbiAgICAgICAgdmFyIHRpdGxlID0gZGF0ZUVudi5mb3JtYXQoc3RhcnREYXRlLCBvcHRpb25zLmRheVBvcG92ZXJGb3JtYXQpO1xuICAgICAgICByZXR1cm4gKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoRGF5Q2VsbFJvb3QsIHsgZGF0ZTogc3RhcnREYXRlLCBkYXRlUHJvZmlsZTogZGF0ZVByb2ZpbGUsIHRvZGF5UmFuZ2U6IHRvZGF5UmFuZ2UsIGVsUmVmOiB0aGlzLmhhbmRsZVJvb3RFbCB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBkYXlDbGFzc05hbWVzLCBkYXRhQXR0cnMpIHsgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFBvcG92ZXIsIHsgZWxSZWY6IHJvb3RFbFJlZiwgaWQ6IHByb3BzLmlkLCB0aXRsZTogdGl0bGUsIGV4dHJhQ2xhc3NOYW1lczogWydmYy1tb3JlLXBvcG92ZXInXS5jb25jYXQoZGF5Q2xhc3NOYW1lcyksIGV4dHJhQXR0cnM6IGRhdGFBdHRycyAvKiBUT0RPOiBtYWtlIHRoZXNlIHRpbWUtYmFzZWQgd2hlbiBub3Qgd2hvbGUtZGF5PyAqLywgcGFyZW50RWw6IHByb3BzLnBhcmVudEVsLCBhbGlnbm1lbnRFbDogcHJvcHMuYWxpZ25tZW50RWwsIGFsaWduR3JpZFRvcDogcHJvcHMuYWxpZ25HcmlkVG9wLCBvbkNsb3NlOiBwcm9wcy5vbkNsb3NlIH0sXG4gICAgICAgICAgICB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KERheUNlbGxDb250ZW50LCB7IGRhdGU6IHN0YXJ0RGF0ZSwgZGF0ZVByb2ZpbGU6IGRhdGVQcm9maWxlLCB0b2RheVJhbmdlOiB0b2RheVJhbmdlIH0sIGZ1bmN0aW9uIChpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpIHsgcmV0dXJuIChpbm5lckNvbnRlbnQgJiZcbiAgICAgICAgICAgICAgICB2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLW1vcmUtcG9wb3Zlci1taXNjXCIsIHJlZjogaW5uZXJFbFJlZiB9LCBpbm5lckNvbnRlbnQpKTsgfSksXG4gICAgICAgICAgICBwcm9wcy5jaGlsZHJlbikpOyB9KSk7XG4gICAgfTtcbiAgICBNb3JlUG9wb3Zlci5wcm90b3R5cGUucXVlcnlIaXQgPSBmdW5jdGlvbiAocG9zaXRpb25MZWZ0LCBwb3NpdGlvblRvcCwgZWxXaWR0aCwgZWxIZWlnaHQpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgcm9vdEVsID0gX2Eucm9vdEVsLCBwcm9wcyA9IF9hLnByb3BzO1xuICAgICAgICBpZiAocG9zaXRpb25MZWZ0ID49IDAgJiYgcG9zaXRpb25MZWZ0IDwgZWxXaWR0aCAmJlxuICAgICAgICAgICAgcG9zaXRpb25Ub3AgPj0gMCAmJiBwb3NpdGlvblRvcCA8IGVsSGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSxcbiAgICAgICAgICAgICAgICBkYXRlU3BhbjogdHNsaWIuX19hc3NpZ24oeyBhbGxEYXk6IHRydWUsIHJhbmdlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogcHJvcHMuc3RhcnREYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBwcm9wcy5lbmREYXRlLFxuICAgICAgICAgICAgICAgICAgICB9IH0sIHByb3BzLmV4dHJhRGF0ZVNwYW4pLFxuICAgICAgICAgICAgICAgIGRheUVsOiByb290RWwsXG4gICAgICAgICAgICAgICAgcmVjdDoge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBlbFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICBib3R0b206IGVsSGVpZ2h0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbGF5ZXI6IDEsIC8vIGltcG9ydGFudCB3aGVuIGNvbXBhcmluZyB3aXRoIGhpdHMgZnJvbSBvdGhlciBjb21wb25lbnRzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIE1vcmVQb3BvdmVyO1xufShEYXRlQ29tcG9uZW50KSk7XG5cbnZhciBNb3JlTGlua1Jvb3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKE1vcmVMaW5rUm9vdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNb3JlTGlua1Jvb3QoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5saW5rRWxSZWYgPSB2ZG9tX2Nqcy5jcmVhdGVSZWYoKTtcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBpc1BvcG92ZXJPcGVuOiBmYWxzZSxcbiAgICAgICAgICAgIHBvcG92ZXJJZDogZ2V0VW5pcXVlRG9tSWQoKSxcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IF90aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBjb250ZXh0ID0gX2EuY29udGV4dDtcbiAgICAgICAgICAgIHZhciBtb3JlTGlua0NsaWNrID0gY29udGV4dC5vcHRpb25zLm1vcmVMaW5rQ2xpY2s7XG4gICAgICAgICAgICB2YXIgZGF0ZSA9IGNvbXB1dGVSYW5nZShwcm9wcykuc3RhcnQ7XG4gICAgICAgICAgICBmdW5jdGlvbiBidWlsZFB1YmxpY1NlZyhzZWcpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSBzZWcuZXZlbnRSYW5nZSwgZGVmID0gX2EuZGVmLCBpbnN0YW5jZSA9IF9hLmluc3RhbmNlLCByYW5nZSA9IF9hLnJhbmdlO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBuZXcgRXZlbnRBcGkoY29udGV4dCwgZGVmLCBpbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBjb250ZXh0LmRhdGVFbnYudG9EYXRlKHJhbmdlLnN0YXJ0KSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBjb250ZXh0LmRhdGVFbnYudG9EYXRlKHJhbmdlLmVuZCksXG4gICAgICAgICAgICAgICAgICAgIGlzU3RhcnQ6IHNlZy5pc1N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICBpc0VuZDogc2VnLmlzRW5kLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1vcmVMaW5rQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBtb3JlTGlua0NsaWNrID0gbW9yZUxpbmtDbGljayh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGU6IGRhdGUsXG4gICAgICAgICAgICAgICAgICAgIGFsbERheTogQm9vbGVhbihwcm9wcy5hbGxEYXlEYXRlKSxcbiAgICAgICAgICAgICAgICAgICAgYWxsU2VnczogcHJvcHMuYWxsU2Vncy5tYXAoYnVpbGRQdWJsaWNTZWcpLFxuICAgICAgICAgICAgICAgICAgICBoaWRkZW5TZWdzOiBwcm9wcy5oaWRkZW5TZWdzLm1hcChidWlsZFB1YmxpY1NlZyksXG4gICAgICAgICAgICAgICAgICAgIGpzRXZlbnQ6IGV2LFxuICAgICAgICAgICAgICAgICAgICB2aWV3OiBjb250ZXh0LnZpZXdBcGksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW1vcmVMaW5rQ2xpY2sgfHwgbW9yZUxpbmtDbGljayA9PT0gJ3BvcG92ZXInKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuc2V0U3RhdGUoeyBpc1BvcG92ZXJPcGVuOiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1vcmVMaW5rQ2xpY2sgPT09ICdzdHJpbmcnKSB7IC8vIGEgdmlldyBuYW1lXG4gICAgICAgICAgICAgICAgY29udGV4dC5jYWxlbmRhckFwaS56b29tVG8oZGF0ZSwgbW9yZUxpbmtDbGljayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmhhbmRsZVBvcG92ZXJDbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLnNldFN0YXRlKHsgaXNQb3BvdmVyT3BlbjogZmFsc2UgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgTW9yZUxpbmtSb290LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIHN0YXRlID0gX2Euc3RhdGU7XG4gICAgICAgIHJldHVybiAodmRvbV9janMuY3JlYXRlRWxlbWVudChWaWV3Q29udGV4dFR5cGUuQ29uc3VtZXIsIG51bGwsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgICAgICB2YXIgdmlld0FwaSA9IGNvbnRleHQudmlld0FwaSwgb3B0aW9ucyA9IGNvbnRleHQub3B0aW9ucywgY2FsZW5kYXJBcGkgPSBjb250ZXh0LmNhbGVuZGFyQXBpO1xuICAgICAgICAgICAgdmFyIG1vcmVMaW5rVGV4dCA9IG9wdGlvbnMubW9yZUxpbmtUZXh0O1xuICAgICAgICAgICAgdmFyIG1vcmVDbnQgPSBwcm9wcy5tb3JlQ250O1xuICAgICAgICAgICAgdmFyIHJhbmdlID0gY29tcHV0ZVJhbmdlKHByb3BzKTtcbiAgICAgICAgICAgIHZhciB0ZXh0ID0gdHlwZW9mIG1vcmVMaW5rVGV4dCA9PT0gJ2Z1bmN0aW9uJyAvLyBUT0RPOiBldmVudHVhbGx5IHVzZSBmb3JtYXRXaXRoT3JkaW5hbHNcbiAgICAgICAgICAgICAgICA/IG1vcmVMaW5rVGV4dC5jYWxsKGNhbGVuZGFyQXBpLCBtb3JlQ250KVxuICAgICAgICAgICAgICAgIDogXCIrXCIgKyBtb3JlQ250ICsgXCIgXCIgKyBtb3JlTGlua1RleHQ7XG4gICAgICAgICAgICB2YXIgdGl0bGUgPSBmb3JtYXRXaXRoT3JkaW5hbHMob3B0aW9ucy5tb3JlTGlua0hpbnQsIFttb3JlQ250XSwgdGV4dCk7XG4gICAgICAgICAgICB2YXIgaG9va1Byb3BzID0ge1xuICAgICAgICAgICAgICAgIG51bTogbW9yZUNudCxcbiAgICAgICAgICAgICAgICBzaG9ydFRleHQ6IFwiK1wiICsgbW9yZUNudCxcbiAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICAgICAgICAgIHZpZXc6IHZpZXdBcGksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuICh2ZG9tX2Nqcy5jcmVhdGVFbGVtZW50KHZkb21fY2pzLkZyYWdtZW50LCBudWxsLFxuICAgICAgICAgICAgICAgIEJvb2xlYW4ocHJvcHMubW9yZUNudCkgJiYgKHZkb21fY2pzLmNyZWF0ZUVsZW1lbnQoUmVuZGVySG9vaywgeyBlbFJlZjogX3RoaXMubGlua0VsUmVmLCBob29rUHJvcHM6IGhvb2tQcm9wcywgY2xhc3NOYW1lczogb3B0aW9ucy5tb3JlTGlua0NsYXNzTmFtZXMsIGNvbnRlbnQ6IG9wdGlvbnMubW9yZUxpbmtDb250ZW50LCBkZWZhdWx0Q29udGVudDogcHJvcHMuZGVmYXVsdENvbnRlbnQgfHwgcmVuZGVyTW9yZUxpbmtJbm5lciwgZGlkTW91bnQ6IG9wdGlvbnMubW9yZUxpbmtEaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMubW9yZUxpbmtXaWxsVW5tb3VudCB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjdXN0b21DbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpIHsgcmV0dXJuIHByb3BzLmNoaWxkcmVuKHJvb3RFbFJlZiwgWydmYy1tb3JlLWxpbmsnXS5jb25jYXQoY3VzdG9tQ2xhc3NOYW1lcyksIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCwgX3RoaXMuaGFuZGxlQ2xpY2ssIHRpdGxlLCBzdGF0ZS5pc1BvcG92ZXJPcGVuLCBzdGF0ZS5pc1BvcG92ZXJPcGVuID8gc3RhdGUucG9wb3ZlcklkIDogJycpOyB9KSksXG4gICAgICAgICAgICAgICAgc3RhdGUuaXNQb3BvdmVyT3BlbiAmJiAodmRvbV9janMuY3JlYXRlRWxlbWVudChNb3JlUG9wb3ZlciwgeyBpZDogc3RhdGUucG9wb3ZlcklkLCBzdGFydERhdGU6IHJhbmdlLnN0YXJ0LCBlbmREYXRlOiByYW5nZS5lbmQsIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSwgZXh0cmFEYXRlU3BhbjogcHJvcHMuZXh0cmFEYXRlU3BhbiwgcGFyZW50RWw6IF90aGlzLnBhcmVudEVsLCBhbGlnbm1lbnRFbDogcHJvcHMuYWxpZ25tZW50RWxSZWYuY3VycmVudCwgYWxpZ25HcmlkVG9wOiBwcm9wcy5hbGlnbkdyaWRUb3AsIG9uQ2xvc2U6IF90aGlzLmhhbmRsZVBvcG92ZXJDbG9zZSB9LCBwcm9wcy5wb3BvdmVyQ29udGVudCgpKSkpKTtcbiAgICAgICAgfSkpO1xuICAgIH07XG4gICAgTW9yZUxpbmtSb290LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVQYXJlbnRFbCgpO1xuICAgIH07XG4gICAgTW9yZUxpbmtSb290LnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUGFyZW50RWwoKTtcbiAgICB9O1xuICAgIE1vcmVMaW5rUm9vdC5wcm90b3R5cGUudXBkYXRlUGFyZW50RWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmxpbmtFbFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEVsID0gZWxlbWVudENsb3Nlc3QodGhpcy5saW5rRWxSZWYuY3VycmVudCwgJy5mYy12aWV3LWhhcm5lc3MnKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE1vcmVMaW5rUm9vdDtcbn0oQmFzZUNvbXBvbmVudCkpO1xuZnVuY3Rpb24gcmVuZGVyTW9yZUxpbmtJbm5lcihwcm9wcykge1xuICAgIHJldHVybiBwcm9wcy50ZXh0O1xufVxuZnVuY3Rpb24gY29tcHV0ZVJhbmdlKHByb3BzKSB7XG4gICAgaWYgKHByb3BzLmFsbERheURhdGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXJ0OiBwcm9wcy5hbGxEYXlEYXRlLFxuICAgICAgICAgICAgZW5kOiBhZGREYXlzKHByb3BzLmFsbERheURhdGUsIDEpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICB2YXIgaGlkZGVuU2VncyA9IHByb3BzLmhpZGRlblNlZ3M7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IGNvbXB1dGVFYXJsaWVzdFNlZ1N0YXJ0KGhpZGRlblNlZ3MpLFxuICAgICAgICBlbmQ6IGNvbXB1dGVMYXRlc3RTZWdFbmQoaGlkZGVuU2VncyksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVFYXJsaWVzdFNlZ1N0YXJ0KHNlZ3MpIHtcbiAgICByZXR1cm4gc2Vncy5yZWR1Y2UocGlja0VhcmxpZXN0U3RhcnQpLmV2ZW50UmFuZ2UucmFuZ2Uuc3RhcnQ7XG59XG5mdW5jdGlvbiBwaWNrRWFybGllc3RTdGFydChzZWcwLCBzZWcxKSB7XG4gICAgcmV0dXJuIHNlZzAuZXZlbnRSYW5nZS5yYW5nZS5zdGFydCA8IHNlZzEuZXZlbnRSYW5nZS5yYW5nZS5zdGFydCA/IHNlZzAgOiBzZWcxO1xufVxuZnVuY3Rpb24gY29tcHV0ZUxhdGVzdFNlZ0VuZChzZWdzKSB7XG4gICAgcmV0dXJuIHNlZ3MucmVkdWNlKHBpY2tMYXRlc3RFbmQpLmV2ZW50UmFuZ2UucmFuZ2UuZW5kO1xufVxuZnVuY3Rpb24gcGlja0xhdGVzdEVuZChzZWcwLCBzZWcxKSB7XG4gICAgcmV0dXJuIHNlZzAuZXZlbnRSYW5nZS5yYW5nZS5lbmQgPiBzZWcxLmV2ZW50UmFuZ2UucmFuZ2UuZW5kID8gc2VnMCA6IHNlZzE7XG59XG5cbi8vIGV4cG9ydHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgdmVyc2lvbiA9ICc1LjExLjInOyAvLyBpbXBvcnRhbnQgdG8gdHlwZSBpdCwgc28gLmQudHMgaGFzIGdlbmVyaWMgc3RyaW5nXG5cbmV4cG9ydHMuQkFTRV9PUFRJT05fREVGQVVMVFMgPSBCQVNFX09QVElPTl9ERUZBVUxUUztcbmV4cG9ydHMuQkFTRV9PUFRJT05fUkVGSU5FUlMgPSBCQVNFX09QVElPTl9SRUZJTkVSUztcbmV4cG9ydHMuQmFzZUNvbXBvbmVudCA9IEJhc2VDb21wb25lbnQ7XG5leHBvcnRzLkJnRXZlbnQgPSBCZ0V2ZW50O1xuZXhwb3J0cy5DYWxlbmRhckFwaSA9IENhbGVuZGFyQXBpO1xuZXhwb3J0cy5DYWxlbmRhckNvbnRlbnQgPSBDYWxlbmRhckNvbnRlbnQ7XG5leHBvcnRzLkNhbGVuZGFyRGF0YU1hbmFnZXIgPSBDYWxlbmRhckRhdGFNYW5hZ2VyO1xuZXhwb3J0cy5DYWxlbmRhckRhdGFQcm92aWRlciA9IENhbGVuZGFyRGF0YVByb3ZpZGVyO1xuZXhwb3J0cy5DYWxlbmRhclJvb3QgPSBDYWxlbmRhclJvb3Q7XG5leHBvcnRzLkNvbnRlbnRIb29rID0gQ29udGVudEhvb2s7XG5leHBvcnRzLkN1c3RvbUNvbnRlbnRSZW5kZXJDb250ZXh0ID0gQ3VzdG9tQ29udGVudFJlbmRlckNvbnRleHQ7XG5leHBvcnRzLkRhdGVDb21wb25lbnQgPSBEYXRlQ29tcG9uZW50O1xuZXhwb3J0cy5EYXRlRW52ID0gRGF0ZUVudjtcbmV4cG9ydHMuRGF0ZVByb2ZpbGVHZW5lcmF0b3IgPSBEYXRlUHJvZmlsZUdlbmVyYXRvcjtcbmV4cG9ydHMuRGF5Q2VsbENvbnRlbnQgPSBEYXlDZWxsQ29udGVudDtcbmV4cG9ydHMuRGF5Q2VsbFJvb3QgPSBEYXlDZWxsUm9vdDtcbmV4cG9ydHMuRGF5SGVhZGVyID0gRGF5SGVhZGVyO1xuZXhwb3J0cy5EYXlTZXJpZXNNb2RlbCA9IERheVNlcmllc01vZGVsO1xuZXhwb3J0cy5EYXlUYWJsZU1vZGVsID0gRGF5VGFibGVNb2RlbDtcbmV4cG9ydHMuRGVsYXllZFJ1bm5lciA9IERlbGF5ZWRSdW5uZXI7XG5leHBvcnRzLkVsZW1lbnREcmFnZ2luZyA9IEVsZW1lbnREcmFnZ2luZztcbmV4cG9ydHMuRWxlbWVudFNjcm9sbENvbnRyb2xsZXIgPSBFbGVtZW50U2Nyb2xsQ29udHJvbGxlcjtcbmV4cG9ydHMuRW1pdHRlciA9IEVtaXR0ZXI7XG5leHBvcnRzLkV2ZW50QXBpID0gRXZlbnRBcGk7XG5leHBvcnRzLkV2ZW50Um9vdCA9IEV2ZW50Um9vdDtcbmV4cG9ydHMuRXZlbnRTb3VyY2VBcGkgPSBFdmVudFNvdXJjZUFwaTtcbmV4cG9ydHMuSW50ZXJhY3Rpb24gPSBJbnRlcmFjdGlvbjtcbmV4cG9ydHMuTW9yZUxpbmtSb290ID0gTW9yZUxpbmtSb290O1xuZXhwb3J0cy5Nb3VudEhvb2sgPSBNb3VudEhvb2s7XG5leHBvcnRzLk5hbWVkVGltZVpvbmVJbXBsID0gTmFtZWRUaW1lWm9uZUltcGw7XG5leHBvcnRzLk5vd0luZGljYXRvclJvb3QgPSBOb3dJbmRpY2F0b3JSb290O1xuZXhwb3J0cy5Ob3dUaW1lciA9IE5vd1RpbWVyO1xuZXhwb3J0cy5Qb3NpdGlvbkNhY2hlID0gUG9zaXRpb25DYWNoZTtcbmV4cG9ydHMuUmVmTWFwID0gUmVmTWFwO1xuZXhwb3J0cy5SZW5kZXJIb29rID0gUmVuZGVySG9vaztcbmV4cG9ydHMuU2Nyb2xsQ29udHJvbGxlciA9IFNjcm9sbENvbnRyb2xsZXI7XG5leHBvcnRzLlNjcm9sbFJlc3BvbmRlciA9IFNjcm9sbFJlc3BvbmRlcjtcbmV4cG9ydHMuU2Nyb2xsZXIgPSBTY3JvbGxlcjtcbmV4cG9ydHMuU2VnSGllcmFyY2h5ID0gU2VnSGllcmFyY2h5O1xuZXhwb3J0cy5TaW1wbGVTY3JvbGxHcmlkID0gU2ltcGxlU2Nyb2xsR3JpZDtcbmV4cG9ydHMuU2xpY2VyID0gU2xpY2VyO1xuZXhwb3J0cy5TcGxpdHRlciA9IFNwbGl0dGVyO1xuZXhwb3J0cy5TdGFuZGFyZEV2ZW50ID0gU3RhbmRhcmRFdmVudDtcbmV4cG9ydHMuVGFibGVEYXRlQ2VsbCA9IFRhYmxlRGF0ZUNlbGw7XG5leHBvcnRzLlRhYmxlRG93Q2VsbCA9IFRhYmxlRG93Q2VsbDtcbmV4cG9ydHMuVGhlbWUgPSBUaGVtZTtcbmV4cG9ydHMuVmlld0FwaSA9IFZpZXdBcGk7XG5leHBvcnRzLlZpZXdDb250ZXh0VHlwZSA9IFZpZXdDb250ZXh0VHlwZTtcbmV4cG9ydHMuVmlld1Jvb3QgPSBWaWV3Um9vdDtcbmV4cG9ydHMuV2Vla051bWJlclJvb3QgPSBXZWVrTnVtYmVyUm9vdDtcbmV4cG9ydHMuV2luZG93U2Nyb2xsQ29udHJvbGxlciA9IFdpbmRvd1Njcm9sbENvbnRyb2xsZXI7XG5leHBvcnRzLmFkZERheXMgPSBhZGREYXlzO1xuZXhwb3J0cy5hZGREdXJhdGlvbnMgPSBhZGREdXJhdGlvbnM7XG5leHBvcnRzLmFkZE1zID0gYWRkTXM7XG5leHBvcnRzLmFkZFdlZWtzID0gYWRkV2Vla3M7XG5leHBvcnRzLmFsbG93Q29udGV4dE1lbnUgPSBhbGxvd0NvbnRleHRNZW51O1xuZXhwb3J0cy5hbGxvd1NlbGVjdGlvbiA9IGFsbG93U2VsZWN0aW9uO1xuZXhwb3J0cy5hcHBseU11dGF0aW9uVG9FdmVudFN0b3JlID0gYXBwbHlNdXRhdGlvblRvRXZlbnRTdG9yZTtcbmV4cG9ydHMuYXBwbHlTdHlsZSA9IGFwcGx5U3R5bGU7XG5leHBvcnRzLmFwcGx5U3R5bGVQcm9wID0gYXBwbHlTdHlsZVByb3A7XG5leHBvcnRzLmFzQ2xlYW5EYXlzID0gYXNDbGVhbkRheXM7XG5leHBvcnRzLmFzUm91Z2hNaW51dGVzID0gYXNSb3VnaE1pbnV0ZXM7XG5leHBvcnRzLmFzUm91Z2hNcyA9IGFzUm91Z2hNcztcbmV4cG9ydHMuYXNSb3VnaFNlY29uZHMgPSBhc1JvdWdoU2Vjb25kcztcbmV4cG9ydHMuYmluYXJ5U2VhcmNoID0gYmluYXJ5U2VhcmNoO1xuZXhwb3J0cy5idWlsZENsYXNzTmFtZU5vcm1hbGl6ZXIgPSBidWlsZENsYXNzTmFtZU5vcm1hbGl6ZXI7XG5leHBvcnRzLmJ1aWxkRW50cnlLZXkgPSBidWlsZEVudHJ5S2V5O1xuZXhwb3J0cy5idWlsZEV2ZW50QXBpcyA9IGJ1aWxkRXZlbnRBcGlzO1xuZXhwb3J0cy5idWlsZEV2ZW50UmFuZ2VLZXkgPSBidWlsZEV2ZW50UmFuZ2VLZXk7XG5leHBvcnRzLmJ1aWxkSGFzaEZyb21BcnJheSA9IGJ1aWxkSGFzaEZyb21BcnJheTtcbmV4cG9ydHMuYnVpbGRJc29TdHJpbmcgPSBidWlsZElzb1N0cmluZztcbmV4cG9ydHMuYnVpbGROYXZMaW5rQXR0cnMgPSBidWlsZE5hdkxpbmtBdHRycztcbmV4cG9ydHMuYnVpbGRTZWdDb21wYXJlT2JqID0gYnVpbGRTZWdDb21wYXJlT2JqO1xuZXhwb3J0cy5idWlsZFNlZ1RpbWVUZXh0ID0gYnVpbGRTZWdUaW1lVGV4dDtcbmV4cG9ydHMuY29sbGVjdEZyb21IYXNoID0gY29sbGVjdEZyb21IYXNoO1xuZXhwb3J0cy5jb21iaW5lRXZlbnRVaXMgPSBjb21iaW5lRXZlbnRVaXM7XG5leHBvcnRzLmNvbXBhcmVCeUZpZWxkU3BlYyA9IGNvbXBhcmVCeUZpZWxkU3BlYztcbmV4cG9ydHMuY29tcGFyZUJ5RmllbGRTcGVjcyA9IGNvbXBhcmVCeUZpZWxkU3BlY3M7XG5leHBvcnRzLmNvbXBhcmVOdW1iZXJzID0gY29tcGFyZU51bWJlcnM7XG5leHBvcnRzLmNvbXBhcmVPYmpzID0gY29tcGFyZU9ianM7XG5leHBvcnRzLmNvbXB1dGVFYXJsaWVzdFNlZ1N0YXJ0ID0gY29tcHV0ZUVhcmxpZXN0U2VnU3RhcnQ7XG5leHBvcnRzLmNvbXB1dGVFZGdlcyA9IGNvbXB1dGVFZGdlcztcbmV4cG9ydHMuY29tcHV0ZUZhbGxiYWNrSGVhZGVyRm9ybWF0ID0gY29tcHV0ZUZhbGxiYWNrSGVhZGVyRm9ybWF0O1xuZXhwb3J0cy5jb21wdXRlSGVpZ2h0QW5kTWFyZ2lucyA9IGNvbXB1dGVIZWlnaHRBbmRNYXJnaW5zO1xuZXhwb3J0cy5jb21wdXRlSW5uZXJSZWN0ID0gY29tcHV0ZUlubmVyUmVjdDtcbmV4cG9ydHMuY29tcHV0ZVJlY3QgPSBjb21wdXRlUmVjdDtcbmV4cG9ydHMuY29tcHV0ZVNlZ0RyYWdnYWJsZSA9IGNvbXB1dGVTZWdEcmFnZ2FibGU7XG5leHBvcnRzLmNvbXB1dGVTZWdFbmRSZXNpemFibGUgPSBjb21wdXRlU2VnRW5kUmVzaXphYmxlO1xuZXhwb3J0cy5jb21wdXRlU2VnU3RhcnRSZXNpemFibGUgPSBjb21wdXRlU2VnU3RhcnRSZXNpemFibGU7XG5leHBvcnRzLmNvbXB1dGVTaHJpbmtXaWR0aCA9IGNvbXB1dGVTaHJpbmtXaWR0aDtcbmV4cG9ydHMuY29tcHV0ZVNtYWxsZXN0Q2VsbFdpZHRoID0gY29tcHV0ZVNtYWxsZXN0Q2VsbFdpZHRoO1xuZXhwb3J0cy5jb21wdXRlVmlzaWJsZURheVJhbmdlID0gY29tcHV0ZVZpc2libGVEYXlSYW5nZTtcbmV4cG9ydHMuY29uZmlnID0gY29uZmlnO1xuZXhwb3J0cy5jb25zdHJhaW5Qb2ludCA9IGNvbnN0cmFpblBvaW50O1xuZXhwb3J0cy5jcmVhdGVBcmlhQ2xpY2tBdHRycyA9IGNyZWF0ZUFyaWFDbGlja0F0dHJzO1xuZXhwb3J0cy5jcmVhdGVEdXJhdGlvbiA9IGNyZWF0ZUR1cmF0aW9uO1xuZXhwb3J0cy5jcmVhdGVFbXB0eUV2ZW50U3RvcmUgPSBjcmVhdGVFbXB0eUV2ZW50U3RvcmU7XG5leHBvcnRzLmNyZWF0ZUV2ZW50SW5zdGFuY2UgPSBjcmVhdGVFdmVudEluc3RhbmNlO1xuZXhwb3J0cy5jcmVhdGVFdmVudFVpID0gY3JlYXRlRXZlbnRVaTtcbmV4cG9ydHMuY3JlYXRlRm9ybWF0dGVyID0gY3JlYXRlRm9ybWF0dGVyO1xuZXhwb3J0cy5jcmVhdGVQbHVnaW4gPSBjcmVhdGVQbHVnaW47XG5leHBvcnRzLmRpZmZEYXRlcyA9IGRpZmZEYXRlcztcbmV4cG9ydHMuZGlmZkRheUFuZFRpbWUgPSBkaWZmRGF5QW5kVGltZTtcbmV4cG9ydHMuZGlmZkRheXMgPSBkaWZmRGF5cztcbmV4cG9ydHMuZGlmZlBvaW50cyA9IGRpZmZQb2ludHM7XG5leHBvcnRzLmRpZmZXZWVrcyA9IGRpZmZXZWVrcztcbmV4cG9ydHMuZGlmZldob2xlRGF5cyA9IGRpZmZXaG9sZURheXM7XG5leHBvcnRzLmRpZmZXaG9sZVdlZWtzID0gZGlmZldob2xlV2Vla3M7XG5leHBvcnRzLmRpc2FibGVDdXJzb3IgPSBkaXNhYmxlQ3Vyc29yO1xuZXhwb3J0cy5lbGVtZW50Q2xvc2VzdCA9IGVsZW1lbnRDbG9zZXN0O1xuZXhwb3J0cy5lbGVtZW50TWF0Y2hlcyA9IGVsZW1lbnRNYXRjaGVzO1xuZXhwb3J0cy5lbmFibGVDdXJzb3IgPSBlbmFibGVDdXJzb3I7XG5leHBvcnRzLmV2ZW50VHVwbGVUb1N0b3JlID0gZXZlbnRUdXBsZVRvU3RvcmU7XG5leHBvcnRzLmZpbHRlckV2ZW50U3RvcmVEZWZzID0gZmlsdGVyRXZlbnRTdG9yZURlZnM7XG5leHBvcnRzLmZpbHRlckhhc2ggPSBmaWx0ZXJIYXNoO1xuZXhwb3J0cy5maW5kRGlyZWN0Q2hpbGRyZW4gPSBmaW5kRGlyZWN0Q2hpbGRyZW47XG5leHBvcnRzLmZpbmRFbGVtZW50cyA9IGZpbmRFbGVtZW50cztcbmV4cG9ydHMuZmxleGlibGVDb21wYXJlID0gZmxleGlibGVDb21wYXJlO1xuZXhwb3J0cy5mb3JtYXREYXRlID0gZm9ybWF0RGF0ZTtcbmV4cG9ydHMuZm9ybWF0RGF5U3RyaW5nID0gZm9ybWF0RGF5U3RyaW5nO1xuZXhwb3J0cy5mb3JtYXRJc29UaW1lU3RyaW5nID0gZm9ybWF0SXNvVGltZVN0cmluZztcbmV4cG9ydHMuZm9ybWF0UmFuZ2UgPSBmb3JtYXRSYW5nZTtcbmV4cG9ydHMuZ2V0QWxsb3dZU2Nyb2xsaW5nID0gZ2V0QWxsb3dZU2Nyb2xsaW5nO1xuZXhwb3J0cy5nZXRDYW5WR3Jvd1dpdGhpbkNlbGwgPSBnZXRDYW5WR3Jvd1dpdGhpbkNlbGw7XG5leHBvcnRzLmdldENsaXBwaW5nUGFyZW50cyA9IGdldENsaXBwaW5nUGFyZW50cztcbmV4cG9ydHMuZ2V0RGF0ZU1ldGEgPSBnZXREYXRlTWV0YTtcbmV4cG9ydHMuZ2V0RGF5Q2xhc3NOYW1lcyA9IGdldERheUNsYXNzTmFtZXM7XG5leHBvcnRzLmdldERlZmF1bHRFdmVudEVuZCA9IGdldERlZmF1bHRFdmVudEVuZDtcbmV4cG9ydHMuZ2V0RWxSb290ID0gZ2V0RWxSb290O1xuZXhwb3J0cy5nZXRFbFNlZyA9IGdldEVsU2VnO1xuZXhwb3J0cy5nZXRFbnRyeVNwYW5FbmQgPSBnZXRFbnRyeVNwYW5FbmQ7XG5leHBvcnRzLmdldEV2ZW50Q2xhc3NOYW1lcyA9IGdldEV2ZW50Q2xhc3NOYW1lcztcbmV4cG9ydHMuZ2V0RXZlbnRUYXJnZXRWaWFSb290ID0gZ2V0RXZlbnRUYXJnZXRWaWFSb290O1xuZXhwb3J0cy5nZXRJc1J0bFNjcm9sbGJhck9uTGVmdCA9IGdldElzUnRsU2Nyb2xsYmFyT25MZWZ0O1xuZXhwb3J0cy5nZXRSZWN0Q2VudGVyID0gZ2V0UmVjdENlbnRlcjtcbmV4cG9ydHMuZ2V0UmVsZXZhbnRFdmVudHMgPSBnZXRSZWxldmFudEV2ZW50cztcbmV4cG9ydHMuZ2V0U2Nyb2xsR3JpZENsYXNzTmFtZXMgPSBnZXRTY3JvbGxHcmlkQ2xhc3NOYW1lcztcbmV4cG9ydHMuZ2V0U2Nyb2xsYmFyV2lkdGhzID0gZ2V0U2Nyb2xsYmFyV2lkdGhzO1xuZXhwb3J0cy5nZXRTZWN0aW9uQ2xhc3NOYW1lcyA9IGdldFNlY3Rpb25DbGFzc05hbWVzO1xuZXhwb3J0cy5nZXRTZWN0aW9uSGFzTGlxdWlkSGVpZ2h0ID0gZ2V0U2VjdGlvbkhhc0xpcXVpZEhlaWdodDtcbmV4cG9ydHMuZ2V0U2VnQW5jaG9yQXR0cnMgPSBnZXRTZWdBbmNob3JBdHRycztcbmV4cG9ydHMuZ2V0U2VnTWV0YSA9IGdldFNlZ01ldGE7XG5leHBvcnRzLmdldFNsb3RDbGFzc05hbWVzID0gZ2V0U2xvdENsYXNzTmFtZXM7XG5leHBvcnRzLmdldFN0aWNreUZvb3RlclNjcm9sbGJhciA9IGdldFN0aWNreUZvb3RlclNjcm9sbGJhcjtcbmV4cG9ydHMuZ2V0U3RpY2t5SGVhZGVyRGF0ZXMgPSBnZXRTdGlja3lIZWFkZXJEYXRlcztcbmV4cG9ydHMuZ2V0VW5lcXVhbFByb3BzID0gZ2V0VW5lcXVhbFByb3BzO1xuZXhwb3J0cy5nZXRVbmlxdWVEb21JZCA9IGdldFVuaXF1ZURvbUlkO1xuZXhwb3J0cy5nbG9iYWxMb2NhbGVzID0gZ2xvYmFsTG9jYWxlcztcbmV4cG9ydHMuZ2xvYmFsUGx1Z2lucyA9IGdsb2JhbFBsdWdpbnM7XG5leHBvcnRzLmdyZWF0ZXN0RHVyYXRpb25EZW5vbWluYXRvciA9IGdyZWF0ZXN0RHVyYXRpb25EZW5vbWluYXRvcjtcbmV4cG9ydHMuZ3JvdXBJbnRlcnNlY3RpbmdFbnRyaWVzID0gZ3JvdXBJbnRlcnNlY3RpbmdFbnRyaWVzO1xuZXhwb3J0cy5ndWlkID0gZ3VpZDtcbmV4cG9ydHMuaGFzQmdSZW5kZXJpbmcgPSBoYXNCZ1JlbmRlcmluZztcbmV4cG9ydHMuaGFzU2hyaW5rV2lkdGggPSBoYXNTaHJpbmtXaWR0aDtcbmV4cG9ydHMuaWRlbnRpdHkgPSBpZGVudGl0eTtcbmV4cG9ydHMuaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlID0gaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlO1xuZXhwb3J0cy5pbnRlcmFjdGlvblNldHRpbmdzVG9TdG9yZSA9IGludGVyYWN0aW9uU2V0dGluZ3NUb1N0b3JlO1xuZXhwb3J0cy5pbnRlcnNlY3RSYW5nZXMgPSBpbnRlcnNlY3RSYW5nZXM7XG5leHBvcnRzLmludGVyc2VjdFJlY3RzID0gaW50ZXJzZWN0UmVjdHM7XG5leHBvcnRzLmludGVyc2VjdFNwYW5zID0gaW50ZXJzZWN0U3BhbnM7XG5leHBvcnRzLmlzQXJyYXlzRXF1YWwgPSBpc0FycmF5c0VxdWFsO1xuZXhwb3J0cy5pc0NvbFByb3BzRXF1YWwgPSBpc0NvbFByb3BzRXF1YWw7XG5leHBvcnRzLmlzRGF0ZVNlbGVjdGlvblZhbGlkID0gaXNEYXRlU2VsZWN0aW9uVmFsaWQ7XG5leHBvcnRzLmlzRGF0ZVNwYW5zRXF1YWwgPSBpc0RhdGVTcGFuc0VxdWFsO1xuZXhwb3J0cy5pc0ludCA9IGlzSW50O1xuZXhwb3J0cy5pc0ludGVyYWN0aW9uVmFsaWQgPSBpc0ludGVyYWN0aW9uVmFsaWQ7XG5leHBvcnRzLmlzTXVsdGlEYXlSYW5nZSA9IGlzTXVsdGlEYXlSYW5nZTtcbmV4cG9ydHMuaXNQcm9wc0VxdWFsID0gaXNQcm9wc0VxdWFsO1xuZXhwb3J0cy5pc1Byb3BzVmFsaWQgPSBpc1Byb3BzVmFsaWQ7XG5leHBvcnRzLmlzVmFsaWREYXRlID0gaXNWYWxpZERhdGU7XG5leHBvcnRzLmpvaW5TcGFucyA9IGpvaW5TcGFucztcbmV4cG9ydHMubGlzdGVuQnlTZWxlY3RvciA9IGxpc3RlbkJ5U2VsZWN0b3I7XG5leHBvcnRzLm1hcEhhc2ggPSBtYXBIYXNoO1xuZXhwb3J0cy5tZW1vaXplID0gbWVtb2l6ZTtcbmV4cG9ydHMubWVtb2l6ZUFycmF5bGlrZSA9IG1lbW9pemVBcnJheWxpa2U7XG5leHBvcnRzLm1lbW9pemVIYXNobGlrZSA9IG1lbW9pemVIYXNobGlrZTtcbmV4cG9ydHMubWVtb2l6ZU9iakFyZyA9IG1lbW9pemVPYmpBcmc7XG5leHBvcnRzLm1lcmdlRXZlbnRTdG9yZXMgPSBtZXJnZUV2ZW50U3RvcmVzO1xuZXhwb3J0cy5tdWx0aXBseUR1cmF0aW9uID0gbXVsdGlwbHlEdXJhdGlvbjtcbmV4cG9ydHMucGFkU3RhcnQgPSBwYWRTdGFydDtcbmV4cG9ydHMucGFyc2VCdXNpbmVzc0hvdXJzID0gcGFyc2VCdXNpbmVzc0hvdXJzO1xuZXhwb3J0cy5wYXJzZUNsYXNzTmFtZXMgPSBwYXJzZUNsYXNzTmFtZXM7XG5leHBvcnRzLnBhcnNlRHJhZ01ldGEgPSBwYXJzZURyYWdNZXRhO1xuZXhwb3J0cy5wYXJzZUV2ZW50RGVmID0gcGFyc2VFdmVudERlZjtcbmV4cG9ydHMucGFyc2VGaWVsZFNwZWNzID0gcGFyc2VGaWVsZFNwZWNzO1xuZXhwb3J0cy5wYXJzZU1hcmtlciA9IHBhcnNlO1xuZXhwb3J0cy5wb2ludEluc2lkZVJlY3QgPSBwb2ludEluc2lkZVJlY3Q7XG5leHBvcnRzLnByZXZlbnRDb250ZXh0TWVudSA9IHByZXZlbnRDb250ZXh0TWVudTtcbmV4cG9ydHMucHJldmVudERlZmF1bHQgPSBwcmV2ZW50RGVmYXVsdDtcbmV4cG9ydHMucHJldmVudFNlbGVjdGlvbiA9IHByZXZlbnRTZWxlY3Rpb247XG5leHBvcnRzLnJhbmdlQ29udGFpbnNNYXJrZXIgPSByYW5nZUNvbnRhaW5zTWFya2VyO1xuZXhwb3J0cy5yYW5nZUNvbnRhaW5zUmFuZ2UgPSByYW5nZUNvbnRhaW5zUmFuZ2U7XG5leHBvcnRzLnJhbmdlc0VxdWFsID0gcmFuZ2VzRXF1YWw7XG5leHBvcnRzLnJhbmdlc0ludGVyc2VjdCA9IHJhbmdlc0ludGVyc2VjdDtcbmV4cG9ydHMucmVmaW5lRXZlbnREZWYgPSByZWZpbmVFdmVudERlZjtcbmV4cG9ydHMucmVmaW5lUHJvcHMgPSByZWZpbmVQcm9wcztcbmV4cG9ydHMucmVtb3ZlRWxlbWVudCA9IHJlbW92ZUVsZW1lbnQ7XG5leHBvcnRzLnJlbW92ZUV4YWN0ID0gcmVtb3ZlRXhhY3Q7XG5leHBvcnRzLnJlbmRlckNodW5rQ29udGVudCA9IHJlbmRlckNodW5rQ29udGVudDtcbmV4cG9ydHMucmVuZGVyRmlsbCA9IHJlbmRlckZpbGw7XG5leHBvcnRzLnJlbmRlck1pY3JvQ29sR3JvdXAgPSByZW5kZXJNaWNyb0NvbEdyb3VwO1xuZXhwb3J0cy5yZW5kZXJTY3JvbGxTaGltID0gcmVuZGVyU2Nyb2xsU2hpbTtcbmV4cG9ydHMucmVxdWVzdEpzb24gPSByZXF1ZXN0SnNvbjtcbmV4cG9ydHMuc2FuaXRpemVTaHJpbmtXaWR0aCA9IHNhbml0aXplU2hyaW5rV2lkdGg7XG5leHBvcnRzLnNldEVsU2VnID0gc2V0RWxTZWc7XG5leHBvcnRzLnNldFJlZiA9IHNldFJlZjtcbmV4cG9ydHMuc2xpY2VFdmVudFN0b3JlID0gc2xpY2VFdmVudFN0b3JlO1xuZXhwb3J0cy5zbGljZUV2ZW50cyA9IHNsaWNlRXZlbnRzO1xuZXhwb3J0cy5zb3J0RXZlbnRTZWdzID0gc29ydEV2ZW50U2VncztcbmV4cG9ydHMuc3RhcnRPZkRheSA9IHN0YXJ0T2ZEYXk7XG5leHBvcnRzLnRyYW5zbGF0ZVJlY3QgPSB0cmFuc2xhdGVSZWN0O1xuZXhwb3J0cy50cmlnZ2VyRGF0ZVNlbGVjdCA9IHRyaWdnZXJEYXRlU2VsZWN0O1xuZXhwb3J0cy51bnByb21pc2lmeSA9IHVucHJvbWlzaWZ5O1xuZXhwb3J0cy52ZXJzaW9uID0gdmVyc2lvbjtcbmV4cG9ydHMud2hlblRyYW5zaXRpb25Eb25lID0gd2hlblRyYW5zaXRpb25Eb25lO1xuZXhwb3J0cy53aG9sZURpdmlkZUR1cmF0aW9ucyA9IHdob2xlRGl2aWRlRHVyYXRpb25zO1xuT2JqZWN0LmtleXModmRvbV9janMpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICBpZiAoayAhPT0gJ2RlZmF1bHQnICYmICFleHBvcnRzLmhhc093blByb3BlcnR5KGspKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgaywge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2ZG9tX2Nqc1trXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUVBQSxNQUFNLENBQUNDLGNBQVAsQ0FBc0JDLE9BQXRCLEVBQStCLFlBQS9CLEVBQTZDO0VBQUVDLEtBQUssRUFBRTtBQUFULENBQTdDO0FBRUE7O0FBQ0EsSUFBSUMsS0FBSyxHQUFHQyxPQUFPLENBQUMsT0FBRCxDQUFuQjs7QUFDQSxJQUFJQyxRQUFRLEdBQUdELE9BQU8sQ0FBQyxZQUFELENBQXRCLEMsQ0FFQTtBQUNBOzs7QUFDQSxJQUFJRSxjQUFjO0FBQUc7QUFBZSxZQUFZO0VBQzVDLFNBQVNBLGNBQVQsQ0FBd0JDLE9BQXhCLEVBQWlDQyxtQkFBakMsRUFBc0Q7SUFDbEQsS0FBS0QsT0FBTCxHQUFlQSxPQUFmO0lBQ0EsS0FBS0MsbUJBQUwsR0FBMkJBLG1CQUEzQjtFQUNIOztFQUNERixjQUFjLENBQUNHLFNBQWYsQ0FBeUJDLE1BQXpCLEdBQWtDLFlBQVk7SUFDMUMsS0FBS0gsT0FBTCxDQUFhSSxRQUFiLENBQXNCO01BQ2xCQyxJQUFJLEVBQUUscUJBRFk7TUFFbEJDLFFBQVEsRUFBRSxLQUFLTCxtQkFBTCxDQUF5Qks7SUFGakIsQ0FBdEI7RUFJSCxDQUxEOztFQU1BUCxjQUFjLENBQUNHLFNBQWYsQ0FBeUJLLE9BQXpCLEdBQW1DLFlBQVk7SUFDM0Ms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 },{"./vdom.cjs":2,"tslib":32}],2:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); /// if (typeof FullCalendarVDom === 'undefined') { throw new Error('Please import the top-level fullcalendar lib before attempting to import a plugin.'); } var Component = FullCalendarVDom.Component; var createElement = FullCalendarVDom.createElement; var render = FullCalendarVDom.render; var createRef = FullCalendarVDom.createRef; var Fragment = FullCalendarVDom.Fragment; var createContext = FullCalendarVDom.createContext; var createPortal = FullCalendarVDom.createPortal; var flushSync = FullCalendarVDom.flushSync; var unmountComponentAtNode = FullCalendarVDom.unmountComponentAtNode; /* eslint-enable */ exports.Component = Component; exports.Fragment = Fragment; exports.createContext = createContext; exports.createElement = createElement; exports.createPortal = createPortal; exports.createRef = createRef; exports.flushSync = flushSync; exports.render = render; exports.unmountComponentAtNode = unmountComponentAtNode; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsIkZ1bGxDYWxlbmRhclZEb20iLCJFcnJvciIsIkNvbXBvbmVudCIsImNyZWF0ZUVsZW1lbnQiLCJyZW5kZXIiLCJjcmVhdGVSZWYiLCJGcmFnbWVudCIsImNyZWF0ZUNvbnRleHQiLCJjcmVhdGVQb3J0YWwiLCJmbHVzaFN5bmMiLCJ1bm1vdW50Q29tcG9uZW50QXROb2RlIl0sInNvdXJjZXMiOlsidmRvbS5janMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG4vLy8gPHJlZmVyZW5jZSB0eXBlcz1cIkBmdWxsY2FsZW5kYXIvY29yZS1wcmVhY3RcIiAvPlxuaWYgKHR5cGVvZiBGdWxsQ2FsZW5kYXJWRG9tID09PSAndW5kZWZpbmVkJykge1xuICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIGltcG9ydCB0aGUgdG9wLWxldmVsIGZ1bGxjYWxlbmRhciBsaWIgYmVmb3JlIGF0dGVtcHRpbmcgdG8gaW1wb3J0IGEgcGx1Z2luLicpO1xufVxudmFyIENvbXBvbmVudCA9IEZ1bGxDYWxlbmRhclZEb20uQ29tcG9uZW50O1xudmFyIGNyZWF0ZUVsZW1lbnQgPSBGdWxsQ2FsZW5kYXJWRG9tLmNyZWF0ZUVsZW1lbnQ7XG52YXIgcmVuZGVyID0gRnVsbENhbGVuZGFyVkRvbS5yZW5kZXI7XG52YXIgY3JlYXRlUmVmID0gRnVsbENhbGVuZGFyVkRvbS5jcmVhdGVSZWY7XG52YXIgRnJhZ21lbnQgPSBGdWxsQ2FsZW5kYXJWRG9tLkZyYWdtZW50O1xudmFyIGNyZWF0ZUNvbnRleHQgPSBGdWxsQ2FsZW5kYXJWRG9tLmNyZWF0ZUNvbnRleHQ7XG52YXIgY3JlYXRlUG9ydGFsID0gRnVsbENhbGVuZGFyVkRvbS5jcmVhdGVQb3J0YWw7XG52YXIgZmx1c2hTeW5jID0gRnVsbENhbGVuZGFyVkRvbS5mbHVzaFN5bmM7XG52YXIgdW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IEZ1bGxDYWxlbmRhclZEb20udW5tb3VudENvbXBvbmVudEF0Tm9kZTtcbi8qIGVzbGludC1lbmFibGUgKi9cblxuZXhwb3J0cy5Db21wb25lbnQgPSBDb21wb25lbnQ7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLmNyZWF0ZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0O1xuZXhwb3J0cy5jcmVhdGVFbGVtZW50ID0gY3JlYXRlRWxlbWVudDtcbmV4cG9ydHMuY3JlYXRlUG9ydGFsID0gY3JlYXRlUG9ydGFsO1xuZXhwb3J0cy5jcmVhdGVSZWYgPSBjcmVhdGVSZWY7XG5leHBvcnRzLmZsdXNoU3luYyA9IGZsdXNoU3luYztcbmV4cG9ydHMucmVuZGVyID0gcmVuZGVyO1xuZXhwb3J0cy51bm1vdW50Q29tcG9uZW50QXROb2RlID0gdW5tb3VudENvbXBvbmVudEF0Tm9kZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUFBLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkMsT0FBdEIsRUFBK0IsWUFBL0IsRUFBNkM7RUFBRUMsS0FBSyxFQUFFO0FBQVQsQ0FBN0MsRSxDQUVBOztBQUNBLElBQUksT0FBT0MsZ0JBQVAsS0FBNEIsV0FBaEMsRUFBNkM7RUFDekMsTUFBTSxJQUFJQyxLQUFKLENBQVUsb0ZBQVYsQ0FBTjtBQUNIOztBQUNELElBQUlDLFNBQVMsR0FBR0YsZ0JBQWdCLENBQUNFLFNBQWpDO0FBQ0EsSUFBSUMsYUFBYSxHQUFHSCxnQkFBZ0IsQ0FBQ0csYUFBckM7QUFDQSxJQUFJQyxNQUFNLEdBQUdKLGdCQUFnQixDQUFDSSxNQUE5QjtBQUNBLElBQUlDLFNBQVMsR0FBR0wsZ0JBQWdCLENBQUNLLFNBQWpDO0FBQ0EsSUFBSUMsUUFBUSxHQUFHTixnQkFBZ0IsQ0FBQ00sUUFBaEM7QUFDQSxJQUFJQyxhQUFhLEdBQUdQLGdCQUFnQixDQUFDTyxhQUFyQztBQUNBLElBQUlDLFlBQVksR0FBR1IsZ0JBQWdCLENBQUNRLFlBQXBDO0FBQ0EsSUFBSUMsU0FBUyxHQUFHVCxnQkFBZ0IsQ0FBQ1MsU0FBakM7QUFDQSxJQUFJQyxzQkFBc0IsR0FBR1YsZ0JBQWdCLENBQUNVLHNCQUE5QztBQUNBOztBQUVBWixPQUFPLENBQUNJLFNBQVIsR0FBb0JBLFNBQXBCO0FBQ0FKLE9BQU8sQ0FBQ1EsUUFBUixHQUFtQkEsUUFBbkI7QUFDQVIsT0FBTyxDQUFDUyxhQUFSLEdBQXdCQSxhQUF4QjtBQUNBVCxPQUFPLENBQUNLLGFBQVIsR0FBd0JBLGFBQXhCO0FBQ0FMLE9BQU8sQ0FBQ1UsWUFBUixHQUF1QkEsWUFBdkI7QUFDQVYsT0FBTyxDQUFDTyxTQUFSLEdBQW9CQSxTQUFwQjtBQUNBUCxPQUFPLENBQUNXLFNBQVIsR0FBb0JBLFNBQXBCO0FBQ0FYLE9BQU8sQ0FBQ00sTUFBUixHQUFpQkEsTUFBakI7QUFDQU4sT0FBTyxDQUFDWSxzQkFBUixHQUFpQ0Esc0JBQWpDIn0= },{}],3:[function(require,module,exports){ /*! FullCalendar v5.11.2 Docs & License: https://fullcalendar.io/ (c) 2022 Adam Shaw */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); require('./vdom.cjs'); var tslib = require('tslib'); var common = require('@fullcalendar/common'); var Calendar = /** @class */ function (_super) { tslib.__extends(Calendar, _super); function Calendar(el, optionOverrides) { if (optionOverrides === void 0) { optionOverrides = {}; } var _this = _super.call(this) || this; _this.isRendering = false; _this.isRendered = false; _this.currentClassNames = []; _this.customContentRenderId = 0; // will affect custom generated classNames? _this.handleAction = function (action) { // actions we know we want to render immediately switch (action.type) { case 'SET_EVENT_DRAG': case 'SET_EVENT_RESIZE': _this.renderRunner.tryDrain(); } }; _this.handleData = function (data) { _this.currentData = data; _this.renderRunner.request(data.calendarOptions.rerenderDelay); }; _this.handleRenderRequest = function () { if (_this.isRendering) { _this.isRendered = true; var currentData_1 = _this.currentData; common.flushSync(function () { common.render(common.createElement(common.CalendarRoot, { options: currentData_1.calendarOptions, theme: currentData_1.theme, emitter: currentData_1.emitter }, function (classNames, height, isHeightAuto, forPrint) { _this.setClassNames(classNames); _this.setHeight(height); return common.createElement(common.CustomContentRenderContext.Provider, { value: _this.customContentRenderId }, common.createElement(common.CalendarContent, tslib.__assign({ isHeightAuto: isHeightAuto, forPrint: forPrint }, currentData_1))); }), _this.el); }); } else if (_this.isRendered) { _this.isRendered = false; common.unmountComponentAtNode(_this.el); _this.setClassNames([]); _this.setHeight(''); } }; _this.el = el; _this.renderRunner = new common.DelayedRunner(_this.handleRenderRequest); new common.CalendarDataManager({ optionOverrides: optionOverrides, calendarApi: _this, onAction: _this.handleAction, onData: _this.handleData }); return _this; } Object.defineProperty(Calendar.prototype, "view", { get: function get() { return this.currentData.viewApi; } // for public API , enumerable: false, configurable: true }); Calendar.prototype.render = function () { var wasRendering = this.isRendering; if (!wasRendering) { this.isRendering = true; } else { this.customContentRenderId += 1; } this.renderRunner.request(); if (wasRendering) { this.updateSize(); } }; Calendar.prototype.destroy = function () { if (this.isRendering) { this.isRendering = false; this.renderRunner.request(); } }; Calendar.prototype.updateSize = function () { var _this = this; common.flushSync(function () { _super.prototype.updateSize.call(_this); }); }; Calendar.prototype.batchRendering = function (func) { this.renderRunner.pause('batchRendering'); func(); this.renderRunner.resume('batchRendering'); }; Calendar.prototype.pauseRendering = function () { this.renderRunner.pause('pauseRendering'); }; Calendar.prototype.resumeRendering = function () { this.renderRunner.resume('pauseRendering', true); }; Calendar.prototype.resetOptions = function (optionOverrides, append) { this.currentDataManager.resetOptions(optionOverrides, append); }; Calendar.prototype.setClassNames = function (classNames) { if (!common.isArraysEqual(classNames, this.currentClassNames)) { var classList = this.el.classList; for (var _i = 0, _a = this.currentClassNames; _i < _a.length; _i++) { var className = _a[_i]; classList.remove(className); } for (var _b = 0, classNames_1 = classNames; _b < classNames_1.length; _b++) { var className = classNames_1[_b]; classList.add(className); } this.currentClassNames = classNames; } }; Calendar.prototype.setHeight = function (height) { common.applyStyleProp(this.el, 'height', height); }; return Calendar; }(common.CalendarApi); exports.Calendar = Calendar; Object.keys(common).forEach(function (k) { if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { enumerable: true, get: function get() { return common[k]; } }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsInJlcXVpcmUiLCJ0c2xpYiIsImNvbW1vbiIsIkNhbGVuZGFyIiwiX3N1cGVyIiwiX19leHRlbmRzIiwiZWwiLCJvcHRpb25PdmVycmlkZXMiLCJfdGhpcyIsImNhbGwiLCJpc1JlbmRlcmluZyIsImlzUmVuZGVyZWQiLCJjdXJyZW50Q2xhc3NOYW1lcyIsImN1c3RvbUNvbnRlbnRSZW5kZXJJZCIsImhhbmRsZUFjdGlvbiIsImFjdGlvbiIsInR5cGUiLCJyZW5kZXJSdW5uZXIiLCJ0cnlEcmFpbiIsImhhbmRsZURhdGEiLCJkYXRhIiwiY3VycmVudERhdGEiLCJyZXF1ZXN0IiwiY2FsZW5kYXJPcHRpb25zIiwicmVyZW5kZXJEZWxheSIsImhhbmRsZVJlbmRlclJlcXVlc3QiLCJjdXJyZW50RGF0YV8xIiwiZmx1c2hTeW5jIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsIkNhbGVuZGFyUm9vdCIsIm9wdGlvbnMiLCJ0aGVtZSIsImVtaXR0ZXIiLCJjbGFzc05hbWVzIiwiaGVpZ2h0IiwiaXNIZWlnaHRBdXRvIiwiZm9yUHJpbnQiLCJzZXRDbGFzc05hbWVzIiwic2V0SGVpZ2h0IiwiQ3VzdG9tQ29udGVudFJlbmRlckNvbnRleHQiLCJQcm92aWRlciIsIkNhbGVuZGFyQ29udGVudCIsIl9fYXNzaWduIiwidW5tb3VudENvbXBvbmVudEF0Tm9kZSIsIkRlbGF5ZWRSdW5uZXIiLCJDYWxlbmRhckRhdGFNYW5hZ2VyIiwiY2FsZW5kYXJBcGkiLCJvbkFjdGlvbiIsIm9uRGF0YSIsInByb3RvdHlwZSIsImdldCIsInZpZXdBcGkiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid2FzUmVuZGVyaW5nIiwidXBkYXRlU2l6ZSIsImRlc3Ryb3kiLCJiYXRjaFJlbmRlcmluZyIsImZ1bmMiLCJwYXVzZSIsInJlc3VtZSIsInBhdXNlUmVuZGVyaW5nIiwicmVzdW1lUmVuZGVyaW5nIiwicmVzZXRPcHRpb25zIiwiYXBwZW5kIiwiY3VycmVudERhdGFNYW5hZ2VyIiwiaXNBcnJheXNFcXVhbCIsImNsYXNzTGlzdCIsIl9pIiwiX2EiLCJsZW5ndGgiLCJjbGFzc05hbWUiLCJyZW1vdmUiLCJfYiIsImNsYXNzTmFtZXNfMSIsImFkZCIsImFwcGx5U3R5bGVQcm9wIiwiQ2FsZW5kYXJBcGkiLCJrZXlzIiwiZm9yRWFjaCIsImsiLCJoYXNPd25Qcm9wZXJ0eSJdLCJzb3VyY2VzIjpbIm1haW4uY2pzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuRnVsbENhbGVuZGFyIHY1LjExLjJcbkRvY3MgJiBMaWNlbnNlOiBodHRwczovL2Z1bGxjYWxlbmRhci5pby9cbihjKSAyMDIyIEFkYW0gU2hhd1xuKi9cbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxucmVxdWlyZSgnLi92ZG9tLmNqcycpO1xudmFyIHRzbGliID0gcmVxdWlyZSgndHNsaWInKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCdAZnVsbGNhbGVuZGFyL2NvbW1vbicpO1xuXG52YXIgQ2FsZW5kYXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKENhbGVuZGFyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENhbGVuZGFyKGVsLCBvcHRpb25PdmVycmlkZXMpIHtcbiAgICAgICAgaWYgKG9wdGlvbk92ZXJyaWRlcyA9PT0gdm9pZCAwKSB7IG9wdGlvbk92ZXJyaWRlcyA9IHt9OyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIF90aGlzLmlzUmVuZGVyZWQgPSBmYWxzZTtcbiAgICAgICAgX3RoaXMuY3VycmVudENsYXNzTmFtZXMgPSBbXTtcbiAgICAgICAgX3RoaXMuY3VzdG9tQ29udGVudFJlbmRlcklkID0gMDsgLy8gd2lsbCBhZmZlY3QgY3VzdG9tIGdlbmVyYXRlZCBjbGFzc05hbWVzP1xuICAgICAgICBfdGhpcy5oYW5kbGVBY3Rpb24gPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBhY3Rpb25zIHdlIGtub3cgd2Ugd2FudCB0byByZW5kZXIgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdTRVRfRVZFTlRfRFJBRyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnU0VUX0VWRU5UX1JFU0laRSc6XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlclJ1bm5lci50cnlEcmFpbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVEYXRhID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIF90aGlzLmN1cnJlbnREYXRhID0gZGF0YTtcbiAgICAgICAgICAgIF90aGlzLnJlbmRlclJ1bm5lci5yZXF1ZXN0KGRhdGEuY2FsZW5kYXJPcHRpb25zLnJlcmVuZGVyRGVsYXkpO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVSZW5kZXJSZXF1ZXN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKF90aGlzLmlzUmVuZGVyaW5nKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuaXNSZW5kZXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnREYXRhXzEgPSBfdGhpcy5jdXJyZW50RGF0YTtcbiAgICAgICAgICAgICAgICBjb21tb24uZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uLnJlbmRlcihjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uQ2FsZW5kYXJSb290LCB7IG9wdGlvbnM6IGN1cnJlbnREYXRhXzEuY2FsZW5kYXJPcHRpb25zLCB0aGVtZTogY3VycmVudERhdGFfMS50aGVtZSwgZW1pdHRlcjogY3VycmVudERhdGFfMS5lbWl0dGVyIH0sIGZ1bmN0aW9uIChjbGFzc05hbWVzLCBoZWlnaHQsIGlzSGVpZ2h0QXV0bywgZm9yUHJpbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnNldENsYXNzTmFtZXMoY2xhc3NOYW1lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zZXRIZWlnaHQoaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkN1c3RvbUNvbnRlbnRSZW5kZXJDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBfdGhpcy5jdXN0b21Db250ZW50UmVuZGVySWQgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uQ2FsZW5kYXJDb250ZW50LCB0c2xpYi5fX2Fzc2lnbih7IGlzSGVpZ2h0QXV0bzogaXNIZWlnaHRBdXRvLCBmb3JQcmludDogZm9yUHJpbnQgfSwgY3VycmVudERhdGFfMSkpKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pLCBfdGhpcy5lbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChfdGhpcy5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuaXNSZW5kZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbW1vbi51bm1vdW50Q29tcG9uZW50QXROb2RlKF90aGlzLmVsKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXRDbGFzc05hbWVzKFtdKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5zZXRIZWlnaHQoJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5lbCA9IGVsO1xuICAgICAgICBfdGhpcy5yZW5kZXJSdW5uZXIgPSBuZXcgY29tbW9uLkRlbGF5ZWRSdW5uZXIoX3RoaXMuaGFuZGxlUmVuZGVyUmVxdWVzdCk7XG4gICAgICAgIG5ldyBjb21tb24uQ2FsZW5kYXJEYXRhTWFuYWdlcih7XG4gICAgICAgICAgICBvcHRpb25PdmVycmlkZXM6IG9wdGlvbk92ZXJyaWRlcyxcbiAgICAgICAgICAgIGNhbGVuZGFyQXBpOiBfdGhpcyxcbiAgICAgICAgICAgIG9uQWN0aW9uOiBfdGhpcy5oYW5kbGVBY3Rpb24sXG4gICAgICAgICAgICBvbkRhdGE6IF90aGlzLmhhbmRsZURhdGEsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDYWxlbmRhci5wcm90b3R5cGUsIFwidmlld1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5jdXJyZW50RGF0YS52aWV3QXBpOyB9IC8vIGZvciBwdWJsaWMgQVBJXG4gICAgICAgICxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIENhbGVuZGFyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3YXNSZW5kZXJpbmcgPSB0aGlzLmlzUmVuZGVyaW5nO1xuICAgICAgICBpZiAoIXdhc1JlbmRlcmluZykge1xuICAgICAgICAgICAgdGhpcy5pc1JlbmRlcmluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUNvbnRlbnRSZW5kZXJJZCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVuZGVyUnVubmVyLnJlcXVlc3QoKTtcbiAgICAgICAgaWYgKHdhc1JlbmRlcmluZykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENhbGVuZGFyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pc1JlbmRlcmluZykge1xuICAgICAgICAgICAgdGhpcy5pc1JlbmRlcmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJSdW5uZXIucmVxdWVzdCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDYWxlbmRhci5wcm90b3R5cGUudXBkYXRlU2l6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgY29tbW9uLmZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnVwZGF0ZVNpemUuY2FsbChfdGhpcyk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ2FsZW5kYXIucHJvdG90eXBlLmJhdGNoUmVuZGVyaW5nID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJSdW5uZXIucGF1c2UoJ2JhdGNoUmVuZGVyaW5nJyk7XG4gICAgICAgIGZ1bmMoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJSdW5uZXIucmVzdW1lKCdiYXRjaFJlbmRlcmluZycpO1xuICAgIH07XG4gICAgQ2FsZW5kYXIucHJvdG90eXBlLnBhdXNlUmVuZGVyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlbmRlclJ1bm5lci5wYXVzZSgncGF1c2VSZW5kZXJpbmcnKTtcbiAgICB9O1xuICAgIENhbGVuZGFyLnByb3RvdHlwZS5yZXN1bWVSZW5kZXJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyUnVubmVyLnJlc3VtZSgncGF1c2VSZW5kZXJpbmcnLCB0cnVlKTtcbiAgICB9O1xuICAgIENhbGVuZGFyLnByb3RvdHlwZS5yZXNldE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9uT3ZlcnJpZGVzLCBhcHBlbmQpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50RGF0YU1hbmFnZXIucmVzZXRPcHRpb25zKG9wdGlvbk92ZXJyaWRlcywgYXBwZW5kKTtcbiAgICB9O1xuICAgIENhbGVuZGFyLnByb3RvdHlwZS5zZXRDbGFzc05hbWVzID0gZnVuY3Rpb24gKGNsYXNzTmFtZXMpIHtcbiAgICAgICAgaWYgKCFjb21tb24uaXNBcnJheXNFcXVhbChjbGFzc05hbWVzLCB0aGlzLmN1cnJlbnRDbGFzc05hbWVzKSkge1xuICAgICAgICAgICAgdmFyIGNsYXNzTGlzdCA9IHRoaXMuZWwuY2xhc3NMaXN0O1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMuY3VycmVudENsYXNzTmFtZXM7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IF9hW19pXTtcbiAgICAgICAgICAgICAgICBjbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBfYiA9IDAsIGNsYXNzTmFtZXNfMSA9IGNsYXNzTmFtZXM7IF9iIDwgY2xhc3NOYW1lc18xLmxlbmd0aDsgX2IrKykge1xuICAgICAgICAgICAgICAgIHZhciBjbGFzc05hbWUgPSBjbGFzc05hbWVzXzFbX2JdO1xuICAgICAgICAgICAgICAgIGNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3VycmVudENsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDYWxlbmRhci5wcm90b3R5cGUuc2V0SGVpZ2h0ID0gZnVuY3Rpb24gKGhlaWdodCkge1xuICAgICAgICBjb21tb24uYXBwbHlTdHlsZVByb3AodGhpcy5lbCwgJ2hlaWdodCcsIGhlaWdodCk7XG4gICAgfTtcbiAgICByZXR1cm4gQ2FsZW5kYXI7XG59KGNvbW1vbi5DYWxlbmRhckFwaSkpO1xuXG5leHBvcnRzLkNhbGVuZGFyID0gQ2FsZW5kYXI7XG5PYmplY3Qua2V5cyhjb21tb24pLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICBpZiAoayAhPT0gJ2RlZmF1bHQnICYmICFleHBvcnRzLmhhc093blByb3BlcnR5KGspKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgaywge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21tb25ba107XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUFBLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkMsT0FBdEIsRUFBK0IsWUFBL0IsRUFBNkM7RUFBRUMsS0FBSyxFQUFFO0FBQVQsQ0FBN0M7O0FBRUFDLE9BQU8sQ0FBQyxZQUFELENBQVA7O0FBQ0EsSUFBSUMsS0FBSyxHQUFHRCxPQUFPLENBQUMsT0FBRCxDQUFuQjs7QUFDQSxJQUFJRSxNQUFNLEdBQUdGLE9BQU8sQ0FBQyxzQkFBRCxDQUFwQjs7QUFFQSxJQUFJRyxRQUFRO0FBQUc7QUFBZSxVQUFVQyxNQUFWLEVBQWtCO0VBQzVDSCxLQUFLLENBQUNJLFNBQU4sQ0FBZ0JGLFFBQWhCLEVBQTBCQyxNQUExQjs7RUFDQSxTQUFTRCxRQUFULENBQWtCRyxFQUFsQixFQUFzQkMsZUFBdEIsRUFBdUM7SUFDbkMsSUFBSUEsZUFBZSxLQUFLLEtBQUssQ0FBN0IsRUFBZ0M7TUFBRUEsZUFBZSxHQUFHLEVBQWxCO0lBQXVCOztJQUN6RCxJQUFJQyxLQUFLLEdBQUdKLE1BQU0sQ0FBQ0ssSUFBUCxDQUFZLElBQVosS0FBcUIsSUFBakM7O0lBQ0FELEtBQUssQ0FBQ0UsV0FBTixHQUFvQixLQUFwQjtJQUNBRixLQUFLLENBQUNHLFVBQU4sR0FBbUIsS0FBbkI7SUFDQUgsS0FBSyxDQUFDSSxpQkFBTixHQUEwQixFQUExQjtJQUNBSixLQUFLLENBQUNLLHFCQUFOLEdBQThCLENBQTlCLENBTm1DLENBTUY7O0lBQ2pDTCxLQUFLLENBQUNNLFlBQU4sR0FBcUIsVUFBVUMsTUFBVixFQUFrQjtNQUNuQztNQUNBLFFBQVFBLE1BQU0sQ0FBQ0MsSUFBZjtRQUNJLEtBQUssZ0JBQUw7UUFDQSxLQUFLLGtCQUFMO1VBQ0lSLEtBQUssQ0FBQ1MsWUFBTixDQUFtQkMsUUFBbkI7O01BSFI7SUFLSCxDQVBEOztJQVFBVixLQUFLLENBQUNXLFVBQU4sR0FBbUIsVUFBVUMsSUFBVixFQUFnQjtNQUMvQlosS0FBSyxDQUFDYSxXQUFOLEdBQW9CRCxJQUFwQjs7TUFDQVosS0FBSyxDQUFDUyxZQUFOLENBQW1CSyxPQUFuQixDQUEyQkYsSUFBSSxDQUFDRyxlQUFMLENBQXFCQyxhQUFoRDtJQUNILENBSEQ7O0lBSUFoQixLQUFLLENBQUNpQixtQkFBTixHQUE0QixZQUFZO01BQ3BDLElBQUlqQixLQUFLLENBQUNFLFdBQVYsRUFBdUI7UUFDbkJGLEtBQUssQ0FBQ0csVUFBTixHQUFtQixJQUFuQjtRQUNBLElBQUllLGFBQWEsR0FBR2xCLEtBQUssQ0FBQ2EsV0FBMUI7UUFDQW5CLE1BQU0sQ0FBQ3lCLFNBQVAsQ0FBaUIsWUFBWTtVQUN6QnpCLE1BQU0sQ0FBQzBCLE1BQVAsQ0FBYzFCLE1BQU0sQ0FBQzJCLGFBQVAsQ0FBcUIzQixNQUFNLENBQUM0QixZQUE1QixFQUEwQztZQUFFQyxPQUFPLEVBQUVMLGFBQWEsQ0FBQ0gsZUFBekI7WUFBMENTLEtBQUssRUFBRU4sYUFBYSxDQUFDTSxLQUEvRDtZQUFzRUMsT0FBTyxFQUFFUCxhQUFhLENBQUNPO1VBQTdGLENBQTFDLEVBQWtKLFVBQVVDLFVBQVYsRUFBc0JDLE1BQXRCLEVBQThCQyxZQUE5QixFQUE0Q0MsUUFBNUMsRUFBc0Q7WUFDbE43QixLQUFLLENBQUM4QixhQUFOLENBQW9CSixVQUFwQjs7WUFDQTFCLEtBQUssQ0FBQytCLFNBQU4sQ0FBZ0JKLE1BQWhCOztZQUNBLE9BQVFqQyxNQUFNLENBQUMyQixhQUFQLENBQXFCM0IsTUFBTSxDQUFDc0MsMEJBQVAsQ0FBa0NDLFFBQXZELEVBQWlFO2NBQUUxQyxLQUFLLEVBQUVTLEtBQUssQ0FBQ0s7WUFBZixDQUFqRSxFQUNKWCxNQUFNLENBQUMyQixhQUFQLENBQXFCM0IsTUFBTSxDQUFDd0MsZUFBNUIsRUFBNkN6QyxLQUFLLENBQUMwQyxRQUFOLENBQWU7Y0FBRVAsWUFBWSxFQUFFQSxZQUFoQjtjQUE4QkMsUUFBUSxFQUFFQTtZQUF4QyxDQUFmLEVBQW1FWCxhQUFuRSxDQUE3QyxDQURJLENBQVI7VUFFSCxDQUxhLENBQWQsRUFLSWxCLEtBQUssQ0FBQ0YsRUFMVjtRQU1ILENBUEQ7TUFRSCxDQVhELE1BWUssSUFBSUUsS0FBSyxDQUFDRyxVQUFWLEVBQXNCO1FBQ3ZCSCxLQUFLLENBQUNHLFVBQU4sR0FBbUIsS0FBbkI7UUFDQVQsTUFBTSxDQUFDMEMsc0JBQVAsQ0FBOEJwQyxLQUFLLENBQUNGLEVBQXBDOztRQUNBRSxLQUFLLENBQUM4QixhQUFOLENBQW9CLEVBQXBCOztRQUNBOUIsS0FBSyxDQUFDK0IsU0FBTixDQUFnQixFQUFoQjtNQUNIO0lBQ0osQ0FuQkQ7O0lBb0JBL0IsS0FBSyxDQUFDRixFQUFOLEdBQVdBLEVBQVg7SUFDQUUsS0FBSyxDQUFDUyxZQUFOLEdBQXFCLElBQUlmLE1BQU0sQ0FBQzJDLGFBQVgsQ0FBeUJyQyxLQUFLLENBQUNpQixtQkFBL0IsQ0FBckI7SUFDQSxJQUFJdkIsTUFBTSxDQUFDNEMsbUJBQVgsQ0FBK0I7TUFDM0J2QyxlQUFlLEVBQUVBLGVBRFU7TUFFM0J3QyxXQUFXLEVBQUV2QyxLQUZjO01BRzNCd0MsUUFBUSxFQUFFeEMsS0FBSyxDQUFDTSxZQUhXO01BSTNCbUMsTUFBTSxFQUFFekMsS0FBSyxDQUFDVztJQUphLENBQS9CO0lBTUEsT0FBT1gsS0FBUDtFQUNIOztFQUNEWixNQUFNLENBQUNDLGNBQVAsQ0FBc0JNLFFBQVEsQ0FBQytDLFNBQS9CLEVBQTBDLE1BQTFDLEVBQWtEO0lBQzlDQyxHQUFHLEVBQUUsZUFBWTtNQUFFLE9BQU8sS0FBSzlCLFdBQUwsQ0FBaUIrQixPQUF4QjtJQUFrQyxDQURQLENBQ1E7SUFEUjtJQUc5Q0MsVUFBVSxFQUFFLEtBSGtDO0lBSTlDQyxZQUFZLEVBQUU7RUFKZ0MsQ0FBbEQ7O0VBTUFuRCxRQUFRLENBQUMrQyxTQUFULENBQW1CdEIsTUFBbkIsR0FBNEIsWUFBWTtJQUNwQyxJQUFJMkIsWUFBWSxHQUFHLEtBQUs3QyxXQUF4Qjs7SUFDQSxJQUFJLENBQUM2QyxZQUFMLEVBQW1CO01BQ2YsS0FBSzdDLFdBQUwsR0FBbUIsSUFBbkI7SUFDSCxDQUZELE1BR0s7TUFDRCxLQUFLRyxxQkFBTCxJQUE4QixDQUE5QjtJQUNIOztJQUNELEtBQUtJLFlBQUwsQ0FBa0JLLE9BQWxCOztJQUNBLElBQUlpQyxZQUFKLEVBQWtCO01BQ2QsS0FBS0MsVUFBTDtJQUNIO0VBQ0osQ0FaRDs7RUFhQXJELFFBQVEsQ0FBQytDLFNBQVQsQ0FBbUJPLE9BQW5CLEdBQTZCLFlBQVk7SUFDckMsSUFBSSxLQUFLL0MsV0FBVCxFQUFzQjtNQUNsQixLQUFLQSxXQUFMLEdBQW1CLEtBQW5CO01BQ0EsS0FBS08sWUFBTCxDQUFrQkssT0FBbEI7SUFDSDtFQUNKLENBTEQ7O0VBTUFuQixRQUFRLENBQUMrQyxTQUFULENBQW1CTSxVQUFuQixHQUFnQyxZQUFZO0lBQ3hDLElBQUloRCxLQUFLLEdBQUcsSUFBWjs7SUFDQU4sTUFBTSxDQUFDeUIsU0FBUCxDQUFpQixZQUFZO01BQ3pCdkIsTUFBTSxDQUFDOEMsU0FBUCxDQUFpQk0sVUFBakIsQ0FBNEIvQyxJQUE1QixDQUFpQ0QsS0FBakM7SUFDSCxDQUZEO0VBR0gsQ0FMRDs7RUFNQUwsUUFBUSxDQUFDK0MsU0FBVCxDQUFtQlEsY0FBbkIsR0FBb0MsVUFBVUMsSUFBVixFQUFnQjtJQUNoRCxLQUFLMUMsWUFBTCxDQUFrQjJDLEtBQWxCLENBQXdCLGdCQUF4QjtJQUNBRCxJQUFJO0lBQ0osS0FBSzFDLFlBQUwsQ0FBa0I0QyxNQUFsQixDQUF5QixnQkFBekI7RUFDSCxDQUpEOztFQUtBMUQsUUFBUSxDQUFDK0MsU0FBVCxDQUFtQlksY0FBbkIsR0FBb0MsWUFBWTtJQUM1QyxLQUFLN0MsWUFBTCxDQUFrQjJDLEtBQWxCLENBQXdCLGdCQUF4QjtFQUNILENBRkQ7O0VBR0F6RCxRQUFRLENBQUMrQyxTQUFULENBQW1CYSxlQUFuQixHQUFxQyxZQUFZO0lBQzdDLEtBQUs5QyxZQUFMLENBQWtCNEMsTUFBbEIsQ0FBeUIsZ0JBQXpCLEVBQTJDLElBQTNDO0VBQ0gsQ0FGRDs7RUFHQTFELFFBQVEsQ0FBQytDLFNBQVQsQ0FBbUJjLFlBQW5CLEdBQWtDLFVBQVV6RCxlQUFWLEVBQTJCMEQsTUFBM0IsRUFBbUM7SUFDakUsS0FBS0Msa0JBQUwsQ0FBd0JGLFlBQXhCLENBQXFDekQsZUFBckMsRUFBc0QwRCxNQUF0RDtFQUNILENBRkQ7O0VBR0E5RCxRQUFRLENBQUMrQyxTQUFULENBQW1CWixhQUFuQixHQUFtQyxVQUFVSixVQUFWLEVBQXNCO0lBQ3JELElBQUksQ0FBQ2hDLE1BQU0sQ0FBQ2lFLGFBQVAsQ0FBcUJqQyxVQUFyQixFQUFpQyxLQUFLdEIsaUJBQXRDLENBQUwsRUFBK0Q7TUFDM0QsSUFBSXdELFNBQVMsR0FBRyxLQUFLOUQsRUFBTCxDQUFROEQsU0FBeEI7O01BQ0EsS0FBSyxJQUFJQyxFQUFFLEdBQUcsQ0FBVCxFQUFZQyxFQUFFLEdBQUcsS0FBSzFELGlCQUEzQixFQUE4Q3lELEVBQUUsR0FBR0MsRUFBRSxDQUFDQyxNQUF0RCxFQUE4REYsRUFBRSxFQUFoRSxFQUFvRTtRQUNoRSxJQUFJRyxTQUFTLEdBQUdGLEVBQUUsQ0FBQ0QsRUFBRCxDQUFsQjtRQUNBRCxTQUFTLENBQUNLLE1BQVYsQ0FBaUJELFNBQWpCO01BQ0g7O01BQ0QsS0FBSyxJQUFJRSxFQUFFLEdBQUcsQ0FBVCxFQUFZQyxZQUFZLEdBQUd6QyxVQUFoQyxFQUE0Q3dDLEVBQUUsR0FBR0MsWUFBWSxDQUFDSixNQUE5RCxFQUFzRUcsRUFBRSxFQUF4RSxFQUE0RTtRQUN4RSxJQUFJRixTQUFTLEdBQUdHLFlBQVksQ0FBQ0QsRUFBRCxDQUE1QjtRQUNBTixTQUFTLENBQUNRLEdBQVYsQ0FBY0osU0FBZDtNQUNIOztNQUNELEtBQUs1RCxpQkFBTCxHQUF5QnNCLFVBQXpCO0lBQ0g7RUFDSixDQWJEOztFQWNBL0IsUUFBUSxDQUFDK0MsU0FBVCxDQUFtQlgsU0FBbkIsR0FBK0IsVUFBVUosTUFBVixFQUFrQjtJQUM3Q2pDLE1BQU0sQ0FBQzJFLGNBQVAsQ0FBc0IsS0FBS3ZFLEVBQTNCLEVBQStCLFFBQS9CLEVBQXlDNkIsTUFBekM7RUFDSCxDQUZEOztFQUdBLE9BQU9oQyxRQUFQO0FBQ0gsQ0FsSDZCLENBa0g1QkQsTUFBTSxDQUFDNEUsV0FsSHFCLENBQTlCOztBQW9IQWhGLE9BQU8sQ0FBQ0ssUUFBUixHQUFtQkEsUUFBbkI7QUFDQVAsTUFBTSxDQUFDbUYsSUFBUCxDQUFZN0UsTUFBWixFQUFvQjhFLE9BQXBCLENBQTRCLFVBQVVDLENBQVYsRUFBYTtFQUNyQyxJQUFJQSxDQUFDLEtBQUssU0FBTixJQUFtQixDQUFDbkYsT0FBTyxDQUFDb0YsY0FBUixDQUF1QkQsQ0FBdkIsQ0FBeEIsRUFBbURyRixNQUFNLENBQUNDLGNBQVAsQ0FBc0JDLE9BQXRCLEVBQStCbUYsQ0FBL0IsRUFBa0M7SUFDakY1QixVQUFVLEVBQUUsSUFEcUU7SUFFakZGLEdBQUcsRUFBRSxlQUFZO01BQ2IsT0FBT2pELE1BQU0sQ0FBQytFLENBQUQsQ0FBYjtJQUNIO0VBSmdGLENBQWxDO0FBTXRELENBUEQifQ== },{"./vdom.cjs":4,"@fullcalendar/common":1,"tslib":32}],4:[function(require,module,exports){ 'use strict'; var tslib = require('tslib'); var preact = require('preact'); var preactCompat = require('preact/compat'); function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: function get() { return e[k]; } }); } }); } n['default'] = e; return Object.freeze(n); } var preact__namespace = /*#__PURE__*/_interopNamespace(preact); var preactCompat__namespace = /*#__PURE__*/_interopNamespace(preactCompat); var globalObj = typeof globalThis !== 'undefined' ? globalThis : window; // // TODO: streamline when killing IE11 support if (globalObj.FullCalendarVDom) { console.warn('FullCalendar VDOM already loaded'); } else { globalObj.FullCalendarVDom = { Component: preact__namespace.Component, createElement: preact__namespace.createElement, render: preact__namespace.render, createRef: preact__namespace.createRef, Fragment: preact__namespace.Fragment, createContext: createContext, createPortal: preactCompat__namespace.createPortal, flushSync: flushSync, unmountComponentAtNode: unmountComponentAtNode }; } // HACKS... // TODO: lock version // TODO: link gh issues function flushSync(runBeforeFlush) { runBeforeFlush(); var oldDebounceRendering = preact__namespace.options.debounceRendering; // orig var callbackQ = []; function execCallbackSync(callback) { callbackQ.push(callback); } preact__namespace.options.debounceRendering = execCallbackSync; preact__namespace.render(preact__namespace.createElement(FakeComponent, {}), document.createElement('div')); while (callbackQ.length) { callbackQ.shift()(); } preact__namespace.options.debounceRendering = oldDebounceRendering; } var FakeComponent = /** @class */ function (_super) { tslib.__extends(FakeComponent, _super); function FakeComponent() { return _super !== null && _super.apply(this, arguments) || this; } FakeComponent.prototype.render = function () { return preact__namespace.createElement('div', {}); }; FakeComponent.prototype.componentDidMount = function () { this.setState({}); }; return FakeComponent; }(preact__namespace.Component); function createContext(defaultValue) { var ContextType = preact__namespace.createContext(defaultValue); var origProvider = ContextType.Provider; ContextType.Provider = function () { var _this = this; var isNew = !this.getChildContext; var children = origProvider.apply(this, arguments); // eslint-disable-line prefer-rest-params if (isNew) { var subs_1 = []; this.shouldComponentUpdate = function (_props) { if (_this.props.value !== _props.value) { subs_1.forEach(function (c) { c.context = _props.value; c.forceUpdate(); }); } }; this.sub = function (c) { subs_1.push(c); var old = c.componentWillUnmount; c.componentWillUnmount = function () { subs_1.splice(subs_1.indexOf(c), 1); old && old.call(c); }; }; } return children; }; return ContextType; } function unmountComponentAtNode(node) { preact__namespace.render(null, node); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0c2xpYiIsInJlcXVpcmUiLCJwcmVhY3QiLCJwcmVhY3RDb21wYXQiLCJfaW50ZXJvcE5hbWVzcGFjZSIsImUiLCJfX2VzTW9kdWxlIiwibiIsIk9iamVjdCIsImNyZWF0ZSIsImtleXMiLCJmb3JFYWNoIiwiayIsImQiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCIsImVudW1lcmFibGUiLCJmcmVlemUiLCJwcmVhY3RfX25hbWVzcGFjZSIsInByZWFjdENvbXBhdF9fbmFtZXNwYWNlIiwiZ2xvYmFsT2JqIiwiZ2xvYmFsVGhpcyIsIndpbmRvdyIsIkZ1bGxDYWxlbmRhclZEb20iLCJjb25zb2xlIiwid2FybiIsIkNvbXBvbmVudCIsImNyZWF0ZUVsZW1lbnQiLCJyZW5kZXIiLCJjcmVhdGVSZWYiLCJGcmFnbWVudCIsImNyZWF0ZUNvbnRleHQiLCJjcmVhdGVQb3J0YWwiLCJmbHVzaFN5bmMiLCJ1bm1vdW50Q29tcG9uZW50QXROb2RlIiwicnVuQmVmb3JlRmx1c2giLCJvbGREZWJvdW5jZVJlbmRlcmluZyIsIm9wdGlvbnMiLCJkZWJvdW5jZVJlbmRlcmluZyIsImNhbGxiYWNrUSIsImV4ZWNDYWxsYmFja1N5bmMiLCJjYWxsYmFjayIsInB1c2giLCJGYWtlQ29tcG9uZW50IiwiZG9jdW1lbnQiLCJsZW5ndGgiLCJzaGlmdCIsIl9zdXBlciIsIl9fZXh0ZW5kcyIsImFwcGx5IiwiYXJndW1lbnRzIiwicHJvdG90eXBlIiwiY29tcG9uZW50RGlkTW91bnQiLCJzZXRTdGF0ZSIsImRlZmF1bHRWYWx1ZSIsIkNvbnRleHRUeXBlIiwib3JpZ1Byb3ZpZGVyIiwiUHJvdmlkZXIiLCJfdGhpcyIsImlzTmV3IiwiZ2V0Q2hpbGRDb250ZXh0IiwiY2hpbGRyZW4iLCJzdWJzXzEiLCJzaG91bGRDb21wb25lbnRVcGRhdGUiLCJfcHJvcHMiLCJwcm9wcyIsInZhbHVlIiwiYyIsImNvbnRleHQiLCJmb3JjZVVwZGF0ZSIsInN1YiIsIm9sZCIsImNvbXBvbmVudFdpbGxVbm1vdW50Iiwic3BsaWNlIiwiaW5kZXhPZiIsImNhbGwiLCJub2RlIl0sInNvdXJjZXMiOlsidmRvbS5janMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdHNsaWIgPSByZXF1aXJlKCd0c2xpYicpO1xudmFyIHByZWFjdCA9IHJlcXVpcmUoJ3ByZWFjdCcpO1xudmFyIHByZWFjdENvbXBhdCA9IHJlcXVpcmUoJ3ByZWFjdC9jb21wYXQnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BOYW1lc3BhY2UoZSkge1xuICAgIGlmIChlICYmIGUuX19lc01vZHVsZSkgcmV0dXJuIGU7XG4gICAgdmFyIG4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGlmIChlKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICAgIGlmIChrICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICB2YXIgZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgayk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIGssIGQuZ2V0ID8gZCA6IHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtrXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgblsnZGVmYXVsdCddID0gZTtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShuKTtcbn1cblxudmFyIHByZWFjdF9fbmFtZXNwYWNlID0gLyojX19QVVJFX18qL19pbnRlcm9wTmFtZXNwYWNlKHByZWFjdCk7XG52YXIgcHJlYWN0Q29tcGF0X19uYW1lc3BhY2UgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BOYW1lc3BhY2UocHJlYWN0Q29tcGF0KTtcblxudmFyIGdsb2JhbE9iaiA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB3aW5kb3c7IC8vIC8vIFRPRE86IHN0cmVhbWxpbmUgd2hlbiBraWxsaW5nIElFMTEgc3VwcG9ydFxuaWYgKGdsb2JhbE9iai5GdWxsQ2FsZW5kYXJWRG9tKSB7XG4gICAgY29uc29sZS53YXJuKCdGdWxsQ2FsZW5kYXIgVkRPTSBhbHJlYWR5IGxvYWRlZCcpO1xufVxuZWxzZSB7XG4gICAgZ2xvYmFsT2JqLkZ1bGxDYWxlbmRhclZEb20gPSB7XG4gICAgICAgIENvbXBvbmVudDogcHJlYWN0X19uYW1lc3BhY2UuQ29tcG9uZW50LFxuICAgICAgICBjcmVhdGVFbGVtZW50OiBwcmVhY3RfX25hbWVzcGFjZS5jcmVhdGVFbGVtZW50LFxuICAgICAgICByZW5kZXI6IHByZWFjdF9fbmFtZXNwYWNlLnJlbmRlcixcbiAgICAgICAgY3JlYXRlUmVmOiBwcmVhY3RfX25hbWVzcGFjZS5jcmVhdGVSZWYsXG4gICAgICAgIEZyYWdtZW50OiBwcmVhY3RfX25hbWVzcGFjZS5GcmFnbWVudCxcbiAgICAgICAgY3JlYXRlQ29udGV4dDogY3JlYXRlQ29udGV4dCxcbiAgICAgICAgY3JlYXRlUG9ydGFsOiBwcmVhY3RDb21wYXRfX25hbWVzcGFjZS5jcmVhdGVQb3J0YWwsXG4gICAgICAgIGZsdXNoU3luYzogZmx1c2hTeW5jLFxuICAgICAgICB1bm1vdW50Q29tcG9uZW50QXROb2RlOiB1bm1vdW50Q29tcG9uZW50QXROb2RlLFxuICAgIH07XG59XG4vLyBIQUNLUy4uLlxuLy8gVE9ETzogbG9jayB2ZXJzaW9uXG4vLyBUT0RPOiBsaW5rIGdoIGlzc3Vlc1xuZnVuY3Rpb24gZmx1c2hTeW5jKHJ1bkJlZm9yZUZsdXNoKSB7XG4gICAgcnVuQmVmb3JlRmx1c2goKTtcbiAgICB2YXIgb2xkRGVib3VuY2VSZW5kZXJpbmcgPSBwcmVhY3RfX25hbWVzcGFjZS5vcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nOyAvLyBvcmlnXG4gICAgdmFyIGNhbGxiYWNrUSA9IFtdO1xuICAgIGZ1bmN0aW9uIGV4ZWNDYWxsYmFja1N5bmMoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2tRLnB1c2goY2FsbGJhY2spO1xuICAgIH1cbiAgICBwcmVhY3RfX25hbWVzcGFjZS5vcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nID0gZXhlY0NhbGxiYWNrU3luYztcbiAgICBwcmVhY3RfX25hbWVzcGFjZS5yZW5kZXIocHJlYWN0X19uYW1lc3BhY2UuY3JlYXRlRWxlbWVudChGYWtlQ29tcG9uZW50LCB7fSksIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcbiAgICB3aGlsZSAoY2FsbGJhY2tRLmxlbmd0aCkge1xuICAgICAgICBjYWxsYmFja1Euc2hpZnQoKSgpO1xuICAgIH1cbiAgICBwcmVhY3RfX25hbWVzcGFjZS5vcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nID0gb2xkRGVib3VuY2VSZW5kZXJpbmc7XG59XG52YXIgRmFrZUNvbXBvbmVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRmFrZUNvbXBvbmVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBGYWtlQ29tcG9uZW50KCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIEZha2VDb21wb25lbnQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHByZWFjdF9fbmFtZXNwYWNlLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHt9KTsgfTtcbiAgICBGYWtlQ29tcG9uZW50LnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5zZXRTdGF0ZSh7fSk7IH07XG4gICAgcmV0dXJuIEZha2VDb21wb25lbnQ7XG59KHByZWFjdF9fbmFtZXNwYWNlLkNvbXBvbmVudCkpO1xuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChkZWZhdWx0VmFsdWUpIHtcbiAgICB2YXIgQ29udGV4dFR5cGUgPSBwcmVhY3RfX25hbWVzcGFjZS5jcmVhdGVDb250ZXh0KGRlZmF1bHRWYWx1ZSk7XG4gICAgdmFyIG9yaWdQcm92aWRlciA9IENvbnRleHRUeXBlLlByb3ZpZGVyO1xuICAgIENvbnRleHRUeXBlLlByb3ZpZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgaXNOZXcgPSAhdGhpcy5nZXRDaGlsZENvbnRleHQ7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IG9yaWdQcm92aWRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgICAgICBpZiAoaXNOZXcpIHtcbiAgICAgICAgICAgIHZhciBzdWJzXzEgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gKF9wcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5wcm9wcy52YWx1ZSAhPT0gX3Byb3BzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNfMS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmNvbnRleHQgPSBfcHJvcHMudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmZvcmNlVXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnN1YiA9IGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICAgICAgc3Vic18xLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgdmFyIG9sZCA9IGMuY29tcG9uZW50V2lsbFVubW91bnQ7XG4gICAgICAgICAgICAgICAgYy5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Vic18xLnNwbGljZShzdWJzXzEuaW5kZXhPZihjKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIG9sZCAmJiBvbGQuY2FsbChjKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgfTtcbiAgICByZXR1cm4gQ29udGV4dFR5cGU7XG59XG5mdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50QXROb2RlKG5vZGUpIHtcbiAgICBwcmVhY3RfX25hbWVzcGFjZS5yZW5kZXIobnVsbCwgbm9kZSk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBLElBQUlBLEtBQUssR0FBR0MsT0FBTyxDQUFDLE9BQUQsQ0FBbkI7O0FBQ0EsSUFBSUMsTUFBTSxHQUFHRCxPQUFPLENBQUMsUUFBRCxDQUFwQjs7QUFDQSxJQUFJRSxZQUFZLEdBQUdGLE9BQU8sQ0FBQyxlQUFELENBQTFCOztBQUVBLFNBQVNHLGlCQUFULENBQTJCQyxDQUEzQixFQUE4QjtFQUMxQixJQUFJQSxDQUFDLElBQUlBLENBQUMsQ0FBQ0MsVUFBWCxFQUF1QixPQUFPRCxDQUFQO0VBQ3ZCLElBQUlFLENBQUMsR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQWMsSUFBZCxDQUFSOztFQUNBLElBQUlKLENBQUosRUFBTztJQUNIRyxNQUFNLENBQUNFLElBQVAsQ0FBWUwsQ0FBWixFQUFlTSxPQUFmLENBQXVCLFVBQVVDLENBQVYsRUFBYTtNQUNoQyxJQUFJQSxDQUFDLEtBQUssU0FBVixFQUFxQjtRQUNqQixJQUFJQyxDQUFDLEdBQUdMLE1BQU0sQ0FBQ00sd0JBQVAsQ0FBZ0NULENBQWhDLEVBQW1DTyxDQUFuQyxDQUFSO1FBQ0FKLE1B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 },{"preact":29,"preact/compat":28,"tslib":32}],5:[function(require,module,exports){ /*! FullCalendar v5.11.2 Docs & License: https://fullcalendar.io/ (c) 2022 Adam Shaw */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var common = require('@fullcalendar/common'); var tslib = require('tslib'); ; /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells. ----------------------------------------------------------------------------------------------------------------------*/ // It is a manager for a Table subcomponent, which does most of the heavy lifting. // It is responsible for managing width/height. var TableView = /** @class */ function (_super) { tslib.__extends(TableView, _super); function TableView() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.headerElRef = common.createRef(); return _this; } TableView.prototype.renderSimpleLayout = function (headerRowContent, bodyContent) { var _a = this, props = _a.props, context = _a.context; var sections = []; var stickyHeaderDates = common.getStickyHeaderDates(context.options); if (headerRowContent) { sections.push({ type: 'header', key: 'header', isSticky: stickyHeaderDates, chunk: { elRef: this.headerElRef, tableClassName: 'fc-col-header', rowContent: headerRowContent } }); } sections.push({ type: 'body', key: 'body', liquid: true, chunk: { content: bodyContent } }); return common.createElement(common.ViewRoot, { viewSpec: context.viewSpec }, function (rootElRef, classNames) { return common.createElement("div", { ref: rootElRef, className: ['fc-daygrid'].concat(classNames).join(' ') }, common.createElement(common.SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [] /* TODO: make optional? */ , sections: sections })); }); }; TableView.prototype.renderHScrollLayout = function (headerRowContent, bodyContent, colCnt, dayMinWidth) { var ScrollGrid = this.context.pluginHooks.scrollGridImpl; if (!ScrollGrid) { throw new Error('No ScrollGrid implementation'); } var _a = this, props = _a.props, context = _a.context; var stickyHeaderDates = !props.forPrint && common.getStickyHeaderDates(context.options); var stickyFooterScrollbar = !props.forPrint && common.getStickyFooterScrollbar(context.options); var sections = []; if (headerRowContent) { sections.push({ type: 'header', key: 'header', isSticky: stickyHeaderDates, chunks: [{ key: 'main', elRef: this.headerElRef, tableClassName: 'fc-col-header', rowContent: headerRowContent }] }); } sections.push({ type: 'body', key: 'body', liquid: true, chunks: [{ key: 'main', content: bodyContent }] }); if (stickyFooterScrollbar) { sections.push({ type: 'footer', key: 'footer', isSticky: true, chunks: [{ key: 'main', content: common.renderScrollShim }] }); } return common.createElement(common.ViewRoot, { viewSpec: context.viewSpec }, function (rootElRef, classNames) { return common.createElement("div", { ref: rootElRef, className: ['fc-daygrid'].concat(classNames).join(' ') }, common.createElement(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, colGroups: [{ cols: [{ span: colCnt, minWidth: dayMinWidth }] }], sections: sections })); }); }; return TableView; }(common.DateComponent); function splitSegsByRow(segs, rowCnt) { var byRow = []; for (var i = 0; i < rowCnt; i += 1) { byRow[i] = []; } for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { var seg = segs_1[_i]; byRow[seg.row].push(seg); } return byRow; } function splitSegsByFirstCol(segs, colCnt) { var byCol = []; for (var i = 0; i < colCnt; i += 1) { byCol[i] = []; } for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) { var seg = segs_2[_i]; byCol[seg.firstCol].push(seg); } return byCol; } function splitInteractionByRow(ui, rowCnt) { var byRow = []; if (!ui) { for (var i = 0; i < rowCnt; i += 1) { byRow[i] = null; } } else { for (var i = 0; i < rowCnt; i += 1) { byRow[i] = { affectedInstances: ui.affectedInstances, isEvent: ui.isEvent, segs: [] }; } for (var _i = 0, _a = ui.segs; _i < _a.length; _i++) { var seg = _a[_i]; byRow[seg.row].segs.push(seg); } } return byRow; } var TableCellTop = /** @class */ function (_super) { tslib.__extends(TableCellTop, _super); function TableCellTop() { return _super !== null && _super.apply(this, arguments) || this; } TableCellTop.prototype.render = function () { var props = this.props; var navLinkAttrs = common.buildNavLinkAttrs(this.context, props.date); return common.createElement(common.DayCellContent, { date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraHookProps: props.extraHookProps, defaultContent: renderTopInner }, function (innerElRef, innerContent) { return (innerContent || props.forceDayTop) && common.createElement("div", { className: "fc-daygrid-day-top", ref: innerElRef }, common.createElement("a", tslib.__assign({ id: props.dayNumberId, className: "fc-daygrid-day-number" }, navLinkAttrs), innerContent || common.createElement(common.Fragment, null, "\xA0"))); }); }; return TableCellTop; }(common.BaseComponent); function renderTopInner(props) { return props.dayNumberText; } var DEFAULT_TABLE_EVENT_TIME_FORMAT = common.createFormatter({ hour: 'numeric', minute: '2-digit', omitZeroMinute: true, meridiem: 'narrow' }); function hasListItemDisplay(seg) { var display = seg.eventRange.ui.display; return display === 'list-item' || display === 'auto' && !seg.eventRange.def.allDay && seg.firstCol === seg.lastCol && // can't be multi-day seg.isStart && // " seg.isEnd // " ; } var TableBlockEvent = /** @class */ function (_super) { tslib.__extends(TableBlockEvent, _super); function TableBlockEvent() { return _super !== null && _super.apply(this, arguments) || this; } TableBlockEvent.prototype.render = function () { var props = this.props; return common.createElement(common.StandardEvent, tslib.__assign({}, props, { extraClassNames: ['fc-daygrid-event', 'fc-daygrid-block-event', 'fc-h-event'], defaultTimeFormat: DEFAULT_TABLE_EVENT_TIME_FORMAT, defaultDisplayEventEnd: props.defaultDisplayEventEnd, disableResizing: !props.seg.eventRange.def.allDay })); }; return TableBlockEvent; }(common.BaseComponent); var TableListItemEvent = /** @class */ function (_super) { tslib.__extends(TableListItemEvent, _super); function TableListItemEvent() { return _super !== null && _super.apply(this, arguments) || this; } TableListItemEvent.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; var timeFormat = context.options.eventTimeFormat || DEFAULT_TABLE_EVENT_TIME_FORMAT; var timeText = common.buildSegTimeText(props.seg, timeFormat, context, true, props.defaultDisplayEventEnd); return common.createElement(common.EventRoot, { seg: props.seg, timeText: timeText, defaultContent: renderInnerContent, isDragging: props.isDragging, isResizing: false, isDateSelecting: false, isSelected: props.isSelected, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent) { return (// we don't use styles! common.createElement("a", tslib.__assign({ className: ['fc-daygrid-event', 'fc-daygrid-dot-event'].concat(classNames).join(' '), ref: rootElRef }, common.getSegAnchorAttrs(props.seg, context)), innerContent) ); }); }; return TableListItemEvent; }(common.BaseComponent); function renderInnerContent(innerProps) { return common.createElement(common.Fragment, null, common.createElement("div", { className: "fc-daygrid-event-dot", style: { borderColor: innerProps.borderColor || innerProps.backgroundColor } }), innerProps.timeText && common.createElement("div", { className: "fc-event-time" }, innerProps.timeText), common.createElement("div", { className: "fc-event-title" }, innerProps.event.title || common.createElement(common.Fragment, null, "\xA0"))); } var TableCellMoreLink = /** @class */ function (_super) { tslib.__extends(TableCellMoreLink, _super); function TableCellMoreLink() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.compileSegs = common.memoize(compileSegs); return _this; } TableCellMoreLink.prototype.render = function () { var props = this.props; var _a = this.compileSegs(props.singlePlacements), allSegs = _a.allSegs, invisibleSegs = _a.invisibleSegs; return common.createElement(common.MoreLinkRoot, { dateProfile: props.dateProfile, todayRange: props.todayRange, allDayDate: props.allDayDate, moreCnt: props.moreCnt, allSegs: allSegs, hiddenSegs: invisibleSegs, alignmentElRef: props.alignmentElRef, alignGridTop: props.alignGridTop, extraDateSpan: props.extraDateSpan, popoverContent: function popoverContent() { var isForcedInvisible = (props.eventDrag ? props.eventDrag.affectedInstances : null) || (props.eventResize ? props.eventResize.affectedInstances : null) || {}; return common.createElement(common.Fragment, null, allSegs.map(function (seg) { var instanceId = seg.eventRange.instance.instanceId; return common.createElement("div", { className: "fc-daygrid-event-harness", key: instanceId, style: { visibility: isForcedInvisible[instanceId] ? 'hidden' : '' } }, hasListItemDisplay(seg) ? common.createElement(TableListItemEvent, tslib.__assign({ seg: seg, isDragging: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, common.getSegMeta(seg, props.todayRange))) : common.createElement(TableBlockEvent, tslib.__assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === props.eventSelection, defaultDisplayEventEnd: false }, common.getSegMeta(seg, props.todayRange)))); })); } }, function (rootElRef, classNames, innerElRef, innerContent, handleClick, title, isExpanded, popoverId) { return common.createElement("a", tslib.__assign({ ref: rootElRef, className: ['fc-daygrid-more-link'].concat(classNames).join(' '), title: title, "aria-expanded": isExpanded, "aria-controls": popoverId }, common.createAriaClickAttrs(handleClick)), innerContent); }); }; return TableCellMoreLink; }(common.BaseComponent); function compileSegs(singlePlacements) { var allSegs = []; var invisibleSegs = []; for (var _i = 0, singlePlacements_1 = singlePlacements; _i < singlePlacements_1.length; _i++) { var placement = singlePlacements_1[_i]; allSegs.push(placement.seg); if (!placement.isVisible) { invisibleSegs.push(placement.seg); } } return { allSegs: allSegs, invisibleSegs: invisibleSegs }; } var DEFAULT_WEEK_NUM_FORMAT = common.createFormatter({ week: 'narrow' }); var TableCell = /** @class */ function (_super) { tslib.__extends(TableCell, _super); function TableCell() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.rootElRef = common.createRef(); _this.state = { dayNumberId: common.getUniqueDomId() }; _this.handleRootEl = function (el) { common.setRef(_this.rootElRef, el); common.setRef(_this.props.elRef, el); }; return _this; } TableCell.prototype.render = function () { var _a = this, context = _a.context, props = _a.props, state = _a.state, rootElRef = _a.rootElRef; var date = props.date, dateProfile = props.dateProfile; var navLinkAttrs = common.buildNavLinkAttrs(context, date, 'week'); return common.createElement(common.DayCellRoot, { date: date, dateProfile: dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraHookProps: props.extraHookProps, elRef: this.handleRootEl }, function (dayElRef, dayClassNames, rootDataAttrs, isDisabled) { return common.createElement("td", tslib.__assign({ ref: dayElRef, role: "gridcell", className: ['fc-daygrid-day'].concat(dayClassNames, props.extraClassNames || []).join(' ') }, rootDataAttrs, props.extraDataAttrs, props.showDayNumber ? { 'aria-labelledby': state.dayNumberId } : {}), common.createElement("div", { className: "fc-daygrid-day-frame fc-scrollgrid-sync-inner", ref: props.innerElRef /* different from hook system! RENAME */ }, props.showWeekNumber && common.createElement(common.WeekNumberRoot, { date: date, defaultFormat: DEFAULT_WEEK_NUM_FORMAT }, function (weekElRef, weekClassNames, innerElRef, innerContent) { return common.createElement("a", tslib.__assign({ ref: weekElRef, className: ['fc-daygrid-week-number'].concat(weekClassNames).join(' ') }, navLinkAttrs), innerContent); }), !isDisabled && common.createElement(TableCellTop, { date: date, dateProfile: dateProfile, showDayNumber: props.showDayNumber, dayNumberId: state.dayNumberId, forceDayTop: props.forceDayTop, todayRange: props.todayRange, extraHookProps: props.extraHookProps }), common.createElement("div", { className: "fc-daygrid-day-events", ref: props.fgContentElRef }, props.fgContent, common.createElement("div", { className: "fc-daygrid-day-bottom", style: { marginTop: props.moreMarginTop } }, common.createElement(TableCellMoreLink, { allDayDate: date, singlePlacements: props.singlePlacements, moreCnt: props.moreCnt, alignmentElRef: rootElRef, alignGridTop: !props.showDayNumber, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange }))), common.createElement("div", { className: "fc-daygrid-day-bg" }, props.bgContent))); }); }; return TableCell; }(common.DateComponent); function computeFgSegPlacement(segs, // assumed already sorted dayMaxEvents, dayMaxEventRows, strictOrder, eventInstanceHeights, maxContentHeight, cells) { var hierarchy = new DayGridSegHierarchy(); hierarchy.allowReslicing = true; hierarchy.strictOrder = strictOrder; if (dayMaxEvents === true || dayMaxEventRows === true) { hierarchy.maxCoord = maxContentHeight; hierarchy.hiddenConsumes = true; } else if (typeof dayMaxEvents === 'number') { hierarchy.maxStackCnt = dayMaxEvents; } else if (typeof dayMaxEventRows === 'number') { hierarchy.maxStackCnt = dayMaxEventRows; hierarchy.hiddenConsumes = true; } // create segInputs only for segs with known heights var segInputs = []; var unknownHeightSegs = []; for (var i = 0; i < segs.length; i += 1) { var seg = segs[i]; var instanceId = seg.eventRange.instance.instanceId; var eventHeight = eventInstanceHeights[instanceId]; if (eventHeight != null) { segInputs.push({ index: i, thickness: eventHeight, span: { start: seg.firstCol, end: seg.lastCol + 1 } }); } else { unknownHeightSegs.push(seg); } } var hiddenEntries = hierarchy.addSegs(segInputs); var segRects = hierarchy.toRects(); var _a = placeRects(segRects, segs, cells), singleColPlacements = _a.singleColPlacements, multiColPlacements = _a.multiColPlacements, leftoverMargins = _a.leftoverMargins; var moreCnts = []; var moreMarginTops = []; // add segs with unknown heights for (var _i = 0, unknownHeightSegs_1 = unknownHeightSegs; _i < unknownHeightSegs_1.length; _i++) { var seg = unknownHeightSegs_1[_i]; multiColPlacements[seg.firstCol].push({ seg: seg, isVisible: false, isAbsolute: true, absoluteTop: 0, marginTop: 0 }); for (var col = seg.firstCol; col <= seg.lastCol; col += 1) { singleColPlacements[col].push({ seg: resliceSeg(seg, col, col + 1, cells), isVisible: false, isAbsolute: false, absoluteTop: 0, marginTop: 0 }); } } // add the hidden entries for (var col = 0; col < cells.length; col += 1) { moreCnts.push(0); } for (var _b = 0, hiddenEntries_1 = hiddenEntries; _b < hiddenEntries_1.length; _b++) { var hiddenEntry = hiddenEntries_1[_b]; var seg = segs[hiddenEntry.index]; var hiddenSpan = hiddenEntry.span; multiColPlacements[hiddenSpan.start].push({ seg: resliceSeg(seg, hiddenSpan.start, hiddenSpan.end, cells), isVisible: false, isAbsolute: true, absoluteTop: 0, marginTop: 0 }); for (var col = hiddenSpan.start; col < hiddenSpan.end; col += 1) { moreCnts[col] += 1; singleColPlacements[col].push({ seg: resliceSeg(seg, col, col + 1, cells), isVisible: false, isAbsolute: false, absoluteTop: 0, marginTop: 0 }); } } // deal with leftover margins for (var col = 0; col < cells.length; col += 1) { moreMarginTops.push(leftoverMargins[col]); } return { singleColPlacements: singleColPlacements, multiColPlacements: multiColPlacements, moreCnts: moreCnts, moreMarginTops: moreMarginTops }; } // rects ordered by top coord, then left function placeRects(allRects, segs, cells) { var rectsByEachCol = groupRectsByEachCol(allRects, cells.length); var singleColPlacements = []; var multiColPlacements = []; var leftoverMargins = []; for (var col = 0; col < cells.length; col += 1) { var rects = rectsByEachCol[col]; // compute all static segs in singlePlacements var singlePlacements = []; var currentHeight = 0; var currentMarginTop = 0; for (var _i = 0, rects_1 = rects; _i < rects_1.length; _i++) { var rect = rects_1[_i]; var seg = segs[rect.index]; singlePlacements.push({ seg: resliceSeg(seg, col, col + 1, cells), isVisible: true, isAbsolute: false, absoluteTop: rect.levelCoord, marginTop: rect.levelCoord - currentHeight }); currentHeight = rect.levelCoord + rect.thickness; } // compute mixed static/absolute segs in multiPlacements var multiPlacements = []; currentHeight = 0; currentMarginTop = 0; for (var _a = 0, rects_2 = rects; _a < rects_2.length; _a++) { var rect = rects_2[_a]; var seg = segs[rect.index]; var isAbsolute = rect.span.end - rect.span.start > 1; // multi-column? var isFirstCol = rect.span.start === col; currentMarginTop += rect.levelCoord - currentHeight; // amount of space since bottom of previous seg currentHeight = rect.levelCoord + rect.thickness; // height will now be bottom of current seg if (isAbsolute) { currentMarginTop += rect.thickness; if (isFirstCol) { multiPlacements.push({ seg: resliceSeg(seg, rect.span.start, rect.span.end, cells), isVisible: true, isAbsolute: true, absoluteTop: rect.levelCoord, marginTop: 0 }); } } else if (isFirstCol) { multiPlacements.push({ seg: resliceSeg(seg, rect.span.start, rect.span.end, cells), isVisible: true, isAbsolute: false, absoluteTop: rect.levelCoord, marginTop: currentMarginTop // claim the margin }); currentMarginTop = 0; } } singleColPlacements.push(singlePlacements); multiColPlacements.push(multiPlacements); leftoverMargins.push(currentMarginTop); } return { singleColPlacements: singleColPlacements, multiColPlacements: multiColPlacements, leftoverMargins: leftoverMargins }; } function groupRectsByEachCol(rects, colCnt) { var rectsByEachCol = []; for (var col = 0; col < colCnt; col += 1) { rectsByEachCol.push([]); } for (var _i = 0, rects_3 = rects; _i < rects_3.length; _i++) { var rect = rects_3[_i]; for (var col = rect.span.start; col < rect.span.end; col += 1) { rectsByEachCol[col].push(rect); } } return rectsByEachCol; } function resliceSeg(seg, spanStart, spanEnd, cells) { if (seg.firstCol === spanStart && seg.lastCol === spanEnd - 1) { return seg; } var eventRange = seg.eventRange; var origRange = eventRange.range; var slicedRange = common.intersectRanges(origRange, { start: cells[spanStart].date, end: common.addDays(cells[spanEnd - 1].date, 1) }); return tslib.__assign(tslib.__assign({}, seg), { firstCol: spanStart, lastCol: spanEnd - 1, eventRange: { def: eventRange.def, ui: tslib.__assign(tslib.__assign({}, eventRange.ui), { durationEditable: false }), instance: eventRange.instance, range: slicedRange }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() }); } var DayGridSegHierarchy = /** @class */ function (_super) { tslib.__extends(DayGridSegHierarchy, _super); function DayGridSegHierarchy() { var _this = _super !== null && _super.apply(this, arguments) || this; // config _this.hiddenConsumes = false; // allows us to keep hidden entries in the hierarchy so they take up space _this.forceHidden = {}; return _this; } DayGridSegHierarchy.prototype.addSegs = function (segInputs) { var _this = this; var hiddenSegs = _super.prototype.addSegs.call(this, segInputs); var entriesByLevel = this.entriesByLevel; var excludeHidden = function excludeHidden(entry) { return !_this.forceHidden[common.buildEntryKey(entry)]; }; // remove the forced-hidden segs for (var level = 0; level < entriesByLevel.length; level += 1) { entriesByLevel[level] = entriesByLevel[level].filter(excludeHidden); } return hiddenSegs; }; DayGridSegHierarchy.prototype.handleInvalidInsertion = function (insertion, entry, hiddenEntries) { var _a = this, entriesByLevel = _a.entriesByLevel, forceHidden = _a.forceHidden; var touchingEntry = insertion.touchingEntry, touchingLevel = insertion.touchingLevel, touchingLateral = insertion.touchingLateral; if (this.hiddenConsumes && touchingEntry) { var touchingEntryId = common.buildEntryKey(touchingEntry); // if not already hidden if (!forceHidden[touchingEntryId]) { if (this.allowReslicing) { var placeholderEntry = tslib.__assign(tslib.__assign({}, touchingEntry), { span: common.intersectSpans(touchingEntry.span, entry.span) }); var placeholderEntryId = common.buildEntryKey(placeholderEntry); forceHidden[placeholderEntryId] = true; entriesByLevel[touchingLevel][touchingLateral] = placeholderEntry; // replace touchingEntry with our placeholder this.splitEntry(touchingEntry, entry, hiddenEntries); // split up the touchingEntry, reinsert it } else { forceHidden[touchingEntryId] = true; hiddenEntries.push(touchingEntry); } } } return _super.prototype.handleInvalidInsertion.call(this, insertion, entry, hiddenEntries); }; return DayGridSegHierarchy; }(common.SegHierarchy); var TableRow = /** @class */ function (_super) { tslib.__extends(TableRow, _super); function TableRow() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.cellElRefs = new common.RefMap(); // the ? common.createElement("tr", { role: "presentation", className: "fc-scrollgrid-section" }, common.createElement("td", { className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') })) }); } sections.push({ type: 'body', key: 'body', liquid: true, expandRows: Boolean(context.options.expandRows), chunk: { scrollerElRef: this.scrollerElRef, content: timeContent } }); return common.createElement(common.ViewRoot, { viewSpec: context.viewSpec, elRef: this.rootElRef }, function (rootElRef, classNames) { return common.createElement("div", { className: ['fc-timegrid'].concat(classNames).join(' '), ref: rootElRef }, common.createElement(common.SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: props.forPrint, cols: [{ width: 'shrink' }], sections: sections })); }); }; TimeColsView.prototype.renderHScrollLayout = function (headerRowContent, allDayContent, timeContent, colCnt, dayMinWidth, slatMetas, slatCoords) { var _this = this; var ScrollGrid = this.context.pluginHooks.scrollGridImpl; if (!ScrollGrid) { throw new Error('No ScrollGrid implementation'); } var _a = this, context = _a.context, props = _a.props; var stickyHeaderDates = !props.forPrint && common.getStickyHeaderDates(context.options); var stickyFooterScrollbar = !props.forPrint && common.getStickyFooterScrollbar(context.options); var sections = []; if (headerRowContent) { sections.push({ type: 'header', key: 'header', isSticky: stickyHeaderDates, syncRowHeights: true, chunks: [{ key: 'axis', rowContent: function rowContent(arg) { return common.createElement("tr", { role: "presentation" }, _this.renderHeadAxis('day', arg.rowSyncHeights[0])); } }, { key: 'cols', elRef: this.headerElRef, tableClassName: 'fc-col-header', rowContent: headerRowContent }] }); } if (allDayContent) { sections.push({ type: 'body', key: 'all-day', syncRowHeights: true, chunks: [{ key: 'axis', rowContent: function rowContent(contentArg) { return common.createElement("tr", { role: "presentation" }, _this.renderTableRowAxis(contentArg.rowSyncHeights[0])); } }, { key: 'cols', content: allDayContent }] }); sections.push({ key: 'all-day-divider', type: 'body', outerContent: // TODO: rename to cellContent so don't need to define ? common.createElement("tr", { role: "presentation", className: "fc-scrollgrid-section" }, common.createElement("td", { colSpan: 2, className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') })) }); } var isNowIndicator = context.options.nowIndicator; sections.push({ type: 'body', key: 'body', liquid: true, expandRows: Boolean(context.options.expandRows), chunks: [{ key: 'axis', content: function content(arg) { return (// TODO: make this now-indicator arrow more DRY with TimeColsContent common.createElement("div", { className: "fc-timegrid-axis-chunk" }, common.createElement("table", { "aria-hidden": true, style: { height: arg.expandRows ? arg.clientHeight : '' } }, arg.tableColGroupNode, common.createElement("tbody", null, common.createElement(TimeBodyAxis, { slatMetas: slatMetas }))), common.createElement("div", { className: "fc-timegrid-now-indicator-container" }, common.createElement(common.NowTimer, { unit: isNowIndicator ? 'minute' : 'day' /* hacky */ }, function (nowDate) { var nowIndicatorTop = isNowIndicator && slatCoords && slatCoords.safeComputeTop(nowDate); // might return void if (typeof nowIndicatorTop === 'number') { return common.createElement(common.NowIndicatorRoot, { isAxis: true, date: nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return common.createElement("div", { ref: rootElRef, className: ['fc-timegrid-now-indicator-arrow'].concat(classNames).join(' '), style: { top: nowIndicatorTop } }, innerContent); }); } return null; }))) ); } }, { key: 'cols', scrollerElRef: this.scrollerElRef, content: timeContent }] }); if (stickyFooterScrollbar) { sections.push({ key: 'footer', type: 'footer', isSticky: true, chunks: [{ key: 'axis', content: common.renderScrollShim }, { key: 'cols', content: common.renderScrollShim }] }); } return common.createElement(common.ViewRoot, { viewSpec: context.viewSpec, elRef: this.rootElRef }, function (rootElRef, classNames) { return common.createElement("div", { className: ['fc-timegrid'].concat(classNames).join(' '), ref: rootElRef }, common.createElement(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, collapsibleWidth: false, colGroups: [{ width: 'shrink', cols: [{ width: 'shrink' }] }, { cols: [{ span: colCnt, minWidth: dayMinWidth }] }], sections: sections })); }); }; /* Dimensions ------------------------------------------------------------------------------------------------------------------*/ TimeColsView.prototype.getAllDayMaxEventProps = function () { var _a = this.context.options, dayMaxEvents = _a.dayMaxEvents, dayMaxEventRows = _a.dayMaxEventRows; if (dayMaxEvents === true || dayMaxEventRows === true) { // is auto? dayMaxEvents = undefined; dayMaxEventRows = AUTO_ALL_DAY_MAX_EVENT_ROWS; // make sure "auto" goes to a real number } return { dayMaxEvents: dayMaxEvents, dayMaxEventRows: dayMaxEventRows }; }; return TimeColsView; }(common.DateComponent); function renderAllDayInner(hookProps) { return hookProps.text; } var TimeColsSlatsCoords = /** @class */ function () { function TimeColsSlatsCoords(positions, dateProfile, slotDuration) { this.positions = positions; this.dateProfile = dateProfile; this.slotDuration = slotDuration; } TimeColsSlatsCoords.prototype.safeComputeTop = function (date) { var dateProfile = this.dateProfile; if (common.rangeContainsMarker(dateProfile.currentRange, date)) { var startOfDayDate = common.startOfDay(date); var timeMs = date.valueOf() - startOfDayDate.valueOf(); if (timeMs >= common.asRoughMs(dateProfile.slotMinTime) && timeMs < common.asRoughMs(dateProfile.slotMaxTime)) { return this.computeTimeTop(common.createDuration(timeMs)); } } return null; }; // Computes the top coordinate, relative to the bounds of the grid, of the given date. // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight. TimeColsSlatsCoords.prototype.computeDateTop = function (when, startOfDayDate) { if (!startOfDayDate) { startOfDayDate = common.startOfDay(when); } return this.computeTimeTop(common.createDuration(when.valueOf() - startOfDayDate.valueOf())); }; // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration). // This is a makeshify way to compute the time-top. Assumes all slatMetas dates are uniform. // Eventually allow computation with arbirary slat dates. TimeColsSlatsCoords.prototype.computeTimeTop = function (duration) { var _a = this, positions = _a.positions, dateProfile = _a.dateProfile; var len = positions.els.length; // floating-point value of # of slots covered var slatCoverage = (duration.milliseconds - common.asRoughMs(dateProfile.slotMinTime)) / common.asRoughMs(this.slotDuration); var slatIndex; var slatRemainder; // compute a floating-point number for how many slats should be progressed through. // from 0 to number of slats (inclusive) // constrained because slotMinTime/slotMaxTime might be customized. slatCoverage = Math.max(0, slatCoverage); slatCoverage = Math.min(len, slatCoverage); // an integer index of the furthest whole slat // from 0 to number slats (*exclusive*, so len-1) slatIndex = Math.floor(slatCoverage); slatIndex = Math.min(slatIndex, len - 1); // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition. // could be 1.0 if slatCoverage is covering *all* the slots slatRemainder = slatCoverage - slatIndex; return positions.tops[slatIndex] + positions.getHeight(slatIndex) * slatRemainder; }; return TimeColsSlatsCoords; }(); var TimeColsSlatsBody = /** @class */ function (_super) { tslib.__extends(TimeColsSlatsBody, _super); function TimeColsSlatsBody() { return _super !== null && _super.apply(this, arguments) || this; } TimeColsSlatsBody.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; var options = context.options; var slatElRefs = props.slatElRefs; return common.createElement("tbody", null, props.slatMetas.map(function (slatMeta, i) { var hookProps = { time: slatMeta.time, date: context.dateEnv.toDate(slatMeta.date), view: context.viewApi }; var classNames = ['fc-timegrid-slot', 'fc-timegrid-slot-lane', slatMeta.isLabeled ? '' : 'fc-timegrid-slot-minor']; return common.createElement("tr", { key: slatMeta.key, ref: slatElRefs.createRef(slatMeta.key) }, props.axis && common.createElement(TimeColsAxisCell, tslib.__assign({}, slatMeta)), common.createElement(common.RenderHook, { hookProps: hookProps, classNames: options.slotLaneClassNames, content: options.slotLaneContent, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return common.createElement("td", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-time": slatMeta.isoTimeStr }, innerContent); })); })); }; return TimeColsSlatsBody; }(common.BaseComponent); /* for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL. */ var TimeColsSlats = /** @class */ function (_super) { tslib.__extends(TimeColsSlats, _super); function TimeColsSlats() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.rootElRef = common.createRef(); _this.slatElRefs = new common.RefMap(); return _this; } TimeColsSlats.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; return common.createElement("div", { ref: this.rootElRef, className: "fc-timegrid-slots" }, common.createElement("table", { "aria-hidden": true, className: context.theme.getClass('table'), style: { minWidth: props.tableMinWidth, width: props.clientWidth, height: props.minHeight } }, props.tableColGroupNode /* relies on there only being a single for the axis */ , common.createElement(TimeColsSlatsBody, { slatElRefs: this.slatElRefs, axis: props.axis, slatMetas: props.slatMetas }))); }; TimeColsSlats.prototype.componentDidMount = function () { this.updateSizing(); }; TimeColsSlats.prototype.componentDidUpdate = function () { this.updateSizing(); }; TimeColsSlats.prototype.componentWillUnmount = function () { if (this.props.onCoords) { this.props.onCoords(null); } }; TimeColsSlats.prototype.updateSizing = function () { var _a = this, context = _a.context, props = _a.props; if (props.onCoords && props.clientWidth !== null // means sizing has stabilized ) { var rootEl = this.rootElRef.current; if (rootEl.offsetHeight) { // not hidden by css props.onCoords(new TimeColsSlatsCoords(new common.PositionCache(this.rootElRef.current, collectSlatEls(this.slatElRefs.currentMap, props.slatMetas), false, true), this.props.dateProfile, context.options.slotDuration)); } } }; return TimeColsSlats; }(common.BaseComponent); function collectSlatEls(elMap, slatMetas) { return slatMetas.map(function (slatMeta) { return elMap[slatMeta.key]; }); } function splitSegsByCol(segs, colCnt) { var segsByCol = []; var i; for (i = 0; i < colCnt; i += 1) { segsByCol.push([]); } if (segs) { for (i = 0; i < segs.length; i += 1) { segsByCol[segs[i].col].push(segs[i]); } } return segsByCol; } function splitInteractionByCol(ui, colCnt) { var byRow = []; if (!ui) { for (var i = 0; i < colCnt; i += 1) { byRow[i] = null; } } else { for (var i = 0; i < colCnt; i += 1) { byRow[i] = { affectedInstances: ui.affectedInstances, isEvent: ui.isEvent, segs: [] }; } for (var _i = 0, _a = ui.segs; _i < _a.length; _i++) { var seg = _a[_i]; byRow[seg.col].segs.push(seg); } } return byRow; } var TimeColMoreLink = /** @class */ function (_super) { tslib.__extends(TimeColMoreLink, _super); function TimeColMoreLink() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.rootElRef = common.createRef(); return _this; } TimeColMoreLink.prototype.render = function () { var _this = this; var props = this.props; return common.createElement(common.MoreLinkRoot, { allDayDate: null, moreCnt: props.hiddenSegs.length, allSegs: props.hiddenSegs, hiddenSegs: props.hiddenSegs, alignmentElRef: this.rootElRef, defaultContent: renderMoreLinkInner, extraDateSpan: props.extraDateSpan, dateProfile: props.dateProfile, todayRange: props.todayRange, popoverContent: function popoverContent() { return renderPlainFgSegs(props.hiddenSegs, props); } }, function (rootElRef, classNames, innerElRef, innerContent, handleClick, title, isExpanded, popoverId) { return common.createElement("a", { ref: function ref(el) { common.setRef(rootElRef, el); common.setRef(_this.rootElRef, el); }, className: ['fc-timegrid-more-link'].concat(classNames).join(' '), style: { top: props.top, bottom: props.bottom }, onClick: handleClick, title: title, "aria-expanded": isExpanded, "aria-controls": popoverId }, common.createElement("div", { ref: innerElRef, className: "fc-timegrid-more-link-inner fc-sticky" }, innerContent)); }); }; return TimeColMoreLink; }(common.BaseComponent); function renderMoreLinkInner(props) { return props.shortText; } // segInputs assumed sorted function buildPositioning(segInputs, strictOrder, maxStackCnt) { var hierarchy = new common.SegHierarchy(); if (strictOrder != null) { hierarchy.strictOrder = strictOrder; } if (maxStackCnt != null) { hierarchy.maxStackCnt = maxStackCnt; } var hiddenEntries = hierarchy.addSegs(segInputs); var hiddenGroups = common.groupIntersectingEntries(hiddenEntries); var web = buildWeb(hierarchy); web = stretchWeb(web, 1); // all levelCoords/thickness will have 0.0-1.0 var segRects = webToRects(web); return { segRects: segRects, hiddenGroups: hiddenGroups }; } function buildWeb(hierarchy) { var entriesByLevel = hierarchy.entriesByLevel; var buildNode = cacheable(function (level, lateral) { return level + ':' + lateral; }, function (level, lateral) { var siblingRange = findNextLevelSegs(hierarchy, level, lateral); var nextLevelRes = buildNodes(siblingRange, buildNode); var entry = entriesByLevel[level][lateral]; return [tslib.__assign(tslib.__assign({}, entry), { nextLevelNodes: nextLevelRes[0] }), entry.thickness + nextLevelRes[1] // the pressure builds ]; }); return buildNodes(entriesByLevel.length ? { level: 0, lateralStart: 0, lateralEnd: entriesByLevel[0].length } : null, buildNode)[0]; } function buildNodes(siblingRange, buildNode) { if (!siblingRange) { return [[], 0]; } var level = siblingRange.level, lateralStart = siblingRange.lateralStart, lateralEnd = siblingRange.lateralEnd; var lateral = lateralStart; var pairs = []; while (lateral < lateralEnd) { pairs.push(buildNode(level, lateral)); lateral += 1; } pairs.sort(cmpDescPressures); return [pairs.map(extractNode), pairs[0][1] // first item's pressure ]; } function cmpDescPressures(a, b) { return b[1] - a[1]; } function extractNode(a) { return a[0]; } function findNextLevelSegs(hierarchy, subjectLevel, subjectLateral) { var levelCoords = hierarchy.levelCoords, entriesByLevel = hierarchy.entriesByLevel; var subjectEntry = entriesByLevel[subjectLevel][subjectLateral]; var afterSubject = levelCoords[subjectLevel] + subjectEntry.thickness; var levelCnt = levelCoords.length; var level = subjectLevel; // skip past levels that are too high up for (; level < levelCnt && levelCoords[level] < afterSubject; level += 1) { ; } // do nothing for (; level < levelCnt; level += 1) { var entries = entriesByLevel[level]; var entry = void 0; var searchIndex = common.binarySearch(entries, subjectEntry.span.start, common.getEntrySpanEnd); var lateralStart = searchIndex[0] + searchIndex[1]; // if exact match (which doesn't collide), go to next one var lateralEnd = lateralStart; while ( // loop through entries that horizontally intersect (entry = entries[lateralEnd]) && // but not past the whole seg list entry.span.start < subjectEntry.span.end) { lateralEnd += 1; } if (lateralStart < lateralEnd) { return { level: level, lateralStart: lateralStart, lateralEnd: lateralEnd }; } } return null; } function stretchWeb(topLevelNodes, totalThickness) { var stretchNode = cacheable(function (node, startCoord, prevThickness) { return common.buildEntryKey(node); }, function (node, startCoord, prevThickness) { var nextLevelNodes = node.nextLevelNodes, thickness = node.thickness; var allThickness = thickness + prevThickness; var thicknessFraction = thickness / allThickness; var endCoord; var newChildren = []; if (!nextLevelNodes.length) { endCoord = totalThickness; } else { for (var _i = 0, nextLevelNodes_1 = nextLevelNodes; _i < nextLevelNodes_1.length; _i++) { var childNode = nextLevelNodes_1[_i]; if (endCoord === undefined) { var res = stretchNode(childNode, startCoord, allThickness); endCoord = res[0]; newChildren.push(res[1]); } else { var res = stretchNode(childNode, endCoord, 0); newChildren.push(res[1]); } } } var newThickness = (endCoord - startCoord) * thicknessFraction; return [endCoord - newThickness, tslib.__assign(tslib.__assign({}, node), { thickness: newThickness, nextLevelNodes: newChildren })]; }); return topLevelNodes.map(function (node) { return stretchNode(node, 0, 0)[1]; }); } // not sorted in any particular order function webToRects(topLevelNodes) { var rects = []; var processNode = cacheable(function (node, levelCoord, stackDepth) { return common.buildEntryKey(node); }, function (node, levelCoord, stackDepth) { var rect = tslib.__assign(tslib.__assign({}, node), { levelCoord: levelCoord, stackDepth: stackDepth, stackForward: 0 }); rects.push(rect); return rect.stackForward = processNodes(node.nextLevelNodes, levelCoord + node.thickness, stackDepth + 1) + 1; }); function processNodes(nodes, levelCoord, stackDepth) { var stackForward = 0; for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) { var node = nodes_1[_i]; stackForward = Math.max(processNode(node, levelCoord, stackDepth), stackForward); } return stackForward; } processNodes(topLevelNodes, 0, 0); return rects; // TODO: sort rects by levelCoord to be consistent with toRects? } // TODO: move to general util function cacheable(keyFunc, workFunc) { var cache = {}; return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var key = keyFunc.apply(void 0, args); return key in cache ? cache[key] : cache[key] = workFunc.apply(void 0, args); }; } function computeSegVCoords(segs, colDate, slatCoords, eventMinHeight) { if (slatCoords === void 0) { slatCoords = null; } if (eventMinHeight === void 0) { eventMinHeight = 0; } var vcoords = []; if (slatCoords) { for (var i = 0; i < segs.length; i += 1) { var seg = segs[i]; var spanStart = slatCoords.computeDateTop(seg.start, colDate); var spanEnd = Math.max(spanStart + (eventMinHeight || 0), // :( slatCoords.computeDateTop(seg.end, colDate)); vcoords.push({ start: Math.round(spanStart), end: Math.round(spanEnd) // }); } } return vcoords; } function computeFgSegPlacements(segs, segVCoords, // might not have for every seg eventOrderStrict, eventMaxStack) { var segInputs = []; var dumbSegs = []; // segs without coords for (var i = 0; i < segs.length; i += 1) { var vcoords = segVCoords[i]; if (vcoords) { segInputs.push({ index: i, thickness: 1, span: vcoords }); } else { dumbSegs.push(segs[i]); } } var _a = buildPositioning(segInputs, eventOrderStrict, eventMaxStack), segRects = _a.segRects, hiddenGroups = _a.hiddenGroups; var segPlacements = []; for (var _i = 0, segRects_1 = segRects; _i < segRects_1.length; _i++) { var segRect = segRects_1[_i]; segPlacements.push({ seg: segs[segRect.index], rect: segRect }); } for (var _b = 0, dumbSegs_1 = dumbSegs; _b < dumbSegs_1.length; _b++) { var dumbSeg = dumbSegs_1[_b]; segPlacements.push({ seg: dumbSeg, rect: null }); } return { segPlacements: segPlacements, hiddenGroups: hiddenGroups }; } var DEFAULT_TIME_FORMAT = common.createFormatter({ hour: 'numeric', minute: '2-digit', meridiem: false }); var TimeColEvent = /** @class */ function (_super) { tslib.__extends(TimeColEvent, _super); function TimeColEvent() { return _super !== null && _super.apply(this, arguments) || this; } TimeColEvent.prototype.render = function () { var classNames = ['fc-timegrid-event', 'fc-v-event']; if (this.props.isShort) { classNames.push('fc-timegrid-event-short'); } return common.createElement(common.StandardEvent, tslib.__assign({}, this.props, { defaultTimeFormat: DEFAULT_TIME_FORMAT, extraClassNames: classNames })); }; return TimeColEvent; }(common.BaseComponent); var TimeColMisc = /** @class */ function (_super) { tslib.__extends(TimeColMisc, _super); function TimeColMisc() { return _super !== null && _super.apply(this, arguments) || this; } TimeColMisc.prototype.render = function () { var props = this.props; return common.createElement(common.DayCellContent, { date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraHookProps: props.extraHookProps }, function (innerElRef, innerContent) { return innerContent && common.createElement("div", { className: "fc-timegrid-col-misc", ref: innerElRef }, innerContent); }); }; return TimeColMisc; }(common.BaseComponent); var TimeCol = /** @class */ function (_super) { tslib.__extends(TimeCol, _super); function TimeCol() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.sortEventSegs = common.memoize(common.sortEventSegs); return _this; } // TODO: memoize event-placement? TimeCol.prototype.render = function () { var _this = this; var _a = this, props = _a.props, context = _a.context; var isSelectMirror = context.options.selectMirror; var mirrorSegs = props.eventDrag && props.eventDrag.segs || props.eventResize && props.eventResize.segs || isSelectMirror && props.dateSelectionSegs || []; var interactionAffectedInstances = // TODO: messy way to compute this props.eventDrag && props.eventDrag.affectedInstances || props.eventResize && props.eventResize.affectedInstances || {}; var sortedFgSegs = this.sortEventSegs(props.fgEventSegs, context.options.eventOrder); return common.createElement(common.DayCellRoot, { elRef: props.elRef, date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraHookProps: props.extraHookProps }, function (rootElRef, classNames, dataAttrs) { return common.createElement("td", tslib.__assign({ ref: rootElRef, role: "gridcell", className: ['fc-timegrid-col'].concat(classNames, props.extraClassNames || []).join(' ') }, dataAttrs, props.extraDataAttrs), common.createElement("div", { className: "fc-timegrid-col-frame" }, common.createElement("div", { className: "fc-timegrid-col-bg" }, _this.renderFillSegs(props.businessHourSegs, 'non-business'), _this.renderFillSegs(props.bgEventSegs, 'bg-event'), _this.renderFillSegs(props.dateSelectionSegs, 'highlight')), common.createElement("div", { className: "fc-timegrid-col-events" }, _this.renderFgSegs(sortedFgSegs, interactionAffectedInstances, false, false, false)), common.createElement("div", { className: "fc-timegrid-col-events" }, _this.renderFgSegs(mirrorSegs, {}, Boolean(props.eventDrag), Boolean(props.eventResize), Boolean(isSelectMirror))), common.createElement("div", { className: "fc-timegrid-now-indicator-container" }, _this.renderNowIndicator(props.nowIndicatorSegs)), common.createElement(TimeColMisc, { date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraHookProps: props.extraHookProps }))); }); }; TimeCol.prototype.renderFgSegs = function (sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting) { var props = this.props; if (props.forPrint) { return renderPlainFgSegs(sortedFgSegs, props); } return this.renderPositionedFgSegs(sortedFgSegs, segIsInvisible, isDragging, isResizing, isDateSelecting); }; TimeCol.prototype.renderPositionedFgSegs = function (segs, // if not mirror, needs to be sorted segIsInvisible, isDragging, isResizing, isDateSelecting) { var _this = this; var _a = this.context.options, eventMaxStack = _a.eventMaxStack, eventShortHeight = _a.eventShortHeight, eventOrderStrict = _a.eventOrderStrict, eventMinHeight = _a.eventMinHeight; var _b = this.props, date = _b.date, slatCoords = _b.slatCoords, eventSelection = _b.eventSelection, todayRange = _b.todayRange, nowDate = _b.nowDate; var isMirror = isDragging || isResizing || isDateSelecting; var segVCoords = computeSegVCoords(segs, date, slatCoords, eventMinHeight); var _c = computeFgSegPlacements(segs, segVCoords, eventOrderStrict, eventMaxStack), segPlacements = _c.segPlacements, hiddenGroups = _c.hiddenGroups; return common.createElement(common.Fragment, null, this.renderHiddenGroups(hiddenGroups, segs), segPlacements.map(function (segPlacement) { var seg = segPlacement.seg, rect = segPlacement.rect; var instanceId = seg.eventRange.instance.instanceId; var isVisible = isMirror || Boolean(!segIsInvisible[instanceId] && rect); var vStyle = computeSegVStyle(rect && rect.span); var hStyle = !isMirror && rect ? _this.computeSegHStyle(rect) : { left: 0, right: 0 }; var isInset = Boolean(rect) && rect.stackForward > 0; var isShort = Boolean(rect) && rect.span.end - rect.span.start < eventShortHeight; // look at other places for this problem return common.createElement("div", { className: 'fc-timegrid-event-harness' + (isInset ? ' fc-timegrid-event-harness-inset' : ''), key: instanceId, style: tslib.__assign(tslib.__assign({ visibility: isVisible ? '' : 'hidden' }, vStyle), hStyle) }, common.createElement(TimeColEvent, tslib.__assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === eventSelection, isShort: isShort }, common.getSegMeta(seg, todayRange, nowDate)))); })); }; // will already have eventMinHeight applied because segInputs already had it TimeCol.prototype.renderHiddenGroups = function (hiddenGroups, segs) { var _a = this.props, extraDateSpan = _a.extraDateSpan, dateProfile = _a.dateProfile, todayRange = _a.todayRange, nowDate = _a.nowDate, eventSelection = _a.eventSelection, eventDrag = _a.eventDrag, eventResize = _a.eventResize; return common.createElement(common.Fragment, null, hiddenGroups.map(function (hiddenGroup) { var positionCss = computeSegVStyle(hiddenGroup.span); var hiddenSegs = compileSegsFromEntries(hiddenGroup.entries, segs); return common.createElement(TimeColMoreLink, { key: common.buildIsoString(common.computeEarliestSegStart(hiddenSegs)), hiddenSegs: hiddenSegs, top: positionCss.top, bottom: positionCss.bottom, extraDateSpan: extraDateSpan, dateProfile: dateProfile, todayRange: todayRange, nowDate: nowDate, eventSelection: eventSelection, eventDrag: eventDrag, eventResize: eventResize }); })); }; TimeCol.prototype.renderFillSegs = function (segs, fillType) { var _a = this, props = _a.props, context = _a.context; var segVCoords = computeSegVCoords(segs, props.date, props.slatCoords, context.options.eventMinHeight); // don't assume all populated var children = segVCoords.map(function (vcoords, i) { var seg = segs[i]; return common.createElement("div", { key: common.buildEventRangeKey(seg.eventRange), className: "fc-timegrid-bg-harness", style: computeSegVStyle(vcoords) }, fillType === 'bg-event' ? common.createElement(common.BgEvent, tslib.__assign({ seg: seg }, common.getSegMeta(seg, props.todayRange, props.nowDate))) : common.renderFill(fillType)); }); return common.createElement(common.Fragment, null, children); }; TimeCol.prototype.renderNowIndicator = function (segs) { var _a = this.props, slatCoords = _a.slatCoords, date = _a.date; if (!slatCoords) { return null; } return segs.map(function (seg, i) { return common.createElement(common.NowIndicatorRoot, { isAxis: false, date: date, // key doesn't matter. will only ever be one key: i }, function (rootElRef, classNames, innerElRef, innerContent) { return common.createElement("div", { ref: rootElRef, className: ['fc-timegrid-now-indicator-line'].concat(classNames).join(' '), style: { top: slatCoords.computeDateTop(seg.start, date) } }, innerContent); }); }); }; TimeCol.prototype.computeSegHStyle = function (segHCoords) { var _a = this.context, isRtl = _a.isRtl, options = _a.options; var shouldOverlap = options.slotEventOverlap; var nearCoord = segHCoords.levelCoord; // the left side if LTR. the right side if RTL. floating-point var farCoord = segHCoords.levelCoord + segHCoords.thickness; // the right side if LTR. the left side if RTL. floating-point var left; // amount of space from left edge, a fraction of the total width var right; // amount of space from right edge, a fraction of the total width if (shouldOverlap) { // double the width, but don't go beyond the maximum forward coordinate (1.0) farCoord = Math.min(1, nearCoord + (farCoord - nearCoord) * 2); } if (isRtl) { left = 1 - farCoord; right = nearCoord; } else { left = nearCoord; right = 1 - farCoord; } var props = { zIndex: segHCoords.stackDepth + 1, left: left * 100 + '%', right: right * 100 + '%' }; if (shouldOverlap && !segHCoords.stackForward) { // add padding to the edge so that forward stacked events don't cover the resizer's icon props[isRtl ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width } return props; }; return TimeCol; }(common.BaseComponent); function renderPlainFgSegs(sortedFgSegs, _a) { var todayRange = _a.todayRange, nowDate = _a.nowDate, eventSelection = _a.eventSelection, eventDrag = _a.eventDrag, eventResize = _a.eventResize; var hiddenInstances = (eventDrag ? eventDrag.affectedInstances : null) || (eventResize ? eventResize.affectedInstances : null) || {}; return common.createElement(common.Fragment, null, sortedFgSegs.map(function (seg) { var instanceId = seg.eventRange.instance.instanceId; return common.createElement("div", { key: instanceId, style: { visibility: hiddenInstances[instanceId] ? 'hidden' : '' } }, common.createElement(TimeColEvent, tslib.__assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === eventSelection, isShort: false }, common.getSegMeta(seg, todayRange, nowDate)))); })); } function computeSegVStyle(segVCoords) { if (!segVCoords) { return { top: '', bottom: '' }; } return { top: segVCoords.start, bottom: -segVCoords.end }; } function compileSegsFromEntries(segEntries, allSegs) { return segEntries.map(function (segEntry) { return allSegs[segEntry.index]; }); } var TimeColsContent = /** @class */ function (_super) { tslib.__extends(TimeColsContent, _super); function TimeColsContent() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.splitFgEventSegs = common.memoize(splitSegsByCol); _this.splitBgEventSegs = common.memoize(splitSegsByCol); _this.splitBusinessHourSegs = common.memoize(splitSegsByCol); _this.splitNowIndicatorSegs = common.memoize(splitSegsByCol); _this.splitDateSelectionSegs = common.memoize(splitSegsByCol); _this.splitEventDrag = common.memoize(splitInteractionByCol); _this.splitEventResize = common.memoize(splitInteractionByCol); _this.rootElRef = common.createRef(); _this.cellElRefs = new common.RefMap(); return _this; } TimeColsContent.prototype.render = function () { var _this = this; var _a = this, props = _a.props, context = _a.context; var nowIndicatorTop = context.options.nowIndicator && props.slatCoords && props.slatCoords.safeComputeTop(props.nowDate); // might return void var colCnt = props.cells.length; var fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, colCnt); var bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, colCnt); var businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, colCnt); var nowIndicatorSegsByRow = this.splitNowIndicatorSegs(props.nowIndicatorSegs, colCnt); var dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, colCnt); var eventDragByRow = this.splitEventDrag(props.eventDrag, colCnt); var eventResizeByRow = this.splitEventResize(props.eventResize, colCnt); return common.createElement("div", { className: "fc-timegrid-cols", ref: this.rootElRef }, common.createElement("table", { role: "presentation", style: { minWidth: props.tableMinWidth, width: props.clientWidth } }, props.tableColGroupNode, common.createElement("tbody", { role: "presentation" }, common.createElement("tr", { role: "row" }, props.axis && common.createElement("td", { "aria-hidden": true, className: "fc-timegrid-col fc-timegrid-axis" }, common.createElement("div", { className: "fc-timegrid-col-frame" }, common.createElement("div", { className: "fc-timegrid-now-indicator-container" }, typeof nowIndicatorTop === 'number' && common.createElement(common.NowIndicatorRoot, { isAxis: true, date: props.nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return common.createElement("div", { ref: rootElRef, className: ['fc-timegrid-now-indicator-arrow'].concat(classNames).join(' '), style: { top: nowIndicatorTop } }, innerContent); })))), props.cells.map(function (cell, i) { return common.createElement(TimeCol, { key: cell.key, elRef: _this.cellElRefs.createRef(cell.key), dateProfile: props.dateProfile, date: cell.date, nowDate: props.nowDate, todayRange: props.todayRange, extraHookProps: cell.extraHookProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, fgEventSegs: fgEventSegsByRow[i], bgEventSegs: bgEventSegsByRow[i], businessHourSegs: businessHourSegsByRow[i], nowIndicatorSegs: nowIndicatorSegsByRow[i], dateSelectionSegs: dateSelectionSegsByRow[i], eventDrag: eventDragByRow[i], eventResize: eventResizeByRow[i], slatCoords: props.slatCoords, eventSelection: props.eventSelection, forPrint: props.forPrint }); }))))); }; TimeColsContent.prototype.componentDidMount = function () { this.updateCoords(); }; TimeColsContent.prototype.componentDidUpdate = function () { this.updateCoords(); }; TimeColsContent.prototype.updateCoords = function () { var props = this.props; if (props.onColCoords && props.clientWidth !== null // means sizing has stabilized ) { props.onColCoords(new common.PositionCache(this.rootElRef.current, collectCellEls(this.cellElRefs.currentMap, props.cells), true, // horizontal false)); } }; return TimeColsContent; }(common.BaseComponent); function collectCellEls(elMap, cells) { return cells.map(function (cell) { return elMap[cell.key]; }); } /* A component that renders one or more columns of vertical time slots ----------------------------------------------------------------------------------------------------------------------*/ var TimeCols = /** @class */ function (_super) { tslib.__extends(TimeCols, _super); function TimeCols() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.processSlotOptions = common.memoize(processSlotOptions); _this.state = { slatCoords: null }; _this.handleRootEl = function (el) { if (el) { _this.context.registerInteractiveComponent(_this, { el: el, isHitComboAllowed: _this.props.isHitComboAllowed }); } else { _this.context.unregisterInteractiveComponent(_this); } }; _this.handleScrollRequest = function (request) { var onScrollTopRequest = _this.props.onScrollTopRequest; var slatCoords = _this.state.slatCoords; if (onScrollTopRequest && slatCoords) { if (request.time) { var top_1 = slatCoords.computeTimeTop(request.time); top_1 = Math.ceil(top_1); // zoom can give weird floating-point values. rather scroll a little bit further if (top_1) { top_1 += 1; // to overcome top border that slots beyond the first have. looks better } onScrollTopRequest(top_1); } return true; } return false; }; _this.handleColCoords = function (colCoords) { _this.colCoords = colCoords; }; _this.handleSlatCoords = function (slatCoords) { _this.setState({ slatCoords: slatCoords }); if (_this.props.onSlatCoords) { _this.props.onSlatCoords(slatCoords); } }; return _this; } TimeCols.prototype.render = function () { var _a = this, props = _a.props, state = _a.state; return common.createElement("div", { className: "fc-timegrid-body", ref: this.handleRootEl, style: { // these props are important to give this wrapper correct dimensions for interactions // TODO: if we set it here, can we avoid giving to inner tables? width: props.clientWidth, minWidth: props.tableMinWidth } }, common.createElement(TimeColsSlats, { axis: props.axis, dateProfile: props.dateProfile, slatMetas: props.slatMetas, clientWidth: props.clientWidth, minHeight: props.expandRows ? props.clientHeight : '', tableMinWidth: props.tableMinWidth, tableColGroupNode: props.axis ? props.tableColGroupNode : null /* axis depends on the colgroup's shrinking */ , onCoords: this.handleSlatCoords }), common.createElement(TimeColsContent, { cells: props.cells, axis: props.axis, dateProfile: props.dateProfile, businessHourSegs: props.businessHourSegs, bgEventSegs: props.bgEventSegs, fgEventSegs: props.fgEventSegs, dateSelectionSegs: props.dateSelectionSegs, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange, nowDate: props.nowDate, nowIndicatorSegs: props.nowIndicatorSegs, clientWidth: props.clientWidth, tableMinWidth: props.tableMinWidth, tableColGroupNode: props.tableColGroupNode, slatCoords: state.slatCoords, onColCoords: this.handleColCoords, forPrint: props.forPrint })); }; TimeCols.prototype.componentDidMount = function () { this.scrollResponder = this.context.createScrollResponder(this.handleScrollRequest); }; TimeCols.prototype.componentDidUpdate = function (prevProps) { this.scrollResponder.update(prevProps.dateProfile !== this.props.dateProfile); }; TimeCols.prototype.componentWillUnmount = function () { this.scrollResponder.detach(); }; TimeCols.prototype.queryHit = function (positionLeft, positionTop) { var _a = this.context, dateEnv = _a.dateEnv, options = _a.options; var colCoords = this.colCoords; var dateProfile = this.props.dateProfile; var slatCoords = this.state.slatCoords; var _b = this.processSlotOptions(this.props.slotDuration, options.snapDuration), snapDuration = _b.snapDuration, snapsPerSlot = _b.snapsPerSlot; var colIndex = colCoords.leftToIndex(positionLeft); var slatIndex = slatCoords.positions.topToIndex(positionTop); if (colIndex != null && slatIndex != null) { var cell = this.props.cells[colIndex]; var slatTop = slatCoords.positions.tops[slatIndex]; var slatHeight = slatCoords.positions.getHeight(slatIndex); var partial = (positionTop - slatTop) / slatHeight; // floating point number between 0 and 1 var localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat var snapIndex = slatIndex * snapsPerSlot + localSnapIndex; var dayDate = this.props.cells[colIndex].date; var time = common.addDurations(dateProfile.slotMinTime, common.multiplyDuration(snapDuration, snapIndex)); var start = dateEnv.add(dayDate, time); var end = dateEnv.add(start, snapDuration); return { dateProfile: dateProfile, dateSpan: tslib.__assign({ range: { start: start, end: end }, allDay: false }, cell.extraDateSpan), dayEl: colCoords.els[colIndex], rect: { left: colCoords.lefts[colIndex], right: colCoords.rights[colIndex], top: slatTop, bottom: slatTop + slatHeight }, layer: 0 }; } return null; }; return TimeCols; }(common.DateComponent); function processSlotOptions(slotDuration, snapDurationOverride) { var snapDuration = snapDurationOverride || slotDuration; var snapsPerSlot = common.wholeDivideDurations(slotDuration, snapDuration); if (snapsPerSlot === null) { snapDuration = slotDuration; snapsPerSlot = 1; // TODO: say warning? } return { snapDuration: snapDuration, snapsPerSlot: snapsPerSlot }; } var DayTimeColsSlicer = /** @class */ function (_super) { tslib.__extends(DayTimeColsSlicer, _super); function DayTimeColsSlicer() { return _super !== null && _super.apply(this, arguments) || this; } DayTimeColsSlicer.prototype.sliceRange = function (range, dayRanges) { var segs = []; for (var col = 0; col < dayRanges.length; col += 1) { var segRange = common.intersectRanges(range, dayRanges[col]); if (segRange) { segs.push({ start: segRange.start, end: segRange.end, isStart: segRange.start.valueOf() === range.start.valueOf(), isEnd: segRange.end.valueOf() === range.end.valueOf(), col: col }); } } return segs; }; return DayTimeColsSlicer; }(common.Slicer); var DayTimeCols = /** @class */ function (_super) { tslib.__extends(DayTimeCols, _super); function DayTimeCols() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.buildDayRanges = common.memoize(buildDayRanges); _this.slicer = new DayTimeColsSlicer(); _this.timeColsRef = common.createRef(); return _this; } DayTimeCols.prototype.render = function () { var _this = this; var _a = this, props = _a.props, context = _a.context; var dateProfile = props.dateProfile, dayTableModel = props.dayTableModel; var isNowIndicator = context.options.nowIndicator; var dayRanges = this.buildDayRanges(dayTableModel, dateProfile, context.dateEnv); // give it the first row of cells // TODO: would move this further down hierarchy, but sliceNowDate needs it return common.createElement(common.NowTimer, { unit: isNowIndicator ? 'minute' : 'day' }, function (nowDate, todayRange) { return common.createElement(TimeCols, tslib.__assign({ ref: _this.timeColsRef }, _this.slicer.sliceProps(props, dateProfile, null, context, dayRanges), { forPrint: props.forPrint, axis: props.axis, dateProfile: dateProfile, slatMetas: props.slatMetas, slotDuration: props.slotDuration, cells: dayTableModel.cells[0], tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, clientWidth: props.clientWidth, clientHeight: props.clientHeight, expandRows: props.expandRows, nowDate: nowDate, nowIndicatorSegs: isNowIndicator && _this.slicer.sliceNowDate(nowDate, context, dayRanges), todayRange: todayRange, onScrollTopRequest: props.onScrollTopRequest, onSlatCoords: props.onSlatCoords })); }); }; return DayTimeCols; }(common.DateComponent); function buildDayRanges(dayTableModel, dateProfile, dateEnv) { var ranges = []; for (var _i = 0, _a = dayTableModel.headerDates; _i < _a.length; _i++) { var date = _a[_i]; ranges.push({ start: dateEnv.add(date, dateProfile.slotMinTime), end: dateEnv.add(date, dateProfile.slotMaxTime) }); } return ranges; } // potential nice values for the slot-duration and interval-duration // from largest to smallest var STOCK_SUB_DURATIONS = [{ hours: 1 }, { minutes: 30 }, { minutes: 15 }, { seconds: 30 }, { seconds: 15 }]; function buildSlatMetas(slotMinTime, slotMaxTime, explicitLabelInterval, slotDuration, dateEnv) { var dayStart = new Date(0); var slatTime = slotMinTime; var slatIterator = common.createDuration(0); var labelInterval = explicitLabelInterval || computeLabelInterval(slotDuration); var metas = []; while (common.asRoughMs(slatTime) < common.asRoughMs(slotMaxTime)) { var date = dateEnv.add(dayStart, slatTime); var isLabeled = common.wholeDivideDurations(slatIterator, labelInterval) !== null; metas.push({ date: date, time: slatTime, key: date.toISOString(), isoTimeStr: common.formatIsoTimeString(date), isLabeled: isLabeled }); slatTime = common.addDurations(slatTime, slotDuration); slatIterator = common.addDurations(slatIterator, slotDuration); } return metas; } // Computes an automatic value for slotLabelInterval function computeLabelInterval(slotDuration) { var i; var labelInterval; var slotsPerLabel; // find the smallest stock label interval that results in more than one slots-per-label for (i = STOCK_SUB_DURATIONS.length - 1; i >= 0; i -= 1) { labelInterval = common.createDuration(STOCK_SUB_DURATIONS[i]); slotsPerLabel = common.wholeDivideDurations(labelInterval, slotDuration); if (slotsPerLabel !== null && slotsPerLabel > 1) { return labelInterval; } } return slotDuration; // fall back } var DayTimeColsView = /** @class */ function (_super) { tslib.__extends(DayTimeColsView, _super); function DayTimeColsView() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.buildTimeColsModel = common.memoize(buildTimeColsModel); _this.buildSlatMetas = common.memoize(buildSlatMetas); return _this; } DayTimeColsView.prototype.render = function () { var _this = this; var _a = this.context, options = _a.options, dateEnv = _a.dateEnv, dateProfileGenerator = _a.dateProfileGenerator; var props = this.props; var dateProfile = props.dateProfile; var dayTableModel = this.buildTimeColsModel(dateProfile, dateProfileGenerator); var splitProps = this.allDaySplitter.splitProps(props); var slatMetas = this.buildSlatMetas(dateProfile.slotMinTime, dateProfile.slotMaxTime, options.slotLabelInterval, options.slotDuration, dateEnv); var dayMinWidth = options.dayMinWidth; var hasAttachedAxis = !dayMinWidth; var hasDetachedAxis = dayMinWidth; var headerContent = options.dayHeaders && common.createElement(common.DayHeader, { dates: dayTableModel.headerDates, dateProfile: dateProfile, datesRepDistinctDays: true, renderIntro: hasAttachedAxis ? this.renderHeadAxis : null }); var allDayContent = options.allDaySlot !== false && function (contentArg) { return common.createElement(daygrid.DayTable, tslib.__assign({}, splitProps.allDay, { dateProfile: dateProfile, dayTableModel: dayTableModel, nextDayThreshold: options.nextDayThreshold, tableMinWidth: contentArg.tableMinWidth, colGroupNode: contentArg.tableColGroupNode, renderRowIntro: hasAttachedAxis ? _this.renderTableRowAxis : null, showWeekNumbers: false, expandRows: false, headerAlignElRef: _this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint }, _this.getAllDayMaxEventProps())); }; var timeGridContent = function timeGridContent(contentArg) { return common.createElement(DayTimeCols, tslib.__assign({}, splitProps.timed, { dayTableModel: dayTableModel, dateProfile: dateProfile, axis: hasAttachedAxis, slotDuration: options.slotDuration, slatMetas: slatMetas, forPrint: props.forPrint, tableColGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, onSlatCoords: _this.handleSlatCoords, expandRows: contentArg.expandRows, onScrollTopRequest: _this.handleScrollTopRequest })); }; return hasDetachedAxis ? this.renderHScrollLayout(headerContent, allDayContent, timeGridContent, dayTableModel.colCnt, dayMinWidth, slatMetas, this.state.slatCoords) : this.renderSimpleLayout(headerContent, allDayContent, timeGridContent); }; return DayTimeColsView; }(TimeColsView); function buildTimeColsModel(dateProfile, dateProfileGenerator) { var daySeries = new common.DaySeriesModel(dateProfile.renderRange, dateProfileGenerator); return new common.DayTableModel(daySeries, false); } var OPTION_REFINERS = { allDaySlot: Boolean }; var main = common.createPlugin({ initialView: 'timeGridWeek', optionRefiners: OPTION_REFINERS, views: { timeGrid: { component: DayTimeColsView, usesMinMaxTime: true, allDaySlot: true, slotDuration: '00:30:00', slotEventOverlap: true // a bad name. confused with overlap/constraint system }, timeGridDay: { type: 'timeGrid', duration: { days: 1 } }, timeGridWeek: { type: 'timeGrid', duration: { weeks: 1 } } } }); exports.DayTimeCols = DayTimeCols; exports.DayTimeColsSlicer = DayTimeColsSlicer; exports.DayTimeColsView = DayTimeColsView; exports.TimeCols = TimeCols; exports.TimeColsSlatsCoords = TimeColsSlatsCoords; exports.TimeColsView = TimeColsView; exports.buildDayRanges = buildDayRanges; exports.buildSlatMetas = buildSlatMetas; exports.buildTimeColsModel = buildTimeColsModel; exports["default"] = main; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImNvbW1vbiIsInJlcXVpcmUiLCJ0c2xpYiIsImRheWdyaWQiLCJBbGxEYXlTcGxpdHRlciIsIl9zdXBlciIsIl9fZXh0ZW5kcyIsImFwcGx5IiwiYXJndW1lbnRzIiwicHJvdG90eXBlIiwiZ2V0S2V5SW5mbyIsImFsbERheSIsInRpbWVkIiwiZ2V0S2V5c0ZvckRhdGVTcGFuIiwiZGF0ZVNwYW4iLCJnZXRLZXlzRm9yRXZlbnREZWYiLCJldmVudERlZiIsImhhc0JnUmVuZGVyaW5nIiwiU3BsaXR0ZXIiLCJERUZBVUxUX1NMQVRfTEFCRUxfRk9STUFUIiwiY3JlYXRlRm9ybWF0dGVyIiwiaG91ciIsIm1pbnV0ZSIsIm9taXRaZXJvTWludXRlIiwibWVyaWRpZW0iLCJUaW1lQ29sc0F4aXNDZWxsIiwicHJvcHMiLCJjbGFzc05hbWVzIiwiaXNMYWJlbGVkIiwiY3JlYXRlRWxlbWVudCIsIlZpZXdDb250ZXh0VHlwZSIsIkNvbnN1bWVyIiwiY29udGV4dCIsImNsYXNzTmFtZSIsImpvaW4iLCJpc29UaW1lU3RyIiwiZGF0ZUVudiIsIm9wdGlvbnMiLCJ2aWV3QXBpIiwibGFiZWxGb3JtYXQiLCJzbG90TGFiZWxGb3JtYXQiLCJBcnJheSIsImlzQXJyYXkiLCJob29rUHJvcHMiLCJsZXZlbCIsInRpbWUiLCJkYXRlIiwidG9EYXRlIiwidmlldyIsInRleHQiLCJmb3JtYXQiLCJSZW5kZXJIb29rIiwic2xvdExhYmVsQ2xhc3NOYW1lcyIsImNvbnRlbnQiLCJzbG90TGFiZWxDb250ZW50IiwiZGVmYXVsdENvbnRlbnQiLCJyZW5kZXJJbm5lckNvbnRlbnQiLCJkaWRNb3VudCIsInNsb3RMYWJlbERpZE1vdW50Iiwid2lsbFVubW91bnQiLCJzbG90TGFiZWxXaWxsVW5tb3VudCIsInJvb3RFbFJlZiIsImN1c3RvbUNsYXNzTmFtZXMiLCJpbm5lckVsUmVmIiwiaW5uZXJDb250ZW50IiwicmVmIiwiY29uY2F0IiwiVGltZUJvZHlBeGlzIiwicmVuZGVyIiwic2xhdE1ldGFzIiwibWFwIiwic2xhdE1ldGEiLCJrZXkiLCJfX2Fzc2lnbiIsIkJhc2VDb21wb25lbnQiLCJERUZBVUxUX1dFRUtfTlVNX0ZPUk1BVCIsIndlZWsiLCJBVVRPX0FMTF9EQVlfTUFYX0VWRU5UX1JPV1MiLCJUaW1lQ29sc1ZpZXciLCJfdGhpcyIsImFsbERheVNwbGl0dGVyIiwiaGVhZGVyRWxSZWYiLCJjcmVhdGVSZWYiLCJzY3JvbGxlckVsUmVmIiwic3RhdGUiLCJzbGF0Q29vcmRzIiwiaGFuZGxlU2Nyb2xsVG9wUmVxdWVzdCIsInNjcm9sbFRvcCIsInNjcm9sbGVyRWwiLCJjdXJyZW50IiwicmVuZGVySGVhZEF4aXMiLCJyb3dLZXkiLCJmcmFtZUhlaWdodCIsImRhdGVQcm9maWxlIiwicmFuZ2UiLCJyZW5kZXJSYW5nZSIsImRheUNudCIsImRpZmZEYXlzIiwic3RhcnQiLCJlbmQiLCJuYXZMaW5rQXR0cnMiLCJidWlsZE5hdkxpbmtBdHRycyIsIndlZWtOdW1iZXJzIiwiV2Vla051bWJlclJvb3QiLCJkZWZhdWx0Rm9ybWF0Iiwic3R5bGUiLCJoZWlnaHQiLCJyZW5kZXJUYWJsZVJvd0F4aXMiLCJyb3dIZWlnaHQiLCJfYSIsImFsbERheVRleHQiLCJhbGxEYXlDbGFzc05hbWVzIiwiYWxsRGF5Q29udGVudCIsInJlbmRlckFsbERheUlubmVyIiwiYWxsRGF5RGlkTW91bnQiLCJhbGxEYXlXaWxsVW5tb3VudCIsImhhbmRsZVNsYXRDb29yZHMiLCJzZXRTdGF0ZSIsInJlbmRlclNpbXBsZUxheW91dCIsImhlYWRlclJvd0NvbnRlbnQiLCJ0aW1lQ29udGVudCIsInNlY3Rpb25zIiwic3RpY2t5SGVhZGVyRGF0ZXMiLCJnZXRTdGlja3lIZWFkZXJEYXRlcyIsInB1c2giLCJ0eXBlIiwiaXNTdGlja3kiLCJjaHVuayIsImVsUmVmIiwidGFibGVDbGFzc05hbWUiLCJyb3dDb250ZW50Iiwib3V0ZXJDb250ZW50Iiwicm9sZSIsInRoZW1lIiwiZ2V0Q2xhc3MiLCJsaXF1aWQiLCJleHBhbmRSb3dzIiwiQm9vbGVhbiIsIlZpZXdSb290Iiwidmlld1NwZWMiLCJTaW1wbGVTY3JvbGxHcmlkIiwiaXNIZWlnaHRBdXRvIiwiZm9yUHJpbnQiLCJjb2xsYXBzaWJsZVdpZHRoIiwiY29scyIsIndpZHRoIiwicmVuZGVySFNjcm9sbExheW91dCIsImNvbENudCIsImRheU1pbldpZHRoIiwiU2Nyb2xsR3JpZCIsInBsdWdpbkhvb2tzIiwic2Nyb2xsR3JpZEltcGwiLCJFcnJvciIsInN0aWNreUZvb3RlclNjcm9sbGJhciIsImdldFN0aWNreUZvb3RlclNjcm9sbGJhciIsInN5bmNSb3dIZWlnaHRzIiwiY2h1bmtzIiwiYXJnIiwicm93U3luY0hlaWdodHMiLCJjb250ZW50QXJnIiwiY29sU3BhbiIsImlzTm93SW5kaWNhdG9yIiwibm93SW5kaWNhdG9yIiwiY2xpZW50SGVpZ2h0IiwidGFibGVDb2xHcm91cE5vZGUiLCJOb3dUaW1lciIsInVuaXQiLCJub3dEYXRlIiwibm93SW5kaWNhdG9yVG9wIiwic2FmZUNvbXB1dGVUb3AiLCJOb3dJbmRpY2F0b3JSb290IiwiaXNBeGlzIiwidG9wIiwicmVuZGVyU2Nyb2xsU2hpbSIsImNvbEdyb3VwcyIsInNwYW4iLCJtaW5XaWR0aCIsImdldEFsbERheU1heEV2ZW50UHJvcHMiLCJkYXlNYXhFdmVudHMiLCJkYXlNYXhFdmVudFJvd3MiLCJ1bmRlZmluZWQiLCJEYXRlQ29tcG9uZW50IiwiVGltZUNvbHNTbGF0c0Nvb3JkcyIsInBvc2l0aW9ucyIsInNsb3REdXJhdGlvbiIsInJhbmdlQ29udGFpbnNNYXJrZXIiLCJjdXJyZW50UmFuZ2UiLCJzdGFydE9mRGF5RGF0ZSIsInN0YXJ0T2ZEYXkiLCJ0aW1lTXMiLCJ2YWx1ZU9mIiwiYXNSb3VnaE1zIiwic2xvdE1pblRpbWUiLCJzbG90TWF4VGltZSIsImNvbXB1dGVUaW1lVG9wIiwiY3JlYXRlRHVyYXRpb24iLCJjb21wdXRlRGF0ZVRvcCIsIndoZW4iLCJkdXJhdGlvbiIsImxlbiIsImVscyIsImxlbmd0aCIsInNsYXRDb3ZlcmFnZSIsIm1pbGxpc2Vjb25kcyIsInNsYXRJbmRleCIsInNsYXRSZW1haW5kZXIiLCJNYXRoIiwibWF4IiwibWluIiwiZmxvb3IiLCJ0b3BzIiwiZ2V0SGVpZ2h0IiwiVGltZUNvbHNTbGF0c0JvZHkiLCJzbGF0RWxSZWZzIiwiaSIsImF4aXMiLCJzbG90TGFuZUNsYXNzTmFtZXMiLCJzbG90TGFuZUNvbnRlbnQiLCJzbG90TGFuZURpZE1vdW50Iiwic2xvdExhbmVXaWxsVW5tb3VudCIsIlRpbWVDb2xzU2xhdHMiLCJSZWZNYXAiLCJ0YWJsZU1pbldpZHRoIiwiY2xpZW50V2lkdGgiLCJtaW5IZWlnaHQiLCJjb21wb25lbnREaWRNb3VudCIsInVwZGF0ZVNpemluZyIsImNvbXBvbmVudERpZFVwZGF0ZSIsImNvbXBvbmVudFdpbGxVbm1vdW50Iiwib25Db29yZHMiLCJyb290RWwiLCJvZmZzZXRIZWlnaHQiLCJQb3NpdGlvbkNhY2hlIiwiY29sbGVjdFNsYXRFbHMiLCJjdXJyZW50TWFwIiwiZWxNYXAiLCJzcGxpdFNlZ3NCeUNvbCIsInNlZ3MiLCJzZWdzQnlDb2wiLCJjb2wiLCJzcGxpdEludGVyYWN0aW9uQnlDb2wiLCJ1aSIsImJ5Um93IiwiYWZmZWN0ZWRJbnN0YW5jZXMiLCJpc0V2ZW50IiwiX2kiLCJzZWciLCJUaW1lQ29sTW9yZUxpbmsiLCJNb3JlTGlua1Jvb3QiLCJhbGxEYXlEYXRlIiwibW9yZUNudCIsImhpZGRlblNlZ3MiLCJhbGxTZWdzIiwiYWxpZ25tZW50RWxSZWYiLCJyZW5kZXJNb3JlTGlua0lubmVyIiwiZXh0cmFEYXRlU3BhbiIsInRvZGF5UmFuZ2UiLCJwb3BvdmVyQ29udGVudCIsInJlbmRlclBsYWluRmdTZWdzIiwiaGFuZGxlQ2xpY2siLCJ0aXRsZSIsImlzRXhwYW5kZWQiLCJwb3BvdmVySWQiLCJlbCIsInNldFJlZiIsImJvdHRvbSIsIm9uQ2xpY2siLCJzaG9ydFRleHQiLCJidWlsZFBvc2l0aW9uaW5nIiwic2VnSW5wdXRzIiwic3RyaWN0T3JkZXIiLCJtYXhTdGFja0NudCIsImhpZXJhcmNoeSIsIlNlZ0hpZXJhcmNoeSIsImhpZGRlbkVudHJpZXMiLCJhZGRTZWdzIiwiaGlkZGVuR3JvdXBzIiwiZ3JvdXBJbnRlcnNlY3RpbmdFbnRyaWVzIiwid2ViIiwiYnVpbGRXZWIiLCJzdHJldGNoV2ViIiwic2VnUmVjdHMiLCJ3ZWJUb1JlY3RzIiwiZW50cmllc0J5TGV2ZWwiLCJidWlsZE5vZGUiLCJjYWNoZWFibGUiLCJsYXRlcmFsIiwic2libGluZ1JhbmdlIiwiZmluZE5leHRMZXZlbFNlZ3MiLCJuZXh0TGV2ZWxSZXMiLCJidWlsZE5vZGVzIiwiZW50cnkiLCJuZXh0TGV2ZWxOb2RlcyIsInRoaWNrbmVzcyIsImxhdGVyYWxTdGFydCIsImxhdGVyYWxFbmQiLCJwYWlycyIsInNvcnQiLCJjbXBEZXNjUHJlc3N1cmVzIiwiZXh0cmFjdE5vZGUiLCJhIiwiYiIsInN1YmplY3RMZXZlbCIsInN1YmplY3RMYXRlcmFsIiwibGV2ZWxDb29yZHMiLCJzdWJqZWN0RW50cnkiLCJhZnRlclN1YmplY3QiLCJsZXZlbENudCIsImVudHJpZXMiLCJzZWFyY2hJbmRleCIsImJpbmFyeVNlYXJjaCIsImdldEVudHJ5U3BhbkVuZCIsInRvcExldmVsTm9kZXMiLCJ0b3RhbFRoaWNrbmVzcyIsInN0cmV0Y2hOb2RlIiwibm9kZSIsInN0YXJ0Q29vcmQiLCJwcmV2VGhpY2tuZXNzIiwiYnVpbGRFbnRyeUtleSIsImFsbFRoaWNrbmVzcyIsInRoaWNrbmVzc0ZyYWN0aW9uIiwiZW5kQ29vcmQiLCJuZXdDaGlsZHJlbiIsIm5leHRMZXZlbE5vZGVzXzEiLCJjaGlsZE5vZGUiLCJyZXMiLCJuZXdUaGlja25lc3MiLCJyZWN0cyIsInByb2Nlc3NOb2RlIiwibGV2ZWxDb29yZCIsInN0YWNrRGVwdGgiLCJyZWN0Iiwic3RhY2tGb3J3YXJkIiwicHJvY2Vzc05vZGVzIiwibm9kZXMiLCJub2Rlc18xIiwia2V5RnVuYyIsIndvcmtGdW5jIiwiY2FjaGUiLCJhcmdzIiwiY29tcHV0ZVNlZ1ZDb29yZHMiLCJjb2xEYXRlIiwiZXZlbnRNaW5IZWlnaHQiLCJ2Y29vcmRzIiwic3BhblN0YXJ0Iiwic3BhbkVuZCIsInJvdW5kIiwiY29tcHV0ZUZnU2VnUGxhY2VtZW50cyIsInNlZ1ZDb29yZHMiLCJldmVudE9yZGVyU3RyaWN0IiwiZXZlbnRNYXhTdGFjayIsImR1bWJTZWdzIiwiaW5kZXgiLCJzZWdQbGFjZW1lbnRzIiwic2VnUmVjdHNfMSIsInNlZ1JlY3QiLCJfYiIsImR1bWJTZWdzXzEiLCJkdW1iU2VnIiwiREVGQVVMVF9USU1FX0ZPUk1BVCIsIlRpbWVDb2xFdmVudCIsImlzU2hvcnQiLCJTdGFuZGFyZEV2ZW50IiwiZGVmYXVsdFRpbWVGb3JtYXQiLCJleHRyYUNsYXNzTmFtZXMiLCJUaW1lQ29sTWlzYyIsIkRheUNlbGxDb250ZW50IiwiZXh0cmFIb29rUHJvcHMiLCJUaW1lQ29sIiwic29ydEV2ZW50U2VncyIsIm1lbW9pemUiLCJpc1NlbGVjdE1pcnJvciIsInNlbGVjdE1pcnJvciIsIm1pcnJvclNlZ3MiLCJldmVudERyYWciLCJldmVudFJlc2l6ZSIsImRhdGVTZWxlY3Rpb25TZWdzIiwiaW50ZXJhY3Rpb25BZmZlY3RlZEluc3RhbmNlcyIsInNvcnRlZEZnU2VncyIsImZnRXZlbnRTZWdzIiwiZXZlbnRPcmRlciIsIkRheUNlbGxSb290IiwiZGF0YUF0dHJzIiwiZXh0cmFEYXRhQXR0cnMiLCJyZW5kZXJGaWxsU2VncyIsImJ1c2luZXNzSG91clNlZ3MiLCJiZ0V2ZW50U2VncyIsInJlbmRlckZnU2VncyIsInJlbmRlck5vd0luZGljYXRvciIsIm5vd0luZGljYXRvclNlZ3MiLCJzZWdJc0ludmlzaWJsZSIsImlzRHJhZ2dpbmciLCJpc1Jlc2l6aW5nIiwiaXNEYXRlU2VsZWN0aW5nIiwicmVuZGVyUG9zaXRpb25lZEZnU2VncyIsImV2ZW50U2hvcnRIZWlnaHQiLCJldmVudFNlbGVjdGlvbiIsImlzTWlycm9yIiwiX2MiLCJGcmFnbWVudCIsInJlbmRlckhpZGRlbkdyb3VwcyIsInNlZ1BsYWNlbWVudCIsImluc3RhbmNlSWQiLCJldmVudFJhbmdlIiwiaW5zdGFuY2UiLCJpc1Zpc2libGUiLCJ2U3R5bGUiLCJjb21wdXRlU2VnVlN0eWxlIiwiaFN0eWxlIiwiY29tcHV0ZVNlZ0hTdHlsZSIsImxlZnQiLCJyaWdodCIsImlzSW5zZXQiLCJ2aXNpYmlsaXR5IiwiaXNTZWxlY3RlZCIsImdldFNlZ01ldGEiLCJoaWRkZW5Hcm91cCIsInBvc2l0aW9uQ3NzIiwiY29tcGlsZVNlZ3NGcm9tRW50cmllcyIsImJ1aWxkSXNvU3RyaW5nIiwiY29tcHV0ZUVhcmxpZXN0U2VnU3RhcnQiLCJmaWxsVHlwZSIsImNoaWxkcmVuIiwiYnVpbGRFdmVudFJhbmdlS2V5IiwiQmdFdmVudCIsInJlbmRlckZpbGwiLCJzZWdIQ29vcmRzIiwiaXNSdGwiLCJzaG91bGRPdmVybGFwIiwic2xvdEV2ZW50T3ZlcmxhcCIsIm5lYXJDb29yZCIsImZhckNvb3JkIiwiekluZGV4IiwiaGlkZGVuSW5zdGFuY2VzIiwic2VnRW50cmllcyIsInNlZ0VudHJ5IiwiVGltZUNvbHNDb250ZW50Iiwic3BsaXRGZ0V2ZW50U2VncyIsInNwbGl0QmdFdmVudFNlZ3MiLCJzcGxpdEJ1c2luZXNzSG91clNlZ3MiLCJzcGxpdE5vd0luZGljYXRvclNlZ3MiLCJzcGxpdERhdGVTZWxlY3Rpb25TZWdzIiwic3BsaXRFdmVudERyYWciLCJzcGxpdEV2ZW50UmVzaXplIiwiY2VsbEVsUmVmcyIsImNlbGxzIiwiZmdFdmVudFNlZ3NCeVJvdyIsImJnRXZlbnRTZWdzQnlSb3ciLCJidXNpbmVzc0hvdXJTZWdzQnlSb3ciLCJub3dJbmRpY2F0b3JTZWdzQnlSb3ciLCJkYXRlU2VsZWN0aW9uU2Vnc0J5Um93IiwiZXZlbnREcmFnQnlSb3ciLCJldmVudFJlc2l6ZUJ5Um93IiwiY2VsbCIsInVwZGF0ZUNvb3JkcyIsIm9uQ29sQ29vcmRzIiwiY29sbGVjdENlbGxFbHMiLCJUaW1lQ29scyIsInByb2Nlc3NTbG90T3B0aW9ucyIsImhhbmRsZVJvb3RFbCIsInJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQiLCJpc0hpdENvbWJvQWxsb3dlZCIsInVucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCIsImhhbmRsZVNjcm9sbFJlcXVlc3QiLCJyZXF1ZXN0Iiwib25TY3JvbGxUb3BSZXF1ZXN0IiwidG9wXzEiLCJjZWlsIiwiaGFuZGxlQ29sQ29vcmRzIiwiY29sQ29vcmRzIiwib25TbGF0Q29vcmRzIiwic2Nyb2xsUmVzcG9uZGVyIiwiY3JlYXRlU2Nyb2xsUmVzcG9uZGVyIiwicHJldlByb3BzIiwidXBkYXRlIiwiZGV0YWNoIiwicXVlcnlIaXQiLCJwb3NpdGlvbkxlZnQiLCJwb3NpdGlvblRvcCIsInNuYXBEdXJhdGlvbiIsInNuYXBzUGVyU2xvdCIsImNvbEluZGV4IiwibGVmdFRvSW5kZXgiLCJ0b3BUb0luZGV4Iiwic2xhdFRvcCIsInNsYXRIZWlnaHQiLCJwYXJ0aWFsIiwibG9jYWxTbmFwSW5kZXgiLCJzbmFwSW5kZXgiLCJkYXlEYXRlIiwiYWRkRHVyYXRpb25zIiwibXVsdGlwbHlEdXJhdGlvbiIsImFkZCIsImRheUVsIiwibGVmdHMiLCJyaWdodHMiLCJsYXllciIsInNuYXBEdXJhdGlvbk92ZXJyaWRlIiwid2hvbGVEaXZpZGVEdXJhdGlvbnMiLCJEYXlUaW1lQ29sc1NsaWNlciIsInNsaWNlUmFuZ2UiLCJkYXlSYW5nZXMiLCJzZWdSYW5nZSIsImludGVyc2VjdFJhbmdlcyIsImlzU3RhcnQiLCJpc0VuZCIsIlNsaWNlciIsIkRheVRpbWVDb2xzIiwiYnVpbGREYXlSYW5nZXMiLCJzbGljZXIiLCJ0aW1lQ29sc1JlZiIsImRheVRhYmxlTW9kZWwiLCJzbGljZVByb3BzIiwic2xpY2VOb3dEYXRlIiwicmFuZ2VzIiwiaGVhZGVyRGF0ZXMiLCJTVE9DS19TVUJfRFVSQVRJT05TIiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyIsImJ1aWxkU2xhdE1ldGFzIiwiZXhwbGljaXRMYWJlbEludGVydmFsIiwiZGF5U3RhcnQiLCJEYXRlIiwic2xhdFRpbWUiLCJzbGF0SXRlcmF0b3IiLCJsYWJlbEludGVydmFsIiwiY29tcHV0ZUxhYmVsSW50ZXJ2YWwiLCJtZXRhcyIsInRvSVNPU3RyaW5nIiwiZm9ybWF0SXNvVGltZVN0cmluZyIsInNsb3RzUGVyTGFiZWwiLCJEYXlUaW1lQ29sc1ZpZXciLCJidWlsZFRpbWVDb2xzTW9kZWwiLCJkYXRlUHJvZmlsZUdlbmVyYXRvciIsInNwbGl0UHJvcHMiLCJzbG90TGFiZWxJbnRlcnZhbCIsImhhc0F0dGFjaGVkQXhpcyIsImhhc0RldGFjaGVkQXhpcyIsImhlYWRlckNvbnRlbnQiLCJkYXlIZWFkZXJzIiwiRGF5SGVhZGVyIiwiZGF0ZXMiLCJkYXRlc1JlcERpc3RpbmN0RGF5cyIsInJlbmRlckludHJvIiwiYWxsRGF5U2xvdCIsIkRheVRhYmxlIiwibmV4dERheVRocmVzaG9sZCIsImNvbEdyb3VwTm9kZSIsInJlbmRlclJvd0ludHJvIiwic2hvd1dlZWtOdW1iZXJzIiwiaGVhZGVyQWxpZ25FbFJlZiIsInRpbWVHcmlkQ29udGVudCIsImRheVNlcmllcyIsIkRheVNlcmllc01vZGVsIiwiRGF5VGFibGVNb2RlbCIsIk9QVElPTl9SRUZJTkVSUyIsIm1haW4iLCJjcmVhdGVQbHVnaW4iLCJpbml0aWFsVmlldyIsIm9wdGlvblJlZmluZXJzIiwidmlld3MiLCJ0aW1lR3JpZCIsImNvbXBvbmVudCIsInVzZXNNaW5NYXhUaW1lIiwidGltZUdyaWREYXkiLCJkYXlzIiwidGltZUdyaWRXZWVrIiwid2Vla3MiXSwic291cmNlcyI6WyJtYWluLmNqcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbkZ1bGxDYWxlbmRhciB2NS4xMS4yXG5Eb2NzICYgTGljZW5zZTogaHR0cHM6Ly9mdWxsY2FsZW5kYXIuaW8vXG4oYykgMjAyMiBBZGFtIFNoYXdcbiovXG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBjb21tb24gPSByZXF1aXJlKCdAZnVsbGNhbGVuZGFyL2NvbW1vbicpO1xudmFyIHRzbGliID0gcmVxdWlyZSgndHNsaWInKTtcbnZhciBkYXlncmlkID0gcmVxdWlyZSgnQGZ1bGxjYWxlbmRhci9kYXlncmlkJyk7XG47XG5cbnZhciBBbGxEYXlTcGxpdHRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoQWxsRGF5U3BsaXR0ZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQWxsRGF5U3BsaXR0ZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgQWxsRGF5U3BsaXR0ZXIucHJvdG90eXBlLmdldEtleUluZm8gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGxEYXk6IHt9LFxuICAgICAgICAgICAgdGltZWQ6IHt9LFxuICAgICAgICB9O1xuICAgIH07XG4gICAgQWxsRGF5U3BsaXR0ZXIucHJvdG90eXBlLmdldEtleXNGb3JEYXRlU3BhbiA9IGZ1bmN0aW9uIChkYXRlU3Bhbikge1xuICAgICAgICBpZiAoZGF0ZVNwYW4uYWxsRGF5KSB7XG4gICAgICAgICAgICByZXR1cm4gWydhbGxEYXknXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gWyd0aW1lZCddO1xuICAgIH07XG4gICAgQWxsRGF5U3BsaXR0ZXIucHJvdG90eXBlLmdldEtleXNGb3JFdmVudERlZiA9IGZ1bmN0aW9uIChldmVudERlZikge1xuICAgICAgICBpZiAoIWV2ZW50RGVmLmFsbERheSkge1xuICAgICAgICAgICAgcmV0dXJuIFsndGltZWQnXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbW9uLmhhc0JnUmVuZGVyaW5nKGV2ZW50RGVmKSkge1xuICAgICAgICAgICAgcmV0dXJuIFsndGltZWQnLCAnYWxsRGF5J107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFsnYWxsRGF5J107XG4gICAgfTtcbiAgICByZXR1cm4gQWxsRGF5U3BsaXR0ZXI7XG59KGNvbW1vbi5TcGxpdHRlcikpO1xuXG52YXIgREVGQVVMVF9TTEFUX0xBQkVMX0ZPUk1BVCA9IGNvbW1vbi5jcmVhdGVGb3JtYXR0ZXIoe1xuICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICBvbWl0WmVyb01pbnV0ZTogdHJ1ZSxcbiAgICBtZXJpZGllbTogJ3Nob3J0Jyxcbn0pO1xuZnVuY3Rpb24gVGltZUNvbHNBeGlzQ2VsbChwcm9wcykge1xuICAgIHZhciBjbGFzc05hbWVzID0gW1xuICAgICAgICAnZmMtdGltZWdyaWQtc2xvdCcsXG4gICAgICAgICdmYy10aW1lZ3JpZC1zbG90LWxhYmVsJyxcbiAgICAgICAgcHJvcHMuaXNMYWJlbGVkID8gJ2ZjLXNjcm9sbGdyaWQtc2hyaW5rJyA6ICdmYy10aW1lZ3JpZC1zbG90LW1pbm9yJyxcbiAgICBdO1xuICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLlZpZXdDb250ZXh0VHlwZS5Db25zdW1lciwgbnVsbCwgZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCFwcm9wcy5pc0xhYmVsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKCcgJyksIFwiZGF0YS10aW1lXCI6IHByb3BzLmlzb1RpbWVTdHIgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXRlRW52ID0gY29udGV4dC5kYXRlRW52LCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zLCB2aWV3QXBpID0gY29udGV4dC52aWV3QXBpO1xuICAgICAgICB2YXIgbGFiZWxGb3JtYXQgPSAvLyBUT0RPOiBmdWxseSBwcmUtcGFyc2VcbiAgICAgICAgIG9wdGlvbnMuc2xvdExhYmVsRm9ybWF0ID09IG51bGwgPyBERUZBVUxUX1NMQVRfTEFCRUxfRk9STUFUIDpcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkob3B0aW9ucy5zbG90TGFiZWxGb3JtYXQpID8gY29tbW9uLmNyZWF0ZUZvcm1hdHRlcihvcHRpb25zLnNsb3RMYWJlbEZvcm1hdFswXSkgOlxuICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVGb3JtYXR0ZXIob3B0aW9ucy5zbG90TGFiZWxGb3JtYXQpO1xuICAgICAgICB2YXIgaG9va1Byb3BzID0ge1xuICAgICAgICAgICAgbGV2ZWw6IDAsXG4gICAgICAgICAgICB0aW1lOiBwcm9wcy50aW1lLFxuICAgICAgICAgICAgZGF0ZTogZGF0ZUVudi50b0RhdGUocHJvcHMuZGF0ZSksXG4gICAgICAgICAgICB2aWV3OiB2aWV3QXBpLFxuICAgICAgICAgICAgdGV4dDogZGF0ZUVudi5mb3JtYXQocHJvcHMuZGF0ZSwgbGFiZWxGb3JtYXQpLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5SZW5kZXJIb29rLCB7IGhvb2tQcm9wczogaG9va1Byb3BzLCBjbGFzc05hbWVzOiBvcHRpb25zLnNsb3RMYWJlbENsYXNzTmFtZXMsIGNvbnRlbnQ6IG9wdGlvbnMuc2xvdExhYmVsQ29udGVudCwgZGVmYXVsdENvbnRlbnQ6IHJlbmRlcklubmVyQ29udGVudCwgZGlkTW91bnQ6IG9wdGlvbnMuc2xvdExhYmVsRGlkTW91bnQsIHdpbGxVbm1vdW50OiBvcHRpb25zLnNsb3RMYWJlbFdpbGxVbm1vdW50IH0sIGZ1bmN0aW9uIChyb290RWxSZWYsIGN1c3RvbUNsYXNzTmFtZXMsIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGRcIiwgeyByZWY6IHJvb3RFbFJlZiwgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmNvbmNhdChjdXN0b21DbGFzc05hbWVzKS5qb2luKCcgJyksIFwiZGF0YS10aW1lXCI6IHByb3BzLmlzb1RpbWVTdHIgfSxcbiAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLXRpbWVncmlkLXNsb3QtbGFiZWwtZnJhbWUgZmMtc2Nyb2xsZ3JpZC1zaHJpbmstZnJhbWVcIiB9LFxuICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLXRpbWVncmlkLXNsb3QtbGFiZWwtY3VzaGlvbiBmYy1zY3JvbGxncmlkLXNocmluay1jdXNoaW9uXCIsIHJlZjogaW5uZXJFbFJlZiB9LCBpbm5lckNvbnRlbnQpKSkpOyB9KSk7XG4gICAgfSkpO1xufVxuZnVuY3Rpb24gcmVuZGVySW5uZXJDb250ZW50KHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLnRleHQ7XG59XG5cbnZhciBUaW1lQm9keUF4aXMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFRpbWVCb2R5QXhpcywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUaW1lQm9keUF4aXMoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgVGltZUJvZHlBeGlzLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLnNsYXRNZXRhcy5tYXAoZnVuY3Rpb24gKHNsYXRNZXRhKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCB7IGtleTogc2xhdE1ldGEua2V5IH0sXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChUaW1lQ29sc0F4aXNDZWxsLCB0c2xpYi5fX2Fzc2lnbih7fSwgc2xhdE1ldGEpKSkpOyB9KTtcbiAgICB9O1xuICAgIHJldHVybiBUaW1lQm9keUF4aXM7XG59KGNvbW1vbi5CYXNlQ29tcG9uZW50KSk7XG5cbnZhciBERUZBVUxUX1dFRUtfTlVNX0ZPUk1BVCA9IGNvbW1vbi5jcmVhdGVGb3JtYXR0ZXIoeyB3ZWVrOiAnc2hvcnQnIH0pO1xudmFyIEFVVE9fQUxMX0RBWV9NQVhfRVZFTlRfUk9XUyA9IDU7XG52YXIgVGltZUNvbHNWaWV3ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhUaW1lQ29sc1ZpZXcsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGltZUNvbHNWaWV3KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuYWxsRGF5U3BsaXR0ZXIgPSBuZXcgQWxsRGF5U3BsaXR0ZXIoKTsgLy8gZm9yIHVzZSBieSBzdWJjbGFzc2VzXG4gICAgICAgIF90aGlzLmhlYWRlckVsUmVmID0gY29tbW9uLmNyZWF0ZVJlZigpO1xuICAgICAgICBfdGhpcy5yb290RWxSZWYgPSBjb21tb24uY3JlYXRlUmVmKCk7XG4gICAgICAgIF90aGlzLnNjcm9sbGVyRWxSZWYgPSBjb21tb24uY3JlYXRlUmVmKCk7XG4gICAgICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgc2xhdENvb3JkczogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlU2Nyb2xsVG9wUmVxdWVzdCA9IGZ1bmN0aW9uIChzY3JvbGxUb3ApIHtcbiAgICAgICAgICAgIHZhciBzY3JvbGxlckVsID0gX3RoaXMuc2Nyb2xsZXJFbFJlZi5jdXJyZW50O1xuICAgICAgICAgICAgaWYgKHNjcm9sbGVyRWwpIHsgLy8gVE9ETzogbm90IHN1cmUgaG93IHRoaXMgY291bGQgZXZlciBiZSBudWxsLiB3ZWlyZG5lc3Mgd2l0aCB0aGUgcmVkdWNlclxuICAgICAgICAgICAgICAgIHNjcm9sbGVyRWwuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKiBIZWFkZXIgUmVuZGVyIE1ldGhvZHNcbiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbiAgICAgICAgX3RoaXMucmVuZGVySGVhZEF4aXMgPSBmdW5jdGlvbiAocm93S2V5LCBmcmFtZUhlaWdodCkge1xuICAgICAgICAgICAgaWYgKGZyYW1lSGVpZ2h0ID09PSB2b2lkIDApIHsgZnJhbWVIZWlnaHQgPSAnJzsgfVxuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBfdGhpcy5jb250ZXh0Lm9wdGlvbnM7XG4gICAgICAgICAgICB2YXIgZGF0ZVByb2ZpbGUgPSBfdGhpcy5wcm9wcy5kYXRlUHJvZmlsZTtcbiAgICAgICAgICAgIHZhciByYW5nZSA9IGRhdGVQcm9maWxlLnJlbmRlclJhbmdlO1xuICAgICAgICAgICAgdmFyIGRheUNudCA9IGNvbW1vbi5kaWZmRGF5cyhyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIHZhciBuYXZMaW5rQXR0cnMgPSAoZGF5Q250ID09PSAxKSAvLyBvbmx5IGRvIGluIGRheSB2aWV3cyAodG8gYXZvaWQgZG9pbmcgaW4gd2VlayB2aWV3cyB0aGF0IGRvbnQgbmVlZCBpdClcbiAgICAgICAgICAgICAgICA/IGNvbW1vbi5idWlsZE5hdkxpbmtBdHRycyhfdGhpcy5jb250ZXh0LCByYW5nZS5zdGFydCwgJ3dlZWsnKVxuICAgICAgICAgICAgICAgIDoge307XG4gICAgICAgICAgICBpZiAob3B0aW9ucy53ZWVrTnVtYmVycyAmJiByb3dLZXkgPT09ICdkYXknKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uV2Vla051bWJlclJvb3QsIHsgZGF0ZTogcmFuZ2Uuc3RhcnQsIGRlZmF1bHRGb3JtYXQ6IERFRkFVTFRfV0VFS19OVU1fRk9STUFUIH0sIGZ1bmN0aW9uIChyb290RWxSZWYsIGNsYXNzTmFtZXMsIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGhcIiwgeyByZWY6IHJvb3RFbFJlZiwgXCJhcmlhLWhpZGRlblwiOiB0cnVlLCBjbGFzc05hbWU6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdmYy10aW1lZ3JpZC1heGlzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdmYy1zY3JvbGxncmlkLXNocmluaycsXG4gICAgICAgICAgICAgICAgICAgIF0uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSB9LFxuICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy10aW1lZ3JpZC1heGlzLWZyYW1lIGZjLXNjcm9sbGdyaWQtc2hyaW5rLWZyYW1lIGZjLXRpbWVncmlkLWF4aXMtZnJhbWUtbGlxdWlkXCIsIHN0eWxlOiB7IGhlaWdodDogZnJhbWVIZWlnaHQgfSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHRzbGliLl9fYXNzaWduKHsgcmVmOiBpbm5lckVsUmVmLCBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtYXhpcy1jdXNoaW9uIGZjLXNjcm9sbGdyaWQtc2hyaW5rLWN1c2hpb24gZmMtc2Nyb2xsZ3JpZC1zeW5jLWlubmVyXCIgfSwgbmF2TGlua0F0dHJzKSwgaW5uZXJDb250ZW50KSkpKTsgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcInRoXCIsIHsgXCJhcmlhLWhpZGRlblwiOiB0cnVlLCBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtYXhpc1wiIH0sXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtYXhpcy1mcmFtZVwiLCBzdHlsZTogeyBoZWlnaHQ6IGZyYW1lSGVpZ2h0IH0gfSkpKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyogVGFibGUgQ29tcG9uZW50IFJlbmRlciBNZXRob2RzXG4gICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4gICAgICAgIC8vIG9ubHkgYSBvbmUtd2F5IGhlaWdodCBzeW5jLiB3ZSBkb24ndCBzZW5kIHRoZSBheGlzIGlubmVyLWNvbnRlbnQgaGVpZ2h0IHRvIHRoZSBEYXlHcmlkLFxuICAgICAgICAvLyBidXQgRGF5R3JpZCBzdGlsbCBuZWVkcyB0byBoYXZlIGNsYXNzTmFtZXMgb24gaW5uZXIgZWxlbWVudHMgaW4gb3JkZXIgdG8gbWVhc3VyZS5cbiAgICAgICAgX3RoaXMucmVuZGVyVGFibGVSb3dBeGlzID0gZnVuY3Rpb24gKHJvd0hlaWdodCkge1xuICAgICAgICAgICAgdmFyIF9hID0gX3RoaXMuY29udGV4dCwgb3B0aW9ucyA9IF9hLm9wdGlvbnMsIHZpZXdBcGkgPSBfYS52aWV3QXBpO1xuICAgICAgICAgICAgdmFyIGhvb2tQcm9wcyA9IHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBvcHRpb25zLmFsbERheVRleHQsXG4gICAgICAgICAgICAgICAgdmlldzogdmlld0FwaSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgLy8gVE9ETzogbWFrZSByZXVzYWJsZSBob29rLiB1c2VkIGluIGxpc3QgdmlldyB0b29cbiAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5SZW5kZXJIb29rLCB7IGhvb2tQcm9wczogaG9va1Byb3BzLCBjbGFzc05hbWVzOiBvcHRpb25zLmFsbERheUNsYXNzTmFtZXMsIGNvbnRlbnQ6IG9wdGlvbnMuYWxsRGF5Q29udGVudCwgZGVmYXVsdENvbnRlbnQ6IHJlbmRlckFsbERheUlubmVyLCBkaWRNb3VudDogb3B0aW9ucy5hbGxEYXlEaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMuYWxsRGF5V2lsbFVubW91bnQgfSwgZnVuY3Rpb24gKHJvb3RFbFJlZiwgY2xhc3NOYW1lcywgaW5uZXJFbFJlZiwgaW5uZXJDb250ZW50KSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCB7IHJlZjogcm9vdEVsUmVmLCBcImFyaWEtaGlkZGVuXCI6IHRydWUsIGNsYXNzTmFtZTogW1xuICAgICAgICAgICAgICAgICAgICAnZmMtdGltZWdyaWQtYXhpcycsXG4gICAgICAgICAgICAgICAgICAgICdmYy1zY3JvbGxncmlkLXNocmluaycsXG4gICAgICAgICAgICAgICAgXS5jb25jYXQoY2xhc3NOYW1lcykuam9pbignICcpIH0sXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6ICdmYy10aW1lZ3JpZC1heGlzLWZyYW1lIGZjLXNjcm9sbGdyaWQtc2hyaW5rLWZyYW1lJyArIChyb3dIZWlnaHQgPT0gbnVsbCA/ICcgZmMtdGltZWdyaWQtYXhpcy1mcmFtZS1saXF1aWQnIDogJycpLCBzdHlsZTogeyBoZWlnaHQ6IHJvd0hlaWdodCB9IH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogXCJmYy10aW1lZ3JpZC1heGlzLWN1c2hpb24gZmMtc2Nyb2xsZ3JpZC1zaHJpbmstY3VzaGlvbiBmYy1zY3JvbGxncmlkLXN5bmMtaW5uZXJcIiwgcmVmOiBpbm5lckVsUmVmIH0sIGlubmVyQ29udGVudCkpKSk7IH0pKTtcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlU2xhdENvb3JkcyA9IGZ1bmN0aW9uIChzbGF0Q29vcmRzKSB7XG4gICAgICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7IHNsYXRDb29yZHM6IHNsYXRDb29yZHMgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLy8gcmVuZGVyaW5nXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFRpbWVDb2xzVmlldy5wcm90b3R5cGUucmVuZGVyU2ltcGxlTGF5b3V0ID0gZnVuY3Rpb24gKGhlYWRlclJvd0NvbnRlbnQsIGFsbERheUNvbnRlbnQsIHRpbWVDb250ZW50KSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIGNvbnRleHQgPSBfYS5jb250ZXh0LCBwcm9wcyA9IF9hLnByb3BzO1xuICAgICAgICB2YXIgc2VjdGlvbnMgPSBbXTtcbiAgICAgICAgdmFyIHN0aWNreUhlYWRlckRhdGVzID0gY29tbW9uLmdldFN0aWNreUhlYWRlckRhdGVzKGNvbnRleHQub3B0aW9ucyk7XG4gICAgICAgIGlmIChoZWFkZXJSb3dDb250ZW50KSB7XG4gICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnaGVhZGVyJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdoZWFkZXInLFxuICAgICAgICAgICAgICAgIGlzU3RpY2t5OiBzdGlja3lIZWFkZXJEYXRlcyxcbiAgICAgICAgICAgICAgICBjaHVuazoge1xuICAgICAgICAgICAgICAgICAgICBlbFJlZjogdGhpcy5oZWFkZXJFbFJlZixcbiAgICAgICAgICAgICAgICAgICAgdGFibGVDbGFzc05hbWU6ICdmYy1jb2wtaGVhZGVyJyxcbiAgICAgICAgICAgICAgICAgICAgcm93Q29udGVudDogaGVhZGVyUm93Q29udGVudCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbERheUNvbnRlbnQpIHtcbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdib2R5JyxcbiAgICAgICAgICAgICAgICBrZXk6ICdhbGwtZGF5JyxcbiAgICAgICAgICAgICAgICBjaHVuazogeyBjb250ZW50OiBhbGxEYXlDb250ZW50IH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdib2R5JyxcbiAgICAgICAgICAgICAgICBrZXk6ICdhbGwtZGF5LWRpdmlkZXInLFxuICAgICAgICAgICAgICAgIG91dGVyQ29udGVudDogKCAvLyBUT0RPOiByZW5hbWUgdG8gY2VsbENvbnRlbnQgc28gZG9uJ3QgbmVlZCB0byBkZWZpbmUgPHRyPj9cbiAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRyXCIsIHsgcm9sZTogXCJwcmVzZW50YXRpb25cIiwgY2xhc3NOYW1lOiBcImZjLXNjcm9sbGdyaWQtc2VjdGlvblwiIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGRcIiwgeyBjbGFzc05hbWU6ICdmYy10aW1lZ3JpZC1kaXZpZGVyICcgKyBjb250ZXh0LnRoZW1lLmdldENsYXNzKCd0YWJsZUNlbGxTaGFkZWQnKSB9KSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnYm9keScsXG4gICAgICAgICAgICBrZXk6ICdib2R5JyxcbiAgICAgICAgICAgIGxpcXVpZDogdHJ1ZSxcbiAgICAgICAgICAgIGV4cGFuZFJvd3M6IEJvb2xlYW4oY29udGV4dC5vcHRpb25zLmV4cGFuZFJvd3MpLFxuICAgICAgICAgICAgY2h1bms6IHtcbiAgICAgICAgICAgICAgICBzY3JvbGxlckVsUmVmOiB0aGlzLnNjcm9sbGVyRWxSZWYsXG4gICAgICAgICAgICAgICAgY29udGVudDogdGltZUNvbnRlbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uVmlld1Jvb3QsIHsgdmlld1NwZWM6IGNvbnRleHQudmlld1NwZWMsIGVsUmVmOiB0aGlzLnJvb3RFbFJlZiB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFsnZmMtdGltZWdyaWQnXS5jb25jYXQoY2xhc3NOYW1lcykuam9pbignICcpLCByZWY6IHJvb3RFbFJlZiB9LFxuICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLlNpbXBsZVNjcm9sbEdyaWQsIHsgbGlxdWlkOiAhcHJvcHMuaXNIZWlnaHRBdXRvICYmICFwcm9wcy5mb3JQcmludCwgY29sbGFwc2libGVXaWR0aDogcHJvcHMuZm9yUHJpbnQsIGNvbHM6IFt7IHdpZHRoOiAnc2hyaW5rJyB9XSwgc2VjdGlvbnM6IHNlY3Rpb25zIH0pKSk7IH0pKTtcbiAgICB9O1xuICAgIFRpbWVDb2xzVmlldy5wcm90b3R5cGUucmVuZGVySFNjcm9sbExheW91dCA9IGZ1bmN0aW9uIChoZWFkZXJSb3dDb250ZW50LCBhbGxEYXlDb250ZW50LCB0aW1lQ29udGVudCwgY29sQ250LCBkYXlNaW5XaWR0aCwgc2xhdE1ldGFzLCBzbGF0Q29vcmRzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBTY3JvbGxHcmlkID0gdGhpcy5jb250ZXh0LnBsdWdpbkhvb2tzLnNjcm9sbEdyaWRJbXBsO1xuICAgICAgICBpZiAoIVNjcm9sbEdyaWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gU2Nyb2xsR3JpZCBpbXBsZW1lbnRhdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIGNvbnRleHQgPSBfYS5jb250ZXh0LCBwcm9wcyA9IF9hLnByb3BzO1xuICAgICAgICB2YXIgc3RpY2t5SGVhZGVyRGF0ZXMgPSAhcHJvcHMuZm9yUHJpbnQgJiYgY29tbW9uLmdldFN0aWNreUhlYWRlckRhdGVzKGNvbnRleHQub3B0aW9ucyk7XG4gICAgICAgIHZhciBzdGlja3lGb290ZXJTY3JvbGxiYXIgPSAhcHJvcHMuZm9yUHJpbnQgJiYgY29tbW9uLmdldFN0aWNreUZvb3RlclNjcm9sbGJhcihjb250ZXh0Lm9wdGlvbnMpO1xuICAgICAgICB2YXIgc2VjdGlvbnMgPSBbXTtcbiAgICAgICAgaWYgKGhlYWRlclJvd0NvbnRlbnQpIHtcbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdoZWFkZXInLFxuICAgICAgICAgICAgICAgIGtleTogJ2hlYWRlcicsXG4gICAgICAgICAgICAgICAgaXNTdGlja3k6IHN0aWNreUhlYWRlckRhdGVzLFxuICAgICAgICAgICAgICAgIHN5bmNSb3dIZWlnaHRzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNodW5rczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdheGlzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0NvbnRlbnQ6IGZ1bmN0aW9uIChhcmcpIHsgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcInRyXCIsIHsgcm9sZTogXCJwcmVzZW50YXRpb25cIiB9LCBfdGhpcy5yZW5kZXJIZWFkQXhpcygnZGF5JywgYXJnLnJvd1N5bmNIZWlnaHRzWzBdKSkpOyB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdjb2xzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsUmVmOiB0aGlzLmhlYWRlckVsUmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDbGFzc05hbWU6ICdmYy1jb2wtaGVhZGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0NvbnRlbnQ6IGhlYWRlclJvd0NvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbGxEYXlDb250ZW50KSB7XG4gICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYm9keScsXG4gICAgICAgICAgICAgICAga2V5OiAnYWxsLWRheScsXG4gICAgICAgICAgICAgICAgc3luY1Jvd0hlaWdodHM6IHRydWUsXG4gICAgICAgICAgICAgICAgY2h1bmtzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2F4aXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93Q29udGVudDogZnVuY3Rpb24gKGNvbnRlbnRBcmcpIHsgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcInRyXCIsIHsgcm9sZTogXCJwcmVzZW50YXRpb25cIiB9LCBfdGhpcy5yZW5kZXJUYWJsZVJvd0F4aXMoY29udGVudEFyZy5yb3dTeW5jSGVpZ2h0c1swXSkpKTsgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnY29scycsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBhbGxEYXlDb250ZW50LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogJ2FsbC1kYXktZGl2aWRlcicsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2JvZHknLFxuICAgICAgICAgICAgICAgIG91dGVyQ29udGVudDogKCAvLyBUT0RPOiByZW5hbWUgdG8gY2VsbENvbnRlbnQgc28gZG9uJ3QgbmVlZCB0byBkZWZpbmUgPHRyPj9cbiAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRyXCIsIHsgcm9sZTogXCJwcmVzZW50YXRpb25cIiwgY2xhc3NOYW1lOiBcImZjLXNjcm9sbGdyaWQtc2VjdGlvblwiIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGRcIiwgeyBjb2xTcGFuOiAyLCBjbGFzc05hbWU6ICdmYy10aW1lZ3JpZC1kaXZpZGVyICcgKyBjb250ZXh0LnRoZW1lLmdldENsYXNzKCd0YWJsZUNlbGxTaGFkZWQnKSB9KSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlzTm93SW5kaWNhdG9yID0gY29udGV4dC5vcHRpb25zLm5vd0luZGljYXRvcjtcbiAgICAgICAgc2VjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnYm9keScsXG4gICAgICAgICAgICBrZXk6ICdib2R5JyxcbiAgICAgICAgICAgIGxpcXVpZDogdHJ1ZSxcbiAgICAgICAgICAgIGV4cGFuZFJvd3M6IEJvb2xlYW4oY29udGV4dC5vcHRpb25zLmV4cGFuZFJvd3MpLFxuICAgICAgICAgICAgY2h1bmtzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBrZXk6ICdheGlzJyxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHRoaXMgbm93LWluZGljYXRvciBhcnJvdyBtb3JlIERSWSB3aXRoIFRpbWVDb2xzQ29udGVudFxuICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy10aW1lZ3JpZC1heGlzLWNodW5rXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGFibGVcIiwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUsIHN0eWxlOiB7IGhlaWdodDogYXJnLmV4cGFuZFJvd3MgPyBhcmcuY2xpZW50SGVpZ2h0IDogJycgfSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZy50YWJsZUNvbEdyb3VwTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRib2R5XCIsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFRpbWVCb2R5QXhpcywgeyBzbGF0TWV0YXM6IHNsYXRNZXRhcyB9KSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtbm93LWluZGljYXRvci1jb250YWluZXJcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5Ob3dUaW1lciwgeyB1bml0OiBpc05vd0luZGljYXRvciA/ICdtaW51dGUnIDogJ2RheScgLyogaGFja3kgKi8gfSwgZnVuY3Rpb24gKG5vd0RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vd0luZGljYXRvclRvcCA9IGlzTm93SW5kaWNhdG9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGF0Q29vcmRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGF0Q29vcmRzLnNhZmVDb21wdXRlVG9wKG5vd0RhdGUpOyAvLyBtaWdodCByZXR1cm4gdm9pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5vd0luZGljYXRvclRvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLk5vd0luZGljYXRvclJvb3QsIHsgaXNBeGlzOiB0cnVlLCBkYXRlOiBub3dEYXRlIH0sIGZ1bmN0aW9uIChyb290RWxSZWYsIGNsYXNzTmFtZXMsIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgcmVmOiByb290RWxSZWYsIGNsYXNzTmFtZTogWydmYy10aW1lZ3JpZC1ub3ctaW5kaWNhdG9yLWFycm93J10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgc3R5bGU6IHsgdG9wOiBub3dJbmRpY2F0b3JUb3AgfSB9LCBpbm5lckNvbnRlbnQpKTsgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSkpOyB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBrZXk6ICdjb2xzJyxcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZXJFbFJlZjogdGhpcy5zY3JvbGxlckVsUmVmLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB0aW1lQ29udGVudCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzdGlja3lGb290ZXJTY3JvbGxiYXIpIHtcbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogJ2Zvb3RlcicsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2Zvb3RlcicsXG4gICAgICAgICAgICAgICAgaXNTdGlja3k6IHRydWUsXG4gICAgICAgICAgICAgICAgY2h1bmtzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2F4aXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogY29tbW9uLnJlbmRlclNjcm9sbFNoaW0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2NvbHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogY29tbW9uLnJlbmRlclNjcm9sbFNoaW0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLlZpZXdSb290LCB7IHZpZXdTcGVjOiBjb250ZXh0LnZpZXdTcGVjLCBlbFJlZjogdGhpcy5yb290RWxSZWYgfSwgZnVuY3Rpb24gKHJvb3RFbFJlZiwgY2xhc3NOYW1lcykgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBbJ2ZjLXRpbWVncmlkJ10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgcmVmOiByb290RWxSZWYgfSxcbiAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFNjcm9sbEdyaWQsIHsgbGlxdWlkOiAhcHJvcHMuaXNIZWlnaHRBdXRvICYmICFwcm9wcy5mb3JQcmludCwgY29sbGFwc2libGVXaWR0aDogZmFsc2UsIGNvbEdyb3VwczogW1xuICAgICAgICAgICAgICAgICAgICB7IHdpZHRoOiAnc2hyaW5rJywgY29sczogW3sgd2lkdGg6ICdzaHJpbmsnIH1dIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgY29sczogW3sgc3BhbjogY29sQ250LCBtaW5XaWR0aDogZGF5TWluV2lkdGggfV0gfSxcbiAgICAgICAgICAgICAgICBdLCBzZWN0aW9uczogc2VjdGlvbnMgfSkpKTsgfSkpO1xuICAgIH07XG4gICAgLyogRGltZW5zaW9uc1xuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4gICAgVGltZUNvbHNWaWV3LnByb3RvdHlwZS5nZXRBbGxEYXlNYXhFdmVudFByb3BzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmNvbnRleHQub3B0aW9ucywgZGF5TWF4RXZlbnRzID0gX2EuZGF5TWF4RXZlbnRzLCBkYXlNYXhFdmVudFJvd3MgPSBfYS5kYXlNYXhFdmVudFJvd3M7XG4gICAgICAgIGlmIChkYXlNYXhFdmVudHMgPT09IHRydWUgfHwgZGF5TWF4RXZlbnRSb3dzID09PSB0cnVlKSB7IC8vIGlzIGF1dG8/XG4gICAgICAgICAgICBkYXlNYXhFdmVudHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBkYXlNYXhFdmVudFJvd3MgPSBBVVRPX0FMTF9EQVlfTUFYX0VWRU5UX1JPV1M7IC8vIG1ha2Ugc3VyZSBcImF1dG9cIiBnb2VzIHRvIGEgcmVhbCBudW1iZXJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkYXlNYXhFdmVudHM6IGRheU1heEV2ZW50cywgZGF5TWF4RXZlbnRSb3dzOiBkYXlNYXhFdmVudFJvd3MgfTtcbiAgICB9O1xuICAgIHJldHVybiBUaW1lQ29sc1ZpZXc7XG59KGNvbW1vbi5EYXRlQ29tcG9uZW50KSk7XG5mdW5jdGlvbiByZW5kZXJBbGxEYXlJbm5lcihob29rUHJvcHMpIHtcbiAgICByZXR1cm4gaG9va1Byb3BzLnRleHQ7XG59XG5cbnZhciBUaW1lQ29sc1NsYXRzQ29vcmRzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRpbWVDb2xzU2xhdHNDb29yZHMocG9zaXRpb25zLCBkYXRlUHJvZmlsZSwgc2xvdER1cmF0aW9uKSB7XG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gcG9zaXRpb25zO1xuICAgICAgICB0aGlzLmRhdGVQcm9maWxlID0gZGF0ZVByb2ZpbGU7XG4gICAgICAgIHRoaXMuc2xvdER1cmF0aW9uID0gc2xvdER1cmF0aW9uO1xuICAgIH1cbiAgICBUaW1lQ29sc1NsYXRzQ29vcmRzLnByb3RvdHlwZS5zYWZlQ29tcHV0ZVRvcCA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIHZhciBkYXRlUHJvZmlsZSA9IHRoaXMuZGF0ZVByb2ZpbGU7XG4gICAgICAgIGlmIChjb21tb24ucmFuZ2VDb250YWluc01hcmtlcihkYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2UsIGRhdGUpKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnRPZkRheURhdGUgPSBjb21tb24uc3RhcnRPZkRheShkYXRlKTtcbiAgICAgICAgICAgIHZhciB0aW1lTXMgPSBkYXRlLnZhbHVlT2YoKSAtIHN0YXJ0T2ZEYXlEYXRlLnZhbHVlT2YoKTtcbiAgICAgICAgICAgIGlmICh0aW1lTXMgPj0gY29tbW9uLmFzUm91Z2hNcyhkYXRlUHJvZmlsZS5zbG90TWluVGltZSkgJiZcbiAgICAgICAgICAgICAgICB0aW1lTXMgPCBjb21tb24uYXNSb3VnaE1zKGRhdGVQcm9maWxlLnNsb3RNYXhUaW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVUaW1lVG9wKGNvbW1vbi5jcmVhdGVEdXJhdGlvbih0aW1lTXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIC8vIENvbXB1dGVzIHRoZSB0b3AgY29vcmRpbmF0ZSwgcmVsYXRpdmUgdG8gdGhlIGJvdW5kcyBvZiB0aGUgZ3JpZCwgb2YgdGhlIGdpdmVuIGRhdGUuXG4gICAgLy8gQSBgc3RhcnRPZkRheURhdGVgIG11c3QgYmUgZ2l2ZW4gZm9yIGF2b2lkaW5nIGFtYmlndWl0eSBvdmVyIGhvdyB0byB0cmVhdCBtaWRuaWdodC5cbiAgICBUaW1lQ29sc1NsYXRzQ29vcmRzLnByb3RvdHlwZS5jb21wdXRlRGF0ZVRvcCA9IGZ1bmN0aW9uICh3aGVuLCBzdGFydE9mRGF5RGF0ZSkge1xuICAgICAgICBpZiAoIXN0YXJ0T2ZEYXlEYXRlKSB7XG4gICAgICAgICAgICBzdGFydE9mRGF5RGF0ZSA9IGNvbW1vbi5zdGFydE9mRGF5KHdoZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVUaW1lVG9wKGNvbW1vbi5jcmVhdGVEdXJhdGlvbih3aGVuLnZhbHVlT2YoKSAtIHN0YXJ0T2ZEYXlEYXRlLnZhbHVlT2YoKSkpO1xuICAgIH07XG4gICAgLy8gQ29tcHV0ZXMgdGhlIHRvcCBjb29yZGluYXRlLCByZWxhdGl2ZSB0byB0aGUgYm91bmRzIG9mIHRoZSBncmlkLCBvZiB0aGUgZ2l2ZW4gdGltZSAoYSBEdXJhdGlvbikuXG4gICAgLy8gVGhpcyBpcyBhIG1ha2VzaGlmeSB3YXkgdG8gY29tcHV0ZSB0aGUgdGltZS10b3AuIEFzc3VtZXMgYWxsIHNsYXRNZXRhcyBkYXRlcyBhcmUgdW5pZm9ybS5cbiAgICAvLyBFdmVudHVhbGx5IGFsbG93IGNvbXB1dGF0aW9uIHdpdGggYXJiaXJhcnkgc2xhdCBkYXRlcy5cbiAgICBUaW1lQ29sc1NsYXRzQ29vcmRzLnByb3RvdHlwZS5jb21wdXRlVGltZVRvcCA9IGZ1bmN0aW9uIChkdXJhdGlvbikge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwb3NpdGlvbnMgPSBfYS5wb3NpdGlvbnMsIGRhdGVQcm9maWxlID0gX2EuZGF0ZVByb2ZpbGU7XG4gICAgICAgIHZhciBsZW4gPSBwb3NpdGlvbnMuZWxzLmxlbmd0aDtcbiAgICAgICAgLy8gZmxvYXRpbmctcG9pbnQgdmFsdWUgb2YgIyBvZiBzbG90cyBjb3ZlcmVkXG4gICAgICAgIHZhciBzbGF0Q292ZXJhZ2UgPSAoZHVyYXRpb24ubWlsbGlzZWNvbmRzIC0gY29tbW9uLmFzUm91Z2hNcyhkYXRlUHJvZmlsZS5zbG90TWluVGltZSkpIC8gY29tbW9uLmFzUm91Z2hNcyh0aGlzLnNsb3REdXJhdGlvbik7XG4gICAgICAgIHZhciBzbGF0SW5kZXg7XG4gICAgICAgIHZhciBzbGF0UmVtYWluZGVyO1xuICAgICAgICAvLyBjb21wdXRlIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGZvciBob3cgbWFueSBzbGF0cyBzaG91bGQgYmUgcHJvZ3Jlc3NlZCB0aHJvdWdoLlxuICAgICAgICAvLyBmcm9tIDAgdG8gbnVtYmVyIG9mIHNsYXRzIChpbmNsdXNpdmUpXG4gICAgICAgIC8vIGNvbnN0cmFpbmVkIGJlY2F1c2Ugc2xvdE1pblRpbWUvc2xvdE1heFRpbWUgbWlnaHQgYmUgY3VzdG9taXplZC5cbiAgICAgICAgc2xhdENvdmVyYWdlID0gTWF0aC5tYXgoMCwgc2xhdENvdmVyYWdlKTtcbiAgICAgICAgc2xhdENvdmVyYWdlID0gTWF0aC5taW4obGVuLCBzbGF0Q292ZXJhZ2UpO1xuICAgICAgICAvLyBhbiBpbnRlZ2VyIGluZGV4IG9mIHRoZSBmdXJ0aGVzdCB3aG9sZSBzbGF0XG4gICAgICAgIC8vIGZyb20gMCB0byBudW1iZXIgc2xhdHMgKCpleGNsdXNpdmUqLCBzbyBsZW4tMSlcbiAgICAgICAgc2xhdEluZGV4ID0gTWF0aC5mbG9vcihzbGF0Q292ZXJhZ2UpO1xuICAgICAgICBzbGF0SW5kZXggPSBNYXRoLm1pbihzbGF0SW5kZXgsIGxlbiAtIDEpO1xuICAgICAgICAvLyBob3cgbXVjaCBmdXJ0aGVyIHRocm91Z2ggdGhlIHNsYXRJbmRleCBzbGF0IChmcm9tIDAuMC0xLjApIG11c3QgYmUgY292ZXJlZCBpbiBhZGRpdGlvbi5cbiAgICAgICAgLy8gY291bGQgYmUgMS4wIGlmIHNsYXRDb3ZlcmFnZSBpcyBjb3ZlcmluZyAqYWxsKiB0aGUgc2xvdHNcbiAgICAgICAgc2xhdFJlbWFpbmRlciA9IHNsYXRDb3ZlcmFnZSAtIHNsYXRJbmRleDtcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9ucy50b3BzW3NsYXRJbmRleF0gK1xuICAgICAgICAgICAgcG9zaXRpb25zLmdldEhlaWdodChzbGF0SW5kZXgpICogc2xhdFJlbWFpbmRlcjtcbiAgICB9O1xuICAgIHJldHVybiBUaW1lQ29sc1NsYXRzQ29vcmRzO1xufSgpKTtcblxudmFyIFRpbWVDb2xzU2xhdHNCb2R5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhUaW1lQ29sc1NsYXRzQm9keSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUaW1lQ29sc1NsYXRzQm9keSgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBUaW1lQ29sc1NsYXRzQm9keS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBjb250ZXh0ID0gX2EuY29udGV4dDtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgICAgIHZhciBzbGF0RWxSZWZzID0gcHJvcHMuc2xhdEVsUmVmcztcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcInRib2R5XCIsIG51bGwsIHByb3BzLnNsYXRNZXRhcy5tYXAoZnVuY3Rpb24gKHNsYXRNZXRhLCBpKSB7XG4gICAgICAgICAgICB2YXIgaG9va1Byb3BzID0ge1xuICAgICAgICAgICAgICAgIHRpbWU6IHNsYXRNZXRhLnRpbWUsXG4gICAgICAgICAgICAgICAgZGF0ZTogY29udGV4dC5kYXRlRW52LnRvRGF0ZShzbGF0TWV0YS5kYXRlKSxcbiAgICAgICAgICAgICAgICB2aWV3OiBjb250ZXh0LnZpZXdBcGksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICAgICAgICAgJ2ZjLXRpbWVncmlkLXNsb3QnLFxuICAgICAgICAgICAgICAgICdmYy10aW1lZ3JpZC1zbG90LWxhbmUnLFxuICAgICAgICAgICAgICAgIHNsYXRNZXRhLmlzTGFiZWxlZCA/ICcnIDogJ2ZjLXRpbWVncmlkLXNsb3QtbWlub3InLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCB7IGtleTogc2xhdE1ldGEua2V5LCByZWY6IHNsYXRFbFJlZnMuY3JlYXRlUmVmKHNsYXRNZXRhLmtleSkgfSxcbiAgICAgICAgICAgICAgICBwcm9wcy5heGlzICYmIChjb21tb24uY3JlYXRlRWxlbWVudChUaW1lQ29sc0F4aXNDZWxsLCB0c2xpYi5fX2Fzc2lnbih7fSwgc2xhdE1ldGEpKSksXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLlJlbmRlckhvb2ssIHsgaG9va1Byb3BzOiBob29rUHJvcHMsIGNsYXNzTmFtZXM6IG9wdGlvbnMuc2xvdExhbmVDbGFzc05hbWVzLCBjb250ZW50OiBvcHRpb25zLnNsb3RMYW5lQ29udGVudCwgZGlkTW91bnQ6IG9wdGlvbnMuc2xvdExhbmVEaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMuc2xvdExhbmVXaWxsVW5tb3VudCB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjdXN0b21DbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpIHsgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcInRkXCIsIHsgcmVmOiByb290RWxSZWYsIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5jb25jYXQoY3VzdG9tQ2xhc3NOYW1lcykuam9pbignICcpLCBcImRhdGEtdGltZVwiOiBzbGF0TWV0YS5pc29UaW1lU3RyIH0sIGlubmVyQ29udGVudCkpOyB9KSkpO1xuICAgICAgICB9KSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFRpbWVDb2xzU2xhdHNCb2R5O1xufShjb21tb24uQmFzZUNvbXBvbmVudCkpO1xuXG4vKlxuZm9yIHRoZSBob3Jpem9udGFsIFwic2xhdHNcIiB0aGF0IHJ1biB3aWR0aC13aXNlLiBIYXMgYSB0aW1lIGF4aXMgb24gYSBzaWRlLiBEZXBlbmRzIG9uIFJUTC5cbiovXG52YXIgVGltZUNvbHNTbGF0cyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVGltZUNvbHNTbGF0cywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUaW1lQ29sc1NsYXRzKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucm9vdEVsUmVmID0gY29tbW9uLmNyZWF0ZVJlZigpO1xuICAgICAgICBfdGhpcy5zbGF0RWxSZWZzID0gbmV3IGNvbW1vbi5SZWZNYXAoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBUaW1lQ29sc1NsYXRzLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgcmVmOiB0aGlzLnJvb3RFbFJlZiwgY2xhc3NOYW1lOiBcImZjLXRpbWVncmlkLXNsb3RzXCIgfSxcbiAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGFibGVcIiwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUsIGNsYXNzTmFtZTogY29udGV4dC50aGVtZS5nZXRDbGFzcygndGFibGUnKSwgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IHByb3BzLnRhYmxlTWluV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBwcm9wcy5jbGllbnRXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBwcm9wcy5taW5IZWlnaHQsXG4gICAgICAgICAgICAgICAgfSB9LFxuICAgICAgICAgICAgICAgIHByb3BzLnRhYmxlQ29sR3JvdXBOb2RlIC8qIHJlbGllcyBvbiB0aGVyZSBvbmx5IGJlaW5nIGEgc2luZ2xlIDxjb2w+IGZvciB0aGUgYXhpcyAqLyxcbiAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChUaW1lQ29sc1NsYXRzQm9keSwgeyBzbGF0RWxSZWZzOiB0aGlzLnNsYXRFbFJlZnMsIGF4aXM6IHByb3BzLmF4aXMsIHNsYXRNZXRhczogcHJvcHMuc2xhdE1ldGFzIH0pKSkpO1xuICAgIH07XG4gICAgVGltZUNvbHNTbGF0cy5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU2l6aW5nKCk7XG4gICAgfTtcbiAgICBUaW1lQ29sc1NsYXRzLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU2l6aW5nKCk7XG4gICAgfTtcbiAgICBUaW1lQ29sc1NsYXRzLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25Db29yZHMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25Db29yZHMobnVsbCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRpbWVDb2xzU2xhdHMucHJvdG90eXBlLnVwZGF0ZVNpemluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgY29udGV4dCA9IF9hLmNvbnRleHQsIHByb3BzID0gX2EucHJvcHM7XG4gICAgICAgIGlmIChwcm9wcy5vbkNvb3JkcyAmJlxuICAgICAgICAgICAgcHJvcHMuY2xpZW50V2lkdGggIT09IG51bGwgLy8gbWVhbnMgc2l6aW5nIGhhcyBzdGFiaWxpemVkXG4gICAgICAgICkge1xuICAgICAgICAgICAgdmFyIHJvb3RFbCA9IHRoaXMucm9vdEVsUmVmLmN1cnJlbnQ7XG4gICAgICAgICAgICBpZiAocm9vdEVsLm9mZnNldEhlaWdodCkgeyAvLyBub3QgaGlkZGVuIGJ5IGNzc1xuICAgICAgICAgICAgICAgIHByb3BzLm9uQ29vcmRzKG5ldyBUaW1lQ29sc1NsYXRzQ29vcmRzKG5ldyBjb21tb24uUG9zaXRpb25DYWNoZSh0aGlzLnJvb3RFbFJlZi5jdXJyZW50LCBjb2xsZWN0U2xhdEVscyh0aGlzLnNsYXRFbFJlZnMuY3VycmVudE1hcCwgcHJvcHMuc2xhdE1ldGFzKSwgZmFsc2UsIHRydWUpLCB0aGlzLnByb3BzLmRhdGVQcm9maWxlLCBjb250ZXh0Lm9wdGlvbnMuc2xvdER1cmF0aW9uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBUaW1lQ29sc1NsYXRzO1xufShjb21tb24uQmFzZUNvbXBvbmVudCkpO1xuZnVuY3Rpb24gY29sbGVjdFNsYXRFbHMoZWxNYXAsIHNsYXRNZXRhcykge1xuICAgIHJldHVybiBzbGF0TWV0YXMubWFwKGZ1bmN0aW9uIChzbGF0TWV0YSkgeyByZXR1cm4gZWxNYXBbc2xhdE1ldGEua2V5XTsgfSk7XG59XG5cbmZ1bmN0aW9uIHNwbGl0U2Vnc0J5Q29sKHNlZ3MsIGNvbENudCkge1xuICAgIHZhciBzZWdzQnlDb2wgPSBbXTtcbiAgICB2YXIgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgY29sQ250OyBpICs9IDEpIHtcbiAgICAgICAgc2Vnc0J5Q29sLnB1c2goW10pO1xuICAgIH1cbiAgICBpZiAoc2Vncykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgc2Vnc0J5Q29sW3NlZ3NbaV0uY29sXS5wdXNoKHNlZ3NbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZWdzQnlDb2w7XG59XG5mdW5jdGlvbiBzcGxpdEludGVyYWN0aW9uQnlDb2wodWksIGNvbENudCkge1xuICAgIHZhciBieVJvdyA9IFtdO1xuICAgIGlmICghdWkpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xDbnQ7IGkgKz0gMSkge1xuICAgICAgICAgICAgYnlSb3dbaV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbENudDsgaSArPSAxKSB7XG4gICAgICAgICAgICBieVJvd1tpXSA9IHtcbiAgICAgICAgICAgICAgICBhZmZlY3RlZEluc3RhbmNlczogdWkuYWZmZWN0ZWRJbnN0YW5jZXMsXG4gICAgICAgICAgICAgICAgaXNFdmVudDogdWkuaXNFdmVudCxcbiAgICAgICAgICAgICAgICBzZWdzOiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHVpLnNlZ3M7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgc2VnID0gX2FbX2ldO1xuICAgICAgICAgICAgYnlSb3dbc2VnLmNvbF0uc2Vncy5wdXNoKHNlZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ5Um93O1xufVxuXG52YXIgVGltZUNvbE1vcmVMaW5rID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhUaW1lQ29sTW9yZUxpbmssIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGltZUNvbE1vcmVMaW5rKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucm9vdEVsUmVmID0gY29tbW9uLmNyZWF0ZVJlZigpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFRpbWVDb2xNb3JlTGluay5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5Nb3JlTGlua1Jvb3QsIHsgYWxsRGF5RGF0ZTogbnVsbCwgbW9yZUNudDogcHJvcHMuaGlkZGVuU2Vncy5sZW5ndGgsIGFsbFNlZ3M6IHByb3BzLmhpZGRlblNlZ3MsIGhpZGRlblNlZ3M6IHByb3BzLmhpZGRlblNlZ3MsIGFsaWdubWVudEVsUmVmOiB0aGlzLnJvb3RFbFJlZiwgZGVmYXVsdENvbnRlbnQ6IHJlbmRlck1vcmVMaW5rSW5uZXIsIGV4dHJhRGF0ZVNwYW46IHByb3BzLmV4dHJhRGF0ZVNwYW4sIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSwgcG9wb3ZlckNvbnRlbnQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlbmRlclBsYWluRmdTZWdzKHByb3BzLmhpZGRlblNlZ3MsIHByb3BzKTsgfSB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQsIGhhbmRsZUNsaWNrLCB0aXRsZSwgaXNFeHBhbmRlZCwgcG9wb3ZlcklkKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHsgcmVmOiBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgICAgICBjb21tb24uc2V0UmVmKHJvb3RFbFJlZiwgZWwpO1xuICAgICAgICAgICAgICAgIGNvbW1vbi5zZXRSZWYoX3RoaXMucm9vdEVsUmVmLCBlbCk7XG4gICAgICAgICAgICB9LCBjbGFzc05hbWU6IFsnZmMtdGltZWdyaWQtbW9yZS1saW5rJ10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgc3R5bGU6IHsgdG9wOiBwcm9wcy50b3AsIGJvdHRvbTogcHJvcHMuYm90dG9tIH0sIG9uQ2xpY2s6IGhhbmRsZUNsaWNrLCB0aXRsZTogdGl0bGUsIFwiYXJpYS1leHBhbmRlZFwiOiBpc0V4cGFuZGVkLCBcImFyaWEtY29udHJvbHNcIjogcG9wb3ZlcklkIH0sXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IHJlZjogaW5uZXJFbFJlZiwgY2xhc3NOYW1lOiBcImZjLXRpbWVncmlkLW1vcmUtbGluay1pbm5lciBmYy1zdGlja3lcIiB9LCBpbm5lckNvbnRlbnQpKSk7IH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBUaW1lQ29sTW9yZUxpbms7XG59KGNvbW1vbi5CYXNlQ29tcG9uZW50KSk7XG5mdW5jdGlvbiByZW5kZXJNb3JlTGlua0lubmVyKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLnNob3J0VGV4dDtcbn1cblxuLy8gc2VnSW5wdXRzIGFzc3VtZWQgc29ydGVkXG5mdW5jdGlvbiBidWlsZFBvc2l0aW9uaW5nKHNlZ0lucHV0cywgc3RyaWN0T3JkZXIsIG1heFN0YWNrQ250KSB7XG4gICAgdmFyIGhpZXJhcmNoeSA9IG5ldyBjb21tb24uU2VnSGllcmFyY2h5KCk7XG4gICAgaWYgKHN0cmljdE9yZGVyICE9IG51bGwpIHtcbiAgICAgICAgaGllcmFyY2h5LnN0cmljdE9yZGVyID0gc3RyaWN0T3JkZXI7XG4gICAgfVxuICAgIGlmIChtYXhTdGFja0NudCAhPSBudWxsKSB7XG4gICAgICAgIGhpZXJhcmNoeS5tYXhTdGFja0NudCA9IG1heFN0YWNrQ250O1xuICAgIH1cbiAgICB2YXIgaGlkZGVuRW50cmllcyA9IGhpZXJhcmNoeS5hZGRTZWdzKHNlZ0lucHV0cyk7XG4gICAgdmFyIGhpZGRlbkdyb3VwcyA9IGNvbW1vbi5ncm91cEludGVyc2VjdGluZ0VudHJpZXMoaGlkZGVuRW50cmllcyk7XG4gICAgdmFyIHdlYiA9IGJ1aWxkV2ViKGhpZXJhcmNoeSk7XG4gICAgd2ViID0gc3RyZXRjaFdlYih3ZWIsIDEpOyAvLyBhbGwgbGV2ZWxDb29yZHMvdGhpY2tuZXNzIHdpbGwgaGF2ZSAwLjAtMS4wXG4gICAgdmFyIHNlZ1JlY3RzID0gd2ViVG9SZWN0cyh3ZWIpO1xuICAgIHJldHVybiB7IHNlZ1JlY3RzOiBzZWdSZWN0cywgaGlkZGVuR3JvdXBzOiBoaWRkZW5Hcm91cHMgfTtcbn1cbmZ1bmN0aW9uIGJ1aWxkV2ViKGhpZXJhcmNoeSkge1xuICAgIHZhciBlbnRyaWVzQnlMZXZlbCA9IGhpZXJhcmNoeS5lbnRyaWVzQnlMZXZlbDtcbiAgICB2YXIgYnVpbGROb2RlID0gY2FjaGVhYmxlKGZ1bmN0aW9uIChsZXZlbCwgbGF0ZXJhbCkgeyByZXR1cm4gbGV2ZWwgKyAnOicgKyBsYXRlcmFsOyB9LCBmdW5jdGlvbiAobGV2ZWwsIGxhdGVyYWwpIHtcbiAgICAgICAgdmFyIHNpYmxpbmdSYW5nZSA9IGZpbmROZXh0TGV2ZWxTZWdzKGhpZXJhcmNoeSwgbGV2ZWwsIGxhdGVyYWwpO1xuICAgICAgICB2YXIgbmV4dExldmVsUmVzID0gYnVpbGROb2RlcyhzaWJsaW5nUmFuZ2UsIGJ1aWxkTm9kZSk7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNCeUxldmVsW2xldmVsXVtsYXRlcmFsXTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBlbnRyeSksIHsgbmV4dExldmVsTm9kZXM6IG5leHRMZXZlbFJlc1swXSB9KSxcbiAgICAgICAgICAgIGVudHJ5LnRoaWNrbmVzcyArIG5leHRMZXZlbFJlc1sxXSwgLy8gdGhlIHByZXNzdXJlIGJ1aWxkc1xuICAgICAgICBdO1xuICAgIH0pO1xuICAgIHJldHVybiBidWlsZE5vZGVzKGVudHJpZXNCeUxldmVsLmxlbmd0aFxuICAgICAgICA/IHsgbGV2ZWw6IDAsIGxhdGVyYWxTdGFydDogMCwgbGF0ZXJhbEVuZDogZW50cmllc0J5TGV2ZWxbMF0ubGVuZ3RoIH1cbiAgICAgICAgOiBudWxsLCBidWlsZE5vZGUpWzBdO1xufVxuZnVuY3Rpb24gYnVpbGROb2RlcyhzaWJsaW5nUmFuZ2UsIGJ1aWxkTm9kZSkge1xuICAgIGlmICghc2libGluZ1JhbmdlKSB7XG4gICAgICAgIHJldHVybiBbW10sIDBdO1xuICAgIH1cbiAgICB2YXIgbGV2ZWwgPSBzaWJsaW5nUmFuZ2UubGV2ZWwsIGxhdGVyYWxTdGFydCA9IHNpYmxpbmdSYW5nZS5sYXRlcmFsU3RhcnQsIGxhdGVyYWxFbmQgPSBzaWJsaW5nUmFuZ2UubGF0ZXJhbEVuZDtcbiAgICB2YXIgbGF0ZXJhbCA9IGxhdGVyYWxTdGFydDtcbiAgICB2YXIgcGFpcnMgPSBbXTtcbiAgICB3aGlsZSAobGF0ZXJhbCA8IGxhdGVyYWxFbmQpIHtcbiAgICAgICAgcGFpcnMucHVzaChidWlsZE5vZGUobGV2ZWwsIGxhdGVyYWwpKTtcbiAgICAgICAgbGF0ZXJhbCArPSAxO1xuICAgIH1cbiAgICBwYWlycy5zb3J0KGNtcERlc2NQcmVzc3VyZXMpO1xuICAgIHJldHVybiBbXG4gICAgICAgIHBhaXJzLm1hcChleHRyYWN0Tm9kZSksXG4gICAgICAgIHBhaXJzWzBdWzFdLCAvLyBmaXJzdCBpdGVtJ3MgcHJlc3N1cmVcbiAgICBdO1xufVxuZnVuY3Rpb24gY21wRGVzY1ByZXNzdXJlcyhhLCBiKSB7XG4gICAgcmV0dXJuIGJbMV0gLSBhWzFdO1xufVxuZnVuY3Rpb24gZXh0cmFjdE5vZGUoYSkge1xuICAgIHJldHVybiBhWzBdO1xufVxuZnVuY3Rpb24gZmluZE5leHRMZXZlbFNlZ3MoaGllcmFyY2h5LCBzdWJqZWN0TGV2ZWwsIHN1YmplY3RMYXRlcmFsKSB7XG4gICAgdmFyIGxldmVsQ29vcmRzID0gaGllcmFyY2h5LmxldmVsQ29vcmRzLCBlbnRyaWVzQnlMZXZlbCA9IGhpZXJhcmNoeS5lbnRyaWVzQnlMZXZlbDtcbiAgICB2YXIgc3ViamVjdEVudHJ5ID0gZW50cmllc0J5TGV2ZWxbc3ViamVjdExldmVsXVtzdWJqZWN0TGF0ZXJhbF07XG4gICAgdmFyIGFmdGVyU3ViamVjdCA9IGxldmVsQ29vcmRzW3N1YmplY3RMZXZlbF0gKyBzdWJqZWN0RW50cnkudGhpY2tuZXNzO1xuICAgIHZhciBsZXZlbENudCA9IGxldmVsQ29vcmRzLmxlbmd0aDtcbiAgICB2YXIgbGV2ZWwgPSBzdWJqZWN0TGV2ZWw7XG4gICAgLy8gc2tpcCBwYXN0IGxldmVscyB0aGF0IGFyZSB0b28gaGlnaCB1cFxuICAgIGZvciAoOyBsZXZlbCA8IGxldmVsQ250ICYmIGxldmVsQ29vcmRzW2xldmVsXSA8IGFmdGVyU3ViamVjdDsgbGV2ZWwgKz0gMSlcbiAgICAgICAgOyAvLyBkbyBub3RoaW5nXG4gICAgZm9yICg7IGxldmVsIDwgbGV2ZWxDbnQ7IGxldmVsICs9IDEpIHtcbiAgICAgICAgdmFyIGVudHJpZXMgPSBlbnRyaWVzQnlMZXZlbFtsZXZlbF07XG4gICAgICAgIHZhciBlbnRyeSA9IHZvaWQgMDtcbiAgICAgICAgdmFyIHNlYXJjaEluZGV4ID0gY29tbW9uLmJpbmFyeVNlYXJjaChlbnRyaWVzLCBzdWJqZWN0RW50cnkuc3Bhbi5zdGFydCwgY29tbW9uLmdldEVudHJ5U3BhbkVuZCk7XG4gICAgICAgIHZhciBsYXRlcmFsU3RhcnQgPSBzZWFyY2hJbmRleFswXSArIHNlYXJjaEluZGV4WzFdOyAvLyBpZiBleGFjdCBtYXRjaCAod2hpY2ggZG9lc24ndCBjb2xsaWRlKSwgZ28gdG8gbmV4dCBvbmVcbiAgICAgICAgdmFyIGxhdGVyYWxFbmQgPSBsYXRlcmFsU3RhcnQ7XG4gICAgICAgIHdoaWxlICggLy8gbG9vcCB0aHJvdWdoIGVudHJpZXMgdGhhdCBob3Jpem9udGFsbHkgaW50ZXJzZWN0XG4gICAgICAgIChlbnRyeSA9IGVudHJpZXNbbGF0ZXJhbEVuZF0pICYmIC8vIGJ1dCBub3QgcGFzdCB0aGUgd2hvbGUgc2VnIGxpc3RcbiAgICAgICAgICAgIGVudHJ5LnNwYW4uc3RhcnQgPCBzdWJqZWN0RW50cnkuc3Bhbi5lbmQpIHtcbiAgICAgICAgICAgIGxhdGVyYWxFbmQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGF0ZXJhbFN0YXJ0IDwgbGF0ZXJhbEVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbGV2ZWw6IGxldmVsLCBsYXRlcmFsU3RhcnQ6IGxhdGVyYWxTdGFydCwgbGF0ZXJhbEVuZDogbGF0ZXJhbEVuZCB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gc3RyZXRjaFdlYih0b3BMZXZlbE5vZGVzLCB0b3RhbFRoaWNrbmVzcykge1xuICAgIHZhciBzdHJldGNoTm9kZSA9IGNhY2hlYWJsZShmdW5jdGlvbiAobm9kZSwgc3RhcnRDb29yZCwgcHJldlRoaWNrbmVzcykgeyByZXR1cm4gY29tbW9uLmJ1aWxkRW50cnlLZXkobm9kZSk7IH0sIGZ1bmN0aW9uIChub2RlLCBzdGFydENvb3JkLCBwcmV2VGhpY2tuZXNzKSB7XG4gICAgICAgIHZhciBuZXh0TGV2ZWxOb2RlcyA9IG5vZGUubmV4dExldmVsTm9kZXMsIHRoaWNrbmVzcyA9IG5vZGUudGhpY2tuZXNzO1xuICAgICAgICB2YXIgYWxsVGhpY2tuZXNzID0gdGhpY2tuZXNzICsgcHJldlRoaWNrbmVzcztcbiAgICAgICAgdmFyIHRoaWNrbmVzc0ZyYWN0aW9uID0gdGhpY2tuZXNzIC8gYWxsVGhpY2tuZXNzO1xuICAgICAgICB2YXIgZW5kQ29vcmQ7XG4gICAgICAgIHZhciBuZXdDaGlsZHJlbiA9IFtdO1xuICAgICAgICBpZiAoIW5leHRMZXZlbE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgZW5kQ29vcmQgPSB0b3RhbFRoaWNrbmVzcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgbmV4dExldmVsTm9kZXNfMSA9IG5leHRMZXZlbE5vZGVzOyBfaSA8IG5leHRMZXZlbE5vZGVzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkTm9kZSA9IG5leHRMZXZlbE5vZGVzXzFbX2ldO1xuICAgICAgICAgICAgICAgIGlmIChlbmRDb29yZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXMgPSBzdHJldGNoTm9kZShjaGlsZE5vZGUsIHN0YXJ0Q29vcmQsIGFsbFRoaWNrbmVzcyk7XG4gICAgICAgICAgICAgICAgICAgIGVuZENvb3JkID0gcmVzWzBdO1xuICAgICAgICAgICAgICAgICAgICBuZXdDaGlsZHJlbi5wdXNoKHJlc1sxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gc3RyZXRjaE5vZGUoY2hpbGROb2RlLCBlbmRDb29yZCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuLnB1c2gocmVzWzFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5ld1RoaWNrbmVzcyA9IChlbmRDb29yZCAtIHN0YXJ0Q29vcmQpICogdGhpY2tuZXNzRnJhY3Rpb247XG4gICAgICAgIHJldHVybiBbZW5kQ29vcmQgLSBuZXdUaGlja25lc3MsIHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBub2RlKSwgeyB0aGlja25lc3M6IG5ld1RoaWNrbmVzcywgbmV4dExldmVsTm9kZXM6IG5ld0NoaWxkcmVuIH0pXTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG9wTGV2ZWxOb2Rlcy5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIHN0cmV0Y2hOb2RlKG5vZGUsIDAsIDApWzFdOyB9KTtcbn1cbi8vIG5vdCBzb3J0ZWQgaW4gYW55IHBhcnRpY3VsYXIgb3JkZXJcbmZ1bmN0aW9uIHdlYlRvUmVjdHModG9wTGV2ZWxOb2Rlcykge1xuICAgIHZhciByZWN0cyA9IFtdO1xuICAgIHZhciBwcm9jZXNzTm9kZSA9IGNhY2hlYWJsZShmdW5jdGlvbiAobm9kZSwgbGV2ZWxDb29yZCwgc3RhY2tEZXB0aCkgeyByZXR1cm4gY29tbW9uLmJ1aWxkRW50cnlLZXkobm9kZSk7IH0sIGZ1bmN0aW9uIChub2RlLCBsZXZlbENvb3JkLCBzdGFja0RlcHRoKSB7XG4gICAgICAgIHZhciByZWN0ID0gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIG5vZGUpLCB7IGxldmVsQ29vcmQ6IGxldmVsQ29vcmQsXG4gICAgICAgICAgICBzdGFja0RlcHRoOiBzdGFja0RlcHRoLCBzdGFja0ZvcndhcmQ6IDAgfSk7XG4gICAgICAgIHJlY3RzLnB1c2gocmVjdCk7XG4gICAgICAgIHJldHVybiAocmVjdC5zdGFja0ZvcndhcmQgPSBwcm9jZXNzTm9kZXMobm9kZS5uZXh0TGV2ZWxOb2RlcywgbGV2ZWxDb29yZCArIG5vZGUudGhpY2tuZXNzLCBzdGFja0RlcHRoICsgMSkgKyAxKTtcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBwcm9jZXNzTm9kZXMobm9kZXMsIGxldmVsQ29vcmQsIHN0YWNrRGVwdGgpIHtcbiAgICAgICAgdmFyIHN0YWNrRm9yd2FyZCA9IDA7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgbm9kZXNfMSA9IG5vZGVzOyBfaSA8IG5vZGVzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IG5vZGVzXzFbX2ldO1xuICAgICAgICAgICAgc3RhY2tGb3J3YXJkID0gTWF0aC5tYXgocHJvY2Vzc05vZGUobm9kZSwgbGV2ZWxDb29yZCwgc3RhY2tEZXB0aCksIHN0YWNrRm9yd2FyZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YWNrRm9yd2FyZDtcbiAgICB9XG4gICAgcHJvY2Vzc05vZGVzKHRvcExldmVsTm9kZXMsIDAsIDApO1xuICAgIHJldHVybiByZWN0czsgLy8gVE9ETzogc29ydCByZWN0cyBieSBsZXZlbENvb3JkIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0b1JlY3RzP1xufVxuLy8gVE9ETzogbW92ZSB0byBnZW5lcmFsIHV0aWxcbmZ1bmN0aW9uIGNhY2hlYWJsZShrZXlGdW5jLCB3b3JrRnVuYykge1xuICAgIHZhciBjYWNoZSA9IHt9O1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGtleSA9IGtleUZ1bmMuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICAgICAgcmV0dXJuIChrZXkgaW4gY2FjaGUpXG4gICAgICAgICAgICA/IGNhY2hlW2tleV1cbiAgICAgICAgICAgIDogKGNhY2hlW2tleV0gPSB3b3JrRnVuYy5hcHBseSh2b2lkIDAsIGFyZ3MpKTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU2VnVkNvb3JkcyhzZWdzLCBjb2xEYXRlLCBzbGF0Q29vcmRzLCBldmVudE1pbkhlaWdodCkge1xuICAgIGlmIChzbGF0Q29vcmRzID09PSB2b2lkIDApIHsgc2xhdENvb3JkcyA9IG51bGw7IH1cbiAgICBpZiAoZXZlbnRNaW5IZWlnaHQgPT09IHZvaWQgMCkgeyBldmVudE1pbkhlaWdodCA9IDA7IH1cbiAgICB2YXIgdmNvb3JkcyA9IFtdO1xuICAgIGlmIChzbGF0Q29vcmRzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgdmFyIHNlZyA9IHNlZ3NbaV07XG4gICAgICAgICAgICB2YXIgc3BhblN0YXJ0ID0gc2xhdENvb3Jkcy5jb21wdXRlRGF0ZVRvcChzZWcuc3RhcnQsIGNvbERhdGUpO1xuICAgICAgICAgICAgdmFyIHNwYW5FbmQgPSBNYXRoLm1heChzcGFuU3RhcnQgKyAoZXZlbnRNaW5IZWlnaHQgfHwgMCksIC8vIDooXG4gICAgICAgICAgICBzbGF0Q29vcmRzLmNvbXB1dGVEYXRlVG9wKHNlZy5lbmQsIGNvbERhdGUpKTtcbiAgICAgICAgICAgIHZjb29yZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IE1hdGgucm91bmQoc3BhblN0YXJ0KSxcbiAgICAgICAgICAgICAgICBlbmQ6IE1hdGgucm91bmQoc3BhbkVuZCksIC8vXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmNvb3Jkcztcbn1cbmZ1bmN0aW9uIGNvbXB1dGVGZ1NlZ1BsYWNlbWVudHMoc2Vncywgc2VnVkNvb3JkcywgLy8gbWlnaHQgbm90IGhhdmUgZm9yIGV2ZXJ5IHNlZ1xuZXZlbnRPcmRlclN0cmljdCwgZXZlbnRNYXhTdGFjaykge1xuICAgIHZhciBzZWdJbnB1dHMgPSBbXTtcbiAgICB2YXIgZHVtYlNlZ3MgPSBbXTsgLy8gc2VncyB3aXRob3V0IGNvb3Jkc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgdmNvb3JkcyA9IHNlZ1ZDb29yZHNbaV07XG4gICAgICAgIGlmICh2Y29vcmRzKSB7XG4gICAgICAgICAgICBzZWdJbnB1dHMucHVzaCh7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICAgICAgdGhpY2tuZXNzOiAxLFxuICAgICAgICAgICAgICAgIHNwYW46IHZjb29yZHMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGR1bWJTZWdzLnB1c2goc2Vnc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIF9hID0gYnVpbGRQb3NpdGlvbmluZyhzZWdJbnB1dHMsIGV2ZW50T3JkZXJTdHJpY3QsIGV2ZW50TWF4U3RhY2spLCBzZWdSZWN0cyA9IF9hLnNlZ1JlY3RzLCBoaWRkZW5Hcm91cHMgPSBfYS5oaWRkZW5Hcm91cHM7XG4gICAgdmFyIHNlZ1BsYWNlbWVudHMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDAsIHNlZ1JlY3RzXzEgPSBzZWdSZWN0czsgX2kgPCBzZWdSZWN0c18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgc2VnUmVjdCA9IHNlZ1JlY3RzXzFbX2ldO1xuICAgICAgICBzZWdQbGFjZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgc2VnOiBzZWdzW3NlZ1JlY3QuaW5kZXhdLFxuICAgICAgICAgICAgcmVjdDogc2VnUmVjdCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAodmFyIF9iID0gMCwgZHVtYlNlZ3NfMSA9IGR1bWJTZWdzOyBfYiA8IGR1bWJTZWdzXzEubGVuZ3RoOyBfYisrKSB7XG4gICAgICAgIHZhciBkdW1iU2VnID0gZHVtYlNlZ3NfMVtfYl07XG4gICAgICAgIHNlZ1BsYWNlbWVudHMucHVzaCh7IHNlZzogZHVtYlNlZywgcmVjdDogbnVsbCB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc2VnUGxhY2VtZW50czogc2VnUGxhY2VtZW50cywgaGlkZGVuR3JvdXBzOiBoaWRkZW5Hcm91cHMgfTtcbn1cblxudmFyIERFRkFVTFRfVElNRV9GT1JNQVQgPSBjb21tb24uY3JlYXRlRm9ybWF0dGVyKHtcbiAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgbWVyaWRpZW06IGZhbHNlLFxufSk7XG52YXIgVGltZUNvbEV2ZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhUaW1lQ29sRXZlbnQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGltZUNvbEV2ZW50KCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFRpbWVDb2xFdmVudC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2xhc3NOYW1lcyA9IFtcbiAgICAgICAgICAgICdmYy10aW1lZ3JpZC1ldmVudCcsXG4gICAgICAgICAgICAnZmMtdi1ldmVudCcsXG4gICAgICAgIF07XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmlzU2hvcnQpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtdGltZWdyaWQtZXZlbnQtc2hvcnQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5TdGFuZGFyZEV2ZW50LCB0c2xpYi5fX2Fzc2lnbih7fSwgdGhpcy5wcm9wcywgeyBkZWZhdWx0VGltZUZvcm1hdDogREVGQVVMVF9USU1FX0ZPUk1BVCwgZXh0cmFDbGFzc05hbWVzOiBjbGFzc05hbWVzIH0pKSk7XG4gICAgfTtcbiAgICByZXR1cm4gVGltZUNvbEV2ZW50O1xufShjb21tb24uQmFzZUNvbXBvbmVudCkpO1xuXG52YXIgVGltZUNvbE1pc2MgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFRpbWVDb2xNaXNjLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRpbWVDb2xNaXNjKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFRpbWVDb2xNaXNjLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkRheUNlbGxDb250ZW50LCB7IGRhdGU6IHByb3BzLmRhdGUsIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSwgZXh0cmFIb29rUHJvcHM6IHByb3BzLmV4dHJhSG9va1Byb3BzIH0sIGZ1bmN0aW9uIChpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpIHsgcmV0dXJuIChpbm5lckNvbnRlbnQgJiZcbiAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLXRpbWVncmlkLWNvbC1taXNjXCIsIHJlZjogaW5uZXJFbFJlZiB9LCBpbm5lckNvbnRlbnQpKTsgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFRpbWVDb2xNaXNjO1xufShjb21tb24uQmFzZUNvbXBvbmVudCkpO1xuXG52YXIgVGltZUNvbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVGltZUNvbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUaW1lQ29sKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc29ydEV2ZW50U2VncyA9IGNvbW1vbi5tZW1vaXplKGNvbW1vbi5zb3J0RXZlbnRTZWdzKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvLyBUT0RPOiBtZW1vaXplIGV2ZW50LXBsYWNlbWVudD9cbiAgICBUaW1lQ29sLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgaXNTZWxlY3RNaXJyb3IgPSBjb250ZXh0Lm9wdGlvbnMuc2VsZWN0TWlycm9yO1xuICAgICAgICB2YXIgbWlycm9yU2VncyA9IChwcm9wcy5ldmVudERyYWcgJiYgcHJvcHMuZXZlbnREcmFnLnNlZ3MpIHx8XG4gICAgICAgICAgICAocHJvcHMuZXZlbnRSZXNpemUgJiYgcHJvcHMuZXZlbnRSZXNpemUuc2VncykgfHxcbiAgICAgICAgICAgIChpc1NlbGVjdE1pcnJvciAmJiBwcm9wcy5kYXRlU2VsZWN0aW9uU2VncykgfHxcbiAgICAgICAgICAgIFtdO1xuICAgICAgICB2YXIgaW50ZXJhY3Rpb25BZmZlY3RlZEluc3RhbmNlcyA9IC8vIFRPRE86IG1lc3N5IHdheSB0byBjb21wdXRlIHRoaXNcbiAgICAgICAgIChwcm9wcy5ldmVudERyYWcgJiYgcHJvcHMuZXZlbnREcmFnLmFmZmVjdGVkSW5zdGFuY2VzKSB8fFxuICAgICAgICAgICAgKHByb3BzLmV2ZW50UmVzaXplICYmIHByb3BzLmV2ZW50UmVzaXplLmFmZmVjdGVkSW5zdGFuY2VzKSB8fFxuICAgICAgICAgICAge307XG4gICAgICAgIHZhciBzb3J0ZWRGZ1NlZ3MgPSB0aGlzLnNvcnRFdmVudFNlZ3MocHJvcHMuZmdFdmVudFNlZ3MsIGNvbnRleHQub3B0aW9ucy5ldmVudE9yZGVyKTtcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uRGF5Q2VsbFJvb3QsIHsgZWxSZWY6IHByb3BzLmVsUmVmLCBkYXRlOiBwcm9wcy5kYXRlLCBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsIHRvZGF5UmFuZ2U6IHByb3BzLnRvZGF5UmFuZ2UsIGV4dHJhSG9va1Byb3BzOiBwcm9wcy5leHRyYUhvb2tQcm9wcyB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBkYXRhQXR0cnMpIHsgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcInRkXCIsIHRzbGliLl9fYXNzaWduKHsgcmVmOiByb290RWxSZWYsIHJvbGU6IFwiZ3JpZGNlbGxcIiwgY2xhc3NOYW1lOiBbJ2ZjLXRpbWVncmlkLWNvbCddLmNvbmNhdChjbGFzc05hbWVzLCBwcm9wcy5leHRyYUNsYXNzTmFtZXMgfHwgW10pLmpvaW4oJyAnKSB9LCBkYXRhQXR0cnMsIHByb3BzLmV4dHJhRGF0YUF0dHJzKSxcbiAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLXRpbWVncmlkLWNvbC1mcmFtZVwiIH0sXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtY29sLWJnXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVuZGVyRmlsbFNlZ3MocHJvcHMuYnVzaW5lc3NIb3VyU2VncywgJ25vbi1idXNpbmVzcycpLFxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZW5kZXJGaWxsU2Vncyhwcm9wcy5iZ0V2ZW50U2VncywgJ2JnLWV2ZW50JyksXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlckZpbGxTZWdzKHByb3BzLmRhdGVTZWxlY3Rpb25TZWdzLCAnaGlnaGxpZ2h0JykpLFxuICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLXRpbWVncmlkLWNvbC1ldmVudHNcIiB9LCBfdGhpcy5yZW5kZXJGZ1NlZ3Moc29ydGVkRmdTZWdzLCBpbnRlcmFjdGlvbkFmZmVjdGVkSW5zdGFuY2VzLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSksXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtY29sLWV2ZW50c1wiIH0sIF90aGlzLnJlbmRlckZnU2VncyhtaXJyb3JTZWdzLCB7fSwgQm9vbGVhbihwcm9wcy5ldmVudERyYWcpLCBCb29sZWFuKHByb3BzLmV2ZW50UmVzaXplKSwgQm9vbGVhbihpc1NlbGVjdE1pcnJvcikpKSxcbiAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy10aW1lZ3JpZC1ub3ctaW5kaWNhdG9yLWNvbnRhaW5lclwiIH0sIF90aGlzLnJlbmRlck5vd0luZGljYXRvcihwcm9wcy5ub3dJbmRpY2F0b3JTZWdzKSksXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoVGltZUNvbE1pc2MsIHsgZGF0ZTogcHJvcHMuZGF0ZSwgZGF0ZVByb2ZpbGU6IHByb3BzLmRhdGVQcm9maWxlLCB0b2RheVJhbmdlOiBwcm9wcy50b2RheVJhbmdlLCBleHRyYUhvb2tQcm9wczogcHJvcHMuZXh0cmFIb29rUHJvcHMgfSkpKSk7IH0pKTtcbiAgICB9O1xuICAgIFRpbWVDb2wucHJvdG90eXBlLnJlbmRlckZnU2VncyA9IGZ1bmN0aW9uIChzb3J0ZWRGZ1NlZ3MsIHNlZ0lzSW52aXNpYmxlLCBpc0RyYWdnaW5nLCBpc1Jlc2l6aW5nLCBpc0RhdGVTZWxlY3RpbmcpIHtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgaWYgKHByb3BzLmZvclByaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyUGxhaW5GZ1NlZ3Moc29ydGVkRmdTZWdzLCBwcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyUG9zaXRpb25lZEZnU2Vncyhzb3J0ZWRGZ1NlZ3MsIHNlZ0lzSW52aXNpYmxlLCBpc0RyYWdnaW5nLCBpc1Jlc2l6aW5nLCBpc0RhdGVTZWxlY3RpbmcpO1xuICAgIH07XG4gICAgVGltZUNvbC5wcm90b3R5cGUucmVuZGVyUG9zaXRpb25lZEZnU2VncyA9IGZ1bmN0aW9uIChzZWdzLCAvLyBpZiBub3QgbWlycm9yLCBuZWVkcyB0byBiZSBzb3J0ZWRcbiAgICBzZWdJc0ludmlzaWJsZSwgaXNEcmFnZ2luZywgaXNSZXNpemluZywgaXNEYXRlU2VsZWN0aW5nKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuY29udGV4dC5vcHRpb25zLCBldmVudE1heFN0YWNrID0gX2EuZXZlbnRNYXhTdGFjaywgZXZlbnRTaG9ydEhlaWdodCA9IF9hLmV2ZW50U2hvcnRIZWlnaHQsIGV2ZW50T3JkZXJTdHJpY3QgPSBfYS5ldmVudE9yZGVyU3RyaWN0LCBldmVudE1pbkhlaWdodCA9IF9hLmV2ZW50TWluSGVpZ2h0O1xuICAgICAgICB2YXIgX2IgPSB0aGlzLnByb3BzLCBkYXRlID0gX2IuZGF0ZSwgc2xhdENvb3JkcyA9IF9iLnNsYXRDb29yZHMsIGV2ZW50U2VsZWN0aW9uID0gX2IuZXZlbnRTZWxlY3Rpb24sIHRvZGF5UmFuZ2UgPSBfYi50b2RheVJhbmdlLCBub3dEYXRlID0gX2Iubm93RGF0ZTtcbiAgICAgICAgdmFyIGlzTWlycm9yID0gaXNEcmFnZ2luZyB8fCBpc1Jlc2l6aW5nIHx8IGlzRGF0ZVNlbGVjdGluZztcbiAgICAgICAgdmFyIHNlZ1ZDb29yZHMgPSBjb21wdXRlU2VnVkNvb3JkcyhzZWdzLCBkYXRlLCBzbGF0Q29vcmRzLCBldmVudE1pbkhlaWdodCk7XG4gICAgICAgIHZhciBfYyA9IGNvbXB1dGVGZ1NlZ1BsYWNlbWVudHMoc2Vncywgc2VnVkNvb3JkcywgZXZlbnRPcmRlclN0cmljdCwgZXZlbnRNYXhTdGFjayksIHNlZ1BsYWNlbWVudHMgPSBfYy5zZWdQbGFjZW1lbnRzLCBoaWRkZW5Hcm91cHMgPSBfYy5oaWRkZW5Hcm91cHM7XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkZyYWdtZW50LCBudWxsLFxuICAgICAgICAgICAgdGhpcy5yZW5kZXJIaWRkZW5Hcm91cHMoaGlkZGVuR3JvdXBzLCBzZWdzKSxcbiAgICAgICAgICAgIHNlZ1BsYWNlbWVudHMubWFwKGZ1bmN0aW9uIChzZWdQbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VnID0gc2VnUGxhY2VtZW50LnNlZywgcmVjdCA9IHNlZ1BsYWNlbWVudC5yZWN0O1xuICAgICAgICAgICAgICAgIHZhciBpbnN0YW5jZUlkID0gc2VnLmV2ZW50UmFuZ2UuaW5zdGFuY2UuaW5zdGFuY2VJZDtcbiAgICAgICAgICAgICAgICB2YXIgaXNWaXNpYmxlID0gaXNNaXJyb3IgfHwgQm9vbGVhbighc2VnSXNJbnZpc2libGVbaW5zdGFuY2VJZF0gJiYgcmVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIHZTdHlsZSA9IGNvbXB1dGVTZWdWU3R5bGUocmVjdCAmJiByZWN0LnNwYW4pO1xuICAgICAgICAgICAgICAgIHZhciBoU3R5bGUgPSAoIWlzTWlycm9yICYmIHJlY3QpID8gX3RoaXMuY29tcHV0ZVNlZ0hTdHlsZShyZWN0KSA6IHsgbGVmdDogMCwgcmlnaHQ6IDAgfTtcbiAgICAgICAgICAgICAgICB2YXIgaXNJbnNldCA9IEJvb2xlYW4ocmVjdCkgJiYgcmVjdC5zdGFja0ZvcndhcmQgPiAwO1xuICAgICAgICAgICAgICAgIHZhciBpc1Nob3J0ID0gQm9vbGVhbihyZWN0KSAmJiAocmVjdC5zcGFuLmVuZCAtIHJlY3Quc3Bhbi5zdGFydCkgPCBldmVudFNob3J0SGVpZ2h0OyAvLyBsb29rIGF0IG90aGVyIHBsYWNlcyBmb3IgdGhpcyBwcm9ibGVtXG4gICAgICAgICAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogJ2ZjLXRpbWVncmlkLWV2ZW50LWhhcm5lc3MnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChpc0luc2V0ID8gJyBmYy10aW1lZ3JpZC1ldmVudC1oYXJuZXNzLWluc2V0JyA6ICcnKSwga2V5OiBpbnN0YW5jZUlkLCBzdHlsZTogdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oeyB2aXNpYmlsaXR5OiBpc1Zpc2libGUgPyAnJyA6ICdoaWRkZW4nIH0sIHZTdHlsZSksIGhTdHlsZSkgfSxcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoVGltZUNvbEV2ZW50LCB0c2xpYi5fX2Fzc2lnbih7IHNlZzogc2VnLCBpc0RyYWdnaW5nOiBpc0RyYWdnaW5nLCBpc1Jlc2l6aW5nOiBpc1Jlc2l6aW5nLCBpc0RhdGVTZWxlY3Rpbmc6IGlzRGF0ZVNlbGVjdGluZywgaXNTZWxlY3RlZDogaW5zdGFuY2VJZCA9PT0gZXZlbnRTZWxlY3Rpb24sIGlzU2hvcnQ6IGlzU2hvcnQgfSwgY29tbW9uLmdldFNlZ01ldGEoc2VnLCB0b2RheVJhbmdlLCBub3dEYXRlKSkpKSk7XG4gICAgICAgICAgICB9KSkpO1xuICAgIH07XG4gICAgLy8gd2lsbCBhbHJlYWR5IGhhdmUgZXZlbnRNaW5IZWlnaHQgYXBwbGllZCBiZWNhdXNlIHNlZ0lucHV0cyBhbHJlYWR5IGhhZCBpdFxuICAgIFRpbWVDb2wucHJvdG90eXBlLnJlbmRlckhpZGRlbkdyb3VwcyA9IGZ1bmN0aW9uIChoaWRkZW5Hcm91cHMsIHNlZ3MpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5wcm9wcywgZXh0cmFEYXRlU3BhbiA9IF9hLmV4dHJhRGF0ZVNwYW4sIGRhdGVQcm9maWxlID0gX2EuZGF0ZVByb2ZpbGUsIHRvZGF5UmFuZ2UgPSBfYS50b2RheVJhbmdlLCBub3dEYXRlID0gX2Eubm93RGF0ZSwgZXZlbnRTZWxlY3Rpb24gPSBfYS5ldmVudFNlbGVjdGlvbiwgZXZlbnREcmFnID0gX2EuZXZlbnREcmFnLCBldmVudFJlc2l6ZSA9IF9hLmV2ZW50UmVzaXplO1xuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5GcmFnbWVudCwgbnVsbCwgaGlkZGVuR3JvdXBzLm1hcChmdW5jdGlvbiAoaGlkZGVuR3JvdXApIHtcbiAgICAgICAgICAgIHZhciBwb3NpdGlvbkNzcyA9IGNvbXB1dGVTZWdWU3R5bGUoaGlkZGVuR3JvdXAuc3Bhbik7XG4gICAgICAgICAgICB2YXIgaGlkZGVuU2VncyA9IGNvbXBpbGVTZWdzRnJvbUVudHJpZXMoaGlkZGVuR3JvdXAuZW50cmllcywgc2Vncyk7XG4gICAgICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFRpbWVDb2xNb3JlTGluaywgeyBrZXk6IGNvbW1vbi5idWlsZElzb1N0cmluZyhjb21tb24uY29tcHV0ZUVhcmxpZXN0U2VnU3RhcnQoaGlkZGVuU2VncykpLCBoaWRkZW5TZWdzOiBoaWRkZW5TZWdzLCB0b3A6IHBvc2l0aW9uQ3NzLnRvcCwgYm90dG9tOiBwb3NpdGlvbkNzcy5ib3R0b20sIGV4dHJhRGF0ZVNwYW46IGV4dHJhRGF0ZVNwYW4sIGRhdGVQcm9maWxlOiBkYXRlUHJvZmlsZSwgdG9kYXlSYW5nZTogdG9kYXlSYW5nZSwgbm93RGF0ZTogbm93RGF0ZSwgZXZlbnRTZWxlY3Rpb246IGV2ZW50U2VsZWN0aW9uLCBldmVudERyYWc6IGV2ZW50RHJhZywgZXZlbnRSZXNpemU6IGV2ZW50UmVzaXplIH0pKTtcbiAgICAgICAgfSkpKTtcbiAgICB9O1xuICAgIFRpbWVDb2wucHJvdG90eXBlLnJlbmRlckZpbGxTZWdzID0gZnVuY3Rpb24gKHNlZ3MsIGZpbGxUeXBlKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgc2VnVkNvb3JkcyA9IGNvbXB1dGVTZWdWQ29vcmRzKHNlZ3MsIHByb3BzLmRhdGUsIHByb3BzLnNsYXRDb29yZHMsIGNvbnRleHQub3B0aW9ucy5ldmVudE1pbkhlaWdodCk7IC8vIGRvbid0IGFzc3VtZSBhbGwgcG9wdWxhdGVkXG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHNlZ1ZDb29yZHMubWFwKGZ1bmN0aW9uICh2Y29vcmRzLCBpKSB7XG4gICAgICAgICAgICB2YXIgc2VnID0gc2Vnc1tpXTtcbiAgICAgICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBrZXk6IGNvbW1vbi5idWlsZEV2ZW50UmFuZ2VLZXkoc2VnLmV2ZW50UmFuZ2UpLCBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtYmctaGFybmVzc1wiLCBzdHlsZTogY29tcHV0ZVNlZ1ZTdHlsZSh2Y29vcmRzKSB9LCBmaWxsVHlwZSA9PT0gJ2JnLWV2ZW50JyA/XG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkJnRXZlbnQsIHRzbGliLl9fYXNzaWduKHsgc2VnOiBzZWcgfSwgY29tbW9uLmdldFNlZ01ldGEoc2VnLCBwcm9wcy50b2RheVJhbmdlLCBwcm9wcy5ub3dEYXRlKSkpIDpcbiAgICAgICAgICAgICAgICBjb21tb24ucmVuZGVyRmlsbChmaWxsVHlwZSkpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uRnJhZ21lbnQsIG51bGwsIGNoaWxkcmVuKTtcbiAgICB9O1xuICAgIFRpbWVDb2wucHJvdG90eXBlLnJlbmRlck5vd0luZGljYXRvciA9IGZ1bmN0aW9uIChzZWdzKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMucHJvcHMsIHNsYXRDb29yZHMgPSBfYS5zbGF0Q29vcmRzLCBkYXRlID0gX2EuZGF0ZTtcbiAgICAgICAgaWYgKCFzbGF0Q29vcmRzKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2Vncy5tYXAoZnVuY3Rpb24gKHNlZywgaSkgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5Ob3dJbmRpY2F0b3JSb290LCB7IGlzQXhpczogZmFsc2UsIGRhdGU6IGRhdGUsIFxuICAgICAgICAgICAgLy8ga2V5IGRvZXNuJ3QgbWF0dGVyLiB3aWxsIG9ubHkgZXZlciBiZSBvbmVcbiAgICAgICAgICAgIGtleTogaSB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpIHsgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IHJlZjogcm9vdEVsUmVmLCBjbGFzc05hbWU6IFsnZmMtdGltZWdyaWQtbm93LWluZGljYXRvci1saW5lJ10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgc3R5bGU6IHsgdG9wOiBzbGF0Q29vcmRzLmNvbXB1dGVEYXRlVG9wKHNlZy5zdGFydCwgZGF0ZSkgfSB9LCBpbm5lckNvbnRlbnQpKTsgfSkpOyB9KTtcbiAgICB9O1xuICAgIFRpbWVDb2wucHJvdG90eXBlLmNvbXB1dGVTZWdIU3R5bGUgPSBmdW5jdGlvbiAoc2VnSENvb3Jkcykge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmNvbnRleHQsIGlzUnRsID0gX2EuaXNSdGwsIG9wdGlvbnMgPSBfYS5vcHRpb25zO1xuICAgICAgICB2YXIgc2hvdWxkT3ZlcmxhcCA9IG9wdGlvbnMuc2xvdEV2ZW50T3ZlcmxhcDtcbiAgICAgICAgdmFyIG5lYXJDb29yZCA9IHNlZ0hDb29yZHMubGV2ZWxDb29yZDsgLy8gdGhlIGxlZnQgc2lkZSBpZiBMVFIuIHRoZSByaWdodCBzaWRlIGlmIFJUTC4gZmxvYXRpbmctcG9pbnRcbiAgICAgICAgdmFyIGZhckNvb3JkID0gc2VnSENvb3Jkcy5sZXZlbENvb3JkICsgc2VnSENvb3Jkcy50aGlja25lc3M7IC8vIHRoZSByaWdodCBzaWRlIGlmIExUUi4gdGhlIGxlZnQgc2lkZSBpZiBSVEwuIGZsb2F0aW5nLXBvaW50XG4gICAgICAgIHZhciBsZWZ0OyAvLyBhbW91bnQgb2Ygc3BhY2UgZnJvbSBsZWZ0IGVkZ2UsIGEgZnJhY3Rpb24gb2YgdGhlIHRvdGFsIHdpZHRoXG4gICAgICAgIHZhciByaWdodDsgLy8gYW1vdW50IG9mIHNwYWNlIGZyb20gcmlnaHQgZWRnZSwgYSBmcmFjdGlvbiBvZiB0aGUgdG90YWwgd2lkdGhcbiAgICAgICAgaWYgKHNob3VsZE92ZXJsYXApIHtcbiAgICAgICAgICAgIC8vIGRvdWJsZSB0aGUgd2lkdGgsIGJ1dCBkb24ndCBnbyBiZXlvbmQgdGhlIG1heGltdW0gZm9yd2FyZCBjb29yZGluYXRlICgxLjApXG4gICAgICAgICAgICBmYXJDb29yZCA9IE1hdGgubWluKDEsIG5lYXJDb29yZCArIChmYXJDb29yZCAtIG5lYXJDb29yZCkgKiAyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNSdGwpIHtcbiAgICAgICAgICAgIGxlZnQgPSAxIC0gZmFyQ29vcmQ7XG4gICAgICAgICAgICByaWdodCA9IG5lYXJDb29yZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxlZnQgPSBuZWFyQ29vcmQ7XG4gICAgICAgICAgICByaWdodCA9IDEgLSBmYXJDb29yZDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgICAgICB6SW5kZXg6IHNlZ0hDb29yZHMuc3RhY2tEZXB0aCArIDEsXG4gICAgICAgICAgICBsZWZ0OiBsZWZ0ICogMTAwICsgJyUnLFxuICAgICAgICAgICAgcmlnaHQ6IHJpZ2h0ICogMTAwICsgJyUnLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoc2hvdWxkT3ZlcmxhcCAmJiAhc2VnSENvb3Jkcy5zdGFja0ZvcndhcmQpIHtcbiAgICAgICAgICAgIC8vIGFkZCBwYWRkaW5nIHRvIHRoZSBlZGdlIHNvIHRoYXQgZm9yd2FyZCBzdGFja2VkIGV2ZW50cyBkb24ndCBjb3ZlciB0aGUgcmVzaXplcidzIGljb25cbiAgICAgICAgICAgIHByb3BzW2lzUnRsID8gJ21hcmdpbkxlZnQnIDogJ21hcmdpblJpZ2h0J10gPSAxMCAqIDI7IC8vIDEwIGlzIGEgZ3Vlc3N0aW1hdGUgb2YgdGhlIGljb24ncyB3aWR0aFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wcztcbiAgICB9O1xuICAgIHJldHVybiBUaW1lQ29sO1xufShjb21tb24uQmFzZUNvbXBvbmVudCkpO1xuZnVuY3Rpb24gcmVuZGVyUGxhaW5GZ1NlZ3Moc29ydGVkRmdTZWdzLCBfYSkge1xuICAgIHZhciB0b2RheVJhbmdlID0gX2EudG9kYXlSYW5nZSwgbm93RGF0ZSA9IF9hLm5vd0RhdGUsIGV2ZW50U2VsZWN0aW9uID0gX2EuZXZlbnRTZWxlY3Rpb24sIGV2ZW50RHJhZyA9IF9hLmV2ZW50RHJhZywgZXZlbnRSZXNpemUgPSBfYS5ldmVudFJlc2l6ZTtcbiAgICB2YXIgaGlkZGVuSW5zdGFuY2VzID0gKGV2ZW50RHJhZyA/IGV2ZW50RHJhZy5hZmZlY3RlZEluc3RhbmNlcyA6IG51bGwpIHx8XG4gICAgICAgIChldmVudFJlc2l6ZSA/IGV2ZW50UmVzaXplLmFmZmVjdGVkSW5zdGFuY2VzIDogbnVsbCkgfHxcbiAgICAgICAge307XG4gICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uRnJhZ21lbnQsIG51bGwsIHNvcnRlZEZnU2Vncy5tYXAoZnVuY3Rpb24gKHNlZykge1xuICAgICAgICB2YXIgaW5zdGFuY2VJZCA9IHNlZy5ldmVudFJhbmdlLmluc3RhbmNlLmluc3RhbmNlSWQ7XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBrZXk6IGluc3RhbmNlSWQsIHN0eWxlOiB7IHZpc2liaWxpdHk6IGhpZGRlbkluc3RhbmNlc1tpbnN0YW5jZUlkXSA/ICdoaWRkZW4nIDogJycgfSB9LFxuICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoVGltZUNvbEV2ZW50LCB0c2xpYi5fX2Fzc2lnbih7IHNlZzogc2VnLCBpc0RyYWdnaW5nOiBmYWxzZSwgaXNSZXNpemluZzogZmFsc2UsIGlzRGF0ZVNlbGVjdGluZzogZmFsc2UsIGlzU2VsZWN0ZWQ6IGluc3RhbmNlSWQgPT09IGV2ZW50U2VsZWN0aW9uLCBpc1Nob3J0OiBmYWxzZSB9LCBjb21tb24uZ2V0U2VnTWV0YShzZWcsIHRvZGF5UmFuZ2UsIG5vd0RhdGUpKSkpKTtcbiAgICB9KSkpO1xufVxuZnVuY3Rpb24gY29tcHV0ZVNlZ1ZTdHlsZShzZWdWQ29vcmRzKSB7XG4gICAgaWYgKCFzZWdWQ29vcmRzKSB7XG4gICAgICAgIHJldHVybiB7IHRvcDogJycsIGJvdHRvbTogJycgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdG9wOiBzZWdWQ29vcmRzLnN0YXJ0LFxuICAgICAgICBib3R0b206IC1zZWdWQ29vcmRzLmVuZCxcbiAgICB9O1xufVxuZnVuY3Rpb24gY29tcGlsZVNlZ3NGcm9tRW50cmllcyhzZWdFbnRyaWVzLCBhbGxTZWdzKSB7XG4gICAgcmV0dXJuIHNlZ0VudHJpZXMubWFwKGZ1bmN0aW9uIChzZWdFbnRyeSkgeyByZXR1cm4gYWxsU2Vnc1tzZWdFbnRyeS5pbmRleF07IH0pO1xufVxuXG52YXIgVGltZUNvbHNDb250ZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhUaW1lQ29sc0NvbnRlbnQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGltZUNvbHNDb250ZW50KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3BsaXRGZ0V2ZW50U2VncyA9IGNvbW1vbi5tZW1vaXplKHNwbGl0U2Vnc0J5Q29sKTtcbiAgICAgICAgX3RoaXMuc3BsaXRCZ0V2ZW50U2VncyA9IGNvbW1vbi5tZW1vaXplKHNwbGl0U2Vnc0J5Q29sKTtcbiAgICAgICAgX3RoaXMuc3BsaXRCdXNpbmVzc0hvdXJTZWdzID0gY29tbW9uLm1lbW9pemUoc3BsaXRTZWdzQnlDb2wpO1xuICAgICAgICBfdGhpcy5zcGxpdE5vd0luZGljYXRvclNlZ3MgPSBjb21tb24ubWVtb2l6ZShzcGxpdFNlZ3NCeUNvbCk7XG4gICAgICAgIF90aGlzLnNwbGl0RGF0ZVNlbGVjdGlvblNlZ3MgPSBjb21tb24ubWVtb2l6ZShzcGxpdFNlZ3NCeUNvbCk7XG4gICAgICAgIF90aGlzLnNwbGl0RXZlbnREcmFnID0gY29tbW9uLm1lbW9pemUoc3BsaXRJbnRlcmFjdGlvbkJ5Q29sKTtcbiAgICAgICAgX3RoaXMuc3BsaXRFdmVudFJlc2l6ZSA9IGNvbW1vbi5tZW1vaXplKHNwbGl0SW50ZXJhY3Rpb25CeUNvbCk7XG4gICAgICAgIF90aGlzLnJvb3RFbFJlZiA9IGNvbW1vbi5jcmVhdGVSZWYoKTtcbiAgICAgICAgX3RoaXMuY2VsbEVsUmVmcyA9IG5ldyBjb21tb24uUmVmTWFwKCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgVGltZUNvbHNDb250ZW50LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgbm93SW5kaWNhdG9yVG9wID0gY29udGV4dC5vcHRpb25zLm5vd0luZGljYXRvciAmJlxuICAgICAgICAgICAgcHJvcHMuc2xhdENvb3JkcyAmJlxuICAgICAgICAgICAgcHJvcHMuc2xhdENvb3Jkcy5zYWZlQ29tcHV0ZVRvcChwcm9wcy5ub3dEYXRlKTsgLy8gbWlnaHQgcmV0dXJuIHZvaWRcbiAgICAgICAgdmFyIGNvbENudCA9IHByb3BzLmNlbGxzLmxlbmd0aDtcbiAgICAgICAgdmFyIGZnRXZlbnRTZWdzQnlSb3cgPSB0aGlzLnNwbGl0RmdFdmVudFNlZ3MocHJvcHMuZmdFdmVudFNlZ3MsIGNvbENudCk7XG4gICAgICAgIHZhciBiZ0V2ZW50U2Vnc0J5Um93ID0gdGhpcy5zcGxpdEJnRXZlbnRTZWdzKHByb3BzLmJnRXZlbnRTZWdzLCBjb2xDbnQpO1xuICAgICAgICB2YXIgYnVzaW5lc3NIb3VyU2Vnc0J5Um93ID0gdGhpcy5zcGxpdEJ1c2luZXNzSG91clNlZ3MocHJvcHMuYnVzaW5lc3NIb3VyU2VncywgY29sQ250KTtcbiAgICAgICAgdmFyIG5vd0luZGljYXRvclNlZ3NCeVJvdyA9IHRoaXMuc3BsaXROb3dJbmRpY2F0b3JTZWdzKHByb3BzLm5vd0luZGljYXRvclNlZ3MsIGNvbENudCk7XG4gICAgICAgIHZhciBkYXRlU2VsZWN0aW9uU2Vnc0J5Um93ID0gdGhpcy5zcGxpdERhdGVTZWxlY3Rpb25TZWdzKHByb3BzLmRhdGVTZWxlY3Rpb25TZWdzLCBjb2xDbnQpO1xuICAgICAgICB2YXIgZXZlbnREcmFnQnlSb3cgPSB0aGlzLnNwbGl0RXZlbnREcmFnKHByb3BzLmV2ZW50RHJhZywgY29sQ250KTtcbiAgICAgICAgdmFyIGV2ZW50UmVzaXplQnlSb3cgPSB0aGlzLnNwbGl0RXZlbnRSZXNpemUocHJvcHMuZXZlbnRSZXNpemUsIGNvbENudCk7XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtY29sc1wiLCByZWY6IHRoaXMucm9vdEVsUmVmIH0sXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIHsgcm9sZTogXCJwcmVzZW50YXRpb25cIiwgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IHByb3BzLnRhYmxlTWluV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBwcm9wcy5jbGllbnRXaWR0aCxcbiAgICAgICAgICAgICAgICB9IH0sXG4gICAgICAgICAgICAgICAgcHJvcHMudGFibGVDb2xHcm91cE5vZGUsXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0Ym9keVwiLCB7IHJvbGU6IFwicHJlc2VudGF0aW9uXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCB7IHJvbGU6IFwicm93XCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLmF4aXMgJiYgKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGRcIiwgeyBcImFyaWEtaGlkZGVuXCI6IHRydWUsIGNsYXNzTmFtZTogXCJmYy10aW1lZ3JpZC1jb2wgZmMtdGltZWdyaWQtYXhpc1wiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtY29sLWZyYW1lXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtdGltZWdyaWQtbm93LWluZGljYXRvci1jb250YWluZXJcIiB9LCB0eXBlb2Ygbm93SW5kaWNhdG9yVG9wID09PSAnbnVtYmVyJyAmJiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLk5vd0luZGljYXRvclJvb3QsIHsgaXNBeGlzOiB0cnVlLCBkYXRlOiBwcm9wcy5ub3dEYXRlIH0sIGZ1bmN0aW9uIChyb290RWxSZWYsIGNsYXNzTmFtZXMsIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgcmVmOiByb290RWxSZWYsIGNsYXNzTmFtZTogWydmYy10aW1lZ3JpZC1ub3ctaW5kaWNhdG9yLWFycm93J10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgc3R5bGU6IHsgdG9wOiBub3dJbmRpY2F0b3JUb3AgfSB9LCBpbm5lckNvbnRlbnQpKTsgfSkpKSkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLmNlbGxzLm1hcChmdW5jdGlvbiAoY2VsbCwgaSkgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFRpbWVDb2wsIHsga2V5OiBjZWxsLmtleSwgZWxSZWY6IF90aGlzLmNlbGxFbFJlZnMuY3JlYXRlUmVmKGNlbGwua2V5KSwgZGF0ZVByb2ZpbGU6IHByb3BzLmRhdGVQcm9maWxlLCBkYXRlOiBjZWxsLmRhdGUsIG5vd0RhdGU6IHByb3BzLm5vd0RhdGUsIHRvZGF5UmFuZ2U6IHByb3BzLnRvZGF5UmFuZ2UsIGV4dHJhSG9va1Byb3BzOiBjZWxsLmV4dHJhSG9va1Byb3BzLCBleHRyYURhdGFBdHRyczogY2VsbC5leHRyYURhdGFBdHRycywgZXh0cmFDbGFzc05hbWVzOiBjZWxsLmV4dHJhQ2xhc3NOYW1lcywgZXh0cmFEYXRlU3BhbjogY2VsbC5leHRyYURhdGVTcGFuLCBmZ0V2ZW50U2VnczogZmdFdmVudFNlZ3NCeVJvd1tpXSwgYmdFdmVudFNlZ3M6IGJnRXZlbnRTZWdzQnlSb3dbaV0sIGJ1c2luZXNzSG91clNlZ3M6IGJ1c2luZXNzSG91clNlZ3NCeVJvd1tpXSwgbm93SW5kaWNhdG9yU2Vnczogbm93SW5kaWNhdG9yU2Vnc0J5Um93W2ldLCBkYXRlU2VsZWN0aW9uU2VnczogZGF0ZVNlbGVjdGlvblNlZ3NCeVJvd1tpXSwgZXZlbnREcmFnOiBldmVudERyYWdCeVJvd1tpXSwgZXZlbnRSZXNpemU6IGV2ZW50UmVzaXplQnlSb3dbaV0sIHNsYXRDb29yZHM6IHByb3BzLnNsYXRDb29yZHMsIGV2ZW50U2VsZWN0aW9uOiBwcm9wcy5ldmVudFNlbGVjdGlvbiwgZm9yUHJpbnQ6IHByb3BzLmZvclByaW50IH0pKTsgfSkpKSkpKTtcbiAgICB9O1xuICAgIFRpbWVDb2xzQ29udGVudC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ29vcmRzKCk7XG4gICAgfTtcbiAgICBUaW1lQ29sc0NvbnRlbnQucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVDb29yZHMoKTtcbiAgICB9O1xuICAgIFRpbWVDb2xzQ29udGVudC5wcm90b3R5cGUudXBkYXRlQ29vcmRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICBpZiAocHJvcHMub25Db2xDb29yZHMgJiZcbiAgICAgICAgICAgIHByb3BzLmNsaWVudFdpZHRoICE9PSBudWxsIC8vIG1lYW5zIHNpemluZyBoYXMgc3RhYmlsaXplZFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHByb3BzLm9uQ29sQ29vcmRzKG5ldyBjb21tb24uUG9zaXRpb25DYWNoZSh0aGlzLnJvb3RFbFJlZi5jdXJyZW50LCBjb2xsZWN0Q2VsbEVscyh0aGlzLmNlbGxFbFJlZnMuY3VycmVudE1hcCwgcHJvcHMuY2VsbHMpLCB0cnVlLCAvLyBob3Jpem9udGFsXG4gICAgICAgICAgICBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVGltZUNvbHNDb250ZW50O1xufShjb21tb24uQmFzZUNvbXBvbmVudCkpO1xuZnVuY3Rpb24gY29sbGVjdENlbGxFbHMoZWxNYXAsIGNlbGxzKSB7XG4gICAgcmV0dXJuIGNlbGxzLm1hcChmdW5jdGlvbiAoY2VsbCkgeyByZXR1cm4gZWxNYXBbY2VsbC5rZXldOyB9KTtcbn1cblxuLyogQSBjb21wb25lbnQgdGhhdCByZW5kZXJzIG9uZSBvciBtb3JlIGNvbHVtbnMgb2YgdmVydGljYWwgdGltZSBzbG90c1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG52YXIgVGltZUNvbHMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFRpbWVDb2xzLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRpbWVDb2xzKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucHJvY2Vzc1Nsb3RPcHRpb25zID0gY29tbW9uLm1lbW9pemUocHJvY2Vzc1Nsb3RPcHRpb25zKTtcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBzbGF0Q29vcmRzOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVSb290RWwgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmNvbnRleHQucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudChfdGhpcywge1xuICAgICAgICAgICAgICAgICAgICBlbDogZWwsXG4gICAgICAgICAgICAgICAgICAgIGlzSGl0Q29tYm9BbGxvd2VkOiBfdGhpcy5wcm9wcy5pc0hpdENvbWJvQWxsb3dlZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIF90aGlzLmNvbnRleHQudW5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50KF90aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlU2Nyb2xsUmVxdWVzdCA9IGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICB2YXIgb25TY3JvbGxUb3BSZXF1ZXN0ID0gX3RoaXMucHJvcHMub25TY3JvbGxUb3BSZXF1ZXN0O1xuICAgICAgICAgICAgdmFyIHNsYXRDb29yZHMgPSBfdGhpcy5zdGF0ZS5zbGF0Q29vcmRzO1xuICAgICAgICAgICAgaWYgKG9uU2Nyb2xsVG9wUmVxdWVzdCAmJiBzbGF0Q29vcmRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QudGltZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG9wXzEgPSBzbGF0Q29vcmRzLmNvbXB1dGVUaW1lVG9wKHJlcXVlc3QudGltZSk7XG4gICAgICAgICAgICAgICAgICAgIHRvcF8xID0gTWF0aC5jZWlsKHRvcF8xKTsgLy8gem9vbSBjYW4gZ2l2ZSB3ZWlyZCBmbG9hdGluZy1wb2ludCB2YWx1ZXMuIHJhdGhlciBzY3JvbGwgYSBsaXR0bGUgYml0IGZ1cnRoZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvcF8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3BfMSArPSAxOyAvLyB0byBvdmVyY29tZSB0b3AgYm9yZGVyIHRoYXQgc2xvdHMgYmV5b25kIHRoZSBmaXJzdCBoYXZlLiBsb29rcyBiZXR0ZXJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvblNjcm9sbFRvcFJlcXVlc3QodG9wXzEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlQ29sQ29vcmRzID0gZnVuY3Rpb24gKGNvbENvb3Jkcykge1xuICAgICAgICAgICAgX3RoaXMuY29sQ29vcmRzID0gY29sQ29vcmRzO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVTbGF0Q29vcmRzID0gZnVuY3Rpb24gKHNsYXRDb29yZHMpIHtcbiAgICAgICAgICAgIF90aGlzLnNldFN0YXRlKHsgc2xhdENvb3Jkczogc2xhdENvb3JkcyB9KTtcbiAgICAgICAgICAgIGlmIChfdGhpcy5wcm9wcy5vblNsYXRDb29yZHMpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5wcm9wcy5vblNsYXRDb29yZHMoc2xhdENvb3Jkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgVGltZUNvbHMucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgcHJvcHMgPSBfYS5wcm9wcywgc3RhdGUgPSBfYS5zdGF0ZTtcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy10aW1lZ3JpZC1ib2R5XCIsIHJlZjogdGhpcy5oYW5kbGVSb290RWwsIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgLy8gdGhlc2UgcHJvcHMgYXJlIGltcG9ydGFudCB0byBnaXZlIHRoaXMgd3JhcHBlciBjb3JyZWN0IGRpbWVuc2lvbnMgZm9yIGludGVyYWN0aW9uc1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGlmIHdlIHNldCBpdCBoZXJlLCBjYW4gd2UgYXZvaWQgZ2l2aW5nIHRvIGlubmVyIHRhYmxlcz9cbiAgICAgICAgICAgICAgICB3aWR0aDogcHJvcHMuY2xpZW50V2lkdGgsXG4gICAgICAgICAgICAgICAgbWluV2lkdGg6IHByb3BzLnRhYmxlTWluV2lkdGgsXG4gICAgICAgICAgICB9IH0sXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChUaW1lQ29sc1NsYXRzLCB7IGF4aXM6IHByb3BzLmF4aXMsIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgc2xhdE1ldGFzOiBwcm9wcy5zbGF0TWV0YXMsIGNsaWVudFdpZHRoOiBwcm9wcy5jbGllbnRXaWR0aCwgbWluSGVpZ2h0OiBwcm9wcy5leHBhbmRSb3dzID8gcHJvcHMuY2xpZW50SGVpZ2h0IDogJycsIHRhYmxlTWluV2lkdGg6IHByb3BzLnRhYmxlTWluV2lkdGgsIHRhYmxlQ29sR3JvdXBOb2RlOiBwcm9wcy5heGlzID8gcHJvcHMudGFibGVDb2xHcm91cE5vZGUgOiBudWxsIC8qIGF4aXMgZGVwZW5kcyBvbiB0aGUgY29sZ3JvdXAncyBzaHJpbmtpbmcgKi8sIG9uQ29vcmRzOiB0aGlzLmhhbmRsZVNsYXRDb29yZHMgfSksXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChUaW1lQ29sc0NvbnRlbnQsIHsgY2VsbHM6IHByb3BzLmNlbGxzLCBheGlzOiBwcm9wcy5heGlzLCBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsIGJ1c2luZXNzSG91clNlZ3M6IHByb3BzLmJ1c2luZXNzSG91clNlZ3MsIGJnRXZlbnRTZWdzOiBwcm9wcy5iZ0V2ZW50U2VncywgZmdFdmVudFNlZ3M6IHByb3BzLmZnRXZlbnRTZWdzLCBkYXRlU2VsZWN0aW9uU2VnczogcHJvcHMuZGF0ZVNlbGVjdGlvblNlZ3MsIGV2ZW50U2VsZWN0aW9uOiBwcm9wcy5ldmVudFNlbGVjdGlvbiwgZXZlbnREcmFnOiBwcm9wcy5ldmVudERyYWcsIGV2ZW50UmVzaXplOiBwcm9wcy5ldmVudFJlc2l6ZSwgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSwgbm93RGF0ZTogcHJvcHMubm93RGF0ZSwgbm93SW5kaWNhdG9yU2VnczogcHJvcHMubm93SW5kaWNhdG9yU2VncywgY2xpZW50V2lkdGg6IHByb3BzLmNsaWVudFdpZHRoLCB0YWJsZU1pbldpZHRoOiBwcm9wcy50YWJsZU1pbldpZHRoLCB0YWJsZUNvbEdyb3VwTm9kZTogcHJvcHMudGFibGVDb2xHcm91cE5vZGUsIHNsYXRDb29yZHM6IHN0YXRlLnNsYXRDb29yZHMsIG9uQ29sQ29vcmRzOiB0aGlzLmhhbmRsZUNvbENvb3JkcywgZm9yUHJpbnQ6IHByb3BzLmZvclByaW50IH0pKSk7XG4gICAgfTtcbiAgICBUaW1lQ29scy5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsUmVzcG9uZGVyID0gdGhpcy5jb250ZXh0LmNyZWF0ZVNjcm9sbFJlc3BvbmRlcih0aGlzLmhhbmRsZVNjcm9sbFJlcXVlc3QpO1xuICAgIH07XG4gICAgVGltZUNvbHMucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIChwcmV2UHJvcHMpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxSZXNwb25kZXIudXBkYXRlKHByZXZQcm9wcy5kYXRlUHJvZmlsZSAhPT0gdGhpcy5wcm9wcy5kYXRlUHJvZmlsZSk7XG4gICAgfTtcbiAgICBUaW1lQ29scy5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsUmVzcG9uZGVyLmRldGFjaCgpO1xuICAgIH07XG4gICAgVGltZUNvbHMucHJvdG90eXBlLnF1ZXJ5SGl0ID0gZnVuY3Rpb24gKHBvc2l0aW9uTGVmdCwgcG9zaXRpb25Ub3ApIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5jb250ZXh0LCBkYXRlRW52ID0gX2EuZGF0ZUVudiwgb3B0aW9ucyA9IF9hLm9wdGlvbnM7XG4gICAgICAgIHZhciBjb2xDb29yZHMgPSB0aGlzLmNvbENvb3JkcztcbiAgICAgICAgdmFyIGRhdGVQcm9maWxlID0gdGhpcy5wcm9wcy5kYXRlUHJvZmlsZTtcbiAgICAgICAgdmFyIHNsYXRDb29yZHMgPSB0aGlzLnN0YXRlLnNsYXRDb29yZHM7XG4gICAgICAgIHZhciBfYiA9IHRoaXMucHJvY2Vzc1Nsb3RPcHRpb25zKHRoaXMucHJvcHMuc2xvdER1cmF0aW9uLCBvcHRpb25zLnNuYXBEdXJhdGlvbiksIHNuYXBEdXJhdGlvbiA9IF9iLnNuYXBEdXJhdGlvbiwgc25hcHNQZXJTbG90ID0gX2Iuc25hcHNQZXJTbG90O1xuICAgICAgICB2YXIgY29sSW5kZXggPSBjb2xDb29yZHMubGVmdFRvSW5kZXgocG9zaXRpb25MZWZ0KTtcbiAgICAgICAgdmFyIHNsYXRJbmRleCA9IHNsYXRDb29yZHMucG9zaXRpb25zLnRvcFRvSW5kZXgocG9zaXRpb25Ub3ApO1xuICAgICAgICBpZiAoY29sSW5kZXggIT0gbnVsbCAmJiBzbGF0SW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGNlbGwgPSB0aGlzLnByb3BzLmNlbGxzW2NvbEluZGV4XTtcbiAgICAgICAgICAgIHZhciBzbGF0VG9wID0gc2xhdENvb3Jkcy5wb3NpdGlvbnMudG9wc1tzbGF0SW5kZXhdO1xuICAgICAgICAgICAgdmFyIHNsYXRIZWlnaHQgPSBzbGF0Q29vcmRzLnBvc2l0aW9ucy5nZXRIZWlnaHQoc2xhdEluZGV4KTtcbiAgICAgICAgICAgIHZhciBwYXJ0aWFsID0gKHBvc2l0aW9uVG9wIC0gc2xhdFRvcCkgLyBzbGF0SGVpZ2h0OyAvLyBmbG9hdGluZyBwb2ludCBudW1iZXIgYmV0d2VlbiAwIGFuZCAxXG4gICAgICAgICAgICB2YXIgbG9jYWxTbmFwSW5kZXggPSBNYXRoLmZsb29yKHBhcnRpYWwgKiBzbmFwc1BlclNsb3QpOyAvLyB0aGUgc25hcCAjIHJlbGF0aXZlIHRvIHN0YXJ0IG9mIHNsYXRcbiAgICAgICAgICAgIHZhciBzbmFwSW5kZXggPSBzbGF0SW5kZXggKiBzbmFwc1BlclNsb3QgKyBsb2NhbFNuYXBJbmRleDtcbiAgICAgICAgICAgIHZhciBkYXlEYXRlID0gdGhpcy5wcm9wcy5jZWxsc1tjb2xJbmRleF0uZGF0ZTtcbiAgICAgICAgICAgIHZhciB0aW1lID0gY29tbW9uLmFkZER1cmF0aW9ucyhkYXRlUHJvZmlsZS5zbG90TWluVGltZSwgY29tbW9uLm11bHRpcGx5RHVyYXRpb24oc25hcER1cmF0aW9uLCBzbmFwSW5kZXgpKTtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGRhdGVFbnYuYWRkKGRheURhdGUsIHRpbWUpO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGRhdGVFbnYuYWRkKHN0YXJ0LCBzbmFwRHVyYXRpb24pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRlUHJvZmlsZTogZGF0ZVByb2ZpbGUsXG4gICAgICAgICAgICAgICAgZGF0ZVNwYW46IHRzbGliLl9fYXNzaWduKHsgcmFuZ2U6IHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9LCBhbGxEYXk6IGZhbHNlIH0sIGNlbGwuZXh0cmFEYXRlU3BhbiksXG4gICAgICAgICAgICAgICAgZGF5RWw6IGNvbENvb3Jkcy5lbHNbY29sSW5kZXhdLFxuICAgICAgICAgICAgICAgIHJlY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogY29sQ29vcmRzLmxlZnRzW2NvbEluZGV4XSxcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IGNvbENvb3Jkcy5yaWdodHNbY29sSW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICB0b3A6IHNsYXRUb3AsXG4gICAgICAgICAgICAgICAgICAgIGJvdHRvbTogc2xhdFRvcCArIHNsYXRIZWlnaHQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBsYXllcjogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4gVGltZUNvbHM7XG59KGNvbW1vbi5EYXRlQ29tcG9uZW50KSk7XG5mdW5jdGlvbiBwcm9jZXNzU2xvdE9wdGlvbnMoc2xvdER1cmF0aW9uLCBzbmFwRHVyYXRpb25PdmVycmlkZSkge1xuICAgIHZhciBzbmFwRHVyYXRpb24gPSBzbmFwRHVyYXRpb25PdmVycmlkZSB8fCBzbG90RHVyYXRpb247XG4gICAgdmFyIHNuYXBzUGVyU2xvdCA9IGNvbW1vbi53aG9sZURpdmlkZUR1cmF0aW9ucyhzbG90RHVyYXRpb24sIHNuYXBEdXJhdGlvbik7XG4gICAgaWYgKHNuYXBzUGVyU2xvdCA9PT0gbnVsbCkge1xuICAgICAgICBzbmFwRHVyYXRpb24gPSBzbG90RHVyYXRpb247XG4gICAgICAgIHNuYXBzUGVyU2xvdCA9IDE7XG4gICAgICAgIC8vIFRPRE86IHNheSB3YXJuaW5nP1xuICAgIH1cbiAgICByZXR1cm4geyBzbmFwRHVyYXRpb246IHNuYXBEdXJhdGlvbiwgc25hcHNQZXJTbG90OiBzbmFwc1BlclNsb3QgfTtcbn1cblxudmFyIERheVRpbWVDb2xzU2xpY2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhEYXlUaW1lQ29sc1NsaWNlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEYXlUaW1lQ29sc1NsaWNlcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBEYXlUaW1lQ29sc1NsaWNlci5wcm90b3R5cGUuc2xpY2VSYW5nZSA9IGZ1bmN0aW9uIChyYW5nZSwgZGF5UmFuZ2VzKSB7XG4gICAgICAgIHZhciBzZWdzID0gW107XG4gICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IGRheVJhbmdlcy5sZW5ndGg7IGNvbCArPSAxKSB7XG4gICAgICAgICAgICB2YXIgc2VnUmFuZ2UgPSBjb21tb24uaW50ZXJzZWN0UmFuZ2VzKHJhbmdlLCBkYXlSYW5nZXNbY29sXSk7XG4gICAgICAgICAgICBpZiAoc2VnUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBzZWdzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBzdGFydDogc2VnUmFuZ2Uuc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIGVuZDogc2VnUmFuZ2UuZW5kLFxuICAgICAgICAgICAgICAgICAgICBpc1N0YXJ0OiBzZWdSYW5nZS5zdGFydC52YWx1ZU9mKCkgPT09IHJhbmdlLnN0YXJ0LnZhbHVlT2YoKSxcbiAgICAgICAgICAgICAgICAgICAgaXNFbmQ6IHNlZ1JhbmdlLmVuZC52YWx1ZU9mKCkgPT09IHJhbmdlLmVuZC52YWx1ZU9mKCksXG4gICAgICAgICAgICAgICAgICAgIGNvbDogY29sLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWdzO1xuICAgIH07XG4gICAgcmV0dXJuIERheVRpbWVDb2xzU2xpY2VyO1xufShjb21tb24uU2xpY2VyKSk7XG5cbnZhciBEYXlUaW1lQ29scyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRGF5VGltZUNvbHMsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRGF5VGltZUNvbHMoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5idWlsZERheVJhbmdlcyA9IGNvbW1vbi5tZW1vaXplKGJ1aWxkRGF5UmFuZ2VzKTtcbiAgICAgICAgX3RoaXMuc2xpY2VyID0gbmV3IERheVRpbWVDb2xzU2xpY2VyKCk7XG4gICAgICAgIF90aGlzLnRpbWVDb2xzUmVmID0gY29tbW9uLmNyZWF0ZVJlZigpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIERheVRpbWVDb2xzLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgZGF0ZVByb2ZpbGUgPSBwcm9wcy5kYXRlUHJvZmlsZSwgZGF5VGFibGVNb2RlbCA9IHByb3BzLmRheVRhYmxlTW9kZWw7XG4gICAgICAgIHZhciBpc05vd0luZGljYXRvciA9IGNvbnRleHQub3B0aW9ucy5ub3dJbmRpY2F0b3I7XG4gICAgICAgIHZhciBkYXlSYW5nZXMgPSB0aGlzLmJ1aWxkRGF5UmFuZ2VzKGRheVRhYmxlTW9kZWwsIGRhdGVQcm9maWxlLCBjb250ZXh0LmRhdGVFbnYpO1xuICAgICAgICAvLyBnaXZlIGl0IHRoZSBmaXJzdCByb3cgb2YgY2VsbHNcbiAgICAgICAgLy8gVE9ETzogd291bGQgbW92ZSB0aGlzIGZ1cnRoZXIgZG93biBoaWVyYXJjaHksIGJ1dCBzbGljZU5vd0RhdGUgbmVlZHMgaXRcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uTm93VGltZXIsIHsgdW5pdDogaXNOb3dJbmRpY2F0b3IgPyAnbWludXRlJyA6ICdkYXknIH0sIGZ1bmN0aW9uIChub3dEYXRlLCB0b2RheVJhbmdlKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoVGltZUNvbHMsIHRzbGliLl9fYXNzaWduKHsgcmVmOiBfdGhpcy50aW1lQ29sc1JlZiB9LCBfdGhpcy5zbGljZXIuc2xpY2VQcm9wcyhwcm9wcywgZGF0ZVByb2ZpbGUsIG51bGwsIGNvbnRleHQsIGRheVJhbmdlcyksIHsgZm9yUHJpbnQ6IHByb3BzLmZvclByaW50LCBheGlzOiBwcm9wcy5heGlzLCBkYXRlUHJvZmlsZTogZGF0ZVByb2ZpbGUsIHNsYXRNZXRhczogcHJvcHMuc2xhdE1ldGFzLCBzbG90RHVyYXRpb246IHByb3BzLnNsb3REdXJhdGlvbiwgY2VsbHM6IGRheVRhYmxlTW9kZWwuY2VsbHNbMF0sIHRhYmxlQ29sR3JvdXBOb2RlOiBwcm9wcy50YWJsZUNvbEdyb3VwTm9kZSwgdGFibGVNaW5XaWR0aDogcHJvcHMudGFibGVNaW5XaWR0aCwgY2xpZW50V2lkdGg6IHByb3BzLmNsaWVudFdpZHRoLCBjbGllbnRIZWlnaHQ6IHByb3BzLmNsaWVudEhlaWdodCwgZXhwYW5kUm93czogcHJvcHMuZXhwYW5kUm93cywgbm93RGF0ZTogbm93RGF0ZSwgbm93SW5kaWNhdG9yU2VnczogaXNOb3dJbmRpY2F0b3IgJiYgX3RoaXMuc2xpY2VyLnNsaWNlTm93RGF0ZShub3dEYXRlLCBjb250ZXh0LCBkYXlSYW5nZXMpLCB0b2RheVJhbmdlOiB0b2RheVJhbmdlLCBvblNjcm9sbFRvcFJlcXVlc3Q6IHByb3BzLm9uU2Nyb2xsVG9wUmVxdWVzdCwgb25TbGF0Q29vcmRzOiBwcm9wcy5vblNsYXRDb29yZHMgfSkpKTsgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIERheVRpbWVDb2xzO1xufShjb21tb24uRGF0ZUNvbXBvbmVudCkpO1xuZnVuY3Rpb24gYnVpbGREYXlSYW5nZXMoZGF5VGFibGVNb2RlbCwgZGF0ZVByb2ZpbGUsIGRhdGVFbnYpIHtcbiAgICB2YXIgcmFuZ2VzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IGRheVRhYmxlTW9kZWwuaGVhZGVyRGF0ZXM7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBkYXRlID0gX2FbX2ldO1xuICAgICAgICByYW5nZXMucHVzaCh7XG4gICAgICAgICAgICBzdGFydDogZGF0ZUVudi5hZGQoZGF0ZSwgZGF0ZVByb2ZpbGUuc2xvdE1pblRpbWUpLFxuICAgICAgICAgICAgZW5kOiBkYXRlRW52LmFkZChkYXRlLCBkYXRlUHJvZmlsZS5zbG90TWF4VGltZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmFuZ2VzO1xufVxuXG4vLyBwb3RlbnRpYWwgbmljZSB2YWx1ZXMgZm9yIHRoZSBzbG90LWR1cmF0aW9uIGFuZCBpbnRlcnZhbC1kdXJhdGlvblxuLy8gZnJvbSBsYXJnZXN0IHRvIHNtYWxsZXN0XG52YXIgU1RPQ0tfU1VCX0RVUkFUSU9OUyA9IFtcbiAgICB7IGhvdXJzOiAxIH0sXG4gICAgeyBtaW51dGVzOiAzMCB9LFxuICAgIHsgbWludXRlczogMTUgfSxcbiAgICB7IHNlY29uZHM6IDMwIH0sXG4gICAgeyBzZWNvbmRzOiAxNSB9LFxuXTtcbmZ1bmN0aW9uIGJ1aWxkU2xhdE1ldGFzKHNsb3RNaW5UaW1lLCBzbG90TWF4VGltZSwgZXhwbGljaXRMYWJlbEludGVydmFsLCBzbG90RHVyYXRpb24sIGRhdGVFbnYpIHtcbiAgICB2YXIgZGF5U3RhcnQgPSBuZXcgRGF0ZSgwKTtcbiAgICB2YXIgc2xhdFRpbWUgPSBzbG90TWluVGltZTtcbiAgICB2YXIgc2xhdEl0ZXJhdG9yID0gY29tbW9uLmNyZWF0ZUR1cmF0aW9uKDApO1xuICAgIHZhciBsYWJlbEludGVydmFsID0gZXhwbGljaXRMYWJlbEludGVydmFsIHx8IGNvbXB1dGVMYWJlbEludGVydmFsKHNsb3REdXJhdGlvbik7XG4gICAgdmFyIG1ldGFzID0gW107XG4gICAgd2hpbGUgKGNvbW1vbi5hc1JvdWdoTXMoc2xhdFRpbWUpIDwgY29tbW9uLmFzUm91Z2hNcyhzbG90TWF4VGltZSkpIHtcbiAgICAgICAgdmFyIGRhdGUgPSBkYXRlRW52LmFkZChkYXlTdGFydCwgc2xhdFRpbWUpO1xuICAgICAgICB2YXIgaXNMYWJlbGVkID0gY29tbW9uLndob2xlRGl2aWRlRHVyYXRpb25zKHNsYXRJdGVyYXRvciwgbGFiZWxJbnRlcnZhbCkgIT09IG51bGw7XG4gICAgICAgIG1ldGFzLnB1c2goe1xuICAgICAgICAgICAgZGF0ZTogZGF0ZSxcbiAgICAgICAgICAgIHRpbWU6IHNsYXRUaW1lLFxuICAgICAgICAgICAga2V5OiBkYXRlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICBpc29UaW1lU3RyOiBjb21tb24uZm9ybWF0SXNvVGltZVN0cmluZyhkYXRlKSxcbiAgICAgICAgICAgIGlzTGFiZWxlZDogaXNMYWJlbGVkLFxuICAgICAgICB9KTtcbiAgICAgICAgc2xhdFRpbWUgPSBjb21tb24uYWRkRHVyYXRpb25zKHNsYXRUaW1lLCBzbG90RHVyYXRpb24pO1xuICAgICAgICBzbGF0SXRlcmF0b3IgPSBjb21tb24uYWRkRHVyYXRpb25zKHNsYXRJdGVyYXRvciwgc2xvdER1cmF0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFzO1xufVxuLy8gQ29tcHV0ZXMgYW4gYXV0b21hdGljIHZhbHVlIGZvciBzbG90TGFiZWxJbnRlcnZhbFxuZnVuY3Rpb24gY29tcHV0ZUxhYmVsSW50ZXJ2YWwoc2xvdER1cmF0aW9uKSB7XG4gICAgdmFyIGk7XG4gICAgdmFyIGxhYmVsSW50ZXJ2YWw7XG4gICAgdmFyIHNsb3RzUGVyTGFiZWw7XG4gICAgLy8gZmluZCB0aGUgc21hbGxlc3Qgc3RvY2sgbGFiZWwgaW50ZXJ2YWwgdGhhdCByZXN1bHRzIGluIG1vcmUgdGhhbiBvbmUgc2xvdHMtcGVyLWxhYmVsXG4gICAgZm9yIChpID0gU1RPQ0tfU1VCX0RVUkFUSU9OUy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICBsYWJlbEludGVydmFsID0gY29tbW9uLmNyZWF0ZUR1cmF0aW9uKFNUT0NLX1NVQl9EVVJBVElPTlNbaV0pO1xuICAgICAgICBzbG90c1BlckxhYmVsID0gY29tbW9uLndob2xlRGl2aWRlRHVyYXRpb25zKGxhYmVsSW50ZXJ2YWwsIHNsb3REdXJhdGlvbik7XG4gICAgICAgIGlmIChzbG90c1BlckxhYmVsICE9PSBudWxsICYmIHNsb3RzUGVyTGFiZWwgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbGFiZWxJbnRlcnZhbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2xvdER1cmF0aW9uOyAvLyBmYWxsIGJhY2tcbn1cblxudmFyIERheVRpbWVDb2xzVmlldyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRGF5VGltZUNvbHNWaWV3LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIERheVRpbWVDb2xzVmlldygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmJ1aWxkVGltZUNvbHNNb2RlbCA9IGNvbW1vbi5tZW1vaXplKGJ1aWxkVGltZUNvbHNNb2RlbCk7XG4gICAgICAgIF90aGlzLmJ1aWxkU2xhdE1ldGFzID0gY29tbW9uLm1lbW9pemUoYnVpbGRTbGF0TWV0YXMpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIERheVRpbWVDb2xzVmlldy5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmNvbnRleHQsIG9wdGlvbnMgPSBfYS5vcHRpb25zLCBkYXRlRW52ID0gX2EuZGF0ZUVudiwgZGF0ZVByb2ZpbGVHZW5lcmF0b3IgPSBfYS5kYXRlUHJvZmlsZUdlbmVyYXRvcjtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdmFyIGRhdGVQcm9maWxlID0gcHJvcHMuZGF0ZVByb2ZpbGU7XG4gICAgICAgIHZhciBkYXlUYWJsZU1vZGVsID0gdGhpcy5idWlsZFRpbWVDb2xzTW9kZWwoZGF0ZVByb2ZpbGUsIGRhdGVQcm9maWxlR2VuZXJhdG9yKTtcbiAgICAgICAgdmFyIHNwbGl0UHJvcHMgPSB0aGlzLmFsbERheVNwbGl0dGVyLnNwbGl0UHJvcHMocHJvcHMpO1xuICAgICAgICB2YXIgc2xhdE1ldGFzID0gdGhpcy5idWlsZFNsYXRNZXRhcyhkYXRlUHJvZmlsZS5zbG90TWluVGltZSwgZGF0ZVByb2ZpbGUuc2xvdE1heFRpbWUsIG9wdGlvbnMuc2xvdExhYmVsSW50ZXJ2YWwsIG9wdGlvbnMuc2xvdER1cmF0aW9uLCBkYXRlRW52KTtcbiAgICAgICAgdmFyIGRheU1pbldpZHRoID0gb3B0aW9ucy5kYXlNaW5XaWR0aDtcbiAgICAgICAgdmFyIGhhc0F0dGFjaGVkQXhpcyA9ICFkYXlNaW5XaWR0aDtcbiAgICAgICAgdmFyIGhhc0RldGFjaGVkQXhpcyA9IGRheU1pbldpZHRoO1xuICAgICAgICB2YXIgaGVhZGVyQ29udGVudCA9IG9wdGlvbnMuZGF5SGVhZGVycyAmJiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkRheUhlYWRlciwgeyBkYXRlczogZGF5VGFibGVNb2RlbC5oZWFkZXJEYXRlcywgZGF0ZVByb2ZpbGU6IGRhdGVQcm9maWxlLCBkYXRlc1JlcERpc3RpbmN0RGF5czogdHJ1ZSwgcmVuZGVySW50cm86IGhhc0F0dGFjaGVkQXhpcyA/IHRoaXMucmVuZGVySGVhZEF4aXMgOiBudWxsIH0pKTtcbiAgICAgICAgdmFyIGFsbERheUNvbnRlbnQgPSAob3B0aW9ucy5hbGxEYXlTbG90ICE9PSBmYWxzZSkgJiYgKGZ1bmN0aW9uIChjb250ZW50QXJnKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoZGF5Z3JpZC5EYXlUYWJsZSwgdHNsaWIuX19hc3NpZ24oe30sIHNwbGl0UHJvcHMuYWxsRGF5LCB7IGRhdGVQcm9maWxlOiBkYXRlUHJvZmlsZSwgZGF5VGFibGVNb2RlbDogZGF5VGFibGVNb2RlbCwgbmV4dERheVRocmVzaG9sZDogb3B0aW9ucy5uZXh0RGF5VGhyZXNob2xkLCB0YWJsZU1pbldpZHRoOiBjb250ZW50QXJnLnRhYmxlTWluV2lkdGgsIGNvbEdyb3VwTm9kZTogY29udGVudEFyZy50YWJsZUNvbEdyb3VwTm9kZSwgcmVuZGVyUm93SW50cm86IGhhc0F0dGFjaGVkQXhpcyA/IF90aGlzLnJlbmRlclRhYmxlUm93QXhpcyA6IG51bGwsIHNob3dXZWVrTnVtYmVyczogZmFsc2UsIGV4cGFuZFJvd3M6IGZhbHNlLCBoZWFkZXJBbGlnbkVsUmVmOiBfdGhpcy5oZWFkZXJFbFJlZiwgY2xpZW50V2lkdGg6IGNvbnRlbnRBcmcuY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodDogY29udGVudEFyZy5jbGllbnRIZWlnaHQsIGZvclByaW50OiBwcm9wcy5mb3JQcmludCB9LCBfdGhpcy5nZXRBbGxEYXlNYXhFdmVudFByb3BzKCkpKSk7IH0pO1xuICAgICAgICB2YXIgdGltZUdyaWRDb250ZW50ID0gZnVuY3Rpb24gKGNvbnRlbnRBcmcpIHsgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChEYXlUaW1lQ29scywgdHNsaWIuX19hc3NpZ24oe30sIHNwbGl0UHJvcHMudGltZWQsIHsgZGF5VGFibGVNb2RlbDogZGF5VGFibGVNb2RlbCwgZGF0ZVByb2ZpbGU6IGRhdGVQcm9maWxlLCBheGlzOiBoYXNBdHRhY2hlZEF4aXMsIHNsb3REdXJhdGlvbjogb3B0aW9ucy5zbG90RHVyYXRpb24sIHNsYXRNZXRhczogc2xhdE1ldGFzLCBmb3JQcmludDogcHJvcHMuZm9yUHJpbnQsIHRhYmxlQ29sR3JvdXBOb2RlOiBjb250ZW50QXJnLnRhYmxlQ29sR3JvdXBOb2RlLCB0YWJsZU1pbldpZHRoOiBjb250ZW50QXJnLnRhYmxlTWluV2lkdGgsIGNsaWVudFdpZHRoOiBjb250ZW50QXJnLmNsaWVudFdpZHRoLCBjbGllbnRIZWlnaHQ6IGNvbnRlbnRBcmcuY2xpZW50SGVpZ2h0LCBvblNsYXRDb29yZHM6IF90aGlzLmhhbmRsZVNsYXRDb29yZHMsIGV4cGFuZFJvd3M6IGNvbnRlbnRBcmcuZXhwYW5kUm93cywgb25TY3JvbGxUb3BSZXF1ZXN0OiBfdGhpcy5oYW5kbGVTY3JvbGxUb3BSZXF1ZXN0IH0pKSk7IH07XG4gICAgICAgIHJldHVybiBoYXNEZXRhY2hlZEF4aXNcbiAgICAgICAgICAgID8gdGhpcy5yZW5kZXJIU2Nyb2xsTGF5b3V0KGhlYWRlckNvbnRlbnQsIGFsbERheUNvbnRlbnQsIHRpbWVHcmlkQ29udGVudCwgZGF5VGFibGVNb2RlbC5jb2xDbnQsIGRheU1pbldpZHRoLCBzbGF0TWV0YXMsIHRoaXMuc3RhdGUuc2xhdENvb3JkcylcbiAgICAgICAgICAgIDogdGhpcy5yZW5kZXJTaW1wbGVMYXlvdXQoaGVhZGVyQ29udGVudCwgYWxsRGF5Q29udGVudCwgdGltZUdyaWRDb250ZW50KTtcbiAgICB9O1xuICAgIHJldHVybiBEYXlUaW1lQ29sc1ZpZXc7XG59KFRpbWVDb2xzVmlldykpO1xuZnVuY3Rpb24gYnVpbGRUaW1lQ29sc01vZGVsKGRhdGVQcm9maWxlLCBkYXRlUHJvZmlsZUdlbmVyYXRvcikge1xuICAgIHZhciBkYXlTZXJpZXMgPSBuZXcgY29tbW9uLkRheVNlcmllc01vZGVsKGRhdGVQcm9maWxlLnJlbmRlclJhbmdlLCBkYXRlUHJvZmlsZUdlbmVyYXRvcik7XG4gICAgcmV0dXJuIG5ldyBjb21tb24uRGF5VGFibGVNb2RlbChkYXlTZXJpZXMsIGZhbHNlKTtcbn1cblxudmFyIE9QVElPTl9SRUZJTkVSUyA9IHtcbiAgICBhbGxEYXlTbG90OiBCb29sZWFuLFxufTtcblxudmFyIG1haW4gPSBjb21tb24uY3JlYXRlUGx1Z2luKHtcbiAgICBpbml0aWFsVmlldzogJ3RpbWVHcmlkV2VlaycsXG4gICAgb3B0aW9uUmVmaW5lcnM6IE9QVElPTl9SRUZJTkVSUyxcbiAgICB2aWV3czoge1xuICAgICAgICB0aW1lR3JpZDoge1xuICAgICAgICAgICAgY29tcG9uZW50OiBEYXlUaW1lQ29sc1ZpZXcsXG4gICAgICAgICAgICB1c2VzTWluTWF4VGltZTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbERheVNsb3Q6IHRydWUsXG4gICAgICAgICAgICBzbG90RHVyYXRpb246ICcwMDozMDowMCcsXG4gICAgICAgICAgICBzbG90RXZlbnRPdmVybGFwOiB0cnVlLCAvLyBhIGJhZCBuYW1lLiBjb25mdXNlZCB3aXRoIG92ZXJsYXAvY29uc3RyYWludCBzeXN0ZW1cbiAgICAgICAgfSxcbiAgICAgICAgdGltZUdyaWREYXk6IHtcbiAgICAgICAgICAgIHR5cGU6ICd0aW1lR3JpZCcsXG4gICAgICAgICAgICBkdXJhdGlvbjogeyBkYXlzOiAxIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVHcmlkV2Vlazoge1xuICAgICAgICAgICAgdHlwZTogJ3RpbWVHcmlkJyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB7IHdlZWtzOiAxIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn0pO1xuXG5leHBvcnRzLkRheVRpbWVDb2xzID0gRGF5VGltZUNvbHM7XG5leHBvcnRzLkRheVRpbWVDb2xzU2xpY2VyID0gRGF5VGltZUNvbHNTbGljZXI7XG5leHBvcnRzLkRheVRpbWVDb2xzVmlldyA9IERheVRpbWVDb2xzVmlldztcbmV4cG9ydHMuVGltZUNvbHMgPSBUaW1lQ29scztcbmV4cG9ydHMuVGltZUNvbHNTbGF0c0Nvb3JkcyA9IFRpbWVDb2xzU2xhdHNDb29yZHM7XG5leHBvcnRzLlRpbWVDb2xzVmlldyA9IFRpbWVDb2xzVmlldztcbmV4cG9ydHMuYnVpbGREYXlSYW5nZXMgPSBidWlsZERheVJhbmdlcztcbmV4cG9ydHMuYnVpbGRTbGF0TWV0YXMgPSBidWlsZFNsYXRNZXRhcztcbmV4cG9ydHMuYnVpbGRUaW1lQ29sc01vZGVsID0gYnVpbGRUaW1lQ29sc01vZGVsO1xuZXhwb3J0cy5kZWZhdWx0ID0gbWFpbjtcbiJdLCJtYXBwaW5ncyI6IkFB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 },{"@fullcalendar/common":1,"@fullcalendar/daygrid":5,"tslib":32}],9:[function(require,module,exports){ (function (process){ /** * @popperjs/core v2.11.5 - MIT License */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function getWindow(node) { if (node == null) { return window; } if (node.toString() !== '[object Window]') { var ownerDocument = node.ownerDocument; return ownerDocument ? ownerDocument.defaultView || window : window; } return node; } function isElement(node) { var OwnElement = getWindow(node).Element; return node instanceof OwnElement || node instanceof Element; } function isHTMLElement(node) { var OwnElement = getWindow(node).HTMLElement; return node instanceof OwnElement || node instanceof HTMLElement; } function isShadowRoot(node) { // IE 11 has no ShadowRoot if (typeof ShadowRoot === 'undefined') { return false; } var OwnElement = getWindow(node).ShadowRoot; return node instanceof OwnElement || node instanceof ShadowRoot; } var max = Math.max; var min = Math.min; var round = Math.round; function getBoundingClientRect(element, includeScale) { if (includeScale === void 0) { includeScale = false; } var rect = element.getBoundingClientRect(); var scaleX = 1; var scaleY = 1; if (isHTMLElement(element) && includeScale) { var offsetHeight = element.offsetHeight; var offsetWidth = element.offsetWidth; // Do not attempt to divide by 0, otherwise we get `Infinity` as scale // Fallback to 1 in case both values are `0` if (offsetWidth > 0) { scaleX = round(rect.width) / offsetWidth || 1; } if (offsetHeight > 0) { scaleY = round(rect.height) / offsetHeight || 1; } } return { width: rect.width / scaleX, height: rect.height / scaleY, top: rect.top / scaleY, right: rect.right / scaleX, bottom: rect.bottom / scaleY, left: rect.left / scaleX, x: rect.left / scaleX, y: rect.top / scaleY }; } function getWindowScroll(node) { var win = getWindow(node); var scrollLeft = win.pageXOffset; var scrollTop = win.pageYOffset; return { scrollLeft: scrollLeft, scrollTop: scrollTop }; } function getHTMLElementScroll(element) { return { scrollLeft: element.scrollLeft, scrollTop: element.scrollTop }; } function getNodeScroll(node) { if (node === getWindow(node) || !isHTMLElement(node)) { return getWindowScroll(node); } else { return getHTMLElementScroll(node); } } function getNodeName(element) { return element ? (element.nodeName || '').toLowerCase() : null; } function getDocumentElement(element) { // $FlowFixMe[incompatible-return]: assume body is always available return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing] element.document) || window.document).documentElement; } function getWindowScrollBarX(element) { // If has a CSS width greater than the viewport, then this will be // incorrect for RTL. // Popper 1 is broken in this case and never had a bug report so let's assume // it's not an issue. I don't think anyone ever specifies width on // anyway. // Browsers where the left scrollbar doesn't cause an issue report `0` for // this (e.g. Edge 2019, IE11, Safari) return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; } function getComputedStyle(element) { return getWindow(element).getComputedStyle(element); } function isScrollParent(element) { // Firefox wants us to check `-x` and `-y` variations as well var _getComputedStyle = getComputedStyle(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY; return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); } function isElementScaled(element) { var rect = element.getBoundingClientRect(); var scaleX = round(rect.width) / element.offsetWidth || 1; var scaleY = round(rect.height) / element.offsetHeight || 1; return scaleX !== 1 || scaleY !== 1; } // Returns the composite rect of an element relative to its offsetParent. // Composite means it takes into account transforms as well as layout. function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { if (isFixed === void 0) { isFixed = false; } var isOffsetParentAnElement = isHTMLElement(offsetParent); var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent); var documentElement = getDocumentElement(offsetParent); var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled); var scroll = { scrollLeft: 0, scrollTop: 0 }; var offsets = { x: 0, y: 0 }; if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078 isScrollParent(documentElement)) { scroll = getNodeScroll(offsetParent); } if (isHTMLElement(offsetParent)) { offsets = getBoundingClientRect(offsetParent, true); offsets.x += offsetParent.clientLeft; offsets.y += offsetParent.clientTop; } else if (documentElement) { offsets.x = getWindowScrollBarX(documentElement); } } return { x: rect.left + scroll.scrollLeft - offsets.x, y: rect.top + scroll.scrollTop - offsets.y, width: rect.width, height: rect.height }; } // means it doesn't take into account transforms. function getLayoutRect(element) { var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed. // Fixes https://github.com/popperjs/popper-core/issues/1223 var width = element.offsetWidth; var height = element.offsetHeight; if (Math.abs(clientRect.width - width) <= 1) { width = clientRect.width; } if (Math.abs(clientRect.height - height) <= 1) { height = clientRect.height; } return { x: element.offsetLeft, y: element.offsetTop, width: width, height: height }; } function getParentNode(element) { if (getNodeName(element) === 'html') { return element; } return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle // $FlowFixMe[incompatible-return] // $FlowFixMe[prop-missing] element.assignedSlot || // step into the shadow DOM of the parent of a slotted node element.parentNode || ( // DOM Element detected isShadowRoot(element) ? element.host : null) || // ShadowRoot detected // $FlowFixMe[incompatible-call]: HTMLElement is a Node getDocumentElement(element) // fallback ); } function getScrollParent(node) { if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) { // $FlowFixMe[incompatible-return]: assume body is always available return node.ownerDocument.body; } if (isHTMLElement(node) && isScrollParent(node)) { return node; } return getScrollParent(getParentNode(node)); } /* given a DOM element, return the list of all scroll parents, up the list of ancesors until we get to the top window object. This list is what we attach scroll listeners to, because if any of these parent elements scroll, we'll need to re-calculate the reference element's position. */ function listScrollParents(element, list) { var _element$ownerDocumen; if (list === void 0) { list = []; } var scrollParent = getScrollParent(element); var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); var win = getWindow(scrollParent); var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; var updatedList = list.concat(target); return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here updatedList.concat(listScrollParents(getParentNode(target))); } function isTableElement(element) { return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0; } function getTrueOffsetParent(element) { if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837 getComputedStyle(element).position === 'fixed') { return null; } return element.offsetParent; } // `.offsetParent` reports `null` for fixed elements, while absolute elements // return the containing block function getContainingBlock(element) { var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1; var isIE = navigator.userAgent.indexOf('Trident') !== -1; if (isIE && isHTMLElement(element)) { // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport var elementCss = getComputedStyle(element); if (elementCss.position === 'fixed') { return null; } } var currentNode = getParentNode(element); if (isShadowRoot(currentNode)) { currentNode = currentNode.host; } while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) { var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that // create a containing block. // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') { return currentNode; } else { currentNode = currentNode.parentNode; } } return null; } // Gets the closest ancestor positioned element. Handles some edge cases, // such as table ancestors and cross browser bugs. function getOffsetParent(element) { var window = getWindow(element); var offsetParent = getTrueOffsetParent(element); while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') { offsetParent = getTrueOffsetParent(offsetParent); } if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) { return window; } return offsetParent || getContainingBlock(element) || window; } var top = 'top'; var bottom = 'bottom'; var right = 'right'; var left = 'left'; var auto = 'auto'; var basePlacements = [top, bottom, right, left]; var start = 'start'; var end = 'end'; var clippingParents = 'clippingParents'; var viewport = 'viewport'; var popper = 'popper'; var reference = 'reference'; var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) { return acc.concat([placement + "-" + start, placement + "-" + end]); }, []); var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) { return acc.concat([placement, placement + "-" + start, placement + "-" + end]); }, []); // modifiers that need to read the DOM var beforeRead = 'beforeRead'; var read = 'read'; var afterRead = 'afterRead'; // pure-logic modifiers var beforeMain = 'beforeMain'; var main = 'main'; var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state) var beforeWrite = 'beforeWrite'; var write = 'write'; var afterWrite = 'afterWrite'; var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; function order(modifiers) { var map = new Map(); var visited = new Set(); var result = []; modifiers.forEach(function (modifier) { map.set(modifier.name, modifier); }); // On visiting object, check for its dependencies and visit them recursively function sort(modifier) { visited.add(modifier.name); var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); requires.forEach(function (dep) { if (!visited.has(dep)) { var depModifier = map.get(dep); if (depModifier) { sort(depModifier); } } }); result.push(modifier); } modifiers.forEach(function (modifier) { if (!visited.has(modifier.name)) { // check for visited object sort(modifier); } }); return result; } function orderModifiers(modifiers) { // order based on dependencies var orderedModifiers = order(modifiers); // order based on phase return modifierPhases.reduce(function (acc, phase) { return acc.concat(orderedModifiers.filter(function (modifier) { return modifier.phase === phase; })); }, []); } function debounce(fn) { var pending; return function () { if (!pending) { pending = new Promise(function (resolve) { Promise.resolve().then(function () { pending = undefined; resolve(fn()); }); }); } return pending; }; } function format(str) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } return [].concat(args).reduce(function (p, c) { return p.replace(/%s/, c); }, str); } var INVALID_MODIFIER_ERROR = 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s'; var MISSING_DEPENDENCY_ERROR = 'Popper: modifier "%s" requires "%s", but "%s" modifier is not available'; var VALID_PROPERTIES = ['name', 'enabled', 'phase', 'fn', 'effect', 'requires', 'options']; function validateModifiers(modifiers) { modifiers.forEach(function (modifier) { [].concat(Object.keys(modifier), VALID_PROPERTIES) // IE11-compatible replacement for `new Set(iterable)` .filter(function (value, index, self) { return self.indexOf(value) === index; }).forEach(function (key) { switch (key) { case 'name': if (typeof modifier.name !== 'string') { console.error(format(INVALID_MODIFIER_ERROR, String(modifier.name), '"name"', '"string"', "\"" + String(modifier.name) + "\"")); } break; case 'enabled': if (typeof modifier.enabled !== 'boolean') { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', "\"" + String(modifier.enabled) + "\"")); } break; case 'phase': if (modifierPhases.indexOf(modifier.phase) < 0) { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + modifierPhases.join(', '), "\"" + String(modifier.phase) + "\"")); } break; case 'fn': if (typeof modifier.fn !== 'function') { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"fn"', '"function"', "\"" + String(modifier.fn) + "\"")); } break; case 'effect': if (modifier.effect != null && typeof modifier.effect !== 'function') { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', "\"" + String(modifier.fn) + "\"")); } break; case 'requires': if (modifier.requires != null && !Array.isArray(modifier.requires)) { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', "\"" + String(modifier.requires) + "\"")); } break; case 'requiresIfExists': if (!Array.isArray(modifier.requiresIfExists)) { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requiresIfExists"', '"array"', "\"" + String(modifier.requiresIfExists) + "\"")); } break; case 'options': case 'data': break; default: console.error("PopperJS: an invalid property has been provided to the \"" + modifier.name + "\" modifier, valid properties are " + VALID_PROPERTIES.map(function (s) { return "\"" + s + "\""; }).join(', ') + "; but \"" + key + "\" was provided."); } modifier.requires && modifier.requires.forEach(function (requirement) { if (modifiers.find(function (mod) { return mod.name === requirement; }) == null) { console.error(format(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement)); } }); }); }); } function uniqueBy(arr, fn) { var identifiers = new Set(); return arr.filter(function (item) { var identifier = fn(item); if (!identifiers.has(identifier)) { identifiers.add(identifier); return true; } }); } function getBasePlacement(placement) { return placement.split('-')[0]; } function mergeByName(modifiers) { var merged = modifiers.reduce(function (merged, current) { var existing = merged[current.name]; merged[current.name] = existing ? Object.assign({}, existing, current, { options: Object.assign({}, existing.options, current.options), data: Object.assign({}, existing.data, current.data) }) : current; return merged; }, {}); // IE11 does not support Object.values return Object.keys(merged).map(function (key) { return merged[key]; }); } function getViewportRect(element) { var win = getWindow(element); var html = getDocumentElement(element); var visualViewport = win.visualViewport; var width = html.clientWidth; var height = html.clientHeight; var x = 0; var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper // can be obscured underneath it. // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even // if it isn't open, so if this isn't available, the popper will be detected // to overflow the bottom of the screen too early. if (visualViewport) { width = visualViewport.width; height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently) // In Chrome, it returns a value very close to 0 (+/-) but contains rounding // errors due to floating point numbers, so we need to check precision. // Safari returns a number <= 0, usually < -1 when pinch-zoomed // Feature detection fails in mobile emulation mode in Chrome. // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) < // 0.001 // Fallback here: "Not Safari" userAgent if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { x = visualViewport.offsetLeft; y = visualViewport.offsetTop; } } return { width: width, height: height, x: x + getWindowScrollBarX(element), y: y }; } // of the `` and `` rect bounds if horizontally scrollable function getDocumentRect(element) { var _element$ownerDocumen; var html = getDocumentElement(element); var winScroll = getWindowScroll(element); var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); var x = -winScroll.scrollLeft + getWindowScrollBarX(element); var y = -winScroll.scrollTop; if (getComputedStyle(body || html).direction === 'rtl') { x += max(html.clientWidth, body ? body.clientWidth : 0) - width; } return { width: width, height: height, x: x, y: y }; } function contains(parent, child) { var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method if (parent.contains(child)) { return true; } // then fallback to custom implementation with Shadow DOM support else if (rootNode && isShadowRoot(rootNode)) { var next = child; do { if (next && parent.isSameNode(next)) { return true; } // $FlowFixMe[prop-missing]: need a better way to handle this... next = next.parentNode || next.host; } while (next); } // Give up, the result is false return false; } function rectToClientRect(rect) { return Object.assign({}, rect, { left: rect.x, top: rect.y, right: rect.x + rect.width, bottom: rect.y + rect.height }); } function getInnerBoundingClientRect(element) { var rect = getBoundingClientRect(element); rect.top = rect.top + element.clientTop; rect.left = rect.left + element.clientLeft; rect.bottom = rect.top + element.clientHeight; rect.right = rect.left + element.clientWidth; rect.width = element.clientWidth; rect.height = element.clientHeight; rect.x = rect.left; rect.y = rect.top; return rect; } function getClientRectFromMixedType(element, clippingParent) { return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element))); } // A "clipping parent" is an overflowable container with the characteristic of // clipping (or hiding) overflowing elements with a position different from // `initial` function getClippingParents(element) { var clippingParents = listScrollParents(getParentNode(element)); var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0; var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; if (!isElement(clipperElement)) { return []; } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414 return clippingParents.filter(function (clippingParent) { return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body'; }); } // Gets the maximum area that the element is visible in due to any number of // clipping parents function getClippingRect(element, boundary, rootBoundary) { var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary); var clippingParents = [].concat(mainClippingParents, [rootBoundary]); var firstClippingParent = clippingParents[0]; var clippingRect = clippingParents.reduce(function (accRect, clippingParent) { var rect = getClientRectFromMixedType(element, clippingParent); accRect.top = max(rect.top, accRect.top); accRect.right = min(rect.right, accRect.right); accRect.bottom = min(rect.bottom, accRect.bottom); accRect.left = max(rect.left, accRect.left); return accRect; }, getClientRectFromMixedType(element, firstClippingParent)); clippingRect.width = clippingRect.right - clippingRect.left; clippingRect.height = clippingRect.bottom - clippingRect.top; clippingRect.x = clippingRect.left; clippingRect.y = clippingRect.top; return clippingRect; } function getVariation(placement) { return placement.split('-')[1]; } function getMainAxisFromPlacement(placement) { return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y'; } function computeOffsets(_ref) { var reference = _ref.reference, element = _ref.element, placement = _ref.placement; var basePlacement = placement ? getBasePlacement(placement) : null; var variation = placement ? getVariation(placement) : null; var commonX = reference.x + reference.width / 2 - element.width / 2; var commonY = reference.y + reference.height / 2 - element.height / 2; var offsets; switch (basePlacement) { case top: offsets = { x: commonX, y: reference.y - element.height }; break; case bottom: offsets = { x: commonX, y: reference.y + reference.height }; break; case right: offsets = { x: reference.x + reference.width, y: commonY }; break; case left: offsets = { x: reference.x - element.width, y: commonY }; break; default: offsets = { x: reference.x, y: reference.y }; } var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; if (mainAxis != null) { var len = mainAxis === 'y' ? 'height' : 'width'; switch (variation) { case start: offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2); break; case end: offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2); break; } } return offsets; } function getFreshSideObject() { return { top: 0, right: 0, bottom: 0, left: 0 }; } function mergePaddingObject(paddingObject) { return Object.assign({}, getFreshSideObject(), paddingObject); } function expandToHashMap(value, keys) { return keys.reduce(function (hashMap, key) { hashMap[key] = value; return hashMap; }, {}); } function detectOverflow(state, options) { if (options === void 0) { options = {}; } var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding; var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); var altContext = elementContext === popper ? reference : popper; var popperRect = state.rects.popper; var element = state.elements[altBoundary ? altContext : elementContext]; var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary); var referenceClientRect = getBoundingClientRect(state.elements.reference); var popperOffsets = computeOffsets({ reference: referenceClientRect, element: popperRect, strategy: 'absolute', placement: placement }); var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets)); var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect // 0 or negative = within the clipping rect var overflowOffsets = { top: clippingClientRect.top - elementClientRect.top + paddingObject.top, bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, left: clippingClientRect.left - elementClientRect.left + paddingObject.left, right: elementClientRect.right - clippingClientRect.right + paddingObject.right }; var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element if (elementContext === popper && offsetData) { var offset = offsetData[placement]; Object.keys(overflowOffsets).forEach(function (key) { var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x'; overflowOffsets[key] += offset[axis] * multiply; }); } return overflowOffsets; } var INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.'; var INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.'; var DEFAULT_OPTIONS = { placement: 'bottom', modifiers: [], strategy: 'absolute' }; function areValidElements() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return !args.some(function (element) { return !(element && typeof element.getBoundingClientRect === 'function'); }); } function popperGenerator(generatorOptions) { if (generatorOptions === void 0) { generatorOptions = {}; } var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; return function createPopper(reference, popper, options) { if (options === void 0) { options = defaultOptions; } var state = { placement: 'bottom', orderedModifiers: [], options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), modifiersData: {}, elements: { reference: reference, popper: popper }, attributes: {}, styles: {} }; var effectCleanupFns = []; var isDestroyed = false; var instance = { state: state, setOptions: function setOptions(setOptionsAction) { var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction; cleanupModifierEffects(); state.options = Object.assign({}, defaultOptions, state.options, options); state.scrollParents = { reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [], popper: listScrollParents(popper) }; // Orders the modifiers based on their dependencies and `phase` // properties var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers state.orderedModifiers = orderedModifiers.filter(function (m) { return m.enabled; }); // Validate the provided modifiers so that the consumer will get warned // if one of the modifiers is invalid for any reason if (process.env.NODE_ENV !== "production") { var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) { var name = _ref.name; return name; }); validateModifiers(modifiers); if (getBasePlacement(state.options.placement) === auto) { var flipModifier = state.orderedModifiers.find(function (_ref2) { var name = _ref2.name; return name === 'flip'; }); if (!flipModifier) { console.error(['Popper: "auto" placements require the "flip" modifier be', 'present and enabled to work.'].join(' ')); } } var _getComputedStyle = getComputedStyle(popper), marginTop = _getComputedStyle.marginTop, marginRight = _getComputedStyle.marginRight, marginBottom = _getComputedStyle.marginBottom, marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can // cause bugs with positioning, so we'll warn the consumer if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) { return parseFloat(margin); })) { console.warn(['Popper: CSS "margin" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' ')); } } runModifierEffects(); return instance.update(); }, // Sync update – it will always be executed, even if not necessary. This // is useful for low frequency updates where sync behavior simplifies the // logic. // For high frequency updates (e.g. `resize` and `scroll` events), always // prefer the async Popper#update method forceUpdate: function forceUpdate() { if (isDestroyed) { return; } var _state$elements = state.elements, reference = _state$elements.reference, popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements // anymore if (!areValidElements(reference, popper)) { if (process.env.NODE_ENV !== "production") { console.error(INVALID_ELEMENT_ERROR); } return; } // Store the reference and popper rects to be read by modifiers state.rects = { reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'), popper: getLayoutRect(popper) }; // Modifiers have the ability to reset the current update cycle. The // most common use case for this is the `flip` modifier changing the // placement, which then needs to re-run all the modifiers, because the // logic was previously ran for the previous placement and is therefore // stale/incorrect state.reset = false; state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier // is filled with the initial data specified by the modifier. This means // it doesn't persist and is fresh on each update. // To ensure persistent data, use `${name}#persistent` state.orderedModifiers.forEach(function (modifier) { return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); }); var __debug_loops__ = 0; for (var index = 0; index < state.orderedModifiers.length; index++) { if (process.env.NODE_ENV !== "production") { __debug_loops__ += 1; if (__debug_loops__ > 100) { console.error(INFINITE_LOOP_ERROR); break; } } if (state.reset === true) { state.reset = false; index = -1; continue; } var _state$orderedModifie = state.orderedModifiers[index], fn = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name; if (typeof fn === 'function') { state = fn({ state: state, options: _options, name: name, instance: instance }) || state; } } }, // Async and optimistically optimized update – it will not be executed if // not necessary (debounced to run at most once-per-tick) update: debounce(function () { return new Promise(function (resolve) { instance.forceUpdate(); resolve(state); }); }), destroy: function destroy() { cleanupModifierEffects(); isDestroyed = true; } }; if (!areValidElements(reference, popper)) { if (process.env.NODE_ENV !== "production") { console.error(INVALID_ELEMENT_ERROR); } return instance; } instance.setOptions(options).then(function (state) { if (!isDestroyed && options.onFirstUpdate) { options.onFirstUpdate(state); } }); // Modifiers have the ability to execute arbitrary code before the first // update cycle runs. They will be executed in the same order as the update // cycle. This is useful when a modifier adds some persistent data that // other modifiers need to use, but the modifier is run after the dependent // one. function runModifierEffects() { state.orderedModifiers.forEach(function (_ref3) { var name = _ref3.name, _ref3$options = _ref3.options, options = _ref3$options === void 0 ? {} : _ref3$options, effect = _ref3.effect; if (typeof effect === 'function') { var cleanupFn = effect({ state: state, name: name, instance: instance, options: options }); var noopFn = function noopFn() {}; effectCleanupFns.push(cleanupFn || noopFn); } }); } function cleanupModifierEffects() { effectCleanupFns.forEach(function (fn) { return fn(); }); effectCleanupFns = []; } return instance; }; } var passive = { passive: true }; function effect$2(_ref) { var state = _ref.state, instance = _ref.instance, options = _ref.options; var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize; var window = getWindow(state.elements.popper); var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); if (scroll) { scrollParents.forEach(function (scrollParent) { scrollParent.addEventListener('scroll', instance.update, passive); }); } if (resize) { window.addEventListener('resize', instance.update, passive); } return function () { if (scroll) { scrollParents.forEach(function (scrollParent) { scrollParent.removeEventListener('scroll', instance.update, passive); }); } if (resize) { window.removeEventListener('resize', instance.update, passive); } }; } // eslint-disable-next-line import/no-unused-modules var eventListeners = { name: 'eventListeners', enabled: true, phase: 'write', fn: function fn() {}, effect: effect$2, data: {} }; function popperOffsets(_ref) { var state = _ref.state, name = _ref.name; // Offsets are the actual position the popper needs to have to be // properly positioned near its reference element // This is the most basic placement, and will be adjusted by // the modifiers in the next step state.modifiersData[name] = computeOffsets({ reference: state.rects.reference, element: state.rects.popper, strategy: 'absolute', placement: state.placement }); } // eslint-disable-next-line import/no-unused-modules var popperOffsets$1 = { name: 'popperOffsets', enabled: true, phase: 'read', fn: popperOffsets, data: {} }; var unsetSides = { top: 'auto', right: 'auto', bottom: 'auto', left: 'auto' }; // Round the offsets to the nearest suitable subpixel based on the DPR. // Zooming can change the DPR, but it seems to report a value that will // cleanly divide the values into the appropriate subpixels. function roundOffsetsByDPR(_ref) { var x = _ref.x, y = _ref.y; var win = window; var dpr = win.devicePixelRatio || 1; return { x: round(x * dpr) / dpr || 0, y: round(y * dpr) / dpr || 0 }; } function mapToStyles(_ref2) { var _Object$assign2; var popper = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed; var _offsets$x = offsets.x, x = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y = _offsets$y === void 0 ? 0 : _offsets$y; var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({ x: x, y: y }) : { x: x, y: y }; x = _ref3.x; y = _ref3.y; var hasX = offsets.hasOwnProperty('x'); var hasY = offsets.hasOwnProperty('y'); var sideX = left; var sideY = top; var win = window; if (adaptive) { var offsetParent = getOffsetParent(popper); var heightProp = 'clientHeight'; var widthProp = 'clientWidth'; if (offsetParent === getWindow(popper)) { offsetParent = getDocumentElement(popper); if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') { heightProp = 'scrollHeight'; widthProp = 'scrollWidth'; } } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it offsetParent = offsetParent; if (placement === top || (placement === left || placement === right) && variation === end) { sideY = bottom; var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing] offsetParent[heightProp]; y -= offsetY - popperRect.height; y *= gpuAcceleration ? 1 : -1; } if (placement === left || (placement === top || placement === bottom) && variation === end) { sideX = right; var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing] offsetParent[widthProp]; x -= offsetX - popperRect.width; x *= gpuAcceleration ? 1 : -1; } } var commonStyles = Object.assign({ position: position }, adaptive && unsetSides); var _ref4 = roundOffsets === true ? roundOffsetsByDPR({ x: x, y: y }) : { x: x, y: y }; x = _ref4.x; y = _ref4.y; if (gpuAcceleration) { var _Object$assign; return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); } return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2)); } function computeStyles(_ref5) { var state = _ref5.state, options = _ref5.options; var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; if (process.env.NODE_ENV !== "production") { var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || ''; if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) { return transitionProperty.indexOf(property) >= 0; })) { console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: "transform", "top", "right", "bottom", "left".', '\n\n', 'Disable the "computeStyles" modifier\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\n\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' ')); } } var commonStyles = { placement: getBasePlacement(state.placement), variation: getVariation(state.placement), popper: state.elements.popper, popperRect: state.rects.popper, gpuAcceleration: gpuAcceleration, isFixed: state.options.strategy === 'fixed' }; if (state.modifiersData.popperOffsets != null) { state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { offsets: state.modifiersData.popperOffsets, position: state.options.strategy, adaptive: adaptive, roundOffsets: roundOffsets }))); } if (state.modifiersData.arrow != null) { state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { offsets: state.modifiersData.arrow, position: 'absolute', adaptive: false, roundOffsets: roundOffsets }))); } state.attributes.popper = Object.assign({}, state.attributes.popper, { 'data-popper-placement': state.placement }); } // eslint-disable-next-line import/no-unused-modules var computeStyles$1 = { name: 'computeStyles', enabled: true, phase: 'beforeWrite', fn: computeStyles, data: {} }; // and applies them to the HTMLElements such as popper and arrow function applyStyles(_ref) { var state = _ref.state; Object.keys(state.elements).forEach(function (name) { var style = state.styles[name] || {}; var attributes = state.attributes[name] || {}; var element = state.elements[name]; // arrow is optional + virtual elements if (!isHTMLElement(element) || !getNodeName(element)) { return; } // Flow doesn't support to extend this property, but it's the most // effective way to apply styles to an HTMLElement // $FlowFixMe[cannot-write] Object.assign(element.style, style); Object.keys(attributes).forEach(function (name) { var value = attributes[name]; if (value === false) { element.removeAttribute(name); } else { element.setAttribute(name, value === true ? '' : value); } }); }); } function effect$1(_ref2) { var state = _ref2.state; var initialStyles = { popper: { position: state.options.strategy, left: '0', top: '0', margin: '0' }, arrow: { position: 'absolute' }, reference: {} }; Object.assign(state.elements.popper.style, initialStyles.popper); state.styles = initialStyles; if (state.elements.arrow) { Object.assign(state.elements.arrow.style, initialStyles.arrow); } return function () { Object.keys(state.elements).forEach(function (name) { var element = state.elements[name]; var attributes = state.attributes[name] || {}; var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them var style = styleProperties.reduce(function (style, property) { style[property] = ''; return style; }, {}); // arrow is optional + virtual elements if (!isHTMLElement(element) || !getNodeName(element)) { return; } Object.assign(element.style, style); Object.keys(attributes).forEach(function (attribute) { element.removeAttribute(attribute); }); }); }; } // eslint-disable-next-line import/no-unused-modules var applyStyles$1 = { name: 'applyStyles', enabled: true, phase: 'write', fn: applyStyles, effect: effect$1, requires: ['computeStyles'] }; function distanceAndSkiddingToXY(placement, rects, offset) { var basePlacement = getBasePlacement(placement); var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, { placement: placement })) : offset, skidding = _ref[0], distance = _ref[1]; skidding = skidding || 0; distance = (distance || 0) * invertDistance; return [left, right].indexOf(basePlacement) >= 0 ? { x: distance, y: skidding } : { x: skidding, y: distance }; } function offset(_ref2) { var state = _ref2.state, options = _ref2.options, name = _ref2.name; var _options$offset = options.offset, offset = _options$offset === void 0 ? [0, 0] : _options$offset; var data = placements.reduce(function (acc, placement) { acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset); return acc; }, {}); var _data$state$placement = data[state.placement], x = _data$state$placement.x, y = _data$state$placement.y; if (state.modifiersData.popperOffsets != null) { state.modifiersData.popperOffsets.x += x; state.modifiersData.popperOffsets.y += y; } state.modifiersData[name] = data; } // eslint-disable-next-line import/no-unused-modules var offset$1 = { name: 'offset', enabled: true, phase: 'main', requires: ['popperOffsets'], fn: offset }; var hash$1 = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' }; function getOppositePlacement(placement) { return placement.replace(/left|right|bottom|top/g, function (matched) { return hash$1[matched]; }); } var hash = { start: 'end', end: 'start' }; function getOppositeVariationPlacement(placement) { return placement.replace(/start|end/g, function (matched) { return hash[matched]; }); } function computeAutoPlacement(state, options) { if (options === void 0) { options = {}; } var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; var variation = getVariation(placement); var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) { return getVariation(placement) === variation; }) : basePlacements; var allowedPlacements = placements$1.filter(function (placement) { return allowedAutoPlacements.indexOf(placement) >= 0; }); if (allowedPlacements.length === 0) { allowedPlacements = placements$1; if (process.env.NODE_ENV !== "production") { console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, "auto" cannot be used to allow "bottom-start".', 'Use "auto-start" instead.'].join(' ')); } } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions... var overflows = allowedPlacements.reduce(function (acc, placement) { acc[placement] = detectOverflow(state, { placement: placement, boundary: boundary, rootBoundary: rootBoundary, padding: padding })[getBasePlacement(placement)]; return acc; }, {}); return Object.keys(overflows).sort(function (a, b) { return overflows[a] - overflows[b]; }); } function getExpandedFallbackPlacements(placement) { if (getBasePlacement(placement) === auto) { return []; } var oppositePlacement = getOppositePlacement(placement); return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; } function flip(_ref) { var state = _ref.state, options = _ref.options, name = _ref.name; if (state.modifiersData[name]._skip) { return; } var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements; var preferredPlacement = state.options.placement; var basePlacement = getBasePlacement(preferredPlacement); var isBasePlacement = basePlacement === preferredPlacement; var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) { return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, { placement: placement, boundary: boundary, rootBoundary: rootBoundary, padding: padding, flipVariations: flipVariations, allowedAutoPlacements: allowedAutoPlacements }) : placement); }, []); var referenceRect = state.rects.reference; var popperRect = state.rects.popper; var checksMap = new Map(); var makeFallbackChecks = true; var firstFittingPlacement = placements[0]; for (var i = 0; i < placements.length; i++) { var placement = placements[i]; var _basePlacement = getBasePlacement(placement); var isStartVariation = getVariation(placement) === start; var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; var len = isVertical ? 'width' : 'height'; var overflow = detectOverflow(state, { placement: placement, boundary: boundary, rootBoundary: rootBoundary, altBoundary: altBoundary, padding: padding }); var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; if (referenceRect[len] > popperRect[len]) { mainVariationSide = getOppositePlacement(mainVariationSide); } var altVariationSide = getOppositePlacement(mainVariationSide); var checks = []; if (checkMainAxis) { checks.push(overflow[_basePlacement] <= 0); } if (checkAltAxis) { checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); } if (checks.every(function (check) { return check; })) { firstFittingPlacement = placement; makeFallbackChecks = false; break; } checksMap.set(placement, checks); } if (makeFallbackChecks) { // `2` may be desired in some cases – research later var numberOfChecks = flipVariations ? 3 : 1; var _loop = function _loop(_i) { var fittingPlacement = placements.find(function (placement) { var checks = checksMap.get(placement); if (checks) { return checks.slice(0, _i).every(function (check) { return check; }); } }); if (fittingPlacement) { firstFittingPlacement = fittingPlacement; return "break"; } }; for (var _i = numberOfChecks; _i > 0; _i--) { var _ret = _loop(_i); if (_ret === "break") break; } } if (state.placement !== firstFittingPlacement) { state.modifiersData[name]._skip = true; state.placement = firstFittingPlacement; state.reset = true; } } // eslint-disable-next-line import/no-unused-modules var flip$1 = { name: 'flip', enabled: true, phase: 'main', fn: flip, requiresIfExists: ['offset'], data: { _skip: false } }; function getAltAxis(axis) { return axis === 'x' ? 'y' : 'x'; } function within(min$1, value, max$1) { return max(min$1, min(value, max$1)); } function withinMaxClamp(min, value, max) { var v = within(min, value, max); return v > max ? max : v; } function preventOverflow(_ref) { var state = _ref.state, options = _ref.options, name = _ref.name; var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; var overflow = detectOverflow(state, { boundary: boundary, rootBoundary: rootBoundary, padding: padding, altBoundary: altBoundary }); var basePlacement = getBasePlacement(state.placement); var variation = getVariation(state.placement); var isBasePlacement = !variation; var mainAxis = getMainAxisFromPlacement(basePlacement); var altAxis = getAltAxis(mainAxis); var popperOffsets = state.modifiersData.popperOffsets; var referenceRect = state.rects.reference; var popperRect = state.rects.popper; var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, { placement: state.placement })) : tetherOffset; var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? { mainAxis: tetherOffsetValue, altAxis: tetherOffsetValue } : Object.assign({ mainAxis: 0, altAxis: 0 }, tetherOffsetValue); var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null; var data = { x: 0, y: 0 }; if (!popperOffsets) { return; } if (checkMainAxis) { var _offsetModifierState$; var mainSide = mainAxis === 'y' ? top : left; var altSide = mainAxis === 'y' ? bottom : right; var len = mainAxis === 'y' ? 'height' : 'width'; var offset = popperOffsets[mainAxis]; var min$1 = offset + overflow[mainSide]; var max$1 = offset - overflow[altSide]; var additive = tether ? -popperRect[len] / 2 : 0; var minLen = variation === start ? referenceRect[len] : popperRect[len]; var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go // outside the reference bounds var arrowElement = state.elements.arrow; var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { width: 0, height: 0 }; var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject(); var arrowPaddingMin = arrowPaddingObject[mainSide]; var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want // to include its full size in the calculation. If the reference is small // and near the edge of a boundary, the popper can overflow even if the // reference is not overflowing as well (e.g. virtual elements with no // width or height) var arrowLen = within(0, referenceRect[len], arrowRect[len]); var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis; var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis; var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0; var tetherMin = offset + minOffset - offsetModifierValue - clientOffset; var tetherMax = offset + maxOffset - offsetModifierValue; var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1); popperOffsets[mainAxis] = preventedOffset; data[mainAxis] = preventedOffset - offset; } if (checkAltAxis) { var _offsetModifierState$2; var _mainSide = mainAxis === 'x' ? top : left; var _altSide = mainAxis === 'x' ? bottom : right; var _offset = popperOffsets[altAxis]; var _len = altAxis === 'y' ? 'height' : 'width'; var _min = _offset + overflow[_mainSide]; var _max = _offset - overflow[_altSide]; var isOriginSide = [top, left].indexOf(basePlacement) !== -1; var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0; var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis; var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max; var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max); popperOffsets[altAxis] = _preventedOffset; data[altAxis] = _preventedOffset - _offset; } state.modifiersData[name] = data; } // eslint-disable-next-line import/no-unused-modules var preventOverflow$1 = { name: 'preventOverflow', enabled: true, phase: 'main', fn: preventOverflow, requiresIfExists: ['offset'] }; var toPaddingObject = function toPaddingObject(padding, state) { padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, { placement: state.placement })) : padding; return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); }; function arrow(_ref) { var _state$modifiersData$; var state = _ref.state, name = _ref.name, options = _ref.options; var arrowElement = state.elements.arrow; var popperOffsets = state.modifiersData.popperOffsets; var basePlacement = getBasePlacement(state.placement); var axis = getMainAxisFromPlacement(basePlacement); var isVertical = [left, right].indexOf(basePlacement) >= 0; var len = isVertical ? 'height' : 'width'; if (!arrowElement || !popperOffsets) { return; } var paddingObject = toPaddingObject(options.padding, state); var arrowRect = getLayoutRect(arrowElement); var minProp = axis === 'y' ? top : left; var maxProp = axis === 'y' ? bottom : right; var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len]; var startDiff = popperOffsets[axis] - state.rects.reference[axis]; var arrowOffsetParent = getOffsetParent(arrowElement); var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is // outside of the popper bounds var min = paddingObject[minProp]; var max = clientSize - arrowRect[len] - paddingObject[maxProp]; var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; var offset = within(min, center, max); // Prevents breaking syntax highlighting... var axisProp = axis; state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$); } function effect(_ref2) { var state = _ref2.state, options = _ref2.options; var _options$element = options.element, arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element; if (arrowElement == null) { return; } // CSS selector if (typeof arrowElement === 'string') { arrowElement = state.elements.popper.querySelector(arrowElement); if (!arrowElement) { return; } } if (process.env.NODE_ENV !== "production") { if (!isHTMLElement(arrowElement)) { console.error(['Popper: "arrow" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' ')); } } if (!contains(state.elements.popper, arrowElement)) { if (process.env.NODE_ENV !== "production") { console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper', 'element.'].join(' ')); } return; } state.elements.arrow = arrowElement; } // eslint-disable-next-line import/no-unused-modules var arrow$1 = { name: 'arrow', enabled: true, phase: 'main', fn: arrow, effect: effect, requires: ['popperOffsets'], requiresIfExists: ['preventOverflow'] }; function getSideOffsets(overflow, rect, preventedOffsets) { if (preventedOffsets === void 0) { preventedOffsets = { x: 0, y: 0 }; } return { top: overflow.top - rect.height - preventedOffsets.y, right: overflow.right - rect.width + preventedOffsets.x, bottom: overflow.bottom - rect.height + preventedOffsets.y, left: overflow.left - rect.width - preventedOffsets.x }; } function isAnySideFullyClipped(overflow) { return [top, right, bottom, left].some(function (side) { return overflow[side] >= 0; }); } function hide(_ref) { var state = _ref.state, name = _ref.name; var referenceRect = state.rects.reference; var popperRect = state.rects.popper; var preventedOffsets = state.modifiersData.preventOverflow; var referenceOverflow = detectOverflow(state, { elementContext: 'reference' }); var popperAltOverflow = detectOverflow(state, { altBoundary: true }); var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); state.modifiersData[name] = { referenceClippingOffsets: referenceClippingOffsets, popperEscapeOffsets: popperEscapeOffsets, isReferenceHidden: isReferenceHidden, hasPopperEscaped: hasPopperEscaped }; state.attributes.popper = Object.assign({}, state.attributes.popper, { 'data-popper-reference-hidden': isReferenceHidden, 'data-popper-escaped': hasPopperEscaped }); } // eslint-disable-next-line import/no-unused-modules var hide$1 = { name: 'hide', enabled: true, phase: 'main', requiresIfExists: ['preventOverflow'], fn: hide }; var defaultModifiers$1 = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1]; var createPopper$1 = /*#__PURE__*/popperGenerator({ defaultModifiers: defaultModifiers$1 }); // eslint-disable-next-line import/no-unused-modules var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1]; var createPopper = /*#__PURE__*/popperGenerator({ defaultModifiers: defaultModifiers }); // eslint-disable-next-line import/no-unused-modules exports.applyStyles = applyStyles$1; exports.arrow = arrow$1; exports.computeStyles = computeStyles$1; exports.createPopper = createPopper; exports.createPopperLite = createPopper$1; exports.defaultModifiers = defaultModifiers; exports.detectOverflow = detectOverflow; exports.eventListeners = eventListeners; exports.flip = flip$1; exports.hide = hide$1; exports.offset = offset$1; exports.popperGenerator = popperGenerator; exports.popperOffsets = popperOffsets$1; exports.preventOverflow = preventOverflow$1; //# sourceMappingURL=data:application/json;charset=utf-8;base64,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QU5qQixDQUFvQjNHLElBQXBCMkcsSUFBNEI7SUFDMUJ5TCx3QkFBd0IsRUFBeEJBLHdCQUQwQjtJQUUxQkMsbUJBQW1CLEVBQW5CQSxtQkFGMEI7SUFHMUJDLGlCQUFpQixFQUFqQkEsaUJBSDBCO0lBSTFCQyxnQkFBZ0IsRUFBaEJBO0VBSjBCLENBQTVCNUw7RUFPQUEsS0FBSyxDQUFDK0IsVUFBTi9CLENBQWlCdEksTUFBakJzSSxxQkFDS0EsS0FBSyxDQUFDK0IsVUFBTi9CLENBQWlCdEksTUFEdEI7SUFFRSxnQ0FBZ0NpVSxpQkFGbEM7SUFHRSx1QkFBdUJDO0VBSHpCO0FBS0QsQyxDQUFBOzs7QUFJRCxhQUFnQjtFQUNkdlMsSUFBSSxFQUFFLE1BRFE7RUFFZHdDLE9BQU8sRUFBRSxJQUZLO0VBR2Q1QixLQUFLLEVBQUUsTUFITztFQUlkUixnQkFBZ0IsRUFBRSxDQUFDLGlCQUFELENBSko7RUFLZFUsRUFBRSxFQUFFbVI7QUFMVSxDQUFoQjtBQzNEQSxJQUFNMUosa0JBQWdCLEdBQUcsQ0FDdkJpSyxjQUR1QixFQUV2QmxMLGVBRnVCLEVBR3ZCc0UsZUFIdUIsRUFJdkJJLGFBSnVCLENBQXpCO0lBT012RCxjQUFZLGdCQUFHSixlQUFlLENBQUM7RUFBRUUsZ0JBQWdCLEVBQWhCQTtBQUFGLENBQUQsRSxDQUFBOztJQ0Y5QkEsZ0JBQWdCLEdBQUcsQ0FDdkJpSyxjQUR1QixFQUV2QmxMLGVBRnVCLEVBR3ZCc0UsZUFIdUIsRUFJdkJJLGFBSnVCLEVBS3ZCbkUsUUFMdUIsRUFNdkI2RixNQU51QixFQU92QjhCLGlCQVB1QixFQVF2QnpELE9BUnVCLEVBU3ZCa0csTUFUdUI7SUFZbkJ4SixZQUFZLGdCQUFHSixlQUFlLENBQUM7RUFBRUUsZ0JBQWdCLEVBQWhCQTtBQUFGLENBQUQsRSxDQUFBIiwibmFtZXMiOlsiZ2V0V2luZG93Iiwibm9kZSIsIndpbmRvdyIsInRvU3RyaW5nIiwib3duZXJEb2N1bWVudCIsImRlZmF1bHRWaWV3IiwiaXNFbGVtZW50IiwiT3duRWxlbWVudCIsIkVsZW1lbnQiLCJpc0hUTUxFbGVtZW50IiwiSFRNTEVsZW1lbnQiLCJpc1NoYWRvd1Jvb3QiLCJTaGFkb3dSb290IiwibWF4IiwiTWF0aCIsIm1pbiIsInJvdW5kIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiZWxlbWVudCIsImluY2x1ZGVTY2FsZSIsInJlY3QiLCJzY2FsZVgiLCJzY2FsZVkiLCJvZmZzZXRIZWlnaHQiLCJvZmZzZXRXaWR0aCIsIndpZHRoIiwiaGVpZ2h0IiwidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0IiwieCIsInkiLCJnZXRXaW5kb3dTY3JvbGwiLCJ3aW4iLCJzY3JvbGxMZWZ0IiwicGFnZVhPZmZzZXQiLCJzY3JvbGxUb3AiLCJwYWdlWU9mZnNldCIsImdldEhUTUxFbGVtZW50U2Nyb2xsIiwiZ2V0Tm9kZVNjcm9sbCIsImdldE5vZGVOYW1lIiwibm9kZU5hbWUiLCJ0b0xvd2VyQ2FzZSIsImdldERvY3VtZW50RWxlbWVudCIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50IiwiZ2V0V2luZG93U2Nyb2xsQmFyWCIsImdldENvbXB1dGVkU3R5bGUiLCJpc1Njcm9sbFBhcmVudCIsIm92ZXJmbG93Iiwib3ZlcmZsb3dYIiwib3ZlcmZsb3dZIiwidGVzdCIsImlzRWxlbWVudFNjYWxlZCIsImdldENvbXBvc2l0ZVJlY3QiLCJlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCIsIm9mZnNldFBhcmVudCIsImlzRml4ZWQiLCJpc09mZnNldFBhcmVudEFuRWxlbWVudCIsIm9mZnNldFBhcmVudElzU2NhbGVkIiwic2Nyb2xsIiwib2Zmc2V0cyIsImNsaWVudExlZnQiLCJjbGllbnRUb3AiLCJnZXRMYXlvdXRSZWN0IiwiY2xpZW50UmVjdCIsImFicyIsIm9mZnNldExlZnQiLCJvZmZzZXRUb3AiLCJnZXRQYXJlbnROb2RlIiwiYXNzaWduZWRTbG90IiwicGFyZW50Tm9kZSIsImhvc3QiLCJnZXRTY3JvbGxQYXJlbnQiLCJpbmRleE9mIiwiYm9keSIsImxpc3RTY3JvbGxQYXJlbnRzIiwibGlzdCIsInNjcm9sbFBhcmVudCIsImlzQm9keSIsIl9lbGVtZW50JG93bmVyRG9jdW1lbiIsInRhcmdldCIsImNvbmNhdCIsInZpc3VhbFZpZXdwb3J0IiwidXBkYXRlZExpc3QiLCJpc1RhYmxlRWxlbWVudCIsImdldFRydWVPZmZzZXRQYXJlbnQiLCJwb3NpdGlvbiIsImdldENvbnRhaW5pbmdCbG9jayIsImlzRmlyZWZveCIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImlzSUUiLCJlbGVtZW50Q3NzIiwiY3VycmVudE5vZGUiLCJjc3MiLCJ0cmFuc2Zvcm0iLCJwZXJzcGVjdGl2ZSIsImNvbnRhaW4iLCJ3aWxsQ2hhbmdlIiwiZmlsdGVyIiwiZ2V0T2Zmc2V0UGFyZW50IiwiYXV0byIsImJhc2VQbGFjZW1lbnRzIiwic3RhcnQiLCJlbmQiLCJjbGlwcGluZ1BhcmVudHMiLCJ2aWV3cG9ydCIsInBvcHBlciIsInJlZmVyZW5jZSIsInZhcmlhdGlvblBsYWNlbWVudHMiLCJyZWR1Y2UiLCJhY2MiLCJwbGFjZW1lbnQiLCJwbGFjZW1lbnRzIiwiYmVmb3JlUmVhZCIsInJlYWQiLCJhZnRlclJlYWQiLCJiZWZvcmVNYWluIiwibWFpbiIsImFmdGVyTWFpbiIsImJlZm9yZVdyaXRlIiwid3JpdGUiLCJhZnRlcldyaXRlIiwibW9kaWZpZXJQaGFzZXMiLCJvcmRlciIsIm1vZGlmaWVycyIsIm1hcCIsIk1hcCIsInZpc2l0ZWQiLCJTZXQiLCJyZXN1bHQiLCJmb3JFYWNoIiwic2V0IiwibW9kaWZpZXIiLCJuYW1lIiwic29ydCIsImFkZCIsInJlcXVpcmVzIiwicmVxdWlyZXNJZkV4aXN0cyIsImhhcyIsImRlcCIsImRlcE1vZGlmaWVyIiwiZ2V0IiwicHVzaCIsIm9yZGVyTW9kaWZpZXJzIiwib3JkZXJlZE1vZGlmaWVycyIsInBoYXNlIiwiZGVib3VuY2UiLCJmbiIsInBlbmRpbmciLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJ1bmRlZmluZWQiLCJmb3JtYXQiLCJzdHIiLCJhcmdzIiwiYXJndW1lbnRzIiwicCIsImMiLCJyZXBsYWNlIiwiSU5WQUxJRF9NT0RJRklFUl9FUlJPUiIsIk1JU1NJTkdfREVQRU5ERU5DWV9FUlJPUiIsIlZBTElEX1BST1BFUlRJRVMiLCJ2YWxpZGF0ZU1vZGlmaWVycyIsIk9iamVjdCIsImtleXMiLCJ2YWx1ZSIsImluZGV4Iiwic2VsZiIsImtleSIsImNvbnNvbGUiLCJlcnJvciIsIlN0cmluZyIsImVuYWJsZWQiLCJqb2luIiwiZWZmZWN0IiwiQXJyYXkiLCJpc0FycmF5IiwicyIsInJlcXVpcmVtZW50IiwiZmluZCIsIm1vZCIsInVuaXF1ZUJ5IiwiYXJyIiwiaWRlbnRpZmllcnMiLCJpZGVudGlmaWVyIiwiaXRlbSIsImdldEJhc2VQbGFjZW1lbnQiLCJzcGxpdCIsIm1lcmdlQnlOYW1lIiwibWVyZ2VkIiwiY3VycmVudCIsImV4aXN0aW5nIiwib3B0aW9ucyIsImRhdGEiLCJnZXRWaWV3cG9ydFJlY3QiLCJodG1sIiwiY2xpZW50V2lkdGgiLCJjbGllbnRIZWlnaHQiLCJnZXREb2N1bWVudFJlY3QiLCJ3aW5TY3JvbGwiLCJzY3JvbGxXaWR0aCIsInNjcm9sbEhlaWdodCIsImRpcmVjdGlvbiIsImNvbnRhaW5zIiwicGFyZW50IiwiY2hpbGQiLCJyb290Tm9kZSIsImdldFJvb3ROb2RlIiwibmV4dCIsImlzU2FtZU5vZGUiLCJyZWN0VG9DbGllbnRSZWN0IiwiZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QiLCJnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZSIsImNsaXBwaW5nUGFyZW50IiwiZ2V0Q2xpcHBpbmdQYXJlbnRzIiwiY2FuRXNjYXBlQ2xpcHBpbmciLCJjbGlwcGVyRWxlbWVudCIsImdldENsaXBwaW5nUmVjdCIsImJvdW5kYXJ5Iiwicm9vdEJvdW5kYXJ5IiwibWFpbkNsaXBwaW5nUGFyZW50cyIsImZpcnN0Q2xpcHBpbmdQYXJlbnQiLCJjbGlwcGluZ1JlY3QiLCJhY2NSZWN0IiwiZ2V0VmFyaWF0aW9uIiwiZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IiwiY29tcHV0ZU9mZnNldHMiLCJiYXNlUGxhY2VtZW50IiwidmFyaWF0aW9uIiwiY29tbW9uWCIsImNvbW1vblkiLCJtYWluQXhpcyIsImxlbiIsImdldEZyZXNoU2lkZU9iamVjdCIsIm1lcmdlUGFkZGluZ09iamVjdCIsInBhZGRpbmdPYmplY3QiLCJleHBhbmRUb0hhc2hNYXAiLCJoYXNoTWFwIiwiZGV0ZWN0T3ZlcmZsb3ciLCJzdGF0ZSIsImVsZW1lbnRDb250ZXh0IiwiYWx0Qm91bmRhcnkiLCJwYWRkaW5nIiwiYWx0Q29udGV4dCIsInBvcHBlclJlY3QiLCJyZWN0cyIsImVsZW1lbnRzIiwiY2xpcHBpbmdDbGllbnRSZWN0IiwiY29udGV4dEVsZW1lbnQiLCJyZWZlcmVuY2VDbGllbnRSZWN0IiwicG9wcGVyT2Zmc2V0cyIsInN0cmF0ZWd5IiwicG9wcGVyQ2xpZW50UmVjdCIsImVsZW1lbnRDbGllbnRSZWN0Iiwib3ZlcmZsb3dPZmZzZXRzIiwib2Zmc2V0RGF0YSIsIm1vZGlmaWVyc0RhdGEiLCJvZmZzZXQiLCJtdWx0aXBseSIsImF4aXMiLCJJTlZBTElEX0VMRU1FTlRfRVJST1IiLCJJTkZJTklURV9MT09QX0VSUk9SIiwiREVGQVVMVF9PUFRJT05TIiwiYXJlVmFsaWRFbGVtZW50cyIsInNvbWUiLCJwb3BwZXJHZW5lcmF0b3IiLCJnZW5lcmF0b3JPcHRpb25zIiwiZGVmYXVsdE1vZGlmaWVycyIsImRlZmF1bHRPcHRpb25zIiwiY3JlYXRlUG9wcGVyIiwiYXR0cmlidXRlcyIsInN0eWxlcyIsImVmZmVjdENsZWFudXBGbnMiLCJpc0Rlc3Ryb3llZCIsImluc3RhbmNlIiwic2V0T3B0aW9ucyIsInNldE9wdGlvbnNBY3Rpb24iLCJjbGVhbnVwTW9kaWZpZXJFZmZlY3RzIiwic2Nyb2xsUGFyZW50cyIsIm0iLCJmbGlwTW9kaWZpZXIiLCJtYXJnaW5Ub3AiLCJtYXJnaW5SaWdodCIsIm1hcmdpbkJvdHRvbSIsIm1hcmdpbkxlZnQiLCJtYXJnaW4iLCJwYXJzZUZsb2F0Iiwid2FybiIsInJ1bk1vZGlmaWVyRWZmZWN0cyIsInVwZGF0ZSIsImZvcmNlVXBkYXRlIiwicmVzZXQiLCJfX2RlYnVnX2xvb3BzX18iLCJsZW5ndGgiLCJkZXN0cm95Iiwib25GaXJzdFVwZGF0ZSIsImNsZWFudXBGbiIsIm5vb3BGbiIsInBhc3NpdmUiLCJyZXNpemUiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInVuc2V0U2lkZXMiLCJyb3VuZE9mZnNldHNCeURQUiIsImRwciIsImRldmljZVBpeGVsUmF0aW8iLCJtYXBUb1N0eWxlcyIsImdwdUFjY2VsZXJhdGlvbiIsImFkYXB0aXZlIiwicm91bmRPZmZzZXRzIiwiaGFzWCIsImhhc093blByb3BlcnR5IiwiaGFzWSIsInNpZGVYIiwic2lkZVkiLCJoZWlnaHRQcm9wIiwid2lkdGhQcm9wIiwib2Zmc2V0WSIsIm9mZnNldFgiLCJjb21tb25TdHlsZXMiLCJjb21wdXRlU3R5bGVzIiwidHJhbnNpdGlvblByb3BlcnR5IiwicHJvcGVydHkiLCJhcnJvdyIsImFwcGx5U3R5bGVzIiwic3R5bGUiLCJhc3NpZ24iLCJyZW1vdmVBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJpbml0aWFsU3R5bGVzIiwic3R5bGVQcm9wZXJ0aWVzIiwiYXR0cmlidXRlIiwiZGlzdGFuY2VBbmRTa2lkZGluZ1RvWFkiLCJpbnZlcnREaXN0YW5jZSIsInNraWRkaW5nIiwiZGlzdGFuY2UiLCJoYXNoIiwiZ2V0T3Bwb3NpdGVQbGFjZW1lbnQiLCJtYXRjaGVkIiwiZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQiLCJjb21wdXRlQXV0b1BsYWNlbWVudCIsImZsaXBWYXJpYXRpb25zIiwiYWxsb3dlZEF1dG9QbGFjZW1lbnRzIiwiYWxsUGxhY2VtZW50cyIsImFsbG93ZWRQbGFjZW1lbnRzIiwib3ZlcmZsb3dzIiwiYSIsImIiLCJnZXRFeHBhbmRlZEZhbGxiYWNrUGxhY2VtZW50cyIsIm9wcG9zaXRlUGxhY2VtZW50IiwiZmxpcCIsIl9za2lwIiwiY2hlY2tNYWluQXhpcyIsImFsdEF4aXMiLCJjaGVja0FsdEF4aXMiLCJzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMiLCJmYWxsYmFja1BsYWNlbWVudHMiLCJwcmVmZXJyZWRQbGFjZW1lbnQiLCJpc0Jhc2VQbGFjZW1lbnQiLCJyZWZlcmVuY2VSZWN0IiwiY2hlY2tzTWFwIiwibWFrZUZhbGxiYWNrQ2hlY2tzIiwiZmlyc3RGaXR0aW5nUGxhY2VtZW50IiwiaSIsImlzU3RhcnRWYXJpYXRpb24iLCJpc1ZlcnRpY2FsIiwibWFpblZhcmlhdGlvblNpZGUiLCJhbHRWYXJpYXRpb25TaWRlIiwiY2hlY2tzIiwiZXZlcnkiLCJjaGVjayIsIm51bWJlck9mQ2hlY2tzIiwiZml0dGluZ1BsYWNlbWVudCIsInNsaWNlIiwiZ2V0QWx0QXhpcyIsIndpdGhpbiIsIm1hdGhNYXgiLCJtYXRoTWluIiwid2l0aGluTWF4Q2xhbXAiLCJ2IiwicHJldmVudE92ZXJmbG93IiwidGV0aGVyIiwidGV0aGVyT2Zmc2V0IiwidGV0aGVyT2Zmc2V0VmFsdWUiLCJub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUiLCJvZmZzZXRNb2RpZmllclN0YXRlIiwibWFpblNpZGUiLCJhbHRTaWRlIiwiYWRkaXRpdmUiLCJtaW5MZW4iLCJtYXhMZW4iLCJhcnJvd0VsZW1lbnQiLCJhcnJvd1JlY3QiLCJhcnJvd1BhZGRpbmdPYmplY3QiLCJhcnJvd1BhZGRpbmdNaW4iLCJhcnJvd1BhZGRpbmdNYXgiLCJhcnJvd0xlbiIsIm1pbk9mZnNldCIsIm1heE9mZnNldCIsImFycm93T2Zmc2V0UGFyZW50IiwiY2xpZW50T2Zmc2V0Iiwib2Zmc2V0TW9kaWZpZXJWYWx1ZSIsInRldGhlck1pbiIsInRldGhlck1heCIsInByZXZlbnRlZE9mZnNldCIsImlzT3JpZ2luU2lkZSIsInRvUGFkZGluZ09iamVjdCIsIm1pblByb3AiLCJtYXhQcm9wIiwiZW5kRGlmZiIsInN0YXJ0RGlmZiIsImNsaWVudFNpemUiLCJjZW50ZXJUb1JlZmVyZW5jZSIsImNlbnRlciIsImF4aXNQcm9wIiwiY2VudGVyT2Zmc2V0IiwicXVlcnlTZWxlY3RvciIsImdldFNpZGVPZmZzZXRzIiwicHJldmVudGVkT2Zmc2V0cyIsImlzQW55U2lkZUZ1bGx5Q2xpcHBlZCIsInNpZGUiLCJoaWRlIiwicmVmZXJlbmNlT3ZlcmZsb3ciLCJwb3BwZXJBbHRPdmVyZmxvdyIsInJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyIsInBvcHBlckVzY2FwZU9mZnNldHMiLCJpc1JlZmVyZW5jZUhpZGRlbiIsImhhc1BvcHBlckVzY2FwZWQiLCJldmVudExpc3RlbmVycyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kb20tdXRpbHMvZ2V0V2luZG93LmpzIiwiLi4vLi4vc3JjL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzIiwiLi4vLi4vc3JjL3V0aWxzL21hdGguanMiLCIuLi8uLi9zcmMvZG9tLXV0aWxzL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qcyIsIi4uLy4uL3NyYy9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsLmpzIiwiLi4vLi4vc3JjL2RvbS11dGlscy9nZXRIVE1MRWxlbWVudFNjcm9sbC5qcyIsIi4uLy4uL3NyYy9kb20tdXRpbHMvZ2V0Tm9kZVNjcm9sbC5qcyIsIi4uLy4uL3NyYy9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanMiLCIuLi8uLi9zcmMvZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qcyIsIi4uLy4uL3NyYy9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsQmFyWC5qcyIsIi4uLy4uL3NyYy9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qcyIsIi4uLy4uL3NyYy9kb20tdXRpbHMvaXNTY3JvbGxQYXJlbnQuanMiLCIuLi8uLi9zcmMvZG9tLXV0aWxzL2dldENvbXBvc2l0ZVJlY3QuanMiLCIuLi8uLi9zcmMvZG9tLXV0aWxzL2dldExheW91dFJlY3QuanMiLCIuLi8uLi9zcmMvZG9tLXV0aWxzL2dldFBhcmVudE5vZGUuanMiLCIuLi8uLi9zcmMvZG9tLXV0aWxzL2dldFNjcm9sbFBhcmVudC5qcyIsIi4uLy4uL3NyYy9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanMiLCIuLi8uLi9zcmMvZG9tLXV0aWxzL2lzVGFibGVFbGVtZW50LmpzIiwiLi4vLi4vc3JjL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanMiLCIuLi8uLi9zcmMvZW51bXMuanMiLCIuLi8uLi9zcmMvdXRpbHMvb3JkZXJNb2RpZmllcnMuanMiLCIuLi8uLi9zcmMvdXRpbHMvZGVib3VuY2UuanMiLCIuLi8uLi9zcmMvdXRpbHMvZm9ybWF0LmpzIiwiLi4vLi4vc3JjL3V0aWxzL3ZhbGlkYXRlTW9kaWZpZXJzLmpzIiwiLi4vLi4vc3JjL3V0aWxzL3VuaXF1ZUJ5LmpzIiwiLi4vLi4vc3JjL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanMiLCIuLi8uLi9zcmMvdXRpbHMvbWVyZ2VCeU5hbWUuanMiLCIuLi8uLi9zcmMvZG9tLXV0aWxzL2dldFZpZXdwb3J0UmVjdC5qcyIsIi4uLy4uL3NyYy9kb20tdXRpbHMvZ2V0RG9jdW1lbnRSZWN0LmpzIiwiLi4vLi4vc3JjL2RvbS11dGlscy9jb250YWlucy5qcyIsIi4uLy4uL3NyYy91dGlscy9yZWN0VG9DbGllbnRSZWN0LmpzIiwiLi4vLi4vc3JjL2RvbS11dGlscy9nZXRDbGlwcGluZ1JlY3QuanMiLCIuLi8uLi9zcmMvdXRpbHMvZ2V0VmFyaWF0aW9uLmpzIiwiLi4vLi4vc3JjL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qcyIsIi4uLy4uL3NyYy91dGlscy9jb21wdXRlT2Zmc2V0cy5qcyIsIi4uLy4uL3NyYy91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanMiLCIuLi8uLi9zcmMvdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0LmpzIiwiLi4vLi4vc3JjL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcyIsIi4uLy4uL3NyYy91dGlscy9kZXRlY3RPdmVyZmxvdy5qcyIsIi4uLy4uL3NyYy9jcmVhdGVQb3BwZXIuanMiLCIuLi8uLi9zcmMvbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzIiwiLi4vLi4vc3JjL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzIiwiLi4vLi4vc3JjL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzIiwiLi4vLi4vc3JjL21vZGlmaWVycy9hcHBseVN0eWxlcy5qcyIsIi4uLy4uL3NyYy9tb2RpZmllcnMvb2Zmc2V0LmpzIiwiLi4vLi4vc3JjL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzIiwiLi4vLi4vc3JjL3V0aWxzL2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50LmpzIiwiLi4vLi4vc3JjL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzIiwiLi4vLi4vc3JjL21vZGlmaWVycy9mbGlwLmpzIiwiLi4vLi4vc3JjL3V0aWxzL2dldEFsdEF4aXMuanMiLCIuLi8uLi9zcmMvdXRpbHMvd2l0aGluLmpzIiwiLi4vLi4vc3JjL21vZGlmaWVycy9wcmV2ZW50T3ZlcmZsb3cuanMiLCIuLi8uLi9zcmMvbW9kaWZpZXJzL2Fycm93LmpzIiwiLi4vLi4vc3JjL21vZGlmaWVycy9oaWRlLmpzIiwiLi4vLi4vc3JjL3BvcHBlci1saXRlLmpzIiwiLi4vLi4vc3JjL3BvcHBlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBXaW5kb3cgfSBmcm9tICcuLi90eXBlcyc7XG5kZWNsYXJlIGZ1bmN0aW9uIGdldFdpbmRvdyhub2RlOiBOb2RlIHwgV2luZG93KTogV2luZG93O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3cobm9kZSkge1xuICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHdpbmRvdztcbiAgfVxuXG4gIGlmIChub2RlLnRvU3RyaW5nKCkgIT09ICdbb2JqZWN0IFdpbmRvd10nKSB7XG4gICAgY29uc3Qgb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93IDogd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tICcuL2dldFdpbmRvdyc7XG5cbmRlY2xhcmUgZnVuY3Rpb24gaXNFbGVtZW50KG5vZGU6IG1peGVkKTogYm9vbGVhbiAlY2hlY2tzKG5vZGUgaW5zdGFuY2VvZlxuICBFbGVtZW50KTtcbmZ1bmN0aW9uIGlzRWxlbWVudChub2RlKSB7XG4gIGNvbnN0IE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50O1xufVxuXG5kZWNsYXJlIGZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZTogbWl4ZWQpOiBib29sZWFuICVjaGVja3Mobm9kZSBpbnN0YW5jZW9mXG4gIEhUTUxFbGVtZW50KTtcbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZSkge1xuICBjb25zdCBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLkhUTUxFbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50O1xufVxuXG5kZWNsYXJlIGZ1bmN0aW9uIGlzU2hhZG93Um9vdChub2RlOiBtaXhlZCk6IGJvb2xlYW4gJWNoZWNrcyhub2RlIGluc3RhbmNlb2ZcbiAgU2hhZG93Um9vdCk7XG5mdW5jdGlvbiBpc1NoYWRvd1Jvb3Qobm9kZSkge1xuICAvLyBJRSAxMSBoYXMgbm8gU2hhZG93Um9vdFxuICBpZiAodHlwZW9mIFNoYWRvd1Jvb3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuU2hhZG93Um9vdDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290O1xufVxuXG5leHBvcnQgeyBpc0VsZW1lbnQsIGlzSFRNTEVsZW1lbnQsIGlzU2hhZG93Um9vdCB9O1xuIiwiLy8gQGZsb3dcbmV4cG9ydCBjb25zdCBtYXggPSBNYXRoLm1heDtcbmV4cG9ydCBjb25zdCBtaW4gPSBNYXRoLm1pbjtcbmV4cG9ydCBjb25zdCByb3VuZCA9IE1hdGgucm91bmQ7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBDbGllbnRSZWN0T2JqZWN0LCBWaXJ0dWFsRWxlbWVudCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tICcuL2luc3RhbmNlT2YnO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tICcuLi91dGlscy9tYXRoJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KFxuICBlbGVtZW50OiBFbGVtZW50IHwgVmlydHVhbEVsZW1lbnQsXG4gIGluY2x1ZGVTY2FsZTogYm9vbGVhbiA9IGZhbHNlXG4pOiBDbGllbnRSZWN0T2JqZWN0IHtcbiAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGxldCBzY2FsZVggPSAxO1xuICBsZXQgc2NhbGVZID0gMTtcblxuICBpZiAoaXNIVE1MRWxlbWVudChlbGVtZW50KSAmJiBpbmNsdWRlU2NhbGUpIHtcbiAgICBjb25zdCBvZmZzZXRIZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBvZmZzZXRXaWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG5cbiAgICAvLyBEbyBub3QgYXR0ZW1wdCB0byBkaXZpZGUgYnkgMCwgb3RoZXJ3aXNlIHdlIGdldCBgSW5maW5pdHlgIGFzIHNjYWxlXG4gICAgLy8gRmFsbGJhY2sgdG8gMSBpbiBjYXNlIGJvdGggdmFsdWVzIGFyZSBgMGBcbiAgICBpZiAob2Zmc2V0V2lkdGggPiAwKSB7XG4gICAgICBzY2FsZVggPSByb3VuZChyZWN0LndpZHRoKSAvIG9mZnNldFdpZHRoIHx8IDE7XG4gICAgfVxuICAgIGlmIChvZmZzZXRIZWlnaHQgPiAwKSB7XG4gICAgICBzY2FsZVkgPSByb3VuZChyZWN0LmhlaWdodCkgLyBvZmZzZXRIZWlnaHQgfHwgMTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiByZWN0LndpZHRoIC8gc2NhbGVYLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHQgLyBzY2FsZVksXG4gICAgdG9wOiByZWN0LnRvcCAvIHNjYWxlWSxcbiAgICByaWdodDogcmVjdC5yaWdodCAvIHNjYWxlWCxcbiAgICBib3R0b206IHJlY3QuYm90dG9tIC8gc2NhbGVZLFxuICAgIGxlZnQ6IHJlY3QubGVmdCAvIHNjYWxlWCxcbiAgICB4OiByZWN0LmxlZnQgLyBzY2FsZVgsXG4gICAgeTogcmVjdC50b3AgLyBzY2FsZVksXG4gIH07XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tICcuL2dldFdpbmRvdyc7XG5pbXBvcnQgdHlwZSB7IFdpbmRvdyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsKG5vZGU6IE5vZGUgfCBXaW5kb3cpIHtcbiAgY29uc3Qgd2luID0gZ2V0V2luZG93KG5vZGUpO1xuICBjb25zdCBzY3JvbGxMZWZ0ID0gd2luLnBhZ2VYT2Zmc2V0O1xuICBjb25zdCBzY3JvbGxUb3AgPSB3aW4ucGFnZVlPZmZzZXQ7XG5cbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcCxcbiAgfTtcbn1cbiIsIi8vIEBmbG93XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEhUTUxFbGVtZW50U2Nyb2xsKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogZWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3AsXG4gIH07XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tICcuL2dldFdpbmRvd1Njcm9sbCc7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gJy4vZ2V0V2luZG93JztcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tICcuL2luc3RhbmNlT2YnO1xuaW1wb3J0IGdldEhUTUxFbGVtZW50U2Nyb2xsIGZyb20gJy4vZ2V0SFRNTEVsZW1lbnRTY3JvbGwnO1xuaW1wb3J0IHR5cGUgeyBXaW5kb3cgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE5vZGVTY3JvbGwobm9kZTogTm9kZSB8IFdpbmRvdykge1xuICBpZiAobm9kZSA9PT0gZ2V0V2luZG93KG5vZGUpIHx8ICFpc0hUTUxFbGVtZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIGdldFdpbmRvd1Njcm9sbChub2RlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0SFRNTEVsZW1lbnRTY3JvbGwobm9kZSk7XG4gIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7IFdpbmRvdyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Tm9kZU5hbWUoZWxlbWVudDogP05vZGUgfCBXaW5kb3cpOiA/c3RyaW5nIHtcbiAgcmV0dXJuIGVsZW1lbnQgPyAoZWxlbWVudC5ub2RlTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA6IG51bGw7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSAnLi9pbnN0YW5jZU9mJztcbmltcG9ydCB0eXBlIHsgV2luZG93IH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudEVsZW1lbnQoXG4gIGVsZW1lbnQ6IEVsZW1lbnQgfCBXaW5kb3dcbik6IEhUTUxFbGVtZW50IHtcbiAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICByZXR1cm4gKFxuICAgIChpc0VsZW1lbnQoZWxlbWVudClcbiAgICAgID8gZWxlbWVudC5vd25lckRvY3VtZW50XG4gICAgICA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgICBlbGVtZW50LmRvY3VtZW50KSB8fCB3aW5kb3cuZG9jdW1lbnRcbiAgKS5kb2N1bWVudEVsZW1lbnQ7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tICcuL2dldEJvdW5kaW5nQ2xpZW50UmVjdCc7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gJy4vZ2V0RG9jdW1lbnRFbGVtZW50JztcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSAnLi9nZXRXaW5kb3dTY3JvbGwnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQ6IEVsZW1lbnQpOiBudW1iZXIge1xuICAvLyBJZiA8aHRtbD4gaGFzIGEgQ1NTIHdpZHRoIGdyZWF0ZXIgdGhhbiB0aGUgdmlld3BvcnQsIHRoZW4gdGhpcyB3aWxsIGJlXG4gIC8vIGluY29ycmVjdCBmb3IgUlRMLlxuICAvLyBQb3BwZXIgMSBpcyBicm9rZW4gaW4gdGhpcyBjYXNlIGFuZCBuZXZlciBoYWQgYSBidWcgcmVwb3J0IHNvIGxldCdzIGFzc3VtZVxuICAvLyBpdCdzIG5vdCBhbiBpc3N1ZS4gSSBkb24ndCB0aGluayBhbnlvbmUgZXZlciBzcGVjaWZpZXMgd2lkdGggb24gPGh0bWw+XG4gIC8vIGFueXdheS5cbiAgLy8gQnJvd3NlcnMgd2hlcmUgdGhlIGxlZnQgc2Nyb2xsYmFyIGRvZXNuJ3QgY2F1c2UgYW4gaXNzdWUgcmVwb3J0IGAwYCBmb3JcbiAgLy8gdGhpcyAoZS5nLiBFZGdlIDIwMTksIElFMTEsIFNhZmFyaSlcbiAgcmV0dXJuIChcbiAgICBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKS5sZWZ0ICtcbiAgICBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCkuc2Nyb2xsTGVmdFxuICApO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSAnLi9nZXRXaW5kb3cnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKFxuICBlbGVtZW50OiBFbGVtZW50XG4pOiBDU1NTdHlsZURlY2xhcmF0aW9uIHtcbiAgcmV0dXJuIGdldFdpbmRvdyhlbGVtZW50KS5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gJy4vZ2V0Q29tcHV0ZWRTdHlsZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzU2Nyb2xsUGFyZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gIC8vIEZpcmVmb3ggd2FudHMgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcbiAgY29uc3QgeyBvdmVyZmxvdywgb3ZlcmZsb3dYLCBvdmVyZmxvd1kgfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gIHJldHVybiAvYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW4vLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHsgUmVjdCwgVmlydHVhbEVsZW1lbnQsIFdpbmRvdyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSAnLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QnO1xuaW1wb3J0IGdldE5vZGVTY3JvbGwgZnJvbSAnLi9nZXROb2RlU2Nyb2xsJztcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tICcuL2dldE5vZGVOYW1lJztcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tICcuL2luc3RhbmNlT2YnO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSAnLi9nZXRXaW5kb3dTY3JvbGxCYXJYJztcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSAnLi9nZXREb2N1bWVudEVsZW1lbnQnO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gJy4vaXNTY3JvbGxQYXJlbnQnO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tICcuLi91dGlscy9tYXRoJztcblxuZnVuY3Rpb24gaXNFbGVtZW50U2NhbGVkKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCBzY2FsZVggPSByb3VuZChyZWN0LndpZHRoKSAvIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMTtcbiAgY29uc3Qgc2NhbGVZID0gcm91bmQocmVjdC5oZWlnaHQpIC8gZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgMTtcblxuICByZXR1cm4gc2NhbGVYICE9PSAxIHx8IHNjYWxlWSAhPT0gMTtcbn1cblxuLy8gUmV0dXJucyB0aGUgY29tcG9zaXRlIHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LlxuLy8gQ29tcG9zaXRlIG1lYW5zIGl0IHRha2VzIGludG8gYWNjb3VudCB0cmFuc2Zvcm1zIGFzIHdlbGwgYXMgbGF5b3V0LlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29tcG9zaXRlUmVjdChcbiAgZWxlbWVudE9yVmlydHVhbEVsZW1lbnQ6IEVsZW1lbnQgfCBWaXJ0dWFsRWxlbWVudCxcbiAgb2Zmc2V0UGFyZW50OiBFbGVtZW50IHwgV2luZG93LFxuICBpc0ZpeGVkOiBib29sZWFuID0gZmFsc2Vcbik6IFJlY3Qge1xuICBjb25zdCBpc09mZnNldFBhcmVudEFuRWxlbWVudCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgY29uc3Qgb2Zmc2V0UGFyZW50SXNTY2FsZWQgPVxuICAgIGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJiBpc0VsZW1lbnRTY2FsZWQob2Zmc2V0UGFyZW50KTtcbiAgY29uc3QgZG9jdW1lbnRFbGVtZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIGNvbnN0IHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoXG4gICAgZWxlbWVudE9yVmlydHVhbEVsZW1lbnQsXG4gICAgb2Zmc2V0UGFyZW50SXNTY2FsZWRcbiAgKTtcblxuICBsZXQgc2Nyb2xsID0geyBzY3JvbGxMZWZ0OiAwLCBzY3JvbGxUb3A6IDAgfTtcbiAgbGV0IG9mZnNldHMgPSB7IHg6IDAsIHk6IDAgfTtcblxuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgKCFpc09mZnNldFBhcmVudEFuRWxlbWVudCAmJiAhaXNGaXhlZCkpIHtcbiAgICBpZiAoXG4gICAgICBnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpICE9PSAnYm9keScgfHxcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTA3OFxuICAgICAgaXNTY3JvbGxQYXJlbnQoZG9jdW1lbnRFbGVtZW50KVxuICAgICkge1xuICAgICAgc2Nyb2xsID0gZ2V0Tm9kZVNjcm9sbChvZmZzZXRQYXJlbnQpO1xuICAgIH1cblxuICAgIGlmIChpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkpIHtcbiAgICAgIG9mZnNldHMgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qob2Zmc2V0UGFyZW50LCB0cnVlKTtcbiAgICAgIG9mZnNldHMueCArPSBvZmZzZXRQYXJlbnQuY2xpZW50TGVmdDtcbiAgICAgIG9mZnNldHMueSArPSBvZmZzZXRQYXJlbnQuY2xpZW50VG9wO1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBvZmZzZXRzLnggPSBnZXRXaW5kb3dTY3JvbGxCYXJYKGRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiByZWN0LmxlZnQgKyBzY3JvbGwuc2Nyb2xsTGVmdCAtIG9mZnNldHMueCxcbiAgICB5OiByZWN0LnRvcCArIHNjcm9sbC5zY3JvbGxUb3AgLSBvZmZzZXRzLnksXG4gICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodCxcbiAgfTtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7IFJlY3QgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gJy4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0JztcblxuLy8gUmV0dXJucyB0aGUgbGF5b3V0IHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LiBMYXlvdXRcbi8vIG1lYW5zIGl0IGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgdHJhbnNmb3Jtcy5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldExheW91dFJlY3QoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBSZWN0IHtcbiAgY29uc3QgY2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTtcblxuICAvLyBVc2UgdGhlIGNsaWVudFJlY3Qgc2l6ZXMgaWYgaXQncyBub3QgYmVlbiB0cmFuc2Zvcm1lZC5cbiAgLy8gRml4ZXMgaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy8xMjIzXG4gIGxldCB3aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIGxldCBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC53aWR0aCAtIHdpZHRoKSA8PSAxKSB7XG4gICAgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3QuaGVpZ2h0IC0gaGVpZ2h0KSA8PSAxKSB7XG4gICAgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IGVsZW1lbnQub2Zmc2V0TGVmdCxcbiAgICB5OiBlbGVtZW50Lm9mZnNldFRvcCxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gIH07XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gJy4vZ2V0Tm9kZU5hbWUnO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tICcuL2dldERvY3VtZW50RWxlbWVudCc7XG5pbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tICcuL2luc3RhbmNlT2YnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQ6IE5vZGUgfCBTaGFkb3dSb290KTogTm9kZSB7XG4gIGlmIChnZXROb2RlTmFtZShlbGVtZW50KSA9PT0gJ2h0bWwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIC8vIHRoaXMgaXMgYSBxdWlja2VyIChidXQgbGVzcyB0eXBlIHNhZmUpIHdheSB0byBzYXZlIHF1aXRlIHNvbWUgYnl0ZXMgZnJvbSB0aGUgYnVuZGxlXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXVxuICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgIGVsZW1lbnQuYXNzaWduZWRTbG90IHx8IC8vIHN0ZXAgaW50byB0aGUgc2hhZG93IERPTSBvZiB0aGUgcGFyZW50IG9mIGEgc2xvdHRlZCBub2RlXG4gICAgZWxlbWVudC5wYXJlbnROb2RlIHx8IC8vIERPTSBFbGVtZW50IGRldGVjdGVkXG4gICAgKGlzU2hhZG93Um9vdChlbGVtZW50KSA/IGVsZW1lbnQuaG9zdCA6IG51bGwpIHx8IC8vIFNoYWRvd1Jvb3QgZGV0ZWN0ZWRcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogSFRNTEVsZW1lbnQgaXMgYSBOb2RlXG4gICAgZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIC8vIGZhbGxiYWNrXG4gICk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSAnLi9nZXRQYXJlbnROb2RlJztcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tICcuL2lzU2Nyb2xsUGFyZW50JztcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tICcuL2dldE5vZGVOYW1lJztcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tICcuL2luc3RhbmNlT2YnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQobm9kZTogTm9kZSk6IEhUTUxFbGVtZW50IHtcbiAgaWYgKFsnaHRtbCcsICdib2R5JywgJyNkb2N1bWVudCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUobm9kZSkpID49IDApIHtcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgaWYgKGlzSFRNTEVsZW1lbnQobm9kZSkgJiYgaXNTY3JvbGxQYXJlbnQobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHJldHVybiBnZXRTY3JvbGxQYXJlbnQoZ2V0UGFyZW50Tm9kZShub2RlKSk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldFNjcm9sbFBhcmVudCBmcm9tICcuL2dldFNjcm9sbFBhcmVudCc7XG5pbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tICcuL2dldFBhcmVudE5vZGUnO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tICcuL2dldFdpbmRvdyc7XG5pbXBvcnQgdHlwZSB7IFdpbmRvdywgVmlzdWFsVmlld3BvcnQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSAnLi9pc1Njcm9sbFBhcmVudCc7XG5cbi8qXG5naXZlbiBhIERPTSBlbGVtZW50LCByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHNjcm9sbCBwYXJlbnRzLCB1cCB0aGUgbGlzdCBvZiBhbmNlc29yc1xudW50aWwgd2UgZ2V0IHRvIHRoZSB0b3Agd2luZG93IG9iamVjdC4gVGhpcyBsaXN0IGlzIHdoYXQgd2UgYXR0YWNoIHNjcm9sbCBsaXN0ZW5lcnNcbnRvLCBiZWNhdXNlIGlmIGFueSBvZiB0aGVzZSBwYXJlbnQgZWxlbWVudHMgc2Nyb2xsLCB3ZSdsbCBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGVcbnJlZmVyZW5jZSBlbGVtZW50J3MgcG9zaXRpb24uXG4qL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGlzdFNjcm9sbFBhcmVudHMoXG4gIGVsZW1lbnQ6IE5vZGUsXG4gIGxpc3Q6IEFycmF5PEVsZW1lbnQgfCBXaW5kb3c+ID0gW11cbik6IEFycmF5PEVsZW1lbnQgfCBXaW5kb3cgfCBWaXN1YWxWaWV3cG9ydD4ge1xuICBjb25zdCBzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudCk7XG4gIGNvbnN0IGlzQm9keSA9IHNjcm9sbFBhcmVudCA9PT0gZWxlbWVudC5vd25lckRvY3VtZW50Py5ib2R5O1xuICBjb25zdCB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsUGFyZW50KTtcbiAgY29uc3QgdGFyZ2V0ID0gaXNCb2R5XG4gICAgPyBbd2luXS5jb25jYXQoXG4gICAgICAgIHdpbi52aXN1YWxWaWV3cG9ydCB8fCBbXSxcbiAgICAgICAgaXNTY3JvbGxQYXJlbnQoc2Nyb2xsUGFyZW50KSA/IHNjcm9sbFBhcmVudCA6IFtdXG4gICAgICApXG4gICAgOiBzY3JvbGxQYXJlbnQ7XG4gIGNvbnN0IHVwZGF0ZWRMaXN0ID0gbGlzdC5jb25jYXQodGFyZ2V0KTtcblxuICByZXR1cm4gaXNCb2R5XG4gICAgPyB1cGRhdGVkTGlzdFxuICAgIDogLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IGlzQm9keSB0ZWxscyB1cyB0YXJnZXQgd2lsbCBiZSBhbiBIVE1MRWxlbWVudCBoZXJlXG4gICAgICB1cGRhdGVkTGlzdC5jb25jYXQobGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZSh0YXJnZXQpKSk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gJy4vZ2V0Tm9kZU5hbWUnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1RhYmxlRWxlbWVudChlbGVtZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gIHJldHVybiBbJ3RhYmxlJywgJ3RkJywgJ3RoJ10uaW5kZXhPZihnZXROb2RlTmFtZShlbGVtZW50KSkgPj0gMDtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gJy4vZ2V0V2luZG93JztcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tICcuL2dldE5vZGVOYW1lJztcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gJy4vZ2V0Q29tcHV0ZWRTdHlsZSc7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfSBmcm9tICcuL2luc3RhbmNlT2YnO1xuaW1wb3J0IGlzVGFibGVFbGVtZW50IGZyb20gJy4vaXNUYWJsZUVsZW1lbnQnO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSAnLi9nZXRQYXJlbnROb2RlJztcblxuZnVuY3Rpb24gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50OiBFbGVtZW50KTogP0VsZW1lbnQge1xuICBpZiAoXG4gICAgIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHxcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzgzN1xuICAgIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCdcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudC5vZmZzZXRQYXJlbnQ7XG59XG5cbi8vIGAub2Zmc2V0UGFyZW50YCByZXBvcnRzIGBudWxsYCBmb3IgZml4ZWQgZWxlbWVudHMsIHdoaWxlIGFic29sdXRlIGVsZW1lbnRzXG4vLyByZXR1cm4gdGhlIGNvbnRhaW5pbmcgYmxvY2tcbmZ1bmN0aW9uIGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50OiBFbGVtZW50KSB7XG4gIGNvbnN0IGlzRmlyZWZveCA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdmaXJlZm94JykgIT09IC0xO1xuICBjb25zdCBpc0lFID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdUcmlkZW50JykgIT09IC0xO1xuXG4gIGlmIChpc0lFICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAvLyBJbiBJRSA5LCAxMCBhbmQgMTEgZml4ZWQgZWxlbWVudHMgY29udGFpbmluZyBibG9jayBpcyBhbHdheXMgZXN0YWJsaXNoZWQgYnkgdGhlIHZpZXdwb3J0XG4gICAgY29uc3QgZWxlbWVudENzcyA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgaWYgKGVsZW1lbnRDc3MucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGxldCBjdXJyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG5cbiAgaWYgKGlzU2hhZG93Um9vdChjdXJyZW50Tm9kZSkpIHtcbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmhvc3Q7XG4gIH1cblxuICB3aGlsZSAoXG4gICAgaXNIVE1MRWxlbWVudChjdXJyZW50Tm9kZSkgJiZcbiAgICBbJ2h0bWwnLCAnYm9keSddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoY3VycmVudE5vZGUpKSA8IDBcbiAgKSB7XG4gICAgY29uc3QgY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50Tm9kZSk7XG5cbiAgICAvLyBUaGlzIGlzIG5vbi1leGhhdXN0aXZlIGJ1dCBjb3ZlcnMgdGhlIG1vc3QgY29tbW9uIENTUyBwcm9wZXJ0aWVzIHRoYXRcbiAgICAvLyBjcmVhdGUgYSBjb250YWluaW5nIGJsb2NrLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9Db250YWluaW5nX2Jsb2NrI2lkZW50aWZ5aW5nX3RoZV9jb250YWluaW5nX2Jsb2NrXG4gICAgaWYgKFxuICAgICAgY3NzLnRyYW5zZm9ybSAhPT0gJ25vbmUnIHx8XG4gICAgICBjc3MucGVyc3BlY3RpdmUgIT09ICdub25lJyB8fFxuICAgICAgY3NzLmNvbnRhaW4gPT09ICdwYWludCcgfHxcbiAgICAgIFsndHJhbnNmb3JtJywgJ3BlcnNwZWN0aXZlJ10uaW5kZXhPZihjc3Mud2lsbENoYW5nZSkgIT09IC0xIHx8XG4gICAgICAoaXNGaXJlZm94ICYmIGNzcy53aWxsQ2hhbmdlID09PSAnZmlsdGVyJykgfHxcbiAgICAgIChpc0ZpcmVmb3ggJiYgY3NzLmZpbHRlciAmJiBjc3MuZmlsdGVyICE9PSAnbm9uZScpXG4gICAgKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gR2V0cyB0aGUgY2xvc2VzdCBhbmNlc3RvciBwb3NpdGlvbmVkIGVsZW1lbnQuIEhhbmRsZXMgc29tZSBlZGdlIGNhc2VzLFxuLy8gc3VjaCBhcyB0YWJsZSBhbmNlc3RvcnMgYW5kIGNyb3NzIGJyb3dzZXIgYnVncy5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9mZnNldFBhcmVudChlbGVtZW50OiBFbGVtZW50KSB7XG4gIGNvbnN0IHdpbmRvdyA9IGdldFdpbmRvdyhlbGVtZW50KTtcblxuICBsZXQgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KTtcblxuICB3aGlsZSAoXG4gICAgb2Zmc2V0UGFyZW50ICYmXG4gICAgaXNUYWJsZUVsZW1lbnQob2Zmc2V0UGFyZW50KSAmJlxuICAgIGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYydcbiAgKSB7XG4gICAgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChvZmZzZXRQYXJlbnQpO1xuICB9XG5cbiAgaWYgKFxuICAgIG9mZnNldFBhcmVudCAmJlxuICAgIChnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnaHRtbCcgfHxcbiAgICAgIChnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnYm9keScgJiZcbiAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykpXG4gICkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGdldENvbnRhaW5pbmdCbG9jayhlbGVtZW50KSB8fCB3aW5kb3c7XG59XG4iLCIvLyBAZmxvd1xuZXhwb3J0IGNvbnN0IHRvcDogJ3RvcCcgPSAndG9wJztcbmV4cG9ydCBjb25zdCBib3R0b206ICdib3R0b20nID0gJ2JvdHRvbSc7XG5leHBvcnQgY29uc3QgcmlnaHQ6ICdyaWdodCcgPSAncmlnaHQnO1xuZXhwb3J0IGNvbnN0IGxlZnQ6ICdsZWZ0JyA9ICdsZWZ0JztcbmV4cG9ydCBjb25zdCBhdXRvOiAnYXV0bycgPSAnYXV0byc7XG5leHBvcnQgdHlwZSBCYXNlUGxhY2VtZW50ID1cbiAgfCB0eXBlb2YgdG9wXG4gIHwgdHlwZW9mIGJvdHRvbVxuICB8IHR5cGVvZiByaWdodFxuICB8IHR5cGVvZiBsZWZ0O1xuZXhwb3J0IGNvbnN0IGJhc2VQbGFjZW1lbnRzOiBBcnJheTxCYXNlUGxhY2VtZW50PiA9IFt0b3AsIGJvdHRvbSwgcmlnaHQsIGxlZnRdO1xuXG5leHBvcnQgY29uc3Qgc3RhcnQ6ICdzdGFydCcgPSAnc3RhcnQnO1xuZXhwb3J0IGNvbnN0IGVuZDogJ2VuZCcgPSAnZW5kJztcbmV4cG9ydCB0eXBlIFZhcmlhdGlvbiA9IHR5cGVvZiBzdGFydCB8IHR5cGVvZiBlbmQ7XG5cbmV4cG9ydCBjb25zdCBjbGlwcGluZ1BhcmVudHM6ICdjbGlwcGluZ1BhcmVudHMnID0gJ2NsaXBwaW5nUGFyZW50cyc7XG5leHBvcnQgY29uc3Qgdmlld3BvcnQ6ICd2aWV3cG9ydCcgPSAndmlld3BvcnQnO1xuZXhwb3J0IHR5cGUgQm91bmRhcnkgPSBFbGVtZW50IHwgQXJyYXk8RWxlbWVudD4gfCB0eXBlb2YgY2xpcHBpbmdQYXJlbnRzO1xuZXhwb3J0IHR5cGUgUm9vdEJvdW5kYXJ5ID0gdHlwZW9mIHZpZXdwb3J0IHwgJ2RvY3VtZW50JztcblxuZXhwb3J0IGNvbnN0IHBvcHBlcjogJ3BvcHBlcicgPSAncG9wcGVyJztcbmV4cG9ydCBjb25zdCByZWZlcmVuY2U6ICdyZWZlcmVuY2UnID0gJ3JlZmVyZW5jZSc7XG5leHBvcnQgdHlwZSBDb250ZXh0ID0gdHlwZW9mIHBvcHBlciB8IHR5cGVvZiByZWZlcmVuY2U7XG5cbmV4cG9ydCB0eXBlIFZhcmlhdGlvblBsYWNlbWVudCA9XG4gIHwgJ3RvcC1zdGFydCdcbiAgfCAndG9wLWVuZCdcbiAgfCAnYm90dG9tLXN0YXJ0J1xuICB8ICdib3R0b20tZW5kJ1xuICB8ICdyaWdodC1zdGFydCdcbiAgfCAncmlnaHQtZW5kJ1xuICB8ICdsZWZ0LXN0YXJ0J1xuICB8ICdsZWZ0LWVuZCc7XG5leHBvcnQgdHlwZSBBdXRvUGxhY2VtZW50ID0gJ2F1dG8nIHwgJ2F1dG8tc3RhcnQnIHwgJ2F1dG8tZW5kJztcbmV4cG9ydCB0eXBlIENvbXB1dGVkUGxhY2VtZW50ID0gVmFyaWF0aW9uUGxhY2VtZW50IHwgQmFzZVBsYWNlbWVudDtcbmV4cG9ydCB0eXBlIFBsYWNlbWVudCA9IEF1dG9QbGFjZW1lbnQgfCBCYXNlUGxhY2VtZW50IHwgVmFyaWF0aW9uUGxhY2VtZW50O1xuXG5leHBvcnQgY29uc3QgdmFyaWF0aW9uUGxhY2VtZW50czogQXJyYXk8VmFyaWF0aW9uUGxhY2VtZW50PiA9IGJhc2VQbGFjZW1lbnRzLnJlZHVjZShcbiAgKGFjYzogQXJyYXk8VmFyaWF0aW9uUGxhY2VtZW50PiwgcGxhY2VtZW50OiBCYXNlUGxhY2VtZW50KSA9PlxuICAgIGFjYy5jb25jYXQoWyhgJHtwbGFjZW1lbnR9LSR7c3RhcnR9YDogYW55KSwgKGAke3BsYWNlbWVudH0tJHtlbmR9YDogYW55KV0pLFxuICBbXVxuKTtcbmV4cG9ydCBjb25zdCBwbGFjZW1lbnRzOiBBcnJheTxQbGFjZW1lbnQ+ID0gWy4uLmJhc2VQbGFjZW1lbnRzLCBhdXRvXS5yZWR1Y2UoXG4gIChcbiAgICBhY2M6IEFycmF5PFBsYWNlbWVudD4sXG4gICAgcGxhY2VtZW50OiBCYXNlUGxhY2VtZW50IHwgdHlwZW9mIGF1dG9cbiAgKTogQXJyYXk8UGxhY2VtZW50PiA9PlxuICAgIGFjYy5jb25jYXQoW1xuICAgICAgcGxhY2VtZW50LFxuICAgICAgKGAke3BsYWNlbWVudH0tJHtzdGFydH1gOiBhbnkpLFxuICAgICAgKGAke3BsYWNlbWVudH0tJHtlbmR9YDogYW55KSxcbiAgICBdKSxcbiAgW11cbik7XG5cbi8vIG1vZGlmaWVycyB0aGF0IG5lZWQgdG8gcmVhZCB0aGUgRE9NXG5leHBvcnQgY29uc3QgYmVmb3JlUmVhZDogJ2JlZm9yZVJlYWQnID0gJ2JlZm9yZVJlYWQnO1xuZXhwb3J0IGNvbnN0IHJlYWQ6ICdyZWFkJyA9ICdyZWFkJztcbmV4cG9ydCBjb25zdCBhZnRlclJlYWQ6ICdhZnRlclJlYWQnID0gJ2FmdGVyUmVhZCc7XG4vLyBwdXJlLWxvZ2ljIG1vZGlmaWVyc1xuZXhwb3J0IGNvbnN0IGJlZm9yZU1haW46ICdiZWZvcmVNYWluJyA9ICdiZWZvcmVNYWluJztcbmV4cG9ydCBjb25zdCBtYWluOiAnbWFpbicgPSAnbWFpbic7XG5leHBvcnQgY29uc3QgYWZ0ZXJNYWluOiAnYWZ0ZXJNYWluJyA9ICdhZnRlck1haW4nO1xuLy8gbW9kaWZpZXIgd2l0aCB0aGUgcHVycG9zZSB0byB3cml0ZSB0byB0aGUgRE9NIChvciB3cml0ZSBpbnRvIGEgZnJhbWV3b3JrIHN0YXRlKVxuZXhwb3J0IGNvbnN0IGJlZm9yZVdyaXRlOiAnYmVmb3JlV3JpdGUnID0gJ2JlZm9yZVdyaXRlJztcbmV4cG9ydCBjb25zdCB3cml0ZTogJ3dyaXRlJyA9ICd3cml0ZSc7XG5leHBvcnQgY29uc3QgYWZ0ZXJXcml0ZTogJ2FmdGVyV3JpdGUnID0gJ2FmdGVyV3JpdGUnO1xuZXhwb3J0IGNvbnN0IG1vZGlmaWVyUGhhc2VzOiBBcnJheTxNb2RpZmllclBoYXNlcz4gPSBbXG4gIGJlZm9yZVJlYWQsXG4gIHJlYWQsXG4gIGFmdGVyUmVhZCxcbiAgYmVmb3JlTWFpbixcbiAgbWFpbixcbiAgYWZ0ZXJNYWluLFxuICBiZWZvcmVXcml0ZSxcbiAgd3JpdGUsXG4gIGFmdGVyV3JpdGUsXG5dO1xuXG5leHBvcnQgdHlwZSBNb2RpZmllclBoYXNlcyA9XG4gIHwgdHlwZW9mIGJlZm9yZVJlYWRcbiAgfCB0eXBlb2YgcmVhZFxuICB8IHR5cGVvZiBhZnRlclJlYWRcbiAgfCB0eXBlb2YgYmVmb3JlTWFpblxuICB8IHR5cGVvZiBtYWluXG4gIHwgdHlwZW9mIGFmdGVyTWFpblxuICB8IHR5cGVvZiBiZWZvcmVXcml0ZVxuICB8IHR5cGVvZiB3cml0ZVxuICB8IHR5cGVvZiBhZnRlcldyaXRlO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHsgTW9kaWZpZXIgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBtb2RpZmllclBoYXNlcyB9IGZyb20gJy4uL2VudW1zJztcblxuLy8gc291cmNlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTg3NTI1NVxuZnVuY3Rpb24gb3JkZXIobW9kaWZpZXJzKSB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgbW9kaWZpZXJzLmZvckVhY2gobW9kaWZpZXIgPT4ge1xuICAgIG1hcC5zZXQobW9kaWZpZXIubmFtZSwgbW9kaWZpZXIpO1xuICB9KTtcblxuICAvLyBPbiB2aXNpdGluZyBvYmplY3QsIGNoZWNrIGZvciBpdHMgZGVwZW5kZW5jaWVzIGFuZCB2aXNpdCB0aGVtIHJlY3Vyc2l2ZWx5XG4gIGZ1bmN0aW9uIHNvcnQobW9kaWZpZXI6IE1vZGlmaWVyPGFueSwgYW55Pikge1xuICAgIHZpc2l0ZWQuYWRkKG1vZGlmaWVyLm5hbWUpO1xuXG4gICAgY29uc3QgcmVxdWlyZXMgPSBbXG4gICAgICAuLi4obW9kaWZpZXIucmVxdWlyZXMgfHwgW10pLFxuICAgICAgLi4uKG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMgfHwgW10pLFxuICAgIF07XG5cbiAgICByZXF1aXJlcy5mb3JFYWNoKGRlcCA9PiB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGRlcCkpIHtcbiAgICAgICAgY29uc3QgZGVwTW9kaWZpZXIgPSBtYXAuZ2V0KGRlcCk7XG5cbiAgICAgICAgaWYgKGRlcE1vZGlmaWVyKSB7XG4gICAgICAgICAgc29ydChkZXBNb2RpZmllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlc3VsdC5wdXNoKG1vZGlmaWVyKTtcbiAgfVxuXG4gIG1vZGlmaWVycy5mb3JFYWNoKG1vZGlmaWVyID0+IHtcbiAgICBpZiAoIXZpc2l0ZWQuaGFzKG1vZGlmaWVyLm5hbWUpKSB7XG4gICAgICAvLyBjaGVjayBmb3IgdmlzaXRlZCBvYmplY3RcbiAgICAgIHNvcnQobW9kaWZpZXIpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb3JkZXJNb2RpZmllcnMoXG4gIG1vZGlmaWVyczogQXJyYXk8TW9kaWZpZXI8YW55LCBhbnk+PlxuKTogQXJyYXk8TW9kaWZpZXI8YW55LCBhbnk+PiB7XG4gIC8vIG9yZGVyIGJhc2VkIG9uIGRlcGVuZGVuY2llc1xuICBjb25zdCBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXIobW9kaWZpZXJzKTtcblxuICAvLyBvcmRlciBiYXNlZCBvbiBwaGFzZVxuICByZXR1cm4gbW9kaWZpZXJQaGFzZXMucmVkdWNlKChhY2MsIHBoYXNlKSA9PiB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQoXG4gICAgICBvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihtb2RpZmllciA9PiBtb2RpZmllci5waGFzZSA9PT0gcGhhc2UpXG4gICAgKTtcbiAgfSwgW10pO1xufVxuIiwiLy8gQGZsb3dcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVib3VuY2U8VD4oZm46IEZ1bmN0aW9uKTogKCkgPT4gUHJvbWlzZTxUPiB7XG4gIGxldCBwZW5kaW5nO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgcGVuZGluZyA9IG5ldyBQcm9taXNlPFQ+KHJlc29sdmUgPT4ge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICBwZW5kaW5nID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJlc29sdmUoZm4oKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBlbmRpbmc7XG4gIH07XG59XG4iLCIvLyBAZmxvd1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXQoc3RyOiBzdHJpbmcsIC4uLmFyZ3M6IEFycmF5PHN0cmluZz4pIHtcbiAgcmV0dXJuIFsuLi5hcmdzXS5yZWR1Y2UoKHAsIGMpID0+IHAucmVwbGFjZSgvJXMvLCBjKSwgc3RyKTtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgZm9ybWF0IGZyb20gJy4vZm9ybWF0JztcbmltcG9ydCB7IG1vZGlmaWVyUGhhc2VzIH0gZnJvbSAnLi4vZW51bXMnO1xuXG5jb25zdCBJTlZBTElEX01PRElGSUVSX0VSUk9SID1cbiAgJ1BvcHBlcjogbW9kaWZpZXIgXCIlc1wiIHByb3ZpZGVkIGFuIGludmFsaWQgJXMgcHJvcGVydHksIGV4cGVjdGVkICVzIGJ1dCBnb3QgJXMnO1xuY29uc3QgTUlTU0lOR19ERVBFTkRFTkNZX0VSUk9SID1cbiAgJ1BvcHBlcjogbW9kaWZpZXIgXCIlc1wiIHJlcXVpcmVzIFwiJXNcIiwgYnV0IFwiJXNcIiBtb2RpZmllciBpcyBub3QgYXZhaWxhYmxlJztcbmNvbnN0IFZBTElEX1BST1BFUlRJRVMgPSBbXG4gICduYW1lJyxcbiAgJ2VuYWJsZWQnLFxuICAncGhhc2UnLFxuICAnZm4nLFxuICAnZWZmZWN0JyxcbiAgJ3JlcXVpcmVzJyxcbiAgJ29wdGlvbnMnLFxuXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVNb2RpZmllcnMobW9kaWZpZXJzOiBBcnJheTxhbnk+KTogdm9pZCB7XG4gIG1vZGlmaWVycy5mb3JFYWNoKChtb2RpZmllcikgPT4ge1xuICAgIFsuLi5PYmplY3Qua2V5cyhtb2RpZmllciksIC4uLlZBTElEX1BST1BFUlRJRVNdXG4gICAgICAvLyBJRTExLWNvbXBhdGlibGUgcmVwbGFjZW1lbnQgZm9yIGBuZXcgU2V0KGl0ZXJhYmxlKWBcbiAgICAgIC5maWx0ZXIoKHZhbHVlLCBpbmRleCwgc2VsZikgPT4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXgpXG4gICAgICAuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1vZGlmaWVyLm5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgZm9ybWF0KFxuICAgICAgICAgICAgICAgICAgSU5WQUxJRF9NT0RJRklFUl9FUlJPUixcbiAgICAgICAgICAgICAgICAgIFN0cmluZyhtb2RpZmllci5uYW1lKSxcbiAgICAgICAgICAgICAgICAgICdcIm5hbWVcIicsXG4gICAgICAgICAgICAgICAgICAnXCJzdHJpbmdcIicsXG4gICAgICAgICAgICAgICAgICBgXCIke1N0cmluZyhtb2RpZmllci5uYW1lKX1cImBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdlbmFibGVkJzpcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXIuZW5hYmxlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgZm9ybWF0KFxuICAgICAgICAgICAgICAgICAgSU5WQUxJRF9NT0RJRklFUl9FUlJPUixcbiAgICAgICAgICAgICAgICAgIG1vZGlmaWVyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAnXCJlbmFibGVkXCInLFxuICAgICAgICAgICAgICAgICAgJ1wiYm9vbGVhblwiJyxcbiAgICAgICAgICAgICAgICAgIGBcIiR7U3RyaW5nKG1vZGlmaWVyLmVuYWJsZWQpfVwiYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3BoYXNlJzpcbiAgICAgICAgICAgIGlmIChtb2RpZmllclBoYXNlcy5pbmRleE9mKG1vZGlmaWVyLnBoYXNlKSA8IDApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBmb3JtYXQoXG4gICAgICAgICAgICAgICAgICBJTlZBTElEX01PRElGSUVSX0VSUk9SLFxuICAgICAgICAgICAgICAgICAgbW9kaWZpZXIubmFtZSxcbiAgICAgICAgICAgICAgICAgICdcInBoYXNlXCInLFxuICAgICAgICAgICAgICAgICAgYGVpdGhlciAke21vZGlmaWVyUGhhc2VzLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgICAgICAgIGBcIiR7U3RyaW5nKG1vZGlmaWVyLnBoYXNlKX1cImBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdmbic6XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1vZGlmaWVyLmZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgZm9ybWF0KFxuICAgICAgICAgICAgICAgICAgSU5WQUxJRF9NT0RJRklFUl9FUlJPUixcbiAgICAgICAgICAgICAgICAgIG1vZGlmaWVyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAnXCJmblwiJyxcbiAgICAgICAgICAgICAgICAgICdcImZ1bmN0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgYFwiJHtTdHJpbmcobW9kaWZpZXIuZm4pfVwiYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2VmZmVjdCc6XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG1vZGlmaWVyLmVmZmVjdCAhPSBudWxsICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBtb2RpZmllci5lZmZlY3QgIT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgIGZvcm1hdChcbiAgICAgICAgICAgICAgICAgIElOVkFMSURfTU9ESUZJRVJfRVJST1IsXG4gICAgICAgICAgICAgICAgICBtb2RpZmllci5uYW1lLFxuICAgICAgICAgICAgICAgICAgJ1wiZWZmZWN0XCInLFxuICAgICAgICAgICAgICAgICAgJ1wiZnVuY3Rpb25cIicsXG4gICAgICAgICAgICAgICAgICBgXCIke1N0cmluZyhtb2RpZmllci5mbil9XCJgXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAncmVxdWlyZXMnOlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBtb2RpZmllci5yZXF1aXJlcyAhPSBudWxsICYmXG4gICAgICAgICAgICAgICFBcnJheS5pc0FycmF5KG1vZGlmaWVyLnJlcXVpcmVzKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgZm9ybWF0KFxuICAgICAgICAgICAgICAgICAgSU5WQUxJRF9NT0RJRklFUl9FUlJPUixcbiAgICAgICAgICAgICAgICAgIG1vZGlmaWVyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAnXCJyZXF1aXJlc1wiJyxcbiAgICAgICAgICAgICAgICAgICdcImFycmF5XCInLFxuICAgICAgICAgICAgICAgICAgYFwiJHtTdHJpbmcobW9kaWZpZXIucmVxdWlyZXMpfVwiYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3JlcXVpcmVzSWZFeGlzdHMnOlxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMpKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgZm9ybWF0KFxuICAgICAgICAgICAgICAgICAgSU5WQUxJRF9NT0RJRklFUl9FUlJPUixcbiAgICAgICAgICAgICAgICAgIG1vZGlmaWVyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAnXCJyZXF1aXJlc0lmRXhpc3RzXCInLFxuICAgICAgICAgICAgICAgICAgJ1wiYXJyYXlcIicsXG4gICAgICAgICAgICAgICAgICBgXCIke1N0cmluZyhtb2RpZmllci5yZXF1aXJlc0lmRXhpc3RzKX1cImBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdvcHRpb25zJzpcbiAgICAgICAgICBjYXNlICdkYXRhJzpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBgUG9wcGVySlM6IGFuIGludmFsaWQgcHJvcGVydHkgaGFzIGJlZW4gcHJvdmlkZWQgdG8gdGhlIFwiJHtcbiAgICAgICAgICAgICAgICBtb2RpZmllci5uYW1lXG4gICAgICAgICAgICAgIH1cIiBtb2RpZmllciwgdmFsaWQgcHJvcGVydGllcyBhcmUgJHtWQUxJRF9QUk9QRVJUSUVTLm1hcChcbiAgICAgICAgICAgICAgICAocykgPT4gYFwiJHtzfVwiYFxuICAgICAgICAgICAgICApLmpvaW4oJywgJyl9OyBidXQgXCIke2tleX1cIiB3YXMgcHJvdmlkZWQuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vZGlmaWVyLnJlcXVpcmVzICYmXG4gICAgICAgICAgbW9kaWZpZXIucmVxdWlyZXMuZm9yRWFjaCgocmVxdWlyZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMuZmluZCgobW9kKSA9PiBtb2QubmFtZSA9PT0gcmVxdWlyZW1lbnQpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBmb3JtYXQoXG4gICAgICAgICAgICAgICAgICBNSVNTSU5HX0RFUEVOREVOQ1lfRVJST1IsXG4gICAgICAgICAgICAgICAgICBTdHJpbmcobW9kaWZpZXIubmFtZSksXG4gICAgICAgICAgICAgICAgICByZXF1aXJlbWVudCxcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH0pO1xufVxuIiwiLy8gQGZsb3dcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdW5pcXVlQnk8VD4oYXJyOiBBcnJheTxUPiwgZm46IFQgPT4gYW55KTogQXJyYXk8VD4ge1xuICBjb25zdCBpZGVudGlmaWVycyA9IG5ldyBTZXQoKTtcblxuICByZXR1cm4gYXJyLmZpbHRlcihpdGVtID0+IHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gZm4oaXRlbSk7XG5cbiAgICBpZiAoIWlkZW50aWZpZXJzLmhhcyhpZGVudGlmaWVyKSkge1xuICAgICAgaWRlbnRpZmllcnMuYWRkKGlkZW50aWZpZXIpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgeyB0eXBlIEJhc2VQbGFjZW1lbnQsIHR5cGUgUGxhY2VtZW50LCBhdXRvIH0gZnJvbSAnLi4vZW51bXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCYXNlUGxhY2VtZW50KFxuICBwbGFjZW1lbnQ6IFBsYWNlbWVudCB8IHR5cGVvZiBhdXRvXG4pOiBCYXNlUGxhY2VtZW50IHtcbiAgcmV0dXJuIChwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTogYW55KTtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7IE1vZGlmaWVyIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZUJ5TmFtZShcbiAgbW9kaWZpZXJzOiBBcnJheTwkU2hhcGU8TW9kaWZpZXI8YW55LCBhbnk+Pj5cbik6IEFycmF5PCRTaGFwZTxNb2RpZmllcjxhbnksIGFueT4+PiB7XG4gIGNvbnN0IG1lcmdlZCA9IG1vZGlmaWVycy5yZWR1Y2UoKG1lcmdlZCwgY3VycmVudCkgPT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gbWVyZ2VkW2N1cnJlbnQubmFtZV07XG4gICAgbWVyZ2VkW2N1cnJlbnQubmFtZV0gPSBleGlzdGluZ1xuICAgICAgPyB7XG4gICAgICAgICAgLi4uZXhpc3RpbmcsXG4gICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICBvcHRpb25zOiB7IC4uLmV4aXN0aW5nLm9wdGlvbnMsIC4uLmN1cnJlbnQub3B0aW9ucyB9LFxuICAgICAgICAgIGRhdGE6IHsgLi4uZXhpc3RpbmcuZGF0YSwgLi4uY3VycmVudC5kYXRhIH0sXG4gICAgICAgIH1cbiAgICAgIDogY3VycmVudDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9LCB7fSk7XG5cbiAgLy8gSUUxMSBkb2VzIG5vdCBzdXBwb3J0IE9iamVjdC52YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1lcmdlZCkubWFwKGtleSA9PiBtZXJnZWRba2V5XSk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tICcuL2dldFdpbmRvdyc7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gJy4vZ2V0RG9jdW1lbnRFbGVtZW50JztcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gJy4vZ2V0V2luZG93U2Nyb2xsQmFyWCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZpZXdwb3J0UmVjdChlbGVtZW50OiBFbGVtZW50KSB7XG4gIGNvbnN0IHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgY29uc3QgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgY29uc3QgdmlzdWFsVmlld3BvcnQgPSB3aW4udmlzdWFsVmlld3BvcnQ7XG5cbiAgbGV0IHdpZHRoID0gaHRtbC5jbGllbnRXaWR0aDtcbiAgbGV0IGhlaWdodCA9IGh0bWwuY2xpZW50SGVpZ2h0O1xuICBsZXQgeCA9IDA7XG4gIGxldCB5ID0gMDtcblxuICAvLyBOQjogVGhpcyBpc24ndCBzdXBwb3J0ZWQgb24gaU9TIDw9IDEyLiBJZiB0aGUga2V5Ym9hcmQgaXMgb3BlbiwgdGhlIHBvcHBlclxuICAvLyBjYW4gYmUgb2JzY3VyZWQgdW5kZXJuZWF0aCBpdC5cbiAgLy8gQWxzbywgYGh0bWwuY2xpZW50SGVpZ2h0YCBhZGRzIHRoZSBib3R0b20gYmFyIGhlaWdodCBpbiBTYWZhcmkgaU9TLCBldmVuXG4gIC8vIGlmIGl0IGlzbid0IG9wZW4sIHNvIGlmIHRoaXMgaXNuJ3QgYXZhaWxhYmxlLCB0aGUgcG9wcGVyIHdpbGwgYmUgZGV0ZWN0ZWRcbiAgLy8gdG8gb3ZlcmZsb3cgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuIHRvbyBlYXJseS5cbiAgaWYgKHZpc3VhbFZpZXdwb3J0KSB7XG4gICAgd2lkdGggPSB2aXN1YWxWaWV3cG9ydC53aWR0aDtcbiAgICBoZWlnaHQgPSB2aXN1YWxWaWV3cG9ydC5oZWlnaHQ7XG5cbiAgICAvLyBVc2VzIExheW91dCBWaWV3cG9ydCAobGlrZSBDaHJvbWU7IFNhZmFyaSBkb2VzIG5vdCBjdXJyZW50bHkpXG4gICAgLy8gSW4gQ2hyb21lLCBpdCByZXR1cm5zIGEgdmFsdWUgdmVyeSBjbG9zZSB0byAwICgrLy0pIGJ1dCBjb250YWlucyByb3VuZGluZ1xuICAgIC8vIGVycm9ycyBkdWUgdG8gZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgc28gd2UgbmVlZCB0byBjaGVjayBwcmVjaXNpb24uXG4gICAgLy8gU2FmYXJpIHJldHVybnMgYSBudW1iZXIgPD0gMCwgdXN1YWxseSA8IC0xIHdoZW4gcGluY2gtem9vbWVkXG5cbiAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmYWlscyBpbiBtb2JpbGUgZW11bGF0aW9uIG1vZGUgaW4gQ2hyb21lLlxuICAgIC8vIE1hdGguYWJzKHdpbi5pbm5lcldpZHRoIC8gdmlzdWFsVmlld3BvcnQuc2NhbGUgLSB2aXN1YWxWaWV3cG9ydC53aWR0aCkgPFxuICAgIC8vIDAuMDAxXG4gICAgLy8gRmFsbGJhY2sgaGVyZTogXCJOb3QgU2FmYXJpXCIgdXNlckFnZW50XG4gICAgaWYgKCEvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gICAgICB4ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdDtcbiAgICAgIHkgPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgeDogeCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCksXG4gICAgeSxcbiAgfTtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7IFJlY3QgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gJy4vZ2V0RG9jdW1lbnRFbGVtZW50JztcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gJy4vZ2V0Q29tcHV0ZWRTdHlsZSc7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tICcuL2dldFdpbmRvd1Njcm9sbEJhclgnO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tICcuL2dldFdpbmRvd1Njcm9sbCc7XG5pbXBvcnQgeyBtYXggfSBmcm9tICcuLi91dGlscy9tYXRoJztcblxuLy8gR2V0cyB0aGUgZW50aXJlIHNpemUgb2YgdGhlIHNjcm9sbGFibGUgZG9jdW1lbnQgYXJlYSwgZXZlbiBleHRlbmRpbmcgb3V0c2lkZVxuLy8gb2YgdGhlIGA8aHRtbD5gIGFuZCBgPGJvZHk+YCByZWN0IGJvdW5kcyBpZiBob3Jpem9udGFsbHkgc2Nyb2xsYWJsZVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRSZWN0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogUmVjdCB7XG4gIGNvbnN0IGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIGNvbnN0IHdpblNjcm9sbCA9IGdldFdpbmRvd1Njcm9sbChlbGVtZW50KTtcbiAgY29uc3QgYm9keSA9IGVsZW1lbnQub3duZXJEb2N1bWVudD8uYm9keTtcblxuICBjb25zdCB3aWR0aCA9IG1heChcbiAgICBodG1sLnNjcm9sbFdpZHRoLFxuICAgIGh0bWwuY2xpZW50V2lkdGgsXG4gICAgYm9keSA/IGJvZHkuc2Nyb2xsV2lkdGggOiAwLFxuICAgIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMFxuICApO1xuICBjb25zdCBoZWlnaHQgPSBtYXgoXG4gICAgaHRtbC5zY3JvbGxIZWlnaHQsXG4gICAgaHRtbC5jbGllbnRIZWlnaHQsXG4gICAgYm9keSA/IGJvZHkuc2Nyb2xsSGVpZ2h0IDogMCxcbiAgICBib2R5ID8gYm9keS5jbGllbnRIZWlnaHQgOiAwXG4gICk7XG5cbiAgbGV0IHggPSAtd2luU2Nyb2xsLnNjcm9sbExlZnQgKyBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpO1xuICBjb25zdCB5ID0gLXdpblNjcm9sbC5zY3JvbGxUb3A7XG5cbiAgaWYgKGdldENvbXB1dGVkU3R5bGUoYm9keSB8fCBodG1sKS5kaXJlY3Rpb24gPT09ICdydGwnKSB7XG4gICAgeCArPSBtYXgoaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKSAtIHdpZHRoO1xuICB9XG5cbiAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCwgeCwgeSB9O1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB7IGlzU2hhZG93Um9vdCB9IGZyb20gJy4vaW5zdGFuY2VPZic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudDogRWxlbWVudCwgY2hpbGQ6IEVsZW1lbnQpIHtcbiAgY29uc3Qgcm9vdE5vZGUgPSBjaGlsZC5nZXRSb290Tm9kZSAmJiBjaGlsZC5nZXRSb290Tm9kZSgpO1xuXG4gIC8vIEZpcnN0LCBhdHRlbXB0IHdpdGggZmFzdGVyIG5hdGl2ZSBtZXRob2RcbiAgaWYgKHBhcmVudC5jb250YWlucyhjaGlsZCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyB0aGVuIGZhbGxiYWNrIHRvIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiB3aXRoIFNoYWRvdyBET00gc3VwcG9ydFxuICBlbHNlIGlmIChyb290Tm9kZSAmJiBpc1NoYWRvd1Jvb3Qocm9vdE5vZGUpKSB7XG4gICAgbGV0IG5leHQgPSBjaGlsZDtcbiAgICBkbyB7XG4gICAgICBpZiAobmV4dCAmJiBwYXJlbnQuaXNTYW1lTm9kZShuZXh0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXTogbmVlZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXMuLi5cbiAgICAgIG5leHQgPSBuZXh0LnBhcmVudE5vZGUgfHwgbmV4dC5ob3N0O1xuICAgIH0gd2hpbGUgKG5leHQpO1xuICB9XG5cbiAgLy8gR2l2ZSB1cCwgdGhlIHJlc3VsdCBpcyBmYWxzZVxuICByZXR1cm4gZmFsc2U7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBSZWN0LCBDbGllbnRSZWN0T2JqZWN0IH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWN0VG9DbGllbnRSZWN0KHJlY3Q6IFJlY3QpOiBDbGllbnRSZWN0T2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZWN0LFxuICAgIGxlZnQ6IHJlY3QueCxcbiAgICB0b3A6IHJlY3QueSxcbiAgICByaWdodDogcmVjdC54ICsgcmVjdC53aWR0aCxcbiAgICBib3R0b206IHJlY3QueSArIHJlY3QuaGVpZ2h0LFxuICB9O1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHsgQ2xpZW50UmVjdE9iamVjdCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQm91bmRhcnksIFJvb3RCb3VuZGFyeSB9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCB7IHZpZXdwb3J0IH0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IGdldFZpZXdwb3J0UmVjdCBmcm9tICcuL2dldFZpZXdwb3J0UmVjdCc7XG5pbXBvcnQgZ2V0RG9jdW1lbnRSZWN0IGZyb20gJy4vZ2V0RG9jdW1lbnRSZWN0JztcbmltcG9ydCBsaXN0U2Nyb2xsUGFyZW50cyBmcm9tICcuL2xpc3RTY3JvbGxQYXJlbnRzJztcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSAnLi9nZXRPZmZzZXRQYXJlbnQnO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tICcuL2dldERvY3VtZW50RWxlbWVudCc7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tICcuL2dldENvbXB1dGVkU3R5bGUnO1xuaW1wb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSAnLi9pbnN0YW5jZU9mJztcbmltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSAnLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QnO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSAnLi9nZXRQYXJlbnROb2RlJztcbmltcG9ydCBjb250YWlucyBmcm9tICcuL2NvbnRhaW5zJztcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tICcuL2dldE5vZGVOYW1lJztcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gJy4uL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QnO1xuaW1wb3J0IHsgbWF4LCBtaW4gfSBmcm9tICcuLi91dGlscy9tYXRoJztcblxuZnVuY3Rpb24gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudDogRWxlbWVudCkge1xuICBjb25zdCByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpO1xuXG4gIHJlY3QudG9wID0gcmVjdC50b3AgKyBlbGVtZW50LmNsaWVudFRvcDtcbiAgcmVjdC5sZWZ0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0O1xuICByZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudFdpZHRoO1xuICByZWN0LndpZHRoID0gZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC5oZWlnaHQgPSBlbGVtZW50LmNsaWVudEhlaWdodDtcbiAgcmVjdC54ID0gcmVjdC5sZWZ0O1xuICByZWN0LnkgPSByZWN0LnRvcDtcblxuICByZXR1cm4gcmVjdDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoXG4gIGVsZW1lbnQ6IEVsZW1lbnQsXG4gIGNsaXBwaW5nUGFyZW50OiBFbGVtZW50IHwgUm9vdEJvdW5kYXJ5XG4pOiBDbGllbnRSZWN0T2JqZWN0IHtcbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50ID09PSB2aWV3cG9ydFxuICAgID8gcmVjdFRvQ2xpZW50UmVjdChnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCkpXG4gICAgOiBpc0VsZW1lbnQoY2xpcHBpbmdQYXJlbnQpXG4gICAgPyBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChjbGlwcGluZ1BhcmVudClcbiAgICA6IHJlY3RUb0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkpO1xufVxuXG4vLyBBIFwiY2xpcHBpbmcgcGFyZW50XCIgaXMgYW4gb3ZlcmZsb3dhYmxlIGNvbnRhaW5lciB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpYyBvZlxuLy8gY2xpcHBpbmcgKG9yIGhpZGluZykgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2l0aCBhIHBvc2l0aW9uIGRpZmZlcmVudCBmcm9tXG4vLyBgaW5pdGlhbGBcbmZ1bmN0aW9uIGdldENsaXBwaW5nUGFyZW50cyhlbGVtZW50OiBFbGVtZW50KTogQXJyYXk8RWxlbWVudD4ge1xuICBjb25zdCBjbGlwcGluZ1BhcmVudHMgPSBsaXN0U2Nyb2xsUGFyZW50cyhnZXRQYXJlbnROb2RlKGVsZW1lbnQpKTtcbiAgY29uc3QgY2FuRXNjYXBlQ2xpcHBpbmcgPVxuICAgIFsnYWJzb2x1dGUnLCAnZml4ZWQnXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24pID49IDA7XG4gIGNvbnN0IGNsaXBwZXJFbGVtZW50ID1cbiAgICBjYW5Fc2NhcGVDbGlwcGluZyAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpXG4gICAgICA/IGdldE9mZnNldFBhcmVudChlbGVtZW50KVxuICAgICAgOiBlbGVtZW50O1xuXG4gIGlmICghaXNFbGVtZW50KGNsaXBwZXJFbGVtZW50KSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXJldHVybl06IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8xNDE0XG4gIHJldHVybiBjbGlwcGluZ1BhcmVudHMuZmlsdGVyKFxuICAgIChjbGlwcGluZ1BhcmVudCkgPT5cbiAgICAgIGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgJiZcbiAgICAgIGNvbnRhaW5zKGNsaXBwaW5nUGFyZW50LCBjbGlwcGVyRWxlbWVudCkgJiZcbiAgICAgIGdldE5vZGVOYW1lKGNsaXBwaW5nUGFyZW50KSAhPT0gJ2JvZHknXG4gICk7XG59XG5cbi8vIEdldHMgdGhlIG1heGltdW0gYXJlYSB0aGF0IHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gZHVlIHRvIGFueSBudW1iZXIgb2Zcbi8vIGNsaXBwaW5nIHBhcmVudHNcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldENsaXBwaW5nUmVjdChcbiAgZWxlbWVudDogRWxlbWVudCxcbiAgYm91bmRhcnk6IEJvdW5kYXJ5LFxuICByb290Qm91bmRhcnk6IFJvb3RCb3VuZGFyeVxuKTogQ2xpZW50UmVjdE9iamVjdCB7XG4gIGNvbnN0IG1haW5DbGlwcGluZ1BhcmVudHMgPVxuICAgIGJvdW5kYXJ5ID09PSAnY2xpcHBpbmdQYXJlbnRzJ1xuICAgICAgPyBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudClcbiAgICAgIDogW10uY29uY2F0KGJvdW5kYXJ5KTtcbiAgY29uc3QgY2xpcHBpbmdQYXJlbnRzID0gWy4uLm1haW5DbGlwcGluZ1BhcmVudHMsIHJvb3RCb3VuZGFyeV07XG4gIGNvbnN0IGZpcnN0Q2xpcHBpbmdQYXJlbnQgPSBjbGlwcGluZ1BhcmVudHNbMF07XG5cbiAgY29uc3QgY2xpcHBpbmdSZWN0ID0gY2xpcHBpbmdQYXJlbnRzLnJlZHVjZSgoYWNjUmVjdCwgY2xpcHBpbmdQYXJlbnQpID0+IHtcbiAgICBjb25zdCByZWN0ID0gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQpO1xuXG4gICAgYWNjUmVjdC50b3AgPSBtYXgocmVjdC50b3AsIGFjY1JlY3QudG9wKTtcbiAgICBhY2NSZWN0LnJpZ2h0ID0gbWluKHJlY3QucmlnaHQsIGFjY1JlY3QucmlnaHQpO1xuICAgIGFjY1JlY3QuYm90dG9tID0gbWluKHJlY3QuYm90dG9tLCBhY2NSZWN0LmJvdHRvbSk7XG4gICAgYWNjUmVjdC5sZWZ0ID0gbWF4KHJlY3QubGVmdCwgYWNjUmVjdC5sZWZ0KTtcblxuICAgIHJldHVybiBhY2NSZWN0O1xuICB9LCBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBmaXJzdENsaXBwaW5nUGFyZW50KSk7XG5cbiAgY2xpcHBpbmdSZWN0LndpZHRoID0gY2xpcHBpbmdSZWN0LnJpZ2h0IC0gY2xpcHBpbmdSZWN0LmxlZnQ7XG4gIGNsaXBwaW5nUmVjdC5oZWlnaHQgPSBjbGlwcGluZ1JlY3QuYm90dG9tIC0gY2xpcHBpbmdSZWN0LnRvcDtcbiAgY2xpcHBpbmdSZWN0LnggPSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LnkgPSBjbGlwcGluZ1JlY3QudG9wO1xuXG4gIHJldHVybiBjbGlwcGluZ1JlY3Q7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgdHlwZSBWYXJpYXRpb24sIHR5cGUgUGxhY2VtZW50IH0gZnJvbSAnLi4vZW51bXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWYXJpYXRpb24ocGxhY2VtZW50OiBQbGFjZW1lbnQpOiA/VmFyaWF0aW9uIHtcbiAgcmV0dXJuIChwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTogYW55KTtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7IFBsYWNlbWVudCB9IGZyb20gJy4uL2VudW1zJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KFxuICBwbGFjZW1lbnQ6IFBsYWNlbWVudFxuKTogJ3gnIHwgJ3knIHtcbiAgcmV0dXJuIFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSA+PSAwID8gJ3gnIDogJ3knO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gJy4vZ2V0QmFzZVBsYWNlbWVudCc7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gJy4vZ2V0VmFyaWF0aW9uJztcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSAnLi9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQnO1xuaW1wb3J0IHR5cGUge1xuICBSZWN0LFxuICBQb3NpdGlvbmluZ1N0cmF0ZWd5LFxuICBPZmZzZXRzLFxuICBDbGllbnRSZWN0T2JqZWN0LFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHN0YXJ0LCBlbmQsIHR5cGUgUGxhY2VtZW50IH0gZnJvbSAnLi4vZW51bXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlT2Zmc2V0cyh7XG4gIHJlZmVyZW5jZSxcbiAgZWxlbWVudCxcbiAgcGxhY2VtZW50LFxufToge1xuICByZWZlcmVuY2U6IFJlY3QgfCBDbGllbnRSZWN0T2JqZWN0LFxuICBlbGVtZW50OiBSZWN0IHwgQ2xpZW50UmVjdE9iamVjdCxcbiAgc3RyYXRlZ3k6IFBvc2l0aW9uaW5nU3RyYXRlZ3ksXG4gIHBsYWNlbWVudD86IFBsYWNlbWVudCxcbn0pOiBPZmZzZXRzIHtcbiAgY29uc3QgYmFzZVBsYWNlbWVudCA9IHBsYWNlbWVudCA/IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSA6IG51bGw7XG4gIGNvbnN0IHZhcmlhdGlvbiA9IHBsYWNlbWVudCA/IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIDogbnVsbDtcbiAgY29uc3QgY29tbW9uWCA9IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoIC8gMiAtIGVsZW1lbnQud2lkdGggLyAyO1xuICBjb25zdCBjb21tb25ZID0gcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0IC8gMiAtIGVsZW1lbnQuaGVpZ2h0IC8gMjtcblxuICBsZXQgb2Zmc2V0cztcbiAgc3dpdGNoIChiYXNlUGxhY2VtZW50KSB7XG4gICAgY2FzZSB0b3A6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSAtIGVsZW1lbnQuaGVpZ2h0LFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgYm90dG9tOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0LFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgcmlnaHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWSxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlIGxlZnQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCAtIGVsZW1lbnQud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vblksXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54LFxuICAgICAgICB5OiByZWZlcmVuY2UueSxcbiAgICAgIH07XG4gIH1cblxuICBjb25zdCBtYWluQXhpcyA9IGJhc2VQbGFjZW1lbnRcbiAgICA/IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KVxuICAgIDogbnVsbDtcblxuICBpZiAobWFpbkF4aXMgIT0gbnVsbCkge1xuICAgIGNvbnN0IGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICBzd2l0Y2ggKHZhcmlhdGlvbikge1xuICAgICAgY2FzZSBzdGFydDpcbiAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gPVxuICAgICAgICAgIG9mZnNldHNbbWFpbkF4aXNdIC0gKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgZW5kOlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9XG4gICAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gKyAocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0cztcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7IFNpZGVPYmplY3QgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEZyZXNoU2lkZU9iamVjdCgpOiBTaWRlT2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGxlZnQ6IDAsXG4gIH07XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBTaWRlT2JqZWN0IH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGdldEZyZXNoU2lkZU9iamVjdCBmcm9tICcuL2dldEZyZXNoU2lkZU9iamVjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlUGFkZGluZ09iamVjdChcbiAgcGFkZGluZ09iamVjdDogJFNoYXBlPFNpZGVPYmplY3Q+XG4pOiBTaWRlT2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5nZXRGcmVzaFNpZGVPYmplY3QoKSxcbiAgICAuLi5wYWRkaW5nT2JqZWN0LFxuICB9O1xufVxuIiwiLy8gQGZsb3dcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhwYW5kVG9IYXNoTWFwPFxuICBUOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuLFxuICBLOiBzdHJpbmdcbj4odmFsdWU6IFQsIGtleXM6IEFycmF5PEs+KTogeyBba2V5OiBzdHJpbmddOiBUIH0ge1xuICByZXR1cm4ga2V5cy5yZWR1Y2UoKGhhc2hNYXAsIGtleSkgPT4ge1xuICAgIGhhc2hNYXBba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiBoYXNoTWFwO1xuICB9LCB7fSk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBTdGF0ZSwgU2lkZU9iamVjdCwgUGFkZGluZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgUGxhY2VtZW50LCBCb3VuZGFyeSwgUm9vdEJvdW5kYXJ5LCBDb250ZXh0IH0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IGdldENsaXBwaW5nUmVjdCBmcm9tICcuLi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0JztcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSAnLi4vZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudCc7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gJy4uL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QnO1xuaW1wb3J0IGNvbXB1dGVPZmZzZXRzIGZyb20gJy4vY29tcHV0ZU9mZnNldHMnO1xuaW1wb3J0IHJlY3RUb0NsaWVudFJlY3QgZnJvbSAnLi9yZWN0VG9DbGllbnRSZWN0JztcbmltcG9ydCB7XG4gIGNsaXBwaW5nUGFyZW50cyxcbiAgcmVmZXJlbmNlLFxuICBwb3BwZXIsXG4gIGJvdHRvbSxcbiAgdG9wLFxuICByaWdodCxcbiAgYmFzZVBsYWNlbWVudHMsXG4gIHZpZXdwb3J0LFxufSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tICcuLi9kb20tdXRpbHMvaW5zdGFuY2VPZic7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gJy4vbWVyZ2VQYWRkaW5nT2JqZWN0JztcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSAnLi9leHBhbmRUb0hhc2hNYXAnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5leHBvcnQgdHlwZSBPcHRpb25zID0ge1xuICBwbGFjZW1lbnQ6IFBsYWNlbWVudCxcbiAgYm91bmRhcnk6IEJvdW5kYXJ5LFxuICByb290Qm91bmRhcnk6IFJvb3RCb3VuZGFyeSxcbiAgZWxlbWVudENvbnRleHQ6IENvbnRleHQsXG4gIGFsdEJvdW5kYXJ5OiBib29sZWFuLFxuICBwYWRkaW5nOiBQYWRkaW5nLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGV0ZWN0T3ZlcmZsb3coXG4gIHN0YXRlOiBTdGF0ZSxcbiAgb3B0aW9uczogJFNoYXBlPE9wdGlvbnM+ID0ge31cbik6IFNpZGVPYmplY3Qge1xuICBjb25zdCB7XG4gICAgcGxhY2VtZW50ID0gc3RhdGUucGxhY2VtZW50LFxuICAgIGJvdW5kYXJ5ID0gY2xpcHBpbmdQYXJlbnRzLFxuICAgIHJvb3RCb3VuZGFyeSA9IHZpZXdwb3J0LFxuICAgIGVsZW1lbnRDb250ZXh0ID0gcG9wcGVyLFxuICAgIGFsdEJvdW5kYXJ5ID0gZmFsc2UsXG4gICAgcGFkZGluZyA9IDAsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHBhZGRpbmdPYmplY3QgPSBtZXJnZVBhZGRpbmdPYmplY3QoXG4gICAgdHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInXG4gICAgICA/IHBhZGRpbmdcbiAgICAgIDogZXhwYW5kVG9IYXNoTWFwKHBhZGRpbmcsIGJhc2VQbGFjZW1lbnRzKVxuICApO1xuXG4gIGNvbnN0IGFsdENvbnRleHQgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcmVmZXJlbmNlIDogcG9wcGVyO1xuXG4gIGNvbnN0IHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIGNvbnN0IGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1thbHRCb3VuZGFyeSA/IGFsdENvbnRleHQgOiBlbGVtZW50Q29udGV4dF07XG5cbiAgY29uc3QgY2xpcHBpbmdDbGllbnRSZWN0ID0gZ2V0Q2xpcHBpbmdSZWN0KFxuICAgIGlzRWxlbWVudChlbGVtZW50KVxuICAgICAgPyBlbGVtZW50XG4gICAgICA6IGVsZW1lbnQuY29udGV4dEVsZW1lbnQgfHwgZ2V0RG9jdW1lbnRFbGVtZW50KHN0YXRlLmVsZW1lbnRzLnBvcHBlciksXG4gICAgYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5XG4gICk7XG5cbiAgY29uc3QgcmVmZXJlbmNlQ2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChzdGF0ZS5lbGVtZW50cy5yZWZlcmVuY2UpO1xuXG4gIGNvbnN0IHBvcHBlck9mZnNldHMgPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiByZWZlcmVuY2VDbGllbnRSZWN0LFxuICAgIGVsZW1lbnQ6IHBvcHBlclJlY3QsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50LFxuICB9KTtcblxuICBjb25zdCBwb3BwZXJDbGllbnRSZWN0ID0gcmVjdFRvQ2xpZW50UmVjdCh7XG4gICAgLi4ucG9wcGVyUmVjdCxcbiAgICAuLi5wb3BwZXJPZmZzZXRzLFxuICB9KTtcblxuICBjb25zdCBlbGVtZW50Q2xpZW50UmVjdCA9XG4gICAgZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHBvcHBlckNsaWVudFJlY3QgOiByZWZlcmVuY2VDbGllbnRSZWN0O1xuXG4gIC8vIHBvc2l0aXZlID0gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIHJlY3RcbiAgLy8gMCBvciBuZWdhdGl2ZSA9IHdpdGhpbiB0aGUgY2xpcHBpbmcgcmVjdFxuICBjb25zdCBvdmVyZmxvd09mZnNldHMgPSB7XG4gICAgdG9wOiBjbGlwcGluZ0NsaWVudFJlY3QudG9wIC0gZWxlbWVudENsaWVudFJlY3QudG9wICsgcGFkZGluZ09iamVjdC50b3AsXG4gICAgYm90dG9tOlxuICAgICAgZWxlbWVudENsaWVudFJlY3QuYm90dG9tIC1cbiAgICAgIGNsaXBwaW5nQ2xpZW50UmVjdC5ib3R0b20gK1xuICAgICAgcGFkZGluZ09iamVjdC5ib3R0b20sXG4gICAgbGVmdDogY2xpcHBpbmdDbGllbnRSZWN0LmxlZnQgLSBlbGVtZW50Q2xpZW50UmVjdC5sZWZ0ICsgcGFkZGluZ09iamVjdC5sZWZ0LFxuICAgIHJpZ2h0OlxuICAgICAgZWxlbWVudENsaWVudFJlY3QucmlnaHQgLSBjbGlwcGluZ0NsaWVudFJlY3QucmlnaHQgKyBwYWRkaW5nT2JqZWN0LnJpZ2h0LFxuICB9O1xuXG4gIGNvbnN0IG9mZnNldERhdGEgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldDtcblxuICAvLyBPZmZzZXRzIGNhbiBiZSBhcHBsaWVkIG9ubHkgdG8gdGhlIHBvcHBlciBlbGVtZW50XG4gIGlmIChlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyICYmIG9mZnNldERhdGEpIHtcbiAgICBjb25zdCBvZmZzZXQgPSBvZmZzZXREYXRhW3BsYWNlbWVudF07XG5cbiAgICBPYmplY3Qua2V5cyhvdmVyZmxvd09mZnNldHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgbXVsdGlwbHkgPSBbcmlnaHQsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAxIDogLTE7XG4gICAgICBjb25zdCBheGlzID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKGtleSkgPj0gMCA/ICd5JyA6ICd4JztcbiAgICAgIG92ZXJmbG93T2Zmc2V0c1trZXldICs9IG9mZnNldFtheGlzXSAqIG11bHRpcGx5O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG92ZXJmbG93T2Zmc2V0cztcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7XG4gIFN0YXRlLFxuICBPcHRpb25zR2VuZXJpYyxcbiAgTW9kaWZpZXIsXG4gIEluc3RhbmNlLFxuICBWaXJ0dWFsRWxlbWVudCxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgZ2V0Q29tcG9zaXRlUmVjdCBmcm9tICcuL2RvbS11dGlscy9nZXRDb21wb3NpdGVSZWN0JztcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gJy4vZG9tLXV0aWxzL2dldExheW91dFJlY3QnO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gJy4vZG9tLXV0aWxzL2xpc3RTY3JvbGxQYXJlbnRzJztcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSAnLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50JztcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gJy4vZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUnO1xuaW1wb3J0IG9yZGVyTW9kaWZpZXJzIGZyb20gJy4vdXRpbHMvb3JkZXJNb2RpZmllcnMnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJy4vdXRpbHMvZGVib3VuY2UnO1xuaW1wb3J0IHZhbGlkYXRlTW9kaWZpZXJzIGZyb20gJy4vdXRpbHMvdmFsaWRhdGVNb2RpZmllcnMnO1xuaW1wb3J0IHVuaXF1ZUJ5IGZyb20gJy4vdXRpbHMvdW5pcXVlQnknO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSAnLi91dGlscy9nZXRCYXNlUGxhY2VtZW50JztcbmltcG9ydCBtZXJnZUJ5TmFtZSBmcm9tICcuL3V0aWxzL21lcmdlQnlOYW1lJztcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tICcuL3V0aWxzL2RldGVjdE92ZXJmbG93JztcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gJy4vZG9tLXV0aWxzL2luc3RhbmNlT2YnO1xuaW1wb3J0IHsgYXV0byB9IGZyb20gJy4vZW51bXMnO1xuXG5jb25zdCBJTlZBTElEX0VMRU1FTlRfRVJST1IgPVxuICAnUG9wcGVyOiBJbnZhbGlkIHJlZmVyZW5jZSBvciBwb3BwZXIgYXJndW1lbnQgcHJvdmlkZWQuIFRoZXkgbXVzdCBiZSBlaXRoZXIgYSBET00gZWxlbWVudCBvciB2aXJ0dWFsIGVsZW1lbnQuJztcbmNvbnN0IElORklOSVRFX0xPT1BfRVJST1IgPVxuICAnUG9wcGVyOiBBbiBpbmZpbml0ZSBsb29wIGluIHRoZSBtb2RpZmllcnMgY3ljbGUgaGFzIGJlZW4gZGV0ZWN0ZWQhIFRoZSBjeWNsZSBoYXMgYmVlbiBpbnRlcnJ1cHRlZCB0byBwcmV2ZW50IGEgYnJvd3NlciBjcmFzaC4nO1xuXG5jb25zdCBERUZBVUxUX09QVElPTlM6IE9wdGlvbnNHZW5lcmljPGFueT4gPSB7XG4gIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gIG1vZGlmaWVyczogW10sXG4gIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxufTtcblxudHlwZSBQb3BwZXJHZW5lcmF0b3JBcmdzID0ge1xuICBkZWZhdWx0TW9kaWZpZXJzPzogQXJyYXk8TW9kaWZpZXI8YW55LCBhbnk+PixcbiAgZGVmYXVsdE9wdGlvbnM/OiAkU2hhcGU8T3B0aW9uc0dlbmVyaWM8YW55Pj4sXG59O1xuXG5mdW5jdGlvbiBhcmVWYWxpZEVsZW1lbnRzKC4uLmFyZ3M6IEFycmF5PGFueT4pOiBib29sZWFuIHtcbiAgcmV0dXJuICFhcmdzLnNvbWUoXG4gICAgKGVsZW1lbnQpID0+XG4gICAgICAhKGVsZW1lbnQgJiYgdHlwZW9mIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID09PSAnZnVuY3Rpb24nKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9wcGVyR2VuZXJhdG9yKGdlbmVyYXRvck9wdGlvbnM6IFBvcHBlckdlbmVyYXRvckFyZ3MgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZGVmYXVsdE1vZGlmaWVycyA9IFtdLFxuICAgIGRlZmF1bHRPcHRpb25zID0gREVGQVVMVF9PUFRJT05TLFxuICB9ID0gZ2VuZXJhdG9yT3B0aW9ucztcblxuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlUG9wcGVyPFRNb2RpZmllcjogJFNoYXBlPE1vZGlmaWVyPGFueSwgYW55Pj4+KFxuICAgIHJlZmVyZW5jZTogRWxlbWVudCB8IFZpcnR1YWxFbGVtZW50LFxuICAgIHBvcHBlcjogSFRNTEVsZW1lbnQsXG4gICAgb3B0aW9uczogJFNoYXBlPE9wdGlvbnNHZW5lcmljPFRNb2RpZmllcj4+ID0gZGVmYXVsdE9wdGlvbnNcbiAgKTogSW5zdGFuY2Uge1xuICAgIGxldCBzdGF0ZTogJFNoYXBlPFN0YXRlPiA9IHtcbiAgICAgIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gICAgICBvcmRlcmVkTW9kaWZpZXJzOiBbXSxcbiAgICAgIG9wdGlvbnM6IHsgLi4uREVGQVVMVF9PUFRJT05TLCAuLi5kZWZhdWx0T3B0aW9ucyB9LFxuICAgICAgbW9kaWZpZXJzRGF0YToge30sXG4gICAgICBlbGVtZW50czoge1xuICAgICAgICByZWZlcmVuY2UsXG4gICAgICAgIHBvcHBlcixcbiAgICAgIH0sXG4gICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgIHN0eWxlczoge30sXG4gICAgfTtcblxuICAgIGxldCBlZmZlY3RDbGVhbnVwRm5zOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuICAgIGxldCBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgaW5zdGFuY2UgPSB7XG4gICAgICBzdGF0ZSxcbiAgICAgIHNldE9wdGlvbnMoc2V0T3B0aW9uc0FjdGlvbikge1xuICAgICAgICBjb25zdCBvcHRpb25zID1cbiAgICAgICAgICB0eXBlb2Ygc2V0T3B0aW9uc0FjdGlvbiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBzZXRPcHRpb25zQWN0aW9uKHN0YXRlLm9wdGlvbnMpXG4gICAgICAgICAgICA6IHNldE9wdGlvbnNBY3Rpb247XG5cbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuXG4gICAgICAgIHN0YXRlLm9wdGlvbnMgPSB7XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVtleHBvbmVudGlhbC1zcHJlYWRdXG4gICAgICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgLi4uc3RhdGUub3B0aW9ucyxcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9O1xuXG4gICAgICAgIHN0YXRlLnNjcm9sbFBhcmVudHMgPSB7XG4gICAgICAgICAgcmVmZXJlbmNlOiBpc0VsZW1lbnQocmVmZXJlbmNlKVxuICAgICAgICAgICAgPyBsaXN0U2Nyb2xsUGFyZW50cyhyZWZlcmVuY2UpXG4gICAgICAgICAgICA6IHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudFxuICAgICAgICAgICAgPyBsaXN0U2Nyb2xsUGFyZW50cyhyZWZlcmVuY2UuY29udGV4dEVsZW1lbnQpXG4gICAgICAgICAgICA6IFtdLFxuICAgICAgICAgIHBvcHBlcjogbGlzdFNjcm9sbFBhcmVudHMocG9wcGVyKSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBPcmRlcnMgdGhlIG1vZGlmaWVycyBiYXNlZCBvbiB0aGVpciBkZXBlbmRlbmNpZXMgYW5kIGBwaGFzZWBcbiAgICAgICAgLy8gcHJvcGVydGllc1xuICAgICAgICBjb25zdCBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXJNb2RpZmllcnMoXG4gICAgICAgICAgbWVyZ2VCeU5hbWUoWy4uLmRlZmF1bHRNb2RpZmllcnMsIC4uLnN0YXRlLm9wdGlvbnMubW9kaWZpZXJzXSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTdHJpcCBvdXQgZGlzYWJsZWQgbW9kaWZpZXJzXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcigobSkgPT4gbS5lbmFibGVkKTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgcHJvdmlkZWQgbW9kaWZpZXJzIHNvIHRoYXQgdGhlIGNvbnN1bWVyIHdpbGwgZ2V0IHdhcm5lZFxuICAgICAgICAvLyBpZiBvbmUgb2YgdGhlIG1vZGlmaWVycyBpcyBpbnZhbGlkIGZvciBhbnkgcmVhc29uXG4gICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgY29uc3QgbW9kaWZpZXJzID0gdW5pcXVlQnkoXG4gICAgICAgICAgICBbLi4ub3JkZXJlZE1vZGlmaWVycywgLi4uc3RhdGUub3B0aW9ucy5tb2RpZmllcnNdLFxuICAgICAgICAgICAgKHsgbmFtZSB9KSA9PiBuYW1lXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHZhbGlkYXRlTW9kaWZpZXJzKG1vZGlmaWVycyk7XG5cbiAgICAgICAgICBpZiAoZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5vcHRpb25zLnBsYWNlbWVudCkgPT09IGF1dG8pIHtcbiAgICAgICAgICAgIGNvbnN0IGZsaXBNb2RpZmllciA9IHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZmluZChcbiAgICAgICAgICAgICAgKHsgbmFtZSB9KSA9PiBuYW1lID09PSAnZmxpcCdcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmICghZmxpcE1vZGlmaWVyKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgJ1BvcHBlcjogXCJhdXRvXCIgcGxhY2VtZW50cyByZXF1aXJlIHRoZSBcImZsaXBcIiBtb2RpZmllciBiZScsXG4gICAgICAgICAgICAgICAgICAncHJlc2VudCBhbmQgZW5hYmxlZCB0byB3b3JrLicsXG4gICAgICAgICAgICAgICAgXS5qb2luKCcgJylcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBtYXJnaW5Ub3AsXG4gICAgICAgICAgICBtYXJnaW5SaWdodCxcbiAgICAgICAgICAgIG1hcmdpbkJvdHRvbSxcbiAgICAgICAgICAgIG1hcmdpbkxlZnQsXG4gICAgICAgICAgfSA9IGdldENvbXB1dGVkU3R5bGUocG9wcGVyKTtcblxuICAgICAgICAgIC8vIFdlIG5vIGxvbmdlciB0YWtlIGludG8gYWNjb3VudCBgbWFyZ2luc2Agb24gdGhlIHBvcHBlciwgYW5kIGl0IGNhblxuICAgICAgICAgIC8vIGNhdXNlIGJ1Z3Mgd2l0aCBwb3NpdGlvbmluZywgc28gd2UnbGwgd2FybiB0aGUgY29uc3VtZXJcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBbbWFyZ2luVG9wLCBtYXJnaW5SaWdodCwgbWFyZ2luQm90dG9tLCBtYXJnaW5MZWZ0XS5zb21lKChtYXJnaW4pID0+XG4gICAgICAgICAgICAgIHBhcnNlRmxvYXQobWFyZ2luKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgJ1BvcHBlcjogQ1NTIFwibWFyZ2luXCIgc3R5bGVzIGNhbm5vdCBiZSB1c2VkIHRvIGFwcGx5IHBhZGRpbmcnLFxuICAgICAgICAgICAgICAgICdiZXR3ZWVuIHRoZSBwb3BwZXIgYW5kIGl0cyByZWZlcmVuY2UgZWxlbWVudCBvciBib3VuZGFyeS4nLFxuICAgICAgICAgICAgICAgICdUbyByZXBsaWNhdGUgbWFyZ2luLCB1c2UgdGhlIGBvZmZzZXRgIG1vZGlmaWVyLCBhcyB3ZWxsIGFzJyxcbiAgICAgICAgICAgICAgICAndGhlIGBwYWRkaW5nYCBvcHRpb24gaW4gdGhlIGBwcmV2ZW50T3ZlcmZsb3dgIGFuZCBgZmxpcGAnLFxuICAgICAgICAgICAgICAgICdtb2RpZmllcnMuJyxcbiAgICAgICAgICAgICAgXS5qb2luKCcgJylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcnVuTW9kaWZpZXJFZmZlY3RzKCk7XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgfSxcblxuICAgICAgLy8gU3luYyB1cGRhdGUg4oCTIGl0IHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkLCBldmVuIGlmIG5vdCBuZWNlc3NhcnkuIFRoaXNcbiAgICAgIC8vIGlzIHVzZWZ1bCBmb3IgbG93IGZyZXF1ZW5jeSB1cGRhdGVzIHdoZXJlIHN5bmMgYmVoYXZpb3Igc2ltcGxpZmllcyB0aGVcbiAgICAgIC8vIGxvZ2ljLlxuICAgICAgLy8gRm9yIGhpZ2ggZnJlcXVlbmN5IHVwZGF0ZXMgKGUuZy4gYHJlc2l6ZWAgYW5kIGBzY3JvbGxgIGV2ZW50cyksIGFsd2F5c1xuICAgICAgLy8gcHJlZmVyIHRoZSBhc3luYyBQb3BwZXIjdXBkYXRlIG1ldGhvZFxuICAgICAgZm9yY2VVcGRhdGUoKSB7XG4gICAgICAgIGlmIChpc0Rlc3Ryb3llZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgcmVmZXJlbmNlLCBwb3BwZXIgfSA9IHN0YXRlLmVsZW1lbnRzO1xuXG4gICAgICAgIC8vIERvbid0IHByb2NlZWQgaWYgYHJlZmVyZW5jZWAgb3IgYHBvcHBlcmAgYXJlIG5vdCB2YWxpZCBlbGVtZW50c1xuICAgICAgICAvLyBhbnltb3JlXG4gICAgICAgIGlmICghYXJlVmFsaWRFbGVtZW50cyhyZWZlcmVuY2UsIHBvcHBlcikpIHtcbiAgICAgICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihJTlZBTElEX0VMRU1FTlRfRVJST1IpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIGFuZCBwb3BwZXIgcmVjdHMgdG8gYmUgcmVhZCBieSBtb2RpZmllcnNcbiAgICAgICAgc3RhdGUucmVjdHMgPSB7XG4gICAgICAgICAgcmVmZXJlbmNlOiBnZXRDb21wb3NpdGVSZWN0KFxuICAgICAgICAgICAgcmVmZXJlbmNlLFxuICAgICAgICAgICAgZ2V0T2Zmc2V0UGFyZW50KHBvcHBlciksXG4gICAgICAgICAgICBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnXG4gICAgICAgICAgKSxcbiAgICAgICAgICBwb3BwZXI6IGdldExheW91dFJlY3QocG9wcGVyKSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byByZXNldCB0aGUgY3VycmVudCB1cGRhdGUgY3ljbGUuIFRoZVxuICAgICAgICAvLyBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0aGUgYGZsaXBgIG1vZGlmaWVyIGNoYW5naW5nIHRoZVxuICAgICAgICAvLyBwbGFjZW1lbnQsIHdoaWNoIHRoZW4gbmVlZHMgdG8gcmUtcnVuIGFsbCB0aGUgbW9kaWZpZXJzLCBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBsb2dpYyB3YXMgcHJldmlvdXNseSByYW4gZm9yIHRoZSBwcmV2aW91cyBwbGFjZW1lbnQgYW5kIGlzIHRoZXJlZm9yZVxuICAgICAgICAvLyBzdGFsZS9pbmNvcnJlY3RcbiAgICAgICAgc3RhdGUucmVzZXQgPSBmYWxzZTtcblxuICAgICAgICBzdGF0ZS5wbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDtcblxuICAgICAgICAvLyBPbiBlYWNoIHVwZGF0ZSBjeWNsZSwgdGhlIGBtb2RpZmllcnNEYXRhYCBwcm9wZXJ0eSBmb3IgZWFjaCBtb2RpZmllclxuICAgICAgICAvLyBpcyBmaWxsZWQgd2l0aCB0aGUgaW5pdGlhbCBkYXRhIHNwZWNpZmllZCBieSB0aGUgbW9kaWZpZXIuIFRoaXMgbWVhbnNcbiAgICAgICAgLy8gaXQgZG9lc24ndCBwZXJzaXN0IGFuZCBpcyBmcmVzaCBvbiBlYWNoIHVwZGF0ZS5cbiAgICAgICAgLy8gVG8gZW5zdXJlIHBlcnNpc3RlbnQgZGF0YSwgdXNlIGAke25hbWV9I3BlcnNpc3RlbnRgXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChcbiAgICAgICAgICAobW9kaWZpZXIpID0+XG4gICAgICAgICAgICAoc3RhdGUubW9kaWZpZXJzRGF0YVttb2RpZmllci5uYW1lXSA9IHtcbiAgICAgICAgICAgICAgLi4ubW9kaWZpZXIuZGF0YSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IF9fZGVidWdfbG9vcHNfXyA9IDA7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgICBfX2RlYnVnX2xvb3BzX18gKz0gMTtcbiAgICAgICAgICAgIGlmIChfX2RlYnVnX2xvb3BzX18gPiAxMDApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihJTkZJTklURV9MT09QX0VSUk9SKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN0YXRlLnJlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHsgZm4sIG9wdGlvbnMgPSB7fSwgbmFtZSB9ID0gc3RhdGUub3JkZXJlZE1vZGlmaWVyc1tpbmRleF07XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IGZuKHsgc3RhdGUsIG9wdGlvbnMsIG5hbWUsIGluc3RhbmNlIH0pIHx8IHN0YXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gQXN5bmMgYW5kIG9wdGltaXN0aWNhbGx5IG9wdGltaXplZCB1cGRhdGUg4oCTIGl0IHdpbGwgbm90IGJlIGV4ZWN1dGVkIGlmXG4gICAgICAvLyBub3QgbmVjZXNzYXJ5IChkZWJvdW5jZWQgdG8gcnVuIGF0IG1vc3Qgb25jZS1wZXItdGljaylcbiAgICAgIHVwZGF0ZTogZGVib3VuY2U8JFNoYXBlPFN0YXRlPj4oXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IFByb21pc2U8JFNoYXBlPFN0YXRlPj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGluc3RhbmNlLmZvcmNlVXBkYXRlKCk7XG4gICAgICAgICAgICByZXNvbHZlKHN0YXRlKTtcbiAgICAgICAgICB9KVxuICAgICAgKSxcblxuICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICBjb25zb2xlLmVycm9yKElOVkFMSURfRUxFTUVOVF9FUlJPUik7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgaW5zdGFuY2Uuc2V0T3B0aW9ucyhvcHRpb25zKS50aGVuKChzdGF0ZSkgPT4ge1xuICAgICAgaWYgKCFpc0Rlc3Ryb3llZCAmJiBvcHRpb25zLm9uRmlyc3RVcGRhdGUpIHtcbiAgICAgICAgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKHN0YXRlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgYmVmb3JlIHRoZSBmaXJzdFxuICAgIC8vIHVwZGF0ZSBjeWNsZSBydW5zLiBUaGV5IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHVwZGF0ZVxuICAgIC8vIGN5Y2xlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgbW9kaWZpZXIgYWRkcyBzb21lIHBlcnNpc3RlbnQgZGF0YSB0aGF0XG4gICAgLy8gb3RoZXIgbW9kaWZpZXJzIG5lZWQgdG8gdXNlLCBidXQgdGhlIG1vZGlmaWVyIGlzIHJ1biBhZnRlciB0aGUgZGVwZW5kZW50XG4gICAgLy8gb25lLlxuICAgIGZ1bmN0aW9uIHJ1bk1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaCgoeyBuYW1lLCBvcHRpb25zID0ge30sIGVmZmVjdCB9KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZWZmZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc3QgY2xlYW51cEZuID0gZWZmZWN0KHsgc3RhdGUsIG5hbWUsIGluc3RhbmNlLCBvcHRpb25zIH0pO1xuICAgICAgICAgIGNvbnN0IG5vb3BGbiA9ICgpID0+IHt9O1xuICAgICAgICAgIGVmZmVjdENsZWFudXBGbnMucHVzaChjbGVhbnVwRm4gfHwgbm9vcEZuKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIGVmZmVjdENsZWFudXBGbnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuICAgICAgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBvcHBlciA9IHBvcHBlckdlbmVyYXRvcigpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5leHBvcnQgeyBkZXRlY3RPdmVyZmxvdyB9O1xuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHsgTW9kaWZpZXJBcmd1bWVudHMsIE1vZGlmaWVyIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tICcuLi9kb20tdXRpbHMvZ2V0V2luZG93JztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtcbiAgc2Nyb2xsOiBib29sZWFuLFxuICByZXNpemU6IGJvb2xlYW4sXG59O1xuXG5jb25zdCBwYXNzaXZlID0geyBwYXNzaXZlOiB0cnVlIH07XG5cbmZ1bmN0aW9uIGVmZmVjdCh7IHN0YXRlLCBpbnN0YW5jZSwgb3B0aW9ucyB9OiBNb2RpZmllckFyZ3VtZW50czxPcHRpb25zPikge1xuICBjb25zdCB7IHNjcm9sbCA9IHRydWUsIHJlc2l6ZSA9IHRydWUgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3Qgd2luZG93ID0gZ2V0V2luZG93KHN0YXRlLmVsZW1lbnRzLnBvcHBlcik7XG4gIGNvbnN0IHNjcm9sbFBhcmVudHMgPSBbXG4gICAgLi4uc3RhdGUuc2Nyb2xsUGFyZW50cy5yZWZlcmVuY2UsXG4gICAgLi4uc3RhdGUuc2Nyb2xsUGFyZW50cy5wb3BwZXIsXG4gIF07XG5cbiAgaWYgKHNjcm9sbCkge1xuICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChzY3JvbGxQYXJlbnQgPT4ge1xuICAgICAgc2Nyb2xsUGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAocmVzaXplKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gIH1cblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGlmIChzY3JvbGwpIHtcbiAgICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChzY3JvbGxQYXJlbnQgPT4ge1xuICAgICAgICBzY3JvbGxQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChyZXNpemUpIHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBpbnN0YW5jZS51cGRhdGUsIHBhc3NpdmUpO1xuICAgIH1cbiAgfTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHR5cGUgRXZlbnRMaXN0ZW5lcnNNb2RpZmllciA9IE1vZGlmaWVyPCdldmVudExpc3RlbmVycycsIE9wdGlvbnM+O1xuZXhwb3J0IGRlZmF1bHQgKHtcbiAgbmFtZTogJ2V2ZW50TGlzdGVuZXJzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICd3cml0ZScsXG4gIGZuOiAoKSA9PiB7fSxcbiAgZWZmZWN0LFxuICBkYXRhOiB7fSxcbn06IEV2ZW50TGlzdGVuZXJzTW9kaWZpZXIpO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHsgTW9kaWZpZXJBcmd1bWVudHMsIE1vZGlmaWVyIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGNvbXB1dGVPZmZzZXRzIGZyb20gJy4uL3V0aWxzL2NvbXB1dGVPZmZzZXRzJztcblxuZnVuY3Rpb24gcG9wcGVyT2Zmc2V0cyh7IHN0YXRlLCBuYW1lIH06IE1vZGlmaWVyQXJndW1lbnRzPHt8fH0+KSB7XG4gIC8vIE9mZnNldHMgYXJlIHRoZSBhY3R1YWwgcG9zaXRpb24gdGhlIHBvcHBlciBuZWVkcyB0byBoYXZlIHRvIGJlXG4gIC8vIHByb3Blcmx5IHBvc2l0aW9uZWQgbmVhciBpdHMgcmVmZXJlbmNlIGVsZW1lbnRcbiAgLy8gVGhpcyBpcyB0aGUgbW9zdCBiYXNpYyBwbGFjZW1lbnQsIGFuZCB3aWxsIGJlIGFkanVzdGVkIGJ5XG4gIC8vIHRoZSBtb2RpZmllcnMgaW4gdGhlIG5leHQgc3RlcFxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogc3RhdGUucmVjdHMucmVmZXJlbmNlLFxuICAgIGVsZW1lbnQ6IHN0YXRlLnJlY3RzLnBvcHBlcixcbiAgICBzdHJhdGVneTogJ2Fic29sdXRlJyxcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudCxcbiAgfSk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcbmV4cG9ydCB0eXBlIFBvcHBlck9mZnNldHNNb2RpZmllciA9IE1vZGlmaWVyPCdwb3BwZXJPZmZzZXRzJywge3x8fT47XG5leHBvcnQgZGVmYXVsdCAoe1xuICBuYW1lOiAncG9wcGVyT2Zmc2V0cycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAncmVhZCcsXG4gIGZuOiBwb3BwZXJPZmZzZXRzLFxuICBkYXRhOiB7fSxcbn06IFBvcHBlck9mZnNldHNNb2RpZmllcik7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUge1xuICBQb3NpdGlvbmluZ1N0cmF0ZWd5LFxuICBPZmZzZXRzLFxuICBNb2RpZmllcixcbiAgTW9kaWZpZXJBcmd1bWVudHMsXG4gIFJlY3QsXG4gIFdpbmRvdyxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgdHlwZSBCYXNlUGxhY2VtZW50LFxuICB0eXBlIFZhcmlhdGlvbixcbiAgdG9wLFxuICBsZWZ0LFxuICByaWdodCxcbiAgYm90dG9tLFxuICBlbmQsXG59IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSAnLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudCc7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gJy4uL2RvbS11dGlscy9nZXRXaW5kb3cnO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tICcuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50JztcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gJy4uL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlJztcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gJy4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQnO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tICcuLi91dGlscy9nZXRWYXJpYXRpb24nO1xuaW1wb3J0IHsgcm91bmQgfSBmcm9tICcuLi91dGlscy9tYXRoJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHR5cGUgUm91bmRPZmZzZXRzID0gKFxuICBvZmZzZXRzOiAkU2hhcGU8eyB4OiBudW1iZXIsIHk6IG51bWJlciwgY2VudGVyT2Zmc2V0OiBudW1iZXIgfT5cbikgPT4gT2Zmc2V0cztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHR5cGUgT3B0aW9ucyA9IHtcbiAgZ3B1QWNjZWxlcmF0aW9uOiBib29sZWFuLFxuICBhZGFwdGl2ZTogYm9vbGVhbixcbiAgcm91bmRPZmZzZXRzPzogYm9vbGVhbiB8IFJvdW5kT2Zmc2V0cyxcbn07XG5cbmNvbnN0IHVuc2V0U2lkZXMgPSB7XG4gIHRvcDogJ2F1dG8nLFxuICByaWdodDogJ2F1dG8nLFxuICBib3R0b206ICdhdXRvJyxcbiAgbGVmdDogJ2F1dG8nLFxufTtcblxuLy8gUm91bmQgdGhlIG9mZnNldHMgdG8gdGhlIG5lYXJlc3Qgc3VpdGFibGUgc3VicGl4ZWwgYmFzZWQgb24gdGhlIERQUi5cbi8vIFpvb21pbmcgY2FuIGNoYW5nZSB0aGUgRFBSLCBidXQgaXQgc2VlbXMgdG8gcmVwb3J0IGEgdmFsdWUgdGhhdCB3aWxsXG4vLyBjbGVhbmx5IGRpdmlkZSB0aGUgdmFsdWVzIGludG8gdGhlIGFwcHJvcHJpYXRlIHN1YnBpeGVscy5cbmZ1bmN0aW9uIHJvdW5kT2Zmc2V0c0J5RFBSKHsgeCwgeSB9KTogT2Zmc2V0cyB7XG4gIGNvbnN0IHdpbjogV2luZG93ID0gd2luZG93O1xuICBjb25zdCBkcHIgPSB3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuXG4gIHJldHVybiB7XG4gICAgeDogcm91bmQoeCAqIGRwcikgLyBkcHIgfHwgMCxcbiAgICB5OiByb3VuZCh5ICogZHByKSAvIGRwciB8fCAwLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9TdHlsZXMoe1xuICBwb3BwZXIsXG4gIHBvcHBlclJlY3QsXG4gIHBsYWNlbWVudCxcbiAgdmFyaWF0aW9uLFxuICBvZmZzZXRzLFxuICBwb3NpdGlvbixcbiAgZ3B1QWNjZWxlcmF0aW9uLFxuICBhZGFwdGl2ZSxcbiAgcm91bmRPZmZzZXRzLFxuICBpc0ZpeGVkLFxufToge1xuICBwb3BwZXI6IEhUTUxFbGVtZW50LFxuICBwb3BwZXJSZWN0OiBSZWN0LFxuICBwbGFjZW1lbnQ6IEJhc2VQbGFjZW1lbnQsXG4gIHZhcmlhdGlvbjogP1ZhcmlhdGlvbixcbiAgb2Zmc2V0czogJFNoYXBlPHsgeDogbnVtYmVyLCB5OiBudW1iZXIsIGNlbnRlck9mZnNldDogbnVtYmVyIH0+LFxuICBwb3NpdGlvbjogUG9zaXRpb25pbmdTdHJhdGVneSxcbiAgZ3B1QWNjZWxlcmF0aW9uOiBib29sZWFuLFxuICBhZGFwdGl2ZTogYm9vbGVhbixcbiAgcm91bmRPZmZzZXRzOiBib29sZWFuIHwgUm91bmRPZmZzZXRzLFxuICBpc0ZpeGVkOiBib29sZWFuLFxufSkge1xuICBsZXQgeyB4ID0gMCwgeSA9IDAgfSA9IG9mZnNldHM7XG5cbiAgKHsgeCwgeSB9ID1cbiAgICB0eXBlb2Ygcm91bmRPZmZzZXRzID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHJvdW5kT2Zmc2V0cyh7IHgsIHkgfSlcbiAgICAgIDogeyB4LCB5IH0pO1xuXG4gIGNvbnN0IGhhc1ggPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd4Jyk7XG4gIGNvbnN0IGhhc1kgPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd5Jyk7XG5cbiAgbGV0IHNpZGVYOiBzdHJpbmcgPSBsZWZ0O1xuICBsZXQgc2lkZVk6IHN0cmluZyA9IHRvcDtcblxuICBjb25zdCB3aW46IFdpbmRvdyA9IHdpbmRvdztcblxuICBpZiAoYWRhcHRpdmUpIHtcbiAgICBsZXQgb2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KHBvcHBlcik7XG4gICAgbGV0IGhlaWdodFByb3AgPSAnY2xpZW50SGVpZ2h0JztcbiAgICBsZXQgd2lkdGhQcm9wID0gJ2NsaWVudFdpZHRoJztcblxuICAgIGlmIChvZmZzZXRQYXJlbnQgPT09IGdldFdpbmRvdyhwb3BwZXIpKSB7XG4gICAgICBvZmZzZXRQYXJlbnQgPSBnZXREb2N1bWVudEVsZW1lbnQocG9wcGVyKTtcblxuICAgICAgaWYgKFxuICAgICAgICBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gIT09ICdzdGF0aWMnICYmXG4gICAgICAgIHBvc2l0aW9uID09PSAnYWJzb2x1dGUnXG4gICAgICApIHtcbiAgICAgICAgaGVpZ2h0UHJvcCA9ICdzY3JvbGxIZWlnaHQnO1xuICAgICAgICB3aWR0aFByb3AgPSAnc2Nyb2xsV2lkdGgnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhc3RdOiBmb3JjZSB0eXBlIHJlZmluZW1lbnQsIHdlIGNvbXBhcmUgb2Zmc2V0UGFyZW50IHdpdGggd2luZG93IGFib3ZlLCBidXQgRmxvdyBkb2Vzbid0IGRldGVjdCBpdFxuICAgIG9mZnNldFBhcmVudCA9IChvZmZzZXRQYXJlbnQ6IEVsZW1lbnQpO1xuXG4gICAgaWYgKFxuICAgICAgcGxhY2VtZW50ID09PSB0b3AgfHxcbiAgICAgICgocGxhY2VtZW50ID09PSBsZWZ0IHx8IHBsYWNlbWVudCA9PT0gcmlnaHQpICYmIHZhcmlhdGlvbiA9PT0gZW5kKVxuICAgICkge1xuICAgICAgc2lkZVkgPSBib3R0b207XG4gICAgICBjb25zdCBvZmZzZXRZID1cbiAgICAgICAgaXNGaXhlZCAmJiBvZmZzZXRQYXJlbnQgPT09IHdpbiAmJiB3aW4udmlzdWFsVmlld3BvcnRcbiAgICAgICAgICA/IHdpbi52aXN1YWxWaWV3cG9ydC5oZWlnaHRcbiAgICAgICAgICA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgICAgICAgb2Zmc2V0UGFyZW50W2hlaWdodFByb3BdO1xuICAgICAgeSAtPSBvZmZzZXRZIC0gcG9wcGVyUmVjdC5oZWlnaHQ7XG4gICAgICB5ICo9IGdwdUFjY2VsZXJhdGlvbiA/IDEgOiAtMTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBwbGFjZW1lbnQgPT09IGxlZnQgfHxcbiAgICAgICgocGxhY2VtZW50ID09PSB0b3AgfHwgcGxhY2VtZW50ID09PSBib3R0b20pICYmIHZhcmlhdGlvbiA9PT0gZW5kKVxuICAgICkge1xuICAgICAgc2lkZVggPSByaWdodDtcbiAgICAgIGNvbnN0IG9mZnNldFggPVxuICAgICAgICBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydFxuICAgICAgICAgID8gd2luLnZpc3VhbFZpZXdwb3J0LndpZHRoXG4gICAgICAgICAgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICAgICAgICAgIG9mZnNldFBhcmVudFt3aWR0aFByb3BdO1xuICAgICAgeCAtPSBvZmZzZXRYIC0gcG9wcGVyUmVjdC53aWR0aDtcbiAgICAgIHggKj0gZ3B1QWNjZWxlcmF0aW9uID8gMSA6IC0xO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbW1vblN0eWxlcyA9IHtcbiAgICBwb3NpdGlvbixcbiAgICAuLi4oYWRhcHRpdmUgJiYgdW5zZXRTaWRlcyksXG4gIH07XG5cbiAgKHsgeCwgeSB9ID1cbiAgICByb3VuZE9mZnNldHMgPT09IHRydWVcbiAgICAgID8gcm91bmRPZmZzZXRzQnlEUFIoeyB4LCB5IH0pXG4gICAgICA6IHsgeCwgeSB9KTtcblxuICBpZiAoZ3B1QWNjZWxlcmF0aW9uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbW1vblN0eWxlcyxcbiAgICAgIFtzaWRlWV06IGhhc1kgPyAnMCcgOiAnJyxcbiAgICAgIFtzaWRlWF06IGhhc1ggPyAnMCcgOiAnJyxcbiAgICAgIC8vIExheWVyIGFjY2VsZXJhdGlvbiBjYW4gZGlzYWJsZSBzdWJwaXhlbCByZW5kZXJpbmcgd2hpY2ggY2F1c2VzIHNsaWdodGx5XG4gICAgICAvLyBibHVycnkgdGV4dCBvbiBsb3cgUFBJIGRpc3BsYXlzLCBzbyB3ZSB3YW50IHRvIHVzZSAyRCB0cmFuc2Zvcm1zXG4gICAgICAvLyBpbnN0ZWFkXG4gICAgICB0cmFuc2Zvcm06XG4gICAgICAgICh3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSA8PSAxXG4gICAgICAgICAgPyBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KWBcbiAgICAgICAgICA6IGB0cmFuc2xhdGUzZCgke3h9cHgsICR7eX1weCwgMClgLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmNvbW1vblN0eWxlcyxcbiAgICBbc2lkZVldOiBoYXNZID8gYCR7eX1weGAgOiAnJyxcbiAgICBbc2lkZVhdOiBoYXNYID8gYCR7eH1weGAgOiAnJyxcbiAgICB0cmFuc2Zvcm06ICcnLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3R5bGVzKHsgc3RhdGUsIG9wdGlvbnMgfTogTW9kaWZpZXJBcmd1bWVudHM8T3B0aW9ucz4pIHtcbiAgY29uc3Qge1xuICAgIGdwdUFjY2VsZXJhdGlvbiA9IHRydWUsXG4gICAgYWRhcHRpdmUgPSB0cnVlLFxuICAgIC8vIGRlZmF1bHRzIHRvIHVzZSBidWlsdGluIGByb3VuZE9mZnNldHNCeURQUmBcbiAgICByb3VuZE9mZnNldHMgPSB0cnVlLFxuICB9ID0gb3B0aW9ucztcblxuICBpZiAoX19ERVZfXykge1xuICAgIGNvbnN0IHRyYW5zaXRpb25Qcm9wZXJ0eSA9XG4gICAgICBnZXRDb21wdXRlZFN0eWxlKHN0YXRlLmVsZW1lbnRzLnBvcHBlcikudHJhbnNpdGlvblByb3BlcnR5IHx8ICcnO1xuXG4gICAgaWYgKFxuICAgICAgYWRhcHRpdmUgJiZcbiAgICAgIFsndHJhbnNmb3JtJywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddLnNvbWUoXG4gICAgICAgIChwcm9wZXJ0eSkgPT4gdHJhbnNpdGlvblByb3BlcnR5LmluZGV4T2YocHJvcGVydHkpID49IDBcbiAgICAgIClcbiAgICApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgW1xuICAgICAgICAgICdQb3BwZXI6IERldGVjdGVkIENTUyB0cmFuc2l0aW9ucyBvbiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZycsXG4gICAgICAgICAgJ0NTUyBwcm9wZXJ0aWVzOiBcInRyYW5zZm9ybVwiLCBcInRvcFwiLCBcInJpZ2h0XCIsIFwiYm90dG9tXCIsIFwibGVmdFwiLicsXG4gICAgICAgICAgJ1xcblxcbicsXG4gICAgICAgICAgJ0Rpc2FibGUgdGhlIFwiY29tcHV0ZVN0eWxlc1wiIG1vZGlmaWVyXFwncyBgYWRhcHRpdmVgIG9wdGlvbiB0byBhbGxvdycsXG4gICAgICAgICAgJ2ZvciBzbW9vdGggdHJhbnNpdGlvbnMsIG9yIHJlbW92ZSB0aGVzZSBwcm9wZXJ0aWVzIGZyb20gdGhlIENTUycsXG4gICAgICAgICAgJ3RyYW5zaXRpb24gZGVjbGFyYXRpb24gb24gdGhlIHBvcHBlciBlbGVtZW50IGlmIG9ubHkgdHJhbnNpdGlvbmluZycsXG4gICAgICAgICAgJ29wYWNpdHkgb3IgYmFja2dyb3VuZC1jb2xvciBmb3IgZXhhbXBsZS4nLFxuICAgICAgICAgICdcXG5cXG4nLFxuICAgICAgICAgICdXZSByZWNvbW1lbmQgdXNpbmcgdGhlIHBvcHBlciBlbGVtZW50IGFzIGEgd3JhcHBlciBhcm91bmQgYW4gaW5uZXInLFxuICAgICAgICAgICdlbGVtZW50IHRoYXQgY2FuIGhhdmUgYW55IENTUyBwcm9wZXJ0eSB0cmFuc2l0aW9uZWQgZm9yIGFuaW1hdGlvbnMuJyxcbiAgICAgICAgXS5qb2luKCcgJylcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY29tbW9uU3R5bGVzID0ge1xuICAgIHBsYWNlbWVudDogZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHZhcmlhdGlvbjogZ2V0VmFyaWF0aW9uKHN0YXRlLnBsYWNlbWVudCksXG4gICAgcG9wcGVyOiBzdGF0ZS5lbGVtZW50cy5wb3BwZXIsXG4gICAgcG9wcGVyUmVjdDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIGdwdUFjY2VsZXJhdGlvbixcbiAgICBpc0ZpeGVkOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnLFxuICB9O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5wb3BwZXIgPSB7XG4gICAgICAuLi5zdGF0ZS5zdHlsZXMucG9wcGVyLFxuICAgICAgLi4ubWFwVG9TdHlsZXMoe1xuICAgICAgICAuLi5jb21tb25TdHlsZXMsXG4gICAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxcbiAgICAgICAgcG9zaXRpb246IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICAgIGFkYXB0aXZlLFxuICAgICAgICByb3VuZE9mZnNldHMsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3cgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5hcnJvdyA9IHtcbiAgICAgIC4uLnN0YXRlLnN0eWxlcy5hcnJvdyxcbiAgICAgIC4uLm1hcFRvU3R5bGVzKHtcbiAgICAgICAgLi4uY29tbW9uU3R5bGVzLFxuICAgICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93LFxuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgYWRhcHRpdmU6IGZhbHNlLFxuICAgICAgICByb3VuZE9mZnNldHMsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIgPSB7XG4gICAgLi4uc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIsXG4gICAgJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCc6IHN0YXRlLnBsYWNlbWVudCxcbiAgfTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHR5cGUgQ29tcHV0ZVN0eWxlc01vZGlmaWVyID0gTW9kaWZpZXI8J2NvbXB1dGVTdHlsZXMnLCBPcHRpb25zPjtcbmV4cG9ydCBkZWZhdWx0ICh7XG4gIG5hbWU6ICdjb21wdXRlU3R5bGVzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdiZWZvcmVXcml0ZScsXG4gIGZuOiBjb21wdXRlU3R5bGVzLFxuICBkYXRhOiB7fSxcbn06IENvbXB1dGVTdHlsZXNNb2RpZmllcik7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBNb2RpZmllciwgTW9kaWZpZXJBcmd1bWVudHMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSAnLi4vZG9tLXV0aWxzL2dldE5vZGVOYW1lJztcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tICcuLi9kb20tdXRpbHMvaW5zdGFuY2VPZic7XG5cbi8vIFRoaXMgbW9kaWZpZXIgdGFrZXMgdGhlIHN0eWxlcyBwcmVwYXJlZCBieSB0aGUgYGNvbXB1dGVTdHlsZXNgIG1vZGlmaWVyXG4vLyBhbmQgYXBwbGllcyB0aGVtIHRvIHRoZSBIVE1MRWxlbWVudHMgc3VjaCBhcyBwb3BwZXIgYW5kIGFycm93XG5cbmZ1bmN0aW9uIGFwcGx5U3R5bGVzKHsgc3RhdGUgfTogTW9kaWZpZXJBcmd1bWVudHM8e3x8fT4pIHtcbiAgT2JqZWN0LmtleXMoc3RhdGUuZWxlbWVudHMpLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICBjb25zdCBzdHlsZSA9IHN0YXRlLnN0eWxlc1tuYW1lXSB8fCB7fTtcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBzdGF0ZS5hdHRyaWJ1dGVzW25hbWVdIHx8IHt9O1xuICAgIGNvbnN0IGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTtcblxuICAgIC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuICAgIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAhZ2V0Tm9kZU5hbWUoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0byBleHRlbmQgdGhpcyBwcm9wZXJ0eSwgYnV0IGl0J3MgdGhlIG1vc3RcbiAgICAvLyBlZmZlY3RpdmUgd2F5IHRvIGFwcGx5IHN0eWxlcyB0byBhbiBIVE1MRWxlbWVudFxuICAgIC8vICRGbG93Rml4TWVbY2Fubm90LXdyaXRlXVxuICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuXG4gICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlID09PSB0cnVlID8gJycgOiB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlZmZlY3QoeyBzdGF0ZSB9OiBNb2RpZmllckFyZ3VtZW50czx7fHx9Pikge1xuICBjb25zdCBpbml0aWFsU3R5bGVzID0ge1xuICAgIHBvcHBlcjoge1xuICAgICAgcG9zaXRpb246IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBsZWZ0OiAnMCcsXG4gICAgICB0b3A6ICcwJyxcbiAgICAgIG1hcmdpbjogJzAnLFxuICAgIH0sXG4gICAgYXJyb3c6IHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIH0sXG4gICAgcmVmZXJlbmNlOiB7fSxcbiAgfTtcblxuICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLnBvcHBlci5zdHlsZSwgaW5pdGlhbFN0eWxlcy5wb3BwZXIpO1xuICBzdGF0ZS5zdHlsZXMgPSBpbml0aWFsU3R5bGVzO1xuXG4gIGlmIChzdGF0ZS5lbGVtZW50cy5hcnJvdykge1xuICAgIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMuYXJyb3cuc3R5bGUsIGluaXRpYWxTdHlsZXMuYXJyb3cpO1xuICB9XG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW25hbWVdO1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHN0YXRlLmF0dHJpYnV0ZXNbbmFtZV0gfHwge307XG5cbiAgICAgIGNvbnN0IHN0eWxlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKFxuICAgICAgICBzdGF0ZS5zdHlsZXMuaGFzT3duUHJvcGVydHkobmFtZSlcbiAgICAgICAgICA/IHN0YXRlLnN0eWxlc1tuYW1lXVxuICAgICAgICAgIDogaW5pdGlhbFN0eWxlc1tuYW1lXVxuICAgICAgKTtcblxuICAgICAgLy8gU2V0IGFsbCB2YWx1ZXMgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIHVuc2V0IHRoZW1cbiAgICAgIGNvbnN0IHN0eWxlID0gc3R5bGVQcm9wZXJ0aWVzLnJlZHVjZSgoc3R5bGUsIHByb3BlcnR5KSA9PiB7XG4gICAgICAgIHN0eWxlW3Byb3BlcnR5XSA9ICcnO1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuICAgICAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8ICFnZXROb2RlTmFtZShlbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuXG4gICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKChhdHRyaWJ1dGUpID0+IHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5leHBvcnQgdHlwZSBBcHBseVN0eWxlc01vZGlmaWVyID0gTW9kaWZpZXI8J2FwcGx5U3R5bGVzJywge3x8fT47XG5leHBvcnQgZGVmYXVsdCAoe1xuICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGFwcGx5U3R5bGVzLFxuICBlZmZlY3QsXG4gIHJlcXVpcmVzOiBbJ2NvbXB1dGVTdHlsZXMnXSxcbn06IEFwcGx5U3R5bGVzTW9kaWZpZXIpO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHsgUGxhY2VtZW50IH0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IHR5cGUgeyBNb2RpZmllckFyZ3VtZW50cywgTW9kaWZpZXIsIFJlY3QsIE9mZnNldHMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tICcuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50JztcbmltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIHBsYWNlbWVudHMgfSBmcm9tICcuLi9lbnVtcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcbmV4cG9ydCB0eXBlIE9mZnNldHNGdW5jdGlvbiA9ICh7XG4gIHBvcHBlcjogUmVjdCxcbiAgcmVmZXJlbmNlOiBSZWN0LFxuICBwbGFjZW1lbnQ6IFBsYWNlbWVudCxcbn0pID0+IFs/bnVtYmVyLCA/bnVtYmVyXTtcblxudHlwZSBPZmZzZXQgPSBPZmZzZXRzRnVuY3Rpb24gfCBbP251bWJlciwgP251bWJlcl07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcbmV4cG9ydCB0eXBlIE9wdGlvbnMgPSB7XG4gIG9mZnNldDogT2Zmc2V0LFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKFxuICBwbGFjZW1lbnQ6IFBsYWNlbWVudCxcbiAgcmVjdHM6IHsgcG9wcGVyOiBSZWN0LCByZWZlcmVuY2U6IFJlY3QgfSxcbiAgb2Zmc2V0OiBPZmZzZXRcbik6IE9mZnNldHMge1xuICBjb25zdCBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICBjb25zdCBpbnZlcnREaXN0YW5jZSA9IFtsZWZ0LCB0b3BdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IC0xIDogMTtcblxuICBsZXQgW3NraWRkaW5nLCBkaXN0YW5jZV0gPVxuICAgIHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbidcbiAgICAgID8gb2Zmc2V0KHtcbiAgICAgICAgICAuLi5yZWN0cyxcbiAgICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIH0pXG4gICAgICA6IG9mZnNldDtcblxuICBza2lkZGluZyA9IHNraWRkaW5nIHx8IDA7XG4gIGRpc3RhbmNlID0gKGRpc3RhbmNlIHx8IDApICogaW52ZXJ0RGlzdGFuY2U7XG5cbiAgcmV0dXJuIFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwXG4gICAgPyB7IHg6IGRpc3RhbmNlLCB5OiBza2lkZGluZyB9XG4gICAgOiB7IHg6IHNraWRkaW5nLCB5OiBkaXN0YW5jZSB9O1xufVxuXG5mdW5jdGlvbiBvZmZzZXQoeyBzdGF0ZSwgb3B0aW9ucywgbmFtZSB9OiBNb2RpZmllckFyZ3VtZW50czxPcHRpb25zPikge1xuICBjb25zdCB7IG9mZnNldCA9IFswLCAwXSB9ID0gb3B0aW9ucztcblxuICBjb25zdCBkYXRhID0gcGxhY2VtZW50cy5yZWR1Y2UoKGFjYywgcGxhY2VtZW50KSA9PiB7XG4gICAgYWNjW3BsYWNlbWVudF0gPSBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHN0YXRlLnJlY3RzLCBvZmZzZXQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcblxuICBjb25zdCB7IHgsIHkgfSA9IGRhdGFbc3RhdGUucGxhY2VtZW50XTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzICE9IG51bGwpIHtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueCArPSB4O1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy55ICs9IHk7XG4gIH1cblxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gZGF0YTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHR5cGUgT2Zmc2V0TW9kaWZpZXIgPSBNb2RpZmllcjwnb2Zmc2V0JywgT3B0aW9ucz47XG5leHBvcnQgZGVmYXVsdCAoe1xuICBuYW1lOiAnb2Zmc2V0JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICBmbjogb2Zmc2V0LFxufTogT2Zmc2V0TW9kaWZpZXIpO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHsgUGxhY2VtZW50IH0gZnJvbSAnLi4vZW51bXMnO1xuXG5jb25zdCBoYXNoID0geyBsZWZ0OiAncmlnaHQnLCByaWdodDogJ2xlZnQnLCBib3R0b206ICd0b3AnLCB0b3A6ICdib3R0b20nIH07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudDogUGxhY2VtZW50KTogUGxhY2VtZW50IHtcbiAgcmV0dXJuIChwbGFjZW1lbnQucmVwbGFjZShcbiAgICAvbGVmdHxyaWdodHxib3R0b218dG9wL2csXG4gICAgbWF0Y2hlZCA9PiBoYXNoW21hdGNoZWRdXG4gICk6IGFueSk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBQbGFjZW1lbnQgfSBmcm9tICcuLi9lbnVtcyc7XG5cbmNvbnN0IGhhc2ggPSB7IHN0YXJ0OiAnZW5kJywgZW5kOiAnc3RhcnQnIH07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KFxuICBwbGFjZW1lbnQ6IFBsYWNlbWVudFxuKTogUGxhY2VtZW50IHtcbiAgcmV0dXJuIChwbGFjZW1lbnQucmVwbGFjZSgvc3RhcnR8ZW5kL2csIG1hdGNoZWQgPT4gaGFzaFttYXRjaGVkXSk6IGFueSk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBTdGF0ZSwgUGFkZGluZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHtcbiAgUGxhY2VtZW50LFxuICBDb21wdXRlZFBsYWNlbWVudCxcbiAgQm91bmRhcnksXG4gIFJvb3RCb3VuZGFyeSxcbn0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tICcuL2dldFZhcmlhdGlvbic7XG5pbXBvcnQge1xuICB2YXJpYXRpb25QbGFjZW1lbnRzLFxuICBiYXNlUGxhY2VtZW50cyxcbiAgcGxhY2VtZW50cyBhcyBhbGxQbGFjZW1lbnRzLFxufSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSAnLi9kZXRlY3RPdmVyZmxvdyc7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tICcuL2dldEJhc2VQbGFjZW1lbnQnO1xuXG50eXBlIE9wdGlvbnMgPSB7XG4gIHBsYWNlbWVudDogUGxhY2VtZW50LFxuICBwYWRkaW5nOiBQYWRkaW5nLFxuICBib3VuZGFyeTogQm91bmRhcnksXG4gIHJvb3RCb3VuZGFyeTogUm9vdEJvdW5kYXJ5LFxuICBmbGlwVmFyaWF0aW9uczogYm9vbGVhbixcbiAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzPzogQXJyYXk8UGxhY2VtZW50Pixcbn07XG5cbnR5cGUgT3ZlcmZsb3dzTWFwID0geyBbQ29tcHV0ZWRQbGFjZW1lbnRdOiBudW1iZXIgfTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZUF1dG9QbGFjZW1lbnQoXG4gIHN0YXRlOiAkU2hhcGU8U3RhdGU+LFxuICBvcHRpb25zOiBPcHRpb25zID0ge31cbik6IEFycmF5PENvbXB1dGVkUGxhY2VtZW50PiB7XG4gIGNvbnN0IHtcbiAgICBwbGFjZW1lbnQsXG4gICAgYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5LFxuICAgIHBhZGRpbmcsXG4gICAgZmxpcFZhcmlhdGlvbnMsXG4gICAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzID0gYWxsUGxhY2VtZW50cyxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgdmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCk7XG5cbiAgY29uc3QgcGxhY2VtZW50cyA9IHZhcmlhdGlvblxuICAgID8gZmxpcFZhcmlhdGlvbnNcbiAgICAgID8gdmFyaWF0aW9uUGxhY2VtZW50c1xuICAgICAgOiB2YXJpYXRpb25QbGFjZW1lbnRzLmZpbHRlcihcbiAgICAgICAgICAocGxhY2VtZW50KSA9PiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSA9PT0gdmFyaWF0aW9uXG4gICAgICAgIClcbiAgICA6IGJhc2VQbGFjZW1lbnRzO1xuXG4gIGxldCBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuZmlsdGVyKFxuICAgIChwbGFjZW1lbnQpID0+IGFsbG93ZWRBdXRvUGxhY2VtZW50cy5pbmRleE9mKHBsYWNlbWVudCkgPj0gMFxuICApO1xuXG4gIGlmIChhbGxvd2VkUGxhY2VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHM7XG5cbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgW1xuICAgICAgICAgICdQb3BwZXI6IFRoZSBgYWxsb3dlZEF1dG9QbGFjZW1lbnRzYCBvcHRpb24gZGlkIG5vdCBhbGxvdyBhbnknLFxuICAgICAgICAgICdwbGFjZW1lbnRzLiBFbnN1cmUgdGhlIGBwbGFjZW1lbnRgIG9wdGlvbiBtYXRjaGVzIHRoZSB2YXJpYXRpb24nLFxuICAgICAgICAgICdvZiB0aGUgYWxsb3dlZCBwbGFjZW1lbnRzLicsXG4gICAgICAgICAgJ0ZvciBleGFtcGxlLCBcImF1dG9cIiBjYW5ub3QgYmUgdXNlZCB0byBhbGxvdyBcImJvdHRvbS1zdGFydFwiLicsXG4gICAgICAgICAgJ1VzZSBcImF1dG8tc3RhcnRcIiBpbnN0ZWFkLicsXG4gICAgICAgIF0uam9pbignICcpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXR5cGVdOiBGbG93IHNlZW1zIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCB0d28gYXJyYXkgdW5pb25zLi4uXG4gIGNvbnN0IG92ZXJmbG93czogT3ZlcmZsb3dzTWFwID0gYWxsb3dlZFBsYWNlbWVudHMucmVkdWNlKChhY2MsIHBsYWNlbWVudCkgPT4ge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZyxcbiAgICB9KVtnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCldO1xuXG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhvdmVyZmxvd3MpLnNvcnQoKGEsIGIpID0+IG92ZXJmbG93c1thXSAtIG92ZXJmbG93c1tiXSk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBQbGFjZW1lbnQsIEJvdW5kYXJ5LCBSb290Qm91bmRhcnkgfSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IE1vZGlmaWVyQXJndW1lbnRzLCBNb2RpZmllciwgUGFkZGluZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBnZXRPcHBvc2l0ZVBsYWNlbWVudCBmcm9tICcuLi91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudCc7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tICcuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50JztcbmltcG9ydCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudCBmcm9tICcuLi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudCc7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSAnLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cnO1xuaW1wb3J0IGNvbXB1dGVBdXRvUGxhY2VtZW50IGZyb20gJy4uL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50JztcbmltcG9ydCB7IGJvdHRvbSwgdG9wLCBzdGFydCwgcmlnaHQsIGxlZnQsIGF1dG8gfSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gJy4uL3V0aWxzL2dldFZhcmlhdGlvbic7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcbmV4cG9ydCB0eXBlIE9wdGlvbnMgPSB7XG4gIG1haW5BeGlzOiBib29sZWFuLFxuICBhbHRBeGlzOiBib29sZWFuLFxuICBmYWxsYmFja1BsYWNlbWVudHM6IEFycmF5PFBsYWNlbWVudD4sXG4gIHBhZGRpbmc6IFBhZGRpbmcsXG4gIGJvdW5kYXJ5OiBCb3VuZGFyeSxcbiAgcm9vdEJvdW5kYXJ5OiBSb290Qm91bmRhcnksXG4gIGFsdEJvdW5kYXJ5OiBib29sZWFuLFxuICBmbGlwVmFyaWF0aW9uczogYm9vbGVhbixcbiAgYWxsb3dlZEF1dG9QbGFjZW1lbnRzOiBBcnJheTxQbGFjZW1lbnQ+LFxufTtcblxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocGxhY2VtZW50OiBQbGFjZW1lbnQpOiBBcnJheTxQbGFjZW1lbnQ+IHtcbiAgaWYgKGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSA9PT0gYXV0bykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IG9wcG9zaXRlUGxhY2VtZW50ID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTtcblxuICByZXR1cm4gW1xuICAgIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCksXG4gICAgb3Bwb3NpdGVQbGFjZW1lbnQsXG4gICAgZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQob3Bwb3NpdGVQbGFjZW1lbnQpLFxuICBdO1xufVxuXG5mdW5jdGlvbiBmbGlwKHsgc3RhdGUsIG9wdGlvbnMsIG5hbWUgfTogTW9kaWZpZXJBcmd1bWVudHM8T3B0aW9ucz4pIHtcbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0uX3NraXApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgbWFpbkF4aXM6IGNoZWNrTWFpbkF4aXMgPSB0cnVlLFxuICAgIGFsdEF4aXM6IGNoZWNrQWx0QXhpcyA9IHRydWUsXG4gICAgZmFsbGJhY2tQbGFjZW1lbnRzOiBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMsXG4gICAgcGFkZGluZyxcbiAgICBib3VuZGFyeSxcbiAgICByb290Qm91bmRhcnksXG4gICAgYWx0Qm91bmRhcnksXG4gICAgZmxpcFZhcmlhdGlvbnMgPSB0cnVlLFxuICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50cyxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgcHJlZmVycmVkUGxhY2VtZW50ID0gc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQ7XG4gIGNvbnN0IGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHByZWZlcnJlZFBsYWNlbWVudCk7XG4gIGNvbnN0IGlzQmFzZVBsYWNlbWVudCA9IGJhc2VQbGFjZW1lbnQgPT09IHByZWZlcnJlZFBsYWNlbWVudDtcblxuICBjb25zdCBmYWxsYmFja1BsYWNlbWVudHMgPVxuICAgIHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyB8fFxuICAgIChpc0Jhc2VQbGFjZW1lbnQgfHwgIWZsaXBWYXJpYXRpb25zXG4gICAgICA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpXVxuICAgICAgOiBnZXRFeHBhbmRlZEZhbGxiYWNrUGxhY2VtZW50cyhwcmVmZXJyZWRQbGFjZW1lbnQpKTtcblxuICBjb25zdCBwbGFjZW1lbnRzID0gW3ByZWZlcnJlZFBsYWNlbWVudCwgLi4uZmFsbGJhY2tQbGFjZW1lbnRzXS5yZWR1Y2UoXG4gICAgKGFjYywgcGxhY2VtZW50KSA9PiB7XG4gICAgICByZXR1cm4gYWNjLmNvbmNhdChcbiAgICAgICAgZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpID09PSBhdXRvXG4gICAgICAgICAgPyBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwge1xuICAgICAgICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgICAgICAgIGJvdW5kYXJ5LFxuICAgICAgICAgICAgICByb290Qm91bmRhcnksXG4gICAgICAgICAgICAgIHBhZGRpbmcsXG4gICAgICAgICAgICAgIGZsaXBWYXJpYXRpb25zLFxuICAgICAgICAgICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogcGxhY2VtZW50XG4gICAgICApO1xuICAgIH0sXG4gICAgW11cbiAgKTtcblxuICBjb25zdCByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICBjb25zdCBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuXG4gIGNvbnN0IGNoZWNrc01hcCA9IG5ldyBNYXAoKTtcbiAgbGV0IG1ha2VGYWxsYmFja0NoZWNrcyA9IHRydWU7XG4gIGxldCBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRzWzBdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGxhY2VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHBsYWNlbWVudCA9IHBsYWNlbWVudHNbaV07XG4gICAgY29uc3QgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgICBjb25zdCBpc1N0YXJ0VmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHN0YXJ0O1xuICAgIGNvbnN0IGlzVmVydGljYWwgPSBbdG9wLCBib3R0b21dLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgICBjb25zdCBsZW4gPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuXG4gICAgY29uc3Qgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcsXG4gICAgfSk7XG5cbiAgICBsZXQgbWFpblZhcmlhdGlvblNpZGU6IGFueSA9IGlzVmVydGljYWxcbiAgICAgID8gaXNTdGFydFZhcmlhdGlvblxuICAgICAgICA/IHJpZ2h0XG4gICAgICAgIDogbGVmdFxuICAgICAgOiBpc1N0YXJ0VmFyaWF0aW9uXG4gICAgICA/IGJvdHRvbVxuICAgICAgOiB0b3A7XG5cbiAgICBpZiAocmVmZXJlbmNlUmVjdFtsZW5dID4gcG9wcGVyUmVjdFtsZW5dKSB7XG4gICAgICBtYWluVmFyaWF0aW9uU2lkZSA9IGdldE9wcG9zaXRlUGxhY2VtZW50KG1haW5WYXJpYXRpb25TaWRlKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbHRWYXJpYXRpb25TaWRlOiBhbnkgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChtYWluVmFyaWF0aW9uU2lkZSk7XG5cbiAgICBjb25zdCBjaGVja3MgPSBbXTtcblxuICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1tiYXNlUGxhY2VtZW50XSA8PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChcbiAgICAgICAgb3ZlcmZsb3dbbWFpblZhcmlhdGlvblNpZGVdIDw9IDAsXG4gICAgICAgIG92ZXJmbG93W2FsdFZhcmlhdGlvblNpZGVdIDw9IDBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrcy5ldmVyeSgoY2hlY2spID0+IGNoZWNrKSkge1xuICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50O1xuICAgICAgbWFrZUZhbGxiYWNrQ2hlY2tzID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjaGVja3NNYXAuc2V0KHBsYWNlbWVudCwgY2hlY2tzKTtcbiAgfVxuXG4gIGlmIChtYWtlRmFsbGJhY2tDaGVja3MpIHtcbiAgICAvLyBgMmAgbWF5IGJlIGRlc2lyZWQgaW4gc29tZSBjYXNlcyDigJMgcmVzZWFyY2ggbGF0ZXJcbiAgICBjb25zdCBudW1iZXJPZkNoZWNrcyA9IGZsaXBWYXJpYXRpb25zID8gMyA6IDE7XG5cbiAgICBmb3IgKGxldCBpID0gbnVtYmVyT2ZDaGVja3M7IGkgPiAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRzLmZpbmQoKHBsYWNlbWVudCkgPT4ge1xuICAgICAgICBjb25zdCBjaGVja3MgPSBjaGVja3NNYXAuZ2V0KHBsYWNlbWVudCk7XG4gICAgICAgIGlmIChjaGVja3MpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tzLnNsaWNlKDAsIGkpLmV2ZXJ5KChjaGVjaykgPT4gY2hlY2spO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gZml0dGluZ1BsYWNlbWVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnBsYWNlbWVudCAhPT0gZmlyc3RGaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCA9IHRydWU7XG4gICAgc3RhdGUucGxhY2VtZW50ID0gZmlyc3RGaXR0aW5nUGxhY2VtZW50O1xuICAgIHN0YXRlLnJlc2V0ID0gdHJ1ZTtcbiAgfVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5leHBvcnQgdHlwZSBGbGlwTW9kaWZpZXIgPSBNb2RpZmllcjwnZmxpcCcsIE9wdGlvbnM+O1xuZXhwb3J0IGRlZmF1bHQgKHtcbiAgbmFtZTogJ2ZsaXAnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogZmxpcCxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXSxcbiAgZGF0YTogeyBfc2tpcDogZmFsc2UgfSxcbn06IEZsaXBNb2RpZmllcik7XG4iLCIvLyBAZmxvd1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRBbHRBeGlzKGF4aXM6ICd4JyB8ICd5Jyk6ICd4JyB8ICd5JyB7XG4gIHJldHVybiBheGlzID09PSAneCcgPyAneScgOiAneCc7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgbWF4IGFzIG1hdGhNYXgsIG1pbiBhcyBtYXRoTWluIH0gZnJvbSAnLi9tYXRoJztcblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhpbihtaW46IG51bWJlciwgdmFsdWU6IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gbWF0aE1heChtaW4sIG1hdGhNaW4odmFsdWUsIG1heCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aGluTWF4Q2xhbXAobWluOiBudW1iZXIsIHZhbHVlOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XG4gIGNvbnN0IHYgPSB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KTtcbiAgcmV0dXJuIHYgPiBtYXggPyBtYXggOiB2O1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB7IHRvcCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgc3RhcnQgfSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IFBsYWNlbWVudCwgQm91bmRhcnksIFJvb3RCb3VuZGFyeSB9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCB0eXBlIHsgUmVjdCwgTW9kaWZpZXJBcmd1bWVudHMsIE1vZGlmaWVyLCBQYWRkaW5nIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSAnLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudCc7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gJy4uL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudCc7XG5pbXBvcnQgZ2V0QWx0QXhpcyBmcm9tICcuLi91dGlscy9nZXRBbHRBeGlzJztcbmltcG9ydCB7IHdpdGhpbiwgd2l0aGluTWF4Q2xhbXAgfSBmcm9tICcuLi91dGlscy93aXRoaW4nO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSAnLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QnO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tICcuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50JztcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tICcuLi91dGlscy9kZXRlY3RPdmVyZmxvdyc7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gJy4uL3V0aWxzL2dldFZhcmlhdGlvbic7XG5pbXBvcnQgZ2V0RnJlc2hTaWRlT2JqZWN0IGZyb20gJy4uL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdCc7XG5pbXBvcnQgeyBtaW4gYXMgbWF0aE1pbiwgbWF4IGFzIG1hdGhNYXggfSBmcm9tICcuLi91dGlscy9tYXRoJztcblxudHlwZSBUZXRoZXJPZmZzZXQgPVxuICB8ICgoe1xuICAgICAgcG9wcGVyOiBSZWN0LFxuICAgICAgcmVmZXJlbmNlOiBSZWN0LFxuICAgICAgcGxhY2VtZW50OiBQbGFjZW1lbnQsXG4gICAgfSkgPT4gbnVtYmVyIHwgeyBtYWluQXhpczogbnVtYmVyLCBhbHRBeGlzOiBudW1iZXIgfSlcbiAgfCBudW1iZXJcbiAgfCB7IG1haW5BeGlzOiBudW1iZXIsIGFsdEF4aXM6IG51bWJlciB9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5leHBvcnQgdHlwZSBPcHRpb25zID0ge1xuICAvKiBQcmV2ZW50cyBib3VuZGFyaWVzIG92ZXJmbG93IG9uIHRoZSBtYWluIGF4aXMgKi9cbiAgbWFpbkF4aXM6IGJvb2xlYW4sXG4gIC8qIFByZXZlbnRzIGJvdW5kYXJpZXMgb3ZlcmZsb3cgb24gdGhlIGFsdGVybmF0ZSBheGlzICovXG4gIGFsdEF4aXM6IGJvb2xlYW4sXG4gIC8qIFRoZSBhcmVhIHRvIGNoZWNrIHRoZSBwb3BwZXIgaXMgb3ZlcmZsb3dpbmcgaW4gKi9cbiAgYm91bmRhcnk6IEJvdW5kYXJ5LFxuICAvKiBJZiB0aGUgcG9wcGVyIGlzIG5vdCBvdmVyZmxvd2luZyB0aGUgbWFpbiBhcmVhLCBmYWxsYmFjayB0byB0aGlzIG9uZSAqL1xuICByb290Qm91bmRhcnk6IFJvb3RCb3VuZGFyeSxcbiAgLyogVXNlIHRoZSByZWZlcmVuY2UncyBcImNsaXBwaW5nUGFyZW50c1wiIGJvdW5kYXJ5IGNvbnRleHQgKi9cbiAgYWx0Qm91bmRhcnk6IGJvb2xlYW4sXG4gIC8qKlxuICAgKiBBbGxvd3MgdGhlIHBvcHBlciB0byBvdmVyZmxvdyBmcm9tIGl0cyBib3VuZGFyaWVzIHRvIGtlZXAgaXQgbmVhciBpdHNcbiAgICogcmVmZXJlbmNlIGVsZW1lbnRcbiAgICovXG4gIHRldGhlcjogYm9vbGVhbixcbiAgLyogT2Zmc2V0cyB3aGVuIHRoZSBgdGV0aGVyYCBvcHRpb24gc2hvdWxkIGFjdGl2YXRlICovXG4gIHRldGhlck9mZnNldDogVGV0aGVyT2Zmc2V0LFxuICAvKiBTZXRzIGEgcGFkZGluZyB0byB0aGUgcHJvdmlkZWQgYm91bmRhcnkgKi9cbiAgcGFkZGluZzogUGFkZGluZyxcbn07XG5cbmZ1bmN0aW9uIHByZXZlbnRPdmVyZmxvdyh7IHN0YXRlLCBvcHRpb25zLCBuYW1lIH06IE1vZGlmaWVyQXJndW1lbnRzPE9wdGlvbnM+KSB7XG4gIGNvbnN0IHtcbiAgICBtYWluQXhpczogY2hlY2tNYWluQXhpcyA9IHRydWUsXG4gICAgYWx0QXhpczogY2hlY2tBbHRBeGlzID0gZmFsc2UsXG4gICAgYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5LFxuICAgIGFsdEJvdW5kYXJ5LFxuICAgIHBhZGRpbmcsXG4gICAgdGV0aGVyID0gdHJ1ZSxcbiAgICB0ZXRoZXJPZmZzZXQgPSAwLFxuICB9ID0gb3B0aW9ucztcblxuICBjb25zdCBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYm91bmRhcnksXG4gICAgcm9vdEJvdW5kYXJ5LFxuICAgIHBhZGRpbmcsXG4gICAgYWx0Qm91bmRhcnksXG4gIH0pO1xuICBjb25zdCBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICBjb25zdCB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KTtcbiAgY29uc3QgaXNCYXNlUGxhY2VtZW50ID0gIXZhcmlhdGlvbjtcbiAgY29uc3QgbWFpbkF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCk7XG4gIGNvbnN0IGFsdEF4aXMgPSBnZXRBbHRBeGlzKG1haW5BeGlzKTtcbiAgY29uc3QgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgY29uc3QgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgY29uc3QgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgY29uc3QgdGV0aGVyT2Zmc2V0VmFsdWUgPVxuICAgIHR5cGVvZiB0ZXRoZXJPZmZzZXQgPT09ICdmdW5jdGlvbidcbiAgICAgID8gdGV0aGVyT2Zmc2V0KHtcbiAgICAgICAgICAuLi5zdGF0ZS5yZWN0cyxcbiAgICAgICAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudCxcbiAgICAgICAgfSlcbiAgICAgIDogdGV0aGVyT2Zmc2V0O1xuICBjb25zdCBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUgPVxuICAgIHR5cGVvZiB0ZXRoZXJPZmZzZXRWYWx1ZSA9PT0gJ251bWJlcidcbiAgICAgID8geyBtYWluQXhpczogdGV0aGVyT2Zmc2V0VmFsdWUsIGFsdEF4aXM6IHRldGhlck9mZnNldFZhbHVlIH1cbiAgICAgIDogeyBtYWluQXhpczogMCwgYWx0QXhpczogMCwgLi4udGV0aGVyT2Zmc2V0VmFsdWUgfTtcbiAgY29uc3Qgb2Zmc2V0TW9kaWZpZXJTdGF0ZSA9IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0XG4gICAgPyBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldFtzdGF0ZS5wbGFjZW1lbnRdXG4gICAgOiBudWxsO1xuXG4gIGNvbnN0IGRhdGEgPSB7IHg6IDAsIHk6IDAgfTtcblxuICBpZiAoIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgIGNvbnN0IG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gICAgY29uc3QgYWx0U2lkZSA9IG1haW5BeGlzID09PSAneScgPyBib3R0b20gOiByaWdodDtcbiAgICBjb25zdCBsZW4gPSBtYWluQXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICAgIGNvbnN0IG9mZnNldCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdO1xuXG4gICAgY29uc3QgbWluID0gb2Zmc2V0ICsgb3ZlcmZsb3dbbWFpblNpZGVdO1xuICAgIGNvbnN0IG1heCA9IG9mZnNldCAtIG92ZXJmbG93W2FsdFNpZGVdO1xuXG4gICAgY29uc3QgYWRkaXRpdmUgPSB0ZXRoZXIgPyAtcG9wcGVyUmVjdFtsZW5dIC8gMiA6IDA7XG5cbiAgICBjb25zdCBtaW5MZW4gPSB2YXJpYXRpb24gPT09IHN0YXJ0ID8gcmVmZXJlbmNlUmVjdFtsZW5dIDogcG9wcGVyUmVjdFtsZW5dO1xuICAgIGNvbnN0IG1heExlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyAtcG9wcGVyUmVjdFtsZW5dIDogLXJlZmVyZW5jZVJlY3RbbGVuXTtcblxuICAgIC8vIFdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgYXJyb3cgaW4gdGhlIGNhbGN1bGF0aW9uIHNvIHRoZSBhcnJvdyBkb2Vzbid0IGdvXG4gICAgLy8gb3V0c2lkZSB0aGUgcmVmZXJlbmNlIGJvdW5kc1xuICAgIGNvbnN0IGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICAgIGNvbnN0IGFycm93UmVjdCA9XG4gICAgICB0ZXRoZXIgJiYgYXJyb3dFbGVtZW50XG4gICAgICAgID8gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpXG4gICAgICAgIDogeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG4gICAgY29uc3QgYXJyb3dQYWRkaW5nT2JqZWN0ID0gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddXG4gICAgICA/IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXS5wYWRkaW5nXG4gICAgICA6IGdldEZyZXNoU2lkZU9iamVjdCgpO1xuICAgIGNvbnN0IGFycm93UGFkZGluZ01pbiA9IGFycm93UGFkZGluZ09iamVjdFttYWluU2lkZV07XG4gICAgY29uc3QgYXJyb3dQYWRkaW5nTWF4ID0gYXJyb3dQYWRkaW5nT2JqZWN0W2FsdFNpZGVdO1xuXG4gICAgLy8gSWYgdGhlIHJlZmVyZW5jZSBsZW5ndGggaXMgc21hbGxlciB0aGFuIHRoZSBhcnJvdyBsZW5ndGgsIHdlIGRvbid0IHdhbnRcbiAgICAvLyB0byBpbmNsdWRlIGl0cyBmdWxsIHNpemUgaW4gdGhlIGNhbGN1bGF0aW9uLiBJZiB0aGUgcmVmZXJlbmNlIGlzIHNtYWxsXG4gICAgLy8gYW5kIG5lYXIgdGhlIGVkZ2Ugb2YgYSBib3VuZGFyeSwgdGhlIHBvcHBlciBjYW4gb3ZlcmZsb3cgZXZlbiBpZiB0aGVcbiAgICAvLyByZWZlcmVuY2UgaXMgbm90IG92ZXJmbG93aW5nIGFzIHdlbGwgKGUuZy4gdmlydHVhbCBlbGVtZW50cyB3aXRoIG5vXG4gICAgLy8gd2lkdGggb3IgaGVpZ2h0KVxuICAgIGNvbnN0IGFycm93TGVuID0gd2l0aGluKDAsIHJlZmVyZW5jZVJlY3RbbGVuXSwgYXJyb3dSZWN0W2xlbl0pO1xuXG4gICAgY29uc3QgbWluT2Zmc2V0ID0gaXNCYXNlUGxhY2VtZW50XG4gICAgICA/IHJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgLVxuICAgICAgICBhZGRpdGl2ZSAtXG4gICAgICAgIGFycm93TGVuIC1cbiAgICAgICAgYXJyb3dQYWRkaW5nTWluIC1cbiAgICAgICAgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzXG4gICAgICA6IG1pbkxlbiAtXG4gICAgICAgIGFycm93TGVuIC1cbiAgICAgICAgYXJyb3dQYWRkaW5nTWluIC1cbiAgICAgICAgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzO1xuICAgIGNvbnN0IG1heE9mZnNldCA9IGlzQmFzZVBsYWNlbWVudFxuICAgICAgPyAtcmVmZXJlbmNlUmVjdFtsZW5dIC8gMiArXG4gICAgICAgIGFkZGl0aXZlICtcbiAgICAgICAgYXJyb3dMZW4gK1xuICAgICAgICBhcnJvd1BhZGRpbmdNYXggK1xuICAgICAgICBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXNcbiAgICAgIDogbWF4TGVuICtcbiAgICAgICAgYXJyb3dMZW4gK1xuICAgICAgICBhcnJvd1BhZGRpbmdNYXggK1xuICAgICAgICBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG5cbiAgICBjb25zdCBhcnJvd09mZnNldFBhcmVudCA9XG4gICAgICBzdGF0ZS5lbGVtZW50cy5hcnJvdyAmJiBnZXRPZmZzZXRQYXJlbnQoc3RhdGUuZWxlbWVudHMuYXJyb3cpO1xuICAgIGNvbnN0IGNsaWVudE9mZnNldCA9IGFycm93T2Zmc2V0UGFyZW50XG4gICAgICA/IG1haW5BeGlzID09PSAneSdcbiAgICAgICAgPyBhcnJvd09mZnNldFBhcmVudC5jbGllbnRUb3AgfHwgMFxuICAgICAgICA6IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudExlZnQgfHwgMFxuICAgICAgOiAwO1xuXG4gICAgY29uc3Qgb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IG9mZnNldE1vZGlmaWVyU3RhdGU/LlttYWluQXhpc10gPz8gMDtcbiAgICBjb25zdCB0ZXRoZXJNaW4gPSBvZmZzZXQgKyBtaW5PZmZzZXQgLSBvZmZzZXRNb2RpZmllclZhbHVlIC0gY2xpZW50T2Zmc2V0O1xuICAgIGNvbnN0IHRldGhlck1heCA9IG9mZnNldCArIG1heE9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWU7XG5cbiAgICBjb25zdCBwcmV2ZW50ZWRPZmZzZXQgPSB3aXRoaW4oXG4gICAgICB0ZXRoZXIgPyBtYXRoTWluKG1pbiwgdGV0aGVyTWluKSA6IG1pbixcbiAgICAgIG9mZnNldCxcbiAgICAgIHRldGhlciA/IG1hdGhNYXgobWF4LCB0ZXRoZXJNYXgpIDogbWF4XG4gICAgKTtcblxuICAgIHBvcHBlck9mZnNldHNbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0O1xuICAgIGRhdGFbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0IC0gb2Zmc2V0O1xuICB9XG5cbiAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgIGNvbnN0IG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IHRvcCA6IGxlZnQ7XG4gICAgY29uc3QgYWx0U2lkZSA9IG1haW5BeGlzID09PSAneCcgPyBib3R0b20gOiByaWdodDtcbiAgICBjb25zdCBvZmZzZXQgPSBwb3BwZXJPZmZzZXRzW2FsdEF4aXNdO1xuXG4gICAgY29uc3QgbGVuID0gYWx0QXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gICAgY29uc3QgbWluID0gb2Zmc2V0ICsgb3ZlcmZsb3dbbWFpblNpZGVdO1xuICAgIGNvbnN0IG1heCA9IG9mZnNldCAtIG92ZXJmbG93W2FsdFNpZGVdO1xuXG4gICAgY29uc3QgaXNPcmlnaW5TaWRlID0gW3RvcCwgbGVmdF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSAhPT0gLTE7XG5cbiAgICBjb25zdCBvZmZzZXRNb2RpZmllclZhbHVlID0gb2Zmc2V0TW9kaWZpZXJTdGF0ZT8uW2FsdEF4aXNdID8/IDA7XG4gICAgY29uc3QgdGV0aGVyTWluID0gaXNPcmlnaW5TaWRlXG4gICAgICA/IG1pblxuICAgICAgOiBvZmZzZXQgLVxuICAgICAgICByZWZlcmVuY2VSZWN0W2xlbl0gLVxuICAgICAgICBwb3BwZXJSZWN0W2xlbl0gLVxuICAgICAgICBvZmZzZXRNb2RpZmllclZhbHVlICtcbiAgICAgICAgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLmFsdEF4aXM7XG4gICAgY29uc3QgdGV0aGVyTWF4ID0gaXNPcmlnaW5TaWRlXG4gICAgICA/IG9mZnNldCArXG4gICAgICAgIHJlZmVyZW5jZVJlY3RbbGVuXSArXG4gICAgICAgIHBvcHBlclJlY3RbbGVuXSAtXG4gICAgICAgIG9mZnNldE1vZGlmaWVyVmFsdWUgLVxuICAgICAgICBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUuYWx0QXhpc1xuICAgICAgOiBtYXg7XG5cbiAgICBjb25zdCBwcmV2ZW50ZWRPZmZzZXQgPVxuICAgICAgdGV0aGVyICYmIGlzT3JpZ2luU2lkZVxuICAgICAgICA/IHdpdGhpbk1heENsYW1wKHRldGhlck1pbiwgb2Zmc2V0LCB0ZXRoZXJNYXgpXG4gICAgICAgIDogd2l0aGluKHRldGhlciA/IHRldGhlck1pbiA6IG1pbiwgb2Zmc2V0LCB0ZXRoZXIgPyB0ZXRoZXJNYXggOiBtYXgpO1xuXG4gICAgcG9wcGVyT2Zmc2V0c1thbHRBeGlzXSA9IHByZXZlbnRlZE9mZnNldDtcbiAgICBkYXRhW2FsdEF4aXNdID0gcHJldmVudGVkT2Zmc2V0IC0gb2Zmc2V0O1xuICB9XG5cbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGRhdGE7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcbmV4cG9ydCB0eXBlIFByZXZlbnRPdmVyZmxvd01vZGlmaWVyID0gTW9kaWZpZXI8J3ByZXZlbnRPdmVyZmxvdycsIE9wdGlvbnM+O1xuZXhwb3J0IGRlZmF1bHQgKHtcbiAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBwcmV2ZW50T3ZlcmZsb3csXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsnb2Zmc2V0J10sXG59OiBQcmV2ZW50T3ZlcmZsb3dNb2RpZmllcik7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUgeyBNb2RpZmllciwgTW9kaWZpZXJBcmd1bWVudHMsIFBhZGRpbmcsIFJlY3QgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFBsYWNlbWVudCB9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gJy4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQnO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSAnLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QnO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gJy4uL2RvbS11dGlscy9jb250YWlucyc7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gJy4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQnO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tICcuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQnO1xuaW1wb3J0IHsgd2l0aGluIH0gZnJvbSAnLi4vdXRpbHMvd2l0aGluJztcbmltcG9ydCBtZXJnZVBhZGRpbmdPYmplY3QgZnJvbSAnLi4vdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0JztcbmltcG9ydCBleHBhbmRUb0hhc2hNYXAgZnJvbSAnLi4vdXRpbHMvZXhwYW5kVG9IYXNoTWFwJztcbmltcG9ydCB7IGxlZnQsIHJpZ2h0LCBiYXNlUGxhY2VtZW50cywgdG9wLCBib3R0b20gfSBmcm9tICcuLi9lbnVtcyc7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSAnLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5leHBvcnQgdHlwZSBPcHRpb25zID0ge1xuICBlbGVtZW50OiBIVE1MRWxlbWVudCB8IHN0cmluZyB8IG51bGwsXG4gIHBhZGRpbmc6XG4gICAgfCBQYWRkaW5nXG4gICAgfCAoKHt8XG4gICAgICAgIHBvcHBlcjogUmVjdCxcbiAgICAgICAgcmVmZXJlbmNlOiBSZWN0LFxuICAgICAgICBwbGFjZW1lbnQ6IFBsYWNlbWVudCxcbiAgICAgIHx9KSA9PiBQYWRkaW5nKSxcbn07XG5cbmNvbnN0IHRvUGFkZGluZ09iamVjdCA9IChwYWRkaW5nLCBzdGF0ZSkgPT4ge1xuICBwYWRkaW5nID1cbiAgICB0eXBlb2YgcGFkZGluZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBwYWRkaW5nKHsgLi4uc3RhdGUucmVjdHMsIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50IH0pXG4gICAgICA6IHBhZGRpbmc7XG5cbiAgcmV0dXJuIG1lcmdlUGFkZGluZ09iamVjdChcbiAgICB0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcidcbiAgICAgID8gcGFkZGluZ1xuICAgICAgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpXG4gICk7XG59O1xuXG5mdW5jdGlvbiBhcnJvdyh7IHN0YXRlLCBuYW1lLCBvcHRpb25zIH06IE1vZGlmaWVyQXJndW1lbnRzPE9wdGlvbnM+KSB7XG4gIGNvbnN0IGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICBjb25zdCBwb3BwZXJPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzO1xuICBjb25zdCBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICBjb25zdCBheGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICBjb25zdCBpc1ZlcnRpY2FsID0gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDA7XG4gIGNvbnN0IGxlbiA9IGlzVmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgaWYgKCFhcnJvd0VsZW1lbnQgfHwgIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYWRkaW5nT2JqZWN0ID0gdG9QYWRkaW5nT2JqZWN0KG9wdGlvbnMucGFkZGluZywgc3RhdGUpO1xuICBjb25zdCBhcnJvd1JlY3QgPSBnZXRMYXlvdXRSZWN0KGFycm93RWxlbWVudCk7XG4gIGNvbnN0IG1pblByb3AgPSBheGlzID09PSAneScgPyB0b3AgOiBsZWZ0O1xuICBjb25zdCBtYXhQcm9wID0gYXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG5cbiAgY29uc3QgZW5kRGlmZiA9XG4gICAgc3RhdGUucmVjdHMucmVmZXJlbmNlW2xlbl0gK1xuICAgIHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtheGlzXSAtXG4gICAgcG9wcGVyT2Zmc2V0c1theGlzXSAtXG4gICAgc3RhdGUucmVjdHMucG9wcGVyW2xlbl07XG4gIGNvbnN0IHN0YXJ0RGlmZiA9IHBvcHBlck9mZnNldHNbYXhpc10gLSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2VbYXhpc107XG5cbiAgY29uc3QgYXJyb3dPZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQoYXJyb3dFbGVtZW50KTtcbiAgY29uc3QgY2xpZW50U2l6ZSA9IGFycm93T2Zmc2V0UGFyZW50XG4gICAgPyBheGlzID09PSAneSdcbiAgICAgID8gYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50SGVpZ2h0IHx8IDBcbiAgICAgIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50V2lkdGggfHwgMFxuICAgIDogMDtcblxuICBjb25zdCBjZW50ZXJUb1JlZmVyZW5jZSA9IGVuZERpZmYgLyAyIC0gc3RhcnREaWZmIC8gMjtcblxuICAvLyBNYWtlIHN1cmUgdGhlIGFycm93IGRvZXNuJ3Qgb3ZlcmZsb3cgdGhlIHBvcHBlciBpZiB0aGUgY2VudGVyIHBvaW50IGlzXG4gIC8vIG91dHNpZGUgb2YgdGhlIHBvcHBlciBib3VuZHNcbiAgY29uc3QgbWluID0gcGFkZGluZ09iamVjdFttaW5Qcm9wXTtcbiAgY29uc3QgbWF4ID0gY2xpZW50U2l6ZSAtIGFycm93UmVjdFtsZW5dIC0gcGFkZGluZ09iamVjdFttYXhQcm9wXTtcbiAgY29uc3QgY2VudGVyID0gY2xpZW50U2l6ZSAvIDIgLSBhcnJvd1JlY3RbbGVuXSAvIDIgKyBjZW50ZXJUb1JlZmVyZW5jZTtcbiAgY29uc3Qgb2Zmc2V0ID0gd2l0aGluKG1pbiwgY2VudGVyLCBtYXgpO1xuXG4gIC8vIFByZXZlbnRzIGJyZWFraW5nIHN5bnRheCBoaWdobGlnaHRpbmcuLi5cbiAgY29uc3QgYXhpc1Byb3A6IHN0cmluZyA9IGF4aXM7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSB7XG4gICAgW2F4aXNQcm9wXTogb2Zmc2V0LFxuICAgIGNlbnRlck9mZnNldDogb2Zmc2V0IC0gY2VudGVyLFxuICB9O1xufVxuXG5mdW5jdGlvbiBlZmZlY3QoeyBzdGF0ZSwgb3B0aW9ucyB9OiBNb2RpZmllckFyZ3VtZW50czxPcHRpb25zPikge1xuICBsZXQgeyBlbGVtZW50OiBhcnJvd0VsZW1lbnQgPSAnW2RhdGEtcG9wcGVyLWFycm93XScgfSA9IG9wdGlvbnM7XG5cbiAgaWYgKGFycm93RWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ1NTIHNlbGVjdG9yXG4gIGlmICh0eXBlb2YgYXJyb3dFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLnBvcHBlci5xdWVyeVNlbGVjdG9yKGFycm93RWxlbWVudCk7XG5cbiAgICBpZiAoIWFycm93RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChfX0RFVl9fKSB7XG4gICAgaWYgKCFpc0hUTUxFbGVtZW50KGFycm93RWxlbWVudCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIFtcbiAgICAgICAgICAnUG9wcGVyOiBcImFycm93XCIgZWxlbWVudCBtdXN0IGJlIGFuIEhUTUxFbGVtZW50IChub3QgYW4gU1ZHRWxlbWVudCkuJyxcbiAgICAgICAgICAnVG8gdXNlIGFuIFNWRyBhcnJvdywgd3JhcCBpdCBpbiBhbiBIVE1MRWxlbWVudCB0aGF0IHdpbGwgYmUgdXNlZCBhcycsXG4gICAgICAgICAgJ3RoZSBhcnJvdy4nLFxuICAgICAgICBdLmpvaW4oJyAnKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbnRhaW5zKHN0YXRlLmVsZW1lbnRzLnBvcHBlciwgYXJyb3dFbGVtZW50KSkge1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBbXG4gICAgICAgICAgJ1BvcHBlcjogXCJhcnJvd1wiIG1vZGlmaWVyXFwncyBgZWxlbWVudGAgbXVzdCBiZSBhIGNoaWxkIG9mIHRoZSBwb3BwZXInLFxuICAgICAgICAgICdlbGVtZW50LicsXG4gICAgICAgIF0uam9pbignICcpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXRlLmVsZW1lbnRzLmFycm93ID0gYXJyb3dFbGVtZW50O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5leHBvcnQgdHlwZSBBcnJvd01vZGlmaWVyID0gTW9kaWZpZXI8J2Fycm93JywgT3B0aW9ucz47XG5leHBvcnQgZGVmYXVsdCAoe1xuICBuYW1lOiAnYXJyb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogYXJyb3csXG4gIGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ3ByZXZlbnRPdmVyZmxvdyddLFxufTogQXJyb3dNb2RpZmllcik7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUge1xuICBNb2RpZmllckFyZ3VtZW50cyxcbiAgTW9kaWZpZXIsXG4gIFJlY3QsXG4gIFNpZGVPYmplY3QsXG4gIE9mZnNldHMsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCB9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tICcuLi91dGlscy9kZXRlY3RPdmVyZmxvdyc7XG5cbmZ1bmN0aW9uIGdldFNpZGVPZmZzZXRzKFxuICBvdmVyZmxvdzogU2lkZU9iamVjdCxcbiAgcmVjdDogUmVjdCxcbiAgcHJldmVudGVkT2Zmc2V0czogT2Zmc2V0cyA9IHsgeDogMCwgeTogMCB9XG4pOiBTaWRlT2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IG92ZXJmbG93LnRvcCAtIHJlY3QuaGVpZ2h0IC0gcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIHJpZ2h0OiBvdmVyZmxvdy5yaWdodCAtIHJlY3Qud2lkdGggKyBwcmV2ZW50ZWRPZmZzZXRzLngsXG4gICAgYm90dG9tOiBvdmVyZmxvdy5ib3R0b20gLSByZWN0LmhlaWdodCArIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICBsZWZ0OiBvdmVyZmxvdy5sZWZ0IC0gcmVjdC53aWR0aCAtIHByZXZlbnRlZE9mZnNldHMueCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG92ZXJmbG93OiBTaWRlT2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBbdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XS5zb21lKChzaWRlKSA9PiBvdmVyZmxvd1tzaWRlXSA+PSAwKTtcbn1cblxuZnVuY3Rpb24gaGlkZSh7IHN0YXRlLCBuYW1lIH06IE1vZGlmaWVyQXJndW1lbnRzPHt8fH0+KSB7XG4gIGNvbnN0IHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIGNvbnN0IHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIGNvbnN0IHByZXZlbnRlZE9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnByZXZlbnRPdmVyZmxvdztcblxuICBjb25zdCByZWZlcmVuY2VPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgZWxlbWVudENvbnRleHQ6ICdyZWZlcmVuY2UnLFxuICB9KTtcbiAgY29uc3QgcG9wcGVyQWx0T3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGFsdEJvdW5kYXJ5OiB0cnVlLFxuICB9KTtcblxuICBjb25zdCByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhcbiAgICByZWZlcmVuY2VPdmVyZmxvdyxcbiAgICByZWZlcmVuY2VSZWN0XG4gICk7XG4gIGNvbnN0IHBvcHBlckVzY2FwZU9mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhcbiAgICBwb3BwZXJBbHRPdmVyZmxvdyxcbiAgICBwb3BwZXJSZWN0LFxuICAgIHByZXZlbnRlZE9mZnNldHNcbiAgKTtcblxuICBjb25zdCBpc1JlZmVyZW5jZUhpZGRlbiA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChyZWZlcmVuY2VDbGlwcGluZ09mZnNldHMpO1xuICBjb25zdCBoYXNQb3BwZXJFc2NhcGVkID0gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKHBvcHBlckVzY2FwZU9mZnNldHMpO1xuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSB7XG4gICAgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzLFxuICAgIHBvcHBlckVzY2FwZU9mZnNldHMsXG4gICAgaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgaGFzUG9wcGVyRXNjYXBlZCxcbiAgfTtcblxuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IHtcbiAgICAuLi5zdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlcixcbiAgICAnZGF0YS1wb3BwZXItcmVmZXJlbmNlLWhpZGRlbic6IGlzUmVmZXJlbmNlSGlkZGVuLFxuICAgICdkYXRhLXBvcHBlci1lc2NhcGVkJzogaGFzUG9wcGVyRXNjYXBlZCxcbiAgfTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHR5cGUgSGlkZU1vZGlmaWVyID0gTW9kaWZpZXI8J2hpZGUnLCB7fHx9PjtcbmV4cG9ydCBkZWZhdWx0ICh7XG4gIG5hbWU6ICdoaWRlJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydwcmV2ZW50T3ZlcmZsb3cnXSxcbiAgZm46IGhpZGUsXG59OiBIaWRlTW9kaWZpZXIpO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB7IHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tICcuL2NyZWF0ZVBvcHBlcic7XG5cbmltcG9ydCBldmVudExpc3RlbmVycyBmcm9tICcuL21vZGlmaWVycy9ldmVudExpc3RlbmVycyc7XG5pbXBvcnQgcG9wcGVyT2Zmc2V0cyBmcm9tICcuL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzJztcbmltcG9ydCBjb21wdXRlU3R5bGVzIGZyb20gJy4vbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMnO1xuaW1wb3J0IGFwcGx5U3R5bGVzIGZyb20gJy4vbW9kaWZpZXJzL2FwcGx5U3R5bGVzJztcblxuZXhwb3J0IHR5cGUgKiBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgZGVmYXVsdE1vZGlmaWVycyA9IFtcbiAgZXZlbnRMaXN0ZW5lcnMsXG4gIHBvcHBlck9mZnNldHMsXG4gIGNvbXB1dGVTdHlsZXMsXG4gIGFwcGx5U3R5bGVzLFxuXTtcblxuY29uc3QgY3JlYXRlUG9wcGVyID0gcG9wcGVyR2VuZXJhdG9yKHsgZGVmYXVsdE1vZGlmaWVycyB9KTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHsgY3JlYXRlUG9wcGVyLCBwb3BwZXJHZW5lcmF0b3IsIGRlZmF1bHRNb2RpZmllcnMsIGRldGVjdE92ZXJmbG93IH07XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHsgcG9wcGVyR2VuZXJhdG9yLCBkZXRlY3RPdmVyZmxvdyB9IGZyb20gJy4vY3JlYXRlUG9wcGVyJztcblxuaW1wb3J0IGV2ZW50TGlzdGVuZXJzIGZyb20gJy4vbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzJztcbmltcG9ydCBwb3BwZXJPZmZzZXRzIGZyb20gJy4vbW9kaWZpZXJzL3BvcHBlck9mZnNldHMnO1xuaW1wb3J0IGNvbXB1dGVTdHlsZXMgZnJvbSAnLi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcyc7XG5pbXBvcnQgYXBwbHlTdHlsZXMgZnJvbSAnLi9tb2RpZmllcnMvYXBwbHlTdHlsZXMnO1xuaW1wb3J0IG9mZnNldCBmcm9tICcuL21vZGlmaWVycy9vZmZzZXQnO1xuaW1wb3J0IGZsaXAgZnJvbSAnLi9tb2RpZmllcnMvZmxpcCc7XG5pbXBvcnQgcHJldmVudE92ZXJmbG93IGZyb20gJy4vbW9kaWZpZXJzL3ByZXZlbnRPdmVyZmxvdyc7XG5pbXBvcnQgYXJyb3cgZnJvbSAnLi9tb2RpZmllcnMvYXJyb3cnO1xuaW1wb3J0IGhpZGUgZnJvbSAnLi9tb2RpZmllcnMvaGlkZSc7XG5cbmV4cG9ydCB0eXBlICogZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IGRlZmF1bHRNb2RpZmllcnMgPSBbXG4gIGV2ZW50TGlzdGVuZXJzLFxuICBwb3BwZXJPZmZzZXRzLFxuICBjb21wdXRlU3R5bGVzLFxuICBhcHBseVN0eWxlcyxcbiAgb2Zmc2V0LFxuICBmbGlwLFxuICBwcmV2ZW50T3ZlcmZsb3csXG4gIGFycm93LFxuICBoaWRlLFxuXTtcblxuY29uc3QgY3JlYXRlUG9wcGVyID0gcG9wcGVyR2VuZXJhdG9yKHsgZGVmYXVsdE1vZGlmaWVycyB9KTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0IHsgY3JlYXRlUG9wcGVyLCBwb3BwZXJHZW5lcmF0b3IsIGRlZmF1bHRNb2RpZmllcnMsIGRldGVjdE92ZXJmbG93IH07XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgYXMgY3JlYXRlUG9wcGVyTGl0ZSB9IGZyb20gJy4vcG9wcGVyLWxpdGUnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuZXhwb3J0ICogZnJvbSAnLi9tb2RpZmllcnMnO1xuIl19 }).call(this,require("Zbi7gb")) },{"Zbi7gb":12}],10:[function(require,module,exports){ "use strict"; },{"jquery":20}],11:[function(require,module,exports){ "use strict"; function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get.bind(); } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } // bootstrap was here //# sourceMappingURL=data:application/json;charset=utf-8;base64,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SmlCM0I7RUE2SnBCOzs7OztFQUlBWSxvQkFBb0IsQ0FBQzZsQixLQUFELENBQXBCN2xCO0VBRUE7Ozs7RUFJQTdLLGtCQUFrQixDQUFDMHdCLEtBQUQsQ0FBbEIxd0I7RUN6TkE7Ozs7Ozs7RUFvQkEsZ0JBQWU7SUFDYnVMLEtBRGEsRUFDYkEsS0FEYTtJQUViVSxNQUZhLEVBRWJBLE1BRmE7SUFHYndGLFFBSGEsRUFHYkEsUUFIYTtJQUliaUUsUUFKYSxFQUliQSxRQUphO0lBS2IwRCxRQUxhLEVBS2JBLFFBTGE7SUFNYnNHLEtBTmEsRUFNYkEsS0FOYTtJQU9iK0IsU0FQYSxFQU9iQSxTQVBhO0lBUWJ1SixPQVJhLEVBUWJBLE9BUmE7SUFTYmUsU0FUYSxFQVNiQSxTQVRhO0lBVWJtRCxHQVZhLEVBVWJBLEdBVmE7SUFXYndCLEtBWGEsRUFXYkEsS0FYYTtJQVlieEk7RUFaYSxDQUFmIiwibmFtZXMiOlsiTUFYX1VJRCIsIk1JTExJU0VDT05EU19NVUxUSVBMSUVSIiwiVFJBTlNJVElPTl9FTkQiLCJ0b1R5cGUiLCJvYmplY3QiLCJ1bmRlZmluZWQiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsImNhbGwiLCJtYXRjaCIsInRvTG93ZXJDYXNlIiwiZ2V0VUlEIiwicHJlZml4IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImdldFNlbGVjdG9yIiwiZWxlbWVudCIsInNlbGVjdG9yIiwiZ2V0QXR0cmlidXRlIiwiaHJlZkF0dHJpYnV0ZSIsImluY2x1ZGVzIiwic3RhcnRzV2l0aCIsInNwbGl0IiwidHJpbSIsImdldFNlbGVjdG9yRnJvbUVsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiZ2V0RWxlbWVudEZyb21TZWxlY3RvciIsImdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50Iiwid2luZG93IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsInRyYW5zaXRpb25EdXJhdGlvbiIsInRyYW5zaXRpb25EZWxheSIsImZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uIiwiTnVtYmVyIiwicGFyc2VGbG9hdCIsImZsb2F0VHJhbnNpdGlvbkRlbGF5IiwidHJpZ2dlclRyYW5zaXRpb25FbmQiLCJkaXNwYXRjaEV2ZW50IiwiRXZlbnQiLCJpc0VsZW1lbnQiLCJqcXVlcnkiLCJub2RlVHlwZSIsImdldEVsZW1lbnQiLCJsZW5ndGgiLCJpc1Zpc2libGUiLCJnZXRDbGllbnRSZWN0cyIsImVsZW1lbnRJc1Zpc2libGUiLCJnZXRQcm9wZXJ0eVZhbHVlIiwiY2xvc2VkRGV0YWlscyIsImNsb3Nlc3QiLCJzdW1tYXJ5IiwicGFyZW50Tm9kZSIsImlzRGlzYWJsZWQiLCJOb2RlIiwiRUxFTUVOVF9OT0RFIiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJkaXNhYmxlZCIsImhhc0F0dHJpYnV0ZSIsImZpbmRTaGFkb3dSb290IiwiZG9jdW1lbnRFbGVtZW50IiwiYXR0YWNoU2hhZG93IiwiZ2V0Um9vdE5vZGUiLCJyb290IiwiU2hhZG93Um9vdCIsIm5vb3AiLCJyZWZsb3ciLCJvZmZzZXRIZWlnaHQiLCJnZXRqUXVlcnkiLCJqUXVlcnkiLCJib2R5IiwiRE9NQ29udGVudExvYWRlZENhbGxiYWNrcyIsIm9uRE9NQ29udGVudExvYWRlZCIsImNhbGxiYWNrIiwicmVhZHlTdGF0ZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJwdXNoIiwiaXNSVEwiLCJkaXIiLCJkZWZpbmVKUXVlcnlQbHVnaW4iLCJwbHVnaW4iLCIkIiwibmFtZSIsIk5BTUUiLCJKUVVFUllfTk9fQ09ORkxJQ1QiLCJmbiIsImpRdWVyeUludGVyZmFjZSIsIkNvbnN0cnVjdG9yIiwibm9Db25mbGljdCIsImV4ZWN1dGUiLCJleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uIiwidHJhbnNpdGlvbkVsZW1lbnQiLCJ3YWl0Rm9yVHJhbnNpdGlvbiIsImR1cmF0aW9uUGFkZGluZyIsImVtdWxhdGVkRHVyYXRpb24iLCJjYWxsZWQiLCJoYW5kbGVyIiwidGFyZ2V0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInNldFRpbWVvdXQiLCJnZXROZXh0QWN0aXZlRWxlbWVudCIsImxpc3QiLCJhY3RpdmVFbGVtZW50Iiwic2hvdWxkR2V0TmV4dCIsImlzQ3ljbGVBbGxvd2VkIiwibGlzdExlbmd0aCIsImluZGV4IiwiaW5kZXhPZiIsIm1heCIsIm1pbiIsIm5hbWVzcGFjZVJlZ2V4Iiwic3RyaXBOYW1lUmVnZXgiLCJzdHJpcFVpZFJlZ2V4IiwiZXZlbnRSZWdpc3RyeSIsInVpZEV2ZW50IiwiY3VzdG9tRXZlbnRzIiwibW91c2VlbnRlciIsIm1vdXNlbGVhdmUiLCJuYXRpdmVFdmVudHMiLCJTZXQiLCJtYWtlRXZlbnRVaWQiLCJ1aWQiLCJnZXRFbGVtZW50RXZlbnRzIiwiYm9vdHN0cmFwSGFuZGxlciIsImV2ZW50IiwiaHlkcmF0ZU9iaiIsImRlbGVnYXRlVGFyZ2V0Iiwib25lT2ZmIiwiRXZlbnRIYW5kbGVyIiwib2ZmIiwidHlwZSIsImFwcGx5IiwiYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIiLCJkb21FbGVtZW50cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJkb21FbGVtZW50IiwiZmluZEhhbmRsZXIiLCJldmVudHMiLCJjYWxsYWJsZSIsImRlbGVnYXRpb25TZWxlY3RvciIsInZhbHVlcyIsImZpbmQiLCJub3JtYWxpemVQYXJhbWV0ZXJzIiwib3JpZ2luYWxUeXBlRXZlbnQiLCJkZWxlZ2F0aW9uRnVuY3Rpb24iLCJpc0RlbGVnYXRlZCIsInR5cGVFdmVudCIsImdldFR5cGVFdmVudCIsImhhcyIsImFkZEhhbmRsZXIiLCJ3cmFwRnVuY3Rpb24iLCJyZWxhdGVkVGFyZ2V0IiwiaGFuZGxlcnMiLCJwcmV2aW91c0Z1bmN0aW9uIiwicmVwbGFjZSIsInJlbW92ZUhhbmRsZXIiLCJCb29sZWFuIiwicmVtb3ZlTmFtZXNwYWNlZEhhbmRsZXJzIiwibmFtZXNwYWNlIiwic3RvcmVFbGVtZW50RXZlbnQiLCJrZXlzIiwiaGFuZGxlcktleSIsIm9uIiwib25lIiwiaW5OYW1lc3BhY2UiLCJpc05hbWVzcGFjZSIsImVsZW1lbnRFdmVudCIsInNsaWNlIiwia2V5SGFuZGxlcnMiLCJ0cmlnZ2VyIiwiYXJncyIsImpRdWVyeUV2ZW50IiwiYnViYmxlcyIsIm5hdGl2ZURpc3BhdGNoIiwiZGVmYXVsdFByZXZlbnRlZCIsImlzUHJvcGFnYXRpb25TdG9wcGVkIiwiaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQiLCJpc0RlZmF1bHRQcmV2ZW50ZWQiLCJldnQiLCJjYW5jZWxhYmxlIiwicHJldmVudERlZmF1bHQiLCJvYmoiLCJtZXRhIiwia2V5IiwidmFsdWUiLCJfdW51c2VkIiwiZGVmaW5lUHJvcGVydHkiLCJjb25maWd1cmFibGUiLCJnZXQiLCJlbnRyaWVzIiwiZWxlbWVudE1hcCIsIk1hcCIsInNldCIsImluc3RhbmNlIiwiaW5zdGFuY2VNYXAiLCJzaXplIiwiY29uc29sZSIsImVycm9yIiwiQXJyYXkiLCJmcm9tIiwicmVtb3ZlIiwibm9ybWFsaXplRGF0YSIsIkpTT04iLCJwYXJzZSIsImRlY29kZVVSSUNvbXBvbmVudCIsIm5vcm1hbGl6ZURhdGFLZXkiLCJjaHIiLCJNYW5pcHVsYXRvciIsInNldERhdGFBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJyZW1vdmVEYXRhQXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwiZ2V0RGF0YUF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVzIiwiYnNLZXlzIiwiZGF0YXNldCIsImZpbHRlciIsInB1cmVLZXkiLCJjaGFyQXQiLCJnZXREYXRhQXR0cmlidXRlIiwiQ29uZmlnIiwiX2dldENvbmZpZyIsImNvbmZpZyIsIl9tZXJnZUNvbmZpZ09iaiIsIl9jb25maWdBZnRlck1lcmdlIiwiX3R5cGVDaGVja0NvbmZpZyIsImpzb25Db25maWciLCJjb25zdHJ1Y3RvciIsIkRlZmF1bHQiLCJjb25maWdUeXBlcyIsIkRlZmF1bHRUeXBlIiwicHJvcGVydHkiLCJleHBlY3RlZFR5cGVzIiwidmFsdWVUeXBlIiwiUmVnRXhwIiwidGVzdCIsIlR5cGVFcnJvciIsInRvVXBwZXJDYXNlIiwiRXJyb3IiLCJWRVJTSU9OIiwiQmFzZUNvbXBvbmVudCIsIl9lbGVtZW50IiwiX2NvbmZpZyIsIkRhdGEiLCJEQVRBX0tFWSIsImRpc3Bvc2UiLCJFVkVOVF9LRVkiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwicHJvcGVydHlOYW1lIiwiX3F1ZXVlQ2FsbGJhY2siLCJpc0FuaW1hdGVkIiwiZ2V0SW5zdGFuY2UiLCJlbmFibGVEaXNtaXNzVHJpZ2dlciIsImNvbXBvbmVudCIsIm1ldGhvZCIsImNsaWNrRXZlbnQiLCJ0YWdOYW1lIiwiZ2V0T3JDcmVhdGVJbnN0YW5jZSIsIkVWRU5UX0NMT1NFIiwiRVZFTlRfQ0xPU0VEIiwiQ0xBU1NfTkFNRV9GQURFIiwiQ0xBU1NfTkFNRV9TSE9XIiwiQWxlcnQiLCJjbG9zZSIsImNsb3NlRXZlbnQiLCJfZGVzdHJveUVsZW1lbnQiLCJlYWNoIiwiZGF0YSIsIkRBVEFfQVBJX0tFWSIsIkNMQVNTX05BTUVfQUNUSVZFIiwiU0VMRUNUT1JfREFUQV9UT0dHTEUiLCJFVkVOVF9DTElDS19EQVRBX0FQSSIsIkJ1dHRvbiIsInRvZ2dsZSIsImJ1dHRvbiIsIlNlbGVjdG9yRW5naW5lIiwiY29uY2F0IiwiRWxlbWVudCIsImZpbmRPbmUiLCJjaGlsZHJlbiIsImNoaWxkIiwibWF0Y2hlcyIsInBhcmVudHMiLCJhbmNlc3RvciIsInByZXYiLCJwcmV2aW91cyIsInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJuZXh0IiwibmV4dEVsZW1lbnRTaWJsaW5nIiwiZm9jdXNhYmxlQ2hpbGRyZW4iLCJmb2N1c2FibGVzIiwibWFwIiwiam9pbiIsImVsIiwiRVZFTlRfVE9VQ0hTVEFSVCIsIkVWRU5UX1RPVUNITU9WRSIsIkVWRU5UX1RPVUNIRU5EIiwiRVZFTlRfUE9JTlRFUkRPV04iLCJFVkVOVF9QT0lOVEVSVVAiLCJQT0lOVEVSX1RZUEVfVE9VQ0giLCJQT0lOVEVSX1RZUEVfUEVOIiwiQ0xBU1NfTkFNRV9QT0lOVEVSX0VWRU5UIiwiU1dJUEVfVEhSRVNIT0xEIiwiZW5kQ2FsbGJhY2siLCJsZWZ0Q2FsbGJhY2siLCJyaWdodENhbGxiYWNrIiwiU3dpcGUiLCJpc1N1cHBvcnRlZCIsIl9kZWx0YVgiLCJfc3VwcG9ydFBvaW50ZXJFdmVudHMiLCJQb2ludGVyRXZlbnQiLCJfaW5pdEV2ZW50cyIsIl9zdGFydCIsInRvdWNoZXMiLCJjbGllbnRYIiwiX2V2ZW50SXNQb2ludGVyUGVuVG91Y2giLCJfZW5kIiwiX2hhbmRsZVN3aXBlIiwiX21vdmUiLCJhYnNEZWx0YVgiLCJhYnMiLCJkaXJlY3Rpb24iLCJhZGQiLCJwb2ludGVyVHlwZSIsIm5hdmlnYXRvciIsIm1heFRvdWNoUG9pbnRzIiwiQVJST1dfTEVGVF9LRVkiLCJBUlJPV19SSUdIVF9LRVkiLCJUT1VDSEVWRU5UX0NPTVBBVF9XQUlUIiwiT1JERVJfTkVYVCIsIk9SREVSX1BSRVYiLCJESVJFQ1RJT05fTEVGVCIsIkRJUkVDVElPTl9SSUdIVCIsIkVWRU5UX1NMSURFIiwiRVZFTlRfU0xJRCIsIkVWRU5UX0tFWURPV04iLCJFVkVOVF9NT1VTRUVOVEVSIiwiRVZFTlRfTU9VU0VMRUFWRSIsIkVWRU5UX0RSQUdfU1RBUlQiLCJFVkVOVF9MT0FEX0RBVEFfQVBJIiwiQ0xBU1NfTkFNRV9DQVJPVVNFTCIsIkNMQVNTX05BTUVfU0xJREUiLCJDTEFTU19OQU1FX0VORCIsIkNMQVNTX05BTUVfU1RBUlQiLCJDTEFTU19OQU1FX05FWFQiLCJDTEFTU19OQU1FX1BSRVYiLCJTRUxFQ1RPUl9BQ1RJVkUiLCJTRUxFQ1RPUl9JVEVNIiwiU0VMRUNUT1JfQUNUSVZFX0lURU0iLCJTRUxFQ1RPUl9JVEVNX0lNRyIsIlNFTEVDVE9SX0lORElDQVRPUlMiLCJTRUxFQ1RPUl9EQVRBX1NMSURFIiwiU0VMRUNUT1JfREFUQV9SSURFIiwiS0VZX1RPX0RJUkVDVElPTiIsImludGVydmFsIiwia2V5Ym9hcmQiLCJwYXVzZSIsInJpZGUiLCJ0b3VjaCIsIndyYXAiLCJDYXJvdXNlbCIsIl9pbnRlcnZhbCIsIl9hY3RpdmVFbGVtZW50IiwiX2lzU2xpZGluZyIsInRvdWNoVGltZW91dCIsIl9zd2lwZUhlbHBlciIsIl9pbmRpY2F0b3JzRWxlbWVudCIsIl9hZGRFdmVudExpc3RlbmVycyIsImN5Y2xlIiwiX3NsaWRlIiwibmV4dFdoZW5WaXNpYmxlIiwiaGlkZGVuIiwiX2NsZWFySW50ZXJ2YWwiLCJfdXBkYXRlSW50ZXJ2YWwiLCJzZXRJbnRlcnZhbCIsIl9tYXliZUVuYWJsZUN5Y2xlIiwidG8iLCJpdGVtcyIsIl9nZXRJdGVtcyIsImFjdGl2ZUluZGV4IiwiX2dldEl0ZW1JbmRleCIsIl9nZXRBY3RpdmUiLCJvcmRlciIsImRlZmF1bHRJbnRlcnZhbCIsIl9rZXlkb3duIiwiX2FkZFRvdWNoRXZlbnRMaXN0ZW5lcnMiLCJpbWciLCJlbmRDYWxsQmFjayIsImNsZWFyVGltZW91dCIsInN3aXBlQ29uZmlnIiwiX2RpcmVjdGlvblRvT3JkZXIiLCJfc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudCIsImFjdGl2ZUluZGljYXRvciIsIm5ld0FjdGl2ZUluZGljYXRvciIsImVsZW1lbnRJbnRlcnZhbCIsInBhcnNlSW50IiwiaXNOZXh0IiwibmV4dEVsZW1lbnQiLCJuZXh0RWxlbWVudEluZGV4IiwidHJpZ2dlckV2ZW50IiwiZXZlbnROYW1lIiwiX29yZGVyVG9EaXJlY3Rpb24iLCJzbGlkZUV2ZW50IiwiaXNDeWNsaW5nIiwiZGlyZWN0aW9uYWxDbGFzc05hbWUiLCJvcmRlckNsYXNzTmFtZSIsImNvbXBsZXRlQ2FsbEJhY2siLCJfaXNBbmltYXRlZCIsImNsZWFySW50ZXJ2YWwiLCJjYXJvdXNlbCIsInNsaWRlSW5kZXgiLCJjYXJvdXNlbHMiLCJFVkVOVF9TSE9XIiwiRVZFTlRfU0hPV04iLCJFVkVOVF9ISURFIiwiRVZFTlRfSElEREVOIiwiQ0xBU1NfTkFNRV9DT0xMQVBTRSIsIkNMQVNTX05BTUVfQ09MTEFQU0lORyIsIkNMQVNTX05BTUVfQ09MTEFQU0VEIiwiQ0xBU1NfTkFNRV9ERUVQRVJfQ0hJTERSRU4iLCJDTEFTU19OQU1FX0hPUklaT05UQUwiLCJXSURUSCIsIkhFSUdIVCIsIlNFTEVDVE9SX0FDVElWRVMiLCJwYXJlbnQiLCJDb2xsYXBzZSIsIl9pc1RyYW5zaXRpb25pbmciLCJfdHJpZ2dlckFycmF5IiwidG9nZ2xlTGlzdCIsImVsZW0iLCJmaWx0ZXJFbGVtZW50IiwiZm91bmRFbGVtZW50IiwiX2luaXRpYWxpemVDaGlsZHJlbiIsIl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MiLCJfaXNTaG93biIsImhpZGUiLCJzaG93IiwiYWN0aXZlQ2hpbGRyZW4iLCJfZ2V0Rmlyc3RMZXZlbENoaWxkcmVuIiwic3RhcnRFdmVudCIsImFjdGl2ZUluc3RhbmNlIiwiZGltZW5zaW9uIiwiX2dldERpbWVuc2lvbiIsInN0eWxlIiwiY29tcGxldGUiLCJjYXBpdGFsaXplZERpbWVuc2lvbiIsInNjcm9sbFNpemUiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJzZWxlY3RlZCIsInRyaWdnZXJBcnJheSIsImlzT3BlbiIsInNlbGVjdG9yRWxlbWVudHMiLCJFU0NBUEVfS0VZIiwiVEFCX0tFWSIsIkFSUk9XX1VQX0tFWSIsIkFSUk9XX0RPV05fS0VZIiwiUklHSFRfTU9VU0VfQlVUVE9OIiwiRVZFTlRfS0VZRE9XTl9EQVRBX0FQSSIsIkVWRU5UX0tFWVVQX0RBVEFfQVBJIiwiQ0xBU1NfTkFNRV9EUk9QVVAiLCJDTEFTU19OQU1FX0RST1BFTkQiLCJDTEFTU19OQU1FX0RST1BTVEFSVCIsIkNMQVNTX05BTUVfRFJPUFVQX0NFTlRFUiIsIkNMQVNTX05BTUVfRFJPUERPV05fQ0VOVEVSIiwiU0VMRUNUT1JfREFUQV9UT0dHTEVfU0hPV04iLCJTRUxFQ1RPUl9NRU5VIiwiU0VMRUNUT1JfTkFWQkFSIiwiU0VMRUNUT1JfTkFWQkFSX05BViIsIlNFTEVDVE9SX1ZJU0lCTEVfSVRFTVMiLCJQTEFDRU1FTlRfVE9QIiwiUExBQ0VNRU5UX1RPUEVORCIsIlBMQUNFTUVOVF9CT1RUT00iLCJQTEFDRU1FTlRfQk9UVE9NRU5EIiwiUExBQ0VNRU5UX1JJR0hUIiwiUExBQ0VNRU5UX0xFRlQiLCJQTEFDRU1FTlRfVE9QQ0VOVEVSIiwiUExBQ0VNRU5UX0JPVFRPTUNFTlRFUiIsImF1dG9DbG9zZSIsImJvdW5kYXJ5IiwiZGlzcGxheSIsIm9mZnNldCIsInBvcHBlckNvbmZpZyIsInJlZmVyZW5jZSIsIkRyb3Bkb3duIiwiX3BvcHBlciIsIl9wYXJlbnQiLCJfbWVudSIsIl9pbk5hdmJhciIsIl9kZXRlY3ROYXZiYXIiLCJzaG93RXZlbnQiLCJfY3JlYXRlUG9wcGVyIiwiZm9jdXMiLCJfY29tcGxldGVIaWRlIiwiZGVzdHJveSIsInVwZGF0ZSIsImhpZGVFdmVudCIsIlBvcHBlciIsInJlZmVyZW5jZUVsZW1lbnQiLCJfZ2V0UG9wcGVyQ29uZmlnIiwiY3JlYXRlUG9wcGVyIiwiX2dldFBsYWNlbWVudCIsInBhcmVudERyb3Bkb3duIiwiaXNFbmQiLCJfZ2V0T2Zmc2V0IiwicG9wcGVyRGF0YSIsImRlZmF1bHRCc1BvcHBlckNvbmZpZyIsInBsYWNlbWVudCIsIm1vZGlmaWVycyIsIm9wdGlvbnMiLCJlbmFibGVkIiwiX3NlbGVjdE1lbnVJdGVtIiwib3BlblRvZ2dsZXMiLCJjb250ZXh0IiwiY29tcG9zZWRQYXRoIiwiaXNNZW51VGFyZ2V0IiwiaXNJbnB1dCIsImlzRXNjYXBlRXZlbnQiLCJpc1VwT3JEb3duRXZlbnQiLCJnZXRUb2dnbGVCdXR0b24iLCJzdG9wUHJvcGFnYXRpb24iLCJkYXRhQXBpS2V5ZG93bkhhbmRsZXIiLCJjbGVhck1lbnVzIiwiU0VMRUNUT1JfRklYRURfQ09OVEVOVCIsIlNFTEVDVE9SX1NUSUNLWV9DT05URU5UIiwiUFJPUEVSVFlfUEFERElORyIsIlBST1BFUlRZX01BUkdJTiIsIlNjcm9sbEJhckhlbHBlciIsImdldFdpZHRoIiwiZG9jdW1lbnRXaWR0aCIsImNsaWVudFdpZHRoIiwiaW5uZXJXaWR0aCIsIndpZHRoIiwiX2Rpc2FibGVPdmVyRmxvdyIsIl9zZXRFbGVtZW50QXR0cmlidXRlcyIsImNhbGN1bGF0ZWRWYWx1ZSIsInJlc2V0IiwiX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMiLCJpc092ZXJmbG93aW5nIiwiX3NhdmVJbml0aWFsQXR0cmlidXRlIiwib3ZlcmZsb3ciLCJzdHlsZVByb3BlcnR5Iiwic2Nyb2xsYmFyV2lkdGgiLCJtYW5pcHVsYXRpb25DYWxsQmFjayIsInNldFByb3BlcnR5IiwiX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2siLCJhY3R1YWxWYWx1ZSIsInJlbW92ZVByb3BlcnR5IiwiY2FsbEJhY2siLCJzZWwiLCJFVkVOVF9NT1VTRURPV04iLCJjbGFzc05hbWUiLCJjbGlja0NhbGxiYWNrIiwicm9vdEVsZW1lbnQiLCJCYWNrZHJvcCIsIl9pc0FwcGVuZGVkIiwiX2FwcGVuZCIsIl9nZXRFbGVtZW50IiwiX2VtdWxhdGVBbmltYXRpb24iLCJiYWNrZHJvcCIsImNyZWF0ZUVsZW1lbnQiLCJhcHBlbmQiLCJFVkVOVF9GT0NVU0lOIiwiRVZFTlRfS0VZRE9XTl9UQUIiLCJUQUJfTkFWX0ZPUldBUkQiLCJUQUJfTkFWX0JBQ0tXQVJEIiwiYXV0b2ZvY3VzIiwidHJhcEVsZW1lbnQiLCJGb2N1c1RyYXAiLCJfaXNBY3RpdmUiLCJfbGFzdFRhYk5hdkRpcmVjdGlvbiIsImFjdGl2YXRlIiwiX2hhbmRsZUZvY3VzaW4iLCJfaGFuZGxlS2V5ZG93biIsImRlYWN0aXZhdGUiLCJlbGVtZW50cyIsInNoaWZ0S2V5IiwiRVZFTlRfSElERV9QUkVWRU5URUQiLCJFVkVOVF9SRVNJWkUiLCJFVkVOVF9NT1VTRURPV05fRElTTUlTUyIsIkVWRU5UX0tFWURPV05fRElTTUlTUyIsIkNMQVNTX05BTUVfT1BFTiIsIkNMQVNTX05BTUVfU1RBVElDIiwiT1BFTl9TRUxFQ1RPUiIsIlNFTEVDVE9SX0RJQUxPRyIsIlNFTEVDVE9SX01PREFMX0JPRFkiLCJNb2RhbCIsIl9kaWFsb2ciLCJfYmFja2Ryb3AiLCJfaW5pdGlhbGl6ZUJhY2tEcm9wIiwiX2ZvY3VzdHJhcCIsIl9pbml0aWFsaXplRm9jdXNUcmFwIiwiX3Njcm9sbEJhciIsIl9hZGp1c3REaWFsb2ciLCJfc2hvd0VsZW1lbnQiLCJfaGlkZU1vZGFsIiwiaHRtbEVsZW1lbnQiLCJoYW5kbGVVcGRhdGUiLCJzY3JvbGxUb3AiLCJtb2RhbEJvZHkiLCJ0cmFuc2l0aW9uQ29tcGxldGUiLCJfdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbiIsImN1cnJlbnRUYXJnZXQiLCJfcmVzZXRBZGp1c3RtZW50cyIsImlzTW9kYWxPdmVyZmxvd2luZyIsInNjcm9sbEhlaWdodCIsImNsaWVudEhlaWdodCIsImluaXRpYWxPdmVyZmxvd1kiLCJvdmVyZmxvd1kiLCJpc0JvZHlPdmVyZmxvd2luZyIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0IiwiYWxyZWFkeU9wZW4iLCJDTEFTU19OQU1FX1NIT1dJTkciLCJDTEFTU19OQU1FX0hJRElORyIsIkNMQVNTX05BTUVfQkFDS0RST1AiLCJzY3JvbGwiLCJPZmZjYW52YXMiLCJibHVyIiwiY29tcGxldGVDYWxsYmFjayIsInBvc2l0aW9uIiwidXJpQXR0cmlidXRlcyIsIkFSSUFfQVRUUklCVVRFX1BBVFRFUk4iLCJTQUZFX1VSTF9QQVRURVJOIiwiREFUQV9VUkxfUEFUVEVSTiIsImFsbG93ZWRBdHRyaWJ1dGUiLCJhdHRyaWJ1dGUiLCJhbGxvd2VkQXR0cmlidXRlTGlzdCIsImF0dHJpYnV0ZU5hbWUiLCJub2RlTmFtZSIsIm5vZGVWYWx1ZSIsImF0dHJpYnV0ZVJlZ2V4Iiwic29tZSIsInJlZ2V4IiwiRGVmYXVsdEFsbG93bGlzdCIsImEiLCJhcmVhIiwiYiIsImJyIiwiY29sIiwiY29kZSIsImRpdiIsImVtIiwiaHIiLCJoMSIsImgyIiwiaDMiLCJoNCIsImg1IiwiaDYiLCJpIiwibGkiLCJvbCIsInAiLCJwcmUiLCJzIiwic21hbGwiLCJzcGFuIiwic3ViIiwic3VwIiwic3Ryb25nIiwidSIsInVsIiwic2FuaXRpemVIdG1sIiwidW5zYWZlSHRtbCIsImFsbG93TGlzdCIsInNhbml0aXplRnVuY3Rpb24iLCJkb21QYXJzZXIiLCJET01QYXJzZXIiLCJjcmVhdGVkRG9jdW1lbnQiLCJwYXJzZUZyb21TdHJpbmciLCJlbGVtZW50TmFtZSIsImF0dHJpYnV0ZUxpc3QiLCJhbGxvd2VkQXR0cmlidXRlcyIsImlubmVySFRNTCIsImNvbnRlbnQiLCJleHRyYUNsYXNzIiwiaHRtbCIsInNhbml0aXplIiwic2FuaXRpemVGbiIsInRlbXBsYXRlIiwiRGVmYXVsdENvbnRlbnRUeXBlIiwiZW50cnkiLCJUZW1wbGF0ZUZhY3RvcnkiLCJnZXRDb250ZW50IiwiX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uIiwiaGFzQ29udGVudCIsImNoYW5nZUNvbnRlbnQiLCJfY2hlY2tDb250ZW50IiwidG9IdG1sIiwidGVtcGxhdGVXcmFwcGVyIiwiX21heWJlU2FuaXRpemUiLCJ0ZXh0IiwiX3NldENvbnRlbnQiLCJhcmciLCJ0ZW1wbGF0ZUVsZW1lbnQiLCJfcHV0RWxlbWVudEluVGVtcGxhdGUiLCJ0ZXh0Q29udGVudCIsIkRJU0FMTE9XRURfQVRUUklCVVRFUyIsIkNMQVNTX05BTUVfTU9EQUwiLCJTRUxFQ1RPUl9UT09MVElQX0lOTkVSIiwiU0VMRUNUT1JfTU9EQUwiLCJFVkVOVF9NT0RBTF9ISURFIiwiVFJJR0dFUl9IT1ZFUiIsIlRSSUdHRVJfRk9DVVMiLCJUUklHR0VSX0NMSUNLIiwiVFJJR0dFUl9NQU5VQUwiLCJFVkVOVF9JTlNFUlRFRCIsIkVWRU5UX0NMSUNLIiwiRVZFTlRfRk9DVVNPVVQiLCJBdHRhY2htZW50TWFwIiwiQVVUTyIsIlRPUCIsIlJJR0hUIiwiQk9UVE9NIiwiTEVGVCIsImFuaW1hdGlvbiIsImNvbnRhaW5lciIsImN1c3RvbUNsYXNzIiwiZGVsYXkiLCJmYWxsYmFja1BsYWNlbWVudHMiLCJ0aXRsZSIsIlRvb2x0aXAiLCJfaXNFbmFibGVkIiwiX3RpbWVvdXQiLCJfaXNIb3ZlcmVkIiwiX2FjdGl2ZVRyaWdnZXIiLCJfdGVtcGxhdGVGYWN0b3J5IiwiX25ld0NvbnRlbnQiLCJ0aXAiLCJfc2V0TGlzdGVuZXJzIiwiZW5hYmxlIiwiZGlzYWJsZSIsInRvZ2dsZUVuYWJsZWQiLCJfaW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0IiwiY2xpY2siLCJfaXNXaXRoQWN0aXZlVHJpZ2dlciIsIl9lbnRlciIsIl9sZWF2ZSIsIl9oaWRlTW9kYWxIYW5kbGVyIiwiX2Rpc3Bvc2VQb3BwZXIiLCJfaXNXaXRoQ29udGVudCIsInNoYWRvd1Jvb3QiLCJpc0luVGhlRG9tIiwib3duZXJEb2N1bWVudCIsIl9nZXRUaXBFbGVtZW50IiwicHJldmlvdXNIb3ZlclN0YXRlIiwiX2dldFRpdGxlIiwiX2NyZWF0ZVRpcEVsZW1lbnQiLCJfZ2V0Q29udGVudEZvclRlbXBsYXRlIiwiX2dldFRlbXBsYXRlRmFjdG9yeSIsInRpcElkIiwic2V0Q29udGVudCIsIm9yaWdpbmFsVGl0bGUiLCJfZ2V0RGVsZWdhdGVDb25maWciLCJhdHRhY2htZW50IiwicGhhc2UiLCJzdGF0ZSIsInRyaWdnZXJzIiwiZXZlbnRJbiIsImV2ZW50T3V0IiwiX2ZpeFRpdGxlIiwiX3NldFRpbWVvdXQiLCJ0aW1lb3V0IiwiZGF0YUF0dHJpYnV0ZXMiLCJkYXRhQXR0cmlidXRlIiwiU0VMRUNUT1JfVElUTEUiLCJTRUxFQ1RPUl9DT05URU5UIiwiUG9wb3ZlciIsIl9nZXRDb250ZW50IiwiRVZFTlRfQUNUSVZBVEUiLCJDTEFTU19OQU1FX0RST1BET1dOX0lURU0iLCJTRUxFQ1RPUl9EQVRBX1NQWSIsIlNFTEVDVE9SX1RBUkdFVF9MSU5LUyIsIlNFTEVDVE9SX05BVl9MSVNUX0dST1VQIiwiU0VMRUNUT1JfTkFWX0xJTktTIiwiU0VMRUNUT1JfTkFWX0lURU1TIiwiU0VMRUNUT1JfTElTVF9JVEVNUyIsIlNFTEVDVE9SX0xJTktfSVRFTVMiLCJTRUxFQ1RPUl9EUk9QRE9XTiIsIlNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSIsInJvb3RNYXJnaW4iLCJzbW9vdGhTY3JvbGwiLCJTY3JvbGxTcHkiLCJfdGFyZ2V0TGlua3MiLCJfb2JzZXJ2YWJsZVNlY3Rpb25zIiwiX3Jvb3RFbGVtZW50IiwiX2FjdGl2ZVRhcmdldCIsIl9vYnNlcnZlciIsIl9wcmV2aW91c1Njcm9sbERhdGEiLCJ2aXNpYmxlRW50cnlUb3AiLCJwYXJlbnRTY3JvbGxUb3AiLCJyZWZyZXNoIiwiX2luaXRpYWxpemVUYXJnZXRzQW5kT2JzZXJ2YWJsZXMiLCJfbWF5YmVFbmFibGVTbW9vdGhTY3JvbGwiLCJkaXNjb25uZWN0IiwiX2dldE5ld09ic2VydmVyIiwic2VjdGlvbiIsIm9ic2VydmUiLCJvYnNlcnZhYmxlU2VjdGlvbiIsImhhc2giLCJoZWlnaHQiLCJvZmZzZXRUb3AiLCJzY3JvbGxUbyIsInRvcCIsImJlaGF2aW9yIiwidGhyZXNob2xkIiwiX2dldFJvb3RNYXJnaW4iLCJJbnRlcnNlY3Rpb25PYnNlcnZlciIsIl9vYnNlcnZlckNhbGxiYWNrIiwidGFyZ2V0RWxlbWVudCIsImlkIiwiX3Byb2Nlc3MiLCJ1c2VyU2Nyb2xsc0Rvd24iLCJpc0ludGVyc2VjdGluZyIsIl9jbGVhckFjdGl2ZUNsYXNzIiwiZW50cnlJc0xvd2VyVGhhblByZXZpb3VzIiwidGFyZ2V0TGlua3MiLCJhbmNob3IiLCJfYWN0aXZhdGVQYXJlbnRzIiwibGlzdEdyb3VwIiwiaXRlbSIsImFjdGl2ZU5vZGVzIiwibm9kZSIsInNweSIsIkNMQVNTX0RST1BET1dOIiwiU0VMRUNUT1JfRFJPUERPV05fTUVOVSIsIlNFTEVDVE9SX0RST1BET1dOX0lURU0iLCJOT1RfU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFIiwiU0VMRUNUT1JfVEFCX1BBTkVMIiwiU0VMRUNUT1JfT1VURVIiLCJTRUxFQ1RPUl9JTk5FUiIsIlNFTEVDVE9SX0lOTkVSX0VMRU0iLCJTRUxFQ1RPUl9EQVRBX1RPR0dMRV9BQ1RJVkUiLCJUYWIiLCJfc2V0SW5pdGlhbEF0dHJpYnV0ZXMiLCJfZ2V0Q2hpbGRyZW4iLCJpbm5lckVsZW0iLCJfZWxlbUlzQWN0aXZlIiwiYWN0aXZlIiwiX2dldEFjdGl2ZUVsZW0iLCJfZGVhY3RpdmF0ZSIsIl9hY3RpdmF0ZSIsInJlbGF0ZWRFbGVtIiwiX3RvZ2dsZURyb3BEb3duIiwibmV4dEFjdGl2ZUVsZW1lbnQiLCJfc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMiLCJfc2V0SW5pdGlhbEF0dHJpYnV0ZXNPbkNoaWxkIiwiX2dldElubmVyRWxlbWVudCIsImlzQWN0aXZlIiwib3V0ZXJFbGVtIiwiX2dldE91dGVyRWxlbWVudCIsIl9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwiLCJvcGVuIiwiRVZFTlRfTU9VU0VPVkVSIiwiRVZFTlRfTU9VU0VPVVQiLCJDTEFTU19OQU1FX0hJREUiLCJhdXRvaGlkZSIsIlRvYXN0IiwiX2hhc01vdXNlSW50ZXJhY3Rpb24iLCJfaGFzS2V5Ym9hcmRJbnRlcmFjdGlvbiIsIl9jbGVhclRpbWVvdXQiLCJfbWF5YmVTY2hlZHVsZUhpZGUiLCJpc1Nob3duIiwiX29uSW50ZXJhY3Rpb24iLCJpc0ludGVyYWN0aW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vanMvc3JjL3V0aWwvaW5kZXguanMiLCIuLi8uLi9qcy9zcmMvZG9tL2V2ZW50LWhhbmRsZXIuanMiLCIuLi8uLi9qcy9zcmMvZG9tL2RhdGEuanMiLCIuLi8uLi9qcy9zcmMvZG9tL21hbmlwdWxhdG9yLmpzIiwiLi4vLi4vanMvc3JjL3V0aWwvY29uZmlnLmpzIiwiLi4vLi4vanMvc3JjL2Jhc2UtY29tcG9uZW50LmpzIiwiLi4vLi4vanMvc3JjL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qcyIsIi4uLy4uL2pzL3NyYy9hbGVydC5qcyIsIi4uLy4uL2pzL3NyYy9idXR0b24uanMiLCIuLi8uLi9qcy9zcmMvZG9tL3NlbGVjdG9yLWVuZ2luZS5qcyIsIi4uLy4uL2pzL3NyYy91dGlsL3N3aXBlLmpzIiwiLi4vLi4vanMvc3JjL2Nhcm91c2VsLmpzIiwiLi4vLi4vanMvc3JjL2NvbGxhcHNlLmpzIiwiLi4vLi4vanMvc3JjL2Ryb3Bkb3duLmpzIiwiLi4vLi4vanMvc3JjL3V0aWwvc2Nyb2xsYmFyLmpzIiwiLi4vLi4vanMvc3JjL3V0aWwvYmFja2Ryb3AuanMiLCIuLi8uLi9qcy9zcmMvdXRpbC9mb2N1c3RyYXAuanMiLCIuLi8uLi9qcy9zcmMvbW9kYWwuanMiLCIuLi8uLi9qcy9zcmMvb2ZmY2FudmFzLmpzIiwiLi4vLi4vanMvc3JjL3V0aWwvc2FuaXRpemVyLmpzIiwiLi4vLi4vanMvc3JjL3V0aWwvdGVtcGxhdGUtZmFjdG9yeS5qcyIsIi4uLy4uL2pzL3NyYy90b29sdGlwLmpzIiwiLi4vLi4vanMvc3JjL3BvcG92ZXIuanMiLCIuLi8uLi9qcy9zcmMvc2Nyb2xsc3B5LmpzIiwiLi4vLi4vanMvc3JjL3RhYi5qcyIsIi4uLy4uL2pzL3NyYy90b2FzdC5qcyIsIi4uLy4uL2pzL2luZGV4LnVtZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjIuMCk6IHV0aWwvaW5kZXguanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCBNQVhfVUlEID0gMV8wMDBfMDAwXG5jb25zdCBNSUxMSVNFQ09ORFNfTVVMVElQTElFUiA9IDEwMDBcbmNvbnN0IFRSQU5TSVRJT05fRU5EID0gJ3RyYW5zaXRpb25lbmQnXG5cbi8vIFNob3V0LW91dCBBbmd1cyBDcm9sbCAoaHR0cHM6Ly9nb28uZ2wvcHh3UUdwKVxuY29uc3QgdG9UeXBlID0gb2JqZWN0ID0+IHtcbiAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCBvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBgJHtvYmplY3R9YFxuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpLm1hdGNoKC9cXHMoW2Etel0rKS9pKVsxXS50b0xvd2VyQ2FzZSgpXG59XG5cbi8qKlxuICogUHVibGljIFV0aWwgQVBJXG4gKi9cblxuY29uc3QgZ2V0VUlEID0gcHJlZml4ID0+IHtcbiAgZG8ge1xuICAgIHByZWZpeCArPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBNQVhfVUlEKVxuICB9IHdoaWxlIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwcmVmaXgpKVxuXG4gIHJldHVybiBwcmVmaXhcbn1cblxuY29uc3QgZ2V0U2VsZWN0b3IgPSBlbGVtZW50ID0+IHtcbiAgbGV0IHNlbGVjdG9yID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtdGFyZ2V0JylcblxuICBpZiAoIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSAnIycpIHtcbiAgICBsZXQgaHJlZkF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJylcblxuICAgIC8vIFRoZSBvbmx5IHZhbGlkIGNvbnRlbnQgdGhhdCBjb3VsZCBkb3VibGUgYXMgYSBzZWxlY3RvciBhcmUgSURzIG9yIGNsYXNzZXMsXG4gICAgLy8gc28gZXZlcnl0aGluZyBzdGFydGluZyB3aXRoIGAjYCBvciBgLmAuIElmIGEgXCJyZWFsXCIgVVJMIGlzIHVzZWQgYXMgdGhlIHNlbGVjdG9yLFxuICAgIC8vIGBkb2N1bWVudC5xdWVyeVNlbGVjdG9yYCB3aWxsIHJpZ2h0ZnVsbHkgY29tcGxhaW4gaXQgaXMgaW52YWxpZC5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8zMjI3M1xuICAgIGlmICghaHJlZkF0dHJpYnV0ZSB8fCAoIWhyZWZBdHRyaWJ1dGUuaW5jbHVkZXMoJyMnKSAmJiAhaHJlZkF0dHJpYnV0ZS5zdGFydHNXaXRoKCcuJykpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIC8vIEp1c3QgaW4gY2FzZSBzb21lIENNUyBwdXRzIG91dCBhIGZ1bGwgVVJMIHdpdGggdGhlIGFuY2hvciBhcHBlbmRlZFxuICAgIGlmIChocmVmQXR0cmlidXRlLmluY2x1ZGVzKCcjJykgJiYgIWhyZWZBdHRyaWJ1dGUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICBocmVmQXR0cmlidXRlID0gYCMke2hyZWZBdHRyaWJ1dGUuc3BsaXQoJyMnKVsxXX1gXG4gICAgfVxuXG4gICAgc2VsZWN0b3IgPSBocmVmQXR0cmlidXRlICYmIGhyZWZBdHRyaWJ1dGUgIT09ICcjJyA/IGhyZWZBdHRyaWJ1dGUudHJpbSgpIDogbnVsbFxuICB9XG5cbiAgcmV0dXJuIHNlbGVjdG9yXG59XG5cbmNvbnN0IGdldFNlbGVjdG9yRnJvbUVsZW1lbnQgPSBlbGVtZW50ID0+IHtcbiAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KVxuXG4gIGlmIChzZWxlY3Rvcikge1xuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSA/IHNlbGVjdG9yIDogbnVsbFxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuY29uc3QgZ2V0RWxlbWVudEZyb21TZWxlY3RvciA9IGVsZW1lbnQgPT4ge1xuICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGVsZW1lbnQpXG5cbiAgcmV0dXJuIHNlbGVjdG9yID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgOiBudWxsXG59XG5cbmNvbnN0IGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50ID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiAwXG4gIH1cblxuICAvLyBHZXQgdHJhbnNpdGlvbi1kdXJhdGlvbiBvZiB0aGUgZWxlbWVudFxuICBsZXQgeyB0cmFuc2l0aW9uRHVyYXRpb24sIHRyYW5zaXRpb25EZWxheSB9ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcblxuICBjb25zdCBmbG9hdFRyYW5zaXRpb25EdXJhdGlvbiA9IE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbilcbiAgY29uc3QgZmxvYXRUcmFuc2l0aW9uRGVsYXkgPSBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRGVsYXkpXG5cbiAgLy8gUmV0dXJuIDAgaWYgZWxlbWVudCBvciB0cmFuc2l0aW9uIGR1cmF0aW9uIGlzIG5vdCBmb3VuZFxuICBpZiAoIWZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uICYmICFmbG9hdFRyYW5zaXRpb25EZWxheSkge1xuICAgIHJldHVybiAwXG4gIH1cblxuICAvLyBJZiBtdWx0aXBsZSBkdXJhdGlvbnMgYXJlIGRlZmluZWQsIHRha2UgdGhlIGZpcnN0XG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IHRyYW5zaXRpb25EdXJhdGlvbi5zcGxpdCgnLCcpWzBdXG4gIHRyYW5zaXRpb25EZWxheSA9IHRyYW5zaXRpb25EZWxheS5zcGxpdCgnLCcpWzBdXG5cbiAgcmV0dXJuIChOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pICsgTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkRlbGF5KSkgKiBNSUxMSVNFQ09ORFNfTVVMVElQTElFUlxufVxuXG5jb25zdCB0cmlnZ2VyVHJhbnNpdGlvbkVuZCA9IGVsZW1lbnQgPT4ge1xuICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFRSQU5TSVRJT05fRU5EKSlcbn1cblxuY29uc3QgaXNFbGVtZW50ID0gb2JqZWN0ID0+IHtcbiAgaWYgKCFvYmplY3QgfHwgdHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqZWN0LmpxdWVyeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvYmplY3QgPSBvYmplY3RbMF1cbiAgfVxuXG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0Lm5vZGVUeXBlICE9PSAndW5kZWZpbmVkJ1xufVxuXG5jb25zdCBnZXRFbGVtZW50ID0gb2JqZWN0ID0+IHtcbiAgLy8gaXQncyBhIGpRdWVyeSBvYmplY3Qgb3IgYSBub2RlIGVsZW1lbnRcbiAgaWYgKGlzRWxlbWVudChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdC5qcXVlcnkgPyBvYmplY3RbMF0gOiBvYmplY3RcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnc3RyaW5nJyAmJiBvYmplY3QubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG9iamVjdClcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IGlzVmlzaWJsZSA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWlzRWxlbWVudChlbGVtZW50KSB8fCBlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBlbGVtZW50SXNWaXNpYmxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCd2aXNpYmlsaXR5JykgPT09ICd2aXNpYmxlJ1xuICAvLyBIYW5kbGUgYGRldGFpbHNgIGVsZW1lbnQgYXMgaXRzIGNvbnRlbnQgbWF5IGZhbHNpZSBhcHBlYXIgdmlzaWJsZSB3aGVuIGl0IGlzIGNsb3NlZFxuICBjb25zdCBjbG9zZWREZXRhaWxzID0gZWxlbWVudC5jbG9zZXN0KCdkZXRhaWxzOm5vdChbb3Blbl0pJylcblxuICBpZiAoIWNsb3NlZERldGFpbHMpIHtcbiAgICByZXR1cm4gZWxlbWVudElzVmlzaWJsZVxuICB9XG5cbiAgaWYgKGNsb3NlZERldGFpbHMgIT09IGVsZW1lbnQpIHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gZWxlbWVudC5jbG9zZXN0KCdzdW1tYXJ5JylcbiAgICBpZiAoc3VtbWFyeSAmJiBzdW1tYXJ5LnBhcmVudE5vZGUgIT09IGNsb3NlZERldGFpbHMpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChzdW1tYXJ5ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudElzVmlzaWJsZVxufVxuXG5jb25zdCBpc0Rpc2FibGVkID0gZWxlbWVudCA9PiB7XG4gIGlmICghZWxlbWVudCB8fCBlbGVtZW50Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiBlbGVtZW50LmRpc2FibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBlbGVtZW50LmRpc2FibGVkXG4gIH1cblxuICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgIT09ICdmYWxzZSdcbn1cblxuY29uc3QgZmluZFNoYWRvd1Jvb3QgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoU2hhZG93KSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIENhbiBmaW5kIHRoZSBzaGFkb3cgcm9vdCBvdGhlcndpc2UgaXQnbGwgcmV0dXJuIHRoZSBkb2N1bWVudFxuICBpZiAodHlwZW9mIGVsZW1lbnQuZ2V0Um9vdE5vZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCByb290ID0gZWxlbWVudC5nZXRSb290Tm9kZSgpXG4gICAgcmV0dXJuIHJvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290ID8gcm9vdCA6IG51bGxcbiAgfVxuXG4gIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgIHJldHVybiBlbGVtZW50XG4gIH1cblxuICAvLyB3aGVuIHdlIGRvbid0IGZpbmQgYSBzaGFkb3cgcm9vdFxuICBpZiAoIWVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gZmluZFNoYWRvd1Jvb3QoZWxlbWVudC5wYXJlbnROb2RlKVxufVxuXG5jb25zdCBub29wID0gKCkgPT4ge31cblxuLyoqXG4gKiBUcmljayB0byByZXN0YXJ0IGFuIGVsZW1lbnQncyBhbmltYXRpb25cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJuIHZvaWRcbiAqXG4gKiBAc2VlIGh0dHBzOi8vd3d3LmNoYXJpc3RoZW8uaW8vYmxvZy8yMDIxLzAyL3Jlc3RhcnQtYS1jc3MtYW5pbWF0aW9uLXdpdGgtamF2YXNjcmlwdC8jcmVzdGFydGluZy1hLWNzcy1hbmltYXRpb25cbiAqL1xuY29uc3QgcmVmbG93ID0gZWxlbWVudCA9PiB7XG4gIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG59XG5cbmNvbnN0IGdldGpRdWVyeSA9ICgpID0+IHtcbiAgaWYgKHdpbmRvdy5qUXVlcnkgJiYgIWRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCdkYXRhLWJzLW5vLWpxdWVyeScpKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5qUXVlcnlcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IERPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MgPSBbXVxuXG5jb25zdCBvbkRPTUNvbnRlbnRMb2FkZWQgPSBjYWxsYmFjayA9PiB7XG4gIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAvLyBhZGQgbGlzdGVuZXIgb24gdGhlIGZpcnN0IGNhbGwgd2hlbiB0aGUgZG9jdW1lbnQgaXMgaW4gbG9hZGluZyBzdGF0ZVxuICAgIGlmICghRE9NQ29udGVudExvYWRlZENhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgRE9NQ29udGVudExvYWRlZENhbGxiYWNrcykge1xuICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spXG4gIH0gZWxzZSB7XG4gICAgY2FsbGJhY2soKVxuICB9XG59XG5cbmNvbnN0IGlzUlRMID0gKCkgPT4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRpciA9PT0gJ3J0bCdcblxuY29uc3QgZGVmaW5lSlF1ZXJ5UGx1Z2luID0gcGx1Z2luID0+IHtcbiAgb25ET01Db250ZW50TG9hZGVkKCgpID0+IHtcbiAgICBjb25zdCAkID0gZ2V0alF1ZXJ5KClcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoJCkge1xuICAgICAgY29uc3QgbmFtZSA9IHBsdWdpbi5OQU1FXG4gICAgICBjb25zdCBKUVVFUllfTk9fQ09ORkxJQ1QgPSAkLmZuW25hbWVdXG4gICAgICAkLmZuW25hbWVdID0gcGx1Z2luLmpRdWVyeUludGVyZmFjZVxuICAgICAgJC5mbltuYW1lXS5Db25zdHJ1Y3RvciA9IHBsdWdpblxuICAgICAgJC5mbltuYW1lXS5ub0NvbmZsaWN0ID0gKCkgPT4ge1xuICAgICAgICAkLmZuW25hbWVdID0gSlFVRVJZX05PX0NPTkZMSUNUXG4gICAgICAgIHJldHVybiBwbHVnaW4ualF1ZXJ5SW50ZXJmYWNlXG4gICAgICB9XG4gICAgfVxuICB9KVxufVxuXG5jb25zdCBleGVjdXRlID0gY2FsbGJhY2sgPT4ge1xuICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2soKVxuICB9XG59XG5cbmNvbnN0IGV4ZWN1dGVBZnRlclRyYW5zaXRpb24gPSAoY2FsbGJhY2ssIHRyYW5zaXRpb25FbGVtZW50LCB3YWl0Rm9yVHJhbnNpdGlvbiA9IHRydWUpID0+IHtcbiAgaWYgKCF3YWl0Rm9yVHJhbnNpdGlvbikge1xuICAgIGV4ZWN1dGUoY2FsbGJhY2spXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBkdXJhdGlvblBhZGRpbmcgPSA1XG4gIGNvbnN0IGVtdWxhdGVkRHVyYXRpb24gPSBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0cmFuc2l0aW9uRWxlbWVudCkgKyBkdXJhdGlvblBhZGRpbmdcblxuICBsZXQgY2FsbGVkID0gZmFsc2VcblxuICBjb25zdCBoYW5kbGVyID0gKHsgdGFyZ2V0IH0pID0+IHtcbiAgICBpZiAodGFyZ2V0ICE9PSB0cmFuc2l0aW9uRWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY2FsbGVkID0gdHJ1ZVxuICAgIHRyYW5zaXRpb25FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoVFJBTlNJVElPTl9FTkQsIGhhbmRsZXIpXG4gICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgfVxuXG4gIHRyYW5zaXRpb25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoVFJBTlNJVElPTl9FTkQsIGhhbmRsZXIpXG4gIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGlmICghY2FsbGVkKSB7XG4gICAgICB0cmlnZ2VyVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRWxlbWVudClcbiAgICB9XG4gIH0sIGVtdWxhdGVkRHVyYXRpb24pXG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBwcmV2aW91cy9uZXh0IGVsZW1lbnQgb2YgYSBsaXN0LlxuICpcbiAqIEBwYXJhbSB7YXJyYXl9IGxpc3QgICAgVGhlIGxpc3Qgb2YgZWxlbWVudHNcbiAqIEBwYXJhbSBhY3RpdmVFbGVtZW50ICAgVGhlIGFjdGl2ZSBlbGVtZW50XG4gKiBAcGFyYW0gc2hvdWxkR2V0TmV4dCAgIENob29zZSB0byBnZXQgbmV4dCBvciBwcmV2aW91cyBlbGVtZW50XG4gKiBAcGFyYW0gaXNDeWNsZUFsbG93ZWRcbiAqIEByZXR1cm4ge0VsZW1lbnR8ZWxlbX0gVGhlIHByb3BlciBlbGVtZW50XG4gKi9cbmNvbnN0IGdldE5leHRBY3RpdmVFbGVtZW50ID0gKGxpc3QsIGFjdGl2ZUVsZW1lbnQsIHNob3VsZEdldE5leHQsIGlzQ3ljbGVBbGxvd2VkKSA9PiB7XG4gIGNvbnN0IGxpc3RMZW5ndGggPSBsaXN0Lmxlbmd0aFxuICBsZXQgaW5kZXggPSBsaXN0LmluZGV4T2YoYWN0aXZlRWxlbWVudClcblxuICAvLyBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbGlzdCByZXR1cm4gYW4gZWxlbWVudFxuICAvLyBkZXBlbmRpbmcgb24gdGhlIGRpcmVjdGlvbiBhbmQgaWYgY3ljbGUgaXMgYWxsb3dlZFxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuICFzaG91bGRHZXROZXh0ICYmIGlzQ3ljbGVBbGxvd2VkID8gbGlzdFtsaXN0TGVuZ3RoIC0gMV0gOiBsaXN0WzBdXG4gIH1cblxuICBpbmRleCArPSBzaG91bGRHZXROZXh0ID8gMSA6IC0xXG5cbiAgaWYgKGlzQ3ljbGVBbGxvd2VkKSB7XG4gICAgaW5kZXggPSAoaW5kZXggKyBsaXN0TGVuZ3RoKSAlIGxpc3RMZW5ndGhcbiAgfVxuXG4gIHJldHVybiBsaXN0W01hdGgubWF4KDAsIE1hdGgubWluKGluZGV4LCBsaXN0TGVuZ3RoIC0gMSkpXVxufVxuXG5leHBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGV4ZWN1dGUsXG4gIGV4ZWN1dGVBZnRlclRyYW5zaXRpb24sXG4gIGZpbmRTaGFkb3dSb290LFxuICBnZXRFbGVtZW50LFxuICBnZXRFbGVtZW50RnJvbVNlbGVjdG9yLFxuICBnZXRqUXVlcnksXG4gIGdldE5leHRBY3RpdmVFbGVtZW50LFxuICBnZXRTZWxlY3RvckZyb21FbGVtZW50LFxuICBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCxcbiAgZ2V0VUlELFxuICBpc0Rpc2FibGVkLFxuICBpc0VsZW1lbnQsXG4gIGlzUlRMLFxuICBpc1Zpc2libGUsXG4gIG5vb3AsXG4gIG9uRE9NQ29udGVudExvYWRlZCxcbiAgcmVmbG93LFxuICB0cmlnZ2VyVHJhbnNpdGlvbkVuZCxcbiAgdG9UeXBlXG59XG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjIuMCk6IGRvbS9ldmVudC1oYW5kbGVyLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IHsgZ2V0alF1ZXJ5IH0gZnJvbSAnLi4vdXRpbC9pbmRleCdcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBuYW1lc3BhY2VSZWdleCA9IC9bXi5dKig/PVxcLi4qKVxcLnwuKi9cbmNvbnN0IHN0cmlwTmFtZVJlZ2V4ID0gL1xcLi4qL1xuY29uc3Qgc3RyaXBVaWRSZWdleCA9IC86OlxcZCskL1xuY29uc3QgZXZlbnRSZWdpc3RyeSA9IHt9IC8vIEV2ZW50cyBzdG9yYWdlXG5sZXQgdWlkRXZlbnQgPSAxXG5jb25zdCBjdXN0b21FdmVudHMgPSB7XG4gIG1vdXNlZW50ZXI6ICdtb3VzZW92ZXInLFxuICBtb3VzZWxlYXZlOiAnbW91c2VvdXQnXG59XG5cbmNvbnN0IG5hdGl2ZUV2ZW50cyA9IG5ldyBTZXQoW1xuICAnY2xpY2snLFxuICAnZGJsY2xpY2snLFxuICAnbW91c2V1cCcsXG4gICdtb3VzZWRvd24nLFxuICAnY29udGV4dG1lbnUnLFxuICAnbW91c2V3aGVlbCcsXG4gICdET01Nb3VzZVNjcm9sbCcsXG4gICdtb3VzZW92ZXInLFxuICAnbW91c2VvdXQnLFxuICAnbW91c2Vtb3ZlJyxcbiAgJ3NlbGVjdHN0YXJ0JyxcbiAgJ3NlbGVjdGVuZCcsXG4gICdrZXlkb3duJyxcbiAgJ2tleXByZXNzJyxcbiAgJ2tleXVwJyxcbiAgJ29yaWVudGF0aW9uY2hhbmdlJyxcbiAgJ3RvdWNoc3RhcnQnLFxuICAndG91Y2htb3ZlJyxcbiAgJ3RvdWNoZW5kJyxcbiAgJ3RvdWNoY2FuY2VsJyxcbiAgJ3BvaW50ZXJkb3duJyxcbiAgJ3BvaW50ZXJtb3ZlJyxcbiAgJ3BvaW50ZXJ1cCcsXG4gICdwb2ludGVybGVhdmUnLFxuICAncG9pbnRlcmNhbmNlbCcsXG4gICdnZXN0dXJlc3RhcnQnLFxuICAnZ2VzdHVyZWNoYW5nZScsXG4gICdnZXN0dXJlZW5kJyxcbiAgJ2ZvY3VzJyxcbiAgJ2JsdXInLFxuICAnY2hhbmdlJyxcbiAgJ3Jlc2V0JyxcbiAgJ3NlbGVjdCcsXG4gICdzdWJtaXQnLFxuICAnZm9jdXNpbicsXG4gICdmb2N1c291dCcsXG4gICdsb2FkJyxcbiAgJ3VubG9hZCcsXG4gICdiZWZvcmV1bmxvYWQnLFxuICAncmVzaXplJyxcbiAgJ21vdmUnLFxuICAnRE9NQ29udGVudExvYWRlZCcsXG4gICdyZWFkeXN0YXRlY2hhbmdlJyxcbiAgJ2Vycm9yJyxcbiAgJ2Fib3J0JyxcbiAgJ3Njcm9sbCdcbl0pXG5cbi8qKlxuICogUHJpdmF0ZSBtZXRob2RzXG4gKi9cblxuZnVuY3Rpb24gbWFrZUV2ZW50VWlkKGVsZW1lbnQsIHVpZCkge1xuICByZXR1cm4gKHVpZCAmJiBgJHt1aWR9Ojoke3VpZEV2ZW50Kyt9YCkgfHwgZWxlbWVudC51aWRFdmVudCB8fCB1aWRFdmVudCsrXG59XG5cbmZ1bmN0aW9uIGdldEVsZW1lbnRFdmVudHMoZWxlbWVudCkge1xuICBjb25zdCB1aWQgPSBtYWtlRXZlbnRVaWQoZWxlbWVudClcblxuICBlbGVtZW50LnVpZEV2ZW50ID0gdWlkXG4gIGV2ZW50UmVnaXN0cnlbdWlkXSA9IGV2ZW50UmVnaXN0cnlbdWlkXSB8fCB7fVxuXG4gIHJldHVybiBldmVudFJlZ2lzdHJ5W3VpZF1cbn1cblxuZnVuY3Rpb24gYm9vdHN0cmFwSGFuZGxlcihlbGVtZW50LCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgIGh5ZHJhdGVPYmooZXZlbnQsIHsgZGVsZWdhdGVUYXJnZXQ6IGVsZW1lbnQgfSlcblxuICAgIGlmIChoYW5kbGVyLm9uZU9mZikge1xuICAgICAgRXZlbnRIYW5kbGVyLm9mZihlbGVtZW50LCBldmVudC50eXBlLCBmbilcbiAgICB9XG5cbiAgICByZXR1cm4gZm4uYXBwbHkoZWxlbWVudCwgW2V2ZW50XSlcbiAgfVxufVxuXG5mdW5jdGlvbiBib290c3RyYXBEZWxlZ2F0aW9uSGFuZGxlcihlbGVtZW50LCBzZWxlY3RvciwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcbiAgICBjb25zdCBkb21FbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcblxuICAgIGZvciAobGV0IHsgdGFyZ2V0IH0gPSBldmVudDsgdGFyZ2V0ICYmIHRhcmdldCAhPT0gdGhpczsgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGUpIHtcbiAgICAgIGZvciAoY29uc3QgZG9tRWxlbWVudCBvZiBkb21FbGVtZW50cykge1xuICAgICAgICBpZiAoZG9tRWxlbWVudCAhPT0gdGFyZ2V0KSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGh5ZHJhdGVPYmooZXZlbnQsIHsgZGVsZWdhdGVUYXJnZXQ6IHRhcmdldCB9KVxuXG4gICAgICAgIGlmIChoYW5kbGVyLm9uZU9mZikge1xuICAgICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgZXZlbnQudHlwZSwgc2VsZWN0b3IsIGZuKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRhcmdldCwgW2V2ZW50XSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEhhbmRsZXIoZXZlbnRzLCBjYWxsYWJsZSwgZGVsZWdhdGlvblNlbGVjdG9yID0gbnVsbCkge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhldmVudHMpXG4gICAgLmZpbmQoZXZlbnQgPT4gZXZlbnQuY2FsbGFibGUgPT09IGNhbGxhYmxlICYmIGV2ZW50LmRlbGVnYXRpb25TZWxlY3RvciA9PT0gZGVsZWdhdGlvblNlbGVjdG9yKVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgY29uc3QgaXNEZWxlZ2F0ZWQgPSB0eXBlb2YgaGFuZGxlciA9PT0gJ3N0cmluZydcbiAgLy8gdG9kbzogdG9vbHRpcCBwYXNzZXMgYGZhbHNlYCBpbnN0ZWFkIG9mIHNlbGVjdG9yLCBzbyB3ZSBuZWVkIHRvIGNoZWNrXG4gIGNvbnN0IGNhbGxhYmxlID0gaXNEZWxlZ2F0ZWQgPyBkZWxlZ2F0aW9uRnVuY3Rpb24gOiAoaGFuZGxlciB8fCBkZWxlZ2F0aW9uRnVuY3Rpb24pXG4gIGxldCB0eXBlRXZlbnQgPSBnZXRUeXBlRXZlbnQob3JpZ2luYWxUeXBlRXZlbnQpXG5cbiAgaWYgKCFuYXRpdmVFdmVudHMuaGFzKHR5cGVFdmVudCkpIHtcbiAgICB0eXBlRXZlbnQgPSBvcmlnaW5hbFR5cGVFdmVudFxuICB9XG5cbiAgcmV0dXJuIFtpc0RlbGVnYXRlZCwgY2FsbGFibGUsIHR5cGVFdmVudF1cbn1cblxuZnVuY3Rpb24gYWRkSGFuZGxlcihlbGVtZW50LCBvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uLCBvbmVPZmYpIHtcbiAgaWYgKHR5cGVvZiBvcmlnaW5hbFR5cGVFdmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGxldCBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdID0gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKVxuXG4gIC8vIGluIGNhc2Ugb2YgbW91c2VlbnRlciBvciBtb3VzZWxlYXZlIHdyYXAgdGhlIGhhbmRsZXIgd2l0aGluIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgZm9yIGl0cyBET00gcG9zaXRpb25cbiAgLy8gdGhpcyBwcmV2ZW50cyB0aGUgaGFuZGxlciBmcm9tIGJlaW5nIGRpc3BhdGNoZWQgdGhlIHNhbWUgd2F5IGFzIG1vdXNlb3ZlciBvciBtb3VzZW91dCBkb2VzXG4gIGlmIChvcmlnaW5hbFR5cGVFdmVudCBpbiBjdXN0b21FdmVudHMpIHtcbiAgICBjb25zdCB3cmFwRnVuY3Rpb24gPSBmbiA9PiB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmICghZXZlbnQucmVsYXRlZFRhcmdldCB8fCAoZXZlbnQucmVsYXRlZFRhcmdldCAhPT0gZXZlbnQuZGVsZWdhdGVUYXJnZXQgJiYgIWV2ZW50LmRlbGVnYXRlVGFyZ2V0LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSkge1xuICAgICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FsbGFibGUgPSB3cmFwRnVuY3Rpb24oY2FsbGFibGUpXG4gIH1cblxuICBjb25zdCBldmVudHMgPSBnZXRFbGVtZW50RXZlbnRzKGVsZW1lbnQpXG4gIGNvbnN0IGhhbmRsZXJzID0gZXZlbnRzW3R5cGVFdmVudF0gfHwgKGV2ZW50c1t0eXBlRXZlbnRdID0ge30pXG4gIGNvbnN0IHByZXZpb3VzRnVuY3Rpb24gPSBmaW5kSGFuZGxlcihoYW5kbGVycywgY2FsbGFibGUsIGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGwpXG5cbiAgaWYgKHByZXZpb3VzRnVuY3Rpb24pIHtcbiAgICBwcmV2aW91c0Z1bmN0aW9uLm9uZU9mZiA9IHByZXZpb3VzRnVuY3Rpb24ub25lT2ZmICYmIG9uZU9mZlxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB1aWQgPSBtYWtlRXZlbnRVaWQoY2FsbGFibGUsIG9yaWdpbmFsVHlwZUV2ZW50LnJlcGxhY2UobmFtZXNwYWNlUmVnZXgsICcnKSlcbiAgY29uc3QgZm4gPSBpc0RlbGVnYXRlZCA/XG4gICAgYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIoZWxlbWVudCwgaGFuZGxlciwgY2FsbGFibGUpIDpcbiAgICBib290c3RyYXBIYW5kbGVyKGVsZW1lbnQsIGNhbGxhYmxlKVxuXG4gIGZuLmRlbGVnYXRpb25TZWxlY3RvciA9IGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGxcbiAgZm4uY2FsbGFibGUgPSBjYWxsYWJsZVxuICBmbi5vbmVPZmYgPSBvbmVPZmZcbiAgZm4udWlkRXZlbnQgPSB1aWRcbiAgaGFuZGxlcnNbdWlkXSA9IGZuXG5cbiAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGVFdmVudCwgZm4sIGlzRGVsZWdhdGVkKVxufVxuXG5mdW5jdGlvbiByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpIHtcbiAgY29uc3QgZm4gPSBmaW5kSGFuZGxlcihldmVudHNbdHlwZUV2ZW50XSwgaGFuZGxlciwgZGVsZWdhdGlvblNlbGVjdG9yKVxuXG4gIGlmICghZm4pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlRXZlbnQsIGZuLCBCb29sZWFuKGRlbGVnYXRpb25TZWxlY3RvcikpXG4gIGRlbGV0ZSBldmVudHNbdHlwZUV2ZW50XVtmbi51aWRFdmVudF1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlTmFtZXNwYWNlZEhhbmRsZXJzKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBuYW1lc3BhY2UpIHtcbiAgY29uc3Qgc3RvcmVFbGVtZW50RXZlbnQgPSBldmVudHNbdHlwZUV2ZW50XSB8fCB7fVxuXG4gIGZvciAoY29uc3QgaGFuZGxlcktleSBvZiBPYmplY3Qua2V5cyhzdG9yZUVsZW1lbnRFdmVudCkpIHtcbiAgICBpZiAoaGFuZGxlcktleS5pbmNsdWRlcyhuYW1lc3BhY2UpKSB7XG4gICAgICBjb25zdCBldmVudCA9IHN0b3JlRWxlbWVudEV2ZW50W2hhbmRsZXJLZXldXG4gICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUeXBlRXZlbnQoZXZlbnQpIHtcbiAgLy8gYWxsb3cgdG8gZ2V0IHRoZSBuYXRpdmUgZXZlbnRzIGZyb20gbmFtZXNwYWNlZCBldmVudHMgKCdjbGljay5icy5idXR0b24nIC0tPiAnY2xpY2snKVxuICBldmVudCA9IGV2ZW50LnJlcGxhY2Uoc3RyaXBOYW1lUmVnZXgsICcnKVxuICByZXR1cm4gY3VzdG9tRXZlbnRzW2V2ZW50XSB8fCBldmVudFxufVxuXG5jb25zdCBFdmVudEhhbmRsZXIgPSB7XG4gIG9uKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICBhZGRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIGZhbHNlKVxuICB9LFxuXG4gIG9uZShlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgYWRkSGFuZGxlcihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uLCB0cnVlKVxuICB9LFxuXG4gIG9mZihlbGVtZW50LCBvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgaWYgKHR5cGVvZiBvcmlnaW5hbFR5cGVFdmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IFtpc0RlbGVnYXRlZCwgY2FsbGFibGUsIHR5cGVFdmVudF0gPSBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pXG4gICAgY29uc3QgaW5OYW1lc3BhY2UgPSB0eXBlRXZlbnQgIT09IG9yaWdpbmFsVHlwZUV2ZW50XG4gICAgY29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KVxuICAgIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge31cbiAgICBjb25zdCBpc05hbWVzcGFjZSA9IG9yaWdpbmFsVHlwZUV2ZW50LnN0YXJ0c1dpdGgoJy4nKVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYWJsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIFNpbXBsZXN0IGNhc2U6IGhhbmRsZXIgaXMgcGFzc2VkLCByZW1vdmUgdGhhdCBsaXN0ZW5lciBPTkxZLlxuICAgICAgaWYgKCFPYmplY3Qua2V5cyhzdG9yZUVsZW1lbnRFdmVudCkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBjYWxsYWJsZSwgaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpc05hbWVzcGFjZSkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50RXZlbnQgb2YgT2JqZWN0LmtleXMoZXZlbnRzKSkge1xuICAgICAgICByZW1vdmVOYW1lc3BhY2VkSGFuZGxlcnMoZWxlbWVudCwgZXZlbnRzLCBlbGVtZW50RXZlbnQsIG9yaWdpbmFsVHlwZUV2ZW50LnNsaWNlKDEpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5SGFuZGxlcnMgb2YgT2JqZWN0LmtleXMoc3RvcmVFbGVtZW50RXZlbnQpKSB7XG4gICAgICBjb25zdCBoYW5kbGVyS2V5ID0ga2V5SGFuZGxlcnMucmVwbGFjZShzdHJpcFVpZFJlZ2V4LCAnJylcblxuICAgICAgaWYgKCFpbk5hbWVzcGFjZSB8fCBvcmlnaW5hbFR5cGVFdmVudC5pbmNsdWRlcyhoYW5kbGVyS2V5KSkge1xuICAgICAgICBjb25zdCBldmVudCA9IHN0b3JlRWxlbWVudEV2ZW50W2tleUhhbmRsZXJzXVxuICAgICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB0cmlnZ2VyKGVsZW1lbnQsIGV2ZW50LCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBldmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgJCA9IGdldGpRdWVyeSgpXG4gICAgY29uc3QgdHlwZUV2ZW50ID0gZ2V0VHlwZUV2ZW50KGV2ZW50KVxuICAgIGNvbnN0IGluTmFtZXNwYWNlID0gZXZlbnQgIT09IHR5cGVFdmVudFxuXG4gICAgbGV0IGpRdWVyeUV2ZW50ID0gbnVsbFxuICAgIGxldCBidWJibGVzID0gdHJ1ZVxuICAgIGxldCBuYXRpdmVEaXNwYXRjaCA9IHRydWVcbiAgICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlXG5cbiAgICBpZiAoaW5OYW1lc3BhY2UgJiYgJCkge1xuICAgICAgalF1ZXJ5RXZlbnQgPSAkLkV2ZW50KGV2ZW50LCBhcmdzKVxuXG4gICAgICAkKGVsZW1lbnQpLnRyaWdnZXIoalF1ZXJ5RXZlbnQpXG4gICAgICBidWJibGVzID0gIWpRdWVyeUV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKClcbiAgICAgIG5hdGl2ZURpc3BhdGNoID0gIWpRdWVyeUV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKClcbiAgICAgIGRlZmF1bHRQcmV2ZW50ZWQgPSBqUXVlcnlFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKVxuICAgIH1cblxuICAgIGxldCBldnQgPSBuZXcgRXZlbnQoZXZlbnQsIHsgYnViYmxlcywgY2FuY2VsYWJsZTogdHJ1ZSB9KVxuICAgIGV2dCA9IGh5ZHJhdGVPYmooZXZ0LCBhcmdzKVxuXG4gICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgfVxuXG4gICAgaWYgKG5hdGl2ZURpc3BhdGNoKSB7XG4gICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KVxuICAgIH1cblxuICAgIGlmIChldnQuZGVmYXVsdFByZXZlbnRlZCAmJiBqUXVlcnlFdmVudCkge1xuICAgICAgalF1ZXJ5RXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIH1cblxuICAgIHJldHVybiBldnRcbiAgfVxufVxuXG5mdW5jdGlvbiBoeWRyYXRlT2JqKG9iaiwgbWV0YSkge1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXRhIHx8IHt9KSkge1xuICAgIHRyeSB7XG4gICAgICBvYmpba2V5XSA9IHZhbHVlXG4gICAgfSBjYXRjaCB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuXG5leHBvcnQgZGVmYXVsdCBFdmVudEhhbmRsZXJcbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4wKTogZG9tL2RhdGEuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IGVsZW1lbnRNYXAgPSBuZXcgTWFwKClcblxuZXhwb3J0IGRlZmF1bHQge1xuICBzZXQoZWxlbWVudCwga2V5LCBpbnN0YW5jZSkge1xuICAgIGlmICghZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnRNYXAuc2V0KGVsZW1lbnQsIG5ldyBNYXAoKSlcbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZU1hcCA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpXG5cbiAgICAvLyBtYWtlIGl0IGNsZWFyIHdlIG9ubHkgd2FudCBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnRcbiAgICAvLyBjYW4gYmUgcmVtb3ZlZCBsYXRlciB3aGVuIG11bHRpcGxlIGtleS9pbnN0YW5jZXMgYXJlIGZpbmUgdG8gYmUgdXNlZFxuICAgIGlmICghaW5zdGFuY2VNYXAuaGFzKGtleSkgJiYgaW5zdGFuY2VNYXAuc2l6ZSAhPT0gMCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEJvb3RzdHJhcCBkb2Vzbid0IGFsbG93IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnQuIEJvdW5kIGluc3RhbmNlOiAke0FycmF5LmZyb20oaW5zdGFuY2VNYXAua2V5cygpKVswXX0uYClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGluc3RhbmNlTWFwLnNldChrZXksIGluc3RhbmNlKVxuICB9LFxuXG4gIGdldChlbGVtZW50LCBrZXkpIHtcbiAgICBpZiAoZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBlbGVtZW50TWFwLmdldChlbGVtZW50KS5nZXQoa2V5KSB8fCBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfSxcblxuICByZW1vdmUoZWxlbWVudCwga2V5KSB7XG4gICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2VNYXAgPSBlbGVtZW50TWFwLmdldChlbGVtZW50KVxuXG4gICAgaW5zdGFuY2VNYXAuZGVsZXRlKGtleSlcblxuICAgIC8vIGZyZWUgdXAgZWxlbWVudCByZWZlcmVuY2VzIGlmIHRoZXJlIGFyZSBubyBpbnN0YW5jZXMgbGVmdCBmb3IgYW4gZWxlbWVudFxuICAgIGlmIChpbnN0YW5jZU1hcC5zaXplID09PSAwKSB7XG4gICAgICBlbGVtZW50TWFwLmRlbGV0ZShlbGVtZW50KVxuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4yLjApOiBkb20vbWFuaXB1bGF0b3IuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVEYXRhKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSBOdW1iZXIodmFsdWUpLnRvU3RyaW5nKCkpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gJ251bGwnKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURhdGFLZXkoa2V5KSB7XG4gIHJldHVybiBrZXkucmVwbGFjZSgvW0EtWl0vZywgY2hyID0+IGAtJHtjaHIudG9Mb3dlckNhc2UoKX1gKVxufVxuXG5jb25zdCBNYW5pcHVsYXRvciA9IHtcbiAgc2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXksIHZhbHVlKSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYGRhdGEtYnMtJHtub3JtYWxpemVEYXRhS2V5KGtleSl9YCwgdmFsdWUpXG4gIH0sXG5cbiAgcmVtb3ZlRGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXkpIHtcbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gKVxuICB9LFxuXG4gIGdldERhdGFBdHRyaWJ1dGVzKGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fVxuICAgIGNvbnN0IGJzS2V5cyA9IE9iamVjdC5rZXlzKGVsZW1lbnQuZGF0YXNldCkuZmlsdGVyKGtleSA9PiBrZXkuc3RhcnRzV2l0aCgnYnMnKSAmJiAha2V5LnN0YXJ0c1dpdGgoJ2JzQ29uZmlnJykpXG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBic0tleXMpIHtcbiAgICAgIGxldCBwdXJlS2V5ID0ga2V5LnJlcGxhY2UoL15icy8sICcnKVxuICAgICAgcHVyZUtleSA9IHB1cmVLZXkuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBwdXJlS2V5LnNsaWNlKDEsIHB1cmVLZXkubGVuZ3RoKVxuICAgICAgYXR0cmlidXRlc1twdXJlS2V5XSA9IG5vcm1hbGl6ZURhdGEoZWxlbWVudC5kYXRhc2V0W2tleV0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgfSxcblxuICBnZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIGtleSkge1xuICAgIHJldHVybiBub3JtYWxpemVEYXRhKGVsZW1lbnQuZ2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWApKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hbmlwdWxhdG9yXG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjIuMCk6IHV0aWwvY29uZmlnLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IHsgaXNFbGVtZW50LCB0b1R5cGUgfSBmcm9tICcuL2luZGV4J1xuaW1wb3J0IE1hbmlwdWxhdG9yIGZyb20gJy4uL2RvbS9tYW5pcHVsYXRvcidcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQ29uZmlnIHtcbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiB7fVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignWW91IGhhdmUgdG8gaW1wbGVtZW50IHRoZSBzdGF0aWMgbWV0aG9kIFwiTkFNRVwiLCBmb3IgZWFjaCBjb21wb25lbnQhJylcbiAgfVxuXG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uZmlnID0gdGhpcy5fbWVyZ2VDb25maWdPYmooY29uZmlnKVxuICAgIGNvbmZpZyA9IHRoaXMuX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKVxuICAgIHRoaXMuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX21lcmdlQ29uZmlnT2JqKGNvbmZpZywgZWxlbWVudCkge1xuICAgIGNvbnN0IGpzb25Db25maWcgPSBpc0VsZW1lbnQoZWxlbWVudCkgPyBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsICdjb25maWcnKSA6IHt9IC8vIHRyeSB0byBwYXJzZVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uc3RydWN0b3IuRGVmYXVsdCxcbiAgICAgIC4uLih0eXBlb2YganNvbkNvbmZpZyA9PT0gJ29iamVjdCcgPyBqc29uQ29uZmlnIDoge30pLFxuICAgICAgLi4uKGlzRWxlbWVudChlbGVtZW50KSA/IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKGVsZW1lbnQpIDoge30pLFxuICAgICAgLi4uKHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnID8gY29uZmlnIDoge30pXG4gICAgfVxuICB9XG5cbiAgX3R5cGVDaGVja0NvbmZpZyhjb25maWcsIGNvbmZpZ1R5cGVzID0gdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0VHlwZSkge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmtleXMoY29uZmlnVHlwZXMpKSB7XG4gICAgICBjb25zdCBleHBlY3RlZFR5cGVzID0gY29uZmlnVHlwZXNbcHJvcGVydHldXG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1twcm9wZXJ0eV1cbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IGlzRWxlbWVudCh2YWx1ZSkgPyAnZWxlbWVudCcgOiB0b1R5cGUodmFsdWUpXG5cbiAgICAgIGlmICghbmV3IFJlZ0V4cChleHBlY3RlZFR5cGVzKS50ZXN0KHZhbHVlVHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUUudG9VcHBlckNhc2UoKX06IE9wdGlvbiBcIiR7cHJvcGVydHl9XCIgcHJvdmlkZWQgdHlwZSBcIiR7dmFsdWVUeXBlfVwiIGJ1dCBleHBlY3RlZCB0eXBlIFwiJHtleHBlY3RlZFR5cGVzfVwiLmBcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb25maWdcbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4wKTogYmFzZS1jb21wb25lbnQuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgRGF0YSBmcm9tICcuL2RvbS9kYXRhJ1xuaW1wb3J0IHsgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiwgZ2V0RWxlbWVudCB9IGZyb20gJy4vdXRpbC9pbmRleCdcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCBDb25maWcgZnJvbSAnLi91dGlsL2NvbmZpZydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBWRVJTSU9OID0gJzUuMi4wJ1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBCYXNlQ29tcG9uZW50IGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgZWxlbWVudCA9IGdldEVsZW1lbnQoZWxlbWVudClcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcblxuICAgIERhdGEuc2V0KHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVksIHRoaXMpXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZGlzcG9zZSgpIHtcbiAgICBEYXRhLnJlbW92ZSh0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZKVxuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9LRVkpXG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkge1xuICAgICAgdGhpc1twcm9wZXJ0eU5hbWVdID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIF9xdWV1ZUNhbGxiYWNrKGNhbGxiYWNrLCBlbGVtZW50LCBpc0FuaW1hdGVkID0gdHJ1ZSkge1xuICAgIGV4ZWN1dGVBZnRlclRyYW5zaXRpb24oY2FsbGJhY2ssIGVsZW1lbnQsIGlzQW5pbWF0ZWQpXG4gIH1cblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZywgdGhpcy5fZWxlbWVudClcbiAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZylcbiAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKVxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgZ2V0SW5zdGFuY2UoZWxlbWVudCkge1xuICAgIHJldHVybiBEYXRhLmdldChnZXRFbGVtZW50KGVsZW1lbnQpLCB0aGlzLkRBVEFfS0VZKVxuICB9XG5cbiAgc3RhdGljIGdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJbnN0YW5jZShlbGVtZW50KSB8fCBuZXcgdGhpcyhlbGVtZW50LCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IG51bGwpXG4gIH1cblxuICBzdGF0aWMgZ2V0IFZFUlNJT04oKSB7XG4gICAgcmV0dXJuIFZFUlNJT05cbiAgfVxuXG4gIHN0YXRpYyBnZXQgREFUQV9LRVkoKSB7XG4gICAgcmV0dXJuIGBicy4ke3RoaXMuTkFNRX1gXG4gIH1cblxuICBzdGF0aWMgZ2V0IEVWRU5UX0tFWSgpIHtcbiAgICByZXR1cm4gYC4ke3RoaXMuREFUQV9LRVl9YFxuICB9XG5cbiAgc3RhdGljIGV2ZW50TmFtZShuYW1lKSB7XG4gICAgcmV0dXJuIGAke25hbWV9JHt0aGlzLkVWRU5UX0tFWX1gXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQmFzZUNvbXBvbmVudFxuIiwiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4yLjApOiB1dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4uL2RvbS9ldmVudC1oYW5kbGVyJ1xuaW1wb3J0IHsgZ2V0RWxlbWVudEZyb21TZWxlY3RvciwgaXNEaXNhYmxlZCB9IGZyb20gJy4vaW5kZXgnXG5cbmNvbnN0IGVuYWJsZURpc21pc3NUcmlnZ2VyID0gKGNvbXBvbmVudCwgbWV0aG9kID0gJ2hpZGUnKSA9PiB7XG4gIGNvbnN0IGNsaWNrRXZlbnQgPSBgY2xpY2suZGlzbWlzcyR7Y29tcG9uZW50LkVWRU5UX0tFWX1gXG4gIGNvbnN0IG5hbWUgPSBjb21wb25lbnQuTkFNRVxuXG4gIEV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgY2xpY2tFdmVudCwgYFtkYXRhLWJzLWRpc21pc3M9XCIke25hbWV9XCJdYCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIH1cblxuICAgIGlmIChpc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXQgPSBnZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpIHx8IHRoaXMuY2xvc2VzdChgLiR7bmFtZX1gKVxuICAgIGNvbnN0IGluc3RhbmNlID0gY29tcG9uZW50LmdldE9yQ3JlYXRlSW5zdGFuY2UodGFyZ2V0KVxuXG4gICAgLy8gTWV0aG9kIGFyZ3VtZW50IGlzIGxlZnQsIGZvciBBbGVydCBhbmQgb25seSwgYXMgaXQgZG9lc24ndCBpbXBsZW1lbnQgdGhlICdoaWRlJyBtZXRob2RcbiAgICBpbnN0YW5jZVttZXRob2RdKClcbiAgfSlcbn1cblxuZXhwb3J0IHtcbiAgZW5hYmxlRGlzbWlzc1RyaWdnZXJcbn1cbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4wKTogYWxlcnQuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4gfSBmcm9tICcuL3V0aWwvaW5kZXgnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXInXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50J1xuaW1wb3J0IHsgZW5hYmxlRGlzbWlzc1RyaWdnZXIgfSBmcm9tICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2FsZXJ0J1xuY29uc3QgREFUQV9LRVkgPSAnYnMuYWxlcnQnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuXG5jb25zdCBFVkVOVF9DTE9TRSA9IGBjbG9zZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMT1NFRCA9IGBjbG9zZWQke0VWRU5UX0tFWX1gXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBBbGVydCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGNsb3NlKCkge1xuICAgIGNvbnN0IGNsb3NlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9DTE9TRSlcblxuICAgIGlmIChjbG9zZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG5cbiAgICBjb25zdCBpc0FuaW1hdGVkID0gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKVxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4gdGhpcy5fZGVzdHJveUVsZW1lbnQoKSwgdGhpcy5fZWxlbWVudCwgaXNBbmltYXRlZClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2Rlc3Ryb3lFbGVtZW50KCkge1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKClcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9DTE9TRUQpXG4gICAgdGhpcy5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IEFsZXJ0LmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YVtjb25maWddID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnN0YXJ0c1dpdGgoJ18nKSB8fCBjb25maWcgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10odGhpcylcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihBbGVydCwgJ2Nsb3NlJylcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oQWxlcnQpXG5cbmV4cG9ydCBkZWZhdWx0IEFsZXJ0XG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjIuMCk6IGJ1dHRvbi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCB7IGRlZmluZUpRdWVyeVBsdWdpbiB9IGZyb20gJy4vdXRpbC9pbmRleCdcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdidXR0b24nXG5jb25zdCBEQVRBX0tFWSA9ICdicy5idXR0b24nXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwiYnV0dG9uXCJdJ1xuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEJ1dHRvbiBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZSgpIHtcbiAgICAvLyBUb2dnbGUgY2xhc3MgYW5kIHN5bmMgdGhlIGBhcmlhLXByZXNzZWRgIGF0dHJpYnV0ZSB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGAudG9nZ2xlKClgIG1ldGhvZFxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoQ0xBU1NfTkFNRV9BQ1RJVkUpKVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQnV0dG9uLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcylcblxuICAgICAgaWYgKGNvbmZpZyA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgZGF0YVtjb25maWddKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZXZlbnQgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgY29uc3QgYnV0dG9uID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoU0VMRUNUT1JfREFUQV9UT0dHTEUpXG4gIGNvbnN0IGRhdGEgPSBCdXR0b24uZ2V0T3JDcmVhdGVJbnN0YW5jZShidXR0b24pXG5cbiAgZGF0YS50b2dnbGUoKVxufSlcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oQnV0dG9uKVxuXG5leHBvcnQgZGVmYXVsdCBCdXR0b25cbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4wKTogZG9tL3NlbGVjdG9yLWVuZ2luZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCB7IGlzRGlzYWJsZWQsIGlzVmlzaWJsZSB9IGZyb20gJy4uL3V0aWwvaW5kZXgnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgU2VsZWN0b3JFbmdpbmUgPSB7XG4gIGZpbmQoc2VsZWN0b3IsIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KC4uLkVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwuY2FsbChlbGVtZW50LCBzZWxlY3RvcikpXG4gIH0sXG5cbiAgZmluZE9uZShzZWxlY3RvciwgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgIHJldHVybiBFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpXG4gIH0sXG5cbiAgY2hpbGRyZW4oZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KC4uLmVsZW1lbnQuY2hpbGRyZW4pLmZpbHRlcihjaGlsZCA9PiBjaGlsZC5tYXRjaGVzKHNlbGVjdG9yKSlcbiAgfSxcblxuICBwYXJlbnRzKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgY29uc3QgcGFyZW50cyA9IFtdXG4gICAgbGV0IGFuY2VzdG9yID0gZWxlbWVudC5wYXJlbnROb2RlLmNsb3Nlc3Qoc2VsZWN0b3IpXG5cbiAgICB3aGlsZSAoYW5jZXN0b3IpIHtcbiAgICAgIHBhcmVudHMucHVzaChhbmNlc3RvcilcbiAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50Tm9kZS5jbG9zZXN0KHNlbGVjdG9yKVxuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnRzXG4gIH0sXG5cbiAgcHJldihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGxldCBwcmV2aW91cyA9IGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZ1xuXG4gICAgd2hpbGUgKHByZXZpb3VzKSB7XG4gICAgICBpZiAocHJldmlvdXMubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgcmV0dXJuIFtwcmV2aW91c11cbiAgICAgIH1cblxuICAgICAgcHJldmlvdXMgPSBwcmV2aW91cy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXG4gICAgfVxuXG4gICAgcmV0dXJuIFtdXG4gIH0sXG4gIC8vIFRPRE86IHRoaXMgaXMgbm93IHVudXNlZDsgcmVtb3ZlIGxhdGVyIGFsb25nIHdpdGggcHJldigpXG4gIG5leHQoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICBsZXQgbmV4dCA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nXG5cbiAgICB3aGlsZSAobmV4dCkge1xuICAgICAgaWYgKG5leHQubWF0Y2hlcyhzZWxlY3RvcikpIHtcbiAgICAgICAgcmV0dXJuIFtuZXh0XVxuICAgICAgfVxuXG4gICAgICBuZXh0ID0gbmV4dC5uZXh0RWxlbWVudFNpYmxpbmdcbiAgICB9XG5cbiAgICByZXR1cm4gW11cbiAgfSxcblxuICBmb2N1c2FibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgY29uc3QgZm9jdXNhYmxlcyA9IFtcbiAgICAgICdhJyxcbiAgICAgICdidXR0b24nLFxuICAgICAgJ2lucHV0JyxcbiAgICAgICd0ZXh0YXJlYScsXG4gICAgICAnc2VsZWN0JyxcbiAgICAgICdkZXRhaWxzJyxcbiAgICAgICdbdGFiaW5kZXhdJyxcbiAgICAgICdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSdcbiAgICBdLm1hcChzZWxlY3RvciA9PiBgJHtzZWxlY3Rvcn06bm90KFt0YWJpbmRleF49XCItXCJdKWApLmpvaW4oJywnKVxuXG4gICAgcmV0dXJuIHRoaXMuZmluZChmb2N1c2FibGVzLCBlbGVtZW50KS5maWx0ZXIoZWwgPT4gIWlzRGlzYWJsZWQoZWwpICYmIGlzVmlzaWJsZShlbCkpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2VsZWN0b3JFbmdpbmVcbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4wKTogdXRpbC9zd2lwZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBDb25maWcgZnJvbSAnLi9jb25maWcnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4uL2RvbS9ldmVudC1oYW5kbGVyJ1xuaW1wb3J0IHsgZXhlY3V0ZSB9IGZyb20gJy4vaW5kZXgnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdzd2lwZSdcbmNvbnN0IEVWRU5UX0tFWSA9ICcuYnMuc3dpcGUnXG5jb25zdCBFVkVOVF9UT1VDSFNUQVJUID0gYHRvdWNoc3RhcnQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9UT1VDSE1PVkUgPSBgdG91Y2htb3ZlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfVE9VQ0hFTkQgPSBgdG91Y2hlbmQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9QT0lOVEVSRE9XTiA9IGBwb2ludGVyZG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1BPSU5URVJVUCA9IGBwb2ludGVydXAke0VWRU5UX0tFWX1gXG5jb25zdCBQT0lOVEVSX1RZUEVfVE9VQ0ggPSAndG91Y2gnXG5jb25zdCBQT0lOVEVSX1RZUEVfUEVOID0gJ3BlbidcbmNvbnN0IENMQVNTX05BTUVfUE9JTlRFUl9FVkVOVCA9ICdwb2ludGVyLWV2ZW50J1xuY29uc3QgU1dJUEVfVEhSRVNIT0xEID0gNDBcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgZW5kQ2FsbGJhY2s6IG51bGwsXG4gIGxlZnRDYWxsYmFjazogbnVsbCxcbiAgcmlnaHRDYWxsYmFjazogbnVsbFxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgZW5kQ2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknLFxuICBsZWZ0Q2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknLFxuICByaWdodENhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTd2lwZSBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudFxuXG4gICAgaWYgKCFlbGVtZW50IHx8ICFTd2lwZS5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKVxuICAgIHRoaXMuX2RlbHRhWCA9IDBcbiAgICB0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cyA9IEJvb2xlYW4od2luZG93LlBvaW50ZXJFdmVudClcbiAgICB0aGlzLl9pbml0RXZlbnRzKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZGlzcG9zZSgpIHtcbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWSlcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX3N0YXJ0KGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cykge1xuICAgICAgdGhpcy5fZGVsdGFYID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRYXG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9ldmVudElzUG9pbnRlclBlblRvdWNoKGV2ZW50KSkge1xuICAgICAgdGhpcy5fZGVsdGFYID0gZXZlbnQuY2xpZW50WFxuICAgIH1cbiAgfVxuXG4gIF9lbmQoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5fZXZlbnRJc1BvaW50ZXJQZW5Ub3VjaChldmVudCkpIHtcbiAgICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLl9kZWx0YVhcbiAgICB9XG5cbiAgICB0aGlzLl9oYW5kbGVTd2lwZSgpXG4gICAgZXhlY3V0ZSh0aGlzLl9jb25maWcuZW5kQ2FsbGJhY2spXG4gIH1cblxuICBfbW92ZShldmVudCkge1xuICAgIHRoaXMuX2RlbHRhWCA9IGV2ZW50LnRvdWNoZXMgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPiAxID9cbiAgICAgIDAgOlxuICAgICAgZXZlbnQudG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5fZGVsdGFYXG4gIH1cblxuICBfaGFuZGxlU3dpcGUoKSB7XG4gICAgY29uc3QgYWJzRGVsdGFYID0gTWF0aC5hYnModGhpcy5fZGVsdGFYKVxuXG4gICAgaWYgKGFic0RlbHRhWCA8PSBTV0lQRV9USFJFU0hPTEQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGFic0RlbHRhWCAvIHRoaXMuX2RlbHRhWFxuXG4gICAgdGhpcy5fZGVsdGFYID0gMFxuXG4gICAgaWYgKCFkaXJlY3Rpb24pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGV4ZWN1dGUoZGlyZWN0aW9uID4gMCA/IHRoaXMuX2NvbmZpZy5yaWdodENhbGxiYWNrIDogdGhpcy5fY29uZmlnLmxlZnRDYWxsYmFjaylcbiAgfVxuXG4gIF9pbml0RXZlbnRzKCkge1xuICAgIGlmICh0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1BPSU5URVJET1dOLCBldmVudCA9PiB0aGlzLl9zdGFydChldmVudCkpXG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfUE9JTlRFUlVQLCBldmVudCA9PiB0aGlzLl9lbmQoZXZlbnQpKVxuXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9QT0lOVEVSX0VWRU5UKVxuICAgIH0gZWxzZSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfVE9VQ0hTVEFSVCwgZXZlbnQgPT4gdGhpcy5fc3RhcnQoZXZlbnQpKVxuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1RPVUNITU9WRSwgZXZlbnQgPT4gdGhpcy5fbW92ZShldmVudCkpXG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfVE9VQ0hFTkQsIGV2ZW50ID0+IHRoaXMuX2VuZChldmVudCkpXG4gICAgfVxuICB9XG5cbiAgX2V2ZW50SXNQb2ludGVyUGVuVG91Y2goZXZlbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fc3VwcG9ydFBvaW50ZXJFdmVudHMgJiYgKGV2ZW50LnBvaW50ZXJUeXBlID09PSBQT0lOVEVSX1RZUEVfUEVOIHx8IGV2ZW50LnBvaW50ZXJUeXBlID09PSBQT0lOVEVSX1RZUEVfVE9VQ0gpXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGlzU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiAnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN3aXBlXG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjIuMCk6IGNhcm91c2VsLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLFxuICBnZXRFbGVtZW50RnJvbVNlbGVjdG9yLFxuICBnZXROZXh0QWN0aXZlRWxlbWVudCxcbiAgaXNSVEwsXG4gIGlzVmlzaWJsZSxcbiAgcmVmbG93LFxuICB0cmlnZ2VyVHJhbnNpdGlvbkVuZFxufSBmcm9tICcuL3V0aWwvaW5kZXgnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXInXG5pbXBvcnQgTWFuaXB1bGF0b3IgZnJvbSAnLi9kb20vbWFuaXB1bGF0b3InXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lJ1xuaW1wb3J0IFN3aXBlIGZyb20gJy4vdXRpbC9zd2lwZSdcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdjYXJvdXNlbCdcbmNvbnN0IERBVEFfS0VZID0gJ2JzLmNhcm91c2VsJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5cbmNvbnN0IEFSUk9XX0xFRlRfS0VZID0gJ0Fycm93TGVmdCdcbmNvbnN0IEFSUk9XX1JJR0hUX0tFWSA9ICdBcnJvd1JpZ2h0J1xuY29uc3QgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCA9IDUwMCAvLyBUaW1lIGZvciBtb3VzZSBjb21wYXQgZXZlbnRzIHRvIGZpcmUgYWZ0ZXIgdG91Y2hcblxuY29uc3QgT1JERVJfTkVYVCA9ICduZXh0J1xuY29uc3QgT1JERVJfUFJFViA9ICdwcmV2J1xuY29uc3QgRElSRUNUSU9OX0xFRlQgPSAnbGVmdCdcbmNvbnN0IERJUkVDVElPTl9SSUdIVCA9ICdyaWdodCdcblxuY29uc3QgRVZFTlRfU0xJREUgPSBgc2xpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TTElEID0gYHNsaWQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOID0gYGtleWRvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRUVOVEVSID0gYG1vdXNlZW50ZXIke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRUxFQVZFID0gYG1vdXNlbGVhdmUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9EUkFHX1NUQVJUID0gYGRyYWdzdGFydCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkgPSBgbG9hZCR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX0NBUk9VU0VMID0gJ2Nhcm91c2VsJ1xuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TTElERSA9ICdzbGlkZSdcbmNvbnN0IENMQVNTX05BTUVfRU5EID0gJ2Nhcm91c2VsLWl0ZW0tZW5kJ1xuY29uc3QgQ0xBU1NfTkFNRV9TVEFSVCA9ICdjYXJvdXNlbC1pdGVtLXN0YXJ0J1xuY29uc3QgQ0xBU1NfTkFNRV9ORVhUID0gJ2Nhcm91c2VsLWl0ZW0tbmV4dCdcbmNvbnN0IENMQVNTX05BTUVfUFJFViA9ICdjYXJvdXNlbC1pdGVtLXByZXYnXG5cbmNvbnN0IFNFTEVDVE9SX0FDVElWRSA9ICcuYWN0aXZlJ1xuY29uc3QgU0VMRUNUT1JfSVRFTSA9ICcuY2Fyb3VzZWwtaXRlbSdcbmNvbnN0IFNFTEVDVE9SX0FDVElWRV9JVEVNID0gU0VMRUNUT1JfQUNUSVZFICsgU0VMRUNUT1JfSVRFTVxuY29uc3QgU0VMRUNUT1JfSVRFTV9JTUcgPSAnLmNhcm91c2VsLWl0ZW0gaW1nJ1xuY29uc3QgU0VMRUNUT1JfSU5ESUNBVE9SUyA9ICcuY2Fyb3VzZWwtaW5kaWNhdG9ycydcbmNvbnN0IFNFTEVDVE9SX0RBVEFfU0xJREUgPSAnW2RhdGEtYnMtc2xpZGVdLCBbZGF0YS1icy1zbGlkZS10b10nXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1JJREUgPSAnW2RhdGEtYnMtcmlkZT1cImNhcm91c2VsXCJdJ1xuXG5jb25zdCBLRVlfVE9fRElSRUNUSU9OID0ge1xuICBbQVJST1dfTEVGVF9LRVldOiBESVJFQ1RJT05fUklHSFQsXG4gIFtBUlJPV19SSUdIVF9LRVldOiBESVJFQ1RJT05fTEVGVFxufVxuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBpbnRlcnZhbDogNTAwMCxcbiAga2V5Ym9hcmQ6IHRydWUsXG4gIHBhdXNlOiAnaG92ZXInLFxuICByaWRlOiBmYWxzZSxcbiAgdG91Y2g6IHRydWUsXG4gIHdyYXA6IHRydWVcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGludGVydmFsOiAnKG51bWJlcnxib29sZWFuKScsIC8vIFRPRE86djYgcmVtb3ZlIGJvb2xlYW4gc3VwcG9ydFxuICBrZXlib2FyZDogJ2Jvb2xlYW4nLFxuICBwYXVzZTogJyhzdHJpbmd8Ym9vbGVhbiknLFxuICByaWRlOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIHRvdWNoOiAnYm9vbGVhbicsXG4gIHdyYXA6ICdib29sZWFuJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBDYXJvdXNlbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGxcbiAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbnVsbFxuICAgIHRoaXMuX2lzU2xpZGluZyA9IGZhbHNlXG4gICAgdGhpcy50b3VjaFRpbWVvdXQgPSBudWxsXG4gICAgdGhpcy5fc3dpcGVIZWxwZXIgPSBudWxsXG5cbiAgICB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfSU5ESUNBVE9SUywgdGhpcy5fZWxlbWVudClcbiAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpXG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnJpZGUgPT09IENMQVNTX05BTUVfQ0FST1VTRUwpIHtcbiAgICAgIHRoaXMuY3ljbGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgbmV4dCgpIHtcbiAgICB0aGlzLl9zbGlkZShPUkRFUl9ORVhUKVxuICB9XG5cbiAgbmV4dFdoZW5WaXNpYmxlKCkge1xuICAgIC8vIEZJWE1FIFRPRE8gdXNlIGBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGVgXG4gICAgLy8gRG9uJ3QgY2FsbCBuZXh0IHdoZW4gdGhlIHBhZ2UgaXNuJ3QgdmlzaWJsZVxuICAgIC8vIG9yIHRoZSBjYXJvdXNlbCBvciBpdHMgcGFyZW50IGlzbid0IHZpc2libGVcbiAgICBpZiAoIWRvY3VtZW50LmhpZGRlbiAmJiBpc1Zpc2libGUodGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIHRoaXMubmV4dCgpXG4gICAgfVxuICB9XG5cbiAgcHJldigpIHtcbiAgICB0aGlzLl9zbGlkZShPUkRFUl9QUkVWKVxuICB9XG5cbiAgcGF1c2UoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgdHJpZ2dlclRyYW5zaXRpb25FbmQodGhpcy5fZWxlbWVudClcbiAgICB9XG5cbiAgICB0aGlzLl9jbGVhckludGVydmFsKClcbiAgfVxuXG4gIGN5Y2xlKCkge1xuICAgIHRoaXMuX2NsZWFySW50ZXJ2YWwoKVxuICAgIHRoaXMuX3VwZGF0ZUludGVydmFsKClcblxuICAgIHRoaXMuX2ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5uZXh0V2hlblZpc2libGUoKSwgdGhpcy5fY29uZmlnLmludGVydmFsKVxuICB9XG5cbiAgX21heWJlRW5hYmxlQ3ljbGUoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcucmlkZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uZSh0aGlzLl9lbGVtZW50LCBFVkVOVF9TTElELCAoKSA9PiB0aGlzLmN5Y2xlKCkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmN5Y2xlKClcbiAgfVxuXG4gIHRvKGluZGV4KSB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLl9nZXRJdGVtcygpXG4gICAgaWYgKGluZGV4ID4gaXRlbXMubGVuZ3RoIC0gMSB8fCBpbmRleCA8IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbmUodGhpcy5fZWxlbWVudCwgRVZFTlRfU0xJRCwgKCkgPT4gdGhpcy50byhpbmRleCkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleCh0aGlzLl9nZXRBY3RpdmUoKSlcbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IGluZGV4KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvcmRlciA9IGluZGV4ID4gYWN0aXZlSW5kZXggPyBPUkRFUl9ORVhUIDogT1JERVJfUFJFVlxuXG4gICAgdGhpcy5fc2xpZGUob3JkZXIsIGl0ZW1zW2luZGV4XSlcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHRoaXMuX3N3aXBlSGVscGVyKSB7XG4gICAgICB0aGlzLl9zd2lwZUhlbHBlci5kaXNwb3NlKClcbiAgICB9XG5cbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgY29uZmlnLmRlZmF1bHRJbnRlcnZhbCA9IGNvbmZpZy5pbnRlcnZhbFxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTiwgZXZlbnQgPT4gdGhpcy5fa2V5ZG93bihldmVudCkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5wYXVzZSA9PT0gJ2hvdmVyJykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRU5URVIsICgpID0+IHRoaXMucGF1c2UoKSlcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRUxFQVZFLCAoKSA9PiB0aGlzLl9tYXliZUVuYWJsZUN5Y2xlKCkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy50b3VjaCAmJiBTd2lwZS5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICB0aGlzLl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzKClcbiAgICB9XG4gIH1cblxuICBfYWRkVG91Y2hFdmVudExpc3RlbmVycygpIHtcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lURU1fSU1HLCB0aGlzLl9lbGVtZW50KSkge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKGltZywgRVZFTlRfRFJBR19TVEFSVCwgZXZlbnQgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSlcbiAgICB9XG5cbiAgICBjb25zdCBlbmRDYWxsQmFjayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcucGF1c2UgIT09ICdob3ZlcicpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0J3MgYSB0b3VjaC1lbmFibGVkIGRldmljZSwgbW91c2VlbnRlci9sZWF2ZSBhcmUgZmlyZWQgYXNcbiAgICAgIC8vIHBhcnQgb2YgdGhlIG1vdXNlIGNvbXBhdGliaWxpdHkgZXZlbnRzIG9uIGZpcnN0IHRhcCAtIHRoZSBjYXJvdXNlbFxuICAgICAgLy8gd291bGQgc3RvcCBjeWNsaW5nIHVudGlsIHVzZXIgdGFwcGVkIG91dCBvZiBpdDtcbiAgICAgIC8vIGhlcmUsIHdlIGxpc3RlbiBmb3IgdG91Y2hlbmQsIGV4cGxpY2l0bHkgcGF1c2UgdGhlIGNhcm91c2VsXG4gICAgICAvLyAoYXMgaWYgaXQncyB0aGUgc2Vjb25kIHRpbWUgd2UgdGFwIG9uIGl0LCBtb3VzZWVudGVyIGNvbXBhdCBldmVudFxuICAgICAgLy8gaXMgTk9UIGZpcmVkKSBhbmQgYWZ0ZXIgYSB0aW1lb3V0ICh0byBhbGxvdyBmb3IgbW91c2UgY29tcGF0aWJpbGl0eVxuICAgICAgLy8gZXZlbnRzIHRvIGZpcmUpIHdlIGV4cGxpY2l0bHkgcmVzdGFydCBjeWNsaW5nXG5cbiAgICAgIHRoaXMucGF1c2UoKVxuICAgICAgaWYgKHRoaXMudG91Y2hUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvdWNoVGltZW91dClcbiAgICAgIH1cblxuICAgICAgdGhpcy50b3VjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX21heWJlRW5hYmxlQ3ljbGUoKSwgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCArIHRoaXMuX2NvbmZpZy5pbnRlcnZhbClcbiAgICB9XG5cbiAgICBjb25zdCBzd2lwZUNvbmZpZyA9IHtcbiAgICAgIGxlZnRDYWxsYmFjazogKCkgPT4gdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihESVJFQ1RJT05fTEVGVCkpLFxuICAgICAgcmlnaHRDYWxsYmFjazogKCkgPT4gdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihESVJFQ1RJT05fUklHSFQpKSxcbiAgICAgIGVuZENhbGxiYWNrOiBlbmRDYWxsQmFja1xuICAgIH1cblxuICAgIHRoaXMuX3N3aXBlSGVscGVyID0gbmV3IFN3aXBlKHRoaXMuX2VsZW1lbnQsIHN3aXBlQ29uZmlnKVxuICB9XG5cbiAgX2tleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IEtFWV9UT19ESVJFQ1RJT05bZXZlbnQua2V5XVxuICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIHRoaXMuX3NsaWRlKHRoaXMuX2RpcmVjdGlvblRvT3JkZXIoZGlyZWN0aW9uKSlcbiAgICB9XG4gIH1cblxuICBfZ2V0SXRlbUluZGV4KGVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0SXRlbXMoKS5pbmRleE9mKGVsZW1lbnQpXG4gIH1cblxuICBfc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChpbmRleCkge1xuICAgIGlmICghdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZUluZGljYXRvciA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfQUNUSVZFLCB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudClcblxuICAgIGFjdGl2ZUluZGljYXRvci5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKVxuICAgIGFjdGl2ZUluZGljYXRvci5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcpXG5cbiAgICBjb25zdCBuZXdBY3RpdmVJbmRpY2F0b3IgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKGBbZGF0YS1icy1zbGlkZS10bz1cIiR7aW5kZXh9XCJdYCwgdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpXG5cbiAgICBpZiAobmV3QWN0aXZlSW5kaWNhdG9yKSB7XG4gICAgICBuZXdBY3RpdmVJbmRpY2F0b3IuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSlcbiAgICAgIG5ld0FjdGl2ZUluZGljYXRvci5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICd0cnVlJylcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlSW50ZXJ2YWwoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2FjdGl2ZUVsZW1lbnQgfHwgdGhpcy5fZ2V0QWN0aXZlKClcblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudEludGVydmFsID0gTnVtYmVyLnBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLWludGVydmFsJyksIDEwKVxuXG4gICAgdGhpcy5fY29uZmlnLmludGVydmFsID0gZWxlbWVudEludGVydmFsIHx8IHRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWxcbiAgfVxuXG4gIF9zbGlkZShvcmRlciwgZWxlbWVudCA9IG51bGwpIHtcbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5fZ2V0QWN0aXZlKClcbiAgICBjb25zdCBpc05leHQgPSBvcmRlciA9PT0gT1JERVJfTkVYVFxuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gZWxlbWVudCB8fCBnZXROZXh0QWN0aXZlRWxlbWVudCh0aGlzLl9nZXRJdGVtcygpLCBhY3RpdmVFbGVtZW50LCBpc05leHQsIHRoaXMuX2NvbmZpZy53cmFwKVxuXG4gICAgaWYgKG5leHRFbGVtZW50ID09PSBhY3RpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBuZXh0RWxlbWVudEluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KG5leHRFbGVtZW50KVxuXG4gICAgY29uc3QgdHJpZ2dlckV2ZW50ID0gZXZlbnROYW1lID0+IHtcbiAgICAgIHJldHVybiBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBldmVudE5hbWUsIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogbmV4dEVsZW1lbnQsXG4gICAgICAgIGRpcmVjdGlvbjogdGhpcy5fb3JkZXJUb0RpcmVjdGlvbihvcmRlciksXG4gICAgICAgIGZyb206IHRoaXMuX2dldEl0ZW1JbmRleChhY3RpdmVFbGVtZW50KSxcbiAgICAgICAgdG86IG5leHRFbGVtZW50SW5kZXhcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3Qgc2xpZGVFdmVudCA9IHRyaWdnZXJFdmVudChFVkVOVF9TTElERSlcblxuICAgIGlmIChzbGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCAhbmV4dEVsZW1lbnQpIHtcbiAgICAgIC8vIFNvbWUgd2VpcmRuZXNzIGlzIGhhcHBlbmluZywgc28gd2UgYmFpbFxuICAgICAgLy8gdG9kbzogY2hhbmdlIHRlc3RzIHRoYXQgdXNlIGVtcHR5IGRpdnMgdG8gYXZvaWQgdGhpcyBjaGVja1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaXNDeWNsaW5nID0gQm9vbGVhbih0aGlzLl9pbnRlcnZhbClcbiAgICB0aGlzLnBhdXNlKClcblxuICAgIHRoaXMuX2lzU2xpZGluZyA9IHRydWVcblxuICAgIHRoaXMuX3NldEFjdGl2ZUluZGljYXRvckVsZW1lbnQobmV4dEVsZW1lbnRJbmRleClcbiAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbmV4dEVsZW1lbnRcblxuICAgIGNvbnN0IGRpcmVjdGlvbmFsQ2xhc3NOYW1lID0gaXNOZXh0ID8gQ0xBU1NfTkFNRV9TVEFSVCA6IENMQVNTX05BTUVfRU5EXG4gICAgY29uc3Qgb3JkZXJDbGFzc05hbWUgPSBpc05leHQgPyBDTEFTU19OQU1FX05FWFQgOiBDTEFTU19OQU1FX1BSRVZcblxuICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQob3JkZXJDbGFzc05hbWUpXG5cbiAgICByZWZsb3cobmV4dEVsZW1lbnQpXG5cbiAgICBhY3RpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoZGlyZWN0aW9uYWxDbGFzc05hbWUpXG4gICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmFkZChkaXJlY3Rpb25hbENsYXNzTmFtZSlcblxuICAgIGNvbnN0IGNvbXBsZXRlQ2FsbEJhY2sgPSAoKSA9PiB7XG4gICAgICBuZXh0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGRpcmVjdGlvbmFsQ2xhc3NOYW1lLCBvcmRlckNsYXNzTmFtZSlcbiAgICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG5cbiAgICAgIGFjdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSwgb3JkZXJDbGFzc05hbWUsIGRpcmVjdGlvbmFsQ2xhc3NOYW1lKVxuXG4gICAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoRVZFTlRfU0xJRClcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbEJhY2ssIGFjdGl2ZUVsZW1lbnQsIHRoaXMuX2lzQW5pbWF0ZWQoKSlcblxuICAgIGlmIChpc0N5Y2xpbmcpIHtcbiAgICAgIHRoaXMuY3ljbGUoKVxuICAgIH1cbiAgfVxuXG4gIF9pc0FuaW1hdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NMSURFKVxuICB9XG5cbiAgX2dldEFjdGl2ZSgpIHtcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9BQ1RJVkVfSVRFTSwgdGhpcy5fZWxlbWVudClcbiAgfVxuXG4gIF9nZXRJdGVtcygpIHtcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9JVEVNLCB0aGlzLl9lbGVtZW50KVxuICB9XG5cbiAgX2NsZWFySW50ZXJ2YWwoKSB7XG4gICAgaWYgKHRoaXMuX2ludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKVxuICAgICAgdGhpcy5faW50ZXJ2YWwgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgX2RpcmVjdGlvblRvT3JkZXIoZGlyZWN0aW9uKSB7XG4gICAgaWYgKGlzUlRMKCkpIHtcbiAgICAgIHJldHVybiBkaXJlY3Rpb24gPT09IERJUkVDVElPTl9MRUZUID8gT1JERVJfUFJFViA6IE9SREVSX05FWFRcbiAgICB9XG5cbiAgICByZXR1cm4gZGlyZWN0aW9uID09PSBESVJFQ1RJT05fTEVGVCA/IE9SREVSX05FWFQgOiBPUkRFUl9QUkVWXG4gIH1cblxuICBfb3JkZXJUb0RpcmVjdGlvbihvcmRlcikge1xuICAgIGlmIChpc1JUTCgpKSB7XG4gICAgICByZXR1cm4gb3JkZXIgPT09IE9SREVSX1BSRVYgPyBESVJFQ1RJT05fTEVGVCA6IERJUkVDVElPTl9SSUdIVFxuICAgIH1cblxuICAgIHJldHVybiBvcmRlciA9PT0gT1JERVJfUFJFViA/IERJUkVDVElPTl9SSUdIVCA6IERJUkVDVElPTl9MRUZUXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBDYXJvdXNlbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGRhdGEudG8oY29uZmlnKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9TTElERSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IGdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcylcblxuICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0NBUk9VU0VMKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gIGNvbnN0IGNhcm91c2VsID0gQ2Fyb3VzZWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpXG4gIGNvbnN0IHNsaWRlSW5kZXggPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1icy1zbGlkZS10bycpXG5cbiAgaWYgKHNsaWRlSW5kZXgpIHtcbiAgICBjYXJvdXNlbC50byhzbGlkZUluZGV4KVxuICAgIGNhcm91c2VsLl9tYXliZUVuYWJsZUN5Y2xlKClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKHRoaXMsICdzbGlkZScpID09PSAnbmV4dCcpIHtcbiAgICBjYXJvdXNlbC5uZXh0KClcbiAgICBjYXJvdXNlbC5fbWF5YmVFbmFibGVDeWNsZSgpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjYXJvdXNlbC5wcmV2KClcbiAgY2Fyb3VzZWwuX21heWJlRW5hYmxlQ3ljbGUoKVxufSlcblxuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSwgKCkgPT4ge1xuICBjb25zdCBjYXJvdXNlbHMgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfUklERSlcblxuICBmb3IgKGNvbnN0IGNhcm91c2VsIG9mIGNhcm91c2Vscykge1xuICAgIENhcm91c2VsLmdldE9yQ3JlYXRlSW5zdGFuY2UoY2Fyb3VzZWwpXG4gIH1cbn0pXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKENhcm91c2VsKVxuXG5leHBvcnQgZGVmYXVsdCBDYXJvdXNlbFxuIiwiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4yLjApOiBjb2xsYXBzZS5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbixcbiAgZ2V0RWxlbWVudCxcbiAgZ2V0RWxlbWVudEZyb21TZWxlY3RvcixcbiAgZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCxcbiAgcmVmbG93XG59IGZyb20gJy4vdXRpbC9pbmRleCdcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUnXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50J1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnY29sbGFwc2UnXG5jb25zdCBEQVRBX0tFWSA9ICdicy5jb2xsYXBzZSdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJ1xuXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcblxuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19OQU1FX0NPTExBUFNFID0gJ2NvbGxhcHNlJ1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTSU5HID0gJ2NvbGxhcHNpbmcnXG5jb25zdCBDTEFTU19OQU1FX0NPTExBUFNFRCA9ICdjb2xsYXBzZWQnXG5jb25zdCBDTEFTU19OQU1FX0RFRVBFUl9DSElMRFJFTiA9IGA6c2NvcGUgLiR7Q0xBU1NfTkFNRV9DT0xMQVBTRX0gLiR7Q0xBU1NfTkFNRV9DT0xMQVBTRX1gXG5jb25zdCBDTEFTU19OQU1FX0hPUklaT05UQUwgPSAnY29sbGFwc2UtaG9yaXpvbnRhbCdcblxuY29uc3QgV0lEVEggPSAnd2lkdGgnXG5jb25zdCBIRUlHSFQgPSAnaGVpZ2h0J1xuXG5jb25zdCBTRUxFQ1RPUl9BQ1RJVkVTID0gJy5jb2xsYXBzZS5zaG93LCAuY29sbGFwc2UuY29sbGFwc2luZydcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLWJzLXRvZ2dsZT1cImNvbGxhcHNlXCJdJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBwYXJlbnQ6IG51bGwsXG4gIHRvZ2dsZTogdHJ1ZVxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgcGFyZW50OiAnKG51bGx8ZWxlbWVudCknLFxuICB0b2dnbGU6ICdib29sZWFuJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBDb2xsYXBzZSBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuICAgIHRoaXMuX3RyaWdnZXJBcnJheSA9IFtdXG5cbiAgICBjb25zdCB0b2dnbGVMaXN0ID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1RPR0dMRSlcblxuICAgIGZvciAoY29uc3QgZWxlbSBvZiB0b2dnbGVMaXN0KSB7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbSlcbiAgICAgIGNvbnN0IGZpbHRlckVsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yKVxuICAgICAgICAuZmlsdGVyKGZvdW5kRWxlbWVudCA9PiBmb3VuZEVsZW1lbnQgPT09IHRoaXMuX2VsZW1lbnQpXG5cbiAgICAgIGlmIChzZWxlY3RvciAhPT0gbnVsbCAmJiBmaWx0ZXJFbGVtZW50Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLl90cmlnZ2VyQXJyYXkucHVzaChlbGVtKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2luaXRpYWxpemVDaGlsZHJlbigpXG5cbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5wYXJlbnQpIHtcbiAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0aGlzLl90cmlnZ2VyQXJyYXksIHRoaXMuX2lzU2hvd24oKSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnRvZ2dsZSkge1xuICAgICAgdGhpcy50b2dnbGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKCkge1xuICAgIGlmICh0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMuaGlkZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvdygpXG4gICAgfVxuICB9XG5cbiAgc2hvdygpIHtcbiAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8IHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGV0IGFjdGl2ZUNoaWxkcmVuID0gW11cblxuICAgIC8vIGZpbmQgYWN0aXZlIGNoaWxkcmVuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5wYXJlbnQpIHtcbiAgICAgIGFjdGl2ZUNoaWxkcmVuID0gdGhpcy5fZ2V0Rmlyc3RMZXZlbENoaWxkcmVuKFNFTEVDVE9SX0FDVElWRVMpXG4gICAgICAgIC5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50KVxuICAgICAgICAubWFwKGVsZW1lbnQgPT4gQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCB7IHRvZ2dsZTogZmFsc2UgfSkpXG4gICAgfVxuXG4gICAgaWYgKGFjdGl2ZUNoaWxkcmVuLmxlbmd0aCAmJiBhY3RpdmVDaGlsZHJlblswXS5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzdGFydEV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPVylcbiAgICBpZiAoc3RhcnRFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFjdGl2ZUluc3RhbmNlIG9mIGFjdGl2ZUNoaWxkcmVuKSB7XG4gICAgICBhY3RpdmVJbnN0YW5jZS5oaWRlKClcbiAgICB9XG5cbiAgICBjb25zdCBkaW1lbnNpb24gPSB0aGlzLl9nZXREaW1lbnNpb24oKVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0UpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0lORylcblxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IDBcblxuICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0aGlzLl90cmlnZ2VyQXJyYXksIHRydWUpXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTSU5HKVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0UsIENMQVNTX05BTUVfU0hPVylcblxuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gJydcblxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04pXG4gICAgfVxuXG4gICAgY29uc3QgY2FwaXRhbGl6ZWREaW1lbnNpb24gPSBkaW1lbnNpb25bMF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSgxKVxuICAgIGNvbnN0IHNjcm9sbFNpemUgPSBgc2Nyb2xsJHtjYXBpdGFsaXplZERpbWVuc2lvbn1gXG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLl9lbGVtZW50LCB0cnVlKVxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IGAke3RoaXMuX2VsZW1lbnRbc2Nyb2xsU2l6ZV19cHhgXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICh0aGlzLl9pc1RyYW5zaXRpb25pbmcgfHwgIXRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREUpXG4gICAgaWYgKHN0YXJ0RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5fZ2V0RGltZW5zaW9uKClcblxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IGAke3RoaXMuX2VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZGltZW5zaW9uXX1weGBcblxuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQ09MTEFQU0lORylcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9DT0xMQVBTRSwgQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHRoaXMuX3RyaWdnZXJBcnJheSkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGdldEVsZW1lbnRGcm9tU2VsZWN0b3IodHJpZ2dlcilcblxuICAgICAgaWYgKGVsZW1lbnQgJiYgIXRoaXMuX2lzU2hvd24oZWxlbWVudCkpIHtcbiAgICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKFt0cmlnZ2VyXSwgZmFsc2UpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0lORylcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0NPTExBUFNFKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9ICcnXG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLl9lbGVtZW50LCB0cnVlKVxuICB9XG5cbiAgX2lzU2hvd24oZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQpIHtcbiAgICByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9TSE9XKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICBjb25maWcudG9nZ2xlID0gQm9vbGVhbihjb25maWcudG9nZ2xlKSAvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlc1xuICAgIGNvbmZpZy5wYXJlbnQgPSBnZXRFbGVtZW50KGNvbmZpZy5wYXJlbnQpXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2dldERpbWVuc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9IT1JJWk9OVEFMKSA/IFdJRFRIIDogSEVJR0hUXG4gIH1cblxuICBfaW5pdGlhbGl6ZUNoaWxkcmVuKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLnBhcmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLl9nZXRGaXJzdExldmVsQ2hpbGRyZW4oU0VMRUNUT1JfREFUQV9UT0dHTEUpXG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KVxuXG4gICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKFtlbGVtZW50XSwgdGhpcy5faXNTaG93bihzZWxlY3RlZCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2dldEZpcnN0TGV2ZWxDaGlsZHJlbihzZWxlY3Rvcikge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gU2VsZWN0b3JFbmdpbmUuZmluZChDTEFTU19OQU1FX0RFRVBFUl9DSElMRFJFTiwgdGhpcy5fY29uZmlnLnBhcmVudClcbiAgICAvLyByZW1vdmUgY2hpbGRyZW4gaWYgZ3JlYXRlciBkZXB0aFxuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yLCB0aGlzLl9jb25maWcucGFyZW50KS5maWx0ZXIoZWxlbWVudCA9PiAhY2hpbGRyZW4uaW5jbHVkZXMoZWxlbWVudCkpXG4gIH1cblxuICBfYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRyaWdnZXJBcnJheSwgaXNPcGVuKSB7XG4gICAgaWYgKCF0cmlnZ2VyQXJyYXkubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdHJpZ2dlckFycmF5KSB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoQ0xBU1NfTkFNRV9DT0xMQVBTRUQsICFpc09wZW4pXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIGlzT3BlbilcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICBjb25zdCBfY29uZmlnID0ge31cbiAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycgJiYgL3Nob3d8aGlkZS8udGVzdChjb25maWcpKSB7XG4gICAgICBfY29uZmlnLnRvZ2dsZSA9IGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBfY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVtjb25maWddKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIC8vIHByZXZlbnREZWZhdWx0IG9ubHkgZm9yIDxhPiBlbGVtZW50cyAod2hpY2ggY2hhbmdlIHRoZSBVUkwpIG5vdCBpbnNpZGUgdGhlIGNvbGxhcHNpYmxlIGVsZW1lbnRcbiAgaWYgKGV2ZW50LnRhcmdldC50YWdOYW1lID09PSAnQScgfHwgKGV2ZW50LmRlbGVnYXRlVGFyZ2V0ICYmIGV2ZW50LmRlbGVnYXRlVGFyZ2V0LnRhZ05hbWUgPT09ICdBJykpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cblxuICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yRnJvbUVsZW1lbnQodGhpcylcbiAgY29uc3Qgc2VsZWN0b3JFbGVtZW50cyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IpXG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHNlbGVjdG9yRWxlbWVudHMpIHtcbiAgICBDb2xsYXBzZS5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIHsgdG9nZ2xlOiBmYWxzZSB9KS50b2dnbGUoKVxuICB9XG59KVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihDb2xsYXBzZSlcblxuZXhwb3J0IGRlZmF1bHQgQ29sbGFwc2VcbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4wKTogZHJvcGRvd24uanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgKiBhcyBQb3BwZXIgZnJvbSAnQHBvcHBlcmpzL2NvcmUnXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGdldEVsZW1lbnQsXG4gIGdldE5leHRBY3RpdmVFbGVtZW50LFxuICBpc0Rpc2FibGVkLFxuICBpc0VsZW1lbnQsXG4gIGlzUlRMLFxuICBpc1Zpc2libGUsXG4gIG5vb3Bcbn0gZnJvbSAnLi91dGlsL2luZGV4J1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyJ1xuaW1wb3J0IE1hbmlwdWxhdG9yIGZyb20gJy4vZG9tL21hbmlwdWxhdG9yJ1xuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4vZG9tL3NlbGVjdG9yLWVuZ2luZSdcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdkcm9wZG93bidcbmNvbnN0IERBVEFfS0VZID0gJ2JzLmRyb3Bkb3duJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5cbmNvbnN0IEVTQ0FQRV9LRVkgPSAnRXNjYXBlJ1xuY29uc3QgVEFCX0tFWSA9ICdUYWInXG5jb25zdCBBUlJPV19VUF9LRVkgPSAnQXJyb3dVcCdcbmNvbnN0IEFSUk9XX0RPV05fS0VZID0gJ0Fycm93RG93bidcbmNvbnN0IFJJR0hUX01PVVNFX0JVVFRPTiA9IDIgLy8gTW91c2VFdmVudC5idXR0b24gdmFsdWUgZm9yIHRoZSBzZWNvbmRhcnkgYnV0dG9uLCB1c3VhbGx5IHRoZSByaWdodCBidXR0b25cblxuY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOX0RBVEFfQVBJID0gYGtleWRvd24ke0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlVUF9EQVRBX0FQSSA9IGBrZXl1cCR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcblxuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19OQU1FX0RST1BVUCA9ICdkcm9wdXAnXG5jb25zdCBDTEFTU19OQU1FX0RST1BFTkQgPSAnZHJvcGVuZCdcbmNvbnN0IENMQVNTX05BTUVfRFJPUFNUQVJUID0gJ2Ryb3BzdGFydCdcbmNvbnN0IENMQVNTX05BTUVfRFJPUFVQX0NFTlRFUiA9ICdkcm9wdXAtY2VudGVyJ1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QRE9XTl9DRU5URVIgPSAnZHJvcGRvd24tY2VudGVyJ1xuXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiXTpub3QoLmRpc2FibGVkKTpub3QoOmRpc2FibGVkKSdcbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFX1NIT1dOID0gYCR7U0VMRUNUT1JfREFUQV9UT0dHTEV9LiR7Q0xBU1NfTkFNRV9TSE9XfWBcbmNvbnN0IFNFTEVDVE9SX01FTlUgPSAnLmRyb3Bkb3duLW1lbnUnXG5jb25zdCBTRUxFQ1RPUl9OQVZCQVIgPSAnLm5hdmJhcidcbmNvbnN0IFNFTEVDVE9SX05BVkJBUl9OQVYgPSAnLm5hdmJhci1uYXYnXG5jb25zdCBTRUxFQ1RPUl9WSVNJQkxFX0lURU1TID0gJy5kcm9wZG93bi1tZW51IC5kcm9wZG93bi1pdGVtOm5vdCguZGlzYWJsZWQpOm5vdCg6ZGlzYWJsZWQpJ1xuXG5jb25zdCBQTEFDRU1FTlRfVE9QID0gaXNSVEwoKSA/ICd0b3AtZW5kJyA6ICd0b3Atc3RhcnQnXG5jb25zdCBQTEFDRU1FTlRfVE9QRU5EID0gaXNSVEwoKSA/ICd0b3Atc3RhcnQnIDogJ3RvcC1lbmQnXG5jb25zdCBQTEFDRU1FTlRfQk9UVE9NID0gaXNSVEwoKSA/ICdib3R0b20tZW5kJyA6ICdib3R0b20tc3RhcnQnXG5jb25zdCBQTEFDRU1FTlRfQk9UVE9NRU5EID0gaXNSVEwoKSA/ICdib3R0b20tc3RhcnQnIDogJ2JvdHRvbS1lbmQnXG5jb25zdCBQTEFDRU1FTlRfUklHSFQgPSBpc1JUTCgpID8gJ2xlZnQtc3RhcnQnIDogJ3JpZ2h0LXN0YXJ0J1xuY29uc3QgUExBQ0VNRU5UX0xFRlQgPSBpc1JUTCgpID8gJ3JpZ2h0LXN0YXJ0JyA6ICdsZWZ0LXN0YXJ0J1xuY29uc3QgUExBQ0VNRU5UX1RPUENFTlRFUiA9ICd0b3AnXG5jb25zdCBQTEFDRU1FTlRfQk9UVE9NQ0VOVEVSID0gJ2JvdHRvbSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYXV0b0Nsb3NlOiB0cnVlLFxuICBib3VuZGFyeTogJ2NsaXBwaW5nUGFyZW50cycsXG4gIGRpc3BsYXk6ICdkeW5hbWljJyxcbiAgb2Zmc2V0OiBbMCwgMl0sXG4gIHBvcHBlckNvbmZpZzogbnVsbCxcbiAgcmVmZXJlbmNlOiAndG9nZ2xlJ1xufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYXV0b0Nsb3NlOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIGJvdW5kYXJ5OiAnKHN0cmluZ3xlbGVtZW50KScsXG4gIGRpc3BsYXk6ICdzdHJpbmcnLFxuICBvZmZzZXQ6ICcoYXJyYXl8c3RyaW5nfGZ1bmN0aW9uKScsXG4gIHBvcHBlckNvbmZpZzogJyhudWxsfG9iamVjdHxmdW5jdGlvbiknLFxuICByZWZlcmVuY2U6ICcoc3RyaW5nfGVsZW1lbnR8b2JqZWN0KSdcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgRHJvcGRvd24gZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgdGhpcy5fcG9wcGVyID0gbnVsbFxuICAgIHRoaXMuX3BhcmVudCA9IHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZSAvLyBkcm9wZG93biB3cmFwcGVyXG4gICAgdGhpcy5fbWVudSA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfTUVOVSwgdGhpcy5fcGFyZW50KVxuICAgIHRoaXMuX2luTmF2YmFyID0gdGhpcy5fZGV0ZWN0TmF2YmFyKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Nob3duKCkgPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdygpXG4gIH1cblxuICBzaG93KCkge1xuICAgIGlmIChpc0Rpc2FibGVkKHRoaXMuX2VsZW1lbnQpIHx8IHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9XG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XLCByZWxhdGVkVGFyZ2V0KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9jcmVhdGVQb3BwZXIoKVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmICF0aGlzLl9wYXJlbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVJfTkFWKSkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5mb2N1cygpXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKVxuXG4gICAgdGhpcy5fbWVudS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOLCByZWxhdGVkVGFyZ2V0KVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzLl9lbGVtZW50KSB8fCAhdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgIH1cblxuICAgIHRoaXMuX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpXG4gICAgfVxuXG4gICAgc3VwZXIuZGlzcG9zZSgpXG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgdGhpcy5faW5OYXZiYXIgPSB0aGlzLl9kZXRlY3ROYXZiYXIoKVxuICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgIHRoaXMuX3BvcHBlci51cGRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSwgcmVsYXRlZFRhcmdldClcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSByZW1vdmUgdGhlIGV4dHJhXG4gICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB3ZSBhZGRlZCBmb3IgaU9TIHN1cHBvcnRcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKVxuICAgIH1cblxuICAgIHRoaXMuX21lbnUuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpXG4gICAgTWFuaXB1bGF0b3IucmVtb3ZlRGF0YUF0dHJpYnV0ZSh0aGlzLl9tZW51LCAncG9wcGVyJylcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4sIHJlbGF0ZWRUYXJnZXQpXG4gIH1cblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHN1cGVyLl9nZXRDb25maWcoY29uZmlnKVxuXG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmZXJlbmNlID09PSAnb2JqZWN0JyAmJiAhaXNFbGVtZW50KGNvbmZpZy5yZWZlcmVuY2UpICYmXG4gICAgICB0eXBlb2YgY29uZmlnLnJlZmVyZW5jZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIC8vIFBvcHBlciB2aXJ0dWFsIGVsZW1lbnRzIHJlcXVpcmUgYSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgbWV0aG9kXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke05BTUUudG9VcHBlckNhc2UoKX06IE9wdGlvbiBcInJlZmVyZW5jZVwiIHByb3ZpZGVkIHR5cGUgXCJvYmplY3RcIiB3aXRob3V0IGEgcmVxdWlyZWQgXCJnZXRCb3VuZGluZ0NsaWVudFJlY3RcIiBtZXRob2QuYClcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfY3JlYXRlUG9wcGVyKCkge1xuICAgIGlmICh0eXBlb2YgUG9wcGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwXFwncyBkcm9wZG93bnMgcmVxdWlyZSBQb3BwZXIgKGh0dHBzOi8vcG9wcGVyLmpzLm9yZyknKVxuICAgIH1cblxuICAgIGxldCByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fZWxlbWVudFxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UgPT09ICdwYXJlbnQnKSB7XG4gICAgICByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fcGFyZW50XG4gICAgfSBlbHNlIGlmIChpc0VsZW1lbnQodGhpcy5fY29uZmlnLnJlZmVyZW5jZSkpIHtcbiAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSBnZXRFbGVtZW50KHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UpXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5fY29uZmlnLnJlZmVyZW5jZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9jb25maWcucmVmZXJlbmNlXG4gICAgfVxuXG4gICAgY29uc3QgcG9wcGVyQ29uZmlnID0gdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKClcbiAgICB0aGlzLl9wb3BwZXIgPSBQb3BwZXIuY3JlYXRlUG9wcGVyKHJlZmVyZW5jZUVsZW1lbnQsIHRoaXMuX21lbnUsIHBvcHBlckNvbmZpZylcbiAgfVxuXG4gIF9pc1Nob3duKCkge1xuICAgIHJldHVybiB0aGlzLl9tZW51LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1cpXG4gIH1cblxuICBfZ2V0UGxhY2VtZW50KCkge1xuICAgIGNvbnN0IHBhcmVudERyb3Bkb3duID0gdGhpcy5fcGFyZW50XG5cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUEVORCkpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfUklHSFRcbiAgICB9XG5cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUFNUQVJUKSkge1xuICAgICAgcmV0dXJuIFBMQUNFTUVOVF9MRUZUXG4gICAgfVxuXG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BVUF9DRU5URVIpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX1RPUENFTlRFUlxuICAgIH1cblxuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRE9XTl9DRU5URVIpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX0JPVFRPTUNFTlRFUlxuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gdHJpbSB0aGUgdmFsdWUgYmVjYXVzZSBjdXN0b20gcHJvcGVydGllcyBjYW4gYWxzbyBpbmNsdWRlIHNwYWNlc1xuICAgIGNvbnN0IGlzRW5kID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9tZW51KS5nZXRQcm9wZXJ0eVZhbHVlKCctLWJzLXBvc2l0aW9uJykudHJpbSgpID09PSAnZW5kJ1xuXG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BVUCkpIHtcbiAgICAgIHJldHVybiBpc0VuZCA/IFBMQUNFTUVOVF9UT1BFTkQgOiBQTEFDRU1FTlRfVE9QXG4gICAgfVxuXG4gICAgcmV0dXJuIGlzRW5kID8gUExBQ0VNRU5UX0JPVFRPTUVORCA6IFBMQUNFTUVOVF9CT1RUT01cbiAgfVxuXG4gIF9kZXRlY3ROYXZiYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVIpICE9PSBudWxsXG4gIH1cblxuICBfZ2V0T2Zmc2V0KCkge1xuICAgIGNvbnN0IHsgb2Zmc2V0IH0gPSB0aGlzLl9jb25maWdcblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG9mZnNldC5zcGxpdCgnLCcpLm1hcCh2YWx1ZSA9PiBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHBvcHBlckRhdGEgPT4gb2Zmc2V0KHBvcHBlckRhdGEsIHRoaXMuX2VsZW1lbnQpXG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldFxuICB9XG5cbiAgX2dldFBvcHBlckNvbmZpZygpIHtcbiAgICBjb25zdCBkZWZhdWx0QnNQb3BwZXJDb25maWcgPSB7XG4gICAgICBwbGFjZW1lbnQ6IHRoaXMuX2dldFBsYWNlbWVudCgpLFxuICAgICAgbW9kaWZpZXJzOiBbe1xuICAgICAgICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGJvdW5kYXJ5OiB0aGlzLl9jb25maWcuYm91bmRhcnlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpXG4gICAgICAgIH1cbiAgICAgIH1dXG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSBQb3BwZXIgaWYgd2UgaGF2ZSBhIHN0YXRpYyBkaXNwbGF5IG9yIERyb3Bkb3duIGlzIGluIE5hdmJhclxuICAgIGlmICh0aGlzLl9pbk5hdmJhciB8fCB0aGlzLl9jb25maWcuZGlzcGxheSA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIE1hbmlwdWxhdG9yLnNldERhdGFBdHRyaWJ1dGUodGhpcy5fbWVudSwgJ3BvcHBlcicsICdzdGF0aWMnKSAvLyB0b2RvOnY2IHJlbW92ZVxuICAgICAgZGVmYXVsdEJzUG9wcGVyQ29uZmlnLm1vZGlmaWVycyA9IFt7XG4gICAgICAgIG5hbWU6ICdhcHBseVN0eWxlcycsXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICB9XVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWZhdWx0QnNQb3BwZXJDb25maWcsXG4gICAgICAuLi4odHlwZW9mIHRoaXMuX2NvbmZpZy5wb3BwZXJDb25maWcgPT09ICdmdW5jdGlvbicgPyB0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnKGRlZmF1bHRCc1BvcHBlckNvbmZpZykgOiB0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIF9zZWxlY3RNZW51SXRlbSh7IGtleSwgdGFyZ2V0IH0pIHtcbiAgICBjb25zdCBpdGVtcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfVklTSUJMRV9JVEVNUywgdGhpcy5fbWVudSkuZmlsdGVyKGVsZW1lbnQgPT4gaXNWaXNpYmxlKGVsZW1lbnQpKVxuXG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGlmIHRhcmdldCBpc24ndCBpbmNsdWRlZCBpbiBpdGVtcyAoZS5nLiB3aGVuIGV4cGFuZGluZyB0aGUgZHJvcGRvd24pXG4gICAgLy8gYWxsb3cgY3ljbGluZyB0byBnZXQgdGhlIGxhc3QgaXRlbSBpbiBjYXNlIGtleSBlcXVhbHMgQVJST1dfVVBfS0VZXG4gICAgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQoaXRlbXMsIHRhcmdldCwga2V5ID09PSBBUlJPV19ET1dOX0tFWSwgIWl0ZW1zLmluY2x1ZGVzKHRhcmdldCkpLmZvY3VzKClcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IERyb3Bkb3duLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgfSlcbiAgfVxuXG4gIHN0YXRpYyBjbGVhck1lbnVzKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gUklHSFRfTU9VU0VfQlVUVE9OIHx8IChldmVudC50eXBlID09PSAna2V5dXAnICYmIGV2ZW50LmtleSAhPT0gVEFCX0tFWSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG9wZW5Ub2dnbGVzID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TSE9XTilcblxuICAgIGZvciAoY29uc3QgdG9nZ2xlIG9mIG9wZW5Ub2dnbGVzKSB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gRHJvcGRvd24uZ2V0SW5zdGFuY2UodG9nZ2xlKVxuICAgICAgaWYgKCFjb250ZXh0IHx8IGNvbnRleHQuX2NvbmZpZy5hdXRvQ2xvc2UgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBvc2VkUGF0aCA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpXG4gICAgICBjb25zdCBpc01lbnVUYXJnZXQgPSBjb21wb3NlZFBhdGguaW5jbHVkZXMoY29udGV4dC5fbWVudSlcbiAgICAgIGlmIChcbiAgICAgICAgY29tcG9zZWRQYXRoLmluY2x1ZGVzKGNvbnRleHQuX2VsZW1lbnQpIHx8XG4gICAgICAgIChjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSAnaW5zaWRlJyAmJiAhaXNNZW51VGFyZ2V0KSB8fFxuICAgICAgICAoY29udGV4dC5fY29uZmlnLmF1dG9DbG9zZSA9PT0gJ291dHNpZGUnICYmIGlzTWVudVRhcmdldClcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBUYWIgbmF2aWdhdGlvbiB0aHJvdWdoIHRoZSBkcm9wZG93biBtZW51IG9yIGV2ZW50cyBmcm9tIGNvbnRhaW5lZCBpbnB1dHMgc2hvdWxkbid0IGNsb3NlIHRoZSBtZW51XG4gICAgICBpZiAoY29udGV4dC5fbWVudS5jb250YWlucyhldmVudC50YXJnZXQpICYmICgoZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC5rZXkgPT09IFRBQl9LRVkpIHx8IC9pbnB1dHxzZWxlY3R8b3B0aW9ufHRleHRhcmVhfGZvcm0vaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKSkpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IHsgcmVsYXRlZFRhcmdldDogY29udGV4dC5fZWxlbWVudCB9XG5cbiAgICAgIGlmIChldmVudC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQuY2xpY2tFdmVudCA9IGV2ZW50XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBkYXRhQXBpS2V5ZG93bkhhbmRsZXIoZXZlbnQpIHtcbiAgICAvLyBJZiBub3QgYW4gVVAgfCBET1dOIHwgRVNDQVBFIGtleSA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgLy8gSWYgaW5wdXQvdGV4dGFyZWEgJiYgaWYga2V5IGlzIG90aGVyIHRoYW4gRVNDQVBFID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcblxuICAgIGNvbnN0IGlzSW5wdXQgPSAvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKVxuICAgIGNvbnN0IGlzRXNjYXBlRXZlbnQgPSBldmVudC5rZXkgPT09IEVTQ0FQRV9LRVlcbiAgICBjb25zdCBpc1VwT3JEb3duRXZlbnQgPSBbQVJST1dfVVBfS0VZLCBBUlJPV19ET1dOX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KVxuXG4gICAgaWYgKCFpc1VwT3JEb3duRXZlbnQgJiYgIWlzRXNjYXBlRXZlbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpc0lucHV0ICYmICFpc0VzY2FwZUV2ZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICBjb25zdCBnZXRUb2dnbGVCdXR0b24gPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBldmVudC5kZWxlZ2F0ZVRhcmdldC5wYXJlbnROb2RlKVxuICAgIGNvbnN0IGluc3RhbmNlID0gRHJvcGRvd24uZ2V0T3JDcmVhdGVJbnN0YW5jZShnZXRUb2dnbGVCdXR0b24pXG5cbiAgICBpZiAoaXNVcE9yRG93bkV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgaW5zdGFuY2Uuc2hvdygpXG4gICAgICBpbnN0YW5jZS5fc2VsZWN0TWVudUl0ZW0oZXZlbnQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuX2lzU2hvd24oKSkgeyAvLyBlbHNlIGlzIGVzY2FwZSBhbmQgd2UgY2hlY2sgaWYgaXQgaXMgc2hvd25cbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICBpbnN0YW5jZS5oaWRlKClcbiAgICAgIGdldFRvZ2dsZUJ1dHRvbi5mb2N1cygpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBEcm9wZG93bi5kYXRhQXBpS2V5ZG93bkhhbmRsZXIpXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fREFUQV9BUEksIFNFTEVDVE9SX01FTlUsIERyb3Bkb3duLmRhdGFBcGlLZXlkb3duSGFuZGxlcilcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIERyb3Bkb3duLmNsZWFyTWVudXMpXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWVVQX0RBVEFfQVBJLCBEcm9wZG93bi5jbGVhck1lbnVzKVxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIERyb3Bkb3duLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcykudG9nZ2xlKClcbn0pXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKERyb3Bkb3duKVxuXG5leHBvcnQgZGVmYXVsdCBEcm9wZG93blxuIiwiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4yLjApOiB1dGlsL3Njcm9sbEJhci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuLi9kb20vc2VsZWN0b3ItZW5naW5lJ1xuaW1wb3J0IE1hbmlwdWxhdG9yIGZyb20gJy4uL2RvbS9tYW5pcHVsYXRvcidcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gJy4vaW5kZXgnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgU0VMRUNUT1JfRklYRURfQ09OVEVOVCA9ICcuZml4ZWQtdG9wLCAuZml4ZWQtYm90dG9tLCAuaXMtZml4ZWQsIC5zdGlja3ktdG9wJ1xuY29uc3QgU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQgPSAnLnN0aWNreS10b3AnXG5jb25zdCBQUk9QRVJUWV9QQURESU5HID0gJ3BhZGRpbmctcmlnaHQnXG5jb25zdCBQUk9QRVJUWV9NQVJHSU4gPSAnbWFyZ2luLXJpZ2h0J1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTY3JvbGxCYXJIZWxwZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuYm9keVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGdldFdpZHRoKCkge1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvaW5uZXJXaWR0aCN1c2FnZV9ub3Rlc1xuICAgIGNvbnN0IGRvY3VtZW50V2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGhcbiAgICByZXR1cm4gTWF0aC5hYnMod2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudFdpZHRoKVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMuZ2V0V2lkdGgoKVxuICAgIHRoaXMuX2Rpc2FibGVPdmVyRmxvdygpXG4gICAgLy8gZ2l2ZSBwYWRkaW5nIHRvIGVsZW1lbnQgdG8gYmFsYW5jZSB0aGUgaGlkZGVuIHNjcm9sbGJhciB3aWR0aFxuICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsIFBST1BFUlRZX1BBRERJTkcsIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgKyB3aWR0aClcbiAgICAvLyB0cmljazogV2UgYWRqdXN0IHBvc2l0aXZlIHBhZGRpbmdSaWdodCBhbmQgbmVnYXRpdmUgbWFyZ2luUmlnaHQgdG8gc3RpY2t5LXRvcCBlbGVtZW50cyB0byBrZWVwIHNob3dpbmcgZnVsbHdpZHRoXG4gICAgdGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfRklYRURfQ09OVEVOVCwgUFJPUEVSVFlfUEFERElORywgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSArIHdpZHRoKVxuICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX1NUSUNLWV9DT05URU5ULCBQUk9QRVJUWV9NQVJHSU4sIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgLSB3aWR0aClcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXModGhpcy5fZWxlbWVudCwgJ292ZXJmbG93JylcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsIFBST1BFUlRZX1BBRERJTkcpXG4gICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9GSVhFRF9DT05URU5ULCBQUk9QRVJUWV9QQURESU5HKVxuICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQsIFBST1BFUlRZX01BUkdJTilcbiAgfVxuXG4gIGlzT3ZlcmZsb3dpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V2lkdGgoKSA+IDBcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2Rpc2FibGVPdmVyRmxvdygpIHtcbiAgICB0aGlzLl9zYXZlSW5pdGlhbEF0dHJpYnV0ZSh0aGlzLl9lbGVtZW50LCAnb3ZlcmZsb3cnKVxuICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJ1xuICB9XG5cbiAgX3NldEVsZW1lbnRBdHRyaWJ1dGVzKHNlbGVjdG9yLCBzdHlsZVByb3BlcnR5LCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gdGhpcy5nZXRXaWR0aCgpXG4gICAgY29uc3QgbWFuaXB1bGF0aW9uQ2FsbEJhY2sgPSBlbGVtZW50ID0+IHtcbiAgICAgIGlmIChlbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50ICYmIHdpbmRvdy5pbm5lcldpZHRoID4gZWxlbWVudC5jbGllbnRXaWR0aCArIHNjcm9sbGJhcldpZHRoKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLl9zYXZlSW5pdGlhbEF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KVxuICAgICAgY29uc3QgY2FsY3VsYXRlZFZhbHVlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZVByb3BlcnR5KVxuICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZVByb3BlcnR5LCBgJHtjYWxsYmFjayhOdW1iZXIucGFyc2VGbG9hdChjYWxjdWxhdGVkVmFsdWUpKX1weGApXG4gICAgfVxuXG4gICAgdGhpcy5fYXBwbHlNYW5pcHVsYXRpb25DYWxsYmFjayhzZWxlY3RvciwgbWFuaXB1bGF0aW9uQ2FsbEJhY2spXG4gIH1cblxuICBfc2F2ZUluaXRpYWxBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gZWxlbWVudC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcGVydHkpXG4gICAgaWYgKGFjdHVhbFZhbHVlKSB7XG4gICAgICBNYW5pcHVsYXRvci5zZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHksIGFjdHVhbFZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIF9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHNlbGVjdG9yLCBzdHlsZVByb3BlcnR5KSB7XG4gICAgY29uc3QgbWFuaXB1bGF0aW9uQ2FsbEJhY2sgPSBlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KVxuICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHJlbW92ZSB0aGUgcHJvcGVydHkgaWYgdGhlIHZhbHVlIGlzIGBudWxsYDsgdGhlIHZhbHVlIGNhbiBhbHNvIGJlIHplcm9cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHN0eWxlUHJvcGVydHkpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBNYW5pcHVsYXRvci5yZW1vdmVEYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpXG4gICAgICBlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHN0eWxlUHJvcGVydHksIHZhbHVlKVxuICAgIH1cblxuICAgIHRoaXMuX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIG1hbmlwdWxhdGlvbkNhbGxCYWNrKVxuICB9XG5cbiAgX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIGNhbGxCYWNrKSB7XG4gICAgaWYgKGlzRWxlbWVudChzZWxlY3RvcikpIHtcbiAgICAgIGNhbGxCYWNrKHNlbGVjdG9yKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzZWwgb2YgU2VsZWN0b3JFbmdpbmUuZmluZChzZWxlY3RvciwgdGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIGNhbGxCYWNrKHNlbClcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2Nyb2xsQmFySGVscGVyXG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjIuMCk6IHV0aWwvYmFja2Ryb3AuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4uL2RvbS9ldmVudC1oYW5kbGVyJ1xuaW1wb3J0IHsgZXhlY3V0ZSwgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiwgZ2V0RWxlbWVudCwgcmVmbG93IH0gZnJvbSAnLi9pbmRleCdcbmltcG9ydCBDb25maWcgZnJvbSAnLi9jb25maWcnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdiYWNrZHJvcCdcbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBFVkVOVF9NT1VTRURPV04gPSBgbW91c2Vkb3duLmJzLiR7TkFNRX1gXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGNsYXNzTmFtZTogJ21vZGFsLWJhY2tkcm9wJyxcbiAgY2xpY2tDYWxsYmFjazogbnVsbCxcbiAgaXNBbmltYXRlZDogZmFsc2UsXG4gIGlzVmlzaWJsZTogdHJ1ZSwgLy8gaWYgZmFsc2UsIHdlIHVzZSB0aGUgYmFja2Ryb3AgaGVscGVyIHdpdGhvdXQgYWRkaW5nIGFueSBlbGVtZW50IHRvIHRoZSBkb21cbiAgcm9vdEVsZW1lbnQ6ICdib2R5JyAvLyBnaXZlIHRoZSBjaG9pY2UgdG8gcGxhY2UgYmFja2Ryb3AgdW5kZXIgZGlmZmVyZW50IGVsZW1lbnRzXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBjbGFzc05hbWU6ICdzdHJpbmcnLFxuICBjbGlja0NhbGxiYWNrOiAnKGZ1bmN0aW9ufG51bGwpJyxcbiAgaXNBbmltYXRlZDogJ2Jvb2xlYW4nLFxuICBpc1Zpc2libGU6ICdib29sZWFuJyxcbiAgcm9vdEVsZW1lbnQ6ICcoZWxlbWVudHxzdHJpbmcpJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBCYWNrZHJvcCBleHRlbmRzIENvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKVxuICAgIHRoaXMuX2lzQXBwZW5kZWQgPSBmYWxzZVxuICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIHNob3coY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5pc1Zpc2libGUpIHtcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9hcHBlbmQoKVxuXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2dldEVsZW1lbnQoKVxuICAgIGlmICh0aGlzLl9jb25maWcuaXNBbmltYXRlZCkge1xuICAgICAgcmVmbG93KGVsZW1lbnQpXG4gICAgfVxuXG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcblxuICAgIHRoaXMuX2VtdWxhdGVBbmltYXRpb24oKCkgPT4ge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICB9KVxuICB9XG5cbiAgaGlkZShjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fY29uZmlnLmlzVmlzaWJsZSkge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2dldEVsZW1lbnQoKS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcblxuICAgIHRoaXMuX2VtdWxhdGVBbmltYXRpb24oKCkgPT4ge1xuICAgICAgdGhpcy5kaXNwb3NlKClcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spXG4gICAgfSlcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0FwcGVuZGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRE9XTilcblxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKClcbiAgICB0aGlzLl9pc0FwcGVuZGVkID0gZmFsc2VcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2dldEVsZW1lbnQoKSB7XG4gICAgaWYgKCF0aGlzLl9lbGVtZW50KSB7XG4gICAgICBjb25zdCBiYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgICBiYWNrZHJvcC5jbGFzc05hbWUgPSB0aGlzLl9jb25maWcuY2xhc3NOYW1lXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQpIHtcbiAgICAgICAgYmFja2Ryb3AuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBiYWNrZHJvcFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9lbGVtZW50XG4gIH1cblxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICAvLyB1c2UgZ2V0RWxlbWVudCgpIHdpdGggdGhlIGRlZmF1bHQgXCJib2R5XCIgdG8gZ2V0IGEgZnJlc2ggRWxlbWVudCBvbiBlYWNoIGluc3RhbnRpYXRpb25cbiAgICBjb25maWcucm9vdEVsZW1lbnQgPSBnZXRFbGVtZW50KGNvbmZpZy5yb290RWxlbWVudClcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfYXBwZW5kKCkge1xuICAgIGlmICh0aGlzLl9pc0FwcGVuZGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZ2V0RWxlbWVudCgpXG4gICAgdGhpcy5fY29uZmlnLnJvb3RFbGVtZW50LmFwcGVuZChlbGVtZW50KVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKGVsZW1lbnQsIEVWRU5UX01PVVNFRE9XTiwgKCkgPT4ge1xuICAgICAgZXhlY3V0ZSh0aGlzLl9jb25maWcuY2xpY2tDYWxsYmFjaylcbiAgICB9KVxuXG4gICAgdGhpcy5faXNBcHBlbmRlZCA9IHRydWVcbiAgfVxuXG4gIF9lbXVsYXRlQW5pbWF0aW9uKGNhbGxiYWNrKSB7XG4gICAgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbihjYWxsYmFjaywgdGhpcy5fZ2V0RWxlbWVudCgpLCB0aGlzLl9jb25maWcuaXNBbmltYXRlZClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCYWNrZHJvcFxuIiwiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4yLjApOiB1dGlsL2ZvY3VzdHJhcC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi4vZG9tL2V2ZW50LWhhbmRsZXInXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZSdcbmltcG9ydCBDb25maWcgZnJvbSAnLi9jb25maWcnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdmb2N1c3RyYXAnXG5jb25zdCBEQVRBX0tFWSA9ICdicy5mb2N1c3RyYXAnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgRVZFTlRfRk9DVVNJTiA9IGBmb2N1c2luJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTl9UQUIgPSBga2V5ZG93bi50YWIke0VWRU5UX0tFWX1gXG5cbmNvbnN0IFRBQl9LRVkgPSAnVGFiJ1xuY29uc3QgVEFCX05BVl9GT1JXQVJEID0gJ2ZvcndhcmQnXG5jb25zdCBUQUJfTkFWX0JBQ0tXQVJEID0gJ2JhY2t3YXJkJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBhdXRvZm9jdXM6IHRydWUsXG4gIHRyYXBFbGVtZW50OiBudWxsIC8vIFRoZSBlbGVtZW50IHRvIHRyYXAgZm9jdXMgaW5zaWRlIG9mXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBhdXRvZm9jdXM6ICdib29sZWFuJyxcbiAgdHJhcEVsZW1lbnQ6ICdlbGVtZW50J1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBGb2N1c1RyYXAgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlXG4gICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IG51bGxcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgYWN0aXZhdGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLmF1dG9mb2N1cykge1xuICAgICAgdGhpcy5fY29uZmlnLnRyYXBFbGVtZW50LmZvY3VzKClcbiAgICB9XG5cbiAgICBFdmVudEhhbmRsZXIub2ZmKGRvY3VtZW50LCBFVkVOVF9LRVkpIC8vIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgZm9jdXMgbG9vcFxuICAgIEV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfRk9DVVNJTiwgZXZlbnQgPT4gdGhpcy5faGFuZGxlRm9jdXNpbihldmVudCkpXG4gICAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlET1dOX1RBQiwgZXZlbnQgPT4gdGhpcy5faGFuZGxlS2V5ZG93bihldmVudCkpXG5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWVcbiAgfVxuXG4gIGRlYWN0aXZhdGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZVxuICAgIEV2ZW50SGFuZGxlci5vZmYoZG9jdW1lbnQsIEVWRU5UX0tFWSlcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2hhbmRsZUZvY3VzaW4oZXZlbnQpIHtcbiAgICBjb25zdCB7IHRyYXBFbGVtZW50IH0gPSB0aGlzLl9jb25maWdcblxuICAgIGlmIChldmVudC50YXJnZXQgPT09IGRvY3VtZW50IHx8IGV2ZW50LnRhcmdldCA9PT0gdHJhcEVsZW1lbnQgfHwgdHJhcEVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHMgPSBTZWxlY3RvckVuZ2luZS5mb2N1c2FibGVDaGlsZHJlbih0cmFwRWxlbWVudClcblxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRyYXBFbGVtZW50LmZvY3VzKClcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2xhc3RUYWJOYXZEaXJlY3Rpb24gPT09IFRBQl9OQVZfQkFDS1dBUkQpIHtcbiAgICAgIGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdLmZvY3VzKClcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudHNbMF0uZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIF9oYW5kbGVLZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gVEFCX0tFWSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5ID8gVEFCX05BVl9CQUNLV0FSRCA6IFRBQl9OQVZfRk9SV0FSRFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZvY3VzVHJhcFxuIiwiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4yLjApOiBtb2RhbC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCB7IGRlZmluZUpRdWVyeVBsdWdpbiwgZ2V0RWxlbWVudEZyb21TZWxlY3RvciwgaXNSVEwsIGlzVmlzaWJsZSwgcmVmbG93IH0gZnJvbSAnLi91dGlsL2luZGV4J1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyJ1xuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4vZG9tL3NlbGVjdG9yLWVuZ2luZSdcbmltcG9ydCBTY3JvbGxCYXJIZWxwZXIgZnJvbSAnLi91dGlsL3Njcm9sbGJhcidcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQnXG5pbXBvcnQgQmFja2Ryb3AgZnJvbSAnLi91dGlsL2JhY2tkcm9wJ1xuaW1wb3J0IEZvY3VzVHJhcCBmcm9tICcuL3V0aWwvZm9jdXN0cmFwJ1xuaW1wb3J0IHsgZW5hYmxlRGlzbWlzc1RyaWdnZXIgfSBmcm9tICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ21vZGFsJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMubW9kYWwnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcbmNvbnN0IEVTQ0FQRV9LRVkgPSAnRXNjYXBlJ1xuXG5jb25zdCBFVkVOVF9ISURFID0gYGhpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURFX1BSRVZFTlRFRCA9IGBoaWRlUHJldmVudGVkJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfUkVTSVpFID0gYHJlc2l6ZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX01PVVNFRE9XTl9ESVNNSVNTID0gYG1vdXNlZG93bi5kaXNtaXNzJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTl9ESVNNSVNTID0gYGtleWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX09QRU4gPSAnbW9kYWwtb3BlbidcbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19OQU1FX1NUQVRJQyA9ICdtb2RhbC1zdGF0aWMnXG5cbmNvbnN0IE9QRU5fU0VMRUNUT1IgPSAnLm1vZGFsLnNob3cnXG5jb25zdCBTRUxFQ1RPUl9ESUFMT0cgPSAnLm1vZGFsLWRpYWxvZydcbmNvbnN0IFNFTEVDVE9SX01PREFMX0JPRFkgPSAnLm1vZGFsLWJvZHknXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiXSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGZvY3VzOiB0cnVlLFxuICBrZXlib2FyZDogdHJ1ZVxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYmFja2Ryb3A6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgZm9jdXM6ICdib29sZWFuJyxcbiAga2V5Ym9hcmQ6ICdib29sZWFuJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBNb2RhbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9kaWFsb2cgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0RJQUxPRywgdGhpcy5fZWxlbWVudClcbiAgICB0aGlzLl9iYWNrZHJvcCA9IHRoaXMuX2luaXRpYWxpemVCYWNrRHJvcCgpXG4gICAgdGhpcy5fZm9jdXN0cmFwID0gdGhpcy5faW5pdGlhbGl6ZUZvY3VzVHJhcCgpXG4gICAgdGhpcy5faXNTaG93biA9IGZhbHNlXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcbiAgICB0aGlzLl9zY3JvbGxCYXIgPSBuZXcgU2Nyb2xsQmFySGVscGVyKClcblxuICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy5faXNTaG93biA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KHJlbGF0ZWRUYXJnZXQpXG4gIH1cblxuICBzaG93KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICBpZiAodGhpcy5faXNTaG93biB8fCB0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1csIHtcbiAgICAgIHJlbGF0ZWRUYXJnZXRcbiAgICB9KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc1Nob3duID0gdHJ1ZVxuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWVcblxuICAgIHRoaXMuX3Njcm9sbEJhci5oaWRlKClcblxuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX09QRU4pXG5cbiAgICB0aGlzLl9hZGp1c3REaWFsb2coKVxuXG4gICAgdGhpcy5fYmFja2Ryb3Auc2hvdygoKSA9PiB0aGlzLl9zaG93RWxlbWVudChyZWxhdGVkVGFyZ2V0KSlcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc1Nob3duIHx8IHRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSlcblxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNTaG93biA9IGZhbHNlXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZVxuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKClcblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKCgpID0+IHRoaXMuX2hpZGVNb2RhbCgpLCB0aGlzLl9lbGVtZW50LCB0aGlzLl9pc0FuaW1hdGVkKCkpXG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIGZvciAoY29uc3QgaHRtbEVsZW1lbnQgb2YgW3dpbmRvdywgdGhpcy5fZGlhbG9nXSkge1xuICAgICAgRXZlbnRIYW5kbGVyLm9mZihodG1sRWxlbWVudCwgRVZFTlRfS0VZKVxuICAgIH1cblxuICAgIHRoaXMuX2JhY2tkcm9wLmRpc3Bvc2UoKVxuICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKClcbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIGhhbmRsZVVwZGF0ZSgpIHtcbiAgICB0aGlzLl9hZGp1c3REaWFsb2coKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaW5pdGlhbGl6ZUJhY2tEcm9wKCkge1xuICAgIHJldHVybiBuZXcgQmFja2Ryb3Aoe1xuICAgICAgaXNWaXNpYmxlOiBCb29sZWFuKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCksIC8vICdzdGF0aWMnIG9wdGlvbiB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8gdHJ1ZSwgYW5kIGJvb2xlYW5zIHdpbGwga2VlcCB0aGVpciB2YWx1ZSxcbiAgICAgIGlzQW5pbWF0ZWQ6IHRoaXMuX2lzQW5pbWF0ZWQoKVxuICAgIH0pXG4gIH1cblxuICBfaW5pdGlhbGl6ZUZvY3VzVHJhcCgpIHtcbiAgICByZXR1cm4gbmV3IEZvY3VzVHJhcCh7XG4gICAgICB0cmFwRWxlbWVudDogdGhpcy5fZWxlbWVudFxuICAgIH0pXG4gIH1cblxuICBfc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCkge1xuICAgIC8vIHRyeSB0byBhcHBlbmQgZHluYW1pYyBtb2RhbFxuICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyh0aGlzLl9lbGVtZW50KSkge1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQodGhpcy5fZWxlbWVudClcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snXG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJylcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcsIHRydWUpXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZGlhbG9nJylcbiAgICB0aGlzLl9lbGVtZW50LnNjcm9sbFRvcCA9IDBcblxuICAgIGNvbnN0IG1vZGFsQm9keSA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfTU9EQUxfQk9EWSwgdGhpcy5fZGlhbG9nKVxuICAgIGlmIChtb2RhbEJvZHkpIHtcbiAgICAgIG1vZGFsQm9keS5zY3JvbGxUb3AgPSAwXG4gICAgfVxuXG4gICAgcmVmbG93KHRoaXMuX2VsZW1lbnQpXG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgY29uc3QgdHJhbnNpdGlvbkNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5mb2N1cykge1xuICAgICAgICB0aGlzLl9mb2N1c3RyYXAuYWN0aXZhdGUoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04sIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKHRyYW5zaXRpb25Db21wbGV0ZSwgdGhpcy5fZGlhbG9nLCB0aGlzLl9pc0FuaW1hdGVkKCkpXG4gIH1cblxuICBfYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWURPV05fRElTTUlTUywgZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSAhPT0gRVNDQVBFX0tFWSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5rZXlib2FyZCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIHRoaXMuaGlkZSgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKClcbiAgICB9KVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfUkVTSVpFLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5faXNTaG93biAmJiAhdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgIHRoaXMuX2FkanVzdERpYWxvZygpXG4gICAgICB9XG4gICAgfSlcblxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRURPV05fRElTTUlTUywgZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gZXZlbnQuY3VycmVudFRhcmdldCkgeyAvLyBjbGljayBpcyBpbnNpZGUgbW9kYWwtZGlhbG9nXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLmJhY2tkcm9wID09PSAnc3RhdGljJykge1xuICAgICAgICB0aGlzLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcuYmFja2Ryb3ApIHtcbiAgICAgICAgdGhpcy5oaWRlKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgX2hpZGVNb2RhbCgpIHtcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCB0cnVlKVxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLW1vZGFsJylcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgncm9sZScpXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcblxuICAgIHRoaXMuX2JhY2tkcm9wLmhpZGUoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfT1BFTilcbiAgICAgIHRoaXMuX3Jlc2V0QWRqdXN0bWVudHMoKVxuICAgICAgdGhpcy5fc2Nyb2xsQmFyLnJlc2V0KClcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTilcbiAgICB9KVxuICB9XG5cbiAgX2lzQW5pbWF0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSlcbiAgfVxuXG4gIF90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCkge1xuICAgIGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREVfUFJFVkVOVEVEKVxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaXNNb2RhbE92ZXJmbG93aW5nID0gdGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0XG4gICAgY29uc3QgaW5pdGlhbE92ZXJmbG93WSA9IHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZXG4gICAgLy8gcmV0dXJuIGlmIHRoZSBmb2xsb3dpbmcgYmFja2dyb3VuZCB0cmFuc2l0aW9uIGhhc24ndCB5ZXQgY29tcGxldGVkXG4gICAgaWYgKGluaXRpYWxPdmVyZmxvd1kgPT09ICdoaWRkZW4nIHx8IHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU1RBVElDKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbidcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TVEFUSUMpXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TVEFUSUMpXG4gICAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSBpbml0aWFsT3ZlcmZsb3dZXG4gICAgICB9LCB0aGlzLl9kaWFsb2cpXG4gICAgfSwgdGhpcy5fZGlhbG9nKVxuXG4gICAgdGhpcy5fZWxlbWVudC5mb2N1cygpXG4gIH1cblxuICAvKipcbiAgICogVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIGhhbmRsZSBvdmVyZmxvd2luZyBtb2RhbHNcbiAgICovXG5cbiAgX2FkanVzdERpYWxvZygpIHtcbiAgICBjb25zdCBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHRcbiAgICBjb25zdCBzY3JvbGxiYXJXaWR0aCA9IHRoaXMuX3Njcm9sbEJhci5nZXRXaWR0aCgpXG4gICAgY29uc3QgaXNCb2R5T3ZlcmZsb3dpbmcgPSBzY3JvbGxiYXJXaWR0aCA+IDBcblxuICAgIGlmIChpc0JvZHlPdmVyZmxvd2luZyAmJiAhaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IGlzUlRMKCkgPyAncGFkZGluZ0xlZnQnIDogJ3BhZGRpbmdSaWdodCdcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbcHJvcGVydHldID0gYCR7c2Nyb2xsYmFyV2lkdGh9cHhgXG4gICAgfVxuXG4gICAgaWYgKCFpc0JvZHlPdmVyZmxvd2luZyAmJiBpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gaXNSVEwoKSA/ICdwYWRkaW5nUmlnaHQnIDogJ3BhZGRpbmdMZWZ0J1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtwcm9wZXJ0eV0gPSBgJHtzY3JvbGxiYXJXaWR0aH1weGBcbiAgICB9XG4gIH1cblxuICBfcmVzZXRBZGp1c3RtZW50cygpIHtcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0ID0gJydcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9ICcnXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcsIHJlbGF0ZWRUYXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10ocmVsYXRlZFRhcmdldClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IGdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcylcblxuICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG5cbiAgRXZlbnRIYW5kbGVyLm9uZSh0YXJnZXQsIEVWRU5UX1NIT1csIHNob3dFdmVudCA9PiB7XG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAvLyBvbmx5IHJlZ2lzdGVyIGZvY3VzIHJlc3RvcmVyIGlmIG1vZGFsIHdpbGwgYWN0dWFsbHkgZ2V0IHNob3duXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfSElEREVOLCAoKSA9PiB7XG4gICAgICBpZiAoaXNWaXNpYmxlKHRoaXMpKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG5cbiAgLy8gYXZvaWQgY29uZmxpY3Qgd2hlbiBjbGlja2luZyBtb2RhbCB0b2dnbGVyIHdoaWxlIGFub3RoZXIgb25lIGlzIG9wZW5cbiAgY29uc3QgYWxyZWFkeU9wZW4gPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKE9QRU5fU0VMRUNUT1IpXG4gIGlmIChhbHJlYWR5T3Blbikge1xuICAgIE1vZGFsLmdldEluc3RhbmNlKGFscmVhZHlPcGVuKS5oaWRlKClcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldClcblxuICBkYXRhLnRvZ2dsZSh0aGlzKVxufSlcblxuZW5hYmxlRGlzbWlzc1RyaWdnZXIoTW9kYWwpXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKE1vZGFsKVxuXG5leHBvcnQgZGVmYXVsdCBNb2RhbFxuIiwiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4yLjApOiBvZmZjYW52YXMuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGdldEVsZW1lbnRGcm9tU2VsZWN0b3IsXG4gIGlzRGlzYWJsZWQsXG4gIGlzVmlzaWJsZVxufSBmcm9tICcuL3V0aWwvaW5kZXgnXG5pbXBvcnQgU2Nyb2xsQmFySGVscGVyIGZyb20gJy4vdXRpbC9zY3JvbGxiYXInXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXInXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50J1xuaW1wb3J0IFNlbGVjdG9yRW5naW5lIGZyb20gJy4vZG9tL3NlbGVjdG9yLWVuZ2luZSdcbmltcG9ydCBCYWNrZHJvcCBmcm9tICcuL3V0aWwvYmFja2Ryb3AnXG5pbXBvcnQgRm9jdXNUcmFwIGZyb20gJy4vdXRpbC9mb2N1c3RyYXAnXG5pbXBvcnQgeyBlbmFibGVEaXNtaXNzVHJpZ2dlciB9IGZyb20gJy4vdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnb2ZmY2FudmFzJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMub2ZmY2FudmFzJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJID0gYGxvYWQke0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5jb25zdCBFU0NBUEVfS0VZID0gJ0VzY2FwZSdcblxuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19OQU1FX1NIT1dJTkcgPSAnc2hvd2luZydcbmNvbnN0IENMQVNTX05BTUVfSElESU5HID0gJ2hpZGluZydcbmNvbnN0IENMQVNTX05BTUVfQkFDS0RST1AgPSAnb2ZmY2FudmFzLWJhY2tkcm9wJ1xuY29uc3QgT1BFTl9TRUxFQ1RPUiA9ICcub2ZmY2FudmFzLnNob3cnXG5cbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElERV9QUkVWRU5URUQgPSBgaGlkZVByZXZlbnRlZCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9SRVNJWkUgPSBgcmVzaXplJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOX0RJU01JU1MgPSBga2V5ZG93bi5kaXNtaXNzJHtFVkVOVF9LRVl9YFxuXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJvZmZjYW52YXNcIl0nXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGJhY2tkcm9wOiB0cnVlLFxuICBrZXlib2FyZDogdHJ1ZSxcbiAgc2Nyb2xsOiBmYWxzZVxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYmFja2Ryb3A6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAga2V5Ym9hcmQ6ICdib29sZWFuJyxcbiAgc2Nyb2xsOiAnYm9vbGVhbidcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgT2ZmY2FudmFzIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZylcblxuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZVxuICAgIHRoaXMuX2JhY2tkcm9wID0gdGhpcy5faW5pdGlhbGl6ZUJhY2tEcm9wKClcbiAgICB0aGlzLl9mb2N1c3RyYXAgPSB0aGlzLl9pbml0aWFsaXplRm9jdXNUcmFwKClcbiAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdyhyZWxhdGVkVGFyZ2V0KVxuICB9XG5cbiAgc2hvdyhyZWxhdGVkVGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1csIHsgcmVsYXRlZFRhcmdldCB9KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc1Nob3duID0gdHJ1ZVxuICAgIHRoaXMuX2JhY2tkcm9wLnNob3coKVxuXG4gICAgaWYgKCF0aGlzLl9jb25maWcuc2Nyb2xsKSB7XG4gICAgICBuZXcgU2Nyb2xsQmFySGVscGVyKCkuaGlkZSgpXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCB0cnVlKVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2RpYWxvZycpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPV0lORylcblxuICAgIGNvbnN0IGNvbXBsZXRlQ2FsbEJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2NvbmZpZy5zY3JvbGwgfHwgdGhpcy5fY29uZmlnLmJhY2tkcm9wKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzdHJhcC5hY3RpdmF0ZSgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XSU5HKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfU0hPV04sIHsgcmVsYXRlZFRhcmdldCB9KVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGVDYWxsQmFjaywgdGhpcy5fZWxlbWVudCwgdHJ1ZSlcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc1Nob3duKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBoaWRlRXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFKVxuXG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9mb2N1c3RyYXAuZGVhY3RpdmF0ZSgpXG4gICAgdGhpcy5fZWxlbWVudC5ibHVyKClcbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2VcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9ISURJTkcpXG4gICAgdGhpcy5fYmFja2Ryb3AuaGlkZSgpXG5cbiAgICBjb25zdCBjb21wbGV0ZUNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVywgQ0xBU1NfTkFNRV9ISURJTkcpXG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1tb2RhbCcpXG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgncm9sZScpXG5cbiAgICAgIGlmICghdGhpcy5fY29uZmlnLnNjcm9sbCkge1xuICAgICAgICBuZXcgU2Nyb2xsQmFySGVscGVyKCkucmVzZXQoKVxuICAgICAgfVxuXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4pXG4gICAgfVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZUNhbGxiYWNrLCB0aGlzLl9lbGVtZW50LCB0cnVlKVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9iYWNrZHJvcC5kaXNwb3NlKClcbiAgICB0aGlzLl9mb2N1c3RyYXAuZGVhY3RpdmF0ZSgpXG4gICAgc3VwZXIuZGlzcG9zZSgpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplQmFja0Ryb3AoKSB7XG4gICAgY29uc3QgY2xpY2tDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcuYmFja2Ryb3AgPT09ICdzdGF0aWMnKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREVfUFJFVkVOVEVEKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcy5oaWRlKClcbiAgICB9XG5cbiAgICAvLyAnc3RhdGljJyBvcHRpb24gd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHRydWUsIGFuZCBib29sZWFucyB3aWxsIGtlZXAgdGhlaXIgdmFsdWVcbiAgICBjb25zdCBpc1Zpc2libGUgPSBCb29sZWFuKHRoaXMuX2NvbmZpZy5iYWNrZHJvcClcblxuICAgIHJldHVybiBuZXcgQmFja2Ryb3Aoe1xuICAgICAgY2xhc3NOYW1lOiBDTEFTU19OQU1FX0JBQ0tEUk9QLFxuICAgICAgaXNWaXNpYmxlLFxuICAgICAgaXNBbmltYXRlZDogdHJ1ZSxcbiAgICAgIHJvb3RFbGVtZW50OiB0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUsXG4gICAgICBjbGlja0NhbGxiYWNrOiBpc1Zpc2libGUgPyBjbGlja0NhbGxiYWNrIDogbnVsbFxuICAgIH0pXG4gIH1cblxuICBfaW5pdGlhbGl6ZUZvY3VzVHJhcCgpIHtcbiAgICByZXR1cm4gbmV3IEZvY3VzVHJhcCh7XG4gICAgICB0cmFwRWxlbWVudDogdGhpcy5fZWxlbWVudFxuICAgIH0pXG4gIH1cblxuICBfYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0tFWURPV05fRElTTUlTUywgZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSAhPT0gRVNDQVBFX0tFWSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERV9QUkVWRU5URUQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzLmhpZGUoKVxuICAgIH0pXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBPZmZjYW52YXMuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGFbY29uZmlnXSA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5zdGFydHNXaXRoKCdfJykgfHwgY29uZmlnID09PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKHRoaXMpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICBjb25zdCB0YXJnZXQgPSBnZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpXG5cbiAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIGlmIChpc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfSElEREVOLCAoKSA9PiB7XG4gICAgLy8gZm9jdXMgb24gdHJpZ2dlciB3aGVuIGl0IGlzIGNsb3NlZFxuICAgIGlmIChpc1Zpc2libGUodGhpcykpIHtcbiAgICAgIHRoaXMuZm9jdXMoKVxuICAgIH1cbiAgfSlcblxuICAvLyBhdm9pZCBjb25mbGljdCB3aGVuIGNsaWNraW5nIGEgdG9nZ2xlciBvZiBhbiBvZmZjYW52YXMsIHdoaWxlIGFub3RoZXIgaXMgb3BlblxuICBjb25zdCBhbHJlYWR5T3BlbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoT1BFTl9TRUxFQ1RPUilcbiAgaWYgKGFscmVhZHlPcGVuICYmIGFscmVhZHlPcGVuICE9PSB0YXJnZXQpIHtcbiAgICBPZmZjYW52YXMuZ2V0SW5zdGFuY2UoYWxyZWFkeU9wZW4pLmhpZGUoKVxuICB9XG5cbiAgY29uc3QgZGF0YSA9IE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldClcbiAgZGF0YS50b2dnbGUodGhpcylcbn0pXG5cbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEksICgpID0+IHtcbiAgZm9yIChjb25zdCBzZWxlY3RvciBvZiBTZWxlY3RvckVuZ2luZS5maW5kKE9QRU5fU0VMRUNUT1IpKSB7XG4gICAgT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2Uoc2VsZWN0b3IpLnNob3coKVxuICB9XG59KVxuXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9SRVNJWkUsICgpID0+IHtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIFNlbGVjdG9yRW5naW5lLmZpbmQoJ1thcmlhLW1vZGFsXVtjbGFzcyo9c2hvd11bY2xhc3MqPW9mZmNhbnZhcy1dJykpIHtcbiAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiAhPT0gJ2ZpeGVkJykge1xuICAgICAgT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCkuaGlkZSgpXG4gICAgfVxuICB9XG59KVxuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihPZmZjYW52YXMpXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKE9mZmNhbnZhcylcblxuZXhwb3J0IGRlZmF1bHQgT2ZmY2FudmFzXG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjIuMCk6IHV0aWwvc2FuaXRpemVyLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuY29uc3QgdXJpQXR0cmlidXRlcyA9IG5ldyBTZXQoW1xuICAnYmFja2dyb3VuZCcsXG4gICdjaXRlJyxcbiAgJ2hyZWYnLFxuICAnaXRlbXR5cGUnLFxuICAnbG9uZ2Rlc2MnLFxuICAncG9zdGVyJyxcbiAgJ3NyYycsXG4gICd4bGluazpocmVmJ1xuXSlcblxuY29uc3QgQVJJQV9BVFRSSUJVVEVfUEFUVEVSTiA9IC9eYXJpYS1bXFx3LV0qJC9pXG5cbi8qKlxuICogQSBwYXR0ZXJuIHRoYXQgcmVjb2duaXplcyBhIGNvbW1vbmx5IHVzZWZ1bCBzdWJzZXQgb2YgVVJMcyB0aGF0IGFyZSBzYWZlLlxuICpcbiAqIFNob3V0LW91dCB0byBBbmd1bGFyIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi8xMi4yLngvcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3VybF9zYW5pdGl6ZXIudHNcbiAqL1xuY29uc3QgU0FGRV9VUkxfUEFUVEVSTiA9IC9eKD86KD86aHR0cHM/fG1haWx0b3xmdHB8dGVsfGZpbGV8c21zKTp8W14jJi86P10qKD86WyMvP118JCkpL2lcblxuLyoqXG4gKiBBIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHNhZmUgZGF0YSBVUkxzLiBPbmx5IG1hdGNoZXMgaW1hZ2UsIHZpZGVvIGFuZCBhdWRpbyB0eXBlcy5cbiAqXG4gKiBTaG91dC1vdXQgdG8gQW5ndWxhciBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvMTIuMi54L3BhY2thZ2VzL2NvcmUvc3JjL3Nhbml0aXphdGlvbi91cmxfc2FuaXRpemVyLnRzXG4gKi9cbmNvbnN0IERBVEFfVVJMX1BBVFRFUk4gPSAvXmRhdGE6KD86aW1hZ2VcXC8oPzpibXB8Z2lmfGpwZWd8anBnfHBuZ3x0aWZmfHdlYnApfHZpZGVvXFwvKD86bXBlZ3xtcDR8b2dnfHdlYm0pfGF1ZGlvXFwvKD86bXAzfG9nYXxvZ2d8b3B1cykpO2Jhc2U2NCxbXFxkKy9hLXpdKz0qJC9pXG5cbmNvbnN0IGFsbG93ZWRBdHRyaWJ1dGUgPSAoYXR0cmlidXRlLCBhbGxvd2VkQXR0cmlidXRlTGlzdCkgPT4ge1xuICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKClcblxuICBpZiAoYWxsb3dlZEF0dHJpYnV0ZUxpc3QuaW5jbHVkZXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICBpZiAodXJpQXR0cmlidXRlcy5oYXMoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKFNBRkVfVVJMX1BBVFRFUk4udGVzdChhdHRyaWJ1dGUubm9kZVZhbHVlKSB8fCBEQVRBX1VSTF9QQVRURVJOLnRlc3QoYXR0cmlidXRlLm5vZGVWYWx1ZSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGEgcmVndWxhciBleHByZXNzaW9uIHZhbGlkYXRlcyB0aGUgYXR0cmlidXRlLlxuICByZXR1cm4gYWxsb3dlZEF0dHJpYnV0ZUxpc3QuZmlsdGVyKGF0dHJpYnV0ZVJlZ2V4ID0+IGF0dHJpYnV0ZVJlZ2V4IGluc3RhbmNlb2YgUmVnRXhwKVxuICAgIC5zb21lKHJlZ2V4ID0+IHJlZ2V4LnRlc3QoYXR0cmlidXRlTmFtZSkpXG59XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0QWxsb3dsaXN0ID0ge1xuICAvLyBHbG9iYWwgYXR0cmlidXRlcyBhbGxvd2VkIG9uIGFueSBzdXBwbGllZCBlbGVtZW50IGJlbG93LlxuICAnKic6IFsnY2xhc3MnLCAnZGlyJywgJ2lkJywgJ2xhbmcnLCAncm9sZScsIEFSSUFfQVRUUklCVVRFX1BBVFRFUk5dLFxuICBhOiBbJ3RhcmdldCcsICdocmVmJywgJ3RpdGxlJywgJ3JlbCddLFxuICBhcmVhOiBbXSxcbiAgYjogW10sXG4gIGJyOiBbXSxcbiAgY29sOiBbXSxcbiAgY29kZTogW10sXG4gIGRpdjogW10sXG4gIGVtOiBbXSxcbiAgaHI6IFtdLFxuICBoMTogW10sXG4gIGgyOiBbXSxcbiAgaDM6IFtdLFxuICBoNDogW10sXG4gIGg1OiBbXSxcbiAgaDY6IFtdLFxuICBpOiBbXSxcbiAgaW1nOiBbJ3NyYycsICdzcmNzZXQnLCAnYWx0JywgJ3RpdGxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICBsaTogW10sXG4gIG9sOiBbXSxcbiAgcDogW10sXG4gIHByZTogW10sXG4gIHM6IFtdLFxuICBzbWFsbDogW10sXG4gIHNwYW46IFtdLFxuICBzdWI6IFtdLFxuICBzdXA6IFtdLFxuICBzdHJvbmc6IFtdLFxuICB1OiBbXSxcbiAgdWw6IFtdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUh0bWwodW5zYWZlSHRtbCwgYWxsb3dMaXN0LCBzYW5pdGl6ZUZ1bmN0aW9uKSB7XG4gIGlmICghdW5zYWZlSHRtbC5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5zYWZlSHRtbFxuICB9XG5cbiAgaWYgKHNhbml0aXplRnVuY3Rpb24gJiYgdHlwZW9mIHNhbml0aXplRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2FuaXRpemVGdW5jdGlvbih1bnNhZmVIdG1sKVxuICB9XG5cbiAgY29uc3QgZG9tUGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKVxuICBjb25zdCBjcmVhdGVkRG9jdW1lbnQgPSBkb21QYXJzZXIucGFyc2VGcm9tU3RyaW5nKHVuc2FmZUh0bWwsICd0ZXh0L2h0bWwnKVxuICBjb25zdCBlbGVtZW50cyA9IFtdLmNvbmNhdCguLi5jcmVhdGVkRG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCcqJykpXG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgY29uc3QgZWxlbWVudE5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIGlmICghT2JqZWN0LmtleXMoYWxsb3dMaXN0KS5pbmNsdWRlcyhlbGVtZW50TmFtZSkpIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlKClcblxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVMaXN0ID0gW10uY29uY2F0KC4uLmVsZW1lbnQuYXR0cmlidXRlcylcbiAgICBjb25zdCBhbGxvd2VkQXR0cmlidXRlcyA9IFtdLmNvbmNhdChhbGxvd0xpc3RbJyonXSB8fCBbXSwgYWxsb3dMaXN0W2VsZW1lbnROYW1lXSB8fCBbXSlcblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZUxpc3QpIHtcbiAgICAgIGlmICghYWxsb3dlZEF0dHJpYnV0ZShhdHRyaWJ1dGUsIGFsbG93ZWRBdHRyaWJ1dGVzKSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUubm9kZU5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZWREb2N1bWVudC5ib2R5LmlubmVySFRNTFxufVxuIiwiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4yLjApOiB1dGlsL3RlbXBsYXRlLWZhY3RvcnkuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBEZWZhdWx0QWxsb3dsaXN0LCBzYW5pdGl6ZUh0bWwgfSBmcm9tICcuL3Nhbml0aXplcidcbmltcG9ydCB7IGdldEVsZW1lbnQsIGlzRWxlbWVudCB9IGZyb20gJy4uL3V0aWwvaW5kZXgnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZSdcbmltcG9ydCBDb25maWcgZnJvbSAnLi9jb25maWcnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdUZW1wbGF0ZUZhY3RvcnknXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGFsbG93TGlzdDogRGVmYXVsdEFsbG93bGlzdCxcbiAgY29udGVudDoge30sIC8vIHsgc2VsZWN0b3IgOiB0ZXh0ICwgIHNlbGVjdG9yMiA6IHRleHQyICwgfVxuICBleHRyYUNsYXNzOiAnJyxcbiAgaHRtbDogZmFsc2UsXG4gIHNhbml0aXplOiB0cnVlLFxuICBzYW5pdGl6ZUZuOiBudWxsLFxuICB0ZW1wbGF0ZTogJzxkaXY+PC9kaXY+J1xufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYWxsb3dMaXN0OiAnb2JqZWN0JyxcbiAgY29udGVudDogJ29iamVjdCcsXG4gIGV4dHJhQ2xhc3M6ICcoc3RyaW5nfGZ1bmN0aW9uKScsXG4gIGh0bWw6ICdib29sZWFuJyxcbiAgc2FuaXRpemU6ICdib29sZWFuJyxcbiAgc2FuaXRpemVGbjogJyhudWxsfGZ1bmN0aW9uKScsXG4gIHRlbXBsYXRlOiAnc3RyaW5nJ1xufVxuXG5jb25zdCBEZWZhdWx0Q29udGVudFR5cGUgPSB7XG4gIGVudHJ5OiAnKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9ufG51bGwpJyxcbiAgc2VsZWN0b3I6ICcoc3RyaW5nfGVsZW1lbnQpJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBUZW1wbGF0ZUZhY3RvcnkgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZ2V0Q29udGVudCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9jb25maWcuY29udGVudClcbiAgICAgIC5tYXAoY29uZmlnID0+IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKGNvbmZpZykpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gIH1cblxuICBoYXNDb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLmdldENvbnRlbnQoKS5sZW5ndGggPiAwXG4gIH1cblxuICBjaGFuZ2VDb250ZW50KGNvbnRlbnQpIHtcbiAgICB0aGlzLl9jaGVja0NvbnRlbnQoY29udGVudClcbiAgICB0aGlzLl9jb25maWcuY29udGVudCA9IHsgLi4udGhpcy5fY29uZmlnLmNvbnRlbnQsIC4uLmNvbnRlbnQgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICB0b0h0bWwoKSB7XG4gICAgY29uc3QgdGVtcGxhdGVXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICB0ZW1wbGF0ZVdyYXBwZXIuaW5uZXJIVE1MID0gdGhpcy5fbWF5YmVTYW5pdGl6ZSh0aGlzLl9jb25maWcudGVtcGxhdGUpXG5cbiAgICBmb3IgKGNvbnN0IFtzZWxlY3RvciwgdGV4dF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fY29uZmlnLmNvbnRlbnQpKSB7XG4gICAgICB0aGlzLl9zZXRDb250ZW50KHRlbXBsYXRlV3JhcHBlciwgdGV4dCwgc2VsZWN0b3IpXG4gICAgfVxuXG4gICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZVdyYXBwZXIuY2hpbGRyZW5bMF1cbiAgICBjb25zdCBleHRyYUNsYXNzID0gdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24odGhpcy5fY29uZmlnLmV4dHJhQ2xhc3MpXG5cbiAgICBpZiAoZXh0cmFDbGFzcykge1xuICAgICAgdGVtcGxhdGUuY2xhc3NMaXN0LmFkZCguLi5leHRyYUNsYXNzLnNwbGl0KCcgJykpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRlbXBsYXRlXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF90eXBlQ2hlY2tDb25maWcoY29uZmlnKSB7XG4gICAgc3VwZXIuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpXG4gICAgdGhpcy5fY2hlY2tDb250ZW50KGNvbmZpZy5jb250ZW50KVxuICB9XG5cbiAgX2NoZWNrQ29udGVudChhcmcpIHtcbiAgICBmb3IgKGNvbnN0IFtzZWxlY3RvciwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoYXJnKSkge1xuICAgICAgc3VwZXIuX3R5cGVDaGVja0NvbmZpZyh7IHNlbGVjdG9yLCBlbnRyeTogY29udGVudCB9LCBEZWZhdWx0Q29udGVudFR5cGUpXG4gICAgfVxuICB9XG5cbiAgX3NldENvbnRlbnQodGVtcGxhdGUsIGNvbnRlbnQsIHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdGVtcGxhdGVFbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvciwgdGVtcGxhdGUpXG5cbiAgICBpZiAoIXRlbXBsYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29udGVudCA9IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKGNvbnRlbnQpXG5cbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5yZW1vdmUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGlzRWxlbWVudChjb250ZW50KSkge1xuICAgICAgdGhpcy5fcHV0RWxlbWVudEluVGVtcGxhdGUoZ2V0RWxlbWVudChjb250ZW50KSwgdGVtcGxhdGVFbGVtZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5odG1sKSB7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy5fbWF5YmVTYW5pdGl6ZShjb250ZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGVtcGxhdGVFbGVtZW50LnRleHRDb250ZW50ID0gY29udGVudFxuICB9XG5cbiAgX21heWJlU2FuaXRpemUoYXJnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5zYW5pdGl6ZSA/IHNhbml0aXplSHRtbChhcmcsIHRoaXMuX2NvbmZpZy5hbGxvd0xpc3QsIHRoaXMuX2NvbmZpZy5zYW5pdGl6ZUZuKSA6IGFyZ1xuICB9XG5cbiAgX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nID8gYXJnKHRoaXMpIDogYXJnXG4gIH1cblxuICBfcHV0RWxlbWVudEluVGVtcGxhdGUoZWxlbWVudCwgdGVtcGxhdGVFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5odG1sKSB7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQuaW5uZXJIVE1MID0gJydcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5hcHBlbmQoZWxlbWVudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRlbXBsYXRlRWxlbWVudC50ZXh0Q29udGVudCA9IGVsZW1lbnQudGV4dENvbnRlbnRcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUZW1wbGF0ZUZhY3RvcnlcbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4wKTogdG9vbHRpcC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCAqIGFzIFBvcHBlciBmcm9tICdAcG9wcGVyanMvY29yZSdcbmltcG9ydCB7IGRlZmluZUpRdWVyeVBsdWdpbiwgZmluZFNoYWRvd1Jvb3QsIGdldEVsZW1lbnQsIGdldFVJRCwgaXNSVEwsIG5vb3AgfSBmcm9tICcuL3V0aWwvaW5kZXgnXG5pbXBvcnQgeyBEZWZhdWx0QWxsb3dsaXN0IH0gZnJvbSAnLi91dGlsL3Nhbml0aXplcidcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCBNYW5pcHVsYXRvciBmcm9tICcuL2RvbS9tYW5pcHVsYXRvcidcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQnXG5pbXBvcnQgVGVtcGxhdGVGYWN0b3J5IGZyb20gJy4vdXRpbC90ZW1wbGF0ZS1mYWN0b3J5J1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAndG9vbHRpcCdcbmNvbnN0IERJU0FMTE9XRURfQVRUUklCVVRFUyA9IG5ldyBTZXQoWydzYW5pdGl6ZScsICdhbGxvd0xpc3QnLCAnc2FuaXRpemVGbiddKVxuXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfTU9EQUwgPSAnbW9kYWwnXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcblxuY29uc3QgU0VMRUNUT1JfVE9PTFRJUF9JTk5FUiA9ICcudG9vbHRpcC1pbm5lcidcbmNvbnN0IFNFTEVDVE9SX01PREFMID0gYC4ke0NMQVNTX05BTUVfTU9EQUx9YFxuXG5jb25zdCBFVkVOVF9NT0RBTF9ISURFID0gJ2hpZGUuYnMubW9kYWwnXG5cbmNvbnN0IFRSSUdHRVJfSE9WRVIgPSAnaG92ZXInXG5jb25zdCBUUklHR0VSX0ZPQ1VTID0gJ2ZvY3VzJ1xuY29uc3QgVFJJR0dFUl9DTElDSyA9ICdjbGljaydcbmNvbnN0IFRSSUdHRVJfTUFOVUFMID0gJ21hbnVhbCdcblxuY29uc3QgRVZFTlRfSElERSA9ICdoaWRlJ1xuY29uc3QgRVZFTlRfSElEREVOID0gJ2hpZGRlbidcbmNvbnN0IEVWRU5UX1NIT1cgPSAnc2hvdydcbmNvbnN0IEVWRU5UX1NIT1dOID0gJ3Nob3duJ1xuY29uc3QgRVZFTlRfSU5TRVJURUQgPSAnaW5zZXJ0ZWQnXG5jb25zdCBFVkVOVF9DTElDSyA9ICdjbGljaydcbmNvbnN0IEVWRU5UX0ZPQ1VTSU4gPSAnZm9jdXNpbidcbmNvbnN0IEVWRU5UX0ZPQ1VTT1VUID0gJ2ZvY3Vzb3V0J1xuY29uc3QgRVZFTlRfTU9VU0VFTlRFUiA9ICdtb3VzZWVudGVyJ1xuY29uc3QgRVZFTlRfTU9VU0VMRUFWRSA9ICdtb3VzZWxlYXZlJ1xuXG5jb25zdCBBdHRhY2htZW50TWFwID0ge1xuICBBVVRPOiAnYXV0bycsXG4gIFRPUDogJ3RvcCcsXG4gIFJJR0hUOiBpc1JUTCgpID8gJ2xlZnQnIDogJ3JpZ2h0JyxcbiAgQk9UVE9NOiAnYm90dG9tJyxcbiAgTEVGVDogaXNSVEwoKSA/ICdyaWdodCcgOiAnbGVmdCdcbn1cblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYWxsb3dMaXN0OiBEZWZhdWx0QWxsb3dsaXN0LFxuICBhbmltYXRpb246IHRydWUsXG4gIGJvdW5kYXJ5OiAnY2xpcHBpbmdQYXJlbnRzJyxcbiAgY29udGFpbmVyOiBmYWxzZSxcbiAgY3VzdG9tQ2xhc3M6ICcnLFxuICBkZWxheTogMCxcbiAgZmFsbGJhY2tQbGFjZW1lbnRzOiBbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddLFxuICBodG1sOiBmYWxzZSxcbiAgb2Zmc2V0OiBbMCwgMF0sXG4gIHBsYWNlbWVudDogJ3RvcCcsXG4gIHBvcHBlckNvbmZpZzogbnVsbCxcbiAgc2FuaXRpemU6IHRydWUsXG4gIHNhbml0aXplRm46IG51bGwsXG4gIHNlbGVjdG9yOiBmYWxzZSxcbiAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwidG9vbHRpcFwiIHJvbGU9XCJ0b29sdGlwXCI+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInRvb2x0aXAtYXJyb3dcIj48L2Rpdj4nICtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwidG9vbHRpcC1pbm5lclwiPjwvZGl2PicgK1xuICAgICAgICAgICAgJzwvZGl2PicsXG4gIHRpdGxlOiAnJyxcbiAgdHJpZ2dlcjogJ2hvdmVyIGZvY3VzJ1xufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYWxsb3dMaXN0OiAnb2JqZWN0JyxcbiAgYW5pbWF0aW9uOiAnYm9vbGVhbicsXG4gIGJvdW5kYXJ5OiAnKHN0cmluZ3xlbGVtZW50KScsXG4gIGNvbnRhaW5lcjogJyhzdHJpbmd8ZWxlbWVudHxib29sZWFuKScsXG4gIGN1c3RvbUNsYXNzOiAnKHN0cmluZ3xmdW5jdGlvbiknLFxuICBkZWxheTogJyhudW1iZXJ8b2JqZWN0KScsXG4gIGZhbGxiYWNrUGxhY2VtZW50czogJ2FycmF5JyxcbiAgaHRtbDogJ2Jvb2xlYW4nLFxuICBvZmZzZXQ6ICcoYXJyYXl8c3RyaW5nfGZ1bmN0aW9uKScsXG4gIHBsYWNlbWVudDogJyhzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgcG9wcGVyQ29uZmlnOiAnKG51bGx8b2JqZWN0fGZ1bmN0aW9uKScsXG4gIHNhbml0aXplOiAnYm9vbGVhbicsXG4gIHNhbml0aXplRm46ICcobnVsbHxmdW5jdGlvbiknLFxuICBzZWxlY3RvcjogJyhzdHJpbmd8Ym9vbGVhbiknLFxuICB0ZW1wbGF0ZTogJ3N0cmluZycsXG4gIHRpdGxlOiAnKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKScsXG4gIHRyaWdnZXI6ICdzdHJpbmcnXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFRvb2x0aXAgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgaWYgKHR5cGVvZiBQb3BwZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb290c3RyYXBcXCdzIHRvb2x0aXBzIHJlcXVpcmUgUG9wcGVyIChodHRwczovL3BvcHBlci5qcy5vcmcpJylcbiAgICB9XG5cbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5faXNFbmFibGVkID0gdHJ1ZVxuICAgIHRoaXMuX3RpbWVvdXQgPSAwXG4gICAgdGhpcy5faXNIb3ZlcmVkID0gZmFsc2VcbiAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyID0ge31cbiAgICB0aGlzLl9wb3BwZXIgPSBudWxsXG4gICAgdGhpcy5fdGVtcGxhdGVGYWN0b3J5ID0gbnVsbFxuICAgIHRoaXMuX25ld0NvbnRlbnQgPSBudWxsXG5cbiAgICAvLyBQcm90ZWN0ZWRcbiAgICB0aGlzLnRpcCA9IG51bGxcblxuICAgIHRoaXMuX3NldExpc3RlbmVycygpXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIGVuYWJsZSgpIHtcbiAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlXG4gIH1cblxuICBkaXNhYmxlKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9IGZhbHNlXG4gIH1cblxuICB0b2dnbGVFbmFibGVkKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9ICF0aGlzLl9pc0VuYWJsZWRcbiAgfVxuXG4gIHRvZ2dsZShldmVudCkge1xuICAgIGlmICghdGhpcy5faXNFbmFibGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQpXG5cbiAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXIuY2xpY2sgPSAhY29udGV4dC5fYWN0aXZlVHJpZ2dlci5jbGlja1xuXG4gICAgICBpZiAoY29udGV4dC5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICAgIGNvbnRleHQuX2VudGVyKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHQuX2xlYXZlKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgdGhpcy5fbGVhdmUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZW50ZXIoKVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dClcblxuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudC5jbG9zZXN0KFNFTEVDVE9SX01PREFMKSwgRVZFTlRfTU9EQUxfSElERSwgdGhpcy5faGlkZU1vZGFsSGFuZGxlcilcblxuICAgIGlmICh0aGlzLnRpcCkge1xuICAgICAgdGhpcy50aXAucmVtb3ZlKClcbiAgICB9XG5cbiAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKClcbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSB1c2Ugc2hvdyBvbiB2aXNpYmxlIGVsZW1lbnRzJylcbiAgICB9XG5cbiAgICBpZiAoISh0aGlzLl9pc1dpdGhDb250ZW50KCkgJiYgdGhpcy5faXNFbmFibGVkKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfU0hPVykpXG4gICAgY29uc3Qgc2hhZG93Um9vdCA9IGZpbmRTaGFkb3dSb290KHRoaXMuX2VsZW1lbnQpXG4gICAgY29uc3QgaXNJblRoZURvbSA9IChzaGFkb3dSb290IHx8IHRoaXMuX2VsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmNvbnRhaW5zKHRoaXMuX2VsZW1lbnQpXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgIWlzSW5UaGVEb20pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHRvZG8gdjYgcmVtb3ZlIHRoaXMgT1IgbWFrZSBpdCBvcHRpb25hbFxuICAgIGlmICh0aGlzLnRpcCkge1xuICAgICAgdGhpcy50aXAucmVtb3ZlKClcbiAgICAgIHRoaXMudGlwID0gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IHRpcCA9IHRoaXMuX2dldFRpcEVsZW1lbnQoKVxuXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aXAuZ2V0QXR0cmlidXRlKCdpZCcpKVxuXG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHRoaXMuX2NvbmZpZ1xuXG4gICAgaWYgKCF0aGlzLl9lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKHRoaXMudGlwKSkge1xuICAgICAgY29udGFpbmVyLmFwcGVuZCh0aXApXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9JTlNFUlRFRCkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLnVwZGF0ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3BvcHBlciA9IHRoaXMuX2NyZWF0ZVBvcHBlcih0aXApXG4gICAgfVxuXG4gICAgdGlwLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbihlbGVtZW50LCAnbW91c2VvdmVyJywgbm9vcClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHByZXZpb3VzSG92ZXJTdGF0ZSA9IHRoaXMuX2lzSG92ZXJlZFxuXG4gICAgICB0aGlzLl9pc0hvdmVyZWQgPSBmYWxzZVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfU0hPV04pKVxuXG4gICAgICBpZiAocHJldmlvdXNIb3ZlclN0YXRlKSB7XG4gICAgICAgIHRoaXMuX2xlYXZlKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLnRpcCwgdGhpcy5faXNBbmltYXRlZCgpKVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfSElERSkpXG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0aXAgPSB0aGlzLl9nZXRUaXBFbGVtZW50KClcbiAgICB0aXAuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgd2UgYWRkZWQgZm9yIGlPUyBzdXBwb3J0XG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9DTElDS10gPSBmYWxzZVxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9GT0NVU10gPSBmYWxzZVxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9IT1ZFUl0gPSBmYWxzZVxuICAgIHRoaXMuX2lzSG92ZXJlZCA9IGZhbHNlXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5faXNIb3ZlcmVkKSB7XG4gICAgICAgIHRpcC5yZW1vdmUoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9ISURERU4pKVxuXG4gICAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKClcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLnRpcCwgdGhpcy5faXNBbmltYXRlZCgpKVxuICB9XG5cbiAgdXBkYXRlKCkge1xuICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgIHRoaXMuX3BvcHBlci51cGRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIFByb3RlY3RlZFxuICBfaXNXaXRoQ29udGVudCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9nZXRUaXRsZSgpKVxuICB9XG5cbiAgX2dldFRpcEVsZW1lbnQoKSB7XG4gICAgaWYgKCF0aGlzLnRpcCkge1xuICAgICAgdGhpcy50aXAgPSB0aGlzLl9jcmVhdGVUaXBFbGVtZW50KHRoaXMuX25ld0NvbnRlbnQgfHwgdGhpcy5fZ2V0Q29udGVudEZvclRlbXBsYXRlKCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudGlwXG4gIH1cblxuICBfY3JlYXRlVGlwRWxlbWVudChjb250ZW50KSB7XG4gICAgY29uc3QgdGlwID0gdGhpcy5fZ2V0VGVtcGxhdGVGYWN0b3J5KGNvbnRlbnQpLnRvSHRtbCgpXG5cbiAgICAvLyB0b2RvOiByZW1vdmUgdGhpcyBjaGVjayBvbiB2NlxuICAgIGlmICghdGlwKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHRpcC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfRkFERSwgQ0xBU1NfTkFNRV9TSE9XKVxuICAgIC8vIHRvZG86IG9uIHY2IHRoZSBmb2xsb3dpbmcgY2FuIGJlIGFjaGlldmVkIHdpdGggQ1NTIG9ubHlcbiAgICB0aXAuY2xhc3NMaXN0LmFkZChgYnMtJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9LWF1dG9gKVxuXG4gICAgY29uc3QgdGlwSWQgPSBnZXRVSUQodGhpcy5jb25zdHJ1Y3Rvci5OQU1FKS50b1N0cmluZygpXG5cbiAgICB0aXAuc2V0QXR0cmlidXRlKCdpZCcsIHRpcElkKVxuXG4gICAgaWYgKHRoaXMuX2lzQW5pbWF0ZWQoKSkge1xuICAgICAgdGlwLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9GQURFKVxuICAgIH1cblxuICAgIHJldHVybiB0aXBcbiAgfVxuXG4gIHNldENvbnRlbnQoY29udGVudCkge1xuICAgIHRoaXMuX25ld0NvbnRlbnQgPSBjb250ZW50XG4gICAgaWYgKHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpXG4gICAgICB0aGlzLnNob3coKVxuICAgIH1cbiAgfVxuXG4gIF9nZXRUZW1wbGF0ZUZhY3RvcnkoY29udGVudCkge1xuICAgIGlmICh0aGlzLl90ZW1wbGF0ZUZhY3RvcnkpIHtcbiAgICAgIHRoaXMuX3RlbXBsYXRlRmFjdG9yeS5jaGFuZ2VDb250ZW50KGNvbnRlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3RlbXBsYXRlRmFjdG9yeSA9IG5ldyBUZW1wbGF0ZUZhY3Rvcnkoe1xuICAgICAgICAuLi50aGlzLl9jb25maWcsXG4gICAgICAgIC8vIHRoZSBgY29udGVudGAgdmFyIGhhcyB0byBiZSBhZnRlciBgdGhpcy5fY29uZmlnYFxuICAgICAgICAvLyB0byBvdmVycmlkZSBjb25maWcuY29udGVudCBpbiBjYXNlIG9mIHBvcG92ZXJcbiAgICAgICAgY29udGVudCxcbiAgICAgICAgZXh0cmFDbGFzczogdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24odGhpcy5fY29uZmlnLmN1c3RvbUNsYXNzKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVGYWN0b3J5XG4gIH1cblxuICBfZ2V0Q29udGVudEZvclRlbXBsYXRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBbU0VMRUNUT1JfVE9PTFRJUF9JTk5FUl06IHRoaXMuX2dldFRpdGxlKClcbiAgICB9XG4gIH1cblxuICBfZ2V0VGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKHRoaXMuX2NvbmZpZy50aXRsZSkgfHwgdGhpcy5fY29uZmlnLm9yaWdpbmFsVGl0bGVcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudCkge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLmdldE9yQ3JlYXRlSW5zdGFuY2UoZXZlbnQuZGVsZWdhdGVUYXJnZXQsIHRoaXMuX2dldERlbGVnYXRlQ29uZmlnKCkpXG4gIH1cblxuICBfaXNBbmltYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLmFuaW1hdGlvbiB8fCAodGhpcy50aXAgJiYgdGhpcy50aXAuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSkpXG4gIH1cblxuICBfaXNTaG93bigpIHtcbiAgICByZXR1cm4gdGhpcy50aXAgJiYgdGhpcy50aXAuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVylcbiAgfVxuXG4gIF9jcmVhdGVQb3BwZXIodGlwKSB7XG4gICAgY29uc3QgcGxhY2VtZW50ID0gdHlwZW9mIHRoaXMuX2NvbmZpZy5wbGFjZW1lbnQgPT09ICdmdW5jdGlvbicgP1xuICAgICAgdGhpcy5fY29uZmlnLnBsYWNlbWVudC5jYWxsKHRoaXMsIHRpcCwgdGhpcy5fZWxlbWVudCkgOlxuICAgICAgdGhpcy5fY29uZmlnLnBsYWNlbWVudFxuICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBBdHRhY2htZW50TWFwW3BsYWNlbWVudC50b1VwcGVyQ2FzZSgpXVxuICAgIHJldHVybiBQb3BwZXIuY3JlYXRlUG9wcGVyKHRoaXMuX2VsZW1lbnQsIHRpcCwgdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKGF0dGFjaG1lbnQpKVxuICB9XG5cbiAgX2dldE9mZnNldCgpIHtcbiAgICBjb25zdCB7IG9mZnNldCB9ID0gdGhpcy5fY29uZmlnXG5cbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBvZmZzZXQuc3BsaXQoJywnKS5tYXAodmFsdWUgPT4gTnVtYmVyLnBhcnNlSW50KHZhbHVlLCAxMCkpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBwb3BwZXJEYXRhID0+IG9mZnNldChwb3BwZXJEYXRhLCB0aGlzLl9lbGVtZW50KVxuICAgIH1cblxuICAgIHJldHVybiBvZmZzZXRcbiAgfVxuXG4gIF9yZXNvbHZlUG9zc2libGVGdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJyA/IGFyZy5jYWxsKHRoaXMuX2VsZW1lbnQpIDogYXJnXG4gIH1cblxuICBfZ2V0UG9wcGVyQ29uZmlnKGF0dGFjaG1lbnQpIHtcbiAgICBjb25zdCBkZWZhdWx0QnNQb3BwZXJDb25maWcgPSB7XG4gICAgICBwbGFjZW1lbnQ6IGF0dGFjaG1lbnQsXG4gICAgICBtb2RpZmllcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdmbGlwJyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBmYWxsYmFja1BsYWNlbWVudHM6IHRoaXMuX2NvbmZpZy5mYWxsYmFja1BsYWNlbWVudHNcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgYm91bmRhcnk6IHRoaXMuX2NvbmZpZy5ib3VuZGFyeVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdhcnJvdycsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgZWxlbWVudDogYC4ke3RoaXMuY29uc3RydWN0b3IuTkFNRX0tYXJyb3dgXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3ByZVNldFBsYWNlbWVudCcsXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBwaGFzZTogJ2JlZm9yZU1haW4nLFxuICAgICAgICAgIGZuOiBkYXRhID0+IHtcbiAgICAgICAgICAgIC8vIFByZS1zZXQgUG9wcGVyJ3MgcGxhY2VtZW50IGF0dHJpYnV0ZSBpbiBvcmRlciB0byByZWFkIHRoZSBhcnJvdyBzaXplcyBwcm9wZXJseS5cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgUG9wcGVyIG1peGVzIHVwIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRpbWVuc2lvbnMgc2luY2UgdGhlIGluaXRpYWwgYXJyb3cgc3R5bGUgaXMgZm9yIHRvcCBwbGFjZW1lbnRcbiAgICAgICAgICAgIHRoaXMuX2dldFRpcEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCcsIGRhdGEuc3RhdGUucGxhY2VtZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWZhdWx0QnNQb3BwZXJDb25maWcsXG4gICAgICAuLi4odHlwZW9mIHRoaXMuX2NvbmZpZy5wb3BwZXJDb25maWcgPT09ICdmdW5jdGlvbicgPyB0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnKGRlZmF1bHRCc1BvcHBlckNvbmZpZykgOiB0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIF9zZXRMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSB0aGlzLl9jb25maWcudHJpZ2dlci5zcGxpdCgnICcpXG5cbiAgICBmb3IgKGNvbnN0IHRyaWdnZXIgb2YgdHJpZ2dlcnMpIHtcbiAgICAgIGlmICh0cmlnZ2VyID09PSAnY2xpY2snKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9DTElDSyksIHRoaXMuX2NvbmZpZy5zZWxlY3RvciwgZXZlbnQgPT4gdGhpcy50b2dnbGUoZXZlbnQpKVxuICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyICE9PSBUUklHR0VSX01BTlVBTCkge1xuICAgICAgICBjb25zdCBldmVudEluID0gdHJpZ2dlciA9PT0gVFJJR0dFUl9IT1ZFUiA/XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfTU9VU0VFTlRFUikgOlxuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0ZPQ1VTSU4pXG4gICAgICAgIGNvbnN0IGV2ZW50T3V0ID0gdHJpZ2dlciA9PT0gVFJJR0dFUl9IT1ZFUiA/XG4gICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfTU9VU0VMRUFWRSkgOlxuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX0ZPQ1VTT1VUKVxuXG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBldmVudEluLCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KVxuICAgICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXJbZXZlbnQudHlwZSA9PT0gJ2ZvY3VzaW4nID8gVFJJR0dFUl9GT0NVUyA6IFRSSUdHRVJfSE9WRVJdID0gdHJ1ZVxuICAgICAgICAgIGNvbnRleHQuX2VudGVyKClcbiAgICAgICAgfSlcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIGV2ZW50T3V0LCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KVxuICAgICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXJbZXZlbnQudHlwZSA9PT0gJ2ZvY3Vzb3V0JyA/IFRSSUdHRVJfRk9DVVMgOiBUUklHR0VSX0hPVkVSXSA9XG4gICAgICAgICAgICBjb250ZXh0Ll9lbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpXG5cbiAgICAgICAgICBjb250ZXh0Ll9sZWF2ZSgpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5faGlkZU1vZGFsSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgIHRoaXMuaGlkZSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9NT0RBTCksIEVWRU5UX01PREFMX0hJREUsIHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpXG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnNlbGVjdG9yKSB7XG4gICAgICB0aGlzLl9jb25maWcgPSB7XG4gICAgICAgIC4uLnRoaXMuX2NvbmZpZyxcbiAgICAgICAgdHJpZ2dlcjogJ21hbnVhbCcsXG4gICAgICAgIHNlbGVjdG9yOiAnJ1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9maXhUaXRsZSgpXG4gICAgfVxuICB9XG5cbiAgX2ZpeFRpdGxlKCkge1xuICAgIGNvbnN0IHRpdGxlID0gdGhpcy5fY29uZmlnLm9yaWdpbmFsVGl0bGVcblxuICAgIGlmICghdGl0bGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5fZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSAmJiAhdGhpcy5fZWxlbWVudC50ZXh0Q29udGVudC50cmltKCkpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdGl0bGUpXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3RpdGxlJylcbiAgfVxuXG4gIF9lbnRlcigpIHtcbiAgICBpZiAodGhpcy5faXNTaG93bigpIHx8IHRoaXMuX2lzSG92ZXJlZCkge1xuICAgICAgdGhpcy5faXNIb3ZlcmVkID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNIb3ZlcmVkID0gdHJ1ZVxuXG4gICAgdGhpcy5fc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5faXNIb3ZlcmVkKSB7XG4gICAgICAgIHRoaXMuc2hvdygpXG4gICAgICB9XG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5LnNob3cpXG4gIH1cblxuICBfbGVhdmUoKSB7XG4gICAgaWYgKHRoaXMuX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNIb3ZlcmVkID0gZmFsc2VcblxuICAgIHRoaXMuX3NldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5oaWRlKClcbiAgICAgIH1cbiAgICB9LCB0aGlzLl9jb25maWcuZGVsYXkuaGlkZSlcbiAgfVxuXG4gIF9zZXRUaW1lb3V0KGhhbmRsZXIsIHRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dClcbiAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dChoYW5kbGVyLCB0aW1lb3V0KVxuICB9XG5cbiAgX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fYWN0aXZlVHJpZ2dlcikuaW5jbHVkZXModHJ1ZSlcbiAgfVxuXG4gIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgY29uc3QgZGF0YUF0dHJpYnV0ZXMgPSBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlcyh0aGlzLl9lbGVtZW50KVxuXG4gICAgZm9yIChjb25zdCBkYXRhQXR0cmlidXRlIG9mIE9iamVjdC5rZXlzKGRhdGFBdHRyaWJ1dGVzKSkge1xuICAgICAgaWYgKERJU0FMTE9XRURfQVRUUklCVVRFUy5oYXMoZGF0YUF0dHJpYnV0ZSkpIHtcbiAgICAgICAgZGVsZXRlIGRhdGFBdHRyaWJ1dGVzW2RhdGFBdHRyaWJ1dGVdXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uZmlnID0ge1xuICAgICAgLi4uZGF0YUF0dHJpYnV0ZXMsXG4gICAgICAuLi4odHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiYgY29uZmlnID8gY29uZmlnIDoge30pXG4gICAgfVxuICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZylcbiAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZylcbiAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKVxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIGNvbmZpZy5jb250YWluZXIgPSBjb25maWcuY29udGFpbmVyID09PSBmYWxzZSA/IGRvY3VtZW50LmJvZHkgOiBnZXRFbGVtZW50KGNvbmZpZy5jb250YWluZXIpXG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5kZWxheSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbmZpZy5kZWxheSA9IHtcbiAgICAgICAgc2hvdzogY29uZmlnLmRlbGF5LFxuICAgICAgICBoaWRlOiBjb25maWcuZGVsYXlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25maWcub3JpZ2luYWxUaXRsZSA9IHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpIHx8ICcnXG4gICAgaWYgKHR5cGVvZiBjb25maWcudGl0bGUgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25maWcudGl0bGUgPSBjb25maWcudGl0bGUudG9TdHJpbmcoKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29uZmlnLmNvbnRlbnQgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25maWcuY29udGVudCA9IGNvbmZpZy5jb250ZW50LnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfZ2V0RGVsZWdhdGVDb25maWcoKSB7XG4gICAgY29uc3QgY29uZmlnID0ge31cblxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuX2NvbmZpZykge1xuICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtrZXldICE9PSB0aGlzLl9jb25maWdba2V5XSkge1xuICAgICAgICBjb25maWdba2V5XSA9IHRoaXMuX2NvbmZpZ1trZXldXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW4gdGhlIGZ1dHVyZSBjYW4gYmUgcmVwbGFjZWQgd2l0aDpcbiAgICAvLyBjb25zdCBrZXlzV2l0aERpZmZlcmVudFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZykuZmlsdGVyKGVudHJ5ID0+IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtlbnRyeVswXV0gIT09IHRoaXMuX2NvbmZpZ1tlbnRyeVswXV0pXG4gICAgLy8gYE9iamVjdC5mcm9tRW50cmllcyhrZXlzV2l0aERpZmZlcmVudFZhbHVlcylgXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2Rpc3Bvc2VQb3BwZXIoKSB7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKVxuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRvb2x0aXAuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRvb2x0aXApXG5cbmV4cG9ydCBkZWZhdWx0IFRvb2x0aXBcbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4wKTogcG9wb3Zlci5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCB7IGRlZmluZUpRdWVyeVBsdWdpbiB9IGZyb20gJy4vdXRpbC9pbmRleCdcbmltcG9ydCBUb29sdGlwIGZyb20gJy4vdG9vbHRpcCdcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ3BvcG92ZXInXG5cbmNvbnN0IFNFTEVDVE9SX1RJVExFID0gJy5wb3BvdmVyLWhlYWRlcidcbmNvbnN0IFNFTEVDVE9SX0NPTlRFTlQgPSAnLnBvcG92ZXItYm9keSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgLi4uVG9vbHRpcC5EZWZhdWx0LFxuICBjb250ZW50OiAnJyxcbiAgb2Zmc2V0OiBbMCwgOF0sXG4gIHBsYWNlbWVudDogJ3JpZ2h0JyxcbiAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwicG9wb3ZlclwiIHJvbGU9XCJ0b29sdGlwXCI+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJwb3BvdmVyLWFycm93XCI+PC9kaXY+JyArXG4gICAgJzxoMyBjbGFzcz1cInBvcG92ZXItaGVhZGVyXCI+PC9oMz4nICtcbiAgICAnPGRpdiBjbGFzcz1cInBvcG92ZXItYm9keVwiPjwvZGl2PicgK1xuICAgICc8L2Rpdj4nLFxuICB0cmlnZ2VyOiAnY2xpY2snXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICAuLi5Ub29sdGlwLkRlZmF1bHRUeXBlLFxuICBjb250ZW50OiAnKG51bGx8c3RyaW5nfGVsZW1lbnR8ZnVuY3Rpb24pJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBQb3BvdmVyIGV4dGVuZHMgVG9vbHRpcCB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBPdmVycmlkZXNcbiAgX2lzV2l0aENvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldFRpdGxlKCkgfHwgdGhpcy5fZ2V0Q29udGVudCgpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTRUxFQ1RPUl9USVRMRV06IHRoaXMuX2dldFRpdGxlKCksXG4gICAgICBbU0VMRUNUT1JfQ09OVEVOVF06IHRoaXMuX2dldENvbnRlbnQoKVxuICAgIH1cbiAgfVxuXG4gIF9nZXRDb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbih0aGlzLl9jb25maWcuY29udGVudClcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFBvcG92ZXIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFBvcG92ZXIpXG5cbmV4cG9ydCBkZWZhdWx0IFBvcG92ZXJcbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4wKTogc2Nyb2xsc3B5LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IHsgZGVmaW5lSlF1ZXJ5UGx1Z2luLCBnZXRFbGVtZW50LCBpc0Rpc2FibGVkLCBpc1Zpc2libGUgfSBmcm9tICcuL3V0aWwvaW5kZXgnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXInXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lJ1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudCdcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ3Njcm9sbHNweSdcbmNvbnN0IERBVEFfS0VZID0gJ2JzLnNjcm9sbHNweSdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJ1xuXG5jb25zdCBFVkVOVF9BQ1RJVkFURSA9IGBhY3RpdmF0ZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLID0gYGNsaWNrJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfTE9BRF9EQVRBX0FQSSA9IGBsb2FkJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX0RST1BET1dOX0lURU0gPSAnZHJvcGRvd24taXRlbSdcbmNvbnN0IENMQVNTX05BTUVfQUNUSVZFID0gJ2FjdGl2ZSdcblxuY29uc3QgU0VMRUNUT1JfREFUQV9TUFkgPSAnW2RhdGEtYnMtc3B5PVwic2Nyb2xsXCJdJ1xuY29uc3QgU0VMRUNUT1JfVEFSR0VUX0xJTktTID0gJ1tocmVmXSdcbmNvbnN0IFNFTEVDVE9SX05BVl9MSVNUX0dST1VQID0gJy5uYXYsIC5saXN0LWdyb3VwJ1xuY29uc3QgU0VMRUNUT1JfTkFWX0xJTktTID0gJy5uYXYtbGluaydcbmNvbnN0IFNFTEVDVE9SX05BVl9JVEVNUyA9ICcubmF2LWl0ZW0nXG5jb25zdCBTRUxFQ1RPUl9MSVNUX0lURU1TID0gJy5saXN0LWdyb3VwLWl0ZW0nXG5jb25zdCBTRUxFQ1RPUl9MSU5LX0lURU1TID0gYCR7U0VMRUNUT1JfTkFWX0xJTktTfSwgJHtTRUxFQ1RPUl9OQVZfSVRFTVN9ID4gJHtTRUxFQ1RPUl9OQVZfTElOS1N9LCAke1NFTEVDVE9SX0xJU1RfSVRFTVN9YFxuY29uc3QgU0VMRUNUT1JfRFJPUERPV04gPSAnLmRyb3Bkb3duJ1xuY29uc3QgU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFID0gJy5kcm9wZG93bi10b2dnbGUnXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIG9mZnNldDogbnVsbCwgLy8gVE9ETzogdjYgQGRlcHJlY2F0ZWQsIGtlZXAgaXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnNcbiAgcm9vdE1hcmdpbjogJzBweCAwcHggLTI1JScsXG4gIHNtb290aFNjcm9sbDogZmFsc2UsXG4gIHRhcmdldDogbnVsbFxufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgb2Zmc2V0OiAnKG51bWJlcnxudWxsKScsIC8vIFRPRE8gdjYgQGRlcHJlY2F0ZWQsIGtlZXAgaXQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnNcbiAgcm9vdE1hcmdpbjogJ3N0cmluZycsXG4gIHNtb290aFNjcm9sbDogJ2Jvb2xlYW4nLFxuICB0YXJnZXQ6ICdlbGVtZW50J1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTY3JvbGxTcHkgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgLy8gdGhpcy5fZWxlbWVudCBpcyB0aGUgb2JzZXJ2YWJsZXNDb250YWluZXIgYW5kIGNvbmZpZy50YXJnZXQgdGhlIG1lbnUgbGlua3Mgd3JhcHBlclxuICAgIHRoaXMuX3RhcmdldExpbmtzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuX2VsZW1lbnQpLm92ZXJmbG93WSA9PT0gJ3Zpc2libGUnID8gbnVsbCA6IHRoaXMuX2VsZW1lbnRcbiAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSBudWxsXG4gICAgdGhpcy5fb2JzZXJ2ZXIgPSBudWxsXG4gICAgdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhID0ge1xuICAgICAgdmlzaWJsZUVudHJ5VG9wOiAwLFxuICAgICAgcGFyZW50U2Nyb2xsVG9wOiAwXG4gICAgfVxuICAgIHRoaXMucmVmcmVzaCgpIC8vIGluaXRpYWxpemVcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgcmVmcmVzaCgpIHtcbiAgICB0aGlzLl9pbml0aWFsaXplVGFyZ2V0c0FuZE9ic2VydmFibGVzKClcbiAgICB0aGlzLl9tYXliZUVuYWJsZVNtb290aFNjcm9sbCgpXG5cbiAgICBpZiAodGhpcy5fb2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vYnNlcnZlciA9IHRoaXMuX2dldE5ld09ic2VydmVyKClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlci5vYnNlcnZlKHNlY3Rpb24pXG4gICAgfVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KClcbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgLy8gVE9ETzogb24gdjYgdGFyZ2V0IHNob3VsZCBiZSBnaXZlbiBleHBsaWNpdGx5ICYgcmVtb3ZlIHRoZSB7dGFyZ2V0OiAnc3MtdGFyZ2V0J30gY2FzZVxuICAgIGNvbmZpZy50YXJnZXQgPSBnZXRFbGVtZW50KGNvbmZpZy50YXJnZXQpIHx8IGRvY3VtZW50LmJvZHlcblxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9tYXliZUVuYWJsZVNtb290aFNjcm9sbCgpIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5zbW9vdGhTY3JvbGwpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHVucmVnaXN0ZXIgYW55IHByZXZpb3VzIGxpc3RlbmVyc1xuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fY29uZmlnLnRhcmdldCwgRVZFTlRfQ0xJQ0spXG5cbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fY29uZmlnLnRhcmdldCwgRVZFTlRfQ0xJQ0ssIFNFTEVDVE9SX1RBUkdFVF9MSU5LUywgZXZlbnQgPT4ge1xuICAgICAgY29uc3Qgb2JzZXJ2YWJsZVNlY3Rpb24gPSB0aGlzLl9vYnNlcnZhYmxlU2VjdGlvbnMuZ2V0KGV2ZW50LnRhcmdldC5oYXNoKVxuICAgICAgaWYgKG9ic2VydmFibGVTZWN0aW9uKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuX3Jvb3RFbGVtZW50IHx8IHdpbmRvd1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBvYnNlcnZhYmxlU2VjdGlvbi5vZmZzZXRUb3AgLSB0aGlzLl9lbGVtZW50Lm9mZnNldFRvcFxuICAgICAgICBpZiAocm9vdC5zY3JvbGxUbykge1xuICAgICAgICAgIHJvb3Quc2Nyb2xsVG8oeyB0b3A6IGhlaWdodCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaHJvbWUgNjAgZG9lc24ndCBzdXBwb3J0IGBzY3JvbGxUb2BcbiAgICAgICAgcm9vdC5zY3JvbGxUb3AgPSBoZWlnaHRcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgX2dldE5ld09ic2VydmVyKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICByb290OiB0aGlzLl9yb290RWxlbWVudCxcbiAgICAgIHRocmVzaG9sZDogWzAuMSwgMC41LCAxXSxcbiAgICAgIHJvb3RNYXJnaW46IHRoaXMuX2dldFJvb3RNYXJnaW4oKVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZW50cmllcyA9PiB0aGlzLl9vYnNlcnZlckNhbGxiYWNrKGVudHJpZXMpLCBvcHRpb25zKVxuICB9XG5cbiAgLy8gVGhlIGxvZ2ljIG9mIHNlbGVjdGlvblxuICBfb2JzZXJ2ZXJDYWxsYmFjayhlbnRyaWVzKSB7XG4gICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IGVudHJ5ID0+IHRoaXMuX3RhcmdldExpbmtzLmdldChgIyR7ZW50cnkudGFyZ2V0LmlkfWApXG4gICAgY29uc3QgYWN0aXZhdGUgPSBlbnRyeSA9PiB7XG4gICAgICB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEudmlzaWJsZUVudHJ5VG9wID0gZW50cnkudGFyZ2V0Lm9mZnNldFRvcFxuICAgICAgdGhpcy5fcHJvY2Vzcyh0YXJnZXRFbGVtZW50KGVudHJ5KSlcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRTY3JvbGxUb3AgPSAodGhpcy5fcm9vdEVsZW1lbnQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5zY3JvbGxUb3BcbiAgICBjb25zdCB1c2VyU2Nyb2xsc0Rvd24gPSBwYXJlbnRTY3JvbGxUb3AgPj0gdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnBhcmVudFNjcm9sbFRvcFxuICAgIHRoaXMuX3ByZXZpb3VzU2Nyb2xsRGF0YS5wYXJlbnRTY3JvbGxUb3AgPSBwYXJlbnRTY3JvbGxUb3BcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKCFlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSBudWxsXG4gICAgICAgIHRoaXMuX2NsZWFyQWN0aXZlQ2xhc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpXG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgZW50cnlJc0xvd2VyVGhhblByZXZpb3VzID0gZW50cnkudGFyZ2V0Lm9mZnNldFRvcCA+PSB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEudmlzaWJsZUVudHJ5VG9wXG4gICAgICAvLyBpZiB3ZSBhcmUgc2Nyb2xsaW5nIGRvd24sIHBpY2sgdGhlIGJpZ2dlciBvZmZzZXRUb3BcbiAgICAgIGlmICh1c2VyU2Nyb2xsc0Rvd24gJiYgZW50cnlJc0xvd2VyVGhhblByZXZpb3VzKSB7XG4gICAgICAgIGFjdGl2YXRlKGVudHJ5KVxuICAgICAgICAvLyBpZiBwYXJlbnQgaXNuJ3Qgc2Nyb2xsZWQsIGxldCdzIGtlZXAgdGhlIGZpcnN0IHZpc2libGUgaXRlbSwgYnJlYWtpbmcgdGhlIGl0ZXJhdGlvblxuICAgICAgICBpZiAoIXBhcmVudFNjcm9sbFRvcCkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gaWYgd2UgYXJlIHNjcm9sbGluZyB1cCwgcGljayB0aGUgc21hbGxlc3Qgb2Zmc2V0VG9wXG4gICAgICBpZiAoIXVzZXJTY3JvbGxzRG93biAmJiAhZW50cnlJc0xvd2VyVGhhblByZXZpb3VzKSB7XG4gICAgICAgIGFjdGl2YXRlKGVudHJ5KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE86IHY2IE9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMuIFVzZSByb290TWFyZ2luIG9ubHlcbiAgX2dldFJvb3RNYXJnaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5vZmZzZXQgPyBgJHt0aGlzLl9jb25maWcub2Zmc2V0fXB4IDBweCAtMzAlYCA6IHRoaXMuX2NvbmZpZy5yb290TWFyZ2luXG4gIH1cblxuICBfaW5pdGlhbGl6ZVRhcmdldHNBbmRPYnNlcnZhYmxlcygpIHtcbiAgICB0aGlzLl90YXJnZXRMaW5rcyA9IG5ldyBNYXAoKVxuICAgIHRoaXMuX29ic2VydmFibGVTZWN0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgY29uc3QgdGFyZ2V0TGlua3MgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX1RBUkdFVF9MSU5LUywgdGhpcy5fY29uZmlnLnRhcmdldClcblxuICAgIGZvciAoY29uc3QgYW5jaG9yIG9mIHRhcmdldExpbmtzKSB7XG4gICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgYW5jaG9yIGhhcyBhbiBpZCBhbmQgaXMgbm90IGRpc2FibGVkXG4gICAgICBpZiAoIWFuY2hvci5oYXNoIHx8IGlzRGlzYWJsZWQoYW5jaG9yKSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvYnNlcnZhYmxlU2VjdGlvbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoYW5jaG9yLmhhc2gsIHRoaXMuX2VsZW1lbnQpXG5cbiAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBvYnNlcnZhYmxlU2VjdGlvbiBleGlzdHMgJiBpcyB2aXNpYmxlXG4gICAgICBpZiAoaXNWaXNpYmxlKG9ic2VydmFibGVTZWN0aW9uKSkge1xuICAgICAgICB0aGlzLl90YXJnZXRMaW5rcy5zZXQoYW5jaG9yLmhhc2gsIGFuY2hvcilcbiAgICAgICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zLnNldChhbmNob3IuaGFzaCwgb2JzZXJ2YWJsZVNlY3Rpb24pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX3Byb2Nlc3ModGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZVRhcmdldCA9PT0gdGFyZ2V0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9jbGVhckFjdGl2ZUNsYXNzKHRoaXMuX2NvbmZpZy50YXJnZXQpXG4gICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gdGFyZ2V0XG4gICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgdGhpcy5fYWN0aXZhdGVQYXJlbnRzKHRhcmdldClcblxuICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0FDVElWQVRFLCB7IHJlbGF0ZWRUYXJnZXQ6IHRhcmdldCB9KVxuICB9XG5cbiAgX2FjdGl2YXRlUGFyZW50cyh0YXJnZXQpIHtcbiAgICAvLyBBY3RpdmF0ZSBkcm9wZG93biBwYXJlbnRzXG4gICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRE9XTl9JVEVNKSkge1xuICAgICAgU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUsIHRhcmdldC5jbG9zZXN0KFNFTEVDVE9SX0RST1BET1dOKSlcbiAgICAgICAgLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGxpc3RHcm91cCBvZiBTZWxlY3RvckVuZ2luZS5wYXJlbnRzKHRhcmdldCwgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVApKSB7XG4gICAgICAvLyBTZXQgdHJpZ2dlcmVkIGxpbmtzIHBhcmVudHMgYXMgYWN0aXZlXG4gICAgICAvLyBXaXRoIGJvdGggPHVsPiBhbmQgPG5hdj4gbWFya3VwIGEgcGFyZW50IGlzIHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mIGFueSBuYXYgYW5jZXN0b3JcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBTZWxlY3RvckVuZ2luZS5wcmV2KGxpc3RHcm91cCwgU0VMRUNUT1JfTElOS19JVEVNUykpIHtcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9jbGVhckFjdGl2ZUNsYXNzKHBhcmVudCkge1xuICAgIHBhcmVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKVxuXG4gICAgY29uc3QgYWN0aXZlTm9kZXMgPSBTZWxlY3RvckVuZ2luZS5maW5kKGAke1NFTEVDVE9SX1RBUkdFVF9MSU5LU30uJHtDTEFTU19OQU1FX0FDVElWRX1gLCBwYXJlbnQpXG4gICAgZm9yIChjb25zdCBub2RlIG9mIGFjdGl2ZU5vZGVzKSB7XG4gICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgfVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gU2Nyb2xsU3B5LmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSwgKCkgPT4ge1xuICBmb3IgKGNvbnN0IHNweSBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfU1BZKSkge1xuICAgIFNjcm9sbFNweS5nZXRPckNyZWF0ZUluc3RhbmNlKHNweSlcbiAgfVxufSlcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oU2Nyb2xsU3B5KVxuXG5leHBvcnQgZGVmYXVsdCBTY3JvbGxTcHlcbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4wKTogdGFiLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IHsgZGVmaW5lSlF1ZXJ5UGx1Z2luLCBnZXRFbGVtZW50RnJvbVNlbGVjdG9yLCBnZXROZXh0QWN0aXZlRWxlbWVudCwgaXNEaXNhYmxlZCB9IGZyb20gJy4vdXRpbC9pbmRleCdcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUnXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50J1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAndGFiJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMudGFiJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcblxuY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOID0gYGtleWRvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJID0gYGxvYWQke0VWRU5UX0tFWX1gXG5cbmNvbnN0IEFSUk9XX0xFRlRfS0VZID0gJ0Fycm93TGVmdCdcbmNvbnN0IEFSUk9XX1JJR0hUX0tFWSA9ICdBcnJvd1JpZ2h0J1xuY29uc3QgQVJST1dfVVBfS0VZID0gJ0Fycm93VXAnXG5jb25zdCBBUlJPV19ET1dOX0tFWSA9ICdBcnJvd0Rvd24nXG5cbmNvbnN0IENMQVNTX05BTUVfQUNUSVZFID0gJ2FjdGl2ZSdcbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19EUk9QRE9XTiA9ICdkcm9wZG93bidcblxuY29uc3QgU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFID0gJy5kcm9wZG93bi10b2dnbGUnXG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTl9NRU5VID0gJy5kcm9wZG93bi1tZW51J1xuY29uc3QgU0VMRUNUT1JfRFJPUERPV05fSVRFTSA9ICcuZHJvcGRvd24taXRlbSdcbmNvbnN0IE5PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUgPSAnOm5vdCguZHJvcGRvd24tdG9nZ2xlKSdcblxuY29uc3QgU0VMRUNUT1JfVEFCX1BBTkVMID0gJy5saXN0LWdyb3VwLCAubmF2LCBbcm9sZT1cInRhYmxpc3RcIl0nXG5jb25zdCBTRUxFQ1RPUl9PVVRFUiA9ICcubmF2LWl0ZW0sIC5saXN0LWdyb3VwLWl0ZW0nXG5jb25zdCBTRUxFQ1RPUl9JTk5FUiA9IGAubmF2LWxpbmske05PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEV9LCAubGlzdC1ncm91cC1pdGVtJHtOT1RfU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFfSwgW3JvbGU9XCJ0YWJcIl0ke05PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEV9YFxuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwidGFiXCJdLCBbZGF0YS1icy10b2dnbGU9XCJwaWxsXCJdLCBbZGF0YS1icy10b2dnbGU9XCJsaXN0XCJdJyAvLyB0b2RvOnY2OiBjb3VsZCBiZSBvbmx5IGB0YWJgXG5jb25zdCBTRUxFQ1RPUl9JTk5FUl9FTEVNID0gYCR7U0VMRUNUT1JfSU5ORVJ9LCAke1NFTEVDVE9SX0RBVEFfVE9HR0xFfWBcblxuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEVfQUNUSVZFID0gYC4ke0NMQVNTX05BTUVfQUNUSVZFfVtkYXRhLWJzLXRvZ2dsZT1cInRhYlwiXSwgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwicGlsbFwiXSwgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwibGlzdFwiXWBcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVGFiIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcbiAgICBzdXBlcihlbGVtZW50KVxuICAgIHRoaXMuX3BhcmVudCA9IHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9UQUJfUEFORUwpXG5cbiAgICBpZiAoIXRoaXMuX3BhcmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgICAvLyB0b2RvOiBzaG91bGQgVGhyb3cgZXhjZXB0aW9uIG9uIHY2XG4gICAgICAvLyB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2VsZW1lbnQub3V0ZXJIVE1MfSBoYXMgbm90IGEgdmFsaWQgcGFyZW50ICR7U0VMRUNUT1JfSU5ORVJfRUxFTX1gKVxuICAgIH1cblxuICAgIC8vIFNldCB1cCBpbml0aWFsIGFyaWEgYXR0cmlidXRlc1xuICAgIHRoaXMuX3NldEluaXRpYWxBdHRyaWJ1dGVzKHRoaXMuX3BhcmVudCwgdGhpcy5fZ2V0Q2hpbGRyZW4oKSlcblxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOLCBldmVudCA9PiB0aGlzLl9rZXlkb3duKGV2ZW50KSlcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgc2hvdygpIHsgLy8gU2hvd3MgdGhpcyBlbGVtIGFuZCBkZWFjdGl2YXRlIHRoZSBhY3RpdmUgc2libGluZyBpZiBleGlzdHNcbiAgICBjb25zdCBpbm5lckVsZW0gPSB0aGlzLl9lbGVtZW50XG4gICAgaWYgKHRoaXMuX2VsZW1Jc0FjdGl2ZShpbm5lckVsZW0pKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBTZWFyY2ggZm9yIGFjdGl2ZSB0YWIgb24gc2FtZSBwYXJlbnQgdG8gZGVhY3RpdmF0ZSBpdFxuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2dldEFjdGl2ZUVsZW0oKVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gYWN0aXZlID9cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKGFjdGl2ZSwgRVZFTlRfSElERSwgeyByZWxhdGVkVGFyZ2V0OiBpbm5lckVsZW0gfSkgOlxuICAgICAgbnVsbFxuXG4gICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIoaW5uZXJFbGVtLCBFVkVOVF9TSE9XLCB7IHJlbGF0ZWRUYXJnZXQ6IGFjdGl2ZSB9KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkIHx8IChoaWRlRXZlbnQgJiYgaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9kZWFjdGl2YXRlKGFjdGl2ZSwgaW5uZXJFbGVtKVxuICAgIHRoaXMuX2FjdGl2YXRlKGlubmVyRWxlbSwgYWN0aXZlKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfYWN0aXZhdGUoZWxlbWVudCwgcmVsYXRlZEVsZW0pIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSlcblxuICAgIHRoaXMuX2FjdGl2YXRlKGdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudCkpIC8vIFNlYXJjaCBhbmQgYWN0aXZhdGUvc2hvdyB0aGUgcHJvcGVyIHNlY3Rpb25cblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdyb2xlJykgIT09ICd0YWInKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBlbGVtZW50LmZvY3VzKClcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIHRydWUpXG4gICAgICB0aGlzLl90b2dnbGVEcm9wRG93bihlbGVtZW50LCB0cnVlKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIoZWxlbWVudCwgRVZFTlRfU0hPV04sIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogcmVsYXRlZEVsZW1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgZWxlbWVudCwgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKSlcbiAgfVxuXG4gIF9kZWFjdGl2YXRlKGVsZW1lbnQsIHJlbGF0ZWRFbGVtKSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgZWxlbWVudC5ibHVyKClcblxuICAgIHRoaXMuX2RlYWN0aXZhdGUoZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KSkgLy8gU2VhcmNoIGFuZCBkZWFjdGl2YXRlIHRoZSBzaG93biBzZWN0aW9uIHRvb1xuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSAhPT0gJ3RhYicpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgZmFsc2UpXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKVxuICAgICAgdGhpcy5fdG9nZ2xlRHJvcERvd24oZWxlbWVudCwgZmFsc2UpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcihlbGVtZW50LCBFVkVOVF9ISURERU4sIHsgcmVsYXRlZFRhcmdldDogcmVsYXRlZEVsZW0gfSlcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCBlbGVtZW50LCBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUpKVxuICB9XG5cbiAgX2tleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoIShbQVJST1dfTEVGVF9LRVksIEFSUk9XX1JJR0hUX0tFWSwgQVJST1dfVVBfS0VZLCBBUlJPV19ET1dOX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpLy8gc3RvcFByb3BhZ2F0aW9uL3ByZXZlbnREZWZhdWx0IGJvdGggYWRkZWQgdG8gc3VwcG9ydCB1cC9kb3duIGtleXMgd2l0aG91dCBzY3JvbGxpbmcgdGhlIHBhZ2VcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgY29uc3QgaXNOZXh0ID0gW0FSUk9XX1JJR0hUX0tFWSwgQVJST1dfRE9XTl9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSlcbiAgICBjb25zdCBuZXh0QWN0aXZlRWxlbWVudCA9IGdldE5leHRBY3RpdmVFbGVtZW50KHRoaXMuX2dldENoaWxkcmVuKCkuZmlsdGVyKGVsZW1lbnQgPT4gIWlzRGlzYWJsZWQoZWxlbWVudCkpLCBldmVudC50YXJnZXQsIGlzTmV4dCwgdHJ1ZSlcblxuICAgIGlmIChuZXh0QWN0aXZlRWxlbWVudCkge1xuICAgICAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UobmV4dEFjdGl2ZUVsZW1lbnQpLnNob3coKVxuICAgIH1cbiAgfVxuXG4gIF9nZXRDaGlsZHJlbigpIHsgLy8gY29sbGVjdGlvbiBvZiBpbm5lciBlbGVtZW50c1xuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lOTkVSX0VMRU0sIHRoaXMuX3BhcmVudClcbiAgfVxuXG4gIF9nZXRBY3RpdmVFbGVtKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRDaGlsZHJlbigpLmZpbmQoY2hpbGQgPT4gdGhpcy5fZWxlbUlzQWN0aXZlKGNoaWxkKSkgfHwgbnVsbFxuICB9XG5cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzKHBhcmVudCwgY2hpbGRyZW4pIHtcbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhwYXJlbnQsICdyb2xlJywgJ3RhYmxpc3QnKVxuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXNPbkNoaWxkKGNoaWxkKVxuICAgIH1cbiAgfVxuXG4gIF9zZXRJbml0aWFsQXR0cmlidXRlc09uQ2hpbGQoY2hpbGQpIHtcbiAgICBjaGlsZCA9IHRoaXMuX2dldElubmVyRWxlbWVudChjaGlsZClcbiAgICBjb25zdCBpc0FjdGl2ZSA9IHRoaXMuX2VsZW1Jc0FjdGl2ZShjaGlsZClcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoY2hpbGQpXG4gICAgY2hpbGQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgaXNBY3RpdmUpXG5cbiAgICBpZiAob3V0ZXJFbGVtICE9PSBjaGlsZCkge1xuICAgICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMob3V0ZXJFbGVtLCAncm9sZScsICdwcmVzZW50YXRpb24nKVxuICAgIH1cblxuICAgIGlmICghaXNBY3RpdmUpIHtcbiAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKVxuICAgIH1cblxuICAgIHRoaXMuX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKGNoaWxkLCAncm9sZScsICd0YWInKVxuXG4gICAgLy8gc2V0IGF0dHJpYnV0ZXMgdG8gdGhlIHJlbGF0ZWQgcGFuZWwgdG9vXG4gICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXNPblRhcmdldFBhbmVsKGNoaWxkKVxuICB9XG5cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzT25UYXJnZXRQYW5lbChjaGlsZCkge1xuICAgIGNvbnN0IHRhcmdldCA9IGdldEVsZW1lbnRGcm9tU2VsZWN0b3IoY2hpbGQpXG5cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHModGFyZ2V0LCAncm9sZScsICd0YWJwYW5lbCcpXG5cbiAgICBpZiAoY2hpbGQuaWQpIHtcbiAgICAgIHRoaXMuX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKHRhcmdldCwgJ2FyaWEtbGFiZWxsZWRieScsIGAjJHtjaGlsZC5pZH1gKVxuICAgIH1cbiAgfVxuXG4gIF90b2dnbGVEcm9wRG93bihlbGVtZW50LCBvcGVuKSB7XG4gICAgY29uc3Qgb3V0ZXJFbGVtID0gdGhpcy5fZ2V0T3V0ZXJFbGVtZW50KGVsZW1lbnQpXG4gICAgaWYgKCFvdXRlckVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX0RST1BET1dOKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdG9nZ2xlID0gKHNlbGVjdG9yLCBjbGFzc05hbWUpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKHNlbGVjdG9yLCBvdXRlckVsZW0pXG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoY2xhc3NOYW1lLCBvcGVuKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRvZ2dsZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUsIENMQVNTX05BTUVfQUNUSVZFKVxuICAgIHRvZ2dsZShTRUxFQ1RPUl9EUk9QRE9XTl9NRU5VLCBDTEFTU19OQU1FX1NIT1cpXG4gICAgdG9nZ2xlKFNFTEVDVE9SX0RST1BET1dOX0lURU0sIENMQVNTX05BTUVfQUNUSVZFKVxuICAgIG91dGVyRWxlbS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBvcGVuKVxuICB9XG5cbiAgX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKGVsZW1lbnQsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSkpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpXG4gICAgfVxuICB9XG5cbiAgX2VsZW1Jc0FjdGl2ZShlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfQUNUSVZFKVxuICB9XG5cbiAgLy8gVHJ5IHRvIGdldCB0aGUgaW5uZXIgZWxlbWVudCAodXN1YWxseSB0aGUgLm5hdi1saW5rKVxuICBfZ2V0SW5uZXJFbGVtZW50KGVsZW0pIHtcbiAgICByZXR1cm4gZWxlbS5tYXRjaGVzKFNFTEVDVE9SX0lOTkVSX0VMRU0pID8gZWxlbSA6IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfSU5ORVJfRUxFTSwgZWxlbSlcbiAgfVxuXG4gIC8vIFRyeSB0byBnZXQgdGhlIG91dGVyIGVsZW1lbnQgKHVzdWFsbHkgdGhlIC5uYXYtaXRlbSlcbiAgX2dldE91dGVyRWxlbWVudChlbGVtKSB7XG4gICAgcmV0dXJuIGVsZW0uY2xvc2VzdChTRUxFQ1RPUl9PVVRFUikgfHwgZWxlbVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YVtjb25maWddID09PSB1bmRlZmluZWQgfHwgY29uZmlnLnN0YXJ0c1dpdGgoJ18nKSB8fCBjb25maWcgPT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10oKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIGlmIChpc0Rpc2FibGVkKHRoaXMpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKS5zaG93KClcbn0pXG5cbi8qKlxuICogSW5pdGlhbGl6ZSBvbiBmb2N1c1xuICovXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9MT0FEX0RBVEFfQVBJLCAoKSA9PiB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfVE9HR0xFX0FDVElWRSkpIHtcbiAgICBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50KVxuICB9XG59KVxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oVGFiKVxuXG5leHBvcnQgZGVmYXVsdCBUYWJcbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4wKTogdG9hc3QuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4sIHJlZmxvdyB9IGZyb20gJy4vdXRpbC9pbmRleCdcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQnXG5pbXBvcnQgeyBlbmFibGVEaXNtaXNzVHJpZ2dlciB9IGZyb20gJy4vdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAndG9hc3QnXG5jb25zdCBEQVRBX0tFWSA9ICdicy50b2FzdCdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5cbmNvbnN0IEVWRU5UX01PVVNFT1ZFUiA9IGBtb3VzZW92ZXIke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRU9VVCA9IGBtb3VzZW91dCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0ZPQ1VTSU4gPSBgZm9jdXNpbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0ZPQ1VTT1VUID0gYGZvY3Vzb3V0JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfSElERSA9ICdoaWRlJyAvLyBAZGVwcmVjYXRlZCAtIGtlcHQgaGVyZSBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19OQU1FX1NIT1dJTkcgPSAnc2hvd2luZydcblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGFuaW1hdGlvbjogJ2Jvb2xlYW4nLFxuICBhdXRvaGlkZTogJ2Jvb2xlYW4nLFxuICBkZWxheTogJ251bWJlcidcbn1cblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYW5pbWF0aW9uOiB0cnVlLFxuICBhdXRvaGlkZTogdHJ1ZSxcbiAgZGVsYXk6IDUwMDBcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVG9hc3QgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgdGhpcy5fdGltZW91dCA9IG51bGxcbiAgICB0aGlzLl9oYXNNb3VzZUludGVyYWN0aW9uID0gZmFsc2VcbiAgICB0aGlzLl9oYXNLZXlib2FyZEludGVyYWN0aW9uID0gZmFsc2VcbiAgICB0aGlzLl9zZXRMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBzaG93KCkge1xuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1cpXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2NsZWFyVGltZW91dCgpXG5cbiAgICBpZiAodGhpcy5fY29uZmlnLmFuaW1hdGlvbikge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSlcbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTilcblxuICAgICAgdGhpcy5fbWF5YmVTY2hlZHVsZUhpZGUoKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0hJREUpIC8vIEBkZXByZWNhdGVkXG4gICAgcmVmbG93KHRoaXMuX2VsZW1lbnQpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVywgQ0xBU1NfTkFNRV9TSE9XSU5HKVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdGhpcy5fY29uZmlnLmFuaW1hdGlvbilcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSlcblxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9ISURFKSAvLyBAZGVwcmVjYXRlZFxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPV0lORywgQ0xBU1NfTkFNRV9TSE9XKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1dJTkcpXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdGhpcy5fY29uZmlnLmFuaW1hdGlvbilcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5fY2xlYXJUaW1lb3V0KClcblxuICAgIGlmICh0aGlzLmlzU2hvd24oKSkge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICB9XG5cbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIGlzU2hvd24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVylcbiAgfVxuXG4gIC8vIFByaXZhdGVcblxuICBfbWF5YmVTY2hlZHVsZUhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuYXV0b2hpZGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9oYXNNb3VzZUludGVyYWN0aW9uIHx8IHRoaXMuX2hhc0tleWJvYXJkSW50ZXJhY3Rpb24pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaGlkZSgpXG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5KVxuICB9XG5cbiAgX29uSW50ZXJhY3Rpb24oZXZlbnQsIGlzSW50ZXJhY3RpbmcpIHtcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgICBjYXNlICdtb3VzZW91dCc6XG4gICAgICAgIHRoaXMuX2hhc01vdXNlSW50ZXJhY3Rpb24gPSBpc0ludGVyYWN0aW5nXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgICAgdGhpcy5faGFzS2V5Ym9hcmRJbnRlcmFjdGlvbiA9IGlzSW50ZXJhY3RpbmdcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgaWYgKGlzSW50ZXJhY3RpbmcpIHtcbiAgICAgIHRoaXMuX2NsZWFyVGltZW91dCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBuZXh0RWxlbWVudCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXRcbiAgICBpZiAodGhpcy5fZWxlbWVudCA9PT0gbmV4dEVsZW1lbnQgfHwgdGhpcy5fZWxlbWVudC5jb250YWlucyhuZXh0RWxlbWVudCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX21heWJlU2NoZWR1bGVIaWRlKClcbiAgfVxuXG4gIF9zZXRMaXN0ZW5lcnMoKSB7XG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFT1ZFUiwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgdHJ1ZSkpXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFT1VULCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCBmYWxzZSkpXG4gICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0ZPQ1VTSU4sIGV2ZW50ID0+IHRoaXMuX29uSW50ZXJhY3Rpb24oZXZlbnQsIHRydWUpKVxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9GT0NVU09VVCwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgZmFsc2UpKVxuICB9XG5cbiAgX2NsZWFyVGltZW91dCgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dClcbiAgICB0aGlzLl90aW1lb3V0ID0gbnVsbFxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gVG9hc3QuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICAgIH1cblxuICAgICAgICBkYXRhW2NvbmZpZ10odGhpcylcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5lbmFibGVEaXNtaXNzVHJpZ2dlcihUb2FzdClcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oVG9hc3QpXG5cbmV4cG9ydCBkZWZhdWx0IFRvYXN0XG4iLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjIuMCk6IGluZGV4LnVtZC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBBbGVydCBmcm9tICcuL3NyYy9hbGVydCdcbmltcG9ydCBCdXR0b24gZnJvbSAnLi9zcmMvYnV0dG9uJ1xuaW1wb3J0IENhcm91c2VsIGZyb20gJy4vc3JjL2Nhcm91c2VsJ1xuaW1wb3J0IENvbGxhcHNlIGZyb20gJy4vc3JjL2NvbGxhcHNlJ1xuaW1wb3J0IERyb3Bkb3duIGZyb20gJy4vc3JjL2Ryb3Bkb3duJ1xuaW1wb3J0IE1vZGFsIGZyb20gJy4vc3JjL21vZGFsJ1xuaW1wb3J0IE9mZmNhbnZhcyBmcm9tICcuL3NyYy9vZmZjYW52YXMnXG5pbXBvcnQgUG9wb3ZlciBmcm9tICcuL3NyYy9wb3BvdmVyJ1xuaW1wb3J0IFNjcm9sbFNweSBmcm9tICcuL3NyYy9zY3JvbGxzcHknXG5pbXBvcnQgVGFiIGZyb20gJy4vc3JjL3RhYidcbmltcG9ydCBUb2FzdCBmcm9tICcuL3NyYy90b2FzdCdcbmltcG9ydCBUb29sdGlwIGZyb20gJy4vc3JjL3Rvb2x0aXAnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgQWxlcnQsXG4gIEJ1dHRvbixcbiAgQ2Fyb3VzZWwsXG4gIENvbGxhcHNlLFxuICBEcm9wZG93bixcbiAgTW9kYWwsXG4gIE9mZmNhbnZhcyxcbiAgUG9wb3ZlcixcbiAgU2Nyb2xsU3B5LFxuICBUYWIsXG4gIFRvYXN0LFxuICBUb29sdGlwXG59XG4iXX0= },{"@popperjs/core":9}],12:[function(require,module,exports){ "use strict"; // shim for using process in browser var process = module.exports = {}; process.nextTick = function () { var canSetImmediate = typeof window !== 'undefined' && window.setImmediate; var canPost = typeof window !== 'undefined' && window.postMessage && window.addEventListener; if (canSetImmediate) { return function (f) { return window.setImmediate(f); }; } if (canPost) { var queue = []; window.addEventListener('message', function (ev) { var source = ev.source; if ((source === window || source === null) && ev.data === 'process-tick') { ev.stopPropagation(); if (queue.length > 0) { var fn = queue.shift(); fn(); } } }, true); return function nextTick(fn) { queue.push(fn); window.postMessage('process-tick', '*'); }; } return function nextTick(fn) { setTimeout(fn, 0); }; }(); process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; function noop() {} process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.binding = function (name) { throw new Error('process.binding is not supported'); }; // TODO(shtylman) process.cwd = function () { return '/'; }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwcm9jZXNzIiwibW9kdWxlIiwiZXhwb3J0cyIsIm5leHRUaWNrIiwiY2FuU2V0SW1tZWRpYXRlIiwid2luZG93Iiwic2V0SW1tZWRpYXRlIiwiY2FuUG9zdCIsInBvc3RNZXNzYWdlIiwiYWRkRXZlbnRMaXN0ZW5lciIsImYiLCJxdWV1ZSIsImV2Iiwic291cmNlIiwiZGF0YSIsInN0b3BQcm9wYWdhdGlvbiIsImxlbmd0aCIsImZuIiwic2hpZnQiLCJwdXNoIiwic2V0VGltZW91dCIsInRpdGxlIiwiYnJvd3NlciIsImVudiIsImFyZ3YiLCJub29wIiwib24iLCJhZGRMaXN0ZW5lciIsIm9uY2UiLCJvZmYiLCJyZW1vdmVMaXN0ZW5lciIsInJlbW92ZUFsbExpc3RlbmVycyIsImVtaXQiLCJiaW5kaW5nIiwibmFtZSIsIkVycm9yIiwiY3dkIiwiY2hkaXIiLCJkaXIiXSwic291cmNlcyI6WyJicm93c2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbnByb2Nlc3MubmV4dFRpY2sgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjYW5TZXRJbW1lZGlhdGUgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5zZXRJbW1lZGlhdGU7XG4gICAgdmFyIGNhblBvc3QgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICYmIHdpbmRvdy5wb3N0TWVzc2FnZSAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lclxuICAgIDtcblxuICAgIGlmIChjYW5TZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmKSB7IHJldHVybiB3aW5kb3cuc2V0SW1tZWRpYXRlKGYpIH07XG4gICAgfVxuXG4gICAgaWYgKGNhblBvc3QpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gW107XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgc291cmNlID0gZXYuc291cmNlO1xuICAgICAgICAgICAgaWYgKChzb3VyY2UgPT09IHdpbmRvdyB8fCBzb3VyY2UgPT09IG51bGwpICYmIGV2LmRhdGEgPT09ICdwcm9jZXNzLXRpY2snKSB7XG4gICAgICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZuID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZXh0VGljayhmbikge1xuICAgICAgICAgICAgcXVldWUucHVzaChmbik7XG4gICAgICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2UoJ3Byb2Nlc3MtdGljaycsICcqJyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHRUaWNrKGZuKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZm4sIDApO1xuICAgIH07XG59KSgpO1xuXG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn1cblxuLy8gVE9ETyhzaHR5bG1hbilcbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBRUEsSUFBSUEsT0FBTyxHQUFHQyxNQUFNLENBQUNDLE9BQVAsR0FBaUIsRUFBL0I7O0FBRUFGLE9BQU8sQ0FBQ0csUUFBUixHQUFvQixZQUFZO0VBQzVCLElBQUlDLGVBQWUsR0FBRyxPQUFPQyxNQUFQLEtBQWtCLFdBQWxCLElBQ25CQSxNQUFNLENBQUNDLFlBRFY7RUFFQSxJQUFJQyxPQUFPLEdBQUcsT0FBT0YsTUFBUCxLQUFrQixXQUFsQixJQUNYQSxNQUFNLENBQUNHLFdBREksSUFDV0gsTUFBTSxDQUFDSSxnQkFEaEM7O0VBSUEsSUFBSUwsZUFBSixFQUFxQjtJQUNqQixPQUFPLFVBQVVNLENBQVYsRUFBYTtNQUFFLE9BQU9MLE1BQU0sQ0FBQ0MsWUFBUCxDQUFvQkksQ0FBcEIsQ0FBUDtJQUErQixDQUFyRDtFQUNIOztFQUVELElBQUlILE9BQUosRUFBYTtJQUNULElBQUlJLEtBQUssR0FBRyxFQUFaO0lBQ0FOLE1BQU0sQ0FBQ0ksZ0JBQVAsQ0FBd0IsU0FBeEIsRUFBbUMsVUFBVUcsRUFBVixFQUFjO01BQzdDLElBQUlDLE1BQU0sR0FBR0QsRUFBRSxDQUFDQyxNQUFoQjs7TUFDQSxJQUFJLENBQUNBLE1BQU0sS0FBS1IsTUFBWCxJQUFxQlEsTUFBTSxLQUFLLElBQWpDLEtBQTBDRCxFQUFFLENBQUNFLElBQUgsS0FBWSxjQUExRCxFQUEwRTtRQUN0RUYsRUFBRSxDQUFDRyxlQUFIOztRQUNBLElBQUlKLEtBQUssQ0FBQ0ssTUFBTixHQUFlLENBQW5CLEVBQXNCO1VBQ2xCLElBQUlDLEVBQUUsR0FBR04sS0FBSyxDQUFDTyxLQUFOLEVBQVQ7VUFDQUQsRUFBRTtRQUNMO01BQ0o7SUFDSixDQVRELEVBU0csSUFUSDtJQVdBLE9BQU8sU0FBU2QsUUFBVCxDQUFrQmMsRUFBbEIsRUFBc0I7TUFDekJOLEtBQUssQ0FBQ1EsSUFBTixDQUFXRixFQUFYO01BQ0FaLE1BQU0sQ0FBQ0csV0FBUCxDQUFtQixjQUFuQixFQUFtQyxHQUFuQztJQUNILENBSEQ7RUFJSDs7RUFFRCxPQUFPLFNBQVNMLFFBQVQsQ0FBa0JjLEVBQWxCLEVBQXNCO0lBQ3pCRyxVQUFVLENBQUNILEVBQUQsRUFBSyxDQUFMLENBQVY7RUFDSCxDQUZEO0FBR0gsQ0FqQ2tCLEVBQW5COztBQW1DQWpCLE9BQU8sQ0FBQ3FCLEtBQVIsR0FBZ0IsU0FBaEI7QUFDQXJCLE9BQU8sQ0FBQ3NCLE9BQVIsR0FBa0IsSUFBbEI7QUFDQXRCLE9BQU8sQ0FBQ3VCLEdBQVIsR0FBYyxFQUFkO0FBQ0F2QixPQUFPLENBQUN3QixJQUFSLEdBQWUsRUFBZjs7QUFFQSxTQUFTQyxJQUFULEdBQWdCLENBQUU7O0FBRWxCekIsT0FBTyxDQUFDMEIsRUFBUixHQUFhRCxJQUFiO0FBQ0F6QixPQUFPLENBQUMyQixXQUFSLEdBQXNCRixJQUF0QjtBQUNBekIsT0FBTyxDQUFDNEIsSUFBUixHQUFlSCxJQUFmO0FBQ0F6QixPQUFPLENBQUM2QixHQUFSLEdBQWNKLElBQWQ7QUFDQXpCLE9BQU8sQ0FBQzhCLGNBQVIsR0FBeUJMLElBQXpCO0FBQ0F6QixPQUFPLENBQUMrQixrQkFBUixHQUE2Qk4sSUFBN0I7QUFDQXpCLE9BQU8sQ0FBQ2dDLElBQVIsR0FBZVAsSUFBZjs7QUFFQXpCLE9BQU8sQ0FBQ2lDLE9BQVIsR0FBa0IsVUFBVUMsSUFBVixFQUFnQjtFQUM5QixNQUFNLElBQUlDLEtBQUosQ0FBVSxrQ0FBVixDQUFOO0FBQ0gsQ0FGRCxDLENBSUE7OztBQUNBbkMsT0FBTyxDQUFDb0MsR0FBUixHQUFjLFlBQVk7RUFBRSxPQUFPLEdBQVA7QUFBWSxDQUF4Qzs7QUFDQXBDLE9BQU8sQ0FBQ3FDLEtBQVIsR0FBZ0IsVUFBVUMsR0FBVixFQUFlO0VBQzNCLE1BQU0sSUFBSUgsS0FBSixDQUFVLGdDQUFWLENBQU47QUFDSCxDQUZEIn0= },{}],13:[function(require,module,exports){ "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } /*! * Chart.js v2.9.4 * https://www.chartjs.org * (c) 2020 Chart.js Contributors * Released under the MIT License */ (function (global, factory) { (typeof exports === "undefined" ? "undefined" : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? module.exports = factory(function () { try { return require('moment'); } catch (e) {} }()) : typeof define === 'function' && define.amd ? define(['require'], function (require) { return factory(function () { try { return require('moment'); } catch (e) {} }()); }) : (global = global || self, global.Chart = factory(global.moment)); })(void 0, function (moment) { 'use strict'; moment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment; function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } function getCjsExportFromNamespace(n) { return n && n['default'] || n; } var colorName = { "aliceblue": [240, 248, 255], "antiquewhite": [250, 235, 215], "aqua": [0, 255, 255], "aquamarine": [127, 255, 212], "azure": [240, 255, 255], "beige": [245, 245, 220], "bisque": [255, 228, 196], "black": [0, 0, 0], "blanchedalmond": [255, 235, 205], "blue": [0, 0, 255], "blueviolet": [138, 43, 226], "brown": [165, 42, 42], "burlywood": [222, 184, 135], "cadetblue": [95, 158, 160], "chartreuse": [127, 255, 0], "chocolate": [210, 105, 30], "coral": [255, 127, 80], "cornflowerblue": [100, 149, 237], "cornsilk": [255, 248, 220], "crimson": [220, 20, 60], "cyan": [0, 255, 255], "darkblue": [0, 0, 139], "darkcyan": [0, 139, 139], "darkgoldenrod": [184, 134, 11], "darkgray": [169, 169, 169], "darkgreen": [0, 100, 0], "darkgrey": [169, 169, 169], "darkkhaki": [189, 183, 107], "darkmagenta": [139, 0, 139], "darkolivegreen": [85, 107, 47], "darkorange": [255, 140, 0], "darkorchid": [153, 50, 204], "darkred": [139, 0, 0], "darksalmon": [233, 150, 122], "darkseagreen": [143, 188, 143], "darkslateblue": [72, 61, 139], "darkslategray": [47, 79, 79], "darkslategrey": [47, 79, 79], "darkturquoise": [0, 206, 209], "darkviolet": [148, 0, 211], "deeppink": [255, 20, 147], "deepskyblue": [0, 191, 255], "dimgray": [105, 105, 105], "dimgrey": [105, 105, 105], "dodgerblue": [30, 144, 255], "firebrick": [178, 34, 34], "floralwhite": [255, 250, 240], "forestgreen": [34, 139, 34], "fuchsia": [255, 0, 255], "gainsboro": [220, 220, 220], "ghostwhite": [248, 248, 255], "gold": [255, 215, 0], "goldenrod": [218, 165, 32], "gray": [128, 128, 128], "green": [0, 128, 0], "greenyellow": [173, 255, 47], "grey": [128, 128, 128], "honeydew": [240, 255, 240], "hotpink": [255, 105, 180], "indianred": [205, 92, 92], "indigo": [75, 0, 130], "ivory": [255, 255, 240], "khaki": [240, 230, 140], "lavender": [230, 230, 250], "lavenderblush": [255, 240, 245], "lawngreen": [124, 252, 0], "lemonchiffon": [255, 250, 205], "lightblue": [173, 216, 230], "lightcoral": [240, 128, 128], "lightcyan": [224, 255, 255], "lightgoldenrodyellow": [250, 250, 210], "lightgray": [211, 211, 211], "lightgreen": [144, 238, 144], "lightgrey": [211, 211, 211], "lightpink": [255, 182, 193], "lightsalmon": [255, 160, 122], "lightseagreen": [32, 178, 170], "lightskyblue": [135, 206, 250], "lightslategray": [119, 136, 153], "lightslategrey": [119, 136, 153], "lightsteelblue": [176, 196, 222], "lightyellow": [255, 255, 224], "lime": [0, 255, 0], "limegreen": [50, 205, 50], "linen": [250, 240, 230], "magenta": [255, 0, 255], "maroon": [128, 0, 0], "mediumaquamarine": [102, 205, 170], "mediumblue": [0, 0, 205], "mediumorchid": [186, 85, 211], "mediumpurple": [147, 112, 219], "mediumseagreen": [60, 179, 113], "mediumslateblue": [123, 104, 238], "mediumspringgreen": [0, 250, 154], "mediumturquoise": [72, 209, 204], "mediumvioletred": [199, 21, 133], "midnightblue": [25, 25, 112], "mintcream": [245, 255, 250], "mistyrose": [255, 228, 225], "moccasin": [255, 228, 181], "navajowhite": [255, 222, 173], "navy": [0, 0, 128], "oldlace": [253, 245, 230], "olive": [128, 128, 0], "olivedrab": [107, 142, 35], "orange": [255, 165, 0], "orangered": [255, 69, 0], "orchid": [218, 112, 214], "palegoldenrod": [238, 232, 170], "palegreen": [152, 251, 152], "paleturquoise": [175, 238, 238], "palevioletred": [219, 112, 147], "papayawhip": [255, 239, 213], "peachpuff": [255, 218, 185], "peru": [205, 133, 63], "pink": [255, 192, 203], "plum": [221, 160, 221], "powderblue": [176, 224, 230], "purple": [128, 0, 128], "rebeccapurple": [102, 51, 153], "red": [255, 0, 0], "rosybrown": [188, 143, 143], "royalblue": [65, 105, 225], "saddlebrown": [139, 69, 19], "salmon": [250, 128, 114], "sandybrown": [244, 164, 96], "seagreen": [46, 139, 87], "seashell": [255, 245, 238], "sienna": [160, 82, 45], "silver": [192, 192, 192], "skyblue": [135, 206, 235], "slateblue": [106, 90, 205], "slategray": [112, 128, 144], "slategrey": [112, 128, 144], "snow": [255, 250, 250], "springgreen": [0, 255, 127], "steelblue": [70, 130, 180], "tan": [210, 180, 140], "teal": [0, 128, 128], "thistle": [216, 191, 216], "tomato": [255, 99, 71], "turquoise": [64, 224, 208], "violet": [238, 130, 238], "wheat": [245, 222, 179], "white": [255, 255, 255], "whitesmoke": [245, 245, 245], "yellow": [255, 255, 0], "yellowgreen": [154, 205, 50] }; var conversions = createCommonjsModule(function (module) { /* MIT license */ // NOTE: conversions should only return primitive values (i.e. arrays, or // values that give correct `typeof` results). // do not use box values types (i.e. Number(), String(), etc.) var reverseKeywords = {}; for (var key in colorName) { if (colorName.hasOwnProperty(key)) { reverseKeywords[colorName[key]] = key; } } var convert = module.exports = { rgb: { channels: 3, labels: 'rgb' }, hsl: { channels: 3, labels: 'hsl' }, hsv: { channels: 3, labels: 'hsv' }, hwb: { channels: 3, labels: 'hwb' }, cmyk: { channels: 4, labels: 'cmyk' }, xyz: { channels: 3, labels: 'xyz' }, lab: { channels: 3, labels: 'lab' }, lch: { channels: 3, labels: 'lch' }, hex: { channels: 1, labels: ['hex'] }, keyword: { channels: 1, labels: ['keyword'] }, ansi16: { channels: 1, labels: ['ansi16'] }, ansi256: { channels: 1, labels: ['ansi256'] }, hcg: { channels: 3, labels: ['h', 'c', 'g'] }, apple: { channels: 3, labels: ['r16', 'g16', 'b16'] }, gray: { channels: 1, labels: ['gray'] } }; // hide .channels and .labels properties for (var model in convert) { if (convert.hasOwnProperty(model)) { if (!('channels' in convert[model])) { throw new Error('missing channels property: ' + model); } if (!('labels' in convert[model])) { throw new Error('missing channel labels property: ' + model); } if (convert[model].labels.length !== convert[model].channels) { throw new Error('channel and label counts mismatch: ' + model); } var channels = convert[model].channels; var labels = convert[model].labels; delete convert[model].channels; delete convert[model].labels; Object.defineProperty(convert[model], 'channels', { value: channels }); Object.defineProperty(convert[model], 'labels', { value: labels }); } } convert.rgb.hsl = function (rgb) { var r = rgb[0] / 255; var g = rgb[1] / 255; var b = rgb[2] / 255; var min = Math.min(r, g, b); var max = Math.max(r, g, b); var delta = max - min; var h; var s; var l; if (max === min) { h = 0; } else if (r === max) { h = (g - b) / delta; } else if (g === max) { h = 2 + (b - r) / delta; } else if (b === max) { h = 4 + (r - g) / delta; } h = Math.min(h * 60, 360); if (h < 0) { h += 360; } l = (min + max) / 2; if (max === min) { s = 0; } else if (l <= 0.5) { s = delta / (max + min); } else { s = delta / (2 - max - min); } return [h, s * 100, l * 100]; }; convert.rgb.hsv = function (rgb) { var rdif; var gdif; var bdif; var h; var s; var r = rgb[0] / 255; var g = rgb[1] / 255; var b = rgb[2] / 255; var v = Math.max(r, g, b); var diff = v - Math.min(r, g, b); var diffc = function diffc(c) { return (v - c) / 6 / diff + 1 / 2; }; if (diff === 0) { h = s = 0; } else { s = diff / v; rdif = diffc(r); gdif = diffc(g); bdif = diffc(b); if (r === v) { h = bdif - gdif; } else if (g === v) { h = 1 / 3 + rdif - bdif; } else if (b === v) { h = 2 / 3 + gdif - rdif; } if (h < 0) { h += 1; } else if (h > 1) { h -= 1; } } return [h * 360, s * 100, v * 100]; }; convert.rgb.hwb = function (rgb) { var r = rgb[0]; var g = rgb[1]; var b = rgb[2]; var h = convert.rgb.hsl(rgb)[0]; var w = 1 / 255 * Math.min(r, Math.min(g, b)); b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); return [h, w * 100, b * 100]; }; convert.rgb.cmyk = function (rgb) { var r = rgb[0] / 255; var g = rgb[1] / 255; var b = rgb[2] / 255; var c; var m; var y; var k; k = Math.min(1 - r, 1 - g, 1 - b); c = (1 - r - k) / (1 - k) || 0; m = (1 - g - k) / (1 - k) || 0; y = (1 - b - k) / (1 - k) || 0; return [c * 100, m * 100, y * 100, k * 100]; }; /** * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance * */ function comparativeDistance(x, y) { return Math.pow(x[0] - y[0], 2) + Math.pow(x[1] - y[1], 2) + Math.pow(x[2] - y[2], 2); } convert.rgb.keyword = function (rgb) { var reversed = reverseKeywords[rgb]; if (reversed) { return reversed; } var currentClosestDistance = Infinity; var currentClosestKeyword; for (var keyword in colorName) { if (colorName.hasOwnProperty(keyword)) { var value = colorName[keyword]; // Compute comparative distance var distance = comparativeDistance(rgb, value); // Check if its less, if so set as closest if (distance < currentClosestDistance) { currentClosestDistance = distance; currentClosestKeyword = keyword; } } } return currentClosestKeyword; }; convert.keyword.rgb = function (keyword) { return colorName[keyword]; }; convert.rgb.xyz = function (rgb) { var r = rgb[0] / 255; var g = rgb[1] / 255; var b = rgb[2] / 255; // assume sRGB r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92; g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92; b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92; var x = r * 0.4124 + g * 0.3576 + b * 0.1805; var y = r * 0.2126 + g * 0.7152 + b * 0.0722; var z = r * 0.0193 + g * 0.1192 + b * 0.9505; return [x * 100, y * 100, z * 100]; }; convert.rgb.lab = function (rgb) { var xyz = convert.rgb.xyz(rgb); var x = xyz[0]; var y = xyz[1]; var z = xyz[2]; var l; var a; var b; x /= 95.047; y /= 100; z /= 108.883; x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116; y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116; z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116; l = 116 * y - 16; a = 500 * (x - y); b = 200 * (y - z); return [l, a, b]; }; convert.hsl.rgb = function (hsl) { var h = hsl[0] / 360; var s = hsl[1] / 100; var l = hsl[2] / 100; var t1; var t2; var t3; var rgb; var val; if (s === 0) { val = l * 255; return [val, val, val]; } if (l < 0.5) { t2 = l * (1 + s); } else { t2 = l + s - l * s; } t1 = 2 * l - t2; rgb = [0, 0, 0]; for (var i = 0; i < 3; i++) { t3 = h + 1 / 3 * -(i - 1); if (t3 < 0) { t3++; } if (t3 > 1) { t3--; } if (6 * t3 < 1) { val = t1 + (t2 - t1) * 6 * t3; } else if (2 * t3 < 1) { val = t2; } else if (3 * t3 < 2) { val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; } else { val = t1; } rgb[i] = val * 255; } return rgb; }; convert.hsl.hsv = function (hsl) { var h = hsl[0]; var s = hsl[1] / 100; var l = hsl[2] / 100; var smin = s; var lmin = Math.max(l, 0.01); var sv; var v; l *= 2; s *= l <= 1 ? l : 2 - l; smin *= lmin <= 1 ? lmin : 2 - lmin; v = (l + s) / 2; sv = l === 0 ? 2 * smin / (lmin + smin) : 2 * s / (l + s); return [h, sv * 100, v * 100]; }; convert.hsv.rgb = function (hsv) { var h = hsv[0] / 60; var s = hsv[1] / 100; var v = hsv[2] / 100; var hi = Math.floor(h) % 6; var f = h - Math.floor(h); var p = 255 * v * (1 - s); var q = 255 * v * (1 - s * f); var t = 255 * v * (1 - s * (1 - f)); v *= 255; switch (hi) { case 0: return [v, t, p]; case 1: return [q, v, p]; case 2: return [p, v, t]; case 3: return [p, q, v]; case 4: return [t, p, v]; case 5: return [v, p, q]; } }; convert.hsv.hsl = function (hsv) { var h = hsv[0]; var s = hsv[1] / 100; var v = hsv[2] / 100; var vmin = Math.max(v, 0.01); var lmin; var sl; var l; l = (2 - s) * v; lmin = (2 - s) * vmin; sl = s * vmin; sl /= lmin <= 1 ? lmin : 2 - lmin; sl = sl || 0; l /= 2; return [h, sl * 100, l * 100]; }; // http://dev.w3.org/csswg/css-color/#hwb-to-rgb convert.hwb.rgb = function (hwb) { var h = hwb[0] / 360; var wh = hwb[1] / 100; var bl = hwb[2] / 100; var ratio = wh + bl; var i; var v; var f; var n; // wh + bl cant be > 1 if (ratio > 1) { wh /= ratio; bl /= ratio; } i = Math.floor(6 * h); v = 1 - bl; f = 6 * h - i; if ((i & 0x01) !== 0) { f = 1 - f; } n = wh + f * (v - wh); // linear interpolation var r; var g; var b; switch (i) { default: case 6: case 0: r = v; g = n; b = wh; break; case 1: r = n; g = v; b = wh; break; case 2: r = wh; g = v; b = n; break; case 3: r = wh; g = n; b = v; break; case 4: r = n; g = wh; b = v; break; case 5: r = v; g = wh; b = n; break; } return [r * 255, g * 255, b * 255]; }; convert.cmyk.rgb = function (cmyk) { var c = cmyk[0] / 100; var m = cmyk[1] / 100; var y = cmyk[2] / 100; var k = cmyk[3] / 100; var r; var g; var b; r = 1 - Math.min(1, c * (1 - k) + k); g = 1 - Math.min(1, m * (1 - k) + k); b = 1 - Math.min(1, y * (1 - k) + k); return [r * 255, g * 255, b * 255]; }; convert.xyz.rgb = function (xyz) { var x = xyz[0] / 100; var y = xyz[1] / 100; var z = xyz[2] / 100; var r; var g; var b; r = x * 3.2406 + y * -1.5372 + z * -0.4986; g = x * -0.9689 + y * 1.8758 + z * 0.0415; b = x * 0.0557 + y * -0.2040 + z * 1.0570; // assume sRGB r = r > 0.0031308 ? 1.055 * Math.pow(r, 1.0 / 2.4) - 0.055 : r * 12.92; g = g > 0.0031308 ? 1.055 * Math.pow(g, 1.0 / 2.4) - 0.055 : g * 12.92; b = b > 0.0031308 ? 1.055 * Math.pow(b, 1.0 / 2.4) - 0.055 : b * 12.92; r = Math.min(Math.max(0, r), 1); g = Math.min(Math.max(0, g), 1); b = Math.min(Math.max(0, b), 1); return [r * 255, g * 255, b * 255]; }; convert.xyz.lab = function (xyz) { var x = xyz[0]; var y = xyz[1]; var z = xyz[2]; var l; var a; var b; x /= 95.047; y /= 100; z /= 108.883; x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116; y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116; z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116; l = 116 * y - 16; a = 500 * (x - y); b = 200 * (y - z); return [l, a, b]; }; convert.lab.xyz = function (lab) { var l = lab[0]; var a = lab[1]; var b = lab[2]; var x; var y; var z; y = (l + 16) / 116; x = a / 500 + y; z = y - b / 200; var y2 = Math.pow(y, 3); var x2 = Math.pow(x, 3); var z2 = Math.pow(z, 3); y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; x *= 95.047; y *= 100; z *= 108.883; return [x, y, z]; }; convert.lab.lch = function (lab) { var l = lab[0]; var a = lab[1]; var b = lab[2]; var hr; var h; var c; hr = Math.atan2(b, a); h = hr * 360 / 2 / Math.PI; if (h < 0) { h += 360; } c = Math.sqrt(a * a + b * b); return [l, c, h]; }; convert.lch.lab = function (lch) { var l = lch[0]; var c = lch[1]; var h = lch[2]; var a; var b; var hr; hr = h / 360 * 2 * Math.PI; a = c * Math.cos(hr); b = c * Math.sin(hr); return [l, a, b]; }; convert.rgb.ansi16 = function (args) { var r = args[0]; var g = args[1]; var b = args[2]; var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization value = Math.round(value / 50); if (value === 0) { return 30; } var ansi = 30 + (Math.round(b / 255) << 2 | Math.round(g / 255) << 1 | Math.round(r / 255)); if (value === 2) { ansi += 60; } return ansi; }; convert.hsv.ansi16 = function (args) { // optimization here; we already know the value and don't need to get // it converted for us. return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); }; convert.rgb.ansi256 = function (args) { var r = args[0]; var g = args[1]; var b = args[2]; // we use the extended greyscale palette here, with the exception of // black and white. normal palette only has 4 greyscale shades. if (r === g && g === b) { if (r < 8) { return 16; } if (r > 248) { return 231; } return Math.round((r - 8) / 247 * 24) + 232; } var ansi = 16 + 36 * Math.round(r / 255 * 5) + 6 * Math.round(g / 255 * 5) + Math.round(b / 255 * 5); return ansi; }; convert.ansi16.rgb = function (args) { var color = args % 10; // handle greyscale if (color === 0 || color === 7) { if (args > 50) { color += 3.5; } color = color / 10.5 * 255; return [color, color, color]; } var mult = (~~(args > 50) + 1) * 0.5; var r = (color & 1) * mult * 255; var g = (color >> 1 & 1) * mult * 255; var b = (color >> 2 & 1) * mult * 255; return [r, g, b]; }; convert.ansi256.rgb = function (args) { // handle greyscale if (args >= 232) { var c = (args - 232) * 10 + 8; return [c, c, c]; } args -= 16; var rem; var r = Math.floor(args / 36) / 5 * 255; var g = Math.floor((rem = args % 36) / 6) / 5 * 255; var b = rem % 6 / 5 * 255; return [r, g, b]; }; convert.rgb.hex = function (args) { var integer = ((Math.round(args[0]) & 0xFF) << 16) + ((Math.round(args[1]) & 0xFF) << 8) + (Math.round(args[2]) & 0xFF); var string = integer.toString(16).toUpperCase(); return '000000'.substring(string.length) + string; }; convert.hex.rgb = function (args) { var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); if (!match) { return [0, 0, 0]; } var colorString = match[0]; if (match[0].length === 3) { colorString = colorString.split('').map(function (_char) { return _char + _char; }).join(''); } var integer = parseInt(colorString, 16); var r = integer >> 16 & 0xFF; var g = integer >> 8 & 0xFF; var b = integer & 0xFF; return [r, g, b]; }; convert.rgb.hcg = function (rgb) { var r = rgb[0] / 255; var g = rgb[1] / 255; var b = rgb[2] / 255; var max = Math.max(Math.max(r, g), b); var min = Math.min(Math.min(r, g), b); var chroma = max - min; var grayscale; var hue; if (chroma < 1) { grayscale = min / (1 - chroma); } else { grayscale = 0; } if (chroma <= 0) { hue = 0; } else if (max === r) { hue = (g - b) / chroma % 6; } else if (max === g) { hue = 2 + (b - r) / chroma; } else { hue = 4 + (r - g) / chroma + 4; } hue /= 6; hue %= 1; return [hue * 360, chroma * 100, grayscale * 100]; }; convert.hsl.hcg = function (hsl) { var s = hsl[1] / 100; var l = hsl[2] / 100; var c = 1; var f = 0; if (l < 0.5) { c = 2.0 * s * l; } else { c = 2.0 * s * (1.0 - l); } if (c < 1.0) { f = (l - 0.5 * c) / (1.0 - c); } return [hsl[0], c * 100, f * 100]; }; convert.hsv.hcg = function (hsv) { var s = hsv[1] / 100; var v = hsv[2] / 100; var c = s * v; var f = 0; if (c < 1.0) { f = (v - c) / (1 - c); } return [hsv[0], c * 100, f * 100]; }; convert.hcg.rgb = function (hcg) { var h = hcg[0] / 360; var c = hcg[1] / 100; var g = hcg[2] / 100; if (c === 0.0) { return [g * 255, g * 255, g * 255]; } var pure = [0, 0, 0]; var hi = h % 1 * 6; var v = hi % 1; var w = 1 - v; var mg = 0; switch (Math.floor(hi)) { case 0: pure[0] = 1; pure[1] = v; pure[2] = 0; break; case 1: pure[0] = w; pure[1] = 1; pure[2] = 0; break; case 2: pure[0] = 0; pure[1] = 1; pure[2] = v; break; case 3: pure[0] = 0; pure[1] = w; pure[2] = 1; break; case 4: pure[0] = v; pure[1] = 0; pure[2] = 1; break; default: pure[0] = 1; pure[1] = 0; pure[2] = w; } mg = (1.0 - c) * g; return [(c * pure[0] + mg) * 255, (c * pure[1] + mg) * 255, (c * pure[2] + mg) * 255]; }; convert.hcg.hsv = function (hcg) { var c = hcg[1] / 100; var g = hcg[2] / 100; var v = c + g * (1.0 - c); var f = 0; if (v > 0.0) { f = c / v; } return [hcg[0], f * 100, v * 100]; }; convert.hcg.hsl = function (hcg) { var c = hcg[1] / 100; var g = hcg[2] / 100; var l = g * (1.0 - c) + 0.5 * c; var s = 0; if (l > 0.0 && l < 0.5) { s = c / (2 * l); } else if (l >= 0.5 && l < 1.0) { s = c / (2 * (1 - l)); } return [hcg[0], s * 100, l * 100]; }; convert.hcg.hwb = function (hcg) { var c = hcg[1] / 100; var g = hcg[2] / 100; var v = c + g * (1.0 - c); return [hcg[0], (v - c) * 100, (1 - v) * 100]; }; convert.hwb.hcg = function (hwb) { var w = hwb[1] / 100; var b = hwb[2] / 100; var v = 1 - b; var c = v - w; var g = 0; if (c < 1) { g = (v - c) / (1 - c); } return [hwb[0], c * 100, g * 100]; }; convert.apple.rgb = function (apple) { return [apple[0] / 65535 * 255, apple[1] / 65535 * 255, apple[2] / 65535 * 255]; }; convert.rgb.apple = function (rgb) { return [rgb[0] / 255 * 65535, rgb[1] / 255 * 65535, rgb[2] / 255 * 65535]; }; convert.gray.rgb = function (args) { return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; }; convert.gray.hsl = convert.gray.hsv = function (args) { return [0, 0, args[0]]; }; convert.gray.hwb = function (gray) { return [0, 100, gray[0]]; }; convert.gray.cmyk = function (gray) { return [0, 0, 0, gray[0]]; }; convert.gray.lab = function (gray) { return [gray[0], 0, 0]; }; convert.gray.hex = function (gray) { var val = Math.round(gray[0] / 100 * 255) & 0xFF; var integer = (val << 16) + (val << 8) + val; var string = integer.toString(16).toUpperCase(); return '000000'.substring(string.length) + string; }; convert.rgb.gray = function (rgb) { var val = (rgb[0] + rgb[1] + rgb[2]) / 3; return [val / 255 * 100]; }; }); var conversions_1 = conversions.rgb; var conversions_2 = conversions.hsl; var conversions_3 = conversions.hsv; var conversions_4 = conversions.hwb; var conversions_5 = conversions.cmyk; var conversions_6 = conversions.xyz; var conversions_7 = conversions.lab; var conversions_8 = conversions.lch; var conversions_9 = conversions.hex; var conversions_10 = conversions.keyword; var conversions_11 = conversions.ansi16; var conversions_12 = conversions.ansi256; var conversions_13 = conversions.hcg; var conversions_14 = conversions.apple; var conversions_15 = conversions.gray; /* this function routes a model to all other models. all functions that are routed have a property `.conversion` attached to the returned synthetic function. This property is an array of strings, each with the steps in between the 'from' and 'to' color models (inclusive). conversions that are not possible simply are not included. */ function buildGraph() { var graph = {}; // https://jsperf.com/object-keys-vs-for-in-with-closure/3 var models = Object.keys(conversions); for (var len = models.length, i = 0; i < len; i++) { graph[models[i]] = { // http://jsperf.com/1-vs-infinity // micro-opt, but this is simple. distance: -1, parent: null }; } return graph; } // https://en.wikipedia.org/wiki/Breadth-first_search function deriveBFS(fromModel) { var graph = buildGraph(); var queue = [fromModel]; // unshift -> queue -> pop graph[fromModel].distance = 0; while (queue.length) { var current = queue.pop(); var adjacents = Object.keys(conversions[current]); for (var len = adjacents.length, i = 0; i < len; i++) { var adjacent = adjacents[i]; var node = graph[adjacent]; if (node.distance === -1) { node.distance = graph[current].distance + 1; node.parent = current; queue.unshift(adjacent); } } } return graph; } function link(from, to) { return function (args) { return to(from(args)); }; } function wrapConversion(toModel, graph) { var path = [graph[toModel].parent, toModel]; var fn = conversions[graph[toModel].parent][toModel]; var cur = graph[toModel].parent; while (graph[cur].parent) { path.unshift(graph[cur].parent); fn = link(conversions[graph[cur].parent][cur], fn); cur = graph[cur].parent; } fn.conversion = path; return fn; } var route = function route(fromModel) { var graph = deriveBFS(fromModel); var conversion = {}; var models = Object.keys(graph); for (var len = models.length, i = 0; i < len; i++) { var toModel = models[i]; var node = graph[toModel]; if (node.parent === null) { // no possible conversion, or this node is the source model. continue; } conversion[toModel] = wrapConversion(toModel, graph); } return conversion; }; var convert = {}; var models = Object.keys(conversions); function wrapRaw(fn) { var wrappedFn = function wrappedFn(args) { if (args === undefined || args === null) { return args; } if (arguments.length > 1) { args = Array.prototype.slice.call(arguments); } return fn(args); }; // preserve .conversion property if there is one if ('conversion' in fn) { wrappedFn.conversion = fn.conversion; } return wrappedFn; } function wrapRounded(fn) { var wrappedFn = function wrappedFn(args) { if (args === undefined || args === null) { return args; } if (arguments.length > 1) { args = Array.prototype.slice.call(arguments); } var result = fn(args); // we're assuming the result is an array here. // see notice in conversions.js; don't use box types // in conversion functions. if (_typeof(result) === 'object') { for (var len = result.length, i = 0; i < len; i++) { result[i] = Math.round(result[i]); } } return result; }; // preserve .conversion property if there is one if ('conversion' in fn) { wrappedFn.conversion = fn.conversion; } return wrappedFn; } models.forEach(function (fromModel) { convert[fromModel] = {}; Object.defineProperty(convert[fromModel], 'channels', { value: conversions[fromModel].channels }); Object.defineProperty(convert[fromModel], 'labels', { value: conversions[fromModel].labels }); var routes = route(fromModel); var routeModels = Object.keys(routes); routeModels.forEach(function (toModel) { var fn = routes[toModel]; convert[fromModel][toModel] = wrapRounded(fn); convert[fromModel][toModel].raw = wrapRaw(fn); }); }); var colorConvert = convert; var colorName$1 = { "aliceblue": [240, 248, 255], "antiquewhite": [250, 235, 215], "aqua": [0, 255, 255], "aquamarine": [127, 255, 212], "azure": [240, 255, 255], "beige": [245, 245, 220], "bisque": [255, 228, 196], "black": [0, 0, 0], "blanchedalmond": [255, 235, 205], "blue": [0, 0, 255], "blueviolet": [138, 43, 226], "brown": [165, 42, 42], "burlywood": [222, 184, 135], "cadetblue": [95, 158, 160], "chartreuse": [127, 255, 0], "chocolate": [210, 105, 30], "coral": [255, 127, 80], "cornflowerblue": [100, 149, 237], "cornsilk": [255, 248, 220], "crimson": [220, 20, 60], "cyan": [0, 255, 255], "darkblue": [0, 0, 139], "darkcyan": [0, 139, 139], "darkgoldenrod": [184, 134, 11], "darkgray": [169, 169, 169], "darkgreen": [0, 100, 0], "darkgrey": [169, 169, 169], "darkkhaki": [189, 183, 107], "darkmagenta": [139, 0, 139], "darkolivegreen": [85, 107, 47], "darkorange": [255, 140, 0], "darkorchid": [153, 50, 204], "darkred": [139, 0, 0], "darksalmon": [233, 150, 122], "darkseagreen": [143, 188, 143], "darkslateblue": [72, 61, 139], "darkslategray": [47, 79, 79], "darkslategrey": [47, 79, 79], "darkturquoise": [0, 206, 209], "darkviolet": [148, 0, 211], "deeppink": [255, 20, 147], "deepskyblue": [0, 191, 255], "dimgray": [105, 105, 105], "dimgrey": [105, 105, 105], "dodgerblue": [30, 144, 255], "firebrick": [178, 34, 34], "floralwhite": [255, 250, 240], "forestgreen": [34, 139, 34], "fuchsia": [255, 0, 255], "gainsboro": [220, 220, 220], "ghostwhite": [248, 248, 255], "gold": [255, 215, 0], "goldenrod": [218, 165, 32], "gray": [128, 128, 128], "green": [0, 128, 0], "greenyellow": [173, 255, 47], "grey": [128, 128, 128], "honeydew": [240, 255, 240], "hotpink": [255, 105, 180], "indianred": [205, 92, 92], "indigo": [75, 0, 130], "ivory": [255, 255, 240], "khaki": [240, 230, 140], "lavender": [230, 230, 250], "lavenderblush": [255, 240, 245], "lawngreen": [124, 252, 0], "lemonchiffon": [255, 250, 205], "lightblue": [173, 216, 230], "lightcoral": [240, 128, 128], "lightcyan": [224, 255, 255], "lightgoldenrodyellow": [250, 250, 210], "lightgray": [211, 211, 211], "lightgreen": [144, 238, 144], "lightgrey": [211, 211, 211], "lightpink": [255, 182, 193], "lightsalmon": [255, 160, 122], "lightseagreen": [32, 178, 170], "lightskyblue": [135, 206, 250], "lightslategray": [119, 136, 153], "lightslategrey": [119, 136, 153], "lightsteelblue": [176, 196, 222], "lightyellow": [255, 255, 224], "lime": [0, 255, 0], "limegreen": [50, 205, 50], "linen": [250, 240, 230], "magenta": [255, 0, 255], "maroon": [128, 0, 0], "mediumaquamarine": [102, 205, 170], "mediumblue": [0, 0, 205], "mediumorchid": [186, 85, 211], "mediumpurple": [147, 112, 219], "mediumseagreen": [60, 179, 113], "mediumslateblue": [123, 104, 238], "mediumspringgreen": [0, 250, 154], "mediumturquoise": [72, 209, 204], "mediumvioletred": [199, 21, 133], "midnightblue": [25, 25, 112], "mintcream": [245, 255, 250], "mistyrose": [255, 228, 225], "moccasin": [255, 228, 181], "navajowhite": [255, 222, 173], "navy": [0, 0, 128], "oldlace": [253, 245, 230], "olive": [128, 128, 0], "olivedrab": [107, 142, 35], "orange": [255, 165, 0], "orangered": [255, 69, 0], "orchid": [218, 112, 214], "palegoldenrod": [238, 232, 170], "palegreen": [152, 251, 152], "paleturquoise": [175, 238, 238], "palevioletred": [219, 112, 147], "papayawhip": [255, 239, 213], "peachpuff": [255, 218, 185], "peru": [205, 133, 63], "pink": [255, 192, 203], "plum": [221, 160, 221], "powderblue": [176, 224, 230], "purple": [128, 0, 128], "rebeccapurple": [102, 51, 153], "red": [255, 0, 0], "rosybrown": [188, 143, 143], "royalblue": [65, 105, 225], "saddlebrown": [139, 69, 19], "salmon": [250, 128, 114], "sandybrown": [244, 164, 96], "seagreen": [46, 139, 87], "seashell": [255, 245, 238], "sienna": [160, 82, 45], "silver": [192, 192, 192], "skyblue": [135, 206, 235], "slateblue": [106, 90, 205], "slategray": [112, 128, 144], "slategrey": [112, 128, 144], "snow": [255, 250, 250], "springgreen": [0, 255, 127], "steelblue": [70, 130, 180], "tan": [210, 180, 140], "teal": [0, 128, 128], "thistle": [216, 191, 216], "tomato": [255, 99, 71], "turquoise": [64, 224, 208], "violet": [238, 130, 238], "wheat": [245, 222, 179], "white": [255, 255, 255], "whitesmoke": [245, 245, 245], "yellow": [255, 255, 0], "yellowgreen": [154, 205, 50] }; /* MIT license */ var colorString = { getRgba: getRgba, getHsla: getHsla, getRgb: getRgb, getHsl: getHsl, getHwb: getHwb, getAlpha: getAlpha, hexString: hexString, rgbString: rgbString, rgbaString: rgbaString, percentString: percentString, percentaString: percentaString, hslString: hslString, hslaString: hslaString, hwbString: hwbString, keyword: keyword }; function getRgba(string) { if (!string) { return; } var abbr = /^#([a-fA-F0-9]{3,4})$/i, hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i, rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, keyword = /(\w+)/; var rgb = [0, 0, 0], a = 1, match = string.match(abbr), hexAlpha = ""; if (match) { match = match[1]; hexAlpha = match[3]; for (var i = 0; i < rgb.length; i++) { rgb[i] = parseInt(match[i] + match[i], 16); } if (hexAlpha) { a = Math.round(parseInt(hexAlpha + hexAlpha, 16) / 255 * 100) / 100; } } else if (match = string.match(hex)) { hexAlpha = match[2]; match = match[1]; for (var i = 0; i < rgb.length; i++) { rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); } if (hexAlpha) { a = Math.round(parseInt(hexAlpha, 16) / 255 * 100) / 100; } } else if (match = string.match(rgba)) { for (var i = 0; i < rgb.length; i++) { rgb[i] = parseInt(match[i + 1]); } a = parseFloat(match[4]); } else if (match = string.match(per)) { for (var i = 0; i < rgb.length; i++) { rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); } a = parseFloat(match[4]); } else if (match = string.match(keyword)) { if (match[1] == "transparent") { return [0, 0, 0, 0]; } rgb = colorName$1[match[1]]; if (!rgb) { return; } } for (var i = 0; i < rgb.length; i++) { rgb[i] = scale(rgb[i], 0, 255); } if (!a && a != 0) { a = 1; } else { a = scale(a, 0, 1); } rgb[3] = a; return rgb; } function getHsla(string) { if (!string) { return; } var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; var match = string.match(hsl); if (match) { var alpha = parseFloat(match[4]); var h = scale(parseInt(match[1]), 0, 360), s = scale(parseFloat(match[2]), 0, 100), l = scale(parseFloat(match[3]), 0, 100), a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); return [h, s, l, a]; } } function getHwb(string) { if (!string) { return; } var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; var match = string.match(hwb); if (match) { var alpha = parseFloat(match[4]); var h = scale(parseInt(match[1]), 0, 360), w = scale(parseFloat(match[2]), 0, 100), b = scale(parseFloat(match[3]), 0, 100), a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); return [h, w, b, a]; } } function getRgb(string) { var rgba = getRgba(string); return rgba && rgba.slice(0, 3); } function getHsl(string) { var hsla = getHsla(string); return hsla && hsla.slice(0, 3); } function getAlpha(string) { var vals = getRgba(string); if (vals) { return vals[3]; } else if (vals = getHsla(string)) { return vals[3]; } else if (vals = getHwb(string)) { return vals[3]; } } // generators function hexString(rgba, a) { var a = a !== undefined && rgba.length === 3 ? a : rgba[3]; return "#" + hexDouble(rgba[0]) + hexDouble(rgba[1]) + hexDouble(rgba[2]) + (a >= 0 && a < 1 ? hexDouble(Math.round(a * 255)) : ""); } function rgbString(rgba, alpha) { if (alpha < 1 || rgba[3] && rgba[3] < 1) { return rgbaString(rgba, alpha); } return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; } function rgbaString(rgba, alpha) { if (alpha === undefined) { alpha = rgba[3] !== undefined ? rgba[3] : 1; } return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ", " + alpha + ")"; } function percentString(rgba, alpha) { if (alpha < 1 || rgba[3] && rgba[3] < 1) { return percentaString(rgba, alpha); } var r = Math.round(rgba[0] / 255 * 100), g = Math.round(rgba[1] / 255 * 100), b = Math.round(rgba[2] / 255 * 100); return "rgb(" + r + "%, " + g + "%, " + b + "%)"; } function percentaString(rgba, alpha) { var r = Math.round(rgba[0] / 255 * 100), g = Math.round(rgba[1] / 255 * 100), b = Math.round(rgba[2] / 255 * 100); return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; } function hslString(hsla, alpha) { if (alpha < 1 || hsla[3] && hsla[3] < 1) { return hslaString(hsla, alpha); } return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; } function hslaString(hsla, alpha) { if (alpha === undefined) { alpha = hsla[3] !== undefined ? hsla[3] : 1; } return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + alpha + ")"; } // hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax // (hwb have alpha optional & 1 is default value) function hwbString(hwb, alpha) { if (alpha === undefined) { alpha = hwb[3] !== undefined ? hwb[3] : 1; } return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; } function keyword(rgb) { return reverseNames[rgb.slice(0, 3)]; } // helpers function scale(num, min, max) { return Math.min(Math.max(min, num), max); } function hexDouble(num) { var str = num.toString(16).toUpperCase(); return str.length < 2 ? "0" + str : str; } //create a list of reverse color names var reverseNames = {}; for (var name in colorName$1) { reverseNames[colorName$1[name]] = name; } /* MIT license */ var Color = function Color(obj) { if (obj instanceof Color) { return obj; } if (!(this instanceof Color)) { return new Color(obj); } this.valid = false; this.values = { rgb: [0, 0, 0], hsl: [0, 0, 0], hsv: [0, 0, 0], hwb: [0, 0, 0], cmyk: [0, 0, 0, 0], alpha: 1 }; // parse Color() argument var vals; if (typeof obj === 'string') { vals = colorString.getRgba(obj); if (vals) { this.setValues('rgb', vals); } else if (vals = colorString.getHsla(obj)) { this.setValues('hsl', vals); } else if (vals = colorString.getHwb(obj)) { this.setValues('hwb', vals); } } else if (_typeof(obj) === 'object') { vals = obj; if (vals.r !== undefined || vals.red !== undefined) { this.setValues('rgb', vals); } else if (vals.l !== undefined || vals.lightness !== undefined) { this.setValues('hsl', vals); } else if (vals.v !== undefined || vals.value !== undefined) { this.setValues('hsv', vals); } else if (vals.w !== undefined || vals.whiteness !== undefined) { this.setValues('hwb', vals); } else if (vals.c !== undefined || vals.cyan !== undefined) { this.setValues('cmyk', vals); } } }; Color.prototype = { isValid: function isValid() { return this.valid; }, rgb: function rgb() { return this.setSpace('rgb', arguments); }, hsl: function hsl() { return this.setSpace('hsl', arguments); }, hsv: function hsv() { return this.setSpace('hsv', arguments); }, hwb: function hwb() { return this.setSpace('hwb', arguments); }, cmyk: function cmyk() { return this.setSpace('cmyk', arguments); }, rgbArray: function rgbArray() { return this.values.rgb; }, hslArray: function hslArray() { return this.values.hsl; }, hsvArray: function hsvArray() { return this.values.hsv; }, hwbArray: function hwbArray() { var values = this.values; if (values.alpha !== 1) { return values.hwb.concat([values.alpha]); } return values.hwb; }, cmykArray: function cmykArray() { return this.values.cmyk; }, rgbaArray: function rgbaArray() { var values = this.values; return values.rgb.concat([values.alpha]); }, hslaArray: function hslaArray() { var values = this.values; return values.hsl.concat([values.alpha]); }, alpha: function alpha(val) { if (val === undefined) { return this.values.alpha; } this.setValues('alpha', val); return this; }, red: function red(val) { return this.setChannel('rgb', 0, val); }, green: function green(val) { return this.setChannel('rgb', 1, val); }, blue: function blue(val) { return this.setChannel('rgb', 2, val); }, hue: function hue(val) { if (val) { val %= 360; val = val < 0 ? 360 + val : val; } return this.setChannel('hsl', 0, val); }, saturation: function saturation(val) { return this.setChannel('hsl', 1, val); }, lightness: function lightness(val) { return this.setChannel('hsl', 2, val); }, saturationv: function saturationv(val) { return this.setChannel('hsv', 1, val); }, whiteness: function whiteness(val) { return this.setChannel('hwb', 1, val); }, blackness: function blackness(val) { return this.setChannel('hwb', 2, val); }, value: function value(val) { return this.setChannel('hsv', 2, val); }, cyan: function cyan(val) { return this.setChannel('cmyk', 0, val); }, magenta: function magenta(val) { return this.setChannel('cmyk', 1, val); }, yellow: function yellow(val) { return this.setChannel('cmyk', 2, val); }, black: function black(val) { return this.setChannel('cmyk', 3, val); }, hexString: function hexString() { return colorString.hexString(this.values.rgb); }, rgbString: function rgbString() { return colorString.rgbString(this.values.rgb, this.values.alpha); }, rgbaString: function rgbaString() { return colorString.rgbaString(this.values.rgb, this.values.alpha); }, percentString: function percentString() { return colorString.percentString(this.values.rgb, this.values.alpha); }, hslString: function hslString() { return colorString.hslString(this.values.hsl, this.values.alpha); }, hslaString: function hslaString() { return colorString.hslaString(this.values.hsl, this.values.alpha); }, hwbString: function hwbString() { return colorString.hwbString(this.values.hwb, this.values.alpha); }, keyword: function keyword() { return colorString.keyword(this.values.rgb, this.values.alpha); }, rgbNumber: function rgbNumber() { var rgb = this.values.rgb; return rgb[0] << 16 | rgb[1] << 8 | rgb[2]; }, luminosity: function luminosity() { // http://www.w3.org/TR/WCAG20/#relativeluminancedef var rgb = this.values.rgb; var lum = []; for (var i = 0; i < rgb.length; i++) { var chan = rgb[i] / 255; lum[i] = chan <= 0.03928 ? chan / 12.92 : Math.pow((chan + 0.055) / 1.055, 2.4); } return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; }, contrast: function contrast(color2) { // http://www.w3.org/TR/WCAG20/#contrast-ratiodef var lum1 = this.luminosity(); var lum2 = color2.luminosity(); if (lum1 > lum2) { return (lum1 + 0.05) / (lum2 + 0.05); } return (lum2 + 0.05) / (lum1 + 0.05); }, level: function level(color2) { var contrastRatio = this.contrast(color2); if (contrastRatio >= 7.1) { return 'AAA'; } return contrastRatio >= 4.5 ? 'AA' : ''; }, dark: function dark() { // YIQ equation from http://24ways.org/2010/calculating-color-contrast var rgb = this.values.rgb; var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; return yiq < 128; }, light: function light() { return !this.dark(); }, negate: function negate() { var rgb = []; for (var i = 0; i < 3; i++) { rgb[i] = 255 - this.values.rgb[i]; } this.setValues('rgb', rgb); return this; }, lighten: function lighten(ratio) { var hsl = this.values.hsl; hsl[2] += hsl[2] * ratio; this.setValues('hsl', hsl); return this; }, darken: function darken(ratio) { var hsl = this.values.hsl; hsl[2] -= hsl[2] * ratio; this.setValues('hsl', hsl); return this; }, saturate: function saturate(ratio) { var hsl = this.values.hsl; hsl[1] += hsl[1] * ratio; this.setValues('hsl', hsl); return this; }, desaturate: function desaturate(ratio) { var hsl = this.values.hsl; hsl[1] -= hsl[1] * ratio; this.setValues('hsl', hsl); return this; }, whiten: function whiten(ratio) { var hwb = this.values.hwb; hwb[1] += hwb[1] * ratio; this.setValues('hwb', hwb); return this; }, blacken: function blacken(ratio) { var hwb = this.values.hwb; hwb[2] += hwb[2] * ratio; this.setValues('hwb', hwb); return this; }, greyscale: function greyscale() { var rgb = this.values.rgb; // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; this.setValues('rgb', [val, val, val]); return this; }, clearer: function clearer(ratio) { var alpha = this.values.alpha; this.setValues('alpha', alpha - alpha * ratio); return this; }, opaquer: function opaquer(ratio) { var alpha = this.values.alpha; this.setValues('alpha', alpha + alpha * ratio); return this; }, rotate: function rotate(degrees) { var hsl = this.values.hsl; var hue = (hsl[0] + degrees) % 360; hsl[0] = hue < 0 ? 360 + hue : hue; this.setValues('hsl', hsl); return this; }, /** * Ported from sass implementation in C * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 */ mix: function mix(mixinColor, weight) { var color1 = this; var color2 = mixinColor; var p = weight === undefined ? 0.5 : weight; var w = 2 * p - 1; var a = color1.alpha() - color2.alpha(); var w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0; var w2 = 1 - w1; return this.rgb(w1 * color1.red() + w2 * color2.red(), w1 * color1.green() + w2 * color2.green(), w1 * color1.blue() + w2 * color2.blue()).alpha(color1.alpha() * p + color2.alpha() * (1 - p)); }, toJSON: function toJSON() { return this.rgb(); }, clone: function clone() { // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, // making the final build way to big to embed in Chart.js. So let's do it manually, // assuming that values to clone are 1 dimension arrays containing only numbers, // except 'alpha' which is a number. var result = new Color(); var source = this.values; var target = result.values; var value, type; for (var prop in source) { if (source.hasOwnProperty(prop)) { value = source[prop]; type = {}.toString.call(value); if (type === '[object Array]') { target[prop] = value.slice(0); } else if (type === '[object Number]') { target[prop] = value; } else { console.error('unexpected color value:', value); } } } return result; } }; Color.prototype.spaces = { rgb: ['red', 'green', 'blue'], hsl: ['hue', 'saturation', 'lightness'], hsv: ['hue', 'saturation', 'value'], hwb: ['hue', 'whiteness', 'blackness'], cmyk: ['cyan', 'magenta', 'yellow', 'black'] }; Color.prototype.maxes = { rgb: [255, 255, 255], hsl: [360, 100, 100], hsv: [360, 100, 100], hwb: [360, 100, 100], cmyk: [100, 100, 100, 100] }; Color.prototype.getValues = function (space) { var values = this.values; var vals = {}; for (var i = 0; i < space.length; i++) { vals[space.charAt(i)] = values[space][i]; } if (values.alpha !== 1) { vals.a = values.alpha; } // {r: 255, g: 255, b: 255, a: 0.4} return vals; }; Color.prototype.setValues = function (space, vals) { var values = this.values; var spaces = this.spaces; var maxes = this.maxes; var alpha = 1; var i; this.valid = true; if (space === 'alpha') { alpha = vals; } else if (vals.length) { // [10, 10, 10] values[space] = vals.slice(0, space.length); alpha = vals[space.length]; } else if (vals[space.charAt(0)] !== undefined) { // {r: 10, g: 10, b: 10} for (i = 0; i < space.length; i++) { values[space][i] = vals[space.charAt(i)]; } alpha = vals.a; } else if (vals[spaces[space][0]] !== undefined) { // {red: 10, green: 10, blue: 10} var chans = spaces[space]; for (i = 0; i < space.length; i++) { values[space][i] = vals[chans[i]]; } alpha = vals.alpha; } values.alpha = Math.max(0, Math.min(1, alpha === undefined ? values.alpha : alpha)); if (space === 'alpha') { return false; } var capped; // cap values of the space prior converting all values for (i = 0; i < space.length; i++) { capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); values[space][i] = Math.round(capped); } // convert to all the other color spaces for (var sname in spaces) { if (sname !== space) { values[sname] = colorConvert[space][sname](values[space]); } } return true; }; Color.prototype.setSpace = function (space, args) { var vals = args[0]; if (vals === undefined) { // color.rgb() return this.getValues(space); } // color.rgb(10, 10, 10) if (typeof vals === 'number') { vals = Array.prototype.slice.call(args); } this.setValues(space, vals); return this; }; Color.prototype.setChannel = function (space, index, val) { var svalues = this.values[space]; if (val === undefined) { // color.red() return svalues[index]; } else if (val === svalues[index]) { // color.red(color.red()) return this; } // color.red(100) svalues[index] = val; this.setValues(space, svalues); return this; }; if (typeof window !== 'undefined') { window.Color = Color; } var chartjsColor = Color; function isValidKey(key) { return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1; } /** * @namespace Chart.helpers */ var helpers = { /** * An empty function that can be used, for example, for optional callback. */ noop: function noop() {}, /** * Returns a unique id, sequentially generated from a global variable. * @returns {number} * @function */ uid: function () { var id = 0; return function () { return id++; }; }(), /** * Returns true if `value` is neither null nor undefined, else returns false. * @param {*} value - The value to test. * @returns {boolean} * @since 2.7.0 */ isNullOrUndef: function isNullOrUndef(value) { return value === null || typeof value === 'undefined'; }, /** * Returns true if `value` is an array (including typed arrays), else returns false. * @param {*} value - The value to test. * @returns {boolean} * @function */ isArray: function isArray(value) { if (Array.isArray && Array.isArray(value)) { return true; } var type = Object.prototype.toString.call(value); if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') { return true; } return false; }, /** * Returns true if `value` is an object (excluding null), else returns false. * @param {*} value - The value to test. * @returns {boolean} * @since 2.7.0 */ isObject: function isObject(value) { return value !== null && Object.prototype.toString.call(value) === '[object Object]'; }, /** * Returns true if `value` is a finite number, else returns false * @param {*} value - The value to test. * @returns {boolean} */ isFinite: function (_isFinite) { function isFinite(_x) { return _isFinite.apply(this, arguments); } isFinite.toString = function () { return _isFinite.toString(); }; return isFinite; }(function (value) { return (typeof value === 'number' || value instanceof Number) && isFinite(value); }), /** * Returns `value` if defined, else returns `defaultValue`. * @param {*} value - The value to return if defined. * @param {*} defaultValue - The value to return if `value` is undefined. * @returns {*} */ valueOrDefault: function valueOrDefault(value, defaultValue) { return typeof value === 'undefined' ? defaultValue : value; }, /** * Returns value at the given `index` in array if defined, else returns `defaultValue`. * @param {Array} value - The array to lookup for value at `index`. * @param {number} index - The index in `value` to lookup for value. * @param {*} defaultValue - The value to return if `value[index]` is undefined. * @returns {*} */ valueAtIndexOrDefault: function valueAtIndexOrDefault(value, index, defaultValue) { return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); }, /** * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the * value returned by `fn`. If `fn` is not a function, this method returns undefined. * @param {function} fn - The function to call. * @param {Array|undefined|null} args - The arguments with which `fn` should be called. * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. * @returns {*} */ callback: function callback(fn, args, thisArg) { if (fn && typeof fn.call === 'function') { return fn.apply(thisArg, args); } }, /** * Note(SB) for performance sake, this method should only be used when loopable type * is unknown or in none intensive code (not called often and small loopable). Else * it's preferable to use a regular for() loop and save extra function calls. * @param {object|Array} loopable - The object or array to be iterated. * @param {function} fn - The function to call for each item. * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. * @param {boolean} [reverse] - If true, iterates backward on the loopable. */ each: function each(loopable, fn, thisArg, reverse) { var i, len, keys; if (helpers.isArray(loopable)) { len = loopable.length; if (reverse) { for (i = len - 1; i >= 0; i--) { fn.call(thisArg, loopable[i], i); } } else { for (i = 0; i < len; i++) { fn.call(thisArg, loopable[i], i); } } } else if (helpers.isObject(loopable)) { keys = Object.keys(loopable); len = keys.length; for (i = 0; i < len; i++) { fn.call(thisArg, loopable[keys[i]], keys[i]); } } }, /** * Returns true if the `a0` and `a1` arrays have the same content, else returns false. * @see https://stackoverflow.com/a/14853974 * @param {Array} a0 - The array to compare * @param {Array} a1 - The array to compare * @returns {boolean} */ arrayEquals: function arrayEquals(a0, a1) { var i, ilen, v0, v1; if (!a0 || !a1 || a0.length !== a1.length) { return false; } for (i = 0, ilen = a0.length; i < ilen; ++i) { v0 = a0[i]; v1 = a1[i]; if (v0 instanceof Array && v1 instanceof Array) { if (!helpers.arrayEquals(v0, v1)) { return false; } } else if (v0 !== v1) { // NOTE: two different object instances will never be equal: {x:20} != {x:20} return false; } } return true; }, /** * Returns a deep copy of `source` without keeping references on objects and arrays. * @param {*} source - The value to clone. * @returns {*} */ clone: function clone(source) { if (helpers.isArray(source)) { return source.map(helpers.clone); } if (helpers.isObject(source)) { var target = Object.create(source); var keys = Object.keys(source); var klen = keys.length; var k = 0; for (; k < klen; ++k) { target[keys[k]] = helpers.clone(source[keys[k]]); } return target; } return source; }, /** * The default merger when Chart.helpers.merge is called without merger option. * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback. * @private */ _merger: function _merger(key, target, source, options) { if (!isValidKey(key)) { // We want to ensure we do not copy prototypes over // as this can pollute global namespaces return; } var tval = target[key]; var sval = source[key]; if (helpers.isObject(tval) && helpers.isObject(sval)) { helpers.merge(tval, sval, options); } else { target[key] = helpers.clone(sval); } }, /** * Merges source[key] in target[key] only if target[key] is undefined. * @private */ _mergerIf: function _mergerIf(key, target, source) { if (!isValidKey(key)) { // We want to ensure we do not copy prototypes over // as this can pollute global namespaces return; } var tval = target[key]; var sval = source[key]; if (helpers.isObject(tval) && helpers.isObject(sval)) { helpers.mergeIf(tval, sval); } else if (!target.hasOwnProperty(key)) { target[key] = helpers.clone(sval); } }, /** * Recursively deep copies `source` properties into `target` with the given `options`. * IMPORTANT: `target` is not cloned and will be updated with `source` properties. * @param {object} target - The target object in which all sources are merged into. * @param {object|object[]} source - Object(s) to merge into `target`. * @param {object} [options] - Merging options: * @param {function} [options.merger] - The merge method (key, target, source, options) * @returns {object} The `target` object. */ merge: function merge(target, source, options) { var sources = helpers.isArray(source) ? source : [source]; var ilen = sources.length; var merge, i, keys, klen, k; if (!helpers.isObject(target)) { return target; } options = options || {}; merge = options.merger || helpers._merger; for (i = 0; i < ilen; ++i) { source = sources[i]; if (!helpers.isObject(source)) { continue; } keys = Object.keys(source); for (k = 0, klen = keys.length; k < klen; ++k) { merge(keys[k], target, source, options); } } return target; }, /** * Recursively deep copies `source` properties into `target` *only* if not defined in target. * IMPORTANT: `target` is not cloned and will be updated with `source` properties. * @param {object} target - The target object in which all sources are merged into. * @param {object|object[]} source - Object(s) to merge into `target`. * @returns {object} The `target` object. */ mergeIf: function mergeIf(target, source) { return helpers.merge(target, source, { merger: helpers._mergerIf }); }, /** * Applies the contents of two or more objects together into the first object. * @param {object} target - The target object in which all objects are merged into. * @param {object} arg1 - Object containing additional properties to merge in target. * @param {object} argN - Additional objects containing properties to merge in target. * @returns {object} The `target` object. */ extend: Object.assign || function (target) { return helpers.merge(target, [].slice.call(arguments, 1), { merger: function merger(key, dst, src) { dst[key] = src[key]; } }); }, /** * Basic javascript inheritance based on the model created in Backbone.js */ inherits: function inherits(extensions) { var me = this; var ChartElement = extensions && extensions.hasOwnProperty('constructor') ? extensions.constructor : function () { return me.apply(this, arguments); }; var Surrogate = function Surrogate() { this.constructor = ChartElement; }; Surrogate.prototype = me.prototype; ChartElement.prototype = new Surrogate(); ChartElement.extend = helpers.inherits; if (extensions) { helpers.extend(ChartElement.prototype, extensions); } ChartElement.__super__ = me.prototype; return ChartElement; }, _deprecated: function _deprecated(scope, value, previous, current) { if (value !== undefined) { console.warn(scope + ': "' + previous + '" is deprecated. Please use "' + current + '" instead'); } } }; var helpers_core = helpers; // DEPRECATIONS /** * Provided for backward compatibility, use Chart.helpers.callback instead. * @function Chart.helpers.callCallback * @deprecated since version 2.6.0 * @todo remove at version 3 * @private */ helpers.callCallback = helpers.callback; /** * Provided for backward compatibility, use Array.prototype.indexOf instead. * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ * @function Chart.helpers.indexOf * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.indexOf = function (array, item, fromIndex) { return Array.prototype.indexOf.call(array, item, fromIndex); }; /** * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. * @function Chart.helpers.getValueOrDefault * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.getValueOrDefault = helpers.valueOrDefault; /** * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. * @function Chart.helpers.getValueAtIndexOrDefault * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; /** * Easing functions adapted from Robert Penner's easing equations. * @namespace Chart.helpers.easingEffects * @see http://www.robertpenner.com/easing/ */ var effects = { linear: function linear(t) { return t; }, easeInQuad: function easeInQuad(t) { return t * t; }, easeOutQuad: function easeOutQuad(t) { return -t * (t - 2); }, easeInOutQuad: function easeInOutQuad(t) { if ((t /= 0.5) < 1) { return 0.5 * t * t; } return -0.5 * (--t * (t - 2) - 1); }, easeInCubic: function easeInCubic(t) { return t * t * t; }, easeOutCubic: function easeOutCubic(t) { return (t = t - 1) * t * t + 1; }, easeInOutCubic: function easeInOutCubic(t) { if ((t /= 0.5) < 1) { return 0.5 * t * t * t; } return 0.5 * ((t -= 2) * t * t + 2); }, easeInQuart: function easeInQuart(t) { return t * t * t * t; }, easeOutQuart: function easeOutQuart(t) { return -((t = t - 1) * t * t * t - 1); }, easeInOutQuart: function easeInOutQuart(t) { if ((t /= 0.5) < 1) { return 0.5 * t * t * t * t; } return -0.5 * ((t -= 2) * t * t * t - 2); }, easeInQuint: function easeInQuint(t) { return t * t * t * t * t; }, easeOutQuint: function easeOutQuint(t) { return (t = t - 1) * t * t * t * t + 1; }, easeInOutQuint: function easeInOutQuint(t) { if ((t /= 0.5) < 1) { return 0.5 * t * t * t * t * t; } return 0.5 * ((t -= 2) * t * t * t * t + 2); }, easeInSine: function easeInSine(t) { return -Math.cos(t * (Math.PI / 2)) + 1; }, easeOutSine: function easeOutSine(t) { return Math.sin(t * (Math.PI / 2)); }, easeInOutSine: function easeInOutSine(t) { return -0.5 * (Math.cos(Math.PI * t) - 1); }, easeInExpo: function easeInExpo(t) { return t === 0 ? 0 : Math.pow(2, 10 * (t - 1)); }, easeOutExpo: function easeOutExpo(t) { return t === 1 ? 1 : -Math.pow(2, -10 * t) + 1; }, easeInOutExpo: function easeInOutExpo(t) { if (t === 0) { return 0; } if (t === 1) { return 1; } if ((t /= 0.5) < 1) { return 0.5 * Math.pow(2, 10 * (t - 1)); } return 0.5 * (-Math.pow(2, -10 * --t) + 2); }, easeInCirc: function easeInCirc(t) { if (t >= 1) { return t; } return -(Math.sqrt(1 - t * t) - 1); }, easeOutCirc: function easeOutCirc(t) { return Math.sqrt(1 - (t = t - 1) * t); }, easeInOutCirc: function easeInOutCirc(t) { if ((t /= 0.5) < 1) { return -0.5 * (Math.sqrt(1 - t * t) - 1); } return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); }, easeInElastic: function easeInElastic(t) { var s = 1.70158; var p = 0; var a = 1; if (t === 0) { return 0; } if (t === 1) { return 1; } if (!p) { p = 0.3; } if (a < 1) { a = 1; s = p / 4; } else { s = p / (2 * Math.PI) * Math.asin(1 / a); } return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); }, easeOutElastic: function easeOutElastic(t) { var s = 1.70158; var p = 0; var a = 1; if (t === 0) { return 0; } if (t === 1) { return 1; } if (!p) { p = 0.3; } if (a < 1) { a = 1; s = p / 4; } else { s = p / (2 * Math.PI) * Math.asin(1 / a); } return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; }, easeInOutElastic: function easeInOutElastic(t) { var s = 1.70158; var p = 0; var a = 1; if (t === 0) { return 0; } if ((t /= 0.5) === 2) { return 1; } if (!p) { p = 0.45; } if (a < 1) { a = 1; s = p / 4; } else { s = p / (2 * Math.PI) * Math.asin(1 / a); } if (t < 1) { return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); } return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; }, easeInBack: function easeInBack(t) { var s = 1.70158; return t * t * ((s + 1) * t - s); }, easeOutBack: function easeOutBack(t) { var s = 1.70158; return (t = t - 1) * t * ((s + 1) * t + s) + 1; }, easeInOutBack: function easeInOutBack(t) { var s = 1.70158; if ((t /= 0.5) < 1) { return 0.5 * (t * t * (((s *= 1.525) + 1) * t - s)); } return 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2); }, easeInBounce: function easeInBounce(t) { return 1 - effects.easeOutBounce(1 - t); }, easeOutBounce: function easeOutBounce(t) { if (t < 1 / 2.75) { return 7.5625 * t * t; } if (t < 2 / 2.75) { return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75; } if (t < 2.5 / 2.75) { return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375; } return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375; }, easeInOutBounce: function easeInOutBounce(t) { if (t < 0.5) { return effects.easeInBounce(t * 2) * 0.5; } return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; } }; var helpers_easing = { effects: effects }; // DEPRECATIONS /** * Provided for backward compatibility, use Chart.helpers.easing.effects instead. * @function Chart.helpers.easingEffects * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers_core.easingEffects = effects; var PI = Math.PI; var RAD_PER_DEG = PI / 180; var DOUBLE_PI = PI * 2; var HALF_PI = PI / 2; var QUARTER_PI = PI / 4; var TWO_THIRDS_PI = PI * 2 / 3; /** * @namespace Chart.helpers.canvas */ var exports$1 = { /** * Clears the entire canvas associated to the given `chart`. * @param {Chart} chart - The chart for which to clear the canvas. */ clear: function clear(chart) { chart.ctx.clearRect(0, 0, chart.width, chart.height); }, /** * Creates a "path" for a rectangle with rounded corners at position (x, y) with a * given size (width, height) and the same `radius` for all corners. * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. * @param {number} x - The x axis of the coordinate for the rectangle starting point. * @param {number} y - The y axis of the coordinate for the rectangle starting point. * @param {number} width - The rectangle's width. * @param {number} height - The rectangle's height. * @param {number} radius - The rounded amount (in pixels) for the four corners. * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? */ roundedRect: function roundedRect(ctx, x, y, width, height, radius) { if (radius) { var r = Math.min(radius, height / 2, width / 2); var left = x + r; var top = y + r; var right = x + width - r; var bottom = y + height - r; ctx.moveTo(x, top); if (left < right && top < bottom) { ctx.arc(left, top, r, -PI, -HALF_PI); ctx.arc(right, top, r, -HALF_PI, 0); ctx.arc(right, bottom, r, 0, HALF_PI); ctx.arc(left, bottom, r, HALF_PI, PI); } else if (left < right) { ctx.moveTo(left, y); ctx.arc(right, top, r, -HALF_PI, HALF_PI); ctx.arc(left, top, r, HALF_PI, PI + HALF_PI); } else if (top < bottom) { ctx.arc(left, top, r, -PI, 0); ctx.arc(left, bottom, r, 0, PI); } else { ctx.arc(left, top, r, -PI, PI); } ctx.closePath(); ctx.moveTo(x, y); } else { ctx.rect(x, y, width, height); } }, drawPoint: function drawPoint(ctx, style, radius, x, y, rotation) { var type, xOffset, yOffset, size, cornerRadius; var rad = (rotation || 0) * RAD_PER_DEG; if (style && _typeof(style) === 'object') { type = style.toString(); if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { ctx.save(); ctx.translate(x, y); ctx.rotate(rad); ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height); ctx.restore(); return; } } if (isNaN(radius) || radius <= 0) { return; } ctx.beginPath(); switch (style) { // Default includes circle default: ctx.arc(x, y, radius, 0, DOUBLE_PI); ctx.closePath(); break; case 'triangle': ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); rad += TWO_THIRDS_PI; ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); rad += TWO_THIRDS_PI; ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); ctx.closePath(); break; case 'rectRounded': // NOTE: the rounded rect implementation changed to use `arc` instead of // `quadraticCurveTo` since it generates better results when rect is // almost a circle. 0.516 (instead of 0.5) produces results with visually // closer proportion to the previous impl and it is inscribed in the // circle with `radius`. For more details, see the following PRs: // https://github.com/chartjs/Chart.js/issues/5597 // https://github.com/chartjs/Chart.js/issues/5858 cornerRadius = radius * 0.516; size = radius - cornerRadius; xOffset = Math.cos(rad + QUARTER_PI) * size; yOffset = Math.sin(rad + QUARTER_PI) * size; ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad); ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI); ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); ctx.closePath(); break; case 'rect': if (!rotation) { size = Math.SQRT1_2 * radius; ctx.rect(x - size, y - size, 2 * size, 2 * size); break; } rad += QUARTER_PI; /* falls through */ case 'rectRot': xOffset = Math.cos(rad) * radius; yOffset = Math.sin(rad) * radius; ctx.moveTo(x - xOffset, y - yOffset); ctx.lineTo(x + yOffset, y - xOffset); ctx.lineTo(x + xOffset, y + yOffset); ctx.lineTo(x - yOffset, y + xOffset); ctx.closePath(); break; case 'crossRot': rad += QUARTER_PI; /* falls through */ case 'cross': xOffset = Math.cos(rad) * radius; yOffset = Math.sin(rad) * radius; ctx.moveTo(x - xOffset, y - yOffset); ctx.lineTo(x + xOffset, y + yOffset); ctx.moveTo(x + yOffset, y - xOffset); ctx.lineTo(x - yOffset, y + xOffset); break; case 'star': xOffset = Math.cos(rad) * radius; yOffset = Math.sin(rad) * radius; ctx.moveTo(x - xOffset, y - yOffset); ctx.lineTo(x + xOffset, y + yOffset); ctx.moveTo(x + yOffset, y - xOffset); ctx.lineTo(x - yOffset, y + xOffset); rad += QUARTER_PI; xOffset = Math.cos(rad) * radius; yOffset = Math.sin(rad) * radius; ctx.moveTo(x - xOffset, y - yOffset); ctx.lineTo(x + xOffset, y + yOffset); ctx.moveTo(x + yOffset, y - xOffset); ctx.lineTo(x - yOffset, y + xOffset); break; case 'line': xOffset = Math.cos(rad) * radius; yOffset = Math.sin(rad) * radius; ctx.moveTo(x - xOffset, y - yOffset); ctx.lineTo(x + xOffset, y + yOffset); break; case 'dash': ctx.moveTo(x, y); ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius); break; } ctx.fill(); ctx.stroke(); }, /** * Returns true if the point is inside the rectangle * @param {object} point - The point to test * @param {object} area - The rectangle * @returns {boolean} * @private */ _isPointInArea: function _isPointInArea(point, area) { var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error. return point.x > area.left - epsilon && point.x < area.right + epsilon && point.y > area.top - epsilon && point.y < area.bottom + epsilon; }, clipArea: function clipArea(ctx, area) { ctx.save(); ctx.beginPath(); ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); ctx.clip(); }, unclipArea: function unclipArea(ctx) { ctx.restore(); }, lineTo: function lineTo(ctx, previous, target, flip) { var stepped = target.steppedLine; if (stepped) { if (stepped === 'middle') { var midpoint = (previous.x + target.x) / 2.0; ctx.lineTo(midpoint, flip ? target.y : previous.y); ctx.lineTo(midpoint, flip ? previous.y : target.y); } else if (stepped === 'after' && !flip || stepped !== 'after' && flip) { ctx.lineTo(previous.x, target.y); } else { ctx.lineTo(target.x, previous.y); } ctx.lineTo(target.x, target.y); return; } if (!target.tension) { ctx.lineTo(target.x, target.y); return; } ctx.bezierCurveTo(flip ? previous.controlPointPreviousX : previous.controlPointNextX, flip ? previous.controlPointPreviousY : previous.controlPointNextY, flip ? target.controlPointNextX : target.controlPointPreviousX, flip ? target.controlPointNextY : target.controlPointPreviousY, target.x, target.y); } }; var helpers_canvas = exports$1; // DEPRECATIONS /** * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. * @namespace Chart.helpers.clear * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers_core.clear = exports$1.clear; /** * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. * @namespace Chart.helpers.drawRoundedRectangle * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers_core.drawRoundedRectangle = function (ctx) { ctx.beginPath(); exports$1.roundedRect.apply(exports$1, arguments); }; var defaults = { /** * @private */ _set: function _set(scope, values) { return helpers_core.merge(this[scope] || (this[scope] = {}), values); } }; // TODO(v3): remove 'global' from namespace. all default are global and // there's inconsistency around which options are under 'global' defaults._set('global', { defaultColor: 'rgba(0,0,0,0.1)', defaultFontColor: '#666', defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", defaultFontSize: 12, defaultFontStyle: 'normal', defaultLineHeight: 1.2, showLines: true }); var core_defaults = defaults; var valueOrDefault = helpers_core.valueOrDefault; /** * Converts the given font object into a CSS font string. * @param {object} font - A font object. * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font * @private */ function toFontString(font) { if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) { return null; } return (font.style ? font.style + ' ' : '') + (font.weight ? font.weight + ' ' : '') + font.size + 'px ' + font.family; } /** * @alias Chart.helpers.options * @namespace */ var helpers_options = { /** * Converts the given line height `value` in pixels for a specific font `size`. * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). * @param {number} size - The font size (in pixels) used to resolve relative `value`. * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid). * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height * @since 2.7.0 */ toLineHeight: function toLineHeight(value, size) { var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); if (!matches || matches[1] === 'normal') { return size * 1.2; } value = +matches[2]; switch (matches[3]) { case 'px': return value; case '%': value /= 100; break; } return size * value; }, /** * Converts the given value into a padding object with pre-computed width/height. * @param {number|object} value - If a number, set the value to all TRBL component, * else, if and object, use defined properties and sets undefined ones to 0. * @returns {object} The padding values (top, right, bottom, left, width, height) * @since 2.7.0 */ toPadding: function toPadding(value) { var t, r, b, l; if (helpers_core.isObject(value)) { t = +value.top || 0; r = +value.right || 0; b = +value.bottom || 0; l = +value.left || 0; } else { t = r = b = l = +value || 0; } return { top: t, right: r, bottom: b, left: l, height: t + b, width: l + r }; }, /** * Parses font options and returns the font object. * @param {object} options - A object that contains font options to be parsed. * @return {object} The font object. * @todo Support font.* options and renamed to toFont(). * @private */ _parseFont: function _parseFont(options) { var globalDefaults = core_defaults.global; var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); var font = { family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily), lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size), size: size, style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle), weight: null, string: '' }; font.string = toFontString(font); return font; }, /** * Evaluates the given `inputs` sequentially and returns the first defined value. * @param {Array} inputs - An array of values, falling back to the last value. * @param {object} [context] - If defined and the current value is a function, the value * is called with `context` as first argument and the result becomes the new input. * @param {number} [index] - If defined and the current value is an array, the value * at `index` become the new input. * @param {object} [info] - object to return information about resolution in * @param {boolean} [info.cacheable] - Will be set to `false` if option is not cacheable. * @since 2.7.0 */ resolve: function resolve(inputs, context, index, info) { var cacheable = true; var i, ilen, value; for (i = 0, ilen = inputs.length; i < ilen; ++i) { value = inputs[i]; if (value === undefined) { continue; } if (context !== undefined && typeof value === 'function') { value = value(context); cacheable = false; } if (index !== undefined && helpers_core.isArray(value)) { value = value[index]; cacheable = false; } if (value !== undefined) { if (info && !cacheable) { info.cacheable = false; } return value; } } } }; /** * @alias Chart.helpers.math * @namespace */ var exports$2 = { /** * Returns an array of factors sorted from 1 to sqrt(value) * @private */ _factorize: function _factorize(value) { var result = []; var sqrt = Math.sqrt(value); var i; for (i = 1; i < sqrt; i++) { if (value % i === 0) { result.push(i); result.push(value / i); } } if (sqrt === (sqrt | 0)) { // if value is a square number result.push(sqrt); } result.sort(function (a, b) { return a - b; }).pop(); return result; }, log10: Math.log10 || function (x) { var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10. // Check for whole powers of 10, // which due to floating point rounding error should be corrected. var powerOf10 = Math.round(exponent); var isPowerOf10 = x === Math.pow(10, powerOf10); return isPowerOf10 ? powerOf10 : exponent; } }; var helpers_math = exports$2; // DEPRECATIONS /** * Provided for backward compatibility, use Chart.helpers.math.log10 instead. * @namespace Chart.helpers.log10 * @deprecated since version 2.9.0 * @todo remove at version 3 * @private */ helpers_core.log10 = exports$2.log10; var getRtlAdapter = function getRtlAdapter(rectX, width) { return { x: function x(_x2) { return rectX + rectX + width - _x2; }, setWidth: function setWidth(w) { width = w; }, textAlign: function textAlign(align) { if (align === 'center') { return align; } return align === 'right' ? 'left' : 'right'; }, xPlus: function xPlus(x, value) { return x - value; }, leftForLtr: function leftForLtr(x, itemWidth) { return x - itemWidth; } }; }; var getLtrAdapter = function getLtrAdapter() { return { x: function x(_x3) { return _x3; }, setWidth: function setWidth(w) {// eslint-disable-line no-unused-vars }, textAlign: function textAlign(align) { return align; }, xPlus: function xPlus(x, value) { return x + value; }, leftForLtr: function leftForLtr(x, _itemWidth) { // eslint-disable-line no-unused-vars return x; } }; }; var getAdapter = function getAdapter(rtl, rectX, width) { return rtl ? getRtlAdapter(rectX, width) : getLtrAdapter(); }; var overrideTextDirection = function overrideTextDirection(ctx, direction) { var style, original; if (direction === 'ltr' || direction === 'rtl') { style = ctx.canvas.style; original = [style.getPropertyValue('direction'), style.getPropertyPriority('direction')]; style.setProperty('direction', direction, 'important'); ctx.prevTextDirection = original; } }; var restoreTextDirection = function restoreTextDirection(ctx) { var original = ctx.prevTextDirection; if (original !== undefined) { delete ctx.prevTextDirection; ctx.canvas.style.setProperty('direction', original[0], original[1]); } }; var helpers_rtl = { getRtlAdapter: getAdapter, overrideTextDirection: overrideTextDirection, restoreTextDirection: restoreTextDirection }; var helpers$1 = helpers_core; var easing = helpers_easing; var canvas = helpers_canvas; var options = helpers_options; var math = helpers_math; var rtl = helpers_rtl; helpers$1.easing = easing; helpers$1.canvas = canvas; helpers$1.options = options; helpers$1.math = math; helpers$1.rtl = rtl; function interpolate(start, view, model, ease) { var keys = Object.keys(model); var i, ilen, key, actual, origin, target, type, c0, c1; for (i = 0, ilen = keys.length; i < ilen; ++i) { key = keys[i]; target = model[key]; // if a value is added to the model after pivot() has been called, the view // doesn't contain it, so let's initialize the view to the target value. if (!view.hasOwnProperty(key)) { view[key] = target; } actual = view[key]; if (actual === target || key[0] === '_') { continue; } if (!start.hasOwnProperty(key)) { start[key] = actual; } origin = start[key]; type = _typeof(target); if (type === _typeof(origin)) { if (type === 'string') { c0 = chartjsColor(origin); if (c0.valid) { c1 = chartjsColor(target); if (c1.valid) { view[key] = c1.mix(c0, ease).rgbString(); continue; } } } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) { view[key] = origin + (target - origin) * ease; continue; } } view[key] = target; } } var Element = function Element(configuration) { helpers$1.extend(this, configuration); this.initialize.apply(this, arguments); }; helpers$1.extend(Element.prototype, { _type: undefined, initialize: function initialize() { this.hidden = false; }, pivot: function pivot() { var me = this; if (!me._view) { me._view = helpers$1.extend({}, me._model); } me._start = {}; return me; }, transition: function transition(ease) { var me = this; var model = me._model; var start = me._start; var view = me._view; // No animation -> No Transition if (!model || ease === 1) { me._view = helpers$1.extend({}, model); me._start = null; return me; } if (!view) { view = me._view = {}; } if (!start) { start = me._start = {}; } interpolate(start, view, model, ease); return me; }, tooltipPosition: function tooltipPosition() { return { x: this._model.x, y: this._model.y }; }, hasValue: function hasValue() { return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y); } }); Element.extend = helpers$1.inherits; var core_element = Element; var exports$3 = core_element.extend({ chart: null, // the animation associated chart instance currentStep: 0, // the current animation step numSteps: 60, // default number of steps easing: '', // the easing to use for this animation render: null, // render function used by the animation service onAnimationProgress: null, // user specified callback to fire on each step of the animation onAnimationComplete: null // user specified callback to fire when the animation finishes }); var core_animation = exports$3; // DEPRECATIONS /** * Provided for backward compatibility, use Chart.Animation instead * @prop Chart.Animation#animationObject * @deprecated since version 2.6.0 * @todo remove at version 3 */ Object.defineProperty(exports$3.prototype, 'animationObject', { get: function get() { return this; } }); /** * Provided for backward compatibility, use Chart.Animation#chart instead * @prop Chart.Animation#chartInstance * @deprecated since version 2.6.0 * @todo remove at version 3 */ Object.defineProperty(exports$3.prototype, 'chartInstance', { get: function get() { return this.chart; }, set: function set(value) { this.chart = value; } }); core_defaults._set('global', { animation: { duration: 1000, easing: 'easeOutQuart', onProgress: helpers$1.noop, onComplete: helpers$1.noop } }); var core_animations = { animations: [], request: null, /** * @param {Chart} chart - The chart to animate. * @param {Chart.Animation} animation - The animation that we will animate. * @param {number} duration - The animation duration in ms. * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions */ addAnimation: function addAnimation(chart, animation, duration, lazy) { var animations = this.animations; var i, ilen; animation.chart = chart; animation.startTime = Date.now(); animation.duration = duration; if (!lazy) { chart.animating = true; } for (i = 0, ilen = animations.length; i < ilen; ++i) { if (animations[i].chart === chart) { animations[i] = animation; return; } } animations.push(animation); // If there are no animations queued, manually kickstart a digest, for lack of a better word if (animations.length === 1) { this.requestAnimationFrame(); } }, cancelAnimation: function cancelAnimation(chart) { var index = helpers$1.findIndex(this.animations, function (animation) { return animation.chart === chart; }); if (index !== -1) { this.animations.splice(index, 1); chart.animating = false; } }, requestAnimationFrame: function requestAnimationFrame() { var me = this; if (me.request === null) { // Skip animation frame requests until the active one is executed. // This can happen when processing mouse events, e.g. 'mousemove' // and 'mouseout' events will trigger multiple renders. me.request = helpers$1.requestAnimFrame.call(window, function () { me.request = null; me.startDigest(); }); } }, /** * @private */ startDigest: function startDigest() { var me = this; me.advance(); // Do we have more stuff to animate? if (me.animations.length > 0) { me.requestAnimationFrame(); } }, /** * @private */ advance: function advance() { var animations = this.animations; var animation, chart, numSteps, nextStep; var i = 0; // 1 animation per chart, so we are looping charts here while (i < animations.length) { animation = animations[i]; chart = animation.chart; numSteps = animation.numSteps; // Make sure that currentStep starts at 1 // https://github.com/chartjs/Chart.js/issues/6104 nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1; animation.currentStep = Math.min(nextStep, numSteps); helpers$1.callback(animation.render, [chart, animation], chart); helpers$1.callback(animation.onAnimationProgress, [animation], chart); if (animation.currentStep >= numSteps) { helpers$1.callback(animation.onAnimationComplete, [animation], chart); chart.animating = false; animations.splice(i, 1); } else { ++i; } } } }; var resolve = helpers$1.options.resolve; var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; /** * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', * 'unshift') and notify the listener AFTER the array has been altered. Listeners are * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. */ function listenArrayEvents(array, listener) { if (array._chartjs) { array._chartjs.listeners.push(listener); return; } Object.defineProperty(array, '_chartjs', { configurable: true, enumerable: false, value: { listeners: [listener] } }); arrayEvents.forEach(function (key) { var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); var base = array[key]; Object.defineProperty(array, key, { configurable: true, enumerable: false, value: function value() { var args = Array.prototype.slice.call(arguments); var res = base.apply(this, args); helpers$1.each(array._chartjs.listeners, function (object) { if (typeof object[method] === 'function') { object[method].apply(object, args); } }); return res; } }); }); } /** * Removes the given array event listener and cleanup extra attached properties (such as * the _chartjs stub and overridden methods) if array doesn't have any more listeners. */ function unlistenArrayEvents(array, listener) { var stub = array._chartjs; if (!stub) { return; } var listeners = stub.listeners; var index = listeners.indexOf(listener); if (index !== -1) { listeners.splice(index, 1); } if (listeners.length > 0) { return; } arrayEvents.forEach(function (key) { delete array[key]; }); delete array._chartjs; } // Base class for all dataset controllers (line, bar, etc) var DatasetController = function DatasetController(chart, datasetIndex) { this.initialize(chart, datasetIndex); }; helpers$1.extend(DatasetController.prototype, { /** * Element type used to generate a meta dataset (e.g. Chart.element.Line). * @type {Chart.core.element} */ datasetElementType: null, /** * Element type used to generate a meta data (e.g. Chart.element.Point). * @type {Chart.core.element} */ dataElementType: null, /** * Dataset element option keys to be resolved in _resolveDatasetElementOptions. * A derived controller may override this to resolve controller-specific options. * The keys defined here are for backward compatibility for legend styles. * @private */ _datasetElementOptions: ['backgroundColor', 'borderCapStyle', 'borderColor', 'borderDash', 'borderDashOffset', 'borderJoinStyle', 'borderWidth'], /** * Data element option keys to be resolved in _resolveDataElementOptions. * A derived controller may override this to resolve controller-specific options. * The keys defined here are for backward compatibility for legend styles. * @private */ _dataElementOptions: ['backgroundColor', 'borderColor', 'borderWidth', 'pointStyle'], initialize: function initialize(chart, datasetIndex) { var me = this; me.chart = chart; me.index = datasetIndex; me.linkScales(); me.addElements(); me._type = me.getMeta().type; }, updateIndex: function updateIndex(datasetIndex) { this.index = datasetIndex; }, linkScales: function linkScales() { var me = this; var meta = me.getMeta(); var chart = me.chart; var scales = chart.scales; var dataset = me.getDataset(); var scalesOpts = chart.options.scales; if (meta.xAxisID === null || !(meta.xAxisID in scales) || dataset.xAxisID) { meta.xAxisID = dataset.xAxisID || scalesOpts.xAxes[0].id; } if (meta.yAxisID === null || !(meta.yAxisID in scales) || dataset.yAxisID) { meta.yAxisID = dataset.yAxisID || scalesOpts.yAxes[0].id; } }, getDataset: function getDataset() { return this.chart.data.datasets[this.index]; }, getMeta: function getMeta() { return this.chart.getDatasetMeta(this.index); }, getScaleForId: function getScaleForId(scaleID) { return this.chart.scales[scaleID]; }, /** * @private */ _getValueScaleId: function _getValueScaleId() { return this.getMeta().yAxisID; }, /** * @private */ _getIndexScaleId: function _getIndexScaleId() { return this.getMeta().xAxisID; }, /** * @private */ _getValueScale: function _getValueScale() { return this.getScaleForId(this._getValueScaleId()); }, /** * @private */ _getIndexScale: function _getIndexScale() { return this.getScaleForId(this._getIndexScaleId()); }, reset: function reset() { this._update(true); }, /** * @private */ destroy: function destroy() { if (this._data) { unlistenArrayEvents(this._data, this); } }, createMetaDataset: function createMetaDataset() { var me = this; var type = me.datasetElementType; return type && new type({ _chart: me.chart, _datasetIndex: me.index }); }, createMetaData: function createMetaData(index) { var me = this; var type = me.dataElementType; return type && new type({ _chart: me.chart, _datasetIndex: me.index, _index: index }); }, addElements: function addElements() { var me = this; var meta = me.getMeta(); var data = me.getDataset().data || []; var metaData = meta.data; var i, ilen; for (i = 0, ilen = data.length; i < ilen; ++i) { metaData[i] = metaData[i] || me.createMetaData(i); } meta.dataset = meta.dataset || me.createMetaDataset(); }, addElementAndReset: function addElementAndReset(index) { var element = this.createMetaData(index); this.getMeta().data.splice(index, 0, element); this.updateElement(element, index, true); }, buildOrUpdateElements: function buildOrUpdateElements() { var me = this; var dataset = me.getDataset(); var data = dataset.data || (dataset.data = []); // In order to correctly handle data addition/deletion animation (an thus simulate // real-time charts), we need to monitor these data modifications and synchronize // the internal meta data accordingly. if (me._data !== data) { if (me._data) { // This case happens when the user replaced the data array instance. unlistenArrayEvents(me._data, me); } if (data && Object.isExtensible(data)) { listenArrayEvents(data, me); } me._data = data; } // Re-sync meta data in case the user replaced the data array or if we missed // any updates and so make sure that we handle number of datapoints changing. me.resyncElements(); }, /** * Returns the merged user-supplied and default dataset-level options * @private */ _configure: function _configure() { var me = this; me._config = helpers$1.merge(Object.create(null), [me.chart.options.datasets[me._type], me.getDataset()], { merger: function merger(key, target, source) { if (key !== '_meta' && key !== 'data') { helpers$1._merger(key, target, source); } } }); }, _update: function _update(reset) { var me = this; me._configure(); me._cachedDataOpts = null; me.update(reset); }, update: helpers$1.noop, transition: function transition(easingValue) { var meta = this.getMeta(); var elements = meta.data || []; var ilen = elements.length; var i = 0; for (; i < ilen; ++i) { elements[i].transition(easingValue); } if (meta.dataset) { meta.dataset.transition(easingValue); } }, draw: function draw() { var meta = this.getMeta(); var elements = meta.data || []; var ilen = elements.length; var i = 0; if (meta.dataset) { meta.dataset.draw(); } for (; i < ilen; ++i) { elements[i].draw(); } }, /** * Returns a set of predefined style properties that should be used to represent the dataset * or the data if the index is specified * @param {number} index - data index * @return {IStyleInterface} style object */ getStyle: function getStyle(index) { var me = this; var meta = me.getMeta(); var dataset = meta.dataset; var style; me._configure(); if (dataset && index === undefined) { style = me._resolveDatasetElementOptions(dataset || {}); } else { index = index || 0; style = me._resolveDataElementOptions(meta.data[index] || {}, index); } if (style.fill === false || style.fill === null) { style.backgroundColor = style.borderColor; } return style; }, /** * @private */ _resolveDatasetElementOptions: function _resolveDatasetElementOptions(element, hover) { var me = this; var chart = me.chart; var datasetOpts = me._config; var custom = element.custom || {}; var options = chart.options.elements[me.datasetElementType.prototype._type] || {}; var elementOptions = me._datasetElementOptions; var values = {}; var i, ilen, key, readKey; // Scriptable options var context = { chart: chart, dataset: me.getDataset(), datasetIndex: me.index, hover: hover }; for (i = 0, ilen = elementOptions.length; i < ilen; ++i) { key = elementOptions[i]; readKey = hover ? 'hover' + key.charAt(0).toUpperCase() + key.slice(1) : key; values[key] = resolve([custom[readKey], datasetOpts[readKey], options[readKey]], context); } return values; }, /** * @private */ _resolveDataElementOptions: function _resolveDataElementOptions(element, index) { var me = this; var custom = element && element.custom; var cached = me._cachedDataOpts; if (cached && !custom) { return cached; } var chart = me.chart; var datasetOpts = me._config; var options = chart.options.elements[me.dataElementType.prototype._type] || {}; var elementOptions = me._dataElementOptions; var values = {}; // Scriptable options var context = { chart: chart, dataIndex: index, dataset: me.getDataset(), datasetIndex: me.index }; // `resolve` sets cacheable to `false` if any option is indexed or scripted var info = { cacheable: !custom }; var keys, i, ilen, key; custom = custom || {}; if (helpers$1.isArray(elementOptions)) { for (i = 0, ilen = elementOptions.length; i < ilen; ++i) { key = elementOptions[i]; values[key] = resolve([custom[key], datasetOpts[key], options[key]], context, index, info); } } else { keys = Object.keys(elementOptions); for (i = 0, ilen = keys.length; i < ilen; ++i) { key = keys[i]; values[key] = resolve([custom[key], datasetOpts[elementOptions[key]], datasetOpts[key], options[key]], context, index, info); } } if (info.cacheable) { me._cachedDataOpts = Object.freeze(values); } return values; }, removeHoverStyle: function removeHoverStyle(element) { helpers$1.merge(element._model, element.$previousStyle || {}); delete element.$previousStyle; }, setHoverStyle: function setHoverStyle(element) { var dataset = this.chart.data.datasets[element._datasetIndex]; var index = element._index; var custom = element.custom || {}; var model = element._model; var getHoverColor = helpers$1.getHoverColor; element.$previousStyle = { backgroundColor: model.backgroundColor, borderColor: model.borderColor, borderWidth: model.borderWidth }; model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index); model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index); model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index); }, /** * @private */ _removeDatasetHoverStyle: function _removeDatasetHoverStyle() { var element = this.getMeta().dataset; if (element) { this.removeHoverStyle(element); } }, /** * @private */ _setDatasetHoverStyle: function _setDatasetHoverStyle() { var element = this.getMeta().dataset; var prev = {}; var i, ilen, key, keys, hoverOptions, model; if (!element) { return; } model = element._model; hoverOptions = this._resolveDatasetElementOptions(element, true); keys = Object.keys(hoverOptions); for (i = 0, ilen = keys.length; i < ilen; ++i) { key = keys[i]; prev[key] = model[key]; model[key] = hoverOptions[key]; } element.$previousStyle = prev; }, /** * @private */ resyncElements: function resyncElements() { var me = this; var meta = me.getMeta(); var data = me.getDataset().data; var numMeta = meta.data.length; var numData = data.length; if (numData < numMeta) { meta.data.splice(numData, numMeta - numData); } else if (numData > numMeta) { me.insertElements(numMeta, numData - numMeta); } }, /** * @private */ insertElements: function insertElements(start, count) { for (var i = 0; i < count; ++i) { this.addElementAndReset(start + i); } }, /** * @private */ onDataPush: function onDataPush() { var count = arguments.length; this.insertElements(this.getDataset().data.length - count, count); }, /** * @private */ onDataPop: function onDataPop() { this.getMeta().data.pop(); }, /** * @private */ onDataShift: function onDataShift() { this.getMeta().data.shift(); }, /** * @private */ onDataSplice: function onDataSplice(start, count) { this.getMeta().data.splice(start, count); this.insertElements(start, arguments.length - 2); }, /** * @private */ onDataUnshift: function onDataUnshift() { this.insertElements(0, arguments.length); } }); DatasetController.extend = helpers$1.inherits; var core_datasetController = DatasetController; var TAU = Math.PI * 2; core_defaults._set('global', { elements: { arc: { backgroundColor: core_defaults.global.defaultColor, borderColor: '#fff', borderWidth: 2, borderAlign: 'center' } } }); function clipArc(ctx, arc) { var startAngle = arc.startAngle; var endAngle = arc.endAngle; var pixelMargin = arc.pixelMargin; var angleMargin = pixelMargin / arc.outerRadius; var x = arc.x; var y = arc.y; // Draw an inner border by cliping the arc and drawing a double-width border // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders ctx.beginPath(); ctx.arc(x, y, arc.outerRadius, startAngle - angleMargin, endAngle + angleMargin); if (arc.innerRadius > pixelMargin) { angleMargin = pixelMargin / arc.innerRadius; ctx.arc(x, y, arc.innerRadius - pixelMargin, endAngle + angleMargin, startAngle - angleMargin, true); } else { ctx.arc(x, y, pixelMargin, endAngle + Math.PI / 2, startAngle - Math.PI / 2); } ctx.closePath(); ctx.clip(); } function drawFullCircleBorders(ctx, vm, arc, inner) { var endAngle = arc.endAngle; var i; if (inner) { arc.endAngle = arc.startAngle + TAU; clipArc(ctx, arc); arc.endAngle = endAngle; if (arc.endAngle === arc.startAngle && arc.fullCircles) { arc.endAngle += TAU; arc.fullCircles--; } } ctx.beginPath(); ctx.arc(arc.x, arc.y, arc.innerRadius, arc.startAngle + TAU, arc.startAngle, true); for (i = 0; i < arc.fullCircles; ++i) { ctx.stroke(); } ctx.beginPath(); ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.startAngle + TAU); for (i = 0; i < arc.fullCircles; ++i) { ctx.stroke(); } } function drawBorder(ctx, vm, arc) { var inner = vm.borderAlign === 'inner'; if (inner) { ctx.lineWidth = vm.borderWidth * 2; ctx.lineJoin = 'round'; } else { ctx.lineWidth = vm.borderWidth; ctx.lineJoin = 'bevel'; } if (arc.fullCircles) { drawFullCircleBorders(ctx, vm, arc, inner); } if (inner) { clipArc(ctx, arc); } ctx.beginPath(); ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.endAngle); ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true); ctx.closePath(); ctx.stroke(); } var element_arc = core_element.extend({ _type: 'arc', inLabelRange: function inLabelRange(mouseX) { var vm = this._view; if (vm) { return Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2); } return false; }, inRange: function inRange(chartX, chartY) { var vm = this._view; if (vm) { var pointRelativePosition = helpers$1.getAngleFromPoint(vm, { x: chartX, y: chartY }); var angle = pointRelativePosition.angle; var distance = pointRelativePosition.distance; // Sanitise angle range var startAngle = vm.startAngle; var endAngle = vm.endAngle; while (endAngle < startAngle) { endAngle += TAU; } while (angle > endAngle) { angle -= TAU; } while (angle < startAngle) { angle += TAU; } // Check if within the range of the open/close angle var betweenAngles = angle >= startAngle && angle <= endAngle; var withinRadius = distance >= vm.innerRadius && distance <= vm.outerRadius; return betweenAngles && withinRadius; } return false; }, getCenterPoint: function getCenterPoint() { var vm = this._view; var halfAngle = (vm.startAngle + vm.endAngle) / 2; var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; return { x: vm.x + Math.cos(halfAngle) * halfRadius, y: vm.y + Math.sin(halfAngle) * halfRadius }; }, getArea: function getArea() { var vm = this._view; return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); }, tooltipPosition: function tooltipPosition() { var vm = this._view; var centreAngle = vm.startAngle + (vm.endAngle - vm.startAngle) / 2; var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; return { x: vm.x + Math.cos(centreAngle) * rangeFromCentre, y: vm.y + Math.sin(centreAngle) * rangeFromCentre }; }, draw: function draw() { var ctx = this._chart.ctx; var vm = this._view; var pixelMargin = vm.borderAlign === 'inner' ? 0.33 : 0; var arc = { x: vm.x, y: vm.y, innerRadius: vm.innerRadius, outerRadius: Math.max(vm.outerRadius - pixelMargin, 0), pixelMargin: pixelMargin, startAngle: vm.startAngle, endAngle: vm.endAngle, fullCircles: Math.floor(vm.circumference / TAU) }; var i; ctx.save(); ctx.fillStyle = vm.backgroundColor; ctx.strokeStyle = vm.borderColor; if (arc.fullCircles) { arc.endAngle = arc.startAngle + TAU; ctx.beginPath(); ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle); ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true); ctx.closePath(); for (i = 0; i < arc.fullCircles; ++i) { ctx.fill(); } arc.endAngle = arc.startAngle + vm.circumference % TAU; } ctx.beginPath(); ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle); ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true); ctx.closePath(); ctx.fill(); if (vm.borderWidth) { drawBorder(ctx, vm, arc); } ctx.restore(); } }); var valueOrDefault$1 = helpers$1.valueOrDefault; var defaultColor = core_defaults.global.defaultColor; core_defaults._set('global', { elements: { line: { tension: 0.4, backgroundColor: defaultColor, borderWidth: 3, borderColor: defaultColor, borderCapStyle: 'butt', borderDash: [], borderDashOffset: 0.0, borderJoinStyle: 'miter', capBezierPoints: true, fill: true // do we fill in the area between the line and its base axis } } }); var element_line = core_element.extend({ _type: 'line', draw: function draw() { var me = this; var vm = me._view; var ctx = me._chart.ctx; var spanGaps = vm.spanGaps; var points = me._children.slice(); // clone array var globalDefaults = core_defaults.global; var globalOptionLineElements = globalDefaults.elements.line; var lastDrawnIndex = -1; var closePath = me._loop; var index, previous, currentVM; if (!points.length) { return; } if (me._loop) { for (index = 0; index < points.length; ++index) { previous = helpers$1.previousItem(points, index); // If the line has an open path, shift the point array if (!points[index]._view.skip && previous._view.skip) { points = points.slice(index).concat(points.slice(0, index)); closePath = spanGaps; break; } } // If the line has a close path, add the first point again if (closePath) { points.push(points[0]); } } ctx.save(); // Stroke Line Options ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; // IE 9 and 10 do not support line dash if (ctx.setLineDash) { ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); } ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset); ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth); ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; // Stroke Line ctx.beginPath(); // First point moves to it's starting position no matter what currentVM = points[0]._view; if (!currentVM.skip) { ctx.moveTo(currentVM.x, currentVM.y); lastDrawnIndex = 0; } for (index = 1; index < points.length; ++index) { currentVM = points[index]._view; previous = lastDrawnIndex === -1 ? helpers$1.previousItem(points, index) : points[lastDrawnIndex]; if (!currentVM.skip) { if (lastDrawnIndex !== index - 1 && !spanGaps || lastDrawnIndex === -1) { // There was a gap and this is the first point after the gap ctx.moveTo(currentVM.x, currentVM.y); } else { // Line to next point helpers$1.canvas.lineTo(ctx, previous._view, currentVM); } lastDrawnIndex = index; } } if (closePath) { ctx.closePath(); } ctx.stroke(); ctx.restore(); } }); var valueOrDefault$2 = helpers$1.valueOrDefault; var defaultColor$1 = core_defaults.global.defaultColor; core_defaults._set('global', { elements: { point: { radius: 3, pointStyle: 'circle', backgroundColor: defaultColor$1, borderColor: defaultColor$1, borderWidth: 1, // Hover hitRadius: 1, hoverRadius: 4, hoverBorderWidth: 1 } } }); function xRange(mouseX) { var vm = this._view; return vm ? Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius : false; } function yRange(mouseY) { var vm = this._view; return vm ? Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius : false; } var element_point = core_element.extend({ _type: 'point', inRange: function inRange(mouseX, mouseY) { var vm = this._view; return vm ? Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2) < Math.pow(vm.hitRadius + vm.radius, 2) : false; }, inLabelRange: xRange, inXRange: xRange, inYRange: yRange, getCenterPoint: function getCenterPoint() { var vm = this._view; return { x: vm.x, y: vm.y }; }, getArea: function getArea() { return Math.PI * Math.pow(this._view.radius, 2); }, tooltipPosition: function tooltipPosition() { var vm = this._view; return { x: vm.x, y: vm.y, padding: vm.radius + vm.borderWidth }; }, draw: function draw(chartArea) { var vm = this._view; var ctx = this._chart.ctx; var pointStyle = vm.pointStyle; var rotation = vm.rotation; var radius = vm.radius; var x = vm.x; var y = vm.y; var globalDefaults = core_defaults.global; var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow if (vm.skip) { return; } // Clipping for Points. if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) { ctx.strokeStyle = vm.borderColor || defaultColor; ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth); ctx.fillStyle = vm.backgroundColor || defaultColor; helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation); } } }); var defaultColor$2 = core_defaults.global.defaultColor; core_defaults._set('global', { elements: { rectangle: { backgroundColor: defaultColor$2, borderColor: defaultColor$2, borderSkipped: 'bottom', borderWidth: 0 } } }); function isVertical(vm) { return vm && vm.width !== undefined; } /** * Helper function to get the bounds of the bar regardless of the orientation * @param bar {Chart.Element.Rectangle} the bar * @return {Bounds} bounds of the bar * @private */ function getBarBounds(vm) { var x1, x2, y1, y2, half; if (isVertical(vm)) { half = vm.width / 2; x1 = vm.x - half; x2 = vm.x + half; y1 = Math.min(vm.y, vm.base); y2 = Math.max(vm.y, vm.base); } else { half = vm.height / 2; x1 = Math.min(vm.x, vm.base); x2 = Math.max(vm.x, vm.base); y1 = vm.y - half; y2 = vm.y + half; } return { left: x1, top: y1, right: x2, bottom: y2 }; } function swap(orig, v1, v2) { return orig === v1 ? v2 : orig === v2 ? v1 : orig; } function parseBorderSkipped(vm) { var edge = vm.borderSkipped; var res = {}; if (!edge) { return res; } if (vm.horizontal) { if (vm.base > vm.x) { edge = swap(edge, 'left', 'right'); } } else if (vm.base < vm.y) { edge = swap(edge, 'bottom', 'top'); } res[edge] = true; return res; } function parseBorderWidth(vm, maxW, maxH) { var value = vm.borderWidth; var skip = parseBorderSkipped(vm); var t, r, b, l; if (helpers$1.isObject(value)) { t = +value.top || 0; r = +value.right || 0; b = +value.bottom || 0; l = +value.left || 0; } else { t = r = b = l = +value || 0; } return { t: skip.top || t < 0 ? 0 : t > maxH ? maxH : t, r: skip.right || r < 0 ? 0 : r > maxW ? maxW : r, b: skip.bottom || b < 0 ? 0 : b > maxH ? maxH : b, l: skip.left || l < 0 ? 0 : l > maxW ? maxW : l }; } function boundingRects(vm) { var bounds = getBarBounds(vm); var width = bounds.right - bounds.left; var height = bounds.bottom - bounds.top; var border = parseBorderWidth(vm, width / 2, height / 2); return { outer: { x: bounds.left, y: bounds.top, w: width, h: height }, inner: { x: bounds.left + border.l, y: bounds.top + border.t, w: width - border.l - border.r, h: height - border.t - border.b } }; } function _inRange(vm, x, y) { var skipX = x === null; var skipY = y === null; var bounds = !vm || skipX && skipY ? false : getBarBounds(vm); return bounds && (skipX || x >= bounds.left && x <= bounds.right) && (skipY || y >= bounds.top && y <= bounds.bottom); } var element_rectangle = core_element.extend({ _type: 'rectangle', draw: function draw() { var ctx = this._chart.ctx; var vm = this._view; var rects = boundingRects(vm); var outer = rects.outer; var inner = rects.inner; ctx.fillStyle = vm.backgroundColor; ctx.fillRect(outer.x, outer.y, outer.w, outer.h); if (outer.w === inner.w && outer.h === inner.h) { return; } ctx.save(); ctx.beginPath(); ctx.rect(outer.x, outer.y, outer.w, outer.h); ctx.clip(); ctx.fillStyle = vm.borderColor; ctx.rect(inner.x, inner.y, inner.w, inner.h); ctx.fill('evenodd'); ctx.restore(); }, height: function height() { var vm = this._view; return vm.base - vm.y; }, inRange: function inRange(mouseX, mouseY) { return _inRange(this._view, mouseX, mouseY); }, inLabelRange: function inLabelRange(mouseX, mouseY) { var vm = this._view; return isVertical(vm) ? _inRange(vm, mouseX, null) : _inRange(vm, null, mouseY); }, inXRange: function inXRange(mouseX) { return _inRange(this._view, mouseX, null); }, inYRange: function inYRange(mouseY) { return _inRange(this._view, null, mouseY); }, getCenterPoint: function getCenterPoint() { var vm = this._view; var x, y; if (isVertical(vm)) { x = vm.x; y = (vm.y + vm.base) / 2; } else { x = (vm.x + vm.base) / 2; y = vm.y; } return { x: x, y: y }; }, getArea: function getArea() { var vm = this._view; return isVertical(vm) ? vm.width * Math.abs(vm.y - vm.base) : vm.height * Math.abs(vm.x - vm.base); }, tooltipPosition: function tooltipPosition() { var vm = this._view; return { x: vm.x, y: vm.y }; } }); var elements = {}; var Arc = element_arc; var Line = element_line; var Point = element_point; var Rectangle = element_rectangle; elements.Arc = Arc; elements.Line = Line; elements.Point = Point; elements.Rectangle = Rectangle; var deprecated = helpers$1._deprecated; var valueOrDefault$3 = helpers$1.valueOrDefault; core_defaults._set('bar', { hover: { mode: 'label' }, scales: { xAxes: [{ type: 'category', offset: true, gridLines: { offsetGridLines: true } }], yAxes: [{ type: 'linear' }] } }); core_defaults._set('global', { datasets: { bar: { categoryPercentage: 0.8, barPercentage: 0.9 } } }); /** * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap. * @private */ function computeMinSampleSize(scale, pixels) { var min = scale._length; var prev, curr, i, ilen; for (i = 1, ilen = pixels.length; i < ilen; ++i) { min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1])); } for (i = 0, ilen = scale.getTicks().length; i < ilen; ++i) { curr = scale.getPixelForTick(i); min = i > 0 ? Math.min(min, Math.abs(curr - prev)) : min; prev = curr; } return min; } /** * Computes an "ideal" category based on the absolute bar thickness or, if undefined or null, * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This * mode currently always generates bars equally sized (until we introduce scriptable options?). * @private */ function computeFitCategoryTraits(index, ruler, options) { var thickness = options.barThickness; var count = ruler.stackCount; var curr = ruler.pixels[index]; var min = helpers$1.isNullOrUndef(thickness) ? computeMinSampleSize(ruler.scale, ruler.pixels) : -1; var size, ratio; if (helpers$1.isNullOrUndef(thickness)) { size = min * options.categoryPercentage; ratio = options.barPercentage; } else { // When bar thickness is enforced, category and bar percentages are ignored. // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%') // and deprecate barPercentage since this value is ignored when thickness is absolute. size = thickness * count; ratio = 1; } return { chunk: size / count, ratio: ratio, start: curr - size / 2 }; } /** * Computes an "optimal" category that globally arranges bars side by side (no gap when * percentage options are 1), based on the previous and following categories. This mode * generates bars with different widths when data are not evenly spaced. * @private */ function computeFlexCategoryTraits(index, ruler, options) { var pixels = ruler.pixels; var curr = pixels[index]; var prev = index > 0 ? pixels[index - 1] : null; var next = index < pixels.length - 1 ? pixels[index + 1] : null; var percent = options.categoryPercentage; var start, size; if (prev === null) { // first data: its size is double based on the next point or, // if it's also the last data, we use the scale size. prev = curr - (next === null ? ruler.end - ruler.start : next - curr); } if (next === null) { // last data: its size is also double based on the previous point. next = curr + curr - prev; } start = curr - (curr - Math.min(prev, next)) / 2 * percent; size = Math.abs(next - prev) / 2 * percent; return { chunk: size / ruler.stackCount, ratio: options.barPercentage, start: start }; } var controller_bar = core_datasetController.extend({ dataElementType: elements.Rectangle, /** * @private */ _dataElementOptions: ['backgroundColor', 'borderColor', 'borderSkipped', 'borderWidth', 'barPercentage', 'barThickness', 'categoryPercentage', 'maxBarThickness', 'minBarLength'], initialize: function initialize() { var me = this; var meta, scaleOpts; core_datasetController.prototype.initialize.apply(me, arguments); meta = me.getMeta(); meta.stack = me.getDataset().stack; meta.bar = true; scaleOpts = me._getIndexScale().options; deprecated('bar chart', scaleOpts.barPercentage, 'scales.[x/y]Axes.barPercentage', 'dataset.barPercentage'); deprecated('bar chart', scaleOpts.barThickness, 'scales.[x/y]Axes.barThickness', 'dataset.barThickness'); deprecated('bar chart', scaleOpts.categoryPercentage, 'scales.[x/y]Axes.categoryPercentage', 'dataset.categoryPercentage'); deprecated('bar chart', me._getValueScale().options.minBarLength, 'scales.[x/y]Axes.minBarLength', 'dataset.minBarLength'); deprecated('bar chart', scaleOpts.maxBarThickness, 'scales.[x/y]Axes.maxBarThickness', 'dataset.maxBarThickness'); }, update: function update(reset) { var me = this; var rects = me.getMeta().data; var i, ilen; me._ruler = me.getRuler(); for (i = 0, ilen = rects.length; i < ilen; ++i) { me.updateElement(rects[i], i, reset); } }, updateElement: function updateElement(rectangle, index, reset) { var me = this; var meta = me.getMeta(); var dataset = me.getDataset(); var options = me._resolveDataElementOptions(rectangle, index); rectangle._xScale = me.getScaleForId(meta.xAxisID); rectangle._yScale = me.getScaleForId(meta.yAxisID); rectangle._datasetIndex = me.index; rectangle._index = index; rectangle._model = { backgroundColor: options.backgroundColor, borderColor: options.borderColor, borderSkipped: options.borderSkipped, borderWidth: options.borderWidth, datasetLabel: dataset.label, label: me.chart.data.labels[index] }; if (helpers$1.isArray(dataset.data[index])) { rectangle._model.borderSkipped = null; } me._updateElementGeometry(rectangle, index, reset, options); rectangle.pivot(); }, /** * @private */ _updateElementGeometry: function _updateElementGeometry(rectangle, index, reset, options) { var me = this; var model = rectangle._model; var vscale = me._getValueScale(); var base = vscale.getBasePixel(); var horizontal = vscale.isHorizontal(); var ruler = me._ruler || me.getRuler(); var vpixels = me.calculateBarValuePixels(me.index, index, options); var ipixels = me.calculateBarIndexPixels(me.index, index, ruler, options); model.horizontal = horizontal; model.base = reset ? base : vpixels.base; model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; model.height = horizontal ? ipixels.size : undefined; model.width = horizontal ? undefined : ipixels.size; }, /** * Returns the stacks based on groups and bar visibility. * @param {number} [last] - The dataset index * @returns {string[]} The list of stack IDs * @private */ _getStacks: function _getStacks(last) { var me = this; var scale = me._getIndexScale(); var metasets = scale._getMatchingVisibleMetas(me._type); var stacked = scale.options.stacked; var ilen = metasets.length; var stacks = []; var i, meta; for (i = 0; i < ilen; ++i) { meta = metasets[i]; // stacked | meta.stack // | found | not found | undefined // false | x | x | x // true | | x | // undefined | | x | x if (stacked === false || stacks.indexOf(meta.stack) === -1 || stacked === undefined && meta.stack === undefined) { stacks.push(meta.stack); } if (meta.index === last) { break; } } return stacks; }, /** * Returns the effective number of stacks based on groups and bar visibility. * @private */ getStackCount: function getStackCount() { return this._getStacks().length; }, /** * Returns the stack index for the given dataset based on groups and bar visibility. * @param {number} [datasetIndex] - The dataset index * @param {string} [name] - The stack name to find * @returns {number} The stack index * @private */ getStackIndex: function getStackIndex(datasetIndex, name) { var stacks = this._getStacks(datasetIndex); var index = name !== undefined ? stacks.indexOf(name) : -1; // indexOf returns -1 if element is not present return index === -1 ? stacks.length - 1 : index; }, /** * @private */ getRuler: function getRuler() { var me = this; var scale = me._getIndexScale(); var pixels = []; var i, ilen; for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { pixels.push(scale.getPixelForValue(null, i, me.index)); } return { pixels: pixels, start: scale._startPixel, end: scale._endPixel, stackCount: me.getStackCount(), scale: scale }; }, /** * Note: pixel values are not clamped to the scale area. * @private */ calculateBarValuePixels: function calculateBarValuePixels(datasetIndex, index, options) { var me = this; var chart = me.chart; var scale = me._getValueScale(); var isHorizontal = scale.isHorizontal(); var datasets = chart.data.datasets; var metasets = scale._getMatchingVisibleMetas(me._type); var value = scale._parseValue(datasets[datasetIndex].data[index]); var minBarLength = options.minBarLength; var stacked = scale.options.stacked; var stack = me.getMeta().stack; var start = value.start === undefined ? 0 : value.max >= 0 && value.min >= 0 ? value.min : value.max; var length = value.start === undefined ? value.end : value.max >= 0 && value.min >= 0 ? value.max - value.min : value.min - value.max; var ilen = metasets.length; var i, imeta, ivalue, base, head, size, stackLength; if (stacked || stacked === undefined && stack !== undefined) { for (i = 0; i < ilen; ++i) { imeta = metasets[i]; if (imeta.index === datasetIndex) { break; } if (imeta.stack === stack) { stackLength = scale._parseValue(datasets[imeta.index].data[index]); ivalue = stackLength.start === undefined ? stackLength.end : stackLength.min >= 0 && stackLength.max >= 0 ? stackLength.max : stackLength.min; if (value.min < 0 && ivalue < 0 || value.max >= 0 && ivalue > 0) { start += ivalue; } } } } base = scale.getPixelForValue(start); head = scale.getPixelForValue(start + length); size = head - base; if (minBarLength !== undefined && Math.abs(size) < minBarLength) { size = minBarLength; if (length >= 0 && !isHorizontal || length < 0 && isHorizontal) { head = base - minBarLength; } else { head = base + minBarLength; } } return { size: size, base: base, head: head, center: head + size / 2 }; }, /** * @private */ calculateBarIndexPixels: function calculateBarIndexPixels(datasetIndex, index, ruler, options) { var me = this; var range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options) : computeFitCategoryTraits(index, ruler, options); var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack); var center = range.start + range.chunk * stackIndex + range.chunk / 2; var size = Math.min(valueOrDefault$3(options.maxBarThickness, Infinity), range.chunk * range.ratio); return { base: center - size / 2, head: center + size / 2, center: center, size: size }; }, draw: function draw() { var me = this; var chart = me.chart; var scale = me._getValueScale(); var rects = me.getMeta().data; var dataset = me.getDataset(); var ilen = rects.length; var i = 0; helpers$1.canvas.clipArea(chart.ctx, chart.chartArea); for (; i < ilen; ++i) { var val = scale._parseValue(dataset.data[i]); if (!isNaN(val.min) && !isNaN(val.max)) { rects[i].draw(); } } helpers$1.canvas.unclipArea(chart.ctx); }, /** * @private */ _resolveDataElementOptions: function _resolveDataElementOptions() { var me = this; var values = helpers$1.extend({}, core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments)); var indexOpts = me._getIndexScale().options; var valueOpts = me._getValueScale().options; values.barPercentage = valueOrDefault$3(indexOpts.barPercentage, values.barPercentage); values.barThickness = valueOrDefault$3(indexOpts.barThickness, values.barThickness); values.categoryPercentage = valueOrDefault$3(indexOpts.categoryPercentage, values.categoryPercentage); values.maxBarThickness = valueOrDefault$3(indexOpts.maxBarThickness, values.maxBarThickness); values.minBarLength = valueOrDefault$3(valueOpts.minBarLength, values.minBarLength); return values; } }); var valueOrDefault$4 = helpers$1.valueOrDefault; var resolve$1 = helpers$1.options.resolve; core_defaults._set('bubble', { hover: { mode: 'single' }, scales: { xAxes: [{ type: 'linear', // bubble should probably use a linear scale by default position: 'bottom', id: 'x-axis-0' // need an ID so datasets can reference the scale }], yAxes: [{ type: 'linear', position: 'left', id: 'y-axis-0' }] }, tooltips: { callbacks: { title: function title() { // Title doesn't make sense for scatter since we format the data as a point return ''; }, label: function label(item, data) { var datasetLabel = data.datasets[item.datasetIndex].label || ''; var dataPoint = data.datasets[item.datasetIndex].data[item.index]; return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; } } } }); var controller_bubble = core_datasetController.extend({ /** * @protected */ dataElementType: elements.Point, /** * @private */ _dataElementOptions: ['backgroundColor', 'borderColor', 'borderWidth', 'hoverBackgroundColor', 'hoverBorderColor', 'hoverBorderWidth', 'hoverRadius', 'hitRadius', 'pointStyle', 'rotation'], /** * @protected */ update: function update(reset) { var me = this; var meta = me.getMeta(); var points = meta.data; // Update Points helpers$1.each(points, function (point, index) { me.updateElement(point, index, reset); }); }, /** * @protected */ updateElement: function updateElement(point, index, reset) { var me = this; var meta = me.getMeta(); var custom = point.custom || {}; var xScale = me.getScaleForId(meta.xAxisID); var yScale = me.getScaleForId(meta.yAxisID); var options = me._resolveDataElementOptions(point, index); var data = me.getDataset().data[index]; var dsIndex = me.index; var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(_typeof(data) === 'object' ? data : NaN, index, dsIndex); var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); point._xScale = xScale; point._yScale = yScale; point._options = options; point._datasetIndex = dsIndex; point._index = index; point._model = { backgroundColor: options.backgroundColor, borderColor: options.borderColor, borderWidth: options.borderWidth, hitRadius: options.hitRadius, pointStyle: options.pointStyle, rotation: options.rotation, radius: reset ? 0 : options.radius, skip: custom.skip || isNaN(x) || isNaN(y), x: x, y: y }; point.pivot(); }, /** * @protected */ setHoverStyle: function setHoverStyle(point) { var model = point._model; var options = point._options; var getHoverColor = helpers$1.getHoverColor; point.$previousStyle = { backgroundColor: model.backgroundColor, borderColor: model.borderColor, borderWidth: model.borderWidth, radius: model.radius }; model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor)); model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth); model.radius = options.radius + options.hoverRadius; }, /** * @private */ _resolveDataElementOptions: function _resolveDataElementOptions(point, index) { var me = this; var chart = me.chart; var dataset = me.getDataset(); var custom = point.custom || {}; var data = dataset.data[index] || {}; var values = core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments); // Scriptable options var context = { chart: chart, dataIndex: index, dataset: dataset, datasetIndex: me.index }; // In case values were cached (and thus frozen), we need to clone the values if (me._cachedDataOpts === values) { values = helpers$1.extend({}, values); } // Custom radius resolution values.radius = resolve$1([custom.radius, data.r, me._config.radius, chart.options.elements.point.radius], context, index); return values; } }); var valueOrDefault$5 = helpers$1.valueOrDefault; var PI$1 = Math.PI; var DOUBLE_PI$1 = PI$1 * 2; var HALF_PI$1 = PI$1 / 2; core_defaults._set('doughnut', { animation: { // Boolean - Whether we animate the rotation of the Doughnut animateRotate: true, // Boolean - Whether we animate scaling the Doughnut from the centre animateScale: false }, hover: { mode: 'single' }, legendCallback: function legendCallback(chart) { var list = document.createElement('ul'); var data = chart.data; var datasets = data.datasets; var labels = data.labels; var i, ilen, listItem, listItemSpan; list.setAttribute('class', chart.id + '-legend'); if (datasets.length) { for (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) { listItem = list.appendChild(document.createElement('li')); listItemSpan = listItem.appendChild(document.createElement('span')); listItemSpan.style.backgroundColor = datasets[0].backgroundColor[i]; if (labels[i]) { listItem.appendChild(document.createTextNode(labels[i])); } } } return list.outerHTML; }, legend: { labels: { generateLabels: function generateLabels(chart) { var data = chart.data; if (data.labels.length && data.datasets.length) { return data.labels.map(function (label, i) { var meta = chart.getDatasetMeta(0); var style = meta.controller.getStyle(i); return { text: label, fillStyle: style.backgroundColor, strokeStyle: style.borderColor, lineWidth: style.borderWidth, hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden, // Extra data used for toggling the correct item index: i }; }); } return []; } }, onClick: function onClick(e, legendItem) { var index = legendItem.index; var chart = this.chart; var i, ilen, meta; for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { meta = chart.getDatasetMeta(i); // toggle visibility of index if exists if (meta.data[index]) { meta.data[index].hidden = !meta.data[index].hidden; } } chart.update(); } }, // The percentage of the chart that we cut out of the middle. cutoutPercentage: 50, // The rotation of the chart, where the first data arc begins. rotation: -HALF_PI$1, // The total circumference of the chart. circumference: DOUBLE_PI$1, // Need to override these to give a nice default tooltips: { callbacks: { title: function title() { return ''; }, label: function label(tooltipItem, data) { var dataLabel = data.labels[tooltipItem.index]; var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; if (helpers$1.isArray(dataLabel)) { // show value on first line of multiline label // need to clone because we are changing the value dataLabel = dataLabel.slice(); dataLabel[0] += value; } else { dataLabel += value; } return dataLabel; } } } }); var controller_doughnut = core_datasetController.extend({ dataElementType: elements.Arc, linkScales: helpers$1.noop, /** * @private */ _dataElementOptions: ['backgroundColor', 'borderColor', 'borderWidth', 'borderAlign', 'hoverBackgroundColor', 'hoverBorderColor', 'hoverBorderWidth'], // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly getRingIndex: function getRingIndex(datasetIndex) { var ringIndex = 0; for (var j = 0; j < datasetIndex; ++j) { if (this.chart.isDatasetVisible(j)) { ++ringIndex; } } return ringIndex; }, update: function update(reset) { var me = this; var chart = me.chart; var chartArea = chart.chartArea; var opts = chart.options; var ratioX = 1; var ratioY = 1; var offsetX = 0; var offsetY = 0; var meta = me.getMeta(); var arcs = meta.data; var cutout = opts.cutoutPercentage / 100 || 0; var circumference = opts.circumference; var chartWeight = me._getRingWeight(me.index); var maxWidth, maxHeight, i, ilen; // If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc if (circumference < DOUBLE_PI$1) { var startAngle = opts.rotation % DOUBLE_PI$1; startAngle += startAngle >= PI$1 ? -DOUBLE_PI$1 : startAngle < -PI$1 ? DOUBLE_PI$1 : 0; var endAngle = startAngle + circumference; var startX = Math.cos(startAngle); var startY = Math.sin(startAngle); var endX = Math.cos(endAngle); var endY = Math.sin(endAngle); var contains0 = startAngle <= 0 && endAngle >= 0 || endAngle >= DOUBLE_PI$1; var contains90 = startAngle <= HALF_PI$1 && endAngle >= HALF_PI$1 || endAngle >= DOUBLE_PI$1 + HALF_PI$1; var contains180 = startAngle === -PI$1 || endAngle >= PI$1; var contains270 = startAngle <= -HALF_PI$1 && endAngle >= -HALF_PI$1 || endAngle >= PI$1 + HALF_PI$1; var minX = contains180 ? -1 : Math.min(startX, startX * cutout, endX, endX * cutout); var minY = contains270 ? -1 : Math.min(startY, startY * cutout, endY, endY * cutout); var maxX = contains0 ? 1 : Math.max(startX, startX * cutout, endX, endX * cutout); var maxY = contains90 ? 1 : Math.max(startY, startY * cutout, endY, endY * cutout); ratioX = (maxX - minX) / 2; ratioY = (maxY - minY) / 2; offsetX = -(maxX + minX) / 2; offsetY = -(maxY + minY) / 2; } for (i = 0, ilen = arcs.length; i < ilen; ++i) { arcs[i]._options = me._resolveDataElementOptions(arcs[i], i); } chart.borderWidth = me.getMaxBorderWidth(); maxWidth = (chartArea.right - chartArea.left - chart.borderWidth) / ratioX; maxHeight = (chartArea.bottom - chartArea.top - chart.borderWidth) / ratioY; chart.outerRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0); chart.innerRadius = Math.max(chart.outerRadius * cutout, 0); chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1); chart.offsetX = offsetX * chart.outerRadius; chart.offsetY = offsetY * chart.outerRadius; meta.total = me.calculateTotal(); me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index); me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0); for (i = 0, ilen = arcs.length; i < ilen; ++i) { me.updateElement(arcs[i], i, reset); } }, updateElement: function updateElement(arc, index, reset) { var me = this; var chart = me.chart; var chartArea = chart.chartArea; var opts = chart.options; var animationOpts = opts.animation; var centerX = (chartArea.left + chartArea.right) / 2; var centerY = (chartArea.top + chartArea.bottom) / 2; var startAngle = opts.rotation; // non reset case handled later var endAngle = opts.rotation; // non reset case handled later var dataset = me.getDataset(); var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / DOUBLE_PI$1); var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; var options = arc._options || {}; helpers$1.extend(arc, { // Utility _datasetIndex: me.index, _index: index, // Desired view properties _model: { backgroundColor: options.backgroundColor, borderColor: options.borderColor, borderWidth: options.borderWidth, borderAlign: options.borderAlign, x: centerX + chart.offsetX, y: centerY + chart.offsetY, startAngle: startAngle, endAngle: endAngle, circumference: circumference, outerRadius: outerRadius, innerRadius: innerRadius, label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) } }); var model = arc._model; // Set correct angles if not resetting if (!reset || !animationOpts.animateRotate) { if (index === 0) { model.startAngle = opts.rotation; } else { model.startAngle = me.getMeta().data[index - 1]._model.endAngle; } model.endAngle = model.startAngle + model.circumference; } arc.pivot(); }, calculateTotal: function calculateTotal() { var dataset = this.getDataset(); var meta = this.getMeta(); var total = 0; var value; helpers$1.each(meta.data, function (element, index) { value = dataset.data[index]; if (!isNaN(value) && !element.hidden) { total += Math.abs(value); } }); /* if (total === 0) { total = NaN; }*/ return total; }, calculateCircumference: function calculateCircumference(value) { var total = this.getMeta().total; if (total > 0 && !isNaN(value)) { return DOUBLE_PI$1 * (Math.abs(value) / total); } return 0; }, // gets the max border or hover width to properly scale pie charts getMaxBorderWidth: function getMaxBorderWidth(arcs) { var me = this; var max = 0; var chart = me.chart; var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth; if (!arcs) { // Find the outmost visible dataset for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { if (chart.isDatasetVisible(i)) { meta = chart.getDatasetMeta(i); arcs = meta.data; if (i !== me.index) { controller = meta.controller; } break; } } } if (!arcs) { return 0; } for (i = 0, ilen = arcs.length; i < ilen; ++i) { arc = arcs[i]; if (controller) { controller._configure(); options = controller._resolveDataElementOptions(arc, i); } else { options = arc._options; } if (options.borderAlign !== 'inner') { borderWidth = options.borderWidth; hoverWidth = options.hoverBorderWidth; max = borderWidth > max ? borderWidth : max; max = hoverWidth > max ? hoverWidth : max; } } return max; }, /** * @protected */ setHoverStyle: function setHoverStyle(arc) { var model = arc._model; var options = arc._options; var getHoverColor = helpers$1.getHoverColor; arc.$previousStyle = { backgroundColor: model.backgroundColor, borderColor: model.borderColor, borderWidth: model.borderWidth }; model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor)); model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth); }, /** * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly * @private */ _getRingWeightOffset: function _getRingWeightOffset(datasetIndex) { var ringWeightOffset = 0; for (var i = 0; i < datasetIndex; ++i) { if (this.chart.isDatasetVisible(i)) { ringWeightOffset += this._getRingWeight(i); } } return ringWeightOffset; }, /** * @private */ _getRingWeight: function _getRingWeight(dataSetIndex) { return Math.max(valueOrDefault$5(this.chart.data.datasets[dataSetIndex].weight, 1), 0); }, /** * Returns the sum of all visibile data set weights. This value can be 0. * @private */ _getVisibleDatasetWeightTotal: function _getVisibleDatasetWeightTotal() { return this._getRingWeightOffset(this.chart.data.datasets.length); } }); core_defaults._set('horizontalBar', { hover: { mode: 'index', axis: 'y' }, scales: { xAxes: [{ type: 'linear', position: 'bottom' }], yAxes: [{ type: 'category', position: 'left', offset: true, gridLines: { offsetGridLines: true } }] }, elements: { rectangle: { borderSkipped: 'left' } }, tooltips: { mode: 'index', axis: 'y' } }); core_defaults._set('global', { datasets: { horizontalBar: { categoryPercentage: 0.8, barPercentage: 0.9 } } }); var controller_horizontalBar = controller_bar.extend({ /** * @private */ _getValueScaleId: function _getValueScaleId() { return this.getMeta().xAxisID; }, /** * @private */ _getIndexScaleId: function _getIndexScaleId() { return this.getMeta().yAxisID; } }); var valueOrDefault$6 = helpers$1.valueOrDefault; var resolve$2 = helpers$1.options.resolve; var isPointInArea = helpers$1.canvas._isPointInArea; core_defaults._set('line', { showLines: true, spanGaps: false, hover: { mode: 'label' }, scales: { xAxes: [{ type: 'category', id: 'x-axis-0' }], yAxes: [{ type: 'linear', id: 'y-axis-0' }] } }); function scaleClip(scale, halfBorderWidth) { var tickOpts = scale && scale.options.ticks || {}; var reverse = tickOpts.reverse; var min = tickOpts.min === undefined ? halfBorderWidth : 0; var max = tickOpts.max === undefined ? halfBorderWidth : 0; return { start: reverse ? max : min, end: reverse ? min : max }; } function defaultClip(xScale, yScale, borderWidth) { var halfBorderWidth = borderWidth / 2; var x = scaleClip(xScale, halfBorderWidth); var y = scaleClip(yScale, halfBorderWidth); return { top: y.end, right: x.end, bottom: y.start, left: x.start }; } function toClip(value) { var t, r, b, l; if (helpers$1.isObject(value)) { t = value.top; r = value.right; b = value.bottom; l = value.left; } else { t = r = b = l = value; } return { top: t, right: r, bottom: b, left: l }; } var controller_line = core_datasetController.extend({ datasetElementType: elements.Line, dataElementType: elements.Point, /** * @private */ _datasetElementOptions: ['backgroundColor', 'borderCapStyle', 'borderColor', 'borderDash', 'borderDashOffset', 'borderJoinStyle', 'borderWidth', 'cubicInterpolationMode', 'fill'], /** * @private */ _dataElementOptions: { backgroundColor: 'pointBackgroundColor', borderColor: 'pointBorderColor', borderWidth: 'pointBorderWidth', hitRadius: 'pointHitRadius', hoverBackgroundColor: 'pointHoverBackgroundColor', hoverBorderColor: 'pointHoverBorderColor', hoverBorderWidth: 'pointHoverBorderWidth', hoverRadius: 'pointHoverRadius', pointStyle: 'pointStyle', radius: 'pointRadius', rotation: 'pointRotation' }, update: function update(reset) { var me = this; var meta = me.getMeta(); var line = meta.dataset; var points = meta.data || []; var options = me.chart.options; var config = me._config; var showLine = me._showLine = valueOrDefault$6(config.showLine, options.showLines); var i, ilen; me._xScale = me.getScaleForId(meta.xAxisID); me._yScale = me.getScaleForId(meta.yAxisID); // Update Line if (showLine) { // Compatibility: If the properties are defined with only the old name, use those values if (config.tension !== undefined && config.lineTension === undefined) { config.lineTension = config.tension; } // Utility line._scale = me._yScale; line._datasetIndex = me.index; // Data line._children = points; // Model line._model = me._resolveDatasetElementOptions(line); line.pivot(); } // Update Points for (i = 0, ilen = points.length; i < ilen; ++i) { me.updateElement(points[i], i, reset); } if (showLine && line._model.tension !== 0) { me.updateBezierControlPoints(); } // Now pivot the point for animation for (i = 0, ilen = points.length; i < ilen; ++i) { points[i].pivot(); } }, updateElement: function updateElement(point, index, reset) { var me = this; var meta = me.getMeta(); var custom = point.custom || {}; var dataset = me.getDataset(); var datasetIndex = me.index; var value = dataset.data[index]; var xScale = me._xScale; var yScale = me._yScale; var lineModel = meta.dataset._model; var x, y; var options = me._resolveDataElementOptions(point, index); x = xScale.getPixelForValue(_typeof(value) === 'object' ? value : NaN, index, datasetIndex); y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); // Utility point._xScale = xScale; point._yScale = yScale; point._options = options; point._datasetIndex = datasetIndex; point._index = index; // Desired view properties point._model = { x: x, y: y, skip: custom.skip || isNaN(x) || isNaN(y), // Appearance radius: options.radius, pointStyle: options.pointStyle, rotation: options.rotation, backgroundColor: options.backgroundColor, borderColor: options.borderColor, borderWidth: options.borderWidth, tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0), steppedLine: lineModel ? lineModel.steppedLine : false, // Tooltip hitRadius: options.hitRadius }; }, /** * @private */ _resolveDatasetElementOptions: function _resolveDatasetElementOptions(element) { var me = this; var config = me._config; var custom = element.custom || {}; var options = me.chart.options; var lineOptions = options.elements.line; var values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments); // The default behavior of lines is to break at null values, according // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 // This option gives lines the ability to span gaps values.spanGaps = valueOrDefault$6(config.spanGaps, options.spanGaps); values.tension = valueOrDefault$6(config.lineTension, lineOptions.tension); values.steppedLine = resolve$2([custom.steppedLine, config.steppedLine, lineOptions.stepped]); values.clip = toClip(valueOrDefault$6(config.clip, defaultClip(me._xScale, me._yScale, values.borderWidth))); return values; }, calculatePointY: function calculatePointY(value, index, datasetIndex) { var me = this; var chart = me.chart; var yScale = me._yScale; var sumPos = 0; var sumNeg = 0; var i, ds, dsMeta, stackedRightValue, rightValue, metasets, ilen; if (yScale.options.stacked) { rightValue = +yScale.getRightValue(value); metasets = chart._getSortedVisibleDatasetMetas(); ilen = metasets.length; for (i = 0; i < ilen; ++i) { dsMeta = metasets[i]; if (dsMeta.index === datasetIndex) { break; } ds = chart.data.datasets[dsMeta.index]; if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id) { stackedRightValue = +yScale.getRightValue(ds.data[index]); if (stackedRightValue < 0) { sumNeg += stackedRightValue || 0; } else { sumPos += stackedRightValue || 0; } } } if (rightValue < 0) { return yScale.getPixelForValue(sumNeg + rightValue); } return yScale.getPixelForValue(sumPos + rightValue); } return yScale.getPixelForValue(value); }, updateBezierControlPoints: function updateBezierControlPoints() { var me = this; var chart = me.chart; var meta = me.getMeta(); var lineModel = meta.dataset._model; var area = chart.chartArea; var points = meta.data || []; var i, ilen, model, controlPoints; // Only consider points that are drawn in case the spanGaps option is used if (lineModel.spanGaps) { points = points.filter(function (pt) { return !pt._model.skip; }); } function capControlPoint(pt, min, max) { return Math.max(Math.min(pt, max), min); } if (lineModel.cubicInterpolationMode === 'monotone') { helpers$1.splineCurveMonotone(points); } else { for (i = 0, ilen = points.length; i < ilen; ++i) { model = points[i]._model; controlPoints = helpers$1.splineCurve(helpers$1.previousItem(points, i)._model, model, helpers$1.nextItem(points, i)._model, lineModel.tension); model.controlPointPreviousX = controlPoints.previous.x; model.controlPointPreviousY = controlPoints.previous.y; model.controlPointNextX = controlPoints.next.x; model.controlPointNextY = controlPoints.next.y; } } if (chart.options.elements.line.capBezierPoints) { for (i = 0, ilen = points.length; i < ilen; ++i) { model = points[i]._model; if (isPointInArea(model, area)) { if (i > 0 && isPointInArea(points[i - 1]._model, area)) { model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); } if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) { model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); } } } } }, draw: function draw() { var me = this; var chart = me.chart; var meta = me.getMeta(); var points = meta.data || []; var area = chart.chartArea; var canvas = chart.canvas; var i = 0; var ilen = points.length; var clip; if (me._showLine) { clip = meta.dataset._model.clip; helpers$1.canvas.clipArea(chart.ctx, { left: clip.left === false ? 0 : area.left - clip.left, right: clip.right === false ? canvas.width : area.right + clip.right, top: clip.top === false ? 0 : area.top - clip.top, bottom: clip.bottom === false ? canvas.height : area.bottom + clip.bottom }); meta.dataset.draw(); helpers$1.canvas.unclipArea(chart.ctx); } // Draw the points for (; i < ilen; ++i) { points[i].draw(area); } }, /** * @protected */ setHoverStyle: function setHoverStyle(point) { var model = point._model; var options = point._options; var getHoverColor = helpers$1.getHoverColor; point.$previousStyle = { backgroundColor: model.backgroundColor, borderColor: model.borderColor, borderWidth: model.borderWidth, radius: model.radius }; model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor)); model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth); model.radius = valueOrDefault$6(options.hoverRadius, options.radius); } }); var resolve$3 = helpers$1.options.resolve; core_defaults._set('polarArea', { scale: { type: 'radialLinear', angleLines: { display: false }, gridLines: { circular: true }, pointLabels: { display: false }, ticks: { beginAtZero: true } }, // Boolean - Whether to animate the rotation of the chart animation: { animateRotate: true, animateScale: true }, startAngle: -0.5 * Math.PI, legendCallback: function legendCallback(chart) { var list = document.createElement('ul'); var data = chart.data; var datasets = data.datasets; var labels = data.labels; var i, ilen, listItem, listItemSpan; list.setAttribute('class', chart.id + '-legend'); if (datasets.length) { for (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) { listItem = list.appendChild(document.createElement('li')); listItemSpan = listItem.appendChild(document.createElement('span')); listItemSpan.style.backgroundColor = datasets[0].backgroundColor[i]; if (labels[i]) { listItem.appendChild(document.createTextNode(labels[i])); } } } return list.outerHTML; }, legend: { labels: { generateLabels: function generateLabels(chart) { var data = chart.data; if (data.labels.length && data.datasets.length) { return data.labels.map(function (label, i) { var meta = chart.getDatasetMeta(0); var style = meta.controller.getStyle(i); return { text: label, fillStyle: style.backgroundColor, strokeStyle: style.borderColor, lineWidth: style.borderWidth, hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden, // Extra data used for toggling the correct item index: i }; }); } return []; } }, onClick: function onClick(e, legendItem) { var index = legendItem.index; var chart = this.chart; var i, ilen, meta; for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { meta = chart.getDatasetMeta(i); meta.data[index].hidden = !meta.data[index].hidden; } chart.update(); } }, // Need to override these to give a nice default tooltips: { callbacks: { title: function title() { return ''; }, label: function label(item, data) { return data.labels[item.index] + ': ' + item.yLabel; } } } }); var controller_polarArea = core_datasetController.extend({ dataElementType: elements.Arc, linkScales: helpers$1.noop, /** * @private */ _dataElementOptions: ['backgroundColor', 'borderColor', 'borderWidth', 'borderAlign', 'hoverBackgroundColor', 'hoverBorderColor', 'hoverBorderWidth'], /** * @private */ _getIndexScaleId: function _getIndexScaleId() { return this.chart.scale.id; }, /** * @private */ _getValueScaleId: function _getValueScaleId() { return this.chart.scale.id; }, update: function update(reset) { var me = this; var dataset = me.getDataset(); var meta = me.getMeta(); var start = me.chart.options.startAngle || 0; var starts = me._starts = []; var angles = me._angles = []; var arcs = meta.data; var i, ilen, angle; me._updateRadius(); meta.count = me.countVisibleElements(); for (i = 0, ilen = dataset.data.length; i < ilen; i++) { starts[i] = start; angle = me._computeAngle(i); angles[i] = angle; start += angle; } for (i = 0, ilen = arcs.length; i < ilen; ++i) { arcs[i]._options = me._resolveDataElementOptions(arcs[i], i); me.updateElement(arcs[i], i, reset); } }, /** * @private */ _updateRadius: function _updateRadius() { var me = this; var chart = me.chart; var chartArea = chart.chartArea; var opts = chart.options; var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); chart.outerRadius = Math.max(minSize / 2, 0); chart.innerRadius = Math.max(opts.cutoutPercentage ? chart.outerRadius / 100 * opts.cutoutPercentage : 1, 0); chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); me.outerRadius = chart.outerRadius - chart.radiusLength * me.index; me.innerRadius = me.outerRadius - chart.radiusLength; }, updateElement: function updateElement(arc, index, reset) { var me = this; var chart = me.chart; var dataset = me.getDataset(); var opts = chart.options; var animationOpts = opts.animation; var scale = chart.scale; var labels = chart.data.labels; var centerX = scale.xCenter; var centerY = scale.yCenter; // var negHalfPI = -0.5 * Math.PI; var datasetStartAngle = opts.startAngle; var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); var startAngle = me._starts[index]; var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]); var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); var options = arc._options || {}; helpers$1.extend(arc, { // Utility _datasetIndex: me.index, _index: index, _scale: scale, // Desired view properties _model: { backgroundColor: options.backgroundColor, borderColor: options.borderColor, borderWidth: options.borderWidth, borderAlign: options.borderAlign, x: centerX, y: centerY, innerRadius: 0, outerRadius: reset ? resetRadius : distance, startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, label: helpers$1.valueAtIndexOrDefault(labels, index, labels[index]) } }); arc.pivot(); }, countVisibleElements: function countVisibleElements() { var dataset = this.getDataset(); var meta = this.getMeta(); var count = 0; helpers$1.each(meta.data, function (element, index) { if (!isNaN(dataset.data[index]) && !element.hidden) { count++; } }); return count; }, /** * @protected */ setHoverStyle: function setHoverStyle(arc) { var model = arc._model; var options = arc._options; var getHoverColor = helpers$1.getHoverColor; var valueOrDefault = helpers$1.valueOrDefault; arc.$previousStyle = { backgroundColor: model.backgroundColor, borderColor: model.borderColor, borderWidth: model.borderWidth }; model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor)); model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth); }, /** * @private */ _computeAngle: function _computeAngle(index) { var me = this; var count = this.getMeta().count; var dataset = me.getDataset(); var meta = me.getMeta(); if (isNaN(dataset.data[index]) || meta.data[index].hidden) { return 0; } // Scriptable options var context = { chart: me.chart, dataIndex: index, dataset: dataset, datasetIndex: me.index }; return resolve$3([me.chart.options.elements.arc.angle, 2 * Math.PI / count], context, index); } }); core_defaults._set('pie', helpers$1.clone(core_defaults.doughnut)); core_defaults._set('pie', { cutoutPercentage: 0 }); // Pie charts are Doughnut chart with different defaults var controller_pie = controller_doughnut; var valueOrDefault$7 = helpers$1.valueOrDefault; core_defaults._set('radar', { spanGaps: false, scale: { type: 'radialLinear' }, elements: { line: { fill: 'start', tension: 0 // no bezier in radar } } }); var controller_radar = core_datasetController.extend({ datasetElementType: elements.Line, dataElementType: elements.Point, linkScales: helpers$1.noop, /** * @private */ _datasetElementOptions: ['backgroundColor', 'borderWidth', 'borderColor', 'borderCapStyle', 'borderDash', 'borderDashOffset', 'borderJoinStyle', 'fill'], /** * @private */ _dataElementOptions: { backgroundColor: 'pointBackgroundColor', borderColor: 'pointBorderColor', borderWidth: 'pointBorderWidth', hitRadius: 'pointHitRadius', hoverBackgroundColor: 'pointHoverBackgroundColor', hoverBorderColor: 'pointHoverBorderColor', hoverBorderWidth: 'pointHoverBorderWidth', hoverRadius: 'pointHoverRadius', pointStyle: 'pointStyle', radius: 'pointRadius', rotation: 'pointRotation' }, /** * @private */ _getIndexScaleId: function _getIndexScaleId() { return this.chart.scale.id; }, /** * @private */ _getValueScaleId: function _getValueScaleId() { return this.chart.scale.id; }, update: function update(reset) { var me = this; var meta = me.getMeta(); var line = meta.dataset; var points = meta.data || []; var scale = me.chart.scale; var config = me._config; var i, ilen; // Compatibility: If the properties are defined with only the old name, use those values if (config.tension !== undefined && config.lineTension === undefined) { config.lineTension = config.tension; } // Utility line._scale = scale; line._datasetIndex = me.index; // Data line._children = points; line._loop = true; // Model line._model = me._resolveDatasetElementOptions(line); line.pivot(); // Update Points for (i = 0, ilen = points.length; i < ilen; ++i) { me.updateElement(points[i], i, reset); } // Update bezier control points me.updateBezierControlPoints(); // Now pivot the point for animation for (i = 0, ilen = points.length; i < ilen; ++i) { points[i].pivot(); } }, updateElement: function updateElement(point, index, reset) { var me = this; var custom = point.custom || {}; var dataset = me.getDataset(); var scale = me.chart.scale; var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); var options = me._resolveDataElementOptions(point, index); var lineModel = me.getMeta().dataset._model; var x = reset ? scale.xCenter : pointPosition.x; var y = reset ? scale.yCenter : pointPosition.y; // Utility point._scale = scale; point._options = options; point._datasetIndex = me.index; point._index = index; // Desired view properties point._model = { x: x, // value not used in dataset scale, but we want a consistent API between scales y: y, skip: custom.skip || isNaN(x) || isNaN(y), // Appearance radius: options.radius, pointStyle: options.pointStyle, rotation: options.rotation, backgroundColor: options.backgroundColor, borderColor: options.borderColor, borderWidth: options.borderWidth, tension: valueOrDefault$7(custom.tension, lineModel ? lineModel.tension : 0), // Tooltip hitRadius: options.hitRadius }; }, /** * @private */ _resolveDatasetElementOptions: function _resolveDatasetElementOptions() { var me = this; var config = me._config; var options = me.chart.options; var values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments); values.spanGaps = valueOrDefault$7(config.spanGaps, options.spanGaps); values.tension = valueOrDefault$7(config.lineTension, options.elements.line.tension); return values; }, updateBezierControlPoints: function updateBezierControlPoints() { var me = this; var meta = me.getMeta(); var area = me.chart.chartArea; var points = meta.data || []; var i, ilen, model, controlPoints; // Only consider points that are drawn in case the spanGaps option is used if (meta.dataset._model.spanGaps) { points = points.filter(function (pt) { return !pt._model.skip; }); } function capControlPoint(pt, min, max) { return Math.max(Math.min(pt, max), min); } for (i = 0, ilen = points.length; i < ilen; ++i) { model = points[i]._model; controlPoints = helpers$1.splineCurve(helpers$1.previousItem(points, i, true)._model, model, helpers$1.nextItem(points, i, true)._model, model.tension); // Prevent the bezier going outside of the bounds of the graph model.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right); model.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom); model.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right); model.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom); } }, setHoverStyle: function setHoverStyle(point) { var model = point._model; var options = point._options; var getHoverColor = helpers$1.getHoverColor; point.$previousStyle = { backgroundColor: model.backgroundColor, borderColor: model.borderColor, borderWidth: model.borderWidth, radius: model.radius }; model.backgroundColor = valueOrDefault$7(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); model.borderColor = valueOrDefault$7(options.hoverBorderColor, getHoverColor(options.borderColor)); model.borderWidth = valueOrDefault$7(options.hoverBorderWidth, options.borderWidth); model.radius = valueOrDefault$7(options.hoverRadius, options.radius); } }); core_defaults._set('scatter', { hover: { mode: 'single' }, scales: { xAxes: [{ id: 'x-axis-1', // need an ID so datasets can reference the scale type: 'linear', // scatter should not use a category axis position: 'bottom' }], yAxes: [{ id: 'y-axis-1', type: 'linear', position: 'left' }] }, tooltips: { callbacks: { title: function title() { return ''; // doesn't make sense for scatter since data are formatted as a point }, label: function label(item) { return '(' + item.xLabel + ', ' + item.yLabel + ')'; } } } }); core_defaults._set('global', { datasets: { scatter: { showLine: false } } }); // Scatter charts use line controllers var controller_scatter = controller_line; // NOTE export a map in which the key represents the controller type, not // the class, and so must be CamelCase in order to be correctly retrieved // by the controller in core.controller.js (`controllers[meta.type]`). var controllers = { bar: controller_bar, bubble: controller_bubble, doughnut: controller_doughnut, horizontalBar: controller_horizontalBar, line: controller_line, polarArea: controller_polarArea, pie: controller_pie, radar: controller_radar, scatter: controller_scatter }; /** * Helper function to get relative position for an event * @param {Event|IEvent} event - The event to get the position for * @param {Chart} chart - The chart * @returns {object} the event position */ function getRelativePosition(e, chart) { if (e["native"]) { return { x: e.x, y: e.y }; } return helpers$1.getRelativePosition(e, chart); } /** * Helper function to traverse all of the visible elements in the chart * @param {Chart} chart - the chart * @param {function} handler - the callback to execute for each visible item */ function parseVisibleItems(chart, handler) { var metasets = chart._getSortedVisibleDatasetMetas(); var metadata, i, j, ilen, jlen, element; for (i = 0, ilen = metasets.length; i < ilen; ++i) { metadata = metasets[i].data; for (j = 0, jlen = metadata.length; j < jlen; ++j) { element = metadata[j]; if (!element._view.skip) { handler(element); } } } } /** * Helper function to get the items that intersect the event position * @param {ChartElement[]} items - elements to filter * @param {object} position - the point to be nearest to * @return {ChartElement[]} the nearest items */ function getIntersectItems(chart, position) { var elements = []; parseVisibleItems(chart, function (element) { if (element.inRange(position.x, position.y)) { elements.push(element); } }); return elements; } /** * Helper function to get the items nearest to the event position considering all visible items in teh chart * @param {Chart} chart - the chart to look at elements from * @param {object} position - the point to be nearest to * @param {boolean} intersect - if true, only consider items that intersect the position * @param {function} distanceMetric - function to provide the distance between points * @return {ChartElement[]} the nearest items */ function getNearestItems(chart, position, intersect, distanceMetric) { var minDistance = Number.POSITIVE_INFINITY; var nearestItems = []; parseVisibleItems(chart, function (element) { if (intersect && !element.inRange(position.x, position.y)) { return; } var center = element.getCenterPoint(); var distance = distanceMetric(position, center); if (distance < minDistance) { nearestItems = [element]; minDistance = distance; } else if (distance === minDistance) { // Can have multiple items at the same distance in which case we sort by size nearestItems.push(element); } }); return nearestItems; } /** * Get a distance metric function for two points based on the * axis mode setting * @param {string} axis - the axis mode. x|y|xy */ function getDistanceMetricForAxis(axis) { var useX = axis.indexOf('x') !== -1; var useY = axis.indexOf('y') !== -1; return function (pt1, pt2) { var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); }; } function indexMode(chart, e, options) { var position = getRelativePosition(e, chart); // Default axis for index mode is 'x' to match old behaviour options.axis = options.axis || 'x'; var distanceMetric = getDistanceMetricForAxis(options.axis); var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); var elements = []; if (!items.length) { return []; } chart._getSortedVisibleDatasetMetas().forEach(function (meta) { var element = meta.data[items[0]._index]; // don't count items that are skipped (null data) if (element && !element._view.skip) { elements.push(element); } }); return elements; } /** * @interface IInteractionOptions */ /** * If true, only consider items that intersect the point * @name IInterfaceOptions#boolean * @type Boolean */ /** * Contains interaction related functions * @namespace Chart.Interaction */ var core_interaction = { // Helper function for different modes modes: { single: function single(chart, e) { var position = getRelativePosition(e, chart); var elements = []; parseVisibleItems(chart, function (element) { if (element.inRange(position.x, position.y)) { elements.push(element); return elements; } }); return elements.slice(0, 1); }, /** * @function Chart.Interaction.modes.label * @deprecated since version 2.4.0 * @todo remove at version 3 * @private */ label: indexMode, /** * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item * @function Chart.Interaction.modes.index * @since v2.4.0 * @param {Chart} chart - the chart we are returning items from * @param {Event} e - the event we are find things at * @param {IInteractionOptions} options - options to use during interaction * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ index: indexMode, /** * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something * If the options.intersect is false, we find the nearest item and return the items in that dataset * @function Chart.Interaction.modes.dataset * @param {Chart} chart - the chart we are returning items from * @param {Event} e - the event we are find things at * @param {IInteractionOptions} options - options to use during interaction * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ dataset: function dataset(chart, e, options) { var position = getRelativePosition(e, chart); options.axis = options.axis || 'xy'; var distanceMetric = getDistanceMetricForAxis(options.axis); var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); if (items.length > 0) { items = chart.getDatasetMeta(items[0]._datasetIndex).data; } return items; }, /** * @function Chart.Interaction.modes.x-axis * @deprecated since version 2.4.0. Use index mode and intersect == true * @todo remove at version 3 * @private */ 'x-axis': function xAxis(chart, e) { return indexMode(chart, e, { intersect: false }); }, /** * Point mode returns all elements that hit test based on the event position * of the event * @function Chart.Interaction.modes.intersect * @param {Chart} chart - the chart we are returning items from * @param {Event} e - the event we are find things at * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ point: function point(chart, e) { var position = getRelativePosition(e, chart); return getIntersectItems(chart, position); }, /** * nearest mode returns the element closest to the point * @function Chart.Interaction.modes.intersect * @param {Chart} chart - the chart we are returning items from * @param {Event} e - the event we are find things at * @param {IInteractionOptions} options - options to use * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ nearest: function nearest(chart, e, options) { var position = getRelativePosition(e, chart); options.axis = options.axis || 'xy'; var distanceMetric = getDistanceMetricForAxis(options.axis); return getNearestItems(chart, position, options.intersect, distanceMetric); }, /** * x mode returns the elements that hit-test at the current x coordinate * @function Chart.Interaction.modes.x * @param {Chart} chart - the chart we are returning items from * @param {Event} e - the event we are find things at * @param {IInteractionOptions} options - options to use * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ x: function x(chart, e, options) { var position = getRelativePosition(e, chart); var items = []; var intersectsItem = false; parseVisibleItems(chart, function (element) { if (element.inXRange(position.x)) { items.push(element); } if (element.inRange(position.x, position.y)) { intersectsItem = true; } }); // If we want to trigger on an intersect and we don't have any items // that intersect the position, return nothing if (options.intersect && !intersectsItem) { items = []; } return items; }, /** * y mode returns the elements that hit-test at the current y coordinate * @function Chart.Interaction.modes.y * @param {Chart} chart - the chart we are returning items from * @param {Event} e - the event we are find things at * @param {IInteractionOptions} options - options to use * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ y: function y(chart, e, options) { var position = getRelativePosition(e, chart); var items = []; var intersectsItem = false; parseVisibleItems(chart, function (element) { if (element.inYRange(position.y)) { items.push(element); } if (element.inRange(position.x, position.y)) { intersectsItem = true; } }); // If we want to trigger on an intersect and we don't have any items // that intersect the position, return nothing if (options.intersect && !intersectsItem) { items = []; } return items; } } }; var extend = helpers$1.extend; function filterByPosition(array, position) { return helpers$1.where(array, function (v) { return v.pos === position; }); } function sortByWeight(array, reverse) { return array.sort(function (a, b) { var v0 = reverse ? b : a; var v1 = reverse ? a : b; return v0.weight === v1.weight ? v0.index - v1.index : v0.weight - v1.weight; }); } function wrapBoxes(boxes) { var layoutBoxes = []; var i, ilen, box; for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) { box = boxes[i]; layoutBoxes.push({ index: i, box: box, pos: box.position, horizontal: box.isHorizontal(), weight: box.weight }); } return layoutBoxes; } function setLayoutDims(layouts, params) { var i, ilen, layout; for (i = 0, ilen = layouts.length; i < ilen; ++i) { layout = layouts[i]; // store width used instead of chartArea.w in fitBoxes layout.width = layout.horizontal ? layout.box.fullWidth && params.availableWidth : params.vBoxMaxWidth; // store height used instead of chartArea.h in fitBoxes layout.height = layout.horizontal && params.hBoxMaxHeight; } } function buildLayoutBoxes(boxes) { var layoutBoxes = wrapBoxes(boxes); var left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true); var right = sortByWeight(filterByPosition(layoutBoxes, 'right')); var top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true); var bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom')); return { leftAndTop: left.concat(top), rightAndBottom: right.concat(bottom), chartArea: filterByPosition(layoutBoxes, 'chartArea'), vertical: left.concat(right), horizontal: top.concat(bottom) }; } function getCombinedMax(maxPadding, chartArea, a, b) { return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]); } function updateDims(chartArea, params, layout) { var box = layout.box; var maxPadding = chartArea.maxPadding; var newWidth, newHeight; if (layout.size) { // this layout was already counted for, lets first reduce old size chartArea[layout.pos] -= layout.size; } layout.size = layout.horizontal ? box.height : box.width; chartArea[layout.pos] += layout.size; if (box.getPadding) { var boxPadding = box.getPadding(); maxPadding.top = Math.max(maxPadding.top, boxPadding.top); maxPadding.left = Math.max(maxPadding.left, boxPadding.left); maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom); maxPadding.right = Math.max(maxPadding.right, boxPadding.right); } newWidth = params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'); newHeight = params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'); if (newWidth !== chartArea.w || newHeight !== chartArea.h) { chartArea.w = newWidth; chartArea.h = newHeight; // return true if chart area changed in layout's direction var sizes = layout.horizontal ? [newWidth, chartArea.w] : [newHeight, chartArea.h]; return sizes[0] !== sizes[1] && (!isNaN(sizes[0]) || !isNaN(sizes[1])); } } function handleMaxPadding(chartArea) { var maxPadding = chartArea.maxPadding; function updatePos(pos) { var change = Math.max(maxPadding[pos] - chartArea[pos], 0); chartArea[pos] += change; return change; } chartArea.y += updatePos('top'); chartArea.x += updatePos('left'); updatePos('right'); updatePos('bottom'); } function getMargins(horizontal, chartArea) { var maxPadding = chartArea.maxPadding; function marginForPositions(positions) { var margin = { left: 0, top: 0, right: 0, bottom: 0 }; positions.forEach(function (pos) { margin[pos] = Math.max(chartArea[pos], maxPadding[pos]); }); return margin; } return horizontal ? marginForPositions(['left', 'right']) : marginForPositions(['top', 'bottom']); } function fitBoxes(boxes, chartArea, params) { var refitBoxes = []; var i, ilen, layout, box, refit, changed; for (i = 0, ilen = boxes.length; i < ilen; ++i) { layout = boxes[i]; box = layout.box; box.update(layout.width || chartArea.w, layout.height || chartArea.h, getMargins(layout.horizontal, chartArea)); if (updateDims(chartArea, params, layout)) { changed = true; if (refitBoxes.length) { // Dimensions changed and there were non full width boxes before this // -> we have to refit those refit = true; } } if (!box.fullWidth) { // fullWidth boxes don't need to be re-fitted in any case refitBoxes.push(layout); } } return refit ? fitBoxes(refitBoxes, chartArea, params) || changed : changed; } function placeBoxes(boxes, chartArea, params) { var userPadding = params.padding; var x = chartArea.x; var y = chartArea.y; var i, ilen, layout, box; for (i = 0, ilen = boxes.length; i < ilen; ++i) { layout = boxes[i]; box = layout.box; if (layout.horizontal) { box.left = box.fullWidth ? userPadding.left : chartArea.left; box.right = box.fullWidth ? params.outerWidth - userPadding.right : chartArea.left + chartArea.w; box.top = y; box.bottom = y + box.height; box.width = box.right - box.left; y = box.bottom; } else { box.left = x; box.right = x + box.width; box.top = chartArea.top; box.bottom = chartArea.top + chartArea.h; box.height = box.bottom - box.top; x = box.right; } } chartArea.x = x; chartArea.y = y; } core_defaults._set('global', { layout: { padding: { top: 0, right: 0, bottom: 0, left: 0 } } }); /** * @interface ILayoutItem * @prop {string} position - The position of the item in the chart layout. Possible values are * 'left', 'top', 'right', 'bottom', and 'chartArea' * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) * @prop {function} update - Takes two parameters: width and height. Returns size of item * @prop {function} getPadding - Returns an object with padding on the edges * @prop {number} width - Width of item. Must be valid after update() * @prop {number} height - Height of item. Must be valid after update() * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update */ // The layout service is very self explanatory. It's responsible for the layout within a chart. // Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need // It is this service's responsibility of carrying out that layout. var core_layouts = { defaults: {}, /** * Register a box to a chart. * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. * @param {Chart} chart - the chart to use * @param {ILayoutItem} item - the item to add to be layed out */ addBox: function addBox(chart, item) { if (!chart.boxes) { chart.boxes = []; } // initialize item with default values item.fullWidth = item.fullWidth || false; item.position = item.position || 'top'; item.weight = item.weight || 0; item._layers = item._layers || function () { return [{ z: 0, draw: function draw() { item.draw.apply(item, arguments); } }]; }; chart.boxes.push(item); }, /** * Remove a layoutItem from a chart * @param {Chart} chart - the chart to remove the box from * @param {ILayoutItem} layoutItem - the item to remove from the layout */ removeBox: function removeBox(chart, layoutItem) { var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; if (index !== -1) { chart.boxes.splice(index, 1); } }, /** * Sets (or updates) options on the given `item`. * @param {Chart} chart - the chart in which the item lives (or will be added to) * @param {ILayoutItem} item - the item to configure with the given options * @param {object} options - the new item options. */ configure: function configure(chart, item, options) { var props = ['fullWidth', 'position', 'weight']; var ilen = props.length; var i = 0; var prop; for (; i < ilen; ++i) { prop = props[i]; if (options.hasOwnProperty(prop)) { item[prop] = options[prop]; } } }, /** * Fits boxes of the given chart into the given size by having each box measure itself * then running a fitting algorithm * @param {Chart} chart - the chart * @param {number} width - the width to fit into * @param {number} height - the height to fit into */ update: function update(chart, width, height) { if (!chart) { return; } var layoutOptions = chart.options.layout || {}; var padding = helpers$1.options.toPadding(layoutOptions.padding); var availableWidth = width - padding.width; var availableHeight = height - padding.height; var boxes = buildLayoutBoxes(chart.boxes); var verticalBoxes = boxes.vertical; var horizontalBoxes = boxes.horizontal; // Essentially we now have any number of boxes on each of the 4 sides. // Our canvas looks like the following. // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and // B1 is the bottom axis // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays // These locations are single-box locations only, when trying to register a chartArea location that is already taken, // an error will be thrown. // // |----------------------------------------------------| // | T1 (Full Width) | // |----------------------------------------------------| // | | | T2 | | // | |----|-------------------------------------|----| // | | | C1 | | C2 | | // | | |----| |----| | // | | | | | // | L1 | L2 | ChartArea (C0) | R1 | // | | | | | // | | |----| |----| | // | | | C3 | | C4 | | // | |----|-------------------------------------|----| // | | | B1 | | // |----------------------------------------------------| // | B2 (Full Width) | // |----------------------------------------------------| // var params = Object.freeze({ outerWidth: width, outerHeight: height, padding: padding, availableWidth: availableWidth, vBoxMaxWidth: availableWidth / 2 / verticalBoxes.length, hBoxMaxHeight: availableHeight / 2 }); var chartArea = extend({ maxPadding: extend({}, padding), w: availableWidth, h: availableHeight, x: padding.left, y: padding.top }, padding); setLayoutDims(verticalBoxes.concat(horizontalBoxes), params); // First fit vertical boxes fitBoxes(verticalBoxes, chartArea, params); // Then fit horizontal boxes if (fitBoxes(horizontalBoxes, chartArea, params)) { // if the area changed, re-fit vertical boxes fitBoxes(verticalBoxes, chartArea, params); } handleMaxPadding(chartArea); // Finally place the boxes to correct coordinates placeBoxes(boxes.leftAndTop, chartArea, params); // Move to opposite side of chart chartArea.x += chartArea.w; chartArea.y += chartArea.h; placeBoxes(boxes.rightAndBottom, chartArea, params); chart.chartArea = { left: chartArea.left, top: chartArea.top, right: chartArea.left + chartArea.w, bottom: chartArea.top + chartArea.h }; // Finally update boxes in chartArea (radial scale for example) helpers$1.each(boxes.chartArea, function (layout) { var box = layout.box; extend(box, chart.chartArea); box.update(chartArea.w, chartArea.h); }); } }; /** * Platform fallback implementation (minimal). * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 */ var platform_basic = { acquireContext: function acquireContext(item) { if (item && item.canvas) { // Support for any object associated to a canvas (including a context2d) item = item.canvas; } return item && item.getContext('2d') || null; } }; var platform_dom = "/*\r\n * DOM element rendering detection\r\n * https://davidwalsh.name/detect-node-insertion\r\n */\r\n@keyframes chartjs-render-animation {\r\n\tfrom { opacity: 0.99; }\r\n\tto { opacity: 1; }\r\n}\r\n\r\n.chartjs-render-monitor {\r\n\tanimation: chartjs-render-animation 0.001s;\r\n}\r\n\r\n/*\r\n * DOM element resizing detection\r\n * https://github.com/marcj/css-element-queries\r\n */\r\n.chartjs-size-monitor,\r\n.chartjs-size-monitor-expand,\r\n.chartjs-size-monitor-shrink {\r\n\tposition: absolute;\r\n\tdirection: ltr;\r\n\tleft: 0;\r\n\ttop: 0;\r\n\tright: 0;\r\n\tbottom: 0;\r\n\toverflow: hidden;\r\n\tpointer-events: none;\r\n\tvisibility: hidden;\r\n\tz-index: -1;\r\n}\r\n\r\n.chartjs-size-monitor-expand > div {\r\n\tposition: absolute;\r\n\twidth: 1000000px;\r\n\theight: 1000000px;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n\r\n.chartjs-size-monitor-shrink > div {\r\n\tposition: absolute;\r\n\twidth: 200%;\r\n\theight: 200%;\r\n\tleft: 0;\r\n\ttop: 0;\r\n}\r\n"; var platform_dom$1 = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': platform_dom }); var stylesheet = getCjsExportFromNamespace(platform_dom$1); var EXPANDO_KEY = '$chartjs'; var CSS_PREFIX = 'chartjs-'; var CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor'; var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; /** * DOM event types -> Chart.js event types. * Note: only events with different types are mapped. * @see https://developer.mozilla.org/en-US/docs/Web/Events */ var EVENT_TYPES = { touchstart: 'mousedown', touchmove: 'mousemove', touchend: 'mouseup', pointerenter: 'mouseenter', pointerdown: 'mousedown', pointermove: 'mousemove', pointerup: 'mouseup', pointerleave: 'mouseout', pointerout: 'mouseout' }; /** * The "used" size is the final value of a dimension property after all calculations have * been performed. This method uses the computed style of `element` but returns undefined * if the computed style is not expressed in pixels. That can happen in some cases where * `element` has a size relative to its parent and this last one is not yet displayed, * for example because of `display: none` on a parent node. * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value * @returns {number} Size in pixels or undefined if unknown. */ function readUsedSize(element, property) { var value = helpers$1.getStyle(element, property); var matches = value && value.match(/^(\d+)(\.\d+)?px$/); return matches ? Number(matches[1]) : undefined; } /** * Initializes the canvas style and render size without modifying the canvas display size, * since responsiveness is handled by the controller.resize() method. The config is used * to determine the aspect ratio to apply in case no explicit height has been specified. */ function initCanvas(canvas, config) { var style = canvas.style; // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it // returns null or '' if no explicit value has been set to the canvas attribute. var renderHeight = canvas.getAttribute('height'); var renderWidth = canvas.getAttribute('width'); // Chart.js modifies some canvas values that we want to restore on destroy canvas[EXPANDO_KEY] = { initial: { height: renderHeight, width: renderWidth, style: { display: style.display, height: style.height, width: style.width } } }; // Force canvas to display as block to avoid extra space caused by inline // elements, which would interfere with the responsive resize process. // https://github.com/chartjs/Chart.js/issues/2538 style.display = style.display || 'block'; if (renderWidth === null || renderWidth === '') { var displayWidth = readUsedSize(canvas, 'width'); if (displayWidth !== undefined) { canvas.width = displayWidth; } } if (renderHeight === null || renderHeight === '') { if (canvas.style.height === '') { // If no explicit render height and style height, let's apply the aspect ratio, // which one can be specified by the user but also by charts as default option // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. canvas.height = canvas.width / (config.options.aspectRatio || 2); } else { var displayHeight = readUsedSize(canvas, 'height'); if (displayWidth !== undefined) { canvas.height = displayHeight; } } } return canvas; } /** * Detects support for options object argument in addEventListener. * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support * @private */ var supportsEventListenerOptions = function () { var supports = false; try { var options = Object.defineProperty({}, 'passive', { // eslint-disable-next-line getter-return get: function get() { supports = true; } }); window.addEventListener('e', null, options); } catch (e) {// continue regardless of error } return supports; }(); // Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. // https://github.com/chartjs/Chart.js/issues/4287 var eventListenerOptions = supportsEventListenerOptions ? { passive: true } : false; function addListener(node, type, listener) { node.addEventListener(type, listener, eventListenerOptions); } function removeListener(node, type, listener) { node.removeEventListener(type, listener, eventListenerOptions); } function createEvent(type, chart, x, y, nativeEvent) { return { type: type, chart: chart, "native": nativeEvent || null, x: x !== undefined ? x : null, y: y !== undefined ? y : null }; } function fromNativeEvent(event, chart) { var type = EVENT_TYPES[event.type] || event.type; var pos = helpers$1.getRelativePosition(event, chart); return createEvent(type, chart, pos.x, pos.y, event); } function throttled(fn, thisArg) { var ticking = false; var args = []; return function () { args = Array.prototype.slice.call(arguments); thisArg = thisArg || this; if (!ticking) { ticking = true; helpers$1.requestAnimFrame.call(window, function () { ticking = false; fn.apply(thisArg, args); }); } }; } function createDiv(cls) { var el = document.createElement('div'); el.className = cls || ''; return el; } // Implementation based on https://github.com/marcj/css-element-queries function createResizer(handler) { var maxSize = 1000000; // NOTE(SB) Don't use innerHTML because it could be considered unsafe. // https://github.com/chartjs/Chart.js/issues/5902 var resizer = createDiv(CSS_SIZE_MONITOR); var expand = createDiv(CSS_SIZE_MONITOR + '-expand'); var shrink = createDiv(CSS_SIZE_MONITOR + '-shrink'); expand.appendChild(createDiv()); shrink.appendChild(createDiv()); resizer.appendChild(expand); resizer.appendChild(shrink); resizer._reset = function () { expand.scrollLeft = maxSize; expand.scrollTop = maxSize; shrink.scrollLeft = maxSize; shrink.scrollTop = maxSize; }; var onScroll = function onScroll() { resizer._reset(); handler(); }; addListener(expand, 'scroll', onScroll.bind(expand, 'expand')); addListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); return resizer; } // https://davidwalsh.name/detect-node-insertion function watchForRender(node, handler) { var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); var proxy = expando.renderProxy = function (e) { if (e.animationName === CSS_RENDER_ANIMATION) { handler(); } }; helpers$1.each(ANIMATION_START_EVENTS, function (type) { addListener(node, type, proxy); }); // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class // is removed then added back immediately (same animation frame?). Accessing the // `offsetParent` property will force a reflow and re-evaluate the CSS animation. // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics // https://github.com/chartjs/Chart.js/issues/4737 expando.reflow = !!node.offsetParent; node.classList.add(CSS_RENDER_MONITOR); } function unwatchForRender(node) { var expando = node[EXPANDO_KEY] || {}; var proxy = expando.renderProxy; if (proxy) { helpers$1.each(ANIMATION_START_EVENTS, function (type) { removeListener(node, type, proxy); }); delete expando.renderProxy; } node.classList.remove(CSS_RENDER_MONITOR); } function addResizeListener(node, listener, chart) { var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); // Let's keep track of this added resizer and thus avoid DOM query when removing it. var resizer = expando.resizer = createResizer(throttled(function () { if (expando.resizer) { var container = chart.options.maintainAspectRatio && node.parentNode; var w = container ? container.clientWidth : 0; listener(createEvent('resize', chart)); if (container && container.clientWidth < w && chart.canvas) { // If the container size shrank during chart resize, let's assume // scrollbar appeared. So we resize again with the scrollbar visible - // effectively making chart smaller and the scrollbar hidden again. // Because we are inside `throttled`, and currently `ticking`, scroll // events are ignored during this whole 2 resize process. // If we assumed wrong and something else happened, we are resizing // twice in a frame (potential performance issue) listener(createEvent('resize', chart)); } } })); // The resizer needs to be attached to the node parent, so we first need to be // sure that `node` is attached to the DOM before injecting the resizer element. watchForRender(node, function () { if (expando.resizer) { var container = node.parentNode; if (container && container !== resizer.parentNode) { container.insertBefore(resizer, container.firstChild); } // The container size might have changed, let's reset the resizer state. resizer._reset(); } }); } function removeResizeListener(node) { var expando = node[EXPANDO_KEY] || {}; var resizer = expando.resizer; delete expando.resizer; unwatchForRender(node); if (resizer && resizer.parentNode) { resizer.parentNode.removeChild(resizer); } } /** * Injects CSS styles inline if the styles are not already present. * @param {HTMLDocument|ShadowRoot} rootNode - the node to contain the
/ elements with colspans. SOLUTION: making individual
_this.frameElRefs = new common.RefMap(); // the fc-daygrid-day-frame _this.fgElRefs = new common.RefMap(); // the fc-daygrid-day-events _this.segHarnessRefs = new common.RefMap(); // indexed by "instanceId:firstCol" _this.rootElRef = common.createRef(); _this.state = { framePositions: null, maxContentHeight: null, eventInstanceHeights: {} }; return _this; } TableRow.prototype.render = function () { var _this = this; var _a = this, props = _a.props, state = _a.state, context = _a.context; var options = context.options; var colCnt = props.cells.length; var businessHoursByCol = splitSegsByFirstCol(props.businessHourSegs, colCnt); var bgEventSegsByCol = splitSegsByFirstCol(props.bgEventSegs, colCnt); var highlightSegsByCol = splitSegsByFirstCol(this.getHighlightSegs(), colCnt); var mirrorSegsByCol = splitSegsByFirstCol(this.getMirrorSegs(), colCnt); var _b = computeFgSegPlacement(common.sortEventSegs(props.fgEventSegs, options.eventOrder), props.dayMaxEvents, props.dayMaxEventRows, options.eventOrderStrict, state.eventInstanceHeights, state.maxContentHeight, props.cells), singleColPlacements = _b.singleColPlacements, multiColPlacements = _b.multiColPlacements, moreCnts = _b.moreCnts, moreMarginTops = _b.moreMarginTops; var isForcedInvisible = // TODO: messy way to compute this props.eventDrag && props.eventDrag.affectedInstances || props.eventResize && props.eventResize.affectedInstances || {}; return common.createElement("tr", { ref: this.rootElRef, role: "row" }, props.renderIntro && props.renderIntro(), props.cells.map(function (cell, col) { var normalFgNodes = _this.renderFgSegs(col, props.forPrint ? singleColPlacements[col] : multiColPlacements[col], props.todayRange, isForcedInvisible); var mirrorFgNodes = _this.renderFgSegs(col, buildMirrorPlacements(mirrorSegsByCol[col], multiColPlacements), props.todayRange, {}, Boolean(props.eventDrag), Boolean(props.eventResize), false); return common.createElement(TableCell, { key: cell.key, elRef: _this.cellElRefs.createRef(cell.key), innerElRef: _this.frameElRefs.createRef(cell.key) /* FF problem, but okay to use for left/right. TODO: rename prop */ , dateProfile: props.dateProfile, date: cell.date, showDayNumber: props.showDayNumbers, showWeekNumber: props.showWeekNumbers && col === 0, forceDayTop: props.showWeekNumbers /* even displaying weeknum for row, not necessarily day */ , todayRange: props.todayRange, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, extraHookProps: cell.extraHookProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, extraDateSpan: cell.extraDateSpan, moreCnt: moreCnts[col], moreMarginTop: moreMarginTops[col], singlePlacements: singleColPlacements[col], fgContentElRef: _this.fgElRefs.createRef(cell.key), fgContent: // Fragment scopes the keys common.createElement(common.Fragment, null, common.createElement(common.Fragment, null, normalFgNodes), common.createElement(common.Fragment, null, mirrorFgNodes)), bgContent: // Fragment scopes the keys common.createElement(common.Fragment, null, _this.renderFillSegs(highlightSegsByCol[col], 'highlight'), _this.renderFillSegs(businessHoursByCol[col], 'non-business'), _this.renderFillSegs(bgEventSegsByCol[col], 'bg-event')) }); })); }; TableRow.prototype.componentDidMount = function () { this.updateSizing(true); }; TableRow.prototype.componentDidUpdate = function (prevProps, prevState) { var currentProps = this.props; this.updateSizing(!common.isPropsEqual(prevProps, currentProps)); }; TableRow.prototype.getHighlightSegs = function () { var props = this.props; if (props.eventDrag && props.eventDrag.segs.length) { // messy check return props.eventDrag.segs; } if (props.eventResize && props.eventResize.segs.length) { // messy check return props.eventResize.segs; } return props.dateSelectionSegs; }; TableRow.prototype.getMirrorSegs = function () { var props = this.props; if (props.eventResize && props.eventResize.segs.length) { // messy check return props.eventResize.segs; } return []; }; TableRow.prototype.renderFgSegs = function (col, segPlacements, todayRange, isForcedInvisible, isDragging, isResizing, isDateSelecting) { var context = this.context; var eventSelection = this.props.eventSelection; var framePositions = this.state.framePositions; var defaultDisplayEventEnd = this.props.cells.length === 1; // colCnt === 1 var isMirror = isDragging || isResizing || isDateSelecting; var nodes = []; if (framePositions) { for (var _i = 0, segPlacements_1 = segPlacements; _i < segPlacements_1.length; _i++) { var placement = segPlacements_1[_i]; var seg = placement.seg; var instanceId = seg.eventRange.instance.instanceId; var key = instanceId + ':' + col; var isVisible = placement.isVisible && !isForcedInvisible[instanceId]; var isAbsolute = placement.isAbsolute; var left = ''; var right = ''; if (isAbsolute) { if (context.isRtl) { right = 0; left = framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol]; } else { left = 0; right = framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol]; } } /* known bug: events that are force to be list-item but span multiple days still take up space in later columns todo: in print view, for multi-day events, don't display title within non-start/end segs */ nodes.push(common.createElement("div", { className: 'fc-daygrid-event-harness' + (isAbsolute ? ' fc-daygrid-event-harness-abs' : ''), key: key, ref: isMirror ? null : this.segHarnessRefs.createRef(key), style: { visibility: isVisible ? '' : 'hidden', marginTop: isAbsolute ? '' : placement.marginTop, top: isAbsolute ? placement.absoluteTop : '', left: left, right: right } }, hasListItemDisplay(seg) ? common.createElement(TableListItemEvent, tslib.__assign({ seg: seg, isDragging: isDragging, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, common.getSegMeta(seg, todayRange))) : common.createElement(TableBlockEvent, tslib.__assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, common.getSegMeta(seg, todayRange))))); } } return nodes; }; TableRow.prototype.renderFillSegs = function (segs, fillType) { var isRtl = this.context.isRtl; var todayRange = this.props.todayRange; var framePositions = this.state.framePositions; var nodes = []; if (framePositions) { for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { var seg = segs_1[_i]; var leftRightCss = isRtl ? { right: 0, left: framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol] } : { left: 0, right: framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol] }; nodes.push(common.createElement("div", { key: common.buildEventRangeKey(seg.eventRange), className: "fc-daygrid-bg-harness", style: leftRightCss }, fillType === 'bg-event' ? common.createElement(common.BgEvent, tslib.__assign({ seg: seg }, common.getSegMeta(seg, todayRange))) : common.renderFill(fillType))); } } return common.createElement.apply(void 0, tslib.__spreadArray([common.Fragment, {}], nodes)); }; TableRow.prototype.updateSizing = function (isExternalSizingChange) { var _a = this, props = _a.props, frameElRefs = _a.frameElRefs; if (!props.forPrint && props.clientWidth !== null // positioning ready? ) { if (isExternalSizingChange) { var frameEls = props.cells.map(function (cell) { return frameElRefs.currentMap[cell.key]; }); if (frameEls.length) { var originEl = this.rootElRef.current; this.setState({ framePositions: new common.PositionCache(originEl, frameEls, true, // isHorizontal false) }); } } var oldInstanceHeights = this.state.eventInstanceHeights; var newInstanceHeights = this.queryEventInstanceHeights(); var limitByContentHeight = props.dayMaxEvents === true || props.dayMaxEventRows === true; this.safeSetState({ // HACK to prevent oscillations of events being shown/hidden from max-event-rows // Essentially, once you compute an element's height, never null-out. // TODO: always display all events, as visibility:hidden? eventInstanceHeights: tslib.__assign(tslib.__assign({}, oldInstanceHeights), newInstanceHeights), maxContentHeight: limitByContentHeight ? this.computeMaxContentHeight() : null }); } }; TableRow.prototype.queryEventInstanceHeights = function () { var segElMap = this.segHarnessRefs.currentMap; var eventInstanceHeights = {}; // get the max height amongst instance segs for (var key in segElMap) { var height = Math.round(segElMap[key].getBoundingClientRect().height); var instanceId = key.split(':')[0]; // deconstruct how renderFgSegs makes the key eventInstanceHeights[instanceId] = Math.max(eventInstanceHeights[instanceId] || 0, height); } return eventInstanceHeights; }; TableRow.prototype.computeMaxContentHeight = function () { var firstKey = this.props.cells[0].key; var cellEl = this.cellElRefs.currentMap[firstKey]; var fcContainerEl = this.fgElRefs.currentMap[firstKey]; return cellEl.getBoundingClientRect().bottom - fcContainerEl.getBoundingClientRect().top; }; TableRow.prototype.getCellEls = function () { var elMap = this.cellElRefs.currentMap; return this.props.cells.map(function (cell) { return elMap[cell.key]; }); }; return TableRow; }(common.DateComponent); TableRow.addStateEquality({ eventInstanceHeights: common.isPropsEqual }); function buildMirrorPlacements(mirrorSegs, colPlacements) { if (!mirrorSegs.length) { return []; } var topsByInstanceId = buildAbsoluteTopHash(colPlacements); // TODO: cache this at first render? return mirrorSegs.map(function (seg) { return { seg: seg, isVisible: true, isAbsolute: true, absoluteTop: topsByInstanceId[seg.eventRange.instance.instanceId], marginTop: 0 }; }); } function buildAbsoluteTopHash(colPlacements) { var topsByInstanceId = {}; for (var _i = 0, colPlacements_1 = colPlacements; _i < colPlacements_1.length; _i++) { var placements = colPlacements_1[_i]; for (var _a = 0, placements_1 = placements; _a < placements_1.length; _a++) { var placement = placements_1[_a]; topsByInstanceId[placement.seg.eventRange.instance.instanceId] = placement.absoluteTop; } } return topsByInstanceId; } var Table = /** @class */ function (_super) { tslib.__extends(Table, _super); function Table() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.splitBusinessHourSegs = common.memoize(splitSegsByRow); _this.splitBgEventSegs = common.memoize(splitSegsByRow); _this.splitFgEventSegs = common.memoize(splitSegsByRow); _this.splitDateSelectionSegs = common.memoize(splitSegsByRow); _this.splitEventDrag = common.memoize(splitInteractionByRow); _this.splitEventResize = common.memoize(splitInteractionByRow); _this.rowRefs = new common.RefMap(); _this.handleRootEl = function (rootEl) { _this.rootEl = rootEl; if (rootEl) { _this.context.registerInteractiveComponent(_this, { el: rootEl, isHitComboAllowed: _this.props.isHitComboAllowed }); } else { _this.context.unregisterInteractiveComponent(_this); } }; return _this; } Table.prototype.render = function () { var _this = this; var props = this.props; var dateProfile = props.dateProfile, dayMaxEventRows = props.dayMaxEventRows, dayMaxEvents = props.dayMaxEvents, expandRows = props.expandRows; var rowCnt = props.cells.length; var businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, rowCnt); var bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, rowCnt); var fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, rowCnt); var dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, rowCnt); var eventDragByRow = this.splitEventDrag(props.eventDrag, rowCnt); var eventResizeByRow = this.splitEventResize(props.eventResize, rowCnt); var limitViaBalanced = dayMaxEvents === true || dayMaxEventRows === true; // if rows can't expand to fill fixed height, can't do balanced-height event limit // TODO: best place to normalize these options? if (limitViaBalanced && !expandRows) { limitViaBalanced = false; dayMaxEventRows = null; dayMaxEvents = null; } var classNames = ['fc-daygrid-body', limitViaBalanced ? 'fc-daygrid-body-balanced' : 'fc-daygrid-body-unbalanced', expandRows ? '' : 'fc-daygrid-body-natural' // will height of one row depend on the others? ]; return common.createElement("div", { className: classNames.join(' '), ref: this.handleRootEl, style: { // these props are important to give this wrapper correct dimensions for interactions // TODO: if we set it here, can we avoid giving to inner tables? width: props.clientWidth, minWidth: props.tableMinWidth } }, common.createElement(common.NowTimer, { unit: "day" }, function (nowDate, todayRange) { return common.createElement(common.Fragment, null, common.createElement("table", { role: "presentation", className: "fc-scrollgrid-sync-table", style: { width: props.clientWidth, minWidth: props.tableMinWidth, height: expandRows ? props.clientHeight : '' } }, props.colGroupNode, common.createElement("tbody", { role: "presentation" }, props.cells.map(function (cells, row) { return common.createElement(TableRow, { ref: _this.rowRefs.createRef(row), key: cells.length ? cells[0].date.toISOString() /* best? or put key on cell? or use diff formatter? */ : row // in case there are no cells (like when resource view is loading) , showDayNumbers: rowCnt > 1, showWeekNumbers: props.showWeekNumbers, todayRange: todayRange, dateProfile: dateProfile, cells: cells, renderIntro: props.renderRowIntro, businessHourSegs: businessHourSegsByRow[row], eventSelection: props.eventSelection, bgEventSegs: bgEventSegsByRow[row].filter(isSegAllDay) /* hack */ , fgEventSegs: fgEventSegsByRow[row], dateSelectionSegs: dateSelectionSegsByRow[row], eventDrag: eventDragByRow[row], eventResize: eventResizeByRow[row], dayMaxEvents: dayMaxEvents, dayMaxEventRows: dayMaxEventRows, clientWidth: props.clientWidth, clientHeight: props.clientHeight, forPrint: props.forPrint }); })))); })); }; // Hit System // ---------------------------------------------------------------------------------------------------- Table.prototype.prepareHits = function () { this.rowPositions = new common.PositionCache(this.rootEl, this.rowRefs.collect().map(function (rowObj) { return rowObj.getCellEls()[0]; }), // first cell el in each row. TODO: not optimal false, true); this.colPositions = new common.PositionCache(this.rootEl, this.rowRefs.currentMap[0].getCellEls(), // cell els in first row true, // horizontal false); }; Table.prototype.queryHit = function (positionLeft, positionTop) { var _a = this, colPositions = _a.colPositions, rowPositions = _a.rowPositions; var col = colPositions.leftToIndex(positionLeft); var row = rowPositions.topToIndex(positionTop); if (row != null && col != null) { var cell = this.props.cells[row][col]; return { dateProfile: this.props.dateProfile, dateSpan: tslib.__assign({ range: this.getCellRange(row, col), allDay: true }, cell.extraDateSpan), dayEl: this.getCellEl(row, col), rect: { left: colPositions.lefts[col], right: colPositions.rights[col], top: rowPositions.tops[row], bottom: rowPositions.bottoms[row] }, layer: 0 }; } return null; }; Table.prototype.getCellEl = function (row, col) { return this.rowRefs.currentMap[row].getCellEls()[col]; // TODO: not optimal }; Table.prototype.getCellRange = function (row, col) { var start = this.props.cells[row][col].date; var end = common.addDays(start, 1); return { start: start, end: end }; }; return Table; }(common.DateComponent); function isSegAllDay(seg) { return seg.eventRange.def.allDay; } var DayTableSlicer = /** @class */ function (_super) { tslib.__extends(DayTableSlicer, _super); function DayTableSlicer() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.forceDayIfListItem = true; return _this; } DayTableSlicer.prototype.sliceRange = function (dateRange, dayTableModel) { return dayTableModel.sliceRange(dateRange); }; return DayTableSlicer; }(common.Slicer); var DayTable = /** @class */ function (_super) { tslib.__extends(DayTable, _super); function DayTable() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.slicer = new DayTableSlicer(); _this.tableRef = common.createRef(); return _this; } DayTable.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; return common.createElement(Table, tslib.__assign({ ref: this.tableRef }, this.slicer.sliceProps(props, props.dateProfile, props.nextDayThreshold, context, props.dayTableModel), { dateProfile: props.dateProfile, cells: props.dayTableModel.cells, colGroupNode: props.colGroupNode, tableMinWidth: props.tableMinWidth, renderRowIntro: props.renderRowIntro, dayMaxEvents: props.dayMaxEvents, dayMaxEventRows: props.dayMaxEventRows, showWeekNumbers: props.showWeekNumbers, expandRows: props.expandRows, headerAlignElRef: props.headerAlignElRef, clientWidth: props.clientWidth, clientHeight: props.clientHeight, forPrint: props.forPrint })); }; return DayTable; }(common.DateComponent); var DayTableView = /** @class */ function (_super) { tslib.__extends(DayTableView, _super); function DayTableView() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.buildDayTableModel = common.memoize(buildDayTableModel); _this.headerRef = common.createRef(); _this.tableRef = common.createRef(); return _this; } DayTableView.prototype.render = function () { var _this = this; var _a = this.context, options = _a.options, dateProfileGenerator = _a.dateProfileGenerator; var props = this.props; var dayTableModel = this.buildDayTableModel(props.dateProfile, dateProfileGenerator); var headerContent = options.dayHeaders && common.createElement(common.DayHeader, { ref: this.headerRef, dateProfile: props.dateProfile, dates: dayTableModel.headerDates, datesRepDistinctDays: dayTableModel.rowCnt === 1 }); var bodyContent = function bodyContent(contentArg) { return common.createElement(DayTable, { ref: _this.tableRef, dateProfile: props.dateProfile, dayTableModel: dayTableModel, businessHours: props.businessHours, dateSelection: props.dateSelection, eventStore: props.eventStore, eventUiBases: props.eventUiBases, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, nextDayThreshold: options.nextDayThreshold, colGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, dayMaxEvents: options.dayMaxEvents, dayMaxEventRows: options.dayMaxEventRows, showWeekNumbers: options.weekNumbers, expandRows: !props.isHeightAuto, headerAlignElRef: _this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint }); }; return options.dayMinWidth ? this.renderHScrollLayout(headerContent, bodyContent, dayTableModel.colCnt, options.dayMinWidth) : this.renderSimpleLayout(headerContent, bodyContent); }; return DayTableView; }(TableView); function buildDayTableModel(dateProfile, dateProfileGenerator) { var daySeries = new common.DaySeriesModel(dateProfile.renderRange, dateProfileGenerator); return new common.DayTableModel(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit)); } var TableDateProfileGenerator = /** @class */ function (_super) { tslib.__extends(TableDateProfileGenerator, _super); function TableDateProfileGenerator() { return _super !== null && _super.apply(this, arguments) || this; } // Computes the date range that will be rendered. TableDateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) { var dateEnv = this.props.dateEnv; var renderRange = _super.prototype.buildRenderRange.call(this, currentRange, currentRangeUnit, isRangeAllDay); var start = renderRange.start; var end = renderRange.end; var endOfWeek; // year and month views should be aligned with weeks. this is already done for week if (/^(year|month)$/.test(currentRangeUnit)) { start = dateEnv.startOfWeek(start); // make end-of-week if not already endOfWeek = dateEnv.startOfWeek(end); if (endOfWeek.valueOf() !== end.valueOf()) { end = common.addWeeks(endOfWeek, 1); } } // ensure 6 weeks if (this.props.monthMode && this.props.fixedWeekCount) { var rowCnt = Math.ceil( // could be partial weeks due to hiddenDays common.diffWeeks(start, end)); end = common.addWeeks(end, 6 - rowCnt); } return { start: start, end: end }; }; return TableDateProfileGenerator; }(common.DateProfileGenerator); var main = common.createPlugin({ initialView: 'dayGridMonth', views: { dayGrid: { component: DayTableView, dateProfileGeneratorClass: TableDateProfileGenerator }, dayGridDay: { type: 'dayGrid', duration: { days: 1 } }, dayGridWeek: { type: 'dayGrid', duration: { weeks: 1 } }, dayGridMonth: { type: 'dayGrid', duration: { months: 1 }, monthMode: true, fixedWeekCount: true } } }); exports.DayGridView = DayTableView; exports.DayTable = DayTable; exports.DayTableSlicer = DayTableSlicer; exports.Table = Table; exports.TableView = TableView; exports.buildDayTableModel = buildDayTableModel; exports["default"] = main; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImNvbW1vbiIsInJlcXVpcmUiLCJ0c2xpYiIsIlRhYmxlVmlldyIsIl9zdXBlciIsIl9fZXh0ZW5kcyIsIl90aGlzIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJoZWFkZXJFbFJlZiIsImNyZWF0ZVJlZiIsInByb3RvdHlwZSIsInJlbmRlclNpbXBsZUxheW91dCIsImhlYWRlclJvd0NvbnRlbnQiLCJib2R5Q29udGVudCIsIl9hIiwicHJvcHMiLCJjb250ZXh0Iiwic2VjdGlvbnMiLCJzdGlja3lIZWFkZXJEYXRlcyIsImdldFN0aWNreUhlYWRlckRhdGVzIiwib3B0aW9ucyIsInB1c2giLCJ0eXBlIiwia2V5IiwiaXNTdGlja3kiLCJjaHVuayIsImVsUmVmIiwidGFibGVDbGFzc05hbWUiLCJyb3dDb250ZW50IiwibGlxdWlkIiwiY29udGVudCIsImNyZWF0ZUVsZW1lbnQiLCJWaWV3Um9vdCIsInZpZXdTcGVjIiwicm9vdEVsUmVmIiwiY2xhc3NOYW1lcyIsInJlZiIsImNsYXNzTmFtZSIsImNvbmNhdCIsImpvaW4iLCJTaW1wbGVTY3JvbGxHcmlkIiwiaXNIZWlnaHRBdXRvIiwiZm9yUHJpbnQiLCJjb2xsYXBzaWJsZVdpZHRoIiwiY29scyIsInJlbmRlckhTY3JvbGxMYXlvdXQiLCJjb2xDbnQiLCJkYXlNaW5XaWR0aCIsIlNjcm9sbEdyaWQiLCJwbHVnaW5Ib29rcyIsInNjcm9sbEdyaWRJbXBsIiwiRXJyb3IiLCJzdGlja3lGb290ZXJTY3JvbGxiYXIiLCJnZXRTdGlja3lGb290ZXJTY3JvbGxiYXIiLCJjaHVua3MiLCJyZW5kZXJTY3JvbGxTaGltIiwiY29sR3JvdXBzIiwic3BhbiIsIm1pbldpZHRoIiwiRGF0ZUNvbXBvbmVudCIsInNwbGl0U2Vnc0J5Um93Iiwic2VncyIsInJvd0NudCIsImJ5Um93IiwiaSIsIl9pIiwic2Vnc18xIiwibGVuZ3RoIiwic2VnIiwicm93Iiwic3BsaXRTZWdzQnlGaXJzdENvbCIsImJ5Q29sIiwic2Vnc18yIiwiZmlyc3RDb2wiLCJzcGxpdEludGVyYWN0aW9uQnlSb3ciLCJ1aSIsImFmZmVjdGVkSW5zdGFuY2VzIiwiaXNFdmVudCIsIlRhYmxlQ2VsbFRvcCIsInJlbmRlciIsIm5hdkxpbmtBdHRycyIsImJ1aWxkTmF2TGlua0F0dHJzIiwiZGF0ZSIsIkRheUNlbGxDb250ZW50IiwiZGF0ZVByb2ZpbGUiLCJ0b2RheVJhbmdlIiwic2hvd0RheU51bWJlciIsImV4dHJhSG9va1Byb3BzIiwiZGVmYXVsdENvbnRlbnQiLCJyZW5kZXJUb3BJbm5lciIsImlubmVyRWxSZWYiLCJpbm5lckNvbnRlbnQiLCJmb3JjZURheVRvcCIsIl9fYXNzaWduIiwiaWQiLCJkYXlOdW1iZXJJZCIsIkZyYWdtZW50IiwiQmFzZUNvbXBvbmVudCIsImRheU51bWJlclRleHQiLCJERUZBVUxUX1RBQkxFX0VWRU5UX1RJTUVfRk9STUFUIiwiY3JlYXRlRm9ybWF0dGVyIiwiaG91ciIsIm1pbnV0ZSIsIm9taXRaZXJvTWludXRlIiwibWVyaWRpZW0iLCJoYXNMaXN0SXRlbURpc3BsYXkiLCJkaXNwbGF5IiwiZXZlbnRSYW5nZSIsImRlZiIsImFsbERheSIsImxhc3RDb2wiLCJpc1N0YXJ0IiwiaXNFbmQiLCJUYWJsZUJsb2NrRXZlbnQiLCJTdGFuZGFyZEV2ZW50IiwiZXh0cmFDbGFzc05hbWVzIiwiZGVmYXVsdFRpbWVGb3JtYXQiLCJkZWZhdWx0RGlzcGxheUV2ZW50RW5kIiwiZGlzYWJsZVJlc2l6aW5nIiwiVGFibGVMaXN0SXRlbUV2ZW50IiwidGltZUZvcm1hdCIsImV2ZW50VGltZUZvcm1hdCIsInRpbWVUZXh0IiwiYnVpbGRTZWdUaW1lVGV4dCIsIkV2ZW50Um9vdCIsInJlbmRlcklubmVyQ29udGVudCIsImlzRHJhZ2dpbmciLCJpc1Jlc2l6aW5nIiwiaXNEYXRlU2VsZWN0aW5nIiwiaXNTZWxlY3RlZCIsImlzUGFzdCIsImlzRnV0dXJlIiwiaXNUb2RheSIsImdldFNlZ0FuY2hvckF0dHJzIiwiaW5uZXJQcm9wcyIsInN0eWxlIiwiYm9yZGVyQ29sb3IiLCJiYWNrZ3JvdW5kQ29sb3IiLCJldmVudCIsInRpdGxlIiwiVGFibGVDZWxsTW9yZUxpbmsiLCJjb21waWxlU2VncyIsIm1lbW9pemUiLCJzaW5nbGVQbGFjZW1lbnRzIiwiYWxsU2VncyIsImludmlzaWJsZVNlZ3MiLCJNb3JlTGlua1Jvb3QiLCJhbGxEYXlEYXRlIiwibW9yZUNudCIsImhpZGRlblNlZ3MiLCJhbGlnbm1lbnRFbFJlZiIsImFsaWduR3JpZFRvcCIsImV4dHJhRGF0ZVNwYW4iLCJwb3BvdmVyQ29udGVudCIsImlzRm9yY2VkSW52aXNpYmxlIiwiZXZlbnREcmFnIiwiZXZlbnRSZXNpemUiLCJtYXAiLCJpbnN0YW5jZUlkIiwiaW5zdGFuY2UiLCJ2aXNpYmlsaXR5IiwiZXZlbnRTZWxlY3Rpb24iLCJnZXRTZWdNZXRhIiwiaGFuZGxlQ2xpY2siLCJpc0V4cGFuZGVkIiwicG9wb3ZlcklkIiwiY3JlYXRlQXJpYUNsaWNrQXR0cnMiLCJzaW5nbGVQbGFjZW1lbnRzXzEiLCJwbGFjZW1lbnQiLCJpc1Zpc2libGUiLCJERUZBVUxUX1dFRUtfTlVNX0ZPUk1BVCIsIndlZWsiLCJUYWJsZUNlbGwiLCJzdGF0ZSIsImdldFVuaXF1ZURvbUlkIiwiaGFuZGxlUm9vdEVsIiwiZWwiLCJzZXRSZWYiLCJEYXlDZWxsUm9vdCIsImRheUVsUmVmIiwiZGF5Q2xhc3NOYW1lcyIsInJvb3REYXRhQXR0cnMiLCJpc0Rpc2FibGVkIiwicm9sZSIsImV4dHJhRGF0YUF0dHJzIiwic2hvd1dlZWtOdW1iZXIiLCJXZWVrTnVtYmVyUm9vdCIsImRlZmF1bHRGb3JtYXQiLCJ3ZWVrRWxSZWYiLCJ3ZWVrQ2xhc3NOYW1lcyIsImZnQ29udGVudEVsUmVmIiwiZmdDb250ZW50IiwibWFyZ2luVG9wIiwibW9yZU1hcmdpblRvcCIsImJnQ29udGVudCIsImNvbXB1dGVGZ1NlZ1BsYWNlbWVudCIsImRheU1heEV2ZW50cyIsImRheU1heEV2ZW50Um93cyIsInN0cmljdE9yZGVyIiwiZXZlbnRJbnN0YW5jZUhlaWdodHMiLCJtYXhDb250ZW50SGVpZ2h0IiwiY2VsbHMiLCJoaWVyYXJjaHkiLCJEYXlHcmlkU2VnSGllcmFyY2h5IiwiYWxsb3dSZXNsaWNpbmciLCJtYXhDb29yZCIsImhpZGRlbkNvbnN1bWVzIiwibWF4U3RhY2tDbnQiLCJzZWdJbnB1dHMiLCJ1bmtub3duSGVpZ2h0U2VncyIsImV2ZW50SGVpZ2h0IiwiaW5kZXgiLCJ0aGlja25lc3MiLCJzdGFydCIsImVuZCIsImhpZGRlbkVudHJpZXMiLCJhZGRTZWdzIiwic2VnUmVjdHMiLCJ0b1JlY3RzIiwicGxhY2VSZWN0cyIsInNpbmdsZUNvbFBsYWNlbWVudHMiLCJtdWx0aUNvbFBsYWNlbWVudHMiLCJsZWZ0b3Zlck1hcmdpbnMiLCJtb3JlQ250cyIsIm1vcmVNYXJnaW5Ub3BzIiwidW5rbm93bkhlaWdodFNlZ3NfMSIsImlzQWJzb2x1dGUiLCJhYnNvbHV0ZVRvcCIsImNvbCIsInJlc2xpY2VTZWciLCJfYiIsImhpZGRlbkVudHJpZXNfMSIsImhpZGRlbkVudHJ5IiwiaGlkZGVuU3BhbiIsImFsbFJlY3RzIiwicmVjdHNCeUVhY2hDb2wiLCJncm91cFJlY3RzQnlFYWNoQ29sIiwicmVjdHMiLCJjdXJyZW50SGVpZ2h0IiwiY3VycmVudE1hcmdpblRvcCIsInJlY3RzXzEiLCJyZWN0IiwibGV2ZWxDb29yZCIsIm11bHRpUGxhY2VtZW50cyIsInJlY3RzXzIiLCJpc0ZpcnN0Q29sIiwicmVjdHNfMyIsInNwYW5TdGFydCIsInNwYW5FbmQiLCJvcmlnUmFuZ2UiLCJyYW5nZSIsInNsaWNlZFJhbmdlIiwiaW50ZXJzZWN0UmFuZ2VzIiwiYWRkRGF5cyIsImR1cmF0aW9uRWRpdGFibGUiLCJ2YWx1ZU9mIiwiZm9yY2VIaWRkZW4iLCJjYWxsIiwiZW50cmllc0J5TGV2ZWwiLCJleGNsdWRlSGlkZGVuIiwiZW50cnkiLCJidWlsZEVudHJ5S2V5IiwibGV2ZWwiLCJmaWx0ZXIiLCJoYW5kbGVJbnZhbGlkSW5zZXJ0aW9uIiwiaW5zZXJ0aW9uIiwidG91Y2hpbmdFbnRyeSIsInRvdWNoaW5nTGV2ZWwiLCJ0b3VjaGluZ0xhdGVyYWwiLCJ0b3VjaGluZ0VudHJ5SWQiLCJwbGFjZWhvbGRlckVudHJ5IiwiaW50ZXJzZWN0U3BhbnMiLCJwbGFjZWhvbGRlckVudHJ5SWQiLCJzcGxpdEVudHJ5IiwiU2VnSGllcmFyY2h5IiwiVGFibGVSb3ciLCJjZWxsRWxSZWZzIiwiUmVmTWFwIiwiZnJhbWVFbFJlZnMiLCJmZ0VsUmVmcyIsInNlZ0hhcm5lc3NSZWZzIiwiZnJhbWVQb3NpdGlvbnMiLCJidXNpbmVzc0hvdXJzQnlDb2wiLCJidXNpbmVzc0hvdXJTZWdzIiwiYmdFdmVudFNlZ3NCeUNvbCIsImJnRXZlbnRTZWdzIiwiaGlnaGxpZ2h0U2Vnc0J5Q29sIiwiZ2V0SGlnaGxpZ2h0U2VncyIsIm1pcnJvclNlZ3NCeUNvbCIsImdldE1pcnJvclNlZ3MiLCJzb3J0RXZlbnRTZWdzIiwiZmdFdmVudFNlZ3MiLCJldmVudE9yZGVyIiwiZXZlbnRPcmRlclN0cmljdCIsInJlbmRlckludHJvIiwiY2VsbCIsIm5vcm1hbEZnTm9kZXMiLCJyZW5kZXJGZ1NlZ3MiLCJtaXJyb3JGZ05vZGVzIiwiYnVpbGRNaXJyb3JQbGFjZW1lbnRzIiwiQm9vbGVhbiIsInNob3dEYXlOdW1iZXJzIiwic2hvd1dlZWtOdW1iZXJzIiwicmVuZGVyRmlsbFNlZ3MiLCJjb21wb25lbnREaWRNb3VudCIsInVwZGF0ZVNpemluZyIsImNvbXBvbmVudERpZFVwZGF0ZSIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsImN1cnJlbnRQcm9wcyIsImlzUHJvcHNFcXVhbCIsImRhdGVTZWxlY3Rpb25TZWdzIiwic2VnUGxhY2VtZW50cyIsImlzTWlycm9yIiwibm9kZXMiLCJzZWdQbGFjZW1lbnRzXzEiLCJsZWZ0IiwicmlnaHQiLCJpc1J0bCIsImxlZnRzIiwicmlnaHRzIiwidG9wIiwiZmlsbFR5cGUiLCJsZWZ0UmlnaHRDc3MiLCJidWlsZEV2ZW50UmFuZ2VLZXkiLCJCZ0V2ZW50IiwicmVuZGVyRmlsbCIsIl9fc3ByZWFkQXJyYXkiLCJpc0V4dGVybmFsU2l6aW5nQ2hhbmdlIiwiY2xpZW50V2lkdGgiLCJmcmFtZUVscyIsImN1cnJlbnRNYXAiLCJvcmlnaW5FbCIsImN1cnJlbnQiLCJzZXRTdGF0ZSIsIlBvc2l0aW9uQ2FjaGUiLCJvbGRJbnN0YW5jZUhlaWdodHMiLCJuZXdJbnN0YW5jZUhlaWdodHMiLCJxdWVyeUV2ZW50SW5zdGFuY2VIZWlnaHRzIiwibGltaXRCeUNvbnRlbnRIZWlnaHQiLCJzYWZlU2V0U3RhdGUiLCJjb21wdXRlTWF4Q29udGVudEhlaWdodCIsInNlZ0VsTWFwIiwiaGVpZ2h0IiwiTWF0aCIsInJvdW5kIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwic3BsaXQiLCJtYXgiLCJmaXJzdEtleSIsImNlbGxFbCIsImZjQ29udGFpbmVyRWwiLCJib3R0b20iLCJnZXRDZWxsRWxzIiwiZWxNYXAiLCJhZGRTdGF0ZUVxdWFsaXR5IiwibWlycm9yU2VncyIsImNvbFBsYWNlbWVudHMiLCJ0b3BzQnlJbnN0YW5jZUlkIiwiYnVpbGRBYnNvbHV0ZVRvcEhhc2giLCJjb2xQbGFjZW1lbnRzXzEiLCJwbGFjZW1lbnRzIiwicGxhY2VtZW50c18xIiwiVGFibGUiLCJzcGxpdEJ1c2luZXNzSG91clNlZ3MiLCJzcGxpdEJnRXZlbnRTZWdzIiwic3BsaXRGZ0V2ZW50U2VncyIsInNwbGl0RGF0ZVNlbGVjdGlvblNlZ3MiLCJzcGxpdEV2ZW50RHJhZyIsInNwbGl0RXZlbnRSZXNpemUiLCJyb3dSZWZzIiwicm9vdEVsIiwicmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCIsImlzSGl0Q29tYm9BbGxvd2VkIiwidW5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50IiwiZXhwYW5kUm93cyIsImJ1c2luZXNzSG91clNlZ3NCeVJvdyIsImJnRXZlbnRTZWdzQnlSb3ciLCJmZ0V2ZW50U2Vnc0J5Um93IiwiZGF0ZVNlbGVjdGlvblNlZ3NCeVJvdyIsImV2ZW50RHJhZ0J5Um93IiwiZXZlbnRSZXNpemVCeVJvdyIsImxpbWl0VmlhQmFsYW5jZWQiLCJ3aWR0aCIsInRhYmxlTWluV2lkdGgiLCJOb3dUaW1lciIsInVuaXQiLCJub3dEYXRlIiwiY2xpZW50SGVpZ2h0IiwiY29sR3JvdXBOb2RlIiwidG9JU09TdHJpbmciLCJyZW5kZXJSb3dJbnRybyIsImlzU2VnQWxsRGF5IiwicHJlcGFyZUhpdHMiLCJyb3dQb3NpdGlvbnMiLCJjb2xsZWN0Iiwicm93T2JqIiwiY29sUG9zaXRpb25zIiwicXVlcnlIaXQiLCJwb3NpdGlvbkxlZnQiLCJwb3NpdGlvblRvcCIsImxlZnRUb0luZGV4IiwidG9wVG9JbmRleCIsImRhdGVTcGFuIiwiZ2V0Q2VsbFJhbmdlIiwiZGF5RWwiLCJnZXRDZWxsRWwiLCJ0b3BzIiwiYm90dG9tcyIsImxheWVyIiwiRGF5VGFibGVTbGljZXIiLCJmb3JjZURheUlmTGlzdEl0ZW0iLCJzbGljZVJhbmdlIiwiZGF0ZVJhbmdlIiwiZGF5VGFibGVNb2RlbCIsIlNsaWNlciIsIkRheVRhYmxlIiwic2xpY2VyIiwidGFibGVSZWYiLCJzbGljZVByb3BzIiwibmV4dERheVRocmVzaG9sZCIsImhlYWRlckFsaWduRWxSZWYiLCJEYXlUYWJsZVZpZXciLCJidWlsZERheVRhYmxlTW9kZWwiLCJoZWFkZXJSZWYiLCJkYXRlUHJvZmlsZUdlbmVyYXRvciIsImhlYWRlckNvbnRlbnQiLCJkYXlIZWFkZXJzIiwiRGF5SGVhZGVyIiwiZGF0ZXMiLCJoZWFkZXJEYXRlcyIsImRhdGVzUmVwRGlzdGluY3REYXlzIiwiY29udGVudEFyZyIsImJ1c2luZXNzSG91cnMiLCJkYXRlU2VsZWN0aW9uIiwiZXZlbnRTdG9yZSIsImV2ZW50VWlCYXNlcyIsInRhYmxlQ29sR3JvdXBOb2RlIiwid2Vla051bWJlcnMiLCJkYXlTZXJpZXMiLCJEYXlTZXJpZXNNb2RlbCIsInJlbmRlclJhbmdlIiwiRGF5VGFibGVNb2RlbCIsInRlc3QiLCJjdXJyZW50UmFuZ2VVbml0IiwiVGFibGVEYXRlUHJvZmlsZUdlbmVyYXRvciIsImJ1aWxkUmVuZGVyUmFuZ2UiLCJjdXJyZW50UmFuZ2UiLCJpc1JhbmdlQWxsRGF5IiwiZGF0ZUVudiIsImVuZE9mV2VlayIsInN0YXJ0T2ZXZWVrIiwiYWRkV2Vla3MiLCJtb250aE1vZGUiLCJmaXhlZFdlZWtDb3VudCIsImNlaWwiLCJkaWZmV2Vla3MiLCJEYXRlUHJvZmlsZUdlbmVyYXRvciIsIm1haW4iLCJjcmVhdGVQbHVnaW4iLCJpbml0aWFsVmlldyIsInZpZXdzIiwiZGF5R3JpZCIsImNvbXBvbmVudCIsImRhdGVQcm9maWxlR2VuZXJhdG9yQ2xhc3MiLCJkYXlHcmlkRGF5IiwiZHVyYXRpb24iLCJkYXlzIiwiZGF5R3JpZFdlZWsiLCJ3ZWVrcyIsImRheUdyaWRNb250aCIsIm1vbnRocyIsIkRheUdyaWRWaWV3Il0sInNvdXJjZXMiOlsibWFpbi5janMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG5GdWxsQ2FsZW5kYXIgdjUuMTEuMlxuRG9jcyAmIExpY2Vuc2U6IGh0dHBzOi8vZnVsbGNhbGVuZGFyLmlvL1xuKGMpIDIwMjIgQWRhbSBTaGF3XG4qL1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgY29tbW9uID0gcmVxdWlyZSgnQGZ1bGxjYWxlbmRhci9jb21tb24nKTtcbnZhciB0c2xpYiA9IHJlcXVpcmUoJ3RzbGliJyk7XG47XG5cbi8qIEFuIGFic3RyYWN0IGNsYXNzIGZvciB0aGUgZGF5Z3JpZCB2aWV3cywgYXMgd2VsbCBhcyBtb250aCB2aWV3LiBSZW5kZXJzIG9uZSBvciBtb3JlIHJvd3Mgb2YgZGF5IGNlbGxzLlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vLyBJdCBpcyBhIG1hbmFnZXIgZm9yIGEgVGFibGUgc3ViY29tcG9uZW50LCB3aGljaCBkb2VzIG1vc3Qgb2YgdGhlIGhlYXZ5IGxpZnRpbmcuXG4vLyBJdCBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgd2lkdGgvaGVpZ2h0LlxudmFyIFRhYmxlVmlldyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVGFibGVWaWV3LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRhYmxlVmlldygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmhlYWRlckVsUmVmID0gY29tbW9uLmNyZWF0ZVJlZigpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFRhYmxlVmlldy5wcm90b3R5cGUucmVuZGVyU2ltcGxlTGF5b3V0ID0gZnVuY3Rpb24gKGhlYWRlclJvd0NvbnRlbnQsIGJvZHlDb250ZW50KSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgc2VjdGlvbnMgPSBbXTtcbiAgICAgICAgdmFyIHN0aWNreUhlYWRlckRhdGVzID0gY29tbW9uLmdldFN0aWNreUhlYWRlckRhdGVzKGNvbnRleHQub3B0aW9ucyk7XG4gICAgICAgIGlmIChoZWFkZXJSb3dDb250ZW50KSB7XG4gICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnaGVhZGVyJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdoZWFkZXInLFxuICAgICAgICAgICAgICAgIGlzU3RpY2t5OiBzdGlja3lIZWFkZXJEYXRlcyxcbiAgICAgICAgICAgICAgICBjaHVuazoge1xuICAgICAgICAgICAgICAgICAgICBlbFJlZjogdGhpcy5oZWFkZXJFbFJlZixcbiAgICAgICAgICAgICAgICAgICAgdGFibGVDbGFzc05hbWU6ICdmYy1jb2wtaGVhZGVyJyxcbiAgICAgICAgICAgICAgICAgICAgcm93Q29udGVudDogaGVhZGVyUm93Q29udGVudCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnYm9keScsXG4gICAgICAgICAgICBrZXk6ICdib2R5JyxcbiAgICAgICAgICAgIGxpcXVpZDogdHJ1ZSxcbiAgICAgICAgICAgIGNodW5rOiB7IGNvbnRlbnQ6IGJvZHlDb250ZW50IH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5WaWV3Um9vdCwgeyB2aWV3U3BlYzogY29udGV4dC52aWV3U3BlYyB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyByZWY6IHJvb3RFbFJlZiwgY2xhc3NOYW1lOiBbJ2ZjLWRheWdyaWQnXS5jb25jYXQoY2xhc3NOYW1lcykuam9pbignICcpIH0sXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uU2ltcGxlU2Nyb2xsR3JpZCwgeyBsaXF1aWQ6ICFwcm9wcy5pc0hlaWdodEF1dG8gJiYgIXByb3BzLmZvclByaW50LCBjb2xsYXBzaWJsZVdpZHRoOiBwcm9wcy5mb3JQcmludCwgY29sczogW10gLyogVE9ETzogbWFrZSBvcHRpb25hbD8gKi8sIHNlY3Rpb25zOiBzZWN0aW9ucyB9KSkpOyB9KSk7XG4gICAgfTtcbiAgICBUYWJsZVZpZXcucHJvdG90eXBlLnJlbmRlckhTY3JvbGxMYXlvdXQgPSBmdW5jdGlvbiAoaGVhZGVyUm93Q29udGVudCwgYm9keUNvbnRlbnQsIGNvbENudCwgZGF5TWluV2lkdGgpIHtcbiAgICAgICAgdmFyIFNjcm9sbEdyaWQgPSB0aGlzLmNvbnRleHQucGx1Z2luSG9va3Muc2Nyb2xsR3JpZEltcGw7XG4gICAgICAgIGlmICghU2Nyb2xsR3JpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBTY3JvbGxHcmlkIGltcGxlbWVudGF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9hID0gdGhpcywgcHJvcHMgPSBfYS5wcm9wcywgY29udGV4dCA9IF9hLmNvbnRleHQ7XG4gICAgICAgIHZhciBzdGlja3lIZWFkZXJEYXRlcyA9ICFwcm9wcy5mb3JQcmludCAmJiBjb21tb24uZ2V0U3RpY2t5SGVhZGVyRGF0ZXMoY29udGV4dC5vcHRpb25zKTtcbiAgICAgICAgdmFyIHN0aWNreUZvb3RlclNjcm9sbGJhciA9ICFwcm9wcy5mb3JQcmludCAmJiBjb21tb24uZ2V0U3RpY2t5Rm9vdGVyU2Nyb2xsYmFyKGNvbnRleHQub3B0aW9ucyk7XG4gICAgICAgIHZhciBzZWN0aW9ucyA9IFtdO1xuICAgICAgICBpZiAoaGVhZGVyUm93Q29udGVudCkge1xuICAgICAgICAgICAgc2VjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2hlYWRlcicsXG4gICAgICAgICAgICAgICAga2V5OiAnaGVhZGVyJyxcbiAgICAgICAgICAgICAgICBpc1N0aWNreTogc3RpY2t5SGVhZGVyRGF0ZXMsXG4gICAgICAgICAgICAgICAgY2h1bmtzOiBbe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbFJlZjogdGhpcy5oZWFkZXJFbFJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ2xhc3NOYW1lOiAnZmMtY29sLWhlYWRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dDb250ZW50OiBoZWFkZXJSb3dDb250ZW50LFxuICAgICAgICAgICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ2JvZHknLFxuICAgICAgICAgICAga2V5OiAnYm9keScsXG4gICAgICAgICAgICBsaXF1aWQ6IHRydWUsXG4gICAgICAgICAgICBjaHVua3M6IFt7XG4gICAgICAgICAgICAgICAgICAgIGtleTogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBib2R5Q29udGVudCxcbiAgICAgICAgICAgICAgICB9XSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzdGlja3lGb290ZXJTY3JvbGxiYXIpIHtcbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdmb290ZXInLFxuICAgICAgICAgICAgICAgIGtleTogJ2Zvb3RlcicsXG4gICAgICAgICAgICAgICAgaXNTdGlja3k6IHRydWUsXG4gICAgICAgICAgICAgICAgY2h1bmtzOiBbe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBjb21tb24ucmVuZGVyU2Nyb2xsU2hpbSxcbiAgICAgICAgICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5WaWV3Um9vdCwgeyB2aWV3U3BlYzogY29udGV4dC52aWV3U3BlYyB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyByZWY6IHJvb3RFbFJlZiwgY2xhc3NOYW1lOiBbJ2ZjLWRheWdyaWQnXS5jb25jYXQoY2xhc3NOYW1lcykuam9pbignICcpIH0sXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChTY3JvbGxHcmlkLCB7IGxpcXVpZDogIXByb3BzLmlzSGVpZ2h0QXV0byAmJiAhcHJvcHMuZm9yUHJpbnQsIGNvbGxhcHNpYmxlV2lkdGg6IHByb3BzLmZvclByaW50LCBjb2xHcm91cHM6IFt7IGNvbHM6IFt7IHNwYW46IGNvbENudCwgbWluV2lkdGg6IGRheU1pbldpZHRoIH1dIH1dLCBzZWN0aW9uczogc2VjdGlvbnMgfSkpKTsgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFRhYmxlVmlldztcbn0oY29tbW9uLkRhdGVDb21wb25lbnQpKTtcblxuZnVuY3Rpb24gc3BsaXRTZWdzQnlSb3coc2Vncywgcm93Q250KSB7XG4gICAgdmFyIGJ5Um93ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dDbnQ7IGkgKz0gMSkge1xuICAgICAgICBieVJvd1tpXSA9IFtdO1xuICAgIH1cbiAgICBmb3IgKHZhciBfaSA9IDAsIHNlZ3NfMSA9IHNlZ3M7IF9pIDwgc2Vnc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgc2VnID0gc2Vnc18xW19pXTtcbiAgICAgICAgYnlSb3dbc2VnLnJvd10ucHVzaChzZWcpO1xuICAgIH1cbiAgICByZXR1cm4gYnlSb3c7XG59XG5mdW5jdGlvbiBzcGxpdFNlZ3NCeUZpcnN0Q29sKHNlZ3MsIGNvbENudCkge1xuICAgIHZhciBieUNvbCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sQ250OyBpICs9IDEpIHtcbiAgICAgICAgYnlDb2xbaV0gPSBbXTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2kgPSAwLCBzZWdzXzIgPSBzZWdzOyBfaSA8IHNlZ3NfMi5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHNlZyA9IHNlZ3NfMltfaV07XG4gICAgICAgIGJ5Q29sW3NlZy5maXJzdENvbF0ucHVzaChzZWcpO1xuICAgIH1cbiAgICByZXR1cm4gYnlDb2w7XG59XG5mdW5jdGlvbiBzcGxpdEludGVyYWN0aW9uQnlSb3codWksIHJvd0NudCkge1xuICAgIHZhciBieVJvdyA9IFtdO1xuICAgIGlmICghdWkpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dDbnQ7IGkgKz0gMSkge1xuICAgICAgICAgICAgYnlSb3dbaV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd0NudDsgaSArPSAxKSB7XG4gICAgICAgICAgICBieVJvd1tpXSA9IHtcbiAgICAgICAgICAgICAgICBhZmZlY3RlZEluc3RhbmNlczogdWkuYWZmZWN0ZWRJbnN0YW5jZXMsXG4gICAgICAgICAgICAgICAgaXNFdmVudDogdWkuaXNFdmVudCxcbiAgICAgICAgICAgICAgICBzZWdzOiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHVpLnNlZ3M7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgc2VnID0gX2FbX2ldO1xuICAgICAgICAgICAgYnlSb3dbc2VnLnJvd10uc2Vncy5wdXNoKHNlZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ5Um93O1xufVxuXG52YXIgVGFibGVDZWxsVG9wID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhUYWJsZUNlbGxUb3AsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGFibGVDZWxsVG9wKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFRhYmxlQ2VsbFRvcC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgbmF2TGlua0F0dHJzID0gY29tbW9uLmJ1aWxkTmF2TGlua0F0dHJzKHRoaXMuY29udGV4dCwgcHJvcHMuZGF0ZSk7XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkRheUNlbGxDb250ZW50LCB7IGRhdGU6IHByb3BzLmRhdGUsIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSwgc2hvd0RheU51bWJlcjogcHJvcHMuc2hvd0RheU51bWJlciwgZXh0cmFIb29rUHJvcHM6IHByb3BzLmV4dHJhSG9va1Byb3BzLCBkZWZhdWx0Q29udGVudDogcmVuZGVyVG9wSW5uZXIgfSwgZnVuY3Rpb24gKGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKChpbm5lckNvbnRlbnQgfHwgcHJvcHMuZm9yY2VEYXlUb3ApICYmIChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWRheS10b3BcIiwgcmVmOiBpbm5lckVsUmVmIH0sXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImFcIiwgdHNsaWIuX19hc3NpZ24oeyBpZDogcHJvcHMuZGF5TnVtYmVySWQsIGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWRheS1udW1iZXJcIiB9LCBuYXZMaW5rQXR0cnMpLCBpbm5lckNvbnRlbnQgfHwgY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkZyYWdtZW50LCBudWxsLCBcIlxcdTAwQTBcIikpKSkpOyB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gVGFibGVDZWxsVG9wO1xufShjb21tb24uQmFzZUNvbXBvbmVudCkpO1xuZnVuY3Rpb24gcmVuZGVyVG9wSW5uZXIocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMuZGF5TnVtYmVyVGV4dDtcbn1cblxudmFyIERFRkFVTFRfVEFCTEVfRVZFTlRfVElNRV9GT1JNQVQgPSBjb21tb24uY3JlYXRlRm9ybWF0dGVyKHtcbiAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgb21pdFplcm9NaW51dGU6IHRydWUsXG4gICAgbWVyaWRpZW06ICduYXJyb3cnLFxufSk7XG5mdW5jdGlvbiBoYXNMaXN0SXRlbURpc3BsYXkoc2VnKSB7XG4gICAgdmFyIGRpc3BsYXkgPSBzZWcuZXZlbnRSYW5nZS51aS5kaXNwbGF5O1xuICAgIHJldHVybiBkaXNwbGF5ID09PSAnbGlzdC1pdGVtJyB8fCAoZGlzcGxheSA9PT0gJ2F1dG8nICYmXG4gICAgICAgICFzZWcuZXZlbnRSYW5nZS5kZWYuYWxsRGF5ICYmXG4gICAgICAgIHNlZy5maXJzdENvbCA9PT0gc2VnLmxhc3RDb2wgJiYgLy8gY2FuJ3QgYmUgbXVsdGktZGF5XG4gICAgICAgIHNlZy5pc1N0YXJ0ICYmIC8vIFwiXG4gICAgICAgIHNlZy5pc0VuZCAvLyBcIlxuICAgICk7XG59XG5cbnZhciBUYWJsZUJsb2NrRXZlbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFRhYmxlQmxvY2tFdmVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUYWJsZUJsb2NrRXZlbnQoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgVGFibGVCbG9ja0V2ZW50LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLlN0YW5kYXJkRXZlbnQsIHRzbGliLl9fYXNzaWduKHt9LCBwcm9wcywgeyBleHRyYUNsYXNzTmFtZXM6IFsnZmMtZGF5Z3JpZC1ldmVudCcsICdmYy1kYXlncmlkLWJsb2NrLWV2ZW50JywgJ2ZjLWgtZXZlbnQnXSwgZGVmYXVsdFRpbWVGb3JtYXQ6IERFRkFVTFRfVEFCTEVfRVZFTlRfVElNRV9GT1JNQVQsIGRlZmF1bHREaXNwbGF5RXZlbnRFbmQ6IHByb3BzLmRlZmF1bHREaXNwbGF5RXZlbnRFbmQsIGRpc2FibGVSZXNpemluZzogIXByb3BzLnNlZy5ldmVudFJhbmdlLmRlZi5hbGxEYXkgfSkpKTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZUJsb2NrRXZlbnQ7XG59KGNvbW1vbi5CYXNlQ29tcG9uZW50KSk7XG5cbnZhciBUYWJsZUxpc3RJdGVtRXZlbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFRhYmxlTGlzdEl0ZW1FdmVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUYWJsZUxpc3RJdGVtRXZlbnQoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgVGFibGVMaXN0SXRlbUV2ZW50LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgdGltZUZvcm1hdCA9IGNvbnRleHQub3B0aW9ucy5ldmVudFRpbWVGb3JtYXQgfHwgREVGQVVMVF9UQUJMRV9FVkVOVF9USU1FX0ZPUk1BVDtcbiAgICAgICAgdmFyIHRpbWVUZXh0ID0gY29tbW9uLmJ1aWxkU2VnVGltZVRleHQocHJvcHMuc2VnLCB0aW1lRm9ybWF0LCBjb250ZXh0LCB0cnVlLCBwcm9wcy5kZWZhdWx0RGlzcGxheUV2ZW50RW5kKTtcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uRXZlbnRSb290LCB7IHNlZzogcHJvcHMuc2VnLCB0aW1lVGV4dDogdGltZVRleHQsIGRlZmF1bHRDb250ZW50OiByZW5kZXJJbm5lckNvbnRlbnQsIGlzRHJhZ2dpbmc6IHByb3BzLmlzRHJhZ2dpbmcsIGlzUmVzaXppbmc6IGZhbHNlLCBpc0RhdGVTZWxlY3Rpbmc6IGZhbHNlLCBpc1NlbGVjdGVkOiBwcm9wcy5pc1NlbGVjdGVkLCBpc1Bhc3Q6IHByb3BzLmlzUGFzdCwgaXNGdXR1cmU6IHByb3BzLmlzRnV0dXJlLCBpc1RvZGF5OiBwcm9wcy5pc1RvZGF5IH0sIGZ1bmN0aW9uIChyb290RWxSZWYsIGNsYXNzTmFtZXMsIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKCAvLyB3ZSBkb24ndCB1c2Ugc3R5bGVzIVxuICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImFcIiwgdHNsaWIuX19hc3NpZ24oeyBjbGFzc05hbWU6IFsnZmMtZGF5Z3JpZC1ldmVudCcsICdmYy1kYXlncmlkLWRvdC1ldmVudCddLmNvbmNhdChjbGFzc05hbWVzKS5qb2luKCcgJyksIHJlZjogcm9vdEVsUmVmIH0sIGNvbW1vbi5nZXRTZWdBbmNob3JBdHRycyhwcm9wcy5zZWcsIGNvbnRleHQpKSwgaW5uZXJDb250ZW50KSk7IH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZUxpc3RJdGVtRXZlbnQ7XG59KGNvbW1vbi5CYXNlQ29tcG9uZW50KSk7XG5mdW5jdGlvbiByZW5kZXJJbm5lckNvbnRlbnQoaW5uZXJQcm9wcykge1xuICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkZyYWdtZW50LCBudWxsLFxuICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWV2ZW50LWRvdFwiLCBzdHlsZTogeyBib3JkZXJDb2xvcjogaW5uZXJQcm9wcy5ib3JkZXJDb2xvciB8fCBpbm5lclByb3BzLmJhY2tncm91bmRDb2xvciB9IH0pLFxuICAgICAgICBpbm5lclByb3BzLnRpbWVUZXh0ICYmIChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1ldmVudC10aW1lXCIgfSwgaW5uZXJQcm9wcy50aW1lVGV4dCkpLFxuICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1ldmVudC10aXRsZVwiIH0sIGlubmVyUHJvcHMuZXZlbnQudGl0bGUgfHwgY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkZyYWdtZW50LCBudWxsLCBcIlxcdTAwQTBcIikpKSk7XG59XG5cbnZhciBUYWJsZUNlbGxNb3JlTGluayA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVGFibGVDZWxsTW9yZUxpbmssIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGFibGVDZWxsTW9yZUxpbmsoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jb21waWxlU2VncyA9IGNvbW1vbi5tZW1vaXplKGNvbXBpbGVTZWdzKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBUYWJsZUNlbGxNb3JlTGluay5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmNvbXBpbGVTZWdzKHByb3BzLnNpbmdsZVBsYWNlbWVudHMpLCBhbGxTZWdzID0gX2EuYWxsU2VncywgaW52aXNpYmxlU2VncyA9IF9hLmludmlzaWJsZVNlZ3M7XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLk1vcmVMaW5rUm9vdCwgeyBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsIHRvZGF5UmFuZ2U6IHByb3BzLnRvZGF5UmFuZ2UsIGFsbERheURhdGU6IHByb3BzLmFsbERheURhdGUsIG1vcmVDbnQ6IHByb3BzLm1vcmVDbnQsIGFsbFNlZ3M6IGFsbFNlZ3MsIGhpZGRlblNlZ3M6IGludmlzaWJsZVNlZ3MsIGFsaWdubWVudEVsUmVmOiBwcm9wcy5hbGlnbm1lbnRFbFJlZiwgYWxpZ25HcmlkVG9wOiBwcm9wcy5hbGlnbkdyaWRUb3AsIGV4dHJhRGF0ZVNwYW46IHByb3BzLmV4dHJhRGF0ZVNwYW4sIHBvcG92ZXJDb250ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzRm9yY2VkSW52aXNpYmxlID0gKHByb3BzLmV2ZW50RHJhZyA/IHByb3BzLmV2ZW50RHJhZy5hZmZlY3RlZEluc3RhbmNlcyA6IG51bGwpIHx8XG4gICAgICAgICAgICAgICAgICAgIChwcm9wcy5ldmVudFJlc2l6ZSA/IHByb3BzLmV2ZW50UmVzaXplLmFmZmVjdGVkSW5zdGFuY2VzIDogbnVsbCkgfHxcbiAgICAgICAgICAgICAgICAgICAge307XG4gICAgICAgICAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uRnJhZ21lbnQsIG51bGwsIGFsbFNlZ3MubWFwKGZ1bmN0aW9uIChzZWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluc3RhbmNlSWQgPSBzZWcuZXZlbnRSYW5nZS5pbnN0YW5jZS5pbnN0YW5jZUlkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWRheWdyaWQtZXZlbnQtaGFybmVzc1wiLCBrZXk6IGluc3RhbmNlSWQsIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogaXNGb3JjZWRJbnZpc2libGVbaW5zdGFuY2VJZF0gPyAnaGlkZGVuJyA6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSB9LCBoYXNMaXN0SXRlbURpc3BsYXkoc2VnKSA/IChjb21tb24uY3JlYXRlRWxlbWVudChUYWJsZUxpc3RJdGVtRXZlbnQsIHRzbGliLl9fYXNzaWduKHsgc2VnOiBzZWcsIGlzRHJhZ2dpbmc6IGZhbHNlLCBpc1NlbGVjdGVkOiBpbnN0YW5jZUlkID09PSBwcm9wcy5ldmVudFNlbGVjdGlvbiwgZGVmYXVsdERpc3BsYXlFdmVudEVuZDogZmFsc2UgfSwgY29tbW9uLmdldFNlZ01ldGEoc2VnLCBwcm9wcy50b2RheVJhbmdlKSkpKSA6IChjb21tb24uY3JlYXRlRWxlbWVudChUYWJsZUJsb2NrRXZlbnQsIHRzbGliLl9fYXNzaWduKHsgc2VnOiBzZWcsIGlzRHJhZ2dpbmc6IGZhbHNlLCBpc1Jlc2l6aW5nOiBmYWxzZSwgaXNEYXRlU2VsZWN0aW5nOiBmYWxzZSwgaXNTZWxlY3RlZDogaW5zdGFuY2VJZCA9PT0gcHJvcHMuZXZlbnRTZWxlY3Rpb24sIGRlZmF1bHREaXNwbGF5RXZlbnRFbmQ6IGZhbHNlIH0sIGNvbW1vbi5nZXRTZWdNZXRhKHNlZywgcHJvcHMudG9kYXlSYW5nZSkpKSkpKTtcbiAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICAgICAgfSB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQsIGhhbmRsZUNsaWNrLCB0aXRsZSwgaXNFeHBhbmRlZCwgcG9wb3ZlcklkKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHRzbGliLl9fYXNzaWduKHsgcmVmOiByb290RWxSZWYsIGNsYXNzTmFtZTogWydmYy1kYXlncmlkLW1vcmUtbGluayddLmNvbmNhdChjbGFzc05hbWVzKS5qb2luKCcgJyksIHRpdGxlOiB0aXRsZSwgXCJhcmlhLWV4cGFuZGVkXCI6IGlzRXhwYW5kZWQsIFwiYXJpYS1jb250cm9sc1wiOiBwb3BvdmVySWQgfSwgY29tbW9uLmNyZWF0ZUFyaWFDbGlja0F0dHJzKGhhbmRsZUNsaWNrKSksIGlubmVyQ29udGVudCkpOyB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gVGFibGVDZWxsTW9yZUxpbms7XG59KGNvbW1vbi5CYXNlQ29tcG9uZW50KSk7XG5mdW5jdGlvbiBjb21waWxlU2VncyhzaW5nbGVQbGFjZW1lbnRzKSB7XG4gICAgdmFyIGFsbFNlZ3MgPSBbXTtcbiAgICB2YXIgaW52aXNpYmxlU2VncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMCwgc2luZ2xlUGxhY2VtZW50c18xID0gc2luZ2xlUGxhY2VtZW50czsgX2kgPCBzaW5nbGVQbGFjZW1lbnRzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBwbGFjZW1lbnQgPSBzaW5nbGVQbGFjZW1lbnRzXzFbX2ldO1xuICAgICAgICBhbGxTZWdzLnB1c2gocGxhY2VtZW50LnNlZyk7XG4gICAgICAgIGlmICghcGxhY2VtZW50LmlzVmlzaWJsZSkge1xuICAgICAgICAgICAgaW52aXNpYmxlU2Vncy5wdXNoKHBsYWNlbWVudC5zZWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGFsbFNlZ3M6IGFsbFNlZ3MsIGludmlzaWJsZVNlZ3M6IGludmlzaWJsZVNlZ3MgfTtcbn1cblxudmFyIERFRkFVTFRfV0VFS19OVU1fRk9STUFUID0gY29tbW9uLmNyZWF0ZUZvcm1hdHRlcih7IHdlZWs6ICduYXJyb3cnIH0pO1xudmFyIFRhYmxlQ2VsbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVGFibGVDZWxsLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRhYmxlQ2VsbCgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnJvb3RFbFJlZiA9IGNvbW1vbi5jcmVhdGVSZWYoKTtcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBkYXlOdW1iZXJJZDogY29tbW9uLmdldFVuaXF1ZURvbUlkKCksXG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmhhbmRsZVJvb3RFbCA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgY29tbW9uLnNldFJlZihfdGhpcy5yb290RWxSZWYsIGVsKTtcbiAgICAgICAgICAgIGNvbW1vbi5zZXRSZWYoX3RoaXMucHJvcHMuZWxSZWYsIGVsKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBUYWJsZUNlbGwucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgY29udGV4dCA9IF9hLmNvbnRleHQsIHByb3BzID0gX2EucHJvcHMsIHN0YXRlID0gX2Euc3RhdGUsIHJvb3RFbFJlZiA9IF9hLnJvb3RFbFJlZjtcbiAgICAgICAgdmFyIGRhdGUgPSBwcm9wcy5kYXRlLCBkYXRlUHJvZmlsZSA9IHByb3BzLmRhdGVQcm9maWxlO1xuICAgICAgICB2YXIgbmF2TGlua0F0dHJzID0gY29tbW9uLmJ1aWxkTmF2TGlua0F0dHJzKGNvbnRleHQsIGRhdGUsICd3ZWVrJyk7XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkRheUNlbGxSb290LCB7IGRhdGU6IGRhdGUsIGRhdGVQcm9maWxlOiBkYXRlUHJvZmlsZSwgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSwgc2hvd0RheU51bWJlcjogcHJvcHMuc2hvd0RheU51bWJlciwgZXh0cmFIb29rUHJvcHM6IHByb3BzLmV4dHJhSG9va1Byb3BzLCBlbFJlZjogdGhpcy5oYW5kbGVSb290RWwgfSwgZnVuY3Rpb24gKGRheUVsUmVmLCBkYXlDbGFzc05hbWVzLCByb290RGF0YUF0dHJzLCBpc0Rpc2FibGVkKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCB0c2xpYi5fX2Fzc2lnbih7IHJlZjogZGF5RWxSZWYsIHJvbGU6IFwiZ3JpZGNlbGxcIiwgY2xhc3NOYW1lOiBbJ2ZjLWRheWdyaWQtZGF5J10uY29uY2F0KGRheUNsYXNzTmFtZXMsIHByb3BzLmV4dHJhQ2xhc3NOYW1lcyB8fCBbXSkuam9pbignICcpIH0sIHJvb3REYXRhQXR0cnMsIHByb3BzLmV4dHJhRGF0YUF0dHJzLCAocHJvcHMuc2hvd0RheU51bWJlciA/IHsgJ2FyaWEtbGFiZWxsZWRieSc6IHN0YXRlLmRheU51bWJlcklkIH0gOiB7fSkpLFxuICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZGF5Z3JpZC1kYXktZnJhbWUgZmMtc2Nyb2xsZ3JpZC1zeW5jLWlubmVyXCIsIHJlZjogcHJvcHMuaW5uZXJFbFJlZiAvKiBkaWZmZXJlbnQgZnJvbSBob29rIHN5c3RlbSEgUkVOQU1FICovIH0sXG4gICAgICAgICAgICAgICAgcHJvcHMuc2hvd1dlZWtOdW1iZXIgJiYgKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5XZWVrTnVtYmVyUm9vdCwgeyBkYXRlOiBkYXRlLCBkZWZhdWx0Rm9ybWF0OiBERUZBVUxUX1dFRUtfTlVNX0ZPUk1BVCB9LCBmdW5jdGlvbiAod2Vla0VsUmVmLCB3ZWVrQ2xhc3NOYW1lcywgaW5uZXJFbFJlZiwgaW5uZXJDb250ZW50KSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHRzbGliLl9fYXNzaWduKHsgcmVmOiB3ZWVrRWxSZWYsIGNsYXNzTmFtZTogWydmYy1kYXlncmlkLXdlZWstbnVtYmVyJ10uY29uY2F0KHdlZWtDbGFzc05hbWVzKS5qb2luKCcgJykgfSwgbmF2TGlua0F0dHJzKSwgaW5uZXJDb250ZW50KSk7IH0pKSxcbiAgICAgICAgICAgICAgICAhaXNEaXNhYmxlZCAmJiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoVGFibGVDZWxsVG9wLCB7IGRhdGU6IGRhdGUsIGRhdGVQcm9maWxlOiBkYXRlUHJvZmlsZSwgc2hvd0RheU51bWJlcjogcHJvcHMuc2hvd0RheU51bWJlciwgZGF5TnVtYmVySWQ6IHN0YXRlLmRheU51bWJlcklkLCBmb3JjZURheVRvcDogcHJvcHMuZm9yY2VEYXlUb3AsIHRvZGF5UmFuZ2U6IHByb3BzLnRvZGF5UmFuZ2UsIGV4dHJhSG9va1Byb3BzOiBwcm9wcy5leHRyYUhvb2tQcm9wcyB9KSksXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZGF5Z3JpZC1kYXktZXZlbnRzXCIsIHJlZjogcHJvcHMuZmdDb250ZW50RWxSZWYgfSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuZmdDb250ZW50LFxuICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWRheS1ib3R0b21cIiwgc3R5bGU6IHsgbWFyZ2luVG9wOiBwcm9wcy5tb3JlTWFyZ2luVG9wIH0gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFRhYmxlQ2VsbE1vcmVMaW5rLCB7IGFsbERheURhdGU6IGRhdGUsIHNpbmdsZVBsYWNlbWVudHM6IHByb3BzLnNpbmdsZVBsYWNlbWVudHMsIG1vcmVDbnQ6IHByb3BzLm1vcmVDbnQsIGFsaWdubWVudEVsUmVmOiByb290RWxSZWYsIGFsaWduR3JpZFRvcDogIXByb3BzLnNob3dEYXlOdW1iZXIsIGV4dHJhRGF0ZVNwYW46IHByb3BzLmV4dHJhRGF0ZVNwYW4sIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgZXZlbnRTZWxlY3Rpb246IHByb3BzLmV2ZW50U2VsZWN0aW9uLCBldmVudERyYWc6IHByb3BzLmV2ZW50RHJhZywgZXZlbnRSZXNpemU6IHByb3BzLmV2ZW50UmVzaXplLCB0b2RheVJhbmdlOiBwcm9wcy50b2RheVJhbmdlIH0pKSksXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZGF5Z3JpZC1kYXktYmdcIiB9LCBwcm9wcy5iZ0NvbnRlbnQpKSkpOyB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gVGFibGVDZWxsO1xufShjb21tb24uRGF0ZUNvbXBvbmVudCkpO1xuXG5mdW5jdGlvbiBjb21wdXRlRmdTZWdQbGFjZW1lbnQoc2VncywgLy8gYXNzdW1lZCBhbHJlYWR5IHNvcnRlZFxuZGF5TWF4RXZlbnRzLCBkYXlNYXhFdmVudFJvd3MsIHN0cmljdE9yZGVyLCBldmVudEluc3RhbmNlSGVpZ2h0cywgbWF4Q29udGVudEhlaWdodCwgY2VsbHMpIHtcbiAgICB2YXIgaGllcmFyY2h5ID0gbmV3IERheUdyaWRTZWdIaWVyYXJjaHkoKTtcbiAgICBoaWVyYXJjaHkuYWxsb3dSZXNsaWNpbmcgPSB0cnVlO1xuICAgIGhpZXJhcmNoeS5zdHJpY3RPcmRlciA9IHN0cmljdE9yZGVyO1xuICAgIGlmIChkYXlNYXhFdmVudHMgPT09IHRydWUgfHwgZGF5TWF4RXZlbnRSb3dzID09PSB0cnVlKSB7XG4gICAgICAgIGhpZXJhcmNoeS5tYXhDb29yZCA9IG1heENvbnRlbnRIZWlnaHQ7XG4gICAgICAgIGhpZXJhcmNoeS5oaWRkZW5Db25zdW1lcyA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBkYXlNYXhFdmVudHMgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGhpZXJhcmNoeS5tYXhTdGFja0NudCA9IGRheU1heEV2ZW50cztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGRheU1heEV2ZW50Um93cyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaGllcmFyY2h5Lm1heFN0YWNrQ250ID0gZGF5TWF4RXZlbnRSb3dzO1xuICAgICAgICBoaWVyYXJjaHkuaGlkZGVuQ29uc3VtZXMgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBjcmVhdGUgc2VnSW5wdXRzIG9ubHkgZm9yIHNlZ3Mgd2l0aCBrbm93biBoZWlnaHRzXG4gICAgdmFyIHNlZ0lucHV0cyA9IFtdO1xuICAgIHZhciB1bmtub3duSGVpZ2h0U2VncyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgc2VnID0gc2Vnc1tpXTtcbiAgICAgICAgdmFyIGluc3RhbmNlSWQgPSBzZWcuZXZlbnRSYW5nZS5pbnN0YW5jZS5pbnN0YW5jZUlkO1xuICAgICAgICB2YXIgZXZlbnRIZWlnaHQgPSBldmVudEluc3RhbmNlSGVpZ2h0c1tpbnN0YW5jZUlkXTtcbiAgICAgICAgaWYgKGV2ZW50SGVpZ2h0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNlZ0lucHV0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgICAgICB0aGlja25lc3M6IGV2ZW50SGVpZ2h0LFxuICAgICAgICAgICAgICAgIHNwYW46IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHNlZy5maXJzdENvbCxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBzZWcubGFzdENvbCArIDEsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdW5rbm93bkhlaWdodFNlZ3MucHVzaChzZWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBoaWRkZW5FbnRyaWVzID0gaGllcmFyY2h5LmFkZFNlZ3Moc2VnSW5wdXRzKTtcbiAgICB2YXIgc2VnUmVjdHMgPSBoaWVyYXJjaHkudG9SZWN0cygpO1xuICAgIHZhciBfYSA9IHBsYWNlUmVjdHMoc2VnUmVjdHMsIHNlZ3MsIGNlbGxzKSwgc2luZ2xlQ29sUGxhY2VtZW50cyA9IF9hLnNpbmdsZUNvbFBsYWNlbWVudHMsIG11bHRpQ29sUGxhY2VtZW50cyA9IF9hLm11bHRpQ29sUGxhY2VtZW50cywgbGVmdG92ZXJNYXJnaW5zID0gX2EubGVmdG92ZXJNYXJnaW5zO1xuICAgIHZhciBtb3JlQ250cyA9IFtdO1xuICAgIHZhciBtb3JlTWFyZ2luVG9wcyA9IFtdO1xuICAgIC8vIGFkZCBzZWdzIHdpdGggdW5rbm93biBoZWlnaHRzXG4gICAgZm9yICh2YXIgX2kgPSAwLCB1bmtub3duSGVpZ2h0U2Vnc18xID0gdW5rbm93bkhlaWdodFNlZ3M7IF9pIDwgdW5rbm93bkhlaWdodFNlZ3NfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHNlZyA9IHVua25vd25IZWlnaHRTZWdzXzFbX2ldO1xuICAgICAgICBtdWx0aUNvbFBsYWNlbWVudHNbc2VnLmZpcnN0Q29sXS5wdXNoKHtcbiAgICAgICAgICAgIHNlZzogc2VnLFxuICAgICAgICAgICAgaXNWaXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGlzQWJzb2x1dGU6IHRydWUsXG4gICAgICAgICAgICBhYnNvbHV0ZVRvcDogMCxcbiAgICAgICAgICAgIG1hcmdpblRvcDogMCxcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAodmFyIGNvbCA9IHNlZy5maXJzdENvbDsgY29sIDw9IHNlZy5sYXN0Q29sOyBjb2wgKz0gMSkge1xuICAgICAgICAgICAgc2luZ2xlQ29sUGxhY2VtZW50c1tjb2xdLnB1c2goe1xuICAgICAgICAgICAgICAgIHNlZzogcmVzbGljZVNlZyhzZWcsIGNvbCwgY29sICsgMSwgY2VsbHMpLFxuICAgICAgICAgICAgICAgIGlzVmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNBYnNvbHV0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgYWJzb2x1dGVUb3A6IDAsXG4gICAgICAgICAgICAgICAgbWFyZ2luVG9wOiAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYWRkIHRoZSBoaWRkZW4gZW50cmllc1xuICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IGNlbGxzLmxlbmd0aDsgY29sICs9IDEpIHtcbiAgICAgICAgbW9yZUNudHMucHVzaCgwKTtcbiAgICB9XG4gICAgZm9yICh2YXIgX2IgPSAwLCBoaWRkZW5FbnRyaWVzXzEgPSBoaWRkZW5FbnRyaWVzOyBfYiA8IGhpZGRlbkVudHJpZXNfMS5sZW5ndGg7IF9iKyspIHtcbiAgICAgICAgdmFyIGhpZGRlbkVudHJ5ID0gaGlkZGVuRW50cmllc18xW19iXTtcbiAgICAgICAgdmFyIHNlZyA9IHNlZ3NbaGlkZGVuRW50cnkuaW5kZXhdO1xuICAgICAgICB2YXIgaGlkZGVuU3BhbiA9IGhpZGRlbkVudHJ5LnNwYW47XG4gICAgICAgIG11bHRpQ29sUGxhY2VtZW50c1toaWRkZW5TcGFuLnN0YXJ0XS5wdXNoKHtcbiAgICAgICAgICAgIHNlZzogcmVzbGljZVNlZyhzZWcsIGhpZGRlblNwYW4uc3RhcnQsIGhpZGRlblNwYW4uZW5kLCBjZWxscyksXG4gICAgICAgICAgICBpc1Zpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgaXNBYnNvbHV0ZTogdHJ1ZSxcbiAgICAgICAgICAgIGFic29sdXRlVG9wOiAwLFxuICAgICAgICAgICAgbWFyZ2luVG9wOiAwLFxuICAgICAgICB9KTtcbiAgICAgICAgZm9yICh2YXIgY29sID0gaGlkZGVuU3Bhbi5zdGFydDsgY29sIDwgaGlkZGVuU3Bhbi5lbmQ7IGNvbCArPSAxKSB7XG4gICAgICAgICAgICBtb3JlQ250c1tjb2xdICs9IDE7XG4gICAgICAgICAgICBzaW5nbGVDb2xQbGFjZW1lbnRzW2NvbF0ucHVzaCh7XG4gICAgICAgICAgICAgICAgc2VnOiByZXNsaWNlU2VnKHNlZywgY29sLCBjb2wgKyAxLCBjZWxscyksXG4gICAgICAgICAgICAgICAgaXNWaXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0Fic29sdXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBhYnNvbHV0ZVRvcDogMCxcbiAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IDAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBkZWFsIHdpdGggbGVmdG92ZXIgbWFyZ2luc1xuICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IGNlbGxzLmxlbmd0aDsgY29sICs9IDEpIHtcbiAgICAgICAgbW9yZU1hcmdpblRvcHMucHVzaChsZWZ0b3Zlck1hcmdpbnNbY29sXSk7XG4gICAgfVxuICAgIHJldHVybiB7IHNpbmdsZUNvbFBsYWNlbWVudHM6IHNpbmdsZUNvbFBsYWNlbWVudHMsIG11bHRpQ29sUGxhY2VtZW50czogbXVsdGlDb2xQbGFjZW1lbnRzLCBtb3JlQ250czogbW9yZUNudHMsIG1vcmVNYXJnaW5Ub3BzOiBtb3JlTWFyZ2luVG9wcyB9O1xufVxuLy8gcmVjdHMgb3JkZXJlZCBieSB0b3AgY29vcmQsIHRoZW4gbGVmdFxuZnVuY3Rpb24gcGxhY2VSZWN0cyhhbGxSZWN0cywgc2VncywgY2VsbHMpIHtcbiAgICB2YXIgcmVjdHNCeUVhY2hDb2wgPSBncm91cFJlY3RzQnlFYWNoQ29sKGFsbFJlY3RzLCBjZWxscy5sZW5ndGgpO1xuICAgIHZhciBzaW5nbGVDb2xQbGFjZW1lbnRzID0gW107XG4gICAgdmFyIG11bHRpQ29sUGxhY2VtZW50cyA9IFtdO1xuICAgIHZhciBsZWZ0b3Zlck1hcmdpbnMgPSBbXTtcbiAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCBjZWxscy5sZW5ndGg7IGNvbCArPSAxKSB7XG4gICAgICAgIHZhciByZWN0cyA9IHJlY3RzQnlFYWNoQ29sW2NvbF07XG4gICAgICAgIC8vIGNvbXB1dGUgYWxsIHN0YXRpYyBzZWdzIGluIHNpbmdsZVBsYWNlbWVudHNcbiAgICAgICAgdmFyIHNpbmdsZVBsYWNlbWVudHMgPSBbXTtcbiAgICAgICAgdmFyIGN1cnJlbnRIZWlnaHQgPSAwO1xuICAgICAgICB2YXIgY3VycmVudE1hcmdpblRvcCA9IDA7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgcmVjdHNfMSA9IHJlY3RzOyBfaSA8IHJlY3RzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgcmVjdCA9IHJlY3RzXzFbX2ldO1xuICAgICAgICAgICAgdmFyIHNlZyA9IHNlZ3NbcmVjdC5pbmRleF07XG4gICAgICAgICAgICBzaW5nbGVQbGFjZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHNlZzogcmVzbGljZVNlZyhzZWcsIGNvbCwgY29sICsgMSwgY2VsbHMpLFxuICAgICAgICAgICAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc0Fic29sdXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBhYnNvbHV0ZVRvcDogcmVjdC5sZXZlbENvb3JkLFxuICAgICAgICAgICAgICAgIG1hcmdpblRvcDogcmVjdC5sZXZlbENvb3JkIC0gY3VycmVudEhlaWdodCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3VycmVudEhlaWdodCA9IHJlY3QubGV2ZWxDb29yZCArIHJlY3QudGhpY2tuZXNzO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbXB1dGUgbWl4ZWQgc3RhdGljL2Fic29sdXRlIHNlZ3MgaW4gbXVsdGlQbGFjZW1lbnRzXG4gICAgICAgIHZhciBtdWx0aVBsYWNlbWVudHMgPSBbXTtcbiAgICAgICAgY3VycmVudEhlaWdodCA9IDA7XG4gICAgICAgIGN1cnJlbnRNYXJnaW5Ub3AgPSAwO1xuICAgICAgICBmb3IgKHZhciBfYSA9IDAsIHJlY3RzXzIgPSByZWN0czsgX2EgPCByZWN0c18yLmxlbmd0aDsgX2ErKykge1xuICAgICAgICAgICAgdmFyIHJlY3QgPSByZWN0c18yW19hXTtcbiAgICAgICAgICAgIHZhciBzZWcgPSBzZWdzW3JlY3QuaW5kZXhdO1xuICAgICAgICAgICAgdmFyIGlzQWJzb2x1dGUgPSByZWN0LnNwYW4uZW5kIC0gcmVjdC5zcGFuLnN0YXJ0ID4gMTsgLy8gbXVsdGktY29sdW1uP1xuICAgICAgICAgICAgdmFyIGlzRmlyc3RDb2wgPSByZWN0LnNwYW4uc3RhcnQgPT09IGNvbDtcbiAgICAgICAgICAgIGN1cnJlbnRNYXJnaW5Ub3AgKz0gcmVjdC5sZXZlbENvb3JkIC0gY3VycmVudEhlaWdodDsgLy8gYW1vdW50IG9mIHNwYWNlIHNpbmNlIGJvdHRvbSBvZiBwcmV2aW91cyBzZWdcbiAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgPSByZWN0LmxldmVsQ29vcmQgKyByZWN0LnRoaWNrbmVzczsgLy8gaGVpZ2h0IHdpbGwgbm93IGJlIGJvdHRvbSBvZiBjdXJyZW50IHNlZ1xuICAgICAgICAgICAgaWYgKGlzQWJzb2x1dGUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50TWFyZ2luVG9wICs9IHJlY3QudGhpY2tuZXNzO1xuICAgICAgICAgICAgICAgIGlmIChpc0ZpcnN0Q29sKSB7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpUGxhY2VtZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlZzogcmVzbGljZVNlZyhzZWcsIHJlY3Quc3Bhbi5zdGFydCwgcmVjdC5zcGFuLmVuZCwgY2VsbHMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNBYnNvbHV0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlVG9wOiByZWN0LmxldmVsQ29vcmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IDAsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRmlyc3RDb2wpIHtcbiAgICAgICAgICAgICAgICBtdWx0aVBsYWNlbWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHNlZzogcmVzbGljZVNlZyhzZWcsIHJlY3Quc3Bhbi5zdGFydCwgcmVjdC5zcGFuLmVuZCwgY2VsbHMpLFxuICAgICAgICAgICAgICAgICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGlzQWJzb2x1dGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZVRvcDogcmVjdC5sZXZlbENvb3JkLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IGN1cnJlbnRNYXJnaW5Ub3AsIC8vIGNsYWltIHRoZSBtYXJnaW5cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjdXJyZW50TWFyZ2luVG9wID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzaW5nbGVDb2xQbGFjZW1lbnRzLnB1c2goc2luZ2xlUGxhY2VtZW50cyk7XG4gICAgICAgIG11bHRpQ29sUGxhY2VtZW50cy5wdXNoKG11bHRpUGxhY2VtZW50cyk7XG4gICAgICAgIGxlZnRvdmVyTWFyZ2lucy5wdXNoKGN1cnJlbnRNYXJnaW5Ub3ApO1xuICAgIH1cbiAgICByZXR1cm4geyBzaW5nbGVDb2xQbGFjZW1lbnRzOiBzaW5nbGVDb2xQbGFjZW1lbnRzLCBtdWx0aUNvbFBsYWNlbWVudHM6IG11bHRpQ29sUGxhY2VtZW50cywgbGVmdG92ZXJNYXJnaW5zOiBsZWZ0b3Zlck1hcmdpbnMgfTtcbn1cbmZ1bmN0aW9uIGdyb3VwUmVjdHNCeUVhY2hDb2wocmVjdHMsIGNvbENudCkge1xuICAgIHZhciByZWN0c0J5RWFjaENvbCA9IFtdO1xuICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IGNvbENudDsgY29sICs9IDEpIHtcbiAgICAgICAgcmVjdHNCeUVhY2hDb2wucHVzaChbXSk7XG4gICAgfVxuICAgIGZvciAodmFyIF9pID0gMCwgcmVjdHNfMyA9IHJlY3RzOyBfaSA8IHJlY3RzXzMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciByZWN0ID0gcmVjdHNfM1tfaV07XG4gICAgICAgIGZvciAodmFyIGNvbCA9IHJlY3Quc3Bhbi5zdGFydDsgY29sIDwgcmVjdC5zcGFuLmVuZDsgY29sICs9IDEpIHtcbiAgICAgICAgICAgIHJlY3RzQnlFYWNoQ29sW2NvbF0ucHVzaChyZWN0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVjdHNCeUVhY2hDb2w7XG59XG5mdW5jdGlvbiByZXNsaWNlU2VnKHNlZywgc3BhblN0YXJ0LCBzcGFuRW5kLCBjZWxscykge1xuICAgIGlmIChzZWcuZmlyc3RDb2wgPT09IHNwYW5TdGFydCAmJiBzZWcubGFzdENvbCA9PT0gc3BhbkVuZCAtIDEpIHtcbiAgICAgICAgcmV0dXJuIHNlZztcbiAgICB9XG4gICAgdmFyIGV2ZW50UmFuZ2UgPSBzZWcuZXZlbnRSYW5nZTtcbiAgICB2YXIgb3JpZ1JhbmdlID0gZXZlbnRSYW5nZS5yYW5nZTtcbiAgICB2YXIgc2xpY2VkUmFuZ2UgPSBjb21tb24uaW50ZXJzZWN0UmFuZ2VzKG9yaWdSYW5nZSwge1xuICAgICAgICBzdGFydDogY2VsbHNbc3BhblN0YXJ0XS5kYXRlLFxuICAgICAgICBlbmQ6IGNvbW1vbi5hZGREYXlzKGNlbGxzW3NwYW5FbmQgLSAxXS5kYXRlLCAxKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIHNlZyksIHsgZmlyc3RDb2w6IHNwYW5TdGFydCwgbGFzdENvbDogc3BhbkVuZCAtIDEsIGV2ZW50UmFuZ2U6IHtcbiAgICAgICAgICAgIGRlZjogZXZlbnRSYW5nZS5kZWYsXG4gICAgICAgICAgICB1aTogdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGV2ZW50UmFuZ2UudWkpLCB7IGR1cmF0aW9uRWRpdGFibGU6IGZhbHNlIH0pLFxuICAgICAgICAgICAgaW5zdGFuY2U6IGV2ZW50UmFuZ2UuaW5zdGFuY2UsXG4gICAgICAgICAgICByYW5nZTogc2xpY2VkUmFuZ2UsXG4gICAgICAgIH0sIGlzU3RhcnQ6IHNlZy5pc1N0YXJ0ICYmIHNsaWNlZFJhbmdlLnN0YXJ0LnZhbHVlT2YoKSA9PT0gb3JpZ1JhbmdlLnN0YXJ0LnZhbHVlT2YoKSwgaXNFbmQ6IHNlZy5pc0VuZCAmJiBzbGljZWRSYW5nZS5lbmQudmFsdWVPZigpID09PSBvcmlnUmFuZ2UuZW5kLnZhbHVlT2YoKSB9KTtcbn1cbnZhciBEYXlHcmlkU2VnSGllcmFyY2h5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhEYXlHcmlkU2VnSGllcmFyY2h5LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIERheUdyaWRTZWdIaWVyYXJjaHkoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICAvLyBjb25maWdcbiAgICAgICAgX3RoaXMuaGlkZGVuQ29uc3VtZXMgPSBmYWxzZTtcbiAgICAgICAgLy8gYWxsb3dzIHVzIHRvIGtlZXAgaGlkZGVuIGVudHJpZXMgaW4gdGhlIGhpZXJhcmNoeSBzbyB0aGV5IHRha2UgdXAgc3BhY2VcbiAgICAgICAgX3RoaXMuZm9yY2VIaWRkZW4gPSB7fTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBEYXlHcmlkU2VnSGllcmFyY2h5LnByb3RvdHlwZS5hZGRTZWdzID0gZnVuY3Rpb24gKHNlZ0lucHV0cykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgaGlkZGVuU2VncyA9IF9zdXBlci5wcm90b3R5cGUuYWRkU2Vncy5jYWxsKHRoaXMsIHNlZ0lucHV0cyk7XG4gICAgICAgIHZhciBlbnRyaWVzQnlMZXZlbCA9IHRoaXMuZW50cmllc0J5TGV2ZWw7XG4gICAgICAgIHZhciBleGNsdWRlSGlkZGVuID0gZnVuY3Rpb24gKGVudHJ5KSB7IHJldHVybiAhX3RoaXMuZm9yY2VIaWRkZW5bY29tbW9uLmJ1aWxkRW50cnlLZXkoZW50cnkpXTsgfTtcbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBmb3JjZWQtaGlkZGVuIHNlZ3NcbiAgICAgICAgZm9yICh2YXIgbGV2ZWwgPSAwOyBsZXZlbCA8IGVudHJpZXNCeUxldmVsLmxlbmd0aDsgbGV2ZWwgKz0gMSkge1xuICAgICAgICAgICAgZW50cmllc0J5TGV2ZWxbbGV2ZWxdID0gZW50cmllc0J5TGV2ZWxbbGV2ZWxdLmZpbHRlcihleGNsdWRlSGlkZGVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlkZGVuU2VncztcbiAgICB9O1xuICAgIERheUdyaWRTZWdIaWVyYXJjaHkucHJvdG90eXBlLmhhbmRsZUludmFsaWRJbnNlcnRpb24gPSBmdW5jdGlvbiAoaW5zZXJ0aW9uLCBlbnRyeSwgaGlkZGVuRW50cmllcykge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBlbnRyaWVzQnlMZXZlbCA9IF9hLmVudHJpZXNCeUxldmVsLCBmb3JjZUhpZGRlbiA9IF9hLmZvcmNlSGlkZGVuO1xuICAgICAgICB2YXIgdG91Y2hpbmdFbnRyeSA9IGluc2VydGlvbi50b3VjaGluZ0VudHJ5LCB0b3VjaGluZ0xldmVsID0gaW5zZXJ0aW9uLnRvdWNoaW5nTGV2ZWwsIHRvdWNoaW5nTGF0ZXJhbCA9IGluc2VydGlvbi50b3VjaGluZ0xhdGVyYWw7XG4gICAgICAgIGlmICh0aGlzLmhpZGRlbkNvbnN1bWVzICYmIHRvdWNoaW5nRW50cnkpIHtcbiAgICAgICAgICAgIHZhciB0b3VjaGluZ0VudHJ5SWQgPSBjb21tb24uYnVpbGRFbnRyeUtleSh0b3VjaGluZ0VudHJ5KTtcbiAgICAgICAgICAgIC8vIGlmIG5vdCBhbHJlYWR5IGhpZGRlblxuICAgICAgICAgICAgaWYgKCFmb3JjZUhpZGRlblt0b3VjaGluZ0VudHJ5SWRdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWxsb3dSZXNsaWNpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBsYWNlaG9sZGVyRW50cnkgPSB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgdG91Y2hpbmdFbnRyeSksIHsgc3BhbjogY29tbW9uLmludGVyc2VjdFNwYW5zKHRvdWNoaW5nRW50cnkuc3BhbiwgZW50cnkuc3BhbikgfSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwbGFjZWhvbGRlckVudHJ5SWQgPSBjb21tb24uYnVpbGRFbnRyeUtleShwbGFjZWhvbGRlckVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgZm9yY2VIaWRkZW5bcGxhY2Vob2xkZXJFbnRyeUlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGVudHJpZXNCeUxldmVsW3RvdWNoaW5nTGV2ZWxdW3RvdWNoaW5nTGF0ZXJhbF0gPSBwbGFjZWhvbGRlckVudHJ5OyAvLyByZXBsYWNlIHRvdWNoaW5nRW50cnkgd2l0aCBvdXIgcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGxpdEVudHJ5KHRvdWNoaW5nRW50cnksIGVudHJ5LCBoaWRkZW5FbnRyaWVzKTsgLy8gc3BsaXQgdXAgdGhlIHRvdWNoaW5nRW50cnksIHJlaW5zZXJ0IGl0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3JjZUhpZGRlblt0b3VjaGluZ0VudHJ5SWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuRW50cmllcy5wdXNoKHRvdWNoaW5nRW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5oYW5kbGVJbnZhbGlkSW5zZXJ0aW9uLmNhbGwodGhpcywgaW5zZXJ0aW9uLCBlbnRyeSwgaGlkZGVuRW50cmllcyk7XG4gICAgfTtcbiAgICByZXR1cm4gRGF5R3JpZFNlZ0hpZXJhcmNoeTtcbn0oY29tbW9uLlNlZ0hpZXJhcmNoeSkpO1xuXG52YXIgVGFibGVSb3cgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKFRhYmxlUm93LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRhYmxlUm93KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY2VsbEVsUmVmcyA9IG5ldyBjb21tb24uUmVmTWFwKCk7IC8vIHRoZSA8dGQ+XG4gICAgICAgIF90aGlzLmZyYW1lRWxSZWZzID0gbmV3IGNvbW1vbi5SZWZNYXAoKTsgLy8gdGhlIGZjLWRheWdyaWQtZGF5LWZyYW1lXG4gICAgICAgIF90aGlzLmZnRWxSZWZzID0gbmV3IGNvbW1vbi5SZWZNYXAoKTsgLy8gdGhlIGZjLWRheWdyaWQtZGF5LWV2ZW50c1xuICAgICAgICBfdGhpcy5zZWdIYXJuZXNzUmVmcyA9IG5ldyBjb21tb24uUmVmTWFwKCk7IC8vIGluZGV4ZWQgYnkgXCJpbnN0YW5jZUlkOmZpcnN0Q29sXCJcbiAgICAgICAgX3RoaXMucm9vdEVsUmVmID0gY29tbW9uLmNyZWF0ZVJlZigpO1xuICAgICAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGZyYW1lUG9zaXRpb25zOiBudWxsLFxuICAgICAgICAgICAgbWF4Q29udGVudEhlaWdodDogbnVsbCxcbiAgICAgICAgICAgIGV2ZW50SW5zdGFuY2VIZWlnaHRzOiB7fSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBUYWJsZVJvdy5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBzdGF0ZSA9IF9hLnN0YXRlLCBjb250ZXh0ID0gX2EuY29udGV4dDtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgICAgIHZhciBjb2xDbnQgPSBwcm9wcy5jZWxscy5sZW5ndGg7XG4gICAgICAgIHZhciBidXNpbmVzc0hvdXJzQnlDb2wgPSBzcGxpdFNlZ3NCeUZpcnN0Q29sKHByb3BzLmJ1c2luZXNzSG91clNlZ3MsIGNvbENudCk7XG4gICAgICAgIHZhciBiZ0V2ZW50U2Vnc0J5Q29sID0gc3BsaXRTZWdzQnlGaXJzdENvbChwcm9wcy5iZ0V2ZW50U2VncywgY29sQ250KTtcbiAgICAgICAgdmFyIGhpZ2hsaWdodFNlZ3NCeUNvbCA9IHNwbGl0U2Vnc0J5Rmlyc3RDb2wodGhpcy5nZXRIaWdobGlnaHRTZWdzKCksIGNvbENudCk7XG4gICAgICAgIHZhciBtaXJyb3JTZWdzQnlDb2wgPSBzcGxpdFNlZ3NCeUZpcnN0Q29sKHRoaXMuZ2V0TWlycm9yU2VncygpLCBjb2xDbnQpO1xuICAgICAgICB2YXIgX2IgPSBjb21wdXRlRmdTZWdQbGFjZW1lbnQoY29tbW9uLnNvcnRFdmVudFNlZ3MocHJvcHMuZmdFdmVudFNlZ3MsIG9wdGlvbnMuZXZlbnRPcmRlciksIHByb3BzLmRheU1heEV2ZW50cywgcHJvcHMuZGF5TWF4RXZlbnRSb3dzLCBvcHRpb25zLmV2ZW50T3JkZXJTdHJpY3QsIHN0YXRlLmV2ZW50SW5zdGFuY2VIZWlnaHRzLCBzdGF0ZS5tYXhDb250ZW50SGVpZ2h0LCBwcm9wcy5jZWxscyksIHNpbmdsZUNvbFBsYWNlbWVudHMgPSBfYi5zaW5nbGVDb2xQbGFjZW1lbnRzLCBtdWx0aUNvbFBsYWNlbWVudHMgPSBfYi5tdWx0aUNvbFBsYWNlbWVudHMsIG1vcmVDbnRzID0gX2IubW9yZUNudHMsIG1vcmVNYXJnaW5Ub3BzID0gX2IubW9yZU1hcmdpblRvcHM7XG4gICAgICAgIHZhciBpc0ZvcmNlZEludmlzaWJsZSA9IC8vIFRPRE86IG1lc3N5IHdheSB0byBjb21wdXRlIHRoaXNcbiAgICAgICAgIChwcm9wcy5ldmVudERyYWcgJiYgcHJvcHMuZXZlbnREcmFnLmFmZmVjdGVkSW5zdGFuY2VzKSB8fFxuICAgICAgICAgICAgKHByb3BzLmV2ZW50UmVzaXplICYmIHByb3BzLmV2ZW50UmVzaXplLmFmZmVjdGVkSW5zdGFuY2VzKSB8fFxuICAgICAgICAgICAge307XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCB7IHJlZjogdGhpcy5yb290RWxSZWYsIHJvbGU6IFwicm93XCIgfSxcbiAgICAgICAgICAgIHByb3BzLnJlbmRlckludHJvICYmIHByb3BzLnJlbmRlckludHJvKCksXG4gICAgICAgICAgICBwcm9wcy5jZWxscy5tYXAoZnVuY3Rpb24gKGNlbGwsIGNvbCkge1xuICAgICAgICAgICAgICAgIHZhciBub3JtYWxGZ05vZGVzID0gX3RoaXMucmVuZGVyRmdTZWdzKGNvbCwgcHJvcHMuZm9yUHJpbnQgPyBzaW5nbGVDb2xQbGFjZW1lbnRzW2NvbF0gOiBtdWx0aUNvbFBsYWNlbWVudHNbY29sXSwgcHJvcHMudG9kYXlSYW5nZSwgaXNGb3JjZWRJbnZpc2libGUpO1xuICAgICAgICAgICAgICAgIHZhciBtaXJyb3JGZ05vZGVzID0gX3RoaXMucmVuZGVyRmdTZWdzKGNvbCwgYnVpbGRNaXJyb3JQbGFjZW1lbnRzKG1pcnJvclNlZ3NCeUNvbFtjb2xdLCBtdWx0aUNvbFBsYWNlbWVudHMpLCBwcm9wcy50b2RheVJhbmdlLCB7fSwgQm9vbGVhbihwcm9wcy5ldmVudERyYWcpLCBCb29sZWFuKHByb3BzLmV2ZW50UmVzaXplKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoVGFibGVDZWxsLCB7IGtleTogY2VsbC5rZXksIGVsUmVmOiBfdGhpcy5jZWxsRWxSZWZzLmNyZWF0ZVJlZihjZWxsLmtleSksIGlubmVyRWxSZWY6IF90aGlzLmZyYW1lRWxSZWZzLmNyZWF0ZVJlZihjZWxsLmtleSkgLyogRkYgPHRkPiBwcm9ibGVtLCBidXQgb2theSB0byB1c2UgZm9yIGxlZnQvcmlnaHQuIFRPRE86IHJlbmFtZSBwcm9wICovLCBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsIGRhdGU6IGNlbGwuZGF0ZSwgc2hvd0RheU51bWJlcjogcHJvcHMuc2hvd0RheU51bWJlcnMsIHNob3dXZWVrTnVtYmVyOiBwcm9wcy5zaG93V2Vla051bWJlcnMgJiYgY29sID09PSAwLCBmb3JjZURheVRvcDogcHJvcHMuc2hvd1dlZWtOdW1iZXJzIC8qIGV2ZW4gZGlzcGxheWluZyB3ZWVrbnVtIGZvciByb3csIG5vdCBuZWNlc3NhcmlseSBkYXkgKi8sIHRvZGF5UmFuZ2U6IHByb3BzLnRvZGF5UmFuZ2UsIGV2ZW50U2VsZWN0aW9uOiBwcm9wcy5ldmVudFNlbGVjdGlvbiwgZXZlbnREcmFnOiBwcm9wcy5ldmVudERyYWcsIGV2ZW50UmVzaXplOiBwcm9wcy5ldmVudFJlc2l6ZSwgZXh0cmFIb29rUHJvcHM6IGNlbGwuZXh0cmFIb29rUHJvcHMsIGV4dHJhRGF0YUF0dHJzOiBjZWxsLmV4dHJhRGF0YUF0dHJzLCBleHRyYUNsYXNzTmFtZXM6IGNlbGwuZXh0cmFDbGFzc05hbWVzLCBleHRyYURhdGVTcGFuOiBjZWxsLmV4dHJhRGF0ZVNwYW4sIG1vcmVDbnQ6IG1vcmVDbnRzW2NvbF0sIG1vcmVNYXJnaW5Ub3A6IG1vcmVNYXJnaW5Ub3BzW2NvbF0sIHNpbmdsZVBsYWNlbWVudHM6IHNpbmdsZUNvbFBsYWNlbWVudHNbY29sXSwgZmdDb250ZW50RWxSZWY6IF90aGlzLmZnRWxSZWZzLmNyZWF0ZVJlZihjZWxsLmtleSksIGZnQ29udGVudDogKCAvLyBGcmFnbWVudCBzY29wZXMgdGhlIGtleXNcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkZyYWdtZW50LCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkZyYWdtZW50LCBudWxsLCBub3JtYWxGZ05vZGVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5GcmFnbWVudCwgbnVsbCwgbWlycm9yRmdOb2RlcykpKSwgYmdDb250ZW50OiAoIC8vIEZyYWdtZW50IHNjb3BlcyB0aGUga2V5c1xuICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uRnJhZ21lbnQsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZW5kZXJGaWxsU2VncyhoaWdobGlnaHRTZWdzQnlDb2xbY29sXSwgJ2hpZ2hsaWdodCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVuZGVyRmlsbFNlZ3MoYnVzaW5lc3NIb3Vyc0J5Q29sW2NvbF0sICdub24tYnVzaW5lc3MnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlckZpbGxTZWdzKGJnRXZlbnRTZWdzQnlDb2xbY29sXSwgJ2JnLWV2ZW50JykpKSB9KSk7XG4gICAgICAgICAgICB9KSkpO1xuICAgIH07XG4gICAgVGFibGVSb3cucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVNpemluZyh0cnVlKTtcbiAgICB9O1xuICAgIFRhYmxlUm93LnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiAocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRQcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICAgIHRoaXMudXBkYXRlU2l6aW5nKCFjb21tb24uaXNQcm9wc0VxdWFsKHByZXZQcm9wcywgY3VycmVudFByb3BzKSk7XG4gICAgfTtcbiAgICBUYWJsZVJvdy5wcm90b3R5cGUuZ2V0SGlnaGxpZ2h0U2VncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgaWYgKHByb3BzLmV2ZW50RHJhZyAmJiBwcm9wcy5ldmVudERyYWcuc2Vncy5sZW5ndGgpIHsgLy8gbWVzc3kgY2hlY2tcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5ldmVudERyYWcuc2VncztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcHMuZXZlbnRSZXNpemUgJiYgcHJvcHMuZXZlbnRSZXNpemUuc2Vncy5sZW5ndGgpIHsgLy8gbWVzc3kgY2hlY2tcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5ldmVudFJlc2l6ZS5zZWdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wcy5kYXRlU2VsZWN0aW9uU2VncztcbiAgICB9O1xuICAgIFRhYmxlUm93LnByb3RvdHlwZS5nZXRNaXJyb3JTZWdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICBpZiAocHJvcHMuZXZlbnRSZXNpemUgJiYgcHJvcHMuZXZlbnRSZXNpemUuc2Vncy5sZW5ndGgpIHsgLy8gbWVzc3kgY2hlY2tcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5ldmVudFJlc2l6ZS5zZWdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9O1xuICAgIFRhYmxlUm93LnByb3RvdHlwZS5yZW5kZXJGZ1NlZ3MgPSBmdW5jdGlvbiAoY29sLCBzZWdQbGFjZW1lbnRzLCB0b2RheVJhbmdlLCBpc0ZvcmNlZEludmlzaWJsZSwgaXNEcmFnZ2luZywgaXNSZXNpemluZywgaXNEYXRlU2VsZWN0aW5nKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICB2YXIgZXZlbnRTZWxlY3Rpb24gPSB0aGlzLnByb3BzLmV2ZW50U2VsZWN0aW9uO1xuICAgICAgICB2YXIgZnJhbWVQb3NpdGlvbnMgPSB0aGlzLnN0YXRlLmZyYW1lUG9zaXRpb25zO1xuICAgICAgICB2YXIgZGVmYXVsdERpc3BsYXlFdmVudEVuZCA9IHRoaXMucHJvcHMuY2VsbHMubGVuZ3RoID09PSAxOyAvLyBjb2xDbnQgPT09IDFcbiAgICAgICAgdmFyIGlzTWlycm9yID0gaXNEcmFnZ2luZyB8fCBpc1Jlc2l6aW5nIHx8IGlzRGF0ZVNlbGVjdGluZztcbiAgICAgICAgdmFyIG5vZGVzID0gW107XG4gICAgICAgIGlmIChmcmFtZVBvc2l0aW9ucykge1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBzZWdQbGFjZW1lbnRzXzEgPSBzZWdQbGFjZW1lbnRzOyBfaSA8IHNlZ1BsYWNlbWVudHNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcGxhY2VtZW50ID0gc2VnUGxhY2VtZW50c18xW19pXTtcbiAgICAgICAgICAgICAgICB2YXIgc2VnID0gcGxhY2VtZW50LnNlZztcbiAgICAgICAgICAgICAgICB2YXIgaW5zdGFuY2VJZCA9IHNlZy5ldmVudFJhbmdlLmluc3RhbmNlLmluc3RhbmNlSWQ7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGluc3RhbmNlSWQgKyAnOicgKyBjb2w7XG4gICAgICAgICAgICAgICAgdmFyIGlzVmlzaWJsZSA9IHBsYWNlbWVudC5pc1Zpc2libGUgJiYgIWlzRm9yY2VkSW52aXNpYmxlW2luc3RhbmNlSWRdO1xuICAgICAgICAgICAgICAgIHZhciBpc0Fic29sdXRlID0gcGxhY2VtZW50LmlzQWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgdmFyIGxlZnQgPSAnJztcbiAgICAgICAgICAgICAgICB2YXIgcmlnaHQgPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoaXNBYnNvbHV0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5pc1J0bCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGZyYW1lUG9zaXRpb25zLmxlZnRzW3NlZy5sYXN0Q29sXSAtIGZyYW1lUG9zaXRpb25zLmxlZnRzW3NlZy5maXJzdENvbF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gZnJhbWVQb3NpdGlvbnMucmlnaHRzW3NlZy5maXJzdENvbF0gLSBmcmFtZVBvc2l0aW9ucy5yaWdodHNbc2VnLmxhc3RDb2xdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAga25vd24gYnVnOiBldmVudHMgdGhhdCBhcmUgZm9yY2UgdG8gYmUgbGlzdC1pdGVtIGJ1dCBzcGFuIG11bHRpcGxlIGRheXMgc3RpbGwgdGFrZSB1cCBzcGFjZSBpbiBsYXRlciBjb2x1bW5zXG4gICAgICAgICAgICAgICAgdG9kbzogaW4gcHJpbnQgdmlldywgZm9yIG11bHRpLWRheSBldmVudHMsIGRvbid0IGRpc3BsYXkgdGl0bGUgd2l0aGluIG5vbi1zdGFydC9lbmQgc2Vnc1xuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogJ2ZjLWRheWdyaWQtZXZlbnQtaGFybmVzcycgKyAoaXNBYnNvbHV0ZSA/ICcgZmMtZGF5Z3JpZC1ldmVudC1oYXJuZXNzLWFicycgOiAnJyksIGtleToga2V5LCByZWY6IGlzTWlycm9yID8gbnVsbCA6IHRoaXMuc2VnSGFybmVzc1JlZnMuY3JlYXRlUmVmKGtleSksIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiBpc1Zpc2libGUgPyAnJyA6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luVG9wOiBpc0Fic29sdXRlID8gJycgOiBwbGFjZW1lbnQubWFyZ2luVG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBpc0Fic29sdXRlID8gcGxhY2VtZW50LmFic29sdXRlVG9wIDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB9IH0sIGhhc0xpc3RJdGVtRGlzcGxheShzZWcpID8gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFRhYmxlTGlzdEl0ZW1FdmVudCwgdHNsaWIuX19hc3NpZ24oeyBzZWc6IHNlZywgaXNEcmFnZ2luZzogaXNEcmFnZ2luZywgaXNTZWxlY3RlZDogaW5zdGFuY2VJZCA9PT0gZXZlbnRTZWxlY3Rpb24sIGRlZmF1bHREaXNwbGF5RXZlbnRFbmQ6IGRlZmF1bHREaXNwbGF5RXZlbnRFbmQgfSwgY29tbW9uLmdldFNlZ01ldGEoc2VnLCB0b2RheVJhbmdlKSkpKSA6IChjb21tb24uY3JlYXRlRWxlbWVudChUYWJsZUJsb2NrRXZlbnQsIHRzbGliLl9fYXNzaWduKHsgc2VnOiBzZWcsIGlzRHJhZ2dpbmc6IGlzRHJhZ2dpbmcsIGlzUmVzaXppbmc6IGlzUmVzaXppbmcsIGlzRGF0ZVNlbGVjdGluZzogaXNEYXRlU2VsZWN0aW5nLCBpc1NlbGVjdGVkOiBpbnN0YW5jZUlkID09PSBldmVudFNlbGVjdGlvbiwgZGVmYXVsdERpc3BsYXlFdmVudEVuZDogZGVmYXVsdERpc3BsYXlFdmVudEVuZCB9LCBjb21tb24uZ2V0U2VnTWV0YShzZWcsIHRvZGF5UmFuZ2UpKSkpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGVzO1xuICAgIH07XG4gICAgVGFibGVSb3cucHJvdG90eXBlLnJlbmRlckZpbGxTZWdzID0gZnVuY3Rpb24gKHNlZ3MsIGZpbGxUeXBlKSB7XG4gICAgICAgIHZhciBpc1J0bCA9IHRoaXMuY29udGV4dC5pc1J0bDtcbiAgICAgICAgdmFyIHRvZGF5UmFuZ2UgPSB0aGlzLnByb3BzLnRvZGF5UmFuZ2U7XG4gICAgICAgIHZhciBmcmFtZVBvc2l0aW9ucyA9IHRoaXMuc3RhdGUuZnJhbWVQb3NpdGlvbnM7XG4gICAgICAgIHZhciBub2RlcyA9IFtdO1xuICAgICAgICBpZiAoZnJhbWVQb3NpdGlvbnMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgc2Vnc18xID0gc2VnczsgX2kgPCBzZWdzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNlZyA9IHNlZ3NfMVtfaV07XG4gICAgICAgICAgICAgICAgdmFyIGxlZnRSaWdodENzcyA9IGlzUnRsID8ge1xuICAgICAgICAgICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogZnJhbWVQb3NpdGlvbnMubGVmdHNbc2VnLmxhc3RDb2xdIC0gZnJhbWVQb3NpdGlvbnMubGVmdHNbc2VnLmZpcnN0Q29sXSxcbiAgICAgICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgICAgICByaWdodDogZnJhbWVQb3NpdGlvbnMucmlnaHRzW3NlZy5maXJzdENvbF0gLSBmcmFtZVBvc2l0aW9ucy5yaWdodHNbc2VnLmxhc3RDb2xdLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGtleTogY29tbW9uLmJ1aWxkRXZlbnRSYW5nZUtleShzZWcuZXZlbnRSYW5nZSksIGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWJnLWhhcm5lc3NcIiwgc3R5bGU6IGxlZnRSaWdodENzcyB9LCBmaWxsVHlwZSA9PT0gJ2JnLWV2ZW50JyA/XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5CZ0V2ZW50LCB0c2xpYi5fX2Fzc2lnbih7IHNlZzogc2VnIH0sIGNvbW1vbi5nZXRTZWdNZXRhKHNlZywgdG9kYXlSYW5nZSkpKSA6XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbi5yZW5kZXJGaWxsKGZpbGxUeXBlKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21tb24uY3JlYXRlRWxlbWVudC5hcHBseSh2b2lkIDAsIHRzbGliLl9fc3ByZWFkQXJyYXkoW2NvbW1vbi5GcmFnbWVudCwge31dLCBub2RlcykpO1xuICAgIH07XG4gICAgVGFibGVSb3cucHJvdG90eXBlLnVwZGF0ZVNpemluZyA9IGZ1bmN0aW9uIChpc0V4dGVybmFsU2l6aW5nQ2hhbmdlKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGZyYW1lRWxSZWZzID0gX2EuZnJhbWVFbFJlZnM7XG4gICAgICAgIGlmICghcHJvcHMuZm9yUHJpbnQgJiZcbiAgICAgICAgICAgIHByb3BzLmNsaWVudFdpZHRoICE9PSBudWxsIC8vIHBvc2l0aW9uaW5nIHJlYWR5P1xuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChpc0V4dGVybmFsU2l6aW5nQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyYW1lRWxzID0gcHJvcHMuY2VsbHMubWFwKGZ1bmN0aW9uIChjZWxsKSB7IHJldHVybiBmcmFtZUVsUmVmcy5jdXJyZW50TWFwW2NlbGwua2V5XTsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lRWxzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb3JpZ2luRWwgPSB0aGlzLnJvb3RFbFJlZi5jdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lUG9zaXRpb25zOiBuZXcgY29tbW9uLlBvc2l0aW9uQ2FjaGUob3JpZ2luRWwsIGZyYW1lRWxzLCB0cnVlLCAvLyBpc0hvcml6b250YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG9sZEluc3RhbmNlSGVpZ2h0cyA9IHRoaXMuc3RhdGUuZXZlbnRJbnN0YW5jZUhlaWdodHM7XG4gICAgICAgICAgICB2YXIgbmV3SW5zdGFuY2VIZWlnaHRzID0gdGhpcy5xdWVyeUV2ZW50SW5zdGFuY2VIZWlnaHRzKCk7XG4gICAgICAgICAgICB2YXIgbGltaXRCeUNvbnRlbnRIZWlnaHQgPSBwcm9wcy5kYXlNYXhFdmVudHMgPT09IHRydWUgfHwgcHJvcHMuZGF5TWF4RXZlbnRSb3dzID09PSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zYWZlU2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIC8vIEhBQ0sgdG8gcHJldmVudCBvc2NpbGxhdGlvbnMgb2YgZXZlbnRzIGJlaW5nIHNob3duL2hpZGRlbiBmcm9tIG1heC1ldmVudC1yb3dzXG4gICAgICAgICAgICAgICAgLy8gRXNzZW50aWFsbHksIG9uY2UgeW91IGNvbXB1dGUgYW4gZWxlbWVudCdzIGhlaWdodCwgbmV2ZXIgbnVsbC1vdXQuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogYWx3YXlzIGRpc3BsYXkgYWxsIGV2ZW50cywgYXMgdmlzaWJpbGl0eTpoaWRkZW4/XG4gICAgICAgICAgICAgICAgZXZlbnRJbnN0YW5jZUhlaWdodHM6IHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBvbGRJbnN0YW5jZUhlaWdodHMpLCBuZXdJbnN0YW5jZUhlaWdodHMpLFxuICAgICAgICAgICAgICAgIG1heENvbnRlbnRIZWlnaHQ6IGxpbWl0QnlDb250ZW50SGVpZ2h0ID8gdGhpcy5jb21wdXRlTWF4Q29udGVudEhlaWdodCgpIDogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUYWJsZVJvdy5wcm90b3R5cGUucXVlcnlFdmVudEluc3RhbmNlSGVpZ2h0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNlZ0VsTWFwID0gdGhpcy5zZWdIYXJuZXNzUmVmcy5jdXJyZW50TWFwO1xuICAgICAgICB2YXIgZXZlbnRJbnN0YW5jZUhlaWdodHMgPSB7fTtcbiAgICAgICAgLy8gZ2V0IHRoZSBtYXggaGVpZ2h0IGFtb25nc3QgaW5zdGFuY2Ugc2Vnc1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2VnRWxNYXApIHtcbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSBNYXRoLnJvdW5kKHNlZ0VsTWFwW2tleV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KTtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZUlkID0ga2V5LnNwbGl0KCc6JylbMF07IC8vIGRlY29uc3RydWN0IGhvdyByZW5kZXJGZ1NlZ3MgbWFrZXMgdGhlIGtleVxuICAgICAgICAgICAgZXZlbnRJbnN0YW5jZUhlaWdodHNbaW5zdGFuY2VJZF0gPSBNYXRoLm1heChldmVudEluc3RhbmNlSGVpZ2h0c1tpbnN0YW5jZUlkXSB8fCAwLCBoZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBldmVudEluc3RhbmNlSGVpZ2h0cztcbiAgICB9O1xuICAgIFRhYmxlUm93LnByb3RvdHlwZS5jb21wdXRlTWF4Q29udGVudEhlaWdodCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGZpcnN0S2V5ID0gdGhpcy5wcm9wcy5jZWxsc1swXS5rZXk7XG4gICAgICAgIHZhciBjZWxsRWwgPSB0aGlzLmNlbGxFbFJlZnMuY3VycmVudE1hcFtmaXJzdEtleV07XG4gICAgICAgIHZhciBmY0NvbnRhaW5lckVsID0gdGhpcy5mZ0VsUmVmcy5jdXJyZW50TWFwW2ZpcnN0S2V5XTtcbiAgICAgICAgcmV0dXJuIGNlbGxFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gLSBmY0NvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICB9O1xuICAgIFRhYmxlUm93LnByb3RvdHlwZS5nZXRDZWxsRWxzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZWxNYXAgPSB0aGlzLmNlbGxFbFJlZnMuY3VycmVudE1hcDtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2VsbHMubWFwKGZ1bmN0aW9uIChjZWxsKSB7IHJldHVybiBlbE1hcFtjZWxsLmtleV07IH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFRhYmxlUm93O1xufShjb21tb24uRGF0ZUNvbXBvbmVudCkpO1xuVGFibGVSb3cuYWRkU3RhdGVFcXVhbGl0eSh7XG4gICAgZXZlbnRJbnN0YW5jZUhlaWdodHM6IGNvbW1vbi5pc1Byb3BzRXF1YWwsXG59KTtcbmZ1bmN0aW9uIGJ1aWxkTWlycm9yUGxhY2VtZW50cyhtaXJyb3JTZWdzLCBjb2xQbGFjZW1lbnRzKSB7XG4gICAgaWYgKCFtaXJyb3JTZWdzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHZhciB0b3BzQnlJbnN0YW5jZUlkID0gYnVpbGRBYnNvbHV0ZVRvcEhhc2goY29sUGxhY2VtZW50cyk7IC8vIFRPRE86IGNhY2hlIHRoaXMgYXQgZmlyc3QgcmVuZGVyP1xuICAgIHJldHVybiBtaXJyb3JTZWdzLm1hcChmdW5jdGlvbiAoc2VnKSB7IHJldHVybiAoe1xuICAgICAgICBzZWc6IHNlZyxcbiAgICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgICBpc0Fic29sdXRlOiB0cnVlLFxuICAgICAgICBhYnNvbHV0ZVRvcDogdG9wc0J5SW5zdGFuY2VJZFtzZWcuZXZlbnRSYW5nZS5pbnN0YW5jZS5pbnN0YW5jZUlkXSxcbiAgICAgICAgbWFyZ2luVG9wOiAwLFxuICAgIH0pOyB9KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkQWJzb2x1dGVUb3BIYXNoKGNvbFBsYWNlbWVudHMpIHtcbiAgICB2YXIgdG9wc0J5SW5zdGFuY2VJZCA9IHt9O1xuICAgIGZvciAodmFyIF9pID0gMCwgY29sUGxhY2VtZW50c18xID0gY29sUGxhY2VtZW50czsgX2kgPCBjb2xQbGFjZW1lbnRzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBwbGFjZW1lbnRzID0gY29sUGxhY2VtZW50c18xW19pXTtcbiAgICAgICAgZm9yICh2YXIgX2EgPSAwLCBwbGFjZW1lbnRzXzEgPSBwbGFjZW1lbnRzOyBfYSA8IHBsYWNlbWVudHNfMS5sZW5ndGg7IF9hKyspIHtcbiAgICAgICAgICAgIHZhciBwbGFjZW1lbnQgPSBwbGFjZW1lbnRzXzFbX2FdO1xuICAgICAgICAgICAgdG9wc0J5SW5zdGFuY2VJZFtwbGFjZW1lbnQuc2VnLmV2ZW50UmFuZ2UuaW5zdGFuY2UuaW5zdGFuY2VJZF0gPSBwbGFjZW1lbnQuYWJzb2x1dGVUb3A7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvcHNCeUluc3RhbmNlSWQ7XG59XG5cbnZhciBUYWJsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVGFibGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGFibGUoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zcGxpdEJ1c2luZXNzSG91clNlZ3MgPSBjb21tb24ubWVtb2l6ZShzcGxpdFNlZ3NCeVJvdyk7XG4gICAgICAgIF90aGlzLnNwbGl0QmdFdmVudFNlZ3MgPSBjb21tb24ubWVtb2l6ZShzcGxpdFNlZ3NCeVJvdyk7XG4gICAgICAgIF90aGlzLnNwbGl0RmdFdmVudFNlZ3MgPSBjb21tb24ubWVtb2l6ZShzcGxpdFNlZ3NCeVJvdyk7XG4gICAgICAgIF90aGlzLnNwbGl0RGF0ZVNlbGVjdGlvblNlZ3MgPSBjb21tb24ubWVtb2l6ZShzcGxpdFNlZ3NCeVJvdyk7XG4gICAgICAgIF90aGlzLnNwbGl0RXZlbnREcmFnID0gY29tbW9uLm1lbW9pemUoc3BsaXRJbnRlcmFjdGlvbkJ5Um93KTtcbiAgICAgICAgX3RoaXMuc3BsaXRFdmVudFJlc2l6ZSA9IGNvbW1vbi5tZW1vaXplKHNwbGl0SW50ZXJhY3Rpb25CeVJvdyk7XG4gICAgICAgIF90aGlzLnJvd1JlZnMgPSBuZXcgY29tbW9uLlJlZk1hcCgpO1xuICAgICAgICBfdGhpcy5oYW5kbGVSb290RWwgPSBmdW5jdGlvbiAocm9vdEVsKSB7XG4gICAgICAgICAgICBfdGhpcy5yb290RWwgPSByb290RWw7XG4gICAgICAgICAgICBpZiAocm9vdEVsKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY29udGV4dC5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50KF90aGlzLCB7XG4gICAgICAgICAgICAgICAgICAgIGVsOiByb290RWwsXG4gICAgICAgICAgICAgICAgICAgIGlzSGl0Q29tYm9BbGxvd2VkOiBfdGhpcy5wcm9wcy5pc0hpdENvbWJvQWxsb3dlZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIF90aGlzLmNvbnRleHQudW5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50KF90aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBUYWJsZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB2YXIgZGF0ZVByb2ZpbGUgPSBwcm9wcy5kYXRlUHJvZmlsZSwgZGF5TWF4RXZlbnRSb3dzID0gcHJvcHMuZGF5TWF4RXZlbnRSb3dzLCBkYXlNYXhFdmVudHMgPSBwcm9wcy5kYXlNYXhFdmVudHMsIGV4cGFuZFJvd3MgPSBwcm9wcy5leHBhbmRSb3dzO1xuICAgICAgICB2YXIgcm93Q250ID0gcHJvcHMuY2VsbHMubGVuZ3RoO1xuICAgICAgICB2YXIgYnVzaW5lc3NIb3VyU2Vnc0J5Um93ID0gdGhpcy5zcGxpdEJ1c2luZXNzSG91clNlZ3MocHJvcHMuYnVzaW5lc3NIb3VyU2Vncywgcm93Q250KTtcbiAgICAgICAgdmFyIGJnRXZlbnRTZWdzQnlSb3cgPSB0aGlzLnNwbGl0QmdFdmVudFNlZ3MocHJvcHMuYmdFdmVudFNlZ3MsIHJvd0NudCk7XG4gICAgICAgIHZhciBmZ0V2ZW50U2Vnc0J5Um93ID0gdGhpcy5zcGxpdEZnRXZlbnRTZWdzKHByb3BzLmZnRXZlbnRTZWdzLCByb3dDbnQpO1xuICAgICAgICB2YXIgZGF0ZVNlbGVjdGlvblNlZ3NCeVJvdyA9IHRoaXMuc3BsaXREYXRlU2VsZWN0aW9uU2Vncyhwcm9wcy5kYXRlU2VsZWN0aW9uU2Vncywgcm93Q250KTtcbiAgICAgICAgdmFyIGV2ZW50RHJhZ0J5Um93ID0gdGhpcy5zcGxpdEV2ZW50RHJhZyhwcm9wcy5ldmVudERyYWcsIHJvd0NudCk7XG4gICAgICAgIHZhciBldmVudFJlc2l6ZUJ5Um93ID0gdGhpcy5zcGxpdEV2ZW50UmVzaXplKHByb3BzLmV2ZW50UmVzaXplLCByb3dDbnQpO1xuICAgICAgICB2YXIgbGltaXRWaWFCYWxhbmNlZCA9IGRheU1heEV2ZW50cyA9PT0gdHJ1ZSB8fCBkYXlNYXhFdmVudFJvd3MgPT09IHRydWU7XG4gICAgICAgIC8vIGlmIHJvd3MgY2FuJ3QgZXhwYW5kIHRvIGZpbGwgZml4ZWQgaGVpZ2h0LCBjYW4ndCBkbyBiYWxhbmNlZC1oZWlnaHQgZXZlbnQgbGltaXRcbiAgICAgICAgLy8gVE9ETzogYmVzdCBwbGFjZSB0byBub3JtYWxpemUgdGhlc2Ugb3B0aW9ucz9cbiAgICAgICAgaWYgKGxpbWl0VmlhQmFsYW5jZWQgJiYgIWV4cGFuZFJvd3MpIHtcbiAgICAgICAgICAgIGxpbWl0VmlhQmFsYW5jZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGRheU1heEV2ZW50Um93cyA9IG51bGw7XG4gICAgICAgICAgICBkYXlNYXhFdmVudHMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjbGFzc05hbWVzID0gW1xuICAgICAgICAgICAgJ2ZjLWRheWdyaWQtYm9keScsXG4gICAgICAgICAgICBsaW1pdFZpYUJhbGFuY2VkID8gJ2ZjLWRheWdyaWQtYm9keS1iYWxhbmNlZCcgOiAnZmMtZGF5Z3JpZC1ib2R5LXVuYmFsYW5jZWQnLFxuICAgICAgICAgICAgZXhwYW5kUm93cyA/ICcnIDogJ2ZjLWRheWdyaWQtYm9keS1uYXR1cmFsJywgLy8gd2lsbCBoZWlnaHQgb2Ygb25lIHJvdyBkZXBlbmQgb24gdGhlIG90aGVycz9cbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKCcgJyksIHJlZjogdGhpcy5oYW5kbGVSb290RWwsIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgLy8gdGhlc2UgcHJvcHMgYXJlIGltcG9ydGFudCB0byBnaXZlIHRoaXMgd3JhcHBlciBjb3JyZWN0IGRpbWVuc2lvbnMgZm9yIGludGVyYWN0aW9uc1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGlmIHdlIHNldCBpdCBoZXJlLCBjYW4gd2UgYXZvaWQgZ2l2aW5nIHRvIGlubmVyIHRhYmxlcz9cbiAgICAgICAgICAgICAgICB3aWR0aDogcHJvcHMuY2xpZW50V2lkdGgsXG4gICAgICAgICAgICAgICAgbWluV2lkdGg6IHByb3BzLnRhYmxlTWluV2lkdGgsXG4gICAgICAgICAgICB9IH0sXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uTm93VGltZXIsIHsgdW5pdDogXCJkYXlcIiB9LCBmdW5jdGlvbiAobm93RGF0ZSwgdG9kYXlSYW5nZSkgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIHsgcm9sZTogXCJwcmVzZW50YXRpb25cIiwgY2xhc3NOYW1lOiBcImZjLXNjcm9sbGdyaWQtc3luYy10YWJsZVwiLCBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHByb3BzLmNsaWVudFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IHByb3BzLnRhYmxlTWluV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGV4cGFuZFJvd3MgPyBwcm9wcy5jbGllbnRIZWlnaHQgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgfSB9LFxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5jb2xHcm91cE5vZGUsXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGJvZHlcIiwgeyByb2xlOiBcInByZXNlbnRhdGlvblwiIH0sIHByb3BzLmNlbGxzLm1hcChmdW5jdGlvbiAoY2VsbHMsIHJvdykgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFRhYmxlUm93LCB7IHJlZjogX3RoaXMucm93UmVmcy5jcmVhdGVSZWYocm93KSwga2V5OiBjZWxscy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNlbGxzWzBdLmRhdGUudG9JU09TdHJpbmcoKSAvKiBiZXN0PyBvciBwdXQga2V5IG9uIGNlbGw/IG9yIHVzZSBkaWZmIGZvcm1hdHRlcj8gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJvdyAvLyBpbiBjYXNlIHRoZXJlIGFyZSBubyBjZWxscyAobGlrZSB3aGVuIHJlc291cmNlIHZpZXcgaXMgbG9hZGluZylcbiAgICAgICAgICAgICAgICAgICAgICAgICwgc2hvd0RheU51bWJlcnM6IHJvd0NudCA+IDEsIHNob3dXZWVrTnVtYmVyczogcHJvcHMuc2hvd1dlZWtOdW1iZXJzLCB0b2RheVJhbmdlOiB0b2RheVJhbmdlLCBkYXRlUHJvZmlsZTogZGF0ZVByb2ZpbGUsIGNlbGxzOiBjZWxscywgcmVuZGVySW50cm86IHByb3BzLnJlbmRlclJvd0ludHJvLCBidXNpbmVzc0hvdXJTZWdzOiBidXNpbmVzc0hvdXJTZWdzQnlSb3dbcm93XSwgZXZlbnRTZWxlY3Rpb246IHByb3BzLmV2ZW50U2VsZWN0aW9uLCBiZ0V2ZW50U2VnczogYmdFdmVudFNlZ3NCeVJvd1tyb3ddLmZpbHRlcihpc1NlZ0FsbERheSkgLyogaGFjayAqLywgZmdFdmVudFNlZ3M6IGZnRXZlbnRTZWdzQnlSb3dbcm93XSwgZGF0ZVNlbGVjdGlvblNlZ3M6IGRhdGVTZWxlY3Rpb25TZWdzQnlSb3dbcm93XSwgZXZlbnREcmFnOiBldmVudERyYWdCeVJvd1tyb3ddLCBldmVudFJlc2l6ZTogZXZlbnRSZXNpemVCeVJvd1tyb3ddLCBkYXlNYXhFdmVudHM6IGRheU1heEV2ZW50cywgZGF5TWF4RXZlbnRSb3dzOiBkYXlNYXhFdmVudFJvd3MsIGNsaWVudFdpZHRoOiBwcm9wcy5jbGllbnRXaWR0aCwgY2xpZW50SGVpZ2h0OiBwcm9wcy5jbGllbnRIZWlnaHQsIGZvclByaW50OiBwcm9wcy5mb3JQcmludCB9KSk7IH0pKSkpKTsgfSkpKTtcbiAgICB9O1xuICAgIC8vIEhpdCBTeXN0ZW1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgVGFibGUucHJvdG90eXBlLnByZXBhcmVIaXRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJvd1Bvc2l0aW9ucyA9IG5ldyBjb21tb24uUG9zaXRpb25DYWNoZSh0aGlzLnJvb3RFbCwgdGhpcy5yb3dSZWZzLmNvbGxlY3QoKS5tYXAoZnVuY3Rpb24gKHJvd09iaikgeyByZXR1cm4gcm93T2JqLmdldENlbGxFbHMoKVswXTsgfSksIC8vIGZpcnN0IGNlbGwgZWwgaW4gZWFjaCByb3cuIFRPRE86IG5vdCBvcHRpbWFsXG4gICAgICAgIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgdGhpcy5jb2xQb3NpdGlvbnMgPSBuZXcgY29tbW9uLlBvc2l0aW9uQ2FjaGUodGhpcy5yb290RWwsIHRoaXMucm93UmVmcy5jdXJyZW50TWFwWzBdLmdldENlbGxFbHMoKSwgLy8gY2VsbCBlbHMgaW4gZmlyc3Qgcm93XG4gICAgICAgIHRydWUsIC8vIGhvcml6b250YWxcbiAgICAgICAgZmFsc2UpO1xuICAgIH07XG4gICAgVGFibGUucHJvdG90eXBlLnF1ZXJ5SGl0ID0gZnVuY3Rpb24gKHBvc2l0aW9uTGVmdCwgcG9zaXRpb25Ub3ApIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgY29sUG9zaXRpb25zID0gX2EuY29sUG9zaXRpb25zLCByb3dQb3NpdGlvbnMgPSBfYS5yb3dQb3NpdGlvbnM7XG4gICAgICAgIHZhciBjb2wgPSBjb2xQb3NpdGlvbnMubGVmdFRvSW5kZXgocG9zaXRpb25MZWZ0KTtcbiAgICAgICAgdmFyIHJvdyA9IHJvd1Bvc2l0aW9ucy50b3BUb0luZGV4KHBvc2l0aW9uVG9wKTtcbiAgICAgICAgaWYgKHJvdyAhPSBudWxsICYmIGNvbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgY2VsbCA9IHRoaXMucHJvcHMuY2VsbHNbcm93XVtjb2xdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRlUHJvZmlsZTogdGhpcy5wcm9wcy5kYXRlUHJvZmlsZSxcbiAgICAgICAgICAgICAgICBkYXRlU3BhbjogdHNsaWIuX19hc3NpZ24oeyByYW5nZTogdGhpcy5nZXRDZWxsUmFuZ2Uocm93LCBjb2wpLCBhbGxEYXk6IHRydWUgfSwgY2VsbC5leHRyYURhdGVTcGFuKSxcbiAgICAgICAgICAgICAgICBkYXlFbDogdGhpcy5nZXRDZWxsRWwocm93LCBjb2wpLFxuICAgICAgICAgICAgICAgIHJlY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogY29sUG9zaXRpb25zLmxlZnRzW2NvbF0sXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBjb2xQb3NpdGlvbnMucmlnaHRzW2NvbF0sXG4gICAgICAgICAgICAgICAgICAgIHRvcDogcm93UG9zaXRpb25zLnRvcHNbcm93XSxcbiAgICAgICAgICAgICAgICAgICAgYm90dG9tOiByb3dQb3NpdGlvbnMuYm90dG9tc1tyb3ddLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbGF5ZXI6IDAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgVGFibGUucHJvdG90eXBlLmdldENlbGxFbCA9IGZ1bmN0aW9uIChyb3csIGNvbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dSZWZzLmN1cnJlbnRNYXBbcm93XS5nZXRDZWxsRWxzKClbY29sXTsgLy8gVE9ETzogbm90IG9wdGltYWxcbiAgICB9O1xuICAgIFRhYmxlLnByb3RvdHlwZS5nZXRDZWxsUmFuZ2UgPSBmdW5jdGlvbiAocm93LCBjb2wpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5wcm9wcy5jZWxsc1tyb3ddW2NvbF0uZGF0ZTtcbiAgICAgICAgdmFyIGVuZCA9IGNvbW1vbi5hZGREYXlzKHN0YXJ0LCAxKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9O1xuICAgIH07XG4gICAgcmV0dXJuIFRhYmxlO1xufShjb21tb24uRGF0ZUNvbXBvbmVudCkpO1xuZnVuY3Rpb24gaXNTZWdBbGxEYXkoc2VnKSB7XG4gICAgcmV0dXJuIHNlZy5ldmVudFJhbmdlLmRlZi5hbGxEYXk7XG59XG5cbnZhciBEYXlUYWJsZVNsaWNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRGF5VGFibGVTbGljZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRGF5VGFibGVTbGljZXIoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5mb3JjZURheUlmTGlzdEl0ZW0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIERheVRhYmxlU2xpY2VyLnByb3RvdHlwZS5zbGljZVJhbmdlID0gZnVuY3Rpb24gKGRhdGVSYW5nZSwgZGF5VGFibGVNb2RlbCkge1xuICAgICAgICByZXR1cm4gZGF5VGFibGVNb2RlbC5zbGljZVJhbmdlKGRhdGVSYW5nZSk7XG4gICAgfTtcbiAgICByZXR1cm4gRGF5VGFibGVTbGljZXI7XG59KGNvbW1vbi5TbGljZXIpKTtcblxudmFyIERheVRhYmxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhEYXlUYWJsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEYXlUYWJsZSgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnNsaWNlciA9IG5ldyBEYXlUYWJsZVNsaWNlcigpO1xuICAgICAgICBfdGhpcy50YWJsZVJlZiA9IGNvbW1vbi5jcmVhdGVSZWYoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBEYXlUYWJsZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBwcm9wcyA9IF9hLnByb3BzLCBjb250ZXh0ID0gX2EuY29udGV4dDtcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChUYWJsZSwgdHNsaWIuX19hc3NpZ24oeyByZWY6IHRoaXMudGFibGVSZWYgfSwgdGhpcy5zbGljZXIuc2xpY2VQcm9wcyhwcm9wcywgcHJvcHMuZGF0ZVByb2ZpbGUsIHByb3BzLm5leHREYXlUaHJlc2hvbGQsIGNvbnRleHQsIHByb3BzLmRheVRhYmxlTW9kZWwpLCB7IGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgY2VsbHM6IHByb3BzLmRheVRhYmxlTW9kZWwuY2VsbHMsIGNvbEdyb3VwTm9kZTogcHJvcHMuY29sR3JvdXBOb2RlLCB0YWJsZU1pbldpZHRoOiBwcm9wcy50YWJsZU1pbldpZHRoLCByZW5kZXJSb3dJbnRybzogcHJvcHMucmVuZGVyUm93SW50cm8sIGRheU1heEV2ZW50czogcHJvcHMuZGF5TWF4RXZlbnRzLCBkYXlNYXhFdmVudFJvd3M6IHByb3BzLmRheU1heEV2ZW50Um93cywgc2hvd1dlZWtOdW1iZXJzOiBwcm9wcy5zaG93V2Vla051bWJlcnMsIGV4cGFuZFJvd3M6IHByb3BzLmV4cGFuZFJvd3MsIGhlYWRlckFsaWduRWxSZWY6IHByb3BzLmhlYWRlckFsaWduRWxSZWYsIGNsaWVudFdpZHRoOiBwcm9wcy5jbGllbnRXaWR0aCwgY2xpZW50SGVpZ2h0OiBwcm9wcy5jbGllbnRIZWlnaHQsIGZvclByaW50OiBwcm9wcy5mb3JQcmludCB9KSkpO1xuICAgIH07XG4gICAgcmV0dXJuIERheVRhYmxlO1xufShjb21tb24uRGF0ZUNvbXBvbmVudCkpO1xuXG52YXIgRGF5VGFibGVWaWV3ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhEYXlUYWJsZVZpZXcsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRGF5VGFibGVWaWV3KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuYnVpbGREYXlUYWJsZU1vZGVsID0gY29tbW9uLm1lbW9pemUoYnVpbGREYXlUYWJsZU1vZGVsKTtcbiAgICAgICAgX3RoaXMuaGVhZGVyUmVmID0gY29tbW9uLmNyZWF0ZVJlZigpO1xuICAgICAgICBfdGhpcy50YWJsZVJlZiA9IGNvbW1vbi5jcmVhdGVSZWYoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBEYXlUYWJsZVZpZXcucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9hID0gdGhpcy5jb250ZXh0LCBvcHRpb25zID0gX2Eub3B0aW9ucywgZGF0ZVByb2ZpbGVHZW5lcmF0b3IgPSBfYS5kYXRlUHJvZmlsZUdlbmVyYXRvcjtcbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdmFyIGRheVRhYmxlTW9kZWwgPSB0aGlzLmJ1aWxkRGF5VGFibGVNb2RlbChwcm9wcy5kYXRlUHJvZmlsZSwgZGF0ZVByb2ZpbGVHZW5lcmF0b3IpO1xuICAgICAgICB2YXIgaGVhZGVyQ29udGVudCA9IG9wdGlvbnMuZGF5SGVhZGVycyAmJiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkRheUhlYWRlciwgeyByZWY6IHRoaXMuaGVhZGVyUmVmLCBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsIGRhdGVzOiBkYXlUYWJsZU1vZGVsLmhlYWRlckRhdGVzLCBkYXRlc1JlcERpc3RpbmN0RGF5czogZGF5VGFibGVNb2RlbC5yb3dDbnQgPT09IDEgfSkpO1xuICAgICAgICB2YXIgYm9keUNvbnRlbnQgPSBmdW5jdGlvbiAoY29udGVudEFyZykgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KERheVRhYmxlLCB7IHJlZjogX3RoaXMudGFibGVSZWYsIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgZGF5VGFibGVNb2RlbDogZGF5VGFibGVNb2RlbCwgYnVzaW5lc3NIb3VyczogcHJvcHMuYnVzaW5lc3NIb3VycywgZGF0ZVNlbGVjdGlvbjogcHJvcHMuZGF0ZVNlbGVjdGlvbiwgZXZlbnRTdG9yZTogcHJvcHMuZXZlbnRTdG9yZSwgZXZlbnRVaUJhc2VzOiBwcm9wcy5ldmVudFVpQmFzZXMsIGV2ZW50U2VsZWN0aW9uOiBwcm9wcy5ldmVudFNlbGVjdGlvbiwgZXZlbnREcmFnOiBwcm9wcy5ldmVudERyYWcsIGV2ZW50UmVzaXplOiBwcm9wcy5ldmVudFJlc2l6ZSwgbmV4dERheVRocmVzaG9sZDogb3B0aW9ucy5uZXh0RGF5VGhyZXNob2xkLCBjb2xHcm91cE5vZGU6IGNvbnRlbnRBcmcudGFibGVDb2xHcm91cE5vZGUsIHRhYmxlTWluV2lkdGg6IGNvbnRlbnRBcmcudGFibGVNaW5XaWR0aCwgZGF5TWF4RXZlbnRzOiBvcHRpb25zLmRheU1heEV2ZW50cywgZGF5TWF4RXZlbnRSb3dzOiBvcHRpb25zLmRheU1heEV2ZW50Um93cywgc2hvd1dlZWtOdW1iZXJzOiBvcHRpb25zLndlZWtOdW1iZXJzLCBleHBhbmRSb3dzOiAhcHJvcHMuaXNIZWlnaHRBdXRvLCBoZWFkZXJBbGlnbkVsUmVmOiBfdGhpcy5oZWFkZXJFbFJlZiwgY2xpZW50V2lkdGg6IGNvbnRlbnRBcmcuY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodDogY29udGVudEFyZy5jbGllbnRIZWlnaHQsIGZvclByaW50OiBwcm9wcy5mb3JQcmludCB9KSk7IH07XG4gICAgICAgIHJldHVybiBvcHRpb25zLmRheU1pbldpZHRoXG4gICAgICAgICAgICA/IHRoaXMucmVuZGVySFNjcm9sbExheW91dChoZWFkZXJDb250ZW50LCBib2R5Q29udGVudCwgZGF5VGFibGVNb2RlbC5jb2xDbnQsIG9wdGlvbnMuZGF5TWluV2lkdGgpXG4gICAgICAgICAgICA6IHRoaXMucmVuZGVyU2ltcGxlTGF5b3V0KGhlYWRlckNvbnRlbnQsIGJvZHlDb250ZW50KTtcbiAgICB9O1xuICAgIHJldHVybiBEYXlUYWJsZVZpZXc7XG59KFRhYmxlVmlldykpO1xuZnVuY3Rpb24gYnVpbGREYXlUYWJsZU1vZGVsKGRhdGVQcm9maWxlLCBkYXRlUHJvZmlsZUdlbmVyYXRvcikge1xuICAgIHZhciBkYXlTZXJpZXMgPSBuZXcgY29tbW9uLkRheVNlcmllc01vZGVsKGRhdGVQcm9maWxlLnJlbmRlclJhbmdlLCBkYXRlUHJvZmlsZUdlbmVyYXRvcik7XG4gICAgcmV0dXJuIG5ldyBjb21tb24uRGF5VGFibGVNb2RlbChkYXlTZXJpZXMsIC95ZWFyfG1vbnRofHdlZWsvLnRlc3QoZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlVW5pdCkpO1xufVxuXG52YXIgVGFibGVEYXRlUHJvZmlsZUdlbmVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoVGFibGVEYXRlUHJvZmlsZUdlbmVyYXRvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUYWJsZURhdGVQcm9maWxlR2VuZXJhdG9yKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIC8vIENvbXB1dGVzIHRoZSBkYXRlIHJhbmdlIHRoYXQgd2lsbCBiZSByZW5kZXJlZC5cbiAgICBUYWJsZURhdGVQcm9maWxlR2VuZXJhdG9yLnByb3RvdHlwZS5idWlsZFJlbmRlclJhbmdlID0gZnVuY3Rpb24gKGN1cnJlbnRSYW5nZSwgY3VycmVudFJhbmdlVW5pdCwgaXNSYW5nZUFsbERheSkge1xuICAgICAgICB2YXIgZGF0ZUVudiA9IHRoaXMucHJvcHMuZGF0ZUVudjtcbiAgICAgICAgdmFyIHJlbmRlclJhbmdlID0gX3N1cGVyLnByb3RvdHlwZS5idWlsZFJlbmRlclJhbmdlLmNhbGwodGhpcywgY3VycmVudFJhbmdlLCBjdXJyZW50UmFuZ2VVbml0LCBpc1JhbmdlQWxsRGF5KTtcbiAgICAgICAgdmFyIHN0YXJ0ID0gcmVuZGVyUmFuZ2Uuc3RhcnQ7XG4gICAgICAgIHZhciBlbmQgPSByZW5kZXJSYW5nZS5lbmQ7XG4gICAgICAgIHZhciBlbmRPZldlZWs7XG4gICAgICAgIC8vIHllYXIgYW5kIG1vbnRoIHZpZXdzIHNob3VsZCBiZSBhbGlnbmVkIHdpdGggd2Vla3MuIHRoaXMgaXMgYWxyZWFkeSBkb25lIGZvciB3ZWVrXG4gICAgICAgIGlmICgvXih5ZWFyfG1vbnRoKSQvLnRlc3QoY3VycmVudFJhbmdlVW5pdCkpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gZGF0ZUVudi5zdGFydE9mV2VlayhzdGFydCk7XG4gICAgICAgICAgICAvLyBtYWtlIGVuZC1vZi13ZWVrIGlmIG5vdCBhbHJlYWR5XG4gICAgICAgICAgICBlbmRPZldlZWsgPSBkYXRlRW52LnN0YXJ0T2ZXZWVrKGVuZCk7XG4gICAgICAgICAgICBpZiAoZW5kT2ZXZWVrLnZhbHVlT2YoKSAhPT0gZW5kLnZhbHVlT2YoKSkge1xuICAgICAgICAgICAgICAgIGVuZCA9IGNvbW1vbi5hZGRXZWVrcyhlbmRPZldlZWssIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGVuc3VyZSA2IHdlZWtzXG4gICAgICAgIGlmICh0aGlzLnByb3BzLm1vbnRoTW9kZSAmJlxuICAgICAgICAgICAgdGhpcy5wcm9wcy5maXhlZFdlZWtDb3VudCkge1xuICAgICAgICAgICAgdmFyIHJvd0NudCA9IE1hdGguY2VpbCgvLyBjb3VsZCBiZSBwYXJ0aWFsIHdlZWtzIGR1ZSB0byBoaWRkZW5EYXlzXG4gICAgICAgICAgICBjb21tb24uZGlmZldlZWtzKHN0YXJ0LCBlbmQpKTtcbiAgICAgICAgICAgIGVuZCA9IGNvbW1vbi5hZGRXZWVrcyhlbmQsIDYgLSByb3dDbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfTtcbiAgICB9O1xuICAgIHJldHVybiBUYWJsZURhdGVQcm9maWxlR2VuZXJhdG9yO1xufShjb21tb24uRGF0ZVByb2ZpbGVHZW5lcmF0b3IpKTtcblxudmFyIG1haW4gPSBjb21tb24uY3JlYXRlUGx1Z2luKHtcbiAgICBpbml0aWFsVmlldzogJ2RheUdyaWRNb250aCcsXG4gICAgdmlld3M6IHtcbiAgICAgICAgZGF5R3JpZDoge1xuICAgICAgICAgICAgY29tcG9uZW50OiBEYXlUYWJsZVZpZXcsXG4gICAgICAgICAgICBkYXRlUHJvZmlsZUdlbmVyYXRvckNsYXNzOiBUYWJsZURhdGVQcm9maWxlR2VuZXJhdG9yLFxuICAgICAgICB9LFxuICAgICAgICBkYXlHcmlkRGF5OiB7XG4gICAgICAgICAgICB0eXBlOiAnZGF5R3JpZCcsXG4gICAgICAgICAgICBkdXJhdGlvbjogeyBkYXlzOiAxIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGRheUdyaWRXZWVrOiB7XG4gICAgICAgICAgICB0eXBlOiAnZGF5R3JpZCcsXG4gICAgICAgICAgICBkdXJhdGlvbjogeyB3ZWVrczogMSB9LFxuICAgICAgICB9LFxuICAgICAgICBkYXlHcmlkTW9udGg6IHtcbiAgICAgICAgICAgIHR5cGU6ICdkYXlHcmlkJyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB7IG1vbnRoczogMSB9LFxuICAgICAgICAgICAgbW9udGhNb2RlOiB0cnVlLFxuICAgICAgICAgICAgZml4ZWRXZWVrQ291bnQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbn0pO1xuXG5leHBvcnRzLkRheUdyaWRWaWV3ID0gRGF5VGFibGVWaWV3O1xuZXhwb3J0cy5EYXlUYWJsZSA9IERheVRhYmxlO1xuZXhwb3J0cy5EYXlUYWJsZVNsaWNlciA9IERheVRhYmxlU2xpY2VyO1xuZXhwb3J0cy5UYWJsZSA9IFRhYmxlO1xuZXhwb3J0cy5UYWJsZVZpZXcgPSBUYWJsZVZpZXc7XG5leHBvcnRzLmJ1aWxkRGF5VGFibGVNb2RlbCA9IGJ1aWxkRGF5VGFibGVNb2RlbDtcbmV4cG9ydHMuZGVmYXVsdCA9IG1haW47XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQUEsTUFBTSxDQUFDQyxjQUFQLENBQXNCQyxPQUF0QixFQUErQixZQUEvQixFQUE2QztFQUFFQyxLQUFLLEVBQUU7QUFBVCxDQUE3Qzs7QUFFQSxJQUFJQyxNQUFNLEdBQUdDLE9BQU8sQ0FBQyxzQkFBRCxDQUFwQjs7QUFDQSxJQUFJQyxLQUFLLEdBQUdELE9BQU8sQ0FBQyxPQUFELENBQW5COztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsSUFBSUUsU0FBUztBQUFHO0FBQWUsVUFBVUMsTUFBVixFQUFrQjtFQUM3Q0YsS0FBSyxDQUFDRyxTQUFOLENBQWdCRixTQUFoQixFQUEyQkMsTUFBM0I7O0VBQ0EsU0FBU0QsU0FBVCxHQUFxQjtJQUNqQixJQUFJRyxLQUFLLEdBQUdGLE1BQU0sS0FBSyxJQUFYLElBQW1CQSxNQUFNLENBQUNHLEtBQVAsQ0FBYSxJQUFiLEVBQW1C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 },{"@fullcalendar/common":1,"tslib":32}],6:[function(require,module,exports){ /*! FullCalendar v5.11.2 Docs & License: https://fullcalendar.io/ (c) 2022 Adam Shaw */ 'use strict'; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } Object.defineProperty(exports, '__esModule', { value: true }); var common = require('@fullcalendar/common'); var tslib = require('tslib'); common.config.touchMouseIgnoreWait = 500; var ignoreMouseDepth = 0; var listenerCnt = 0; var isWindowTouchMoveCancelled = false; /* Uses a "pointer" abstraction, which monitors UI events for both mouse and touch. Tracks when the pointer "drags" on a certain element, meaning down+move+up. Also, tracks if there was touch-scrolling. Also, can prevent touch-scrolling from happening. Also, can fire pointermove events when scrolling happens underneath, even when no real pointer movement. emits: - pointerdown - pointermove - pointerup */ var PointerDragging = /** @class */ function () { function PointerDragging(containerEl) { var _this = this; this.subjectEl = null; // options that can be directly assigned by caller this.selector = ''; // will cause subjectEl in all emitted events to be this element this.handleSelector = ''; this.shouldIgnoreMove = false; this.shouldWatchScroll = true; // for simulating pointermove on scroll // internal states this.isDragging = false; this.isTouchDragging = false; this.wasTouchScroll = false; // Mouse // ---------------------------------------------------------------------------------------------------- this.handleMouseDown = function (ev) { if (!_this.shouldIgnoreMouse() && isPrimaryMouseButton(ev) && _this.tryStart(ev)) { var pev = _this.createEventFromMouse(ev, true); _this.emitter.trigger('pointerdown', pev); _this.initScrollWatch(pev); if (!_this.shouldIgnoreMove) { document.addEventListener('mousemove', _this.handleMouseMove); } document.addEventListener('mouseup', _this.handleMouseUp); } }; this.handleMouseMove = function (ev) { var pev = _this.createEventFromMouse(ev); _this.recordCoords(pev); _this.emitter.trigger('pointermove', pev); }; this.handleMouseUp = function (ev) { document.removeEventListener('mousemove', _this.handleMouseMove); document.removeEventListener('mouseup', _this.handleMouseUp); _this.emitter.trigger('pointerup', _this.createEventFromMouse(ev)); _this.cleanup(); // call last so that pointerup has access to props }; // Touch // ---------------------------------------------------------------------------------------------------- this.handleTouchStart = function (ev) { if (_this.tryStart(ev)) { _this.isTouchDragging = true; var pev = _this.createEventFromTouch(ev, true); _this.emitter.trigger('pointerdown', pev); _this.initScrollWatch(pev); // unlike mouse, need to attach to target, not document // https://stackoverflow.com/a/45760014 var targetEl = ev.target; if (!_this.shouldIgnoreMove) { targetEl.addEventListener('touchmove', _this.handleTouchMove); } targetEl.addEventListener('touchend', _this.handleTouchEnd); targetEl.addEventListener('touchcancel', _this.handleTouchEnd); // treat it as a touch end // attach a handler to get called when ANY scroll action happens on the page. // this was impossible to do with normal on/off because 'scroll' doesn't bubble. // http://stackoverflow.com/a/32954565/96342 window.addEventListener('scroll', _this.handleTouchScroll, true); } }; this.handleTouchMove = function (ev) { var pev = _this.createEventFromTouch(ev); _this.recordCoords(pev); _this.emitter.trigger('pointermove', pev); }; this.handleTouchEnd = function (ev) { if (_this.isDragging) { // done to guard against touchend followed by touchcancel var targetEl = ev.target; targetEl.removeEventListener('touchmove', _this.handleTouchMove); targetEl.removeEventListener('touchend', _this.handleTouchEnd); targetEl.removeEventListener('touchcancel', _this.handleTouchEnd); window.removeEventListener('scroll', _this.handleTouchScroll, true); // useCaptured=true _this.emitter.trigger('pointerup', _this.createEventFromTouch(ev)); _this.cleanup(); // call last so that pointerup has access to props _this.isTouchDragging = false; startIgnoringMouse(); } }; this.handleTouchScroll = function () { _this.wasTouchScroll = true; }; this.handleScroll = function (ev) { if (!_this.shouldIgnoreMove) { var pageX = window.pageXOffset - _this.prevScrollX + _this.prevPageX; var pageY = window.pageYOffset - _this.prevScrollY + _this.prevPageY; _this.emitter.trigger('pointermove', { origEvent: ev, isTouch: _this.isTouchDragging, subjectEl: _this.subjectEl, pageX: pageX, pageY: pageY, deltaX: pageX - _this.origPageX, deltaY: pageY - _this.origPageY }); } }; this.containerEl = containerEl; this.emitter = new common.Emitter(); containerEl.addEventListener('mousedown', this.handleMouseDown); containerEl.addEventListener('touchstart', this.handleTouchStart, { passive: true }); listenerCreated(); } PointerDragging.prototype.destroy = function () { this.containerEl.removeEventListener('mousedown', this.handleMouseDown); this.containerEl.removeEventListener('touchstart', this.handleTouchStart, { passive: true }); listenerDestroyed(); }; PointerDragging.prototype.tryStart = function (ev) { var subjectEl = this.querySubjectEl(ev); var downEl = ev.target; if (subjectEl && (!this.handleSelector || common.elementClosest(downEl, this.handleSelector))) { this.subjectEl = subjectEl; this.isDragging = true; // do this first so cancelTouchScroll will work this.wasTouchScroll = false; return true; } return false; }; PointerDragging.prototype.cleanup = function () { isWindowTouchMoveCancelled = false; this.isDragging = false; this.subjectEl = null; // keep wasTouchScroll around for later access this.destroyScrollWatch(); }; PointerDragging.prototype.querySubjectEl = function (ev) { if (this.selector) { return common.elementClosest(ev.target, this.selector); } return this.containerEl; }; PointerDragging.prototype.shouldIgnoreMouse = function () { return ignoreMouseDepth || this.isTouchDragging; }; // can be called by user of this class, to cancel touch-based scrolling for the current drag PointerDragging.prototype.cancelTouchScroll = function () { if (this.isDragging) { isWindowTouchMoveCancelled = true; } }; // Scrolling that simulates pointermoves // ---------------------------------------------------------------------------------------------------- PointerDragging.prototype.initScrollWatch = function (ev) { if (this.shouldWatchScroll) { this.recordCoords(ev); window.addEventListener('scroll', this.handleScroll, true); // useCapture=true } }; PointerDragging.prototype.recordCoords = function (ev) { if (this.shouldWatchScroll) { this.prevPageX = ev.pageX; this.prevPageY = ev.pageY; this.prevScrollX = window.pageXOffset; this.prevScrollY = window.pageYOffset; } }; PointerDragging.prototype.destroyScrollWatch = function () { if (this.shouldWatchScroll) { window.removeEventListener('scroll', this.handleScroll, true); // useCaptured=true } }; // Event Normalization // ---------------------------------------------------------------------------------------------------- PointerDragging.prototype.createEventFromMouse = function (ev, isFirst) { var deltaX = 0; var deltaY = 0; // TODO: repeat code if (isFirst) { this.origPageX = ev.pageX; this.origPageY = ev.pageY; } else { deltaX = ev.pageX - this.origPageX; deltaY = ev.pageY - this.origPageY; } return { origEvent: ev, isTouch: false, subjectEl: this.subjectEl, pageX: ev.pageX, pageY: ev.pageY, deltaX: deltaX, deltaY: deltaY }; }; PointerDragging.prototype.createEventFromTouch = function (ev, isFirst) { var touches = ev.touches; var pageX; var pageY; var deltaX = 0; var deltaY = 0; // if touch coords available, prefer, // because FF would give bad ev.pageX ev.pageY if (touches && touches.length) { pageX = touches[0].pageX; pageY = touches[0].pageY; } else { pageX = ev.pageX; pageY = ev.pageY; } // TODO: repeat code if (isFirst) { this.origPageX = pageX; this.origPageY = pageY; } else { deltaX = pageX - this.origPageX; deltaY = pageY - this.origPageY; } return { origEvent: ev, isTouch: true, subjectEl: this.subjectEl, pageX: pageX, pageY: pageY, deltaX: deltaX, deltaY: deltaY }; }; return PointerDragging; }(); // Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac) function isPrimaryMouseButton(ev) { return ev.button === 0 && !ev.ctrlKey; } // Ignoring fake mouse events generated by touch // ---------------------------------------------------------------------------------------------------- function startIgnoringMouse() { ignoreMouseDepth += 1; setTimeout(function () { ignoreMouseDepth -= 1; }, common.config.touchMouseIgnoreWait); } // We want to attach touchmove as early as possible for Safari // ---------------------------------------------------------------------------------------------------- function listenerCreated() { listenerCnt += 1; if (listenerCnt === 1) { window.addEventListener('touchmove', onWindowTouchMove, { passive: false }); } } function listenerDestroyed() { listenerCnt -= 1; if (!listenerCnt) { window.removeEventListener('touchmove', onWindowTouchMove, { passive: false }); } } function onWindowTouchMove(ev) { if (isWindowTouchMoveCancelled) { ev.preventDefault(); } } /* An effect in which an element follows the movement of a pointer across the screen. The moving element is a clone of some other element. Must call start + handleMove + stop. */ var ElementMirror = /** @class */ function () { function ElementMirror() { this.isVisible = false; // must be explicitly enabled this.sourceEl = null; this.mirrorEl = null; this.sourceElRect = null; // screen coords relative to viewport // options that can be set directly by caller this.parentNode = document.body; // HIGHLY SUGGESTED to set this to sidestep ShadowDOM issues this.zIndex = 9999; this.revertDuration = 0; } ElementMirror.prototype.start = function (sourceEl, pageX, pageY) { this.sourceEl = sourceEl; this.sourceElRect = this.sourceEl.getBoundingClientRect(); this.origScreenX = pageX - window.pageXOffset; this.origScreenY = pageY - window.pageYOffset; this.deltaX = 0; this.deltaY = 0; this.updateElPosition(); }; ElementMirror.prototype.handleMove = function (pageX, pageY) { this.deltaX = pageX - window.pageXOffset - this.origScreenX; this.deltaY = pageY - window.pageYOffset - this.origScreenY; this.updateElPosition(); }; // can be called before start ElementMirror.prototype.setIsVisible = function (bool) { if (bool) { if (!this.isVisible) { if (this.mirrorEl) { this.mirrorEl.style.display = ''; } this.isVisible = bool; // needs to happen before updateElPosition this.updateElPosition(); // because was not updating the position while invisible } } else if (this.isVisible) { if (this.mirrorEl) { this.mirrorEl.style.display = 'none'; } this.isVisible = bool; } }; // always async ElementMirror.prototype.stop = function (needsRevertAnimation, callback) { var _this = this; var done = function done() { _this.cleanup(); callback(); }; if (needsRevertAnimation && this.mirrorEl && this.isVisible && this.revertDuration && ( // if 0, transition won't work this.deltaX || this.deltaY) // if same coords, transition won't work ) { this.doRevertAnimation(done, this.revertDuration); } else { setTimeout(done, 0); } }; ElementMirror.prototype.doRevertAnimation = function (callback, revertDuration) { var mirrorEl = this.mirrorEl; var finalSourceElRect = this.sourceEl.getBoundingClientRect(); // because autoscrolling might have happened mirrorEl.style.transition = 'top ' + revertDuration + 'ms,' + 'left ' + revertDuration + 'ms'; common.applyStyle(mirrorEl, { left: finalSourceElRect.left, top: finalSourceElRect.top }); common.whenTransitionDone(mirrorEl, function () { mirrorEl.style.transition = ''; callback(); }); }; ElementMirror.prototype.cleanup = function () { if (this.mirrorEl) { common.removeElement(this.mirrorEl); this.mirrorEl = null; } this.sourceEl = null; }; ElementMirror.prototype.updateElPosition = function () { if (this.sourceEl && this.isVisible) { common.applyStyle(this.getMirrorEl(), { left: this.sourceElRect.left + this.deltaX, top: this.sourceElRect.top + this.deltaY }); } }; ElementMirror.prototype.getMirrorEl = function () { var sourceElRect = this.sourceElRect; var mirrorEl = this.mirrorEl; if (!mirrorEl) { mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true); // cloneChildren=true // we don't want long taps or any mouse interaction causing selection/menus. // would use preventSelection(), but that prevents selectstart, causing problems. mirrorEl.classList.add('fc-unselectable'); mirrorEl.classList.add('fc-event-dragging'); common.applyStyle(mirrorEl, { position: 'fixed', zIndex: this.zIndex, visibility: '', boxSizing: 'border-box', width: sourceElRect.right - sourceElRect.left, height: sourceElRect.bottom - sourceElRect.top, right: 'auto', bottom: 'auto', margin: 0 }); this.parentNode.appendChild(mirrorEl); } return mirrorEl; }; return ElementMirror; }(); /* Is a cache for a given element's scroll information (all the info that ScrollController stores) in addition the "client rectangle" of the element.. the area within the scrollbars. The cache can be in one of two modes: - doesListening:false - ignores when the container is scrolled by someone else - doesListening:true - watch for scrolling and update the cache */ var ScrollGeomCache = /** @class */ function (_super) { tslib.__extends(ScrollGeomCache, _super); function ScrollGeomCache(scrollController, doesListening) { var _this = _super.call(this) || this; _this.handleScroll = function () { _this.scrollTop = _this.scrollController.getScrollTop(); _this.scrollLeft = _this.scrollController.getScrollLeft(); _this.handleScrollChange(); }; _this.scrollController = scrollController; _this.doesListening = doesListening; _this.scrollTop = _this.origScrollTop = scrollController.getScrollTop(); _this.scrollLeft = _this.origScrollLeft = scrollController.getScrollLeft(); _this.scrollWidth = scrollController.getScrollWidth(); _this.scrollHeight = scrollController.getScrollHeight(); _this.clientWidth = scrollController.getClientWidth(); _this.clientHeight = scrollController.getClientHeight(); _this.clientRect = _this.computeClientRect(); // do last in case it needs cached values if (_this.doesListening) { _this.getEventTarget().addEventListener('scroll', _this.handleScroll); } return _this; } ScrollGeomCache.prototype.destroy = function () { if (this.doesListening) { this.getEventTarget().removeEventListener('scroll', this.handleScroll); } }; ScrollGeomCache.prototype.getScrollTop = function () { return this.scrollTop; }; ScrollGeomCache.prototype.getScrollLeft = function () { return this.scrollLeft; }; ScrollGeomCache.prototype.setScrollTop = function (top) { this.scrollController.setScrollTop(top); if (!this.doesListening) { // we are not relying on the element to normalize out-of-bounds scroll values // so we need to sanitize ourselves this.scrollTop = Math.max(Math.min(top, this.getMaxScrollTop()), 0); this.handleScrollChange(); } }; ScrollGeomCache.prototype.setScrollLeft = function (top) { this.scrollController.setScrollLeft(top); if (!this.doesListening) { // we are not relying on the element to normalize out-of-bounds scroll values // so we need to sanitize ourselves this.scrollLeft = Math.max(Math.min(top, this.getMaxScrollLeft()), 0); this.handleScrollChange(); } }; ScrollGeomCache.prototype.getClientWidth = function () { return this.clientWidth; }; ScrollGeomCache.prototype.getClientHeight = function () { return this.clientHeight; }; ScrollGeomCache.prototype.getScrollWidth = function () { return this.scrollWidth; }; ScrollGeomCache.prototype.getScrollHeight = function () { return this.scrollHeight; }; ScrollGeomCache.prototype.handleScrollChange = function () {}; return ScrollGeomCache; }(common.ScrollController); var ElementScrollGeomCache = /** @class */ function (_super) { tslib.__extends(ElementScrollGeomCache, _super); function ElementScrollGeomCache(el, doesListening) { return _super.call(this, new common.ElementScrollController(el), doesListening) || this; } ElementScrollGeomCache.prototype.getEventTarget = function () { return this.scrollController.el; }; ElementScrollGeomCache.prototype.computeClientRect = function () { return common.computeInnerRect(this.scrollController.el); }; return ElementScrollGeomCache; }(ScrollGeomCache); var WindowScrollGeomCache = /** @class */ function (_super) { tslib.__extends(WindowScrollGeomCache, _super); function WindowScrollGeomCache(doesListening) { return _super.call(this, new common.WindowScrollController(), doesListening) || this; } WindowScrollGeomCache.prototype.getEventTarget = function () { return window; }; WindowScrollGeomCache.prototype.computeClientRect = function () { return { left: this.scrollLeft, right: this.scrollLeft + this.clientWidth, top: this.scrollTop, bottom: this.scrollTop + this.clientHeight }; }; // the window is the only scroll object that changes it's rectangle relative // to the document's topleft as it scrolls WindowScrollGeomCache.prototype.handleScrollChange = function () { this.clientRect = this.computeClientRect(); }; return WindowScrollGeomCache; }(ScrollGeomCache); // If available we are using native "performance" API instead of "Date" // Read more about it on MDN: // https://developer.mozilla.org/en-US/docs/Web/API/Performance var getTime = typeof performance === 'function' ? performance.now : Date.now; /* For a pointer interaction, automatically scrolls certain scroll containers when the pointer approaches the edge. The caller must call start + handleMove + stop. */ var AutoScroller = /** @class */ function () { function AutoScroller() { var _this = this; // options that can be set by caller this.isEnabled = true; this.scrollQuery = [window, '.fc-scroller']; this.edgeThreshold = 50; // pixels this.maxVelocity = 300; // pixels per second // internal state this.pointerScreenX = null; this.pointerScreenY = null; this.isAnimating = false; this.scrollCaches = null; // protect against the initial pointerdown being too close to an edge and starting the scroll this.everMovedUp = false; this.everMovedDown = false; this.everMovedLeft = false; this.everMovedRight = false; this.animate = function () { if (_this.isAnimating) { // wasn't cancelled between animation calls var edge = _this.computeBestEdge(_this.pointerScreenX + window.pageXOffset, _this.pointerScreenY + window.pageYOffset); if (edge) { var now = getTime(); _this.handleSide(edge, (now - _this.msSinceRequest) / 1000); _this.requestAnimation(now); } else { _this.isAnimating = false; // will stop animation } } }; } AutoScroller.prototype.start = function (pageX, pageY, scrollStartEl) { if (this.isEnabled) { this.scrollCaches = this.buildCaches(scrollStartEl); this.pointerScreenX = null; this.pointerScreenY = null; this.everMovedUp = false; this.everMovedDown = false; this.everMovedLeft = false; this.everMovedRight = false; this.handleMove(pageX, pageY); } }; AutoScroller.prototype.handleMove = function (pageX, pageY) { if (this.isEnabled) { var pointerScreenX = pageX - window.pageXOffset; var pointerScreenY = pageY - window.pageYOffset; var yDelta = this.pointerScreenY === null ? 0 : pointerScreenY - this.pointerScreenY; var xDelta = this.pointerScreenX === null ? 0 : pointerScreenX - this.pointerScreenX; if (yDelta < 0) { this.everMovedUp = true; } else if (yDelta > 0) { this.everMovedDown = true; } if (xDelta < 0) { this.everMovedLeft = true; } else if (xDelta > 0) { this.everMovedRight = true; } this.pointerScreenX = pointerScreenX; this.pointerScreenY = pointerScreenY; if (!this.isAnimating) { this.isAnimating = true; this.requestAnimation(getTime()); } } }; AutoScroller.prototype.stop = function () { if (this.isEnabled) { this.isAnimating = false; // will stop animation for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { var scrollCache = _a[_i]; scrollCache.destroy(); } this.scrollCaches = null; } }; AutoScroller.prototype.requestAnimation = function (now) { this.msSinceRequest = now; requestAnimationFrame(this.animate); }; AutoScroller.prototype.handleSide = function (edge, seconds) { var scrollCache = edge.scrollCache; var edgeThreshold = this.edgeThreshold; var invDistance = edgeThreshold - edge.distance; var velocity = // the closer to the edge, the faster we scroll invDistance * invDistance / (edgeThreshold * edgeThreshold) * // quadratic this.maxVelocity * seconds; var sign = 1; switch (edge.name) { case 'left': sign = -1; // falls through case 'right': scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign); break; case 'top': sign = -1; // falls through case 'bottom': scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign); break; } }; // left/top are relative to document topleft AutoScroller.prototype.computeBestEdge = function (left, top) { var edgeThreshold = this.edgeThreshold; var bestSide = null; var scrollCaches = this.scrollCaches || []; for (var _i = 0, scrollCaches_1 = scrollCaches; _i < scrollCaches_1.length; _i++) { var scrollCache = scrollCaches_1[_i]; var rect = scrollCache.clientRect; var leftDist = left - rect.left; var rightDist = rect.right - left; var topDist = top - rect.top; var bottomDist = rect.bottom - top; // completely within the rect? if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) { if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() && (!bestSide || bestSide.distance > topDist)) { bestSide = { scrollCache: scrollCache, name: 'top', distance: topDist }; } if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() && (!bestSide || bestSide.distance > bottomDist)) { bestSide = { scrollCache: scrollCache, name: 'bottom', distance: bottomDist }; } if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() && (!bestSide || bestSide.distance > leftDist)) { bestSide = { scrollCache: scrollCache, name: 'left', distance: leftDist }; } if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() && (!bestSide || bestSide.distance > rightDist)) { bestSide = { scrollCache: scrollCache, name: 'right', distance: rightDist }; } } } return bestSide; }; AutoScroller.prototype.buildCaches = function (scrollStartEl) { return this.queryScrollEls(scrollStartEl).map(function (el) { if (el === window) { return new WindowScrollGeomCache(false); // false = don't listen to user-generated scrolls } return new ElementScrollGeomCache(el, false); // false = don't listen to user-generated scrolls }); }; AutoScroller.prototype.queryScrollEls = function (scrollStartEl) { var els = []; for (var _i = 0, _a = this.scrollQuery; _i < _a.length; _i++) { var query = _a[_i]; if (_typeof(query) === 'object') { els.push(query); } else { els.push.apply(els, Array.prototype.slice.call(common.getElRoot(scrollStartEl).querySelectorAll(query))); } } return els; }; return AutoScroller; }(); /* Monitors dragging on an element. Has a number of high-level features: - minimum distance required before dragging - minimum wait time ("delay") before dragging - a mirror element that follows the pointer */ var FeaturefulElementDragging = /** @class */ function (_super) { tslib.__extends(FeaturefulElementDragging, _super); function FeaturefulElementDragging(containerEl, selector) { var _this = _super.call(this, containerEl) || this; _this.containerEl = containerEl; // options that can be directly set by caller // the caller can also set the PointerDragging's options as well _this.delay = null; _this.minDistance = 0; _this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag _this.mirrorNeedsRevert = false; _this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup _this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation _this.isDelayEnded = false; _this.isDistanceSurpassed = false; _this.delayTimeoutId = null; _this.onPointerDown = function (ev) { if (!_this.isDragging) { // so new drag doesn't happen while revert animation is going _this.isInteracting = true; _this.isDelayEnded = false; _this.isDistanceSurpassed = false; common.preventSelection(document.body); common.preventContextMenu(document.body); // prevent links from being visited if there's an eventual drag. // also prevents selection in older browsers (maybe?). // not necessary for touch, besides, browser would complain about passiveness. if (!ev.isTouch) { ev.origEvent.preventDefault(); } _this.emitter.trigger('pointerdown', ev); if (_this.isInteracting && // not destroyed via pointerdown handler !_this.pointer.shouldIgnoreMove) { // actions related to initiating dragstart+dragmove+dragend... _this.mirror.setIsVisible(false); // reset. caller must set-visible _this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down _this.startDelay(ev); if (!_this.minDistance) { _this.handleDistanceSurpassed(ev); } } } }; _this.onPointerMove = function (ev) { if (_this.isInteracting) { _this.emitter.trigger('pointermove', ev); if (!_this.isDistanceSurpassed) { var minDistance = _this.minDistance; var distanceSq = void 0; // current distance from the origin, squared var deltaX = ev.deltaX, deltaY = ev.deltaY; distanceSq = deltaX * deltaX + deltaY * deltaY; if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem _this.handleDistanceSurpassed(ev); } } if (_this.isDragging) { // a real pointer move? (not one simulated by scrolling) if (ev.origEvent.type !== 'scroll') { _this.mirror.handleMove(ev.pageX, ev.pageY); _this.autoScroller.handleMove(ev.pageX, ev.pageY); } _this.emitter.trigger('dragmove', ev); } } }; _this.onPointerUp = function (ev) { if (_this.isInteracting) { _this.isInteracting = false; common.allowSelection(document.body); common.allowContextMenu(document.body); _this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert if (_this.isDragging) { _this.autoScroller.stop(); _this.tryStopDrag(ev); // which will stop the mirror } if (_this.delayTimeoutId) { clearTimeout(_this.delayTimeoutId); _this.delayTimeoutId = null; } } }; var pointer = _this.pointer = new PointerDragging(containerEl); pointer.emitter.on('pointerdown', _this.onPointerDown); pointer.emitter.on('pointermove', _this.onPointerMove); pointer.emitter.on('pointerup', _this.onPointerUp); if (selector) { pointer.selector = selector; } _this.mirror = new ElementMirror(); _this.autoScroller = new AutoScroller(); return _this; } FeaturefulElementDragging.prototype.destroy = function () { this.pointer.destroy(); // HACK: simulate a pointer-up to end the current drag // TODO: fire 'dragend' directly and stop interaction. discourage use of pointerup event (b/c might not fire) this.onPointerUp({}); }; FeaturefulElementDragging.prototype.startDelay = function (ev) { var _this = this; if (typeof this.delay === 'number') { this.delayTimeoutId = setTimeout(function () { _this.delayTimeoutId = null; _this.handleDelayEnd(ev); }, this.delay); // not assignable to number! } else { this.handleDelayEnd(ev); } }; FeaturefulElementDragging.prototype.handleDelayEnd = function (ev) { this.isDelayEnded = true; this.tryStartDrag(ev); }; FeaturefulElementDragging.prototype.handleDistanceSurpassed = function (ev) { this.isDistanceSurpassed = true; this.tryStartDrag(ev); }; FeaturefulElementDragging.prototype.tryStartDrag = function (ev) { if (this.isDelayEnded && this.isDistanceSurpassed) { if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) { this.isDragging = true; this.mirrorNeedsRevert = false; this.autoScroller.start(ev.pageX, ev.pageY, this.containerEl); this.emitter.trigger('dragstart', ev); if (this.touchScrollAllowed === false) { this.pointer.cancelTouchScroll(); } } } }; FeaturefulElementDragging.prototype.tryStopDrag = function (ev) { // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events // that come from the document to fire beforehand. much more convenient this way. this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev)); }; FeaturefulElementDragging.prototype.stopDrag = function (ev) { this.isDragging = false; this.emitter.trigger('dragend', ev); }; // fill in the implementations... FeaturefulElementDragging.prototype.setIgnoreMove = function (bool) { this.pointer.shouldIgnoreMove = bool; }; FeaturefulElementDragging.prototype.setMirrorIsVisible = function (bool) { this.mirror.setIsVisible(bool); }; FeaturefulElementDragging.prototype.setMirrorNeedsRevert = function (bool) { this.mirrorNeedsRevert = bool; }; FeaturefulElementDragging.prototype.setAutoScrollEnabled = function (bool) { this.autoScroller.isEnabled = bool; }; return FeaturefulElementDragging; }(common.ElementDragging); /* When this class is instantiated, it records the offset of an element (relative to the document topleft), and continues to monitor scrolling, updating the cached coordinates if it needs to. Does not access the DOM after instantiation, so highly performant. Also keeps track of all scrolling/overflow:hidden containers that are parents of the given element and an determine if a given point is inside the combined clipping rectangle. */ var OffsetTracker = /** @class */ function () { function OffsetTracker(el) { this.origRect = common.computeRect(el); // will work fine for divs that have overflow:hidden this.scrollCaches = common.getClippingParents(el).map(function (scrollEl) { return new ElementScrollGeomCache(scrollEl, true); }); } OffsetTracker.prototype.destroy = function () { for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { var scrollCache = _a[_i]; scrollCache.destroy(); } }; OffsetTracker.prototype.computeLeft = function () { var left = this.origRect.left; for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { var scrollCache = _a[_i]; left += scrollCache.origScrollLeft - scrollCache.getScrollLeft(); } return left; }; OffsetTracker.prototype.computeTop = function () { var top = this.origRect.top; for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { var scrollCache = _a[_i]; top += scrollCache.origScrollTop - scrollCache.getScrollTop(); } return top; }; OffsetTracker.prototype.isWithinClipping = function (pageX, pageY) { var point = { left: pageX, top: pageY }; for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { var scrollCache = _a[_i]; if (!isIgnoredClipping(scrollCache.getEventTarget()) && !common.pointInsideRect(point, scrollCache.clientRect)) { return false; } } return true; }; return OffsetTracker; }(); // certain clipping containers should never constrain interactions, like and // https://github.com/fullcalendar/fullcalendar/issues/3615 function isIgnoredClipping(node) { var tagName = node.tagName; return tagName === 'HTML' || tagName === 'BODY'; } /* Tracks movement over multiple droppable areas (aka "hits") that exist in one or more DateComponents. Relies on an existing draggable. emits: - pointerdown - dragstart - hitchange - fires initially, even if not over a hit - pointerup - (hitchange - again, to null, if ended over a hit) - dragend */ var HitDragging = /** @class */ function () { function HitDragging(dragging, droppableStore) { var _this = this; // options that can be set by caller this.useSubjectCenter = false; this.requireInitial = true; // if doesn't start out on a hit, won't emit any events this.initialHit = null; this.movingHit = null; this.finalHit = null; // won't ever be populated if shouldIgnoreMove this.handlePointerDown = function (ev) { var dragging = _this.dragging; _this.initialHit = null; _this.movingHit = null; _this.finalHit = null; _this.prepareHits(); _this.processFirstCoord(ev); if (_this.initialHit || !_this.requireInitial) { dragging.setIgnoreMove(false); // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :( _this.emitter.trigger('pointerdown', ev); } else { dragging.setIgnoreMove(true); } }; this.handleDragStart = function (ev) { _this.emitter.trigger('dragstart', ev); _this.handleMove(ev, true); // force = fire even if initially null }; this.handleDragMove = function (ev) { _this.emitter.trigger('dragmove', ev); _this.handleMove(ev); }; this.handlePointerUp = function (ev) { _this.releaseHits(); _this.emitter.trigger('pointerup', ev); }; this.handleDragEnd = function (ev) { if (_this.movingHit) { _this.emitter.trigger('hitupdate', null, true, ev); } _this.finalHit = _this.movingHit; _this.movingHit = null; _this.emitter.trigger('dragend', ev); }; this.droppableStore = droppableStore; dragging.emitter.on('pointerdown', this.handlePointerDown); dragging.emitter.on('dragstart', this.handleDragStart); dragging.emitter.on('dragmove', this.handleDragMove); dragging.emitter.on('pointerup', this.handlePointerUp); dragging.emitter.on('dragend', this.handleDragEnd); this.dragging = dragging; this.emitter = new common.Emitter(); } // sets initialHit // sets coordAdjust HitDragging.prototype.processFirstCoord = function (ev) { var origPoint = { left: ev.pageX, top: ev.pageY }; var adjustedPoint = origPoint; var subjectEl = ev.subjectEl; var subjectRect; if (subjectEl instanceof HTMLElement) { // i.e. not a Document/ShadowRoot subjectRect = common.computeRect(subjectEl); adjustedPoint = common.constrainPoint(adjustedPoint, subjectRect); } var initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top); if (initialHit) { if (this.useSubjectCenter && subjectRect) { var slicedSubjectRect = common.intersectRects(subjectRect, initialHit.rect); if (slicedSubjectRect) { adjustedPoint = common.getRectCenter(slicedSubjectRect); } } this.coordAdjust = common.diffPoints(adjustedPoint, origPoint); } else { this.coordAdjust = { left: 0, top: 0 }; } }; HitDragging.prototype.handleMove = function (ev, forceHandle) { var hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top); if (forceHandle || !isHitsEqual(this.movingHit, hit)) { this.movingHit = hit; this.emitter.trigger('hitupdate', hit, false, ev); } }; HitDragging.prototype.prepareHits = function () { this.offsetTrackers = common.mapHash(this.droppableStore, function (interactionSettings) { interactionSettings.component.prepareHits(); return new OffsetTracker(interactionSettings.el); }); }; HitDragging.prototype.releaseHits = function () { var offsetTrackers = this.offsetTrackers; for (var id in offsetTrackers) { offsetTrackers[id].destroy(); } this.offsetTrackers = {}; }; HitDragging.prototype.queryHitForOffset = function (offsetLeft, offsetTop) { var _a = this, droppableStore = _a.droppableStore, offsetTrackers = _a.offsetTrackers; var bestHit = null; for (var id in droppableStore) { var component = droppableStore[id].component; var offsetTracker = offsetTrackers[id]; if (offsetTracker && // wasn't destroyed mid-drag offsetTracker.isWithinClipping(offsetLeft, offsetTop)) { var originLeft = offsetTracker.computeLeft(); var originTop = offsetTracker.computeTop(); var positionLeft = offsetLeft - originLeft; var positionTop = offsetTop - originTop; var origRect = offsetTracker.origRect; var width = origRect.right - origRect.left; var height = origRect.bottom - origRect.top; if ( // must be within the element's bounds positionLeft >= 0 && positionLeft < width && positionTop >= 0 && positionTop < height) { var hit = component.queryHit(positionLeft, positionTop, width, height); if (hit && // make sure the hit is within activeRange, meaning it's not a dead cell common.rangeContainsRange(hit.dateProfile.activeRange, hit.dateSpan.range) && (!bestHit || hit.layer > bestHit.layer)) { hit.componentId = id; hit.context = component.context; // TODO: better way to re-orient rectangle hit.rect.left += originLeft; hit.rect.right += originLeft; hit.rect.top += originTop; hit.rect.bottom += originTop; bestHit = hit; } } } } return bestHit; }; return HitDragging; }(); function isHitsEqual(hit0, hit1) { if (!hit0 && !hit1) { return true; } if (Boolean(hit0) !== Boolean(hit1)) { return false; } return common.isDateSpansEqual(hit0.dateSpan, hit1.dateSpan); } function buildDatePointApiWithContext(dateSpan, context) { var props = {}; for (var _i = 0, _a = context.pluginHooks.datePointTransforms; _i < _a.length; _i++) { var transform = _a[_i]; tslib.__assign(props, transform(dateSpan, context)); } tslib.__assign(props, buildDatePointApi(dateSpan, context.dateEnv)); return props; } function buildDatePointApi(span, dateEnv) { return { date: dateEnv.toDate(span.range.start), dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }), allDay: span.allDay }; } /* Monitors when the user clicks on a specific date/time of a component. A pointerdown+pointerup on the same "hit" constitutes a click. */ var DateClicking = /** @class */ function (_super) { tslib.__extends(DateClicking, _super); function DateClicking(settings) { var _this = _super.call(this, settings) || this; _this.handlePointerDown = function (pev) { var dragging = _this.dragging; var downEl = pev.origEvent.target; // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired dragging.setIgnoreMove(!_this.component.isValidDateDownEl(downEl)); }; // won't even fire if moving was ignored _this.handleDragEnd = function (ev) { var component = _this.component; var pointer = _this.dragging.pointer; if (!pointer.wasTouchScroll) { var _a = _this.hitDragging, initialHit = _a.initialHit, finalHit = _a.finalHit; if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) { var context = component.context; var arg = tslib.__assign(tslib.__assign({}, buildDatePointApiWithContext(initialHit.dateSpan, context)), { dayEl: initialHit.dayEl, jsEvent: ev.origEvent, view: context.viewApi || context.calendarApi.view }); context.emitter.trigger('dateClick', arg); } } }; // we DO want to watch pointer moves because otherwise finalHit won't get populated _this.dragging = new FeaturefulElementDragging(settings.el); _this.dragging.autoScroller.isEnabled = false; var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, common.interactionSettingsToStore(settings)); hitDragging.emitter.on('pointerdown', _this.handlePointerDown); hitDragging.emitter.on('dragend', _this.handleDragEnd); return _this; } DateClicking.prototype.destroy = function () { this.dragging.destroy(); }; return DateClicking; }(common.Interaction); /* Tracks when the user selects a portion of time of a component, constituted by a drag over date cells, with a possible delay at the beginning of the drag. */ var DateSelecting = /** @class */ function (_super) { tslib.__extends(DateSelecting, _super); function DateSelecting(settings) { var _this = _super.call(this, settings) || this; _this.dragSelection = null; _this.handlePointerDown = function (ev) { var _a = _this, component = _a.component, dragging = _a.dragging; var options = component.context.options; var canSelect = options.selectable && component.isValidDateDownEl(ev.origEvent.target); // don't bother to watch expensive moves if component won't do selection dragging.setIgnoreMove(!canSelect); // if touch, require user to hold down dragging.delay = ev.isTouch ? getComponentTouchDelay$1(component) : null; }; _this.handleDragStart = function (ev) { _this.component.context.calendarApi.unselect(ev); // unselect previous selections }; _this.handleHitUpdate = function (hit, isFinal) { var context = _this.component.context; var dragSelection = null; var isInvalid = false; if (hit) { var initialHit = _this.hitDragging.initialHit; var disallowed = hit.componentId === initialHit.componentId && _this.isHitComboAllowed && !_this.isHitComboAllowed(initialHit, hit); if (!disallowed) { dragSelection = joinHitsIntoSelection(initialHit, hit, context.pluginHooks.dateSelectionTransformers); } if (!dragSelection || !common.isDateSelectionValid(dragSelection, hit.dateProfile, context)) { isInvalid = true; dragSelection = null; } } if (dragSelection) { context.dispatch({ type: 'SELECT_DATES', selection: dragSelection }); } else if (!isFinal) { // only unselect if moved away while dragging context.dispatch({ type: 'UNSELECT_DATES' }); } if (!isInvalid) { common.enableCursor(); } else { common.disableCursor(); } if (!isFinal) { _this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging } }; _this.handlePointerUp = function (pev) { if (_this.dragSelection) { // selection is already rendered, so just need to report selection common.triggerDateSelect(_this.dragSelection, pev, _this.component.context); _this.dragSelection = null; } }; var component = settings.component; var options = component.context.options; var dragging = _this.dragging = new FeaturefulElementDragging(settings.el); dragging.touchScrollAllowed = false; dragging.minDistance = options.selectMinDistance || 0; dragging.autoScroller.isEnabled = options.dragScroll; var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, common.interactionSettingsToStore(settings)); hitDragging.emitter.on('pointerdown', _this.handlePointerDown); hitDragging.emitter.on('dragstart', _this.handleDragStart); hitDragging.emitter.on('hitupdate', _this.handleHitUpdate); hitDragging.emitter.on('pointerup', _this.handlePointerUp); return _this; } DateSelecting.prototype.destroy = function () { this.dragging.destroy(); }; return DateSelecting; }(common.Interaction); function getComponentTouchDelay$1(component) { var options = component.context.options; var delay = options.selectLongPressDelay; if (delay == null) { delay = options.longPressDelay; } return delay; } function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) { var dateSpan0 = hit0.dateSpan; var dateSpan1 = hit1.dateSpan; var ms = [dateSpan0.range.start, dateSpan0.range.end, dateSpan1.range.start, dateSpan1.range.end]; ms.sort(common.compareNumbers); var props = {}; for (var _i = 0, dateSelectionTransformers_1 = dateSelectionTransformers; _i < dateSelectionTransformers_1.length; _i++) { var transformer = dateSelectionTransformers_1[_i]; var res = transformer(hit0, hit1); if (res === false) { return null; } if (res) { tslib.__assign(props, res); } } props.range = { start: ms[0], end: ms[3] }; props.allDay = dateSpan0.allDay; return props; } var EventDragging = /** @class */ function (_super) { tslib.__extends(EventDragging, _super); function EventDragging(settings) { var _this = _super.call(this, settings) || this; // internal state _this.subjectEl = null; _this.subjectSeg = null; // the seg being selected/dragged _this.isDragging = false; _this.eventRange = null; _this.relevantEvents = null; // the events being dragged _this.receivingContext = null; _this.validMutation = null; _this.mutatedRelevantEvents = null; _this.handlePointerDown = function (ev) { var origTarget = ev.origEvent.target; var _a = _this, component = _a.component, dragging = _a.dragging; var mirror = dragging.mirror; var options = component.context.options; var initialContext = component.context; _this.subjectEl = ev.subjectEl; var subjectSeg = _this.subjectSeg = common.getElSeg(ev.subjectEl); var eventRange = _this.eventRange = subjectSeg.eventRange; var eventInstanceId = eventRange.instance.instanceId; _this.relevantEvents = common.getRelevantEvents(initialContext.getCurrentData().eventStore, eventInstanceId); dragging.minDistance = ev.isTouch ? 0 : options.eventDragMinDistance; dragging.delay = // only do a touch delay if touch and this event hasn't been selected yet ev.isTouch && eventInstanceId !== component.props.eventSelection ? getComponentTouchDelay(component) : null; if (options.fixedMirrorParent) { mirror.parentNode = options.fixedMirrorParent; } else { mirror.parentNode = common.elementClosest(origTarget, '.fc'); } mirror.revertDuration = options.dragRevertDuration; var isValid = component.isValidSegDownEl(origTarget) && !common.elementClosest(origTarget, '.fc-event-resizer'); // NOT on a resizer dragging.setIgnoreMove(!isValid); // disable dragging for elements that are resizable (ie, selectable) // but are not draggable _this.isDragging = isValid && ev.subjectEl.classList.contains('fc-event-draggable'); }; _this.handleDragStart = function (ev) { var initialContext = _this.component.context; var eventRange = _this.eventRange; var eventInstanceId = eventRange.instance.instanceId; if (ev.isTouch) { // need to select a different event? if (eventInstanceId !== _this.component.props.eventSelection) { initialContext.dispatch({ type: 'SELECT_EVENT', eventInstanceId: eventInstanceId }); } } else { // if now using mouse, but was previous touch interaction, clear selected event initialContext.dispatch({ type: 'UNSELECT_EVENT' }); } if (_this.isDragging) { initialContext.calendarApi.unselect(ev); // unselect *date* selection initialContext.emitter.trigger('eventDragStart', { el: _this.subjectEl, event: new common.EventApi(initialContext, eventRange.def, eventRange.instance), jsEvent: ev.origEvent, view: initialContext.viewApi }); } }; _this.handleHitUpdate = function (hit, isFinal) { if (!_this.isDragging) { return; } var relevantEvents = _this.relevantEvents; var initialHit = _this.hitDragging.initialHit; var initialContext = _this.component.context; // states based on new hit var receivingContext = null; var mutation = null; var mutatedRelevantEvents = null; var isInvalid = false; var interaction = { affectedEvents: relevantEvents, mutatedEvents: common.createEmptyEventStore(), isEvent: true }; if (hit) { receivingContext = hit.context; var receivingOptions = receivingContext.options; if (initialContext === receivingContext || receivingOptions.editable && receivingOptions.droppable) { mutation = computeEventMutation(initialHit, hit, receivingContext.getCurrentData().pluginHooks.eventDragMutationMassagers); if (mutation) { mutatedRelevantEvents = common.applyMutationToEventStore(relevantEvents, receivingContext.getCurrentData().eventUiBases, mutation, receivingContext); interaction.mutatedEvents = mutatedRelevantEvents; if (!common.isInteractionValid(interaction, hit.dateProfile, receivingContext)) { isInvalid = true; mutation = null; mutatedRelevantEvents = null; interaction.mutatedEvents = common.createEmptyEventStore(); } } } else { receivingContext = null; } } _this.displayDrag(receivingContext, interaction); if (!isInvalid) { common.enableCursor(); } else { common.disableCursor(); } if (!isFinal) { if (initialContext === receivingContext && // TODO: write test for this isHitsEqual(initialHit, hit)) { mutation = null; } _this.dragging.setMirrorNeedsRevert(!mutation); // render the mirror if no already-rendered mirror // TODO: wish we could somehow wait for dispatch to guarantee render _this.dragging.setMirrorIsVisible(!hit || !common.getElRoot(_this.subjectEl).querySelector('.fc-event-mirror')); // assign states based on new hit _this.receivingContext = receivingContext; _this.validMutation = mutation; _this.mutatedRelevantEvents = mutatedRelevantEvents; } }; _this.handlePointerUp = function () { if (!_this.isDragging) { _this.cleanup(); // because handleDragEnd won't fire } }; _this.handleDragEnd = function (ev) { if (_this.isDragging) { var initialContext_1 = _this.component.context; var initialView = initialContext_1.viewApi; var _a = _this, receivingContext_1 = _a.receivingContext, validMutation = _a.validMutation; var eventDef = _this.eventRange.def; var eventInstance = _this.eventRange.instance; var eventApi = new common.EventApi(initialContext_1, eventDef, eventInstance); var relevantEvents_1 = _this.relevantEvents; var mutatedRelevantEvents_1 = _this.mutatedRelevantEvents; var finalHit = _this.hitDragging.finalHit; _this.clearDrag(); // must happen after revert animation initialContext_1.emitter.trigger('eventDragStop', { el: _this.subjectEl, event: eventApi, jsEvent: ev.origEvent, view: initialView }); if (validMutation) { // dropped within same calendar if (receivingContext_1 === initialContext_1) { var updatedEventApi = new common.EventApi(initialContext_1, mutatedRelevantEvents_1.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents_1.instances[eventInstance.instanceId] : null); initialContext_1.dispatch({ type: 'MERGE_EVENTS', eventStore: mutatedRelevantEvents_1 }); var eventChangeArg = { oldEvent: eventApi, event: updatedEventApi, relatedEvents: common.buildEventApis(mutatedRelevantEvents_1, initialContext_1, eventInstance), revert: function revert() { initialContext_1.dispatch({ type: 'MERGE_EVENTS', eventStore: relevantEvents_1 // the pre-change data }); } }; var transformed = {}; for (var _i = 0, _b = initialContext_1.getCurrentData().pluginHooks.eventDropTransformers; _i < _b.length; _i++) { var transformer = _b[_i]; tslib.__assign(transformed, transformer(validMutation, initialContext_1)); } initialContext_1.emitter.trigger('eventDrop', tslib.__assign(tslib.__assign(tslib.__assign({}, eventChangeArg), transformed), { el: ev.subjectEl, delta: validMutation.datesDelta, jsEvent: ev.origEvent, view: initialView })); initialContext_1.emitter.trigger('eventChange', eventChangeArg); // dropped in different calendar } else if (receivingContext_1) { var eventRemoveArg = { event: eventApi, relatedEvents: common.buildEventApis(relevantEvents_1, initialContext_1, eventInstance), revert: function revert() { initialContext_1.dispatch({ type: 'MERGE_EVENTS', eventStore: relevantEvents_1 }); } }; initialContext_1.emitter.trigger('eventLeave', tslib.__assign(tslib.__assign({}, eventRemoveArg), { draggedEl: ev.subjectEl, view: initialView })); initialContext_1.dispatch({ type: 'REMOVE_EVENTS', eventStore: relevantEvents_1 }); initialContext_1.emitter.trigger('eventRemove', eventRemoveArg); var addedEventDef = mutatedRelevantEvents_1.defs[eventDef.defId]; var addedEventInstance = mutatedRelevantEvents_1.instances[eventInstance.instanceId]; var addedEventApi = new common.EventApi(receivingContext_1, addedEventDef, addedEventInstance); receivingContext_1.dispatch({ type: 'MERGE_EVENTS', eventStore: mutatedRelevantEvents_1 }); var eventAddArg = { event: addedEventApi, relatedEvents: common.buildEventApis(mutatedRelevantEvents_1, receivingContext_1, addedEventInstance), revert: function revert() { receivingContext_1.dispatch({ type: 'REMOVE_EVENTS', eventStore: mutatedRelevantEvents_1 }); } }; receivingContext_1.emitter.trigger('eventAdd', eventAddArg); if (ev.isTouch) { receivingContext_1.dispatch({ type: 'SELECT_EVENT', eventInstanceId: eventInstance.instanceId }); } receivingContext_1.emitter.trigger('drop', tslib.__assign(tslib.__assign({}, buildDatePointApiWithContext(finalHit.dateSpan, receivingContext_1)), { draggedEl: ev.subjectEl, jsEvent: ev.origEvent, view: finalHit.context.viewApi })); receivingContext_1.emitter.trigger('eventReceive', tslib.__assign(tslib.__assign({}, eventAddArg), { draggedEl: ev.subjectEl, view: finalHit.context.viewApi })); } } else { initialContext_1.emitter.trigger('_noEventDrop'); } } _this.cleanup(); }; var component = _this.component; var options = component.context.options; var dragging = _this.dragging = new FeaturefulElementDragging(settings.el); dragging.pointer.selector = EventDragging.SELECTOR; dragging.touchScrollAllowed = false; dragging.autoScroller.isEnabled = options.dragScroll; var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, common.interactionSettingsStore); hitDragging.useSubjectCenter = settings.useEventCenter; hitDragging.emitter.on('pointerdown', _this.handlePointerDown); hitDragging.emitter.on('dragstart', _this.handleDragStart); hitDragging.emitter.on('hitupdate', _this.handleHitUpdate); hitDragging.emitter.on('pointerup', _this.handlePointerUp); hitDragging.emitter.on('dragend', _this.handleDragEnd); return _this; } EventDragging.prototype.destroy = function () { this.dragging.destroy(); }; // render a drag state on the next receivingCalendar EventDragging.prototype.displayDrag = function (nextContext, state) { var initialContext = this.component.context; var prevContext = this.receivingContext; // does the previous calendar need to be cleared? if (prevContext && prevContext !== nextContext) { // does the initial calendar need to be cleared? // if so, don't clear all the way. we still need to to hide the affectedEvents if (prevContext === initialContext) { prevContext.dispatch({ type: 'SET_EVENT_DRAG', state: { affectedEvents: state.affectedEvents, mutatedEvents: common.createEmptyEventStore(), isEvent: true } }); // completely clear the old calendar if it wasn't the initial } else { prevContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); } } if (nextContext) { nextContext.dispatch({ type: 'SET_EVENT_DRAG', state: state }); } }; EventDragging.prototype.clearDrag = function () { var initialCalendar = this.component.context; var receivingContext = this.receivingContext; if (receivingContext) { receivingContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); } // the initial calendar might have an dummy drag state from displayDrag if (initialCalendar !== receivingContext) { initialCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' }); } }; EventDragging.prototype.cleanup = function () { this.subjectSeg = null; this.isDragging = false; this.eventRange = null; this.relevantEvents = null; this.receivingContext = null; this.validMutation = null; this.mutatedRelevantEvents = null; }; // TODO: test this in IE11 // QUESTION: why do we need it on the resizable??? EventDragging.SELECTOR = '.fc-event-draggable, .fc-event-resizable'; return EventDragging; }(common.Interaction); function computeEventMutation(hit0, hit1, massagers) { var dateSpan0 = hit0.dateSpan; var dateSpan1 = hit1.dateSpan; var date0 = dateSpan0.range.start; var date1 = dateSpan1.range.start; var standardProps = {}; if (dateSpan0.allDay !== dateSpan1.allDay) { standardProps.allDay = dateSpan1.allDay; standardProps.hasEnd = hit1.context.options.allDayMaintainDuration; if (dateSpan1.allDay) { // means date1 is already start-of-day, // but date0 needs to be converted date0 = common.startOfDay(date0); } } var delta = common.diffDates(date0, date1, hit0.context.dateEnv, hit0.componentId === hit1.componentId ? hit0.largeUnit : null); if (delta.milliseconds) { // has hours/minutes/seconds standardProps.allDay = false; } var mutation = { datesDelta: delta, standardProps: standardProps }; for (var _i = 0, massagers_1 = massagers; _i < massagers_1.length; _i++) { var massager = massagers_1[_i]; massager(mutation, hit0, hit1); } return mutation; } function getComponentTouchDelay(component) { var options = component.context.options; var delay = options.eventLongPressDelay; if (delay == null) { delay = options.longPressDelay; } return delay; } var EventResizing = /** @class */ function (_super) { tslib.__extends(EventResizing, _super); function EventResizing(settings) { var _this = _super.call(this, settings) || this; // internal state _this.draggingSegEl = null; _this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg? _this.eventRange = null; _this.relevantEvents = null; _this.validMutation = null; _this.mutatedRelevantEvents = null; _this.handlePointerDown = function (ev) { var component = _this.component; var segEl = _this.querySegEl(ev); var seg = common.getElSeg(segEl); var eventRange = _this.eventRange = seg.eventRange; _this.dragging.minDistance = component.context.options.eventDragMinDistance; // if touch, need to be working with a selected event _this.dragging.setIgnoreMove(!_this.component.isValidSegDownEl(ev.origEvent.target) || ev.isTouch && _this.component.props.eventSelection !== eventRange.instance.instanceId); }; _this.handleDragStart = function (ev) { var context = _this.component.context; var eventRange = _this.eventRange; _this.relevantEvents = common.getRelevantEvents(context.getCurrentData().eventStore, _this.eventRange.instance.instanceId); var segEl = _this.querySegEl(ev); _this.draggingSegEl = segEl; _this.draggingSeg = common.getElSeg(segEl); context.calendarApi.unselect(); context.emitter.trigger('eventResizeStart', { el: segEl, event: new common.EventApi(context, eventRange.def, eventRange.instance), jsEvent: ev.origEvent, view: context.viewApi }); }; _this.handleHitUpdate = function (hit, isFinal, ev) { var context = _this.component.context; var relevantEvents = _this.relevantEvents; var initialHit = _this.hitDragging.initialHit; var eventInstance = _this.eventRange.instance; var mutation = null; var mutatedRelevantEvents = null; var isInvalid = false; var interaction = { affectedEvents: relevantEvents, mutatedEvents: common.createEmptyEventStore(), isEvent: true }; if (hit) { var disallowed = hit.componentId === initialHit.componentId && _this.isHitComboAllowed && !_this.isHitComboAllowed(initialHit, hit); if (!disallowed) { mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-event-resizer-start'), eventInstance.range); } } if (mutation) { mutatedRelevantEvents = common.applyMutationToEventStore(relevantEvents, context.getCurrentData().eventUiBases, mutation, context); interaction.mutatedEvents = mutatedRelevantEvents; if (!common.isInteractionValid(interaction, hit.dateProfile, context)) { isInvalid = true; mutation = null; mutatedRelevantEvents = null; interaction.mutatedEvents = null; } } if (mutatedRelevantEvents) { context.dispatch({ type: 'SET_EVENT_RESIZE', state: interaction }); } else { context.dispatch({ type: 'UNSET_EVENT_RESIZE' }); } if (!isInvalid) { common.enableCursor(); } else { common.disableCursor(); } if (!isFinal) { if (mutation && isHitsEqual(initialHit, hit)) { mutation = null; } _this.validMutation = mutation; _this.mutatedRelevantEvents = mutatedRelevantEvents; } }; _this.handleDragEnd = function (ev) { var context = _this.component.context; var eventDef = _this.eventRange.def; var eventInstance = _this.eventRange.instance; var eventApi = new common.EventApi(context, eventDef, eventInstance); var relevantEvents = _this.relevantEvents; var mutatedRelevantEvents = _this.mutatedRelevantEvents; context.emitter.trigger('eventResizeStop', { el: _this.draggingSegEl, event: eventApi, jsEvent: ev.origEvent, view: context.viewApi }); if (_this.validMutation) { var updatedEventApi = new common.EventApi(context, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null); context.dispatch({ type: 'MERGE_EVENTS', eventStore: mutatedRelevantEvents }); var eventChangeArg = { oldEvent: eventApi, event: updatedEventApi, relatedEvents: common.buildEventApis(mutatedRelevantEvents, context, eventInstance), revert: function revert() { context.dispatch({ type: 'MERGE_EVENTS', eventStore: relevantEvents // the pre-change events }); } }; context.emitter.trigger('eventResize', tslib.__assign(tslib.__assign({}, eventChangeArg), { el: _this.draggingSegEl, startDelta: _this.validMutation.startDelta || common.createDuration(0), endDelta: _this.validMutation.endDelta || common.createDuration(0), jsEvent: ev.origEvent, view: context.viewApi })); context.emitter.trigger('eventChange', eventChangeArg); } else { context.emitter.trigger('_noEventResize'); } // reset all internal state _this.draggingSeg = null; _this.relevantEvents = null; _this.validMutation = null; // okay to keep eventInstance around. useful to set it in handlePointerDown }; var component = settings.component; var dragging = _this.dragging = new FeaturefulElementDragging(settings.el); dragging.pointer.selector = '.fc-event-resizer'; dragging.touchScrollAllowed = false; dragging.autoScroller.isEnabled = component.context.options.dragScroll; var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, common.interactionSettingsToStore(settings)); hitDragging.emitter.on('pointerdown', _this.handlePointerDown); hitDragging.emitter.on('dragstart', _this.handleDragStart); hitDragging.emitter.on('hitupdate', _this.handleHitUpdate); hitDragging.emitter.on('dragend', _this.handleDragEnd); return _this; } EventResizing.prototype.destroy = function () { this.dragging.destroy(); }; EventResizing.prototype.querySegEl = function (ev) { return common.elementClosest(ev.subjectEl, '.fc-event'); }; return EventResizing; }(common.Interaction); function computeMutation(hit0, hit1, isFromStart, instanceRange) { var dateEnv = hit0.context.dateEnv; var date0 = hit0.dateSpan.range.start; var date1 = hit1.dateSpan.range.start; var delta = common.diffDates(date0, date1, dateEnv, hit0.largeUnit); if (isFromStart) { if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) { return { startDelta: delta }; } } else if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) { return { endDelta: delta }; } return null; } var UnselectAuto = /** @class */ function () { function UnselectAuto(context) { var _this = this; this.context = context; this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system this.matchesCancel = false; this.matchesEvent = false; this.onSelect = function (selectInfo) { if (selectInfo.jsEvent) { _this.isRecentPointerDateSelect = true; } }; this.onDocumentPointerDown = function (pev) { var unselectCancel = _this.context.options.unselectCancel; var downEl = common.getEventTargetViaRoot(pev.origEvent); _this.matchesCancel = !!common.elementClosest(downEl, unselectCancel); _this.matchesEvent = !!common.elementClosest(downEl, EventDragging.SELECTOR); // interaction started on an event? }; this.onDocumentPointerUp = function (pev) { var context = _this.context; var documentPointer = _this.documentPointer; var calendarState = context.getCurrentData(); // touch-scrolling should never unfocus any type of selection if (!documentPointer.wasTouchScroll) { if (calendarState.dateSelection && // an existing date selection? !_this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp? ) { var unselectAuto = context.options.unselectAuto; if (unselectAuto && (!unselectAuto || !_this.matchesCancel)) { context.calendarApi.unselect(pev); } } if (calendarState.eventSelection && // an existing event selected? !_this.matchesEvent // interaction DIDN'T start on an event ) { context.dispatch({ type: 'UNSELECT_EVENT' }); } } _this.isRecentPointerDateSelect = false; }; var documentPointer = this.documentPointer = new PointerDragging(document); documentPointer.shouldIgnoreMove = true; documentPointer.shouldWatchScroll = false; documentPointer.emitter.on('pointerdown', this.onDocumentPointerDown); documentPointer.emitter.on('pointerup', this.onDocumentPointerUp); /* TODO: better way to know about whether there was a selection with the pointer */ context.emitter.on('select', this.onSelect); } UnselectAuto.prototype.destroy = function () { this.context.emitter.off('select', this.onSelect); this.documentPointer.destroy(); }; return UnselectAuto; }(); var OPTION_REFINERS = { fixedMirrorParent: common.identity }; var LISTENER_REFINERS = { dateClick: common.identity, eventDragStart: common.identity, eventDragStop: common.identity, eventDrop: common.identity, eventResizeStart: common.identity, eventResizeStop: common.identity, eventResize: common.identity, drop: common.identity, eventReceive: common.identity, eventLeave: common.identity }; /* Given an already instantiated draggable object for one-or-more elements, Interprets any dragging as an attempt to drag an events that lives outside of a calendar onto a calendar. */ var ExternalElementDragging = /** @class */ function () { function ExternalElementDragging(dragging, suppliedDragMeta) { var _this = this; this.receivingContext = null; this.droppableEvent = null; // will exist for all drags, even if create:false this.suppliedDragMeta = null; this.dragMeta = null; this.handleDragStart = function (ev) { _this.dragMeta = _this.buildDragMeta(ev.subjectEl); }; this.handleHitUpdate = function (hit, isFinal, ev) { var dragging = _this.hitDragging.dragging; var receivingContext = null; var droppableEvent = null; var isInvalid = false; var interaction = { affectedEvents: common.createEmptyEventStore(), mutatedEvents: common.createEmptyEventStore(), isEvent: _this.dragMeta.create }; if (hit) { receivingContext = hit.context; if (_this.canDropElOnCalendar(ev.subjectEl, receivingContext)) { droppableEvent = computeEventForDateSpan(hit.dateSpan, _this.dragMeta, receivingContext); interaction.mutatedEvents = common.eventTupleToStore(droppableEvent); isInvalid = !common.isInteractionValid(interaction, hit.dateProfile, receivingContext); if (isInvalid) { interaction.mutatedEvents = common.createEmptyEventStore(); droppableEvent = null; } } } _this.displayDrag(receivingContext, interaction); // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?) // TODO: wish we could somehow wait for dispatch to guarantee render dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-event-mirror')); if (!isInvalid) { common.enableCursor(); } else { common.disableCursor(); } if (!isFinal) { dragging.setMirrorNeedsRevert(!droppableEvent); _this.receivingContext = receivingContext; _this.droppableEvent = droppableEvent; } }; this.handleDragEnd = function (pev) { var _a = _this, receivingContext = _a.receivingContext, droppableEvent = _a.droppableEvent; _this.clearDrag(); if (receivingContext && droppableEvent) { var finalHit = _this.hitDragging.finalHit; var finalView = finalHit.context.viewApi; var dragMeta = _this.dragMeta; receivingContext.emitter.trigger('drop', tslib.__assign(tslib.__assign({}, buildDatePointApiWithContext(finalHit.dateSpan, receivingContext)), { draggedEl: pev.subjectEl, jsEvent: pev.origEvent, view: finalView })); if (dragMeta.create) { var addingEvents_1 = common.eventTupleToStore(droppableEvent); receivingContext.dispatch({ type: 'MERGE_EVENTS', eventStore: addingEvents_1 }); if (pev.isTouch) { receivingContext.dispatch({ type: 'SELECT_EVENT', eventInstanceId: droppableEvent.instance.instanceId }); } // signal that an external event landed receivingContext.emitter.trigger('eventReceive', { event: new common.EventApi(receivingContext, droppableEvent.def, droppableEvent.instance), relatedEvents: [], revert: function revert() { receivingContext.dispatch({ type: 'REMOVE_EVENTS', eventStore: addingEvents_1 }); }, draggedEl: pev.subjectEl, view: finalView }); } } _this.receivingContext = null; _this.droppableEvent = null; }; var hitDragging = this.hitDragging = new HitDragging(dragging, common.interactionSettingsStore); hitDragging.requireInitial = false; // will start outside of a component hitDragging.emitter.on('dragstart', this.handleDragStart); hitDragging.emitter.on('hitupdate', this.handleHitUpdate); hitDragging.emitter.on('dragend', this.handleDragEnd); this.suppliedDragMeta = suppliedDragMeta; } ExternalElementDragging.prototype.buildDragMeta = function (subjectEl) { if (_typeof(this.suppliedDragMeta) === 'object') { return common.parseDragMeta(this.suppliedDragMeta); } if (typeof this.suppliedDragMeta === 'function') { return common.parseDragMeta(this.suppliedDragMeta(subjectEl)); } return getDragMetaFromEl(subjectEl); }; ExternalElementDragging.prototype.displayDrag = function (nextContext, state) { var prevContext = this.receivingContext; if (prevContext && prevContext !== nextContext) { prevContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); } if (nextContext) { nextContext.dispatch({ type: 'SET_EVENT_DRAG', state: state }); } }; ExternalElementDragging.prototype.clearDrag = function () { if (this.receivingContext) { this.receivingContext.dispatch({ type: 'UNSET_EVENT_DRAG' }); } }; ExternalElementDragging.prototype.canDropElOnCalendar = function (el, receivingContext) { var dropAccept = receivingContext.options.dropAccept; if (typeof dropAccept === 'function') { return dropAccept.call(receivingContext.calendarApi, el); } if (typeof dropAccept === 'string' && dropAccept) { return Boolean(common.elementMatches(el, dropAccept)); } return true; }; return ExternalElementDragging; }(); // Utils for computing event store from the DragMeta // ---------------------------------------------------------------------------------------------------- function computeEventForDateSpan(dateSpan, dragMeta, context) { var defProps = tslib.__assign({}, dragMeta.leftoverProps); for (var _i = 0, _a = context.pluginHooks.externalDefTransforms; _i < _a.length; _i++) { var transform = _a[_i]; tslib.__assign(defProps, transform(dateSpan, dragMeta)); } var _b = common.refineEventDef(defProps, context), refined = _b.refined, extra = _b.extra; var def = common.parseEventDef(refined, extra, dragMeta.sourceId, dateSpan.allDay, context.options.forceEventDuration || Boolean(dragMeta.duration), // hasEnd context); var start = dateSpan.range.start; // only rely on time info if drop zone is all-day, // otherwise, we already know the time if (dateSpan.allDay && dragMeta.startTime) { start = context.dateEnv.add(start, dragMeta.startTime); } var end = dragMeta.duration ? context.dateEnv.add(start, dragMeta.duration) : common.getDefaultEventEnd(dateSpan.allDay, start, context); var instance = common.createEventInstance(def.defId, { start: start, end: end }); return { def: def, instance: instance }; } // Utils for extracting data from element // ---------------------------------------------------------------------------------------------------- function getDragMetaFromEl(el) { var str = getEmbeddedElData(el, 'event'); var obj = str ? JSON.parse(str) : { create: false }; // if no embedded data, assume no event creation return common.parseDragMeta(obj); } common.config.dataAttrPrefix = ''; function getEmbeddedElData(el, name) { var prefix = common.config.dataAttrPrefix; var prefixedName = (prefix ? prefix + '-' : '') + name; return el.getAttribute('data-' + prefixedName) || ''; } /* Makes an element (that is *external* to any calendar) draggable. Can pass in data that determines how an event will be created when dropped onto a calendar. Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system. */ var ExternalDraggable = /** @class */ function () { function ExternalDraggable(el, settings) { var _this = this; if (settings === void 0) { settings = {}; } this.handlePointerDown = function (ev) { var dragging = _this.dragging; var _a = _this.settings, minDistance = _a.minDistance, longPressDelay = _a.longPressDelay; dragging.minDistance = minDistance != null ? minDistance : ev.isTouch ? 0 : common.BASE_OPTION_DEFAULTS.eventDragMinDistance; dragging.delay = ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv longPressDelay != null ? longPressDelay : common.BASE_OPTION_DEFAULTS.longPressDelay : 0; }; this.handleDragStart = function (ev) { if (ev.isTouch && _this.dragging.delay && ev.subjectEl.classList.contains('fc-event')) { _this.dragging.mirror.getMirrorEl().classList.add('fc-event-selected'); } }; this.settings = settings; var dragging = this.dragging = new FeaturefulElementDragging(el); dragging.touchScrollAllowed = false; if (settings.itemSelector != null) { dragging.pointer.selector = settings.itemSelector; } if (settings.appendTo != null) { dragging.mirror.parentNode = settings.appendTo; // TODO: write tests } dragging.emitter.on('pointerdown', this.handlePointerDown); dragging.emitter.on('dragstart', this.handleDragStart); new ExternalElementDragging(dragging, settings.eventData); // eslint-disable-line no-new } ExternalDraggable.prototype.destroy = function () { this.dragging.destroy(); }; return ExternalDraggable; }(); /* Detects when a *THIRD-PARTY* drag-n-drop system interacts with elements. The third-party system is responsible for drawing the visuals effects of the drag. This class simply monitors for pointer movements and fires events. It also has the ability to hide the moving element (the "mirror") during the drag. */ var InferredElementDragging = /** @class */ function (_super) { tslib.__extends(InferredElementDragging, _super); function InferredElementDragging(containerEl) { var _this = _super.call(this, containerEl) || this; _this.shouldIgnoreMove = false; _this.mirrorSelector = ''; _this.currentMirrorEl = null; _this.handlePointerDown = function (ev) { _this.emitter.trigger('pointerdown', ev); if (!_this.shouldIgnoreMove) { // fire dragstart right away. does not support delay or min-distance _this.emitter.trigger('dragstart', ev); } }; _this.handlePointerMove = function (ev) { if (!_this.shouldIgnoreMove) { _this.emitter.trigger('dragmove', ev); } }; _this.handlePointerUp = function (ev) { _this.emitter.trigger('pointerup', ev); if (!_this.shouldIgnoreMove) { // fire dragend right away. does not support a revert animation _this.emitter.trigger('dragend', ev); } }; var pointer = _this.pointer = new PointerDragging(containerEl); pointer.emitter.on('pointerdown', _this.handlePointerDown); pointer.emitter.on('pointermove', _this.handlePointerMove); pointer.emitter.on('pointerup', _this.handlePointerUp); return _this; } InferredElementDragging.prototype.destroy = function () { this.pointer.destroy(); }; InferredElementDragging.prototype.setIgnoreMove = function (bool) { this.shouldIgnoreMove = bool; }; InferredElementDragging.prototype.setMirrorIsVisible = function (bool) { if (bool) { // restore a previously hidden element. // use the reference in case the selector class has already been removed. if (this.currentMirrorEl) { this.currentMirrorEl.style.visibility = ''; this.currentMirrorEl = null; } } else { var mirrorEl = this.mirrorSelector // TODO: somehow query FullCalendars WITHIN shadow-roots ? document.querySelector(this.mirrorSelector) : null; if (mirrorEl) { this.currentMirrorEl = mirrorEl; mirrorEl.style.visibility = 'hidden'; } } }; return InferredElementDragging; }(common.ElementDragging); /* Bridges third-party drag-n-drop systems with FullCalendar. Must be instantiated and destroyed by caller. */ var ThirdPartyDraggable = /** @class */ function () { function ThirdPartyDraggable(containerOrSettings, settings) { var containerEl = document; if ( // wish we could just test instanceof EventTarget, but doesn't work in IE11 containerOrSettings === document || containerOrSettings instanceof Element) { containerEl = containerOrSettings; settings = settings || {}; } else { settings = containerOrSettings || {}; } var dragging = this.dragging = new InferredElementDragging(containerEl); if (typeof settings.itemSelector === 'string') { dragging.pointer.selector = settings.itemSelector; } else if (containerEl === document) { dragging.pointer.selector = '[data-event]'; } if (typeof settings.mirrorSelector === 'string') { dragging.mirrorSelector = settings.mirrorSelector; } new ExternalElementDragging(dragging, settings.eventData); // eslint-disable-line no-new } ThirdPartyDraggable.prototype.destroy = function () { this.dragging.destroy(); }; return ThirdPartyDraggable; }(); var main = common.createPlugin({ componentInteractions: [DateClicking, DateSelecting, EventDragging, EventResizing], calendarInteractions: [UnselectAuto], elementDraggingImpl: FeaturefulElementDragging, optionRefiners: OPTION_REFINERS, listenerRefiners: LISTENER_REFINERS }); exports.Draggable = ExternalDraggable; exports.FeaturefulElementDragging = FeaturefulElementDragging; exports.PointerDragging = PointerDragging; exports.ThirdPartyDraggable = ThirdPartyDraggable; exports["default"] = main; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImNvbW1vbiIsInJlcXVpcmUiLCJ0c2xpYiIsImNvbmZpZyIsInRvdWNoTW91c2VJZ25vcmVXYWl0IiwiaWdub3JlTW91c2VEZXB0aCIsImxpc3RlbmVyQ250IiwiaXNXaW5kb3dUb3VjaE1vdmVDYW5jZWxsZWQiLCJQb2ludGVyRHJhZ2dpbmciLCJjb250YWluZXJFbCIsIl90aGlzIiwic3ViamVjdEVsIiwic2VsZWN0b3IiLCJoYW5kbGVTZWxlY3RvciIsInNob3VsZElnbm9yZU1vdmUiLCJzaG91bGRXYXRjaFNjcm9sbCIsImlzRHJhZ2dpbmciLCJpc1RvdWNoRHJhZ2dpbmciLCJ3YXNUb3VjaFNjcm9sbCIsImhhbmRsZU1vdXNlRG93biIsImV2Iiwic2hvdWxkSWdub3JlTW91c2UiLCJpc1ByaW1hcnlNb3VzZUJ1dHRvbiIsInRyeVN0YXJ0IiwicGV2IiwiY3JlYXRlRXZlbnRGcm9tTW91c2UiLCJlbWl0dGVyIiwidHJpZ2dlciIsImluaXRTY3JvbGxXYXRjaCIsImRvY3VtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsImhhbmRsZU1vdXNlTW92ZSIsImhhbmRsZU1vdXNlVXAiLCJyZWNvcmRDb29yZHMiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiY2xlYW51cCIsImhhbmRsZVRvdWNoU3RhcnQiLCJjcmVhdGVFdmVudEZyb21Ub3VjaCIsInRhcmdldEVsIiwidGFyZ2V0IiwiaGFuZGxlVG91Y2hNb3ZlIiwiaGFuZGxlVG91Y2hFbmQiLCJ3aW5kb3ciLCJoYW5kbGVUb3VjaFNjcm9sbCIsInN0YXJ0SWdub3JpbmdNb3VzZSIsImhhbmRsZVNjcm9sbCIsInBhZ2VYIiwicGFnZVhPZmZzZXQiLCJwcmV2U2Nyb2xsWCIsInByZXZQYWdlWCIsInBhZ2VZIiwicGFnZVlPZmZzZXQiLCJwcmV2U2Nyb2xsWSIsInByZXZQYWdlWSIsIm9yaWdFdmVudCIsImlzVG91Y2giLCJkZWx0YVgiLCJvcmlnUGFnZVgiLCJkZWx0YVkiLCJvcmlnUGFnZVkiLCJFbWl0dGVyIiwicGFzc2l2ZSIsImxpc3RlbmVyQ3JlYXRlZCIsInByb3RvdHlwZSIsImRlc3Ryb3kiLCJsaXN0ZW5lckRlc3Ryb3llZCIsInF1ZXJ5U3ViamVjdEVsIiwiZG93bkVsIiwiZWxlbWVudENsb3Nlc3QiLCJkZXN0cm95U2Nyb2xsV2F0Y2giLCJjYW5jZWxUb3VjaFNjcm9sbCIsImlzRmlyc3QiLCJ0b3VjaGVzIiwibGVuZ3RoIiwiYnV0dG9uIiwiY3RybEtleSIsInNldFRpbWVvdXQiLCJvbldpbmRvd1RvdWNoTW92ZSIsInByZXZlbnREZWZhdWx0IiwiRWxlbWVudE1pcnJvciIsImlzVmlzaWJsZSIsInNvdXJjZUVsIiwibWlycm9yRWwiLCJzb3VyY2VFbFJlY3QiLCJwYXJlbnROb2RlIiwiYm9keSIsInpJbmRleCIsInJldmVydER1cmF0aW9uIiwic3RhcnQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJvcmlnU2NyZWVuWCIsIm9yaWdTY3JlZW5ZIiwidXBkYXRlRWxQb3NpdGlvbiIsImhhbmRsZU1vdmUiLCJzZXRJc1Zpc2libGUiLCJib29sIiwic3R5bGUiLCJkaXNwbGF5Iiwic3RvcCIsIm5lZWRzUmV2ZXJ0QW5pbWF0aW9uIiwiY2FsbGJhY2siLCJkb25lIiwiZG9SZXZlcnRBbmltYXRpb24iLCJmaW5hbFNvdXJjZUVsUmVjdCIsInRyYW5zaXRpb24iLCJhcHBseVN0eWxlIiwibGVmdCIsInRvcCIsIndoZW5UcmFuc2l0aW9uRG9uZSIsInJlbW92ZUVsZW1lbnQiLCJnZXRNaXJyb3JFbCIsImNsb25lTm9kZSIsImNsYXNzTGlzdCIsImFkZCIsInBvc2l0aW9uIiwidmlzaWJpbGl0eSIsImJveFNpemluZyIsIndpZHRoIiwicmlnaHQiLCJoZWlnaHQiLCJib3R0b20iLCJtYXJnaW4iLCJhcHBlbmRDaGlsZCIsIlNjcm9sbEdlb21DYWNoZSIsIl9zdXBlciIsIl9fZXh0ZW5kcyIsInNjcm9sbENvbnRyb2xsZXIiLCJkb2VzTGlzdGVuaW5nIiwiY2FsbCIsInNjcm9sbFRvcCIsImdldFNjcm9sbFRvcCIsInNjcm9sbExlZnQiLCJnZXRTY3JvbGxMZWZ0IiwiaGFuZGxlU2Nyb2xsQ2hhbmdlIiwib3JpZ1Njcm9sbFRvcCIsIm9yaWdTY3JvbGxMZWZ0Iiwic2Nyb2xsV2lkdGgiLCJnZXRTY3JvbGxXaWR0aCIsInNjcm9sbEhlaWdodCIsImdldFNjcm9sbEhlaWdodCIsImNsaWVudFdpZHRoIiwiZ2V0Q2xpZW50V2lkdGgiLCJjbGllbnRIZWlnaHQiLCJnZXRDbGllbnRIZWlnaHQiLCJjbGllbnRSZWN0IiwiY29tcHV0ZUNsaWVudFJlY3QiLCJnZXRFdmVudFRhcmdldCIsInNldFNjcm9sbFRvcCIsIk1hdGgiLCJtYXgiLCJtaW4iLCJnZXRNYXhTY3JvbGxUb3AiLCJzZXRTY3JvbGxMZWZ0IiwiZ2V0TWF4U2Nyb2xsTGVmdCIsIlNjcm9sbENvbnRyb2xsZXIiLCJFbGVtZW50U2Nyb2xsR2VvbUNhY2hlIiwiZWwiLCJFbGVtZW50U2Nyb2xsQ29udHJvbGxlciIsImNvbXB1dGVJbm5lclJlY3QiLCJXaW5kb3dTY3JvbGxHZW9tQ2FjaGUiLCJXaW5kb3dTY3JvbGxDb250cm9sbGVyIiwiZ2V0VGltZSIsInBlcmZvcm1hbmNlIiwibm93IiwiRGF0ZSIsIkF1dG9TY3JvbGxlciIsImlzRW5hYmxlZCIsInNjcm9sbFF1ZXJ5IiwiZWRnZVRocmVzaG9sZCIsIm1heFZlbG9jaXR5IiwicG9pbnRlclNjcmVlblgiLCJwb2ludGVyU2NyZWVuWSIsImlzQW5pbWF0aW5nIiwic2Nyb2xsQ2FjaGVzIiwiZXZlck1vdmVkVXAiLCJldmVyTW92ZWREb3duIiwiZXZlck1vdmVkTGVmdCIsImV2ZXJNb3ZlZFJpZ2h0IiwiYW5pbWF0ZSIsImVkZ2UiLCJjb21wdXRlQmVzdEVkZ2UiLCJoYW5kbGVTaWRlIiwibXNTaW5jZVJlcXVlc3QiLCJyZXF1ZXN0QW5pbWF0aW9uIiwic2Nyb2xsU3RhcnRFbCIsImJ1aWxkQ2FjaGVzIiwieURlbHRhIiwieERlbHRhIiwiX2kiLCJfYSIsInNjcm9sbENhY2hlIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic2Vjb25kcyIsImludkRpc3RhbmNlIiwiZGlzdGFuY2UiLCJ2ZWxvY2l0eSIsInNpZ24iLCJuYW1lIiwiYmVzdFNpZGUiLCJzY3JvbGxDYWNoZXNfMSIsInJlY3QiLCJsZWZ0RGlzdCIsInJpZ2h0RGlzdCIsInRvcERpc3QiLCJib3R0b21EaXN0IiwiY2FuU2Nyb2xsVXAiLCJjYW5TY3JvbGxEb3duIiwiY2FuU2Nyb2xsTGVmdCIsImNhblNjcm9sbFJpZ2h0IiwicXVlcnlTY3JvbGxFbHMiLCJtYXAiLCJlbHMiLCJxdWVyeSIsInB1c2giLCJhcHBseSIsIkFycmF5Iiwic2xpY2UiLCJnZXRFbFJvb3QiLCJxdWVyeVNlbGVjdG9yQWxsIiwiRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZyIsImRlbGF5IiwibWluRGlzdGFuY2UiLCJ0b3VjaFNjcm9sbEFsbG93ZWQiLCJtaXJyb3JOZWVkc1JldmVydCIsImlzSW50ZXJhY3RpbmciLCJpc0RlbGF5RW5kZWQiLCJpc0Rpc3RhbmNlU3VycGFzc2VkIiwiZGVsYXlUaW1lb3V0SWQiLCJvblBvaW50ZXJEb3duIiwicHJldmVudFNlbGVjdGlvbiIsInByZXZlbnRDb250ZXh0TWVudSIsInBvaW50ZXIiLCJtaXJyb3IiLCJzdGFydERlbGF5IiwiaGFuZGxlRGlzdGFuY2VTdXJwYXNzZWQiLCJvblBvaW50ZXJNb3ZlIiwiZGlzdGFuY2VTcSIsInR5cGUiLCJhdXRvU2Nyb2xsZXIiLCJvblBvaW50ZXJVcCIsImFsbG93U2VsZWN0aW9uIiwiYWxsb3dDb250ZXh0TWVudSIsInRyeVN0b3BEcmFnIiwiY2xlYXJUaW1lb3V0Iiwib24iLCJoYW5kbGVEZWxheUVuZCIsInRyeVN0YXJ0RHJhZyIsInN0b3BEcmFnIiwiYmluZCIsInNldElnbm9yZU1vdmUiLCJzZXRNaXJyb3JJc1Zpc2libGUiLCJzZXRNaXJyb3JOZWVkc1JldmVydCIsInNldEF1dG9TY3JvbGxFbmFibGVkIiwiRWxlbWVudERyYWdnaW5nIiwiT2Zmc2V0VHJhY2tlciIsIm9yaWdSZWN0IiwiY29tcHV0ZVJlY3QiLCJnZXRDbGlwcGluZ1BhcmVudHMiLCJzY3JvbGxFbCIsImNvbXB1dGVMZWZ0IiwiY29tcHV0ZVRvcCIsImlzV2l0aGluQ2xpcHBpbmciLCJwb2ludCIsImlzSWdub3JlZENsaXBwaW5nIiwicG9pbnRJbnNpZGVSZWN0Iiwibm9kZSIsInRhZ05hbWUiLCJIaXREcmFnZ2luZyIsImRyYWdnaW5nIiwiZHJvcHBhYmxlU3RvcmUiLCJ1c2VTdWJqZWN0Q2VudGVyIiwicmVxdWlyZUluaXRpYWwiLCJpbml0aWFsSGl0IiwibW92aW5nSGl0IiwiZmluYWxIaXQiLCJoYW5kbGVQb2ludGVyRG93biIsInByZXBhcmVIaXRzIiwicHJvY2Vzc0ZpcnN0Q29vcmQiLCJoYW5kbGVEcmFnU3RhcnQiLCJoYW5kbGVEcmFnTW92ZSIsImhhbmRsZVBvaW50ZXJVcCIsInJlbGVhc2VIaXRzIiwiaGFuZGxlRHJhZ0VuZCIsIm9yaWdQb2ludCIsImFkanVzdGVkUG9pbnQiLCJzdWJqZWN0UmVjdCIsIkhUTUxFbGVtZW50IiwiY29uc3RyYWluUG9pbnQiLCJxdWVyeUhpdEZvck9mZnNldCIsInNsaWNlZFN1YmplY3RSZWN0IiwiaW50ZXJzZWN0UmVjdHMiLCJnZXRSZWN0Q2VudGVyIiwiY29vcmRBZGp1c3QiLCJkaWZmUG9pbnRzIiwiZm9yY2VIYW5kbGUiLCJoaXQiLCJpc0hpdHNFcXVhbCIsIm9mZnNldFRyYWNrZXJzIiwibWFwSGFzaCIsImludGVyYWN0aW9uU2V0dGluZ3MiLCJjb21wb25lbnQiLCJpZCIsIm9mZnNldExlZnQiLCJvZmZzZXRUb3AiLCJiZXN0SGl0Iiwib2Zmc2V0VHJhY2tlciIsIm9yaWdpbkxlZnQiLCJvcmlnaW5Ub3AiLCJwb3NpdGlvbkxlZnQiLCJwb3NpdGlvblRvcCIsInF1ZXJ5SGl0IiwicmFuZ2VDb250YWluc1JhbmdlIiwiZGF0ZVByb2ZpbGUiLCJhY3RpdmVSYW5nZSIsImRhdGVTcGFuIiwicmFuZ2UiLCJsYXllciIsImNvbXBvbmVudElkIiwiY29udGV4dCIsImhpdDAiLCJoaXQxIiwiQm9vbGVhbiIsImlzRGF0ZVNwYW5zRXF1YWwiLCJidWlsZERhdGVQb2ludEFwaVdpdGhDb250ZXh0IiwicHJvcHMiLCJwbHVnaW5Ib29rcyIsImRhdGVQb2ludFRyYW5zZm9ybXMiLCJ0cmFuc2Zvcm0iLCJfX2Fzc2lnbiIsImJ1aWxkRGF0ZVBvaW50QXBpIiwiZGF0ZUVudiIsInNwYW4iLCJkYXRlIiwidG9EYXRlIiwiZGF0ZVN0ciIsImZvcm1hdElzbyIsIm9taXRUaW1lIiwiYWxsRGF5IiwiRGF0ZUNsaWNraW5nIiwic2V0dGluZ3MiLCJpc1ZhbGlkRGF0ZURvd25FbCIsImhpdERyYWdnaW5nIiwiYXJnIiwiZGF5RWwiLCJqc0V2ZW50IiwidmlldyIsInZpZXdBcGkiLCJjYWxlbmRhckFwaSIsImludGVyYWN0aW9uU2V0dGluZ3NUb1N0b3JlIiwiSW50ZXJhY3Rpb24iLCJEYXRlU2VsZWN0aW5nIiwiZHJhZ1NlbGVjdGlvbiIsIm9wdGlvbnMiLCJjYW5TZWxlY3QiLCJzZWxlY3RhYmxlIiwiZ2V0Q29tcG9uZW50VG91Y2hEZWxheSQxIiwidW5zZWxlY3QiLCJoYW5kbGVIaXRVcGRhdGUiLCJpc0ZpbmFsIiwiaXNJbnZhbGlkIiwiZGlzYWxsb3dlZCIsImlzSGl0Q29tYm9BbGxvd2VkIiwiam9pbkhpdHNJbnRvU2VsZWN0aW9uIiwiZGF0ZVNlbGVjdGlvblRyYW5zZm9ybWVycyIsImlzRGF0ZVNlbGVjdGlvblZhbGlkIiwiZGlzcGF0Y2giLCJzZWxlY3Rpb24iLCJlbmFibGVDdXJzb3IiLCJkaXNhYmxlQ3Vyc29yIiwidHJpZ2dlckRhdGVTZWxlY3QiLCJzZWxlY3RNaW5EaXN0YW5jZSIsImRyYWdTY3JvbGwiLCJzZWxlY3RMb25nUHJlc3NEZWxheSIsImxvbmdQcmVzc0RlbGF5IiwiZGF0ZVNwYW4wIiwiZGF0ZVNwYW4xIiwibXMiLCJlbmQiLCJzb3J0IiwiY29tcGFyZU51bWJlcnMiLCJkYXRlU2VsZWN0aW9uVHJhbnNmb3JtZXJzXzEiLCJ0cmFuc2Zvcm1lciIsInJlcyIsIkV2ZW50RHJhZ2dpbmciLCJzdWJqZWN0U2VnIiwiZXZlbnRSYW5nZSIsInJlbGV2YW50RXZlbnRzIiwicmVjZWl2aW5nQ29udGV4dCIsInZhbGlkTXV0YXRpb24iLCJtdXRhdGVkUmVsZXZhbnRFdmVudHMiLCJvcmlnVGFyZ2V0IiwiaW5pdGlhbENvbnRleHQiLCJnZXRFbFNlZyIsImV2ZW50SW5zdGFuY2VJZCIsImluc3RhbmNlIiwiaW5zdGFuY2VJZCIsImdldFJlbGV2YW50RXZlbnRzIiwiZ2V0Q3VycmVudERhdGEiLCJldmVudFN0b3JlIiwiZXZlbnREcmFnTWluRGlzdGFuY2UiLCJldmVudFNlbGVjdGlvbiIsImdldENvbXBvbmVudFRvdWNoRGVsYXkiLCJmaXhlZE1pcnJvclBhcmVudCIsImRyYWdSZXZlcnREdXJhdGlvbiIsImlzVmFsaWQiLCJpc1ZhbGlkU2VnRG93bkVsIiwiY29udGFpbnMiLCJldmVudCIsIkV2ZW50QXBpIiwiZGVmIiwibXV0YXRpb24iLCJpbnRlcmFjdGlvbiIsImFmZmVjdGVkRXZlbnRzIiwibXV0YXRlZEV2ZW50cyIsImNyZWF0ZUVtcHR5RXZlbnRTdG9yZSIsImlzRXZlbnQiLCJyZWNlaXZpbmdPcHRpb25zIiwiZWRpdGFibGUiLCJkcm9wcGFibGUiLCJjb21wdXRlRXZlbnRNdXRhdGlvbiIsImV2ZW50RHJhZ011dGF0aW9uTWFzc2FnZXJzIiwiYXBwbHlNdXRhdGlvblRvRXZlbnRTdG9yZSIsImV2ZW50VWlCYXNlcyIsImlzSW50ZXJhY3Rpb25WYWxpZCIsImRpc3BsYXlEcmFnIiwicXVlcnlTZWxlY3RvciIsImluaXRpYWxDb250ZXh0XzEiLCJpbml0aWFsVmlldyIsInJlY2VpdmluZ0NvbnRleHRfMSIsImV2ZW50RGVmIiwiZXZlbnRJbnN0YW5jZSIsImV2ZW50QXBpIiwicmVsZXZhbnRFdmVudHNfMSIsIm11dGF0ZWRSZWxldmFudEV2ZW50c18xIiwiY2xlYXJEcmFnIiwidXBkYXRlZEV2ZW50QXBpIiwiZGVmcyIsImRlZklkIiwiaW5zdGFuY2VzIiwiZXZlbnRDaGFuZ2VBcmciLCJvbGRFdmVudCIsInJlbGF0ZWRFdmVudHMiLCJidWlsZEV2ZW50QXBpcyIsInJldmVydCIsInRyYW5zZm9ybWVkIiwiX2IiLCJldmVudERyb3BUcmFuc2Zvcm1lcnMiLCJkZWx0YSIsImRhdGVzRGVsdGEiLCJldmVudFJlbW92ZUFyZyIsImRyYWdnZWRFbCIsImFkZGVkRXZlbnREZWYiLCJhZGRlZEV2ZW50SW5zdGFuY2UiLCJhZGRlZEV2ZW50QXBpIiwiZXZlbnRBZGRBcmciLCJTRUxFQ1RPUiIsImludGVyYWN0aW9uU2V0dGluZ3NTdG9yZSIsInVzZUV2ZW50Q2VudGVyIiwibmV4dENvbnRleHQiLCJzdGF0ZSIsInByZXZDb250ZXh0IiwiaW5pdGlhbENhbGVuZGFyIiwibWFzc2FnZXJzIiwiZGF0ZTAiLCJkYXRlMSIsInN0YW5kYXJkUHJvcHMiLCJoYXNFbmQiLCJhbGxEYXlNYWludGFpbkR1cmF0aW9uIiwic3RhcnRPZkRheSIsImRpZmZEYXRlcyIsImxhcmdlVW5pdCIsIm1pbGxpc2Vjb25kcyIsIm1hc3NhZ2Vyc18xIiwibWFzc2FnZXIiLCJldmVudExvbmdQcmVzc0RlbGF5IiwiRXZlbnRSZXNpemluZyIsImRyYWdnaW5nU2VnRWwiLCJkcmFnZ2luZ1NlZyIsInNlZ0VsIiwicXVlcnlTZWdFbCIsInNlZyIsImNvbXB1dGVNdXRhdGlvbiIsInN0YXJ0RGVsdGEiLCJjcmVhdGVEdXJhdGlvbiIsImVuZERlbHRhIiwiaXNGcm9tU3RhcnQiLCJpbnN0YW5jZVJhbmdlIiwiVW5zZWxlY3RBdXRvIiwiaXNSZWNlbnRQb2ludGVyRGF0ZVNlbGVjdCIsIm1hdGNoZXNDYW5jZWwiLCJtYXRjaGVzRXZlbnQiLCJvblNlbGVjdCIsInNlbGVjdEluZm8iLCJvbkRvY3VtZW50UG9pbnRlckRvd24iLCJ1bnNlbGVjdENhbmNlbCIsImdldEV2ZW50VGFyZ2V0VmlhUm9vdCIsIm9uRG9jdW1lbnRQb2ludGVyVXAiLCJkb2N1bWVudFBvaW50ZXIiLCJjYWxlbmRhclN0YXRlIiwiZGF0ZVNlbGVjdGlvbiIsInVuc2VsZWN0QXV0byIsIm9mZiIsIk9QVElPTl9SRUZJTkVSUyIsImlkZW50aXR5IiwiTElTVEVORVJfUkVGSU5FUlMiLCJkYXRlQ2xpY2siLCJldmVudERyYWdTdGFydCIsImV2ZW50RHJhZ1N0b3AiLCJldmVudERyb3AiLCJldmVudFJlc2l6ZVN0YXJ0IiwiZXZlbnRSZXNpemVTdG9wIiwiZXZlbnRSZXNpemUiLCJkcm9wIiwiZXZlbnRSZWNlaXZlIiwiZXZlbnRMZWF2ZSIsIkV4dGVybmFsRWxlbWVudERyYWdnaW5nIiwic3VwcGxpZWREcmFnTWV0YSIsImRyb3BwYWJsZUV2ZW50IiwiZHJhZ01ldGEiLCJidWlsZERyYWdNZXRhIiwiY3JlYXRlIiwiY2FuRHJvcEVsT25DYWxlbmRhciIsImNvbXB1dGVFdmVudEZvckRhdGVTcGFuIiwiZXZlbnRUdXBsZVRvU3RvcmUiLCJmaW5hbFZpZXciLCJhZGRpbmdFdmVudHNfMSIsInBhcnNlRHJhZ01ldGEiLCJnZXREcmFnTWV0YUZyb21FbCIsImRyb3BBY2NlcHQiLCJlbGVtZW50TWF0Y2hlcyIsImRlZlByb3BzIiwibGVmdG92ZXJQcm9wcyIsImV4dGVybmFsRGVmVHJhbnNmb3JtcyIsInJlZmluZUV2ZW50RGVmIiwicmVmaW5lZCIsImV4dHJhIiwicGFyc2VFdmVudERlZiIsInNvdXJjZUlkIiwiZm9yY2VFdmVudER1cmF0aW9uIiwiZHVyYXRpb24iLCJzdGFydFRpbWUiLCJnZXREZWZhdWx0RXZlbnRFbmQiLCJjcmVhdGVFdmVudEluc3RhbmNlIiwic3RyIiwiZ2V0RW1iZWRkZWRFbERhdGEiLCJvYmoiLCJKU09OIiwicGFyc2UiLCJkYXRhQXR0clByZWZpeCIsInByZWZpeCIsInByZWZpeGVkTmFtZSIsImdldEF0dHJpYnV0ZSIsIkV4dGVybmFsRHJhZ2dhYmxlIiwiQkFTRV9PUFRJT05fREVGQVVMVFMiLCJpdGVtU2VsZWN0b3IiLCJhcHBlbmRUbyIsImV2ZW50RGF0YSIsIkluZmVycmVkRWxlbWVudERyYWdnaW5nIiwibWlycm9yU2VsZWN0b3IiLCJjdXJyZW50TWlycm9yRWwiLCJoYW5kbGVQb2ludGVyTW92ZSIsIlRoaXJkUGFydHlEcmFnZ2FibGUiLCJjb250YWluZXJPclNldHRpbmdzIiwiRWxlbWVudCIsIm1haW4iLCJjcmVhdGVQbHVnaW4iLCJjb21wb25lbnRJbnRlcmFjdGlvbnMiLCJjYWxlbmRhckludGVyYWN0aW9ucyIsImVsZW1lbnREcmFnZ2luZ0ltcGwiLCJvcHRpb25SZWZpbmVycyIsImxpc3RlbmVyUmVmaW5lcnMiLCJEcmFnZ2FibGUiXSwic291cmNlcyI6WyJtYWluLmNqcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbkZ1bGxDYWxlbmRhciB2NS4xMS4yXG5Eb2NzICYgTGljZW5zZTogaHR0cHM6Ly9mdWxsY2FsZW5kYXIuaW8vXG4oYykgMjAyMiBBZGFtIFNoYXdcbiovXG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBjb21tb24gPSByZXF1aXJlKCdAZnVsbGNhbGVuZGFyL2NvbW1vbicpO1xudmFyIHRzbGliID0gcmVxdWlyZSgndHNsaWInKTtcblxuY29tbW9uLmNvbmZpZy50b3VjaE1vdXNlSWdub3JlV2FpdCA9IDUwMDtcbnZhciBpZ25vcmVNb3VzZURlcHRoID0gMDtcbnZhciBsaXN0ZW5lckNudCA9IDA7XG52YXIgaXNXaW5kb3dUb3VjaE1vdmVDYW5jZWxsZWQgPSBmYWxzZTtcbi8qXG5Vc2VzIGEgXCJwb2ludGVyXCIgYWJzdHJhY3Rpb24sIHdoaWNoIG1vbml0b3JzIFVJIGV2ZW50cyBmb3IgYm90aCBtb3VzZSBhbmQgdG91Y2guXG5UcmFja3Mgd2hlbiB0aGUgcG9pbnRlciBcImRyYWdzXCIgb24gYSBjZXJ0YWluIGVsZW1lbnQsIG1lYW5pbmcgZG93bittb3ZlK3VwLlxuXG5BbHNvLCB0cmFja3MgaWYgdGhlcmUgd2FzIHRvdWNoLXNjcm9sbGluZy5cbkFsc28sIGNhbiBwcmV2ZW50IHRvdWNoLXNjcm9sbGluZyBmcm9tIGhhcHBlbmluZy5cbkFsc28sIGNhbiBmaXJlIHBvaW50ZXJtb3ZlIGV2ZW50cyB3aGVuIHNjcm9sbGluZyBoYXBwZW5zIHVuZGVybmVhdGgsIGV2ZW4gd2hlbiBubyByZWFsIHBvaW50ZXIgbW92ZW1lbnQuXG5cbmVtaXRzOlxuLSBwb2ludGVyZG93blxuLSBwb2ludGVybW92ZVxuLSBwb2ludGVydXBcbiovXG52YXIgUG9pbnRlckRyYWdnaW5nID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBvaW50ZXJEcmFnZ2luZyhjb250YWluZXJFbCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnN1YmplY3RFbCA9IG51bGw7XG4gICAgICAgIC8vIG9wdGlvbnMgdGhhdCBjYW4gYmUgZGlyZWN0bHkgYXNzaWduZWQgYnkgY2FsbGVyXG4gICAgICAgIHRoaXMuc2VsZWN0b3IgPSAnJzsgLy8gd2lsbCBjYXVzZSBzdWJqZWN0RWwgaW4gYWxsIGVtaXR0ZWQgZXZlbnRzIHRvIGJlIHRoaXMgZWxlbWVudFxuICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdG9yID0gJyc7XG4gICAgICAgIHRoaXMuc2hvdWxkSWdub3JlTW92ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNob3VsZFdhdGNoU2Nyb2xsID0gdHJ1ZTsgLy8gZm9yIHNpbXVsYXRpbmcgcG9pbnRlcm1vdmUgb24gc2Nyb2xsXG4gICAgICAgIC8vIGludGVybmFsIHN0YXRlc1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc1RvdWNoRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy53YXNUb3VjaFNjcm9sbCA9IGZhbHNlO1xuICAgICAgICAvLyBNb3VzZVxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIHRoaXMuaGFuZGxlTW91c2VEb3duID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzLnNob3VsZElnbm9yZU1vdXNlKCkgJiZcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnlNb3VzZUJ1dHRvbihldikgJiZcbiAgICAgICAgICAgICAgICBfdGhpcy50cnlTdGFydChldikpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGV2ID0gX3RoaXMuY3JlYXRlRXZlbnRGcm9tTW91c2UoZXYsIHRydWUpO1xuICAgICAgICAgICAgICAgIF90aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcmRvd24nLCBwZXYpO1xuICAgICAgICAgICAgICAgIF90aGlzLmluaXRTY3JvbGxXYXRjaChwZXYpO1xuICAgICAgICAgICAgICAgIGlmICghX3RoaXMuc2hvdWxkSWdub3JlTW92ZSkge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBfdGhpcy5oYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgX3RoaXMuaGFuZGxlTW91c2VVcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlTW91c2VNb3ZlID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgcGV2ID0gX3RoaXMuY3JlYXRlRXZlbnRGcm9tTW91c2UoZXYpO1xuICAgICAgICAgICAgX3RoaXMucmVjb3JkQ29vcmRzKHBldik7XG4gICAgICAgICAgICBfdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJtb3ZlJywgcGV2KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVNb3VzZVVwID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBfdGhpcy5oYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIF90aGlzLmhhbmRsZU1vdXNlVXApO1xuICAgICAgICAgICAgX3RoaXMuZW1pdHRlci50cmlnZ2VyKCdwb2ludGVydXAnLCBfdGhpcy5jcmVhdGVFdmVudEZyb21Nb3VzZShldikpO1xuICAgICAgICAgICAgX3RoaXMuY2xlYW51cCgpOyAvLyBjYWxsIGxhc3Qgc28gdGhhdCBwb2ludGVydXAgaGFzIGFjY2VzcyB0byBwcm9wc1xuICAgICAgICB9O1xuICAgICAgICAvLyBUb3VjaFxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIHRoaXMuaGFuZGxlVG91Y2hTdGFydCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgaWYgKF90aGlzLnRyeVN0YXJ0KGV2KSkge1xuICAgICAgICAgICAgICAgIF90aGlzLmlzVG91Y2hEcmFnZ2luZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIHBldiA9IF90aGlzLmNyZWF0ZUV2ZW50RnJvbVRvdWNoKGV2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJkb3duJywgcGV2KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5pbml0U2Nyb2xsV2F0Y2gocGV2KTtcbiAgICAgICAgICAgICAgICAvLyB1bmxpa2UgbW91c2UsIG5lZWQgdG8gYXR0YWNoIHRvIHRhcmdldCwgbm90IGRvY3VtZW50XG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ1NzYwMDE0XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldEVsID0gZXYudGFyZ2V0O1xuICAgICAgICAgICAgICAgIGlmICghX3RoaXMuc2hvdWxkSWdub3JlTW92ZSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRFbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBfdGhpcy5oYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YXJnZXRFbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIF90aGlzLmhhbmRsZVRvdWNoRW5kKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRFbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIF90aGlzLmhhbmRsZVRvdWNoRW5kKTsgLy8gdHJlYXQgaXQgYXMgYSB0b3VjaCBlbmRcbiAgICAgICAgICAgICAgICAvLyBhdHRhY2ggYSBoYW5kbGVyIHRvIGdldCBjYWxsZWQgd2hlbiBBTlkgc2Nyb2xsIGFjdGlvbiBoYXBwZW5zIG9uIHRoZSBwYWdlLlxuICAgICAgICAgICAgICAgIC8vIHRoaXMgd2FzIGltcG9zc2libGUgdG8gZG8gd2l0aCBub3JtYWwgb24vb2ZmIGJlY2F1c2UgJ3Njcm9sbCcgZG9lc24ndCBidWJibGUuXG4gICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzI5NTQ1NjUvOTYzNDJcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgX3RoaXMuaGFuZGxlVG91Y2hTY3JvbGwsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvdWNoTW92ZSA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgdmFyIHBldiA9IF90aGlzLmNyZWF0ZUV2ZW50RnJvbVRvdWNoKGV2KTtcbiAgICAgICAgICAgIF90aGlzLnJlY29yZENvb3JkcyhwZXYpO1xuICAgICAgICAgICAgX3RoaXMuZW1pdHRlci50cmlnZ2VyKCdwb2ludGVybW92ZScsIHBldik7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlVG91Y2hFbmQgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5pc0RyYWdnaW5nKSB7IC8vIGRvbmUgdG8gZ3VhcmQgYWdhaW5zdCB0b3VjaGVuZCBmb2xsb3dlZCBieSB0b3VjaGNhbmNlbFxuICAgICAgICAgICAgICAgIHZhciB0YXJnZXRFbCA9IGV2LnRhcmdldDtcbiAgICAgICAgICAgICAgICB0YXJnZXRFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBfdGhpcy5oYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgICAgICAgICAgIHRhcmdldEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgX3RoaXMuaGFuZGxlVG91Y2hFbmQpO1xuICAgICAgICAgICAgICAgIHRhcmdldEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgX3RoaXMuaGFuZGxlVG91Y2hFbmQpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBfdGhpcy5oYW5kbGVUb3VjaFNjcm9sbCwgdHJ1ZSk7IC8vIHVzZUNhcHR1cmVkPXRydWVcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJ1cCcsIF90aGlzLmNyZWF0ZUV2ZW50RnJvbVRvdWNoKGV2KSk7XG4gICAgICAgICAgICAgICAgX3RoaXMuY2xlYW51cCgpOyAvLyBjYWxsIGxhc3Qgc28gdGhhdCBwb2ludGVydXAgaGFzIGFjY2VzcyB0byBwcm9wc1xuICAgICAgICAgICAgICAgIF90aGlzLmlzVG91Y2hEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHN0YXJ0SWdub3JpbmdNb3VzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvdWNoU2Nyb2xsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMud2FzVG91Y2hTY3JvbGwgPSB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5zaG91bGRJZ25vcmVNb3ZlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhZ2VYID0gKHdpbmRvdy5wYWdlWE9mZnNldCAtIF90aGlzLnByZXZTY3JvbGxYKSArIF90aGlzLnByZXZQYWdlWDtcbiAgICAgICAgICAgICAgICB2YXIgcGFnZVkgPSAod2luZG93LnBhZ2VZT2Zmc2V0IC0gX3RoaXMucHJldlNjcm9sbFkpICsgX3RoaXMucHJldlBhZ2VZO1xuICAgICAgICAgICAgICAgIF90aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcm1vdmUnLCB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdFdmVudDogZXYsXG4gICAgICAgICAgICAgICAgICAgIGlzVG91Y2g6IF90aGlzLmlzVG91Y2hEcmFnZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgc3ViamVjdEVsOiBfdGhpcy5zdWJqZWN0RWwsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VYOiBwYWdlWCxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVk6IHBhZ2VZLFxuICAgICAgICAgICAgICAgICAgICBkZWx0YVg6IHBhZ2VYIC0gX3RoaXMub3JpZ1BhZ2VYLFxuICAgICAgICAgICAgICAgICAgICBkZWx0YVk6IHBhZ2VZIC0gX3RoaXMub3JpZ1BhZ2VZLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvbnRhaW5lckVsID0gY29udGFpbmVyRWw7XG4gICAgICAgIHRoaXMuZW1pdHRlciA9IG5ldyBjb21tb24uRW1pdHRlcigpO1xuICAgICAgICBjb250YWluZXJFbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgIGNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgbGlzdGVuZXJDcmVhdGVkKCk7XG4gICAgfVxuICAgIFBvaW50ZXJEcmFnZ2luZy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVG91Y2hTdGFydCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgICBsaXN0ZW5lckRlc3Ryb3llZCgpO1xuICAgIH07XG4gICAgUG9pbnRlckRyYWdnaW5nLnByb3RvdHlwZS50cnlTdGFydCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICB2YXIgc3ViamVjdEVsID0gdGhpcy5xdWVyeVN1YmplY3RFbChldik7XG4gICAgICAgIHZhciBkb3duRWwgPSBldi50YXJnZXQ7XG4gICAgICAgIGlmIChzdWJqZWN0RWwgJiZcbiAgICAgICAgICAgICghdGhpcy5oYW5kbGVTZWxlY3RvciB8fCBjb21tb24uZWxlbWVudENsb3Nlc3QoZG93bkVsLCB0aGlzLmhhbmRsZVNlbGVjdG9yKSkpIHtcbiAgICAgICAgICAgIHRoaXMuc3ViamVjdEVsID0gc3ViamVjdEVsO1xuICAgICAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTsgLy8gZG8gdGhpcyBmaXJzdCBzbyBjYW5jZWxUb3VjaFNjcm9sbCB3aWxsIHdvcmtcbiAgICAgICAgICAgIHRoaXMud2FzVG91Y2hTY3JvbGwgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIFBvaW50ZXJEcmFnZ2luZy5wcm90b3R5cGUuY2xlYW51cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXNXaW5kb3dUb3VjaE1vdmVDYW5jZWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3ViamVjdEVsID0gbnVsbDtcbiAgICAgICAgLy8ga2VlcCB3YXNUb3VjaFNjcm9sbCBhcm91bmQgZm9yIGxhdGVyIGFjY2Vzc1xuICAgICAgICB0aGlzLmRlc3Ryb3lTY3JvbGxXYXRjaCgpO1xuICAgIH07XG4gICAgUG9pbnRlckRyYWdnaW5nLnByb3RvdHlwZS5xdWVyeVN1YmplY3RFbCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbW1vbi5lbGVtZW50Q2xvc2VzdChldi50YXJnZXQsIHRoaXMuc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lckVsO1xuICAgIH07XG4gICAgUG9pbnRlckRyYWdnaW5nLnByb3RvdHlwZS5zaG91bGRJZ25vcmVNb3VzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGlnbm9yZU1vdXNlRGVwdGggfHwgdGhpcy5pc1RvdWNoRHJhZ2dpbmc7XG4gICAgfTtcbiAgICAvLyBjYW4gYmUgY2FsbGVkIGJ5IHVzZXIgb2YgdGhpcyBjbGFzcywgdG8gY2FuY2VsIHRvdWNoLWJhc2VkIHNjcm9sbGluZyBmb3IgdGhlIGN1cnJlbnQgZHJhZ1xuICAgIFBvaW50ZXJEcmFnZ2luZy5wcm90b3R5cGUuY2FuY2VsVG91Y2hTY3JvbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgICAgIGlzV2luZG93VG91Y2hNb3ZlQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gU2Nyb2xsaW5nIHRoYXQgc2ltdWxhdGVzIHBvaW50ZXJtb3Zlc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBQb2ludGVyRHJhZ2dpbmcucHJvdG90eXBlLmluaXRTY3JvbGxXYXRjaCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICBpZiAodGhpcy5zaG91bGRXYXRjaFNjcm9sbCkge1xuICAgICAgICAgICAgdGhpcy5yZWNvcmRDb29yZHMoZXYpO1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlU2Nyb2xsLCB0cnVlKTsgLy8gdXNlQ2FwdHVyZT10cnVlXG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBvaW50ZXJEcmFnZ2luZy5wcm90b3R5cGUucmVjb3JkQ29vcmRzID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZFdhdGNoU2Nyb2xsKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZQYWdlWCA9IGV2LnBhZ2VYO1xuICAgICAgICAgICAgdGhpcy5wcmV2UGFnZVkgPSBldi5wYWdlWTtcbiAgICAgICAgICAgIHRoaXMucHJldlNjcm9sbFggPSB3aW5kb3cucGFnZVhPZmZzZXQ7XG4gICAgICAgICAgICB0aGlzLnByZXZTY3JvbGxZID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQb2ludGVyRHJhZ2dpbmcucHJvdG90eXBlLmRlc3Ryb3lTY3JvbGxXYXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkV2F0Y2hTY3JvbGwpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLmhhbmRsZVNjcm9sbCwgdHJ1ZSk7IC8vIHVzZUNhcHR1cmVkPXRydWVcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gRXZlbnQgTm9ybWFsaXphdGlvblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBQb2ludGVyRHJhZ2dpbmcucHJvdG90eXBlLmNyZWF0ZUV2ZW50RnJvbU1vdXNlID0gZnVuY3Rpb24gKGV2LCBpc0ZpcnN0KSB7XG4gICAgICAgIHZhciBkZWx0YVggPSAwO1xuICAgICAgICB2YXIgZGVsdGFZID0gMDtcbiAgICAgICAgLy8gVE9ETzogcmVwZWF0IGNvZGVcbiAgICAgICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgICAgICAgIHRoaXMub3JpZ1BhZ2VYID0gZXYucGFnZVg7XG4gICAgICAgICAgICB0aGlzLm9yaWdQYWdlWSA9IGV2LnBhZ2VZO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVsdGFYID0gZXYucGFnZVggLSB0aGlzLm9yaWdQYWdlWDtcbiAgICAgICAgICAgIGRlbHRhWSA9IGV2LnBhZ2VZIC0gdGhpcy5vcmlnUGFnZVk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9yaWdFdmVudDogZXYsXG4gICAgICAgICAgICBpc1RvdWNoOiBmYWxzZSxcbiAgICAgICAgICAgIHN1YmplY3RFbDogdGhpcy5zdWJqZWN0RWwsXG4gICAgICAgICAgICBwYWdlWDogZXYucGFnZVgsXG4gICAgICAgICAgICBwYWdlWTogZXYucGFnZVksXG4gICAgICAgICAgICBkZWx0YVg6IGRlbHRhWCxcbiAgICAgICAgICAgIGRlbHRhWTogZGVsdGFZLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgUG9pbnRlckRyYWdnaW5nLnByb3RvdHlwZS5jcmVhdGVFdmVudEZyb21Ub3VjaCA9IGZ1bmN0aW9uIChldiwgaXNGaXJzdCkge1xuICAgICAgICB2YXIgdG91Y2hlcyA9IGV2LnRvdWNoZXM7XG4gICAgICAgIHZhciBwYWdlWDtcbiAgICAgICAgdmFyIHBhZ2VZO1xuICAgICAgICB2YXIgZGVsdGFYID0gMDtcbiAgICAgICAgdmFyIGRlbHRhWSA9IDA7XG4gICAgICAgIC8vIGlmIHRvdWNoIGNvb3JkcyBhdmFpbGFibGUsIHByZWZlcixcbiAgICAgICAgLy8gYmVjYXVzZSBGRiB3b3VsZCBnaXZlIGJhZCBldi5wYWdlWCBldi5wYWdlWVxuICAgICAgICBpZiAodG91Y2hlcyAmJiB0b3VjaGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcGFnZVggPSB0b3VjaGVzWzBdLnBhZ2VYO1xuICAgICAgICAgICAgcGFnZVkgPSB0b3VjaGVzWzBdLnBhZ2VZO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGFnZVggPSBldi5wYWdlWDtcbiAgICAgICAgICAgIHBhZ2VZID0gZXYucGFnZVk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogcmVwZWF0IGNvZGVcbiAgICAgICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgICAgICAgIHRoaXMub3JpZ1BhZ2VYID0gcGFnZVg7XG4gICAgICAgICAgICB0aGlzLm9yaWdQYWdlWSA9IHBhZ2VZO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVsdGFYID0gcGFnZVggLSB0aGlzLm9yaWdQYWdlWDtcbiAgICAgICAgICAgIGRlbHRhWSA9IHBhZ2VZIC0gdGhpcy5vcmlnUGFnZVk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9yaWdFdmVudDogZXYsXG4gICAgICAgICAgICBpc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgc3ViamVjdEVsOiB0aGlzLnN1YmplY3RFbCxcbiAgICAgICAgICAgIHBhZ2VYOiBwYWdlWCxcbiAgICAgICAgICAgIHBhZ2VZOiBwYWdlWSxcbiAgICAgICAgICAgIGRlbHRhWDogZGVsdGFYLFxuICAgICAgICAgICAgZGVsdGFZOiBkZWx0YVksXG4gICAgICAgIH07XG4gICAgfTtcbiAgICByZXR1cm4gUG9pbnRlckRyYWdnaW5nO1xufSgpKTtcbi8vIFJldHVybnMgYSBib29sZWFuIHdoZXRoZXIgdGhpcyB3YXMgYSBsZWZ0IG1vdXNlIGNsaWNrIGFuZCBubyBjdHJsIGtleSAod2hpY2ggbWVhbnMgcmlnaHQgY2xpY2sgb24gTWFjKVxuZnVuY3Rpb24gaXNQcmltYXJ5TW91c2VCdXR0b24oZXYpIHtcbiAgICByZXR1cm4gZXYuYnV0dG9uID09PSAwICYmICFldi5jdHJsS2V5O1xufVxuLy8gSWdub3JpbmcgZmFrZSBtb3VzZSBldmVudHMgZ2VuZXJhdGVkIGJ5IHRvdWNoXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydElnbm9yaW5nTW91c2UoKSB7XG4gICAgaWdub3JlTW91c2VEZXB0aCArPSAxO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZ25vcmVNb3VzZURlcHRoIC09IDE7XG4gICAgfSwgY29tbW9uLmNvbmZpZy50b3VjaE1vdXNlSWdub3JlV2FpdCk7XG59XG4vLyBXZSB3YW50IHRvIGF0dGFjaCB0b3VjaG1vdmUgYXMgZWFybHkgYXMgcG9zc2libGUgZm9yIFNhZmFyaVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gbGlzdGVuZXJDcmVhdGVkKCkge1xuICAgIGxpc3RlbmVyQ250ICs9IDE7XG4gICAgaWYgKGxpc3RlbmVyQ250ID09PSAxKSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvbldpbmRvd1RvdWNoTW92ZSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBsaXN0ZW5lckRlc3Ryb3llZCgpIHtcbiAgICBsaXN0ZW5lckNudCAtPSAxO1xuICAgIGlmICghbGlzdGVuZXJDbnQpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uV2luZG93VG91Y2hNb3ZlLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG9uV2luZG93VG91Y2hNb3ZlKGV2KSB7XG4gICAgaWYgKGlzV2luZG93VG91Y2hNb3ZlQ2FuY2VsbGVkKSB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxufVxuXG4vKlxuQW4gZWZmZWN0IGluIHdoaWNoIGFuIGVsZW1lbnQgZm9sbG93cyB0aGUgbW92ZW1lbnQgb2YgYSBwb2ludGVyIGFjcm9zcyB0aGUgc2NyZWVuLlxuVGhlIG1vdmluZyBlbGVtZW50IGlzIGEgY2xvbmUgb2Ygc29tZSBvdGhlciBlbGVtZW50LlxuTXVzdCBjYWxsIHN0YXJ0ICsgaGFuZGxlTW92ZSArIHN0b3AuXG4qL1xudmFyIEVsZW1lbnRNaXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRWxlbWVudE1pcnJvcigpIHtcbiAgICAgICAgdGhpcy5pc1Zpc2libGUgPSBmYWxzZTsgLy8gbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWRcbiAgICAgICAgdGhpcy5zb3VyY2VFbCA9IG51bGw7XG4gICAgICAgIHRoaXMubWlycm9yRWwgPSBudWxsO1xuICAgICAgICB0aGlzLnNvdXJjZUVsUmVjdCA9IG51bGw7IC8vIHNjcmVlbiBjb29yZHMgcmVsYXRpdmUgdG8gdmlld3BvcnRcbiAgICAgICAgLy8gb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgZGlyZWN0bHkgYnkgY2FsbGVyXG4gICAgICAgIHRoaXMucGFyZW50Tm9kZSA9IGRvY3VtZW50LmJvZHk7IC8vIEhJR0hMWSBTVUdHRVNURUQgdG8gc2V0IHRoaXMgdG8gc2lkZXN0ZXAgU2hhZG93RE9NIGlzc3Vlc1xuICAgICAgICB0aGlzLnpJbmRleCA9IDk5OTk7XG4gICAgICAgIHRoaXMucmV2ZXJ0RHVyYXRpb24gPSAwO1xuICAgIH1cbiAgICBFbGVtZW50TWlycm9yLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uIChzb3VyY2VFbCwgcGFnZVgsIHBhZ2VZKSB7XG4gICAgICAgIHRoaXMuc291cmNlRWwgPSBzb3VyY2VFbDtcbiAgICAgICAgdGhpcy5zb3VyY2VFbFJlY3QgPSB0aGlzLnNvdXJjZUVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLm9yaWdTY3JlZW5YID0gcGFnZVggLSB3aW5kb3cucGFnZVhPZmZzZXQ7XG4gICAgICAgIHRoaXMub3JpZ1NjcmVlblkgPSBwYWdlWSAtIHdpbmRvdy5wYWdlWU9mZnNldDtcbiAgICAgICAgdGhpcy5kZWx0YVggPSAwO1xuICAgICAgICB0aGlzLmRlbHRhWSA9IDA7XG4gICAgICAgIHRoaXMudXBkYXRlRWxQb3NpdGlvbigpO1xuICAgIH07XG4gICAgRWxlbWVudE1pcnJvci5wcm90b3R5cGUuaGFuZGxlTW92ZSA9IGZ1bmN0aW9uIChwYWdlWCwgcGFnZVkpIHtcbiAgICAgICAgdGhpcy5kZWx0YVggPSAocGFnZVggLSB3aW5kb3cucGFnZVhPZmZzZXQpIC0gdGhpcy5vcmlnU2NyZWVuWDtcbiAgICAgICAgdGhpcy5kZWx0YVkgPSAocGFnZVkgLSB3aW5kb3cucGFnZVlPZmZzZXQpIC0gdGhpcy5vcmlnU2NyZWVuWTtcbiAgICAgICAgdGhpcy51cGRhdGVFbFBvc2l0aW9uKCk7XG4gICAgfTtcbiAgICAvLyBjYW4gYmUgY2FsbGVkIGJlZm9yZSBzdGFydFxuICAgIEVsZW1lbnRNaXJyb3IucHJvdG90eXBlLnNldElzVmlzaWJsZSA9IGZ1bmN0aW9uIChib29sKSB7XG4gICAgICAgIGlmIChib29sKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWlycm9yRWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaXNWaXNpYmxlID0gYm9vbDsgLy8gbmVlZHMgdG8gaGFwcGVuIGJlZm9yZSB1cGRhdGVFbFBvc2l0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVFbFBvc2l0aW9uKCk7IC8vIGJlY2F1c2Ugd2FzIG5vdCB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgaW52aXNpYmxlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc1Zpc2libGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1pcnJvckVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pc1Zpc2libGUgPSBib29sO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBhbHdheXMgYXN5bmNcbiAgICBFbGVtZW50TWlycm9yLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gKG5lZWRzUmV2ZXJ0QW5pbWF0aW9uLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLmNsZWFudXAoKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChuZWVkc1JldmVydEFuaW1hdGlvbiAmJlxuICAgICAgICAgICAgdGhpcy5taXJyb3JFbCAmJlxuICAgICAgICAgICAgdGhpcy5pc1Zpc2libGUgJiZcbiAgICAgICAgICAgIHRoaXMucmV2ZXJ0RHVyYXRpb24gJiYgLy8gaWYgMCwgdHJhbnNpdGlvbiB3b24ndCB3b3JrXG4gICAgICAgICAgICAodGhpcy5kZWx0YVggfHwgdGhpcy5kZWx0YVkpIC8vIGlmIHNhbWUgY29vcmRzLCB0cmFuc2l0aW9uIHdvbid0IHdvcmtcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmRvUmV2ZXJ0QW5pbWF0aW9uKGRvbmUsIHRoaXMucmV2ZXJ0RHVyYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChkb25lLCAwKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRWxlbWVudE1pcnJvci5wcm90b3R5cGUuZG9SZXZlcnRBbmltYXRpb24gPSBmdW5jdGlvbiAoY2FsbGJhY2ssIHJldmVydER1cmF0aW9uKSB7XG4gICAgICAgIHZhciBtaXJyb3JFbCA9IHRoaXMubWlycm9yRWw7XG4gICAgICAgIHZhciBmaW5hbFNvdXJjZUVsUmVjdCA9IHRoaXMuc291cmNlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IC8vIGJlY2F1c2UgYXV0b3Njcm9sbGluZyBtaWdodCBoYXZlIGhhcHBlbmVkXG4gICAgICAgIG1pcnJvckVsLnN0eWxlLnRyYW5zaXRpb24gPVxuICAgICAgICAgICAgJ3RvcCAnICsgcmV2ZXJ0RHVyYXRpb24gKyAnbXMsJyArXG4gICAgICAgICAgICAgICAgJ2xlZnQgJyArIHJldmVydER1cmF0aW9uICsgJ21zJztcbiAgICAgICAgY29tbW9uLmFwcGx5U3R5bGUobWlycm9yRWwsIHtcbiAgICAgICAgICAgIGxlZnQ6IGZpbmFsU291cmNlRWxSZWN0LmxlZnQsXG4gICAgICAgICAgICB0b3A6IGZpbmFsU291cmNlRWxSZWN0LnRvcCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbW1vbi53aGVuVHJhbnNpdGlvbkRvbmUobWlycm9yRWwsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG1pcnJvckVsLnN0eWxlLnRyYW5zaXRpb24gPSAnJztcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRWxlbWVudE1pcnJvci5wcm90b3R5cGUuY2xlYW51cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMubWlycm9yRWwpIHtcbiAgICAgICAgICAgIGNvbW1vbi5yZW1vdmVFbGVtZW50KHRoaXMubWlycm9yRWwpO1xuICAgICAgICAgICAgdGhpcy5taXJyb3JFbCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zb3VyY2VFbCA9IG51bGw7XG4gICAgfTtcbiAgICBFbGVtZW50TWlycm9yLnByb3RvdHlwZS51cGRhdGVFbFBvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5zb3VyY2VFbCAmJiB0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgICAgICAgY29tbW9uLmFwcGx5U3R5bGUodGhpcy5nZXRNaXJyb3JFbCgpLCB7XG4gICAgICAgICAgICAgICAgbGVmdDogdGhpcy5zb3VyY2VFbFJlY3QubGVmdCArIHRoaXMuZGVsdGFYLFxuICAgICAgICAgICAgICAgIHRvcDogdGhpcy5zb3VyY2VFbFJlY3QudG9wICsgdGhpcy5kZWx0YVksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRWxlbWVudE1pcnJvci5wcm90b3R5cGUuZ2V0TWlycm9yRWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzb3VyY2VFbFJlY3QgPSB0aGlzLnNvdXJjZUVsUmVjdDtcbiAgICAgICAgdmFyIG1pcnJvckVsID0gdGhpcy5taXJyb3JFbDtcbiAgICAgICAgaWYgKCFtaXJyb3JFbCkge1xuICAgICAgICAgICAgbWlycm9yRWwgPSB0aGlzLm1pcnJvckVsID0gdGhpcy5zb3VyY2VFbC5jbG9uZU5vZGUodHJ1ZSk7IC8vIGNsb25lQ2hpbGRyZW49dHJ1ZVxuICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCBsb25nIHRhcHMgb3IgYW55IG1vdXNlIGludGVyYWN0aW9uIGNhdXNpbmcgc2VsZWN0aW9uL21lbnVzLlxuICAgICAgICAgICAgLy8gd291bGQgdXNlIHByZXZlbnRTZWxlY3Rpb24oKSwgYnV0IHRoYXQgcHJldmVudHMgc2VsZWN0c3RhcnQsIGNhdXNpbmcgcHJvYmxlbXMuXG4gICAgICAgICAgICBtaXJyb3JFbC5jbGFzc0xpc3QuYWRkKCdmYy11bnNlbGVjdGFibGUnKTtcbiAgICAgICAgICAgIG1pcnJvckVsLmNsYXNzTGlzdC5hZGQoJ2ZjLWV2ZW50LWRyYWdnaW5nJyk7XG4gICAgICAgICAgICBjb21tb24uYXBwbHlTdHlsZShtaXJyb3JFbCwge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICAgICAgICAgIHpJbmRleDogdGhpcy56SW5kZXgsXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogJycsXG4gICAgICAgICAgICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHNvdXJjZUVsUmVjdC5yaWdodCAtIHNvdXJjZUVsUmVjdC5sZWZ0LFxuICAgICAgICAgICAgICAgIGhlaWdodDogc291cmNlRWxSZWN0LmJvdHRvbSAtIHNvdXJjZUVsUmVjdC50b3AsXG4gICAgICAgICAgICAgICAgcmlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICBib3R0b206ICdhdXRvJyxcbiAgICAgICAgICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChtaXJyb3JFbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pcnJvckVsO1xuICAgIH07XG4gICAgcmV0dXJuIEVsZW1lbnRNaXJyb3I7XG59KCkpO1xuXG4vKlxuSXMgYSBjYWNoZSBmb3IgYSBnaXZlbiBlbGVtZW50J3Mgc2Nyb2xsIGluZm9ybWF0aW9uIChhbGwgdGhlIGluZm8gdGhhdCBTY3JvbGxDb250cm9sbGVyIHN0b3JlcylcbmluIGFkZGl0aW9uIHRoZSBcImNsaWVudCByZWN0YW5nbGVcIiBvZiB0aGUgZWxlbWVudC4uIHRoZSBhcmVhIHdpdGhpbiB0aGUgc2Nyb2xsYmFycy5cblxuVGhlIGNhY2hlIGNhbiBiZSBpbiBvbmUgb2YgdHdvIG1vZGVzOlxuLSBkb2VzTGlzdGVuaW5nOmZhbHNlIC0gaWdub3JlcyB3aGVuIHRoZSBjb250YWluZXIgaXMgc2Nyb2xsZWQgYnkgc29tZW9uZSBlbHNlXG4tIGRvZXNMaXN0ZW5pbmc6dHJ1ZSAtIHdhdGNoIGZvciBzY3JvbGxpbmcgYW5kIHVwZGF0ZSB0aGUgY2FjaGVcbiovXG52YXIgU2Nyb2xsR2VvbUNhY2hlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhTY3JvbGxHZW9tQ2FjaGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU2Nyb2xsR2VvbUNhY2hlKHNjcm9sbENvbnRyb2xsZXIsIGRvZXNMaXN0ZW5pbmcpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuaGFuZGxlU2Nyb2xsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuc2Nyb2xsVG9wID0gX3RoaXMuc2Nyb2xsQ29udHJvbGxlci5nZXRTY3JvbGxUb3AoKTtcbiAgICAgICAgICAgIF90aGlzLnNjcm9sbExlZnQgPSBfdGhpcy5zY3JvbGxDb250cm9sbGVyLmdldFNjcm9sbExlZnQoKTtcbiAgICAgICAgICAgIF90aGlzLmhhbmRsZVNjcm9sbENoYW5nZSgpO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5zY3JvbGxDb250cm9sbGVyID0gc2Nyb2xsQ29udHJvbGxlcjtcbiAgICAgICAgX3RoaXMuZG9lc0xpc3RlbmluZyA9IGRvZXNMaXN0ZW5pbmc7XG4gICAgICAgIF90aGlzLnNjcm9sbFRvcCA9IF90aGlzLm9yaWdTY3JvbGxUb3AgPSBzY3JvbGxDb250cm9sbGVyLmdldFNjcm9sbFRvcCgpO1xuICAgICAgICBfdGhpcy5zY3JvbGxMZWZ0ID0gX3RoaXMub3JpZ1Njcm9sbExlZnQgPSBzY3JvbGxDb250cm9sbGVyLmdldFNjcm9sbExlZnQoKTtcbiAgICAgICAgX3RoaXMuc2Nyb2xsV2lkdGggPSBzY3JvbGxDb250cm9sbGVyLmdldFNjcm9sbFdpZHRoKCk7XG4gICAgICAgIF90aGlzLnNjcm9sbEhlaWdodCA9IHNjcm9sbENvbnRyb2xsZXIuZ2V0U2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgIF90aGlzLmNsaWVudFdpZHRoID0gc2Nyb2xsQ29udHJvbGxlci5nZXRDbGllbnRXaWR0aCgpO1xuICAgICAgICBfdGhpcy5jbGllbnRIZWlnaHQgPSBzY3JvbGxDb250cm9sbGVyLmdldENsaWVudEhlaWdodCgpO1xuICAgICAgICBfdGhpcy5jbGllbnRSZWN0ID0gX3RoaXMuY29tcHV0ZUNsaWVudFJlY3QoKTsgLy8gZG8gbGFzdCBpbiBjYXNlIGl0IG5lZWRzIGNhY2hlZCB2YWx1ZXNcbiAgICAgICAgaWYgKF90aGlzLmRvZXNMaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIF90aGlzLmdldEV2ZW50VGFyZ2V0KCkuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgX3RoaXMuaGFuZGxlU2Nyb2xsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFNjcm9sbEdlb21DYWNoZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZG9lc0xpc3RlbmluZykge1xuICAgICAgICAgICAgdGhpcy5nZXRFdmVudFRhcmdldCgpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlU2Nyb2xsKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU2Nyb2xsR2VvbUNhY2hlLnByb3RvdHlwZS5nZXRTY3JvbGxUb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRvcDtcbiAgICB9O1xuICAgIFNjcm9sbEdlb21DYWNoZS5wcm90b3R5cGUuZ2V0U2Nyb2xsTGVmdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsTGVmdDtcbiAgICB9O1xuICAgIFNjcm9sbEdlb21DYWNoZS5wcm90b3R5cGUuc2V0U2Nyb2xsVG9wID0gZnVuY3Rpb24gKHRvcCkge1xuICAgICAgICB0aGlzLnNjcm9sbENvbnRyb2xsZXIuc2V0U2Nyb2xsVG9wKHRvcCk7XG4gICAgICAgIGlmICghdGhpcy5kb2VzTGlzdGVuaW5nKSB7XG4gICAgICAgICAgICAvLyB3ZSBhcmUgbm90IHJlbHlpbmcgb24gdGhlIGVsZW1lbnQgdG8gbm9ybWFsaXplIG91dC1vZi1ib3VuZHMgc2Nyb2xsIHZhbHVlc1xuICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBzYW5pdGl6ZSBvdXJzZWx2ZXNcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gTWF0aC5tYXgoTWF0aC5taW4odG9wLCB0aGlzLmdldE1heFNjcm9sbFRvcCgpKSwgMCk7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbENoYW5nZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTY3JvbGxHZW9tQ2FjaGUucHJvdG90eXBlLnNldFNjcm9sbExlZnQgPSBmdW5jdGlvbiAodG9wKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udHJvbGxlci5zZXRTY3JvbGxMZWZ0KHRvcCk7XG4gICAgICAgIGlmICghdGhpcy5kb2VzTGlzdGVuaW5nKSB7XG4gICAgICAgICAgICAvLyB3ZSBhcmUgbm90IHJlbHlpbmcgb24gdGhlIGVsZW1lbnQgdG8gbm9ybWFsaXplIG91dC1vZi1ib3VuZHMgc2Nyb2xsIHZhbHVlc1xuICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBzYW5pdGl6ZSBvdXJzZWx2ZXNcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsTGVmdCA9IE1hdGgubWF4KE1hdGgubWluKHRvcCwgdGhpcy5nZXRNYXhTY3JvbGxMZWZ0KCkpLCAwKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2Nyb2xsQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNjcm9sbEdlb21DYWNoZS5wcm90b3R5cGUuZ2V0Q2xpZW50V2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudFdpZHRoO1xuICAgIH07XG4gICAgU2Nyb2xsR2VvbUNhY2hlLnByb3RvdHlwZS5nZXRDbGllbnRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudEhlaWdodDtcbiAgICB9O1xuICAgIFNjcm9sbEdlb21DYWNoZS5wcm90b3R5cGUuZ2V0U2Nyb2xsV2lkdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFdpZHRoO1xuICAgIH07XG4gICAgU2Nyb2xsR2VvbUNhY2hlLnByb3RvdHlwZS5nZXRTY3JvbGxIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbEhlaWdodDtcbiAgICB9O1xuICAgIFNjcm9sbEdlb21DYWNoZS5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsQ2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgIH07XG4gICAgcmV0dXJuIFNjcm9sbEdlb21DYWNoZTtcbn0oY29tbW9uLlNjcm9sbENvbnRyb2xsZXIpKTtcblxudmFyIEVsZW1lbnRTY3JvbGxHZW9tQ2FjaGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKEVsZW1lbnRTY3JvbGxHZW9tQ2FjaGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRWxlbWVudFNjcm9sbEdlb21DYWNoZShlbCwgZG9lc0xpc3RlbmluZykge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgbmV3IGNvbW1vbi5FbGVtZW50U2Nyb2xsQ29udHJvbGxlcihlbCksIGRvZXNMaXN0ZW5pbmcpIHx8IHRoaXM7XG4gICAgfVxuICAgIEVsZW1lbnRTY3JvbGxHZW9tQ2FjaGUucHJvdG90eXBlLmdldEV2ZW50VGFyZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxDb250cm9sbGVyLmVsO1xuICAgIH07XG4gICAgRWxlbWVudFNjcm9sbEdlb21DYWNoZS5wcm90b3R5cGUuY29tcHV0ZUNsaWVudFJlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBjb21tb24uY29tcHV0ZUlubmVyUmVjdCh0aGlzLnNjcm9sbENvbnRyb2xsZXIuZWwpO1xuICAgIH07XG4gICAgcmV0dXJuIEVsZW1lbnRTY3JvbGxHZW9tQ2FjaGU7XG59KFNjcm9sbEdlb21DYWNoZSkpO1xuXG52YXIgV2luZG93U2Nyb2xsR2VvbUNhY2hlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhXaW5kb3dTY3JvbGxHZW9tQ2FjaGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gV2luZG93U2Nyb2xsR2VvbUNhY2hlKGRvZXNMaXN0ZW5pbmcpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIG5ldyBjb21tb24uV2luZG93U2Nyb2xsQ29udHJvbGxlcigpLCBkb2VzTGlzdGVuaW5nKSB8fCB0aGlzO1xuICAgIH1cbiAgICBXaW5kb3dTY3JvbGxHZW9tQ2FjaGUucHJvdG90eXBlLmdldEV2ZW50VGFyZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgIH07XG4gICAgV2luZG93U2Nyb2xsR2VvbUNhY2hlLnByb3RvdHlwZS5jb21wdXRlQ2xpZW50UmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlZnQ6IHRoaXMuc2Nyb2xsTGVmdCxcbiAgICAgICAgICAgIHJpZ2h0OiB0aGlzLnNjcm9sbExlZnQgKyB0aGlzLmNsaWVudFdpZHRoLFxuICAgICAgICAgICAgdG9wOiB0aGlzLnNjcm9sbFRvcCxcbiAgICAgICAgICAgIGJvdHRvbTogdGhpcy5zY3JvbGxUb3AgKyB0aGlzLmNsaWVudEhlaWdodCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8vIHRoZSB3aW5kb3cgaXMgdGhlIG9ubHkgc2Nyb2xsIG9iamVjdCB0aGF0IGNoYW5nZXMgaXQncyByZWN0YW5nbGUgcmVsYXRpdmVcbiAgICAvLyB0byB0aGUgZG9jdW1lbnQncyB0b3BsZWZ0IGFzIGl0IHNjcm9sbHNcbiAgICBXaW5kb3dTY3JvbGxHZW9tQ2FjaGUucHJvdG90eXBlLmhhbmRsZVNjcm9sbENoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jbGllbnRSZWN0ID0gdGhpcy5jb21wdXRlQ2xpZW50UmVjdCgpO1xuICAgIH07XG4gICAgcmV0dXJuIFdpbmRvd1Njcm9sbEdlb21DYWNoZTtcbn0oU2Nyb2xsR2VvbUNhY2hlKSk7XG5cbi8vIElmIGF2YWlsYWJsZSB3ZSBhcmUgdXNpbmcgbmF0aXZlIFwicGVyZm9ybWFuY2VcIiBBUEkgaW5zdGVhZCBvZiBcIkRhdGVcIlxuLy8gUmVhZCBtb3JlIGFib3V0IGl0IG9uIE1ETjpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9QZXJmb3JtYW5jZVxudmFyIGdldFRpbWUgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdmdW5jdGlvbicgPyBwZXJmb3JtYW5jZS5ub3cgOiBEYXRlLm5vdztcbi8qXG5Gb3IgYSBwb2ludGVyIGludGVyYWN0aW9uLCBhdXRvbWF0aWNhbGx5IHNjcm9sbHMgY2VydGFpbiBzY3JvbGwgY29udGFpbmVycyB3aGVuIHRoZSBwb2ludGVyXG5hcHByb2FjaGVzIHRoZSBlZGdlLlxuXG5UaGUgY2FsbGVyIG11c3QgY2FsbCBzdGFydCArIGhhbmRsZU1vdmUgKyBzdG9wLlxuKi9cbnZhciBBdXRvU2Nyb2xsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXV0b1Njcm9sbGVyKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvLyBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBieSBjYWxsZXJcbiAgICAgICAgdGhpcy5pc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNjcm9sbFF1ZXJ5ID0gW3dpbmRvdywgJy5mYy1zY3JvbGxlciddO1xuICAgICAgICB0aGlzLmVkZ2VUaHJlc2hvbGQgPSA1MDsgLy8gcGl4ZWxzXG4gICAgICAgIHRoaXMubWF4VmVsb2NpdHkgPSAzMDA7IC8vIHBpeGVscyBwZXIgc2Vjb25kXG4gICAgICAgIC8vIGludGVybmFsIHN0YXRlXG4gICAgICAgIHRoaXMucG9pbnRlclNjcmVlblggPSBudWxsO1xuICAgICAgICB0aGlzLnBvaW50ZXJTY3JlZW5ZID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNjcm9sbENhY2hlcyA9IG51bGw7XG4gICAgICAgIC8vIHByb3RlY3QgYWdhaW5zdCB0aGUgaW5pdGlhbCBwb2ludGVyZG93biBiZWluZyB0b28gY2xvc2UgdG8gYW4gZWRnZSBhbmQgc3RhcnRpbmcgdGhlIHNjcm9sbFxuICAgICAgICB0aGlzLmV2ZXJNb3ZlZFVwID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXZlck1vdmVkRG93biA9IGZhbHNlO1xuICAgICAgICB0aGlzLmV2ZXJNb3ZlZExlZnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmVyTW92ZWRSaWdodCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFuaW1hdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMuaXNBbmltYXRpbmcpIHsgLy8gd2Fzbid0IGNhbmNlbGxlZCBiZXR3ZWVuIGFuaW1hdGlvbiBjYWxsc1xuICAgICAgICAgICAgICAgIHZhciBlZGdlID0gX3RoaXMuY29tcHV0ZUJlc3RFZGdlKF90aGlzLnBvaW50ZXJTY3JlZW5YICsgd2luZG93LnBhZ2VYT2Zmc2V0LCBfdGhpcy5wb2ludGVyU2NyZWVuWSArIHdpbmRvdy5wYWdlWU9mZnNldCk7XG4gICAgICAgICAgICAgICAgaWYgKGVkZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5vdyA9IGdldFRpbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuaGFuZGxlU2lkZShlZGdlLCAobm93IC0gX3RoaXMubXNTaW5jZVJlcXVlc3QpIC8gMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlcXVlc3RBbmltYXRpb24obm93KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7IC8vIHdpbGwgc3RvcCBhbmltYXRpb25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIEF1dG9TY3JvbGxlci5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAocGFnZVgsIHBhZ2VZLCBzY3JvbGxTdGFydEVsKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxDYWNoZXMgPSB0aGlzLmJ1aWxkQ2FjaGVzKHNjcm9sbFN0YXJ0RWwpO1xuICAgICAgICAgICAgdGhpcy5wb2ludGVyU2NyZWVuWCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnBvaW50ZXJTY3JlZW5ZID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZXZlck1vdmVkVXAgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZXZlck1vdmVkRG93biA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5ldmVyTW92ZWRMZWZ0ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmV2ZXJNb3ZlZFJpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU1vdmUocGFnZVgsIHBhZ2VZKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQXV0b1Njcm9sbGVyLnByb3RvdHlwZS5oYW5kbGVNb3ZlID0gZnVuY3Rpb24gKHBhZ2VYLCBwYWdlWSkge1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHZhciBwb2ludGVyU2NyZWVuWCA9IHBhZ2VYIC0gd2luZG93LnBhZ2VYT2Zmc2V0O1xuICAgICAgICAgICAgdmFyIHBvaW50ZXJTY3JlZW5ZID0gcGFnZVkgLSB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gICAgICAgICAgICB2YXIgeURlbHRhID0gdGhpcy5wb2ludGVyU2NyZWVuWSA9PT0gbnVsbCA/IDAgOiBwb2ludGVyU2NyZWVuWSAtIHRoaXMucG9pbnRlclNjcmVlblk7XG4gICAgICAgICAgICB2YXIgeERlbHRhID0gdGhpcy5wb2ludGVyU2NyZWVuWCA9PT0gbnVsbCA/IDAgOiBwb2ludGVyU2NyZWVuWCAtIHRoaXMucG9pbnRlclNjcmVlblg7XG4gICAgICAgICAgICBpZiAoeURlbHRhIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlck1vdmVkVXAgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoeURlbHRhID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlck1vdmVkRG93biA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoeERlbHRhIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlck1vdmVkTGVmdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh4RGVsdGEgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVyTW92ZWRSaWdodCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBvaW50ZXJTY3JlZW5YID0gcG9pbnRlclNjcmVlblg7XG4gICAgICAgICAgICB0aGlzLnBvaW50ZXJTY3JlZW5ZID0gcG9pbnRlclNjcmVlblk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNBbmltYXRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RBbmltYXRpb24oZ2V0VGltZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgQXV0b1Njcm9sbGVyLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSBmYWxzZTsgLy8gd2lsbCBzdG9wIGFuaW1hdGlvblxuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMuc2Nyb2xsQ2FjaGVzOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIHZhciBzY3JvbGxDYWNoZSA9IF9hW19pXTtcbiAgICAgICAgICAgICAgICBzY3JvbGxDYWNoZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNjcm9sbENhY2hlcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEF1dG9TY3JvbGxlci5wcm90b3R5cGUucmVxdWVzdEFuaW1hdGlvbiA9IGZ1bmN0aW9uIChub3cpIHtcbiAgICAgICAgdGhpcy5tc1NpbmNlUmVxdWVzdCA9IG5vdztcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0ZSk7XG4gICAgfTtcbiAgICBBdXRvU2Nyb2xsZXIucHJvdG90eXBlLmhhbmRsZVNpZGUgPSBmdW5jdGlvbiAoZWRnZSwgc2Vjb25kcykge1xuICAgICAgICB2YXIgc2Nyb2xsQ2FjaGUgPSBlZGdlLnNjcm9sbENhY2hlO1xuICAgICAgICB2YXIgZWRnZVRocmVzaG9sZCA9IHRoaXMuZWRnZVRocmVzaG9sZDtcbiAgICAgICAgdmFyIGludkRpc3RhbmNlID0gZWRnZVRocmVzaG9sZCAtIGVkZ2UuZGlzdGFuY2U7XG4gICAgICAgIHZhciB2ZWxvY2l0eSA9IC8vIHRoZSBjbG9zZXIgdG8gdGhlIGVkZ2UsIHRoZSBmYXN0ZXIgd2Ugc2Nyb2xsXG4gICAgICAgICAoKGludkRpc3RhbmNlICogaW52RGlzdGFuY2UpIC8gKGVkZ2VUaHJlc2hvbGQgKiBlZGdlVGhyZXNob2xkKSkgKiAvLyBxdWFkcmF0aWNcbiAgICAgICAgICAgIHRoaXMubWF4VmVsb2NpdHkgKiBzZWNvbmRzO1xuICAgICAgICB2YXIgc2lnbiA9IDE7XG4gICAgICAgIHN3aXRjaCAoZWRnZS5uYW1lKSB7XG4gICAgICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICAgICAgICBzaWduID0gLTE7XG4gICAgICAgICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICAgICAgc2Nyb2xsQ2FjaGUuc2V0U2Nyb2xsTGVmdChzY3JvbGxDYWNoZS5nZXRTY3JvbGxMZWZ0KCkgKyB2ZWxvY2l0eSAqIHNpZ24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgICAgICBzaWduID0gLTE7XG4gICAgICAgICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgICAgIHNjcm9sbENhY2hlLnNldFNjcm9sbFRvcChzY3JvbGxDYWNoZS5nZXRTY3JvbGxUb3AoKSArIHZlbG9jaXR5ICogc2lnbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIGxlZnQvdG9wIGFyZSByZWxhdGl2ZSB0byBkb2N1bWVudCB0b3BsZWZ0XG4gICAgQXV0b1Njcm9sbGVyLnByb3RvdHlwZS5jb21wdXRlQmVzdEVkZ2UgPSBmdW5jdGlvbiAobGVmdCwgdG9wKSB7XG4gICAgICAgIHZhciBlZGdlVGhyZXNob2xkID0gdGhpcy5lZGdlVGhyZXNob2xkO1xuICAgICAgICB2YXIgYmVzdFNpZGUgPSBudWxsO1xuICAgICAgICB2YXIgc2Nyb2xsQ2FjaGVzID0gdGhpcy5zY3JvbGxDYWNoZXMgfHwgW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgc2Nyb2xsQ2FjaGVzXzEgPSBzY3JvbGxDYWNoZXM7IF9pIDwgc2Nyb2xsQ2FjaGVzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgc2Nyb2xsQ2FjaGUgPSBzY3JvbGxDYWNoZXNfMVtfaV07XG4gICAgICAgICAgICB2YXIgcmVjdCA9IHNjcm9sbENhY2hlLmNsaWVudFJlY3Q7XG4gICAgICAgICAgICB2YXIgbGVmdERpc3QgPSBsZWZ0IC0gcmVjdC5sZWZ0O1xuICAgICAgICAgICAgdmFyIHJpZ2h0RGlzdCA9IHJlY3QucmlnaHQgLSBsZWZ0O1xuICAgICAgICAgICAgdmFyIHRvcERpc3QgPSB0b3AgLSByZWN0LnRvcDtcbiAgICAgICAgICAgIHZhciBib3R0b21EaXN0ID0gcmVjdC5ib3R0b20gLSB0b3A7XG4gICAgICAgICAgICAvLyBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgcmVjdD9cbiAgICAgICAgICAgIGlmIChsZWZ0RGlzdCA+PSAwICYmIHJpZ2h0RGlzdCA+PSAwICYmIHRvcERpc3QgPj0gMCAmJiBib3R0b21EaXN0ID49IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodG9wRGlzdCA8PSBlZGdlVGhyZXNob2xkICYmIHRoaXMuZXZlck1vdmVkVXAgJiYgc2Nyb2xsQ2FjaGUuY2FuU2Nyb2xsVXAoKSAmJlxuICAgICAgICAgICAgICAgICAgICAoIWJlc3RTaWRlIHx8IGJlc3RTaWRlLmRpc3RhbmNlID4gdG9wRGlzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYmVzdFNpZGUgPSB7IHNjcm9sbENhY2hlOiBzY3JvbGxDYWNoZSwgbmFtZTogJ3RvcCcsIGRpc3RhbmNlOiB0b3BEaXN0IH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChib3R0b21EaXN0IDw9IGVkZ2VUaHJlc2hvbGQgJiYgdGhpcy5ldmVyTW92ZWREb3duICYmIHNjcm9sbENhY2hlLmNhblNjcm9sbERvd24oKSAmJlxuICAgICAgICAgICAgICAgICAgICAoIWJlc3RTaWRlIHx8IGJlc3RTaWRlLmRpc3RhbmNlID4gYm90dG9tRGlzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYmVzdFNpZGUgPSB7IHNjcm9sbENhY2hlOiBzY3JvbGxDYWNoZSwgbmFtZTogJ2JvdHRvbScsIGRpc3RhbmNlOiBib3R0b21EaXN0IH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsZWZ0RGlzdCA8PSBlZGdlVGhyZXNob2xkICYmIHRoaXMuZXZlck1vdmVkTGVmdCAmJiBzY3JvbGxDYWNoZS5jYW5TY3JvbGxMZWZ0KCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKCFiZXN0U2lkZSB8fCBiZXN0U2lkZS5kaXN0YW5jZSA+IGxlZnREaXN0KSkge1xuICAgICAgICAgICAgICAgICAgICBiZXN0U2lkZSA9IHsgc2Nyb2xsQ2FjaGU6IHNjcm9sbENhY2hlLCBuYW1lOiAnbGVmdCcsIGRpc3RhbmNlOiBsZWZ0RGlzdCB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmlnaHREaXN0IDw9IGVkZ2VUaHJlc2hvbGQgJiYgdGhpcy5ldmVyTW92ZWRSaWdodCAmJiBzY3JvbGxDYWNoZS5jYW5TY3JvbGxSaWdodCgpICYmXG4gICAgICAgICAgICAgICAgICAgICghYmVzdFNpZGUgfHwgYmVzdFNpZGUuZGlzdGFuY2UgPiByaWdodERpc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RTaWRlID0geyBzY3JvbGxDYWNoZTogc2Nyb2xsQ2FjaGUsIG5hbWU6ICdyaWdodCcsIGRpc3RhbmNlOiByaWdodERpc3QgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJlc3RTaWRlO1xuICAgIH07XG4gICAgQXV0b1Njcm9sbGVyLnByb3RvdHlwZS5idWlsZENhY2hlcyA9IGZ1bmN0aW9uIChzY3JvbGxTdGFydEVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2Nyb2xsRWxzKHNjcm9sbFN0YXJ0RWwpLm1hcChmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIGlmIChlbCA9PT0gd2luZG93KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3dTY3JvbGxHZW9tQ2FjaGUoZmFsc2UpOyAvLyBmYWxzZSA9IGRvbid0IGxpc3RlbiB0byB1c2VyLWdlbmVyYXRlZCBzY3JvbGxzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRTY3JvbGxHZW9tQ2FjaGUoZWwsIGZhbHNlKTsgLy8gZmFsc2UgPSBkb24ndCBsaXN0ZW4gdG8gdXNlci1nZW5lcmF0ZWQgc2Nyb2xsc1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEF1dG9TY3JvbGxlci5wcm90b3R5cGUucXVlcnlTY3JvbGxFbHMgPSBmdW5jdGlvbiAoc2Nyb2xsU3RhcnRFbCkge1xuICAgICAgICB2YXIgZWxzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0aGlzLnNjcm9sbFF1ZXJ5OyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIHF1ZXJ5ID0gX2FbX2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBxdWVyeSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBlbHMucHVzaChxdWVyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbHMucHVzaC5hcHBseShlbHMsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGNvbW1vbi5nZXRFbFJvb3Qoc2Nyb2xsU3RhcnRFbCkucXVlcnlTZWxlY3RvckFsbChxdWVyeSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxzO1xuICAgIH07XG4gICAgcmV0dXJuIEF1dG9TY3JvbGxlcjtcbn0oKSk7XG5cbi8qXG5Nb25pdG9ycyBkcmFnZ2luZyBvbiBhbiBlbGVtZW50LiBIYXMgYSBudW1iZXIgb2YgaGlnaC1sZXZlbCBmZWF0dXJlczpcbi0gbWluaW11bSBkaXN0YW5jZSByZXF1aXJlZCBiZWZvcmUgZHJhZ2dpbmdcbi0gbWluaW11bSB3YWl0IHRpbWUgKFwiZGVsYXlcIikgYmVmb3JlIGRyYWdnaW5nXG4tIGEgbWlycm9yIGVsZW1lbnQgdGhhdCBmb2xsb3dzIHRoZSBwb2ludGVyXG4qL1xudmFyIEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZyhjb250YWluZXJFbCwgc2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgY29udGFpbmVyRWwpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmNvbnRhaW5lckVsID0gY29udGFpbmVyRWw7XG4gICAgICAgIC8vIG9wdGlvbnMgdGhhdCBjYW4gYmUgZGlyZWN0bHkgc2V0IGJ5IGNhbGxlclxuICAgICAgICAvLyB0aGUgY2FsbGVyIGNhbiBhbHNvIHNldCB0aGUgUG9pbnRlckRyYWdnaW5nJ3Mgb3B0aW9ucyBhcyB3ZWxsXG4gICAgICAgIF90aGlzLmRlbGF5ID0gbnVsbDtcbiAgICAgICAgX3RoaXMubWluRGlzdGFuY2UgPSAwO1xuICAgICAgICBfdGhpcy50b3VjaFNjcm9sbEFsbG93ZWQgPSB0cnVlOyAvLyBwcmV2ZW50cyBkcmFnIGZyb20gc3RhcnRpbmcgYW5kIGJsb2NrcyBzY3JvbGxpbmcgZHVyaW5nIGRyYWdcbiAgICAgICAgX3RoaXMubWlycm9yTmVlZHNSZXZlcnQgPSBmYWxzZTtcbiAgICAgICAgX3RoaXMuaXNJbnRlcmFjdGluZyA9IGZhbHNlOyAvLyBpcyB0aGUgdXNlciB2YWxpZGx5IG1vdmluZyB0aGUgcG9pbnRlcj8gbGFzdHMgdW50aWwgcG9pbnRlcnVwXG4gICAgICAgIF90aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTsgLy8gaXMgaXQgSU5URU5URlVMTFkgZHJhZ2dpbmc/IGxhc3RzIHVudGlsIGFmdGVyIHJldmVydCBhbmltYXRpb25cbiAgICAgICAgX3RoaXMuaXNEZWxheUVuZGVkID0gZmFsc2U7XG4gICAgICAgIF90aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgX3RoaXMuZGVsYXlUaW1lb3V0SWQgPSBudWxsO1xuICAgICAgICBfdGhpcy5vblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzLmlzRHJhZ2dpbmcpIHsgLy8gc28gbmV3IGRyYWcgZG9lc24ndCBoYXBwZW4gd2hpbGUgcmV2ZXJ0IGFuaW1hdGlvbiBpcyBnb2luZ1xuICAgICAgICAgICAgICAgIF90aGlzLmlzSW50ZXJhY3RpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIF90aGlzLmlzRGVsYXlFbmRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIF90aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb21tb24ucHJldmVudFNlbGVjdGlvbihkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICAgICAgICBjb21tb24ucHJldmVudENvbnRleHRNZW51KGRvY3VtZW50LmJvZHkpO1xuICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgbGlua3MgZnJvbSBiZWluZyB2aXNpdGVkIGlmIHRoZXJlJ3MgYW4gZXZlbnR1YWwgZHJhZy5cbiAgICAgICAgICAgICAgICAvLyBhbHNvIHByZXZlbnRzIHNlbGVjdGlvbiBpbiBvbGRlciBicm93c2VycyAobWF5YmU/KS5cbiAgICAgICAgICAgICAgICAvLyBub3QgbmVjZXNzYXJ5IGZvciB0b3VjaCwgYmVzaWRlcywgYnJvd3NlciB3b3VsZCBjb21wbGFpbiBhYm91dCBwYXNzaXZlbmVzcy5cbiAgICAgICAgICAgICAgICBpZiAoIWV2LmlzVG91Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgZXYub3JpZ0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF90aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcmRvd24nLCBldik7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmlzSW50ZXJhY3RpbmcgJiYgLy8gbm90IGRlc3Ryb3llZCB2aWEgcG9pbnRlcmRvd24gaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAhX3RoaXMucG9pbnRlci5zaG91bGRJZ25vcmVNb3ZlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFjdGlvbnMgcmVsYXRlZCB0byBpbml0aWF0aW5nIGRyYWdzdGFydCtkcmFnbW92ZStkcmFnZW5kLi4uXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm1pcnJvci5zZXRJc1Zpc2libGUoZmFsc2UpOyAvLyByZXNldC4gY2FsbGVyIG11c3Qgc2V0LXZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMubWlycm9yLnN0YXJ0KGV2LnN1YmplY3RFbCwgZXYucGFnZVgsIGV2LnBhZ2VZKTsgLy8gbXVzdCBoYXBwZW4gb24gZmlyc3QgcG9pbnRlciBkb3duXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnN0YXJ0RGVsYXkoZXYpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIV90aGlzLm1pbkRpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5oYW5kbGVEaXN0YW5jZVN1cnBhc3NlZChldik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLm9uUG9pbnRlck1vdmUgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5pc0ludGVyYWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdHRlci50cmlnZ2VyKCdwb2ludGVybW92ZScsIGV2KTtcbiAgICAgICAgICAgICAgICBpZiAoIV90aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1pbkRpc3RhbmNlID0gX3RoaXMubWluRGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkaXN0YW5jZVNxID0gdm9pZCAwOyAvLyBjdXJyZW50IGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbiwgc3F1YXJlZFxuICAgICAgICAgICAgICAgICAgICB2YXIgZGVsdGFYID0gZXYuZGVsdGFYLCBkZWx0YVkgPSBldi5kZWx0YVk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlU3EgPSBkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZVNxID49IG1pbkRpc3RhbmNlICogbWluRGlzdGFuY2UpIHsgLy8gdXNlIHB5dGhhZ29yZWFuIHRoZW9yZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmhhbmRsZURpc3RhbmNlU3VycGFzc2VkKGV2KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAgICAgICAgICAgICAvLyBhIHJlYWwgcG9pbnRlciBtb3ZlPyAobm90IG9uZSBzaW11bGF0ZWQgYnkgc2Nyb2xsaW5nKVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXYub3JpZ0V2ZW50LnR5cGUgIT09ICdzY3JvbGwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5taXJyb3IuaGFuZGxlTW92ZShldi5wYWdlWCwgZXYucGFnZVkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuYXV0b1Njcm9sbGVyLmhhbmRsZU1vdmUoZXYucGFnZVgsIGV2LnBhZ2VZKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ2RyYWdtb3ZlJywgZXYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMub25Qb2ludGVyVXAgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5pc0ludGVyYWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuaXNJbnRlcmFjdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbW1vbi5hbGxvd1NlbGVjdGlvbihkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICAgICAgICBjb21tb24uYWxsb3dDb250ZXh0TWVudShkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJ1cCcsIGV2KTsgLy8gY2FuIHBvdGVudGlhbGx5IHNldCBtaXJyb3JOZWVkc1JldmVydFxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmF1dG9TY3JvbGxlci5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnRyeVN0b3BEcmFnKGV2KTsgLy8gd2hpY2ggd2lsbCBzdG9wIHRoZSBtaXJyb3JcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmRlbGF5VGltZW91dElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChfdGhpcy5kZWxheVRpbWVvdXRJZCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmRlbGF5VGltZW91dElkID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHZhciBwb2ludGVyID0gX3RoaXMucG9pbnRlciA9IG5ldyBQb2ludGVyRHJhZ2dpbmcoY29udGFpbmVyRWwpO1xuICAgICAgICBwb2ludGVyLmVtaXR0ZXIub24oJ3BvaW50ZXJkb3duJywgX3RoaXMub25Qb2ludGVyRG93bik7XG4gICAgICAgIHBvaW50ZXIuZW1pdHRlci5vbigncG9pbnRlcm1vdmUnLCBfdGhpcy5vblBvaW50ZXJNb3ZlKTtcbiAgICAgICAgcG9pbnRlci5lbWl0dGVyLm9uKCdwb2ludGVydXAnLCBfdGhpcy5vblBvaW50ZXJVcCk7XG4gICAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgcG9pbnRlci5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIF90aGlzLm1pcnJvciA9IG5ldyBFbGVtZW50TWlycm9yKCk7XG4gICAgICAgIF90aGlzLmF1dG9TY3JvbGxlciA9IG5ldyBBdXRvU2Nyb2xsZXIoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBGZWF0dXJlZnVsRWxlbWVudERyYWdnaW5nLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBvaW50ZXIuZGVzdHJveSgpO1xuICAgICAgICAvLyBIQUNLOiBzaW11bGF0ZSBhIHBvaW50ZXItdXAgdG8gZW5kIHRoZSBjdXJyZW50IGRyYWdcbiAgICAgICAgLy8gVE9ETzogZmlyZSAnZHJhZ2VuZCcgZGlyZWN0bHkgYW5kIHN0b3AgaW50ZXJhY3Rpb24uIGRpc2NvdXJhZ2UgdXNlIG9mIHBvaW50ZXJ1cCBldmVudCAoYi9jIG1pZ2h0IG5vdCBmaXJlKVxuICAgICAgICB0aGlzLm9uUG9pbnRlclVwKHt9KTtcbiAgICB9O1xuICAgIEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcucHJvdG90eXBlLnN0YXJ0RGVsYXkgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRlbGF5ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5kZWxheVRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmRlbGF5VGltZW91dElkID0gbnVsbDtcbiAgICAgICAgICAgICAgICBfdGhpcy5oYW5kbGVEZWxheUVuZChldik7XG4gICAgICAgICAgICB9LCB0aGlzLmRlbGF5KTsgLy8gbm90IGFzc2lnbmFibGUgdG8gbnVtYmVyIVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVEZWxheUVuZChldik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcucHJvdG90eXBlLmhhbmRsZURlbGF5RW5kID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIHRoaXMuaXNEZWxheUVuZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50cnlTdGFydERyYWcoZXYpO1xuICAgIH07XG4gICAgRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUuaGFuZGxlRGlzdGFuY2VTdXJwYXNzZWQgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgdGhpcy5pc0Rpc3RhbmNlU3VycGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50cnlTdGFydERyYWcoZXYpO1xuICAgIH07XG4gICAgRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUudHJ5U3RhcnREcmFnID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIGlmICh0aGlzLmlzRGVsYXlFbmRlZCAmJiB0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5wb2ludGVyLndhc1RvdWNoU2Nyb2xsIHx8IHRoaXMudG91Y2hTY3JvbGxBbGxvd2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLm1pcnJvck5lZWRzUmV2ZXJ0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvU2Nyb2xsZXIuc3RhcnQoZXYucGFnZVgsIGV2LnBhZ2VZLCB0aGlzLmNvbnRhaW5lckVsKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcignZHJhZ3N0YXJ0JywgZXYpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRvdWNoU2Nyb2xsQWxsb3dlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2ludGVyLmNhbmNlbFRvdWNoU2Nyb2xsKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBGZWF0dXJlZnVsRWxlbWVudERyYWdnaW5nLnByb3RvdHlwZS50cnlTdG9wRHJhZyA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAvLyAuc3RvcCgpIGlzIEFMV0FZUyBhc3luY2hyb25vdXMsIHdoaWNoIHdlIE5FRUQgYmVjYXVzZSB3ZSB3YW50IGFsbCBwb2ludGVydXAgZXZlbnRzXG4gICAgICAgIC8vIHRoYXQgY29tZSBmcm9tIHRoZSBkb2N1bWVudCB0byBmaXJlIGJlZm9yZWhhbmQuIG11Y2ggbW9yZSBjb252ZW5pZW50IHRoaXMgd2F5LlxuICAgICAgICB0aGlzLm1pcnJvci5zdG9wKHRoaXMubWlycm9yTmVlZHNSZXZlcnQsIHRoaXMuc3RvcERyYWcuYmluZCh0aGlzLCBldikpO1xuICAgIH07XG4gICAgRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUuc3RvcERyYWcgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW1pdHRlci50cmlnZ2VyKCdkcmFnZW5kJywgZXYpO1xuICAgIH07XG4gICAgLy8gZmlsbCBpbiB0aGUgaW1wbGVtZW50YXRpb25zLi4uXG4gICAgRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUuc2V0SWdub3JlTW92ZSA9IGZ1bmN0aW9uIChib29sKSB7XG4gICAgICAgIHRoaXMucG9pbnRlci5zaG91bGRJZ25vcmVNb3ZlID0gYm9vbDtcbiAgICB9O1xuICAgIEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcucHJvdG90eXBlLnNldE1pcnJvcklzVmlzaWJsZSA9IGZ1bmN0aW9uIChib29sKSB7XG4gICAgICAgIHRoaXMubWlycm9yLnNldElzVmlzaWJsZShib29sKTtcbiAgICB9O1xuICAgIEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcucHJvdG90eXBlLnNldE1pcnJvck5lZWRzUmV2ZXJ0ID0gZnVuY3Rpb24gKGJvb2wpIHtcbiAgICAgICAgdGhpcy5taXJyb3JOZWVkc1JldmVydCA9IGJvb2w7XG4gICAgfTtcbiAgICBGZWF0dXJlZnVsRWxlbWVudERyYWdnaW5nLnByb3RvdHlwZS5zZXRBdXRvU2Nyb2xsRW5hYmxlZCA9IGZ1bmN0aW9uIChib29sKSB7XG4gICAgICAgIHRoaXMuYXV0b1Njcm9sbGVyLmlzRW5hYmxlZCA9IGJvb2w7XG4gICAgfTtcbiAgICByZXR1cm4gRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZztcbn0oY29tbW9uLkVsZW1lbnREcmFnZ2luZykpO1xuXG4vKlxuV2hlbiB0aGlzIGNsYXNzIGlzIGluc3RhbnRpYXRlZCwgaXQgcmVjb3JkcyB0aGUgb2Zmc2V0IG9mIGFuIGVsZW1lbnQgKHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudCB0b3BsZWZ0KSxcbmFuZCBjb250aW51ZXMgdG8gbW9uaXRvciBzY3JvbGxpbmcsIHVwZGF0aW5nIHRoZSBjYWNoZWQgY29vcmRpbmF0ZXMgaWYgaXQgbmVlZHMgdG8uXG5Eb2VzIG5vdCBhY2Nlc3MgdGhlIERPTSBhZnRlciBpbnN0YW50aWF0aW9uLCBzbyBoaWdobHkgcGVyZm9ybWFudC5cblxuQWxzbyBrZWVwcyB0cmFjayBvZiBhbGwgc2Nyb2xsaW5nL292ZXJmbG93OmhpZGRlbiBjb250YWluZXJzIHRoYXQgYXJlIHBhcmVudHMgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbmFuZCBhbiBkZXRlcm1pbmUgaWYgYSBnaXZlbiBwb2ludCBpcyBpbnNpZGUgdGhlIGNvbWJpbmVkIGNsaXBwaW5nIHJlY3RhbmdsZS5cbiovXG52YXIgT2Zmc2V0VHJhY2tlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBPZmZzZXRUcmFja2VyKGVsKSB7XG4gICAgICAgIHRoaXMub3JpZ1JlY3QgPSBjb21tb24uY29tcHV0ZVJlY3QoZWwpO1xuICAgICAgICAvLyB3aWxsIHdvcmsgZmluZSBmb3IgZGl2cyB0aGF0IGhhdmUgb3ZlcmZsb3c6aGlkZGVuXG4gICAgICAgIHRoaXMuc2Nyb2xsQ2FjaGVzID0gY29tbW9uLmdldENsaXBwaW5nUGFyZW50cyhlbCkubWFwKGZ1bmN0aW9uIChzY3JvbGxFbCkgeyByZXR1cm4gbmV3IEVsZW1lbnRTY3JvbGxHZW9tQ2FjaGUoc2Nyb2xsRWwsIHRydWUpOyB9KTtcbiAgICB9XG4gICAgT2Zmc2V0VHJhY2tlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMuc2Nyb2xsQ2FjaGVzOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIHNjcm9sbENhY2hlID0gX2FbX2ldO1xuICAgICAgICAgICAgc2Nyb2xsQ2FjaGUuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPZmZzZXRUcmFja2VyLnByb3RvdHlwZS5jb21wdXRlTGVmdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGxlZnQgPSB0aGlzLm9yaWdSZWN0LmxlZnQ7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0aGlzLnNjcm9sbENhY2hlczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBzY3JvbGxDYWNoZSA9IF9hW19pXTtcbiAgICAgICAgICAgIGxlZnQgKz0gc2Nyb2xsQ2FjaGUub3JpZ1Njcm9sbExlZnQgLSBzY3JvbGxDYWNoZS5nZXRTY3JvbGxMZWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxlZnQ7XG4gICAgfTtcbiAgICBPZmZzZXRUcmFja2VyLnByb3RvdHlwZS5jb21wdXRlVG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdG9wID0gdGhpcy5vcmlnUmVjdC50b3A7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0aGlzLnNjcm9sbENhY2hlczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBzY3JvbGxDYWNoZSA9IF9hW19pXTtcbiAgICAgICAgICAgIHRvcCArPSBzY3JvbGxDYWNoZS5vcmlnU2Nyb2xsVG9wIC0gc2Nyb2xsQ2FjaGUuZ2V0U2Nyb2xsVG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvcDtcbiAgICB9O1xuICAgIE9mZnNldFRyYWNrZXIucHJvdG90eXBlLmlzV2l0aGluQ2xpcHBpbmcgPSBmdW5jdGlvbiAocGFnZVgsIHBhZ2VZKSB7XG4gICAgICAgIHZhciBwb2ludCA9IHsgbGVmdDogcGFnZVgsIHRvcDogcGFnZVkgfTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMuc2Nyb2xsQ2FjaGVzOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFyIHNjcm9sbENhY2hlID0gX2FbX2ldO1xuICAgICAgICAgICAgaWYgKCFpc0lnbm9yZWRDbGlwcGluZyhzY3JvbGxDYWNoZS5nZXRFdmVudFRhcmdldCgpKSAmJlxuICAgICAgICAgICAgICAgICFjb21tb24ucG9pbnRJbnNpZGVSZWN0KHBvaW50LCBzY3JvbGxDYWNoZS5jbGllbnRSZWN0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiBPZmZzZXRUcmFja2VyO1xufSgpKTtcbi8vIGNlcnRhaW4gY2xpcHBpbmcgY29udGFpbmVycyBzaG91bGQgbmV2ZXIgY29uc3RyYWluIGludGVyYWN0aW9ucywgbGlrZSA8aHRtbD4gYW5kIDxib2R5PlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Z1bGxjYWxlbmRhci9mdWxsY2FsZW5kYXIvaXNzdWVzLzM2MTVcbmZ1bmN0aW9uIGlzSWdub3JlZENsaXBwaW5nKG5vZGUpIHtcbiAgICB2YXIgdGFnTmFtZSA9IG5vZGUudGFnTmFtZTtcbiAgICByZXR1cm4gdGFnTmFtZSA9PT0gJ0hUTUwnIHx8IHRhZ05hbWUgPT09ICdCT0RZJztcbn1cblxuLypcblRyYWNrcyBtb3ZlbWVudCBvdmVyIG11bHRpcGxlIGRyb3BwYWJsZSBhcmVhcyAoYWthIFwiaGl0c1wiKVxudGhhdCBleGlzdCBpbiBvbmUgb3IgbW9yZSBEYXRlQ29tcG9uZW50cy5cblJlbGllcyBvbiBhbiBleGlzdGluZyBkcmFnZ2FibGUuXG5cbmVtaXRzOlxuLSBwb2ludGVyZG93blxuLSBkcmFnc3RhcnRcbi0gaGl0Y2hhbmdlIC0gZmlyZXMgaW5pdGlhbGx5LCBldmVuIGlmIG5vdCBvdmVyIGEgaGl0XG4tIHBvaW50ZXJ1cFxuLSAoaGl0Y2hhbmdlIC0gYWdhaW4sIHRvIG51bGwsIGlmIGVuZGVkIG92ZXIgYSBoaXQpXG4tIGRyYWdlbmRcbiovXG52YXIgSGl0RHJhZ2dpbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSGl0RHJhZ2dpbmcoZHJhZ2dpbmcsIGRyb3BwYWJsZVN0b3JlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGJ5IGNhbGxlclxuICAgICAgICB0aGlzLnVzZVN1YmplY3RDZW50ZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXF1aXJlSW5pdGlhbCA9IHRydWU7IC8vIGlmIGRvZXNuJ3Qgc3RhcnQgb3V0IG9uIGEgaGl0LCB3b24ndCBlbWl0IGFueSBldmVudHNcbiAgICAgICAgdGhpcy5pbml0aWFsSGl0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb3ZpbmdIaXQgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbmFsSGl0ID0gbnVsbDsgLy8gd29uJ3QgZXZlciBiZSBwb3B1bGF0ZWQgaWYgc2hvdWxkSWdub3JlTW92ZVxuICAgICAgICB0aGlzLmhhbmRsZVBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgZHJhZ2dpbmcgPSBfdGhpcy5kcmFnZ2luZztcbiAgICAgICAgICAgIF90aGlzLmluaXRpYWxIaXQgPSBudWxsO1xuICAgICAgICAgICAgX3RoaXMubW92aW5nSGl0ID0gbnVsbDtcbiAgICAgICAgICAgIF90aGlzLmZpbmFsSGl0ID0gbnVsbDtcbiAgICAgICAgICAgIF90aGlzLnByZXBhcmVIaXRzKCk7XG4gICAgICAgICAgICBfdGhpcy5wcm9jZXNzRmlyc3RDb29yZChldik7XG4gICAgICAgICAgICBpZiAoX3RoaXMuaW5pdGlhbEhpdCB8fCAhX3RoaXMucmVxdWlyZUluaXRpYWwpIHtcbiAgICAgICAgICAgICAgICBkcmFnZ2luZy5zZXRJZ25vcmVNb3ZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBmaXJlIHRoaXMgYmVmb3JlIGNvbXB1dGluZyBwcm9jZXNzRmlyc3RDb29yZCwgc28gbGlzdGVuZXJzIGNhbiBjYW5jZWwuIHRoaXMgZ2V0cyBmaXJlZCBieSBhbG1vc3QgZXZlcnkgaGFuZGxlciA6KFxuICAgICAgICAgICAgICAgIF90aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcmRvd24nLCBldik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkcmFnZ2luZy5zZXRJZ25vcmVNb3ZlKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZURyYWdTdGFydCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgX3RoaXMuZW1pdHRlci50cmlnZ2VyKCdkcmFnc3RhcnQnLCBldik7XG4gICAgICAgICAgICBfdGhpcy5oYW5kbGVNb3ZlKGV2LCB0cnVlKTsgLy8gZm9yY2UgPSBmaXJlIGV2ZW4gaWYgaW5pdGlhbGx5IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVEcmFnTW92ZSA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgX3RoaXMuZW1pdHRlci50cmlnZ2VyKCdkcmFnbW92ZScsIGV2KTtcbiAgICAgICAgICAgIF90aGlzLmhhbmRsZU1vdmUoZXYpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVBvaW50ZXJVcCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgX3RoaXMucmVsZWFzZUhpdHMoKTtcbiAgICAgICAgICAgIF90aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcnVwJywgZXYpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZURyYWdFbmQgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy5tb3ZpbmdIaXQpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ2hpdHVwZGF0ZScsIG51bGwsIHRydWUsIGV2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF90aGlzLmZpbmFsSGl0ID0gX3RoaXMubW92aW5nSGl0O1xuICAgICAgICAgICAgX3RoaXMubW92aW5nSGl0ID0gbnVsbDtcbiAgICAgICAgICAgIF90aGlzLmVtaXR0ZXIudHJpZ2dlcignZHJhZ2VuZCcsIGV2KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kcm9wcGFibGVTdG9yZSA9IGRyb3BwYWJsZVN0b3JlO1xuICAgICAgICBkcmFnZ2luZy5lbWl0dGVyLm9uKCdwb2ludGVyZG93bicsIHRoaXMuaGFuZGxlUG9pbnRlckRvd24pO1xuICAgICAgICBkcmFnZ2luZy5lbWl0dGVyLm9uKCdkcmFnc3RhcnQnLCB0aGlzLmhhbmRsZURyYWdTdGFydCk7XG4gICAgICAgIGRyYWdnaW5nLmVtaXR0ZXIub24oJ2RyYWdtb3ZlJywgdGhpcy5oYW5kbGVEcmFnTW92ZSk7XG4gICAgICAgIGRyYWdnaW5nLmVtaXR0ZXIub24oJ3BvaW50ZXJ1cCcsIHRoaXMuaGFuZGxlUG9pbnRlclVwKTtcbiAgICAgICAgZHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ2VuZCcsIHRoaXMuaGFuZGxlRHJhZ0VuZCk7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBkcmFnZ2luZztcbiAgICAgICAgdGhpcy5lbWl0dGVyID0gbmV3IGNvbW1vbi5FbWl0dGVyKCk7XG4gICAgfVxuICAgIC8vIHNldHMgaW5pdGlhbEhpdFxuICAgIC8vIHNldHMgY29vcmRBZGp1c3RcbiAgICBIaXREcmFnZ2luZy5wcm90b3R5cGUucHJvY2Vzc0ZpcnN0Q29vcmQgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgdmFyIG9yaWdQb2ludCA9IHsgbGVmdDogZXYucGFnZVgsIHRvcDogZXYucGFnZVkgfTtcbiAgICAgICAgdmFyIGFkanVzdGVkUG9pbnQgPSBvcmlnUG9pbnQ7XG4gICAgICAgIHZhciBzdWJqZWN0RWwgPSBldi5zdWJqZWN0RWw7XG4gICAgICAgIHZhciBzdWJqZWN0UmVjdDtcbiAgICAgICAgaWYgKHN1YmplY3RFbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7IC8vIGkuZS4gbm90IGEgRG9jdW1lbnQvU2hhZG93Um9vdFxuICAgICAgICAgICAgc3ViamVjdFJlY3QgPSBjb21tb24uY29tcHV0ZVJlY3Qoc3ViamVjdEVsKTtcbiAgICAgICAgICAgIGFkanVzdGVkUG9pbnQgPSBjb21tb24uY29uc3RyYWluUG9pbnQoYWRqdXN0ZWRQb2ludCwgc3ViamVjdFJlY3QpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbml0aWFsSGl0ID0gdGhpcy5pbml0aWFsSGl0ID0gdGhpcy5xdWVyeUhpdEZvck9mZnNldChhZGp1c3RlZFBvaW50LmxlZnQsIGFkanVzdGVkUG9pbnQudG9wKTtcbiAgICAgICAgaWYgKGluaXRpYWxIaXQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnVzZVN1YmplY3RDZW50ZXIgJiYgc3ViamVjdFJlY3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2xpY2VkU3ViamVjdFJlY3QgPSBjb21tb24uaW50ZXJzZWN0UmVjdHMoc3ViamVjdFJlY3QsIGluaXRpYWxIaXQucmVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKHNsaWNlZFN1YmplY3RSZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGFkanVzdGVkUG9pbnQgPSBjb21tb24uZ2V0UmVjdENlbnRlcihzbGljZWRTdWJqZWN0UmVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb29yZEFkanVzdCA9IGNvbW1vbi5kaWZmUG9pbnRzKGFkanVzdGVkUG9pbnQsIG9yaWdQb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvb3JkQWRqdXN0ID0geyBsZWZ0OiAwLCB0b3A6IDAgfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSGl0RHJhZ2dpbmcucHJvdG90eXBlLmhhbmRsZU1vdmUgPSBmdW5jdGlvbiAoZXYsIGZvcmNlSGFuZGxlKSB7XG4gICAgICAgIHZhciBoaXQgPSB0aGlzLnF1ZXJ5SGl0Rm9yT2Zmc2V0KGV2LnBhZ2VYICsgdGhpcy5jb29yZEFkanVzdC5sZWZ0LCBldi5wYWdlWSArIHRoaXMuY29vcmRBZGp1c3QudG9wKTtcbiAgICAgICAgaWYgKGZvcmNlSGFuZGxlIHx8ICFpc0hpdHNFcXVhbCh0aGlzLm1vdmluZ0hpdCwgaGl0KSkge1xuICAgICAgICAgICAgdGhpcy5tb3ZpbmdIaXQgPSBoaXQ7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcignaGl0dXBkYXRlJywgaGl0LCBmYWxzZSwgZXYpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBIaXREcmFnZ2luZy5wcm90b3R5cGUucHJlcGFyZUhpdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0VHJhY2tlcnMgPSBjb21tb24ubWFwSGFzaCh0aGlzLmRyb3BwYWJsZVN0b3JlLCBmdW5jdGlvbiAoaW50ZXJhY3Rpb25TZXR0aW5ncykge1xuICAgICAgICAgICAgaW50ZXJhY3Rpb25TZXR0aW5ncy5jb21wb25lbnQucHJlcGFyZUhpdHMoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2Zmc2V0VHJhY2tlcihpbnRlcmFjdGlvblNldHRpbmdzLmVsKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBIaXREcmFnZ2luZy5wcm90b3R5cGUucmVsZWFzZUhpdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvZmZzZXRUcmFja2VycyA9IHRoaXMub2Zmc2V0VHJhY2tlcnM7XG4gICAgICAgIGZvciAodmFyIGlkIGluIG9mZnNldFRyYWNrZXJzKSB7XG4gICAgICAgICAgICBvZmZzZXRUcmFja2Vyc1tpZF0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub2Zmc2V0VHJhY2tlcnMgPSB7fTtcbiAgICB9O1xuICAgIEhpdERyYWdnaW5nLnByb3RvdHlwZS5xdWVyeUhpdEZvck9mZnNldCA9IGZ1bmN0aW9uIChvZmZzZXRMZWZ0LCBvZmZzZXRUb3ApIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgZHJvcHBhYmxlU3RvcmUgPSBfYS5kcm9wcGFibGVTdG9yZSwgb2Zmc2V0VHJhY2tlcnMgPSBfYS5vZmZzZXRUcmFja2VycztcbiAgICAgICAgdmFyIGJlc3RIaXQgPSBudWxsO1xuICAgICAgICBmb3IgKHZhciBpZCBpbiBkcm9wcGFibGVTdG9yZSkge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IGRyb3BwYWJsZVN0b3JlW2lkXS5jb21wb25lbnQ7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0VHJhY2tlciA9IG9mZnNldFRyYWNrZXJzW2lkXTtcbiAgICAgICAgICAgIGlmIChvZmZzZXRUcmFja2VyICYmIC8vIHdhc24ndCBkZXN0cm95ZWQgbWlkLWRyYWdcbiAgICAgICAgICAgICAgICBvZmZzZXRUcmFja2VyLmlzV2l0aGluQ2xpcHBpbmcob2Zmc2V0TGVmdCwgb2Zmc2V0VG9wKSkge1xuICAgICAgICAgICAgICAgIHZhciBvcmlnaW5MZWZ0ID0gb2Zmc2V0VHJhY2tlci5jb21wdXRlTGVmdCgpO1xuICAgICAgICAgICAgICAgIHZhciBvcmlnaW5Ub3AgPSBvZmZzZXRUcmFja2VyLmNvbXB1dGVUb3AoKTtcbiAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb25MZWZ0ID0gb2Zmc2V0TGVmdCAtIG9yaWdpbkxlZnQ7XG4gICAgICAgICAgICAgICAgdmFyIHBvc2l0aW9uVG9wID0gb2Zmc2V0VG9wIC0gb3JpZ2luVG9wO1xuICAgICAgICAgICAgICAgIHZhciBvcmlnUmVjdCA9IG9mZnNldFRyYWNrZXIub3JpZ1JlY3Q7XG4gICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gb3JpZ1JlY3QucmlnaHQgLSBvcmlnUmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSBvcmlnUmVjdC5ib3R0b20gLSBvcmlnUmVjdC50b3A7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgd2l0aGluIHRoZSBlbGVtZW50J3MgYm91bmRzXG4gICAgICAgICAgICAgICAgcG9zaXRpb25MZWZ0ID49IDAgJiYgcG9zaXRpb25MZWZ0IDwgd2lkdGggJiZcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25Ub3AgPj0gMCAmJiBwb3NpdGlvblRvcCA8IGhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGl0ID0gY29tcG9uZW50LnF1ZXJ5SGl0KHBvc2l0aW9uTGVmdCwgcG9zaXRpb25Ub3AsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGl0ICYmIChcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBoaXQgaXMgd2l0aGluIGFjdGl2ZVJhbmdlLCBtZWFuaW5nIGl0J3Mgbm90IGEgZGVhZCBjZWxsXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbi5yYW5nZUNvbnRhaW5zUmFuZ2UoaGl0LmRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlLCBoaXQuZGF0ZVNwYW4ucmFuZ2UpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCFiZXN0SGl0IHx8IGhpdC5sYXllciA+IGJlc3RIaXQubGF5ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoaXQuY29tcG9uZW50SWQgPSBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5jb250ZXh0ID0gY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBiZXR0ZXIgd2F5IHRvIHJlLW9yaWVudCByZWN0YW5nbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5yZWN0LmxlZnQgKz0gb3JpZ2luTGVmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5yZWN0LnJpZ2h0ICs9IG9yaWdpbkxlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBoaXQucmVjdC50b3AgKz0gb3JpZ2luVG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGl0LnJlY3QuYm90dG9tICs9IG9yaWdpblRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RIaXQgPSBoaXQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJlc3RIaXQ7XG4gICAgfTtcbiAgICByZXR1cm4gSGl0RHJhZ2dpbmc7XG59KCkpO1xuZnVuY3Rpb24gaXNIaXRzRXF1YWwoaGl0MCwgaGl0MSkge1xuICAgIGlmICghaGl0MCAmJiAhaGl0MSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKEJvb2xlYW4oaGl0MCkgIT09IEJvb2xlYW4oaGl0MSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gY29tbW9uLmlzRGF0ZVNwYW5zRXF1YWwoaGl0MC5kYXRlU3BhbiwgaGl0MS5kYXRlU3Bhbik7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGF0ZVBvaW50QXBpV2l0aENvbnRleHQoZGF0ZVNwYW4sIGNvbnRleHQpIHtcbiAgICB2YXIgcHJvcHMgPSB7fTtcbiAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gY29udGV4dC5wbHVnaW5Ib29rcy5kYXRlUG9pbnRUcmFuc2Zvcm1zOyBfaSA8IF9hLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgdHJhbnNmb3JtID0gX2FbX2ldO1xuICAgICAgICB0c2xpYi5fX2Fzc2lnbihwcm9wcywgdHJhbnNmb3JtKGRhdGVTcGFuLCBjb250ZXh0KSk7XG4gICAgfVxuICAgIHRzbGliLl9fYXNzaWduKHByb3BzLCBidWlsZERhdGVQb2ludEFwaShkYXRlU3BhbiwgY29udGV4dC5kYXRlRW52KSk7XG4gICAgcmV0dXJuIHByb3BzO1xufVxuZnVuY3Rpb24gYnVpbGREYXRlUG9pbnRBcGkoc3BhbiwgZGF0ZUVudikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRhdGU6IGRhdGVFbnYudG9EYXRlKHNwYW4ucmFuZ2Uuc3RhcnQpLFxuICAgICAgICBkYXRlU3RyOiBkYXRlRW52LmZvcm1hdElzbyhzcGFuLnJhbmdlLnN0YXJ0LCB7IG9taXRUaW1lOiBzcGFuLmFsbERheSB9KSxcbiAgICAgICAgYWxsRGF5OiBzcGFuLmFsbERheSxcbiAgICB9O1xufVxuXG4vKlxuTW9uaXRvcnMgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYSBzcGVjaWZpYyBkYXRlL3RpbWUgb2YgYSBjb21wb25lbnQuXG5BIHBvaW50ZXJkb3duK3BvaW50ZXJ1cCBvbiB0aGUgc2FtZSBcImhpdFwiIGNvbnN0aXR1dGVzIGEgY2xpY2suXG4qL1xudmFyIERhdGVDbGlja2luZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRGF0ZUNsaWNraW5nLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIERhdGVDbGlja2luZyhzZXR0aW5ncykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzZXR0aW5ncykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuaGFuZGxlUG9pbnRlckRvd24gPSBmdW5jdGlvbiAocGV2KSB7XG4gICAgICAgICAgICB2YXIgZHJhZ2dpbmcgPSBfdGhpcy5kcmFnZ2luZztcbiAgICAgICAgICAgIHZhciBkb3duRWwgPSBwZXYub3JpZ0V2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIC8vIGRvIHRoaXMgaW4gcG9pbnRlcmRvd24gKG5vdCBkcmFnZW5kKSBiZWNhdXNlIERPTSBtaWdodCBiZSBtdXRhdGVkIGJ5IHRoZSB0aW1lIGRyYWdlbmQgaXMgZmlyZWRcbiAgICAgICAgICAgIGRyYWdnaW5nLnNldElnbm9yZU1vdmUoIV90aGlzLmNvbXBvbmVudC5pc1ZhbGlkRGF0ZURvd25FbChkb3duRWwpKTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gd29uJ3QgZXZlbiBmaXJlIGlmIG1vdmluZyB3YXMgaWdub3JlZFxuICAgICAgICBfdGhpcy5oYW5kbGVEcmFnRW5kID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gX3RoaXMuY29tcG9uZW50O1xuICAgICAgICAgICAgdmFyIHBvaW50ZXIgPSBfdGhpcy5kcmFnZ2luZy5wb2ludGVyO1xuICAgICAgICAgICAgaWYgKCFwb2ludGVyLndhc1RvdWNoU2Nyb2xsKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gX3RoaXMuaGl0RHJhZ2dpbmcsIGluaXRpYWxIaXQgPSBfYS5pbml0aWFsSGl0LCBmaW5hbEhpdCA9IF9hLmZpbmFsSGl0O1xuICAgICAgICAgICAgICAgIGlmIChpbml0aWFsSGl0ICYmIGZpbmFsSGl0ICYmIGlzSGl0c0VxdWFsKGluaXRpYWxIaXQsIGZpbmFsSGl0KSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNvbXBvbmVudC5jb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJnID0gdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGJ1aWxkRGF0ZVBvaW50QXBpV2l0aENvbnRleHQoaW5pdGlhbEhpdC5kYXRlU3BhbiwgY29udGV4dCkpLCB7IGRheUVsOiBpbml0aWFsSGl0LmRheUVsLCBqc0V2ZW50OiBldi5vcmlnRXZlbnQsIHZpZXc6IGNvbnRleHQudmlld0FwaSB8fCBjb250ZXh0LmNhbGVuZGFyQXBpLnZpZXcgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdkYXRlQ2xpY2snLCBhcmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gd2UgRE8gd2FudCB0byB3YXRjaCBwb2ludGVyIG1vdmVzIGJlY2F1c2Ugb3RoZXJ3aXNlIGZpbmFsSGl0IHdvbid0IGdldCBwb3B1bGF0ZWRcbiAgICAgICAgX3RoaXMuZHJhZ2dpbmcgPSBuZXcgRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZyhzZXR0aW5ncy5lbCk7XG4gICAgICAgIF90aGlzLmRyYWdnaW5nLmF1dG9TY3JvbGxlci5pc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGhpdERyYWdnaW5nID0gX3RoaXMuaGl0RHJhZ2dpbmcgPSBuZXcgSGl0RHJhZ2dpbmcoX3RoaXMuZHJhZ2dpbmcsIGNvbW1vbi5pbnRlcmFjdGlvblNldHRpbmdzVG9TdG9yZShzZXR0aW5ncykpO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdwb2ludGVyZG93bicsIF90aGlzLmhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ2VuZCcsIF90aGlzLmhhbmRsZURyYWdFbmQpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIERhdGVDbGlja2luZy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kcmFnZ2luZy5kZXN0cm95KCk7XG4gICAgfTtcbiAgICByZXR1cm4gRGF0ZUNsaWNraW5nO1xufShjb21tb24uSW50ZXJhY3Rpb24pKTtcblxuLypcblRyYWNrcyB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYSBwb3J0aW9uIG9mIHRpbWUgb2YgYSBjb21wb25lbnQsXG5jb25zdGl0dXRlZCBieSBhIGRyYWcgb3ZlciBkYXRlIGNlbGxzLCB3aXRoIGEgcG9zc2libGUgZGVsYXkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZHJhZy5cbiovXG52YXIgRGF0ZVNlbGVjdGluZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoRGF0ZVNlbGVjdGluZywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEYXRlU2VsZWN0aW5nKHNldHRpbmdzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNldHRpbmdzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kcmFnU2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgX3RoaXMuaGFuZGxlUG9pbnRlckRvd24gPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IF90aGlzLCBjb21wb25lbnQgPSBfYS5jb21wb25lbnQsIGRyYWdnaW5nID0gX2EuZHJhZ2dpbmc7XG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGNvbXBvbmVudC5jb250ZXh0Lm9wdGlvbnM7XG4gICAgICAgICAgICB2YXIgY2FuU2VsZWN0ID0gb3B0aW9ucy5zZWxlY3RhYmxlICYmXG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmlzVmFsaWREYXRlRG93bkVsKGV2Lm9yaWdFdmVudC50YXJnZXQpO1xuICAgICAgICAgICAgLy8gZG9uJ3QgYm90aGVyIHRvIHdhdGNoIGV4cGVuc2l2ZSBtb3ZlcyBpZiBjb21wb25lbnQgd29uJ3QgZG8gc2VsZWN0aW9uXG4gICAgICAgICAgICBkcmFnZ2luZy5zZXRJZ25vcmVNb3ZlKCFjYW5TZWxlY3QpO1xuICAgICAgICAgICAgLy8gaWYgdG91Y2gsIHJlcXVpcmUgdXNlciB0byBob2xkIGRvd25cbiAgICAgICAgICAgIGRyYWdnaW5nLmRlbGF5ID0gZXYuaXNUb3VjaCA/IGdldENvbXBvbmVudFRvdWNoRGVsYXkkMShjb21wb25lbnQpIDogbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlRHJhZ1N0YXJ0ID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBfdGhpcy5jb21wb25lbnQuY29udGV4dC5jYWxlbmRhckFwaS51bnNlbGVjdChldik7IC8vIHVuc2VsZWN0IHByZXZpb3VzIHNlbGVjdGlvbnNcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlSGl0VXBkYXRlID0gZnVuY3Rpb24gKGhpdCwgaXNGaW5hbCkge1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBfdGhpcy5jb21wb25lbnQuY29udGV4dDtcbiAgICAgICAgICAgIHZhciBkcmFnU2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIHZhciBpc0ludmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChoaXQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5pdGlhbEhpdCA9IF90aGlzLmhpdERyYWdnaW5nLmluaXRpYWxIaXQ7XG4gICAgICAgICAgICAgICAgdmFyIGRpc2FsbG93ZWQgPSBoaXQuY29tcG9uZW50SWQgPT09IGluaXRpYWxIaXQuY29tcG9uZW50SWRcbiAgICAgICAgICAgICAgICAgICAgJiYgX3RoaXMuaXNIaXRDb21ib0FsbG93ZWRcbiAgICAgICAgICAgICAgICAgICAgJiYgIV90aGlzLmlzSGl0Q29tYm9BbGxvd2VkKGluaXRpYWxIaXQsIGhpdCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkaXNhbGxvd2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRyYWdTZWxlY3Rpb24gPSBqb2luSGl0c0ludG9TZWxlY3Rpb24oaW5pdGlhbEhpdCwgaGl0LCBjb250ZXh0LnBsdWdpbkhvb2tzLmRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWRyYWdTZWxlY3Rpb24gfHwgIWNvbW1vbi5pc0RhdGVTZWxlY3Rpb25WYWxpZChkcmFnU2VsZWN0aW9uLCBoaXQuZGF0ZVByb2ZpbGUsIGNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzSW52YWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGRyYWdTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkcmFnU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdTRUxFQ1RfREFURVMnLCBzZWxlY3Rpb246IGRyYWdTZWxlY3Rpb24gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghaXNGaW5hbCkgeyAvLyBvbmx5IHVuc2VsZWN0IGlmIG1vdmVkIGF3YXkgd2hpbGUgZHJhZ2dpbmdcbiAgICAgICAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoKHsgdHlwZTogJ1VOU0VMRUNUX0RBVEVTJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNJbnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgY29tbW9uLmVuYWJsZUN1cnNvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tbW9uLmRpc2FibGVDdXJzb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNGaW5hbCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmRyYWdTZWxlY3Rpb24gPSBkcmFnU2VsZWN0aW9uOyAvLyBvbmx5IGNsZWFyIGlmIG1vdmVkIGF3YXkgZnJvbSBhbGwgaGl0cyB3aGlsZSBkcmFnZ2luZ1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVQb2ludGVyVXAgPSBmdW5jdGlvbiAocGV2KSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMuZHJhZ1NlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBpcyBhbHJlYWR5IHJlbmRlcmVkLCBzbyBqdXN0IG5lZWQgdG8gcmVwb3J0IHNlbGVjdGlvblxuICAgICAgICAgICAgICAgIGNvbW1vbi50cmlnZ2VyRGF0ZVNlbGVjdChfdGhpcy5kcmFnU2VsZWN0aW9uLCBwZXYsIF90aGlzLmNvbXBvbmVudC5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5kcmFnU2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGNvbXBvbmVudCA9IHNldHRpbmdzLmNvbXBvbmVudDtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBjb21wb25lbnQuY29udGV4dC5vcHRpb25zO1xuICAgICAgICB2YXIgZHJhZ2dpbmcgPSBfdGhpcy5kcmFnZ2luZyA9IG5ldyBGZWF0dXJlZnVsRWxlbWVudERyYWdnaW5nKHNldHRpbmdzLmVsKTtcbiAgICAgICAgZHJhZ2dpbmcudG91Y2hTY3JvbGxBbGxvd2VkID0gZmFsc2U7XG4gICAgICAgIGRyYWdnaW5nLm1pbkRpc3RhbmNlID0gb3B0aW9ucy5zZWxlY3RNaW5EaXN0YW5jZSB8fCAwO1xuICAgICAgICBkcmFnZ2luZy5hdXRvU2Nyb2xsZXIuaXNFbmFibGVkID0gb3B0aW9ucy5kcmFnU2Nyb2xsO1xuICAgICAgICB2YXIgaGl0RHJhZ2dpbmcgPSBfdGhpcy5oaXREcmFnZ2luZyA9IG5ldyBIaXREcmFnZ2luZyhfdGhpcy5kcmFnZ2luZywgY29tbW9uLmludGVyYWN0aW9uU2V0dGluZ3NUb1N0b3JlKHNldHRpbmdzKSk7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ3BvaW50ZXJkb3duJywgX3RoaXMuaGFuZGxlUG9pbnRlckRvd24pO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdkcmFnc3RhcnQnLCBfdGhpcy5oYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdoaXR1cGRhdGUnLCBfdGhpcy5oYW5kbGVIaXRVcGRhdGUpO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdwb2ludGVydXAnLCBfdGhpcy5oYW5kbGVQb2ludGVyVXApO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIERhdGVTZWxlY3RpbmcucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcuZGVzdHJveSgpO1xuICAgIH07XG4gICAgcmV0dXJuIERhdGVTZWxlY3Rpbmc7XG59KGNvbW1vbi5JbnRlcmFjdGlvbikpO1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50VG91Y2hEZWxheSQxKGNvbXBvbmVudCkge1xuICAgIHZhciBvcHRpb25zID0gY29tcG9uZW50LmNvbnRleHQub3B0aW9ucztcbiAgICB2YXIgZGVsYXkgPSBvcHRpb25zLnNlbGVjdExvbmdQcmVzc0RlbGF5O1xuICAgIGlmIChkZWxheSA9PSBudWxsKSB7XG4gICAgICAgIGRlbGF5ID0gb3B0aW9ucy5sb25nUHJlc3NEZWxheTtcbiAgICB9XG4gICAgcmV0dXJuIGRlbGF5O1xufVxuZnVuY3Rpb24gam9pbkhpdHNJbnRvU2VsZWN0aW9uKGhpdDAsIGhpdDEsIGRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnMpIHtcbiAgICB2YXIgZGF0ZVNwYW4wID0gaGl0MC5kYXRlU3BhbjtcbiAgICB2YXIgZGF0ZVNwYW4xID0gaGl0MS5kYXRlU3BhbjtcbiAgICB2YXIgbXMgPSBbXG4gICAgICAgIGRhdGVTcGFuMC5yYW5nZS5zdGFydCxcbiAgICAgICAgZGF0ZVNwYW4wLnJhbmdlLmVuZCxcbiAgICAgICAgZGF0ZVNwYW4xLnJhbmdlLnN0YXJ0LFxuICAgICAgICBkYXRlU3BhbjEucmFuZ2UuZW5kLFxuICAgIF07XG4gICAgbXMuc29ydChjb21tb24uY29tcGFyZU51bWJlcnMpO1xuICAgIHZhciBwcm9wcyA9IHt9O1xuICAgIGZvciAodmFyIF9pID0gMCwgZGF0ZVNlbGVjdGlvblRyYW5zZm9ybWVyc18xID0gZGF0ZVNlbGVjdGlvblRyYW5zZm9ybWVyczsgX2kgPCBkYXRlU2VsZWN0aW9uVHJhbnNmb3JtZXJzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciB0cmFuc2Zvcm1lciA9IGRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnNfMVtfaV07XG4gICAgICAgIHZhciByZXMgPSB0cmFuc2Zvcm1lcihoaXQwLCBoaXQxKTtcbiAgICAgICAgaWYgKHJlcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHRzbGliLl9fYXNzaWduKHByb3BzLCByZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3BzLnJhbmdlID0geyBzdGFydDogbXNbMF0sIGVuZDogbXNbM10gfTtcbiAgICBwcm9wcy5hbGxEYXkgPSBkYXRlU3BhbjAuYWxsRGF5O1xuICAgIHJldHVybiBwcm9wcztcbn1cblxudmFyIEV2ZW50RHJhZ2dpbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKEV2ZW50RHJhZ2dpbmcsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRXZlbnREcmFnZ2luZyhzZXR0aW5ncykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzZXR0aW5ncykgfHwgdGhpcztcbiAgICAgICAgLy8gaW50ZXJuYWwgc3RhdGVcbiAgICAgICAgX3RoaXMuc3ViamVjdEVsID0gbnVsbDtcbiAgICAgICAgX3RoaXMuc3ViamVjdFNlZyA9IG51bGw7IC8vIHRoZSBzZWcgYmVpbmcgc2VsZWN0ZWQvZHJhZ2dlZFxuICAgICAgICBfdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIF90aGlzLmV2ZW50UmFuZ2UgPSBudWxsO1xuICAgICAgICBfdGhpcy5yZWxldmFudEV2ZW50cyA9IG51bGw7IC8vIHRoZSBldmVudHMgYmVpbmcgZHJhZ2dlZFxuICAgICAgICBfdGhpcy5yZWNlaXZpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgX3RoaXMudmFsaWRNdXRhdGlvbiA9IG51bGw7XG4gICAgICAgIF90aGlzLm11dGF0ZWRSZWxldmFudEV2ZW50cyA9IG51bGw7XG4gICAgICAgIF90aGlzLmhhbmRsZVBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgb3JpZ1RhcmdldCA9IGV2Lm9yaWdFdmVudC50YXJnZXQ7XG4gICAgICAgICAgICB2YXIgX2EgPSBfdGhpcywgY29tcG9uZW50ID0gX2EuY29tcG9uZW50LCBkcmFnZ2luZyA9IF9hLmRyYWdnaW5nO1xuICAgICAgICAgICAgdmFyIG1pcnJvciA9IGRyYWdnaW5nLm1pcnJvcjtcbiAgICAgICAgICAgIHZhciBvcHRpb25zID0gY29tcG9uZW50LmNvbnRleHQub3B0aW9ucztcbiAgICAgICAgICAgIHZhciBpbml0aWFsQ29udGV4dCA9IGNvbXBvbmVudC5jb250ZXh0O1xuICAgICAgICAgICAgX3RoaXMuc3ViamVjdEVsID0gZXYuc3ViamVjdEVsO1xuICAgICAgICAgICAgdmFyIHN1YmplY3RTZWcgPSBfdGhpcy5zdWJqZWN0U2VnID0gY29tbW9uLmdldEVsU2VnKGV2LnN1YmplY3RFbCk7XG4gICAgICAgICAgICB2YXIgZXZlbnRSYW5nZSA9IF90aGlzLmV2ZW50UmFuZ2UgPSBzdWJqZWN0U2VnLmV2ZW50UmFuZ2U7XG4gICAgICAgICAgICB2YXIgZXZlbnRJbnN0YW5jZUlkID0gZXZlbnRSYW5nZS5pbnN0YW5jZS5pbnN0YW5jZUlkO1xuICAgICAgICAgICAgX3RoaXMucmVsZXZhbnRFdmVudHMgPSBjb21tb24uZ2V0UmVsZXZhbnRFdmVudHMoaW5pdGlhbENvbnRleHQuZ2V0Q3VycmVudERhdGEoKS5ldmVudFN0b3JlLCBldmVudEluc3RhbmNlSWQpO1xuICAgICAgICAgICAgZHJhZ2dpbmcubWluRGlzdGFuY2UgPSBldi5pc1RvdWNoID8gMCA6IG9wdGlvbnMuZXZlbnREcmFnTWluRGlzdGFuY2U7XG4gICAgICAgICAgICBkcmFnZ2luZy5kZWxheSA9XG4gICAgICAgICAgICAgICAgLy8gb25seSBkbyBhIHRvdWNoIGRlbGF5IGlmIHRvdWNoIGFuZCB0aGlzIGV2ZW50IGhhc24ndCBiZWVuIHNlbGVjdGVkIHlldFxuICAgICAgICAgICAgICAgIChldi5pc1RvdWNoICYmIGV2ZW50SW5zdGFuY2VJZCAhPT0gY29tcG9uZW50LnByb3BzLmV2ZW50U2VsZWN0aW9uKSA/XG4gICAgICAgICAgICAgICAgICAgIGdldENvbXBvbmVudFRvdWNoRGVsYXkoY29tcG9uZW50KSA6XG4gICAgICAgICAgICAgICAgICAgIG51bGw7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5maXhlZE1pcnJvclBhcmVudCkge1xuICAgICAgICAgICAgICAgIG1pcnJvci5wYXJlbnROb2RlID0gb3B0aW9ucy5maXhlZE1pcnJvclBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1pcnJvci5wYXJlbnROb2RlID0gY29tbW9uLmVsZW1lbnRDbG9zZXN0KG9yaWdUYXJnZXQsICcuZmMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1pcnJvci5yZXZlcnREdXJhdGlvbiA9IG9wdGlvbnMuZHJhZ1JldmVydER1cmF0aW9uO1xuICAgICAgICAgICAgdmFyIGlzVmFsaWQgPSBjb21wb25lbnQuaXNWYWxpZFNlZ0Rvd25FbChvcmlnVGFyZ2V0KSAmJlxuICAgICAgICAgICAgICAgICFjb21tb24uZWxlbWVudENsb3Nlc3Qob3JpZ1RhcmdldCwgJy5mYy1ldmVudC1yZXNpemVyJyk7IC8vIE5PVCBvbiBhIHJlc2l6ZXJcbiAgICAgICAgICAgIGRyYWdnaW5nLnNldElnbm9yZU1vdmUoIWlzVmFsaWQpO1xuICAgICAgICAgICAgLy8gZGlzYWJsZSBkcmFnZ2luZyBmb3IgZWxlbWVudHMgdGhhdCBhcmUgcmVzaXphYmxlIChpZSwgc2VsZWN0YWJsZSlcbiAgICAgICAgICAgIC8vIGJ1dCBhcmUgbm90IGRyYWdnYWJsZVxuICAgICAgICAgICAgX3RoaXMuaXNEcmFnZ2luZyA9IGlzVmFsaWQgJiZcbiAgICAgICAgICAgICAgICBldi5zdWJqZWN0RWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdmYy1ldmVudC1kcmFnZ2FibGUnKTtcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlRHJhZ1N0YXJ0ID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgaW5pdGlhbENvbnRleHQgPSBfdGhpcy5jb21wb25lbnQuY29udGV4dDtcbiAgICAgICAgICAgIHZhciBldmVudFJhbmdlID0gX3RoaXMuZXZlbnRSYW5nZTtcbiAgICAgICAgICAgIHZhciBldmVudEluc3RhbmNlSWQgPSBldmVudFJhbmdlLmluc3RhbmNlLmluc3RhbmNlSWQ7XG4gICAgICAgICAgICBpZiAoZXYuaXNUb3VjaCkge1xuICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc2VsZWN0IGEgZGlmZmVyZW50IGV2ZW50P1xuICAgICAgICAgICAgICAgIGlmIChldmVudEluc3RhbmNlSWQgIT09IF90aGlzLmNvbXBvbmVudC5wcm9wcy5ldmVudFNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdTRUxFQ1RfRVZFTlQnLCBldmVudEluc3RhbmNlSWQ6IGV2ZW50SW5zdGFuY2VJZCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBub3cgdXNpbmcgbW91c2UsIGJ1dCB3YXMgcHJldmlvdXMgdG91Y2ggaW50ZXJhY3Rpb24sIGNsZWFyIHNlbGVjdGVkIGV2ZW50XG4gICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHQuZGlzcGF0Y2goeyB0eXBlOiAnVU5TRUxFQ1RfRVZFTlQnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF90aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dC5jYWxlbmRhckFwaS51bnNlbGVjdChldik7IC8vIHVuc2VsZWN0ICpkYXRlKiBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50RHJhZ1N0YXJ0Jywge1xuICAgICAgICAgICAgICAgICAgICBlbDogX3RoaXMuc3ViamVjdEVsLFxuICAgICAgICAgICAgICAgICAgICBldmVudDogbmV3IGNvbW1vbi5FdmVudEFwaShpbml0aWFsQ29udGV4dCwgZXZlbnRSYW5nZS5kZWYsIGV2ZW50UmFuZ2UuaW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICBqc0V2ZW50OiBldi5vcmlnRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIHZpZXc6IGluaXRpYWxDb250ZXh0LnZpZXdBcGksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmhhbmRsZUhpdFVwZGF0ZSA9IGZ1bmN0aW9uIChoaXQsIGlzRmluYWwpIHtcbiAgICAgICAgICAgIGlmICghX3RoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByZWxldmFudEV2ZW50cyA9IF90aGlzLnJlbGV2YW50RXZlbnRzO1xuICAgICAgICAgICAgdmFyIGluaXRpYWxIaXQgPSBfdGhpcy5oaXREcmFnZ2luZy5pbml0aWFsSGl0O1xuICAgICAgICAgICAgdmFyIGluaXRpYWxDb250ZXh0ID0gX3RoaXMuY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgICAgICAvLyBzdGF0ZXMgYmFzZWQgb24gbmV3IGhpdFxuICAgICAgICAgICAgdmFyIHJlY2VpdmluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICAgICAgdmFyIG11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIHZhciBtdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgICAgICAgICAgdmFyIGlzSW52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGludGVyYWN0aW9uID0ge1xuICAgICAgICAgICAgICAgIGFmZmVjdGVkRXZlbnRzOiByZWxldmFudEV2ZW50cyxcbiAgICAgICAgICAgICAgICBtdXRhdGVkRXZlbnRzOiBjb21tb24uY3JlYXRlRW1wdHlFdmVudFN0b3JlKCksXG4gICAgICAgICAgICAgICAgaXNFdmVudDogdHJ1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaGl0KSB7XG4gICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dCA9IGhpdC5jb250ZXh0O1xuICAgICAgICAgICAgICAgIHZhciByZWNlaXZpbmdPcHRpb25zID0gcmVjZWl2aW5nQ29udGV4dC5vcHRpb25zO1xuICAgICAgICAgICAgICAgIGlmIChpbml0aWFsQ29udGV4dCA9PT0gcmVjZWl2aW5nQ29udGV4dCB8fFxuICAgICAgICAgICAgICAgICAgICAocmVjZWl2aW5nT3B0aW9ucy5lZGl0YWJsZSAmJiByZWNlaXZpbmdPcHRpb25zLmRyb3BwYWJsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb24gPSBjb21wdXRlRXZlbnRNdXRhdGlvbihpbml0aWFsSGl0LCBoaXQsIHJlY2VpdmluZ0NvbnRleHQuZ2V0Q3VycmVudERhdGEoKS5wbHVnaW5Ib29rcy5ldmVudERyYWdNdXRhdGlvbk1hc3NhZ2Vycyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlZFJlbGV2YW50RXZlbnRzID0gY29tbW9uLmFwcGx5TXV0YXRpb25Ub0V2ZW50U3RvcmUocmVsZXZhbnRFdmVudHMsIHJlY2VpdmluZ0NvbnRleHQuZ2V0Q3VycmVudERhdGEoKS5ldmVudFVpQmFzZXMsIG11dGF0aW9uLCByZWNlaXZpbmdDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHMgPSBtdXRhdGVkUmVsZXZhbnRFdmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbW1vbi5pc0ludGVyYWN0aW9uVmFsaWQoaW50ZXJhY3Rpb24sIGhpdC5kYXRlUHJvZmlsZSwgcmVjZWl2aW5nQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ludmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHMgPSBjb21tb24uY3JlYXRlRW1wdHlFdmVudFN0b3JlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY2VpdmluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF90aGlzLmRpc3BsYXlEcmFnKHJlY2VpdmluZ0NvbnRleHQsIGludGVyYWN0aW9uKTtcbiAgICAgICAgICAgIGlmICghaXNJbnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgY29tbW9uLmVuYWJsZUN1cnNvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tbW9uLmRpc2FibGVDdXJzb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNGaW5hbCkge1xuICAgICAgICAgICAgICAgIGlmIChpbml0aWFsQ29udGV4dCA9PT0gcmVjZWl2aW5nQ29udGV4dCAmJiAvLyBUT0RPOiB3cml0ZSB0ZXN0IGZvciB0aGlzXG4gICAgICAgICAgICAgICAgICAgIGlzSGl0c0VxdWFsKGluaXRpYWxIaXQsIGhpdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfdGhpcy5kcmFnZ2luZy5zZXRNaXJyb3JOZWVkc1JldmVydCghbXV0YXRpb24pO1xuICAgICAgICAgICAgICAgIC8vIHJlbmRlciB0aGUgbWlycm9yIGlmIG5vIGFscmVhZHktcmVuZGVyZWQgbWlycm9yXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogd2lzaCB3ZSBjb3VsZCBzb21laG93IHdhaXQgZm9yIGRpc3BhdGNoIHRvIGd1YXJhbnRlZSByZW5kZXJcbiAgICAgICAgICAgICAgICBfdGhpcy5kcmFnZ2luZy5zZXRNaXJyb3JJc1Zpc2libGUoIWhpdCB8fCAhY29tbW9uLmdldEVsUm9vdChfdGhpcy5zdWJqZWN0RWwpLnF1ZXJ5U2VsZWN0b3IoJy5mYy1ldmVudC1taXJyb3InKSk7XG4gICAgICAgICAgICAgICAgLy8gYXNzaWduIHN0YXRlcyBiYXNlZCBvbiBuZXcgaGl0XG4gICAgICAgICAgICAgICAgX3RoaXMucmVjZWl2aW5nQ29udGV4dCA9IHJlY2VpdmluZ0NvbnRleHQ7XG4gICAgICAgICAgICAgICAgX3RoaXMudmFsaWRNdXRhdGlvbiA9IG11dGF0aW9uO1xuICAgICAgICAgICAgICAgIF90aGlzLm11dGF0ZWRSZWxldmFudEV2ZW50cyA9IG11dGF0ZWRSZWxldmFudEV2ZW50cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuaGFuZGxlUG9pbnRlclVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY2xlYW51cCgpOyAvLyBiZWNhdXNlIGhhbmRsZURyYWdFbmQgd29uJ3QgZmlyZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVEcmFnRW5kID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAgICAgICAgIHZhciBpbml0aWFsQ29udGV4dF8xID0gX3RoaXMuY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgICAgICAgICAgdmFyIGluaXRpYWxWaWV3ID0gaW5pdGlhbENvbnRleHRfMS52aWV3QXBpO1xuICAgICAgICAgICAgICAgIHZhciBfYSA9IF90aGlzLCByZWNlaXZpbmdDb250ZXh0XzEgPSBfYS5yZWNlaXZpbmdDb250ZXh0LCB2YWxpZE11dGF0aW9uID0gX2EudmFsaWRNdXRhdGlvbjtcbiAgICAgICAgICAgICAgICB2YXIgZXZlbnREZWYgPSBfdGhpcy5ldmVudFJhbmdlLmRlZjtcbiAgICAgICAgICAgICAgICB2YXIgZXZlbnRJbnN0YW5jZSA9IF90aGlzLmV2ZW50UmFuZ2UuaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50QXBpID0gbmV3IGNvbW1vbi5FdmVudEFwaShpbml0aWFsQ29udGV4dF8xLCBldmVudERlZiwgZXZlbnRJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgdmFyIHJlbGV2YW50RXZlbnRzXzEgPSBfdGhpcy5yZWxldmFudEV2ZW50cztcbiAgICAgICAgICAgICAgICB2YXIgbXV0YXRlZFJlbGV2YW50RXZlbnRzXzEgPSBfdGhpcy5tdXRhdGVkUmVsZXZhbnRFdmVudHM7XG4gICAgICAgICAgICAgICAgdmFyIGZpbmFsSGl0ID0gX3RoaXMuaGl0RHJhZ2dpbmcuZmluYWxIaXQ7XG4gICAgICAgICAgICAgICAgX3RoaXMuY2xlYXJEcmFnKCk7IC8vIG11c3QgaGFwcGVuIGFmdGVyIHJldmVydCBhbmltYXRpb25cbiAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dF8xLmVtaXR0ZXIudHJpZ2dlcignZXZlbnREcmFnU3RvcCcsIHtcbiAgICAgICAgICAgICAgICAgICAgZWw6IF90aGlzLnN1YmplY3RFbCxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50QXBpLFxuICAgICAgICAgICAgICAgICAgICBqc0V2ZW50OiBldi5vcmlnRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIHZpZXc6IGluaXRpYWxWaWV3LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZE11dGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRyb3BwZWQgd2l0aGluIHNhbWUgY2FsZW5kYXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY2VpdmluZ0NvbnRleHRfMSA9PT0gaW5pdGlhbENvbnRleHRfMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVwZGF0ZWRFdmVudEFwaSA9IG5ldyBjb21tb24uRXZlbnRBcGkoaW5pdGlhbENvbnRleHRfMSwgbXV0YXRlZFJlbGV2YW50RXZlbnRzXzEuZGVmc1tldmVudERlZi5kZWZJZF0sIGV2ZW50SW5zdGFuY2UgPyBtdXRhdGVkUmVsZXZhbnRFdmVudHNfMS5pbnN0YW5jZXNbZXZlbnRJbnN0YW5jZS5pbnN0YW5jZUlkXSA6IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHRfMS5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01FUkdFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogbXV0YXRlZFJlbGV2YW50RXZlbnRzXzEsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudENoYW5nZUFyZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRFdmVudDogZXZlbnRBcGksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IHVwZGF0ZWRFdmVudEFwaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkRXZlbnRzOiBjb21tb24uYnVpbGRFdmVudEFwaXMobXV0YXRlZFJlbGV2YW50RXZlbnRzXzEsIGluaXRpYWxDb250ZXh0XzEsIGV2ZW50SW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVydDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dF8xLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNRVJHRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogcmVsZXZhbnRFdmVudHNfMSwgLy8gdGhlIHByZS1jaGFuZ2UgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0cmFuc2Zvcm1lZCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYiA9IGluaXRpYWxDb250ZXh0XzEuZ2V0Q3VycmVudERhdGEoKS5wbHVnaW5Ib29rcy5ldmVudERyb3BUcmFuc2Zvcm1lcnM7IF9pIDwgX2IubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRyYW5zZm9ybWVyID0gX2JbX2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzbGliLl9fYXNzaWduKHRyYW5zZm9ybWVkLCB0cmFuc2Zvcm1lcih2YWxpZE11dGF0aW9uLCBpbml0aWFsQ29udGV4dF8xKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dF8xLmVtaXR0ZXIudHJpZ2dlcignZXZlbnREcm9wJywgdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGV2ZW50Q2hhbmdlQXJnKSwgdHJhbnNmb3JtZWQpLCB7IGVsOiBldi5zdWJqZWN0RWwsIGRlbHRhOiB2YWxpZE11dGF0aW9uLmRhdGVzRGVsdGEsIGpzRXZlbnQ6IGV2Lm9yaWdFdmVudCwgdmlldzogaW5pdGlhbFZpZXcgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHRfMS5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50Q2hhbmdlJywgZXZlbnRDaGFuZ2VBcmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcHBlZCBpbiBkaWZmZXJlbnQgY2FsZW5kYXJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWNlaXZpbmdDb250ZXh0XzEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudFJlbW92ZUFyZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogZXZlbnRBcGksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZEV2ZW50czogY29tbW9uLmJ1aWxkRXZlbnRBcGlzKHJlbGV2YW50RXZlbnRzXzEsIGluaXRpYWxDb250ZXh0XzEsIGV2ZW50SW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVydDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dF8xLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNRVJHRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogcmVsZXZhbnRFdmVudHNfMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dF8xLmVtaXR0ZXIudHJpZ2dlcignZXZlbnRMZWF2ZScsIHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBldmVudFJlbW92ZUFyZyksIHsgZHJhZ2dlZEVsOiBldi5zdWJqZWN0RWwsIHZpZXc6IGluaXRpYWxWaWV3IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxDb250ZXh0XzEuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSRU1PVkVfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFN0b3JlOiByZWxldmFudEV2ZW50c18xLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dF8xLmVtaXR0ZXIudHJpZ2dlcignZXZlbnRSZW1vdmUnLCBldmVudFJlbW92ZUFyZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkZWRFdmVudERlZiA9IG11dGF0ZWRSZWxldmFudEV2ZW50c18xLmRlZnNbZXZlbnREZWYuZGVmSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFkZGVkRXZlbnRJbnN0YW5jZSA9IG11dGF0ZWRSZWxldmFudEV2ZW50c18xLmluc3RhbmNlc1tldmVudEluc3RhbmNlLmluc3RhbmNlSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFkZGVkRXZlbnRBcGkgPSBuZXcgY29tbW9uLkV2ZW50QXBpKHJlY2VpdmluZ0NvbnRleHRfMSwgYWRkZWRFdmVudERlZiwgYWRkZWRFdmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmluZ0NvbnRleHRfMS5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01FUkdFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogbXV0YXRlZFJlbGV2YW50RXZlbnRzXzEsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudEFkZEFyZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogYWRkZWRFdmVudEFwaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkRXZlbnRzOiBjb21tb24uYnVpbGRFdmVudEFwaXMobXV0YXRlZFJlbGV2YW50RXZlbnRzXzEsIHJlY2VpdmluZ0NvbnRleHRfMSwgYWRkZWRFdmVudEluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dF8xLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSRU1PVkVfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IG11dGF0ZWRSZWxldmFudEV2ZW50c18xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmluZ0NvbnRleHRfMS5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50QWRkJywgZXZlbnRBZGRBcmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2LmlzVG91Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0XzEuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU0VMRUNUX0VWRU5UJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRJbnN0YW5jZUlkOiBldmVudEluc3RhbmNlLmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0XzEuZW1pdHRlci50cmlnZ2VyKCdkcm9wJywgdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGJ1aWxkRGF0ZVBvaW50QXBpV2l0aENvbnRleHQoZmluYWxIaXQuZGF0ZVNwYW4sIHJlY2VpdmluZ0NvbnRleHRfMSkpLCB7IGRyYWdnZWRFbDogZXYuc3ViamVjdEVsLCBqc0V2ZW50OiBldi5vcmlnRXZlbnQsIHZpZXc6IGZpbmFsSGl0LmNvbnRleHQudmlld0FwaSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0XzEuZW1pdHRlci50cmlnZ2VyKCdldmVudFJlY2VpdmUnLCB0c2xpYi5fX2Fzc2lnbih0c2xpYi5fX2Fzc2lnbih7fSwgZXZlbnRBZGRBcmcpLCB7IGRyYWdnZWRFbDogZXYuc3ViamVjdEVsLCB2aWV3OiBmaW5hbEhpdC5jb250ZXh0LnZpZXdBcGkgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dF8xLmVtaXR0ZXIudHJpZ2dlcignX25vRXZlbnREcm9wJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMuY2xlYW51cCgpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgY29tcG9uZW50ID0gX3RoaXMuY29tcG9uZW50O1xuICAgICAgICB2YXIgb3B0aW9ucyA9IGNvbXBvbmVudC5jb250ZXh0Lm9wdGlvbnM7XG4gICAgICAgIHZhciBkcmFnZ2luZyA9IF90aGlzLmRyYWdnaW5nID0gbmV3IEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcoc2V0dGluZ3MuZWwpO1xuICAgICAgICBkcmFnZ2luZy5wb2ludGVyLnNlbGVjdG9yID0gRXZlbnREcmFnZ2luZy5TRUxFQ1RPUjtcbiAgICAgICAgZHJhZ2dpbmcudG91Y2hTY3JvbGxBbGxvd2VkID0gZmFsc2U7XG4gICAgICAgIGRyYWdnaW5nLmF1dG9TY3JvbGxlci5pc0VuYWJsZWQgPSBvcHRpb25zLmRyYWdTY3JvbGw7XG4gICAgICAgIHZhciBoaXREcmFnZ2luZyA9IF90aGlzLmhpdERyYWdnaW5nID0gbmV3IEhpdERyYWdnaW5nKF90aGlzLmRyYWdnaW5nLCBjb21tb24uaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcudXNlU3ViamVjdENlbnRlciA9IHNldHRpbmdzLnVzZUV2ZW50Q2VudGVyO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdwb2ludGVyZG93bicsIF90aGlzLmhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ3N0YXJ0JywgX3RoaXMuaGFuZGxlRHJhZ1N0YXJ0KTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignaGl0dXBkYXRlJywgX3RoaXMuaGFuZGxlSGl0VXBkYXRlKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbigncG9pbnRlcnVwJywgX3RoaXMuaGFuZGxlUG9pbnRlclVwKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ2VuZCcsIF90aGlzLmhhbmRsZURyYWdFbmQpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEV2ZW50RHJhZ2dpbmcucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcuZGVzdHJveSgpO1xuICAgIH07XG4gICAgLy8gcmVuZGVyIGEgZHJhZyBzdGF0ZSBvbiB0aGUgbmV4dCByZWNlaXZpbmdDYWxlbmRhclxuICAgIEV2ZW50RHJhZ2dpbmcucHJvdG90eXBlLmRpc3BsYXlEcmFnID0gZnVuY3Rpb24gKG5leHRDb250ZXh0LCBzdGF0ZSkge1xuICAgICAgICB2YXIgaW5pdGlhbENvbnRleHQgPSB0aGlzLmNvbXBvbmVudC5jb250ZXh0O1xuICAgICAgICB2YXIgcHJldkNvbnRleHQgPSB0aGlzLnJlY2VpdmluZ0NvbnRleHQ7XG4gICAgICAgIC8vIGRvZXMgdGhlIHByZXZpb3VzIGNhbGVuZGFyIG5lZWQgdG8gYmUgY2xlYXJlZD9cbiAgICAgICAgaWYgKHByZXZDb250ZXh0ICYmIHByZXZDb250ZXh0ICE9PSBuZXh0Q29udGV4dCkge1xuICAgICAgICAgICAgLy8gZG9lcyB0aGUgaW5pdGlhbCBjYWxlbmRhciBuZWVkIHRvIGJlIGNsZWFyZWQ/XG4gICAgICAgICAgICAvLyBpZiBzbywgZG9uJ3QgY2xlYXIgYWxsIHRoZSB3YXkuIHdlIHN0aWxsIG5lZWQgdG8gdG8gaGlkZSB0aGUgYWZmZWN0ZWRFdmVudHNcbiAgICAgICAgICAgIGlmIChwcmV2Q29udGV4dCA9PT0gaW5pdGlhbENvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBwcmV2Q29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTRVRfRVZFTlRfRFJBRycsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZmZlY3RlZEV2ZW50czogc3RhdGUuYWZmZWN0ZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGVkRXZlbnRzOiBjb21tb24uY3JlYXRlRW1wdHlFdmVudFN0b3JlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0V2ZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlbHkgY2xlYXIgdGhlIG9sZCBjYWxlbmRhciBpZiBpdCB3YXNuJ3QgdGhlIGluaXRpYWxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXZDb250ZXh0LmRpc3BhdGNoKHsgdHlwZTogJ1VOU0VUX0VWRU5UX0RSQUcnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuZXh0Q29udGV4dCkge1xuICAgICAgICAgICAgbmV4dENvbnRleHQuZGlzcGF0Y2goeyB0eXBlOiAnU0VUX0VWRU5UX0RSQUcnLCBzdGF0ZTogc3RhdGUgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEV2ZW50RHJhZ2dpbmcucHJvdG90eXBlLmNsZWFyRHJhZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluaXRpYWxDYWxlbmRhciA9IHRoaXMuY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgIHZhciByZWNlaXZpbmdDb250ZXh0ID0gdGhpcy5yZWNlaXZpbmdDb250ZXh0O1xuICAgICAgICBpZiAocmVjZWl2aW5nQ29udGV4dCkge1xuICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFVF9FVkVOVF9EUkFHJyB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGUgaW5pdGlhbCBjYWxlbmRhciBtaWdodCBoYXZlIGFuIGR1bW15IGRyYWcgc3RhdGUgZnJvbSBkaXNwbGF5RHJhZ1xuICAgICAgICBpZiAoaW5pdGlhbENhbGVuZGFyICE9PSByZWNlaXZpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICBpbml0aWFsQ2FsZW5kYXIuZGlzcGF0Y2goeyB0eXBlOiAnVU5TRVRfRVZFTlRfRFJBRycgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEV2ZW50RHJhZ2dpbmcucHJvdG90eXBlLmNsZWFudXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc3ViamVjdFNlZyA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmV2ZW50UmFuZ2UgPSBudWxsO1xuICAgICAgICB0aGlzLnJlbGV2YW50RXZlbnRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWNlaXZpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgdGhpcy52YWxpZE11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5tdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgIH07XG4gICAgLy8gVE9ETzogdGVzdCB0aGlzIGluIElFMTFcbiAgICAvLyBRVUVTVElPTjogd2h5IGRvIHdlIG5lZWQgaXQgb24gdGhlIHJlc2l6YWJsZT8/P1xuICAgIEV2ZW50RHJhZ2dpbmcuU0VMRUNUT1IgPSAnLmZjLWV2ZW50LWRyYWdnYWJsZSwgLmZjLWV2ZW50LXJlc2l6YWJsZSc7XG4gICAgcmV0dXJuIEV2ZW50RHJhZ2dpbmc7XG59KGNvbW1vbi5JbnRlcmFjdGlvbikpO1xuZnVuY3Rpb24gY29tcHV0ZUV2ZW50TXV0YXRpb24oaGl0MCwgaGl0MSwgbWFzc2FnZXJzKSB7XG4gICAgdmFyIGRhdGVTcGFuMCA9IGhpdDAuZGF0ZVNwYW47XG4gICAgdmFyIGRhdGVTcGFuMSA9IGhpdDEuZGF0ZVNwYW47XG4gICAgdmFyIGRhdGUwID0gZGF0ZVNwYW4wLnJhbmdlLnN0YXJ0O1xuICAgIHZhciBkYXRlMSA9IGRhdGVTcGFuMS5yYW5nZS5zdGFydDtcbiAgICB2YXIgc3RhbmRhcmRQcm9wcyA9IHt9O1xuICAgIGlmIChkYXRlU3BhbjAuYWxsRGF5ICE9PSBkYXRlU3BhbjEuYWxsRGF5KSB7XG4gICAgICAgIHN0YW5kYXJkUHJvcHMuYWxsRGF5ID0gZGF0ZVNwYW4xLmFsbERheTtcbiAgICAgICAgc3RhbmRhcmRQcm9wcy5oYXNFbmQgPSBoaXQxLmNvbnRleHQub3B0aW9ucy5hbGxEYXlNYWludGFpbkR1cmF0aW9uO1xuICAgICAgICBpZiAoZGF0ZVNwYW4xLmFsbERheSkge1xuICAgICAgICAgICAgLy8gbWVhbnMgZGF0ZTEgaXMgYWxyZWFkeSBzdGFydC1vZi1kYXksXG4gICAgICAgICAgICAvLyBidXQgZGF0ZTAgbmVlZHMgdG8gYmUgY29udmVydGVkXG4gICAgICAgICAgICBkYXRlMCA9IGNvbW1vbi5zdGFydE9mRGF5KGRhdGUwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgZGVsdGEgPSBjb21tb24uZGlmZkRhdGVzKGRhdGUwLCBkYXRlMSwgaGl0MC5jb250ZXh0LmRhdGVFbnYsIGhpdDAuY29tcG9uZW50SWQgPT09IGhpdDEuY29tcG9uZW50SWQgP1xuICAgICAgICBoaXQwLmxhcmdlVW5pdCA6XG4gICAgICAgIG51bGwpO1xuICAgIGlmIChkZWx0YS5taWxsaXNlY29uZHMpIHsgLy8gaGFzIGhvdXJzL21pbnV0ZXMvc2Vjb25kc1xuICAgICAgICBzdGFuZGFyZFByb3BzLmFsbERheSA9IGZhbHNlO1xuICAgIH1cbiAgICB2YXIgbXV0YXRpb24gPSB7XG4gICAgICAgIGRhdGVzRGVsdGE6IGRlbHRhLFxuICAgICAgICBzdGFuZGFyZFByb3BzOiBzdGFuZGFyZFByb3BzLFxuICAgIH07XG4gICAgZm9yICh2YXIgX2kgPSAwLCBtYXNzYWdlcnNfMSA9IG1hc3NhZ2VyczsgX2kgPCBtYXNzYWdlcnNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIG1hc3NhZ2VyID0gbWFzc2FnZXJzXzFbX2ldO1xuICAgICAgICBtYXNzYWdlcihtdXRhdGlvbiwgaGl0MCwgaGl0MSk7XG4gICAgfVxuICAgIHJldHVybiBtdXRhdGlvbjtcbn1cbmZ1bmN0aW9uIGdldENvbXBvbmVudFRvdWNoRGVsYXkoY29tcG9uZW50KSB7XG4gICAgdmFyIG9wdGlvbnMgPSBjb21wb25lbnQuY29udGV4dC5vcHRpb25zO1xuICAgIHZhciBkZWxheSA9IG9wdGlvbnMuZXZlbnRMb25nUHJlc3NEZWxheTtcbiAgICBpZiAoZGVsYXkgPT0gbnVsbCkge1xuICAgICAgICBkZWxheSA9IG9wdGlvbnMubG9uZ1ByZXNzRGVsYXk7XG4gICAgfVxuICAgIHJldHVybiBkZWxheTtcbn1cblxudmFyIEV2ZW50UmVzaXppbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKEV2ZW50UmVzaXppbmcsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRXZlbnRSZXNpemluZyhzZXR0aW5ncykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzZXR0aW5ncykgfHwgdGhpcztcbiAgICAgICAgLy8gaW50ZXJuYWwgc3RhdGVcbiAgICAgICAgX3RoaXMuZHJhZ2dpbmdTZWdFbCA9IG51bGw7XG4gICAgICAgIF90aGlzLmRyYWdnaW5nU2VnID0gbnVsbDsgLy8gVE9ETzogcmVuYW1lIHRvIHJlc2l6aW5nU2VnPyBzdWJqZWN0U2VnP1xuICAgICAgICBfdGhpcy5ldmVudFJhbmdlID0gbnVsbDtcbiAgICAgICAgX3RoaXMucmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgICAgICBfdGhpcy52YWxpZE11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgX3RoaXMubXV0YXRlZFJlbGV2YW50RXZlbnRzID0gbnVsbDtcbiAgICAgICAgX3RoaXMuaGFuZGxlUG9pbnRlckRvd24gPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSBfdGhpcy5jb21wb25lbnQ7XG4gICAgICAgICAgICB2YXIgc2VnRWwgPSBfdGhpcy5xdWVyeVNlZ0VsKGV2KTtcbiAgICAgICAgICAgIHZhciBzZWcgPSBjb21tb24uZ2V0RWxTZWcoc2VnRWwpO1xuICAgICAgICAgICAgdmFyIGV2ZW50UmFuZ2UgPSBfdGhpcy5ldmVudFJhbmdlID0gc2VnLmV2ZW50UmFuZ2U7XG4gICAgICAgICAgICBfdGhpcy5kcmFnZ2luZy5taW5EaXN0YW5jZSA9IGNvbXBvbmVudC5jb250ZXh0Lm9wdGlvbnMuZXZlbnREcmFnTWluRGlzdGFuY2U7XG4gICAgICAgICAgICAvLyBpZiB0b3VjaCwgbmVlZCB0byBiZSB3b3JraW5nIHdpdGggYSBzZWxlY3RlZCBldmVudFxuICAgICAgICAgICAgX3RoaXMuZHJhZ2dpbmcuc2V0SWdub3JlTW92ZSghX3RoaXMuY29tcG9uZW50LmlzVmFsaWRTZWdEb3duRWwoZXYub3JpZ0V2ZW50LnRhcmdldCkgfHxcbiAgICAgICAgICAgICAgICAoZXYuaXNUb3VjaCAmJiBfdGhpcy5jb21wb25lbnQucHJvcHMuZXZlbnRTZWxlY3Rpb24gIT09IGV2ZW50UmFuZ2UuaW5zdGFuY2UuaW5zdGFuY2VJZCkpO1xuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVEcmFnU3RhcnQgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gX3RoaXMuY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgICAgICB2YXIgZXZlbnRSYW5nZSA9IF90aGlzLmV2ZW50UmFuZ2U7XG4gICAgICAgICAgICBfdGhpcy5yZWxldmFudEV2ZW50cyA9IGNvbW1vbi5nZXRSZWxldmFudEV2ZW50cyhjb250ZXh0LmdldEN1cnJlbnREYXRhKCkuZXZlbnRTdG9yZSwgX3RoaXMuZXZlbnRSYW5nZS5pbnN0YW5jZS5pbnN0YW5jZUlkKTtcbiAgICAgICAgICAgIHZhciBzZWdFbCA9IF90aGlzLnF1ZXJ5U2VnRWwoZXYpO1xuICAgICAgICAgICAgX3RoaXMuZHJhZ2dpbmdTZWdFbCA9IHNlZ0VsO1xuICAgICAgICAgICAgX3RoaXMuZHJhZ2dpbmdTZWcgPSBjb21tb24uZ2V0RWxTZWcoc2VnRWwpO1xuICAgICAgICAgICAgY29udGV4dC5jYWxlbmRhckFwaS51bnNlbGVjdCgpO1xuICAgICAgICAgICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50UmVzaXplU3RhcnQnLCB7XG4gICAgICAgICAgICAgICAgZWw6IHNlZ0VsLFxuICAgICAgICAgICAgICAgIGV2ZW50OiBuZXcgY29tbW9uLkV2ZW50QXBpKGNvbnRleHQsIGV2ZW50UmFuZ2UuZGVmLCBldmVudFJhbmdlLmluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICBqc0V2ZW50OiBldi5vcmlnRXZlbnQsXG4gICAgICAgICAgICAgICAgdmlldzogY29udGV4dC52aWV3QXBpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmhhbmRsZUhpdFVwZGF0ZSA9IGZ1bmN0aW9uIChoaXQsIGlzRmluYWwsIGV2KSB7XG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IF90aGlzLmNvbXBvbmVudC5jb250ZXh0O1xuICAgICAgICAgICAgdmFyIHJlbGV2YW50RXZlbnRzID0gX3RoaXMucmVsZXZhbnRFdmVudHM7XG4gICAgICAgICAgICB2YXIgaW5pdGlhbEhpdCA9IF90aGlzLmhpdERyYWdnaW5nLmluaXRpYWxIaXQ7XG4gICAgICAgICAgICB2YXIgZXZlbnRJbnN0YW5jZSA9IF90aGlzLmV2ZW50UmFuZ2UuaW5zdGFuY2U7XG4gICAgICAgICAgICB2YXIgbXV0YXRpb24gPSBudWxsO1xuICAgICAgICAgICAgdmFyIG11dGF0ZWRSZWxldmFudEV2ZW50cyA9IG51bGw7XG4gICAgICAgICAgICB2YXIgaXNJbnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgaW50ZXJhY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgYWZmZWN0ZWRFdmVudHM6IHJlbGV2YW50RXZlbnRzLFxuICAgICAgICAgICAgICAgIG11dGF0ZWRFdmVudHM6IGNvbW1vbi5jcmVhdGVFbXB0eUV2ZW50U3RvcmUoKSxcbiAgICAgICAgICAgICAgICBpc0V2ZW50OiB0cnVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChoaXQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGlzYWxsb3dlZCA9IGhpdC5jb21wb25lbnRJZCA9PT0gaW5pdGlhbEhpdC5jb21wb25lbnRJZFxuICAgICAgICAgICAgICAgICAgICAmJiBfdGhpcy5pc0hpdENvbWJvQWxsb3dlZFxuICAgICAgICAgICAgICAgICAgICAmJiAhX3RoaXMuaXNIaXRDb21ib0FsbG93ZWQoaW5pdGlhbEhpdCwgaGl0KTtcbiAgICAgICAgICAgICAgICBpZiAoIWRpc2FsbG93ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb24gPSBjb21wdXRlTXV0YXRpb24oaW5pdGlhbEhpdCwgaGl0LCBldi5zdWJqZWN0RWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdmYy1ldmVudC1yZXNpemVyLXN0YXJ0JyksIGV2ZW50SW5zdGFuY2UucmFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtdXRhdGlvbikge1xuICAgICAgICAgICAgICAgIG11dGF0ZWRSZWxldmFudEV2ZW50cyA9IGNvbW1vbi5hcHBseU11dGF0aW9uVG9FdmVudFN0b3JlKHJlbGV2YW50RXZlbnRzLCBjb250ZXh0LmdldEN1cnJlbnREYXRhKCkuZXZlbnRVaUJhc2VzLCBtdXRhdGlvbiwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgaW50ZXJhY3Rpb24ubXV0YXRlZEV2ZW50cyA9IG11dGF0ZWRSZWxldmFudEV2ZW50cztcbiAgICAgICAgICAgICAgICBpZiAoIWNvbW1vbi5pc0ludGVyYWN0aW9uVmFsaWQoaW50ZXJhY3Rpb24sIGhpdC5kYXRlUHJvZmlsZSwgY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNJbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBtdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGlvbi5tdXRhdGVkRXZlbnRzID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobXV0YXRlZFJlbGV2YW50RXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTRVRfRVZFTlRfUkVTSVpFJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IGludGVyYWN0aW9uLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFVF9FVkVOVF9SRVNJWkUnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0ludmFsaWQpIHtcbiAgICAgICAgICAgICAgICBjb21tb24uZW5hYmxlQ3Vyc29yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21tb24uZGlzYWJsZUN1cnNvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0ZpbmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uICYmIGlzSGl0c0VxdWFsKGluaXRpYWxIaXQsIGhpdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfdGhpcy52YWxpZE11dGF0aW9uID0gbXV0YXRpb247XG4gICAgICAgICAgICAgICAgX3RoaXMubXV0YXRlZFJlbGV2YW50RXZlbnRzID0gbXV0YXRlZFJlbGV2YW50RXZlbnRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVEcmFnRW5kID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IF90aGlzLmNvbXBvbmVudC5jb250ZXh0O1xuICAgICAgICAgICAgdmFyIGV2ZW50RGVmID0gX3RoaXMuZXZlbnRSYW5nZS5kZWY7XG4gICAgICAgICAgICB2YXIgZXZlbnRJbnN0YW5jZSA9IF90aGlzLmV2ZW50UmFuZ2UuaW5zdGFuY2U7XG4gICAgICAgICAgICB2YXIgZXZlbnRBcGkgPSBuZXcgY29tbW9uLkV2ZW50QXBpKGNvbnRleHQsIGV2ZW50RGVmLCBldmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgIHZhciByZWxldmFudEV2ZW50cyA9IF90aGlzLnJlbGV2YW50RXZlbnRzO1xuICAgICAgICAgICAgdmFyIG11dGF0ZWRSZWxldmFudEV2ZW50cyA9IF90aGlzLm11dGF0ZWRSZWxldmFudEV2ZW50cztcbiAgICAgICAgICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdldmVudFJlc2l6ZVN0b3AnLCB7XG4gICAgICAgICAgICAgICAgZWw6IF90aGlzLmRyYWdnaW5nU2VnRWwsXG4gICAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50QXBpLFxuICAgICAgICAgICAgICAgIGpzRXZlbnQ6IGV2Lm9yaWdFdmVudCxcbiAgICAgICAgICAgICAgICB2aWV3OiBjb250ZXh0LnZpZXdBcGksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChfdGhpcy52YWxpZE11dGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyIHVwZGF0ZWRFdmVudEFwaSA9IG5ldyBjb21tb24uRXZlbnRBcGkoY29udGV4dCwgbXV0YXRlZFJlbGV2YW50RXZlbnRzLmRlZnNbZXZlbnREZWYuZGVmSWRdLCBldmVudEluc3RhbmNlID8gbXV0YXRlZFJlbGV2YW50RXZlbnRzLmluc3RhbmNlc1tldmVudEluc3RhbmNlLmluc3RhbmNlSWRdIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNRVJHRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICBldmVudFN0b3JlOiBtdXRhdGVkUmVsZXZhbnRFdmVudHMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50Q2hhbmdlQXJnID0ge1xuICAgICAgICAgICAgICAgICAgICBvbGRFdmVudDogZXZlbnRBcGksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiB1cGRhdGVkRXZlbnRBcGksXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0ZWRFdmVudHM6IGNvbW1vbi5idWlsZEV2ZW50QXBpcyhtdXRhdGVkUmVsZXZhbnRFdmVudHMsIGNvbnRleHQsIGV2ZW50SW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICByZXZlcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNRVJHRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IHJlbGV2YW50RXZlbnRzLCAvLyB0aGUgcHJlLWNoYW5nZSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50UmVzaXplJywgdHNsaWIuX19hc3NpZ24odHNsaWIuX19hc3NpZ24oe30sIGV2ZW50Q2hhbmdlQXJnKSwgeyBlbDogX3RoaXMuZHJhZ2dpbmdTZWdFbCwgc3RhcnREZWx0YTogX3RoaXMudmFsaWRNdXRhdGlvbi5zdGFydERlbHRhIHx8IGNvbW1vbi5jcmVhdGVEdXJhdGlvbigwKSwgZW5kRGVsdGE6IF90aGlzLnZhbGlkTXV0YXRpb24uZW5kRGVsdGEgfHwgY29tbW9uLmNyZWF0ZUR1cmF0aW9uKDApLCBqc0V2ZW50OiBldi5vcmlnRXZlbnQsIHZpZXc6IGNvbnRleHQudmlld0FwaSB9KSk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50Q2hhbmdlJywgZXZlbnRDaGFuZ2VBcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ19ub0V2ZW50UmVzaXplJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXNldCBhbGwgaW50ZXJuYWwgc3RhdGVcbiAgICAgICAgICAgIF90aGlzLmRyYWdnaW5nU2VnID0gbnVsbDtcbiAgICAgICAgICAgIF90aGlzLnJlbGV2YW50RXZlbnRzID0gbnVsbDtcbiAgICAgICAgICAgIF90aGlzLnZhbGlkTXV0YXRpb24gPSBudWxsO1xuICAgICAgICAgICAgLy8gb2theSB0byBrZWVwIGV2ZW50SW5zdGFuY2UgYXJvdW5kLiB1c2VmdWwgdG8gc2V0IGl0IGluIGhhbmRsZVBvaW50ZXJEb3duXG4gICAgICAgIH07XG4gICAgICAgIHZhciBjb21wb25lbnQgPSBzZXR0aW5ncy5jb21wb25lbnQ7XG4gICAgICAgIHZhciBkcmFnZ2luZyA9IF90aGlzLmRyYWdnaW5nID0gbmV3IEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcoc2V0dGluZ3MuZWwpO1xuICAgICAgICBkcmFnZ2luZy5wb2ludGVyLnNlbGVjdG9yID0gJy5mYy1ldmVudC1yZXNpemVyJztcbiAgICAgICAgZHJhZ2dpbmcudG91Y2hTY3JvbGxBbGxvd2VkID0gZmFsc2U7XG4gICAgICAgIGRyYWdnaW5nLmF1dG9TY3JvbGxlci5pc0VuYWJsZWQgPSBjb21wb25lbnQuY29udGV4dC5vcHRpb25zLmRyYWdTY3JvbGw7XG4gICAgICAgIHZhciBoaXREcmFnZ2luZyA9IF90aGlzLmhpdERyYWdnaW5nID0gbmV3IEhpdERyYWdnaW5nKF90aGlzLmRyYWdnaW5nLCBjb21tb24uaW50ZXJhY3Rpb25TZXR0aW5nc1RvU3RvcmUoc2V0dGluZ3MpKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbigncG9pbnRlcmRvd24nLCBfdGhpcy5oYW5kbGVQb2ludGVyRG93bik7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ2RyYWdzdGFydCcsIF90aGlzLmhhbmRsZURyYWdTdGFydCk7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ2hpdHVwZGF0ZScsIF90aGlzLmhhbmRsZUhpdFVwZGF0ZSk7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ2RyYWdlbmQnLCBfdGhpcy5oYW5kbGVEcmFnRW5kKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBFdmVudFJlc2l6aW5nLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRyYWdnaW5nLmRlc3Ryb3koKTtcbiAgICB9O1xuICAgIEV2ZW50UmVzaXppbmcucHJvdG90eXBlLnF1ZXJ5U2VnRWwgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgcmV0dXJuIGNvbW1vbi5lbGVtZW50Q2xvc2VzdChldi5zdWJqZWN0RWwsICcuZmMtZXZlbnQnKTtcbiAgICB9O1xuICAgIHJldHVybiBFdmVudFJlc2l6aW5nO1xufShjb21tb24uSW50ZXJhY3Rpb24pKTtcbmZ1bmN0aW9uIGNvbXB1dGVNdXRhdGlvbihoaXQwLCBoaXQxLCBpc0Zyb21TdGFydCwgaW5zdGFuY2VSYW5nZSkge1xuICAgIHZhciBkYXRlRW52ID0gaGl0MC5jb250ZXh0LmRhdGVFbnY7XG4gICAgdmFyIGRhdGUwID0gaGl0MC5kYXRlU3Bhbi5yYW5nZS5zdGFydDtcbiAgICB2YXIgZGF0ZTEgPSBoaXQxLmRhdGVTcGFuLnJhbmdlLnN0YXJ0O1xuICAgIHZhciBkZWx0YSA9IGNvbW1vbi5kaWZmRGF0ZXMoZGF0ZTAsIGRhdGUxLCBkYXRlRW52LCBoaXQwLmxhcmdlVW5pdCk7XG4gICAgaWYgKGlzRnJvbVN0YXJ0KSB7XG4gICAgICAgIGlmIChkYXRlRW52LmFkZChpbnN0YW5jZVJhbmdlLnN0YXJ0LCBkZWx0YSkgPCBpbnN0YW5jZVJhbmdlLmVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnREZWx0YTogZGVsdGEgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChkYXRlRW52LmFkZChpbnN0YW5jZVJhbmdlLmVuZCwgZGVsdGEpID4gaW5zdGFuY2VSYW5nZS5zdGFydCkge1xuICAgICAgICByZXR1cm4geyBlbmREZWx0YTogZGVsdGEgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBVbnNlbGVjdEF1dG8gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVW5zZWxlY3RBdXRvKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5pc1JlY2VudFBvaW50ZXJEYXRlU2VsZWN0ID0gZmFsc2U7IC8vIHdpc2ggd2UgY291bGQgdXNlIGEgc2VsZWN0b3IgdG8gZGV0ZWN0IGRhdGUgc2VsZWN0aW9uLCBidXQgdXNlcyBoaXQgc3lzdGVtXG4gICAgICAgIHRoaXMubWF0Y2hlc0NhbmNlbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1hdGNoZXNFdmVudCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uU2VsZWN0ID0gZnVuY3Rpb24gKHNlbGVjdEluZm8pIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RJbmZvLmpzRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5pc1JlY2VudFBvaW50ZXJEYXRlU2VsZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vbkRvY3VtZW50UG9pbnRlckRvd24gPSBmdW5jdGlvbiAocGV2KSB7XG4gICAgICAgICAgICB2YXIgdW5zZWxlY3RDYW5jZWwgPSBfdGhpcy5jb250ZXh0Lm9wdGlvbnMudW5zZWxlY3RDYW5jZWw7XG4gICAgICAgICAgICB2YXIgZG93bkVsID0gY29tbW9uLmdldEV2ZW50VGFyZ2V0VmlhUm9vdChwZXYub3JpZ0V2ZW50KTtcbiAgICAgICAgICAgIF90aGlzLm1hdGNoZXNDYW5jZWwgPSAhIWNvbW1vbi5lbGVtZW50Q2xvc2VzdChkb3duRWwsIHVuc2VsZWN0Q2FuY2VsKTtcbiAgICAgICAgICAgIF90aGlzLm1hdGNoZXNFdmVudCA9ICEhY29tbW9uLmVsZW1lbnRDbG9zZXN0KGRvd25FbCwgRXZlbnREcmFnZ2luZy5TRUxFQ1RPUik7IC8vIGludGVyYWN0aW9uIHN0YXJ0ZWQgb24gYW4gZXZlbnQ/XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub25Eb2N1bWVudFBvaW50ZXJVcCA9IGZ1bmN0aW9uIChwZXYpIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gX3RoaXMuY29udGV4dDtcbiAgICAgICAgICAgIHZhciBkb2N1bWVudFBvaW50ZXIgPSBfdGhpcy5kb2N1bWVudFBvaW50ZXI7XG4gICAgICAgICAgICB2YXIgY2FsZW5kYXJTdGF0ZSA9IGNvbnRleHQuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgICAgIC8vIHRvdWNoLXNjcm9sbGluZyBzaG91bGQgbmV2ZXIgdW5mb2N1cyBhbnkgdHlwZSBvZiBzZWxlY3Rpb25cbiAgICAgICAgICAgIGlmICghZG9jdW1lbnRQb2ludGVyLndhc1RvdWNoU2Nyb2xsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGVuZGFyU3RhdGUuZGF0ZVNlbGVjdGlvbiAmJiAvLyBhbiBleGlzdGluZyBkYXRlIHNlbGVjdGlvbj9cbiAgICAgICAgICAgICAgICAgICAgIV90aGlzLmlzUmVjZW50UG9pbnRlckRhdGVTZWxlY3QgLy8gYSBuZXcgcG9pbnRlci1pbml0aWF0ZWQgZGF0ZSBzZWxlY3Rpb24gc2luY2UgbGFzdCBvbkRvY3VtZW50UG9pbnRlclVwP1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdW5zZWxlY3RBdXRvID0gY29udGV4dC5vcHRpb25zLnVuc2VsZWN0QXV0bztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuc2VsZWN0QXV0byAmJiAoIXVuc2VsZWN0QXV0byB8fCAhX3RoaXMubWF0Y2hlc0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY2FsZW5kYXJBcGkudW5zZWxlY3QocGV2KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2FsZW5kYXJTdGF0ZS5ldmVudFNlbGVjdGlvbiAmJiAvLyBhbiBleGlzdGluZyBldmVudCBzZWxlY3RlZD9cbiAgICAgICAgICAgICAgICAgICAgIV90aGlzLm1hdGNoZXNFdmVudCAvLyBpbnRlcmFjdGlvbiBESUROJ1Qgc3RhcnQgb24gYW4gZXZlbnRcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFTEVDVF9FVkVOVCcgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMuaXNSZWNlbnRQb2ludGVyRGF0ZVNlbGVjdCA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgZG9jdW1lbnRQb2ludGVyID0gdGhpcy5kb2N1bWVudFBvaW50ZXIgPSBuZXcgUG9pbnRlckRyYWdnaW5nKGRvY3VtZW50KTtcbiAgICAgICAgZG9jdW1lbnRQb2ludGVyLnNob3VsZElnbm9yZU1vdmUgPSB0cnVlO1xuICAgICAgICBkb2N1bWVudFBvaW50ZXIuc2hvdWxkV2F0Y2hTY3JvbGwgPSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnRQb2ludGVyLmVtaXR0ZXIub24oJ3BvaW50ZXJkb3duJywgdGhpcy5vbkRvY3VtZW50UG9pbnRlckRvd24pO1xuICAgICAgICBkb2N1bWVudFBvaW50ZXIuZW1pdHRlci5vbigncG9pbnRlcnVwJywgdGhpcy5vbkRvY3VtZW50UG9pbnRlclVwKTtcbiAgICAgICAgLypcbiAgICAgICAgVE9ETzogYmV0dGVyIHdheSB0byBrbm93IGFib3V0IHdoZXRoZXIgdGhlcmUgd2FzIGEgc2VsZWN0aW9uIHdpdGggdGhlIHBvaW50ZXJcbiAgICAgICAgKi9cbiAgICAgICAgY29udGV4dC5lbWl0dGVyLm9uKCdzZWxlY3QnLCB0aGlzLm9uU2VsZWN0KTtcbiAgICB9XG4gICAgVW5zZWxlY3RBdXRvLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuZW1pdHRlci5vZmYoJ3NlbGVjdCcsIHRoaXMub25TZWxlY3QpO1xuICAgICAgICB0aGlzLmRvY3VtZW50UG9pbnRlci5kZXN0cm95KCk7XG4gICAgfTtcbiAgICByZXR1cm4gVW5zZWxlY3RBdXRvO1xufSgpKTtcblxudmFyIE9QVElPTl9SRUZJTkVSUyA9IHtcbiAgICBmaXhlZE1pcnJvclBhcmVudDogY29tbW9uLmlkZW50aXR5LFxufTtcbnZhciBMSVNURU5FUl9SRUZJTkVSUyA9IHtcbiAgICBkYXRlQ2xpY2s6IGNvbW1vbi5pZGVudGl0eSxcbiAgICBldmVudERyYWdTdGFydDogY29tbW9uLmlkZW50aXR5LFxuICAgIGV2ZW50RHJhZ1N0b3A6IGNvbW1vbi5pZGVudGl0eSxcbiAgICBldmVudERyb3A6IGNvbW1vbi5pZGVudGl0eSxcbiAgICBldmVudFJlc2l6ZVN0YXJ0OiBjb21tb24uaWRlbnRpdHksXG4gICAgZXZlbnRSZXNpemVTdG9wOiBjb21tb24uaWRlbnRpdHksXG4gICAgZXZlbnRSZXNpemU6IGNvbW1vbi5pZGVudGl0eSxcbiAgICBkcm9wOiBjb21tb24uaWRlbnRpdHksXG4gICAgZXZlbnRSZWNlaXZlOiBjb21tb24uaWRlbnRpdHksXG4gICAgZXZlbnRMZWF2ZTogY29tbW9uLmlkZW50aXR5LFxufTtcblxuLypcbkdpdmVuIGFuIGFscmVhZHkgaW5zdGFudGlhdGVkIGRyYWdnYWJsZSBvYmplY3QgZm9yIG9uZS1vci1tb3JlIGVsZW1lbnRzLFxuSW50ZXJwcmV0cyBhbnkgZHJhZ2dpbmcgYXMgYW4gYXR0ZW1wdCB0byBkcmFnIGFuIGV2ZW50cyB0aGF0IGxpdmVzIG91dHNpZGVcbm9mIGEgY2FsZW5kYXIgb250byBhIGNhbGVuZGFyLlxuKi9cbnZhciBFeHRlcm5hbEVsZW1lbnREcmFnZ2luZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFeHRlcm5hbEVsZW1lbnREcmFnZ2luZyhkcmFnZ2luZywgc3VwcGxpZWREcmFnTWV0YSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnJlY2VpdmluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICB0aGlzLmRyb3BwYWJsZUV2ZW50ID0gbnVsbDsgLy8gd2lsbCBleGlzdCBmb3IgYWxsIGRyYWdzLCBldmVuIGlmIGNyZWF0ZTpmYWxzZVxuICAgICAgICB0aGlzLnN1cHBsaWVkRHJhZ01ldGEgPSBudWxsO1xuICAgICAgICB0aGlzLmRyYWdNZXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5oYW5kbGVEcmFnU3RhcnQgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIF90aGlzLmRyYWdNZXRhID0gX3RoaXMuYnVpbGREcmFnTWV0YShldi5zdWJqZWN0RWwpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZUhpdFVwZGF0ZSA9IGZ1bmN0aW9uIChoaXQsIGlzRmluYWwsIGV2KSB7XG4gICAgICAgICAgICB2YXIgZHJhZ2dpbmcgPSBfdGhpcy5oaXREcmFnZ2luZy5kcmFnZ2luZztcbiAgICAgICAgICAgIHZhciByZWNlaXZpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgICAgIHZhciBkcm9wcGFibGVFdmVudCA9IG51bGw7XG4gICAgICAgICAgICB2YXIgaXNJbnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgaW50ZXJhY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgYWZmZWN0ZWRFdmVudHM6IGNvbW1vbi5jcmVhdGVFbXB0eUV2ZW50U3RvcmUoKSxcbiAgICAgICAgICAgICAgICBtdXRhdGVkRXZlbnRzOiBjb21tb24uY3JlYXRlRW1wdHlFdmVudFN0b3JlKCksXG4gICAgICAgICAgICAgICAgaXNFdmVudDogX3RoaXMuZHJhZ01ldGEuY3JlYXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChoaXQpIHtcbiAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0ID0gaGl0LmNvbnRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmNhbkRyb3BFbE9uQ2FsZW5kYXIoZXYuc3ViamVjdEVsLCByZWNlaXZpbmdDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICBkcm9wcGFibGVFdmVudCA9IGNvbXB1dGVFdmVudEZvckRhdGVTcGFuKGhpdC5kYXRlU3BhbiwgX3RoaXMuZHJhZ01ldGEsIHJlY2VpdmluZ0NvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGlvbi5tdXRhdGVkRXZlbnRzID0gY29tbW9uLmV2ZW50VHVwbGVUb1N0b3JlKGRyb3BwYWJsZUV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaXNJbnZhbGlkID0gIWNvbW1vbi5pc0ludGVyYWN0aW9uVmFsaWQoaW50ZXJhY3Rpb24sIGhpdC5kYXRlUHJvZmlsZSwgcmVjZWl2aW5nQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0ludmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHMgPSBjb21tb24uY3JlYXRlRW1wdHlFdmVudFN0b3JlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGFibGVFdmVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5kaXNwbGF5RHJhZyhyZWNlaXZpbmdDb250ZXh0LCBpbnRlcmFjdGlvbik7XG4gICAgICAgICAgICAvLyBzaG93IG1pcnJvciBpZiBubyBhbHJlYWR5LXJlbmRlcmVkIG1pcnJvciBlbGVtZW50IE9SIGlmIHdlIGFyZSBzaHV0dGluZyBkb3duIHRoZSBtaXJyb3IgKD8pXG4gICAgICAgICAgICAvLyBUT0RPOiB3aXNoIHdlIGNvdWxkIHNvbWVob3cgd2FpdCBmb3IgZGlzcGF0Y2ggdG8gZ3VhcmFudGVlIHJlbmRlclxuICAgICAgICAgICAgZHJhZ2dpbmcuc2V0TWlycm9ySXNWaXNpYmxlKGlzRmluYWwgfHwgIWRyb3BwYWJsZUV2ZW50IHx8ICFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZmMtZXZlbnQtbWlycm9yJykpO1xuICAgICAgICAgICAgaWYgKCFpc0ludmFsaWQpIHtcbiAgICAgICAgICAgICAgICBjb21tb24uZW5hYmxlQ3Vyc29yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21tb24uZGlzYWJsZUN1cnNvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0ZpbmFsKSB7XG4gICAgICAgICAgICAgICAgZHJhZ2dpbmcuc2V0TWlycm9yTmVlZHNSZXZlcnQoIWRyb3BwYWJsZUV2ZW50KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5yZWNlaXZpbmdDb250ZXh0ID0gcmVjZWl2aW5nQ29udGV4dDtcbiAgICAgICAgICAgICAgICBfdGhpcy5kcm9wcGFibGVFdmVudCA9IGRyb3BwYWJsZUV2ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZURyYWdFbmQgPSBmdW5jdGlvbiAocGV2KSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBfdGhpcywgcmVjZWl2aW5nQ29udGV4dCA9IF9hLnJlY2VpdmluZ0NvbnRleHQsIGRyb3BwYWJsZUV2ZW50ID0gX2EuZHJvcHBhYmxlRXZlbnQ7XG4gICAgICAgICAgICBfdGhpcy5jbGVhckRyYWcoKTtcbiAgICAgICAgICAgIGlmIChyZWNlaXZpbmdDb250ZXh0ICYmIGRyb3BwYWJsZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpbmFsSGl0ID0gX3RoaXMuaGl0RHJhZ2dpbmcuZmluYWxIaXQ7XG4gICAgICAgICAgICAgICAgdmFyIGZpbmFsVmlldyA9IGZpbmFsSGl0LmNvbnRleHQudmlld0FwaTtcbiAgICAgICAgICAgICAgICB2YXIgZHJhZ01ldGEgPSBfdGhpcy5kcmFnTWV0YTtcbiAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0LmVtaXR0ZXIudHJpZ2dlcignZHJvcCcsIHRzbGliLl9fYXNzaWduKHRzbGliLl9fYXNzaWduKHt9LCBidWlsZERhdGVQb2ludEFwaVdpdGhDb250ZXh0KGZpbmFsSGl0LmRhdGVTcGFuLCByZWNlaXZpbmdDb250ZXh0KSksIHsgZHJhZ2dlZEVsOiBwZXYuc3ViamVjdEVsLCBqc0V2ZW50OiBwZXYub3JpZ0V2ZW50LCB2aWV3OiBmaW5hbFZpZXcgfSkpO1xuICAgICAgICAgICAgICAgIGlmIChkcmFnTWV0YS5jcmVhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFkZGluZ0V2ZW50c18xID0gY29tbW9uLmV2ZW50VHVwbGVUb1N0b3JlKGRyb3BwYWJsZUV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTUVSR0VfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IGFkZGluZ0V2ZW50c18xLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBldi5pc1RvdWNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU0VMRUNUX0VWRU5UJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudEluc3RhbmNlSWQ6IGRyb3BwYWJsZUV2ZW50Lmluc3RhbmNlLmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBzaWduYWwgdGhhdCBhbiBleHRlcm5hbCBldmVudCBsYW5kZWRcbiAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50UmVjZWl2ZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBuZXcgY29tbW9uLkV2ZW50QXBpKHJlY2VpdmluZ0NvbnRleHQsIGRyb3BwYWJsZUV2ZW50LmRlZiwgZHJvcHBhYmxlRXZlbnQuaW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZEV2ZW50czogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXZlcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1JFTU9WRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFN0b3JlOiBhZGRpbmdFdmVudHNfMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkRWw6IHBldi5zdWJqZWN0RWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3OiBmaW5hbFZpZXcsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF90aGlzLnJlY2VpdmluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICAgICAgX3RoaXMuZHJvcHBhYmxlRXZlbnQgPSBudWxsO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgaGl0RHJhZ2dpbmcgPSB0aGlzLmhpdERyYWdnaW5nID0gbmV3IEhpdERyYWdnaW5nKGRyYWdnaW5nLCBjb21tb24uaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcucmVxdWlyZUluaXRpYWwgPSBmYWxzZTsgLy8gd2lsbCBzdGFydCBvdXRzaWRlIG9mIGEgY29tcG9uZW50XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ2RyYWdzdGFydCcsIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0KTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignaGl0dXBkYXRlJywgdGhpcy5oYW5kbGVIaXRVcGRhdGUpO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdkcmFnZW5kJywgdGhpcy5oYW5kbGVEcmFnRW5kKTtcbiAgICAgICAgdGhpcy5zdXBwbGllZERyYWdNZXRhID0gc3VwcGxpZWREcmFnTWV0YTtcbiAgICB9XG4gICAgRXh0ZXJuYWxFbGVtZW50RHJhZ2dpbmcucHJvdG90eXBlLmJ1aWxkRHJhZ01ldGEgPSBmdW5jdGlvbiAoc3ViamVjdEVsKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdXBwbGllZERyYWdNZXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbW1vbi5wYXJzZURyYWdNZXRhKHRoaXMuc3VwcGxpZWREcmFnTWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN1cHBsaWVkRHJhZ01ldGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21tb24ucGFyc2VEcmFnTWV0YSh0aGlzLnN1cHBsaWVkRHJhZ01ldGEoc3ViamVjdEVsKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldERyYWdNZXRhRnJvbUVsKHN1YmplY3RFbCk7XG4gICAgfTtcbiAgICBFeHRlcm5hbEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUuZGlzcGxheURyYWcgPSBmdW5jdGlvbiAobmV4dENvbnRleHQsIHN0YXRlKSB7XG4gICAgICAgIHZhciBwcmV2Q29udGV4dCA9IHRoaXMucmVjZWl2aW5nQ29udGV4dDtcbiAgICAgICAgaWYgKHByZXZDb250ZXh0ICYmIHByZXZDb250ZXh0ICE9PSBuZXh0Q29udGV4dCkge1xuICAgICAgICAgICAgcHJldkNvbnRleHQuZGlzcGF0Y2goeyB0eXBlOiAnVU5TRVRfRVZFTlRfRFJBRycgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHRDb250ZXh0KSB7XG4gICAgICAgICAgICBuZXh0Q29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdTRVRfRVZFTlRfRFJBRycsIHN0YXRlOiBzdGF0ZSB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRXh0ZXJuYWxFbGVtZW50RHJhZ2dpbmcucHJvdG90eXBlLmNsZWFyRHJhZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucmVjZWl2aW5nQ29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZpbmdDb250ZXh0LmRpc3BhdGNoKHsgdHlwZTogJ1VOU0VUX0VWRU5UX0RSQUcnIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBFeHRlcm5hbEVsZW1lbnREcmFnZ2luZy5wcm90b3R5cGUuY2FuRHJvcEVsT25DYWxlbmRhciA9IGZ1bmN0aW9uIChlbCwgcmVjZWl2aW5nQ29udGV4dCkge1xuICAgICAgICB2YXIgZHJvcEFjY2VwdCA9IHJlY2VpdmluZ0NvbnRleHQub3B0aW9ucy5kcm9wQWNjZXB0O1xuICAgICAgICBpZiAodHlwZW9mIGRyb3BBY2NlcHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBkcm9wQWNjZXB0LmNhbGwocmVjZWl2aW5nQ29udGV4dC5jYWxlbmRhckFwaSwgZWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZHJvcEFjY2VwdCA9PT0gJ3N0cmluZycgJiYgZHJvcEFjY2VwdCkge1xuICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oY29tbW9uLmVsZW1lbnRNYXRjaGVzKGVsLCBkcm9wQWNjZXB0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICByZXR1cm4gRXh0ZXJuYWxFbGVtZW50RHJhZ2dpbmc7XG59KCkpO1xuLy8gVXRpbHMgZm9yIGNvbXB1dGluZyBldmVudCBzdG9yZSBmcm9tIHRoZSBEcmFnTWV0YVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gY29tcHV0ZUV2ZW50Rm9yRGF0ZVNwYW4oZGF0ZVNwYW4sIGRyYWdNZXRhLCBjb250ZXh0KSB7XG4gICAgdmFyIGRlZlByb3BzID0gdHNsaWIuX19hc3NpZ24oe30sIGRyYWdNZXRhLmxlZnRvdmVyUHJvcHMpO1xuICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBjb250ZXh0LnBsdWdpbkhvb2tzLmV4dGVybmFsRGVmVHJhbnNmb3JtczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IF9hW19pXTtcbiAgICAgICAgdHNsaWIuX19hc3NpZ24oZGVmUHJvcHMsIHRyYW5zZm9ybShkYXRlU3BhbiwgZHJhZ01ldGEpKTtcbiAgICB9XG4gICAgdmFyIF9iID0gY29tbW9uLnJlZmluZUV2ZW50RGVmKGRlZlByb3BzLCBjb250ZXh0KSwgcmVmaW5lZCA9IF9iLnJlZmluZWQsIGV4dHJhID0gX2IuZXh0cmE7XG4gICAgdmFyIGRlZiA9IGNvbW1vbi5wYXJzZUV2ZW50RGVmKHJlZmluZWQsIGV4dHJhLCBkcmFnTWV0YS5zb3VyY2VJZCwgZGF0ZVNwYW4uYWxsRGF5LCBjb250ZXh0Lm9wdGlvbnMuZm9yY2VFdmVudER1cmF0aW9uIHx8IEJvb2xlYW4oZHJhZ01ldGEuZHVyYXRpb24pLCAvLyBoYXNFbmRcbiAgICBjb250ZXh0KTtcbiAgICB2YXIgc3RhcnQgPSBkYXRlU3Bhbi5yYW5nZS5zdGFydDtcbiAgICAvLyBvbmx5IHJlbHkgb24gdGltZSBpbmZvIGlmIGRyb3Agem9uZSBpcyBhbGwtZGF5LFxuICAgIC8vIG90aGVyd2lzZSwgd2UgYWxyZWFkeSBrbm93IHRoZSB0aW1lXG4gICAgaWYgKGRhdGVTcGFuLmFsbERheSAmJiBkcmFnTWV0YS5zdGFydFRpbWUpIHtcbiAgICAgICAgc3RhcnQgPSBjb250ZXh0LmRhdGVFbnYuYWRkKHN0YXJ0LCBkcmFnTWV0YS5zdGFydFRpbWUpO1xuICAgIH1cbiAgICB2YXIgZW5kID0gZHJhZ01ldGEuZHVyYXRpb24gP1xuICAgICAgICBjb250ZXh0LmRhdGVFbnYuYWRkKHN0YXJ0LCBkcmFnTWV0YS5kdXJhdGlvbikgOlxuICAgICAgICBjb21tb24uZ2V0RGVmYXVsdEV2ZW50RW5kKGRhdGVTcGFuLmFsbERheSwgc3RhcnQsIGNvbnRleHQpO1xuICAgIHZhciBpbnN0YW5jZSA9IGNvbW1vbi5jcmVhdGVFdmVudEluc3RhbmNlKGRlZi5kZWZJZCwgeyBzdGFydDogc3RhcnQsIGVuZDogZW5kIH0pO1xuICAgIHJldHVybiB7IGRlZjogZGVmLCBpbnN0YW5jZTogaW5zdGFuY2UgfTtcbn1cbi8vIFV0aWxzIGZvciBleHRyYWN0aW5nIGRhdGEgZnJvbSBlbGVtZW50XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBnZXREcmFnTWV0YUZyb21FbChlbCkge1xuICAgIHZhciBzdHIgPSBnZXRFbWJlZGRlZEVsRGF0YShlbCwgJ2V2ZW50Jyk7XG4gICAgdmFyIG9iaiA9IHN0ciA/XG4gICAgICAgIEpTT04ucGFyc2Uoc3RyKSA6XG4gICAgICAgIHsgY3JlYXRlOiBmYWxzZSB9OyAvLyBpZiBubyBlbWJlZGRlZCBkYXRhLCBhc3N1bWUgbm8gZXZlbnQgY3JlYXRpb25cbiAgICByZXR1cm4gY29tbW9uLnBhcnNlRHJhZ01ldGEob2JqKTtcbn1cbmNvbW1vbi5jb25maWcuZGF0YUF0dHJQcmVmaXggPSAnJztcbmZ1bmN0aW9uIGdldEVtYmVkZGVkRWxEYXRhKGVsLCBuYW1lKSB7XG4gICAgdmFyIHByZWZpeCA9IGNvbW1vbi5jb25maWcuZGF0YUF0dHJQcmVmaXg7XG4gICAgdmFyIHByZWZpeGVkTmFtZSA9IChwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJykgKyBuYW1lO1xuICAgIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtJyArIHByZWZpeGVkTmFtZSkgfHwgJyc7XG59XG5cbi8qXG5NYWtlcyBhbiBlbGVtZW50ICh0aGF0IGlzICpleHRlcm5hbCogdG8gYW55IGNhbGVuZGFyKSBkcmFnZ2FibGUuXG5DYW4gcGFzcyBpbiBkYXRhIHRoYXQgZGV0ZXJtaW5lcyBob3cgYW4gZXZlbnQgd2lsbCBiZSBjcmVhdGVkIHdoZW4gZHJvcHBlZCBvbnRvIGEgY2FsZW5kYXIuXG5MZXZlcmFnZXMgRnVsbENhbGVuZGFyJ3MgaW50ZXJuYWwgZHJhZy1uLWRyb3AgZnVuY3Rpb25hbGl0eSBXSVRIT1VUIGEgdGhpcmQtcGFydHkgZHJhZyBzeXN0ZW0uXG4qL1xudmFyIEV4dGVybmFsRHJhZ2dhYmxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEV4dGVybmFsRHJhZ2dhYmxlKGVsLCBzZXR0aW5ncykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoc2V0dGluZ3MgPT09IHZvaWQgMCkgeyBzZXR0aW5ncyA9IHt9OyB9XG4gICAgICAgIHRoaXMuaGFuZGxlUG9pbnRlckRvd24gPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIHZhciBkcmFnZ2luZyA9IF90aGlzLmRyYWdnaW5nO1xuICAgICAgICAgICAgdmFyIF9hID0gX3RoaXMuc2V0dGluZ3MsIG1pbkRpc3RhbmNlID0gX2EubWluRGlzdGFuY2UsIGxvbmdQcmVzc0RlbGF5ID0gX2EubG9uZ1ByZXNzRGVsYXk7XG4gICAgICAgICAgICBkcmFnZ2luZy5taW5EaXN0YW5jZSA9XG4gICAgICAgICAgICAgICAgbWluRGlzdGFuY2UgIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgICAgIG1pbkRpc3RhbmNlIDpcbiAgICAgICAgICAgICAgICAgICAgKGV2LmlzVG91Y2ggPyAwIDogY29tbW9uLkJBU0VfT1BUSU9OX0RFRkFVTFRTLmV2ZW50RHJhZ01pbkRpc3RhbmNlKTtcbiAgICAgICAgICAgIGRyYWdnaW5nLmRlbGF5ID1cbiAgICAgICAgICAgICAgICBldi5pc1RvdWNoID8gLy8gVE9ETzogZXZlbnR1YWxseSByZWFkIGV2ZW50TG9uZ1ByZXNzRGVsYXkgaW5zdGVhZCB2dnZcbiAgICAgICAgICAgICAgICAgICAgKGxvbmdQcmVzc0RlbGF5ICE9IG51bGwgPyBsb25nUHJlc3NEZWxheSA6IGNvbW1vbi5CQVNFX09QVElPTl9ERUZBVUxUUy5sb25nUHJlc3NEZWxheSkgOlxuICAgICAgICAgICAgICAgICAgICAwO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZURyYWdTdGFydCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgaWYgKGV2LmlzVG91Y2ggJiZcbiAgICAgICAgICAgICAgICBfdGhpcy5kcmFnZ2luZy5kZWxheSAmJlxuICAgICAgICAgICAgICAgIGV2LnN1YmplY3RFbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZjLWV2ZW50JykpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5kcmFnZ2luZy5taXJyb3IuZ2V0TWlycm9yRWwoKS5jbGFzc0xpc3QuYWRkKCdmYy1ldmVudC1zZWxlY3RlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgICAgIHZhciBkcmFnZ2luZyA9IHRoaXMuZHJhZ2dpbmcgPSBuZXcgRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZyhlbCk7XG4gICAgICAgIGRyYWdnaW5nLnRvdWNoU2Nyb2xsQWxsb3dlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoc2V0dGluZ3MuaXRlbVNlbGVjdG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRyYWdnaW5nLnBvaW50ZXIuc2VsZWN0b3IgPSBzZXR0aW5ncy5pdGVtU2VsZWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHRpbmdzLmFwcGVuZFRvICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRyYWdnaW5nLm1pcnJvci5wYXJlbnROb2RlID0gc2V0dGluZ3MuYXBwZW5kVG87IC8vIFRPRE86IHdyaXRlIHRlc3RzXG4gICAgICAgIH1cbiAgICAgICAgZHJhZ2dpbmcuZW1pdHRlci5vbigncG9pbnRlcmRvd24nLCB0aGlzLmhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgZHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ3N0YXJ0JywgdGhpcy5oYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgICBuZXcgRXh0ZXJuYWxFbGVtZW50RHJhZ2dpbmcoZHJhZ2dpbmcsIHNldHRpbmdzLmV2ZW50RGF0YSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgfVxuICAgIEV4dGVybmFsRHJhZ2dhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRyYWdnaW5nLmRlc3Ryb3koKTtcbiAgICB9O1xuICAgIHJldHVybiBFeHRlcm5hbERyYWdnYWJsZTtcbn0oKSk7XG5cbi8qXG5EZXRlY3RzIHdoZW4gYSAqVEhJUkQtUEFSVFkqIGRyYWctbi1kcm9wIHN5c3RlbSBpbnRlcmFjdHMgd2l0aCBlbGVtZW50cy5cblRoZSB0aGlyZC1wYXJ0eSBzeXN0ZW0gaXMgcmVzcG9uc2libGUgZm9yIGRyYXdpbmcgdGhlIHZpc3VhbHMgZWZmZWN0cyBvZiB0aGUgZHJhZy5cblRoaXMgY2xhc3Mgc2ltcGx5IG1vbml0b3JzIGZvciBwb2ludGVyIG1vdmVtZW50cyBhbmQgZmlyZXMgZXZlbnRzLlxuSXQgYWxzbyBoYXMgdGhlIGFiaWxpdHkgdG8gaGlkZSB0aGUgbW92aW5nIGVsZW1lbnQgKHRoZSBcIm1pcnJvclwiKSBkdXJpbmcgdGhlIGRyYWcuXG4qL1xudmFyIEluZmVycmVkRWxlbWVudERyYWdnaW5nID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliLl9fZXh0ZW5kcyhJbmZlcnJlZEVsZW1lbnREcmFnZ2luZywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbmZlcnJlZEVsZW1lbnREcmFnZ2luZyhjb250YWluZXJFbCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjb250YWluZXJFbCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc2hvdWxkSWdub3JlTW92ZSA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5taXJyb3JTZWxlY3RvciA9ICcnO1xuICAgICAgICBfdGhpcy5jdXJyZW50TWlycm9yRWwgPSBudWxsO1xuICAgICAgICBfdGhpcy5oYW5kbGVQb2ludGVyRG93biA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgX3RoaXMuZW1pdHRlci50cmlnZ2VyKCdwb2ludGVyZG93bicsIGV2KTtcbiAgICAgICAgICAgIGlmICghX3RoaXMuc2hvdWxkSWdub3JlTW92ZSkge1xuICAgICAgICAgICAgICAgIC8vIGZpcmUgZHJhZ3N0YXJ0IHJpZ2h0IGF3YXkuIGRvZXMgbm90IHN1cHBvcnQgZGVsYXkgb3IgbWluLWRpc3RhbmNlXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdHRlci50cmlnZ2VyKCdkcmFnc3RhcnQnLCBldik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIF90aGlzLmhhbmRsZVBvaW50ZXJNb3ZlID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzLnNob3VsZElnbm9yZU1vdmUpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ2RyYWdtb3ZlJywgZXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBfdGhpcy5oYW5kbGVQb2ludGVyVXAgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIF90aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcnVwJywgZXYpO1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5zaG91bGRJZ25vcmVNb3ZlKSB7XG4gICAgICAgICAgICAgICAgLy8gZmlyZSBkcmFnZW5kIHJpZ2h0IGF3YXkuIGRvZXMgbm90IHN1cHBvcnQgYSByZXZlcnQgYW5pbWF0aW9uXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdHRlci50cmlnZ2VyKCdkcmFnZW5kJywgZXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2YXIgcG9pbnRlciA9IF90aGlzLnBvaW50ZXIgPSBuZXcgUG9pbnRlckRyYWdnaW5nKGNvbnRhaW5lckVsKTtcbiAgICAgICAgcG9pbnRlci5lbWl0dGVyLm9uKCdwb2ludGVyZG93bicsIF90aGlzLmhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgcG9pbnRlci5lbWl0dGVyLm9uKCdwb2ludGVybW92ZScsIF90aGlzLmhhbmRsZVBvaW50ZXJNb3ZlKTtcbiAgICAgICAgcG9pbnRlci5lbWl0dGVyLm9uKCdwb2ludGVydXAnLCBfdGhpcy5oYW5kbGVQb2ludGVyVXApO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEluZmVycmVkRWxlbWVudERyYWdnaW5nLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBvaW50ZXIuZGVzdHJveSgpO1xuICAgIH07XG4gICAgSW5mZXJyZWRFbGVtZW50RHJhZ2dpbmcucHJvdG90eXBlLnNldElnbm9yZU1vdmUgPSBmdW5jdGlvbiAoYm9vbCkge1xuICAgICAgICB0aGlzLnNob3VsZElnbm9yZU1vdmUgPSBib29sO1xuICAgIH07XG4gICAgSW5mZXJyZWRFbGVtZW50RHJhZ2dpbmcucHJvdG90eXBlLnNldE1pcnJvcklzVmlzaWJsZSA9IGZ1bmN0aW9uIChib29sKSB7XG4gICAgICAgIGlmIChib29sKSB7XG4gICAgICAgICAgICAvLyByZXN0b3JlIGEgcHJldmlvdXNseSBoaWRkZW4gZWxlbWVudC5cbiAgICAgICAgICAgIC8vIHVzZSB0aGUgcmVmZXJlbmNlIGluIGNhc2UgdGhlIHNlbGVjdG9yIGNsYXNzIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZC5cbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRNaXJyb3JFbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE1pcnJvckVsLnN0eWxlLnZpc2liaWxpdHkgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRNaXJyb3JFbCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgbWlycm9yRWwgPSB0aGlzLm1pcnJvclNlbGVjdG9yXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogc29tZWhvdyBxdWVyeSBGdWxsQ2FsZW5kYXJzIFdJVEhJTiBzaGFkb3ctcm9vdHNcbiAgICAgICAgICAgICAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5taXJyb3JTZWxlY3RvcilcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICBpZiAobWlycm9yRWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRNaXJyb3JFbCA9IG1pcnJvckVsO1xuICAgICAgICAgICAgICAgIG1pcnJvckVsLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEluZmVycmVkRWxlbWVudERyYWdnaW5nO1xufShjb21tb24uRWxlbWVudERyYWdnaW5nKSk7XG5cbi8qXG5CcmlkZ2VzIHRoaXJkLXBhcnR5IGRyYWctbi1kcm9wIHN5c3RlbXMgd2l0aCBGdWxsQ2FsZW5kYXIuXG5NdXN0IGJlIGluc3RhbnRpYXRlZCBhbmQgZGVzdHJveWVkIGJ5IGNhbGxlci5cbiovXG52YXIgVGhpcmRQYXJ0eURyYWdnYWJsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUaGlyZFBhcnR5RHJhZ2dhYmxlKGNvbnRhaW5lck9yU2V0dGluZ3MsIHNldHRpbmdzKSB7XG4gICAgICAgIHZhciBjb250YWluZXJFbCA9IGRvY3VtZW50O1xuICAgICAgICBpZiAoXG4gICAgICAgIC8vIHdpc2ggd2UgY291bGQganVzdCB0ZXN0IGluc3RhbmNlb2YgRXZlbnRUYXJnZXQsIGJ1dCBkb2Vzbid0IHdvcmsgaW4gSUUxMVxuICAgICAgICBjb250YWluZXJPclNldHRpbmdzID09PSBkb2N1bWVudCB8fFxuICAgICAgICAgICAgY29udGFpbmVyT3JTZXR0aW5ncyBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lckVsID0gY29udGFpbmVyT3JTZXR0aW5ncztcbiAgICAgICAgICAgIHNldHRpbmdzID0gc2V0dGluZ3MgfHwge307XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXR0aW5ncyA9IChjb250YWluZXJPclNldHRpbmdzIHx8IHt9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZHJhZ2dpbmcgPSB0aGlzLmRyYWdnaW5nID0gbmV3IEluZmVycmVkRWxlbWVudERyYWdnaW5nKGNvbnRhaW5lckVsKTtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXR0aW5ncy5pdGVtU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBkcmFnZ2luZy5wb2ludGVyLnNlbGVjdG9yID0gc2V0dGluZ3MuaXRlbVNlbGVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbnRhaW5lckVsID09PSBkb2N1bWVudCkge1xuICAgICAgICAgICAgZHJhZ2dpbmcucG9pbnRlci5zZWxlY3RvciA9ICdbZGF0YS1ldmVudF0nO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MubWlycm9yU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBkcmFnZ2luZy5taXJyb3JTZWxlY3RvciA9IHNldHRpbmdzLm1pcnJvclNlbGVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIG5ldyBFeHRlcm5hbEVsZW1lbnREcmFnZ2luZyhkcmFnZ2luZywgc2V0dGluZ3MuZXZlbnREYXRhKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICB9XG4gICAgVGhpcmRQYXJ0eURyYWdnYWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kcmFnZ2luZy5kZXN0cm95KCk7XG4gICAgfTtcbiAgICByZXR1cm4gVGhpcmRQYXJ0eURyYWdnYWJsZTtcbn0oKSk7XG5cbnZhciBtYWluID0gY29tbW9uLmNyZWF0ZVBsdWdpbih7XG4gICAgY29tcG9uZW50SW50ZXJhY3Rpb25zOiBbRGF0ZUNsaWNraW5nLCBEYXRlU2VsZWN0aW5nLCBFdmVudERyYWdnaW5nLCBFdmVudFJlc2l6aW5nXSxcbiAgICBjYWxlbmRhckludGVyYWN0aW9uczogW1Vuc2VsZWN0QXV0b10sXG4gICAgZWxlbWVudERyYWdnaW5nSW1wbDogRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZyxcbiAgICBvcHRpb25SZWZpbmVyczogT1BUSU9OX1JFRklORVJTLFxuICAgIGxpc3RlbmVyUmVmaW5lcnM6IExJU1RFTkVSX1JFRklORVJTLFxufSk7XG5cbmV4cG9ydHMuRHJhZ2dhYmxlID0gRXh0ZXJuYWxEcmFnZ2FibGU7XG5leHBvcnRzLkZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcgPSBGZWF0dXJlZnVsRWxlbWVudERyYWdnaW5nO1xuZXhwb3J0cy5Qb2ludGVyRHJhZ2dpbmcgPSBQb2ludGVyRHJhZ2dpbmc7XG5leHBvcnRzLlRoaXJkUGFydHlEcmFnZ2FibGUgPSBUaGlyZFBhcnR5RHJhZ2dhYmxlO1xuZXhwb3J0cy5kZWZhdWx0ID0gbWFpbjtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBRUFBLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkMsT0FBdEIsRUFBK0IsWUFBL0IsRUFBNkM7RUFBRUMsS0FBSyxFQUFFO0FBQVQsQ0FBN0M7O0FBRUEsSUFBSUMsTUFBTSxHQUFHQyxPQUFPLENBQUMsc0JBQUQsQ0FBcEI7O0FBQ0EsSUFBSUMsS0FBSyxHQUFHRCxPQUFPLENBQUMsT0FBRCxDQUFuQjs7QUFFQUQsTUFBTSxDQUFDRyxNQUFQLENBQWNDLG9CQUFkLEdBQXFDLEdBQXJDO0FBQ0EsSUFBSUMsZ0JBQWdCLEdBQUcsQ0FBdkI7QUFDQSxJQUFJQyxXQUFXLEdBQUcsQ0FBbEI7QUFDQSxJQUFJQywwQkFBMEIsR0FBRyxLQUFqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLElBQUlDLGVBQWU7QUFBRztBQUFlLFlBQVk7RUFDN0MsU0FBU0EsZUFBVCxDQUF5QkMsV0FBekIsRUFBc0M7SUFDbEMsSUFBSUMsS0FBSyxHQUFHLElBQVo7O0lBQ0EsS0FBS0MsU0FBTCxHQUFpQixJQUFqQixDQUZrQyxDQUdsQzs7SUFDQSxLQUFLQyxRQUFMLEdBQWdCLEVBQWhCLENBSmtDLENBSWQ7O0lBQ3BCLEtBQUtDLGNBQUwsR0FBc0IsRUFBdEI7SUFDQSxLQUFLQyxnQkFBTCxHQUF3QixLQUF4QjtJQUNBLEtBQUtDLGlCQUFMLEdBQXlCLElBQXpCLENBUGtDLENBT0g7SUFDL0I7O0lBQ0EsS0FBS0MsVUFBTCxHQUFrQixLQUFsQjtJQUNBLEtBQUtDLGVBQUwsR0FBdUIsS0FBdkI7SUFDQSxLQUFLQyxjQUFMLEdBQXNCLEtBQXRCLENBWGtDLENBWWxDO0lBQ0E7O0lBQ0EsS0FBS0MsZUFBTCxHQUF1QixVQUFVQyxFQUFWLEVBQWM7TUFDakMsSUFBSSxDQUFDVixLQUFLLENBQUNXLGlCQUFOLEVBQUQsSUFDQUMsb0JBQW9CLENBQUNGLEVBQUQsQ0FEcEIsSUFFQVYsS0FBSyxDQUFDYSxRQUFOLENBQWVILEVBQWYsQ0FGSixFQUV3QjtRQUNwQixJQUFJSSxHQUFHLEdBQUdkLEtBQUssQ0FBQ2Usb0JBQU4sQ0FBMkJMLEVBQTNCLEVBQStCLElBQS9CLENBQVY7O1FBQ0FWLEtBQUssQ0FBQ2dCLE9BQU4sQ0FBY0MsT0FBZCxDQUFzQixhQUF0QixFQUFxQ0gsR0FBckM7O1FBQ0FkLEtBQUssQ0FBQ2tCLGVBQU4sQ0FBc0JKLEdBQXRCOztRQUNBLElBQUksQ0FBQ2QsS0FBSyxDQUFDSSxnQkFBWCxFQUE2QjtVQUN6QmUsUUFBUSxDQUFDQyxnQkFBVCxDQUEwQixXQUExQixFQUF1Q3BCLEtBQUssQ0FBQ3FCLGVBQTdDO1FBQ0g7O1FBQ0RGLFFBQVEsQ0FBQ0MsZ0JBQVQsQ0FBMEIsU0FBMUIsRUFBcUNwQixLQUFLLENBQUNzQixhQUEzQztNQUNIO0lBQ0osQ0FaRDs7SUFhQSxLQUFLRCxlQUFMLEdBQXVCLFVBQVVYLEVBQVYsRUFBYztNQUNqQyxJQUFJSSxHQUFHLEdBQUdkLEtBQUssQ0FBQ2Usb0JBQU4sQ0FBMkJMLEVBQTNCLENBQVY7O01BQ0FWLEtBQUssQ0FBQ3VCLFlBQU4sQ0FBbUJULEdBQW5COztNQUNBZCxLQUFLLENBQUNnQixPQUFOLENBQWNDLE9BQWQsQ0FBc0IsYUFBdEIsRUFBcUNILEdBQXJDO0lBQ0gsQ0FKRDs7SUFLQSxLQUFLUSxhQUFMLEdBQXFCLFVBQVVaLEVBQVYsRUFBYztNQUMvQlMsUUFBUSxDQUFDSyxtQkFBVCxDQUE2QixXQUE3QixFQUEwQ3hCLEtBQUssQ0FBQ3FCLGVBQWhEO01BQ0FGLFFBQVEsQ0FBQ0ssbUJBQVQsQ0FBNkIsU0FBN0IsRUFBd0N4QixLQUFLLENBQUNzQixhQUE5Qzs7TUFDQXRCLEtBQUssQ0FBQ2dCLE9BQU4sQ0FBY0MsT0FBZCxDQUFzQixXQUF0QixFQUFtQ2pCLEtBQUssQ0FBQ2Usb0JBQU4sQ0FBMkJMLEVBQTNCLENBQW5DOztNQUNBVixLQUFLLENBQUN5QixPQUFOLEdBSitCLENBSWQ7O0lBQ3BCLENBTEQsQ0FoQ2tDLENBc0NsQztJQUNBOzs7SUFDQSxLQUFLQyxnQkFBTCxHQUF3QixVQUFVaEIsRUFBVixFQUFjO01BQ2xDLElBQUlWLEtBQUssQ0FBQ2EsUUFBTixDQUFlSCxFQUFmLENBQUosRUFBd0I7UUFDcEJWLEtBQUssQ0FBQ08sZUFBTixHQUF3QixJQUF4Qjs7UUFDQSxJQUFJTyxHQUFHLEdBQUdkLEtBQUssQ0FBQzJCLG9CQUFOLENBQTJCakIsRUFBM0IsRUFBK0IsSUFBL0IsQ0FBVjs7UUFDQVYsS0FBSyxDQUFDZ0IsT0FBTixDQUFjQyxPQUFkLENBQXNCLGFBQXRCLEVBQXFDSCxHQUFyQzs7UUFDQWQsS0FBSyxDQUFDa0IsZUFBTixDQUFzQkosR0FBdEIsRUFKb0IsQ0FLcEI7UUFDQTs7O1FBQ0EsSUFBSWMsUUFBUSxHQUFHbEIsRUFBRSxDQUFDbUIsTUFBbEI7O1FBQ0EsSUFBSSxDQUFDN0IsS0FBSyxDQUFDSSxnQkFBWCxFQUE2QjtVQUN6QndCLFFBQVEsQ0FBQ1IsZ0JBQVQsQ0FBMEIsV0FBMUIsRUFBdUNwQixLQUFLLENBQUM4QixlQUE3QztRQUNIOztRQUNERixRQUFRLENBQUNSLGdCQUFULENBQTBCLFVBQTFCLEVBQXNDcEIsS0FBSyxDQUFDK0IsY0FBNUM7UUFDQUgsUUFBUSxDQUFDUixnQkFBVCxDQUEwQixhQUExQixFQUF5Q3BCLEtBQUssQ0FBQytCLGNBQS9DLEVBWm9CLENBWTRDO1FBQ2hFO1FBQ0E7UUFDQTs7UUFDQUMsTUFBTSxDQUFDWixnQkFBUCxDQUF3QixRQUF4QixFQUFrQ3BCLEtBQUssQ0FBQ2lDLGlCQUF4QyxFQUEyRCxJQUEzRDtNQUNIO0lBQ0osQ0FuQkQ7O0lBb0JBLEtBQUtILGVBQUwsR0FBdUIsVUFBVXBCLEVBQVYsRUFBYztNQUNqQyxJQUFJSSxHQUFHLEdBQUdkLEtBQUssQ0FBQzJCLG9CQUFOLENBQTJCakIsRUFBM0IsQ0FBVjs7TUFDQVYsS0FBSyxDQUFDdUIsWUFBTixDQUFtQlQsR0FBbkI7O01BQ0FkLEtBQUssQ0FBQ2dCLE9BQU4sQ0FBY0MsT0FBZCxDQUFzQixhQUF0QixFQUFxQ0gsR0FBckM7SUFDSCxDQUpEOztJQUtBLEtBQUtpQixjQUFMLEdBQXNCLFVBQVVyQixFQUFWLEVBQWM7TUFDaEMsSUFBSVYsS0FBSyxDQUFDTSxVQUFWLEVBQXNCO1FBQUU7UUFDcEIsSUFBSXNCLFFBQVEsR0FBR2xCLEVBQUUsQ0FBQ21CLE1BQWxCO1FBQ0FELFFBQVEsQ0FBQ0osbUJBQVQsQ0FBNkIsV0FBN0IsRUFBMEN4QixLQUFLLENBQUM4QixlQUFoRDtRQUNBRixRQUFRLENBQUNKLG1CQUFULENBQTZCLFVBQTdCLEVBQXlDeEIsS0FBSyxDQUFDK0IsY0FBL0M7UUFDQUgsUUFBUSxDQUFDSixtQkFBVCxDQUE2QixhQUE3QixFQUE0Q3hCLEtBQUssQ0FBQytCLGNBQWxEO1FBQ0FDLE1BQU0sQ0FBQ1IsbUJBQVAsQ0FBMkIsUUFBM0IsRUFBcUN4QixLQUFLLENBQUNpQyxpQkFBM0MsRUFBOEQsSUFBOUQsRUFMa0IsQ0FLbUQ7O1FBQ3JFakMsS0FBSyxDQUFDZ0IsT0FBTixDQUFjQyxPQUFkLENBQXNCLFdBQXRCLEVBQW1DakIsS0FBSyxDQUFDMkIsb0JBQU4sQ0FBMkJqQixFQUEzQixDQUFuQzs7UUFDQVYsS0FBSyxDQUFDeUIsT0FBTixHQVBrQixDQU9EOzs7UUFDakJ6QixLQUFLLENBQUNPLGVBQU4sR0FBd0IsS0FBeEI7UUFDQTJCLGtCQUFrQjtNQUNyQjtJQUNKLENBWkQ7O0lBYUEsS0FBS0QsaUJBQUwsR0FBeUIsWUFBWTtNQUNqQ2pDLEtBQUssQ0FBQ1EsY0FBTixHQUF1QixJQUF2QjtJQUNILENBRkQ7O0lBR0EsS0FBSzJCLFlBQUwsR0FBb0IsVUFBVXpCLEVBQVYsRUFBYztNQUM5QixJQUFJLENBQUNWLEtBQUssQ0FBQ0ksZ0JBQVgsRUFBNkI7UUFDekIsSUFBSWdDLEtBQUssR0FBSUosTUFBTSxDQUFDSyxXQUFQLEdBQXFCckMsS0FBSyxDQUFDc0MsV0FBNUIsR0FBMkN0QyxLQUFLLENBQUN1QyxTQUE3RDtRQUNBLElBQUlDLEtBQUssR0FBSVIsTUFBTSxDQUFDUyxXQUFQLEdBQXFCekMsS0FBSyxDQUFDMEMsV0FBNUIsR0FBMkMxQyxLQUFLLENBQUMyQyxTQUE3RDs7UUFDQTNDLEtBQUssQ0FBQ2dCLE9BQU4sQ0FBY0MsT0FBZCxDQUFzQixhQUF0QixFQUFxQztVQUNqQzJCLFNBQVMsRUFBRWxDLEVBRHNCO1VBRWpDbUMsT0FBTyxFQUFFN0MsS0FBSyxDQUFDTyxlQUZrQjtVQUdqQ04sU0FBUyxFQUFFRCxLQUFLLENBQUNDLFNBSGdCO1VBSWpDbUMsS0FBSyxFQUFFQSxLQUowQjtVQUtqQ0ksS0FBSyxFQUFFQSxLQUwwQjtVQU1qQ00sTUFBTSxFQUFFVixLQUFLLEdBQUdwQyxLQUFLLENBQUMrQyxTQU5XO1VBT2pDQyxNQUFNLEVBQUVSLEtBQUssR0FBR3hDLEtBQUssQ0FBQ2lEO1FBUFcsQ0FBckM7TUFTSDtJQUNKLENBZEQ7O0lBZUEsS0FBS2xELFdBQUwsR0FBbUJBLFdBQW5CO0lBQ0EsS0FBS2lCLE9BQUwsR0FBZSxJQUFJMUIsTUFBTSxDQUFDNEQsT0FBWCxFQUFmO0lBQ0FuRCxXQUFXLENBQUNxQixnQkFBWixDQUE2QixXQUE3QixFQUEwQyxLQUFLWCxlQUEvQztJQUNBVixXQUFXLENBQUNxQixnQkFBWixDQUE2QixZQUE3QixFQUEyQyxLQUFLTSxnQkFBaEQsRUFBa0U7TUFBRXlCLE9BQU8sRUFBRTtJQUFYLENBQWxFO0lBQ0FDLGVBQWU7RUFDbEI7O0VBQ0R0RCxlQUFlLENBQUN1RCxTQUFoQixDQUEwQkMsT0FBMUIsR0FBb0MsWUFBWTtJQUM1QyxLQUFLdkQsV0FBTCxDQUFpQnlCLG1CQUFqQixDQUFxQyxXQUFyQyxFQUFrRCxLQUFLZixlQUF2RDtJQUNBLEtBQUtWLFdBQUwsQ0FBaUJ5QixtQkFBakIsQ0FBcUMsWUFBckMsRUFBbUQsS0FBS0UsZ0JBQXhELEVBQTBFO01BQUV5QixPQUFPLEVBQUU7SUFBWCxDQUExRTtJQUNBSSxpQkFBaUI7RUFDcEIsQ0FKRDs7RUFLQXpELGVBQWUsQ0FBQ3VELFNBQWhCLENBQTBCeEMsUUFBMUIsR0FBcUMsVUFBVUgsRUFBVixFQUFjO0lBQy9DLElBQUlULFNBQVMsR0FBRyxLQUFLdUQsY0FBTCxDQUFvQjlDLEVBQXBCLENBQWhCO0lBQ0EsSUFBSStDLE1BQU0sR0FBRy9DLEVBQUUsQ0FBQ21CLE1BQWhCOztJQUNBLElBQUk1QixTQUFTLEtBQ1IsQ0FBQyxLQUFLRSxjQUFOLElBQXdCYixNQUFNLENBQUNvRSxjQUFQLENBQXNCRCxNQUF0QixFQUE4QixLQUFLdEQsY0FBbkMsQ0FEaEIsQ0FBYixFQUNrRjtNQUM5RSxLQUFLRixTQUFMLEdBQWlCQSxTQUFqQjtNQUNBLEtBQUtLLFVBQUwsR0FBa0IsSUFBbEIsQ0FGOEUsQ0FFdEQ7O01BQ3hCLEtBQUtFLGNBQUwsR0FBc0IsS0FBdEI7TUFDQSxPQUFPLElBQVA7SUFDSDs7SUFDRCxPQUFPLEtBQVA7RUFDSCxDQVhEOztFQVlBVixlQUFlLENBQUN1RCxTQUFoQixDQUEwQjVCLE9BQTFCLEdBQW9DLFlBQVk7SUFDNUM1QiwwQkFBMEIsR0FBRyxLQUE3QjtJQUNBLEtBQUtTLFVBQUwsR0FBa0IsS0FBbEI7SUFDQSxLQUFLTCxTQUFMLEdBQWlCLElBQWpCLENBSDRDLENBSTVDOztJQUNBLEtBQUswRCxrQkFBTDtFQUNILENBTkQ7O0VBT0E3RCxlQUFlLENBQUN1RCxTQUFoQixDQUEwQkcsY0FBMUIsR0FBMkMsVUFBVTlDLEVBQVYsRUFBYztJQUNyRCxJQUFJLEtBQUtSLFFBQVQsRUFBbUI7TUFDZixPQUFPWixNQUFNLENBQUNvRSxjQUFQLENBQXNCaEQsRUFBRSxDQUFDbUIsTUFBekIsRUFBaUMsS0FBSzNCLFFBQXRDLENBQVA7SUFDSDs7SUFDRCxPQUFPLEtBQUtILFdBQVo7RUFDSCxDQUxEOztFQU1BRCxlQUFlLENBQUN1RCxTQUFoQixDQUEwQjFDLGlCQUExQixHQUE4QyxZQUFZO0lBQ3RELE9BQU9oQixnQkFBZ0IsSUFBSSxLQUFLWSxlQUFoQztFQUNILENBRkQsQ0FySTZDLENBd0k3Qzs7O0VBQ0FULGVBQWUsQ0FBQ3VELFNBQWhCLENBQTBCTyxpQkFBMUIsR0FBOEMsWUFBWTtJQUN0RCxJQUFJLEtBQUt0RCxVQUFULEVBQXFCO01BQ2pCVCwwQkFBMEIsR0FBRyxJQUE3QjtJQUNIO0VBQ0osQ0FKRCxDQXpJNkMsQ0E4STdDO0VBQ0E7OztFQUNBQyxlQUFlLENBQUN1RCxTQUFoQixDQUEwQm5DLGVBQTFCLEdBQTRDLFVBQVVSLEVBQVYsRUFBYztJQUN0RCxJQUFJLEtBQUtMLGlCQUFULEVBQTRCO01BQ3hCLEtBQUtrQixZQUFMLENBQWtCYixFQUFsQjtNQUNBc0IsTUFBTSxDQUFDWixnQkFBUCxDQUF3QixRQUF4QixFQUFrQyxLQUFLZSxZQUF2QyxFQUFxRCxJQUFyRCxFQUZ3QixDQUVvQztJQUMvRDtFQUNKLENBTEQ7O0VBTUFyQyxlQUFlLENBQUN1RCxTQUFoQixDQUEwQjlCLFlBQTFCLEdBQXlDLFVBQVViLEVBQVYsRUFBYztJQUNuRCxJQUFJLEtBQUtMLGlCQUFULEVBQTRCO01BQ3hCLEtBQUtrQyxTQUFMLEdBQWlCN0IsRUFBRSxDQUFDMEIsS0FBcEI7TUFDQSxLQUFLTyxTQUFMLEdBQWlCakMsRUFBRSxDQUFDOEIsS0FBcEI7TUFDQSxLQUFLRixXQUFMLEdBQW1CTixNQUFNLENBQUNLLFdBQTFCO01BQ0EsS0FBS0ssV0FBTCxHQUFtQlYsTUFBTSxDQUFDUyxXQUExQjtJQUNIO0VBQ0osQ0FQRDs7RUFRQTNDLGVBQWUsQ0FBQ3VELFNBQWhCLENBQTBCTSxrQkFBMUIsR0FBK0MsWUFBWTtJQUN2RCxJQUFJLEtBQUt0RCxpQkFBVCxFQUE0QjtNQUN4QjJCLE1BQU0sQ0FBQ1IsbUJBQVAsQ0FBMkIsUUFBM0IsRUFBcUMsS0FBS1csWUFBMUMsRUFBd0QsSUFBeEQsRUFEd0IsQ0FDdUM7SUFDbEU7RUFDSixDQUpELENBOUo2QyxDQW1LN0M7RUFDQTs7O0VBQ0FyQyxlQUFlLENBQUN1RCxTQUFoQixDQUEwQnRDLG9CQUExQixHQUFpRCxVQUFVTCxFQUFWLEVBQWNtRCxPQUFkLEVBQXVCO0lBQ3BFLElBQUlmLE1BQU0sR0FBRyxDQUFiO0lBQ0EsSUFBSUUsTUFBTSxHQUFHLENBQWIsQ0FGb0UsQ0FHcEU7O0lBQ0EsSUFBSWEsT0FBSixFQUFhO01BQ1QsS0FBS2QsU0FBTCxHQUFpQnJDLEVBQUUsQ0FBQzBCLEtBQXBCO01BQ0EsS0FBS2EsU0FBTCxHQUFpQnZDLEVBQUUsQ0FBQzhCLEtBQXBCO0lBQ0gsQ0FIRCxNQUlLO01BQ0RNLE1BQU0sR0FBR3BDLEVBQUUsQ0FBQzBCLEtBQUgsR0FBVyxLQUFLVyxTQUF6QjtNQUNBQyxNQUFNLEdBQUd0QyxFQUFFLENBQUM4QixLQUFILEdBQVcsS0FBS1MsU0FBekI7SUFDSDs7SUFDRCxPQUFPO01BQ0hMLFNBQVMsRUFBRWxDLEVBRFI7TUFFSG1DLE9BQU8sRUFBRSxLQUZOO01BR0g1QyxTQUFTLEVBQUUsS0FBS0EsU0FIYjtNQUlIbUMsS0FBSyxFQUFFMUIsRUFBRSxDQUFDMEIsS0FKUDtNQUtISSxLQUFLLEVBQUU5QixFQUFFLENBQUM4QixLQUxQO01BTUhNLE1BQU0sRUFBRUEsTUFOTDtNQU9IRSxNQUFNLEVBQUVBO0lBUEwsQ0FBUDtFQVNILENBckJEOztFQXNCQWxELGVBQWUsQ0FBQ3VELFNBQWhCLENBQTBCMUIsb0JBQTFCLEdBQWlELFVBQVVqQixFQUFWLEVBQWNtRCxPQUFkLEVBQXVCO0lBQ3BFLElBQUlDLE9BQU8sR0FBR3BELEVBQUUsQ0FBQ29ELE9BQWpCO0lBQ0EsSUFBSTFCLEtBQUo7SUFDQSxJQUFJSSxLQUFKO0lBQ0EsSUFBSU0sTUFBTSxHQUFHLENBQWI7SUFDQSxJQUFJRSxNQUFNLEdBQUcsQ0FBYixDQUxvRSxDQU1wRTtJQUNBOztJQUNBLElBQUljLE9BQU8sSUFBSUEsT0FBTyxDQUFDQyxNQUF2QixFQUErQjtNQUMzQjNCLEtBQUssR0FBRzBCLE9BQU8sQ0FBQyxDQUFELENBQVAsQ0FBVzFCLEtBQW5CO01BQ0FJLEtBQUssR0FBR3NCLE9BQU8sQ0FBQyxDQUFELENBQVAsQ0FBV3RCLEtBQW5CO0lBQ0gsQ0FIRCxNQUlLO01BQ0RKLEtBQUssR0FBRzFCLEVBQUUsQ0FBQzBCLEtBQVg7TUFDQUksS0FBSyxHQUFHOUIsRUFBRSxDQUFDOEIsS0FBWDtJQUNILENBZm1FLENBZ0JwRTs7O0lBQ0EsSUFBSXFCLE9BQUosRUFBYTtNQUNULEtBQUtkLFNBQUwsR0FBaUJYLEtBQWpCO01BQ0EsS0FBS2EsU0FBTCxHQUFpQlQsS0FBakI7SUFDSCxDQUhELE1BSUs7TUFDRE0sTUFBTSxHQUFHVixLQUFLLEdBQUcsS0FBS1csU0FBdEI7TUFDQUMsTUFBTSxHQUFHUixLQUFLLEdBQUcsS0FBS1MsU0FBdEI7SUFDSDs7SUFDRCxPQUFPO01BQ0hMLFNBQVMsRUFBRWxDLEVBRFI7TUFFSG1DLE9BQU8sRUFBRSxJQUZOO01BR0g1QyxTQUFTLEVBQUUsS0FBS0EsU0FIYjtNQUlIbUMsS0FBSyxFQUFFQSxLQUpKO01BS0hJLEtBQUssRUFBRUEsS0FMSjtNQU1ITSxNQUFNLEVBQUVBLE1BTkw7TUFPSEUsTUFBTSxFQUFFQTtJQVBMLENBQVA7RUFTSCxDQWxDRDs7RUFtQ0EsT0FBT2xELGVBQVA7QUFDSCxDQS9Ob0MsRUFBckMsQyxDQWdPQTs7O0FBQ0EsU0FBU2Msb0JBQVQsQ0FBOEJGLEVBQTlCLEVBQWtDO0VBQzlCLE9BQU9BLEVBQUUsQ0FBQ3NELE1BQUgsS0FBYyxDQUFkLElBQW1CLENBQUN0RCxFQUFFLENBQUN1RCxPQUE5QjtBQUNILEMsQ0FDRDtBQUNBOzs7QUFDQSxTQUFTL0Isa0JBQVQsR0FBOEI7RUFDMUJ2QyxnQkFBZ0IsSUFBSSxDQUFwQjtFQUNBdUUsVUFBVSxDQUFDLFlBQVk7SUFDbkJ2RSxnQkFBZ0IsSUFBSSxDQUFwQjtFQUNILENBRlMsRUFFUEwsTUFBTSxDQUFDRyxNQUFQLENBQWNDLG9CQUZQLENBQVY7QUFHSCxDLENBQ0Q7QUFDQTs7O0FBQ0EsU0FBUzBELGVBQVQsR0FBMkI7RUFDdkJ4RCxXQUFXLElBQUksQ0FBZjs7RUFDQSxJQUFJQSxXQUFXLEtBQUssQ0FBcEIsRUFBdUI7SUFDbkJvQyxNQUFNLENBQUNaLGdCQUFQLENBQXdCLFdBQXhCLEVBQXFDK0MsaUJBQXJDLEVBQXdEO01BQUVoQixPQUFPLEVBQUU7SUFBWCxDQUF4RDtFQUNIO0FBQ0o7O0FBQ0QsU0FBU0ksaUJBQVQsR0FBNkI7RUFDekIzRCxXQUFXLElBQUksQ0FBZjs7RUFDQSxJQUFJLENBQUNBLFdBQUwsRUFBa0I7SUFDZG9DLE1BQU0sQ0FBQ1IsbUJBQVAsQ0FBMkIsV0FBM0IsRUFBd0MyQyxpQkFBeEMsRUFBMkQ7TUFBRWhCLE9BQU8sRUFBRTtJQUFYLENBQTNEO0VBQ0g7QUFDSjs7QUFDRCxTQUFTZ0IsaUJBQVQsQ0FBMkJ6RCxFQUEzQixFQUErQjtFQUMzQixJQUFJYiwwQkFBSixFQUFnQztJQUM1QmEsRUFBRSxDQUFDMEQsY0FBSDtFQUNIO0FBQ0o7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxJQUFJQyxhQUFhO0FBQUc7QUFBZSxZQUFZO0VBQzNDLFNBQVNBLGFBQVQsR0FBeUI7SUFDckIsS0FBS0MsU0FBTCxHQUFpQixLQUFqQixDQURxQixDQUNHOztJQUN4QixLQUFLQyxRQUFMLEdBQWdCLElBQWhCO0lBQ0EsS0FBS0MsUUFBTCxHQUFnQixJQUFoQjtJQUNBLEtBQUtDLFlBQUwsR0FBb0IsSUFBcEIsQ0FKcUIsQ0FJSztJQUMxQjs7SUFDQSxLQUFLQyxVQUFMLEdBQWtCdkQsUUFBUSxDQUFDd0QsSUFBM0IsQ0FOcUIsQ0FNWTs7SUFDakMsS0FBS0MsTUFBTCxHQUFjLElBQWQ7SUFDQSxLQUFLQyxjQUFMLEdBQXNCLENBQXRCO0VBQ0g7O0VBQ0RSLGFBQWEsQ0FBQ2hCLFNBQWQsQ0FBd0J5QixLQUF4QixHQUFnQyxVQUFVUCxRQUFWLEVBQW9CbkMsS0FBcEIsRUFBMkJJLEtBQTNCLEVBQWtDO0lBQzlELEtBQUsrQixRQUFMLEdBQWdCQSxRQUFoQjtJQUNBLEtBQUtFLFlBQUwsR0FBb0IsS0FBS0YsUUFBTCxDQUFjUSxxQkFBZCxFQUFwQjtJQUNBLEtBQUtDLFdBQUwsR0FBbUI1QyxLQUFLLEdBQUdKLE1BQU0sQ0FBQ0ssV0FBbEM7SUFDQSxLQUFLNEMsV0FBTCxHQUFtQnpDLEtBQUssR0FBR1IsTUFBTSxDQUFDUyxXQUFsQztJQUNBLEtBQUtLLE1BQUwsR0FBYyxDQUFkO0lBQ0EsS0FBS0UsTUFBTCxHQUFjLENBQWQ7SUFDQSxLQUFLa0MsZ0JBQUw7RUFDSCxDQVJEOztFQVNBYixhQUFhLENBQUNoQixTQUFkLENBQXdCOEIsVUFBeEIsR0FBcUMsVUFBVS9DLEtBQVYsRUFBaUJJLEtBQWpCLEVBQXdCO0lBQ3pELEtBQUtNLE1BQUwsR0FBZVYsS0FBSyxHQUFHSixNQUFNLENBQUNLLFdBQWhCLEdBQStCLEtBQUsyQyxXQUFsRDtJQUNBLEtBQUtoQyxNQUFMLEdBQWVSLEtBQUssR0FBR1IsTUFBTSxDQUFDUyxXQUFoQixHQUErQixLQUFLd0MsV0FBbEQ7SUFDQSxLQUFLQyxnQkFBTDtFQUNILENBSkQsQ0FwQjJDLENBeUIzQzs7O0VBQ0FiLGFBQWEsQ0FBQ2hCLFNBQWQsQ0FBd0IrQixZQUF4QixHQUF1QyxVQUFVQyxJQUFWLEVBQWdCO0lBQ25ELElBQUlBLElBQUosRUFBVTtNQUNOLElBQUksQ0FBQyxLQUFLZixTQUFWLEVBQXFCO1FBQ2pCLElBQUksS0FBS0UsUUFBVCxFQUFtQjtVQUNmLEtBQUtBLFFBQUwsQ0FBY2MsS0FBZCxDQUFvQkMsT0FBcEIsR0FBOEIsRUFBOUI7UUFDSDs7UUFDRCxLQUFLakIsU0FBTCxHQUFpQmUsSUFBakIsQ0FKaUIsQ0FJTTs7UUFDdkIsS0FBS0gsZ0JBQUwsR0FMaUIsQ0FLUTtNQUM1QjtJQUNKLENBUkQsTUFTSyxJQUFJLEtBQUtaLFNBQVQsRUFBb0I7TUFDckIsSUFBSSxLQUFLRSxRQUFULEVBQW1CO1FBQ2YsS0FBS0EsUUFBTCxDQUFjYyxLQUFkLENBQW9CQyxPQUFwQixHQUE4QixNQUE5QjtNQUNIOztNQUNELEtBQUtqQixTQUFMLEdBQWlCZSxJQUFqQjtJQUNIO0VBQ0osQ0FoQkQsQ0ExQjJDLENBMkMzQzs7O0VBQ0FoQixhQUFhLENBQUNoQixTQUFkLENBQXdCbUMsSUFBeEIsR0FBK0IsVUFBVUMsb0JBQVYsRUFBZ0NDLFFBQWhDLEVBQTBDO0lBQ3JFLElBQUkxRixLQUFLLEdBQUcsSUFBWjs7SUFDQSxJQUFJMkYsSUFBSSxHQUFHLFNBQVBBLElBQU8sR0FBWTtNQUNuQjNGLEtBQUssQ0FBQ3lCLE9BQU47O01BQ0FpRSxRQUFRO0lBQ1gsQ0FIRDs7SUFJQSxJQUFJRCxvQkFBb0IsSUFDcEIsS0FBS2pCLFFBREwsSUFFQSxLQUFLRixTQUZMLElBR0EsS0FBS08sY0FITCxNQUd1QjtJQUN0QixLQUFLL0IsTUFBTCxJQUFlLEtBQUtFLE1BSnJCLENBQUosQ0FJaUM7SUFKakMsRUFLRTtNQUNFLEtBQUs0QyxpQkFBTCxDQUF1QkQsSUFBdkIsRUFBNkIsS0FBS2QsY0FBbEM7SUFDSCxDQVBELE1BUUs7TUFDRFgsVUFBVSxDQUFDeUIsSUFBRCxFQUFPLENBQVAsQ0FBVjtJQUNIO0VBQ0osQ0FqQkQ7O0VBa0JBdEIsYUFBYSxDQUFDaEIsU0FBZCxDQUF3QnVDLGlCQUF4QixHQUE0QyxVQUFVRixRQUFWLEVBQW9CYixjQUFwQixFQUFvQztJQUM1RSxJQUFJTCxRQUFRLEdBQUcsS0FBS0EsUUFBcEI7SUFDQSxJQUFJcUIsaUJBQWlCLEdBQUcsS0FBS3RCLFFBQUwsQ0FBY1EscUJBQWQsRUFBeEIsQ0FGNEUsQ0FFYjs7SUFDL0RQLFFBQVEsQ0FBQ2MsS0FBVCxDQUFlUSxVQUFmLEdBQ0ksU0FBU2pCLGNBQVQsR0FBMEIsS0FBMUIsR0FDSSxPQURKLEdBQ2NBLGNBRGQsR0FDK0IsSUFGbkM7SUFHQXZGLE1BQU0sQ0FBQ3lHLFVBQVAsQ0FBa0J2QixRQUFsQixFQUE0QjtNQUN4QndCLElBQUksRUFBRUgsaUJBQWlCLENBQUNHLElBREE7TUFFeEJDLEdBQUcsRUFBRUosaUJBQWlCLENBQUNJO0lBRkMsQ0FBNUI7SUFJQTNHLE1BQU0sQ0FBQzRHLGtCQUFQLENBQTBCMUIsUUFBMUIsRUFBb0MsWUFBWTtNQUM1Q0EsUUFBUSxDQUFDYyxLQUFULENBQWVRLFVBQWYsR0FBNEIsRUFBNUI7TUFDQUosUUFBUTtJQUNYLENBSEQ7RUFJSCxDQWREOztFQWVBckIsYUFBYSxDQUFDaEIsU0FBZCxDQUF3QjVCLE9BQXhCLEdBQWtDLFlBQVk7SUFDMUMsSUFBSSxLQUFLK0MsUUFBVCxFQUFtQjtNQUNmbEYsTUFBTSxDQUFDNkcsYUFBUCxDQUFxQixLQUFLM0IsUUFBMUI7TUFDQSxLQUFLQSxRQUFMLEdBQWdCLElBQWhCO0lBQ0g7O0lBQ0QsS0FBS0QsUUFBTCxHQUFnQixJQUFoQjtFQUNILENBTkQ7O0VBT0FGLGFBQWEsQ0FBQ2hCLFNBQWQsQ0FBd0I2QixnQkFBeEIsR0FBMkMsWUFBWTtJQUNuRCxJQUFJLEtBQUtYLFFBQUwsSUFBaUIsS0FBS0QsU0FBMUIsRUFBcUM7TUFDakNoRixNQUFNLENBQUN5RyxVQUFQLENBQWtCLEtBQUtLLFdBQUwsRUFBbEIsRUFBc0M7UUFDbENKLElBQUksRUFBRSxLQUFLdkIsWUFBTCxDQUFrQnVCLElBQWxCLEdBQXlCLEtBQUtsRCxNQURGO1FBRWxDbUQsR0FBRyxFQUFFLEtBQUt4QixZQUFMLENBQWtCd0IsR0FBbEIsR0FBd0IsS0FBS2pEO01BRkEsQ0FBdEM7SUFJSDtFQUNKLENBUEQ7O0VBUUFxQixhQUFhLENBQUNoQixTQUFkLENBQXdCK0MsV0FBeEIsR0FBc0MsWUFBWTtJQUM5QyxJQUFJM0IsWUFBWSxHQUFHLEtBQUtBLFlBQXhCO0lBQ0EsSUFBSUQsUUFBUSxHQUFHLEtBQUtBLFFBQXBCOztJQUNBLElBQUksQ0FBQ0EsUUFBTCxFQUFlO01BQ1hBLFFBQVEsR0FBRyxLQUFLQSxRQUFMLEdBQWdCLEtBQUtELFFBQUwsQ0FBYzhCLFNBQWQsQ0FBd0IsSUFBeEIsQ0FBM0IsQ0FEVyxDQUMrQztNQUMxRDtNQUNBOztNQUNBN0IsUUFBUSxDQUFDOEIsU0FBVCxDQUFtQkMsR0FBbkIsQ0FBdUIsaUJBQXZCO01BQ0EvQixRQUFRLENBQUM4QixTQUFULENBQW1CQyxHQUFuQixDQUF1QixtQkFBdkI7TUFDQWpILE1BQU0sQ0FBQ3lHLFVBQVAsQ0FBa0J2QixRQUFsQixFQUE0QjtRQUN4QmdDLFFBQVEsRUFBRSxPQURjO1FBRXhCNUIsTUFBTSxFQUFFLEtBQUtBLE1BRlc7UUFHeEI2QixVQUFVLEVBQUUsRUFIWTtRQUl4QkMsU0FBUyxFQUFFLFlBSmE7UUFLeEJDLEtBQUssRUFBRWxDLFlBQVksQ0FBQ21DLEtBQWIsR0FBcUJuQyxZQUFZLENBQUN1QixJQUxqQjtRQU14QmEsTUFBTSxFQUFFcEMsWUFBWSxDQUFDcUMsTUFBYixHQUFzQnJDLFlBQVksQ0FBQ3dCLEdBTm5CO1FBT3hCVyxLQUFLLEVBQUUsTUFQaUI7UUFReEJFLE1BQU0sRUFBRSxNQVJnQjtRQVN4QkMsTUFBTSxFQUFFO01BVGdCLENBQTVCO01BV0EsS0FBS3JDLFVBQUwsQ0FBZ0JzQyxXQUFoQixDQUE0QnhDLFFBQTVCO0lBQ0g7O0lBQ0QsT0FBT0EsUUFBUDtFQUNILENBdkJEOztFQXdCQSxPQUFPSCxhQUFQO0FBQ0gsQ0FySGtDLEVBQW5DO0FBdUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLElBQUk0QyxlQUFlO0FBQUc7QUFBZSxVQUFVQyxNQUFWLEVBQWtCO0VBQ25EMUgsS0FBSyxDQUFDMkgsU0FBTixDQUFnQkYsZUFBaEIsRUFBaUNDLE1BQWpDOztFQUNBLFNBQVNELGVBQVQsQ0FBeUJHLGdCQUF6QixFQUEyQ0MsYUFBM0MsRUFBMEQ7SUFDdEQsSUFBSXJILEtBQUssR0FBR2tILE1BQU0sQ0FBQ0ksSUFBUCxDQUFZLElBQVosS0FBcUIsSUFBakM7O0lBQ0F0SCxLQUFLLENBQUNtQyxZQUFOLEdBQXFCLFlBQVk7TUFDN0JuQyxLQUFLLENBQUN1SCxTQUFOLEdBQWtCdkgsS0FBSyxDQUFDb0gsZ0JBQU4sQ0FBdUJJLFlBQXZCLEVBQWxCO01BQ0F4SCxLQUFLLENBQUN5SCxVQUFOLEdBQW1CekgsS0FBSyxDQUFDb0gsZ0JBQU4sQ0FBdUJNLGFBQXZCLEVBQW5COztNQUNBMUgsS0FBSyxDQUFDMkgsa0JBQU47SUFDSCxDQUpEOztJQUtBM0gsS0FBSyxDQUFDb0gsZ0JBQU4sR0FBeUJBLGdCQUF6QjtJQUNBcEgsS0FBSyxDQUFDcUgsYUFBTixHQUFzQkEsYUFBdEI7SUFDQXJILEtBQUssQ0FBQ3VILFNBQU4sR0FBa0J2SCxLQUFLLENBQUM0SCxhQUFOLEdBQXNCUixnQkFBZ0IsQ0FBQ0ksWUFBakIsRUFBeEM7SUFDQXhILEtBQUssQ0FBQ3lILFVBQU4sR0FBbUJ6SCxLQUFLLENBQUM2SCxjQUFOLEdBQXVCVCxnQkFBZ0IsQ0FBQ00sYUFBakIsRUFBMUM7SUFDQTFILEtBQUssQ0FBQzhILFdBQU4sR0FBb0JWLGdCQUFnQixDQUFDVyxjQUFqQixFQUFwQjtJQUNBL0gsS0FBSyxDQUFDZ0ksWUFBTixHQUFxQlosZ0JBQWdCLENBQUNhLGVBQWpCLEVBQXJCO0lBQ0FqSSxLQUFLLENBQUNrSSxXQUFOLEdBQW9CZCxnQkFBZ0IsQ0FBQ2UsY0FBakIsRUFBcEI7SUFDQW5JLEtBQUssQ0FBQ29JLFlBQU4sR0FBcUJoQixnQkFBZ0IsQ0FBQ2lCLGVBQWpCLEVBQXJCO0lBQ0FySSxLQUFLLENBQUNzSSxVQUFOLEdBQW1CdEksS0FBSyxDQUFDdUksaUJBQU4sRUFBbkIsQ0Fmc0QsQ0FlUjs7SUFDOUMsSUFBSXZJLEtBQUssQ0FBQ3FILGFBQVYsRUFBeUI7TUFDckJySCxLQUFLLENBQUN3SSxjQUFOLEdBQXVCcEgsZ0JBQXZCLENBQXdDLFFBQXhDLEVBQWtEcEIsS0FBSyxDQUFDbUMsWUFBeEQ7SUFDSDs7SUFDRCxPQUFPbkMsS0FBUDtFQUNIOztFQUNEaUgsZUFBZSxDQUFDNUQsU0FBaEIsQ0FBMEJDLE9BQTFCLEdBQW9DLFlBQVk7SUFDNUMsSUFBSSxLQUFLK0QsYUFBVCxFQUF3QjtNQUNwQixLQUFLbUIsY0FBTCxHQUFzQmhILG1CQUF0QixDQUEwQyxRQUExQyxFQUFvRCxLQUFLVyxZQUF6RDtJQUNIO0VBQ0osQ0FKRDs7RUFLQThFLGVBQWUsQ0FBQzVELFNBQWhCLENBQTBCbUUsWUFBMUIsR0FBeUMsWUFBWTtJQUNqRCxPQUFPLEtBQUtELFNBQVo7RUFDSCxDQUZEOztFQUdBTixlQUFlLENBQUM1RCxTQUFoQixDQUEwQnFFLGFBQTFCLEdBQTBDLFlBQVk7SUFDbEQsT0FBTyxLQUFLRCxVQUFaO0VBQ0gsQ0FGRDs7RUFHQVIsZUFBZSxDQUFDNUQsU0FBaEIsQ0FBMEJvRixZQUExQixHQUF5QyxVQUFVeEMsR0FBVixFQUFlO0lBQ3BELEtBQUttQixnQkFBTCxDQUFzQnFCLFlBQXRCLENBQW1DeEMsR0FBbkM7O0lBQ0EsSUFBSSxDQUFDLEtBQUtvQixhQUFWLEVBQXlCO01BQ3JCO01BQ0E7TUFDQSxLQUFLRSxTQUFMLEdBQWlCbUIsSUFBSSxDQUFDQyxHQUFMLENBQVNELElBQUksQ0FBQ0UsR0FBTCxDQUFTM0MsR0FBVCxFQUFjLEtBQUs0QyxlQUFMLEVBQWQsQ0FBVCxFQUFnRCxDQUFoRCxDQUFqQjtNQUNBLEtBQUtsQixrQkFBTDtJQUNIO0VBQ0osQ0FSRDs7RUFTQVYsZUFBZSxDQUFDNUQsU0FBaEIsQ0FBMEJ5RixhQUExQixHQUEwQyxVQUFVN0MsR0FBVixFQUFlO0lBQ3JELEtBQUttQixnQkFBTCxDQUFzQjBCLGFBQXRCLENBQW9DN0MsR0FBcEM7O0lBQ0EsSUFBSSxDQUFDLEtBQUtvQixhQUFWLEVBQXlCO01BQ3JCO01BQ0E7TUFDQSxLQUFLSSxVQUFMLEdBQWtCaUIsSUFBSSxDQUFDQyxHQUFMLENBQVNELElBQUksQ0FBQ0UsR0FBTCxDQUFTM0MsR0FBVCxFQUFjLEtBQUs4QyxnQkFBTCxFQUFkLENBQVQsRUFBaUQsQ0FBakQsQ0FBbEI7TUFDQSxLQUFLcEIsa0JBQUw7SUFDSDtFQUNKLENBUkQ7O0VBU0FWLGVBQWUsQ0FBQzVELFNBQWhCLENBQTBCOEUsY0FBMUIsR0FBMkMsWUFBWTtJQUNuRCxPQUFPLEtBQUtELFdBQVo7RUFDSCxDQUZEOztFQUdBakIsZUFBZSxDQUFDNUQsU0FBaEIsQ0FBMEJnRixlQUExQixHQUE0QyxZQUFZO0lBQ3BELE9BQU8sS0FBS0QsWUFBWjtFQUNILENBRkQ7O0VBR0FuQixlQUFlLENBQUM1RCxTQUFoQixDQUEwQjBFLGNBQTFCLEdBQTJDLFlBQVk7SUFDbkQsT0FBTyxLQUFLRCxXQUFaO0VBQ0gsQ0FGRDs7RUFHQWIsZUFBZSxDQUFDNUQsU0FBaEIsQ0FBMEI0RSxlQUExQixHQUE0QyxZQUFZO0lBQ3BELE9BQU8sS0FBS0QsWUFBWjtFQUNILENBRkQ7O0VBR0FmLGVBQWUsQ0FBQzVELFNBQWhCLENBQTBCc0Usa0JBQTFCLEdBQStDLFlBQVksQ0FDMUQsQ0FERDs7RUFFQSxPQUFPVixlQUFQO0FBQ0gsQ0FuRW9DLENBbUVuQzNILE1BQU0sQ0FBQzBKLGdCQW5FNEIsQ0FBckM7O0FBcUVBLElBQUlDLHNCQUFzQjtBQUFHO0FBQWUsVUFBVS9CLE1BQVYsRUFBa0I7RUFDMUQxSCxLQUFLLENBQUMySCxTQUFOLENBQWdCOEIsc0JBQWhCLEVBQXdDL0IsTUFBeEM7O0VBQ0EsU0FBUytCLHNCQUFULENBQWdDQyxFQUFoQyxFQUFvQzdCLGFBQXBDLEVBQW1EO0lBQy9DLE9BQU9ILE1BQU0sQ0FBQ0ksSUFBUCxDQUFZLElBQVosRUFBa0IsSUFBSWhJLE1BQU0sQ0FBQzZKLHVCQUFYLENBQW1DRCxFQUFuQyxDQUFsQixFQUEwRDdCLGFBQTFELEtBQTRFLElBQW5GO0VBQ0g7O0VBQ0Q0QixzQkFBc0IsQ0FBQzVGLFNBQXZCLENBQWlDbUYsY0FBakMsR0FBa0QsWUFBWTtJQUMxRCxPQUFPLEtBQUtwQixnQkFBTCxDQUFzQjhCLEVBQTdCO0VBQ0gsQ0FGRDs7RUFHQUQsc0JBQXNCLENBQUM1RixTQUF2QixDQUFpQ2tGLGlCQUFqQyxHQUFxRCxZQUFZO0lBQzdELE9BQU9qSixNQUFNLENBQUM4SixnQkFBUCxDQUF3QixLQUFLaEMsZ0JBQUwsQ0FBc0I4QixFQUE5QyxDQUFQO0VBQ0gsQ0FGRDs7RUFHQSxPQUFPRCxzQkFBUDtBQUNILENBWjJDLENBWTFDaEMsZUFaMEMsQ0FBNUM7O0FBY0EsSUFBSW9DLHFCQUFxQjtBQUFHO0FBQWUsVUFBVW5DLE1BQVYsRUFBa0I7RUFDekQxSCxLQUFLLENBQUMySCxTQUFOLENBQWdCa0MscUJBQWhCLEVBQXVDbkMsTUFBdkM7O0VBQ0EsU0FBU21DLHFCQUFULENBQStCaEMsYUFBL0IsRUFBOEM7SUFDMUMsT0FBT0gsTUFBTSxDQUFDSSxJQUFQLENBQVksSUFBWixFQUFrQixJQUFJaEksTUFBTSxDQUFDZ0ssc0JBQVgsRUFBbEIsRUFBdURqQyxhQUF2RCxLQUF5RSxJQUFoRjtFQUNIOztFQUNEZ0MscUJBQXFCLENBQUNoRyxTQUF0QixDQUFnQ21GLGNBQWhDLEdBQWlELFlBQVk7SUFDekQsT0FBT3hHLE1BQVA7RUFDSCxDQUZEOztFQUdBcUgscUJBQXFCLENBQUNoRyxTQUF0QixDQUFnQ2tGLGlCQUFoQyxHQUFvRCxZQUFZO0lBQzVELE9BQU87TUFDSHZDLElBQUksRUFBRSxLQUFLeUIsVUFEUjtNQUVIYixLQUFLLEVBQUUsS0FBS2EsVUFBTCxHQUFrQixLQUFLUyxXQUYzQjtNQUdIakMsR0FBRyxFQUFFLEtBQUtzQixTQUhQO01BSUhULE1BQU0sRUFBRSxLQUFLUyxTQUFMLEdBQWlCLEtBQUthO0lBSjNCLENBQVA7RUFNSCxDQVBELENBUnlELENBZ0J6RDtFQUNBOzs7RUFDQWlCLHFCQUFxQixDQUFDaEcsU0FBdEIsQ0FBZ0NzRSxrQkFBaEMsR0FBcUQsWUFBWTtJQUM3RCxLQUFLVyxVQUFMLEdBQWtCLEtBQUtDLGlCQUFMLEVBQWxCO0VBQ0gsQ0FGRDs7RUFHQSxPQUFPYyxxQkFBUDtBQUNILENBdEIwQyxDQXNCekNwQyxlQXRCeUMsQ0FBM0MsQyxDQXdCQTtBQUNBO0FBQ0E7OztBQUNBLElBQUlzQyxPQUFPLEdBQUcsT0FBT0MsV0FBUCxLQUF1QixVQUF2QixHQUFvQ0EsV0FBVyxDQUFDQyxHQUFoRCxHQUFzREMsSUFBSSxDQUFDRCxHQUF6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxJQUFJRSxZQUFZO0FBQUc7QUFBZSxZQUFZO0VBQzFDLFNBQVNBLFlBQVQsR0FBd0I7SUFDcEIsSUFBSTNKLEtBQUssR0FBRyxJQUFaLENBRG9CLENBRXBCOzs7SUFDQSxLQUFLNEosU0FBTCxHQUFpQixJQUFqQjtJQUNBLEtBQUtDLFdBQUwsR0FBbUIsQ0FBQzdILE1BQUQsRUFBUyxjQUFULENBQW5CO0lBQ0EsS0FBSzhILGFBQUwsR0FBcUIsRUFBckIsQ0FMb0IsQ0FLSzs7SUFDekIsS0FBS0MsV0FBTCxHQUFtQixHQUFuQixDQU5vQixDQU1JO0lBQ3hCOztJQUNBLEtBQUtDLGNBQUwsR0FBc0IsSUFBdEI7SUFDQSxLQUFLQyxjQUFMLEdBQXNCLElBQXRCO0lBQ0EsS0FBS0MsV0FBTCxHQUFtQixLQUFuQjtJQUNBLEtBQUtDLFlBQUwsR0FBb0IsSUFBcEIsQ0FYb0IsQ0FZcEI7O0lBQ0EsS0FBS0MsV0FBTCxHQUFtQixLQUFuQjtJQUNBLEtBQUtDLGFBQUwsR0FBcUIsS0FBckI7SUFDQSxLQUFLQyxhQUFMLEdBQXFCLEtBQXJCO0lBQ0EsS0FBS0MsY0FBTCxHQUFzQixLQUF0Qjs7SUFDQSxLQUFLQyxPQUFMLEdBQWUsWUFBWTtNQUN2QixJQUFJeEssS0FBSyxDQUFDa0ssV0FBVixFQUF1QjtRQUFFO1FBQ3JCLElBQUlPLElBQUksR0FBR3pLLEtBQUssQ0FBQzBLLGVBQU4sQ0FBc0IxSyxLQUFLLENBQUNnSyxjQUFOLEdBQXVCaEksTUFBTSxDQUFDSyxXQUFwRCxFQUFpRXJDLEtBQUssQ0FBQ2lLLGNBQU4sR0FBdUJqSSxNQUFNLENBQUNTLFdBQS9GLENBQVg7O1FBQ0EsSUFBSWdJLElBQUosRUFBVTtVQUNOLElBQUloQixHQUFHLEdBQUdGLE9BQU8sRUFBakI7O1VBQ0F2SixLQUFLLENBQUMySyxVQUFOLENBQWlCRixJQUFqQixFQUF1QixDQUFDaEIsR0FBRyxHQUFHekosS0FBSyxDQUFDNEssY0FBYixJQUErQixJQUF0RDs7VUFDQTVLLEtBQUssQ0FBQzZLLGdCQUFOLENBQXVCcEIsR0FBdkI7UUFDSCxDQUpELE1BS0s7VUFDRHpKLEtBQUssQ0FBQ2tLLFdBQU4sR0FBb0IsS0FBcEIsQ0FEQyxDQUMwQjtRQUM5QjtNQUNKO0lBQ0osQ0FaRDtFQWFIOztFQUNEUCxZQUFZLENBQUN0RyxTQUFiLENBQXVCeUIsS0FBdkIsR0FBK0IsVUFBVTFDLEtBQVYsRUFBaUJJLEtBQWpCLEVBQXdCc0ksYUFBeEIsRUFBdUM7SUFDbEUsSUFBSSxLQUFLbEIsU0FBVCxFQUFvQjtNQUNoQixLQUFLTyxZQUFMLEdBQW9CLEtBQUtZLFdBQUwsQ0FBaUJELGFBQWpCLENBQXBCO01BQ0EsS0FBS2QsY0FBTCxHQUFzQixJQUF0QjtNQUNBLEtBQUtDLGNBQUwsR0FBc0IsSUFBdEI7TUFDQSxLQUFLRyxXQUFMLEdBQW1CLEtBQW5CO01BQ0EsS0FBS0MsYUFBTCxHQUFxQixLQUFyQjtNQUNBLEtBQUtDLGFBQUwsR0FBcUIsS0FBckI7TUFDQSxLQUFLQyxjQUFMLEdBQXNCLEtBQXRCO01BQ0EsS0FBS3BGLFVBQUwsQ0FBZ0IvQyxLQUFoQixFQUF1QkksS0FBdkI7SUFDSDtFQUNKLENBWEQ7O0VBWUFtSCxZQUFZLENBQUN0RyxTQUFiLENBQXVCOEIsVUFBdkIsR0FBb0MsVUFBVS9DLEtBQVYsRUFBaUJJLEtBQWpCLEVBQXdCO0lBQ3hELElBQUksS0FBS29ILFNBQVQsRUFBb0I7TUFDaEIsSUFBSUksY0FBYyxHQUFHNUgsS0FBSyxHQUFHSixNQUFNLENBQUNLLFdBQXBDO01BQ0EsSUFBSTRILGNBQWMsR0FBR3pILEtBQUssR0FBR1IsTUFBTSxDQUFDUyxXQUFwQztNQUNBLElBQUl1SSxNQUFNLEdBQUcsS0FBS2YsY0FBTCxLQUF3QixJQUF4QixHQUErQixDQUEvQixHQUFtQ0EsY0FBYyxHQUFHLEtBQUtBLGNBQXRFO01BQ0EsSUFBSWdCLE1BQU0sR0FBRyxLQUFLakIsY0FBTCxLQUF3QixJQUF4QixHQUErQixDQUEvQixHQUFtQ0EsY0FBYyxHQUFHLEtBQUtBLGNBQXRFOztNQUNBLElBQUlnQixNQUFNLEdBQUcsQ0FBYixFQUFnQjtRQUNaLEtBQUtaLFdBQUwsR0FBbUIsSUFBbkI7TUFDSCxDQUZELE1BR0ssSUFBSVksTUFBTSxHQUFHLENBQWIsRUFBZ0I7UUFDakIsS0FBS1gsYUFBTCxHQUFxQixJQUFyQjtNQUNIOztNQUNELElBQUlZLE1BQU0sR0FBRyxDQUFiLEVBQWdCO1FBQ1osS0FBS1gsYUFBTCxHQUFxQixJQUFyQjtNQUNILENBRkQsTUFHSyxJQUFJVyxNQUFNLEdBQUcsQ0FBYixFQUFnQjtRQUNqQixLQUFLVixjQUFMLEdBQXNCLElBQXRCO01BQ0g7O01BQ0QsS0FBS1AsY0FBTCxHQUFzQkEsY0FBdEI7TUFDQSxLQUFLQyxjQUFMLEdBQXNCQSxjQUF0Qjs7TUFDQSxJQUFJLENBQUMsS0FBS0MsV0FBVixFQUF1QjtRQUNuQixLQUFLQSxXQUFMLEdBQW1CLElBQW5CO1FBQ0EsS0FBS1csZ0JBQUwsQ0FBc0J0QixPQUFPLEVBQTdCO01BQ0g7SUFDSjtFQUNKLENBekJEOztFQTBCQUksWUFBWSxDQUFDdEcsU0FBYixDQUF1Qm1DLElBQXZCLEdBQThCLFlBQVk7SUFDdEMsSUFBSSxLQUFLb0UsU0FBVCxFQUFvQjtNQUNoQixLQUFLTSxXQUFMLEdBQW1CLEtBQW5CLENBRGdCLENBQ1U7O01BQzFCLEtBQUssSUFBSWdCLEVBQUUsR0FBRyxDQUFULEVBQVlDLEVBQUUsR0FBRyxLQUFLaEIsWUFBM0IsRUFBeUNlLEVBQUUsR0FBR0MsRUFBRSxDQUFDcEgsTUFBakQsRUFBeURtSCxFQUFFLEVBQTNELEVBQStEO1FBQzNELElBQUlFLFdBQVcsR0FBR0QsRUFBRSxDQUFDRCxFQUFELENBQXBCO1FBQ0FFLFdBQVcsQ0FBQzlILE9BQVo7TUFDSDs7TUFDRCxLQUFLNkcsWUFBTCxHQUFvQixJQUFwQjtJQUNIO0VBQ0osQ0FURDs7RUFVQVIsWUFBWSxDQUFDdEcsU0FBYixDQUF1QndILGdCQUF2QixHQUEwQyxVQUFVcEIsR0FBVixFQUFlO0lBQ3JELEtBQUttQixjQUFMLEdBQXNCbkIsR0FBdEI7SUFDQTRCLHFCQUFxQixDQUFDLEtBQUtiLE9BQU4sQ0FBckI7RUFDSCxDQUhEOztFQUlBYixZQUFZLENBQUN0RyxTQUFiLENBQXVCc0gsVUFBdkIsR0FBb0MsVUFBVUYsSUFBVixFQUFnQmEsT0FBaEIsRUFBeUI7SUFDekQsSUFBSUYsV0FBVyxHQUFHWCxJQUFJLENBQUNXLFdBQXZCO0lBQ0EsSUFBSXRCLGFBQWEsR0FBRyxLQUFLQSxhQUF6QjtJQUNBLElBQUl5QixXQUFXLEdBQUd6QixhQUFhLEdBQUdXLElBQUksQ0FBQ2UsUUFBdkM7SUFDQSxJQUFJQyxRQUFRLEdBQUc7SUFDWkYsV0FBVyxHQUFHQSxXQUFmLElBQStCekIsYUFBYSxHQUFHQSxhQUEvQyxDQUFELEdBQWtFO0lBQy9ELEtBQUtDLFdBRFIsR0FDc0J1QixPQUZ2QjtJQUdBLElBQUlJLElBQUksR0FBRyxDQUFYOztJQUNBLFFBQVFqQixJQUFJLENBQUNrQixJQUFiO01BQ0ksS0FBSyxNQUFMO1FBQ0lELElBQUksR0FBRyxDQUFDLENBQVI7TUFDSjs7TUFDQSxLQUFLLE9BQUw7UUFDSU4sV0FBVyxDQUFDdEMsYUFBWixDQUEwQnNDLFdBQVcsQ0FBQzFELGFBQVosS0FBOEIrRCxRQUFRLEdBQUdDLElBQW5FO1FBQ0E7O01BQ0osS0FBSyxLQUFMO1FBQ0lBLElBQUksR0FBRyxDQUFDLENBQVI7TUFDSjs7TUFDQSxLQUFLLFFBQUw7UUFDSU4sV0FBVyxDQUFDM0MsWUFBWixDQUF5QjJDLFdBQVcsQ0FBQzVELFlBQVosS0FBNkJpRSxRQUFRLEdBQUdDLElBQWpFO1FBQ0E7SUFaUjtFQWNILENBdEJELENBcEYwQyxDQTJHMUM7OztFQUNBL0IsWUFBWSxDQUFDdEcsU0FBYixDQUF1QnFILGVBQXZCLEdBQXlDLFVBQVUxRSxJQUFWLEVBQWdCQyxHQUFoQixFQUFxQjtJQUMxRCxJQUFJNkQsYUFBYSxHQUFHLEtBQUtBLGFBQXpCO0lBQ0EsSUFBSThCLFFBQVEsR0FBRyxJQUFmO0lBQ0EsSUFBSXpCLFlBQVksR0FBRyxLQUFLQSxZQUFMLElBQXFCLEVBQXhDOztJQUNBLEtBQUssSUFBSWUsRUFBRSxHQUFHLENBQVQsRUFBWVcsY0FBYyxHQUFHMUIsWUFBbEMsRUFBZ0RlLEVBQUUsR0FBR1csY0FBYyxDQUFDOUgsTUFBcEUsRUFBNEVtSCxFQUFFLEVBQTlFLEVBQWtGO01BQzlFLElBQUlFLFdBQVcsR0FBR1MsY0FBYyxDQUFDWCxFQUFELENBQWhDO01BQ0EsSUFBSVksSUFBSSxHQUFHVixXQUFXLENBQUM5QyxVQUF2QjtNQUNBLElBQUl5RCxRQUFRLEdBQUcvRixJQUFJLEdBQUc4RixJQUFJLENBQUM5RixJQUEzQjtNQUNBLElBQUlnRyxTQUFTLEdBQUdGLElBQUksQ0FBQ2xGLEtBQUwsR0FBYVosSUFBN0I7TUFDQSxJQUFJaUcsT0FBTyxHQUFHaEcsR0FBRyxHQUFHNkYsSUFBSSxDQUFDN0YsR0FBekI7TUFDQSxJQUFJaUcsVUFBVSxHQUFHSixJQUFJLENBQUNoRixNQUFMLEdBQWNiLEdBQS9CLENBTjhFLENBTzlFOztNQUNBLElBQUk4RixRQUFRLElBQUksQ0FBWixJQUFpQkMsU0FBUyxJQUFJLENBQTlCLElBQW1DQyxPQUFPLElBQUksQ0FBOUMsSUFBbURDLFVBQVUsSUFBSSxDQUFyRSxFQUF3RTtRQUNwRSxJQUFJRCxPQUFPLElBQUluQyxhQUFYLElBQTRCLEtBQUtNLFdBQWpDLElBQWdEZ0IsV0FBVyxDQUFDZSxXQUFaLEVBQWhELEtBQ0MsQ0FBQ1AsUUFBRCxJQUFhQSxRQUFRLENBQUNKLFFBQVQsR0FBb0JTLE9BRGxDLENBQUosRUFDZ0Q7VUFDNUNMLFFBQVEsR0FBRztZQUFFUixXQUFXLEVBQUVBLFdBQWY7WUFBNEJPLElBQUksRUFBRSxLQUFsQztZQUF5Q0gsUUFBUSxFQUFFUztVQUFuRCxDQUFYO1FBQ0g7O1FBQ0QsSUFBSUMsVUFBVSxJQUFJcEMsYUFBZCxJQUErQixLQUFLTyxhQUFwQyxJQUFxRGUsV0FBVyxDQUFDZ0IsYUFBWixFQUFyRCxLQUNDLENBQUNSLFFBQUQsSUFBYUEsUUFBUSxDQUFDSixRQUFULEdBQW9CVSxVQURsQyxDQUFKLEVBQ21EO1VBQy9DTixRQUFRLEdBQUc7WUFBRVIsV0FBVyxFQUFFQSxXQUFmO1lBQTRCTyxJQUFJLEVBQUUsUUFBbEM7WUFBNENILFFBQVEsRUFBRVU7VUFBdEQsQ0FBWDtRQUNIOztRQUNELElBQUlILFFBQVEsSUFBSWpDLGFBQVosSUFBNkIsS0FBS1EsYUFBbEMsSUFBbURjLFdBQVcsQ0FBQ2lCLGFBQVosRUFBbkQsS0FDQyxDQUFDVCxRQUFELElBQWFBLFFBQVEsQ0FBQ0osUUFBVCxHQUFvQk8sUUFEbEMsQ0FBSixFQUNpRDtVQUM3Q0gsUUFBUSxHQUFHO1lBQUVSLFdBQVcsRUFBRUEsV0FBZjtZQUE0Qk8sSUFBSSxFQUFFLE1BQWxDO1lBQTBDSCxRQUFRLEVBQUVPO1VBQXBELENBQVg7UUFDSDs7UUFDRCxJQUFJQyxTQUFTLElBQUlsQyxhQUFiLElBQThCLEtBQUtTLGNBQW5DLElBQXFEYSxXQUFXLENBQUNrQixjQUFaLEVBQXJELEtBQ0MsQ0FBQ1YsUUFBRCxJQUFhQSxRQUFRLENBQUNKLFFBQVQsR0FBb0JRLFNBRGxDLENBQUosRUFDa0Q7VUFDOUNKLFFBQVEsR0FBRztZQUFFUixXQUFXLEVBQUVBLFdBQWY7WUFBNEJPLElBQUksRUFBRSxPQUFsQztZQUEyQ0gsUUFBUSxFQUFFUTtVQUFyRCxDQUFYO1FBQ0g7TUFDSjtJQUNKOztJQUNELE9BQU9KLFFBQVA7RUFDSCxDQWhDRDs7RUFpQ0FqQyxZQUFZLENBQUN0RyxTQUFiLENBQXVCMEgsV0FBdkIsR0FBcUMsVUFBVUQsYUFBVixFQUF5QjtJQUMxRCxPQUFPLEtBQUt5QixjQUFMLENBQW9CekIsYUFBcEIsRUFBbUMwQixHQUFuQyxDQUF1QyxVQUFVdEQsRUFBVixFQUFjO01BQ3hELElBQUlBLEVBQUUsS0FBS2xILE1BQVgsRUFBbUI7UUFDZixPQUFPLElBQUlxSCxxQkFBSixDQUEwQixLQUExQixDQUFQLENBRGUsQ0FDMEI7TUFDNUM7O01BQ0QsT0FBTyxJQUFJSixzQkFBSixDQUEyQkMsRUFBM0IsRUFBK0IsS0FBL0IsQ0FBUCxDQUp3RCxDQUlWO0lBQ2pELENBTE0sQ0FBUDtFQU1ILENBUEQ7O0VBUUFTLFlBQVksQ0FBQ3RHLFNBQWIsQ0FBdUJrSixjQUF2QixHQUF3QyxVQUFVekIsYUFBVixFQUF5QjtJQUM3RCxJQUFJMkIsR0FBRyxHQUFHLEVBQVY7O0lBQ0EsS0FBSyxJQUFJdkIsRUFBRSxHQUFHLENBQVQsRUFBWUMsRUFBRSxHQUFHLEtBQUt0QixXQUEzQixFQUF3Q3FCLEVBQUUsR0FBR0MsRUFBRSxDQUFDcEgsTUFBaEQsRUFBd0RtSCxFQUFFLEVBQTFELEVBQThEO01BQzFELElBQUl3QixLQUFLLEdBQUd2QixFQUFFLENBQUNELEVBQUQsQ0FBZDs7TUFDQSxJQUFJLFFBQU93QixLQUFQLE1BQWlCLFFBQXJCLEVBQStCO1FBQzNCRCxHQUFHLENBQUNFLElBQUosQ0FBU0QsS0FBVDtNQUNILENBRkQsTUFHSztRQUNERCxHQUFHLENBQUNFLElBQUosQ0FBU0MsS0FBVCxDQUFlSCxHQUFmLEVBQW9CSSxLQUFLLENBQUN4SixTQUFOLENBQWdCeUosS0FBaEIsQ0FBc0J4RixJQUF0QixDQUEyQmhJLE1BQU0sQ0FBQ3lOLFNBQVAsQ0FBaUJqQyxhQUFqQixFQUFnQ2tDLGdCQUFoQyxDQUFpRE4sS0FBakQsQ0FBM0IsQ0FBcEI7TUFDSDtJQUNKOztJQUNELE9BQU9ELEdBQVA7RUFDSCxDQVpEOztFQWFBLE9BQU85QyxZQUFQO0FBQ0gsQ0FuS2lDLEVBQWxDO0FBcUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsSUFBSXNELHlCQUF5QjtBQUFHO0FBQWUsVUFBVS9GLE1BQVYsRUFBa0I7RUFDN0QxSCxLQUFLLENBQUMySCxTQUFOLENBQWdCOEYseUJBQWhCLEVBQTJDL0YsTUFBM0M7O0VBQ0EsU0FBUytGLHlCQUFULENBQW1DbE4sV0FBbkMsRUFBZ0RHLFFBQWhELEVBQTBEO0lBQ3RELElBQUlGLEtBQUssR0FBR2tILE1BQU0sQ0FBQ0ksSUFBUCxDQUFZLElBQVosRUFBa0J2SCxXQUFsQixLQUFrQyxJQUE5Qzs7SUFDQUMsS0FBSyxDQUFDRCxXQUFOLEdBQW9CQSxXQUFwQixDQUZzRCxDQUd0RDtJQUNBOztJQUNBQyxLQUFLLENBQUNrTixLQUFOLEdBQWMsSUFBZDtJQUNBbE4sS0FBSyxDQUFDbU4sV0FBTixHQUFvQixDQUFwQjtJQUNBbk4sS0FBSyxDQUFDb04sa0JBQU4sR0FBMkIsSUFBM0IsQ0FQc0QsQ0FPckI7O0lBQ2pDcE4sS0FBSyxDQUFDcU4saUJBQU4sR0FBMEIsS0FBMUI7SUFDQXJOLEtBQUssQ0FBQ3NOLGFBQU4sR0FBc0IsS0FBdEIsQ0FUc0QsQ0FTekI7O0lBQzdCdE4sS0FBSyxDQUFDTSxVQUFOLEdBQW1CLEtBQW5CLENBVnNELENBVTVCOztJQUMxQk4sS0FBSyxDQUFDdU4sWUFBTixHQUFxQixLQUFyQjtJQUNBdk4sS0FBSyxDQUFDd04sbUJBQU4sR0FBNEIsS0FBNUI7SUFDQXhOLEtBQUssQ0FBQ3lOLGNBQU4sR0FBdUIsSUFBdkI7O0lBQ0F6TixLQUFLLENBQUMwTixhQUFOLEdBQXNCLFVBQVVoTixFQUFWLEVBQWM7TUFDaEMsSUFBSSxDQUFDVixLQUFLLENBQUNNLFVBQVgsRUFBdUI7UUFBRTtRQUNyQk4sS0FBSyxDQUFDc04sYUFBTixHQUFzQixJQUF0QjtRQUNBdE4sS0FBSyxDQUFDdU4sWUFBTixHQUFxQixLQUFyQjtRQUNBdk4sS0FBSyxDQUFDd04sbUJBQU4sR0FBNEIsS0FBNUI7UUFDQWxPLE1BQU0sQ0FBQ3FPLGdCQUFQLENBQXdCeE0sUUFBUSxDQUFDd0QsSUFBakM7UUFDQXJGLE1BQU0sQ0FBQ3NPLGtCQUFQLENBQTBCek0sUUFBUSxDQUFDd0QsSUFBbkMsRUFMbUIsQ0FNbkI7UUFDQTtRQUNBOztRQUNBLElBQUksQ0FBQ2pFLEVBQUUsQ0FBQ21DLE9BQVIsRUFBaUI7VUFDYm5DLEVBQUUsQ0FBQ2tDLFNBQUgsQ0FBYXdCLGNBQWI7UUFDSDs7UUFDRHBFLEtBQUssQ0FBQ2dCLE9BQU4sQ0FBY0MsT0FBZCxDQUFzQixhQUF0QixFQUFxQ1AsRUFBckM7O1FBQ0EsSUFBSVYsS0FBSyxDQUFDc04sYUFBTixJQUF1QjtRQUN2QixDQUFDdE4sS0FBSyxDQUFDNk4sT0FBTixDQUFjek4sZ0JBRG5CLEVBQ3FDO1VBQ2pDO1VBQ0FKLEtBQUssQ0FBQzhOLE1BQU4sQ0FBYTFJLFlBQWIsQ0FBMEIsS0FBMUIsRUFGaUMsQ0FFQzs7O1VBQ2xDcEYsS0FBSyxDQUFDOE4sTUFBTixDQUFhaEosS0FBYixDQUFtQnBFLEVBQUUsQ0FBQ1QsU0FBdEIsRUFBaUNTLEVBQUUsQ0FBQzBCLEtBQXBDLEVBQTJDMUIsRUFBRSxDQUFDOEIsS0FBOUMsRUFIaUMsQ0FHcUI7OztVQUN0RHhDLEtBQUssQ0FBQytOLFVBQU4sQ0FBaUJyTixFQUFqQjs7VUFDQSxJQUFJLENBQUNWLEtBQUssQ0FBQ21OLFdBQVgsRUFBd0I7WUFDcEJuTixLQUFLLENBQUNnTyx1QkFBTixDQUE4QnROLEVBQTlCO1VBQ0g7UUFDSjtNQUNKO0lBQ0osQ0F6QkQ7O0lBMEJBVixLQUFLLENBQUNpTyxhQUFOLEdBQXNCLFVBQVV2TixFQUFWLEVBQWM7TUFDaEMsSUFBSVYsS0FBSyxDQUFDc04sYUFBVixFQUF5QjtRQUNyQnROLEtBQUssQ0FBQ2dCLE9BQU4sQ0FBY0MsT0FBZCxDQUFzQixhQUF0QixFQUFxQ1AsRUFBckM7O1FBQ0EsSUFBSSxDQUFDVixLQUFLLENBQUN3TixtQkFBWCxFQUFnQztVQUM1QixJQUFJTCxXQUFXLEdBQUduTixLQUFLLENBQUNtTixXQUF4QjtVQUNBLElBQUllLFVBQVUsR0FBRyxLQUFLLENBQXRCLENBRjRCLENBRUg7O1VBQ3pCLElBQUlwTCxNQUFNLEdBQUdwQyxFQUFFLENBQUNvQyxNQUFoQjtVQUFBLElBQXdCRSxNQUFNLEdBQUd0QyxFQUFFLENBQUNzQyxNQUFwQztVQUNBa0wsVUFBVSxHQUFHcEwsTUFBTSxHQUFHQSxNQUFULEdBQWtCRSxNQUFNLEdBQUdBLE1BQXhDOztVQUNBLElBQUlrTCxVQUFVLElBQUlmLFdBQVcsR0FBR0EsV0FBaEMsRUFBNkM7WUFBRTtZQUMzQ25OLEtBQUssQ0FBQ2dPLHVCQUFOLENBQThCdE4sRUFBOUI7VUFDSDtRQUNKOztRQUNELElBQUlWLEtBQUssQ0FBQ00sVUFBVixFQUFzQjtVQUNsQjtVQUNBLElBQUlJLEVBQUUsQ0FBQ2tDLFNBQUgsQ0FBYXVMLElBQWIsS0FBc0IsUUFBMUIsRUFBb0M7WUFDaENuTyxLQUFLLENBQUM4TixNQUFOLENBQWEzSSxVQUFiLENBQXdCekUsRUFBRSxDQUFDMEIsS0FBM0IsRUFBa0MxQixFQUFFLENBQUM4QixLQUFyQzs7WUFDQXhDLEtBQUssQ0FBQ29PLFlBQU4sQ0FBbUJqSixVQUFuQixDQUE4QnpFLEVBQUUsQ0FBQzBCLEtBQWpDLEVBQXdDMUIsRUFBRSxDQUFDOEIsS0FBM0M7VUFDSDs7VUFDRHhDLEtBQUssQ0FBQ2dCLE9BQU4sQ0FBY0MsT0FBZCxDQUFzQixVQUF0QixFQUFrQ1AsRUFBbEM7UUFDSDtNQUNKO0lBQ0osQ0FyQkQ7O0lBc0JBVixLQUFLLENBQUNxTyxXQUFOLEdBQW9CLFVBQVUzTixFQUFWLEVBQWM7TUFDOUIsSUFBSVYsS0FBSyxDQUFDc04sYUFBVixFQUF5QjtRQUNyQnROLEtBQUssQ0FBQ3NOLGFBQU4sR0FBc0IsS0FBdEI7UUFDQWhPLE1BQU0sQ0FBQ2dQLGNBQVAsQ0FBc0JuTixRQUFRLENBQUN3RCxJQUEvQjtRQUNBckYsTUFBTSxDQUFDaVAsZ0JBQVAsQ0FBd0JwTixRQUFRLENBQUN3RCxJQUFqQzs7UUFDQTNFLEtBQUssQ0FBQ2dCLE9BQU4sQ0FBY0MsT0FBZCxDQUFzQixXQUF0QixFQUFtQ1AsRUFBbkMsRUFKcUIsQ0FJbUI7OztRQUN4QyxJQUFJVixLQUFLLENBQUNNLFVBQVYsRUFBc0I7VUFDbEJOLEtBQUssQ0FBQ29PLFlBQU4sQ0FBbUI1SSxJQUFuQjs7VUFDQXhGLEtBQUssQ0FBQ3dPLFdBQU4sQ0FBa0I5TixFQUFsQixFQUZrQixDQUVLOztRQUMxQjs7UUFDRCxJQUFJVixLQUFLLENBQUN5TixjQUFWLEVBQTBCO1VBQ3RCZ0IsWUFBWSxDQUFDek8sS0FBSyxDQUFDeU4sY0FBUCxDQUFaO1VBQ0F6TixLQUFLLENBQUN5TixjQUFOLEdBQXVCLElBQXZCO1FBQ0g7TUFDSjtJQUNKLENBZkQ7O0lBZ0JBLElBQUlJLE9BQU8sR0FBRzdOLEtBQUssQ0FBQzZOLE9BQU4sR0FBZ0IsSUFBSS9OLGVBQUosQ0FBb0JDLFdBQXBCLENBQTlCO0lBQ0E4TixPQUFPLENBQUM3TSxPQUFSLENBQWdCME4sRUFBaEIsQ0FBbUIsYUFBbkIsRUFBa0MxTyxLQUFLLENBQUMwTixhQUF4QztJQUNBRyxPQUFPLENBQUM3TSxPQUFSLENBQWdCME4sRUFBaEIsQ0FBbUIsYUFBbkIsRUFBa0MxTyxLQUFLLENBQUNpTyxhQUF4QztJQUNBSixPQUFPLENBQUM3TSxPQUFSLENBQWdCME4sRUFBaEIsQ0FBbUIsV0FBbkIsRUFBZ0MxTyxLQUFLLENBQUNxTyxXQUF0Qzs7SUFDQSxJQUFJbk8sUUFBSixFQUFjO01BQ1YyTixPQUFPLENBQUMzTixRQUFSLEdBQW1CQSxRQUFuQjtJQUNIOztJQUNERixLQUFLLENBQUM4TixNQUFOLEdBQWUsSUFBSXpKLGFBQUosRUFBZjtJQUNBckUsS0FBSyxDQUFDb08sWUFBTixHQUFxQixJQUFJekUsWUFBSixFQUFyQjtJQUNBLE9BQU8zSixLQUFQO0VBQ0g7O0VBQ0RpTix5QkFBeUIsQ0FBQzVKLFNBQTFCLENBQW9DQyxPQUFwQyxHQUE4QyxZQUFZO0lBQ3RELEtBQUt1SyxPQUFMLENBQWF2SyxPQUFiLEdBRHNELENBRXREO0lBQ0E7O0lBQ0EsS0FBSytLLFdBQUwsQ0FBaUIsRUFBakI7RUFDSCxDQUxEOztFQU1BcEIseUJBQXlCLENBQUM1SixTQUExQixDQUFvQzBLLFVBQXBDLEdBQWlELFVBQVVyTixFQUFWLEVBQWM7SUFDM0QsSUFBSVYsS0FBSyxHQUFHLElBQVo7O0lBQ0EsSUFBSSxPQUFPLEtBQUtrTixLQUFaLEtBQXNCLFFBQTFCLEVBQW9DO01BQ2hDLEtBQUtPLGNBQUwsR0FBc0J2SixVQUFVLENBQUMsWUFBWTtRQUN6Q2xFLEtBQUssQ0FBQ3lOLGNBQU4sR0FBdUIsSUFBdkI7O1FBQ0F6TixLQUFLLENBQUMyTyxjQUFOLENBQXFCak8sRUFBckI7TUFDSCxDQUgrQixFQUc3QixLQUFLd00sS0FId0IsQ0FBaEMsQ0FEZ0MsQ0FJaEI7SUFDbkIsQ0FMRCxNQU1LO01BQ0QsS0FBS3lCLGNBQUwsQ0FBb0JqTyxFQUFwQjtJQUNIO0VBQ0osQ0FYRDs7RUFZQXVNLHlCQUF5QixDQUFDNUosU0FBMUIsQ0FBb0NzTCxjQUFwQyxHQUFxRCxVQUFVak8sRUFBVixFQUFjO0lBQy9ELEtBQUs2TSxZQUFMLEdBQW9CLElBQXBCO0lBQ0EsS0FBS3FCLFlBQUwsQ0FBa0JsTyxFQUFsQjtFQUNILENBSEQ7O0VBSUF1TSx5QkFBeUIsQ0FBQzVKLFNBQTFCLENBQW9DMkssdUJBQXBDLEdBQThELFVBQVV0TixFQUFWLEVBQWM7SUFDeEUsS0FBSzhNLG1CQUFMLEdBQTJCLElBQTNCO0lBQ0EsS0FBS29CLFlBQUwsQ0FBa0JsTyxFQUFsQjtFQUNILENBSEQ7O0VBSUF1TSx5QkFBeUIsQ0FBQzVKLFNBQTFCLENBQW9DdUwsWUFBcEMsR0FBbUQsVUFBVWxPLEVBQVYsRUFBYztJQUM3RCxJQUFJLEtBQUs2TSxZQUFMLElBQXFCLEtBQUtDLG1CQUE5QixFQUFtRDtNQUMvQyxJQUFJLENBQUMsS0FBS0ssT0FBTCxDQUFhck4sY0FBZCxJQUFnQyxLQUFLNE0sa0JBQXpDLEVBQTZEO1FBQ3pELEtBQUs5TSxVQUFMLEdBQWtCLElBQWxCO1FBQ0EsS0FBSytNLGlCQUFMLEdBQXlCLEtBQXpCO1FBQ0EsS0FBS2UsWUFBTCxDQUFrQnRKLEtBQWxCLENBQXdCcEUsRUFBRSxDQUFDMEIsS0FBM0IsRUFBa0MxQixFQUFFLENBQUM4QixLQUFyQyxFQUE0QyxLQUFLekMsV0FBakQ7UUFDQSxLQUFLaUIsT0FBTCxDQUFhQyxPQUFiLENBQXFCLFdBQXJCLEVBQWtDUCxFQUFsQzs7UUFDQSxJQUFJLEtBQUswTSxrQkFBTCxLQUE0QixLQUFoQyxFQUF1QztVQUNuQyxLQUFLUyxPQUFMLENBQWFqSyxpQkFBYjtRQUNIO01BQ0o7SUFDSjtFQUNKLENBWkQ7O0VBYUFxSix5QkFBeUIsQ0FBQzVKLFNBQTFCLENBQW9DbUwsV0FBcEMsR0FBa0QsVUFBVTlOLEVBQVYsRUFBYztJQUM1RDtJQUNBO0lBQ0EsS0FBS29OLE1BQUwsQ0FBWXRJLElBQVosQ0FBaUIsS0FBSzZILGlCQUF0QixFQUF5QyxLQUFLd0IsUUFBTCxDQUFjQyxJQUFkLENBQW1CLElBQW5CLEVBQXlCcE8sRUFBekIsQ0FBekM7RUFDSCxDQUpEOztFQUtBdU0seUJBQXlCLENBQUM1SixTQUExQixDQUFvQ3dMLFFBQXBDLEdBQStDLFVBQVVuTyxFQUFWLEVBQWM7SUFDekQsS0FBS0osVUFBTCxHQUFrQixLQUFsQjtJQUNBLEtBQUtVLE9BQUwsQ0FBYUMsT0FBYixDQUFxQixTQUFyQixFQUFnQ1AsRUFBaEM7RUFDSCxDQUhELENBdkk2RCxDQTJJN0Q7OztFQUNBdU0seUJBQXlCLENBQUM1SixTQUExQixDQUFvQzBMLGFBQXBDLEdBQW9ELFVBQVUxSixJQUFWLEVBQWdCO0lBQ2hFLEtBQUt3SSxPQUFMLENBQWF6TixnQkFBYixHQUFnQ2lGLElBQWhDO0VBQ0gsQ0FGRDs7RUFHQTRILHlCQUF5QixDQUFDNUosU0FBMUIsQ0FBb0MyTCxrQkFBcEMsR0FBeUQsVUFBVTNKLElBQVYsRUFBZ0I7SUFDckUsS0FBS3lJLE1BQUwsQ0FBWTFJLFlBQVosQ0FBeUJDLElBQXpCO0VBQ0gsQ0FGRDs7RUFHQTRILHlCQUF5QixDQUFDNUosU0FBMUIsQ0FBb0M0TCxvQkFBcEMsR0FBMkQsVUFBVTVKLElBQVYsRUFBZ0I7SUFDdkUsS0FBS2dJLGlCQUFMLEdBQXlCaEksSUFBekI7RUFDSCxDQUZEOztFQUdBNEgseUJBQXlCLENBQUM1SixTQUExQixDQUFvQzZMLG9CQUFwQyxHQUEyRCxVQUFVN0osSUFBVixFQUFnQjtJQUN2RSxLQUFLK0ksWUFBTCxDQUFrQnhFLFNBQWxCLEdBQThCdkUsSUFBOUI7RUFDSCxDQUZEOztFQUdBLE9BQU80SCx5QkFBUDtBQUNILENBeko4QyxDQXlKN0MzTixNQUFNLENBQUM2UCxlQXpKc0MsQ0FBL0M7QUEySkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsSUFBSUMsYUFBYTtBQUFHO0FBQWUsWUFBWTtFQUMzQyxTQUFTQSxhQUFULENBQXVCbEcsRUFBdkIsRUFBMkI7SUFDdkIsS0FBS21HLFFBQUwsR0FBZ0IvUCxNQUFNLENBQUNnUSxXQUFQLENBQW1CcEcsRUFBbkIsQ0FBaEIsQ0FEdUIsQ0FFdkI7O0lBQ0EsS0FBS2lCLFlBQUwsR0FBb0I3SyxNQUFNLENBQUNpUSxrQkFBUCxDQUEwQnJHLEVBQTFCLEVBQThCc0QsR0FBOUIsQ0FBa0MsVUFBVWdELFFBQVYsRUFBb0I7TUFBRSxPQUFPLElBQUl2RyxzQkFBSixDQUEyQnVHLFFBQTNCLEVBQXFDLElBQXJDLENBQVA7SUFBb0QsQ0FBNUcsQ0FBcEI7RUFDSDs7RUFDREosYUFBYSxDQUFDL0wsU0FBZCxDQUF3QkMsT0FBeEIsR0FBa0MsWUFBWTtJQUMxQyxLQUFLLElBQUk0SCxFQUFFLEdBQUcsQ0FBVCxFQUFZQyxFQUFFLEdBQUcsS0FBS2hCLFlBQTNCLEVBQXlDZSxFQUFFLEdBQUdDLEVBQUUsQ0FBQ3BILE1BQWpELEVBQXlEbUgsRUFBRSxFQUEzRCxFQUErRDtNQUMzRCxJQUFJRSxXQUFXLEdBQUdELEVBQUUsQ0FBQ0QsRUFBRCxDQUFwQjtNQUNBRSxXQUFXLENBQUM5SCxPQUFaO0lBQ0g7RUFDSixDQUxEOztFQU1BOEwsYUFBYSxDQUFDL0wsU0FBZCxDQUF3Qm9NLFdBQXhCLEdBQXNDLFlBQVk7SUFDOUMsSUFBSXpKLElBQUksR0FBRyxLQUFLcUosUUFBTCxDQUFjckosSUFBekI7O0lBQ0EsS0FBSyxJQUFJa0YsRUFBRSxHQUFHLENBQVQsRUFBWUMsRUFBRSxHQUFHLEtBQUtoQixZQUEzQixFQUF5Q2UsRUFBRSxHQUFHQyxFQUFFLENBQUNwSCxNQUFqRCxFQUF5RG1ILEVBQUUsRUFBM0QsRUFBK0Q7TUFDM0QsSUFBSUUsV0FBVyxHQUFHRCxFQUFFLENBQUNELEVBQUQsQ0FBcEI7TUFDQWxGLElBQUksSUFBSW9GLFdBQVcsQ0FBQ3ZELGNBQVosR0FBNkJ1RCxXQUFXLENBQUMxRCxhQUFaLEVBQXJDO0lBQ0g7O0lBQ0QsT0FBTzFCLElBQVA7RUFDSCxDQVBEOztFQVFBb0osYUFBYSxDQUFDL0wsU0FBZCxDQUF3QnFNLFVBQXhCLEdBQXFDLFlBQVk7SUFDN0MsSUFBSXpKLEdBQUcsR0FBRyxLQUFLb0osUUFBTCxDQUFjcEosR0FBeEI7O0lBQ0EsS0FBSyxJQUFJaUYsRUFBRSxHQUFHLENBQVQsRUFBWUMsRUFBRSxHQUFHLEtBQUtoQixZQUEzQixFQUF5Q2UsRUFBRSxHQUFHQyxFQUFFLENBQUNwSCxNQUFqRCxFQUF5RG1ILEVBQUUsRUFBM0QsRUFBK0Q7TUFDM0QsSUFBSUUsV0FBVyxHQUFHRCxFQUFFLENBQUNELEVBQUQsQ0FBcEI7TUFDQWpGLEdBQUcsSUFBSW1GLFdBQVcsQ0FBQ3hELGFBQVosR0FBNEJ3RCxXQUFXLENBQUM1RCxZQUFaLEVBQW5DO0lBQ0g7O0lBQ0QsT0FBT3ZCLEdBQVA7RUFDSCxDQVBEOztFQVFBbUosYUFBYSxDQUFDL0wsU0FBZCxDQUF3QnNNLGdCQUF4QixHQUEyQyxVQUFVdk4sS0FBVixFQUFpQkksS0FBakIsRUFBd0I7SUFDL0QsSUFBSW9OLEtBQUssR0FBRztNQUFFNUosSUFBSSxFQUFFNUQsS0FBUjtNQUFlNkQsR0FBRyxFQUFFekQ7SUFBcEIsQ0FBWjs7SUFDQSxLQUFLLElBQUkwSSxFQUFFLEdBQUcsQ0FBVCxFQUFZQyxFQUFFLEdBQUcsS0FBS2hCLFlBQTNCLEVBQXlDZSxFQUFFLEdBQUdDLEVBQUUsQ0FBQ3BILE1BQWpELEVBQXlEbUgsRUFBRSxFQUEzRCxFQUErRDtNQUMzRCxJQUFJRSxXQUFXLEdBQUdELEVBQUUsQ0FBQ0QsRUFBRCxDQUFwQjs7TUFDQSxJQUFJLENBQUMyRSxpQkFBaUIsQ0FBQ3pFLFdBQVcsQ0FBQzVDLGNBQVosRUFBRCxDQUFsQixJQUNBLENBQUNsSixNQUFNLENBQUN3USxlQUFQLENBQXVCRixLQUF2QixFQUE4QnhFLFdBQVcsQ0FBQzlDLFVBQTFDLENBREwsRUFDNEQ7UUFDeEQsT0FBTyxLQUFQO01BQ0g7SUFDSjs7SUFDRCxPQUFPLElBQVA7RUFDSCxDQVZEOztFQVdBLE9BQU84RyxhQUFQO0FBQ0gsQ0F4Q2tDLEVBQW5DLEMsQ0F5Q0E7QUFDQTs7O0FBQ0EsU0FBU1MsaUJBQVQsQ0FBMkJFLElBQTNCLEVBQWlDO0VBQzdCLElBQUlDLE9BQU8sR0FBR0QsSUFBSSxDQUFDQyxPQUFuQjtFQUNBLE9BQU9BLE9BQU8sS0FBSyxNQUFaLElBQXNCQSxPQUFPLEtBQUssTUFBekM7QUFDSDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxJQUFJQyxXQUFXO0FBQUc7QUFBZSxZQUFZO0VBQ3pDLFNBQVNBLFdBQVQsQ0FBcUJDLFFBQXJCLEVBQStCQyxjQUEvQixFQUErQztJQUMzQyxJQUFJblEsS0FBSyxHQUFHLElBQVosQ0FEMkMsQ0FFM0M7OztJQUNBLEtBQUtvUSxnQkFBTCxHQUF3QixLQUF4QjtJQUNBLEtBQUtDLGNBQUwsR0FBc0IsSUFBdEIsQ0FKMkMsQ0FJZjs7SUFDNUIsS0FBS0MsVUFBTCxHQUFrQixJQUFsQjtJQUNBLEtBQUtDLFNBQUwsR0FBaUIsSUFBakI7SUFDQSxLQUFLQyxRQUFMLEdBQWdCLElBQWhCLENBUDJDLENBT3JCOztJQUN0QixLQUFLQyxpQkFBTCxHQUF5QixVQUFVL1AsRUFBVixFQUFjO01BQ25DLElBQUl3UCxRQUFRLEdBQUdsUSxLQUFLLENBQUNrUSxRQUFyQjtNQUNBbFEsS0FBSyxDQUFDc1EsVUFBTixHQUFtQixJQUFuQjtNQUNBdFEsS0FBSyxDQUFDdVEsU0FBTixHQUFrQixJQUFsQjtNQUNBdlEsS0FBSyxDQUFDd1EsUUFBTixHQUFpQixJQUFqQjs7TUFDQXhRLEtBQUssQ0FBQzBRLFdBQU47O01BQ0ExUSxLQUFLLENBQUMyUSxpQkFBTixDQUF3QmpRLEVBQXhCOztNQUNBLElBQUlWLEtBQUssQ0FBQ3NRLFVBQU4sSUFBb0IsQ0FBQ3RRLEtBQUssQ0FBQ3FRLGNBQS9CLEVBQStDO1FBQzNDSCxRQUFRLENBQUNuQixhQUFULENBQXVCLEtBQXZCLEVBRDJDLENBRTNDOztRQUNBL08sS0FBSyxDQUFDZ0IsT0FBTixDQUFjQyxPQUFkLENBQXNCLGFBQXRCLEVBQXFDUCxFQUFyQztNQUNILENBSkQsTUFLSztRQUNEd1AsUUFBUSxDQUFDbkIsYUFBVCxDQUF1QixJQUF2QjtNQUNIO0lBQ0osQ0FmRDs7SUFnQkEsS0FBSzZCLGVBQUwsR0FBdUIsVUFBVWxRLEVBQVYsRUFBYztNQUNqQ1YsS0FBSyxDQUFDZ0IsT0FBTixDQUFjQyxPQUFkLENBQXNCLFdBQXRCLEVBQW1DUCxFQUFuQzs7TUFDQVYsS0FBSyxDQUFDbUYsVUFBTixDQUFpQnpFLEVBQWpCLEVBQXFCLElBQXJCLEVBRmlDLENBRUw7O0lBQy9CLENBSEQ7O0lBSUEsS0FBS21RLGNBQUwsR0FBc0IsVUFBVW5RLEVBQVYsRUFBYztNQUNoQ1YsS0FBSyxDQUFDZ0IsT0FBTixDQUFjQyxPQUFkLENBQXNCLFVBQXRCLEVBQWtDUCxFQUFsQzs7TUFDQVYsS0FBSyxDQUFDbUYsVUFBTixDQUFpQnpFLEVBQWpCO0lBQ0gsQ0FIRDs7SUFJQSxLQUFLb1EsZUFBTCxHQUF1QixVQUFVcFEsRUFBVixFQUFjO01BQ2pDVixLQUFLLENBQUMrUSxXQUFOOztNQUNBL1EsS0FBSyxDQUFDZ0IsT0FBTixDQUFjQyxPQUFkLENBQXNCLFdBQXRCLEVBQW1DUCxFQUFuQztJQUNILENBSEQ7O0lBSUEsS0FBS3NRLGFBQUwsR0FBcUIsVUFBVXRRLEVBQVYsRUFBYztNQUMvQixJQUFJVixLQUFLLENBQUN1USxTQUFWLEVBQXFCO1FBQ2pCdlEsS0FBSyxDQUFDZ0IsT0FBTixDQUFjQyxPQUFkLENBQXNCLFdBQXRCLEVBQW1DLElBQW5DLEVBQXlDLElBQXpDLEVBQStDUCxFQUEvQztNQUNIOztNQUNEVixLQUFLLENBQUN3USxRQUFOLEdBQWlCeFEsS0FBSyxDQUFDdVEsU0FBdkI7TUFDQXZRLEtBQUssQ0FBQ3VRLFNBQU4sR0FBa0IsSUFBbEI7O01BQ0F2USxLQUFLLENBQUNnQixPQUFOLENBQWNDLE9BQWQsQ0FBc0IsU0FBdEIsRUFBaUNQLEVBQWpDO0lBQ0gsQ0FQRDs7SUFRQSxLQUFLeVAsY0FBTCxHQUFzQkEsY0FBdEI7SUFDQUQsUUFBUSxDQUFDbFAsT0FBVCxDQUFpQjBOLEVBQWpCLENBQW9CLGFBQXBCLEVBQW1DLEtBQUsrQixpQkFBeEM7SUFDQVAsUUFBUSxDQUFDbFAsT0FBVCxDQUFpQjBOLEVBQWpCLENBQW9CLFdBQXBCLEVBQWlDLEtBQUtrQyxlQUF0QztJQUNBVixRQUFRLENBQUNsUCxPQUFULENBQWlCME4sRUFBakIsQ0FBb0IsVUFBcEIsRUFBZ0MsS0FBS21DLGNBQXJDO0lBQ0FYLFFBQVEsQ0FBQ2xQLE9BQVQsQ0FBaUIwTixFQUFqQixDQUFvQixXQUFwQixFQUFpQyxLQUFLb0MsZUFBdEM7SUFDQVosUUFBUSxDQUFDbFAsT0FBVCxDQUFpQjBOLEVBQWpCLENBQW9CLFNBQXBCLEVBQStCLEtBQUtzQyxhQUFwQztJQUNBLEtBQUtkLFFBQUwsR0FBZ0JBLFFBQWhCO0lBQ0EsS0FBS2xQLE9BQUwsR0FBZSxJQUFJMUIsTUFBTSxDQUFDNEQsT0FBWCxFQUFmO0VBQ0gsQ0FyRHdDLENBc0R6QztFQUNBOzs7RUFDQStNLFdBQVcsQ0FBQzVNLFNBQVosQ0FBc0JzTixpQkFBdEIsR0FBMEMsVUFBVWpRLEVBQVYsRUFBYztJQUNwRCxJQUFJdVEsU0FBUyxHQUFHO01BQUVqTCxJQUFJLEVBQUV0RixFQUFFLENBQUMwQixLQUFYO01BQWtCNkQsR0FBRyxFQUFFdkYsRUFBRSxDQUFDOEI7SUFBMUIsQ0FBaEI7SUFDQSxJQUFJME8sYUFBYSxHQUFHRCxTQUFwQjtJQUNBLElBQUloUixTQUFTLEdBQUdTLEVBQUUsQ0FBQ1QsU0FBbkI7SUFDQSxJQUFJa1IsV0FBSjs7SUFDQSxJQUFJbFIsU0FBUyxZQUFZbVIsV0FBekIsRUFBc0M7TUFBRTtNQUNwQ0QsV0FBVyxHQUFHN1IsTUFBTSxDQUFDZ1EsV0FBUCxDQUFtQnJQLFNBQW5CLENBQWQ7TUFDQWlSLGFBQWEsR0FBRzVSLE1BQU0sQ0FBQytSLGNBQVAsQ0FBc0JILGFBQXRCLEVBQXFDQyxXQUFyQyxDQUFoQjtJQUNIOztJQUNELElBQUliLFVBQVUsR0FBRyxLQUFLQSxVQUFMLEdBQWtCLEtBQUtnQixpQkFBTCxDQUF1QkosYUFBYSxDQUFDbEwsSUFBckMsRUFBMkNrTCxhQUFhLENBQUNqTCxHQUF6RCxDQUFuQzs7SUFDQSxJQUFJcUssVUFBSixFQUFnQjtNQUNaLElBQUksS0FBS0YsZ0JBQUwsSUFBeUJlLFdBQTdCLEVBQTBDO1FBQ3RDLElBQUlJLGlCQUFpQixHQUFHalMsTUFBTSxDQUFDa1MsY0FBUCxDQUFzQkwsV0FBdEIsRUFBbUNiLFVBQVUsQ0FBQ3hFLElBQTlDLENBQXhCOztRQUNBLElBQUl5RixpQkFBSixFQUF1QjtVQUNuQkwsYUFBYSxHQUFHNVIsTUFBTSxDQUFDbVMsYUFBUCxDQUFxQkYsaUJBQXJCLENBQWhCO1FBQ0g7TUFDSjs7TUFDRCxLQUFLRyxXQUFMLEdBQW1CcFMsTUFBTSxDQUFDcVMsVUFBUCxDQUFrQlQsYUFBbEIsRUFBaUNELFNBQWpDLENBQW5CO0lBQ0gsQ0FSRCxNQVNLO01BQ0QsS0FBS1MsV0FBTCxHQUFtQjtRQUFFMUwsSUFBSSxFQUFFLENBQVI7UUFBV0MsR0FBRyxFQUFFO01BQWhCLENBQW5CO0lBQ0g7RUFDSixDQXRCRDs7RUF1QkFnSyxXQUFXLENBQUM1TSxTQUFaLENBQXNCOEIsVUFBdEIsR0FBbUMsVUFBVXpFLEVBQVYsRUFBY2tSLFdBQWQsRUFBMkI7SUFDMUQsSUFBSUMsR0FBRyxHQUFHLEtBQUtQLGlCQUFMLENBQXVCNVEsRUFBRSxDQUFDMEIsS0FBSCxHQUFXLEtBQUtzUCxXQUFMLENBQWlCMUwsSUFBbkQsRUFBeUR0RixFQUFFLENBQUM4QixLQUFILEdBQVcsS0FBS2tQLFdBQUwsQ0FBaUJ6TCxHQUFyRixDQUFWOztJQUNBLElBQUkyTCxXQUFXLElBQUksQ0FBQ0UsV0FBVyxDQUFDLEtBQUt2QixTQUFOLEVBQWlCc0IsR0FBakIsQ0FBL0IsRUFBc0Q7TUFDbEQsS0FBS3RCLFNBQUwsR0FBaUJzQixHQUFqQjtNQUNBLEtBQUs3USxPQUFMLENBQWFDLE9BQWIsQ0FBcUIsV0FBckIsRUFBa0M0USxHQUFsQyxFQUF1QyxLQUF2QyxFQUE4Q25SLEVBQTlDO0lBQ0g7RUFDSixDQU5EOztFQU9BdVAsV0FBVyxDQUFDNU0sU0FBWixDQUFzQnFOLFdBQXRCLEdBQW9DLFlBQVk7SUFDNUMsS0FBS3FCLGNBQUwsR0FBc0J6UyxNQUFNLENBQUMwUyxPQUFQLENBQWUsS0FBSzdCLGNBQXBCLEVBQW9DLFVBQVU4QixtQkFBVixFQUErQjtNQUNyRkEsbUJBQW1CLENBQUNDLFNBQXBCLENBQThCeEIsV0FBOUI7TUFDQSxPQUFPLElBQUl0QixhQUFKLENBQWtCNkMsbUJBQW1CLENBQUMvSSxFQUF0QyxDQUFQO0lBQ0gsQ0FIcUIsQ0FBdEI7RUFJSCxDQUxEOztFQU1BK0csV0FBVyxDQUFDNU0sU0FBWixDQUFzQjBOLFdBQXRCLEdBQW9DLFlBQVk7SUFDNUMsSUFBSWdCLGNBQWMsR0FBRyxLQUFLQSxjQUExQjs7SUFDQSxLQUFLLElBQUlJLEVBQVQsSUFBZUosY0FBZixFQUErQjtNQUMzQkEsY0FBYyxDQUFDSSxFQUFELENBQWQsQ0FBbUI3TyxPQUFuQjtJQUNIOztJQUNELEtBQUt5TyxjQUFMLEdBQXNCLEVBQXRCO0VBQ0gsQ0FORDs7RUFPQTlCLFdBQVcsQ0FBQzVNLFNBQVosQ0FBc0JpTyxpQkFBdEIsR0FBMEMsVUFBVWMsVUFBVixFQUFzQkMsU0FBdEIsRUFBaUM7SUFDdkUsSUFBSWxILEVBQUUsR0FBRyxJQUFUO0lBQUEsSUFBZWdGLGNBQWMsR0FBR2hGLEVBQUUsQ0FBQ2dGLGNBQW5DO0lBQUEsSUFBbUQ0QixjQUFjLEdBQUc1RyxFQUFFLENBQUM0RyxjQUF2RTs7SUFDQSxJQUFJTyxPQUFPLEdBQUcsSUFBZDs7SUFDQSxLQUFLLElBQUlILEVBQVQsSUFBZWhDLGNBQWYsRUFBK0I7TUFDM0IsSUFBSStCLFNBQVMsR0FBRy9CLGNBQWMsQ0FBQ2dDLEVBQUQsQ0FBZCxDQUFtQkQsU0FBbkM7TUFDQSxJQUFJSyxhQUFhLEdBQUdSLGNBQWMsQ0FBQ0ksRUFBRCxDQUFsQzs7TUFDQSxJQUFJSSxhQUFhLElBQUk7TUFDakJBLGFBQWEsQ0FBQzVDLGdCQUFkLENBQStCeUMsVUFBL0IsRUFBMkNDLFNBQTNDLENBREosRUFDMkQ7UUFDdkQsSUFBSUcsVUFBVSxHQUFHRCxhQUFhLENBQUM5QyxXQUFkLEVBQWpCO1FBQ0EsSUFBSWdELFNBQVMsR0FBR0YsYUFBYSxDQUFDN0MsVUFBZCxFQUFoQjtRQUNBLElBQUlnRCxZQUFZLEdBQUdOLFVBQVUsR0FBR0ksVUFBaEM7UUFDQSxJQUFJRyxXQUFXLEdBQUdOLFNBQVMsR0FBR0ksU0FBOUI7UUFDQSxJQUFJcEQsUUFBUSxHQUFHa0QsYUFBYSxDQUFDbEQsUUFBN0I7UUFDQSxJQUFJMUksS0FBSyxHQUFHMEksUUFBUSxDQUFDekksS0FBVCxHQUFpQnlJLFFBQVEsQ0FBQ3JKLElBQXRDO1FBQ0EsSUFBSWEsTUFBTSxHQUFHd0ksUUFBUSxDQUFDdkksTUFBVCxHQUFrQnVJLFFBQVEsQ0FBQ3BKLEdBQXhDOztRQUNBLEtBQ0E7UUFDQXlNLFlBQVksSUFBSSxDQUFoQixJQUFxQkEsWUFBWSxHQUFHL0wsS0FBcEMsSUFDSWdNLFdBQVcsSUFBSSxDQURuQixJQUN3QkEsV0FBVyxHQUFHOUwsTUFIdEMsRUFHOEM7VUFDMUMsSUFBSWdMLEdBQUcsR0FBR0ssU0FBUyxDQUFDVSxRQUFWLENBQW1CRixZQUFuQixFQUFpQ0MsV0FBakMsRUFBOENoTSxLQUE5QyxFQUFxREUsTUFBckQsQ0FBVjs7VUFDQSxJQUFJZ0wsR0FBRyxJQUNQO1VBQ0F2UyxNQUFNLENBQUN1VCxrQkFBUCxDQUEwQmhCLEdBQUcsQ0FBQ2lCLFdBQUosQ0FBZ0JDLFdBQTFDLEVBQXVEbEIsR0FBRyxDQUFDbUIsUUFBSixDQUFhQyxLQUFwRSxDQUZJLEtBR0MsQ0FBQ1gsT0FBRCxJQUFZVCxHQUFHLENBQUNxQixLQUFKLEdBQVlaLE9BQU8sQ0FBQ1ksS0FIakMsQ0FBSixFQUc2QztZQUN6Q3JCLEdBQUcsQ0FBQ3NCLFdBQUosR0FBa0JoQixFQUFsQjtZQUNBTixHQUFHLENBQUN1QixPQUFKLEdBQWNsQixTQUFTLENBQUNrQixPQUF4QixDQUZ5QyxDQUd6Qzs7WUFDQXZCLEdBQUcsQ0FBQy9GLElBQUosQ0FBUzlGLElBQVQsSUFBaUJ3TSxVQUFqQjtZQUNBWCxHQUFHLENBQUMvRixJQUFKLENBQVNsRixLQUFULElBQWtCNEwsVUFBbEI7WUFDQVgsR0FBRyxDQUFDL0YsSUFBSixDQUFTN0YsR0FBVCxJQUFnQndNLFNBQWhCO1lBQ0FaLEdBQUcsQ0FBQy9GLElBQUosQ0FBU2hGLE1BQVQsSUFBbUIyTCxTQUFuQjtZQUNBSCxPQUFPLEdBQUdULEdBQVY7VUFDSDtRQUNKO01BQ0o7SUFDSjs7SUFDRCxPQUFPUyxPQUFQO0VBQ0gsQ0FyQ0Q7O0VBc0NBLE9BQU9yQyxXQUFQO0FBQ0gsQ0ExSWdDLEVBQWpDOztBQTJJQSxTQUFTNkIsV0FBVCxDQUFxQnVCLElBQXJCLEVBQTJCQyxJQUEzQixFQUFpQztFQUM3QixJQUFJLENBQUNELElBQUQsSUFBUyxDQUFDQyxJQUFkLEVBQW9CO0lBQ2hCLE9BQU8sSUFBUDtFQUNIOztFQUNELElBQUlDLE9BQU8sQ0FBQ0YsSUFBRCxDQUFQLEtBQWtCRSxPQUFPLENBQUNELElBQUQsQ0FBN0IsRUFBcUM7SUFDakMsT0FBTyxLQUFQO0VBQ0g7O0VBQ0QsT0FBT2hVLE1BQU0sQ0FBQ2tVLGdCQUFQLENBQXdCSCxJQUFJLENBQUNMLFFBQTdCLEVBQXVDTSxJQUFJLENBQUNOLFFBQTVDLENBQVA7QUFDSDs7QUFFRCxTQUFTUyw0QkFBVCxDQUFzQ1QsUUFBdEMsRUFBZ0RJLE9BQWhELEVBQXlEO0VBQ3JELElBQUlNLEtBQUssR0FBRyxFQUFaOztFQUNBLEtBQUssSUFBSXhJLEVBQUUsR0FBRyxDQUFULEVBQVlDLEVBQUUsR0FBR2lJLE9BQU8sQ0FBQ08sV0FBUixDQUFvQkMsbUJBQTFDLEVBQStEMUksRUFBRSxHQUFHQyxFQUFFLENBQUNwSCxNQUF2RSxFQUErRW1ILEVBQUUsRUFBakYsRUFBcUY7SUFDakYsSUFBSTJJLFNBQVMsR0FBRzFJLEVBQUUsQ0FBQ0QsRUFBRCxDQUFsQjs7SUFDQTFMLEtBQUssQ0FBQ3NVLFFBQU4sQ0FBZUosS0FBZixFQUFzQkcsU0FBUyxDQUFDYixRQUFELEVBQVdJLE9BQVgsQ0FBL0I7RUFDSDs7RUFDRDVULEtBQUssQ0FBQ3NVLFFBQU4sQ0FBZUosS0FBZixFQUFzQkssaUJBQWlCLENBQUNmLFFBQUQsRUFBV0ksT0FBTyxDQUFDWSxPQUFuQixDQUF2Qzs7RUFDQSxPQUFPTixLQUFQO0FBQ0g7O0FBQ0QsU0FBU0ssaUJBQVQsQ0FBMkJFLElBQTNCLEVBQWlDRCxPQUFqQyxFQUEwQztFQUN0QyxPQUFPO0lBQ0hFLElBQUksRUFBRUYsT0FBTyxDQUFDRyxNQUFSLENBQWVGLElBQUksQ0FBQ2hCLEtBQUwsQ0FBV25PLEtBQTFCLENBREg7SUFFSHNQLE9BQU8sRUFBRUosT0FBTyxDQUFDSyxTQUFSLENBQWtCSixJQUFJLENBQUNoQixLQUFMLENBQVduTyxLQUE3QixFQUFvQztNQUFFd1AsUUFBUSxFQUFFTCxJQUFJLENBQUNNO0lBQWpCLENBQXBDLENBRk47SUFHSEEsTUFBTSxFQUFFTixJQUFJLENBQUNNO0VBSFYsQ0FBUDtBQUtIO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLElBQUlDLFlBQVk7QUFBRztBQUFlLFVBQVV0TixNQUFWLEVBQWtCO0VBQ2hEMUgsS0FBSyxDQUFDMkgsU0FBTixDQUFnQnFOLFlBQWhCLEVBQThCdE4sTUFBOUI7O0VBQ0EsU0FBU3NOLFlBQVQsQ0FBc0JDLFFBQXRCLEVBQWdDO0lBQzVCLElBQUl6VSxLQUFLLEdBQUdrSCxNQUFNLENBQUNJLElBQVAsQ0FBWSxJQUFaLEVBQWtCbU4sUUFBbEIsS0FBK0IsSUFBM0M7O0lBQ0F6VSxLQUFLLENBQUN5USxpQkFBTixHQUEwQixVQUFVM1AsR0FBVixFQUFlO01BQ3JDLElBQUlvUCxRQUFRLEdBQUdsUSxLQUFLLENBQUNrUSxRQUFyQjtNQUNBLElBQUl6TSxNQUFNLEdBQUczQyxHQUFHLENBQUM4QixTQUFKLENBQWNmLE1BQTNCLENBRnFDLENBR3JDOztNQUNBcU8sUUFBUSxDQUFDbkIsYUFBVCxDQUF1QixDQUFDL08sS0FBSyxDQUFDa1MsU0FBTixDQUFnQndDLGlCQUFoQixDQUFrQ2pSLE1BQWxDLENBQXhCO0lBQ0gsQ0FMRCxDQUY0QixDQVE1Qjs7O0lBQ0F6RCxLQUFLLENBQUNnUixhQUFOLEdBQXNCLFVBQVV0USxFQUFWLEVBQWM7TUFDaEMsSUFBSXdSLFNBQVMsR0FBR2xTLEtBQUssQ0FBQ2tTLFNBQXRCO01BQ0EsSUFBSXJFLE9BQU8sR0FBRzdOLEtBQUssQ0FBQ2tRLFFBQU4sQ0FBZXJDLE9BQTdCOztNQUNBLElBQUksQ0FBQ0EsT0FBTyxDQUFDck4sY0FBYixFQUE2QjtRQUN6QixJQUFJMkssRUFBRSxHQUFHbkwsS0FBSyxDQUFDMlUsV0FBZjtRQUFBLElBQTRCckUsVUFBVSxHQUFHbkYsRUFBRSxDQUFDbUYsVUFBNUM7UUFBQSxJQUF3REUsUUFBUSxHQUFHckYsRUFBRSxDQUFDcUYsUUFBdEU7O1FBQ0EsSUFBSUYsVUFBVSxJQUFJRSxRQUFkLElBQTBCc0IsV0FBVyxDQUFDeEIsVUFBRCxFQUFhRSxRQUFiLENBQXpDLEVBQWlFO1VBQzdELElBQUk0QyxPQUFPLEdBQUdsQixTQUFTLENBQUNrQixPQUF4Qjs7VUFDQSxJQUFJd0IsR0FBRyxHQUFHcFYsS0FBSyxDQUFDc1UsUUFBTixDQUFldFUsS0FBSyxDQUFDc1UsUUFBTixDQUFlLEVBQWYsRUFBbUJMLDRCQUE0QixDQUFDbkQsVUFBVSxDQUFDMEMsUUFBWixFQUFzQkksT0FBdEIsQ0FBL0MsQ0FBZixFQUErRjtZQUFFeUIsS0FBSyxFQUFFdkUsVUFBVSxDQUFDdUUsS0FBcEI7WUFBMkJDLE9BQU8sRUFBRXBVLEVBQUUsQ0FBQ2tDLFNBQXZDO1lBQWtEbVMsSUFBSSxFQUFFM0IsT0FBTyxDQUFDNEIsT0FBUixJQUFtQjVCLE9BQU8sQ0FBQzZCLFdBQVIsQ0FBb0JGO1VBQS9GLENBQS9GLENBQVY7O1VBQ0EzQixPQUFPLENBQUNwUyxPQUFSLENBQWdCQyxPQUFoQixDQUF3QixXQUF4QixFQUFxQzJULEdBQXJDO1FBQ0g7TUFDSjtJQUNKLENBWEQsQ0FUNEIsQ0FxQjVCOzs7SUFDQTVVLEtBQUssQ0FBQ2tRLFFBQU4sR0FBaUIsSUFBSWpELHlCQUFKLENBQThCd0gsUUFBUSxDQUFDdkwsRUFBdkMsQ0FBakI7SUFDQWxKLEtBQUssQ0FBQ2tRLFFBQU4sQ0FBZTlCLFlBQWYsQ0FBNEJ4RSxTQUE1QixHQUF3QyxLQUF4QztJQUNBLElBQUkrSyxXQUFXLEdBQUczVSxLQUFLLENBQUMyVSxXQUFOLEdBQW9CLElBQUkxRSxXQUFKLENBQWdCalEsS0FBSyxDQUFDa1EsUUFBdEIsRUFBZ0M1USxNQUFNLENBQUM0ViwwQkFBUCxDQUFrQ1QsUUFBbEMsQ0FBaEMsQ0FBdEM7SUFDQUUsV0FBVyxDQUFDM1QsT0FBWixDQUFvQjBOLEVBQXBCLENBQXVCLGFBQXZCLEVBQXNDMU8sS0FBSyxDQUFDeVEsaUJBQTVDO0lBQ0FrRSxXQUFXLENBQUMzVCxPQUFaLENBQW9CME4sRUFBcEIsQ0FBdUIsU0FBdkIsRUFBa0MxTyxLQUFLLENBQUNnUixhQUF4QztJQUNBLE9BQU9oUixLQUFQO0VBQ0g7O0VBQ0R3VSxZQUFZLENBQUNuUixTQUFiLENBQXVCQyxPQUF2QixHQUFpQyxZQUFZO0lBQ3pDLEtBQUs0TSxRQUFMLENBQWM1TSxPQUFkO0VBQ0gsQ0FGRDs7RUFHQSxPQUFPa1IsWUFBUDtBQUNILENBbkNpQyxDQW1DaENsVixNQUFNLENBQUM2VixXQW5DeUIsQ0FBbEM7QUFxQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLElBQUlDLGFBQWE7QUFBRztBQUFlLFVBQVVsTyxNQUFWLEVBQWtCO0VBQ2pEMUgsS0FBSyxDQUFDMkgsU0FBTixDQUFnQmlPLGFBQWhCLEVBQStCbE8sTUFBL0I7O0VBQ0EsU0FBU2tPLGFBQVQsQ0FBdUJYLFFBQXZCLEVBQWlDO0lBQzdCLElBQUl6VSxLQUFLLEdBQUdrSCxNQUFNLENBQUNJLElBQVAsQ0FBWSxJQUFaLEVBQWtCbU4sUUFBbEIsS0FBK0IsSUFBM0M7O0lBQ0F6VSxLQUFLLENBQUNxVixhQUFOLEdBQXNCLElBQXRCOztJQUNBclYsS0FBSyxDQUFDeVEsaUJBQU4sR0FBMEIsVUFBVS9QLEVBQVYsRUFBYztNQUNwQyxJQUFJeUssRUFBRSxHQUFHbkwsS0FBVDtNQUFBLElBQWdCa1MsU0FBUyxHQUFHL0csRUFBRSxDQUFDK0csU0FBL0I7TUFBQSxJQUEwQ2hDLFFBQVEsR0FBRy9FLEVBQUUsQ0FBQytFLFFBQXhEO01BQ0EsSUFBSW9GLE9BQU8sR0FBR3BELFNBQVMsQ0FBQ2tCLE9BQVYsQ0FBa0JrQyxPQUFoQztNQUNBLElBQUlDLFNBQVMsR0FBR0QsT0FBTyxDQUFDRSxVQUFSLElBQ1p0RCxTQUFTLENBQUN3QyxpQkFBVixDQUE0QmhVLEVBQUUsQ0FBQ2tDLFNBQUgsQ0FBYWYsTUFBekMsQ0FESixDQUhvQyxDQUtwQzs7TUFDQXFPLFFBQVEsQ0FBQ25CLGFBQVQsQ0FBdUIsQ0FBQ3dHLFNBQXhCLEVBTm9DLENBT3BDOztNQUNBckYsUUFBUSxDQUFDaEQsS0FBVCxHQUFpQnhNLEVBQUUsQ0FBQ21DLE9BQUgsR0FBYTRTLHdCQUF3QixDQUFDdkQsU0FBRCxDQUFyQyxHQUFtRCxJQUFwRTtJQUNILENBVEQ7O0lBVUFsUyxLQUFLLENBQUM0USxlQUFOLEdBQXdCLFVBQVVsUSxFQUFWLEVBQWM7TUFDbENWLEtBQUssQ0FBQ2tTLFNBQU4sQ0FBZ0JrQixPQUFoQixDQUF3QjZCLFdBQXhCLENBQW9DUyxRQUFwQyxDQUE2Q2hWLEVBQTdDLEVBRGtDLENBQ2dCOztJQUNyRCxDQUZEOztJQUdBVixLQUFLLENBQUMyVixlQUFOLEdBQXdCLFVBQVU5RCxHQUFWLEVBQWUrRCxPQUFmLEVBQXdCO01BQzVDLElBQUl4QyxPQUFPLEdBQUdwVCxLQUFLLENBQUNrUyxTQUFOLENBQWdCa0IsT0FBOUI7TUFDQSxJQUFJaUMsYUFBYSxHQUFHLElBQXBCO01BQ0EsSUFBSVEsU0FBUyxHQUFHLEtBQWhCOztNQUNBLElBQUloRSxHQUFKLEVBQVM7UUFDTCxJQUFJdkIsVUFBVSxHQUFHdFEsS0FBSyxDQUFDMlUsV0FBTixDQUFrQnJFLFVBQW5DO1FBQ0EsSUFBSXdGLFVBQVUsR0FBR2pFLEdBQUcsQ0FBQ3NCLFdBQUosS0FBb0I3QyxVQUFVLENBQUM2QyxXQUEvQixJQUNWblQsS0FBSyxDQUFDK1YsaUJBREksSUFFVixDQUFDL1YsS0FBSyxDQUFDK1YsaUJBQU4sQ0FBd0J6RixVQUF4QixFQUFvQ3VCLEdBQXBDLENBRlI7O1FBR0EsSUFBSSxDQUFDaUUsVUFBTCxFQUFpQjtVQUNiVCxhQUFhLEdBQUdXLHFCQUFxQixDQUFDMUYsVUFBRCxFQUFhdUIsR0FBYixFQUFrQnVCLE9BQU8sQ0FBQ08sV0FBUixDQUFvQnNDLHlCQUF0QyxDQUFyQztRQUNIOztRQUNELElBQUksQ0FBQ1osYUFBRCxJQUFrQixDQUFDL1YsTUFBTSxDQUFDNFcsb0JBQVAsQ0FBNEJiLGFBQTVCLEVBQTJDeEQsR0FBRyxDQUFDaUIsV0FBL0MsRUFBNERNLE9BQTVELENBQXZCLEVBQTZGO1VBQ3pGeUMsU0FBUyxHQUFHLElBQVo7VUFDQVIsYUFBYSxHQUFHLElBQWhCO1FBQ0g7TUFDSjs7TUFDRCxJQUFJQSxhQUFKLEVBQW1CO1FBQ2ZqQyxPQUFPLENBQUMrQyxRQUFSLENBQWlCO1VBQUVoSSxJQUFJLEVBQUUsY0FBUjtVQUF3QmlJLFNBQVMsRUFBRWY7UUFBbkMsQ0FBakI7TUFDSCxDQUZELE1BR0ssSUFBSSxDQUFDTyxPQUFMLEVBQWM7UUFBRTtRQUNqQnhDLE9BQU8sQ0FBQytDLFFBQVIsQ0FBaUI7VUFBRWhJLElBQUksRUFBRTtRQUFSLENBQWpCO01BQ0g7O01BQ0QsSUFBSSxDQUFDMEgsU0FBTCxFQUFnQjtRQUNadlcsTUFBTSxDQUFDK1csWUFBUDtNQUNILENBRkQsTUFHSztRQUNEL1csTUFBTSxDQUFDZ1gsYUFBUDtNQUNIOztNQUNELElBQUksQ0FBQ1YsT0FBTCxFQUFjO1FBQ1Y1VixLQUFLLENBQUNxVixhQUFOLEdBQXNCQSxhQUF0QixDQURVLENBQzJCO01BQ3hDO0lBQ0osQ0FoQ0Q7O0lBaUNBclYsS0FBSyxDQUFDOFEsZUFBTixHQUF3QixVQUFVaFEsR0FBVixFQUFlO01BQ25DLElBQUlkLEtBQUssQ0FBQ3FWLGFBQVYsRUFBeUI7UUFDckI7UUFDQS9WLE1BQU0sQ0FBQ2lYLGlCQUFQLENBQXlCdlcsS0FBSyxDQUFDcVYsYUFBL0IsRUFBOEN2VSxHQUE5QyxFQUFtRGQsS0FBSyxDQUFDa1MsU0FBTixDQUFnQmtCLE9BQW5FO1FBQ0FwVCxLQUFLLENBQUNxVixhQUFOLEdBQXNCLElBQXRCO01BQ0g7SUFDSixDQU5EOztJQU9BLElBQUluRCxTQUFTLEdBQUd1QyxRQUFRLENBQUN2QyxTQUF6QjtJQUNBLElBQUlvRCxPQUFPLEdBQUdwRCxTQUFTLENBQUNrQixPQUFWLENBQWtCa0MsT0FBaEM7SUFDQSxJQUFJcEYsUUFBUSxHQUFHbFEsS0FBSyxDQUFDa1EsUUFBTixHQUFpQixJQUFJakQseUJBQUosQ0FBOEJ3SCxRQUFRLENBQUN2TCxFQUF2QyxDQUFoQztJQUNBZ0gsUUFBUSxDQUFDOUMsa0JBQVQsR0FBOEIsS0FBOUI7SUFDQThDLFFBQVEsQ0FBQy9DLFdBQVQsR0FBdUJtSSxPQUFPLENBQUNrQixpQkFBUixJQUE2QixDQUFwRDtJQUNBdEcsUUFBUSxDQUFDOUIsWUFBVCxDQUFzQnhFLFNBQXRCLEdBQWtDMEwsT0FBTyxDQUFDbUIsVUFBMUM7SUFDQSxJQUFJOUIsV0FBVyxHQUFHM1UsS0FBSyxDQUFDMlUsV0FBTixHQUFvQixJQUFJMUUsV0FBSixDQUFnQmpRLEtBQUssQ0FBQ2tRLFFBQXRCLEVBQWdDNVEsTUFBTSxDQUFDNFYsMEJBQVAsQ0FBa0NULFFBQWxDLENBQWhDLENBQXRDO0lBQ0FFLFdBQVcsQ0FBQzNULE9BQVosQ0FBb0IwTixFQUFwQixDQUF1QixhQUF2QixFQUFzQzFPLEtBQUssQ0FBQ3lRLGlCQUE1QztJQUNBa0UsV0FBVyxDQUFDM1QsT0FBWixDQUFvQjBOLEVBQXBCLENBQXVCLFdBQXZCLEVBQW9DMU8sS0FBSyxDQUFDNFEsZUFBMUM7SUFDQStELFdBQVcsQ0FBQzNULE9BQVosQ0FBb0IwTixFQUFwQixDQUF1QixXQUF2QixFQUFvQzFPLEtBQUssQ0FBQzJWLGVBQTFDO0lBQ0FoQixXQUFXLENBQUMzVCxPQUFaLENBQW9CME4sRUFBcEIsQ0FBdUIsV0FBdkIsRUFBb0MxTyxLQUFLLENBQUM4USxlQUExQztJQUNBLE9BQU85USxLQUFQO0VBQ0g7O0VBQ0RvVixhQUFhLENBQUMvUixTQUFkLENBQXdCQyxPQUF4QixHQUFrQyxZQUFZO0lBQzFDLEtBQUs0TSxRQUFMLENBQWM1TSxPQUFkO0VBQ0gsQ0FGRDs7RUFHQSxPQUFPOFIsYUFBUDtBQUNILENBM0VrQyxDQTJFakM5VixNQUFNLENBQUM2VixXQTNFMEIsQ0FBbkM7O0FBNEVBLFNBQVNNLHdCQUFULENBQWtDdkQsU0FBbEMsRUFBNkM7RUFDekMsSUFBSW9ELE9BQU8sR0FBR3BELFNBQVMsQ0FBQ2tCLE9BQVYsQ0FBa0JrQyxPQUFoQztFQUNBLElBQUlwSSxLQUFLLEdBQUdvSSxPQUFPLENBQUNvQixvQkFBcEI7O0VBQ0EsSUFBSXhKLEtBQUssSUFBSSxJQUFiLEVBQW1CO0lBQ2ZBLEtBQUssR0FBR29JLE9BQU8sQ0FBQ3FCLGNBQWhCO0VBQ0g7O0VBQ0QsT0FBT3pKLEtBQVA7QUFDSDs7QUFDRCxTQUFTOEkscUJBQVQsQ0FBK0IzQyxJQUEvQixFQUFxQ0MsSUFBckMsRUFBMkMyQyx5QkFBM0MsRUFBc0U7RUFDbEUsSUFBSVcsU0FBUyxHQUFHdkQsSUFBSSxDQUFDTCxRQUFyQjtFQUNBLElBQUk2RCxTQUFTLEdBQUd2RCxJQUFJLENBQUNOLFFBQXJCO0VBQ0EsSUFBSThELEVBQUUsR0FBRyxDQUNMRixTQUFTLENBQUMzRCxLQUFWLENBQWdCbk8sS0FEWCxFQUVMOFIsU0FBUyxDQUFDM0QsS0FBVixDQUFnQjhELEdBRlgsRUFHTEYsU0FBUyxDQUFDNUQsS0FBVixDQUFnQm5PLEtBSFgsRUFJTCtSLFNBQVMsQ0FBQzVELEtBQVYsQ0FBZ0I4RCxHQUpYLENBQVQ7RUFNQUQsRUFBRSxDQUFDRSxJQUFILENBQVExWCxNQUFNLENBQUMyWCxjQUFmO0VBQ0EsSUFBSXZELEtBQUssR0FBRyxFQUFaOztFQUNBLEtBQUssSUFBSXhJLEVBQUUsR0FBRyxDQUFULEVBQVlnTSwyQkFBMkIsR0FBR2pCLHlCQUEvQyxFQUEwRS9LLEVBQUUsR0FBR2dNLDJCQUEyQixDQUFDblQsTUFBM0csRUFBbUhtSCxFQUFFLEVBQXJILEVBQXlIO0lBQ3JILElBQUlpTSxXQUFXLEdBQUdELDJCQUEyQixDQUFDaE0sRUFBRCxDQUE3QztJQUNBLElBQUlrTSxHQUFHLEdBQUdELFdBQVcsQ0FBQzlELElBQUQsRUFBT0MsSUFBUCxDQUFyQjs7SUFDQSxJQUFJOEQsR0FBRyxLQUFLLEtBQVosRUFBbUI7TUFDZixPQUFPLElBQVA7SUFDSDs7SUFDRCxJQUFJQSxHQUFKLEVBQVM7TUFDTDVYLEtBQUssQ0FBQ3NVLFFBQU4sQ0FBZUosS0FBZixFQUFzQjBELEdBQXRCO0lBQ0g7RUFDSjs7RUFDRDFELEtBQUssQ0FBQ1QsS0FBTixHQUFjO0lBQUVuTyxLQUFLLEVBQUVnUyxFQUFFLENBQUMsQ0FBRCxDQUFYO0lBQWdCQyxHQUFHLEVBQUVELEVBQUUsQ0FBQyxDQUFEO0VBQXZCLENBQWQ7RUFDQXBELEtBQUssQ0FBQ2EsTUFBTixHQUFlcUMsU0FBUyxDQUFDckMsTUFBekI7RUFDQSxPQUFPYixLQUFQO0FBQ0g7O0FBRUQsSUFBSTJELGFBQWE7QUFBRztBQUFlLFVBQVVuUSxNQUFWLEVBQWtCO0VBQ2pEMUgsS0FBSyxDQUFDMkgsU0FBTixDQUFnQmtRLGFBQWhCLEVBQStCblEsTUFBL0I7O0VBQ0EsU0FBU21RLGFBQVQsQ0FBdUI1QyxRQUF2QixFQUFpQztJQUM3QixJQUFJelUsS0FBSyxHQUFHa0gsTUFBTSxDQUFDSSxJQUFQLENBQVksSUFBWixFQUFrQm1OLFFBQWxCLEtBQStCLElBQTNDLENBRDZCLENBRTdCOzs7SUFDQXpVLEtBQUssQ0FBQ0MsU0FBTixHQUFrQixJQUFsQjtJQUNBRCxLQUFLLENBQUNzWCxVQUFOLEdBQW1CLElBQW5CLENBSjZCLENBSUo7O0lBQ3pCdFgsS0FBSyxDQUFDTSxVQUFOLEdBQW1CLEtBQW5CO0lBQ0FOLEtBQUssQ0FBQ3VYLFVBQU4sR0FBbUIsSUFBbkI7SUFDQXZYLEtBQUssQ0FBQ3dYLGNBQU4sR0FBdUIsSUFBdkIsQ0FQNkIsQ0FPQTs7SUFDN0J4WCxLQUFLLENBQUN5WCxnQkFBTixHQUF5QixJQUF6QjtJQUNBelgsS0FBSyxDQUFDMFgsYUFBTixHQUFzQixJQUF0QjtJQUNBMVgsS0FBSyxDQUFDMlgscUJBQU4sR0FBOEIsSUFBOUI7O0lBQ0EzWCxLQUFLLENBQUN5USxpQkFBTixHQUEwQixVQUFVL1AsRUFBVixFQUFjO01BQ3BDLElBQUlrWCxVQUFVLEdBQUdsWCxFQUFFLENBQUNrQyxTQUFILENBQWFmLE1BQTlCO01BQ0EsSUFBSXNKLEVBQUUsR0FBR25MLEtBQVQ7TUFBQSxJQUFnQmtTLFNBQVMsR0FBRy9HLEVBQUUsQ0FBQytHLFNBQS9CO01BQUEsSUFBMENoQyxRQUFRLEdBQUcvRSxFQUFFLENBQUMrRSxRQUF4RDtNQUNBLElBQUlwQyxNQUFNLEdBQUdvQyxRQUFRLENBQUNwQyxNQUF0QjtNQUNBLElBQUl3SCxPQUFPLEdBQUdwRCxTQUFTLENBQUNrQixPQUFWLENBQWtCa0MsT0FBaEM7TUFDQSxJQUFJdUMsY0FBYyxHQUFHM0YsU0FBUyxDQUFDa0IsT0FBL0I7TUFDQXBULEtBQUssQ0FBQ0MsU0FBTixHQUFrQlMsRUFBRSxDQUFDVCxTQUFyQjtNQUNBLElBQUlxWCxVQUFVLEdBQUd0WCxLQUFLLENBQUNzWCxVQUFOLEdBQW1CaFksTUFBTSxDQUFDd1ksUUFBUCxDQUFnQnBYLEVBQUUsQ0FBQ1QsU0FBbkIsQ0FBcEM7TUFDQSxJQUFJc1gsVUFBVSxHQUFHdlgsS0FBSyxDQUFDdVgsVUFBTixHQUFtQkQsVUFBVSxDQUFDQyxVQUEvQztNQUNBLElBQUlRLGVBQWUsR0FBR1IsVUFBVSxDQUFDUyxRQUFYLENBQW9CQyxVQUExQztNQUNBalksS0FBSyxDQUFDd1gsY0FBTixHQUF1QmxZLE1BQU0sQ0FBQzRZLGlCQUFQLENBQXlCTCxjQUFjLENBQUNNLGNBQWYsR0FBZ0NDLFVBQXpELEVBQXFFTCxlQUFyRSxDQUF2QjtNQUNBN0gsUUFBUSxDQUFDL0MsV0FBVCxHQUF1QnpNLEVBQUUsQ0FBQ21DLE9BQUgsR0FBYSxDQUFiLEdBQWlCeVMsT0FBTyxDQUFDK0Msb0JBQWhEO01BQ0FuSSxRQUFRLENBQUNoRCxLQUFULEdBQ0k7TUFDQ3hNLEVBQUUsQ0FBQ21DLE9BQUgsSUFBY2tWLGVBQWUsS0FBSzdGLFNBQVMsQ0FBQ3dCLEtBQVYsQ0FBZ0I0RSxjQUFuRCxHQUNJQyxzQkFBc0IsQ0FBQ3JHLFNBQUQsQ0FEMUIsR0FFSSxJQUpSOztNQUtBLElBQUlvRCxPQUFPLENBQUNrRCxpQkFBWixFQUErQjtRQUMzQjFLLE1BQU0sQ0FBQ3BKLFVBQVAsR0FBb0I0USxPQUFPLENBQUNrRCxpQkFBNUI7TUFDSCxDQUZELE1BR0s7UUFDRDFLLE1BQU0sQ0FBQ3BKLFVBQVAsR0FBb0JwRixNQUFNLENBQUNvRSxjQUFQLENBQXNCa1UsVUFBdEIsRUFBa0MsS0FBbEMsQ0FBcEI7TUFDSDs7TUFDRDlKLE1BQU0sQ0FBQ2pKLGNBQVAsR0FBd0J5USxPQUFPLENBQUNtRCxrQkFBaEM7TUFDQSxJQUFJQyxPQUFPLEdBQUd4RyxTQUFTLENBQUN5RyxnQkFBVixDQUEyQmYsVUFBM0IsS0FDVixDQUFDdFksTUFBTSxDQUFDb0UsY0FBUCxDQUFzQmtVLFVBQXRCLEVBQWtDLG1CQUFsQyxDQURMLENBeEJvQyxDQXlCeUI7O01BQzdEMUgsUUFBUSxDQUFDbkIsYUFBVCxDQUF1QixDQUFDMkosT0FBeEIsRUExQm9DLENBMkJwQztNQUNBOztNQUNBMVksS0FBSyxDQUFDTSxVQUFOLEdBQW1Cb1ksT0FBTyxJQUN0QmhZLEVBQUUsQ0FBQ1QsU0FBSCxDQUFhcUcsU0FBYixDQUF1QnNTLFFBQXZCLENBQWdDLG9CQUFoQyxDQURKO0lBRUgsQ0EvQkQ7O0lBZ0NBNVksS0FBSyxDQUFDNFEsZUFBTixHQUF3QixVQUFVbFEsRUFBVixFQUFjO01BQ2xDLElBQUltWCxjQUFjLEdBQUc3WCxLQUFLLENBQUNrUyxTQUFOLENBQWdCa0IsT0FBckM7TUFDQSxJQUFJbUUsVUFBVSxHQUFHdlgsS0FBSyxDQUFDdVgsVUFBdkI7TUFDQSxJQUFJUSxlQUFlLEdBQUdSLFVBQVUsQ0FBQ1MsUUFBWCxDQUFvQkMsVUFBMUM7O01BQ0EsSUFBSXZYLEVBQUUsQ0FBQ21DLE9BQVAsRUFBZ0I7UUFDWjtRQUNBLElBQUlrVixlQUFlLEtBQUsvWCxLQUFLLENBQUNrUyxTQUFOLENBQWdCd0IsS0FBaEIsQ0FBc0I0RSxjQUE5QyxFQUE4RDtVQUMxRFQsY0FBYyxDQUFDMUIsUUFBZixDQUF3QjtZQUFFaEksSUFBSSxFQUFFLGNBQVI7WUFBd0I0SixlQUFlLEVBQUVBO1VBQXpDLENBQXhCO1FBQ0g7TUFDSixDQUxELE1BTUs7UUFDRDtRQUNBRixjQUFjLENBQUMxQixRQUFmLENBQXdCO1VBQUVoSSxJQUFJLEVBQUU7UUFBUixDQUF4QjtNQUNIOztNQUNELElBQUluTyxLQUFLLENBQUNNLFVBQVYsRUFBc0I7UUFDbEJ1WCxjQUFjLENBQUM1QyxXQUFmLENBQTJCUyxRQUEzQixDQUFvQ2hWLEVBQXBDLEVBRGtCLENBQ3VCOztRQUN6Q21YLGNBQWMsQ0FBQzdXLE9BQWYsQ0FBdUJDLE9BQXZCLENBQStCLGdCQUEvQixFQUFpRDtVQUM3Q2lJLEVBQUUsRUFBRWxKLEtBQUssQ0FBQ0MsU0FEbUM7VUFFN0M0WSxLQUFLLEVBQUUsSUFBSXZaLE1BQU0sQ0FBQ3daLFFBQVgsQ0FBb0JqQixjQUFwQixFQUFvQ04sVUFBVSxDQUFDd0IsR0FBL0MsRUFBb0R4QixVQUFVLENBQUNTLFFBQS9ELENBRnNDO1VBRzdDbEQsT0FBTyxFQUFFcFUsRUFBRSxDQUFDa0MsU0FIaUM7VUFJN0NtUyxJQUFJLEVBQUU4QyxjQUFjLENBQUM3QztRQUp3QixDQUFqRDtNQU1IO0lBQ0osQ0F2QkQ7O0lBd0JBaFYsS0FBSyxDQUFDMlYsZUFBTixHQUF3QixVQUFVOUQsR0FBVixFQUFlK0QsT0FBZixFQUF3QjtNQUM1QyxJQUFJLENBQUM1VixLQUFLLENBQUNNLFVBQVgsRUFBdUI7UUFDbkI7TUFDSDs7TUFDRCxJQUFJa1gsY0FBYyxHQUFHeFgsS0FBSyxDQUFDd1gsY0FBM0I7TUFDQSxJQUFJbEgsVUFBVSxHQUFHdFEsS0FBSyxDQUFDMlUsV0FBTixDQUFrQnJFLFVBQW5DO01BQ0EsSUFBSXVILGNBQWMsR0FBRzdYLEtBQUssQ0FBQ2tTLFNBQU4sQ0FBZ0JrQixPQUFyQyxDQU40QyxDQU81Qzs7TUFDQSxJQUFJcUUsZ0JBQWdCLEdBQUcsSUFBdkI7TUFDQSxJQUFJdUIsUUFBUSxHQUFHLElBQWY7TUFDQSxJQUFJckIscUJBQXFCLEdBQUcsSUFBNUI7TUFDQSxJQUFJOUIsU0FBUyxHQUFHLEtBQWhCO01BQ0EsSUFBSW9ELFdBQVcsR0FBRztRQUNkQyxjQUFjLEVBQUUxQixjQURGO1FBRWQyQixhQUFhLEVBQUU3WixNQUFNLENBQUM4WixxQkFBUCxFQUZEO1FBR2RDLE9BQU8sRUFBRTtNQUhLLENBQWxCOztNQUtBLElBQUl4SCxHQUFKLEVBQVM7UUFDTDRGLGdCQUFnQixHQUFHNUYsR0FBRyxDQUFDdUIsT0FBdkI7UUFDQSxJQUFJa0csZ0JBQWdCLEdBQUc3QixnQkFBZ0IsQ0FBQ25DLE9BQXhDOztRQUNBLElBQUl1QyxjQUFjLEtBQUtKLGdCQUFuQixJQUNDNkIsZ0JBQWdCLENBQUNDLFFBQWpCLElBQTZCRCxnQkFBZ0IsQ0FBQ0UsU0FEbkQsRUFDK0Q7VUFDM0RSLFFBQVEsR0FBR1Msb0JBQW9CLENBQUNuSixVQUFELEVBQWF1QixHQUFiLEVBQWtCNEYsZ0JBQWdCLENBQUNVLGNBQWpCLEdBQWtDeEUsV0FBbEMsQ0FBOEMrRiwwQkFBaEUsQ0FBL0I7O1VBQ0EsSUFBSVYsUUFBSixFQUFjO1lBQ1ZyQixxQkFBcUIsR0FBR3JZLE1BQU0sQ0FBQ3FhLHlCQUFQLENBQWlDbkMsY0FBakMsRUFBaURDLGdCQUFnQixDQUFDVSxjQUFqQixHQUFrQ3lCLFlBQW5GLEVBQWlHWixRQUFqRyxFQUEyR3ZCLGdCQUEzRyxDQUF4QjtZQUNBd0IsV0FBVyxDQUFDRSxhQUFaLEdBQTRCeEIscUJBQTVCOztZQUNBLElBQUksQ0FBQ3JZLE1BQU0sQ0FBQ3VhLGtCQUFQLENBQTBCWixXQUExQixFQUF1Q3BILEdBQUcsQ0FBQ2lCLFdBQTNDLEVBQXdEMkUsZ0JBQXhELENBQUwsRUFBZ0Y7Y0FDNUU1QixTQUFTLEdBQUcsSUFBWjtjQUNBbUQsUUFBUSxHQUFHLElBQVg7Y0FDQXJCLHFCQUFxQixHQUFHLElBQXhCO2NBQ0FzQixXQUFXLENBQUNFLGFBQVosR0FBNEI3WixNQUFNLENBQUM4WixxQkFBUCxFQUE1QjtZQUNIO1VBQ0o7UUFDSixDQWJELE1BY0s7VUFDRDNCLGdCQUFnQixHQUFHLElBQW5CO1FBQ0g7TUFDSjs7TUFDRHpYLEtBQUssQ0FBQzhaLFdBQU4sQ0FBa0JyQyxnQkFBbEIsRUFBb0N3QixXQUFwQzs7TUFDQSxJQUFJLENBQUNwRCxTQUFMLEVBQWdCO1FBQ1p2VyxNQUFNLENBQUMrVyxZQUFQO01BQ0gsQ0FGRCxNQUdLO1FBQ0QvVyxNQUFNLENBQUNnWCxhQUFQO01BQ0g7O01BQ0QsSUFBSSxDQUFDVixPQUFMLEVBQWM7UUFDVixJQUFJaUMsY0FBYyxLQUFLSixnQkFBbkIsSUFBdUM7UUFDdkMzRixXQUFXLENBQUN4QixVQUFELEVBQWF1QixHQUFiLENBRGYsRUFDa0M7VUFDOUJtSCxRQUFRLEdBQUcsSUFBWDtRQUNIOztRQUNEaFosS0FBSyxDQUFDa1EsUUFBTixDQUFlakIsb0JBQWYsQ0FBb0MsQ0FBQytKLFFBQXJDLEVBTFUsQ0FNVjtRQUNBOzs7UUFDQWhaLEtBQUssQ0FBQ2tRLFFBQU4sQ0FBZWxCLGtCQUFmLENBQWtDLENBQUM2QyxHQUFELElBQVEsQ0FBQ3ZTLE1BQU0sQ0FBQ3lOLFNBQVAsQ0FBaUIvTSxLQUFLLENBQUNDLFNBQXZCLEVBQWtDOFosYUFBbEMsQ0FBZ0Qsa0JBQWhELENBQTNDLEVBUlUsQ0FTVjs7O1FBQ0EvWixLQUFLLENBQUN5WCxnQkFBTixHQUF5QkEsZ0JBQXpCO1FBQ0F6WCxLQUFLLENBQUMwWCxhQUFOLEdBQXNCc0IsUUFBdEI7UUFDQWhaLEtBQUssQ0FBQzJYLHFCQUFOLEdBQThCQSxxQkFBOUI7TUFDSDtJQUNKLENBM0REOztJQTREQTNYLEtBQUssQ0FBQzhRLGVBQU4sR0FBd0IsWUFBWTtNQUNoQyxJQUFJLENBQUM5USxLQUFLLENBQUNNLFVBQVgsRUFBdUI7UUFDbkJOLEtBQUssQ0FBQ3lCLE9BQU4sR0FEbUIsQ0FDRjs7TUFDcEI7SUFDSixDQUpEOztJQUtBekIsS0FBSyxDQUFDZ1IsYUFBTixHQUFzQixVQUFVdFEsRUFBVixFQUFjO01BQ2hDLElBQUlWLEtBQUssQ0FBQ00sVUFBVixFQUFzQjtRQUNsQixJQUFJMFosZ0JBQWdCLEdBQUdoYSxLQUFLLENBQUNrUyxTQUFOLENBQWdCa0IsT0FBdkM7UUFDQSxJQUFJNkcsV0FBVyxHQUFHRCxnQkFBZ0IsQ0FBQ2hGLE9BQW5DO1FBQ0EsSUFBSTdKLEVBQUUsR0FBR25MLEtBQVQ7UUFBQSxJQUFnQmthLGtCQUFrQixHQUFHL08sRUFBRSxDQUFDc00sZ0JBQXhDO1FBQUEsSUFBMERDLGFBQWEsR0FBR3ZNLEVBQUUsQ0FBQ3VNLGFBQTdFO1FBQ0EsSUFBSXlDLFFBQVEsR0FBR25hLEtBQUssQ0FBQ3VYLFVBQU4sQ0FBaUJ3QixHQUFoQztRQUNBLElBQUlxQixhQUFhLEdBQUdwYSxLQUFLLENBQUN1WCxVQUFOLENBQWlCUyxRQUFyQztRQUNBLElBQUlxQyxRQUFRLEdBQUcsSUFBSS9hLE1BQU0sQ0FBQ3daLFFBQVgsQ0FBb0JrQixnQkFBcEIsRUFBc0NHLFFBQXRDLEVBQWdEQyxhQUFoRCxDQUFmO1FBQ0EsSUFBSUUsZ0JBQWdCLEdBQUd0YSxLQUFLLENBQUN3WCxjQUE3QjtRQUNBLElBQUkrQyx1QkFBdUIsR0FBR3ZhLEtBQUssQ0FBQzJYLHFCQUFwQztRQUNBLElBQUluSCxRQUFRLEdBQUd4USxLQUFLLENBQUMyVSxXQUFOLENBQWtCbkUsUUFBakM7O1FBQ0F4USxLQUFLLENBQUN3YSxTQUFOLEdBVmtCLENBVUM7OztRQUNuQlIsZ0JBQWdCLENBQUNoWixPQUFqQixDQUF5QkMsT0FBekIsQ0FBaUMsZUFBakMsRUFBa0Q7VUFDOUNpSSxFQUFFLEVBQUVsSixLQUFLLENBQUNDLFNBRG9DO1VBRTlDNFksS0FBSyxFQUFFd0IsUUFGdUM7VUFHOUN2RixPQUFPLEVBQUVwVSxFQUFFLENBQUNrQyxTQUhrQztVQUk5Q21TLElBQUksRUFBRWtGO1FBSndDLENBQWxEOztRQU1BLElBQUl2QyxhQUFKLEVBQW1CO1VBQ2Y7VUFDQSxJQUFJd0Msa0JBQWtCLEtBQUtGLGdCQUEzQixFQUE2QztZQUN6QyxJQUFJUyxlQUFlLEdBQUcsSUFBSW5iLE1BQU0sQ0FBQ3daLFFBQVgsQ0FBb0JrQixnQkFBcEIsRUFBc0NPLHVCQUF1QixDQUFDRyxJQUF4QixDQUE2QlAsUUFBUSxDQUFDUSxLQUF0QyxDQUF0QyxFQUFvRlAsYUFBYSxHQUFHRyx1QkFBdUIsQ0FBQ0ssU0FBeEIsQ0FBa0NSLGFBQWEsQ0FBQ25DLFVBQWhELENBQUgsR0FBaUUsSUFBbEssQ0FBdEI7WUFDQStCLGdCQUFnQixDQUFDN0QsUUFBakIsQ0FBMEI7Y0FDdEJoSSxJQUFJLEVBQUUsY0FEZ0I7Y0FFdEJpSyxVQUFVLEVBQUVtQztZQUZVLENBQTFCO1lBSUEsSUFBSU0sY0FBYyxHQUFHO2NBQ2pCQyxRQUFRLEVBQUVULFFBRE87Y0FFakJ4QixLQUFLLEVBQUU0QixlQUZVO2NBR2pCTSxhQUFhLEVBQUV6YixNQUFNLENBQUMwYixjQUFQLENBQXNCVCx1QkFBdEIsRUFBK0NQLGdCQUEvQyxFQUFpRUksYUFBakUsQ0FIRTtjQUlqQmEsTUFBTSxFQUFFLGtCQUFZO2dCQUNoQmpCLGdCQUFnQixDQUFDN0QsUUFBakIsQ0FBMEI7a0JBQ3RCaEksSUFBSSxFQUFFLGNBRGdCO2tCQUV0QmlLLFVBQVUsRUFBRWtDLGdCQUZVLENBRVE7O2dCQUZSLENBQTFCO2NBSUg7WUFUZ0IsQ0FBckI7WUFXQSxJQUFJWSxXQUFXLEdBQUcsRUFBbEI7O1lBQ0EsS0FBSyxJQUFJaFEsRUFBRSxHQUFHLENBQVQsRUFBWWlRLEVBQUUsR0FBR25CLGdCQUFnQixDQUFDN0IsY0FBakIsR0FBa0N4RSxXQUFsQyxDQUE4Q3lILHFCQUFwRSxFQUEyRmxRLEVBQUUsR0FBR2lRLEVBQUUsQ0FBQ3BYLE1BQW5HLEVBQTJHbUgsRUFBRSxFQUE3RyxFQUFpSDtjQUM3RyxJQUFJaU0sV0FBVyxHQUFHZ0UsRUFBRSxDQUFDalEsRUFBRCxDQUFwQjs7Y0FDQTFMLEtBQUssQ0FBQ3NVLFFBQU4sQ0FBZW9ILFdBQWYsRUFBNEIvRCxXQUFXLENBQUNPLGFBQUQsRUFBZ0JzQyxnQkFBaEIsQ0FBdkM7WUFDSDs7WUFDREEsZ0JBQWdCLENBQUNoWixPQUFqQixDQUF5QkMsT0FBekIsQ0FBaUMsV0FBakMsRUFBOEN6QixLQUFLLENBQUNzVSxRQUFOLENBQWV0VSxLQUFLLENBQUNzVSxRQUFOLENBQWV0VSxLQUFLLENBQUNzVSxRQUFOLENBQWUsRUFBZixFQUFtQitHLGNBQW5CLENBQWYsRUFBbURLLFdBQW5ELENBQWYsRUFBZ0Y7Y0FBRWhTLEVBQUUsRUFBRXhJLEVBQUUsQ0FBQ1QsU0FBVDtjQUFvQm9iLEtBQUssRUFBRTNELGFBQWEsQ0FBQzRELFVBQXpDO2NBQXFEeEcsT0FBTyxFQUFFcFUsRUFBRSxDQUFDa0MsU0FBakU7Y0FBNEVtUyxJQUFJLEVBQUVrRjtZQUFsRixDQUFoRixDQUE5QztZQUNBRCxnQkFBZ0IsQ0FBQ2haLE9BQWpCLENBQXlCQyxPQUF6QixDQUFpQyxhQUFqQyxFQUFnRDRaLGNBQWhELEVBdkJ5QyxDQXdCekM7VUFDSCxDQXpCRCxNQTBCSyxJQUFJWCxrQkFBSixFQUF3QjtZQUN6QixJQUFJcUIsY0FBYyxHQUFHO2NBQ2pCMUMsS0FBSyxFQUFFd0IsUUFEVTtjQUVqQlUsYUFBYSxFQUFFemIsTUFBTSxDQUFDMGIsY0FBUCxDQUFzQlYsZ0JBQXRCLEVBQXdDTixnQkFBeEMsRUFBMERJLGFBQTFELENBRkU7Y0FHakJhLE1BQU0sRUFBRSxrQkFBWTtnQkFDaEJqQixnQkFBZ0IsQ0FBQzdELFFBQWpCLENBQTBCO2tCQUN0QmhJLElBQUksRUFBRSxjQURnQjtrQkFFdEJpSyxVQUFVLEVBQUVrQztnQkFGVSxDQUExQjtjQUlIO1lBUmdCLENBQXJCO1lBVUFOLGdCQUFnQixDQUFDaFosT0FBakIsQ0FBeUJDLE9BQXpCLENBQWlDLFlBQWpDLEVBQStDekIsS0FBSyxDQUFDc1UsUUFBTixDQUFldFUsS0FBSyxDQUFDc1UsUUFBTixDQUFlLEVBQWYsRUFBbUJ5SCxjQUFuQixDQUFmLEVBQW1EO2NBQUVDLFNBQVMsRUFBRTlhLEVBQUUsQ0FBQ1QsU0FBaEI7Y0FBMkI4VSxJQUFJLEVBQUVrRjtZQUFqQyxDQUFuRCxDQUEvQztZQUNBRCxnQkFBZ0IsQ0FBQzdELFFBQWpCLENBQTBCO2NBQ3RCaEksSUFBSSxFQUFFLGVBRGdCO2NBRXRCaUssVUFBVSxFQUFFa0M7WUFGVSxDQUExQjtZQUlBTixnQkFBZ0IsQ0FBQ2haLE9BQWpCLENBQXlCQyxPQUF6QixDQUFpQyxhQUFqQyxFQUFnRHNhLGNBQWhEO1lBQ0EsSUFBSUUsYUFBYSxHQUFHbEIsdUJBQXVCLENBQUNHLElBQXhCLENBQTZCUCxRQUFRLENBQUNRLEtBQXRDLENBQXBCO1lBQ0EsSUFBSWUsa0JBQWtCLEdBQUduQix1QkFBdUIsQ0FBQ0ssU0FBeEIsQ0FBa0NSLGFBQWEsQ0FBQ25DLFVBQWhELENBQXpCO1lBQ0EsSUFBSTBELGFBQWEsR0FBRyxJQUFJcmMsTUFBTSxDQUFDd1osUUFBWCxDQUFvQm9CLGtCQUFwQixFQUF3Q3VCLGFBQXhDLEVBQXVEQyxrQkFBdkQsQ0FBcEI7WUFDQXhCLGtCQUFrQixDQUFDL0QsUUFBbkIsQ0FBNEI7Y0FDeEJoSSxJQUFJLEVBQUUsY0FEa0I7Y0FFeEJpSyxVQUFVLEVBQUVtQztZQUZZLENBQTVCO1lBSUEsSUFBSXFCLFdBQVcsR0FBRztjQUNkL0MsS0FBSyxFQUFFOEMsYUFETztjQUVkWixhQUFhLEVBQUV6YixNQUFNLENBQUMwYixjQUFQLENBQXNCVCx1QkFBdEIsRUFBK0NMLGtCQUEvQyxFQUFtRXdCLGtCQUFuRSxDQUZEO2NBR2RULE1BQU0sRUFBRSxrQkFBWTtnQkFDaEJmLGtCQUFrQixDQUFDL0QsUUFBbkIsQ0FBNEI7a0JBQ3hCaEksSUFBSSxFQUFFLGVBRGtCO2tCQUV4QmlLLFVBQVUsRUFBRW1DO2dCQUZZLENBQTVCO2NBSUg7WUFSYSxDQUFsQjtZQVVBTCxrQkFBa0IsQ0FBQ2xaLE9BQW5CLENBQTJCQyxPQUEzQixDQUFtQyxVQUFuQyxFQUErQzJhLFdBQS9DOztZQUNBLElBQUlsYixFQUFFLENBQUNtQyxPQUFQLEVBQWdCO2NBQ1pxWCxrQkFBa0IsQ0FBQy9ELFFBQW5CLENBQTRCO2dCQUN4QmhJLElBQUksRUFBRSxjQURrQjtnQkFFeEI0SixlQUFlLEVBQUVxQyxhQUFhLENBQUNuQztjQUZQLENBQTVCO1lBSUg7O1lBQ0RpQyxrQkFBa0IsQ0FBQ2xaLE9BQW5CLENBQTJCQyxPQUEzQixDQUFtQyxNQUFuQyxFQUEyQ3pCLEtBQUssQ0FBQ3NVLFFBQU4sQ0FBZXRVLEtBQUssQ0FBQ3NVLFFBQU4sQ0FBZSxFQUFmLEVBQW1CTCw0QkFBNEIsQ0FBQ2pELFFBQVEsQ0FBQ3dDLFFBQVYsRUFBb0JrSCxrQkFBcEIsQ0FBL0MsQ0FBZixFQUF3RztjQUFFc0IsU0FBUyxFQUFFOWEsRUFBRSxDQUFDVCxTQUFoQjtjQUEyQjZVLE9BQU8sRUFBRXBVLEVBQUUsQ0FBQ2tDLFNBQXZDO2NBQWtEbVMsSUFBSSxFQUFFdkUsUUFBUSxDQUFDNEMsT0FBVCxDQUFpQjRCO1lBQXpFLENBQXhHLENBQTNDO1lBQ0FrRixrQkFBa0IsQ0FBQ2xaLE9BQW5CLENBQTJCQyxPQUEzQixDQUFtQyxjQUFuQyxFQUFtRHpCLEtBQUssQ0FBQ3NVLFFBQU4sQ0FBZXRVLEtBQUssQ0FBQ3NVLFFBQU4sQ0FBZSxFQUFmLEVBQW1COEgsV0FBbkIsQ0FBZixFQUFnRDtjQUFFSixTQUFTLEVBQUU5YSxFQUFFLENBQUNULFNBQWhCO2NBQTJCOFUsSUFBSSxFQUFFdkUsUUFBUSxDQUFDNEMsT0FBVCxDQUFpQjRCO1lBQWxELENBQWhELENBQW5EO1VBQ0g7UUFDSixDQXhFRCxNQXlFSztVQUNEZ0YsZ0JBQWdCLENBQUNoWixPQUFqQixDQUF5QkMsT0FBekIsQ0FBaUMsY0FBakM7UUFDSDtNQUNKOztNQUNEakIsS0FBSyxDQUFDeUIsT0FBTjtJQUNILENBaEdEOztJQWlHQSxJQUFJeVEsU0FBUyxHQUFHbFMsS0FBSyxDQUFDa1MsU0FBdEI7SUFDQSxJQUFJb0QsT0FBTyxHQUFHcEQsU0FBUyxDQUFDa0IsT0FBVixDQUFrQmtDLE9BQWhDO0lBQ0EsSUFBSXBGLFFBQVEsR0FBR2xRLEtBQUssQ0FBQ2tRLFFBQU4sR0FBaUIsSUFBSWpELHlCQUFKLENBQThCd0gsUUFBUSxDQUFDdkwsRUFBdkMsQ0FBaEM7SUFDQWdILFFBQVEsQ0FBQ3JDLE9BQVQsQ0FBaUIzTixRQUFqQixHQUE0Qm1YLGFBQWEsQ0FBQ3dFLFFBQTFDO0lBQ0EzTCxRQUFRLENBQUM5QyxrQkFBVCxHQUE4QixLQUE5QjtJQUNBOEMsUUFBUSxDQUFDOUIsWUFBVCxDQUFzQnhFLFNBQXRCLEdBQWtDMEwsT0FBTyxDQUFDbUIsVUFBMUM7SUFDQSxJQUFJOUIsV0FBVyxHQUFHM1UsS0FBSyxDQUFDMlUsV0FBTixHQUFvQixJQUFJMUUsV0FBSixDQUFnQmpRLEtBQUssQ0FBQ2tRLFFBQXRCLEVBQWdDNVEsTUFBTSxDQUFDd2Msd0JBQXZDLENBQXRDO0lBQ0FuSCxXQUFXLENBQUN2RSxnQkFBWixHQUErQnFFLFFBQVEsQ0FBQ3NILGNBQXhDO0lBQ0FwSCxXQUFXLENBQUMzVCxPQUFaLENBQW9CME4sRUFBcEIsQ0FBdUIsYUFBdkIsRUFBc0MxTyxLQUFLLENBQUN5USxpQkFBNUM7SUFDQWtFLFdBQVcsQ0FBQzNULE9BQVosQ0FBb0IwTixFQUFwQixDQUF1QixXQUF2QixFQUFvQzFPLEtBQUssQ0FBQzRRLGVBQTFDO0lBQ0ErRCxXQUFXLENBQUMzVCxPQUFaLENBQW9CME4sRUFBcEIsQ0FBdUIsV0FBdkIsRUFBb0MxTyxLQUFLLENBQUMyVixlQUExQztJQUNBaEIsV0FBVyxDQUFDM1QsT0FBWixDQUFvQjBOLEVBQXBCLENBQXVCLFdBQXZCLEVBQW9DMU8sS0FBSyxDQUFDOFEsZUFBMUM7SUFDQTZELFdBQVcsQ0FBQzNULE9BQVosQ0FBb0IwTixFQUFwQixDQUF1QixTQUF2QixFQUFrQzFPLEtBQUssQ0FBQ2dSLGFBQXhDO0lBQ0EsT0FBT2hSLEtBQVA7RUFDSDs7RUFDRHFYLGFBQWEsQ0FBQ2hVLFNBQWQsQ0FBd0JDLE9BQXhCLEdBQWtDLFlBQVk7SUFDMUMsS0FBSzRNLFFBQUwsQ0FBYzVNLE9BQWQ7RUFDSCxDQUZELENBdFBpRCxDQXlQakQ7OztFQUNBK1QsYUFBYSxDQUFDaFUsU0FBZCxDQUF3QnlXLFdBQXhCLEdBQXNDLFVBQVVrQyxXQUFWLEVBQXVCQyxLQUF2QixFQUE4QjtJQUNoRSxJQUFJcEUsY0FBYyxHQUFHLEtBQUszRixTQUFMLENBQWVrQixPQUFwQztJQUNBLElBQUk4SSxXQUFXLEdBQUcsS0FBS3pFLGdCQUF2QixDQUZnRSxDQUdoRTs7SUFDQSxJQUFJeUUsV0FBVyxJQUFJQSxXQUFXLEtBQUtGLFdBQW5DLEVBQWdEO01BQzVDO01BQ0E7TUFDQSxJQUFJRSxXQUFXLEtBQUtyRSxjQUFwQixFQUFvQztRQUNoQ3FFLFdBQVcsQ0FBQy9GLFFBQVosQ0FBcUI7VUFDakJoSSxJQUFJLEVBQUUsZ0JBRFc7VUFFakI4TixLQUFLLEVBQUU7WUFDSC9DLGNBQWMsRUFBRStDLEtBQUssQ0FBQy9DLGNBRG5CO1lBRUhDLGFBQWEsRUFBRTdaLE1BQU0sQ0FBQzhaLHFCQUFQLEVBRlo7WUFHSEMsT0FBTyxFQUFFO1VBSE47UUFGVSxDQUFyQixFQURnQyxDQVNoQztNQUNILENBVkQsTUFXSztRQUNENkMsV0FBVyxDQUFDL0YsUUFBWixDQUFxQjtVQUFFaEksSUFBSSxFQUFFO1FBQVIsQ0FBckI7TUFDSDtJQUNKOztJQUNELElBQUk2TixXQUFKLEVBQWlCO01BQ2JBLFdBQVcsQ0FBQzdGLFFBQVosQ0FBcUI7UUFBRWhJLElBQUksRUFBRSxnQkFBUjtRQUEwQjhOLEtBQUssRUFBRUE7TUFBakMsQ0FBckI7SUFDSDtFQUNKLENBekJEOztFQTBCQTVFLGFBQWEsQ0FBQ2hVLFNBQWQsQ0FBd0JtWCxTQUF4QixHQUFvQyxZQUFZO0lBQzVDLElBQUkyQixlQUFlLEdBQUcsS0FBS2pLLFNBQUwsQ0FBZWtCLE9BQXJDO0lBQ0EsSUFBSXFFLGdCQUFnQixHQUFHLEtBQUtBLGdCQUE1Qjs7SUFDQSxJQUFJQSxnQkFBSixFQUFzQjtNQUNsQkEsZ0JBQWdCLENBQUN0QixRQUFqQixDQUEwQjtRQUFFaEksSUFBSSxFQUFFO01BQVIsQ0FBMUI7SUFDSCxDQUwyQyxDQU01Qzs7O0lBQ0EsSUFBSWdPLGVBQWUsS0FBSzFFLGdCQUF4QixFQUEwQztNQUN0QzBFLGVBQWUsQ0FBQ2hHLFFBQWhCLENBQXlCO1FBQUVoSSxJQUFJLEVBQUU7TUFBUixDQUF6QjtJQUNIO0VBQ0osQ0FWRDs7RUFXQWtKLGFBQWEsQ0FBQ2hVLFNBQWQsQ0FBd0I1QixPQUF4QixHQUFrQyxZQUFZO0lBQzFDLEtBQUs2VixVQUFMLEdBQWtCLElBQWxCO0lBQ0EsS0FBS2hYLFVBQUwsR0FBa0IsS0FBbEI7SUFDQSxLQUFLaVgsVUFBTCxHQUFrQixJQUFsQjtJQUNBLEtBQUtDLGNBQUwsR0FBc0IsSUFBdEI7SUFDQSxLQUFLQyxnQkFBTCxHQUF3QixJQUF4QjtJQUNBLEtBQUtDLGFBQUwsR0FBcUIsSUFBckI7SUFDQSxLQUFLQyxxQkFBTCxHQUE2QixJQUE3QjtFQUNILENBUkQsQ0EvUmlELENBd1NqRDtFQUNBOzs7RUFDQU4sYUFBYSxDQUFDd0UsUUFBZCxHQUF5QiwwQ0FBekI7RUFDQSxPQUFPeEUsYUFBUDtBQUNILENBNVNrQyxDQTRTakMvWCxNQUFNLENBQUM2VixXQTVTMEIsQ0FBbkM7O0FBNlNBLFNBQVNzRSxvQkFBVCxDQUE4QnBHLElBQTlCLEVBQW9DQyxJQUFwQyxFQUEwQzhJLFNBQTFDLEVBQXFEO0VBQ2pELElBQUl4RixTQUFTLEdBQUd2RCxJQUFJLENBQUNMLFFBQXJCO0VBQ0EsSUFBSTZELFNBQVMsR0FBR3ZELElBQUksQ0FBQ04sUUFBckI7RUFDQSxJQUFJcUosS0FBSyxHQUFHekYsU0FBUyxDQUFDM0QsS0FBVixDQUFnQm5PLEtBQTVCO0VBQ0EsSUFBSXdYLEtBQUssR0FBR3pGLFNBQVMsQ0FBQzVELEtBQVYsQ0FBZ0JuTyxLQUE1QjtFQUNBLElBQUl5WCxhQUFhLEdBQUcsRUFBcEI7O0VBQ0EsSUFBSTNGLFNBQVMsQ0FBQ3JDLE1BQVYsS0FBcUJzQyxTQUFTLENBQUN0QyxNQUFuQyxFQUEyQztJQUN2Q2dJLGFBQWEsQ0FBQ2hJLE1BQWQsR0FBdUJzQyxTQUFTLENBQUN0QyxNQUFqQztJQUNBZ0ksYUFBYSxDQUFDQyxNQUFkLEdBQXVCbEosSUFBSSxDQUFDRixPQUFMLENBQWFrQyxPQUFiLENBQXFCbUgsc0JBQTVDOztJQUNBLElBQUk1RixTQUFTLENBQUN0QyxNQUFkLEVBQXNCO01BQ2xCO01BQ0E7TUFDQThILEtBQUssR0FBRy9jLE1BQU0sQ0FBQ29kLFVBQVAsQ0FBa0JMLEtBQWxCLENBQVI7SUFDSDtFQUNKOztFQUNELElBQUloQixLQUFLLEdBQUcvYixNQUFNLENBQUNxZCxTQUFQLENBQWlCTixLQUFqQixFQUF3QkMsS0FBeEIsRUFBK0JqSixJQUFJLENBQUNELE9BQUwsQ0FBYVksT0FBNUMsRUFBcURYLElBQUksQ0FBQ0YsV0FBTCxLQUFxQkcsSUFBSSxDQUFDSCxXQUExQixHQUM3REUsSUFBSSxDQUFDdUosU0FEd0QsR0FFN0QsSUFGUSxDQUFaOztFQUdBLElBQUl2QixLQUFLLENBQUN3QixZQUFWLEVBQXdCO0lBQUU7SUFDdEJOLGFBQWEsQ0FBQ2hJLE1BQWQsR0FBdUIsS0FBdkI7RUFDSDs7RUFDRCxJQUFJeUUsUUFBUSxHQUFHO0lBQ1hzQyxVQUFVLEVBQUVELEtBREQ7SUFFWGtCLGFBQWEsRUFBRUE7RUFGSixDQUFmOztFQUlBLEtBQUssSUFBSXJSLEVBQUUsR0FBRyxDQUFULEVBQVk0UixXQUFXLEdBQUdWLFNBQS9CLEVBQTBDbFIsRUFBRSxHQUFHNFIsV0FBVyxDQUFDL1ksTUFBM0QsRUFBbUVtSCxFQUFFLEVBQXJFLEVBQXlFO0lBQ3JFLElBQUk2UixRQUFRLEdBQUdELFdBQVcsQ0FBQzVSLEVBQUQsQ0FBMUI7SUFDQTZSLFFBQVEsQ0FBQy9ELFFBQUQsRUFBVzNGLElBQVgsRUFBaUJDLElBQWpCLENBQVI7RUFDSDs7RUFDRCxPQUFPMEYsUUFBUDtBQUNIOztBQUNELFNBQVNULHNCQUFULENBQWdDckcsU0FBaEMsRUFBMkM7RUFDdkMsSUFBSW9ELE9BQU8sR0FBR3BELFNBQVMsQ0FBQ2tCLE9BQVYsQ0FBa0JrQyxPQUFoQztFQUNBLElBQUlwSSxLQUFLLEdBQUdvSSxPQUFPLENBQUMwSCxtQkFBcEI7O0VBQ0EsSUFBSTlQLEtBQUssSUFBSSxJQUFiLEVBQW1CO0lBQ2ZBLEtBQUssR0FBR29JLE9BQU8sQ0FBQ3FCLGNBQWhCO0VBQ0g7O0VBQ0QsT0FBT3pKLEtBQVA7QUFDSDs7QUFFRCxJQUFJK1AsYUFBYTtBQUFHO0FBQWUsVUFBVS9WLE1BQVYsRUFBa0I7RUFDakQxSCxLQUFLLENBQUMySCxTQUFOLENBQWdCOFYsYUFBaEIsRUFBK0IvVixNQUEvQjs7RUFDQSxTQUFTK1YsYUFBVCxDQUF1QnhJLFFBQXZCLEVBQWlDO0lBQzdCLElBQUl6VSxLQUFLLEdBQUdrSCxNQUFNLENBQUNJLElBQVAsQ0FBWSxJQUFaLEVBQWtCbU4sUUFBbEIsS0FBK0IsSUFBM0MsQ0FENkIsQ0FFN0I7OztJQUNBelUsS0FBSyxDQUFDa2QsYUFBTixHQUFzQixJQUF0QjtJQUNBbGQsS0FBSyxDQUFDbWQsV0FBTixHQUFvQixJQUFwQixDQUo2QixDQUlIOztJQUMxQm5kLEtBQUssQ0FBQ3VYLFVBQU4sR0FBbUIsSUFBbkI7SUFDQXZYLEtBQUssQ0FBQ3dYLGNBQU4sR0FBdUIsSUFBdkI7SUFDQXhYLEtBQUssQ0FBQzBYLGFBQU4sR0FBc0IsSUFBdEI7SUFDQTFYLEtBQUssQ0FBQzJYLHFCQUFOLEdBQThCLElBQTlCOztJQUNBM1gsS0FBSyxDQUFDeVEsaUJBQU4sR0FBMEIsVUFBVS9QLEVBQVYsRUFBYztNQUNwQyxJQUFJd1IsU0FBUyxHQUFHbFMsS0FBSyxDQUFDa1MsU0FBdEI7O01BQ0EsSUFBSWtMLEtBQUssR0FBR3BkLEtBQUssQ0FBQ3FkLFVBQU4sQ0FBaUIzYyxFQUFqQixDQUFaOztNQUNBLElBQUk0YyxHQUFHLEdBQUdoZSxNQUFNLENBQUN3WSxRQUFQLENBQWdCc0YsS0FBaEIsQ0FBVjtNQUNBLElBQUk3RixVQUFVLEdBQUd2WCxLQUFLLENBQUN1WCxVQUFOLEdBQW1CK0YsR0FBRyxDQUFDL0YsVUFBeEM7TUFDQXZYLEtBQUssQ0FBQ2tRLFFBQU4sQ0FBZS9DLFdBQWYsR0FBNkIrRSxTQUFTLENBQUNrQixPQUFWLENBQWtCa0MsT0FBbEIsQ0FBMEIrQyxvQkFBdkQsQ0FMb0MsQ0FNcEM7O01BQ0FyWSxLQUFLLENBQUNrUSxRQUFOLENBQWVuQixhQUFmLENBQTZCLENBQUMvTyxLQUFLLENBQUNrUyxTQUFOLENBQWdCeUcsZ0JBQWhCLENBQWlDalksRUFBRSxDQUFDa0MsU0FBSCxDQUFhZixNQUE5QyxDQUFELElBQ3hCbkIsRUFBRSxDQUFDbUMsT0FBSCxJQUFjN0MsS0FBSyxDQUFDa1MsU0FBTixDQUFnQndCLEtBQWhCLENBQXNCNEUsY0FBdEIsS0FBeUNmLFVBQVUsQ0FBQ1MsUUFBWCxDQUFvQkMsVUFEaEY7SUFFSCxDQVREOztJQVVBalksS0FBSyxDQUFDNFEsZUFBTixHQUF3QixVQUFVbFEsRUFBVixFQUFjO01BQ2xDLElBQUkwUyxPQUFPLEdBQUdwVCxLQUFLLENBQUNrUyxTQUFOLENBQWdCa0IsT0FBOUI7TUFDQSxJQUFJbUUsVUFBVSxHQUFHdlgsS0FBSyxDQUFDdVgsVUFBdkI7TUFDQXZYLEtBQUssQ0FBQ3dYLGNBQU4sR0FBdUJsWSxNQUFNLENBQUM0WSxpQkFBUCxDQUF5QjlFLE9BQU8sQ0FBQytFLGNBQVIsR0FBeUJDLFVBQWxELEVBQThEcFksS0FBSyxDQUFDdVgsVUFBTixDQUFpQlMsUUFBakIsQ0FBMEJDLFVBQXhGLENBQXZCOztNQUNBLElBQUltRixLQUFLLEdBQUdwZCxLQUFLLENBQUNxZCxVQUFOLENBQWlCM2MsRUFBakIsQ0FBWjs7TUFDQVYsS0FBSyxDQUFDa2QsYUFBTixHQUFzQkUsS0FBdEI7TUFDQXBkLEtBQUssQ0FBQ21kLFdBQU4sR0FBb0I3ZCxNQUFNLENBQUN3WSxRQUFQLENBQWdCc0YsS0FBaEIsQ0FBcEI7TUFDQWhLLE9BQU8sQ0FBQzZCLFdBQVIsQ0FBb0JTLFFBQXBCO01BQ0F0QyxPQUFPLENBQUNwUyxPQUFSLENBQWdCQyxPQUFoQixDQUF3QixrQkFBeEIsRUFBNEM7UUFDeENpSSxFQUFFLEVBQUVrVSxLQURvQztRQUV4Q3ZFLEtBQUssRUFBRSxJQUFJdlosTUFBTSxDQUFDd1osUUFBWCxDQUFvQjFGLE9BQXBCLEVBQTZCbUUsVUFBVSxDQUFDd0IsR0FBeEMsRUFBNkN4QixVQUFVLENBQUNTLFFBQXhELENBRmlDO1FBR3hDbEQsT0FBTyxFQUFFcFUsRUFBRSxDQUFDa0MsU0FINEI7UUFJeENtUyxJQUFJLEVBQUUzQixPQUFPLENBQUM0QjtNQUowQixDQUE1QztJQU1ILENBZEQ7O0lBZUFoVixLQUFLLENBQUMyVixlQUFOLEdBQXdCLFVBQVU5RCxHQUFWLEVBQWUrRCxPQUFmLEVBQXdCbFYsRUFBeEIsRUFBNEI7TUFDaEQsSUFBSTBTLE9BQU8sR0FBR3BULEtBQUssQ0FBQ2tTLFNBQU4sQ0FBZ0JrQixPQUE5QjtNQUNBLElBQUlvRSxjQUFjLEdBQUd4WCxLQUFLLENBQUN3WCxjQUEzQjtNQUNBLElBQUlsSCxVQUFVLEdBQUd0USxLQUFLLENBQUMyVSxXQUFOLENBQWtCckUsVUFBbkM7TUFDQSxJQUFJOEosYUFBYSxHQUFHcGEsS0FBSyxDQUFDdVgsVUFBTixDQUFpQlMsUUFBckM7TUFDQSxJQUFJZ0IsUUFBUSxHQUFHLElBQWY7TUFDQSxJQUFJckIscUJBQXFCLEdBQUcsSUFBNUI7TUFDQSxJQUFJOUIsU0FBUyxHQUFHLEtBQWhCO01BQ0EsSUFBSW9ELFdBQVcsR0FBRztRQUNkQyxjQUFjLEVBQUUxQixjQURGO1FBRWQyQixhQUFhLEVBQUU3WixNQUFNLENBQUM4WixxQkFBUCxFQUZEO1FBR2RDLE9BQU8sRUFBRTtNQUhLLENBQWxCOztNQUtBLElBQUl4SCxHQUFKLEVBQVM7UUFDTCxJQUFJaUUsVUFBVSxHQUFHakUsR0FBRyxDQUFDc0IsV0FBSixLQUFvQjdDLFVBQVUsQ0FBQzZDLFdBQS9CLElBQ1ZuVCxLQUFLLENBQUMrVixpQkFESSxJQUVWLENBQUMvVixLQUFLLENBQUMrVixpQkFBTixDQUF3QnpGLFVBQXhCLEVBQW9DdUIsR0FBcEMsQ0FGUjs7UUFHQSxJQUFJLENBQUNpRSxVQUFMLEVBQWlCO1VBQ2JrRCxRQUFRLEdBQUd1RSxlQUFlLENBQUNqTixVQUFELEVBQWF1QixHQUFiLEVBQWtCblIsRUFBRSxDQUFDVCxTQUFILENBQWFxRyxTQUFiLENBQXVCc1MsUUFBdkIsQ0FBZ0Msd0JBQWhDLENBQWxCLEVBQTZFd0IsYUFBYSxDQUFDbkgsS0FBM0YsQ0FBMUI7UUFDSDtNQUNKOztNQUNELElBQUkrRixRQUFKLEVBQWM7UUFDVnJCLHFCQUFxQixHQUFHclksTUFBTSxDQUFDcWEseUJBQVAsQ0FBaUNuQyxjQUFqQyxFQUFpRHBFLE9BQU8sQ0FBQytFLGNBQVIsR0FBeUJ5QixZQUExRSxFQUF3RlosUUFBeEYsRUFBa0c1RixPQUFsRyxDQUF4QjtRQUNBNkYsV0FBVyxDQUFDRSxhQUFaLEdBQTRCeEIscUJBQTVCOztRQUNBLElBQUksQ0FBQ3JZLE1BQU0sQ0FBQ3VhLGtCQUFQLENBQTBCWixXQUExQixFQUF1Q3BILEdBQUcsQ0FBQ2lCLFdBQTNDLEVBQXdETSxPQUF4RCxDQUFMLEVBQXVFO1VBQ25FeUMsU0FBUyxHQUFHLElBQVo7VUFDQW1ELFFBQVEsR0FBRyxJQUFYO1VBQ0FyQixxQkFBcUIsR0FBRyxJQUF4QjtVQUNBc0IsV0FBVyxDQUFDRSxhQUFaLEdBQTRCLElBQTVCO1FBQ0g7TUFDSjs7TUFDRCxJQUFJeEIscUJBQUosRUFBMkI7UUFDdkJ2RSxPQUFPLENBQUMrQyxRQUFSLENBQWlCO1VBQ2JoSSxJQUFJLEVBQUUsa0JBRE87VUFFYjhOLEtBQUssRUFBRWhEO1FBRk0sQ0FBakI7TUFJSCxDQUxELE1BTUs7UUFDRDdGLE9BQU8sQ0FBQytDLFFBQVIsQ0FBaUI7VUFBRWhJLElBQUksRUFBRTtRQUFSLENBQWpCO01BQ0g7O01BQ0QsSUFBSSxDQUFDMEgsU0FBTCxFQUFnQjtRQUNadlcsTUFBTSxDQUFDK1csWUFBUDtNQUNILENBRkQsTUFHSztRQUNEL1csTUFBTSxDQUFDZ1gsYUFBUDtNQUNIOztNQUNELElBQUksQ0FBQ1YsT0FBTCxFQUFjO1FBQ1YsSUFBSW9ELFFBQVEsSUFBSWxILFdBQVcsQ0FBQ3hCLFVBQUQsRUFBYXVCLEdBQWIsQ0FBM0IsRUFBOEM7VUFDMUNtSCxRQUFRLEdBQUcsSUFBWDtRQUNIOztRQUNEaFosS0FBSyxDQUFDMFgsYUFBTixHQUFzQnNCLFFBQXRCO1FBQ0FoWixLQUFLLENBQUMyWCxxQkFBTixHQUE4QkEscUJBQTlCO01BQ0g7SUFDSixDQXJERDs7SUFzREEzWCxLQUFLLENBQUNnUixhQUFOLEdBQXNCLFVBQVV0USxFQUFWLEVBQWM7TUFDaEMsSUFBSTBTLE9BQU8sR0FBR3BULEtBQUssQ0FBQ2tTLFNBQU4sQ0FBZ0JrQixPQUE5QjtNQUNBLElBQUkrRyxRQUFRLEdBQUduYSxLQUFLLENBQUN1WCxVQUFOLENBQWlCd0IsR0FBaEM7TUFDQSxJQUFJcUIsYUFBYSxHQUFHcGEsS0FBSyxDQUFDdVgsVUFBTixDQUFpQlMsUUFBckM7TUFDQSxJQUFJcUMsUUFBUSxHQUFHLElBQUkvYSxNQUFNLENBQUN3WixRQUFYLENBQW9CMUYsT0FBcEIsRUFBNkIrRyxRQUE3QixFQUF1Q0MsYUFBdkMsQ0FBZjtNQUNBLElBQUk1QyxjQUFjLEdBQUd4WCxLQUFLLENBQUN3WCxjQUEzQjtNQUNBLElBQUlHLHFCQUFxQixHQUFHM1gsS0FBSyxDQUFDMlgscUJBQWxDO01BQ0F2RSxPQUFPLENBQUNwUyxPQUFSLENBQWdCQyxPQUFoQixDQUF3QixpQkFBeEIsRUFBMkM7UUFDdkNpSSxFQUFFLEVBQUVsSixLQUFLLENBQUNrZCxhQUQ2QjtRQUV2Q3JFLEtBQUssRUFBRXdCLFFBRmdDO1FBR3ZDdkYsT0FBTyxFQUFFcFUsRUFBRSxDQUFDa0MsU0FIMkI7UUFJdkNtUyxJQUFJLEVBQUUzQixPQUFPLENBQUM0QjtNQUp5QixDQUEzQzs7TUFNQSxJQUFJaFYsS0FBSyxDQUFDMFgsYUFBVixFQUF5QjtRQUNyQixJQUFJK0MsZUFBZSxHQUFHLElBQUluYixNQUFNLENBQUN3WixRQUFYLENBQW9CMUYsT0FBcEIsRUFBNkJ1RSxxQkFBcUIsQ0FBQytDLElBQXRCLENBQTJCUCxRQUFRLENBQUNRLEtBQXBDLENBQTdCLEVBQXlFUCxhQUFhLEdBQUd6QyxxQkFBcUIsQ0FBQ2lELFNBQXRCLENBQWdDUixhQUFhLENBQUNuQyxVQUE5QyxDQUFILEdBQStELElBQXJKLENBQXRCO1FBQ0E3RSxPQUFPLENBQUMrQyxRQUFSLENBQWlCO1VBQ2JoSSxJQUFJLEVBQUUsY0FETztVQUViaUssVUFBVSxFQUFFVDtRQUZDLENBQWpCO1FBSUEsSUFBSWtELGNBQWMsR0FBRztVQUNqQkMsUUFBUSxFQUFFVCxRQURPO1VBRWpCeEIsS0FBSyxFQUFFNEIsZUFGVTtVQUdqQk0sYUFBYSxFQUFFemIsTUFBTSxDQUFDMGIsY0FBUCxDQUFzQnJELHFCQUF0QixFQUE2Q3ZFLE9BQTdDLEVBQXNEZ0gsYUFBdEQsQ0FIRTtVQUlqQmEsTUFBTSxFQUFFLGtCQUFZO1lBQ2hCN0gsT0FBTyxDQUFDK0MsUUFBUixDQUFpQjtjQUNiaEksSUFBSSxFQUFFLGNBRE87Y0FFYmlLLFVBQVUsRUFBRVosY0FGQyxDQUVlOztZQUZmLENBQWpCO1VBSUg7UUFUZ0IsQ0FBckI7UUFXQXBFLE9BQU8sQ0FBQ3BTLE9BQVIsQ0FBZ0JDLE9BQWhCLENBQXdCLGFBQXhCLEVBQXVDekIsS0FBSyxDQUFDc1UsUUFBTixDQUFldFUsS0FBSyxDQUFDc1UsUUFBTixDQUFlLEVBQWYsRUFBbUIrRyxjQUFuQixDQUFmLEVBQW1EO1VBQUUzUixFQUFFLEVBQUVsSixLQUFLLENBQUNrZCxhQUFaO1VBQTJCTSxVQUFVLEVBQUV4ZCxLQUFLLENBQUMwWCxhQUFOLENBQW9COEYsVUFBcEIsSUFBa0NsZSxNQUFNLENBQUNtZSxjQUFQLENBQXNCLENBQXRCLENBQXpFO1VBQW1HQyxRQUFRLEVBQUUxZCxLQUFLLENBQUMwWCxhQUFOLENBQW9CZ0csUUFBcEIsSUFBZ0NwZSxNQUFNLENBQUNtZSxjQUFQLENBQXNCLENBQXRCLENBQTdJO1VBQXVLM0ksT0FBTyxFQUFFcFUsRUFBRSxDQUFDa0MsU0FBbkw7VUFBOExtUyxJQUFJLEVBQUUzQixPQUFPLENBQUM0QjtRQUE1TSxDQUFuRCxDQUF2QztRQUNBNUIsT0FBTyxDQUFDcFMsT0FBUixDQUFnQkMsT0FBaEIsQ0FBd0IsYUFBeEIsRUFBdUM0WixjQUF2QztNQUNILENBbkJELE1Bb0JLO1FBQ0R6SCxPQUFPLENBQUNwUyxPQUFSLENBQWdCQyxPQUFoQixDQUF3QixnQkFBeEI7TUFDSCxDQW5DK0IsQ0FvQ2hDOzs7TUFDQWpCLEtBQUssQ0FBQ21kLFdBQU4sR0FBb0IsSUFBcEI7TUFDQW5kLEtBQUssQ0FBQ3dYLGNBQU4sR0FBdUIsSUFBdkI7TUFDQXhYLEtBQUssQ0FBQzBYLGFBQU4sR0FBc0IsSUFBdEIsQ0F2Q2dDLENBd0NoQztJQUNILENBekNEOztJQTBDQSxJQUFJeEYsU0FBUyxHQUFHdUMsUUFBUSxDQUFDdkMsU0FBekI7SUFDQSxJQUFJaEMsUUFBUSxHQUFHbFEsS0FBSyxDQUFDa1EsUUFBTixHQUFpQixJQUFJakQseUJBQUosQ0FBOEJ3SCxRQUFRLENBQUN2TCxFQUF2QyxDQUFoQztJQUNBZ0gsUUFBUSxDQUFDckMsT0FBVCxDQUFpQjNOLFFBQWpCLEdBQTRCLG1CQUE1QjtJQUNBZ1EsUUFBUSxDQUFDOUMsa0JBQVQsR0FBOEIsS0FBOUI7SUFDQThDLFFBQVEsQ0FBQzlCLFlBQVQsQ0FBc0J4RSxTQUF0QixHQUFrQ3NJLFNBQVMsQ0FBQ2tCLE9BQVYsQ0FBa0JrQyxPQUFsQixDQUEwQm1CLFVBQTVEO0lBQ0EsSUFBSTlCLFdBQVcsR0FBRzNVLEtBQUssQ0FBQzJVLFdBQU4sR0FBb0IsSUFBSTFFLFdBQUosQ0FBZ0JqUSxLQUFLLENBQUNrUSxRQUF0QixFQUFnQzVRLE1BQU0sQ0FBQzRWLDBCQUFQLENBQWtDVCxRQUFsQyxDQUFoQyxDQUF0QztJQUNBRSxXQUFXLENBQUMzVCxPQUFaLENBQW9CME4sRUFBcEIsQ0FBdUIsYUFBdkIsRUFBc0MxTyxLQUFLLENBQUN5USxpQkFBNUM7SUFDQWtFLFdBQVcsQ0FBQzNULE9BQVosQ0FBb0IwTixFQUFwQixDQUF1QixXQUF2QixFQUFvQzFPLEtBQUssQ0FBQzRRLGVBQTFDO0lBQ0ErRCxXQUFXLENBQUMzVCxPQUFaLENBQW9CME4sRUFBcEIsQ0FBdUIsV0FBdkIsRUFBb0MxTyxLQUFLLENBQUMyVixlQUExQztJQUNBaEIsV0FBVyxDQUFDM1QsT0FBWixDQUFvQjBOLEVBQXBCLENBQXVCLFNBQXZCLEVBQWtDMU8sS0FBSyxDQUFDZ1IsYUFBeEM7SUFDQSxPQUFPaFIsS0FBUDtFQUNIOztFQUNEaWQsYUFBYSxDQUFDNVosU0FBZCxDQUF3QkMsT0FBeEIsR0FBa0MsWUFBWTtJQUMxQyxLQUFLNE0sUUFBTCxDQUFjNU0sT0FBZDtFQUNILENBRkQ7O0VBR0EyWixhQUFhLENBQUM1WixTQUFkLENBQXdCZ2EsVUFBeEIsR0FBcUMsVUFBVTNjLEVBQVYsRUFBYztJQUMvQyxPQUFPcEIsTUFBTSxDQUFDb0UsY0FBUCxDQUFzQmhELEVBQUUsQ0FBQ1QsU0FBekIsRUFBb0MsV0FBcEMsQ0FBUDtFQUNILENBRkQ7O0VBR0EsT0FBT2dkLGFBQVA7QUFDSCxDQXZKa0MsQ0F1SmpDM2QsTUFBTSxDQUFDNlYsV0F2SjBCLENBQW5DOztBQXdKQSxTQUFTb0ksZUFBVCxDQUF5QmxLLElBQXpCLEVBQStCQyxJQUEvQixFQUFxQ3FLLFdBQXJDLEVBQWtEQyxhQUFsRCxFQUFpRTtFQUM3RCxJQUFJNUosT0FBTyxHQUFHWCxJQUFJLENBQUNELE9BQUwsQ0FBYVksT0FBM0I7RUFDQSxJQUFJcUksS0FBSyxHQUFHaEosSUFBSSxDQUFDTCxRQUFMLENBQWNDLEtBQWQsQ0FBb0JuTyxLQUFoQztFQUNBLElBQUl3WCxLQUFLLEdBQUdoSixJQUFJLENBQUNOLFFBQUwsQ0FBY0MsS0FBZCxDQUFvQm5PLEtBQWhDO0VBQ0EsSUFBSXVXLEtBQUssR0FBRy9iLE1BQU0sQ0FBQ3FkLFNBQVAsQ0FBaUJOLEtBQWpCLEVBQXdCQyxLQUF4QixFQUErQnRJLE9BQS9CLEVBQXdDWCxJQUFJLENBQUN1SixTQUE3QyxDQUFaOztFQUNBLElBQUllLFdBQUosRUFBaUI7SUFDYixJQUFJM0osT0FBTyxDQUFDek4sR0FBUixDQUFZcVgsYUFBYSxDQUFDOVksS0FBMUIsRUFBaUN1VyxLQUFqQyxJQUEwQ3VDLGFBQWEsQ0FBQzdHLEdBQTVELEVBQWlFO01BQzdELE9BQU87UUFBRXlHLFVBQVUsRUFBRW5DO01BQWQsQ0FBUDtJQUNIO0VBQ0osQ0FKRCxNQUtLLElBQUlySCxPQUFPLENBQUN6TixHQUFSLENBQVlxWCxhQUFhLENBQUM3RyxHQUExQixFQUErQnNFLEtBQS9CLElBQXdDdUMsYUFBYSxDQUFDOVksS0FBMUQsRUFBaUU7SUFDbEUsT0FBTztNQUFFNFksUUFBUSxFQUFFckM7SUFBWixDQUFQO0VBQ0g7O0VBQ0QsT0FBTyxJQUFQO0FBQ0g7O0FBRUQsSUFBSXdDLFlBQVk7QUFBRztBQUFlLFlBQVk7RUFDMUMsU0FBU0EsWUFBVCxDQUFzQnpLLE9BQXRCLEVBQStCO0lBQzNCLElBQUlwVCxLQUFLLEdBQUcsSUFBWjs7SUFDQSxLQUFLb1QsT0FBTCxHQUFlQSxPQUFmO0lBQ0EsS0FBSzBLLHlCQUFMLEdBQWlDLEtBQWpDLENBSDJCLENBR2E7O0lBQ3hDLEtBQUtDLGFBQUwsR0FBcUIsS0FBckI7SUFDQSxLQUFLQyxZQUFMLEdBQW9CLEtBQXBCOztJQUNBLEtBQUtDLFFBQUwsR0FBZ0IsVUFBVUMsVUFBVixFQUFzQjtNQUNsQyxJQUFJQSxVQUFVLENBQUNwSixPQUFmLEVBQXdCO1FBQ3BCOVUsS0FBSyxDQUFDOGQseUJBQU4sR0FBa0MsSUFBbEM7TUFDSDtJQUNKLENBSkQ7O0lBS0EsS0FBS0sscUJBQUwsR0FBNkIsVUFBVXJkLEdBQVYsRUFBZTtNQUN4QyxJQUFJc2QsY0FBYyxHQUFHcGUsS0FBSyxDQUFDb1QsT0FBTixDQUFja0MsT0FBZCxDQUFzQjhJLGNBQTNDO01BQ0EsSUFBSTNhLE1BQU0sR0FBR25FLE1BQU0sQ0FBQytlLHFCQUFQLENBQTZCdmQsR0FBRyxDQUFDOEIsU0FBakMsQ0FBYjtNQUNBNUMsS0FBSyxDQUFDK2QsYUFBTixHQUFzQixDQUFDLENBQUN6ZSxNQUFNLENBQUNvRSxjQUFQLENBQXNCRCxNQUF0QixFQUE4QjJhLGNBQTlCLENBQXhCO01BQ0FwZSxLQUFLLENBQUNnZSxZQUFOLEdBQXFCLENBQUMsQ0FBQzFlLE1BQU0sQ0FBQ29FLGNBQVAsQ0FBc0JELE1BQXRCLEVBQThCNFQsYUFBYSxDQUFDd0UsUUFBNUMsQ0FBdkIsQ0FKd0MsQ0FJc0M7SUFDakYsQ0FMRDs7SUFNQSxLQUFLeUMsbUJBQUwsR0FBMkIsVUFBVXhkLEdBQVYsRUFBZTtNQUN0QyxJQUFJc1MsT0FBTyxHQUFHcFQsS0FBSyxDQUFDb1QsT0FBcEI7TUFDQSxJQUFJbUwsZUFBZSxHQUFHdmUsS0FBSyxDQUFDdWUsZUFBNUI7TUFDQSxJQUFJQyxhQUFhLEdBQUdwTCxPQUFPLENBQUMrRSxjQUFSLEVBQXBCLENBSHNDLENBSXRDOztNQUNBLElBQUksQ0FBQ29HLGVBQWUsQ0FBQy9kLGNBQXJCLEVBQXFDO1FBQ2pDLElBQUlnZSxhQUFhLENBQUNDLGFBQWQsSUFBK0I7UUFDL0IsQ0FBQ3plLEtBQUssQ0FBQzhkLHlCQURYLENBQ3FDO1FBRHJDLEVBRUU7VUFDRSxJQUFJWSxZQUFZLEdBQUd0TCxPQUFPLENBQUNrQyxPQUFSLENBQWdCb0osWUFBbkM7O1VBQ0EsSUFBSUEsWUFBWSxLQUFLLENBQUNBLFlBQUQsSUFBaUIsQ0FBQzFlLEtBQUssQ0FBQytkLGFBQTdCLENBQWhCLEVBQTZEO1lBQ3pEM0ssT0FBTyxDQUFDNkIsV0FBUixDQUFvQlMsUUFBcEIsQ0FBNkI1VSxHQUE3QjtVQUNIO1FBQ0o7O1FBQ0QsSUFBSTBkLGFBQWEsQ0FBQ2xHLGNBQWQsSUFBZ0M7UUFDaEMsQ0FBQ3RZLEtBQUssQ0FBQ2dlLFlBRFgsQ0FDd0I7UUFEeEIsRUFFRTtVQUNFNUssT0FBTyxDQUFDK0MsUUFBUixDQUFpQjtZQUFFaEksSUFBSSxFQUFFO1VBQVIsQ0FBakI7UUFDSDtNQUNKOztNQUNEbk8sS0FBSyxDQUFDOGQseUJBQU4sR0FBa0MsS0FBbEM7SUFDSCxDQXJCRDs7SUFzQkEsSUFBSVMsZUFBZSxHQUFHLEtBQUtBLGVBQUwsR0FBdUIsSUFBSXplLGVBQUosQ0FBb0JxQixRQUFwQixDQUE3QztJQUNBb2QsZUFBZSxDQUFDbmUsZ0JBQWhCLEdBQW1DLElBQW5DO0lBQ0FtZSxlQUFlLENBQUNsZSxpQkFBaEIsR0FBb0MsS0FBcEM7SUFDQWtlLGVBQWUsQ0FBQ3ZkLE9BQWhCLENBQXdCME4sRUFBeEIsQ0FBMkIsYUFBM0IsRUFBMEMsS0FBS3lQLHFCQUEvQztJQUNBSSxlQUFlLENBQUN2ZCxPQUFoQixDQUF3QjBOLEVBQXhCLENBQTJCLFdBQTNCLEVBQXdDLEtBQUs0UCxtQkFBN0M7SUFDQTtBQUNSO0FBQ0E7O0lBQ1FsTCxPQUFPLENBQUNwUyxPQUFSLENBQWdCME4sRUFBaEIsQ0FBbUIsUUFBbkIsRUFBNkIsS0FBS3VQLFFBQWxDO0VBQ0g7O0VBQ0RKLFlBQVksQ0FBQ3hhLFNBQWIsQ0FBdUJDLE9BQXZCLEdBQWlDLFlBQVk7SUFDekMsS0FBSzhQLE9BQUwsQ0FBYXBTLE9BQWIsQ0FBcUIyZCxHQUFyQixDQUF5QixRQUF6QixFQUFtQyxLQUFLVixRQUF4QztJQUNBLEtBQUtNLGVBQUwsQ0FBcUJqYixPQUFyQjtFQUNILENBSEQ7O0VBSUEsT0FBT3VhLFlBQVA7QUFDSCxDQXZEaUMsRUFBbEM7O0FBeURBLElBQUllLGVBQWUsR0FBRztFQUNsQnBHLGlCQUFpQixFQUFFbFosTUFBTSxDQUFDdWY7QUFEUixDQUF0QjtBQUdBLElBQUlDLGlCQUFpQixHQUFHO0VBQ3BCQyxTQUFTLEVBQUV6ZixNQUFNLENBQUN1ZixRQURFO0VBRXBCRyxjQUFjLEVBQUUxZixNQUFNLENBQUN1ZixRQUZIO0VBR3BCSSxhQUFhLEVBQUUzZixNQUFNLENBQUN1ZixRQUhGO0VBSXBCSyxTQUFTLEVBQUU1ZixNQUFNLENBQUN1ZixRQUpFO0VBS3BCTSxnQkFBZ0IsRUFBRTdmLE1BQU0sQ0FBQ3VmLFFBTEw7RUFNcEJPLGVBQWUsRUFBRTlmLE1BQU0sQ0FBQ3VmLFFBTko7RUFPcEJRLFdBQVcsRUFBRS9mLE1BQU0sQ0FBQ3VmLFFBUEE7RUFRcEJTLElBQUksRUFBRWhnQixNQUFNLENBQUN1ZixRQVJPO0VBU3BCVSxZQUFZLEVBQUVqZ0IsTUFBTSxDQUFDdWYsUUFURDtFQVVwQlcsVUFBVSxFQUFFbGdCLE1BQU0sQ0FBQ3VmO0FBVkMsQ0FBeEI7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLElBQUlZLHVCQUF1QjtBQUFHO0FBQWUsWUFBWTtFQUNyRCxTQUFTQSx1QkFBVCxDQUFpQ3ZQLFFBQWpDLEVBQTJDd1AsZ0JBQTNDLEVBQTZEO0lBQ3pELElBQUkxZixLQUFLLEdBQUcsSUFBWjs7SUFDQSxLQUFLeVgsZ0JBQUwsR0FBd0IsSUFBeEI7SUFDQSxLQUFLa0ksY0FBTCxHQUFzQixJQUF0QixDQUh5RCxDQUc3Qjs7SUFDNUIsS0FBS0QsZ0JBQUwsR0FBd0IsSUFBeEI7SUFDQSxLQUFLRSxRQUFMLEdBQWdCLElBQWhCOztJQUNBLEtBQUtoUCxlQUFMLEdBQXVCLFVBQVVsUSxFQUFWLEVBQWM7TUFDakNWLEtBQUssQ0FBQzRmLFFBQU4sR0FBaUI1ZixLQUFLLENBQUM2ZixhQUFOLENBQW9CbmYsRUFBRSxDQUFDVCxTQUF2QixDQUFqQjtJQUNILENBRkQ7O0lBR0EsS0FBSzBWLGVBQUwsR0FBdUIsVUFBVTlELEdBQVYsRUFBZStELE9BQWYsRUFBd0JsVixFQUF4QixFQUE0QjtNQUMvQyxJQUFJd1AsUUFBUSxHQUFHbFEsS0FBSyxDQUFDMlUsV0FBTixDQUFrQnpFLFFBQWpDO01BQ0EsSUFBSXVILGdCQUFnQixHQUFHLElBQXZCO01BQ0EsSUFBSWtJLGNBQWMsR0FBRyxJQUFyQjtNQUNBLElBQUk5SixTQUFTLEdBQUcsS0FBaEI7TUFDQSxJQUFJb0QsV0FBVyxHQUFHO1FBQ2RDLGNBQWMsRUFBRTVaLE1BQU0sQ0FBQzhaLHFCQUFQLEVBREY7UUFFZEQsYUFBYSxFQUFFN1osTUFBTSxDQUFDOFoscUJBQVAsRUFGRDtRQUdkQyxPQUFPLEVBQUVyWixLQUFLLENBQUM0ZixRQUFOLENBQWVFO01BSFYsQ0FBbEI7O01BS0EsSUFBSWpPLEdBQUosRUFBUztRQUNMNEYsZ0JBQWdCLEdBQUc1RixHQUFHLENBQUN1QixPQUF2Qjs7UUFDQSxJQUFJcFQsS0FBSyxDQUFDK2YsbUJBQU4sQ0FBMEJyZixFQUFFLENBQUNULFNBQTdCLEVBQXdDd1gsZ0JBQXhDLENBQUosRUFBK0Q7VUFDM0RrSSxjQUFjLEdBQUdLLHVCQUF1QixDQUFDbk8sR0FBRyxDQUFDbUIsUUFBTCxFQUFlaFQsS0FBSyxDQUFDNGYsUUFBckIsRUFBK0JuSSxnQkFBL0IsQ0FBeEM7VUFDQXdCLFdBQVcsQ0FBQ0UsYUFBWixHQUE0QjdaLE1BQU0sQ0FBQzJnQixpQkFBUCxDQUF5Qk4sY0FBekIsQ0FBNUI7VUFDQTlKLFNBQVMsR0FBRyxDQUFDdlcsTUFBTSxDQUFDdWEsa0JBQVAsQ0FBMEJaLFdBQTFCLEVBQXVDcEgsR0FBRyxDQUFDaUIsV0FBM0MsRUFBd0QyRSxnQkFBeEQsQ0FBYjs7VUFDQSxJQUFJNUIsU0FBSixFQUFlO1lBQ1hvRCxXQUFXLENBQUNFLGFBQVosR0FBNEI3WixNQUFNLENBQUM4WixxQkFBUCxFQUE1QjtZQUNBdUcsY0FBYyxHQUFHLElBQWpCO1VBQ0g7UUFDSjtNQUNKOztNQUNEM2YsS0FBSyxDQUFDOFosV0FBTixDQUFrQnJDLGdCQUFsQixFQUFvQ3dCLFdBQXBDLEVBdEIrQyxDQXVCL0M7TUFDQTs7O01BQ0EvSSxRQUFRLENBQUNsQixrQkFBVCxDQUE0QjRHLE9BQU8sSUFBSSxDQUFDK0osY0FBWixJQUE4QixDQUFDeGUsUUFBUSxDQUFDNFksYUFBVCxDQUF1QixrQkFBdkIsQ0FBM0Q7O01BQ0EsSUFBSSxDQUFDbEUsU0FBTCxFQUFnQjtRQUNadlcsTUFBTSxDQUFDK1csWUFBUDtNQUNILENBRkQsTUFHSztRQUNEL1csTUFBTSxDQUFDZ1gsYUFBUDtNQUNIOztNQUNELElBQUksQ0FBQ1YsT0FBTCxFQUFjO1FBQ1YxRixRQUFRLENBQUNqQixvQkFBVCxDQUE4QixDQUFDMFEsY0FBL0I7UUFDQTNmLEtBQUssQ0FBQ3lYLGdCQUFOLEdBQXlCQSxnQkFBekI7UUFDQXpYLEtBQUssQ0FBQzJmLGNBQU4sR0FBdUJBLGNBQXZCO01BQ0g7SUFDSixDQXJDRDs7SUFzQ0EsS0FBSzNPLGFBQUwsR0FBcUIsVUFBVWxRLEdBQVYsRUFBZTtNQUNoQyxJQUFJcUssRUFBRSxHQUFHbkwsS0FBVDtNQUFBLElBQWdCeVgsZ0JBQWdCLEdBQUd0TSxFQUFFLENBQUNzTSxnQkFBdEM7TUFBQSxJQUF3RGtJLGNBQWMsR0FBR3hVLEVBQUUsQ0FBQ3dVLGNBQTVFOztNQUNBM2YsS0FBSyxDQUFDd2EsU0FBTjs7TUFDQSxJQUFJL0MsZ0JBQWdCLElBQUlrSSxjQUF4QixFQUF3QztRQUNwQyxJQUFJblAsUUFBUSxHQUFHeFEsS0FBSyxDQUFDMlUsV0FBTixDQUFrQm5FLFFBQWpDO1FBQ0EsSUFBSTBQLFNBQVMsR0FBRzFQLFFBQVEsQ0FBQzRDLE9BQVQsQ0FBaUI0QixPQUFqQztRQUNBLElBQUk0SyxRQUFRLEdBQUc1ZixLQUFLLENBQUM0ZixRQUFyQjtRQUNBbkksZ0JBQWdCLENBQUN6VyxPQUFqQixDQUF5QkMsT0FBekIsQ0FBaUMsTUFBakMsRUFBeUN6QixLQUFLLENBQUNzVSxRQUFOLENBQWV0VSxLQUFLLENBQUNzVSxRQUFOLENBQWUsRUFBZixFQUFtQkwsNEJBQTRCLENBQUNqRCxRQUFRLENBQUN3QyxRQUFWLEVBQW9CeUUsZ0JBQXBCLENBQS9DLENBQWYsRUFBc0c7VUFBRStELFNBQVMsRUFBRTFhLEdBQUcsQ0FBQ2IsU0FBakI7VUFBNEI2VSxPQUFPLEVBQUVoVSxHQUFHLENBQUM4QixTQUF6QztVQUFvRG1TLElBQUksRUFBRW1MO1FBQTFELENBQXRHLENBQXpDOztRQUNBLElBQUlOLFFBQVEsQ0FBQ0UsTUFBYixFQUFxQjtVQUNqQixJQUFJSyxjQUFjLEdBQUc3Z0IsTUFBTSxDQUFDMmdCLGlCQUFQLENBQXlCTixjQUF6QixDQUFyQjtVQUNBbEksZ0JBQWdCLENBQUN0QixRQUFqQixDQUEwQjtZQUN0QmhJLElBQUksRUFBRSxjQURnQjtZQUV0QmlLLFVBQVUsRUFBRStIO1VBRlUsQ0FBMUI7O1VBSUEsSUFBSXJmLEdBQUcsQ0FBQytCLE9BQVIsRUFBaUI7WUFDYjRVLGdCQUFnQixDQUFDdEIsUUFBakIsQ0FBMEI7Y0FDdEJoSSxJQUFJLEVBQUUsY0FEZ0I7Y0FFdEI0SixlQUFlLEVBQUU0SCxjQUFjLENBQUMzSCxRQUFmLENBQXdCQztZQUZuQixDQUExQjtVQUlILENBWGdCLENBWWpCOzs7VUFDQVIsZ0JBQWdCLENBQUN6VyxPQUFqQixDQUF5QkMsT0FBekIsQ0FBaUMsY0FBakMsRUFBaUQ7WUFDN0M0WCxLQUFLLEVBQUUsSUFBSXZaLE1BQU0sQ0FBQ3daLFFBQVgsQ0FBb0JyQixnQkFBcEIsRUFBc0NrSSxjQUFjLENBQUM1RyxHQUFyRCxFQUEwRDRHLGNBQWMsQ0FBQzNILFFBQXpFLENBRHNDO1lBRTdDK0MsYUFBYSxFQUFFLEVBRjhCO1lBRzdDRSxNQUFNLEVBQUUsa0JBQVk7Y0FDaEJ4RCxnQkFBZ0IsQ0FBQ3RCLFFBQWpCLENBQTBCO2dCQUN0QmhJLElBQUksRUFBRSxlQURnQjtnQkFFdEJpSyxVQUFVLEVBQUUrSDtjQUZVLENBQTFCO1lBSUgsQ0FSNEM7WUFTN0MzRSxTQUFTLEVBQUUxYSxHQUFHLENBQUNiLFNBVDhCO1lBVTdDOFUsSUFBSSxFQUFFbUw7VUFWdUMsQ0FBakQ7UUFZSDtNQUNKOztNQUNEbGdCLEtBQUssQ0FBQ3lYLGdCQUFOLEdBQXlCLElBQXpCO01BQ0F6WCxLQUFLLENBQUMyZixjQUFOLEdBQXVCLElBQXZCO0lBQ0gsQ0FyQ0Q7O0lBc0NBLElBQUloTCxXQUFXLEdBQUcsS0FBS0EsV0FBTCxHQUFtQixJQUFJMUUsV0FBSixDQUFnQkMsUUFBaEIsRUFBMEI1USxNQUFNLENBQUN3Yyx3QkFBakMsQ0FBckM7SUFDQW5ILFdBQVcsQ0FBQ3RFLGNBQVosR0FBNkIsS0FBN0IsQ0F0RnlELENBc0ZyQjs7SUFDcENzRSxXQUFXLENBQUMzVCxPQUFaLENBQW9CME4sRUFBcEIsQ0FBdUIsV0FBdkIsRUFBb0MsS0FBS2tDLGVBQXpDO0lBQ0ErRCxXQUFXLENBQUMzVCxPQUFaLENBQW9CME4sRUFBcEIsQ0FBdUIsV0FBdkIsRUFBb0MsS0FBS2lILGVBQXpDO0lBQ0FoQixXQUFXLENBQUMzVCxPQUFaLENBQW9CME4sRUFBcEIsQ0FBdUIsU0FBdkIsRUFBa0MsS0FBS3NDLGFBQXZDO0lBQ0EsS0FBSzBPLGdCQUFMLEdBQXdCQSxnQkFBeEI7RUFDSDs7RUFDREQsdUJBQXVCLENBQUNwYyxTQUF4QixDQUFrQ3djLGFBQWxDLEdBQWtELFVBQVU1ZixTQUFWLEVBQXFCO0lBQ25FLElBQUksUUFBTyxLQUFLeWYsZ0JBQVosTUFBaUMsUUFBckMsRUFBK0M7TUFDM0MsT0FBT3BnQixNQUFNLENBQUM4Z0IsYUFBUCxDQUFxQixLQUFLVixnQkFBMUIsQ0FBUDtJQUNIOztJQUNELElBQUksT0FBTyxLQUFLQSxnQkFBWixLQUFpQyxVQUFyQyxFQUFpRDtNQUM3QyxPQUFPcGdCLE1BQU0sQ0FBQzhnQixhQUFQLENBQXFCLEtBQUtWLGdCQUFMLENBQXNCemYsU0FBdEIsQ0FBckIsQ0FBUDtJQUNIOztJQUNELE9BQU9vZ0IsaUJBQWlCLENBQUNwZ0IsU0FBRCxDQUF4QjtFQUNILENBUkQ7O0VBU0F3Zix1QkFBdUIsQ0FBQ3BjLFNBQXhCLENBQWtDeVcsV0FBbEMsR0FBZ0QsVUFBVWtDLFdBQVYsRUFBdUJDLEtBQXZCLEVBQThCO0lBQzFFLElBQUlDLFdBQVcsR0FBRyxLQUFLekUsZ0JBQXZCOztJQUNBLElBQUl5RSxXQUFXLElBQUlBLFdBQVcsS0FBS0YsV0FBbkMsRUFBZ0Q7TUFDNUNFLFdBQVcsQ0FBQy9GLFFBQVosQ0FBcUI7UUFBRWhJLElBQUksRUFBRTtNQUFSLENBQXJCO0lBQ0g7O0lBQ0QsSUFBSTZOLFdBQUosRUFBaUI7TUFDYkEsV0FBVyxDQUFDN0YsUUFBWixDQUFxQjtRQUFFaEksSUFBSSxFQUFFLGdCQUFSO1FBQTBCOE4sS0FBSyxFQUFFQTtNQUFqQyxDQUFyQjtJQUNIO0VBQ0osQ0FSRDs7RUFTQXdELHVCQUF1QixDQUFDcGMsU0FBeEIsQ0FBa0NtWCxTQUFsQyxHQUE4QyxZQUFZO0lBQ3RELElBQUksS0FBSy9DLGdCQUFULEVBQTJCO01BQ3ZCLEtBQUtBLGdCQUFMLENBQXNCdEIsUUFBdEIsQ0FBK0I7UUFBRWhJLElBQUksRUFBRTtNQUFSLENBQS9CO0lBQ0g7RUFDSixDQUpEOztFQUtBc1IsdUJBQXVCLENBQUNwYyxTQUF4QixDQUFrQzBjLG1CQUFsQyxHQUF3RCxVQUFVN1csRUFBVixFQUFjdU8sZ0JBQWQsRUFBZ0M7SUFDcEYsSUFBSTZJLFVBQVUsR0FBRzdJLGdCQUFnQixDQUFDbkMsT0FBakIsQ0FBeUJnTCxVQUExQzs7SUFDQSxJQUFJLE9BQU9BLFVBQVAsS0FBc0IsVUFBMUIsRUFBc0M7TUFDbEMsT0FBT0EsVUFBVSxDQUFDaFosSUFBWCxDQUFnQm1RLGdCQUFnQixDQUFDeEMsV0FBakMsRUFBOEMvTCxFQUE5QyxDQUFQO0lBQ0g7O0lBQ0QsSUFBSSxPQUFPb1gsVUFBUCxLQUFzQixRQUF0QixJQUFrQ0EsVUFBdEMsRUFBa0Q7TUFDOUMsT0FBTy9NLE9BQU8sQ0FBQ2pVLE1BQU0sQ0FBQ2loQixjQUFQLENBQXNCclgsRUFBdEIsRUFBMEJvWCxVQUExQixDQUFELENBQWQ7SUFDSDs7SUFDRCxPQUFPLElBQVA7RUFDSCxDQVREOztFQVVBLE9BQU9iLHVCQUFQO0FBQ0gsQ0EvSDRDLEVBQTdDLEMsQ0FnSUE7QUFDQTs7O0FBQ0EsU0FBU08sdUJBQVQsQ0FBaUNoTixRQUFqQyxFQUEyQzRNLFFBQTNDLEVBQXFEeE0sT0FBckQsRUFBOEQ7RUFDMUQsSUFBSW9OLFFBQVEsR0FBR2hoQixLQUFLLENBQUNzVSxRQUFOLENBQWUsRUFBZixFQUFtQjhMLFFBQVEsQ0FBQ2EsYUFBNUIsQ0FBZjs7RUFDQSxLQUFLLElBQUl2VixFQUFFLEdBQUcsQ0FBVCxFQUFZQyxFQUFFLEdBQUdpSSxPQUFPLENBQUNPLFdBQVIsQ0FBb0IrTSxxQkFBMUMsRUFBaUV4VixFQUFFLEdBQUdDLEVBQUUsQ0FBQ3BILE1BQXpFLEVBQWlGbUgsRUFBRSxFQUFuRixFQUF1RjtJQUNuRixJQUFJMkksU0FBUyxHQUFHMUksRUFBRSxDQUFDRCxFQUFELENBQWxCOztJQUNBMUwsS0FBSyxDQUFDc1UsUUFBTixDQUFlME0sUUFBZixFQUF5QjNNLFNBQVMsQ0FBQ2IsUUFBRCxFQUFXNE0sUUFBWCxDQUFsQztFQUNIOztFQUNELElBQUl6RSxFQUFFLEdBQUc3YixNQUFNLENBQUNxaEIsY0FBUCxDQUFzQkgsUUFBdEIsRUFBZ0NwTixPQUFoQyxDQUFUO0VBQUEsSUFBbUR3TixPQUFPLEdBQUd6RixFQUFFLENBQUN5RixPQUFoRTtFQUFBLElBQXlFQyxLQUFLLEdBQUcxRixFQUFFLENBQUMwRixLQUFwRjs7RUFDQSxJQUFJOUgsR0FBRyxHQUFHelosTUFBTSxDQUFDd2hCLGFBQVAsQ0FBcUJGLE9BQXJCLEVBQThCQyxLQUE5QixFQUFxQ2pCLFFBQVEsQ0FBQ21CLFFBQTlDLEVBQXdEL04sUUFBUSxDQUFDdUIsTUFBakUsRUFBeUVuQixPQUFPLENBQUNrQyxPQUFSLENBQWdCMEwsa0JBQWhCLElBQXNDek4sT0FBTyxDQUFDcU0sUUFBUSxDQUFDcUIsUUFBVixDQUF0SCxFQUEySTtFQUNySjdOLE9BRFUsQ0FBVjtFQUVBLElBQUl0TyxLQUFLLEdBQUdrTyxRQUFRLENBQUNDLEtBQVQsQ0FBZW5PLEtBQTNCLENBVDBELENBVTFEO0VBQ0E7O0VBQ0EsSUFBSWtPLFFBQVEsQ0FBQ3VCLE1BQVQsSUFBbUJxTCxRQUFRLENBQUNzQixTQUFoQyxFQUEyQztJQUN2Q3BjLEtBQUssR0FBR3NPLE9BQU8sQ0FBQ1ksT0FBUixDQUFnQnpOLEdBQWhCLENBQW9CekIsS0FBcEIsRUFBMkI4YSxRQUFRLENBQUNzQixTQUFwQyxDQUFSO0VBQ0g7O0VBQ0QsSUFBSW5LLEdBQUcsR0FBRzZJLFFBQVEsQ0FBQ3FCLFFBQVQsR0FDTjdOLE9BQU8sQ0FBQ1ksT0FBUixDQUFnQnpOLEdBQWhCLENBQW9CekIsS0FBcEIsRUFBMkI4YSxRQUFRLENBQUNxQixRQUFwQyxDQURNLEdBRU4zaEIsTUFBTSxDQUFDNmhCLGtCQUFQLENBQTBCbk8sUUFBUSxDQUFDdUIsTUFBbkMsRUFBMkN6UCxLQUEzQyxFQUFrRHNPLE9BQWxELENBRko7RUFHQSxJQUFJNEUsUUFBUSxHQUFHMVksTUFBTSxDQUFDOGhCLG1CQUFQLENBQTJCckksR0FBRyxDQUFDNEIsS0FBL0IsRUFBc0M7SUFBRTdWLEtBQUssRUFBRUEsS0FBVDtJQUFnQmlTLEdBQUcsRUFBRUE7RUFBckIsQ0FBdEMsQ0FBZjtFQUNBLE9BQU87SUFBRWdDLEdBQUcsRUFBRUEsR0FBUDtJQUFZZixRQUFRLEVBQUVBO0VBQXRCLENBQVA7QUFDSCxDLENBQ0Q7QUFDQTs7O0FBQ0EsU0FBU3FJLGlCQUFULENBQTJCblgsRUFBM0IsRUFBK0I7RUFDM0IsSUFBSW1ZLEdBQUcsR0FBR0MsaUJBQWlCLENBQUNwWSxFQUFELEVBQUssT0FBTCxDQUEzQjtFQUNBLElBQUlxWSxHQUFHLEdBQUdGLEdBQUcsR0FDVEcsSUFBSSxDQUFDQyxLQUFMLENBQVdKLEdBQVgsQ0FEUyxHQUVUO0lBQUV2QixNQUFNLEVBQUU7RUFBVixDQUZKLENBRjJCLENBSUo7O0VBQ3ZCLE9BQU94Z0IsTUFBTSxDQUFDOGdCLGFBQVAsQ0FBcUJtQixHQUFyQixDQUFQO0FBQ0g7O0FBQ0RqaUIsTUFBTSxDQUFDRyxNQUFQLENBQWNpaUIsY0FBZCxHQUErQixFQUEvQjs7QUFDQSxTQUFTSixpQkFBVCxDQUEyQnBZLEVBQTNCLEVBQStCeUMsSUFBL0IsRUFBcUM7RUFDakMsSUFBSWdXLE1BQU0sR0FBR3JpQixNQUFNLENBQUNHLE1BQVAsQ0FBY2lpQixjQUEzQjtFQUNBLElBQUlFLFlBQVksR0FBRyxDQUFDRCxNQUFNLEdBQUdBLE1BQU0sR0FBRyxHQUFaLEdBQWtCLEVBQXpCLElBQStCaFcsSUFBbEQ7RUFDQSxPQUFPekMsRUFBRSxDQUFDMlksWUFBSCxDQUFnQixVQUFVRCxZQUExQixLQUEyQyxFQUFsRDtBQUNIO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsSUFBSUUsaUJBQWlCO0FBQUc7QUFBZSxZQUFZO0VBQy9DLFNBQVNBLGlCQUFULENBQTJCNVksRUFBM0IsRUFBK0J1TCxRQUEvQixFQUF5QztJQUNyQyxJQUFJelUsS0FBSyxHQUFHLElBQVo7O0lBQ0EsSUFBSXlVLFFBQVEsS0FBSyxLQUFLLENBQXRCLEVBQXlCO01BQUVBLFFBQVEsR0FBRyxFQUFYO0lBQWdCOztJQUMzQyxLQUFLaEUsaUJBQUwsR0FBeUIsVUFBVS9QLEVBQVYsRUFBYztNQUNuQyxJQUFJd1AsUUFBUSxHQUFHbFEsS0FBSyxDQUFDa1EsUUFBckI7TUFDQSxJQUFJL0UsRUFBRSxHQUFHbkwsS0FBSyxDQUFDeVUsUUFBZjtNQUFBLElBQXlCdEgsV0FBVyxHQUFHaEMsRUFBRSxDQUFDZ0MsV0FBMUM7TUFBQSxJQUF1RHdKLGNBQWMsR0FBR3hMLEVBQUUsQ0FBQ3dMLGNBQTNFO01BQ0F6RyxRQUFRLENBQUMvQyxXQUFULEdBQ0lBLFdBQVcsSUFBSSxJQUFmLEdBQ0lBLFdBREosR0FFS3pNLEVBQUUsQ0FBQ21DLE9BQUgsR0FBYSxDQUFiLEdBQWlCdkQsTUFBTSxDQUFDeWlCLG9CQUFQLENBQTRCMUosb0JBSHREO01BSUFuSSxRQUFRLENBQUNoRCxLQUFULEdBQ0l4TSxFQUFFLENBQUNtQyxPQUFILEdBQWE7TUFDUjhULGNBQWMsSUFBSSxJQUFsQixHQUF5QkEsY0FBekIsR0FBMENyWCxNQUFNLENBQUN5aUIsb0JBQVAsQ0FBNEJwTCxjQUQzRSxHQUVJLENBSFI7SUFJSCxDQVhEOztJQVlBLEtBQUsvRixlQUFMLEdBQXVCLFVBQVVsUSxFQUFWLEVBQWM7TUFDakMsSUFBSUEsRUFBRSxDQUFDbUMsT0FBSCxJQUNBN0MsS0FBSyxDQUFDa1EsUUFBTixDQUFlaEQsS0FEZixJQUVBeE0sRUFBRSxDQUFDVCxTQUFILENBQWFxRyxTQUFiLENBQXVCc1MsUUFBdkIsQ0FBZ0MsVUFBaEMsQ0FGSixFQUVpRDtRQUM3QzVZLEtBQUssQ0FBQ2tRLFFBQU4sQ0FBZXBDLE1BQWYsQ0FBc0IxSCxXQUF0QixHQUFvQ0UsU0FBcEMsQ0FBOENDLEdBQTlDLENBQWtELG1CQUFsRDtNQUNIO0lBQ0osQ0FORDs7SUFPQSxLQUFLa08sUUFBTCxHQUFnQkEsUUFBaEI7SUFDQSxJQUFJdkUsUUFBUSxHQUFHLEtBQUtBLFFBQUwsR0FBZ0IsSUFBSWpELHlCQUFKLENBQThCL0QsRUFBOUIsQ0FBL0I7SUFDQWdILFFBQVEsQ0FBQzlDLGtCQUFULEdBQThCLEtBQTlCOztJQUNBLElBQUlxSCxRQUFRLENBQUN1TixZQUFULElBQXlCLElBQTdCLEVBQW1DO01BQy9COVIsUUFBUSxDQUFDckMsT0FBVCxDQUFpQjNOLFFBQWpCLEdBQTRCdVUsUUFBUSxDQUFDdU4sWUFBckM7SUFDSDs7SUFDRCxJQUFJdk4sUUFBUSxDQUFDd04sUUFBVCxJQUFxQixJQUF6QixFQUErQjtNQUMzQi9SLFFBQVEsQ0FBQ3BDLE1BQVQsQ0FBZ0JwSixVQUFoQixHQUE2QitQLFFBQVEsQ0FBQ3dOLFFBQXRDLENBRDJCLENBQ3FCO0lBQ25EOztJQUNEL1IsUUFBUSxDQUFDbFAsT0FBVCxDQUFpQjBOLEVBQWpCLENBQW9CLGFBQXBCLEVBQW1DLEtBQUsrQixpQkFBeEM7SUFDQVAsUUFBUSxDQUFDbFAsT0FBVCxDQUFpQjBOLEVBQWpCLENBQW9CLFdBQXBCLEVBQWlDLEtBQUtrQyxlQUF0QztJQUNBLElBQUk2Tyx1QkFBSixDQUE0QnZQLFFBQTVCLEVBQXNDdUUsUUFBUSxDQUFDeU4sU0FBL0MsRUFqQ3FDLENBaUNzQjtFQUM5RDs7RUFDREosaUJBQWlCLENBQUN6ZSxTQUFsQixDQUE0QkMsT0FBNUIsR0FBc0MsWUFBWTtJQUM5QyxLQUFLNE0sUUFBTCxDQUFjNU0sT0FBZDtFQUNILENBRkQ7O0VBR0EsT0FBT3dlLGlCQUFQO0FBQ0gsQ0F4Q3NDLEVBQXZDO0FBMENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsSUFBSUssdUJBQXVCO0FBQUc7QUFBZSxVQUFVamIsTUFBVixFQUFrQjtFQUMzRDFILEtBQUssQ0FBQzJILFNBQU4sQ0FBZ0JnYix1QkFBaEIsRUFBeUNqYixNQUF6Qzs7RUFDQSxTQUFTaWIsdUJBQVQsQ0FBaUNwaUIsV0FBakMsRUFBOEM7SUFDMUMsSUFBSUMsS0FBSyxHQUFHa0gsTUFBTSxDQUFDSSxJQUFQLENBQVksSUFBWixFQUFrQnZILFdBQWxCLEtBQWtDLElBQTlDOztJQUNBQyxLQUFLLENBQUNJLGdCQUFOLEdBQXlCLEtBQXpCO0lBQ0FKLEtBQUssQ0FBQ29pQixjQUFOLEdBQXVCLEVBQXZCO0lBQ0FwaUIsS0FBSyxDQUFDcWlCLGVBQU4sR0FBd0IsSUFBeEI7O0lBQ0FyaUIsS0FBSyxDQUFDeVEsaUJBQU4sR0FBMEIsVUFBVS9QLEVBQVYsRUFBYztNQUNwQ1YsS0FBSyxDQUFDZ0IsT0FBTixDQUFjQyxPQUFkLENBQXNCLGFBQXRCLEVBQXFDUCxFQUFyQzs7TUFDQSxJQUFJLENBQUNWLEtBQUssQ0FBQ0ksZ0JBQVgsRUFBNkI7UUFDekI7UUFDQUosS0FBSyxDQUFDZ0IsT0FBTixDQUFjQyxPQUFkLENBQXNCLFdBQXRCLEVBQW1DUCxFQUFuQztNQUNIO0lBQ0osQ0FORDs7SUFPQVYsS0FBSyxDQUFDc2lCLGlCQUFOLEdBQTBCLFVBQVU1aEIsRUFBVixFQUFjO01BQ3BDLElBQUksQ0FBQ1YsS0FBSyxDQUFDSSxnQkFBWCxFQUE2QjtRQUN6QkosS0FBSyxDQUFDZ0IsT0FBTixDQUFjQyxPQUFkLENBQXNCLFVBQXRCLEVBQWtDUCxFQUFsQztNQUNIO0lBQ0osQ0FKRDs7SUFLQVYsS0FBSyxDQUFDOFEsZUFBTixHQUF3QixVQUFVcFEsRUFBVixFQUFjO01BQ2xDVixLQUFLLENBQUNnQixPQUFOLENBQWNDLE9BQWQsQ0FBc0IsV0FBdEIsRUFBbUNQLEVBQW5DOztNQUNBLElBQUksQ0FBQ1YsS0FBSyxDQUFDSSxnQkFBWCxFQUE2QjtRQUN6QjtRQUNBSixLQUFLLENBQUNnQixPQUFOLENBQWNDLE9BQWQsQ0FBc0IsU0FBdEIsRUFBaUNQLEVBQWpDO01BQ0g7SUFDSixDQU5EOztJQU9BLElBQUltTixPQUFPLEdBQUc3TixLQUFLLENBQUM2TixPQUFOLEdBQWdCLElBQUkvTixlQUFKLENBQW9CQyxXQUFwQixDQUE5QjtJQUNBOE4sT0FBTyxDQUFDN00sT0FBUixDQUFnQjBOLEVBQWhCLENBQW1CLGFBQW5CLEVBQWtDMU8sS0FBSyxDQUFDeVEsaUJBQXhDO0lBQ0E1QyxPQUFPLENBQUM3TSxPQUFSLENBQWdCME4sRUFBaEIsQ0FBbUIsYUFBbkIsRUFBa0MxTyxLQUFLLENBQUNzaUIsaUJBQXhDO0lBQ0F6VSxPQUFPLENBQUM3TSxPQUFSLENBQWdCME4sRUFBaEIsQ0FBbUIsV0FBbkIsRUFBZ0MxTyxLQUFLLENBQUM4USxlQUF0QztJQUNBLE9BQU85USxLQUFQO0VBQ0g7O0VBQ0RtaUIsdUJBQXVCLENBQUM5ZSxTQUF4QixDQUFrQ0MsT0FBbEMsR0FBNEMsWUFBWTtJQUNwRCxLQUFLdUssT0FBTCxDQUFhdkssT0FBYjtFQUNILENBRkQ7O0VBR0E2ZSx1QkFBdUIsQ0FBQzllLFNBQXhCLENBQWtDMEwsYUFBbEMsR0FBa0QsVUFBVTFKLElBQVYsRUFBZ0I7SUFDOUQsS0FBS2pGLGdCQUFMLEdBQXdCaUYsSUFBeEI7RUFDSCxDQUZEOztFQUdBOGMsdUJBQXVCLENBQUM5ZSxTQUF4QixDQUFrQzJMLGtCQUFsQyxHQUF1RCxVQUFVM0osSUFBVixFQUFnQjtJQUNuRSxJQUFJQSxJQUFKLEVBQVU7TUFDTjtNQUNBO01BQ0EsSUFBSSxLQUFLZ2QsZUFBVCxFQUEwQjtRQUN0QixLQUFLQSxlQUFMLENBQXFCL2MsS0FBckIsQ0FBMkJtQixVQUEzQixHQUF3QyxFQUF4QztRQUNBLEtBQUs0YixlQUFMLEdBQXVCLElBQXZCO01BQ0g7SUFDSixDQVBELE1BUUs7TUFDRCxJQUFJN2QsUUFBUSxHQUFHLEtBQUs0ZCxjQUFMLENBQ1g7TUFEVyxFQUVUamhCLFFBQVEsQ0FBQzRZLGFBQVQsQ0FBdUIsS0FBS3FJLGNBQTVCLENBRlMsR0FHVCxJQUhOOztNQUlBLElBQUk1ZCxRQUFKLEVBQWM7UUFDVixLQUFLNmQsZUFBTCxHQUF1QjdkLFFBQXZCO1FBQ0FBLFFBQVEsQ0FBQ2MsS0FBVCxDQUFlbUIsVUFBZixHQUE0QixRQUE1QjtNQUNIO0lBQ0o7RUFDSixDQW5CRDs7RUFvQkEsT0FBTzBiLHVCQUFQO0FBQ0gsQ0EzRDRDLENBMkQzQzdpQixNQUFNLENBQUM2UCxlQTNEb0MsQ0FBN0M7QUE2REE7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLElBQUlvVCxtQkFBbUI7QUFBRztBQUFlLFlBQVk7RUFDakQsU0FBU0EsbUJBQVQsQ0FBNkJDLG1CQUE3QixFQUFrRC9OLFFBQWxELEVBQTREO0lBQ3hELElBQUkxVSxXQUFXLEdBQUdvQixRQUFsQjs7SUFDQSxLQUNBO0lBQ0FxaEIsbUJBQW1CLEtBQUtyaEIsUUFBeEIsSUFDSXFoQixtQkFBbUIsWUFBWUMsT0FIbkMsRUFHNEM7TUFDeEMxaUIsV0FBVyxHQUFHeWlCLG1CQUFkO01BQ0EvTixRQUFRLEdBQUdBLFFBQVEsSUFBSSxFQUF2QjtJQUNILENBTkQsTUFPSztNQUNEQSxRQUFRLEdBQUkrTixtQkFBbUIsSUFBSSxFQUFuQztJQUNIOztJQUNELElBQUl0UyxRQUFRLEdBQUcsS0FBS0EsUUFBTCxHQUFnQixJQUFJaVMsdUJBQUosQ0FBNEJwaUIsV0FBNUIsQ0FBL0I7O0lBQ0EsSUFBSSxPQUFPMFUsUUFBUSxDQUFDdU4sWUFBaEIsS0FBaUMsUUFBckMsRUFBK0M7TUFDM0M5UixRQUFRLENBQUNyQyxPQUFULENBQWlCM04sUUFBakIsR0FBNEJ1VSxRQUFRLENBQUN1TixZQUFyQztJQUNILENBRkQsTUFHSyxJQUFJamlCLFdBQVcsS0FBS29CLFFBQXBCLEVBQThCO01BQy9CK08sUUFBUSxDQUFDckMsT0FBVCxDQUFpQjNOLFFBQWpCLEdBQTRCLGNBQTVCO0lBQ0g7O0lBQ0QsSUFBSSxPQUFPdVUsUUFBUSxDQUFDMk4sY0FBaEIsS0FBbUMsUUFBdkMsRUFBaUQ7TUFDN0NsUyxRQUFRLENBQUNrUyxjQUFULEdBQTBCM04sUUFBUSxDQUFDMk4sY0FBbkM7SUFDSDs7SUFDRCxJQUFJM0MsdUJBQUosQ0FBNEJ2UCxRQUE1QixFQUFzQ3VFLFFBQVEsQ0FBQ3lOLFNBQS9DLEVBdEJ3RCxDQXNCRztFQUM5RDs7RUFDREssbUJBQW1CLENBQUNsZixTQUFwQixDQUE4QkMsT0FBOUIsR0FBd0MsWUFBWTtJQUNoRCxLQUFLNE0sUUFBTCxDQUFjNU0sT0FBZDtFQUNILENBRkQ7O0VBR0EsT0FBT2lmLG1CQUFQO0FBQ0gsQ0E3QndDLEVBQXpDOztBQStCQSxJQUFJRyxJQUFJLEdBQUdwakIsTUFBTSxDQUFDcWpCLFlBQVAsQ0FBb0I7RUFDM0JDLHFCQUFxQixFQUFFLENBQUNwTyxZQUFELEVBQWVZLGFBQWYsRUFBOEJpQyxhQUE5QixFQUE2QzRGLGFBQTdDLENBREk7RUFFM0I0RixvQkFBb0IsRUFBRSxDQUFDaEYsWUFBRCxDQUZLO0VBRzNCaUYsbUJBQW1CLEVBQUU3Vix5QkFITTtFQUkzQjhWLGNBQWMsRUFBRW5FLGVBSlc7RUFLM0JvRSxnQkFBZ0IsRUFBRWxFO0FBTFMsQ0FBcEIsQ0FBWDtBQVFBMWYsT0FBTyxDQUFDNmpCLFNBQVIsR0FBb0JuQixpQkFBcEI7QUFDQTFpQixPQUFPLENBQUM2Tix5QkFBUixHQUFvQ0EseUJBQXBDO0FBQ0E3TixPQUFPLENBQUNVLGVBQVIsR0FBMEJBLGVBQTFCO0FBQ0FWLE9BQU8sQ0FBQ21qQixtQkFBUixHQUE4QkEsbUJBQTlCO0FBQ0FuakIsT0FBTyxXQUFQLEdBQWtCc2pCLElBQWxCIn0= },{"@fullcalendar/common":1,"tslib":32}],7:[function(require,module,exports){ /*! FullCalendar v5.11.2 Docs & License: https://fullcalendar.io/ (c) 2022 Adam Shaw */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var common = require('@fullcalendar/common'); var tslib = require('tslib'); ; var ListViewHeaderRow = /** @class */ function (_super) { tslib.__extends(ListViewHeaderRow, _super); function ListViewHeaderRow() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.state = { textId: common.getUniqueDomId() }; return _this; } ListViewHeaderRow.prototype.render = function () { var _a = this.context, theme = _a.theme, dateEnv = _a.dateEnv, options = _a.options, viewApi = _a.viewApi; var _b = this.props, cellId = _b.cellId, dayDate = _b.dayDate, todayRange = _b.todayRange; var textId = this.state.textId; var dayMeta = common.getDateMeta(dayDate, todayRange); // will ever be falsy? var text = options.listDayFormat ? dateEnv.format(dayDate, options.listDayFormat) : ''; // will ever be falsy? also, BAD NAME "alt" var sideText = options.listDaySideFormat ? dateEnv.format(dayDate, options.listDaySideFormat) : ''; var hookProps = tslib.__assign({ date: dateEnv.toDate(dayDate), view: viewApi, textId: textId, text: text, sideText: sideText, navLinkAttrs: common.buildNavLinkAttrs(this.context, dayDate), sideNavLinkAttrs: common.buildNavLinkAttrs(this.context, dayDate, 'day', false) }, dayMeta); var classNames = ['fc-list-day'].concat(common.getDayClassNames(dayMeta, theme)); // TODO: make a reusable HOC for dayHeader (used in daygrid/timegrid too) return common.createElement(common.RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInnerContent, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return common.createElement("tr", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-date": common.formatDayString(dayDate) }, common.createElement("th", { scope: "colgroup", colSpan: 3, id: cellId, "aria-labelledby": textId }, common.createElement("div", { className: 'fc-list-day-cushion ' + theme.getClass('tableCellShaded'), ref: innerElRef }, innerContent))); }); }; return ListViewHeaderRow; }(common.BaseComponent); function renderInnerContent(props) { return common.createElement(common.Fragment, null, props.text && common.createElement("a", tslib.__assign({ id: props.textId, className: "fc-list-day-text" }, props.navLinkAttrs), props.text), props.sideText && /* not keyboard tabbable */ common.createElement("a", tslib.__assign({ "aria-hidden": true, className: "fc-list-day-side-text" }, props.sideNavLinkAttrs), props.sideText)); } var DEFAULT_TIME_FORMAT = common.createFormatter({ hour: 'numeric', minute: '2-digit', meridiem: 'short' }); var ListViewEventRow = /** @class */ function (_super) { tslib.__extends(ListViewEventRow, _super); function ListViewEventRow() { return _super !== null && _super.apply(this, arguments) || this; } ListViewEventRow.prototype.render = function () { var _a = this, props = _a.props, context = _a.context; var seg = props.seg, timeHeaderId = props.timeHeaderId, eventHeaderId = props.eventHeaderId, dateHeaderId = props.dateHeaderId; var timeFormat = context.options.eventTimeFormat || DEFAULT_TIME_FORMAT; return common.createElement(common.EventRoot, { seg: seg, timeText: "" // BAD. because of all-day content , disableDragging: true, disableResizing: true, defaultContent: function defaultContent() { return renderEventInnerContent(seg, context); } /* weird */ , isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday, isSelected: props.isSelected, isDragging: props.isDragging, isResizing: props.isResizing, isDateSelecting: props.isDateSelecting }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return common.createElement("tr", { className: ['fc-list-event', hookProps.event.url ? 'fc-event-forced-url' : ''].concat(classNames).join(' '), ref: rootElRef }, buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId), common.createElement("td", { "aria-hidden": true, className: "fc-list-event-graphic" }, common.createElement("span", { className: "fc-list-event-dot", style: { borderColor: hookProps.borderColor || hookProps.backgroundColor } })), common.createElement("td", { ref: innerElRef, headers: eventHeaderId + " " + dateHeaderId, className: "fc-list-event-title" }, innerContent)); }); }; return ListViewEventRow; }(common.BaseComponent); function renderEventInnerContent(seg, context) { var interactiveAttrs = common.getSegAnchorAttrs(seg, context); return common.createElement("a", tslib.__assign({}, interactiveAttrs), seg.eventRange.def.title); } function buildTimeContent(seg, timeFormat, context, timeHeaderId, dateHeaderId) { var options = context.options; if (options.displayEventTime !== false) { var eventDef = seg.eventRange.def; var eventInstance = seg.eventRange.instance; var doAllDay = false; var timeText = void 0; if (eventDef.allDay) { doAllDay = true; } else if (common.isMultiDayRange(seg.eventRange.range)) { // TODO: use (!isStart || !isEnd) instead? if (seg.isStart) { timeText = common.buildSegTimeText(seg, timeFormat, context, null, null, eventInstance.range.start, seg.end); } else if (seg.isEnd) { timeText = common.buildSegTimeText(seg, timeFormat, context, null, null, seg.start, eventInstance.range.end); } else { doAllDay = true; } } else { timeText = common.buildSegTimeText(seg, timeFormat, context); } if (doAllDay) { var hookProps = { text: context.options.allDayText, view: context.viewApi }; return common.createElement(common.RenderHook, { hookProps: hookProps, classNames: options.allDayClassNames, content: options.allDayContent, defaultContent: renderAllDayInner, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return common.createElement("td", { ref: rootElRef, headers: timeHeaderId + " " + dateHeaderId, className: ['fc-list-event-time'].concat(classNames).join(' ') }, innerContent); }); } return common.createElement("td", { className: "fc-list-event-time" }, timeText); } return null; } function renderAllDayInner(hookProps) { return hookProps.text; } /* Responsible for the scroller, and forwarding event-related actions into the "grid". */ var ListView = /** @class */ function (_super) { tslib.__extends(ListView, _super); function ListView() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.computeDateVars = common.memoize(computeDateVars); _this.eventStoreToSegs = common.memoize(_this._eventStoreToSegs); _this.state = { timeHeaderId: common.getUniqueDomId(), eventHeaderId: common.getUniqueDomId(), dateHeaderIdRoot: common.getUniqueDomId() }; _this.setRootEl = function (rootEl) { if (rootEl) { _this.context.registerInteractiveComponent(_this, { el: rootEl }); } else { _this.context.unregisterInteractiveComponent(_this); } }; return _this; } ListView.prototype.render = function () { var _this = this; var _a = this, props = _a.props, context = _a.context; var extraClassNames = ['fc-list', context.theme.getClass('table'), context.options.stickyHeaderDates !== false ? 'fc-list-sticky' : '']; var _b = this.computeDateVars(props.dateProfile), dayDates = _b.dayDates, dayRanges = _b.dayRanges; var eventSegs = this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges); return common.createElement(common.ViewRoot, { viewSpec: context.viewSpec, elRef: this.setRootEl }, function (rootElRef, classNames) { return common.createElement("div", { ref: rootElRef, className: extraClassNames.concat(classNames).join(' ') }, common.createElement(common.Scroller, { liquid: !props.isHeightAuto, overflowX: props.isHeightAuto ? 'visible' : 'hidden', overflowY: props.isHeightAuto ? 'visible' : 'auto' }, eventSegs.length > 0 ? _this.renderSegList(eventSegs, dayDates) : _this.renderEmptyMessage())); }); }; ListView.prototype.renderEmptyMessage = function () { var _a = this.context, options = _a.options, viewApi = _a.viewApi; var hookProps = { text: options.noEventsText, view: viewApi }; return common.createElement(common.RenderHook, { hookProps: hookProps, classNames: options.noEventsClassNames, content: options.noEventsContent, defaultContent: renderNoEventsInner, didMount: options.noEventsDidMount, willUnmount: options.noEventsWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return common.createElement("div", { className: ['fc-list-empty'].concat(classNames).join(' '), ref: rootElRef }, common.createElement("div", { className: "fc-list-empty-cushion", ref: innerElRef }, innerContent)); }); }; ListView.prototype.renderSegList = function (allSegs, dayDates) { var _a = this.context, theme = _a.theme, options = _a.options; var _b = this.state, timeHeaderId = _b.timeHeaderId, eventHeaderId = _b.eventHeaderId, dateHeaderIdRoot = _b.dateHeaderIdRoot; var segsByDay = groupSegsByDay(allSegs); // sparse array return common.createElement(common.NowTimer, { unit: "day" }, function (nowDate, todayRange) { var innerNodes = []; for (var dayIndex = 0; dayIndex < segsByDay.length; dayIndex += 1) { var daySegs = segsByDay[dayIndex]; if (daySegs) { // sparse array, so might be undefined var dayStr = common.formatDayString(dayDates[dayIndex]); var dateHeaderId = dateHeaderIdRoot + '-' + dayStr; // append a day header innerNodes.push(common.createElement(ListViewHeaderRow, { key: dayStr, cellId: dateHeaderId, dayDate: dayDates[dayIndex], todayRange: todayRange })); daySegs = common.sortEventSegs(daySegs, options.eventOrder); for (var _i = 0, daySegs_1 = daySegs; _i < daySegs_1.length; _i++) { var seg = daySegs_1[_i]; innerNodes.push(common.createElement(ListViewEventRow, tslib.__assign({ key: dayStr + ':' + seg.eventRange.instance.instanceId /* are multiple segs for an instanceId */ , seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, timeHeaderId: timeHeaderId, eventHeaderId: eventHeaderId, dateHeaderId: dateHeaderId }, common.getSegMeta(seg, todayRange, nowDate)))); } } } return common.createElement("table", { className: 'fc-list-table ' + theme.getClass('table') }, common.createElement("thead", null, common.createElement("tr", null, common.createElement("th", { scope: "col", id: timeHeaderId }, options.timeHint), common.createElement("th", { scope: "col", "aria-hidden": true }), common.createElement("th", { scope: "col", id: eventHeaderId }, options.eventHint))), common.createElement("tbody", null, innerNodes)); }); }; ListView.prototype._eventStoreToSegs = function (eventStore, eventUiBases, dayRanges) { return this.eventRangesToSegs(common.sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.context.options.nextDayThreshold).fg, dayRanges); }; ListView.prototype.eventRangesToSegs = function (eventRanges, dayRanges) { var segs = []; for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) { var eventRange = eventRanges_1[_i]; segs.push.apply(segs, this.eventRangeToSegs(eventRange, dayRanges)); } return segs; }; ListView.prototype.eventRangeToSegs = function (eventRange, dayRanges) { var dateEnv = this.context.dateEnv; var nextDayThreshold = this.context.options.nextDayThreshold; var range = eventRange.range; var allDay = eventRange.def.allDay; var dayIndex; var segRange; var seg; var segs = []; for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex += 1) { segRange = common.intersectRanges(range, dayRanges[dayIndex]); if (segRange) { seg = { component: this, eventRange: eventRange, start: segRange.start, end: segRange.end, isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(), isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(), dayIndex: dayIndex }; segs.push(seg); // detect when range won't go fully into the next day, // and mutate the latest seg to the be the end. if (!seg.isEnd && !allDay && dayIndex + 1 < dayRanges.length && range.end < dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) { seg.end = range.end; seg.isEnd = true; break; } } } return segs; }; return ListView; }(common.DateComponent); function renderNoEventsInner(hookProps) { return hookProps.text; } function computeDateVars(dateProfile) { var dayStart = common.startOfDay(dateProfile.renderRange.start); var viewEnd = dateProfile.renderRange.end; var dayDates = []; var dayRanges = []; while (dayStart < viewEnd) { dayDates.push(dayStart); dayRanges.push({ start: dayStart, end: common.addDays(dayStart, 1) }); dayStart = common.addDays(dayStart, 1); } return { dayDates: dayDates, dayRanges: dayRanges }; } // Returns a sparse array of arrays, segs grouped by their dayIndex function groupSegsByDay(segs) { var segsByDay = []; // sparse array var i; var seg; for (i = 0; i < segs.length; i += 1) { seg = segs[i]; (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = [])).push(seg); } return segsByDay; } var OPTION_REFINERS = { listDayFormat: createFalsableFormatter, listDaySideFormat: createFalsableFormatter, noEventsClassNames: common.identity, noEventsContent: common.identity, noEventsDidMount: common.identity, noEventsWillUnmount: common.identity // noEventsText is defined in base options }; function createFalsableFormatter(input) { return input === false ? null : common.createFormatter(input); } var main = common.createPlugin({ optionRefiners: OPTION_REFINERS, views: { list: { component: ListView, buttonTextKey: 'list', listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' } // like "January 1, 2016" }, listDay: { type: 'list', duration: { days: 1 }, listDayFormat: { weekday: 'long' } // day-of-week is all we need. full date is probably in headerToolbar }, listWeek: { type: 'list', duration: { weeks: 1 }, listDayFormat: { weekday: 'long' }, listDaySideFormat: { month: 'long', day: 'numeric', year: 'numeric' } }, listMonth: { type: 'list', duration: { month: 1 }, listDaySideFormat: { weekday: 'long' } // day-of-week is nice-to-have }, listYear: { type: 'list', duration: { year: 1 }, listDaySideFormat: { weekday: 'long' } // day-of-week is nice-to-have } } }); exports.ListView = ListView; exports["default"] = main; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImNvbW1vbiIsInJlcXVpcmUiLCJ0c2xpYiIsIkxpc3RWaWV3SGVhZGVyUm93IiwiX3N1cGVyIiwiX19leHRlbmRzIiwiX3RoaXMiLCJhcHBseSIsImFyZ3VtZW50cyIsInN0YXRlIiwidGV4dElkIiwiZ2V0VW5pcXVlRG9tSWQiLCJwcm90b3R5cGUiLCJyZW5kZXIiLCJfYSIsImNvbnRleHQiLCJ0aGVtZSIsImRhdGVFbnYiLCJvcHRpb25zIiwidmlld0FwaSIsIl9iIiwicHJvcHMiLCJjZWxsSWQiLCJkYXlEYXRlIiwidG9kYXlSYW5nZSIsImRheU1ldGEiLCJnZXREYXRlTWV0YSIsInRleHQiLCJsaXN0RGF5Rm9ybWF0IiwiZm9ybWF0Iiwic2lkZVRleHQiLCJsaXN0RGF5U2lkZUZvcm1hdCIsImhvb2tQcm9wcyIsIl9fYXNzaWduIiwiZGF0ZSIsInRvRGF0ZSIsInZpZXciLCJuYXZMaW5rQXR0cnMiLCJidWlsZE5hdkxpbmtBdHRycyIsInNpZGVOYXZMaW5rQXR0cnMiLCJjbGFzc05hbWVzIiwiY29uY2F0IiwiZ2V0RGF5Q2xhc3NOYW1lcyIsImNyZWF0ZUVsZW1lbnQiLCJSZW5kZXJIb29rIiwiZGF5SGVhZGVyQ2xhc3NOYW1lcyIsImNvbnRlbnQiLCJkYXlIZWFkZXJDb250ZW50IiwiZGVmYXVsdENvbnRlbnQiLCJyZW5kZXJJbm5lckNvbnRlbnQiLCJkaWRNb3VudCIsImRheUhlYWRlckRpZE1vdW50Iiwid2lsbFVubW91bnQiLCJkYXlIZWFkZXJXaWxsVW5tb3VudCIsInJvb3RFbFJlZiIsImN1c3RvbUNsYXNzTmFtZXMiLCJpbm5lckVsUmVmIiwiaW5uZXJDb250ZW50IiwicmVmIiwiY2xhc3NOYW1lIiwiam9pbiIsImZvcm1hdERheVN0cmluZyIsInNjb3BlIiwiY29sU3BhbiIsImlkIiwiZ2V0Q2xhc3MiLCJCYXNlQ29tcG9uZW50IiwiRnJhZ21lbnQiLCJERUZBVUxUX1RJTUVfRk9STUFUIiwiY3JlYXRlRm9ybWF0dGVyIiwiaG91ciIsIm1pbnV0ZSIsIm1lcmlkaWVtIiwiTGlzdFZpZXdFdmVudFJvdyIsInNlZyIsInRpbWVIZWFkZXJJZCIsImV2ZW50SGVhZGVySWQiLCJkYXRlSGVhZGVySWQiLCJ0aW1lRm9ybWF0IiwiZXZlbnRUaW1lRm9ybWF0IiwiRXZlbnRSb290IiwidGltZVRleHQiLCJkaXNhYmxlRHJhZ2dpbmciLCJkaXNhYmxlUmVzaXppbmciLCJyZW5kZXJFdmVudElubmVyQ29udGVudCIsImlzUGFzdCIsImlzRnV0dXJlIiwiaXNUb2RheSIsImlzU2VsZWN0ZWQiLCJpc0RyYWdnaW5nIiwiaXNSZXNpemluZyIsImlzRGF0ZVNlbGVjdGluZyIsImV2ZW50IiwidXJsIiwiYnVpbGRUaW1lQ29udGVudCIsInN0eWxlIiwiYm9yZGVyQ29sb3IiLCJiYWNrZ3JvdW5kQ29sb3IiLCJoZWFkZXJzIiwiaW50ZXJhY3RpdmVBdHRycyIsImdldFNlZ0FuY2hvckF0dHJzIiwiZXZlbnRSYW5nZSIsImRlZiIsInRpdGxlIiwiZGlzcGxheUV2ZW50VGltZSIsImV2ZW50RGVmIiwiZXZlbnRJbnN0YW5jZSIsImluc3RhbmNlIiwiZG9BbGxEYXkiLCJhbGxEYXkiLCJpc011bHRpRGF5UmFuZ2UiLCJyYW5nZSIsImlzU3RhcnQiLCJidWlsZFNlZ1RpbWVUZXh0Iiwic3RhcnQiLCJlbmQiLCJpc0VuZCIsImFsbERheVRleHQiLCJhbGxEYXlDbGFzc05hbWVzIiwiYWxsRGF5Q29udGVudCIsInJlbmRlckFsbERheUlubmVyIiwiYWxsRGF5RGlkTW91bnQiLCJhbGxEYXlXaWxsVW5tb3VudCIsIkxpc3RWaWV3IiwiY29tcHV0ZURhdGVWYXJzIiwibWVtb2l6ZSIsImV2ZW50U3RvcmVUb1NlZ3MiLCJfZXZlbnRTdG9yZVRvU2VncyIsImRhdGVIZWFkZXJJZFJvb3QiLCJzZXRSb290RWwiLCJyb290RWwiLCJyZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50IiwiZWwiLCJ1bnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQiLCJleHRyYUNsYXNzTmFtZXMiLCJzdGlja3lIZWFkZXJEYXRlcyIsImRhdGVQcm9maWxlIiwiZGF5RGF0ZXMiLCJkYXlSYW5nZXMiLCJldmVudFNlZ3MiLCJldmVudFN0b3JlIiwiZXZlbnRVaUJhc2VzIiwiVmlld1Jvb3QiLCJ2aWV3U3BlYyIsImVsUmVmIiwiU2Nyb2xsZXIiLCJsaXF1aWQiLCJpc0hlaWdodEF1dG8iLCJvdmVyZmxvd1giLCJvdmVyZmxvd1kiLCJsZW5ndGgiLCJyZW5kZXJTZWdMaXN0IiwicmVuZGVyRW1wdHlNZXNzYWdlIiwibm9FdmVudHNUZXh0Iiwibm9FdmVudHNDbGFzc05hbWVzIiwibm9FdmVudHNDb250ZW50IiwicmVuZGVyTm9FdmVudHNJbm5lciIsIm5vRXZlbnRzRGlkTW91bnQiLCJub0V2ZW50c1dpbGxVbm1vdW50IiwiYWxsU2VncyIsInNlZ3NCeURheSIsImdyb3VwU2Vnc0J5RGF5IiwiTm93VGltZXIiLCJ1bml0Iiwibm93RGF0ZSIsImlubmVyTm9kZXMiLCJkYXlJbmRleCIsImRheVNlZ3MiLCJkYXlTdHIiLCJwdXNoIiwia2V5Iiwic29ydEV2ZW50U2VncyIsImV2ZW50T3JkZXIiLCJfaSIsImRheVNlZ3NfMSIsImluc3RhbmNlSWQiLCJnZXRTZWdNZXRhIiwidGltZUhpbnQiLCJldmVudEhpbnQiLCJldmVudFJhbmdlc1RvU2VncyIsInNsaWNlRXZlbnRTdG9yZSIsImFjdGl2ZVJhbmdlIiwibmV4dERheVRocmVzaG9sZCIsImZnIiwiZXZlbnRSYW5nZXMiLCJzZWdzIiwiZXZlbnRSYW5nZXNfMSIsImV2ZW50UmFuZ2VUb1NlZ3MiLCJzZWdSYW5nZSIsImludGVyc2VjdFJhbmdlcyIsImNvbXBvbmVudCIsInZhbHVlT2YiLCJhZGQiLCJEYXRlQ29tcG9uZW50IiwiZGF5U3RhcnQiLCJzdGFydE9mRGF5IiwicmVuZGVyUmFuZ2UiLCJ2aWV3RW5kIiwiYWRkRGF5cyIsImkiLCJPUFRJT05fUkVGSU5FUlMiLCJjcmVhdGVGYWxzYWJsZUZvcm1hdHRlciIsImlkZW50aXR5IiwiaW5wdXQiLCJtYWluIiwiY3JlYXRlUGx1Z2luIiwib3B0aW9uUmVmaW5lcnMiLCJ2aWV3cyIsImxpc3QiLCJidXR0b25UZXh0S2V5IiwibW9udGgiLCJkYXkiLCJ5ZWFyIiwibGlzdERheSIsInR5cGUiLCJkdXJhdGlvbiIsImRheXMiLCJ3ZWVrZGF5IiwibGlzdFdlZWsiLCJ3ZWVrcyIsImxpc3RNb250aCIsImxpc3RZZWFyIl0sInNvdXJjZXMiOlsibWFpbi5janMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG5GdWxsQ2FsZW5kYXIgdjUuMTEuMlxuRG9jcyAmIExpY2Vuc2U6IGh0dHBzOi8vZnVsbGNhbGVuZGFyLmlvL1xuKGMpIDIwMjIgQWRhbSBTaGF3XG4qL1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgY29tbW9uID0gcmVxdWlyZSgnQGZ1bGxjYWxlbmRhci9jb21tb24nKTtcbnZhciB0c2xpYiA9IHJlcXVpcmUoJ3RzbGliJyk7XG47XG5cbnZhciBMaXN0Vmlld0hlYWRlclJvdyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYi5fX2V4dGVuZHMoTGlzdFZpZXdIZWFkZXJSb3csIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTGlzdFZpZXdIZWFkZXJSb3coKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHRleHRJZDogY29tbW9uLmdldFVuaXF1ZURvbUlkKCksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgTGlzdFZpZXdIZWFkZXJSb3cucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5jb250ZXh0LCB0aGVtZSA9IF9hLnRoZW1lLCBkYXRlRW52ID0gX2EuZGF0ZUVudiwgb3B0aW9ucyA9IF9hLm9wdGlvbnMsIHZpZXdBcGkgPSBfYS52aWV3QXBpO1xuICAgICAgICB2YXIgX2IgPSB0aGlzLnByb3BzLCBjZWxsSWQgPSBfYi5jZWxsSWQsIGRheURhdGUgPSBfYi5kYXlEYXRlLCB0b2RheVJhbmdlID0gX2IudG9kYXlSYW5nZTtcbiAgICAgICAgdmFyIHRleHRJZCA9IHRoaXMuc3RhdGUudGV4dElkO1xuICAgICAgICB2YXIgZGF5TWV0YSA9IGNvbW1vbi5nZXREYXRlTWV0YShkYXlEYXRlLCB0b2RheVJhbmdlKTtcbiAgICAgICAgLy8gd2lsbCBldmVyIGJlIGZhbHN5P1xuICAgICAgICB2YXIgdGV4dCA9IG9wdGlvbnMubGlzdERheUZvcm1hdCA/IGRhdGVFbnYuZm9ybWF0KGRheURhdGUsIG9wdGlvbnMubGlzdERheUZvcm1hdCkgOiAnJztcbiAgICAgICAgLy8gd2lsbCBldmVyIGJlIGZhbHN5PyBhbHNvLCBCQUQgTkFNRSBcImFsdFwiXG4gICAgICAgIHZhciBzaWRlVGV4dCA9IG9wdGlvbnMubGlzdERheVNpZGVGb3JtYXQgPyBkYXRlRW52LmZvcm1hdChkYXlEYXRlLCBvcHRpb25zLmxpc3REYXlTaWRlRm9ybWF0KSA6ICcnO1xuICAgICAgICB2YXIgaG9va1Byb3BzID0gdHNsaWIuX19hc3NpZ24oeyBkYXRlOiBkYXRlRW52LnRvRGF0ZShkYXlEYXRlKSwgdmlldzogdmlld0FwaSwgdGV4dElkOiB0ZXh0SWQsXG4gICAgICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICAgICAgc2lkZVRleHQ6IHNpZGVUZXh0LCBuYXZMaW5rQXR0cnM6IGNvbW1vbi5idWlsZE5hdkxpbmtBdHRycyh0aGlzLmNvbnRleHQsIGRheURhdGUpLCBzaWRlTmF2TGlua0F0dHJzOiBjb21tb24uYnVpbGROYXZMaW5rQXR0cnModGhpcy5jb250ZXh0LCBkYXlEYXRlLCAnZGF5JywgZmFsc2UpIH0sIGRheU1ldGEpO1xuICAgICAgICB2YXIgY2xhc3NOYW1lcyA9IFsnZmMtbGlzdC1kYXknXS5jb25jYXQoY29tbW9uLmdldERheUNsYXNzTmFtZXMoZGF5TWV0YSwgdGhlbWUpKTtcbiAgICAgICAgLy8gVE9ETzogbWFrZSBhIHJldXNhYmxlIEhPQyBmb3IgZGF5SGVhZGVyICh1c2VkIGluIGRheWdyaWQvdGltZWdyaWQgdG9vKVxuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5SZW5kZXJIb29rLCB7IGhvb2tQcm9wczogaG9va1Byb3BzLCBjbGFzc05hbWVzOiBvcHRpb25zLmRheUhlYWRlckNsYXNzTmFtZXMsIGNvbnRlbnQ6IG9wdGlvbnMuZGF5SGVhZGVyQ29udGVudCwgZGVmYXVsdENvbnRlbnQ6IHJlbmRlcklubmVyQ29udGVudCwgZGlkTW91bnQ6IG9wdGlvbnMuZGF5SGVhZGVyRGlkTW91bnQsIHdpbGxVbm1vdW50OiBvcHRpb25zLmRheUhlYWRlcldpbGxVbm1vdW50IH0sIGZ1bmN0aW9uIChyb290RWxSZWYsIGN1c3RvbUNsYXNzTmFtZXMsIGlubmVyRWxSZWYsIGlubmVyQ29udGVudCkgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidHJcIiwgeyByZWY6IHJvb3RFbFJlZiwgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmNvbmNhdChjdXN0b21DbGFzc05hbWVzKS5qb2luKCcgJyksIFwiZGF0YS1kYXRlXCI6IGNvbW1vbi5mb3JtYXREYXlTdHJpbmcoZGF5RGF0ZSkgfSxcbiAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGhcIiwgeyBzY29wZTogXCJjb2xncm91cFwiLCBjb2xTcGFuOiAzLCBpZDogY2VsbElkLCBcImFyaWEtbGFiZWxsZWRieVwiOiB0ZXh0SWQgfSxcbiAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogJ2ZjLWxpc3QtZGF5LWN1c2hpb24gJyArIHRoZW1lLmdldENsYXNzKCd0YWJsZUNlbGxTaGFkZWQnKSwgcmVmOiBpbm5lckVsUmVmIH0sIGlubmVyQ29udGVudCkpKSk7IH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBMaXN0Vmlld0hlYWRlclJvdztcbn0oY29tbW9uLkJhc2VDb21wb25lbnQpKTtcbmZ1bmN0aW9uIHJlbmRlcklubmVyQ29udGVudChwcm9wcykge1xuICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLkZyYWdtZW50LCBudWxsLFxuICAgICAgICBwcm9wcy50ZXh0ICYmIChjb21tb24uY3JlYXRlRWxlbWVudChcImFcIiwgdHNsaWIuX19hc3NpZ24oeyBpZDogcHJvcHMudGV4dElkLCBjbGFzc05hbWU6IFwiZmMtbGlzdC1kYXktdGV4dFwiIH0sIHByb3BzLm5hdkxpbmtBdHRycyksIHByb3BzLnRleHQpKSxcbiAgICAgICAgcHJvcHMuc2lkZVRleHQgJiYgKCAvKiBub3Qga2V5Ym9hcmQgdGFiYmFibGUgKi9jb21tb24uY3JlYXRlRWxlbWVudChcImFcIiwgdHNsaWIuX19hc3NpZ24oeyBcImFyaWEtaGlkZGVuXCI6IHRydWUsIGNsYXNzTmFtZTogXCJmYy1saXN0LWRheS1zaWRlLXRleHRcIiB9LCBwcm9wcy5zaWRlTmF2TGlua0F0dHJzKSwgcHJvcHMuc2lkZVRleHQpKSkpO1xufVxuXG52YXIgREVGQVVMVF9USU1FX0ZPUk1BVCA9IGNvbW1vbi5jcmVhdGVGb3JtYXR0ZXIoe1xuICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICBtZXJpZGllbTogJ3Nob3J0Jyxcbn0pO1xudmFyIExpc3RWaWV3RXZlbnRSb3cgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKExpc3RWaWV3RXZlbnRSb3csIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTGlzdFZpZXdFdmVudFJvdygpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBMaXN0Vmlld0V2ZW50Um93LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgc2VnID0gcHJvcHMuc2VnLCB0aW1lSGVhZGVySWQgPSBwcm9wcy50aW1lSGVhZGVySWQsIGV2ZW50SGVhZGVySWQgPSBwcm9wcy5ldmVudEhlYWRlcklkLCBkYXRlSGVhZGVySWQgPSBwcm9wcy5kYXRlSGVhZGVySWQ7XG4gICAgICAgIHZhciB0aW1lRm9ybWF0ID0gY29udGV4dC5vcHRpb25zLmV2ZW50VGltZUZvcm1hdCB8fCBERUZBVUxUX1RJTUVfRk9STUFUO1xuICAgICAgICByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KGNvbW1vbi5FdmVudFJvb3QsIHsgc2VnOiBzZWcsIHRpbWVUZXh0OiBcIlwiIC8vIEJBRC4gYmVjYXVzZSBvZiBhbGwtZGF5IGNvbnRlbnRcbiAgICAgICAgICAgICwgZGlzYWJsZURyYWdnaW5nOiB0cnVlLCBkaXNhYmxlUmVzaXppbmc6IHRydWUsIGRlZmF1bHRDb250ZW50OiBmdW5jdGlvbiAoKSB7IHJldHVybiByZW5kZXJFdmVudElubmVyQ29udGVudChzZWcsIGNvbnRleHQpOyB9IC8qIHdlaXJkICovLCBpc1Bhc3Q6IHByb3BzLmlzUGFzdCwgaXNGdXR1cmU6IHByb3BzLmlzRnV0dXJlLCBpc1RvZGF5OiBwcm9wcy5pc1RvZGF5LCBpc1NlbGVjdGVkOiBwcm9wcy5pc1NlbGVjdGVkLCBpc0RyYWdnaW5nOiBwcm9wcy5pc0RyYWdnaW5nLCBpc1Jlc2l6aW5nOiBwcm9wcy5pc1Jlc2l6aW5nLCBpc0RhdGVTZWxlY3Rpbmc6IHByb3BzLmlzRGF0ZVNlbGVjdGluZyB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQsIGhvb2tQcm9wcykgeyByZXR1cm4gKGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidHJcIiwgeyBjbGFzc05hbWU6IFsnZmMtbGlzdC1ldmVudCcsIGhvb2tQcm9wcy5ldmVudC51cmwgPyAnZmMtZXZlbnQtZm9yY2VkLXVybCcgOiAnJ10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgcmVmOiByb290RWxSZWYgfSxcbiAgICAgICAgICAgIGJ1aWxkVGltZUNvbnRlbnQoc2VnLCB0aW1lRm9ybWF0LCBjb250ZXh0LCB0aW1lSGVhZGVySWQsIGRhdGVIZWFkZXJJZCksXG4gICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRkXCIsIHsgXCJhcmlhLWhpZGRlblwiOiB0cnVlLCBjbGFzc05hbWU6IFwiZmMtbGlzdC1ldmVudC1ncmFwaGljXCIgfSxcbiAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IFwiZmMtbGlzdC1ldmVudC1kb3RcIiwgc3R5bGU6IHsgYm9yZGVyQ29sb3I6IGhvb2tQcm9wcy5ib3JkZXJDb2xvciB8fCBob29rUHJvcHMuYmFja2dyb3VuZENvbG9yIH0gfSkpLFxuICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCB7IHJlZjogaW5uZXJFbFJlZiwgaGVhZGVyczogZXZlbnRIZWFkZXJJZCArIFwiIFwiICsgZGF0ZUhlYWRlcklkLCBjbGFzc05hbWU6IFwiZmMtbGlzdC1ldmVudC10aXRsZVwiIH0sIGlubmVyQ29udGVudCkpKTsgfSkpO1xuICAgIH07XG4gICAgcmV0dXJuIExpc3RWaWV3RXZlbnRSb3c7XG59KGNvbW1vbi5CYXNlQ29tcG9uZW50KSk7XG5mdW5jdGlvbiByZW5kZXJFdmVudElubmVyQ29udGVudChzZWcsIGNvbnRleHQpIHtcbiAgICB2YXIgaW50ZXJhY3RpdmVBdHRycyA9IGNvbW1vbi5nZXRTZWdBbmNob3JBdHRycyhzZWcsIGNvbnRleHQpO1xuICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHRzbGliLl9fYXNzaWduKHt9LCBpbnRlcmFjdGl2ZUF0dHJzKSwgc2VnLmV2ZW50UmFuZ2UuZGVmLnRpdGxlKSk7XG59XG5mdW5jdGlvbiBidWlsZFRpbWVDb250ZW50KHNlZywgdGltZUZvcm1hdCwgY29udGV4dCwgdGltZUhlYWRlcklkLCBkYXRlSGVhZGVySWQpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGNvbnRleHQub3B0aW9ucztcbiAgICBpZiAob3B0aW9ucy5kaXNwbGF5RXZlbnRUaW1lICE9PSBmYWxzZSkge1xuICAgICAgICB2YXIgZXZlbnREZWYgPSBzZWcuZXZlbnRSYW5nZS5kZWY7XG4gICAgICAgIHZhciBldmVudEluc3RhbmNlID0gc2VnLmV2ZW50UmFuZ2UuaW5zdGFuY2U7XG4gICAgICAgIHZhciBkb0FsbERheSA9IGZhbHNlO1xuICAgICAgICB2YXIgdGltZVRleHQgPSB2b2lkIDA7XG4gICAgICAgIGlmIChldmVudERlZi5hbGxEYXkpIHtcbiAgICAgICAgICAgIGRvQWxsRGF5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb21tb24uaXNNdWx0aURheVJhbmdlKHNlZy5ldmVudFJhbmdlLnJhbmdlKSkgeyAvLyBUT0RPOiB1c2UgKCFpc1N0YXJ0IHx8ICFpc0VuZCkgaW5zdGVhZD9cbiAgICAgICAgICAgIGlmIChzZWcuaXNTdGFydCkge1xuICAgICAgICAgICAgICAgIHRpbWVUZXh0ID0gY29tbW9uLmJ1aWxkU2VnVGltZVRleHQoc2VnLCB0aW1lRm9ybWF0LCBjb250ZXh0LCBudWxsLCBudWxsLCBldmVudEluc3RhbmNlLnJhbmdlLnN0YXJ0LCBzZWcuZW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNlZy5pc0VuZCkge1xuICAgICAgICAgICAgICAgIHRpbWVUZXh0ID0gY29tbW9uLmJ1aWxkU2VnVGltZVRleHQoc2VnLCB0aW1lRm9ybWF0LCBjb250ZXh0LCBudWxsLCBudWxsLCBzZWcuc3RhcnQsIGV2ZW50SW5zdGFuY2UucmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvQWxsRGF5ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRpbWVUZXh0ID0gY29tbW9uLmJ1aWxkU2VnVGltZVRleHQoc2VnLCB0aW1lRm9ybWF0LCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9BbGxEYXkpIHtcbiAgICAgICAgICAgIHZhciBob29rUHJvcHMgPSB7XG4gICAgICAgICAgICAgICAgdGV4dDogY29udGV4dC5vcHRpb25zLmFsbERheVRleHQsXG4gICAgICAgICAgICAgICAgdmlldzogY29udGV4dC52aWV3QXBpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLlJlbmRlckhvb2ssIHsgaG9va1Byb3BzOiBob29rUHJvcHMsIGNsYXNzTmFtZXM6IG9wdGlvbnMuYWxsRGF5Q2xhc3NOYW1lcywgY29udGVudDogb3B0aW9ucy5hbGxEYXlDb250ZW50LCBkZWZhdWx0Q29udGVudDogcmVuZGVyQWxsRGF5SW5uZXIsIGRpZE1vdW50OiBvcHRpb25zLmFsbERheURpZE1vdW50LCB3aWxsVW5tb3VudDogb3B0aW9ucy5hbGxEYXlXaWxsVW5tb3VudCB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpIHsgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcInRkXCIsIHsgcmVmOiByb290RWxSZWYsIGhlYWRlcnM6IHRpbWVIZWFkZXJJZCArIFwiIFwiICsgZGF0ZUhlYWRlcklkLCBjbGFzc05hbWU6IFsnZmMtbGlzdC1ldmVudC10aW1lJ10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSB9LCBpbm5lckNvbnRlbnQpKTsgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0ZFwiLCB7IGNsYXNzTmFtZTogXCJmYy1saXN0LWV2ZW50LXRpbWVcIiB9LCB0aW1lVGV4dCkpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHJlbmRlckFsbERheUlubmVyKGhvb2tQcm9wcykge1xuICAgIHJldHVybiBob29rUHJvcHMudGV4dDtcbn1cblxuLypcblJlc3BvbnNpYmxlIGZvciB0aGUgc2Nyb2xsZXIsIGFuZCBmb3J3YXJkaW5nIGV2ZW50LXJlbGF0ZWQgYWN0aW9ucyBpbnRvIHRoZSBcImdyaWRcIi5cbiovXG52YXIgTGlzdFZpZXcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWIuX19leHRlbmRzKExpc3RWaWV3LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIExpc3RWaWV3KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY29tcHV0ZURhdGVWYXJzID0gY29tbW9uLm1lbW9pemUoY29tcHV0ZURhdGVWYXJzKTtcbiAgICAgICAgX3RoaXMuZXZlbnRTdG9yZVRvU2VncyA9IGNvbW1vbi5tZW1vaXplKF90aGlzLl9ldmVudFN0b3JlVG9TZWdzKTtcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICB0aW1lSGVhZGVySWQ6IGNvbW1vbi5nZXRVbmlxdWVEb21JZCgpLFxuICAgICAgICAgICAgZXZlbnRIZWFkZXJJZDogY29tbW9uLmdldFVuaXF1ZURvbUlkKCksXG4gICAgICAgICAgICBkYXRlSGVhZGVySWRSb290OiBjb21tb24uZ2V0VW5pcXVlRG9tSWQoKSxcbiAgICAgICAgfTtcbiAgICAgICAgX3RoaXMuc2V0Um9vdEVsID0gZnVuY3Rpb24gKHJvb3RFbCkge1xuICAgICAgICAgICAgaWYgKHJvb3RFbCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmNvbnRleHQucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudChfdGhpcywge1xuICAgICAgICAgICAgICAgICAgICBlbDogcm9vdEVsLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY29udGV4dC51bnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQoX3RoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIExpc3RWaWV3LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHByb3BzID0gX2EucHJvcHMsIGNvbnRleHQgPSBfYS5jb250ZXh0O1xuICAgICAgICB2YXIgZXh0cmFDbGFzc05hbWVzID0gW1xuICAgICAgICAgICAgJ2ZjLWxpc3QnLFxuICAgICAgICAgICAgY29udGV4dC50aGVtZS5nZXRDbGFzcygndGFibGUnKSxcbiAgICAgICAgICAgIGNvbnRleHQub3B0aW9ucy5zdGlja3lIZWFkZXJEYXRlcyAhPT0gZmFsc2UgPyAnZmMtbGlzdC1zdGlja3knIDogJycsXG4gICAgICAgIF07XG4gICAgICAgIHZhciBfYiA9IHRoaXMuY29tcHV0ZURhdGVWYXJzKHByb3BzLmRhdGVQcm9maWxlKSwgZGF5RGF0ZXMgPSBfYi5kYXlEYXRlcywgZGF5UmFuZ2VzID0gX2IuZGF5UmFuZ2VzO1xuICAgICAgICB2YXIgZXZlbnRTZWdzID0gdGhpcy5ldmVudFN0b3JlVG9TZWdzKHByb3BzLmV2ZW50U3RvcmUsIHByb3BzLmV2ZW50VWlCYXNlcywgZGF5UmFuZ2VzKTtcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uVmlld1Jvb3QsIHsgdmlld1NwZWM6IGNvbnRleHQudmlld1NwZWMsIGVsUmVmOiB0aGlzLnNldFJvb3RFbCB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzKSB7IHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyByZWY6IHJvb3RFbFJlZiwgY2xhc3NOYW1lOiBleHRyYUNsYXNzTmFtZXMuY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSB9LFxuICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoY29tbW9uLlNjcm9sbGVyLCB7IGxpcXVpZDogIXByb3BzLmlzSGVpZ2h0QXV0bywgb3ZlcmZsb3dYOiBwcm9wcy5pc0hlaWdodEF1dG8gPyAndmlzaWJsZScgOiAnaGlkZGVuJywgb3ZlcmZsb3dZOiBwcm9wcy5pc0hlaWdodEF1dG8gPyAndmlzaWJsZScgOiAnYXV0bycgfSwgZXZlbnRTZWdzLmxlbmd0aCA+IDAgP1xuICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlclNlZ0xpc3QoZXZlbnRTZWdzLCBkYXlEYXRlcykgOlxuICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlckVtcHR5TWVzc2FnZSgpKSkpOyB9KSk7XG4gICAgfTtcbiAgICBMaXN0Vmlldy5wcm90b3R5cGUucmVuZGVyRW1wdHlNZXNzYWdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmNvbnRleHQsIG9wdGlvbnMgPSBfYS5vcHRpb25zLCB2aWV3QXBpID0gX2Eudmlld0FwaTtcbiAgICAgICAgdmFyIGhvb2tQcm9wcyA9IHtcbiAgICAgICAgICAgIHRleHQ6IG9wdGlvbnMubm9FdmVudHNUZXh0LFxuICAgICAgICAgICAgdmlldzogdmlld0FwaSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uUmVuZGVySG9vaywgeyBob29rUHJvcHM6IGhvb2tQcm9wcywgY2xhc3NOYW1lczogb3B0aW9ucy5ub0V2ZW50c0NsYXNzTmFtZXMsIGNvbnRlbnQ6IG9wdGlvbnMubm9FdmVudHNDb250ZW50LCBkZWZhdWx0Q29udGVudDogcmVuZGVyTm9FdmVudHNJbm5lciwgZGlkTW91bnQ6IG9wdGlvbnMubm9FdmVudHNEaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMubm9FdmVudHNXaWxsVW5tb3VudCB9LCBmdW5jdGlvbiAocm9vdEVsUmVmLCBjbGFzc05hbWVzLCBpbm5lckVsUmVmLCBpbm5lckNvbnRlbnQpIHsgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogWydmYy1saXN0LWVtcHR5J10uY29uY2F0KGNsYXNzTmFtZXMpLmpvaW4oJyAnKSwgcmVmOiByb290RWxSZWYgfSxcbiAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWxpc3QtZW1wdHktY3VzaGlvblwiLCByZWY6IGlubmVyRWxSZWYgfSwgaW5uZXJDb250ZW50KSkpOyB9KSk7XG4gICAgfTtcbiAgICBMaXN0Vmlldy5wcm90b3R5cGUucmVuZGVyU2VnTGlzdCA9IGZ1bmN0aW9uIChhbGxTZWdzLCBkYXlEYXRlcykge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmNvbnRleHQsIHRoZW1lID0gX2EudGhlbWUsIG9wdGlvbnMgPSBfYS5vcHRpb25zO1xuICAgICAgICB2YXIgX2IgPSB0aGlzLnN0YXRlLCB0aW1lSGVhZGVySWQgPSBfYi50aW1lSGVhZGVySWQsIGV2ZW50SGVhZGVySWQgPSBfYi5ldmVudEhlYWRlcklkLCBkYXRlSGVhZGVySWRSb290ID0gX2IuZGF0ZUhlYWRlcklkUm9vdDtcbiAgICAgICAgdmFyIHNlZ3NCeURheSA9IGdyb3VwU2Vnc0J5RGF5KGFsbFNlZ3MpOyAvLyBzcGFyc2UgYXJyYXlcbiAgICAgICAgcmV0dXJuIChjb21tb24uY3JlYXRlRWxlbWVudChjb21tb24uTm93VGltZXIsIHsgdW5pdDogXCJkYXlcIiB9LCBmdW5jdGlvbiAobm93RGF0ZSwgdG9kYXlSYW5nZSkge1xuICAgICAgICAgICAgdmFyIGlubmVyTm9kZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGRheUluZGV4ID0gMDsgZGF5SW5kZXggPCBzZWdzQnlEYXkubGVuZ3RoOyBkYXlJbmRleCArPSAxKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRheVNlZ3MgPSBzZWdzQnlEYXlbZGF5SW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChkYXlTZWdzKSB7IC8vIHNwYXJzZSBhcnJheSwgc28gbWlnaHQgYmUgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXlTdHIgPSBjb21tb24uZm9ybWF0RGF5U3RyaW5nKGRheURhdGVzW2RheUluZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRlSGVhZGVySWQgPSBkYXRlSGVhZGVySWRSb290ICsgJy0nICsgZGF5U3RyO1xuICAgICAgICAgICAgICAgICAgICAvLyBhcHBlbmQgYSBkYXkgaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgIGlubmVyTm9kZXMucHVzaChjb21tb24uY3JlYXRlRWxlbWVudChMaXN0Vmlld0hlYWRlclJvdywgeyBrZXk6IGRheVN0ciwgY2VsbElkOiBkYXRlSGVhZGVySWQsIGRheURhdGU6IGRheURhdGVzW2RheUluZGV4XSwgdG9kYXlSYW5nZTogdG9kYXlSYW5nZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgIGRheVNlZ3MgPSBjb21tb24uc29ydEV2ZW50U2VncyhkYXlTZWdzLCBvcHRpb25zLmV2ZW50T3JkZXIpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGRheVNlZ3NfMSA9IGRheVNlZ3M7IF9pIDwgZGF5U2Vnc18xLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlZyA9IGRheVNlZ3NfMVtfaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lck5vZGVzLnB1c2goY29tbW9uLmNyZWF0ZUVsZW1lbnQoTGlzdFZpZXdFdmVudFJvdywgdHNsaWIuX19hc3NpZ24oeyBrZXk6IGRheVN0ciArICc6JyArIHNlZy5ldmVudFJhbmdlLmluc3RhbmNlLmluc3RhbmNlSWQgLyogYXJlIG11bHRpcGxlIHNlZ3MgZm9yIGFuIGluc3RhbmNlSWQgKi8sIHNlZzogc2VnLCBpc0RyYWdnaW5nOiBmYWxzZSwgaXNSZXNpemluZzogZmFsc2UsIGlzRGF0ZVNlbGVjdGluZzogZmFsc2UsIGlzU2VsZWN0ZWQ6IGZhbHNlLCB0aW1lSGVhZGVySWQ6IHRpbWVIZWFkZXJJZCwgZXZlbnRIZWFkZXJJZDogZXZlbnRIZWFkZXJJZCwgZGF0ZUhlYWRlcklkOiBkYXRlSGVhZGVySWQgfSwgY29tbW9uLmdldFNlZ01ldGEoc2VnLCB0b2RheVJhbmdlLCBub3dEYXRlKSkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCB7IGNsYXNzTmFtZTogJ2ZjLWxpc3QtdGFibGUgJyArIHRoZW1lLmdldENsYXNzKCd0YWJsZScpIH0sXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0aGVhZFwiLCBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRyXCIsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRoXCIsIHsgc2NvcGU6IFwiY29sXCIsIGlkOiB0aW1lSGVhZGVySWQgfSwgb3B0aW9ucy50aW1lSGludCksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tb24uY3JlYXRlRWxlbWVudChcInRoXCIsIHsgc2NvcGU6IFwiY29sXCIsIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbi5jcmVhdGVFbGVtZW50KFwidGhcIiwgeyBzY29wZTogXCJjb2xcIiwgaWQ6IGV2ZW50SGVhZGVySWQgfSwgb3B0aW9ucy5ldmVudEhpbnQpKSksXG4gICAgICAgICAgICAgICAgY29tbW9uLmNyZWF0ZUVsZW1lbnQoXCJ0Ym9keVwiLCBudWxsLCBpbm5lck5vZGVzKSkpO1xuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICBMaXN0Vmlldy5wcm90b3R5cGUuX2V2ZW50U3RvcmVUb1NlZ3MgPSBmdW5jdGlvbiAoZXZlbnRTdG9yZSwgZXZlbnRVaUJhc2VzLCBkYXlSYW5nZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRSYW5nZXNUb1NlZ3MoY29tbW9uLnNsaWNlRXZlbnRTdG9yZShldmVudFN0b3JlLCBldmVudFVpQmFzZXMsIHRoaXMucHJvcHMuZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2UsIHRoaXMuY29udGV4dC5vcHRpb25zLm5leHREYXlUaHJlc2hvbGQpLmZnLCBkYXlSYW5nZXMpO1xuICAgIH07XG4gICAgTGlzdFZpZXcucHJvdG90eXBlLmV2ZW50UmFuZ2VzVG9TZWdzID0gZnVuY3Rpb24gKGV2ZW50UmFuZ2VzLCBkYXlSYW5nZXMpIHtcbiAgICAgICAgdmFyIHNlZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBldmVudFJhbmdlc18xID0gZXZlbnRSYW5nZXM7IF9pIDwgZXZlbnRSYW5nZXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhciBldmVudFJhbmdlID0gZXZlbnRSYW5nZXNfMVtfaV07XG4gICAgICAgICAgICBzZWdzLnB1c2guYXBwbHkoc2VncywgdGhpcy5ldmVudFJhbmdlVG9TZWdzKGV2ZW50UmFuZ2UsIGRheVJhbmdlcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWdzO1xuICAgIH07XG4gICAgTGlzdFZpZXcucHJvdG90eXBlLmV2ZW50UmFuZ2VUb1NlZ3MgPSBmdW5jdGlvbiAoZXZlbnRSYW5nZSwgZGF5UmFuZ2VzKSB7XG4gICAgICAgIHZhciBkYXRlRW52ID0gdGhpcy5jb250ZXh0LmRhdGVFbnY7XG4gICAgICAgIHZhciBuZXh0RGF5VGhyZXNob2xkID0gdGhpcy5jb250ZXh0Lm9wdGlvbnMubmV4dERheVRocmVzaG9sZDtcbiAgICAgICAgdmFyIHJhbmdlID0gZXZlbnRSYW5nZS5yYW5nZTtcbiAgICAgICAgdmFyIGFsbERheSA9IGV2ZW50UmFuZ2UuZGVmLmFsbERheTtcbiAgICAgICAgdmFyIGRheUluZGV4O1xuICAgICAgICB2YXIgc2VnUmFuZ2U7XG4gICAgICAgIHZhciBzZWc7XG4gICAgICAgIHZhciBzZWdzID0gW107XG4gICAgICAgIGZvciAoZGF5SW5kZXggPSAwOyBkYXlJbmRleCA8IGRheVJhbmdlcy5sZW5ndGg7IGRheUluZGV4ICs9IDEpIHtcbiAgICAgICAgICAgIHNlZ1JhbmdlID0gY29tbW9uLmludGVyc2VjdFJhbmdlcyhyYW5nZSwgZGF5UmFuZ2VzW2RheUluZGV4XSk7XG4gICAgICAgICAgICBpZiAoc2VnUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICBzZWcgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRSYW5nZTogZXZlbnRSYW5nZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHNlZ1JhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IHNlZ1JhbmdlLmVuZCxcbiAgICAgICAgICAgICAgICAgICAgaXNTdGFydDogZXZlbnRSYW5nZS5pc1N0YXJ0ICYmIHNlZ1JhbmdlLnN0YXJ0LnZhbHVlT2YoKSA9PT0gcmFuZ2Uuc3RhcnQudmFsdWVPZigpLFxuICAgICAgICAgICAgICAgICAgICBpc0VuZDogZXZlbnRSYW5nZS5pc0VuZCAmJiBzZWdSYW5nZS5lbmQudmFsdWVPZigpID09PSByYW5nZS5lbmQudmFsdWVPZigpLFxuICAgICAgICAgICAgICAgICAgICBkYXlJbmRleDogZGF5SW5kZXgsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBzZWdzLnB1c2goc2VnKTtcbiAgICAgICAgICAgICAgICAvLyBkZXRlY3Qgd2hlbiByYW5nZSB3b24ndCBnbyBmdWxseSBpbnRvIHRoZSBuZXh0IGRheSxcbiAgICAgICAgICAgICAgICAvLyBhbmQgbXV0YXRlIHRoZSBsYXRlc3Qgc2VnIHRvIHRoZSBiZSB0aGUgZW5kLlxuICAgICAgICAgICAgICAgIGlmICghc2VnLmlzRW5kICYmICFhbGxEYXkgJiZcbiAgICAgICAgICAgICAgICAgICAgZGF5SW5kZXggKyAxIDwgZGF5UmFuZ2VzLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICByYW5nZS5lbmQgPFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUVudi5hZGQoZGF5UmFuZ2VzW2RheUluZGV4ICsgMV0uc3RhcnQsIG5leHREYXlUaHJlc2hvbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZy5lbmQgPSByYW5nZS5lbmQ7XG4gICAgICAgICAgICAgICAgICAgIHNlZy5pc0VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VncztcbiAgICB9O1xuICAgIHJldHVybiBMaXN0Vmlldztcbn0oY29tbW9uLkRhdGVDb21wb25lbnQpKTtcbmZ1bmN0aW9uIHJlbmRlck5vRXZlbnRzSW5uZXIoaG9va1Byb3BzKSB7XG4gICAgcmV0dXJuIGhvb2tQcm9wcy50ZXh0O1xufVxuZnVuY3Rpb24gY29tcHV0ZURhdGVWYXJzKGRhdGVQcm9maWxlKSB7XG4gICAgdmFyIGRheVN0YXJ0ID0gY29tbW9uLnN0YXJ0T2ZEYXkoZGF0ZVByb2ZpbGUucmVuZGVyUmFuZ2Uuc3RhcnQpO1xuICAgIHZhciB2aWV3RW5kID0gZGF0ZVByb2ZpbGUucmVuZGVyUmFuZ2UuZW5kO1xuICAgIHZhciBkYXlEYXRlcyA9IFtdO1xuICAgIHZhciBkYXlSYW5nZXMgPSBbXTtcbiAgICB3aGlsZSAoZGF5U3RhcnQgPCB2aWV3RW5kKSB7XG4gICAgICAgIGRheURhdGVzLnB1c2goZGF5U3RhcnQpO1xuICAgICAgICBkYXlSYW5nZXMucHVzaCh7XG4gICAgICAgICAgICBzdGFydDogZGF5U3RhcnQsXG4gICAgICAgICAgICBlbmQ6IGNvbW1vbi5hZGREYXlzKGRheVN0YXJ0LCAxKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGRheVN0YXJ0ID0gY29tbW9uLmFkZERheXMoZGF5U3RhcnQsIDEpO1xuICAgIH1cbiAgICByZXR1cm4geyBkYXlEYXRlczogZGF5RGF0ZXMsIGRheVJhbmdlczogZGF5UmFuZ2VzIH07XG59XG4vLyBSZXR1cm5zIGEgc3BhcnNlIGFycmF5IG9mIGFycmF5cywgc2VncyBncm91cGVkIGJ5IHRoZWlyIGRheUluZGV4XG5mdW5jdGlvbiBncm91cFNlZ3NCeURheShzZWdzKSB7XG4gICAgdmFyIHNlZ3NCeURheSA9IFtdOyAvLyBzcGFyc2UgYXJyYXlcbiAgICB2YXIgaTtcbiAgICB2YXIgc2VnO1xuICAgIGZvciAoaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHNlZyA9IHNlZ3NbaV07XG4gICAgICAgIChzZWdzQnlEYXlbc2VnLmRheUluZGV4XSB8fCAoc2Vnc0J5RGF5W3NlZy5kYXlJbmRleF0gPSBbXSkpXG4gICAgICAgICAgICAucHVzaChzZWcpO1xuICAgIH1cbiAgICByZXR1cm4gc2Vnc0J5RGF5O1xufVxuXG52YXIgT1BUSU9OX1JFRklORVJTID0ge1xuICAgIGxpc3REYXlGb3JtYXQ6IGNyZWF0ZUZhbHNhYmxlRm9ybWF0dGVyLFxuICAgIGxpc3REYXlTaWRlRm9ybWF0OiBjcmVhdGVGYWxzYWJsZUZvcm1hdHRlcixcbiAgICBub0V2ZW50c0NsYXNzTmFtZXM6IGNvbW1vbi5pZGVudGl0eSxcbiAgICBub0V2ZW50c0NvbnRlbnQ6IGNvbW1vbi5pZGVudGl0eSxcbiAgICBub0V2ZW50c0RpZE1vdW50OiBjb21tb24uaWRlbnRpdHksXG4gICAgbm9FdmVudHNXaWxsVW5tb3VudDogY29tbW9uLmlkZW50aXR5LFxuICAgIC8vIG5vRXZlbnRzVGV4dCBpcyBkZWZpbmVkIGluIGJhc2Ugb3B0aW9uc1xufTtcbmZ1bmN0aW9uIGNyZWF0ZUZhbHNhYmxlRm9ybWF0dGVyKGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0ID09PSBmYWxzZSA/IG51bGwgOiBjb21tb24uY3JlYXRlRm9ybWF0dGVyKGlucHV0KTtcbn1cblxudmFyIG1haW4gPSBjb21tb24uY3JlYXRlUGx1Z2luKHtcbiAgICBvcHRpb25SZWZpbmVyczogT1BUSU9OX1JFRklORVJTLFxuICAgIHZpZXdzOiB7XG4gICAgICAgIGxpc3Q6IHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogTGlzdFZpZXcsXG4gICAgICAgICAgICBidXR0b25UZXh0S2V5OiAnbGlzdCcsXG4gICAgICAgICAgICBsaXN0RGF5Rm9ybWF0OiB7IG1vbnRoOiAnbG9uZycsIGRheTogJ251bWVyaWMnLCB5ZWFyOiAnbnVtZXJpYycgfSwgLy8gbGlrZSBcIkphbnVhcnkgMSwgMjAxNlwiXG4gICAgICAgIH0sXG4gICAgICAgIGxpc3REYXk6IHtcbiAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB7IGRheXM6IDEgfSxcbiAgICAgICAgICAgIGxpc3REYXlGb3JtYXQ6IHsgd2Vla2RheTogJ2xvbmcnIH0sIC8vIGRheS1vZi13ZWVrIGlzIGFsbCB3ZSBuZWVkLiBmdWxsIGRhdGUgaXMgcHJvYmFibHkgaW4gaGVhZGVyVG9vbGJhclxuICAgICAgICB9LFxuICAgICAgICBsaXN0V2Vlazoge1xuICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxuICAgICAgICAgICAgZHVyYXRpb246IHsgd2Vla3M6IDEgfSxcbiAgICAgICAgICAgIGxpc3REYXlGb3JtYXQ6IHsgd2Vla2RheTogJ2xvbmcnIH0sXG4gICAgICAgICAgICBsaXN0RGF5U2lkZUZvcm1hdDogeyBtb250aDogJ2xvbmcnLCBkYXk6ICdudW1lcmljJywgeWVhcjogJ251bWVyaWMnIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGxpc3RNb250aDoge1xuICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxuICAgICAgICAgICAgZHVyYXRpb246IHsgbW9udGg6IDEgfSxcbiAgICAgICAgICAgIGxpc3REYXlTaWRlRm9ybWF0OiB7IHdlZWtkYXk6ICdsb25nJyB9LCAvLyBkYXktb2Ytd2VlayBpcyBuaWNlLXRvLWhhdmVcbiAgICAgICAgfSxcbiAgICAgICAgbGlzdFllYXI6IHtcbiAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB7IHllYXI6IDEgfSxcbiAgICAgICAgICAgIGxpc3REYXlTaWRlRm9ybWF0OiB7IHdlZWtkYXk6ICdsb25nJyB9LCAvLyBkYXktb2Ytd2VlayBpcyBuaWNlLXRvLWhhdmVcbiAgICAgICAgfSxcbiAgICB9LFxufSk7XG5cbmV4cG9ydHMuTGlzdFZpZXcgPSBMaXN0VmlldztcbmV4cG9ydHMuZGVmYXVsdCA9IG1haW47XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQUEsTUFBTSxDQUFDQyxjQUFQLENBQXNCQyxPQUF0QixFQUErQixZQUEvQixFQUE2QztFQUFFQyxLQUFLLEVBQUU7QUFBVCxDQUE3Qzs7QUFFQSxJQUFJQyxNQUFNLEdBQUdDLE9BQU8sQ0FBQyxzQkFBRCxDQUFwQjs7QUFDQSxJQUFJQyxLQUFLLEdBQUdELE9BQU8sQ0FBQyxPQUFELENBQW5COztBQUNBOztBQUVBLElBQUlFLGlCQUFpQjtBQUFHO0FBQWUsVUFBVUMsTUFBVixFQUFrQjtFQUNyREYsS0FBSyxDQUFDRyxTQUFOLENBQWdCRixpQkFBaEIsRUFBbUNDLE1BQW5DOztFQUNB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 },{"@fullcalendar/common":1,"tslib":32}],8:[function(require,module,exports){ /*! FullCalendar v5.11.2 Docs & License: https://fullcalendar.io/ (c) 2022 Adam Shaw */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var common = require('@fullcalendar/common'); var tslib = require('tslib'); var daygrid = require('@fullcalendar/daygrid'); ; var AllDaySplitter = /** @class */ function (_super) { tslib.__extends(AllDaySplitter, _super); function AllDaySplitter() { return _super !== null && _super.apply(this, arguments) || this; } AllDaySplitter.prototype.getKeyInfo = function () { return { allDay: {}, timed: {} }; }; AllDaySplitter.prototype.getKeysForDateSpan = function (dateSpan) { if (dateSpan.allDay) { return ['allDay']; } return ['timed']; }; AllDaySplitter.prototype.getKeysForEventDef = function (eventDef) { if (!eventDef.allDay) { return ['timed']; } if (common.hasBgRendering(eventDef)) { return ['timed', 'allDay']; } return ['allDay']; }; return AllDaySplitter; }(common.Splitter); var DEFAULT_SLAT_LABEL_FORMAT = common.createFormatter({ hour: 'numeric', minute: '2-digit', omitZeroMinute: true, meridiem: 'short' }); function TimeColsAxisCell(props) { var classNames = ['fc-timegrid-slot', 'fc-timegrid-slot-label', props.isLabeled ? 'fc-scrollgrid-shrink' : 'fc-timegrid-slot-minor']; return common.createElement(common.ViewContextType.Consumer, null, function (context) { if (!props.isLabeled) { return common.createElement("td", { className: classNames.join(' '), "data-time": props.isoTimeStr }); } var dateEnv = context.dateEnv, options = context.options, viewApi = context.viewApi; var labelFormat = // TODO: fully pre-parse options.slotLabelFormat == null ? DEFAULT_SLAT_LABEL_FORMAT : Array.isArray(options.slotLabelFormat) ? common.createFormatter(options.slotLabelFormat[0]) : common.createFormatter(options.slotLabelFormat); var hookProps = { level: 0, time: props.time, date: dateEnv.toDate(props.date), view: viewApi, text: dateEnv.format(props.date, labelFormat) }; return common.createElement(common.RenderHook, { hookProps: hookProps, classNames: options.slotLabelClassNames, content: options.slotLabelContent, defaultContent: renderInnerContent, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return common.createElement("td", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-time": props.isoTimeStr }, common.createElement("div", { className: "fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame" }, common.createElement("div", { className: "fc-timegrid-slot-label-cushion fc-scrollgrid-shrink-cushion", ref: innerElRef }, innerContent))); }); }); } function renderInnerContent(props) { return props.text; } var TimeBodyAxis = /** @class */ function (_super) { tslib.__extends(TimeBodyAxis, _super); function TimeBodyAxis() { return _super !== null && _super.apply(this, arguments) || this; } TimeBodyAxis.prototype.render = function () { return this.props.slatMetas.map(function (slatMeta) { return common.createElement("tr", { key: slatMeta.key }, common.createElement(TimeColsAxisCell, tslib.__assign({}, slatMeta))); }); }; return TimeBodyAxis; }(common.BaseComponent); var DEFAULT_WEEK_NUM_FORMAT = common.createFormatter({ week: 'short' }); var AUTO_ALL_DAY_MAX_EVENT_ROWS = 5; var TimeColsView = /** @class */ function (_super) { tslib.__extends(TimeColsView, _super); function TimeColsView() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.allDaySplitter = new AllDaySplitter(); // for use by subclasses _this.headerElRef = common.createRef(); _this.rootElRef = common.createRef(); _this.scrollerElRef = common.createRef(); _this.state = { slatCoords: null }; _this.handleScrollTopRequest = function (scrollTop) { var scrollerEl = _this.scrollerElRef.current; if (scrollerEl) { // TODO: not sure how this could ever be null. weirdness with the reducer scrollerEl.scrollTop = scrollTop; } }; /* Header Render Methods ------------------------------------------------------------------------------------------------------------------*/ _this.renderHeadAxis = function (rowKey, frameHeight) { if (frameHeight === void 0) { frameHeight = ''; } var options = _this.context.options; var dateProfile = _this.props.dateProfile; var range = dateProfile.renderRange; var dayCnt = common.diffDays(range.start, range.end); var navLinkAttrs = dayCnt === 1 // only do in day views (to avoid doing in week views that dont need it) ? common.buildNavLinkAttrs(_this.context, range.start, 'week') : {}; if (options.weekNumbers && rowKey === 'day') { return common.createElement(common.WeekNumberRoot, { date: range.start, defaultFormat: DEFAULT_WEEK_NUM_FORMAT }, function (rootElRef, classNames, innerElRef, innerContent) { return common.createElement("th", { ref: rootElRef, "aria-hidden": true, className: ['fc-timegrid-axis', 'fc-scrollgrid-shrink'].concat(classNames).join(' ') }, common.createElement("div", { className: "fc-timegrid-axis-frame fc-scrollgrid-shrink-frame fc-timegrid-axis-frame-liquid", style: { height: frameHeight } }, common.createElement("a", tslib.__assign({ ref: innerElRef, className: "fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner" }, navLinkAttrs), innerContent))); }); } return common.createElement("th", { "aria-hidden": true, className: "fc-timegrid-axis" }, common.createElement("div", { className: "fc-timegrid-axis-frame", style: { height: frameHeight } })); }; /* Table Component Render Methods ------------------------------------------------------------------------------------------------------------------*/ // only a one-way height sync. we don't send the axis inner-content height to the DayGrid, // but DayGrid still needs to have classNames on inner elements in order to measure. _this.renderTableRowAxis = function (rowHeight) { var _a = _this.context, options = _a.options, viewApi = _a.viewApi; var hookProps = { text: options.allDayText, view: viewApi }; return (// TODO: make reusable hook. used in list view too common.createElement(common.RenderHook, { hookProps: hookProps, classNames: options.allDayClassNames, content: options.allDayContent, defaultContent: renderAllDayInner, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return common.createElement("td", { ref: rootElRef, "aria-hidden": true, className: ['fc-timegrid-axis', 'fc-scrollgrid-shrink'].concat(classNames).join(' ') }, common.createElement("div", { className: 'fc-timegrid-axis-frame fc-scrollgrid-shrink-frame' + (rowHeight == null ? ' fc-timegrid-axis-frame-liquid' : ''), style: { height: rowHeight } }, common.createElement("span", { className: "fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner", ref: innerElRef }, innerContent))); }) ); }; _this.handleSlatCoords = function (slatCoords) { _this.setState({ slatCoords: slatCoords }); }; return _this; } // rendering // ---------------------------------------------------------------------------------------------------- TimeColsView.prototype.renderSimpleLayout = function (headerRowContent, allDayContent, timeContent) { var _a = this, context = _a.context, props = _a.props; var sections = []; var stickyHeaderDates = common.getStickyHeaderDates(context.options); if (headerRowContent) { sections.push({ type: 'header', key: 'header', isSticky: stickyHeaderDates, chunk: { elRef: this.headerElRef, tableClassName: 'fc-col-header', rowContent: headerRowContent } }); } if (allDayContent) { sections.push({ type: 'body', key: 'all-day', chunk: { content: allDayContent } }); sections.push({ type: 'body', key: 'all-day-divider', outerContent: // TODO: rename to cellContent so don't need to define