UNPKG

react-planner-viewer

Version:

react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode

228 lines (177 loc) 23.7 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (state, action) { switch (action.type) { case _constants.SELECT_ITEM: return selectItem(state, action.layerID, action.itemID); case _constants.SELECT_TOOL_DRAWING_ITEM: return selectToolDrawingItem(state, action.sceneComponentType); case _constants.UPDATE_DRAWING_ITEM: return updateDrawingItem(state, action.layerID, action.x, action.y); case _constants.END_DRAWING_ITEM: return endDrawingItem(state, action.layerID, action.x, action.y); case _constants.BEGIN_DRAGGING_ITEM: return beginDraggingItem(state, action.layerID, action.itemID, action.x, action.y); case _constants.UPDATE_DRAGGING_ITEM: return updateDraggingItem(state, action.x, action.y); case _constants.END_DRAGGING_ITEM: return endDraggingItem(state, action.x, action.y); case _constants.BEGIN_ROTATING_ITEM: return beginRotatingItem(state, action.layerID, action.itemID, action.x, action.y); case _constants.UPDATE_ROTATING_ITEM: return updateRotatingItem(state, action.x, action.y); case _constants.END_ROTATING_ITEM: return endRotatingItem(state, action.x, action.y); default: return state; } }; var _immutable = require('immutable'); var _constants = require('../constants'); var _layerOperations = require('../utils/layer-operations'); var _geometry = require('../utils/geometry'); var Geometry = _interopRequireWildcard(_geometry); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function selectToolDrawingItem(state, sceneComponentType) { return state.merge({ mode: _constants.MODE_DRAWING_ITEM, drawingSupport: (0, _immutable.Map)({ type: sceneComponentType }) }); } /** holes operations **/ function updateDrawingItem(state, layerID, x, y) { var drawingSupport = state.drawingSupport, catalog = state.catalog; var scene = state.scene.updateIn(['layers', layerID], function (layer) { return layer.withMutations(function (layer) { if (drawingSupport.has('currentID')) { layer.updateIn(['items', drawingSupport.get('currentID')], function (item) { return item.merge({ x: x, y: y }); }); } else { var _addItem = (0, _layerOperations.addItem)(layer, drawingSupport.get('type'), x, y, 200, 100, 0, catalog), item = _addItem.item; (0, _layerOperations.select)(layer, 'items', item.id); drawingSupport = drawingSupport.set('currentID', item.id); } }); }); return state.merge({ scene: scene, drawingSupport: drawingSupport }); } function endDrawingItem(state, layerID, x, y) { var catalog = state.catalog; state = updateDrawingItem(state, layerID, x, y, catalog); var scene = state.scene.updateIn(['layers', layerID], function (layer) { return (0, _layerOperations.unselectAll)(layer); }); return state.merge({ scene: scene, sceneHistory: state.sceneHistory.push(scene), drawingSupport: (0, _immutable.Map)({ type: state.drawingSupport.get('type') }) }); } function beginDraggingItem(state, layerID, itemID, x, y) { var item = state.getIn(['scene', 'layers', layerID, 'items', itemID]); return state.merge({ mode: _constants.MODE_DRAGGING_ITEM, draggingSupport: (0, _immutable.Map)({ layerID: layerID, itemID: itemID, startPointX: x, startPointY: y, originalX: item.x, originalY: item.y }) }); } function updateDraggingItem(state, x, y) { var draggingSupport = state.draggingSupport, scene = state.scene; var layerID = draggingSupport.get('layerID'); var itemID = draggingSupport.get('itemID'); var startPointX = draggingSupport.get('startPointX'); var startPointY = draggingSupport.get('startPointY'); var originalX = draggingSupport.get('originalX'); var originalY = draggingSupport.get('originalY'); var diffX = startPointX - x; var diffY = startPointY - y; var item = scene.getIn(['layers', layerID, 'items', itemID]); item = item.merge({ x: originalX - diffX, y: originalY - diffY }); return state.merge({ scene: scene.mergeIn(['layers', layerID, 'items', itemID], item) }); } function endDraggingItem(state, x, y) { state = updateDraggingItem(state, x, y); return state.merge({ mode: _constants.MODE_IDLE, sceneHistory: state.sceneHistory.push(state.scene) }); } function beginRotatingItem(state, layerID, itemID, x, y) { var item = state.getIn(['scene', 'layers', layerID, 'items', itemID]); return state.merge({ mode: _constants.MODE_ROTATING_ITEM, rotatingSupport: (0, _immutable.Map)({ layerID: layerID, itemID: itemID }) }); } function updateRotatingItem(state, x, y) { var rotatingSupport = state.rotatingSupport, scene = state.scene; var layerID = rotatingSupport.get('layerID'); var itemID = rotatingSupport.get('itemID'); var item = state.getIn(['scene', 'layers', layerID, 'items', itemID]); var deltaX = x - item.x; var deltaY = y - item.y; var rotation = Math.atan2(deltaY, deltaX) * 180 / Math.PI - 90; if (-5 < rotation && rotation < 5) rotation = 0; if (-95 < rotation && rotation < -85) rotation = -90; if (-185 < rotation && rotation < -175) rotation = -180; if (85 < rotation && rotation < 90) rotation = 90; if (-270 < rotation && rotation < -265) rotation = 90; item = item.merge({ rotation: rotation }); return state.merge({ scene: scene.mergeIn(['layers', layerID, 'items', itemID], item) }); } function endRotatingItem(state, x, y) { state = updateRotatingItem(state, x, y); return state.merge({ mode: _constants.MODE_IDLE, sceneHistory: state.sceneHistory.push(state.scene) }); } function selectItem(state, layerID, itemID) { var scene = state.scene; scene = scene.merge({ layers: scene.layers.map(_layerOperations.unselectAll), selectedLayer: layerID }); scene = scene.updateIn(['layers', layerID], function (layer) { return layer.withMutations(function (layer) { (0, _layerOperations.select)(layer, 'items', itemID); }); }); return state.merge({ scene: scene, sceneHistory: state.sceneHistory.push(scene) }); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWR1Y2Vycy9pdGVtcy1yZWR1Y2VyLmpzIl0sIm5hbWVzIjpbInN0YXRlIiwiYWN0aW9uIiwidHlwZSIsInNlbGVjdEl0ZW0iLCJsYXllcklEIiwiaXRlbUlEIiwic2VsZWN0VG9vbERyYXdpbmdJdGVtIiwic2NlbmVDb21wb25lbnRUeXBlIiwidXBkYXRlRHJhd2luZ0l0ZW0iLCJ4IiwieSIsImVuZERyYXdpbmdJdGVtIiwiYmVnaW5EcmFnZ2luZ0l0ZW0iLCJ1cGRhdGVEcmFnZ2luZ0l0ZW0iLCJlbmREcmFnZ2luZ0l0ZW0iLCJiZWdpblJvdGF0aW5nSXRlbSIsInVwZGF0ZVJvdGF0aW5nSXRlbSIsImVuZFJvdGF0aW5nSXRlbSIsIkdlb21ldHJ5IiwibWVyZ2UiLCJtb2RlIiwiZHJhd2luZ1N1cHBvcnQiLCJjYXRhbG9nIiwic2NlbmUiLCJ1cGRhdGVJbiIsImxheWVyIiwid2l0aE11dGF0aW9ucyIsImhhcyIsImdldCIsIml0ZW0iLCJpZCIsInNldCIsInNjZW5lSGlzdG9yeSIsInB1c2giLCJnZXRJbiIsImRyYWdnaW5nU3VwcG9ydCIsInN0YXJ0UG9pbnRYIiwic3RhcnRQb2ludFkiLCJvcmlnaW5hbFgiLCJvcmlnaW5hbFkiLCJkaWZmWCIsImRpZmZZIiwibWVyZ2VJbiIsInJvdGF0aW5nU3VwcG9ydCIsImRlbHRhWCIsImRlbHRhWSIsInJvdGF0aW9uIiwiTWF0aCIsImF0YW4yIiwiUEkiLCJsYXllcnMiLCJtYXAiLCJzZWxlY3RlZExheWVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7a0JBdUJlLFVBQVVBLEtBQVYsRUFBaUJDLE1BQWpCLEVBQXlCO0FBQ3RDLFVBQVFBLE9BQU9DLElBQWY7QUFDRTtBQUNFLGFBQU9DLFdBQVdILEtBQVgsRUFBa0JDLE9BQU9HLE9BQXpCLEVBQWtDSCxPQUFPSSxNQUF6QyxDQUFQOztBQUVGO0FBQ0UsYUFBT0Msc0JBQXNCTixLQUF0QixFQUE2QkMsT0FBT00sa0JBQXBDLENBQVA7O0FBRUY7QUFD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aEMsTUFBTWdDLFlBQU4sQ0FBbUJDLElBQW5CLENBQXdCakMsTUFBTXVCLEtBQTlCO0FBRkcsR0FBWixDQUFQO0FBSUQ7O0FBRUQsU0FBU3BCLFVBQVQsQ0FBb0JILEtBQXBCLEVBQTJCSSxPQUEzQixFQUFvQ0MsTUFBcEMsRUFBNEM7QUFDMUMsTUFBSWtCLFFBQVF2QixNQUFNdUIsS0FBbEI7O0FBRUFBLFVBQVFBLE1BQU1KLEtBQU4sQ0FBWTtBQUNsQitCLFlBQVEzQixNQUFNMkIsTUFBTixDQUFhQyxHQUFiLDhCQURVO0FBRWxCQyxtQkFBZWhEO0FBRkcsR0FBWixDQUFSOztBQUtBbUIsVUFBUUEsTUFBTUMsUUFBTixDQUFlLENBQUMsUUFBRCxFQUFXcEIsT0FBWCxDQUFmLEVBQW9DO0FBQUEsV0FBU3FCLE1BQU1DLGFBQU4sQ0FBb0IsaUJBQVM7QUFDOUUsbUNBQU9ELEtBQVAsRUFBYyxPQUFkLEVBQXVCcEIsTUFBdkI7QUFDRCxLQUZrRCxDQUFUO0FBQUEsR0FBcEMsQ0FBUjs7QUFLQSxTQUFPTCxNQUFNbUIsS0FBTixDQUFZO0FBQ2pCSSxnQkFEaUI7QUFFakJTLGtCQUFjaEMsTUFBTWdDLFlBQU4sQ0FBbUJDLElBQW5CLENBQXdCVixLQUF4QjtBQUZHLEdBQVosQ0FBUDtBQUlEIiwiZmlsZSI6Iml0ZW1zLXJlZHVjZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xpc3QsIE1hcH0gZnJvbSAnaW1tdXRhYmxlJztcblxuaW1wb3J0IHtcbiAgU0VMRUNUX1RPT0xfRFJBV0lOR19JVEVNLFxuICBVUERBVEVfRFJBV0lOR19JVEVNLFxuICBFTkRfRFJBV0lOR19JVEVNLFxuICBCRUdJTl9EUkFHR0lOR19JVEVNLFxuICBVUERBVEVfRFJBR0dJTkdfSVRFTSxcbiAgRU5EX0RSQUdHSU5HX0lURU0sXG4gIEJFR0lOX1JPVEFUSU5HX0lURU0sXG4gIFVQREFURV9ST1RBVElOR19JVEVNLFxuICBFTkRfUk9UQVRJTkdfSVRFTSxcbiAgU0VMRUNUX0lURU0sXG5cbiAgTU9ERV9JRExFLFxuICBNT0RFX0RSQVdJTkdfSVRFTSxcbiAgTU9ERV9EUkFHR0lOR19JVEVNLFxuICBNT0RFX1JPVEFUSU5HX0lURU1cbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuaW1wb3J0IHthZGRJdGVtLCByZW1vdmVJdGVtLCB1bnNlbGVjdCwgc2VsZWN0LCB1bnNlbGVjdEFsbH0gZnJvbSAnLi4vdXRpbHMvbGF5ZXItb3BlcmF0aW9ucyc7XG5pbXBvcnQgKiBhcyBHZW9tZXRyeSBmcm9tICcuLi91dGlscy9nZW9tZXRyeSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIFNFTEVDVF9JVEVNOlxuICAgICAgcmV0dXJuIHNlbGVjdEl0ZW0oc3RhdGUsIGFjdGlvbi5sYXllcklELCBhY3Rpb24uaXRlbUlEKTtcblxuICAgIGNhc2UgU0VMRUNUX1RPT0xfRFJBV0lOR19JVEVNOlxuICAgICAgcmV0dXJuIHNlbGVjdFRvb2xEcmF3aW5nSXRlbShzdGF0ZSwgYWN0aW9uLnNjZW5lQ29tcG9uZW50VHlwZSk7XG5cbiAgICBjYXNlIFVQREFURV9EUkFXSU5HX0lURU06XG4gICAgICByZXR1cm4gdXBkYXRlRHJhd2luZ0l0ZW0oc3RhdGUsIGFjdGlvbi5sYXllcklELCBhY3Rpb24ueCwgYWN0aW9uLnkpO1xuXG4gICAgY2FzZSBFTkRfRFJBV0lOR19JVEVNOlxuICAgICAgcmV0dXJuIGVuZERyYXdpbmdJdGVtKHN0YXRlLCBhY3Rpb24ubGF5ZXJJRCwgYWN0aW9uLngsIGFjdGlvbi55KTtcblxuICAgIGNhc2UgQkVHSU5fRFJBR0dJTkdfSVRFTTpcbiAgICAgIHJldHVybiBiZWdpbkRyYWdnaW5nSXRlbShzdGF0ZSwgYWN0aW9uLmxheWVySUQsIGFjdGlvbi5pdGVtSUQsIGFjdGlvbi54LCBhY3Rpb24ueSk7XG5cbiAgICBjYXNlIFVQREFURV9EUkFHR0lOR19JVEVNOlxuICAgICAgcmV0dXJuIHVwZGF0ZURyYWdnaW5nSXRlbShzdGF0ZSwgYWN0aW9uLngsIGFjdGlvbi55KTtcblxuICAgIGNhc2UgRU5EX0RSQUdHSU5HX0lURU06XG4gICAgICByZXR1cm4gZW5kRHJhZ2dpbmdJdGVtKHN0YXRlLCBhY3Rpb24ueCwgYWN0aW9uLnkpO1xuXG4gICAgY2FzZSBCRUdJTl9ST1RBVElOR19JVEVNOlxuICAgICAgcmV0dXJuIGJlZ2luUm90YXRpbmdJdGVtKHN0YXRlLCBhY3Rpb24ubGF5ZXJJRCwgYWN0aW9uLml0ZW1JRCwgYWN0aW9uLngsIGFjdGlvbi55KTtcblxuICAgIGNhc2UgVVBEQVRFX1JPVEFUSU5HX0lURU06XG4gICAgICByZXR1cm4gdXBkYXRlUm90YXRpbmdJdGVtKHN0YXRlLCBhY3Rpb24ueCwgYWN0aW9uLnkpO1xuXG4gICAgY2FzZSBFTkRfUk9UQVRJTkdfSVRFTTpcbiAgICAgIHJldHVybiBlbmRSb3RhdGluZ0l0ZW0oc3RhdGUsIGFjdGlvbi54LCBhY3Rpb24ueSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlbGVjdFRvb2xEcmF3aW5nSXRlbShzdGF0ZSwgc2NlbmVDb21wb25lbnRUeXBlKSB7XG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgbW9kZTogTU9ERV9EUkFXSU5HX0lURU0sXG4gICAgZHJhd2luZ1N1cHBvcnQ6IE1hcCh7XG4gICAgICB0eXBlOiBzY2VuZUNvbXBvbmVudFR5cGVcbiAgICB9KVxuICB9KTtcbn1cblxuLyoqIGhvbGVzIG9wZXJhdGlvbnMgKiovXG5mdW5jdGlvbiB1cGRhdGVEcmF3aW5nSXRlbShzdGF0ZSwgbGF5ZXJJRCwgeCwgeSkge1xuICBsZXQge2RyYXdpbmdTdXBwb3J0LCBjYXRhbG9nfSA9IHN0YXRlO1xuXG4gIGxldCBzY2VuZSA9IHN0YXRlLnNjZW5lLnVwZGF0ZUluKFsnbGF5ZXJzJywgbGF5ZXJJRF0sIGxheWVyID0+IGxheWVyLndpdGhNdXRhdGlvbnMobGF5ZXIgPT4ge1xuXG4gICAgaWYgKGRyYXdpbmdTdXBwb3J0LmhhcygnY3VycmVudElEJykpIHtcbiAgICAgIGxheWVyLnVwZGF0ZUluKFsnaXRlbXMnLCBkcmF3aW5nU3VwcG9ydC5nZXQoJ2N1cnJlbnRJRCcpXSwgaXRlbSA9PiBpdGVtLm1lcmdlKHt4LCB5fSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQge2l0ZW19ID0gYWRkSXRlbShsYXllciwgZHJhd2luZ1N1cHBvcnQuZ2V0KCd0eXBlJyksIHgsIHksIDIwMCwgMTAwLCAwLCBjYXRhbG9nKTtcbiAgICAgIHNlbGVjdChsYXllciwgJ2l0ZW1zJywgaXRlbS5pZCk7XG4gICAgICBkcmF3aW5nU3VwcG9ydCA9IGRyYXdpbmdTdXBwb3J0LnNldCgnY3VycmVudElEJywgaXRlbS5pZCk7XG4gICAgfVxuICB9KSk7XG5cbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBzY2VuZSxcbiAgICBkcmF3aW5nU3VwcG9ydFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZW5kRHJhd2luZ0l0ZW0oc3RhdGUsIGxheWVySUQsIHgsIHkpIHtcbiAgbGV0IGNhdGFsb2cgPSBzdGF0ZS5jYXRhbG9nO1xuICBzdGF0ZSA9IHVwZGF0ZURyYXdpbmdJdGVtKHN0YXRlLCBsYXllcklELCB4LCB5LCBjYXRhbG9nKTtcbiAgbGV0IHNjZW5lID0gc3RhdGUuc2NlbmUudXBkYXRlSW4oWydsYXllcnMnLCBsYXllcklEXSwgbGF5ZXIgPT4gdW5zZWxlY3RBbGwobGF5ZXIpKTtcbiAgcmV0dXJuIHN0YXRlLm1lcmdlKHtcbiAgICBzY2VuZSxcbiAgICBzY2VuZUhpc3Rvcnk6IHN0YXRlLnNjZW5lSGlzdG9yeS5wdXNoKHNjZW5lKSxcbiAgICBkcmF3aW5nU3VwcG9ydDogTWFwKHtcbiAgICAgIHR5cGU6IHN0YXRlLmRyYXdpbmdTdXBwb3J0LmdldCgndHlwZScpXG4gICAgfSlcbiAgfSk7XG5cbn1cblxuZnVuY3Rpb24gYmVnaW5EcmFnZ2luZ0l0ZW0oc3RhdGUsIGxheWVySUQsIGl0ZW1JRCwgeCwgeSkge1xuXG4gIGxldCBpdGVtID0gc3RhdGUuZ2V0SW4oWydzY2VuZScsICdsYXllcnMnLCBsYXllcklELCAnaXRlbXMnLCBpdGVtSURdKTtcblxuICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgIG1vZGU6IE1PREVfRFJBR0dJTkdfSVRFTSxcbiAgICBkcmFnZ2luZ1N1cHBvcnQ6IE1hcCh7XG4gICAgICBsYXllcklELFxuICAgICAgaXRlbUlELFxuICAgICAgc3RhcnRQb2ludFg6IHgsXG4gICAgICBzdGFydFBvaW50WTogeSxcbiAgICAgIG9yaWdpbmFsWDogaXRlbS54LFxuICAgICAgb3JpZ2luYWxZOiBpdGVtLnlcbiAgICB9KVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRHJhZ2dpbmdJdGVtKHN0YXRlLCB4LCB5KSB7XG4gIGxldCB7ZHJhZ2dpbmdTdXBwb3J0LCBzY2VuZX0gPSBzdGF0ZTtcblxuICBsZXQgbGF5ZXJJRCA9IGRyYWdnaW5nU3VwcG9ydC5nZXQoJ2xheWVySUQnKTtcbiAgbGV0IGl0ZW1JRCA9IGRyYWdnaW5nU3VwcG9ydC5nZXQoJ2l0ZW1JRCcpO1xuICBsZXQgc3RhcnRQb2ludFggPSBkcmFnZ2luZ1N1cHBvcnQuZ2V0KCdzdGFydFBvaW50WCcpO1xuICBsZXQgc3RhcnRQb2ludFkgPSBkcmFnZ2luZ1N1cHBvcnQuZ2V0KCdzdGFydFBvaW50WScpO1xuICBsZXQgb3JpZ2luYWxYID0gZHJhZ2dpbmdTdXBwb3J0LmdldCgnb3JpZ2luYWxYJyk7XG4gIGxldCBvcmlnaW5hbFkgPSBkcmFnZ2luZ1N1cHBvcnQuZ2V0KCdvcmlnaW5hbFknKTtcblxuICBsZXQgZGlmZlggPSBzdGFydFBvaW50WCAtIHg7XG4gIGxldCBkaWZmWSA9IHN0YXJ0UG9pbnRZIC0geTtcblxuICBsZXQgaXRlbSA9IHNjZW5lLmdldEluKFsnbGF5ZXJzJywgbGF5ZXJJRCwgJ2l0ZW1zJywgaXRlbUlEXSk7XG4gIGl0ZW0gPSBpdGVtLm1lcmdlKHtcbiAgICB4OiBvcmlnaW5hbFggLSBkaWZmWCxcbiAgICB5OiBvcmlnaW5hbFkgLSBkaWZmWVxuICB9KTtcblxuICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgIHNjZW5lOiBzY2VuZS5tZXJnZUluKFsnbGF5ZXJzJywgbGF5ZXJJRCwgJ2l0ZW1zJywgaXRlbUlEXSwgaXRlbSlcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVuZERyYWdnaW5nSXRlbShzdGF0ZSwgeCwgeSkge1xuICBzdGF0ZSA9IHVwZGF0ZURyYWdnaW5nSXRlbShzdGF0ZSwgeCwgeSk7XG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgbW9kZTogTU9ERV9JRExFLFxuICAgIHNjZW5lSGlzdG9yeTogc3RhdGUuc2NlbmVIaXN0b3J5LnB1c2goc3RhdGUuc2NlbmUpXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBiZWdpblJvdGF0aW5nSXRlbShzdGF0ZSwgbGF5ZXJJRCwgaXRlbUlELCB4LCB5KSB7XG5cbiAgbGV0IGl0ZW0gPSBzdGF0ZS5nZXRJbihbJ3NjZW5lJywgJ2xheWVycycsIGxheWVySUQsICdpdGVtcycsIGl0ZW1JRF0pO1xuXG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgbW9kZTogTU9ERV9ST1RBVElOR19JVEVNLFxuICAgIHJvdGF0aW5nU3VwcG9ydDogTWFwKHtcbiAgICAgIGxheWVySUQsXG4gICAgICBpdGVtSURcbiAgICB9KVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUm90YXRpbmdJdGVtKHN0YXRlLCB4LCB5KSB7XG4gIGxldCB7cm90YXRpbmdTdXBwb3J0LCBzY2VuZX0gPSBzdGF0ZTtcblxuICBsZXQgbGF5ZXJJRCA9IHJvdGF0aW5nU3VwcG9ydC5nZXQoJ2xheWVySUQnKTtcbiAgbGV0IGl0ZW1JRCA9IHJvdGF0aW5nU3VwcG9ydC5nZXQoJ2l0ZW1JRCcpO1xuICBsZXQgaXRlbSA9IHN0YXRlLmdldEluKFsnc2NlbmUnLCAnbGF5ZXJzJywgbGF5ZXJJRCwgJ2l0ZW1zJywgaXRlbUlEXSk7XG5cbiAgbGV0IGRlbHRhWCA9IHggLSBpdGVtLng7XG4gIGxldCBkZWx0YVkgPSB5IC0gaXRlbS55O1xuICBsZXQgcm90YXRpb24gPSBNYXRoLmF0YW4yKGRlbHRhWSwgZGVsdGFYKSAqIDE4MCAvIE1hdGguUEkgLSA5MDtcblxuICBpZiAoLTUgPCByb3RhdGlvbiAmJiByb3RhdGlvbiA8IDUpIHJvdGF0aW9uID0gMDtcbiAgaWYgKC05NSA8IHJvdGF0aW9uICYmIHJvdGF0aW9uIDwgLTg1KSByb3RhdGlvbiA9IC05MDtcbiAgaWYgKC0xODUgPCByb3RhdGlvbiAmJiByb3RhdGlvbiA8IC0xNzUpIHJvdGF0aW9uID0gLTE4MDtcbiAgaWYgKDg1IDwgcm90YXRpb24gJiYgcm90YXRpb24gPCA5MCkgcm90YXRpb24gPSA5MDtcbiAgaWYgKC0yNzAgPCByb3RhdGlvbiAmJiByb3RhdGlvbiA8IC0yNjUpIHJvdGF0aW9uID0gOTA7XG5cbiAgaXRlbSA9IGl0ZW0ubWVyZ2Uoe1xuICAgIHJvdGF0aW9uLFxuICB9KTtcblxuICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgIHNjZW5lOiBzY2VuZS5tZXJnZUluKFsnbGF5ZXJzJywgbGF5ZXJJRCwgJ2l0ZW1zJywgaXRlbUlEXSwgaXRlbSlcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVuZFJvdGF0aW5nSXRlbShzdGF0ZSwgeCwgeSkge1xuICBzdGF0ZSA9IHVwZGF0ZVJvdGF0aW5nSXRlbShzdGF0ZSwgeCwgeSk7XG4gIHJldHVybiBzdGF0ZS5tZXJnZSh7XG4gICAgbW9kZTogTU9ERV9JRExFLFxuICAgIHNjZW5lSGlzdG9yeTogc3RhdGUuc2NlbmVIaXN0b3J5LnB1c2goc3RhdGUuc2NlbmUpXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RJdGVtKHN0YXRlLCBsYXllcklELCBpdGVtSUQpIHtcbiAgbGV0IHNjZW5lID0gc3RhdGUuc2NlbmU7XG5cbiAgc2NlbmUgPSBzY2VuZS5tZXJnZSh7XG4gICAgbGF5ZXJzOiBzY2VuZS5sYXllcnMubWFwKHVuc2VsZWN0QWxsKSxcbiAgICBzZWxlY3RlZExheWVyOiBsYXllcklEXG4gIH0pO1xuXG4gIHNjZW5lID0gc2NlbmUudXBkYXRlSW4oWydsYXllcnMnLCBsYXllcklEXSwgbGF5ZXIgPT4gbGF5ZXIud2l0aE11dGF0aW9ucyhsYXllciA9PiB7XG4gICAgICBzZWxlY3QobGF5ZXIsICdpdGVtcycsIGl0ZW1JRCk7XG4gICAgfSlcbiAgKTtcblxuICByZXR1cm4gc3RhdGUubWVyZ2Uoe1xuICAgIHNjZW5lLFxuICAgIHNjZW5lSGlzdG9yeTogc3RhdGUuc2NlbmVIaXN0b3J5LnB1c2goc2NlbmUpXG4gIH0pXG59XG4iXX0=