UNPKG

angular-calendar-scheduler

Version:

This project provide a scheduler view component for [mattlewis92/angular-calendar](https://github.com/mattlewis92/angular-calendar).

247 lines 44.4 kB
export var DAYS_OF_WEEK; (function (DAYS_OF_WEEK) { DAYS_OF_WEEK[DAYS_OF_WEEK["SUNDAY"] = 0] = "SUNDAY"; DAYS_OF_WEEK[DAYS_OF_WEEK["MONDAY"] = 1] = "MONDAY"; DAYS_OF_WEEK[DAYS_OF_WEEK["TUESDAY"] = 2] = "TUESDAY"; DAYS_OF_WEEK[DAYS_OF_WEEK["WEDNESDAY"] = 3] = "WEDNESDAY"; DAYS_OF_WEEK[DAYS_OF_WEEK["THURSDAY"] = 4] = "THURSDAY"; DAYS_OF_WEEK[DAYS_OF_WEEK["FRIDAY"] = 5] = "FRIDAY"; DAYS_OF_WEEK[DAYS_OF_WEEK["SATURDAY"] = 6] = "SATURDAY"; })(DAYS_OF_WEEK || (DAYS_OF_WEEK = {})); const DEFAULT_WEEKEND_DAYS = [ DAYS_OF_WEEK.SUNDAY, DAYS_OF_WEEK.SATURDAY ]; export const DAYS_IN_WEEK = 7; export const HOURS_IN_DAY = 24; export const MINUTES_IN_HOUR = 60; export const SECONDS_IN_DAY = 60 * 60 * 24; export const DEFAULT_HOUR_SEGMENT_HEIGHT_PX = 40; export const DEFAULT_EVENT_WIDTH_PERCENT = 100; export const DEFAULT_HOUR_SEGMENTS = 2; export function getSchedulerViewHourGrid(dateAdapter, args) { const viewDate = args.viewDate, hourSegments = args.hourSegments, dayStart = args.dayStart, dayEnd = args.dayEnd; const hours = []; const startOfView = dateAdapter.setMinutes(dateAdapter.setHours(dateAdapter.startOfDay(viewDate), dayStart.hour), dayStart.minute); const endOfView = dateAdapter.setMinutes(dateAdapter.setHours(dateAdapter.startOfMinute(dateAdapter.endOfDay(viewDate)), dayEnd.hour), dayEnd.minute); const segmentDuration = MINUTES_IN_HOUR / hourSegments; const startOfViewDay = dateAdapter.startOfDay(viewDate); const range = (start, end) => Array.from({ length: ((end + 1) - start) }, (v, k) => k + start); const hoursInView = range(dayStart.hour, dayEnd.hour); hoursInView.forEach((hour, i) => { const segments = []; for (let j = 0; j < hourSegments; j++) { const date = dateAdapter.addMinutes(dateAdapter.addHours(startOfViewDay, hour), j * segmentDuration); if (date >= startOfView && date < endOfView) { segments.push({ date: date, isStart: j === 0 }); } } if (segments.length > 0) { hours.push({ segments: segments }); } }); return hours; } export function getSchedulerView(dateAdapter, args) { let events = args.events || []; if (!events) { events = []; } const viewDate = args.viewDate; const weekStartsOn = args.weekStartsOn; const startsWithToday = args.startsWithToday; const excluded = args.excluded || []; const hourSegments = args.hourSegments || DEFAULT_HOUR_SEGMENTS; const hourSegmentHeight = args.hourSegmentHeight || DEFAULT_HOUR_SEGMENT_HEIGHT_PX; const eventWidth = args.eventWidth || DEFAULT_EVENT_WIDTH_PERCENT; const dayStart = args.dayStart, dayEnd = args.dayEnd; const startOfViewWeek = startsWithToday ? dateAdapter.startOfDay(viewDate) : dateAdapter.startOfWeek(viewDate, { weekStartsOn: weekStartsOn }); const endOfViewWeek = startsWithToday ? dateAdapter.addDays(dateAdapter.endOfDay(viewDate), 6) : dateAdapter.endOfWeek(viewDate, { weekStartsOn: weekStartsOn }); const eventsInWeek = getEventsInPeriod(dateAdapter, { events: events, periodStart: startOfViewWeek, periodEnd: endOfViewWeek }); const days = getSchedulerViewDays(dateAdapter, { viewDate: viewDate, weekStartsOn: weekStartsOn, startsWithToday: startsWithToday, excluded: excluded }); days.forEach((day) => { const startOfView = dateAdapter.setMinutes(dateAdapter.setHours(dateAdapter.startOfDay(day.date), dayStart.hour), dayStart.minute); const endOfView = dateAdapter.setMinutes(dateAdapter.setHours(dateAdapter.startOfMinute(dateAdapter.endOfDay(day.date)), dayEnd.hour), dayEnd.minute); const previousDayEvents = []; const eventsInDay = getEventsInPeriod(dateAdapter, { events: eventsInWeek, periodStart: startOfView, periodEnd: endOfView }); day.events = eventsInDay .sort((eventA, eventB) => eventA.start.valueOf() - eventB.start.valueOf()) .map((ev) => { const eventStart = ev.start; const eventEnd = ev.end || eventStart; const startsBeforeDay = eventStart < startOfView; const endsAfterDay = dateAdapter.addMinutes(eventEnd, -1) > endOfView; const hourHeightModifier = ((hourSegments * hourSegmentHeight) + 1) / MINUTES_IN_HOUR; // +1 for the 1px segment bottom border let top = 0; if (eventStart > startOfView) { top += dateAdapter.differenceInMinutes(eventStart, startOfView); } top *= hourHeightModifier; const startDate = startsBeforeDay ? startOfView : eventStart; const endDate = endsAfterDay ? endOfView : eventEnd; let height = dateAdapter.differenceInMinutes(endDate, startDate); if (!ev.end) { height = hourSegmentHeight; } else { height *= hourHeightModifier; } const bottom = top + height; const overlappingPreviousEvents = getOverLappingDayViewEvents(previousDayEvents, top, bottom); let left = 0; while (overlappingPreviousEvents.some(previousEvent => previousEvent.left === left)) { left += eventWidth; } const event = { event: ev, top: top, height: height, width: eventWidth, left: left, startsBeforeDay: startsBeforeDay, endsAfterDay: endsAfterDay, isProcessed: false }; previousDayEvents.push(event); return event; }); day.hours = getSchedulerViewHourGrid(dateAdapter, { viewDate: viewDate, hourSegments: hourSegments, dayStart: { hour: dayStart.hour, minute: dayStart.minute }, dayEnd: { hour: dayEnd.hour, minute: dayEnd.minute } }).map((hour) => { const date = new Date(day.date.getFullYear(), day.date.getMonth(), day.date.getDate(), hour.segments[0].date.getHours()); const startOfHour = new Date(day.date.getFullYear(), day.date.getMonth(), day.date.getDate(), hour.segments[0].date.getHours()); const endOfHour = dateAdapter.addMinutes(dateAdapter.addHours(startOfHour, 1), -1); const eventsInHour = getEventsInPeriod(dateAdapter, { events: eventsInDay, periodStart: startOfHour, periodEnd: endOfHour }); const segments = hour.segments.map((segment) => { segment.date = dateAdapter.setDate(dateAdapter.setMonth(dateAdapter.setYear(segment.date, day.date.getFullYear()), day.date.getMonth()), day.date.getDate()); const startOfSegment = segment.date; const endOfSegment = dateAdapter.addMinutes(segment.date, MINUTES_IN_HOUR / hourSegments); const eventsInSegment = getEventsInPeriod(dateAdapter, { events: eventsInHour, periodStart: startOfSegment, periodEnd: endOfSegment }); return { segment: segment, date: new Date(segment.date), events: eventsInSegment }; }); return { hour: hour, date: date, events: eventsInHour, segments: segments }; }); }); return { days: days, period: { events: eventsInWeek, start: startOfViewWeek, end: endOfViewWeek } }; } export function getSchedulerViewDays(dateAdapter, args) { const viewDate = args.viewDate; const weekStartsOn = args.weekStartsOn; const startsWithToday = args.startsWithToday; const excluded = args.excluded || []; const weekendDays = args.weekendDays || DEFAULT_WEEKEND_DAYS; const start = startsWithToday ? new Date(viewDate) : dateAdapter.startOfWeek(viewDate, { weekStartsOn: weekStartsOn }); const days = []; const loop = (i) => { const date = dateAdapter.addDays(start, i); if (!excluded.some((e) => date.getDay() === e)) { days.push(getSchedulerDay(dateAdapter, { date, weekendDays })); } }; for (let i = 0; i < DAYS_IN_WEEK; i++) { loop(i); } return days; } function getSchedulerDay(dateAdapter, args) { const date = args.date; const today = dateAdapter.startOfDay(new Date()); return { date: date, isPast: date < today, isToday: dateAdapter.isSameDay(date, today), isFuture: date >= dateAdapter.addDays(today, 1), isWeekend: args.weekendDays.indexOf(dateAdapter.getDay(date)) > -1, inMonth: dateAdapter.isSameMonth(date, today), hours: [] }; } function getEventsInPeriod(dateAdapter, args) { const events = args.events, periodStart = args.periodStart, periodEnd = args.periodEnd; return events.filter((event) => isEventInPeriod(dateAdapter, { event: event, periodStart: periodStart, periodEnd: periodEnd })); } function isEventInPeriod(dateAdapter, args) { const { isSameSecond } = dateAdapter; const event = args.event, periodStart = args.periodStart, periodEnd = args.periodEnd; const eventStart = event.start; const eventEnd = event.end || event.start; if (eventStart > periodStart && eventStart < periodEnd) { return true; } if (eventEnd > periodStart && eventEnd < periodEnd) { return true; } if (eventStart < periodStart && eventEnd > periodEnd) { return true; } if (isSameSecond(eventStart, periodStart) || isSameSecond(eventStart, periodEnd)) { return true; } if (isSameSecond(eventEnd, periodStart) || isSameSecond(eventEnd, periodEnd)) { return true; } return false; } function getOverLappingDayViewEvents(events, top, bottom) { return events.filter((previousEvent) => { const previousEventTop = previousEvent.top; const previousEventBottom = previousEvent.top + previousEvent.height; if (top < previousEventBottom && previousEventBottom < bottom) { return true; } else if (previousEventTop <= top && bottom <= previousEventBottom) { return true; } return false; }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItc2NoZWR1bGVyLXV0aWxzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1jYWxlbmRhci1zY2hlZHVsZXIvIiwic291cmNlcyI6WyJtb2R1bGVzL3NjaGVkdWxlci91dGlscy9jYWxlbmRhci1zY2hlZHVsZXItdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0JBLE1BQU0sQ0FBTixJQUFZLFlBUVg7QUFSRCxXQUFZLFlBQVk7SUFDcEIsbURBQVUsQ0FBQTtJQUNWLG1EQUFVLENBQUE7SUFDVixxREFBVyxDQUFBO0lBQ1gseURBQWEsQ0FBQTtJQUNiLHVEQUFZLENBQUE7SUFDWixtREFBVSxDQUFBO0lBQ1YsdURBQVksQ0FBQTtBQUNoQixDQUFDLEVBUlcsWUFBWSxLQUFaLFlBQVksUUFRdkI7QUFFRCxNQUFNLG9CQUFvQixHQUFhO0lBQ25DLFlBQVksQ0FBQyxNQUFNO0lBQ25CLFlBQVksQ0FBQyxRQUFRO0NBQ3hCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQVcsQ0FBQyxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBVyxFQUFFLENBQUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFXLEVBQUUsQ0FBQztBQUMxQyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQVcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFbkQsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsRUFBRSxDQUFDO0FBQ2pELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLEdBQUcsQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFldkMsTUFBTSxVQUFVLHdCQUF3QixDQUFDLFdBQXdCLEVBQUUsSUFBa0M7SUFDakcsTUFBTSxRQUFRLEdBQVMsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLEdBQVcsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLEdBQVEsSUFBSSxDQUFD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Q0FBQztBQUdELFNBQVMsMkJBQTJCLENBQUMsTUFBNEIsRUFBRSxHQUFXLEVBQUUsTUFBYztJQUMxRixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFpQyxFQUFFLEVBQUU7UUFDdkQsTUFBTSxnQkFBZ0IsR0FBVyxhQUFhLENBQUMsR0FBRyxDQUFDO1FBQ25ELE1BQU0sbUJBQW1CLEdBQVcsYUFBYSxDQUFDLEdBQUcsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBRTdFLElBQUksR0FBRyxHQUFHLG1CQUFtQixJQUFJLG1CQUFtQixHQUFHLE1BQU0sRUFBRTtZQUMzRCxPQUFPLElBQUksQ0FBQztTQUNmO2FBQU0sSUFBSSxnQkFBZ0IsSUFBSSxHQUFHLElBQUksTUFBTSxJQUFJLG1CQUFtQixFQUFFO1lBQ2pFLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQ2FsZW5kYXJTY2hlZHVsZXJFdmVudCxcclxuICAgIFNjaGVkdWxlclZpZXdIb3VyLFxyXG4gICAgU2NoZWR1bGVyVmlld0RheSxcclxuICAgIFNjaGVkdWxlclZpZXdFdmVudCxcclxuICAgIFNjaGVkdWxlclZpZXdIb3VyU2VnbWVudCxcclxuICAgIFNjaGVkdWxlclZpZXcsXHJcbiAgICBTY2hlZHVsZXJWaWV3UGVyaW9kXHJcbn0gZnJvbSAnLi4vbW9kZWxzJztcclxuaW1wb3J0IHtcclxuICAgIERheVZpZXdIb3VyLFxyXG4gICAgRGF5Vmlld0hvdXJTZWdtZW50XHJcbn0gZnJvbSAnY2FsZW5kYXItdXRpbHMnO1xyXG5pbXBvcnQgeyBEYXRlQWRhcHRlciB9IGZyb20gJ2FuZ3VsYXItY2FsZW5kYXInO1xyXG5cclxuXHJcbmV4cG9ydCBlbnVtIERBWVNfT0ZfV0VFSyB7XHJcbiAgICBTVU5EQVkgPSAwLFxyXG4gICAgTU9OREFZID0gMSxcclxuICAgIFRVRVNEQVkgPSAyLFxyXG4gICAgV0VETkVTREFZID0gMyxcclxuICAgIFRIVVJTREFZID0gNCxcclxuICAgIEZSSURBWSA9IDUsXHJcbiAgICBTQVRVUkRBWSA9IDZcclxufVxyXG5cclxuY29uc3QgREVGQVVMVF9XRUVLRU5EX0RBWVM6IG51bWJlcltdID0gW1xyXG4gICAgREFZU19PRl9XRUVLLlNVTkRBWSxcclxuICAgIERBWVNfT0ZfV0VFSy5TQVRVUkRBWVxyXG5dO1xyXG5cclxuZXhwb3J0IGNvbnN0IERBWVNfSU5fV0VFSzogbnVtYmVyID0gNztcclxuZXhwb3J0IGNvbnN0IEhPVVJTX0lOX0RBWTogbnVtYmVyID0gMjQ7XHJcbmV4cG9ydCBjb25zdCBNSU5VVEVTX0lOX0hPVVI6IG51bWJlciA9IDYwO1xyXG5leHBvcnQgY29uc3QgU0VDT05EU19JTl9EQVk6IG51bWJlciA9IDYwICogNjAgKiAyNDtcclxuXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX0hPVVJfU0VHTUVOVF9IRUlHSFRfUFggPSA0MDtcclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVZFTlRfV0lEVEhfUEVSQ0VOVCA9IDEwMDtcclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSE9VUl9TRUdNRU5UUyA9IDI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEdldFNjaGVkdWxlclZpZXdIb3VyR3JpZEFyZ3Mge1xyXG4gICAgdmlld0RhdGU6IERhdGU7XHJcbiAgICBob3VyU2VnbWVudHM6IG51bWJlcjtcclxuICAgIGRheVN0YXJ0OiB7XHJcbiAgICAgICAgaG91cjogbnVtYmVyO1xyXG4gICAgICAgIG1pbnV0ZTogbnVtYmVyO1xyXG4gICAgfTtcclxuICAgIGRheUVuZDoge1xyXG4gICAgICAgIGhvdXI6IG51bWJlcjtcclxuICAgICAgICBtaW51dGU6IG51bWJlcjtcclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2hlZHVsZXJWaWV3SG91ckdyaWQoZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyLCBhcmdzOiBHZXRTY2hlZHVsZXJWaWV3SG91ckdyaWRBcmdzKTogRGF5Vmlld0hvdXJbXSB7XHJcbiAgICBjb25zdCB2aWV3RGF0ZTogRGF0ZSA9IGFyZ3Mudmlld0RhdGUsIGhvdXJTZWdtZW50czogbnVtYmVyID0gYXJncy5ob3VyU2VnbWVudHMsIGRheVN0YXJ0OiBhbnkgPSBhcmdzLmRheVN0YXJ0LCBkYXlFbmQ6IGFueSA9IGFyZ3MuZGF5RW5kO1xyXG4gICAgY29uc3QgaG91cnM6IERheVZpZXdIb3VyW10gPSBbXTtcclxuXHJcbiAgICBjb25zdCBzdGFydE9mVmlldzogRGF0ZSA9IGRhdGVBZGFwdGVyLnNldE1pbnV0ZXMoZGF0ZUFkYXB0ZXIuc2V0SG91cnMoZGF0ZUFkYXB0ZXIuc3RhcnRPZkRheSh2aWV3RGF0ZSksIGRheVN0YXJ0LmhvdXIpLCBkYXlTdGFydC5taW51dGUpO1xyXG4gICAgY29uc3QgZW5kT2ZWaWV3OiBEYXRlID0gZGF0ZUFkYXB0ZXIuc2V0TWludXRlcyhkYXRlQWRhcHRlci5zZXRIb3VycyhkYXRlQWRhcHRlci5zdGFydE9mTWludXRlKGRhdGVBZGFwdGVyLmVuZE9mRGF5KHZpZXdEYXRlKSksIGRheUVuZC5ob3VyKSwgZGF5RW5kLm1pbnV0ZSk7XHJcbiAgICBjb25zdCBzZWdtZW50RHVyYXRpb246IG51bWJlciA9IE1JTlVURVNfSU5fSE9VUiAvIGhvdXJTZWdtZW50cztcclxuICAgIGNvbnN0IHN0YXJ0T2ZWaWV3RGF5OiBEYXRlID0gZGF0ZUFkYXB0ZXIuc3RhcnRPZkRheSh2aWV3RGF0ZSk7XHJcblxyXG4gICAgY29uc3QgcmFuZ2UgPSAoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiBudW1iZXJbXSA9PiBBcnJheS5mcm9tKHsgbGVuZ3RoOiAoKGVuZCArIDEpIC0gc3RhcnQpIH0sICh2LCBrKSA9PiBrICsgc3RhcnQpO1xyXG4gICAgY29uc3QgaG91cnNJblZpZXc6IG51bWJlcltdID0gcmFuZ2UoZGF5U3RhcnQuaG91ciwgZGF5RW5kLmhvdXIpO1xyXG5cclxuICAgIGhvdXJzSW5WaWV3LmZvckVhY2goKGhvdXI6IG51bWJlciwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGhvdXJTZWdtZW50czsgaisrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBkYXRlQWRhcHRlci5hZGRNaW51dGVzKGRhdGVBZGFwdGVyLmFkZEhvdXJzKHN0YXJ0T2ZWaWV3RGF5LCBob3VyKSwgaiAqIHNlZ21lbnREdXJhdGlvbik7XHJcbiAgICAgICAgICAgIGlmIChkYXRlID49IHN0YXJ0T2ZWaWV3ICYmIGRhdGUgPCBlbmRPZlZpZXcpIHtcclxuICAgICAgICAgICAgICAgIHNlZ21lbnRzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGU6IGRhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNTdGFydDogaiA9PT0gMFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaG91cnMucHVzaCg8RGF5Vmlld0hvdXI+eyBzZWdtZW50czogc2VnbWVudHMgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gaG91cnM7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR2V0U2NoZWR1bGVyVmlld0FyZ3Mge1xyXG4gICAgZXZlbnRzPzogQ2FsZW5kYXJTY2hlZHVsZXJFdmVudFtdO1xyXG4gICAgdmlld0RhdGU6IERhdGU7XHJcbiAgICBob3VyU2VnbWVudHM6IDEgfCAyIHwgNCB8IDY7XHJcbiAgICB3ZWVrU3RhcnRzT246IG51bWJlcjtcclxuICAgIHN0YXJ0c1dpdGhUb2RheTogYm9vbGVhbjtcclxuICAgIGRheVN0YXJ0OiB7XHJcbiAgICAgICAgaG91cjogbnVtYmVyO1xyXG4gICAgICAgIG1pbnV0ZTogbnVtYmVyO1xyXG4gICAgfTtcclxuICAgIGRheUVuZDoge1xyXG4gICAgICAgIGhvdXI6IG51bWJlcjtcclxuICAgICAgICBtaW51dGU6IG51bWJlcjtcclxuICAgIH07XHJcbiAgICBleGNsdWRlZD86IG51bWJlcltdO1xyXG4gICAgZXZlbnRXaWR0aDogbnVtYmVyO1xyXG4gICAgaG91clNlZ21lbnRIZWlnaHQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjaGVkdWxlclZpZXcoZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyLCBhcmdzOiBHZXRTY2hlZHVsZXJWaWV3QXJncyk6IFNjaGVkdWxlclZpZXcge1xyXG4gICAgbGV0IGV2ZW50czogQ2FsZW5kYXJTY2hlZHVsZXJFdmVudFtdID0gYXJncy5ldmVudHMgfHwgW107XHJcbiAgICBpZiAoIWV2ZW50cykgeyBldmVudHMgPSBbXTsgfVxyXG5cclxuICAgIGNvbnN0IHZpZXdEYXRlOiBEYXRlID0gYXJncy52aWV3RGF0ZTtcclxuICAgIGNvbnN0IHdlZWtTdGFydHNPbjogbnVtYmVyID0gYXJncy53ZWVrU3RhcnRzT247XHJcbiAgICBjb25zdCBzdGFydHNXaXRoVG9kYXk6IGJvb2xlYW4gPSBhcmdzLnN0YXJ0c1dpdGhUb2RheTtcclxuICAgIGNvbnN0IGV4Y2x1ZGVkOiBudW1iZXJbXSA9IGFyZ3MuZXhjbHVkZWQgfHwgW107XHJcbiAgICBjb25zdCBob3VyU2VnbWVudHM6IG51bWJlciA9IGFyZ3MuaG91clNlZ21lbnRzIHx8IERFRkFVTFRfSE9VUl9TRUdNRU5UUztcclxuICAgIGNvbnN0IGhvdXJTZWdtZW50SGVpZ2h0OiBudW1iZXIgPSBhcmdzLmhvdXJTZWdtZW50SGVpZ2h0IHx8IERFRkFVTFRfSE9VUl9TRUdNRU5UX0hFSUdIVF9QWDtcclxuICAgIGNvbnN0IGV2ZW50V2lkdGg6IG51bWJlciA9IGFyZ3MuZXZlbnRXaWR0aCB8fCBERUZBVUxUX0VWRU5UX1dJRFRIX1BFUkNFTlQ7XHJcbiAgICBjb25zdCBkYXlTdGFydDogYW55ID0gYXJncy5kYXlTdGFydCwgZGF5RW5kOiBhbnkgPSBhcmdzLmRheUVuZDtcclxuXHJcbiAgICBjb25zdCBzdGFydE9mVmlld1dlZWs6IERhdGUgPSBzdGFydHNXaXRoVG9kYXkgPyBkYXRlQWRhcHRlci5zdGFydE9mRGF5KHZpZXdEYXRlKSA6IGRhdGVBZGFwdGVyLnN0YXJ0T2ZXZWVrKHZpZXdEYXRlLCB7IHdlZWtTdGFydHNPbjogd2Vla1N0YXJ0c09uIH0pO1xyXG4gICAgY29uc3QgZW5kT2ZWaWV3V2VlazogRGF0ZSA9IHN0YXJ0c1dpdGhUb2RheSA/IGRhdGVBZGFwdGVyLmFkZERheXMoZGF0ZUFkYXB0ZXIuZW5kT2ZEYXkodmlld0RhdGUpLCA2KSA6IGRhdGVBZGFwdGVyLmVuZE9mV2Vlayh2aWV3RGF0ZSwgeyB3ZWVrU3RhcnRzT246IHdlZWtTdGFydHNPbiB9KTtcclxuXHJcbiAgICBjb25zdCBldmVudHNJbldlZWs6IENhbGVuZGFyU2NoZWR1bGVyRXZlbnRbXSA9IGdldEV2ZW50c0luUGVyaW9kKGRhdGVBZGFwdGVyLCB7XHJcbiAgICAgICAgZXZlbnRzOiBldmVudHMsXHJcbiAgICAgICAgcGVyaW9kU3RhcnQ6IHN0YXJ0T2ZWaWV3V2VlayxcclxuICAgICAgICBwZXJpb2RFbmQ6IGVuZE9mVmlld1dlZWtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGRheXM6IFNjaGVkdWxlclZpZXdEYXlbXSA9IGdldFNjaGVkdWxlclZpZXdEYXlzKGRhdGVBZGFwdGVyLCB7XHJcbiAgICAgICAgdmlld0RhdGU6IHZpZXdEYXRlLFxyXG4gICAgICAgIHdlZWtTdGFydHNPbjogd2Vla1N0YXJ0c09uLFxyXG4gICAgICAgIHN0YXJ0c1dpdGhUb2RheTogc3RhcnRzV2l0aFRvZGF5LFxyXG4gICAgICAgIGV4Y2x1ZGVkOiBleGNsdWRlZFxyXG4gICAgfSk7XHJcbiAgICBkYXlzLmZvckVhY2goKGRheTogU2NoZWR1bGVyVmlld0RheSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0T2ZWaWV3OiBEYXRlID0gZGF0ZUFkYXB0ZXIuc2V0TWludXRlcyhkYXRlQWRhcHRlci5zZXRIb3VycyhkYXRlQWRhcHRlci5zdGFydE9mRGF5KGRheS5kYXRlKSwgZGF5U3RhcnQuaG91ciksIGRheVN0YXJ0Lm1pbnV0ZSk7XHJcbiAgICAgICAgY29uc3QgZW5kT2ZWaWV3OiBEYXRlID0gZGF0ZUFkYXB0ZXIuc2V0TWludXRlcyhkYXRlQWRhcHRlci5zZXRIb3VycyhkYXRlQWRhcHRlci5zdGFydE9mTWludXRlKGRhdGVBZGFwdGVyLmVuZE9mRGF5KGRheS5kYXRlKSksIGRheUVuZC5ob3VyKSwgZGF5RW5kLm1pbnV0ZSk7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNEYXlFdmVudHM6IFNjaGVkdWxlclZpZXdFdmVudFtdID0gW107XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50c0luRGF5OiBDYWxlbmRhclNjaGVkdWxlckV2ZW50W10gPSBnZXRFdmVudHNJblBlcmlvZChkYXRlQWRhcHRlciwge1xyXG4gICAgICAgICAgICBldmVudHM6IGV2ZW50c0luV2VlayxcclxuICAgICAgICAgICAgcGVyaW9kU3RhcnQ6IHN0YXJ0T2ZWaWV3LFxyXG4gICAgICAgICAgICBwZXJpb2RFbmQ6IGVuZE9mVmlld1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkYXkuZXZlbnRzID0gZXZlbnRzSW5EYXlcclxuICAgICAgICAgICAgLnNvcnQoKGV2ZW50QTogQ2FsZW5kYXJTY2hlZHVsZXJFdmVudCwgZXZlbnRCOiBDYWxlbmRhclNjaGVkdWxlckV2ZW50KSA9PiBldmVudEEuc3RhcnQudmFsdWVPZigpIC0gZXZlbnRCLnN0YXJ0LnZhbHVlT2YoKSlcclxuICAgICAgICAgICAgLm1hcCgoZXY6IENhbGVuZGFyU2NoZWR1bGVyRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50U3RhcnQ6IERhdGUgPSBldi5zdGFydDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50RW5kOiBEYXRlID0gZXYuZW5kIHx8IGV2ZW50U3RhcnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydHNCZWZvcmVEYXk6IGJvb2xlYW4gPSBldmVudFN0YXJ0IDwgc3RhcnRPZlZpZXc7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRzQWZ0ZXJEYXk6IGJvb2xlYW4gPSBkYXRlQWRhcHRlci5hZGRNaW51dGVzKGV2ZW50RW5kLCAtMSkgPiBlbmRPZlZpZXc7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBob3VySGVpZ2h0TW9kaWZpZXI6IG51bWJlciA9ICgoaG91clNlZ21lbnRzICogaG91clNlZ21lbnRIZWlnaHQpICsgMSkgLyBNSU5VVEVTX0lOX0hPVVI7IC8vICsxIGZvciB0aGUgMXB4IHNlZ21lbnQgYm90dG9tIGJvcmRlclxyXG5cclxuICAgICAgICAgICAgICAgIGxldCB0b3A6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRTdGFydCA+IHN0YXJ0T2ZWaWV3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9wICs9IGRhdGVBZGFwdGVyLmRpZmZlcmVuY2VJbk1pbnV0ZXMoZXZlbnRTdGFydCwgc3RhcnRPZlZpZXcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdG9wICo9IGhvdXJIZWlnaHRNb2RpZmllcjtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydERhdGU6IERhdGUgPSBzdGFydHNCZWZvcmVEYXkgPyBzdGFydE9mVmlldyA6IGV2ZW50U3RhcnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmREYXRlOiBEYXRlID0gZW5kc0FmdGVyRGF5ID8gZW5kT2ZWaWV3IDogZXZlbnRFbmQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0OiBudW1iZXIgPSBkYXRlQWRhcHRlci5kaWZmZXJlbmNlSW5NaW51dGVzKGVuZERhdGUsIHN0YXJ0RGF0ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWV2LmVuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGhvdXJTZWdtZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQgKj0gaG91ckhlaWdodE1vZGlmaWVyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGJvdHRvbTogbnVtYmVyID0gdG9wICsgaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3ZlcmxhcHBpbmdQcmV2aW91c0V2ZW50cyA9IGdldE92ZXJMYXBwaW5nRGF5Vmlld0V2ZW50cyhcclxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0RheUV2ZW50cyxcclxuICAgICAgICAgICAgICAgICAgICB0b3AsXHJcbiAgICAgICAgICAgICAgICAgICAgYm90dG9tXHJcbiAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBsZWZ0OiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKG92ZXJsYXBwaW5nUHJldmlvdXNFdmVudHMuc29tZShwcmV2aW91c0V2ZW50ID0+IHByZXZpb3VzRXZlbnQubGVmdCA9PT0gbGVmdCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0ICs9IGV2ZW50V2lkdGg7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQ6IFNjaGVkdWxlclZpZXdFdmVudCA9XHJcbiAgICAgICAgICAgICAgICA8U2NoZWR1bGVyVmlld0V2ZW50PntcclxuICAgICAgICAgICAgICAgICAgICBldmVudDogZXYsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiB0b3AsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGV2ZW50V2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogbGVmdCxcclxuICAgICAgICAgICAgICAgICAgICBzdGFydHNCZWZvcmVEYXk6IHN0YXJ0c0JlZm9yZURheSxcclxuICAgICAgICAgICAgICAgICAgICBlbmRzQWZ0ZXJEYXk6IGVuZHNBZnRlckRheSxcclxuICAgICAgICAgICAgICAgICAgICBpc1Byb2Nlc3NlZDogZmFsc2VcclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgcHJldmlvdXNEYXlFdmVudHMucHVzaChldmVudCk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZGF5LmhvdXJzID0gZ2V0U2NoZWR1bGVyVmlld0hvdXJHcmlkKGRhdGVBZGFwdGVyLCB7XHJcbiAgICAgICAgICAgIHZpZXdEYXRlOiB2aWV3RGF0ZSxcclxuICAgICAgICAgICAgaG91clNlZ21lbnRzOiBob3VyU2VnbWVudHMsXHJcbiAgICAgICAgICAgIGRheVN0YXJ0OiB7XHJcbiAgICAgICAgICAgICAgICBob3VyOiBkYXlTdGFydC5ob3VyLFxyXG4gICAgICAgICAgICAgICAgbWludXRlOiBkYXlTdGFydC5taW51dGVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGF5RW5kOiB7XHJcbiAgICAgICAgICAgICAgICBob3VyOiBkYXlFbmQuaG91cixcclxuICAgICAgICAgICAgICAgIG1pbnV0ZTogZGF5RW5kLm1pbnV0ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkubWFwKChob3VyOiBEYXlWaWV3SG91cikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlOiBEYXRlID0gbmV3IERhdGUoZGF5LmRhdGUuZ2V0RnVsbFllYXIoKSwgZGF5LmRhdGUuZ2V0TW9udGgoKSwgZGF5LmRhdGUuZ2V0RGF0ZSgpLCBob3VyLnNlZ21lbnRzWzBdLmRhdGUuZ2V0SG91cnMoKSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdGFydE9mSG91cjogRGF0ZSA9IG5ldyBEYXRlKGRheS5kYXRlLmdldEZ1bGxZZWFyKCksIGRheS5kYXRlLmdldE1vbnRoKCksIGRheS5kYXRlLmdldERhdGUoKSwgaG91ci5zZWdtZW50c1swXS5kYXRlLmdldEhvdXJzKCkpO1xyXG4gICAgICAgICAgICBjb25zdCBlbmRPZkhvdXI6IERhdGUgPSBkYXRlQWRhcHRlci5hZGRNaW51dGVzKGRhdGVBZGFwdGVyLmFkZEhvdXJzKHN0YXJ0T2ZIb3VyLCAxKSwgLTEpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZXZlbnRzSW5Ib3VyOiBDYWxlbmRhclNjaGVkdWxlckV2ZW50W10gPSBnZXRFdmVudHNJblBlcmlvZChkYXRlQWRhcHRlciwge1xyXG4gICAgICAgICAgICAgICAgZXZlbnRzOiBldmVudHNJbkRheSxcclxuICAgICAgICAgICAgICAgIHBlcmlvZFN0YXJ0OiBzdGFydE9mSG91cixcclxuICAgICAgICAgICAgICAgIHBlcmlvZEVuZDogZW5kT2ZIb3VyXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2VnbWVudHM6IFNjaGVkdWxlclZpZXdIb3VyU2VnbWVudFtdID1cclxuICAgICAgICAgICAgICAgIGhvdXIuc2VnbWVudHMubWFwKChzZWdtZW50OiBEYXlWaWV3SG91clNlZ21lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWdtZW50LmRhdGUgPSBkYXRlQWRhcHRlci5zZXREYXRlKGRhdGVBZGFwdGVyLnNldE1vbnRoKGRhdGVBZGFwdGVyLnNldFllYXIoc2VnbWVudC5kYXRlLCBkYXkuZGF0ZS5nZXRGdWxsWWVhcigpKSwgZGF5LmRhdGUuZ2V0TW9udGgoKSksIGRheS5kYXRlLmdldERhdGUoKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0T2ZTZWdtZW50OiBEYXRlID0gc2VnbWVudC5kYXRlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZE9mU2VnbWVudDogRGF0ZSA9IGRhdGVBZGFwdGVyLmFkZE1pbnV0ZXMoc2VnbWVudC5kYXRlLCBNSU5VVEVTX0lOX0hPVVIgLyBob3VyU2VnbWVudHMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudHNJblNlZ21lbnQ6IENhbGVuZGFyU2NoZWR1bGVyRXZlbnRbXSA9IGdldEV2ZW50c0luUGVyaW9kKGRhdGVBZGFwdGVyLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogZXZlbnRzSW5Ib3VyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2RTdGFydDogc3RhcnRPZlNlZ21lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZEVuZDogZW5kT2ZTZWdtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8U2NoZWR1bGVyVmlld0hvdXJTZWdtZW50PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudDogc2VnbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZTogbmV3IERhdGUoc2VnbWVudC5kYXRlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBldmVudHNJblNlZ21lbnRcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gPFNjaGVkdWxlclZpZXdIb3VyPntcclxuICAgICAgICAgICAgICAgIGhvdXI6IGhvdXIsXHJcbiAgICAgICAgICAgICAgICBkYXRlOiBkYXRlLFxyXG4gICAgICAgICAgICAgICAgZXZlbnRzOiBldmVudHNJbkhvdXIsXHJcbiAgICAgICAgICAgICAgICBzZWdtZW50czogc2VnbWVudHNcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiA8U2NoZWR1bGVyVmlldz57XHJcbiAgICAgICAgZGF5czogZGF5cyxcclxuICAgICAgICBwZXJpb2Q6IDxTY2hlZHVsZXJWaWV3UGVyaW9kPntcclxuICAgICAgICAgICAgZXZlbnRzOiBldmVudHNJbldlZWssXHJcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydE9mVmlld1dlZWssXHJcbiAgICAgICAgICAgIGVuZDogZW5kT2ZWaWV3V2Vla1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR2V0U2NoZWR1bGVyVmlld0RheXNBcmdzIHtcclxuICAgIHZpZXdEYXRlOiBEYXRlO1xyXG4gICAgd2Vla1N0YXJ0c09uOiBudW1iZXI7XHJcbiAgICBzdGFydHNXaXRoVG9kYXk6IGJvb2xlYW47XHJcbiAgICBleGNsdWRlZD86IG51bWJlcltdO1xyXG4gICAgd2Vla2VuZERheXM/OiBudW1iZXJbXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjaGVkdWxlclZpZXdEYXlzKGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlciwgYXJnczogR2V0U2NoZWR1bGVyVmlld0RheXNBcmdzKTogU2NoZWR1bGVyVmlld0RheVtdIHtcclxuICAgIGNvbnN0IHZpZXdEYXRlOiBEYXRlID0gYXJncy52aWV3RGF0ZTtcclxuICAgIGNvbnN0IHdlZWtTdGFydHNPbjogbnVtYmVyID0gYXJncy53ZWVrU3RhcnRzT247XHJcbiAgICBjb25zdCBzdGFydHNXaXRoVG9kYXk6IGJvb2xlYW4gPSBhcmdzLnN0YXJ0c1dpdGhUb2RheTtcclxuICAgIGNvbnN0IGV4Y2x1ZGVkOiBudW1iZXJbXSA9IGFyZ3MuZXhjbHVkZWQgfHwgW107XHJcbiAgICBjb25zdCB3ZWVrZW5kRGF5czogbnVtYmVyW10gPSBhcmdzLndlZWtlbmREYXlzIHx8IERFRkFVTFRfV0VFS0VORF9EQVlTO1xyXG5cclxuICAgIGNvbnN0IHN0YXJ0ID0gc3RhcnRzV2l0aFRvZGF5ID8gbmV3IERhdGUodmlld0RhdGUpIDogZGF0ZUFkYXB0ZXIuc3RhcnRPZldlZWsodmlld0RhdGUsIHsgd2Vla1N0YXJ0c09uOiB3ZWVrU3RhcnRzT24gfSk7XHJcbiAgICBjb25zdCBkYXlzOiBTY2hlZHVsZXJWaWV3RGF5W10gPSBbXTtcclxuICAgIGNvbnN0IGxvb3AgPSAoaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGF0ZSA9IGRhdGVBZGFwdGVyLmFkZERheXMoc3RhcnQsIGkpO1xyXG4gICAgICAgIGlmICghZXhjbHVkZWQuc29tZSgoZTogbnVtYmVyKSA9PiBkYXRlLmdldERheSgpID09PSBlKSkge1xyXG4gICAgICAgICAgICBkYXlzLnB1c2goZ2V0U2NoZWR1bGVyRGF5KGRhdGVBZGFwdGVyLCB7IGRhdGUsIHdlZWtlbmREYXlzIH0pKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBEQVlTX0lOX1dFRUs7IGkrKykge1xyXG4gICAgICAgIGxvb3AoaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF5cztcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0U2NoZWR1bGVyRGF5KGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlciwgYXJnczogeyBkYXRlOiBEYXRlLCB3ZWVrZW5kRGF5czogbnVtYmVyW10gfSk6IFNjaGVkdWxlclZpZXdEYXkge1xyXG4gICAgY29uc3QgZGF0ZTogRGF0ZSA9IGFyZ3MuZGF0ZTtcclxuICAgIGNvbnN0IHRvZGF5OiBEYXRlID0gZGF0ZUFkYXB0ZXIuc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuXHJcbiAgICByZXR1cm4gPFNjaGVkdWxlclZpZXdEYXk+e1xyXG4gICAgICAgIGRhdGU6IGRhdGUsXHJcbiAgICAgICAgaXNQYXN0OiBkYXRlIDwgdG9kYXksXHJcbiAgICAgICAgaXNUb2RheTogZGF0ZUFkYXB0ZXIuaXNTYW1lRGF5KGRhdGUsIHRvZGF5KSxcclxuICAgICAgICBpc0Z1dHVyZTogZGF0ZSA+PSBkYXRlQWRhcHRlci5hZGREYXlzKHRvZGF5LCAxKSxcclxuICAgICAgICBpc1dlZWtlbmQ6IGFyZ3Mud2Vla2VuZERheXMuaW5kZXhPZihkYXRlQWRhcHRlci5nZXREYXkoZGF0ZSkpID4gLTEsXHJcbiAgICAgICAgaW5Nb250aDogZGF0ZUFkYXB0ZXIuaXNTYW1lTW9udGgoZGF0ZSwgdG9kYXkpLFxyXG4gICAgICAgIGhvdXJzOiBbXVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBHZXRFdmVudHNJblBlcmlvZEFyZ3Mge1xyXG4gICAgZXZlbnRzOiBDYWxlbmRhclNjaGVkdWxlckV2ZW50W107XHJcbiAgICBwZXJpb2RTdGFydDogRGF0ZTtcclxuICAgIHBlcmlvZEVuZDogRGF0ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RXZlbnRzSW5QZXJpb2QoZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyLCBhcmdzOiBHZXRFdmVudHNJblBlcmlvZEFyZ3MpOiBDYWxlbmRhclNjaGVkdWxlckV2ZW50W10ge1xyXG4gICAgY29uc3QgZXZlbnRzOiBDYWxlbmRhclNjaGVkdWxlckV2ZW50W10gPSBhcmdzLmV2ZW50cywgcGVyaW9kU3RhcnQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSBhcmdzLnBlcmlvZFN0YXJ0LCBwZXJpb2RFbmQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSBhcmdzLnBlcmlvZEVuZDtcclxuICAgIHJldHVybiBldmVudHMuZmlsdGVyKChldmVudCkgPT4gaXNFdmVudEluUGVyaW9kKGRhdGVBZGFwdGVyLCB7IGV2ZW50OiBldmVudCwgcGVyaW9kU3RhcnQ6IHBlcmlvZFN0YXJ0LCBwZXJpb2RFbmQ6IHBlcmlvZEVuZCB9KSk7XHJcbn1cclxuXHJcbmludGVyZmFjZSBJc0V2ZW50SW5QZXJpb2RBcmdzIHtcclxuICAgIGV2ZW50OiBDYWxlbmRhclNjaGVkdWxlckV2ZW50O1xyXG4gICAgcGVyaW9kU3RhcnQ6IERhdGU7XHJcbiAgICBwZXJpb2RFbmQ6IERhdGU7XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBpc0V2ZW50SW5QZXJpb2QoZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyLCBhcmdzOiBJc0V2ZW50SW5QZXJpb2RBcmdzKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB7IGlzU2FtZVNlY29uZCB9ID0gZGF0ZUFkYXB0ZXI7XHJcbiAgICBjb25zdCBldmVudDogQ2FsZW5kYXJTY2hlZHVsZXJFdmVudCA9IGFyZ3MuZXZlbnQsIHBlcmlvZFN0YXJ0OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gYXJncy5wZXJpb2RTdGFydCwgcGVyaW9kRW5kOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gYXJncy5wZXJpb2RFbmQ7XHJcbiAgICBjb25zdCBldmVudFN0YXJ0OiBEYXRlID0gZXZlbnQuc3RhcnQ7XHJcbiAgICBjb25zdCBldmVudEVuZDogRGF0ZSA9IGV2ZW50LmVuZCB8fCBldmVudC5zdGFydDtcclxuXHJcbiAgICBpZiAoZXZlbnRTdGFydCA+IHBlcmlvZFN0YXJ0ICYmIGV2ZW50U3RhcnQgPCBwZXJpb2RFbmQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZXZlbnRFbmQgPiBwZXJpb2RTdGFydCAmJiBldmVudEVuZCA8IHBlcmlvZEVuZCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChldmVudFN0YXJ0IDwgcGVyaW9kU3RhcnQgJiYgZXZlbnRFbmQgPiBwZXJpb2RFbmQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNTYW1lU2Vjb25kKGV2ZW50U3RhcnQsIHBlcmlvZFN0YXJ0KSB8fCBpc1NhbWVTZWNvbmQoZXZlbnRTdGFydCwgcGVyaW9kRW5kKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc1NhbWVTZWNvbmQoZXZlbnRFbmQsIHBlcmlvZFN0YXJ0KSB8fCBpc1NhbWVTZWNvbmQoZXZlbnRFbmQsIHBlcmlvZEVuZCkpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBnZXRPdmVyTGFwcGluZ0RheVZpZXdFdmVudHMoZXZlbnRzOiBTY2hlZHVsZXJWaWV3RXZlbnRbXSwgdG9wOiBudW1iZXIsIGJvdHRvbTogbnVtYmVyKTogU2NoZWR1bGVyVmlld0V2ZW50W10ge1xyXG4gICAgcmV0dXJuIGV2ZW50cy5maWx0ZXIoKHByZXZpb3VzRXZlbnQ6IFNjaGVkdWxlclZpZXdFdmVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzRXZlbnRUb3A6IG51bWJlciA9IHByZXZpb3VzRXZlbnQudG9wO1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzRXZlbnRCb3R0b206IG51bWJlciA9IHByZXZpb3VzRXZlbnQudG9wICsgcHJldmlvdXNFdmVudC5oZWlnaHQ7XHJcblxyXG4gICAgICAgIGlmICh0b3AgPCBwcmV2aW91c0V2ZW50Qm90dG9tICYmIHByZXZpb3VzRXZlbnRCb3R0b20gPCBib3R0b20pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwcmV2aW91c0V2ZW50VG9wIDw9IHRvcCAmJiBib3R0b20gPD0gcHJldmlvdXNFdmVudEJvdHRvbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0pO1xyXG59XHJcbiJdfQ==