@w11k/ngx-present
Version:
Angular based Presentation Tool
259 lines • 21.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/slide-by-slide/slide-by-slide.functions.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __values } from "tslib";
import { max, min } from '../core/utils';
/**
* @param {?} slides
* @param {?} currentSlide
* @param {?} move
* @param {?} coordinatesToKeep
* @param {?} coordinatesMaxDepth
* @return {?}
*/
export function calculateCoordinates(slides, currentSlide, move, coordinatesToKeep, coordinatesMaxDepth) {
if (move === 0) {
return currentSlide;
}
if (coordinatesToKeep === undefined) {
return slides[currentSlide.index + move];
}
/** @type {?} */
var currentCoordinates = currentSlide.coordinates;
/** @type {?} */
var coordinatesToKeepAbs = coordinatesToKeepAbsolute(currentCoordinates, coordinatesToKeep);
/** @type {?} */
var newCoordinates = currentCoordinates.slice(0, coordinatesToKeepAbs);
if (move > 0 && coordinatesToKeepAbs < currentCoordinates.length) {
newCoordinates.push(currentCoordinates[coordinatesToKeepAbs] + move);
}
else if (move > 0) {
newCoordinates.push(move);
}
else if (move < 0 && currentCoordinates[coordinatesToKeepAbs + 1] !== undefined && currentCoordinates[coordinatesToKeepAbs + 1] > 1) {
newCoordinates.push(currentCoordinates[coordinatesToKeepAbs] + move + 1);
}
else if (move < 0 && coordinatesToKeepAbs < currentCoordinates.length) {
newCoordinates.push(max(1, currentCoordinates[coordinatesToKeepAbs] + move));
}
else if (move < 0) {
newCoordinates.push(1);
}
if (move < 0) {
while (newCoordinates.length <= coordinatesMaxDepth) {
newCoordinates.push(1);
}
}
/** @type {?} */
var arrayToSearchIn;
if (move >= 0) {
arrayToSearchIn = slides.slice(currentSlide.index + 1);
}
else {
arrayToSearchIn = slides.slice(0, currentSlide.index).reverse();
}
/** @type {?} */
var nextSlide = arrayToSearchIn.find((/**
* @param {?} slide
* @return {?}
*/
function (slide) {
/** @type {?} */
var compared = compareCoordinates(slide.coordinates, newCoordinates);
if (move < 0) {
return compared <= 0;
}
else {
return compared >= 0;
}
}));
return nextSlide;
}
/**
* @param {?} coordinates
* @param {?} coordinatesToKeepRelative
* @return {?}
*/
export function coordinatesToKeepAbsolute(coordinates, coordinatesToKeepRelative) {
if (coordinatesToKeepRelative >= 0) {
return min(coordinatesToKeepRelative, coordinates.length);
}
return max(coordinates.length + coordinatesToKeepRelative, 0);
}
/** @type {?} */
export var routerParamsCoordinatePrefix = 'coordinate-';
/**
* @param {?} routeParams
* @return {?}
*/
export function routeParamsToCoordinate(routeParams) {
/** @type {?} */
var keys = Object.keys(routeParams);
/** @type {?} */
var coordinates = keys
.filter((/**
* @param {?} key
* @return {?}
*/
function (key) { return key.startsWith(routerParamsCoordinatePrefix); }))
.map((/**
* @param {?} key
* @return {?}
*/
function (key) {
/** @type {?} */
var keyNumber = parseInt(key.substr(routerParamsCoordinatePrefix.length), 10);
return { key: key, keyNumber: keyNumber };
}))
.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) { return compareNumber(a.keyNumber, b.keyNumber); }))
.map((/**
* @param {?} key
* @return {?}
*/
function (key) { return parseInt(routeParams[key.key], 10); }));
return coordinates;
}
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function compareNumber(a, b) {
if (a !== undefined && b === undefined) {
return 1;
}
if (a === undefined && b !== undefined) {
return -1;
}
if (a === undefined && b === undefined) {
return 0;
}
if (a !== undefined && b !== undefined && a > b) {
return 1;
}
if (a !== undefined && b !== undefined && a < b) {
return -1;
}
return 0;
}
/**
* @param {?} c1
* @param {?} c2
* @return {?}
*/
export function equalCoordinates(c1, c2) {
return compareCoordinates(c1, c2) === 0;
}
/**
* @param {?} c1
* @param {?} c2
* @return {?}
*/
export function compareCoordinates(c1, c2) {
if (c1 === c2) {
return 0;
}
if (c1 === null || c1 === undefined) {
return -1;
}
if (c2 === null || c2 === undefined) {
return 1;
}
/** @type {?} */
var maxLength = max(c1.length, c2.length);
for (var i = 0; i < maxLength; i++) {
/** @type {?} */
var c1i = c1[i];
/** @type {?} */
var c2i = c2[i];
/** @type {?} */
var iResult = compareNumber(c1i, c2i);
if (iResult !== 0) {
return iResult;
}
}
return 0;
}
/**
* @param {?} slides
* @param {?} coordinates
* @return {?}
*/
export function isValidCoordinate(slides, coordinates) {
var e_1, _a;
if (coordinates.length === 0) {
return false;
}
/** @type {?} */
var current = slides;
try {
for (var coordinates_1 = __values(coordinates), coordinates_1_1 = coordinates_1.next(); !coordinates_1_1.done; coordinates_1_1 = coordinates_1.next()) {
var coordinate = coordinates_1_1.value;
/** @type {?} */
var tooLow = coordinate < 1;
/** @type {?} */
var tooHigh = Array.isArray(current) && coordinate - 1 >= current.length;
if (tooLow || tooHigh) {
return false;
}
/** @type {?} */
var next = current[coordinate - 1];
if (Array.isArray(next)) {
current = next;
}
else {
current = [];
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (coordinates_1_1 && !coordinates_1_1.done && (_a = coordinates_1.return)) _a.call(coordinates_1);
}
finally { if (e_1) throw e_1.error; }
}
return true;
}
/**
* @param {?} coordinates
* @param {?} separator
* @param {?=} length
* @return {?}
*/
export function coordinatesToString(coordinates, separator, length) {
return coordinates.slice(0, length).join(separator);
}
/**
* @param {?} slides
* @return {?}
*/
export function coordinateToSlideMap(slides) {
var e_2, _a;
/** @type {?} */
var map = {};
try {
for (var slides_1 = __values(slides), slides_1_1 = slides_1.next(); !slides_1_1.done; slides_1_1 = slides_1.next()) {
var slide = slides_1_1.value;
/** @type {?} */
var index = coordinatesToString(slide.coordinates, '.');
map[index] = slide;
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (slides_1_1 && !slides_1_1.done && (_a = slides_1.return)) _a.call(slides_1);
}
finally { if (e_2) throw e_2.error; }
}
return map;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGUtYnktc2xpZGUuZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHcxMWsvbmd4LXByZXNlbnQvIiwic291cmNlcyI6WyJsaWIvc2xpZGUtYnktc2xpZGUvc2xpZGUtYnktc2xpZGUuZnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFFekMsTUFBTSxVQUFVLG9CQUFvQixDQUFDLE1BQWUsRUFDZixZQUFtQixFQUNuQixJQUFZLEVBQ1osaUJBQXFDLEVBQ3JDLG1CQUEyQjtJQUM5RCxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDZCxPQUFPLFlBQVksQ0FBQztLQUNyQjtJQUVELElBQUksaUJBQWlCLEtBQUssU0FBUyxFQUFFO1FBQ25DLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7S0FDMUM7O1FBRUssa0JBQWtCLEdBQUcsWUFBWSxDQUFDLFdBQVc7O1FBRTdDLG9CQUFvQixHQUFXLHlCQUF5QixDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDOztRQUUvRixjQUFjLEdBQWdCLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsb0JBQW9CLENBQUM7SUFFckYsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDLE1BQU0sRUFBRTtRQUNoRSxjQUFjLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7S0FDdEU7U0FBTSxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUU7UUFDbkIsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUMzQjtTQUFNLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMs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QUN2QixPQUFPLEdBQUcsSUFBSSxDQUFDO2FBQ2hCO2lCQUFNO2dCQUNMLE9BQU8sR0FBRyxFQUFFLENBQUM7YUFDZDtTQUNGOzs7Ozs7Ozs7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7Ozs7Ozs7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsV0FBd0IsRUFBRSxTQUFpQixFQUFFLE1BQWU7SUFDOUYsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdEQsQ0FBQzs7Ozs7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsTUFBZTs7O1FBQzVDLEdBQUcsR0FBNkIsRUFBRTs7UUFFeEMsS0FBb0IsSUFBQSxXQUFBLFNBQUEsTUFBTSxDQUFBLDhCQUFBLGtEQUFFO1lBQXZCLElBQU0sS0FBSyxtQkFBQTs7Z0JBQ1IsS0FBSyxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDO1lBQ3pELEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7U0FDcEI7Ozs7Ozs7OztJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvb3JkaW5hdGVzLCBTbGlkZSwgU2xpZGVzIH0gZnJvbSAnLi4vY29yZS9wcmVzZW50YXRpb24udHlwZXMnO1xuaW1wb3J0IHsgUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IG1heCwgbWluIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDb29yZGluYXRlcyhzbGlkZXM6IFNsaWRlW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNsaWRlOiBTbGlkZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXNUb0tlZXA6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlc01heERlcHRoOiBudW1iZXIpOiBTbGlkZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChtb3ZlID09PSAwKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRTbGlkZTtcbiAgfVxuXG4gIGlmIChjb29yZGluYXRlc1RvS2VlcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHNsaWRlc1tjdXJyZW50U2xpZGUuaW5kZXggKyBtb3ZlXTtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRDb29yZGluYXRlcyA9IGN1cnJlbnRTbGlkZS5jb29yZGluYXRlcztcblxuICBjb25zdCBjb29yZGluYXRlc1RvS2VlcEFiczogbnVtYmVyID0gY29vcmRpbmF0ZXNUb0tlZXBBYnNvbHV0ZShjdXJyZW50Q29vcmRpbmF0ZXMsIGNvb3JkaW5hdGVzVG9LZWVwKTtcblxuICBjb25zdCBuZXdDb29yZGluYXRlczogQ29vcmRpbmF0ZXMgPSBjdXJyZW50Q29vcmRpbmF0ZXMuc2xpY2UoMCwgY29vcmRpbmF0ZXNUb0tlZXBBYnMpO1xuXG4gIGlmIChtb3ZlID4gMCAmJiBjb29yZGluYXRlc1RvS2VlcEFicyA8IGN1cnJlbnRDb29yZGluYXRlcy5sZW5ndGgpIHtcbiAgICBuZXdDb29yZGluYXRlcy5wdXNoKGN1cnJlbnRDb29yZGluYXRlc1tjb29yZGluYXRlc1RvS2VlcEFic10gKyBtb3ZlKTtcbiAgfSBlbHNlIGlmIChtb3ZlID4gMCkge1xuICAgIG5ld0Nvb3JkaW5hdGVzLnB1c2gobW92ZSk7XG4gIH0gZWxzZSBpZiAobW92ZSA8IDAgJiYgY3VycmVudENvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzVG9LZWVwQWJzICsgMV0gIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50Q29vcmRpbmF0ZXNbY29vcmRpbmF0ZXNUb0tlZXBBYnMgKyAxXSA+IDEpIHtcbiAgICBuZXdDb29yZGluYXRlcy5wdXNoKGN1cnJlbnRDb29yZGluYXRlc1tjb29yZGluYXRlc1RvS2VlcEFic10gKyBtb3ZlICsgMSk7XG4gIH0gZWxzZSBpZiAobW92ZSA8IDAgJiYgY29vcmRpbmF0ZXNUb0tlZXBBYnMgPCBjdXJyZW50Q29vcmRpbmF0ZXMubGVuZ3RoKSB7XG4gICAgbmV3Q29vcmRpbmF0ZXMucHVzaChtYXgoMSwgY3VycmVudENvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzVG9LZWVwQWJzXSArIG1vdmUpKTtcbiAgfSBlbHNlIGlmIChtb3ZlIDwgMCkge1xuICAgIG5ld0Nvb3JkaW5hdGVzLnB1c2goMSk7XG4gIH1cblxuICBpZiAobW92ZSA8IDApIHtcbiAgICB3aGlsZSAobmV3Q29vcmRpbmF0ZXMubGVuZ3RoIDw9IGNvb3JkaW5hdGVzTWF4RGVwdGgpIHtcbiAgICAgIG5ld0Nvb3JkaW5hdGVzLnB1c2goMSk7XG4gICAgfVxuICB9XG5cbiAgbGV0IGFycmF5VG9TZWFyY2hJbjogU2xpZGVbXTtcbiAgaWYgKG1vdmUgPj0gMCkge1xuICAgIGFycmF5VG9TZWFyY2hJbiA9IHNsaWRlcy5zbGljZShjdXJyZW50U2xpZGUuaW5kZXggKyAxKTtcbiAgfSBlbHNlIHtcbiAgICBhcnJheVRvU2VhcmNoSW4gPSBzbGlkZXMuc2xpY2UoMCwgY3VycmVudFNsaWRlLmluZGV4KS5yZXZlcnNlKCk7XG4gIH1cblxuICBjb25zdCBuZXh0U2xpZGUgPSBhcnJheVRvU2VhcmNoSW4uZmluZChzbGlkZSA9PiB7XG4gICAgY29uc3QgY29tcGFyZWQgPSBjb21wYXJlQ29vcmRpbmF0ZXMoc2xpZGUuY29vcmRpbmF0ZXMsIG5ld0Nvb3JkaW5hdGVzKTtcblxuICAgIGlmIChtb3ZlIDwgMCkge1xuICAgICAgcmV0dXJuIGNvbXBhcmVkIDw9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjb21wYXJlZCA+PSAwO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG5leHRTbGlkZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvb3JkaW5hdGVzVG9LZWVwQWJzb2x1dGUoY29vcmRpbmF0ZXM6IENvb3JkaW5hdGVzLCBjb29yZGluYXRlc1RvS2VlcFJlbGF0aXZlOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoY29vcmRpbmF0ZXNUb0tlZXBSZWxhdGl2ZSA+PSAwKSB7XG4gICAgcmV0dXJuIG1pbihjb29yZGluYXRlc1RvS2VlcFJlbGF0aXZlLCBjb29yZGluYXRlcy5sZW5ndGgpO1xuICB9XG5cbiAgcmV0dXJuIG1heChjb29yZGluYXRlcy5sZW5ndGggKyBjb29yZGluYXRlc1RvS2VlcFJlbGF0aXZlLCAwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJvdXRlclBhcmFtc0Nvb3JkaW5hdGVQcmVmaXggPSAnY29vcmRpbmF0ZS0nO1xuXG5leHBvcnQgZnVuY3Rpb24gcm91dGVQYXJhbXNUb0Nvb3JkaW5hdGUocm91dGVQYXJhbXM6IFBhcmFtcyk6IG51bWJlcltdIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJvdXRlUGFyYW1zKTtcblxuICBjb25zdCBjb29yZGluYXRlcyA9IGtleXNcbiAgICAuZmlsdGVyKGtleSA9PiBrZXkuc3RhcnRzV2l0aChyb3V0ZXJQYXJhbXNDb29yZGluYXRlUHJlZml4KSlcbiAgICAubWFwKGtleSA9PiB7XG4gICAgICBjb25zdCBrZXlOdW1iZXIgPSBwYXJzZUludChrZXkuc3Vic3RyKHJvdXRlclBhcmFtc0Nvb3JkaW5hdGVQcmVmaXgubGVuZ3RoKSwgMTApO1xuXG4gICAgICByZXR1cm4geyBrZXksIGtleU51bWJlciB9O1xuICAgIH0pXG4gICAgLnNvcnQoKGEsIGIpID0+IGNvbXBhcmVOdW1iZXIoYS5rZXlOdW1iZXIsIGIua2V5TnVtYmVyKSlcbiAgICAubWFwKGtleSA9PiBwYXJzZUludChyb3V0ZVBhcmFtc1trZXkua2V5XSwgMTApKTtcblxuICByZXR1cm4gY29vcmRpbmF0ZXM7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVOdW1iZXIoYTogbnVtYmVyIHwgdW5kZWZpbmVkLCBiOiBudW1iZXIgfCB1bmRlZmluZWQpOiAtMSB8IDAgfCAxIHtcbiAgaWYgKGEgIT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmIChhICE9PSB1bmRlZmluZWQgJiYgYiAhPT0gdW5kZWZpbmVkICYmIGEgPiBiKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBpZiAoYSAhPT0gdW5kZWZpbmVkICYmIGIgIT09IHVuZGVmaW5lZCAmJiBhIDwgYikge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxDb29yZGluYXRlcyhjMTogQ29vcmRpbmF0ZXMgfCBudWxsIHwgdW5kZWZpbmVkLCBjMjogQ29vcmRpbmF0ZXMgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb21wYXJlQ29vcmRpbmF0ZXMoYzEsIGMyKSA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVDb29yZGluYXRlcyhjMTogQ29vcmRpbmF0ZXMgfCBudWxsIHwgdW5kZWZpbmVkLCBjMjogQ29vcmRpbmF0ZXMgfCBudWxsIHwgdW5kZWZpbmVkKTogLTEgfCAwIHwgMSB7XG4gIGlmIChjMSA9PT0gYzIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmIChjMSA9PT0gbnVsbCB8fMKgYzEgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG5cbiAgaWYgKGMyID09PSBudWxsIHx8wqBjMiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBtYXhMZW5ndGggPSBtYXgoYzEubGVuZ3RoLCBjMi5sZW5ndGgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4TGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjMWkgPSBjMVtpXTtcbiAgICBjb25zdCBjMmkgPSBjMltpXTtcblxuICAgIGNvbnN0IGlSZXN1bHQgPSBjb21wYXJlTnVtYmVyKGMxaSwgYzJpKTtcblxuICAgIGlmIChpUmVzdWx0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gaVJlc3VsdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRDb29yZGluYXRlKHNsaWRlczogU2xpZGVzLCBjb29yZGluYXRlczogQ29vcmRpbmF0ZXMpOiBib29sZWFuIHtcbiAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxldCBjdXJyZW50OiBSZWN1cnNpdmVBcnJheTxTbGlkZT4gPSBzbGlkZXM7XG5cbiAgZm9yIChjb25zdCBjb29yZGluYXRlIG9mIGNvb3JkaW5hdGVzKSB7XG4gICAgY29uc3QgdG9vTG93ID0gY29vcmRpbmF0ZSA8IDE7XG4gICAgY29uc3QgdG9vSGlnaCA9IEFycmF5LmlzQXJyYXkoY3VycmVudCkgJiYgY29vcmRpbmF0ZSAtIDEgPj0gY3VycmVudC5sZW5ndGg7XG5cbiAgICBpZiAodG9vTG93IHx8IHRvb0hpZ2gpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0ID0gY3VycmVudFtjb29yZGluYXRlIC0gMV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV4dCkpIHtcbiAgICAgIGN1cnJlbnQgPSBuZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50ID0gW107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb29yZGluYXRlc1RvU3RyaW5nKGNvb3JkaW5hdGVzOiBDb29yZGluYXRlcywgc2VwYXJhdG9yOiBzdHJpbmcsIGxlbmd0aD86IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBjb29yZGluYXRlcy5zbGljZSgwLCBsZW5ndGgpLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvb3JkaW5hdGVUb1NsaWRlTWFwKHNsaWRlczogU2xpZGVbXSk6IHsgW2tleTogc3RyaW5nXTogU2xpZGUgfSB7XG4gIGNvbnN0IG1hcDogeyBba2V5OiBzdHJpbmddOiBTbGlkZSB9ID0ge307XG5cbiAgZm9yIChjb25zdCBzbGlkZSBvZiBzbGlkZXMpIHtcbiAgICBjb25zdCBpbmRleCA9IGNvb3JkaW5hdGVzVG9TdHJpbmcoc2xpZGUuY29vcmRpbmF0ZXMsICcuJyk7XG4gICAgbWFwW2luZGV4XSA9IHNsaWRlO1xuICB9XG5cbiAgcmV0dXJuIG1hcDtcbn1cbiJdfQ==