patternplate-client
Version:
Universal javascript client application for patternplate
424 lines (340 loc) • 43.2 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _entries = require('babel-runtime/core-js/object/entries');
var _entries2 = _interopRequireDefault(_entries);
var _values = require('babel-runtime/core-js/object/values');
var _values2 = _interopRequireDefault(_values);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _lodash = require('lodash');
var _reactRedux = require('react-redux');
var _redux = require('redux');
var _shortid = require('shortid');
var _shortid2 = _interopRequireDefault(_shortid);
var _urlQuery = require('../utils/url-query');
var _urlQuery2 = _interopRequireDefault(_urlQuery);
var _navigate = require('../utils/navigate');
var _navigate2 = _interopRequireDefault(_navigate);
var _pattern = require('../components/pattern');
var _pattern2 = _interopRequireDefault(_pattern);
var _actions = require('../actions');
var _patternDemoError = require('../actions/pattern-demo-error');
var _patternDemoError2 = _interopRequireDefault(_patternDemoError);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.default = (0, _reactRedux.connect)(mapState, mapDispatch)(_pattern2.default);
function mapState(state) {
return {
activeSource: state.sourceId || '',
automount: selectAutomount(state),
base: state.base,
breadcrumbs: selectBreadCrumbs(state),
code: selectCode(state),
rulerX: selectRulerXFraction(state),
rulerY: selectRulerYFraction(state),
rulerLengthX: selectRulerLengthX(state),
rulerLengthY: selectRulerLengthY(state),
demoContentHeight: selectDemoContentHeight(state),
demoContentWidth: selectDemoContentWidth(state),
demoHeight: selectHeight(state),
demoWidth: selectWidth(state),
dependencies: selectDependencies(state),
dependents: selectDependents(state),
display: selectDisplay(state),
environment: state.environment,
environments: selectEnvironments(state),
errored: selectPatternErrored(state),
flag: selectFlag(state),
id: selectId(state),
loading: selectLoading(state),
location: selectLocation(state),
name: selectName(state),
onDemoReady: selectOnDemoReloaded(state),
opacity: state.opacity,
reloadedTime: selectReloadedTime(state),
reloadTime: selectReloadTime(state),
rulers: state.rulers,
sourceExpanded: state.sourceExpanded,
tags: selectTags(state),
version: selectVersion(state)
};
}
function mapDispatch(dispatch) {
return (0, _redux.bindActionCreators)({
onConcernChange: _actions.changeConcern,
onDemoError: _patternDemoError2.default,
onDemoReady: function onDemoReady() {
return (0, _actions.loadPatternDemo)(false);
},
onDemoContentResize: _actions.demoContentResize,
onDemoScroll: _actions.scrollDemo,
onEnvironmentChange: _actions.changeEnvironment,
onFileRequest: _actions.loadPatternFile,
reload: _actions.loadPattern,
resize: _actions.resizeDemo,
onTypeChange: _actions.changeType
}, dispatch);
}
function selectWidth(state) {
var dim = state.demoDimensions[state.id] || {};
return isNaN(dim.x) ? selectWindowWidth(state) / 2 : dim.x;
}
function selectHeight(state) {
var dim = state.demoDimensions[state.id] || {};
return isNaN(dim.y) ? selectWindowHeight(state) / 2 : dim.y;
}
function selectDemoContentWidth(state) {
var dim = state.demoContentDimensions[state.id] || {};
return dim.width || 0;
}
function selectDemoContentHeight(state) {
var dim = state.demoContentDimensions[state.id] || {};
return dim.height || 0;
}
function selectRulerXFraction(state) {
var length = selectRulerLengthX(state);
var scrollX = state.scrollDemoX.x;
return scrollX / (length / 100);
}
function selectRulerYFraction(state) {
var length = selectRulerLengthY(state);
var scrollY = state.scrollDemoY.y;
return scrollY / (length / 100);
}
function selectRulerLengthX(state) {
var width = selectDemoContentWidth(state);
var windowWidth = selectWindowWidth(state);
return width * 2 + Math.abs(windowWidth - width);
}
function selectRulerLengthY(state) {
var height = selectDemoContentHeight(state);
var windowHeight = selectWindowHeight(state);
return height * 2 + Math.abs(windowHeight - height);
}
function selectWindowWidth(state) {
return (state.window || {}).width || 0;
}
function selectWindowHeight(state) {
return (state.window || {}).height || 0;
}
function selectBreadCrumbs(state) {
var fragments = selectId(state).split('/');
var location = selectLocation(state);
if (fragments.length < 2) {
return [];
}
return fragments.map(function (fragment, index) {
var partial = fragments.slice(0, index + 1).join('/');
return {
id: partial,
name: fragment,
navigateable: index < fragments.length - 1,
target: {
pathname: state.base + 'pattern/' + partial,
query: location.query
}
};
});
}
function selectPattern(state) {
var cached = (0, _navigate2.default)(state.id, state.navigation);
return (0, _lodash.merge)({}, cached, state.pattern);
}
function selectManifest(state) {
var pattern = selectPattern(state);
return pattern.manifest || {};
}
function selectManifestOptions(state) {
var manifest = selectManifest(state);
return manifest.options || {};
}
function selectReactMarkup(state) {
var options = selectManifestOptions(state);
return options['react-to-markup'] || {};
}
function selectReactMarkupOptions(state) {
var markup = selectReactMarkup(state);
return markup.opts || {};
}
function selectAutomount(state) {
var opts = selectReactMarkupOptions(state);
return 'automount' in opts ? opts.automount : false;
}
function getManifestSelector(name, defaultValue) {
return function (state) {
var manifest = selectManifest(state);
var value = manifest[name];
return typeof value === 'undefined' ? defaultValue : value;
};
}
function selectId(state) {
return state.id || selectPattern(state).id;
}
function selectName(state) {
var pattern = selectPattern(state);
var name = getManifestSelector('name')(state);
var displayName = getManifestSelector('displayName')(state);
return displayName || name || pattern.id || '';
}
function selectEnvironments(state) {
var environments = selectPattern(state).environments || [];
return environments.map(function (env) {
return {
id: env.name,
name: env.displayName || env.name
};
});
}
function selectFlag(state) {
return getManifestSelector('flag', '')(state);
}
function selectTags(state) {
return getManifestSelector('tags', [])(state);
}
function selectVersion(state) {
return getManifestSelector('version', '')(state);
}
function selectDisplay(state) {
return getManifestSelector('display', true)(state);
}
function selectDependentPatterns(state) {
return selectPattern(state).dependents || {};
}
function selectDependents(state) {
return (0, _values2.default)(selectDependentPatterns(state)).filter(function (pattern) {
return pattern.display;
}).reduce(function (registry, pattern) {
var navPattern = (0, _navigate2.default)(pattern.id, state.navigation) || { manifest: {} };
var patternEntries = (0, _entries2.default)(navPattern.manifest.patterns || {});
var localNames = patternEntries.filter(function (entry) {
return entry[1] === state.id;
}).map(function (entry) {
return entry[0];
});
var amend = localNames.map(function (localName) {
return {
id: pattern.id,
name: pattern.displayName || pattern.name,
localName: localName,
version: pattern.version
};
});
return [].concat((0, _toConsumableArray3.default)(registry), (0, _toConsumableArray3.default)(amend));
}, []);
}
function selectDependencies(state) {
var rootPattern = selectPattern(state);
return (0, _entries2.default)(rootPattern.dependencies || {}).filter(function (entry) {
return entry[0] !== 'Pattern';
}).filter(function (entry) {
return entry[1].manifest.display !== false;
}).map(function (entry) {
var _entry = (0, _slicedToArray3.default)(entry, 2),
localName = _entry[0],
pattern = _entry[1];
var navPattern = (0, _navigate2.default)(pattern.id, state.navigation) || { manifest: {} };
return {
id: pattern.id,
name: navPattern.manifest.displayName || navPattern.manifest.name,
localName: localName,
version: navPattern.manifest.version
};
});
}
function selectLoading(state) {
var pattern = selectPattern(state);
return [pattern.dataLoading, pattern.demoLoading, pattern.sourceLoading].some(Boolean);
}
function selectReloadTime(state) {
var pattern = selectPattern(state);
return pattern.reloadTime || null;
}
function selectReloadedTime(state) {
var pattern = selectPattern(state);
return pattern.reloadedTime || null;
}
function selectLocation(state) {
return state.routing.locationBeforeTransitions;
}
function selectOnDemoReloaded(state) {
var pattern = selectPattern(state);
return pattern.onDemoReloaded || _lodash.noop;
}
function selectPatternErrors(state) {
return selectPattern(state).errors || [];
}
function selectPatternErrored(state) {
var pattern = selectPattern(state);
return [pattern.dataErrored, pattern.demoErrored, pattern.sourceErrored].some(Boolean);
}
function selectCode(state) {
var pattern = selectPattern(state);
var sources = pattern.sources || {};
var files = pattern.files || [];
var errors = selectPatternErrors(state);
var formats = (0, _lodash.uniqBy)(files.reduce(function (registry, file) {
return [].concat((0, _toConsumableArray3.default)(registry), [{
id: [pattern.id, file.type].join('/'),
displayName: file.displayName,
inExtname: _path2.default.extname(file.path),
outExtname: '.' + file.out,
type: file.type,
in: file.in,
out: file.out
}]);
}, []), 'id');
return formats.map(function (format) {
var formatFiles = files.filter(function (file) {
return file.type === format.type;
});
var concerns = formatFiles.map(function (file) {
return file.concern;
});
var hasDemo = (0, _lodash.includes)(concerns, 'demo');
var defaultConcern = hasDemo ? 'demo' : 'index';
var parsed = _urlQuery2.default.parse(state.sourceId || '');
var passedConcern = _path2.default.basename(parsed.pathname, _path2.default.extname(parsed.pathname)) || defaultConcern;
var isApplicable = (0, _lodash.includes)(concerns, passedConcern);
var concern = isApplicable ? passedConcern : defaultConcern;
var sourceType = format.type === 'documentation' ? 'source' : state.sourceType;
var language = sourceType === 'source' ? format.in : format.out;
var extname = format.inExtname;
var pathname = [pattern.id, '' + concern + extname].join('/');
var types = hasDemo && concern === 'index' ? ['source'] : ['source', 'transformed'];
var type = hasDemo && concern === 'index' ? 'source' : sourceType;
var id = _urlQuery2.default.format({
pathname: pathname,
query: {
type: type,
environment: state.environment
}
});
var source = sources[id];
var active = state.sourceId === id;
var fileErrors = errors.filter(function (error) {
return error.payload ? error.payload.id === id : error.patternFile === id;
});
var update = active && !source && !pattern.sourceLoading && !fileErrors.length;
return {
active: active,
update: update,
extname: extname,
concern: concern,
concerns: concerns,
id: id,
shortid: (0, _shortid2.default)(id),
language: language,
name: format.displayName,
source: source || '',
type: type,
types: types
};
});
}
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9hcHBsaWNhdGlvbi9jb250YWluZXJzL3BhdHRlcm4uanMiXSwibmFtZXMiOlsibWFwU3RhdGUiLCJtYXBEaXNwYXRjaCIsInN0YXRlIiwiYWN0aXZlU291cmNlIiwic291cmNlSWQiLCJhdXRvbW91bnQiLCJzZWxlY3RBdXRvbW91bnQiLCJiYXNlIiwiYnJlYWRjcnVtYnMiLCJzZWxlY3RCcmVhZENydW1icyIsImNvZGUiLCJzZWxlY3RDb2RlIiwicnVsZXJYIiwic2VsZWN0UnVsZXJYRnJhY3Rpb24iLCJydWxlclkiLCJzZWxlY3RSdWxlcllGcmFjdGlvbiIsInJ1bGVyTGVuZ3RoWCIsInNlbGVjdFJ1bGVyTGVuZ3RoWCIsInJ1bGVyTGVuZ3RoWSIsInNlbGVjdFJ1bGVyTGVuZ3RoWSIsImRlbW9Db250ZW50SGVpZ2h0Iiwic2VsZWN0RGVtb0NvbnRlbnRIZWlnaHQiLCJkZW1vQ29udGVudFdpZHRoIiwic2VsZWN0RGVtb0NvbnRlbnRXaWR0aCIsImRlbW9IZWlnaHQiLCJzZWxlY3RIZWlnaHQiLCJkZW1vV2lkdGgiLCJzZWxlY3RXaWR0aCIsImRlcGVuZGVuY2llcyIsInNlbGVjdERlcGVuZGVuY2llcyIsImRlcGVuZGVudHMiLCJzZWxlY3REZXBlbmRlbnRzIiwiZGlzcGxheSIsInNlbGVjdERpc3BsYXkiLCJlbnZpcm9ubWVudCIsImVudmlyb25tZW50cyIsInNlbGVjdEVudmlyb25tZW50cyIsImVycm9yZWQiLCJzZWxlY3RQYXR0ZXJuRXJyb3JlZCIsImZsYWciLCJzZWxlY3RGbGFnIiwiaWQiLCJzZWxlY3RJZCIsImxvYWRpbmciLCJzZWxlY3RMb2FkaW5nIiwibG9jYXRpb24iLCJzZWxlY3RMb2NhdGlvbiIsIm5hbWUiLCJzZWxlY3ROYW1lIiwib25EZW1vUmVhZHkiLCJzZWxlY3RPbkRlbW9SZWxvYWRlZCIsIm9wYWNpdHkiLCJyZWxvYWRlZFRpbWUiLCJzZWxlY3RSZWxvYWRlZFRpbWUiLCJyZWxvYWRUaW1lIiwic2VsZWN0UmVsb2FkVGltZSIsInJ1bGVycyIsInNvdXJjZUV4cGFuZGVkIiwidGFncyIsInNlbGVjdFRhZ3MiLCJ2ZXJzaW9uIiwic2VsZWN0VmVyc2lvbiIsImRpc3BhdGNoIiwib25Db25jZXJuQ2hhbmdlIiwib25EZW1vRXJyb3IiLCJvbkRlbW9Db250ZW50UmVzaXplIiwib25EZW1vU2Nyb2xsIiwib25FbnZpcm9ubWVudENoYW5nZSIsIm9uRmlsZVJlcXVlc3QiLCJyZWxvYWQiLCJyZXNpemUiLCJvblR5cGVDaGFuZ2UiLCJkaW0iLCJkZW1vRGltZW5zaW9ucyIsImlzTmFOIiwieCIsInNlbGVjdFdpbmRvd1dpZHRoIiwieSIsInNlbGVjdFdpbmRvd0hlaWdodCIsImRlbW9Db250ZW50RGltZW5zaW9ucyIsIndpZHRoIiwiaGVpZ2h0IiwibGVuZ3RoIiwic2Nyb2xsWCIsInNjcm9sbERlbW9YIiwic2Nyb2xsWSIsInNjcm9sbERlbW9ZIiwid2luZG93V2lkdGgiLCJNYXRoIiwiYWJzIiwid2luZG93SGVpZ2h0Iiwid2luZG93IiwiZnJhZ21lbnRzIiwic3BsaXQiLCJtYXAiLCJmcmFnbWVudCIsImluZGV4IiwicGFydGlhbCIsInNsaWNlIiwiam9pbiIsIm5hdmlnYXRlYWJsZSIsInRhcmdldCIsInBhdGhuYW1lIiwicXVlcnkiLCJzZWxlY3RQYXR0ZXJuIiwiY2FjaGVkIiwibmF2aWdhdGlvbiIsInBhdHRlcm4iLCJzZWxlY3RNYW5pZmVzdCIsIm1hbmlmZXN0Iiwic2VsZWN0TWFuaWZlc3RPcHRpb25zIiwib3B0aW9ucyIsInNlbGVjdFJlYWN0TWFya3VwIiwic2VsZWN0UmVhY3RNYXJrdXBPcHRpb25zIiwibWFya3VwIiwib3B0cyIsImdldE1hbmlmZXN0U2VsZWN0b3IiLCJkZWZhdWx0VmFsdWUiLCJ2YWx1ZSIsImRpc3BsYXlOYW1lIiwiZW52Iiwic2VsZWN0RGVwZW5kZW50UGF0dGVybnMiLCJmaWx0ZXIiLCJyZWR1Y2UiLCJyZWdpc3RyeSIsIm5hdlBhdHRlcm4iLCJwYXR0ZXJuRW50cmllcyIsInBhdHRlcm5zIiwibG9jYWxOYW1lcyIsImVudHJ5IiwiYW1lbmQiLCJsb2NhbE5hbWUiLCJyb290UGF0dGVybiIsImRhdGFMb2FkaW5nIiwiZGVtb0xvYWRpbmciLCJzb3VyY2VMb2FkaW5nIiwic29tZSIsIkJvb2xlYW4iLCJyb3V0aW5nIiwibG9jYXRpb25CZWZvcmVUcmFuc2l0aW9ucyIsIm9uRGVtb1JlbG9hZGVkIiwic2VsZWN0UGF0dGVybkVycm9ycyIsImVycm9ycyIsImRhdGFFcnJvcmVkIiwiZGVtb0Vycm9yZWQiLCJzb3VyY2VFcnJvcmVkIiwic291cmNlcyIsImZpbGVzIiwiZm9ybWF0cyIsImZpbGUiLCJ0eXBlIiwiaW5FeHRuYW1lIiwiZXh0bmFtZSIsInBhdGgiLCJvdXRFeHRuYW1lIiwib3V0IiwiaW4iLCJmb3JtYXRGaWxlcyIsImZvcm1hdCIsImNvbmNlcm5zIiwiY29uY2VybiIsImhhc0RlbW8iLCJkZWZhdWx0Q29uY2VybiIsInBhcnNlZCIsInBhcnNlIiwicGFzc2VkQ29uY2VybiIsImJhc2VuYW1lIiwiaXNBcHBsaWNhYmxlIiwic291cmNlVHlwZSIsImxhbmd1YWdlIiwidHlwZXMiLCJzb3VyY2UiLCJhY3RpdmUiLCJmaWxlRXJyb3JzIiwiZXJyb3IiLCJwYXlsb2FkIiwicGF0dGVybkZpbGUiLCJ1cGRhdGUiLCJzaG9ydGlkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUVBOztBQUtBOzs7Ozs7a0JBRWUseUJBQVFBLFFBQVIsRUFBa0JDLFdBQWxCLG9COzs7QUFFZixTQUFTRCxRQUFULENBQWtCRSxLQUFsQixFQUF5QjtBQUN4QixRQUFPO0FBQ05DLGdCQUFjRCxNQUFNRSxRQUFOLElBQWtCLEVBRDFCO0FBRU5DLGFBQVdDLGdCQUFnQkosS0FBaEIsQ0FGTDtBQUdOSyxRQUFNTCxNQUFNSyxJQUhOO0FBSU5DLGVBQWFDLGtCQUFrQlAs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UUFBRCxDQUFqQyxHQUE4QyxDQUFDLFFBQUQsRUFBVyxhQUFYLENBQTVEO0FBQ0EsTUFBTVYsT0FBT1csV0FBV0QsWUFBWSxPQUF2QixHQUFpQyxRQUFqQyxHQUE0Q1EsVUFBekQ7O0FBRUEsTUFBTS9ILEtBQUssbUJBQVNxSCxNQUFULENBQWdCO0FBQzFCeEQscUJBRDBCO0FBRTFCQyxVQUFPO0FBQ04rQyxjQURNO0FBRU5wSCxpQkFBYWhDLE1BQU1nQztBQUZiO0FBRm1CLEdBQWhCLENBQVg7O0FBUUEsTUFBTXlJLFNBQVN6QixRQUFRekcsRUFBUixDQUFmO0FBQ0EsTUFBTW1JLFNBQVMxSyxNQUFNRSxRQUFOLEtBQW1CcUMsRUFBbEM7O0FBRUEsTUFBTW9JLGFBQWEvQixPQUFPcEIsTUFBUCxDQUFjLGlCQUFTO0FBQ3pDLFVBQU9vRCxNQUFNQyxPQUFOLEdBQ05ELE1BQU1DLE9BQU4sQ0FBY3RJLEVBQWQsS0FBcUJBLEVBRGYsR0FFTnFJLE1BQU1FLFdBQU4sS0FBc0J2SSxFQUZ2QjtBQUdBLEdBSmtCLENBQW5COztBQU1BLE1BQU13SSxTQUFTTCxVQUNkLENBQUNELE1BRGEsSUFFZCxDQUFDaEUsUUFBUTRCLGFBRkssSUFHZCxDQUFDc0MsV0FBVzNGLE1BSGI7O0FBS0EsU0FBTztBQUNOMEYsaUJBRE07QUFFTkssaUJBRk07QUFHTnpCLG1CQUhNO0FBSU5RLG1CQUpNO0FBS05ELHFCQUxNO0FBTU50SCxTQU5NO0FBT055SSxZQUFTLHVCQUFRekksRUFBUixDQVBIO0FBUU5nSSxxQkFSTTtBQVNOMUgsU0FBTStHLE9BQU92QyxXQVRQO0FBVU5vRCxXQUFRQSxVQUFVLEVBVlo7QUFXTnJCLGFBWE07QUFZTm9CO0FBWk0sR0FBUDtBQWNBLEVBNURNLENBQVA7QUE2REEiLCJmaWxlIjoicGF0dGVybi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge2luY2x1ZGVzLCBtZXJnZSwgbm9vcCwgdW5pcUJ5fSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtjb25uZWN0fSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQge2JpbmRBY3Rpb25DcmVhdG9yc30gZnJvbSAncmVkdXgnO1xuaW1wb3J0IHNob3J0aWQgZnJvbSAnc2hvcnRpZCc7XG5cbmltcG9ydCB1cmxRdWVyeSBmcm9tICcuLi91dGlscy91cmwtcXVlcnknO1xuaW1wb3J0IG5hdmlnYXRlIGZyb20gJy4uL3V0aWxzL25hdmlnYXRlJztcbmltcG9ydCBQYXR0ZXJuIGZyb20gJy4uL2NvbXBvbmVudHMvcGF0dGVybic7XG5cbmltcG9ydCB7XG5cdGNoYW5nZUNvbmNlcm4sIGNoYW5nZUVudmlyb25tZW50LCBjaGFuZ2VUeXBlLCBkZW1vQ29udGVudFJlc2l6ZSxcblx0bG9hZFBhdHRlcm4sIGxvYWRQYXR0ZXJuRGVtbywgbG9hZFBhdHRlcm5GaWxlLCByZXNpemVEZW1vLCBzY3JvbGxEZW1vXG59IGZyb20gJy4uL2FjdGlvbnMnO1xuXG5pbXBvcnQgcGF0dGVybkRlbW9FcnJvciBmcm9tICcuLi9hY3Rpb25zL3BhdHRlcm4tZGVtby1lcnJvcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGUsIG1hcERpc3BhdGNoKShQYXR0ZXJuKTtcblxuZnVuY3Rpb24gbWFwU3RhdGUoc3RhdGUpIHtcblx0cmV0dXJuIHtcblx0XHRhY3RpdmVTb3VyY2U6IHN0YXRlLnNvdXJjZUlkIHx8ICcnLFxuXHRcdGF1dG9tb3VudDogc2VsZWN0QXV0b21vdW50KHN0YXRlKSxcblx0XHRiYXNlOiBzdGF0ZS5iYXNlLFxuXHRcdGJyZWFkY3J1bWJzOiBzZWxlY3RCcmVhZENydW1icyhzdGF0ZSksXG5cdFx0Y29kZTogc2VsZWN0Q29kZShzdGF0ZSksXG5cdFx0cnVsZXJYOiBzZWxlY3RSdWxlclhGcmFjdGlvbihzdGF0ZSksXG5cdFx0cnVsZXJZOiBzZWxlY3RSdWxlcllGcmFjdGlvbihzdGF0ZSksXG5cdFx0cnVsZXJMZW5ndGhYOiBzZWxlY3RSdWxlckxlbmd0aFgoc3RhdGUpLFxuXHRcdHJ1bGVyTGVuZ3RoWTogc2VsZWN0UnVsZXJMZW5ndGhZKHN0YXRlKSxcblx0XHRkZW1vQ29udGVudEhlaWdodDogc2VsZWN0RGVtb0NvbnRlbnRIZWlnaHQoc3RhdGUpLFxuXHRcdGRlbW9Db250ZW50V2lkdGg6IHNlbGVjdERlbW9Db250ZW50V2lkdGgoc3RhdGUpLFxuXHRcdGRlbW9IZWlnaHQ6IHNlbGVjdEhlaWdodChzdGF0ZSksXG5cdFx0ZGVtb1dpZHRoOiBzZWxlY3RXaWR0aChzdGF0ZSksXG5cdFx0ZGVwZW5kZW5jaWVzOiBzZWxlY3REZXBlbmRlbmNpZXMoc3RhdGUpLFxuXHRcdGRlcGVuZGVudHM6IHNlbGVjdERlcGVuZGVudHMoc3RhdGUpLFxuXHRcdGRpc3BsYXk6IHNlbGVjdERpc3BsYXkoc3RhdGUpLFxuXHRcdGVudmlyb25tZW50OiBzdGF0ZS5lbnZpcm9ubWVudCxcblx0XHRlbnZpcm9ubWVudHM6IHNlbGVjdEVudmlyb25tZW50cyhzdGF0ZSksXG5cdFx0ZXJyb3JlZDogc2VsZWN0UGF0dGVybkVycm9yZWQoc3RhdGUpLFxuXHRcdGZsYWc6IHNlbGVjdEZsYWcoc3RhdGUpLFxuXHRcdGlkOiBzZWxlY3RJZChzdGF0ZSksXG5cdFx0bG9hZGluZzogc2VsZWN0TG9hZGluZyhzdGF0ZSksXG5cdFx0bG9jYXRpb246IHNlbGVjdExvY2F0aW9uKHN0YXRlKSxcblx0XHRuYW1lOiBzZWxlY3ROYW1lKHN0YXRlKSxcblx0XHRvbkRlbW9SZWFkeTogc2VsZWN0T25EZW1vUmVsb2FkZWQoc3RhdGUpLFxuXHRcdG9wYWNpdHk6IHN0YXRlLm9wYWNpdHksXG5cdFx0cmVsb2FkZWRUaW1lOiBzZWxlY3RSZWxvYWRlZFRpbWUoc3RhdGUpLFxuXHRcdHJlbG9hZFRpbWU6IHNlbGVjdFJlbG9hZFRpbWUoc3RhdGUpLFxuXHRcdHJ1bGVyczogc3RhdGUucnVsZXJzLFxuXHRcdHNvdXJjZUV4cGFuZGVkOiBzdGF0ZS5zb3VyY2VFeHBhbmRlZCxcblx0XHR0YWdzOiBzZWxlY3RUYWdzKHN0YXRlKSxcblx0XHR2ZXJzaW9uOiBzZWxlY3RWZXJzaW9uKHN0YXRlKVxuXHR9O1xufVxuXG5mdW5jdGlvbiBtYXBEaXNwYXRjaChkaXNwYXRjaCkge1xuXHRyZXR1cm4gYmluZEFjdGlvbkNyZWF0b3JzKHtcblx0XHRvbkNvbmNlcm5DaGFuZ2U6IGNoYW5nZUNvbmNlcm4sXG5cdFx0b25EZW1vRXJyb3I6IHBhdHRlcm5EZW1vRXJyb3IsXG5cdFx0b25EZW1vUmVhZHk6ICgpID0+IGxvYWRQYXR0ZXJuRGVtbyhmYWxzZSksXG5cdFx0b25EZW1vQ29udGVudFJlc2l6ZTogZGVtb0NvbnRlbnRSZXNpemUsXG5cdFx0b25EZW1vU2Nyb2xsOiBzY3JvbGxEZW1vLFxuXHRcdG9uRW52aXJvbm1lbnRDaGFuZ2U6IGNoYW5nZUVudmlyb25tZW50LFxuXHRcdG9uRmlsZVJlcXVlc3Q6IGxvYWRQYXR0ZXJuRmlsZSxcblx0XHRyZWxvYWQ6IGxvYWRQYXR0ZXJuLFxuXHRcdHJlc2l6ZTogcmVzaXplRGVtbyxcblx0XHRvblR5cGVDaGFuZ2U6IGNoYW5nZVR5cGVcblx0fSwgZGlzcGF0Y2gpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RXaWR0aChzdGF0ZSkge1xuXHRjb25zdCBkaW0gPSBzdGF0ZS5kZW1vRGltZW5zaW9uc1tzdGF0ZS5pZF0gfHwge307XG5cdHJldHVybiBpc05hTihkaW0ueCkgP1xuXHRcdHNlbGVjdFdpbmRvd1dpZHRoKHN0YXRlKSAvIDIgOlxuXHRcdGRpbS54O1xufVxuXG5mdW5jdGlvbiBzZWxlY3RIZWlnaHQoc3RhdGUpIHtcblx0Y29uc3QgZGltID0gc3RhdGUuZGVtb0RpbWVuc2lvbnNbc3RhdGUuaWRdIHx8IHt9O1xuXHRyZXR1cm4gaXNOYU4oZGltLnkpID9cblx0XHRzZWxlY3RXaW5kb3dIZWlnaHQoc3RhdGUpIC8gMiA6XG5cdFx0ZGltLnk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdERlbW9Db250ZW50V2lkdGgoc3RhdGUpIHtcblx0Y29uc3QgZGltID0gc3RhdGUuZGVtb0NvbnRlbnREaW1lbnNpb25zW3N0YXRlLmlkXSB8fCB7fTtcblx0cmV0dXJuIGRpbS53aWR0aCB8fCAwO1xufVxuXG5mdW5jdGlvbiBzZWxlY3REZW1vQ29udGVudEhlaWdodChzdGF0ZSkge1xuXHRjb25zdCBkaW0gPSBzdGF0ZS5kZW1vQ29udGVudERpbWVuc2lvbnNbc3RhdGUuaWRdIHx8IHt9O1xuXHRyZXR1cm4gZGltLmhlaWdodCB8fCAwO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RSdWxlclhGcmFjdGlvbihzdGF0ZSkge1xuXHRjb25zdCBsZW5ndGggPSBzZWxlY3RSdWxlckxlbmd0aFgoc3RhdGUpO1xuXHRjb25zdCBzY3JvbGxYID0gc3RhdGUuc2Nyb2xsRGVtb1gueDtcblx0cmV0dXJuIHNjcm9sbFggLyAobGVuZ3RoIC8gMTAwKTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0UnVsZXJZRnJhY3Rpb24oc3RhdGUpIHtcblx0Y29uc3QgbGVuZ3RoID0gc2VsZWN0UnVsZXJMZW5ndGhZKHN0YXRlKTtcblx0Y29uc3Qgc2Nyb2xsWSA9IHN0YXRlLnNjcm9sbERlbW9ZLnk7XG5cdHJldHVybiBzY3JvbGxZIC8gKGxlbmd0aCAvIDEwMCk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdFJ1bGVyTGVuZ3RoWChzdGF0ZSkge1xuXHRjb25zdCB3aWR0aCA9IHNlbGVjdERlbW9Db250ZW50V2lkdGgoc3RhdGUpO1xuXHRjb25zdCB3aW5kb3dXaWR0aCA9IHNlbGVjdFdpbmRvd1dpZHRoKHN0YXRlKTtcblx0cmV0dXJuIHdpZHRoICogMiArIE1hdGguYWJzKHdpbmRvd1dpZHRoIC0gd2lkdGgpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RSdWxlckxlbmd0aFkoc3RhdGUpIHtcblx0Y29uc3QgaGVpZ2h0ID0gc2VsZWN0RGVtb0NvbnRlbnRIZWlnaHQoc3RhdGUpO1xuXHRjb25zdCB3aW5kb3dIZWlnaHQgPSBzZWxlY3RXaW5kb3dIZWlnaHQoc3RhdGUpO1xuXHRyZXR1cm4gaGVpZ2h0ICogMiArIE1hdGguYWJzKHdpbmRvd0hlaWdodCAtIGhlaWdodCk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdFdpbmRvd1dpZHRoKHN0YXRlKSB7XG5cdHJldHVybiAoc3RhdGUud2luZG93IHx8IHt9KS53aWR0aCB8fCAwO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RXaW5kb3dIZWlnaHQoc3RhdGUpIHtcblx0cmV0dXJuIChzdGF0ZS53aW5kb3cgfHwge30pLmhlaWdodCB8fCAwO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RCcmVhZENydW1icyhzdGF0ZSkge1xuXHRjb25zdCBmcmFnbWVudHMgPSBzZWxlY3RJZChzdGF0ZSkuc3BsaXQoJy8nKTtcblx0Y29uc3QgbG9jYXRpb24gPSBzZWxlY3RMb2NhdGlvbihzdGF0ZSk7XG5cblx0aWYgKGZyYWdtZW50cy5sZW5ndGggPCAyKSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0cmV0dXJuIGZyYWdtZW50cy5tYXAoKGZyYWdtZW50LCBpbmRleCkgPT4ge1xuXHRcdGNvbnN0IHBhcnRpYWwgPSBmcmFnbWVudHMuc2xpY2UoMCwgaW5kZXggKyAxKS5qb2luKCcvJyk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGlkOiBwYXJ0aWFsLFxuXHRcdFx0bmFtZTogZnJhZ21lbnQsXG5cdFx0XHRuYXZpZ2F0ZWFibGU6IGluZGV4IDwgZnJhZ21lbnRzLmxlbmd0aCAtIDEsXG5cdFx0XHR0YXJnZXQ6IHtcblx0XHRcdFx0cGF0aG5hbWU6IGAke3N0YXRlLmJhc2V9cGF0dGVybi8ke3BhcnRpYWx9YCxcblx0XHRcdFx0cXVlcnk6IGxvY2F0aW9uLnF1ZXJ5XG5cdFx0XHR9XG5cdFx0fTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdFBhdHRlcm4oc3RhdGUpIHtcblx0Y29uc3QgY2FjaGVkID0gbmF2aWdhdGUoc3RhdGUuaWQsIHN0YXRlLm5hdmlnYXRpb24pO1xuXHRyZXR1cm4gbWVyZ2Uoe30sIGNhY2hlZCwgc3RhdGUucGF0dGVybik7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdE1hbmlmZXN0KHN0YXRlKSB7XG5cdGNvbnN0IHBhdHRlcm4gPSBzZWxlY3RQYXR0ZXJuKHN0YXRlKTtcblx0cmV0dXJuIHBhdHRlcm4ubWFuaWZlc3QgfHwge307XG59XG5cbmZ1bmN0aW9uIHNlbGVjdE1hbmlmZXN0T3B0aW9ucyhzdGF0ZSkge1xuXHRjb25zdCBtYW5pZmVzdCA9IHNlbGVjdE1hbmlmZXN0KHN0YXRlKTtcblx0cmV0dXJuIG1hbmlmZXN0Lm9wdGlvbnMgfHwge307XG59XG5cbmZ1bmN0aW9uIHNlbGVjdFJlYWN0TWFya3VwKHN0YXRlKSB7XG5cdGNvbnN0IG9wdGlvbnMgPSBzZWxlY3RNYW5pZmVzdE9wdGlvbnMoc3RhdGUpO1xuXHRyZXR1cm4gb3B0aW9uc1sncmVhY3QtdG8tbWFya3VwJ10gfHwge307XG59XG5cbmZ1bmN0aW9uIHNlbGVjdFJlYWN0TWFya3VwT3B0aW9ucyhzdGF0ZSkge1xuXHRjb25zdCBtYXJrdXAgPSBzZWxlY3RSZWFjdE1hcmt1cChzdGF0ZSk7XG5cdHJldHVybiBtYXJrdXAub3B0cyB8fCB7fTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0QXV0b21vdW50KHN0YXRlKSB7XG5cdGNvbnN0IG9wdHMgPSBzZWxlY3RSZWFjdE1hcmt1cE9wdGlvbnMoc3RhdGUpO1xuXHRyZXR1cm4gKCdhdXRvbW91bnQnIGluIG9wdHMpID8gb3B0cy5hdXRvbW91bnQgOiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuaWZlc3RTZWxlY3RvcihuYW1lLCBkZWZhdWx0VmFsdWUpIHtcblx0cmV0dXJuIHN0YXRlID0+IHtcblx0XHRjb25zdCBtYW5pZmVzdCA9IHNlbGVjdE1hbmlmZXN0KHN0YXRlKTtcblx0XHRjb25zdCB2YWx1ZSA9IG1hbmlmZXN0W25hbWVdO1xuXHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG5cdH07XG59XG5cbmZ1bmN0aW9uIHNlbGVjdElkKHN0YXRlKSB7XG5cdHJldHVybiBzdGF0ZS5pZCB8fCBzZWxlY3RQYXR0ZXJuKHN0YXRlKS5pZDtcbn1cblxuZnVuY3Rpb24gc2VsZWN0TmFtZShzdGF0ZSkge1xuXHRjb25zdCBwYXR0ZXJuID0gc2VsZWN0UGF0dGVybihzdGF0ZSk7XG5cdGNvbnN0IG5hbWUgPSBnZXRNYW5pZmVzdFNlbGVjdG9yKCduYW1lJykoc3RhdGUpO1xuXHRjb25zdCBkaXNwbGF5TmFtZSA9IGdldE1hbmlmZXN0U2VsZWN0b3IoJ2Rpc3BsYXlOYW1lJykoc3RhdGUpO1xuXHRyZXR1cm4gZGlzcGxheU5hbWUgfHwgbmFtZSB8fCBwYXR0ZXJuLmlkIHx8ICcnO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RFbnZpcm9ubWVudHMoc3RhdGUpIHtcblx0Y29uc3QgZW52aXJvbm1lbnRzID0gc2VsZWN0UGF0dGVybihzdGF0ZSkuZW52aXJvbm1lbnRzIHx8IFtdO1xuXHRyZXR1cm4gZW52aXJvbm1lbnRzLm1hcChlbnYgPT4ge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpZDogZW52Lm5hbWUsXG5cdFx0XHRuYW1lOiBlbnYuZGlzcGxheU5hbWUgfHwgZW52Lm5hbWVcblx0XHR9O1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0RmxhZyhzdGF0ZSkge1xuXHRyZXR1cm4gZ2V0TWFuaWZlc3RTZWxlY3RvcignZmxhZycsICcnKShzdGF0ZSk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdFRhZ3Moc3RhdGUpIHtcblx0cmV0dXJuIGdldE1hbmlmZXN0U2VsZWN0b3IoJ3RhZ3MnLCBbXSkoc3RhdGUpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RWZXJzaW9uKHN0YXRlKSB7XG5cdHJldHVybiBnZXRNYW5pZmVzdFNlbGVjdG9yKCd2ZXJzaW9uJywgJycpKHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0RGlzcGxheShzdGF0ZSkge1xuXHRyZXR1cm4gZ2V0TWFuaWZlc3RTZWxlY3RvcignZGlzcGxheScsIHRydWUpKHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0RGVwZW5kZW50UGF0dGVybnMoc3RhdGUpIHtcblx0cmV0dXJuIHNlbGVjdFBhdHRlcm4oc3RhdGUpLmRlcGVuZGVudHMgfHwge307XG59XG5cbmZ1bmN0aW9uIHNlbGVjdERlcGVuZGVudHMoc3RhdGUpIHtcblx0cmV0dXJuIE9iamVjdC52YWx1ZXMoc2VsZWN0RGVwZW5kZW50UGF0dGVybnMoc3RhdGUpKVxuXHRcdC5maWx0ZXIocGF0dGVybiA9PiBwYXR0ZXJuLmRpc3BsYXkpXG5cdFx0LnJlZHVjZSgocmVnaXN0cnksIHBhdHRlcm4pID0+IHtcblx0XHRcdGNvbnN0IG5hdlBhdHRlcm4gPSBuYXZpZ2F0ZShwYXR0ZXJuLmlkLCBzdGF0ZS5uYXZpZ2F0aW9uKSB8fCB7bWFuaWZlc3Q6IHt9fTtcblx0XHRcdGNvbnN0IHBhdHRlcm5FbnRyaWVzID0gT2JqZWN0LmVudHJpZXMobmF2UGF0dGVybi5tYW5pZmVzdC5wYXR0ZXJucyB8fCB7fSk7XG5cdFx0XHRjb25zdCBsb2NhbE5hbWVzID0gcGF0dGVybkVudHJpZXNcblx0XHRcdFx0LmZpbHRlcihlbnRyeSA9PiBlbnRyeVsxXSA9PT0gc3RhdGUuaWQpXG5cdFx0XHRcdC5tYXAoZW50cnkgPT4gZW50cnlbMF0pO1xuXG5cdFx0XHRjb25zdCBhbWVuZCA9IGxvY2FsTmFtZXMubWFwKGxvY2FsTmFtZSA9PiB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0aWQ6IHBhdHRlcm4uaWQsXG5cdFx0XHRcdFx0bmFtZTogcGF0dGVybi5kaXNwbGF5TmFtZSB8fCBwYXR0ZXJuLm5hbWUsXG5cdFx0XHRcdFx0bG9jYWxOYW1lLFxuXHRcdFx0XHRcdHZlcnNpb246IHBhdHRlcm4udmVyc2lvblxuXHRcdFx0XHR9O1xuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiBbLi4ucmVnaXN0cnksIC4uLmFtZW5kXTtcblx0XHR9LCBbXSk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdERlcGVuZGVuY2llcyhzdGF0ZSkge1xuXHRjb25zdCByb290UGF0dGVybiA9IHNlbGVjdFBhdHRlcm4oc3RhdGUpO1xuXHRyZXR1cm4gT2JqZWN0LmVudHJpZXMocm9vdFBhdHRlcm4uZGVwZW5kZW5jaWVzIHx8IHt9KVxuXHRcdC5maWx0ZXIoZW50cnkgPT4gZW50cnlbMF0gIT09ICdQYXR0ZXJuJylcblx0XHQuZmlsdGVyKGVudHJ5ID0+IGVudHJ5WzFdLm1hbmlmZXN0LmRpc3BsYXkgIT09IGZhbHNlKVxuXHRcdC5tYXAoZW50cnkgPT4ge1xuXHRcdFx0Y29uc3QgW2xvY2FsTmFtZSwgcGF0dGVybl0gPSBlbnRyeTtcblx0XHRcdGNvbnN0IG5hdlBhdHRlcm4gPSBuYXZpZ2F0ZShwYXR0ZXJuLmlkLCBzdGF0ZS5uYXZpZ2F0aW9uKSB8fCB7bWFuaWZlc3Q6IHt9fTtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aWQ6IHBhdHRlcm4uaWQsXG5cdFx0XHRcdG5hbWU6IG5hdlBhdHRlcm4ubWFuaWZlc3QuZGlzcGxheU5hbWUgfHwgbmF2UGF0dGVybi5tYW5pZmVzdC5uYW1lLFxuXHRcdFx0XHRsb2NhbE5hbWUsXG5cdFx0XHRcdHZlcnNpb246IG5hdlBhdHRlcm4ubWFuaWZlc3QudmVyc2lvblxuXHRcdFx0fTtcblx0XHR9KTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0TG9hZGluZyhzdGF0ZSkge1xuXHRjb25zdCBwYXR0ZXJuID0gc2VsZWN0UGF0dGVybihzdGF0ZSk7XG5cdHJldHVybiBbXG5cdFx0cGF0dGVybi5kYXRhTG9hZGluZyxcblx0XHRwYXR0ZXJuLmRlbW9Mb2FkaW5nLFxuXHRcdHBhdHRlcm4uc291cmNlTG9hZGluZ1xuXHRdLnNvbWUoQm9vbGVhbik7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdFJlbG9hZFRpbWUoc3RhdGUpIHtcblx0Y29uc3QgcGF0dGVybiA9IHNlbGVjdFBhdHRlcm4oc3RhdGUpO1xuXHRyZXR1cm4gcGF0dGVybi5yZWxvYWRUaW1lIHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdFJlbG9hZGVkVGltZShzdGF0ZSkge1xuXHRjb25zdCBwYXR0ZXJuID0gc2VsZWN0UGF0dGVybihzdGF0ZSk7XG5cdHJldHVybiBwYXR0ZXJuLnJlbG9hZGVkVGltZSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RMb2NhdGlvbihzdGF0ZSkge1xuXHRyZXR1cm4gc3RhdGUucm91dGluZy5sb2NhdGlvbkJlZm9yZVRyYW5zaXRpb25zO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RPbkRlbW9SZWxvYWRlZChzdGF0ZSkge1xuXHRjb25zdCBwYXR0ZXJuID0gc2VsZWN0UGF0dGVybihzdGF0ZSk7XG5cdHJldHVybiBwYXR0ZXJuLm9uRGVtb1JlbG9hZGVkIHx8IG5vb3A7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdFBhdHRlcm5FcnJvcnMoc3RhdGUpIHtcblx0cmV0dXJuIHNlbGVjdFBhdHRlcm4oc3RhdGUpLmVycm9ycyB8fCBbXTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0UGF0dGVybkVycm9yZWQoc3RhdGUpIHtcblx0Y29uc3QgcGF0dGVybiA9IHNlbGVjdFBhdHRlcm4oc3RhdGUpO1xuXHRyZXR1cm4gW1xuXHRcdHBhdHRlcm4uZGF0YUVycm9yZWQsXG5cdFx0cGF0dGVybi5kZW1vRXJyb3JlZCxcblx0XHRwYXR0ZXJuLnNvdXJjZUVycm9yZWRcblx0XS5zb21lKEJvb2xlYW4pO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RDb2RlKHN0YXRlKSB7XG5cdGNvbnN0IHBhdHRlcm4gPSBzZWxlY3RQYXR0ZXJuKHN0YXRlKTtcblx0Y29uc3Qgc291cmNlcyA9IHBhdHRlcm4uc291cmNlcyB8fCB7fTtcblx0Y29uc3QgZmlsZXMgPSBwYXR0ZXJuLmZpbGVzIHx8IFtdO1xuXHRjb25zdCBlcnJvcnMgPSBzZWxlY3RQYXR0ZXJuRXJyb3JzKHN0YXRlKTtcblxuXHRjb25zdCBmb3JtYXRzID0gdW5pcUJ5KGZpbGVzLnJlZHVjZSgocmVnaXN0cnksIGZpbGUpID0+IHtcblx0XHRyZXR1cm4gWy4uLnJlZ2lzdHJ5LCB7XG5cdFx0XHRpZDogW3BhdHRlcm4uaWQsIGZpbGUudHlwZV0uam9pbignLycpLFxuXHRcdFx0ZGlzcGxheU5hbWU6IGZpbGUuZGlzcGxheU5hbWUsXG5cdFx0XHRpbkV4dG5hbWU6IHBhdGguZXh0bmFtZShmaWxlLnBhdGgpLFxuXHRcdFx0b3V0RXh0bmFtZTogYC4ke2ZpbGUub3V0fWAsXG5cdFx0XHR0eXBlOiBmaWxlLnR5cGUsXG5cdFx0XHRpbjogZmlsZS5pbixcblx0XHRcdG91dDogZmlsZS5vdXRcblx0XHR9XTtcblx0fSwgW10pLCAnaWQnKTtcblxuXHRyZXR1cm4gZm9ybWF0cy5tYXAoZm9ybWF0ID0+IHtcblx0XHRjb25zdCBmb3JtYXRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+IGZpbGUudHlwZSA9PT0gZm9ybWF0LnR5cGUpO1xuXHRcdGNvbnN0IGNvbmNlcm5zID0gZm9ybWF0RmlsZXMubWFwKGZpbGUgPT4gZmlsZS5jb25jZXJuKTtcblxuXHRcdGNvbnN0IGhhc0RlbW8gPSBpbmNsdWRlcyhjb25jZXJucywgJ2RlbW8nKTtcblx0XHRjb25zdCBkZWZhdWx0Q29uY2VybiA9IGhhc0RlbW8gPyAnZGVtbycgOiAnaW5kZXgnO1xuXHRcdGNvbnN0IHBhcnNlZCA9IHVybFF1ZXJ5LnBhcnNlKHN0YXRlLnNvdXJjZUlkIHx8ICcnKTtcblxuXHRcdGNvbnN0IHBhc3NlZENvbmNlcm4gPSBwYXRoLmJhc2VuYW1lKHBhcnNlZC5wYXRobmFtZSwgcGF0aC5leHRuYW1lKHBhcnNlZC5wYXRobmFtZSkpIHx8XG5cdFx0XHRkZWZhdWx0Q29uY2VybjtcblxuXHRcdGNvbnN0IGlzQXBwbGljYWJsZSA9IGluY2x1ZGVzKGNvbmNlcm5zLCBwYXNzZWRDb25jZXJuKTtcblxuXHRcdGNvbnN0IGNvbmNlcm4gPSBpc0FwcGxpY2FibGUgP1xuXHRcdFx0cGFzc2VkQ29uY2VybiA6XG5cdFx0XHRkZWZhdWx0Q29uY2VybjtcblxuXHRcdGNvbnN0IHNvdXJjZVR5cGUgPSBmb3JtYXQudHlwZSA9PT0gJ2RvY3VtZW50YXRpb24nID8gJ3NvdXJjZScgOiBzdGF0ZS5zb3VyY2VUeXBlO1xuXHRcdGNvbnN0IGxhbmd1YWdlID0gc291cmNlVHlwZSA9PT0gJ3NvdXJjZScgPyBmb3JtYXQuaW4gOiBmb3JtYXQub3V0O1xuXHRcdGNvbnN0IGV4dG5hbWUgPSBmb3JtYXQuaW5FeHRuYW1lO1xuXHRcdGNvbnN0IHBhdGhuYW1lID0gW3BhdHRlcm4uaWQsIGAke2NvbmNlcm59JHtleHRuYW1lfWBdLmpvaW4oJy8nKTtcblx0XHRjb25zdCB0eXBlcyA9IGhhc0RlbW8gJiYgY29uY2VybiA9PT0gJ2luZGV4JyA/IFsnc291cmNlJ10gOiBbJ3NvdXJjZScsICd0cmFuc2Zvcm1lZCddO1xuXHRcdGNvbnN0IHR5cGUgPSBoYXNEZW1vICYmIGNvbmNlcm4gPT09ICdpbmRleCcgPyAnc291cmNlJyA6IHNvdXJjZVR5cGU7XG5cblx0XHRjb25zdCBpZCA9IHVybFF1ZXJ5LmZvcm1hdCh7XG5cdFx0XHRwYXRobmFtZSxcblx0XHRcdHF1ZXJ5OiB7XG5cdFx0XHRcdHR5cGUsXG5cdFx0XHRcdGVudmlyb25tZW50OiBzdGF0ZS5lbnZpcm9ubWVudFxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgc291cmNlID0gc291cmNlc1tpZF07XG5cdFx0Y29uc3QgYWN0aXZlID0gc3RhdGUuc291cmNlSWQgPT09IGlkO1xuXG5cdFx0Y29uc3QgZmlsZUVycm9ycyA9IGVycm9ycy5maWx0ZXIoZXJyb3IgPT4ge1xuXHRcdFx0cmV0dXJuIGVycm9yLnBheWxvYWQgP1xuXHRcdFx0XHRlcnJvci5wYXlsb2FkLmlkID09PSBpZCA6XG5cdFx0XHRcdGVycm9yLnBhdHRlcm5GaWxlID09PSBpZDtcblx0XHR9KTtcblxuXHRcdGNvbnN0IHVwZGF0ZSA9IGFjdGl2ZSAmJlxuXHRcdFx0IXNvdXJjZSAmJlxuXHRcdFx0IXBhdHRlcm4uc291cmNlTG9hZGluZyAmJlxuXHRcdFx0IWZpbGVFcnJvcnMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGFjdGl2ZSxcblx0XHRcdHVwZGF0ZSxcblx0XHRcdGV4dG5hbWUsXG5cdFx0XHRjb25jZXJuLFxuXHRcdFx0Y29uY2VybnMsXG5cdFx0XHRpZCxcblx0XHRcdHNob3J0aWQ6IHNob3J0aWQoaWQpLFxuXHRcdFx0bGFuZ3VhZ2UsXG5cdFx0XHRuYW1lOiBmb3JtYXQuZGlzcGxheU5hbWUsXG5cdFx0XHRzb3VyY2U6IHNvdXJjZSB8fCAnJyxcblx0XHRcdHR5cGUsXG5cdFx0XHR0eXBlc1xuXHRcdH07XG5cdH0pO1xufVxuIl19
;