{"version":3,"sources":["features/shared/threejs/postprocessing/Pass.js","features/shared/threejs/Shaders/CopyShader.js","common/images/hebi-logo.svg","features/getting-started/cards/FromScratchCard/empty-workspace.png","features/shared/threejs/TransformControls.js","features/shared/threejs/Shaders/SMAAShader.js","models/Asset.js","models/Attachment.js","models/BoltPattern.js","app/config/env-config.js","models/Part.js","models/PartLength.js","models/PartCategory.js","models/Robot.js","models/RobotPart.js","app/orm.js","features/entities/selectors/getEntities.js","features/entities/selectors/getEntitiesSession.js","features/entities/selectors/getPartLengths.js","features/configurator/selectors/getConfigurator.js","features/configurator/selectors/getAssets.js","features/configurator/selectors/getBuilder.js","features/configurator/selectors/getBootstrapper.js","features/configurator/selectors/getConfiguratorIsInitialized.js","features/configurator/selectors/getCurrentRobotId.js","features/configurator/selectors/getCurrentRobot.js","features/configurator/selectors/getCurrentRobotPartId.js","features/configurator/selectors/getCurrentRobotPart.js","features/configurator/selectors/getCurrentRobotPartAsset.js","features/configurator/selectors/getCurrentRobotPartParent.js","features/configurator/selectors/getCurrentRobotPartAssetUrl.js","features/configurator/selectors/getCurrentRobotPartParentOffsets.js","features/configurator/selectors/getCurrentRobotPartWorkspaceArguments.js","features/shared/router/selectors/getCurrentPathname.js","features/configurator/selectors/getInBuildMode.js","features/configurator/selectors/getPlacementMode.js","features/configurator/selectors/getTestDriveTabShouldBeEnabled.js","features/configurator/selectors/getRequestQuoteTabShouldBeEnabled.js","features/configurator/selectors/getPotentialParents.js","features/configurator/selectors/getWorkspace.js","features/configurator/selectors/getRobotStatistics.js","features/configurator/selectors/getRobotPartIdsInScene.js","features/configurator/selectors/getSceneLoaded.js","features/configurator/selectors/getSelectedRobotPartId.js","features/configurator/selectors/getSelectedRobotPart.js","features/configurator/selectors/getSelectedRobotPartConstraints.js","features/configurator/selectors/getSelectedRobotPartChildren.js","features/configurator/selectors/getShouldWarnBeforeRobotPartRemoval.js","features/configurator/selectors/getWorkspaceIsVisible.js","features/configurator/actions/addPartToWorkspaceRequest.js","features/configurator/actions/addPartToWorkspaceSuccess.js","features/configurator/actions/clearSelectedRobotPart.js","features/configurator/actions/createRobotWithPartRequest.js","features/configurator/actions/createRobotWithPartSuccess.js","features/configurator/actions/createRobotPartSuccess.js","features/configurator/actions/createRobotRequest.js","features/configurator/actions/createRobotSuccess.js","features/configurator/actions/initializeConfiguratorRequest.js","features/configurator/actions/initializeConfiguratorSuccess.js","features/configurator/actions/loadEntitiesRequest.js","features/configurator/actions/loadEntitiesSuccess.js","features/configurator/actions/loadRobotRequest.js","features/configurator/actions/loadRobotSuccess.js","features/configurator/actions/placeRobotPartSuccess.js","features/configurator/actions/setCurrentRobot.js","features/configurator/actions/setCurrentRobotPart.js","features/configurator/actions/setPlacementMode.js","features/configurator/actions/setSceneLoaded.js","features/configurator/actions/setSelectedRobotPart.js","features/configurator/actions/uploadHRDFRequest.js","features/configurator/actions/uploadHRDFSuccess.js","features/configurator/actions/removeRobotPartRequest.js","features/configurator/actions/removeRobotPartSuccess.js","features/configurator/actions/removeRobotPartCancel.js","features/configurator/actions/removeRobotPartConfirmRequest.js","features/configurator/actions/removeRobotPartConfirmSuccess.js","features/configurator/actions/replaceRobotPartRequest.js","features/configurator/actions/replaceRobotPartSuccess.js","features/configurator/actions/resetCamera.js","features/configurator/actions/togglePlacementMode.js","features/configurator/actions/updateRobotStatistics.js","features/configurator/actions/updateSelectedRobotPartConstraintRequest.js","features/configurator/actions/updateSelectedRobotPartConstraintSuccess.js","features/configurator/actions/activateTestDrive.js","features/configurator/actions/deactivateTestDrive.js","features/configurator/actions/exportRobotRequest.js","features/configurator/actions/submitFeedbackRequest.js","features/configurator/components/RemovePartConfirmationModal.js","features/modals/actions/closeModal.js","features/modals/actions/openModal.js","common/api.js","common/utils/saga-utils.js","features/configurator/components/FeedbackModal.js","features/modals/ModalManager.js","features/modals/selectors/getModals.js","features/catalog/actions/selectPart.js","features/catalog/actions/setDrawerVisible.js","features/catalog/actions/setSelectedCategory.js","features/catalog/actions/toggleDrawerVisible.js","features/catalog/actions/updateAvailablePartsRequest.js","features/catalog/actions/updateAvailablePartsSuccess.js","features/configurator/components/dialogs/LinkDialogContent.js","features/configurator/components/dialogs/strategies.js","common/utils/length-utils.js","features/configurator/components/dialogs/ConfiguratorDialog.js","common/utils/formatters.js","features/poppers/selectors/getPopper.js","features/poppers/selectors/getPopperLocation.js","features/poppers/selectors/getPopperProps.js","features/configurator/components/TestDriveGrabberLabel.js","common/fonts/index.js","common/themes/variables.js","common/themes/material-dark-theme.js","features/poppers/actions/hidePopper.js","features/poppers/actions/showPopper.js","features/poppers/actions/updatePopperRequest.js","features/poppers/actions/updatePopperSuccess.js","features/poppers/Popper.js","features/poppers/PopperManager.js","features/shared/AppNav/RobotBuilderButtonBarDesktop.js","features/shared/AppNav/RobotBuilderButtonBarMobile.js","features/shared/AppNav/RobotBuilderButtonBar.js","features/shared/HebiLogo/HebiLogo.js","features/loading/selectors/createLoadingSelector.js","features/loading/selectors/getApplicationIsLoading.js","features/loading/components/ProgressBar/ProgressBar.js","features/shared/AppNav/AppNav.js","features/shared/AppFooter/AppFooter.js","features/getting-started/components/GettingStartedCardContent.js","features/getting-started/components/GettingStartedCardIconMedia.js","features/getting-started/components/GettingStartedCard.js","features/getting-started/selectors/getIsCreatingRobot.js","features/getting-started/cards/LoadHRDFCard/LoadHRDFCard.js","features/getting-started/components/GettingStartedCardMedia.js","features/getting-started/components/GettingStartedCardActions.js","features/getting-started/cards/FromScratchCard/FromScratchCard.js","features/getting-started/cards/index.js","features/getting-started/components/GettingStartedCardList.js","features/getting-started/pages/GettingStartedPage.js","features/shared/WorkspaceInstructions/WorkspaceInstructions.js","features/catalog/selectors/getCatalog.js","features/catalog/selectors/getSelectedCategoryId.js","features/catalog/selectors/getPartsInSelectedCategory.js","features/catalog/selectors/getPartIdsAvailableForCatalogSelection.js","features/catalog/selectors/getCatalogParts.js","features/catalog/selectors/getDrawerIsVisible.js","features/catalog/selectors/getSelectedCategory.js","features/catalog/selectors/getSelectedPartId.js","features/catalog/selectors/getSelectedPart.js","features/catalog/components/CategorySelect.js","features/catalog/components/ComponentsList.js","features/catalog/components/ComponentCatalogDrawer.js","features/configurator/components/ExportRobotButton.js","features/shared/Components/ToggleButton.js","features/configurator/components/WorkspaceToolbar.js","features/configurator/pages/BuildRobotPage.js","features/configurator/components/TestDriveSpecifications/ExpansionPanel.js","features/configurator/components/TestDriveSpecifications/ExpansionPanelSummary.js","features/configurator/components/TestDriveSpecifications/TestDriveSpecifications.js","features/configurator/pages/TestDrivePage.js","common/utils/country-names.js","features/shared/FormikPersist/FormikPersist.js","features/shared/Autocomplete/ClearIndicator.js","features/shared/Autocomplete/Control.js","features/shared/Autocomplete/DropdownIndicator.js","features/shared/Autocomplete/IndicatorsContainer.js","features/shared/Autocomplete/MenuList.js","features/shared/Autocomplete/MultiValue.js","features/shared/Autocomplete/NoOptionsMessage.js","features/shared/Autocomplete/Option.js","features/shared/Autocomplete/Placeholder.js","features/shared/Autocomplete/SingleValue.js","features/shared/Autocomplete/ValueContainer.js","features/shared/Autocomplete/Autocomplete.js","features/request-quote/components/RequestQuoteForm.js","features/request-quote/actions/submitQuoteRequest.js","features/request-quote/containers/RequestQuoteFormContainer.js","features/request-quote/pages/RequestQuotePage.js","features/configurator/components/ConfiguratorTabBar.js","features/configurator/components/ConfiguratorTabbedRoutes.js","features/configurator/pages/ConfiguratorLoader.js","features/shared/NotFoundPage.js","features/shared/layouts/DefaultLayout/DefaultLayout.js","app/App.js","common/utils/reducer-utils.js","app/reducers/entities-reducer.js","features/configurator/reducers/bootstrapper.js","features/configurator/reducers/builder.js","features/configurator/reducers/workspace.js","features/configurator/reducers/index.js","features/catalog/reducer.js","features/modals/reducer.js","features/poppers/reducer.js","features/loading/reducers/loading.js","features/loading/reducers/index.js","features/entities/reducers/part.js","features/entities/reducers/robot.js","features/entities/reducers/index.js","app/config/persist-config.js","app/store.js","app/reducers/root-reducer.js","features/catalog/sagas/updateAvailablePartsWatcher.js","features/catalog/sagas/catalogSaga.js","common/utils/three/part-group-strategies/index.js","common/utils/three/part-group-strategies/link.js","common/utils/three/part-group-strategies/default.js","common/utils/three/PartGroupFactory.js","common/utils/three/GLTFLoader.js","common/utils/three/three-utils.js","common/utils/three/constants.js","common/utils/three/AssetCacheManager.js","common/utils/three/WindowManager.js","common/utils/three/TranslationMode.js","common/themes/workspace.js","features/shared/threejs/postprocessing/ShaderPass.js","features/shared/threejs/postprocessing/EffectComposer.js","features/shared/threejs/postprocessing/RenderPass.js","features/shared/threejs/postprocessing/OutlinePass.js","features/shared/threejs/postprocessing/SMAAPass.js","features/shared/InverseKinematics/kinematics.js","features/shared/InverseKinematics/hebimath.js","common/utils/three/InverseKinematicsManager.js","common/utils/three/SceneManager.js","common/utils/three/PostProcessingComposer.js","common/utils/three/ThreeProcessor.js","features/configurator/sagas/configureCanvasWatcher.js","features/configurator/sagas/resetCameraWatcher.js","features/configurator/sagas/addPartToWorkspaceSaga.js","features/configurator/sagas/loadEntitiesSaga.js","features/configurator/sagas/initializeConfiguratorSaga.js","features/configurator/sagas/loadRobotWatcher.js","features/configurator/sagas/exportRobotWatcher.js","features/configurator/sagas/createRobotWatcher.js","features/configurator/sagas/removeRobotPartWatcher.js","features/configurator/sagas/selectRobotPartWatcher.js","features/configurator/sagas/activateTestDriveWatcher.js","features/configurator/sagas/deactivateTestDriveWatcher.js","features/configurator/sagas/configurePartWatcher.js","features/configurator/sagas/createPart/createChildPartSaga.js","features/configurator/sagas/createPart/createRootPartSaga.js","features/configurator/sagas/createPart/ensurePotentialParentSelectedBeforeCreationSaga.js","features/configurator/sagas/createPart/placePartSaga.js","features/configurator/sagas/createPart/replacePartSaga.js","features/configurator/sagas/createPart/strategies.js","features/configurator/sagas/addPartToWorkspaceWatcher.js","features/configurator/sagas/configuratorSaga.js","features/poppers/sagas/updatePopperSaga.js","features/poppers/sagas/popperSaga.js","features/request-quote/sagas/submitQuoteWatcher.js","features/request-quote/sagas/index.js","app/saga.js","common/themes/material-theme.js","serviceWorker.js","index.js"],"names":["THREE","require","Pass","this","enabled","needsSwap","clear","renderToScreen","prototype","Object","assign","setSize","width","height","render","renderer","writeBuffer","readBuffer","delta","maskActive","console","error","module","exports","CopyShader","uniforms","tDiffuse","value","opacity","vertexShader","join","fragmentShader","__webpack_require__","p","TransformControls","camera","domElement","Object3D","call","undefined","document","visible","_gizmo","TransformControlsGizmo","add","_plane","TransformControlsPlane","scope","defineProperty","changeEvent","type","mouseDownEvent","mouseUpEvent","mode","objectChangeEvent","ray","Raycaster","_tempVector","Vector3","_tempQuaternion","Quaternion","_unit","X","Y","Z","pointStart","pointEnd","offset","rotationAxis","startNorm","endNorm","rotationAngle","cameraPosition","cameraQuaternion","cameraScale","parentPosition","parentQuaternion","parentQuaternionInv","parentScale","worldPositionStart","worldQuaternionStart","worldScaleStart","worldPosition","worldQuaternion","worldQuaternionInv","worldScale","eye","positionStart","quaternionStart","scaleStart","propName","defaultValue","propValue","get","set","dispatchEvent","getPointer","event","pointer","changedTouches","rect","getBoundingClientRect","x","clientX","left","y","clientY","top","button","onPointerHover","pointerHover","onPointerDown","addEventListener","onPointerMove","pointerDown","pointerMove","onPointerUp","removeEventListener","pointerUp","dispose","attach","object","detach","axis","updateMatrixWorld","parent","matrixWorld","decompose","copy","inverse","PerspectiveCamera","sub","normalize","OrthographicCamera","dragging","setFromCamera","intersect","intersectObjects","picker","children","name","planeIntersect","space","snap","rotationSnap","rotation","Math","round","z","position","quaternion","scale","point","applyQuaternion","indexOf","divide","translationSnap","search","setFromMatrixPosition","d","length","dot","multiply","ROTATION_SPEED","distanceTo","angleTo","cross","setFromAxisAngle","getMode","setMode","setTranslationSnap","setRotationSnap","size","setSpace","update","warn","create","constructor","isTransformControls","gizmoMaterial","MeshBasicMaterial","depthTest","depthWrite","transparent","side","DoubleSide","fog","gizmoLineMaterial","LineBasicMaterial","linewidth","matInvisible","clone","matHelper","matRed","color","matGreen","matBlue","matWhiteTransperent","matYellowTransparent","matCyanTransparent","matMagentaTransparent","matLineRed","matLineGreen","matLineBlue","matLineCyan","matLineMagenta","matLineYellow","matLineGray","matLineYellowTransparent","arrowGeometry","CylinderBufferGeometry","scaleHandleGeometry","BoxBufferGeometry","lineGeometry","BufferGeometry","addAttribute","Float32BufferAttribute","CircleGeometry","radius","arc","geometry","vertices","i","push","cos","PI","sin","gizmoTranslate","Mesh","Line","XYZ","OctahedronBufferGeometry","XY","PlaneBufferGeometry","YZ","XZ","pickerTranslate","helperTranslate","START","END","DELTA","TranslateHelperGeometry","gizmoRotate","E","XYZE","helperRotate","AXIS","pickerRotate","TorusBufferGeometry","SphereBufferGeometry","gizmoScale","XYZX","XYZY","XYZZ","pickerScale","helperScale","setupGizmo","gizmoMap","gizmo","tag","updateMatrix","tempGeometry","applyMatrix","matrix","tempVector","tempEuler","Euler","alignVector","zeroVector","lookAtMatrix","Matrix4","tempQuaternion","tempQuaternion2","identityQuaternion","unitX","unitY","unitZ","helper","handles","concat","handle","eyeDistance","multiplyScalar","abs","setFromRotationMatrix","lookAt","atan2","multiplyQuaternions","showX","showY","showZ","material","_opacity","_color","lerp","Color","split","some","a","setFromEuler","isTransformControlsGizmo","wireframe","dirVector","tempMatrix","isTransformControlsPlane","SMAAShader","defines","SMAA_THRESHOLD","resolution","Vector2","SMAA_MAX_SEARCH_STEPS","SMAA_AREATEX_MAX_DISTANCE","SMAA_AREATEX_PIXEL_SIZE","SMAA_AREATEX_SUBTEX_SIZE","tArea","tSearch","tColor","Asset","objectSpread","ref","url","id","otherAsset","assetData","upsert","attr","fileName","contentType","thumbnail","Model","modelName","Attachment","otherAttachment","attachmentData","parsedData","boltPattern","boltPatternId","childTranslationOffset","childRotationOffset","twistInterval","fk","BoltPattern","otherBoltPattern","boltPatternData","process","Error","Part","assets","toModelArray","map","asset","toJSON","attachments","attachment","partCategory","otherPart","partData","_this$session","session","omit","_ref","parse","partAttachmentEntry","inputBoltPattern","inputBoltPatternId","partCategoryId","thumbnailUrl","thumbnailId","description","minLength","maxLength","defaultLength","many","PartLength","otherPartLength","partLengthData","unit","PartCategory","otherPartCategory","partCategoryData","Robot","robotParts","robotPart","otherRobot","robotData","RobotPart","child","robotPartData","part","partId","robot","robotId","twist","orm","ORM","register","getEntities","state","entities","getEntitiesSession","createSelector","getPartLengths","all","getConfigurator","createOrmSelector","obj","configurator","getBuilder","builder","getBootstrapper","bootstrapper","getConfiguratorIsInitialized","initialized","getCurrentRobotId","currentRobotId","getCurrentRobot","idExists","withId","getCurrentRobotPartId","currentRobotPartId","getCurrentRobotPart","getCurrentRobotPartAsset","currentRobotPart","getCurrentRobotPartParent","parentRobotParts","defaultOffset","translation","getCurrentRobotPartParentOffsets","parentRobotPart","getLinkOffsets","linkRobotPart","getCurrentRobotPartWorkspaceArguments","parentOffsets","userData","pick","parentOutputBoltPattern","getCurrentPathname","location","pathname","getInBuildMode","getPlacementMode","placementMode","getTestDriveTabShouldBeEnabled","currentRobot","baseParts","nextPart","Boolean","getRequestQuoteTabShouldBeEnabled","getPotentialParents","getLeafNodes","nodes","result","arguments","exists","getWorkspace","workspace","getRobotStatistics","sceneRobotParts","statistics","getSceneLoaded","sceneLoaded","getSelectedRobotPartId","selectedRobotPartId","getSelectedRobotPart","defaultConstraints","getSelectedRobotPartConstraints","selectedRobotPart","associatedPart","getSelectedRobotPartChildren","getShouldWarnBeforeRobotPartRemoval","getWorkspaceIsVisible","isInitialized","ADD_PART_TO_WORKSPACE_PREFIX","ADD_PART_TO_WORKSPACE_REQUEST","ADD_PART_TO_WORKSPACE_SUCCESS","ADD_PART_TO_WORKSPACE_ERROR","ADD_PART_TO_WORKSPACE_ERROR_MESSAGE","ADD_PART_TO_WORKSPACE_NOT_SUPPORTED_MESSAGE","addPartToWorkspaceRequest","payload","addPartToWorkspaceSuccess","CLEAR_SELECTED_ROBOT_PART","clearSelectedRobotPart","ROBOT_CREATE_WITH_PART_PREFIX","ROBOT_CREATE_WITH_PART_REQUEST","ROBOT_CREATE_WITH_PART_SUCCESS","ROBOT_CREATE_WITH_PART_ERROR","ROBOT_CREATE_WITH_PART_ERROR_MESSAGE","createRobotWithPartRequest","partName","createRobotWithPartSuccess","ROBOT_PART_CREATE_SUCCESS","createRobotPartSuccess","ROBOT_CREATE_PREFIX","ROBOT_CREATE_REQUEST","ROBOT_CREATE_SUCCESS","ROBOT_CREATE_ERROR","ROBOT_CREATE_ERROR_MESSAGE","createRobotRequest","createRobotSuccess","INITIALIZE_CONFIGURATOR_PREFIX","INITIALIZE_CONFIGURATOR_REQUEST","INITIALIZE_CONFIGURATOR_SUCCESS","INITIALIZE_CONFIGURATOR_SUCCESS_CACHED","INITIALIZE_CONFIGURATOR_ERROR","INITIALIZE_CONFIGURATOR_ERROR_MESSAGE","initializeConfiguratorRequest","initializeConfiguratorSuccess","LOAD_ENTITIES_PREFIX","LOAD_ENTITIES_REQUEST","LOAD_ENTITIES_SUCCESS","LOAD_ENTITIES_ERROR","LOAD_ENTITIES_ERROR_MESSAGE","loadEntitiesRequest","loadEntitiesSuccess","ROBOT_LOAD_PREFIX","ROBOT_LOAD_REQUEST","ROBOT_LOAD_SUCCESS","ROBOT_LOAD_ERROR","ROBOT_LOAD_ERROR_MESSAGE","loadRobotRequest","loadRobotSuccess","ROBOT_PART_PLACE_SUCCESS","placeRobotPartSuccess","SET_CURRENT_ROBOT","setCurrentRobot","SET_CURRENT_ROBOT_PART","setCurrentRobotPart","SET_PLACEMENT_MODE","setPlacementMode","SET_SCENE_LOADED","setSceneLoaded","loaded","SET_SELECTED_ROBOT_PART","SET_SELECTED_ROBOT_PART_ERROR","SET_SELECTED_ROBOT_PART_ERROR_MESSAGE","setSelectedRobotPart","ROBOT_UPLOAD_HRDF_PREFIX","ROBOT_UPLOAD_HRDF_REQUEST","ROBOT_UPLOAD_HRDF_SUCCESS","ROBOT_UPLOAD_HRDF_ERROR","ROBOT_UPLOAD_HRDF_ERROR_MESSAGE","uploadHRDFRequest","file","uploadHRDFSuccess","ROBOT_PART_REMOVE_PREFIX","ROBOT_PART_REMOVE_REQUEST","ROBOT_PART_REMOVE_CANCEL","ROBOT_PART_REMOVE_SUCCESS","ROBOT_PART_REMOVE_ERROR","ROBOT_PART_REMOVE_ERROR_MESSAGE","removeRobotPartRequest","removeRobotPartSuccess","ids","removeRobotPartCancel","ROBOT_PART_REMOVE_CONFIRM_PREFIX","ROBOT_PART_REMOVE_CONFIRM_REQUEST","ROBOT_PART_REMOVE_CONFIRM_SUCCESS","ROBOT_PART_REMOVE_CONFIRM_ERROR","ROBOT_PART_REMOVE_CONFIRM_ERROR_MESSAGE","removeRobotPartConfirmRequest","removeRobotPartConfirmSuccess","ROBOT_PART_REPLACE_PREFIX","ROBOT_PART_REPLACE_REQUEST","ROBOT_PART_REPLACE_SUCCESS","ROBOT_PART_REPLACE_ERROR","ROBOT_PART_REPLACE_ERROR_MESSAGE","replaceRobotPartRequest","replaceId","newPart","replaceRobotPartSuccess","RESET_CAMERA","resetCamera","dispatch","TOGGLE_PLACEMENT_MODE","togglePlacementMode","UPDATE_ROBOT_STATISTICS","UPDATE_ROBOT_STATISTICS_ERROR","UPDATE_ROBOT_STATISTICS_ERROR_MESSAGE","updateRobotStatistics","ROBOT_PART_UPDATE_CONSTRAINT_PREFIX","ROBOT_PART_UPDATE_CONSTRAINT_REQUEST","ROBOT_PART_UPDATE_CONSTRAINT_SUCCESS","ROBOT_PART_UPDATE_CONSTRAINT_ERROR","ROBOT_PART_UPDATE_CONSTRAINT_ERROR_MESSAGE","updateSelectedRobotPartConstraintRequest","constraint","updateSelectedRobotPartConstraintSuccess","ACTIVATE_TEST_DRIVE","activateTestDrive","DEACTIVATE_TEST_DRIVE","deactivateTestDrive","EXPORT_ROBOT_PREFIX","EXPORT_ROBOT_REQUEST","EXPORT_ROBOT_SUCCESS","EXPORT_ROBOT_ERROR","EXPORT_ROBOT_ERROR_MESSAGE","exportRobotRequest","SUBMIT_FEEDBACK_PREFIX","SUBMIT_FEEDBACK_REQUEST","SUBMIT_FEEDBACK_SUCCESS","SUBMIT_FEEDBACK_SUCCESS_MESSAGE","SUBMIT_FEEDBACK_ERROR","SUBMIT_FEEDBACK_ERROR_MESSAGE","submitFeedbackRequest","feedback","resetForm","setSubmitting","actions","handleCancel","handleConfirm","connect","title","react_default","createElement","Dialog_default","open","onClose","aria-labelledby","aria-describedby","DialogTitle_default","DialogContent_default","Typography_default","variant","DialogActions_default","Button_default","onClick","autoFocus","closeModal","openModal","modalProps","axios","baseURL","timeout","headers","Accept","apiGet","config","Api","then","r","data","apiPost","post","apiPut","put","apiPatch","patch","apiDelete","delete","FeedbackForm","setSentStatus","formik_esm","initialValues","emailAddress","comments","onSubmit","values","feedbackMessage","log","e","props","handleSubmit","Grid_default","container","spacing","item","xs","TextField_default","fullWidth","label","required","errors","touched","onChange","handleChange","multiline","rows","rowsMax","ThankYouNote","paragraph","_ref2","_useState","useState","_useState2","slicedToArray","sentStatus","FeedbackModal_ThankYouNote","FeedbackModal_FeedbackForm","modalComponentLookupTable","RemovePartConfirmationModal","FeedbackModal","ModalManager","_React$Component","classCallCheck","possibleConstructorReturn","getPrototypeOf","apply","inherits","createClass","key","renderedModals","currentModals","modalDescription","index","_modalDescription$mod","ModalComponent","Fragment","React","Component","modals","getModals","SELECT_PART","selectPart","SET_DRAWER_VISIBLE","setDrawerVisible","SET_SELECTED_CATEGORY","setSelectedCategory","TOGGLE_DRAWER_VISIBLE","toggleDrawerVisible","UPDATE_AVAILABLE_PARTS_PREFIX","UPDATE_AVAILABLE_PARTS_REQUEST","UPDATE_AVAILABLE_PARTS_SUCCESS","UPDATE_AVAILABLE_PARTS_ERROR","UPDATE_AVAILABLE_PARTS_ERROR_MESSAGE","updateAvailablePartsRequest","updateAvailablePartsSuccess","handleConstraintChanged","strategies","Link","DialogContent","withStyles","theme","slider","padding","radioGroup","justifyContent","radio","palette","primary","main","&$checked","checked","constraints","lengthOptions","classes","FormControl_default","component","margin","FormLabel_default","RadioGroup_default","toString","Number","target","row","root","option","FormControlLabel_default","control","Radio_default","targetUnit","toLowerCase","standardizeLength","labelPlacement","toConsumableArray","Array","keys","default","ConfiguratorDialog","category","className","handleRemove","handleReplace","subheader","onReplaceClicked","Paper_default","elevation","Card_default","card","CardHeader_default","action","Tooltip_default","IconButton_default","aria-label","DragIndicator_default","CardContent_default","content","CardActions_default","classNames","cardActions","inReplaceMode","getReplaceButton","defaultValues","defaultProps","pointerEvents","fontSize","fontWeight","whiteSpace","flexDirection","display","flex","formatNumber","toLocaleString","minimumFractionDigits","maximumFractionDigits","getPopper","popper","getPopperLocation","getPopperProps","popperProps","entries","_ref3","gutterBottom","formattedValue","formattedKey","startCase","formatLabel","PRIMARY_FONT","typography","useNextVariants","fontFamily","h1","letterSpacing","h2","lineHeight","h3","h4","h5","h6","subtitle1","subtitle2","body1","body2","caption","overline","zIndex","mobileStepper","appBar","drawer","modal","snackbar","tooltip","createMuiTheme","secondary","neutral","light","overrides","MuiSlider","track","backgroundColor","thumb","hidePopper","showPopper","POPPER_UPDATE_REQUEST","POPPER_UPDATE_SUCCESS","updatePopperRequest","updatePopperSuccess","Popper","_this","autoBind","assertThisInitialized","handlePopperUpdate","_this$props","core_styles","darkTheme","react_draggable_default","defaultPosition","onStop","handleDrag","popperTypes","TestDriveGrabberLabel","PopperManager","show","_popper$popperProps","dialog","PopperComponent","poppers_Popper","buttons","minWidth","icon","paddingRight","handleAddComponentClick","handleNewSessionClick","Refresh_default","AddBox_default","toggleComponentCatalogDrawerVisible","withWidth","isWidthDown","AppNav_RobotBuilderButtonBarMobile","AppNav_RobotBuilderButtonBarDesktop","logo","to","src","alt","createLoadingSelector","loading","allActions","catalogActions","configurationActions","getApplicationIsLoading","reduce","endsWith","isLoading","style","visibility","LinearProgress_default","withRouter","_title","toolbar","& > div","paddingLeft","breakpoints","up","titleContainer","textTransform","down","darker","showRobotBuilderButtons","AppBar_default","Toolbar_default","shared_HebiLogo_HebiLogo","AppNav_RobotBuilderButtonBar","components_ProgressBar_ProgressBar","links","faEnvelope","href","newTab","faYoutube","faTwitter","faInstagram","faLinkedin","minHeight","boxShadow","innerContainer","alignItems","paddingTop","paddingBottom","text","urlContainer","marginRight","rel","link","index_es","GettingStartedCardContent","media","dark","_card","only","flexWrap","raised","getIsCreatingRobot","handleHRDFLoad","isSubmitting","input","wrapperLabel","buttonProgress","marginTop","marginLeft","darkest","components_GettingStartedCard","components_GettingStartedCardIconMedia","faCloudUploadAlt","components_GettingStartedCardContent","accept","files","reader","FileReader","onload","asyncToGenerator","regenerator_default","mark","_callee","base64","wrap","_context","prev","next","pop","stop","_x","readAsDataURL","htmlFor","disabled","imageUrl","CardMedia_default","image","GettingStartedCardActions","confirmButtonText","confirmButtonDisabled","handleCreateRobot","cards","LoadHRDFCard","components_GettingStartedCardMedia","emptyWorkspaceImage","components_GettingStartedCardActions","Cards","Card","Grow_default","in","textAlign","marginBottom","components_GettingStartedCardList","alignSelf","instructionIcon","instructionText","instructions","instruction","Icon_default","getCatalog","catalog","getSelectedCategoryId","selectedCategoryId","getPartsInSelectedCategory","filter","getPartIdsAvailableForCatalogSelection","enabledForWorkspace","toRefArray","getCatalogParts","partsInSelectedCategory","availablePartIds","includes","getDrawerIsVisible","componentDrawerVisible","getSelectedCategory","getSelectedPartId","selectedPartId","getSelectedPart","CategorySelect","labelWidth","setState","ReactDOM","findDOMNode","inputLabelRef","offsetWidth","_this2","categories","handleCategoryChange","selectedCategory","formControl","InputLabel_default","Select_default","OutlinedInput_default","_ref4","MenuItem_default","_ref5","pluralize","ComponentsList","partImage","partImageAltText","addPartButtonText","parts","seriesText","List_default","sort","b","ListItem_default","listItem","renderThumbnailOrPlaceholder","itemInfo","placeButton","handleAddPart","Divider_default","maxWidth","border","borderColor","handleDrawerClose","setComponentCatalogDrawerVisible","flexShrink","drawerPaper","flexGrow","mixins","header","isVisible","getCatalogDrawerIsVisible","Drawer_default","anchor","paper","Close_default","components_CategorySelect","components_ComponentsList","handleExportRobot","handleFeedbackClick","exportRobot","bottom","exportRobotButton","feedbackButton","toggleButton","alignContent","contrastText","&:hover","&:disabled","ButtonBase_default","focusRipple","workspaceToolbar","placement","Components_ToggleButton","mdi_material_ui_index_es","BuildRobotPage","shared_WorkspaceInstructions_WorkspaceInstructions","components_WorkspaceToolbar","components_ComponentCatalogDrawer","components_ExportRobotButton","ExpansionPanel","expanded","MuiExpansionPanel","ExpansionPanelSummary","borderBottom","&$expanded","ExpansionPanelSummary_default","muiName","TestDriveSpecifications","prevState","TestDriveSpecifications_ExpansionPanel","toggleExpanded","TestDriveSpecifications_ExpansionPanelSummary","summary","expandIcon","ExpandMore_default","ExpansionPanelDetails_default","details","TestDrivePage","handleActivateTestDrive","prevProps","handleDeactivateTestDrive","components_TestDriveSpecifications_TestDriveSpecifications","countryNames","getNames","FormikPersistor","sessionStorage","removeItem","storageKey","window","setValues","setErrors","setStatus","setTouched","getItem","_JSON$parse","JSON","status","_this$props2","setItem","stringify","PureComponent","FormikPersist","FormikPersist_FormikPersistor","ClearIndicator","_props$children","Cancel_default","getStyles","_props$innerProps","innerProps","restInnerProps","objectWithoutProperties","inputComponent","inputRef","Control","innerRef","selectProps","InputProps","inputProps","endAdornment","textFieldAdornment","textFieldProps","DropdownIndicator","ArrowDropDown_default","IndicatorsContainer","react_select_esm","sum","OptionWrapper","MultiValue","isFocused","removeProps","Chip_default","tabIndex","chip","chipFocused","onDelete","deleteIcon","emphasize","grey","noOptionsMessage","Option","isSelected","buttonRef","selected","placeholder","singleValue","valueContainer","overflow","components","MenuList","listDefaultHeight","listApproximatedLengthBreak","_React$PureComponent2","itemSize","bind","list","createRef","rawChildren","maxHeight","currentIndex","componentDidUpdate","current","scrollToItem","heights","_this$state","itemCount","estimatedItemSize","index_esm","itemData","isArray","ceil","totalHeight","min","max","findIndex","floor","NoOptionsMessage","Placeholder","SingleValue","ValueContainer","divider","withTheme","options","rest","selectStyles","base","& input","font","styles","isClearable","buttonGroup","alignBottom","errorIcon","danger","countries","isValid","handleBlur","setFieldTouched","setFieldValue","setFieldError","sm","helperText","onBlur","InputAdornment_default","Error_default","shared_Autocomplete_Autocomplete","country","shrink","InputLabelProps","Checkbox_default","contactViaPhone","phoneNumberRequired","phoneNumber","researchField","fieldOfResearch","includeAssembly","shared_FormikPersist_FormikPersist","SUBMIT_QUOTE_REQUEST","SUBMIT_QUOTE_SUCCESS","SUBMIT_QUOTE_SUCCESS_MESSAGE","SUBMIT_QUOTE_ERROR","SUBMIT_QUOTE_ERROR_MESSAGE","handleSubmitQuote","quote","enableReinitialize","validationSchema","Yup","shape","email","when","is","val","otherwise","notRequired","formValues","formikProps","components_RequestQuoteForm","subtitle","form","containers_RequestQuoteFormContainer","tabsRoot","tabRoot","&$tabSelected","tabSelected","testDriveTabEnabled","requestQuoteTabEnabled","match","tabs","Tabs_default","indicatorColor","tab","Tab_default","components_ConfiguratorTabBar","Switch","Route","path","RequestQuotePage","icons_index_es","ConfiguratorLoader","parseRobotIdFromQueryString","loadRobot","queryString","configuratorInitialized","components_ConfiguratorTabbedRoutes","progress","instructionsContainer","NotFoundPage","gutters","matchProps","App","CssBaseline_default","react_toastify_lib","autoClose","toast","POSITION","BOTTOM_RIGHT","modals_ModalManager","poppers_PopperManager","shared_AppNav_AppNav","layouts_DefaultLayout_DefaultLayout","exact","GettingStartedPage","shared_AppFooter_AppFooter","createReducer","initialState","fnMap","handler","reduceReducers","_len","reducers","_key","previous","createConditionalSliceReducer","sliceName","sliceReducer","getEmptyState","boltPatterns","partCategories","partLengths","forEach","modelType","model","partLength","placementModes","_createReducer","currentPlacementMode","newPlacementMode","find","selectedRobotPartLocation","workspace_createReducer","combineReducers","reducer","reducer_createReducer","modals_reducer_createReducer","newState","slice","poppers_reducer_createReducer","matches","exec","_matches","requestName","requestState","disableParts","_robotHandlers","robot_robotHandlers","newRobotPart","parentRobotPartId","rp","newPartId","existingRobotPart","migrations","2","count","persistConfig","version","storage","blacklist","stateReconciler","autoMergeLevel2","migrate","createMigrate","debug","transforms","createWhitelistFilter","history","createBrowserHistory","sagaMiddleware","createSagaMiddleware","middlewares","thunk","routerMiddleware","storeEnhancers","applyMiddleware","environmentEnhancer","compose","rootReducer","combinedReducers","router","connectRouter","entitiesCrudReducer","createRootReducer","persistedReducer","persistReducer","store","createStore","persistor","persistStore","updateAvailablePartsWatcher","getAvailablePartsForPlacement","getAvailablePartsForReplacement","place","updateAvailableParts","replace","partIds","take","select","sent","t0","_marked","_context2","abrupt","_marked2","_context3","_marked3","fork","catalogSaga_marked","part_group_strategies","createPartGroup","meshes","group","linkGroup","_meshes","spacedCap","tubeMesh","tightCap","beginCap","endCap","tube","tubeGroup","endCapGroup","childGroup","endGroup","createGroup","addChild","getComponents","applyTransformation","offsets","getAdjustedOffsets","componentName","offsetType","offsetValues","_ref6","endCapMesh","center","getChild","getChildMeshes","_getComponents6","beginCapMesh","removeChild","remove","updateLength","_getComponents","_getAdjustedOffsets","endGroupOffset","tubeGroupOffset","updateTwist","addInterfaceItem","interfaceItem","_group$userData$attac","_getComponents7","tubeLength","tubePosition","getTubePositionByTubeLength","degToRad","mesh","clonedMesh","computeBoundingBox","PartGroupFactory","canRotate","setLocalTransform","getOutlineMeshes","updateConstraint","GltfLoader","GLTFLoader","setPath","promisifyLoader","loader","onProgress","originalLoader","load","Promise","resolve","reject","ASSET_CACHE_ERROR_MESSAGE","AssetCacheManager","assetCache","_getPartAssets","matchingAssets","getFirstPartAsset","addPartToCache","_x2","_addPartToCache","_callee2","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","_step","partAsset","Symbol","iterator","done","scene","traverse","cachePartAsset","t1","return","finish","cachedPartAssets","getCachedPartAssetsById","cachedMesh","m","addedCachedPart","getPartAssets","WindowManager","canvas","composer","instance","workspaceDimensions","innerWidth","innerHeight","bindEventListeners","getWindowCoordinates","normalizeMouseScreenCoords","removeEventListeners","resizeCanvas","getWorldPosition","project","devicePixelRatio","offsetHeight","aspect","updateProjectionMatrix","TranslationMode","xOnly","yOnly","zOnly","WORKSPACE_BKG_COLOR","WORKSPACE_GRID_COLOR","PRIMARY_HIGHLIGHT_COLOR","ShaderPass","shader","textureID","ShaderMaterial","UniformsUtils","Scene","quad","frustumCulled","texture","EffectComposer","renderTarget","parameters","minFilter","LinearFilter","magFilter","format","RGBAFormat","stencilBuffer","getDrawingBufferSize","WebGLRenderTarget","renderTarget1","renderTarget2","passes","copyPass","swapBuffers","tmp","addPass","pass","insertPass","splice","il","context","stencilFunc","NOTEQUAL","EQUAL","MaskPass","ClearMaskPass","reset","RenderPass","overrideMaterial","clearColor","clearAlpha","clearDepth","oldClearColor","oldClearAlpha","oldAutoClear","autoClear","getClearColor","getHex","getClearAlpha","setClearColor","OutlinePass","selectedObjects","renderScene","renderCamera","visibleEdgeColor","hiddenEdgeColor","edgeGlow","usePatternTexture","edgeThickness","edgeStrength","downSampleRatio","pulsePeriod","pars","resx","resy","maskBufferMaterial","renderTargetMaskBuffer","generateMipmaps","depthMaterial","MeshDepthMaterial","depthPacking","RGBADepthPacking","blending","NoBlending","prepareMaskMaterial","getPrepareMaskMaterial","string","isPerspectiveCamera","replaceDepthToViewZ","renderTargetDepthBuffer","renderTargetMaskDownSampleBuffer","renderTargetBlurBuffer1","renderTargetBlurBuffer2","edgeDetectionMaterial","getEdgeDetectionMaterial","renderTargetEdgeBuffer1","renderTargetEdgeBuffer2","separableBlurMaterial1","getSeperableBlurMaterial","separableBlurMaterial2","overlayMaterial","getOverlayMaterial","copyShader","copyUniforms","materialCopy","tempPulseColor1","tempPulseColor2","textureMatrix","changeVisibilityOfSelectedObjects","bVisible","gatherSelectedMeshesCallBack","isMesh","oldVisible","changeVisibilityOfNonSelectedObjects","selectedMeshes","isLine","isSprite","bFound","updateTextureMatrix","projectionMatrix","matrixWorldInverse","disable","STENCIL_TEST","currentBackground","background","near","far","scalar","performance","now","BlurDirectionX","BlurDirectionY","patternTexture","enable","depthTexture","cameraNearFar","maskTexture","texSize","maxRadius","MAX_RADIUS","colorTexture","direction","kernelRadius","edgeTexture1","edgeTexture2","AdditiveBlending","SMAAPass","edgesRT","depthBuffer","RGBFormat","weightsRT","areaTextureImage","Image","getAreaTexture","areaTexture","needsUpdate","Texture","flipY","searchTextureImage","getSearchTexture","searchTexture","NearestFilter","uniformsEdges","materialEdges","uniformsWeights","materialWeights","uniformsBlend","materialBlend","JointAxis","Matrix2d","numRows","numCols","Float64Array","s","getNumElements","reshape","cols","fill","col","unsafe_set","unsafe_get","zero","getNumCols","getNumRows","out","toFixed","CommonOps","mult","c","aIndexStart","cIndex","j","total","indexA","indexB","end","multTransA","addEquals","SizeOps","resizeMatrices","array","numMatrices","resizeTransforms","getX","elements","getY","getZ","setX","setY","setZ","getWx","getWy","getWz","str","PayloadStats","continuousPayload","peakPayload","RobotStats","maxHorizontalReach","mass","continuousPower24V","peakPower24V","Body","output","com","Joint","_super","identity","maxVel","NaN","contEffort","peakEffort","contCurrent24V","peakCurrent24V","tslib_1","setPosition","rz","makeRotationZ","KinematicChain","bodies","joints","getNumJoints","getNumBodies","addBody","body","addJoint","joint","setPositions","positions","RobotModel","EXTENSION_EDGE_TO_CENTER_Z_DISTANCE","gravCompEfforts","unitPayloadEfforts","tmpCompEffort","tmpWrench3","tmpR","tmpRtrans","tmpW","tmpAngVel","tmpFrames","tmpTestFrames","tmpJacobians","tmpMatrix","deltas","addActuator","comZ","makeTranslation","T","addBracket","rx","comY","HEAVY_OUT_Y","makeRotationX","addLink","extension","premultiply","transform","jointOrAxis","getEndEffector","getJEndEffector","J","frame","testFrame","R","extractRotation","Rtrans","transpose","W","angVel","epsilon","EPSILON","originalPosition","multiplyMatrices","applyMatrix4","getJacobianXyz","getInverseKinematics","initialPositions","goal","kind","vector","getCoMFrames","getJacobiansCoM","jacobians","_i","jacobians_1","numBodies","frames","testFrames","jointIx","bodyIx","getGravCompEfforts","gravity","DEFAULT_GRAVITY","numJoints","tmpResult","wrench","J_1","getPayloadStats","Infinity","multiplier","cont","peak","getRobotStats","jointMax","jointMaxDistance","getHorizontalReach","angle","distance","payloadStats","sqrt","G_TO_MPS2","InverseKinematicsManager","ikRobot","directChildrenOfActuators","ikPartsSequence","staticStats","dynamicStats","resetRobot","buildRobot","traverseRobot","buildIK","areAnyChildrenGroups","updateInverseKinematics","getDynamicStats","sanitizeStat","clampRotations","isChangeTooLarge","terminatingPart","unshift","robotPartChildren","hasGroups","deltaGoal","testDriveTranslationMode","allowClamping","loggingEnabled","startingRotations","updatedRotations","err","stat","isNaN","acceptableVariance","original","updated","SceneManager","assetCacheManager","origin","Stats","pointLightForCamera","_buildTestDriveContro","snapTarget","plane","alphaTest","testDriveTarget","testDriveSnapTarget","screenPlane","buildTestDriveControls","deemphasizeTestDriveTarget","workspaceScene","camPointLight","grid","rotateX","buildWorkspaceScene","aspectRatio","cam","buildCamera","antialias","setPixelRatio","gammaOutput","buildRenderer","sceneIsDirty","wasIntersecting","orbitControls","OrbitControls","maxDistance","minDistance","testDriveActive","updateGrabberLabel","buildOrbitControls","rotateControls","controls","buildRotationControls","controlsScene","buildControlsScene","_PostProcessingCompos","effectsScene","effectsRenderPass","inScreenControlsRenderPass","defineOutlinePass","canvasWidth","canvasHeight","outlineConfig","outlinePass","property","hoverOutlinePass","selectedOutlinePass","smaaPass","PostProcessingComposer","raycaster","partGroupFactory","inverseKinematicsManager","isDraggingTarget","dragStartPosition","windowManager","targetWindowCoordinates","worldPositionOfSnapTarget","getWorldSnapTarget","requestAnimationFrame","addPart","_addPart","partAssets","_getUserData4","_getUserData5","getUserData","findRobotPartForId","selectRobotPart","robotPartGroup","selectMeshesForOutline","isEmpty","checkNearestRaycastIntersectionOnRobot","mouseVector","mouse3D","intersections","raycastAndBuildScreenOffset","targetIntersection","intersectObject","planeIntersection","snapScreenspacePlaneToTestDriveTarget","disableBuildingControls","clearSelectedPart","updateRobotPart","_replacePart","partToReplace","addPartArgs","robotPartToReplace","_getUserData6","partGroupHierarchyToKeep","parentGroup","_getUserData7","_getUserData8","_part$attachments$","parentPartId","parentPart","clearWorkspace","removeRobotParts","robotPartsToRemove","_robotPartsToRemove$i","groupToRemove","robotPartIds","replacePart","_x3","_x4","onMouseDown","mouse2D","onMouseMove","raycastForTargetHighlight","enableRotate","worldSnapPosition","subVectors","raycastAndUpdateTestDrivePosition","intersectedPart","onMouseUp","onTouchStart","onKeyPress","updatePartConstraint","invalidateScene","ThreeProcessor","sceneManager","isTouchDevice","documentElement","touchStart","touches","touch","pageX","pageY","touchMove","touchEnd","wheel","mouseDown","_e","which","mouseMove","mouseUp","_e2","keyPress","clearScene","configureCanvasWatcher","updateCanvasVisibility","CANVAS_ID","getCanvasVisibility","LOCATION_CHANGE","getLocation","configureCanvasWatcher_marked","shouldBeVisible","getElementById","configureCanvasWatcher_marked2","createCanvas","appendChild","threeProcessor","resetCameraWatcher","resetCameraWatcher_marked","addPartToWorkspaceSaga","robotPartId","args","childPart","addPartToWorkspaceSaga_marked","loadEntities","loadEntitiesSaga","setDefaultSelectedCategory","loadEntitiesSaga_marked","loadEntitiesSaga_marked2","defaultCategoryId","loadEntitiesSaga_marked3","initializeConfiguratorSaga","initializeConfiguratorSaga_marked","loadRobotWatcher","addRobotToWorkspace","loadRobotWatcher_marked","loadRobotWatcher_marked2","loadRobotWatcher_marked3","processRobotExport","exportRobotWatcher","blob","Blob","saveAs","Date","exportRobotWatcher_marked","takeEvery","exportRobotWatcher_marked2","createRobotWatcher","createRobotWithPart","getPartByName","createEmptyRobot","createRobot","createRobotFromHRDF","_createRobot","createRobotStrategies","createRobotWatcher_marked","basePart","createRobotWatcher_marked2","createRobotWatcher_marked3","_context4","_marked4","_context5","_marked5","_context6","_marked6","removeRobotPartWatcher","resetCurrentRobotPart","deleteRobotPart","confirmationModalName","configurationDialogName","getRobotPartsToRemove","removeRobotPartWatcher_marked","potentialParents","removeRobotPartWatcher_marked2","removeRobotPartWatcher_marked3","getChildRobotParts","selectRobotPartWatcher","_payload$location","selectRobotPartWatcher_marked","activateTestDriveWatcher","activateTestDriveWatcher_marked","deactivateTestDriveWatcher","deactivateTestDriveWatcher_marked","configurePartWatcher","configurePartWatcher_marked","configurePartWatcher_marked2","createChildPartSaga","attachmentId","createChildPartSaga_marked","createRootPartSaga","createRootPartSaga_marked","ensurePotentialParentSelectedBeforeCreationSaga","ensurePotentialParentSelectedBeforeCreationSaga_marked","placePartSaga","numberOfPotentialParents","placePartSaga_marked","replacePartSaga","replaceWithPart","replaceRobotPartId","withPartId","replacePartSaga_marked","createPart_strategies","createPart","addPartToWorkspaceWatcher","createPartStrategy","addPartToWorkspaceWatcher_marked","_createCanvas","configuratorSaga_marked","updatePopperSaga","updatePopper","throttle","updatePopperSaga_marked","updatePopperSaga_marked2","popperSaga_marked","submitQuoteWatcher","submitQuote","handleError","submitQuoteWatcher_marked","success","submitQuoteWatcher_marked2","submitQuoteWatcher_marked3","sagas_marked","saga_callee","CatalogSaga","ConfiguratorSaga","PopperSaga","RequestQuoteSaga","saga_marked","accent","accent1","accent2","accent3","warning","MuiAppBar","colorDefault","MuiFormLabel","MuiFormHelperText","hostname","run","sagas","es","integration_react","lib","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.09277962.chunk.js","sourcesContent":["/* eslint-disable */\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nvar THREE = require('three');\n\n\nTHREE.Pass = function () {\n\n\t// if set to true, the pass is processed by the composer\n\tthis.enabled = true;\n\n\t// if set to true, the pass indicates to swap read and write buffer after rendering\n\tthis.needsSwap = true;\n\n\t// if set to true, the pass clears its buffer before rendering\n\tthis.clear = false;\n\n\t// if set to true, the result of the pass is rendered to screen\n\tthis.renderToScreen = false;\n\n};\n\nTHREE.Pass.prototype = Object.assign( THREE.Pass.prototype, {\n\n\tsetSize: function ( width, height ) {},\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n} );\n\nmodule.exports = THREE.Pass;\n","/* eslint-disable */\n\n/**\n * @author alteredq / http://alteredqualia.com/\n *\n * Full-screen textured quad shader\n */\n\nvar THREE = require('three');\n\n\nTHREE.CopyShader = {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\": { value: null },\n\t\t\"opacity\": { value: 1.0 }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join( \"\\n\" ),\n\n\tfragmentShader: [\n\n\t\t\"uniform float opacity;\",\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\"varying vec2 vUv;\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vec4 texel = texture2D( tDiffuse, vUv );\",\n\t\t\t\"gl_FragColor = opacity * texel;\",\n\n\t\t\"}\"\n\n\t].join( \"\\n\" )\n\n};\n\nmodule.exports = THREE.CopyShader;\n","module.exports = __webpack_public_path__ + \"static/media/hebi-logo.31195651.svg\";","module.exports = \"data:image/png;base64,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\"","/* eslint-disable */\n\n/**\n * @author arodic / https://github.com/arodic\n */\n\nvar THREE = require('three');\n\n\nTHREE.TransformControls = function ( camera, domElement ) {\n\n\tTHREE.Object3D.call( this );\n\n\tdomElement = ( domElement !== undefined ) ? domElement : document;\n\n\tthis.visible = false;\n\n\tvar _gizmo = new THREE.TransformControlsGizmo();\n\tthis.add( _gizmo );\n\n\tvar _plane = new THREE.TransformControlsPlane();\n\tthis.add( _plane );\n\n\tvar scope = this;\n\n\t// Define properties with getters/setter\n\t// Setting the defined property will automatically trigger change event\n\t// Defined properties are passed down to gizmo and plane\n\n\tdefineProperty( \"camera\", camera );\n\tdefineProperty( \"object\", undefined );\n\tdefineProperty( \"enabled\", true );\n\tdefineProperty( \"axis\", null );\n\tdefineProperty( \"mode\", \"translate\" );\n\tdefineProperty( \"translationSnap\", null );\n\tdefineProperty( \"rotationSnap\", null );\n\tdefineProperty( \"space\", \"world\" );\n\tdefineProperty( \"size\", 1 );\n\tdefineProperty( \"dragging\", false );\n\tdefineProperty( \"showX\", true );\n\tdefineProperty( \"showY\", true );\n\tdefineProperty( \"showZ\", true );\n\n\tvar changeEvent = { type: \"change\" };\n\tvar mouseDownEvent = { type: \"mouseDown\" };\n\tvar mouseUpEvent = { type: \"mouseUp\", mode: scope.mode };\n\tvar objectChangeEvent = { type: \"objectChange\" };\n\n\t// Reusable utility variables\n\n\tvar ray = new THREE.Raycaster();\n\n\tvar _tempVector = new THREE.Vector3();\n\tvar _tempVector2 = new THREE.Vector3();\n\tvar _tempQuaternion = new THREE.Quaternion();\n\tvar _unit = {\n\t\tX: new THREE.Vector3( 1, 0, 0 ),\n\t\tY: new THREE.Vector3( 0, 1, 0 ),\n\t\tZ: new THREE.Vector3( 0, 0, 1 )\n\t};\n\tvar _identityQuaternion = new THREE.Quaternion();\n\tvar _alignVector = new THREE.Vector3();\n\n\tvar pointStart = new THREE.Vector3();\n\tvar pointEnd = new THREE.Vector3();\n\tvar offset = new THREE.Vector3();\n\tvar rotationAxis = new THREE.Vector3();\n\tvar startNorm = new THREE.Vector3();\n\tvar endNorm = new THREE.Vector3();\n\tvar rotationAngle = 0;\n\n\tvar cameraPosition = new THREE.Vector3();\n\tvar cameraQuaternion = new THREE.Quaternion();\n\tvar cameraScale = new THREE.Vector3();\n\n\tvar parentPosition = new THREE.Vector3();\n\tvar parentQuaternion = new THREE.Quaternion();\n\tvar parentQuaternionInv = new THREE.Quaternion();\n\tvar parentScale = new THREE.Vector3();\n\n\tvar worldPositionStart = new THREE.Vector3();\n\tvar worldQuaternionStart = new THREE.Quaternion();\n\tvar worldScaleStart = new THREE.Vector3();\n\n\tvar worldPosition = new THREE.Vector3();\n\tvar worldQuaternion = new THREE.Quaternion();\n\tvar worldQuaternionInv = new THREE.Quaternion();\n\tvar worldScale = new THREE.Vector3();\n\n\tvar eye = new THREE.Vector3();\n\n\tvar positionStart = new THREE.Vector3();\n\tvar quaternionStart = new THREE.Quaternion();\n\tvar scaleStart = new THREE.Vector3();\n\n\t// TODO: remove properties unused in plane and gizmo\n\n\tdefineProperty( \"worldPosition\", worldPosition );\n\tdefineProperty( \"worldPositionStart\", worldPositionStart );\n\tdefineProperty( \"worldQuaternion\", worldQuaternion );\n\tdefineProperty( \"worldQuaternionStart\", worldQuaternionStart );\n\tdefineProperty( \"cameraPosition\", cameraPosition );\n\tdefineProperty( \"cameraQuaternion\", cameraQuaternion );\n\tdefineProperty( \"pointStart\", pointStart );\n\tdefineProperty( \"pointEnd\", pointEnd );\n\tdefineProperty( \"rotationAxis\", rotationAxis );\n\tdefineProperty( \"rotationAngle\", rotationAngle );\n\tdefineProperty( \"eye\", eye );\n\n\t{\n\n\t\tdomElement.addEventListener( \"mousedown\", onPointerDown, false );\n\t\tdomElement.addEventListener( \"touchstart\", onPointerDown, false );\n\t\tdomElement.addEventListener( \"mousemove\", onPointerHover, false );\n\t\tdomElement.addEventListener( \"touchmove\", onPointerHover, false );\n\t\tdomElement.addEventListener( \"touchmove\", onPointerMove, false );\n\t\tdocument.addEventListener( \"mouseup\", onPointerUp, false );\n\t\tdomElement.addEventListener( \"touchend\", onPointerUp, false );\n\t\tdomElement.addEventListener( \"touchcancel\", onPointerUp, false );\n\t\tdomElement.addEventListener( \"touchleave\", onPointerUp, false );\n\n\t}\n\n\tthis.dispose = function () {\n\n\t\tdomElement.removeEventListener( \"mousedown\", onPointerDown );\n\t\tdomElement.removeEventListener( \"touchstart\", onPointerDown );\n\t\tdomElement.removeEventListener( \"mousemove\", onPointerHover );\n\t\tdomElement.removeEventListener( \"touchmove\", onPointerHover );\n\t\tdomElement.removeEventListener( \"touchmove\", onPointerMove );\n\t\tdocument.removeEventListener( \"mouseup\", onPointerUp );\n\t\tdomElement.removeEventListener( \"touchend\", onPointerUp );\n\t\tdomElement.removeEventListener( \"touchcancel\", onPointerUp );\n\t\tdomElement.removeEventListener( \"touchleave\", onPointerUp );\n\n\t};\n\n\t// Set current object\n\tthis.attach = function ( object ) {\n\n\t\tthis.object = object;\n\t\tthis.visible = true;\n\n\t};\n\n\t// Detatch from object\n\tthis.detach = function () {\n\n\t\tthis.object = undefined;\n\t\tthis.visible = false;\n\t\tthis.axis = null;\n\n\t};\n\n\t// Defined getter, setter and store for a property\n\tfunction defineProperty( propName, defaultValue ) {\n\n\t\tvar propValue = defaultValue;\n\n\t\tObject.defineProperty( scope, propName, {\n\n\t\t\tget: function() {\n\n\t\t\t\treturn propValue !== undefined ? propValue : defaultValue;\n\n\t\t\t},\n\n\t\t\tset: function( value ) {\n\n\t\t\t\tif ( propValue !== value ) {\n\n\t\t\t\t\tpropValue = value;\n\t\t\t\t\t_plane[ propName ] = value;\n\t\t\t\t\t_gizmo[ propName ] = value;\n\n\t\t\t\t\tscope.dispatchEvent( { type: propName + \"-changed\", value: value } );\n\t\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t});\n\n\t\tscope[ propName ] = defaultValue;\n\t\t_plane[ propName ] = defaultValue;\n\t\t_gizmo[ propName ] = defaultValue;\n\n\t}\n\n\t// updateMatrixWorld updates key transformation variables\n\tthis.updateMatrixWorld = function () {\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\tthis.object.updateMatrixWorld();\n\t\t\tthis.object.parent.matrixWorld.decompose( parentPosition, parentQuaternion, parentScale );\n\t\t\tthis.object.matrixWorld.decompose( worldPosition, worldQuaternion, worldScale );\n\n\t\t\tparentQuaternionInv.copy( parentQuaternion ).inverse();\n\t\t\tworldQuaternionInv.copy( worldQuaternion ).inverse();\n\n\t\t}\n\n\t\tthis.camera.updateMatrixWorld();\n\t\tthis.camera.matrixWorld.decompose( cameraPosition, cameraQuaternion, cameraScale );\n\n\t\tif ( this.camera instanceof THREE.PerspectiveCamera ) {\n\n\t\t\teye.copy( cameraPosition ).sub( worldPosition ).normalize();\n\n\t\t} else if ( this.camera instanceof THREE.OrthographicCamera ) {\n\n\t\t\teye.copy( cameraPosition ).normalize();\n\n\t\t}\n\n\t\tTHREE.Object3D.prototype.updateMatrixWorld.call( this );\n\n\t};\n\n\tthis.pointerHover = function( pointer ) {\n\n\t\tif ( this.object === undefined || this.dragging === true || ( pointer.button !== undefined && pointer.button !== 0 ) ) return;\n\n\t\tray.setFromCamera( pointer, this.camera );\n\n\t\tvar intersect = ray.intersectObjects( _gizmo.picker[ this.mode ].children, true )[ 0 ] || false;\n\n\t\tif ( intersect ) {\n\n\t\t\tthis.axis = intersect.object.name;\n\n\t\t} else {\n\n\t\t\tthis.axis = null;\n\n\t\t}\n\n\t};\n\n\tthis.pointerDown = function( pointer ) {\n\n\t\tif ( this.object === undefined || this.dragging === true || ( pointer.button !== undefined && pointer.button !== 0 ) ) return;\n\n\t\tif ( ( pointer.button === 0 || pointer.button === undefined ) && this.axis !== null ) {\n\n\t\t\tray.setFromCamera( pointer, this.camera );\n\n\t\t\tvar planeIntersect = ray.intersectObjects( [ _plane ], true )[ 0 ] || false;\n\n\t\t\tif ( planeIntersect ) {\n\n\t\t\t\tvar space = this.space;\n\n\t\t\t\tif ( this.mode === 'scale') {\n\n\t\t\t\t\tspace = 'local';\n\n\t\t\t\t} else if ( this.axis === 'E' || this.axis === 'XYZE' || this.axis === 'XYZ' ) {\n\n\t\t\t\t\tspace = 'world';\n\n\t\t\t\t}\n\n\t\t\t\tif ( space === 'local' && this.mode === 'rotate' ) {\n\n\t\t\t\t\tvar snap = this.rotationSnap;\n\n\t\t\t\t\tif ( this.axis === 'X' && snap ) this.object.rotation.x = Math.round( this.object.rotation.x / snap ) * snap;\n\t\t\t\t\tif ( this.axis === 'Y' && snap ) this.object.rotation.y = Math.round( this.object.rotation.y / snap ) * snap;\n\t\t\t\t\tif ( this.axis === 'Z' && snap ) this.object.rotation.z = Math.round( this.object.rotation.z / snap ) * snap;\n\n\t\t\t\t}\n\n\t\t\t\tthis.object.updateMatrixWorld();\n\t\t\t\tthis.object.parent.updateMatrixWorld();\n\n\t\t\t\tpositionStart.copy( this.object.position );\n\t\t\t\tquaternionStart.copy( this.object.quaternion );\n\t\t\t\tscaleStart.copy( this.object.scale );\n\n\t\t\t\tthis.object.matrixWorld.decompose( worldPositionStart, worldQuaternionStart, worldScaleStart );\n\n\t\t\t\tpointStart.copy( planeIntersect.point ).sub( worldPositionStart );\n\n\t\t\t}\n\n\t\t\tthis.dragging = true;\n\t\t\tmouseDownEvent.mode = this.mode;\n\t\t\tthis.dispatchEvent( mouseDownEvent );\n\n\t\t}\n\n\t};\n\n\tthis.pointerMove = function( pointer ) {\n\n\t\tvar axis = this.axis;\n\t\tvar mode = this.mode;\n\t\tvar object = this.object;\n\t\tvar space = this.space;\n\n\t\tif ( mode === 'scale') {\n\n\t\t\tspace = 'local';\n\n\t\t} else if ( axis === 'E' || axis === 'XYZE' || axis === 'XYZ' ) {\n\n\t\t\tspace = 'world';\n\n\t\t}\n\n\t\tif ( object === undefined || axis === null || this.dragging === false || ( pointer.button !== undefined && pointer.button !== 0 ) ) return;\n\n\t\tray.setFromCamera( pointer, this.camera );\n\n\t\tvar planeIntersect = ray.intersectObjects( [ _plane ], true )[ 0 ] || false;\n\n\t\tif ( planeIntersect === false ) return;\n\n\t\tpointEnd.copy( planeIntersect.point ).sub( worldPositionStart );\n\n\t\tif ( mode === 'translate' ) {\n\n\t\t\t// Apply translate\n\n\t\t\toffset.copy( pointEnd ).sub( pointStart );\n\n\t\t\tif ( space === 'local' && axis !== 'XYZ' ) {\n\t\t\t\toffset.applyQuaternion( worldQuaternionInv );\n\t\t\t}\n\n\t\t\tif ( axis.indexOf( 'X' ) === -1 ) offset.x = 0;\n\t\t\tif ( axis.indexOf( 'Y' ) === -1 ) offset.y = 0;\n\t\t\tif ( axis.indexOf( 'Z' ) === -1 ) offset.z = 0;\n\n\t\t\tif ( space === 'local' && axis !== 'XYZ') {\n\t\t\t\toffset.applyQuaternion( quaternionStart ).divide( parentScale );\n\t\t\t} else {\n\t\t\t\toffset.applyQuaternion( parentQuaternionInv ).divide( parentScale );\n\t\t\t}\n\n\t\t\tobject.position.copy( offset ).add( positionStart );\n\n\t\t\t// Apply translation snap\n\n\t\t\tif ( this.translationSnap ) {\n\n\t\t\t\tif ( space === 'local' ) {\n\n\t\t\t\t\tobject.position.applyQuaternion(_tempQuaternion.copy( quaternionStart ).inverse() );\n\n\t\t\t\t\tif ( axis.search( 'X' ) !== -1 ) {\n\t\t\t\t\t\tobject.position.x = Math.round( object.position.x / this.translationSnap ) * this.translationSnap;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Y' ) !== -1 ) {\n\t\t\t\t\t\tobject.position.y = Math.round( object.position.y / this.translationSnap ) * this.translationSnap;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Z' ) !== -1 ) {\n\t\t\t\t\t\tobject.position.z = Math.round( object.position.z / this.translationSnap ) * this.translationSnap;\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.position.applyQuaternion( quaternionStart );\n\n\t\t\t\t}\n\n\t\t\t\tif ( space === 'world' ) {\n\n\t\t\t\t\tif ( object.parent ) {\n\t\t\t\t\t\tobject.position.add( _tempVector.setFromMatrixPosition( object.parent.matrixWorld ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'X' ) !== -1 ) {\n\t\t\t\t\t\tobject.position.x = Math.round( object.position.x / this.translationSnap ) * this.translationSnap;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Y' ) !== -1 ) {\n\t\t\t\t\t\tobject.position.y = Math.round( object.position.y / this.translationSnap ) * this.translationSnap;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Z' ) !== -1 ) {\n\t\t\t\t\t\tobject.position.z = Math.round( object.position.z / this.translationSnap ) * this.translationSnap;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.parent ) {\n\t\t\t\t\t\tobject.position.sub( _tempVector.setFromMatrixPosition( object.parent.matrixWorld ) );\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( mode === 'scale' ) {\n\n\t\t\tif ( axis.search( 'XYZ' ) !== -1 ) {\n\n\t\t\t\tvar d = pointEnd.length() / pointStart.length();\n\n\t\t\t\tif ( pointEnd.dot( pointStart ) < 0 ) d *= -1;\n\n\t\t\t\t_tempVector.set( d, d, d );\n\n\t\t\t} else {\n\n\t\t\t\t_tempVector.copy( pointEnd ).divide( pointStart );\n\n\t\t\t\tif ( axis.search( 'X' ) === -1 ) {\n\t\t\t\t\t_tempVector.x = 1;\n\t\t\t\t}\n\t\t\t\tif ( axis.search( 'Y' ) === -1 ) {\n\t\t\t\t\t_tempVector.y = 1;\n\t\t\t\t}\n\t\t\t\tif ( axis.search( 'Z' ) === -1 ) {\n\t\t\t\t\t_tempVector.z = 1;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Apply scale\n\n\t\t\tobject.scale.copy( scaleStart ).multiply( _tempVector );\n\n\t\t} else if ( mode === 'rotate' ) {\n\n\t\t\toffset.copy( pointEnd ).sub( pointStart );\n\n\t\t\tvar ROTATION_SPEED = 20 / worldPosition.distanceTo( _tempVector.setFromMatrixPosition( this.camera.matrixWorld ) );\n\n\t\t\tif ( axis === 'E' ) {\n\n\t\t\t\trotationAxis.copy( eye );\n\t\t\t\trotationAngle = pointEnd.angleTo( pointStart );\n\n\t\t\t\tstartNorm.copy( pointStart ).normalize();\n\t\t\t\tendNorm.copy( pointEnd ).normalize();\n\n\t\t\t\trotationAngle *= ( endNorm.cross( startNorm ).dot( eye ) < 0 ? 1 : -1);\n\n\t\t\t} else if ( axis === 'XYZE' ) {\n\n\t\t\t\trotationAxis.copy( offset ).cross( eye ).normalize( );\n\t\t\t\trotationAngle = offset.dot( _tempVector.copy( rotationAxis ).cross( this.eye ) ) * ROTATION_SPEED;\n\n\t\t\t} else if ( axis === 'X' || axis === 'Y' || axis === 'Z' ) {\n\n\t\t\t\trotationAxis.copy( _unit[ axis ] );\n\n\t\t\t\t_tempVector.copy( _unit[ axis ] );\n\n\t\t\t\tif ( space === 'local' ) {\n\t\t\t\t\t_tempVector.applyQuaternion( worldQuaternion );\n\t\t\t\t}\n\n\t\t\t\trotationAngle = offset.dot( _tempVector.cross( eye ).normalize() ) * ROTATION_SPEED;\n\n\t\t\t}\n\n\t\t\t// Apply rotation snap\n\n\t\t\tif ( this.rotationSnap ) rotationAngle = Math.round( rotationAngle / this.rotationSnap ) * this.rotationSnap;\n\n\t\t\tthis.rotationAngle = rotationAngle;\n\n\t\t\t// Apply rotate\n\t\t\tif ( space === 'local' && axis !== 'E' && axis !== 'XYZE' ) {\n\n\t\t\t\tobject.quaternion.copy( quaternionStart );\n\t\t\t\tobject.quaternion.multiply( _tempQuaternion.setFromAxisAngle( rotationAxis, rotationAngle ) ).normalize();\n\n\t\t\t} else {\n\n\t\t\t\trotationAxis.applyQuaternion( parentQuaternionInv );\n\t\t\t\tobject.quaternion.copy( _tempQuaternion.setFromAxisAngle( rotationAxis, rotationAngle ) );\n\t\t\t\tobject.quaternion.multiply( quaternionStart ).normalize();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( changeEvent );\n\t\tthis.dispatchEvent( objectChangeEvent );\n\n\t};\n\n\tthis.pointerUp = function( pointer ) {\n\n\t\tif ( pointer.button !== undefined && pointer.button !== 0 ) return;\n\n\t\tif ( this.dragging && ( this.axis !== null ) ) {\n\n\t\t\tmouseUpEvent.mode = this.mode;\n\t\t\tthis.dispatchEvent( mouseUpEvent );\n\n\t\t}\n\n\t\tthis.dragging = false;\n\n\t\tif ( pointer.button === undefined ) this.axis = null;\n\n\t};\n\n\t// normalize mouse / touch pointer and remap {x,y} to view space.\n\n\tfunction getPointer( event ) {\n\n\t\tvar pointer = event.changedTouches ? event.changedTouches[ 0 ] : event;\n\n\t\tvar rect = domElement.getBoundingClientRect();\n\n\t\treturn {\n\t\t\tx: ( pointer.clientX - rect.left ) / rect.width * 2 - 1,\n\t\t\ty: - ( pointer.clientY - rect.top ) / rect.height * 2 + 1,\n\t\t\tbutton: event.button\n\t\t};\n\n\t}\n\n\t// mouse / touch event handlers\n\n\tfunction onPointerHover( event ) {\n\n\t\tif ( !scope.enabled ) return;\n\n\t\tscope.pointerHover( getPointer( event ) );\n\n\t}\n\n\tfunction onPointerDown( event ) {\n\n\t\tif ( !scope.enabled ) return;\n\n\t\tdocument.addEventListener( \"mousemove\", onPointerMove, false );\n\n\t\tscope.pointerHover( getPointer( event ) );\n\t\tscope.pointerDown( getPointer( event ) );\n\n\t}\n\n\tfunction onPointerMove( event ) {\n\n\t\tif ( !scope.enabled ) return;\n\n\t\tscope.pointerMove( getPointer( event ) );\n\n\t}\n\n\tfunction onPointerUp( event ) {\n\n\t\tif ( !scope.enabled ) return;\n\n\t\tdocument.removeEventListener( \"mousemove\", onPointerMove, false );\n\n\t\tscope.pointerUp( getPointer( event ) );\n\n\t}\n\n\t// TODO: depricate\n\n\tthis.getMode = function () {\n\n\t\treturn scope.mode;\n\n\t};\n\n\tthis.setMode = function ( mode ) {\n\n\t\tscope.mode = mode;\n\n\t};\n\n\tthis.setTranslationSnap = function ( translationSnap ) {\n\n\t\tscope.translationSnap = translationSnap;\n\n\t};\n\n\tthis.setRotationSnap = function ( rotationSnap ) {\n\n\t\tscope.rotationSnap = rotationSnap;\n\n\t};\n\n\tthis.setSize = function ( size ) {\n\n\t\tscope.size = size;\n\n\t};\n\n\tthis.setSpace = function ( space ) {\n\n\t\tscope.space = space;\n\n\t};\n\n\tthis.update = function () {\n\n\t\tconsole.warn( 'THREE.TransformControls: update function has been depricated.' );\n\n\t};\n\n};\n\nTHREE.TransformControls.prototype = Object.assign( Object.create( THREE.Object3D.prototype ), {\n\n constructor: THREE.TransformControls,\n\n isTransformControls: true\n\n} );\n\n\nTHREE.TransformControlsGizmo = function () {\n\n\t'use strict';\n\n\tTHREE.Object3D.call( this );\n\n\tthis.type = 'TransformControlsGizmo';\n\n\t// shared materials\n\n\tvar gizmoMaterial = new THREE.MeshBasicMaterial({\n\t\tdepthTest: false,\n\t\tdepthWrite: false,\n\t\ttransparent: true,\n\t\tside: THREE.DoubleSide,\n\t\tfog: false\n\t});\n\n\tvar gizmoLineMaterial = new THREE.LineBasicMaterial({\n\t\tdepthTest: false,\n\t\tdepthWrite: false,\n\t\ttransparent: true,\n\t\tlinewidth: 1,\n\t\tfog: false\n\t});\n\n\t// Make unique material for each axis/color\n\n\tvar matInvisible = gizmoMaterial.clone();\n\tmatInvisible.opacity = 0.15;\n\n\tvar matHelper = gizmoMaterial.clone();\n\tmatHelper.opacity = 0.33;\n\n\tvar matRed = gizmoMaterial.clone();\n\tmatRed.color.set( 0xff0000 );\n\n\tvar matGreen = gizmoMaterial.clone();\n\tmatGreen.color.set( 0x00ff00 );\n\n\tvar matBlue = gizmoMaterial.clone();\n\tmatBlue.color.set( 0x0000ff );\n\n\tvar matWhiteTransperent = gizmoMaterial.clone();\n\tmatWhiteTransperent.opacity = 0.25;\n\n\tvar matYellowTransparent = matWhiteTransperent.clone();\n\tmatYellowTransparent.color.set( 0xffff00 );\n\n\tvar matCyanTransparent = matWhiteTransperent.clone();\n\tmatCyanTransparent.color.set( 0x00ffff );\n\n\tvar matMagentaTransparent = matWhiteTransperent.clone();\n\tmatMagentaTransparent.color.set( 0xff00ff );\n\n\tvar matYellow = gizmoMaterial.clone();\n\tmatYellow.color.set( 0xffff00 );\n\n\tvar matLineRed = gizmoLineMaterial.clone();\n\tmatLineRed.color.set( 0xff0000 );\n\n\tvar matLineGreen = gizmoLineMaterial.clone();\n\tmatLineGreen.color.set( 0x00ff00 );\n\n\tvar matLineBlue = gizmoLineMaterial.clone();\n\tmatLineBlue.color.set( 0x0000ff );\n\n\tvar matLineCyan = gizmoLineMaterial.clone();\n\tmatLineCyan.color.set( 0x00ffff );\n\n\tvar matLineMagenta = gizmoLineMaterial.clone();\n\tmatLineMagenta.color.set( 0xff00ff );\n\n\tvar matLineYellow = gizmoLineMaterial.clone();\n\tmatLineYellow.color.set( 0xffff00 );\n\n\tvar matLineGray = gizmoLineMaterial.clone();\n\tmatLineGray.color.set( 0x787878);\n\n\tvar matLineYellowTransparent = matLineYellow.clone();\n\tmatLineYellowTransparent.opacity = 0.25;\n\n\t// reusable geometry\n\n\tvar arrowGeometry = new THREE.CylinderBufferGeometry( 0, 0.05, 0.2, 12, 1, false);\n\n\tvar scaleHandleGeometry = new THREE.BoxBufferGeometry( 0.125, 0.125, 0.125);\n\n\tvar lineGeometry = new THREE.BufferGeometry( );\n\tlineGeometry.addAttribute('position', new THREE.Float32BufferAttribute( [ 0, 0, 0,\t1, 0, 0 ], 3 ) );\n\n\tvar CircleGeometry = function( radius, arc ) {\n\n\t\tvar geometry = new THREE.BufferGeometry( );\n\t\tvar vertices = [];\n\n\t\tfor ( var i = 0; i <= 64 * arc; ++i ) {\n\n\t\t\tvertices.push( 0, Math.cos( i / 32 * Math.PI ) * radius, Math.sin( i / 32 * Math.PI ) * radius );\n\n\t\t}\n\n\t\tgeometry.addAttribute('position', new THREE.Float32BufferAttribute( vertices, 3 ) );\n\n\t\treturn geometry;\n\n\t};\n\n\t// Special geometry for transform helper. If scaled with position vector it spans from [0,0,0] to position\n\n\tvar TranslateHelperGeometry = function( radius, arc ) {\n\n\t\tvar geometry = new THREE.BufferGeometry()\n\n\t\tgeometry.addAttribute('position', new THREE.Float32BufferAttribute( [ 0, 0, 0, 1, 1, 1 ], 3 ) );\n\n\t\treturn geometry;\n\n\t};\n\n\t// Gizmo definitions - custom hierarchy definitions for setupGizmo() function\n\n\tvar gizmoTranslate = {\n\t\tX: [\n\t\t\t[ new THREE.Mesh( arrowGeometry, matRed ), [ 1, 0, 0 ], [ 0, 0, -Math.PI / 2 ], null, 'fwd' ],\n\t\t\t[ new THREE.Mesh( arrowGeometry, matRed ), [ 1, 0, 0 ], [ 0, 0, Math.PI / 2 ], null, 'bwd' ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineRed ) ]\n\t\t],\n\t\tY: [\n\t\t\t[ new THREE.Mesh( arrowGeometry, matGreen ), [ 0, 1, 0 ], null, null, 'fwd' ],\n\t\t\t[ new THREE.Mesh( arrowGeometry, matGreen ), [ 0, 1, 0 ], [ Math.PI, 0, 0 ], null, 'bwd' ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineGreen ), null, [ 0, 0, Math.PI / 2 ] ]\n\t\t],\n\t\tZ: [\n\t\t\t[ new THREE.Mesh( arrowGeometry, matBlue ), [ 0, 0, 1 ], [ Math.PI / 2, 0, 0 ], null, 'fwd' ],\n\t\t\t[ new THREE.Mesh( arrowGeometry, matBlue ), [ 0, 0, 1 ], [ -Math.PI / 2, 0, 0 ], null, 'bwd' ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineBlue ), null, [ 0, -Math.PI / 2, 0 ] ]\n\t\t],\n\t\tXYZ: [\n\t\t\t[ new THREE.Mesh( new THREE.OctahedronBufferGeometry( 0.1, 0 ), matWhiteTransperent ), [ 0, 0, 0 ], [ 0, 0, 0 ] ]\n\t\t],\n\t\tXY: [\n\t\t\t[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.295, 0.295 ), matYellowTransparent ), [ 0.15, 0.15, 0 ] ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineYellow ), [ 0.18, 0.3, 0 ], null, [ 0.125, 1, 1 ] ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineYellow ), [ 0.3, 0.18, 0 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ] ]\n\t\t],\n\t\tYZ: [\n\t\t\t[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.295, 0.295 ), matCyanTransparent ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ] ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineCyan ), [ 0, 0.18, 0.3 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ] ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineCyan ), [ 0, 0.3, 0.18 ], [ 0, -Math.PI / 2, 0 ], [ 0.125, 1, 1 ] ]\n\t\t],\n\t\tXZ: [\n\t\t\t[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.295, 0.295 ), matMagentaTransparent ), [ 0.15, 0, 0.15 ], [ -Math.PI / 2, 0, 0 ] ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineMagenta ), [ 0.18, 0, 0.3 ], null, [ 0.125, 1, 1 ] ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineMagenta ), [ 0.3, 0, 0.18 ], [ 0, -Math.PI / 2, 0 ], [ 0.125, 1, 1 ] ]\n\t\t]\n\t};\n\n\tvar pickerTranslate = {\n\t\tX: [\n\t\t\t[ new THREE.Mesh( new THREE.CylinderBufferGeometry( 0.2, 0, 1, 4, 1, false ), matInvisible ), [ 0.6, 0, 0 ], [ 0, 0, -Math.PI / 2 ] ]\n\t\t],\n\t\tY: [\n\t\t\t[ new THREE.Mesh( new THREE.CylinderBufferGeometry( 0.2, 0, 1, 4, 1, false ), matInvisible ), [ 0, 0.6, 0 ] ]\n\t\t],\n\t\tZ: [\n\t\t\t[ new THREE.Mesh( new THREE.CylinderBufferGeometry( 0.2, 0, 1, 4, 1, false ), matInvisible ), [ 0, 0, 0.6 ], [ Math.PI / 2, 0, 0 ] ]\n\t\t],\n\t\tXYZ: [\n\t\t\t[ new THREE.Mesh( new THREE.OctahedronBufferGeometry( 0.2, 0 ), matInvisible ) ]\n\t\t],\n\t\tXY: [\n\t\t\t[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.4, 0.4 ), matInvisible ), [ 0.2, 0.2, 0 ] ]\n\t\t],\n\t\tYZ: [\n\t\t\t[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.4, 0.4 ), matInvisible ), [ 0, 0.2, 0.2 ], [ 0, Math.PI / 2, 0 ] ]\n\t\t],\n\t\tXZ: [\n\t\t\t[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.4, 0.4 ), matInvisible ), [ 0.2, 0, 0.2 ], [ -Math.PI / 2, 0, 0 ] ]\n\t\t]\n\t};\n\n\tvar helperTranslate = {\n\t\tSTART: [\n\t\t\t[ new THREE.Mesh( new THREE.OctahedronBufferGeometry( 0.01, 2 ), matHelper ), null, null, null, 'helper' ]\n\t\t],\n\t\tEND: [\n\t\t\t[ new THREE.Mesh( new THREE.OctahedronBufferGeometry( 0.01, 2 ), matHelper ), null, null, null, 'helper' ]\n\t\t],\n\t\tDELTA: [\n\t\t\t[ new THREE.Line( TranslateHelperGeometry(), matHelper ), null, null, null, 'helper' ]\n\t\t],\n\t\tX: [\n\t\t\t[ new THREE.Line( lineGeometry, matHelper.clone() ), [ -1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t],\n\t\tY: [\n\t\t\t[ new THREE.Line( lineGeometry, matHelper.clone() ), [ 0, -1e3, 0 ], [ 0, 0, Math.PI / 2 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t],\n\t\tZ: [\n\t\t\t[ new THREE.Line( lineGeometry, matHelper.clone() ), [ 0, 0, -1e3 ], [ 0, -Math.PI / 2, 0 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t]\n\t};\n\n\tvar gizmoRotate = {\n\t\tX: [\n\t\t\t[ new THREE.Line( CircleGeometry( 1, 0.5 ), matLineRed ) ],\n\t\t\t[ new THREE.Mesh( new THREE.OctahedronBufferGeometry( 0.04, 0 ), matRed ), [ 0, 0, 0.99 ], null, [ 1, 3, 1 ] ],\n\t\t],\n\t\tY: [\n\t\t\t[ new THREE.Line( CircleGeometry( 1, 0.5 ), matLineGreen ), null, [ 0, 0, -Math.PI / 2 ] ],\n\t\t\t[ new THREE.Mesh( new THREE.OctahedronBufferGeometry( 0.04, 0 ), matGreen ), [ 0, 0, 0.99 ], null, [ 3, 1, 1 ] ],\n\t\t],\n\t\tZ: [\n\t\t\t[ new THREE.Line( CircleGeometry( 1, 0.5 ), matLineBlue ), null, [ 0, Math.PI / 2, 0 ] ],\n\t\t\t[ new THREE.Mesh( new THREE.OctahedronBufferGeometry( 0.04, 0 ), matBlue ), [ 0.99, 0, 0 ], null, [ 1, 3, 1 ] ],\n\t\t],\n\t\tE: [\n\t\t\t[ new THREE.Line( CircleGeometry( 1.25, 1 ), matLineYellowTransparent ), null, [ 0, Math.PI / 2, 0 ] ],\n\t\t\t[ new THREE.Mesh( new THREE.CylinderBufferGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ 1.17, 0, 0 ], [ 0, 0, -Math.PI / 2 ], [ 1, 1, 0.001 ]],\n\t\t\t[ new THREE.Mesh( new THREE.CylinderBufferGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ -1.17, 0, 0 ], [ 0, 0, Math.PI / 2 ], [ 1, 1, 0.001 ]],\n\t\t\t[ new THREE.Mesh( new THREE.CylinderBufferGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ 0, -1.17, 0 ], [ Math.PI, 0, 0 ], [ 1, 1, 0.001 ]],\n\t\t\t[ new THREE.Mesh( new THREE.CylinderBufferGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ 0, 1.17, 0 ], [ 0, 0, 0 ], [ 1, 1, 0.001 ]],\n\t\t],\n\t\tXYZE: [\n\t\t\t[ new THREE.Line( CircleGeometry( 1, 1 ), matLineGray ), null, [ 0, Math.PI / 2, 0 ] ]\n\t\t]\n\t};\n\n\tvar helperRotate = {\n\t\tAXIS: [\n\t\t\t[ new THREE.Line( lineGeometry, matHelper.clone() ), [ -1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t]\n\t};\n\n\tvar pickerRotate = {\n\t\tX: [\n\t\t\t[ new THREE.Mesh( new THREE.TorusBufferGeometry( 1, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, -Math.PI / 2, -Math.PI / 2 ] ],\n\t\t],\n\t\tY: [\n\t\t\t[ new THREE.Mesh( new THREE.TorusBufferGeometry( 1, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ] ],\n\t\t],\n\t\tZ: [\n\t\t\t[ new THREE.Mesh( new THREE.TorusBufferGeometry( 1, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, 0, -Math.PI / 2 ] ],\n\t\t],\n\t\tE: [\n\t\t\t[ new THREE.Mesh( new THREE.TorusBufferGeometry( 1.25, 0.1, 2, 24 ), matInvisible ) ]\n\t\t],\n\t\tXYZE: [\n\t\t\t[ new THREE.Mesh( new THREE.SphereBufferGeometry( 0.7, 10, 8 ), matInvisible ) ]\n\t\t]\n\t};\n\n\tvar gizmoScale = {\n\t\tX: [\n\t\t\t[ new THREE.Mesh( scaleHandleGeometry, matRed ), [ 0.8, 0, 0 ], [ 0, 0, -Math.PI / 2 ] ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineRed ), null, null, [ 0.8, 1, 1 ] ]\n\t\t],\n\t\tY: [\n\t\t\t[ new THREE.Mesh( scaleHandleGeometry, matGreen ), [ 0, 0.8, 0 ] ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineGreen ), null, [ 0, 0, Math.PI / 2 ], [ 0.8, 1, 1 ] ]\n\t\t],\n\t\tZ: [\n\t\t\t[ new THREE.Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, 0.8 ], [ Math.PI / 2, 0, 0 ] ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineBlue ), null, [ 0, -Math.PI / 2, 0 ], [ 0.8, 1, 1 ] ]\n\t\t],\n\t\tXY: [\n\t\t\t[ new THREE.Mesh( scaleHandleGeometry, matYellowTransparent ), [ 0.85, 0.85, 0 ], null, [ 2, 2, 0.2 ] ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineYellow ), [ 0.855, 0.98, 0 ], null, [ 0.125, 1, 1 ] ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineYellow ), [ 0.98, 0.855, 0 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ] ]\n\t\t],\n\t\tYZ: [\n\t\t\t[ new THREE.Mesh( scaleHandleGeometry, matCyanTransparent ), [ 0, 0.85, 0.85 ], null, [ 0.2, 2, 2 ] ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineCyan ), [ 0, 0.855, 0.98 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ] ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineCyan ), [ 0, 0.98, 0.855 ], [ 0, -Math.PI / 2, 0 ], [ 0.125, 1, 1 ] ]\n\t\t],\n\t\tXZ: [\n\t\t\t[ new THREE.Mesh( scaleHandleGeometry, matMagentaTransparent ), [ 0.85, 0, 0.85 ], null, [ 2, 0.2, 2 ] ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineMagenta ), [ 0.855, 0, 0.98 ], null, [ 0.125, 1, 1 ] ],\n\t\t\t[ new THREE.Line( lineGeometry, matLineMagenta ), [ 0.98, 0, 0.855 ], [ 0, -Math.PI / 2, 0 ], [ 0.125, 1, 1 ] ]\n\t\t],\n\t\tXYZX: [\n\t\t\t[ new THREE.Mesh( new THREE.BoxBufferGeometry( 0.125, 0.125, 0.125 ), matWhiteTransperent ), [ 1.1, 0, 0 ] ],\n\t\t],\n\t\tXYZY: [\n\t\t\t[ new THREE.Mesh( new THREE.BoxBufferGeometry( 0.125, 0.125, 0.125 ), matWhiteTransperent ), [ 0, 1.1, 0 ] ],\n\t\t],\n\t\tXYZZ: [\n\t\t\t[ new THREE.Mesh( new THREE.BoxBufferGeometry( 0.125, 0.125, 0.125 ), matWhiteTransperent ), [ 0, 0, 1.1 ] ],\n\t\t]\n\t};\n\n\tvar pickerScale = {\n\t\tX: [\n\t\t\t[ new THREE.Mesh( new THREE.CylinderBufferGeometry( 0.2, 0, 0.8, 4, 1, false ), matInvisible ), [ 0.5, 0, 0 ], [ 0, 0, -Math.PI / 2 ] ]\n\t\t],\n\t\tY: [\n\t\t\t[ new THREE.Mesh( new THREE.CylinderBufferGeometry( 0.2, 0, 0.8, 4, 1, false ), matInvisible ), [ 0, 0.5, 0 ] ]\n\t\t],\n\t\tZ: [\n\t\t\t[ new THREE.Mesh( new THREE.CylinderBufferGeometry( 0.2, 0, 0.8, 4, 1, false ), matInvisible ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ] ]\n\t\t],\n\t\tXY: [\n\t\t\t[ new THREE.Mesh( scaleHandleGeometry, matInvisible ), [ 0.85, 0.85, 0 ], null, [ 3, 3, 0.2 ] ],\n\t\t],\n\t\tYZ: [\n\t\t\t[ new THREE.Mesh( scaleHandleGeometry, matInvisible ), [ 0, 0.85, 0.85 ], null, [ 0.2, 3, 3 ] ],\n\t\t],\n\t\tXZ: [\n\t\t\t[ new THREE.Mesh( scaleHandleGeometry, matInvisible ), [ 0.85, 0, 0.85 ], null, [ 3, 0.2, 3 ] ],\n\t\t],\n\t\tXYZX: [\n\t\t\t[ new THREE.Mesh( new THREE.BoxBufferGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 1.1, 0, 0 ] ],\n\t\t],\n\t\tXYZY: [\n\t\t\t[ new THREE.Mesh( new THREE.BoxBufferGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 1.1, 0 ] ],\n\t\t],\n\t\tXYZZ: [\n\t\t\t[ new THREE.Mesh( new THREE.BoxBufferGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 0, 1.1 ] ],\n\t\t]\n\t};\n\n\tvar helperScale = {\n\t\tX: [\n\t\t\t[ new THREE.Line( lineGeometry, matHelper.clone() ), [ -1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t],\n\t\tY: [\n\t\t\t[ new THREE.Line( lineGeometry, matHelper.clone() ), [ 0, -1e3, 0 ], [ 0, 0, Math.PI / 2 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t],\n\t\tZ: [\n\t\t\t[ new THREE.Line( lineGeometry, matHelper.clone() ), [ 0, 0, -1e3 ], [ 0, -Math.PI / 2, 0 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t]\n\t};\n\n\t// Creates an Object3D with gizmos described in custom hierarchy definition.\n\n\tvar setupGizmo = function( gizmoMap ) {\n\n\t\tvar gizmo = new THREE.Object3D();\n\n\t\tfor ( var name in gizmoMap ) {\n\n\t\t\tfor ( var i = gizmoMap[ name ].length; i --; ) {\n\n\t\t\t\tvar object = gizmoMap[ name ][ i ][ 0 ].clone();\n\t\t\t\tvar position = gizmoMap[ name ][ i ][ 1 ];\n\t\t\t\tvar rotation = gizmoMap[ name ][ i ][ 2 ];\n\t\t\t\tvar scale = gizmoMap[ name ][ i ][ 3 ];\n\t\t\t\tvar tag = gizmoMap[ name ][ i ][ 4 ];\n\n\t\t\t\t// name and tag properties are essential for picking and updating logic.\n\t\t\t\tobject.name = name;\n\t\t\t\tobject.tag = tag;\n\n\t\t\t\tif (position) {\n\t\t\t\t\tobject.position.set(position[ 0 ], position[ 1 ], position[ 2 ]);\n\t\t\t\t}\n\t\t\t\tif (rotation) {\n\t\t\t\t\tobject.rotation.set(rotation[ 0 ], rotation[ 1 ], rotation[ 2 ]);\n\t\t\t\t}\n\t\t\t\tif (scale) {\n\t\t\t\t\tobject.scale.set(scale[ 0 ], scale[ 1 ], scale[ 2 ]);\n\t\t\t\t}\n\n\t\t\t\tobject.updateMatrix();\n\n\t\t\t\tvar tempGeometry = object.geometry.clone();\n\t\t\t\ttempGeometry.applyMatrix(object.matrix);\n\t\t\t\tobject.geometry = tempGeometry;\n\n\t\t\t\tobject.position.set( 0, 0, 0 );\n\t\t\t\tobject.rotation.set( 0, 0, 0 );\n\t\t\t\tobject.scale.set(1, 1, 1);\n\n\t\t\t\tgizmo.add(object);\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn gizmo;\n\n\t};\n\n\t// Reusable utility variables\n\n\tvar tempVector = new THREE.Vector3( 0, 0, 0 );\n\tvar tempEuler = new THREE.Euler();\n\tvar alignVector = new THREE.Vector3( 0, 1, 0 );\n\tvar zeroVector = new THREE.Vector3( 0, 0, 0 );\n\tvar lookAtMatrix = new THREE.Matrix4();\n\tvar tempQuaternion = new THREE.Quaternion();\n\tvar tempQuaternion2 = new THREE.Quaternion();\n\tvar identityQuaternion = new THREE.Quaternion();\n\n\tvar unitX = new THREE.Vector3( 1, 0, 0 );\n\tvar unitY = new THREE.Vector3( 0, 1, 0 );\n\tvar unitZ = new THREE.Vector3( 0, 0, 1 );\n\n\t// Gizmo creation\n\n\tthis.gizmo = {};\n\tthis.picker = {};\n\tthis.helper = {};\n\n\tthis.add( this.gizmo[ \"translate\" ] = setupGizmo( gizmoTranslate ) );\n\tthis.add( this.gizmo[ \"rotate\" ] = setupGizmo( gizmoRotate ) );\n\tthis.add( this.gizmo[ \"scale\" ] = setupGizmo( gizmoScale ) );\n\tthis.add( this.picker[ \"translate\" ] = setupGizmo( pickerTranslate ) );\n\tthis.add( this.picker[ \"rotate\" ] = setupGizmo( pickerRotate ) );\n\tthis.add( this.picker[ \"scale\" ] = setupGizmo( pickerScale ) );\n\tthis.add( this.helper[ \"translate\" ] = setupGizmo( helperTranslate ) );\n\tthis.add( this.helper[ \"rotate\" ] = setupGizmo( helperRotate ) );\n\tthis.add( this.helper[ \"scale\" ] = setupGizmo( helperScale ) );\n\n\t// Pickers should be hidden always\n\n\tthis.picker[ \"translate\" ].visible = false;\n\tthis.picker[ \"rotate\" ].visible = false;\n\tthis.picker[ \"scale\" ].visible = false;\n\n\t// updateMatrixWorld will update transformations and appearance of individual handles\n\n\tthis.updateMatrixWorld = function () {\n\n\t\tvar space = this.space;\n\n\t\tif ( this.mode === 'scale' ) space = 'local'; // scale always oriented to local rotation\n\n\t\tvar quaternion = space === \"local\" ? this.worldQuaternion : identityQuaternion;\n\n\t\t// Show only gizmos for current transform mode\n\n\t\tthis.gizmo[ \"translate\" ].visible = this.mode === \"translate\";\n\t\tthis.gizmo[ \"rotate\" ].visible = this.mode === \"rotate\";\n\t\tthis.gizmo[ \"scale\" ].visible = this.mode === \"scale\";\n\n\t\tthis.helper[ \"translate\" ].visible = this.mode === \"translate\";\n\t\tthis.helper[ \"rotate\" ].visible = this.mode === \"rotate\";\n\t\tthis.helper[ \"scale\" ].visible = this.mode === \"scale\";\n\n\n\t\tvar handles = [];\n\t\thandles = handles.concat( this.picker[ this.mode ].children );\n\t\thandles = handles.concat( this.gizmo[ this.mode ].children );\n\t\thandles = handles.concat( this.helper[ this.mode ].children );\n\n\t\tfor ( var i = 0; i < handles.length; i++ ) {\n\n\t\t\tvar handle = handles[i];\n\n\t\t\t// hide aligned to camera\n\n\t\t\thandle.visible = true;\n\t\t\thandle.rotation.set( 0, 0, 0 );\n\t\t\thandle.position.copy( this.worldPosition );\n\n\t\t\tvar eyeDistance = this.worldPosition.distanceTo( this.cameraPosition);\n\t\t\thandle.scale.set( 1, 1, 1 ).multiplyScalar( eyeDistance * this.size / 7 );\n\n\t\t\t// TODO: simplify helpers and consider decoupling from gizmo\n\n\t\t\tif ( handle.tag === 'helper' ) {\n\n\t\t\t\thandle.visible = false;\n\n\t\t\t\tif ( handle.name === 'AXIS' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\t\t\t\t\thandle.visible = !!this.axis;\n\n\t\t\t\t\tif ( this.axis === 'X' ) {\n\n\t\t\t\t\t\ttempQuaternion.setFromEuler( tempEuler.set( 0, 0, 0 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( alignVector.copy( unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\t\t\t\t\t\t\thandle.visible = false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'Y' ) {\n\n\t\t\t\t\t\ttempQuaternion.setFromEuler( tempEuler.set( 0, 0, Math.PI / 2 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( alignVector.copy( unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\t\t\t\t\t\t\thandle.visible = false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'Z' ) {\n\n\t\t\t\t\t\ttempQuaternion.setFromEuler( tempEuler.set( 0, Math.PI / 2, 0 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( alignVector.copy( unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\t\t\t\t\t\t\thandle.visible = false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'XYZE' ) {\n\n\t\t\t\t\t\ttempQuaternion.setFromEuler( tempEuler.set( 0, Math.PI / 2, 0 ) );\n\t\t\t\t\t\talignVector.copy( this.rotationAxis );\n\t\t\t\t\t\thandle.quaternion.setFromRotationMatrix( lookAtMatrix.lookAt( zeroVector, alignVector, unitY ) );\n\t\t\t\t\t\thandle.quaternion.multiply( tempQuaternion );\n\t\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'E' ) {\n\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else if ( handle.name === 'START' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else if ( handle.name === 'END' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPosition );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else if ( handle.name === 'DELTA' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\t\t\t\t\thandle.quaternion.copy( this.worldQuaternionStart );\n\t\t\t\t\ttempVector.set( 1e-10, 1e-10, 1e-10 ).add( this.worldPositionStart ).sub( this.worldPosition ).multiplyScalar( -1 );\n\t\t\t\t\ttempVector.applyQuaternion( this.worldQuaternionStart.clone().inverse() );\n\t\t\t\t\thandle.scale.copy( tempVector );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thandle.quaternion.copy( quaternion );\n\n\t\t\t\t\tif ( this.dragging ) {\n\n\t\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\thandle.position.copy( this.worldPosition );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis ) {\n\n\t\t\t\t\t\thandle.visible = this.axis.search( handle.name ) !== -1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// If updating helper, skip rest of the loop\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// Align handles to current local or world rotation\n\n\t\t\thandle.quaternion.copy( quaternion );\n\n\t\t\tif ( this.mode === 'translate' || this.mode === 'scale' ) {\n\n\t\t\t\t// Hide translate and scale axis facing the camera\n\n\t\t\t\tvar AXIS_HIDE_TRESHOLD = 0.99;\n\t\t\t\tvar PLANE_HIDE_TRESHOLD = 0.2;\n\t\t\t\tvar AXIS_FLIP_TRESHOLD = -0.4;\n\n\n\t\t\t\tif ( handle.name === 'X' || handle.name === 'XYZX' ) {\n\t\t\t\t\tif ( Math.abs( alignVector.copy( unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) {\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( handle.name === 'Y' || handle.name === 'XYZY' ) {\n\t\t\t\t\tif ( Math.abs( alignVector.copy( unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) {\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( handle.name === 'Z' || handle.name === 'XYZZ' ) {\n\t\t\t\t\tif ( Math.abs( alignVector.copy( unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_TRESHOLD ) {\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( handle.name === 'XY' ) {\n\t\t\t\t\tif ( Math.abs( alignVector.copy( unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_TRESHOLD ) {\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( handle.name === 'YZ' ) {\n\t\t\t\t\tif ( Math.abs( alignVector.copy( unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_TRESHOLD ) {\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( handle.name === 'XZ' ) {\n\t\t\t\t\tif ( Math.abs( alignVector.copy( unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_TRESHOLD ) {\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Flip translate and scale axis ocluded behind another axis\n\n\t\t\t\tif ( handle.name.search( 'X' ) !== -1 ) {\n\t\t\t\t\tif ( alignVector.copy( unitX ).applyQuaternion( quaternion ).dot( this.eye ) < AXIS_FLIP_TRESHOLD ) {\n\t\t\t\t\t\tif ( handle.tag === 'fwd' ) {\n\t\t\t\t\t\t\thandle.visible = false;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thandle.scale.x *= -1;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( handle.tag === 'bwd' ) {\n\t\t\t\t\t\thandle.visible = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name.search( 'Y' ) !== -1 ) {\n\t\t\t\t\tif ( alignVector.copy( unitY ).applyQuaternion( quaternion ).dot( this.eye ) < AXIS_FLIP_TRESHOLD ) {\n\t\t\t\t\t\tif ( handle.tag === 'fwd' ) {\n\t\t\t\t\t\t\thandle.visible = false;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thandle.scale.y *= -1;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( handle.tag === 'bwd' ) {\n\t\t\t\t\t\thandle.visible = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name.search( 'Z' ) !== -1 ) {\n\t\t\t\t\tif ( alignVector.copy( unitZ ).applyQuaternion( quaternion ).dot( this.eye ) < AXIS_FLIP_TRESHOLD ) {\n\t\t\t\t\t\tif ( handle.tag === 'fwd' ) {\n\t\t\t\t\t\t\thandle.visible = false;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thandle.scale.z *= -1;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( handle.tag === 'bwd' ) {\n\t\t\t\t\t\thandle.visible = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t} else if ( this.mode === 'rotate' ) {\n\n\t\t\t\t// Align handles to current local or world rotation\n\n\t\t\t\ttempQuaternion2.copy( quaternion );\n\t\t\t\talignVector.copy( this.eye ).applyQuaternion( tempQuaternion.copy( quaternion ).inverse() );\n\n\t\t\t\tif ( handle.name.search( \"E\" ) !== - 1 ) {\n\n\t\t\t\t\thandle.quaternion.setFromRotationMatrix( lookAtMatrix.lookAt( this.eye, zeroVector, unitY ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'X' ) {\n\n\t\t\t\t\ttempQuaternion.setFromAxisAngle( unitX, Math.atan2( -alignVector.y, alignVector.z ) );\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion2, tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Y' ) {\n\n\t\t\t\t\ttempQuaternion.setFromAxisAngle( unitY, Math.atan2( alignVector.x, alignVector.z ) );\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion2, tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Z' ) {\n\n\t\t\t\t\ttempQuaternion.setFromAxisAngle( unitZ, Math.atan2( alignVector.y, alignVector.x ) );\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion2, tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Hide disabled axes\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( \"X\" ) === -1 || this.showX );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( \"Y\" ) === -1 || this.showY );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( \"Z\" ) === -1 || this.showZ );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( \"E\" ) === -1 || ( this.showX && this.showY && this.showZ ) );\n\n\t\t\t// highlight selected axis\n\n\t\t\thandle.material._opacity = handle.material._opacity || handle.material.opacity;\n\t\t\thandle.material._color = handle.material._color || handle.material.color.clone();\n\n\t\t\thandle.material.color.copy( handle.material._color );\n\t\t\thandle.material.opacity = handle.material._opacity;\n\n\t\t\tif ( !this.enabled ) {\n\n\t\t\t\thandle.material.opacity *= 0.5;\n\t\t\t\thandle.material.color.lerp( new THREE.Color( 1, 1, 1 ), 0.5 );\n\n\t\t\t} else if ( this.axis ) {\n\n\t\t\t\tif ( handle.name === this.axis ) {\n\n\t\t\t\t\thandle.material.opacity = 1.0;\n\t\t\t\t\thandle.material.color.lerp( new THREE.Color( 1, 1, 1 ), 0.5 );\n\n\t\t\t\t} else if ( this.axis.split('').some( function( a ) { return handle.name === a; } ) ) {\n\n\t\t\t\t\thandle.material.opacity = 1.0;\n\t\t\t\t\thandle.material.color.lerp( new THREE.Color( 1, 1, 1 ), 0.5 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\thandle.material.opacity *= 0.25;\n\t\t\t\t\thandle.material.color.lerp( new THREE.Color( 1, 1, 1 ), 0.5 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tTHREE.Object3D.prototype.updateMatrixWorld.call( this );\n\n\t};\n\n};\n\nTHREE.TransformControlsGizmo.prototype = Object.assign( Object.create( THREE.Object3D.prototype ), {\n\n\tconstructor: THREE.TransformControlsGizmo,\n\n\tisTransformControlsGizmo: true\n\n} );\n\n\nTHREE.TransformControlsPlane = function () {\n\n\t'use strict';\n\n\tTHREE.Mesh.call( this,\n\t\tnew THREE.PlaneBufferGeometry( 100000, 100000, 2, 2 ),\n\t\tnew THREE.MeshBasicMaterial( { visible: false, wireframe: true, side: THREE.DoubleSide, transparent: true, opacity: 0.1 } )\n\t);\n\n\tthis.type = 'TransformControlsPlane';\n\n\tvar unitX = new THREE.Vector3( 1, 0, 0 );\n\tvar unitY = new THREE.Vector3( 0, 1, 0 );\n\tvar unitZ = new THREE.Vector3( 0, 0, 1 );\n\n\tvar tempVector = new THREE.Vector3();\n\tvar dirVector = new THREE.Vector3();\n\tvar alignVector = new THREE.Vector3();\n\tvar tempMatrix = new THREE.Matrix4();\n\tvar identityQuaternion = new THREE.Quaternion();\n\n\tthis.updateMatrixWorld = function() {\n\n\t\tvar space = this.space;\n\n\t\tthis.position.copy( this.worldPosition );\n\n\t\tif ( this.mode === 'scale' ) space = 'local'; // scale always oriented to local rotation\n\n\t\tunitX.set( 1, 0, 0 ).applyQuaternion( space === \"local\" ? this.worldQuaternion : identityQuaternion );\n\t\tunitY.set( 0, 1, 0 ).applyQuaternion( space === \"local\" ? this.worldQuaternion : identityQuaternion );\n\t\tunitZ.set( 0, 0, 1 ).applyQuaternion( space === \"local\" ? this.worldQuaternion : identityQuaternion );\n\n\t\t// Align the plane for current transform mode, axis and space.\n\n\t\talignVector.copy( unitY );\n\n\t\tswitch ( this.mode ) {\n\t\t\tcase 'translate':\n\t\t\tcase 'scale':\n\t\t\t\tswitch ( this.axis ) {\n\t\t\t\t\tcase 'X':\n\t\t\t\t\t\talignVector.copy( this.eye ).cross( unitX );\n\t\t\t\t\t\tdirVector.copy( unitX ).cross( alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Y':\n\t\t\t\t\t\talignVector.copy( this.eye ).cross( unitY );\n\t\t\t\t\t\tdirVector.copy( unitY ).cross( alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Z':\n\t\t\t\t\t\talignVector.copy( this.eye ).cross( unitZ );\n\t\t\t\t\t\tdirVector.copy( unitZ ).cross( alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XY':\n\t\t\t\t\t\tdirVector.copy( unitZ );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'YZ':\n\t\t\t\t\t\tdirVector.copy( unitX );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XZ':\n\t\t\t\t\t\talignVector.copy( unitZ );\n\t\t\t\t\t\tdirVector.copy( unitY );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XYZ':\n\t\t\t\t\tcase 'E':\n\t\t\t\t\t\tdirVector.set( 0, 0, 0 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'rotate':\n\t\t\tdefault:\n\t\t\t\t// special case for rotate\n\t\t\t\tdirVector.set( 0, 0, 0 );\n\t\t}\n\n\t\tif ( dirVector.length() === 0 ) {\n\n\t\t\t// If in rotate mode, make the plane parallel to camera\n\t\t\tthis.quaternion.copy( this.cameraQuaternion );\n\n\t\t} else {\n\n\t\t\ttempMatrix.lookAt( tempVector.set( 0, 0, 0 ), dirVector, alignVector );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( tempMatrix );\n\n\t\t}\n\n\t\tTHREE.Object3D.prototype.updateMatrixWorld.call( this );\n\n\t};\n\n};\n\nTHREE.TransformControlsPlane.prototype = Object.assign( Object.create( THREE.Mesh.prototype ), {\n\n\tconstructor: THREE.TransformControlsPlane,\n\n\tisTransformControlsPlane: true\n\n} );\n\nTHREE.TransformControls.prototype = Object.create(THREE.Object3D.prototype);\nTHREE.TransformControls.prototype.constructor = THREE.TransformControls;\n\nmodule.exports = THREE.TransformControls;\n","/**\n * @author mpk / http://polko.me/\n *\n * WebGL port of Subpixel Morphological Antialiasing (SMAA) v2.8\n * Preset: SMAA 1x Medium (with color edge detection)\n * https://github.com/iryoku/smaa/releases/tag/v2.8\n */\n\nvar THREE = require('three');\n\n\nTHREE.SMAAShader = [ {\n\n\tdefines: {\n\n\t\t\"SMAA_THRESHOLD\": \"0.1\"\n\n\t},\n\n\tuniforms: {\n\n\t\t\"tDiffuse\":\t\t{ value: null },\n\t\t\"resolution\":\t{ value: new THREE.Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"uniform vec2 resolution;\",\n\n\t\t\"varying vec2 vUv;\",\n\t\t\"varying vec4 vOffset[ 3 ];\",\n\n\t\t\"void SMAAEdgeDetectionVS( vec2 texcoord ) {\",\n\t\t\t\"vOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -1.0, 0.0, 0.0, 1.0 );\", // WebGL port note: Changed sign in W component\n\t\t\t\"vOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( 1.0, 0.0, 0.0, -1.0 );\", // WebGL port note: Changed sign in W component\n\t\t\t\"vOffset[ 2 ] = texcoord.xyxy + resolution.xyxy * vec4( -2.0, 0.0, 0.0, 2.0 );\", // WebGL port note: Changed sign in W component\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\n\t\t\t\"SMAAEdgeDetectionVS( vUv );\",\n\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\n\t\t\"varying vec2 vUv;\",\n\t\t\"varying vec4 vOffset[ 3 ];\",\n\n\t\t\"vec4 SMAAColorEdgeDetectionPS( vec2 texcoord, vec4 offset[3], sampler2D colorTex ) {\",\n\t\t\t\"vec2 threshold = vec2( SMAA_THRESHOLD, SMAA_THRESHOLD );\",\n\n\t\t\t// Calculate color deltas:\n\t\t\t\"vec4 delta;\",\n\t\t\t\"vec3 C = texture2D( colorTex, texcoord ).rgb;\",\n\n\t\t\t\"vec3 Cleft = texture2D( colorTex, offset[0].xy ).rgb;\",\n\t\t\t\"vec3 t = abs( C - Cleft );\",\n\t\t\t\"delta.x = max( max( t.r, t.g ), t.b );\",\n\n\t\t\t\"vec3 Ctop = texture2D( colorTex, offset[0].zw ).rgb;\",\n\t\t\t\"t = abs( C - Ctop );\",\n\t\t\t\"delta.y = max( max( t.r, t.g ), t.b );\",\n\n\t\t\t// We do the usual threshold:\n\t\t\t\"vec2 edges = step( threshold, delta.xy );\",\n\n\t\t\t// Then discard if there is no edge:\n\t\t\t\"if ( dot( edges, vec2( 1.0, 1.0 ) ) == 0.0 )\",\n\t\t\t\t\"discard;\",\n\n\t\t\t// Calculate right and bottom deltas:\n\t\t\t\"vec3 Cright = texture2D( colorTex, offset[1].xy ).rgb;\",\n\t\t\t\"t = abs( C - Cright );\",\n\t\t\t\"delta.z = max( max( t.r, t.g ), t.b );\",\n\n\t\t\t\"vec3 Cbottom = texture2D( colorTex, offset[1].zw ).rgb;\",\n\t\t\t\"t = abs( C - Cbottom );\",\n\t\t\t\"delta.w = max( max( t.r, t.g ), t.b );\",\n\n\t\t\t// Calculate the maximum delta in the direct neighborhood:\n\t\t\t\"float maxDelta = max( max( max( delta.x, delta.y ), delta.z ), delta.w );\",\n\n\t\t\t// Calculate left-left and top-top deltas:\n\t\t\t\"vec3 Cleftleft = texture2D( colorTex, offset[2].xy ).rgb;\",\n\t\t\t\"t = abs( C - Cleftleft );\",\n\t\t\t\"delta.z = max( max( t.r, t.g ), t.b );\",\n\n\t\t\t\"vec3 Ctoptop = texture2D( colorTex, offset[2].zw ).rgb;\",\n\t\t\t\"t = abs( C - Ctoptop );\",\n\t\t\t\"delta.w = max( max( t.r, t.g ), t.b );\",\n\n\t\t\t// Calculate the final maximum delta:\n\t\t\t\"maxDelta = max( max( maxDelta, delta.z ), delta.w );\",\n\n\t\t\t// Local contrast adaptation in action:\n\t\t\t\"edges.xy *= step( 0.5 * maxDelta, delta.xy );\",\n\n\t\t\t\"return vec4( edges, 0.0, 0.0 );\",\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"gl_FragColor = SMAAColorEdgeDetectionPS( vUv, vOffset, tDiffuse );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n}, {\n\n\tdefines: {\n\n\t\t\"SMAA_MAX_SEARCH_STEPS\":\t\t\"8\",\n\t\t\"SMAA_AREATEX_MAX_DISTANCE\":\t\"16\",\n\t\t\"SMAA_AREATEX_PIXEL_SIZE\":\t\t\"( 1.0 / vec2( 160.0, 560.0 ) )\",\n\t\t\"SMAA_AREATEX_SUBTEX_SIZE\":\t\t\"( 1.0 / 7.0 )\"\n\n\t},\n\n\tuniforms: {\n\n\t\t\"tDiffuse\":\t\t{ value: null },\n\t\t\"tArea\":\t\t{ value: null },\n\t\t\"tSearch\":\t\t{ value: null },\n\t\t\"resolution\":\t{ value: new THREE.Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"uniform vec2 resolution;\",\n\n\t\t\"varying vec2 vUv;\",\n\t\t\"varying vec4 vOffset[ 3 ];\",\n\t\t\"varying vec2 vPixcoord;\",\n\n\t\t\"void SMAABlendingWeightCalculationVS( vec2 texcoord ) {\",\n\t\t\t\"vPixcoord = texcoord / resolution;\",\n\n\t\t\t// We will use these offsets for the searches later on (see @PSEUDO_GATHER4):\n\t\t\t\"vOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -0.25, 0.125, 1.25, 0.125 );\", // WebGL port note: Changed sign in Y and W components\n\t\t\t\"vOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( -0.125, 0.25, -0.125, -1.25 );\", // WebGL port note: Changed sign in Y and W components\n\n\t\t\t// And these for the searches, they indicate the ends of the loops:\n\t\t\t\"vOffset[ 2 ] = vec4( vOffset[ 0 ].xz, vOffset[ 1 ].yw ) + vec4( -2.0, 2.0, -2.0, 2.0 ) * resolution.xxyy * float( SMAA_MAX_SEARCH_STEPS );\",\n\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\n\t\t\t\"SMAABlendingWeightCalculationVS( vUv );\",\n\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"#define SMAASampleLevelZeroOffset( tex, coord, offset ) texture2D( tex, coord + float( offset ) * resolution, 0.0 )\",\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"uniform sampler2D tArea;\",\n\t\t\"uniform sampler2D tSearch;\",\n\t\t\"uniform vec2 resolution;\",\n\n\t\t\"varying vec2 vUv;\",\n\t\t\"varying vec4 vOffset[3];\",\n\t\t\"varying vec2 vPixcoord;\",\n\n\t\t\"vec2 round( vec2 x ) {\",\n\t\t\t\"return sign( x ) * floor( abs( x ) + 0.5 );\",\n\t\t\"}\",\n\n\t\t\"float SMAASearchLength( sampler2D searchTex, vec2 e, float bias, float scale ) {\",\n\t\t\t// Not required if searchTex accesses are set to point:\n\t\t\t// float2 SEARCH_TEX_PIXEL_SIZE = 1.0 / float2(66.0, 33.0);\n\t\t\t// e = float2(bias, 0.0) + 0.5 * SEARCH_TEX_PIXEL_SIZE +\n\t\t\t// e * float2(scale, 1.0) * float2(64.0, 32.0) * SEARCH_TEX_PIXEL_SIZE;\n\t\t\t\"e.r = bias + e.r * scale;\",\n\t\t\t\"return 255.0 * texture2D( searchTex, e, 0.0 ).r;\",\n\t\t\"}\",\n\n\t\t\"float SMAASearchXLeft( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\",\n\t\t\t/**\n\t\t\t* @PSEUDO_GATHER4\n\t\t\t* This texcoord has been offset by (-0.25, -0.125) in the vertex shader to\n\t\t\t* sample between edge, thus fetching four edges in a row.\n\t\t\t* Sampling with different offsets in each direction allows to disambiguate\n\t\t\t* which edges are active from the four fetched ones.\n\t\t\t*/\n\t\t\t\"vec2 e = vec2( 0.0, 1.0 );\",\n\n\t\t\t\"for ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) {\", // WebGL port note: Changed while to for\n\t\t\t\t\"e = texture2D( edgesTex, texcoord, 0.0 ).rg;\",\n\t\t\t\t\"texcoord -= vec2( 2.0, 0.0 ) * resolution;\",\n\t\t\t\t\"if ( ! ( texcoord.x > end && e.g > 0.8281 && e.r == 0.0 ) ) break;\",\n\t\t\t\"}\",\n\n\t\t\t// We correct the previous (-0.25, -0.125) offset we applied:\n\t\t\t\"texcoord.x += 0.25 * resolution.x;\",\n\n\t\t\t// The searches are bias by 1, so adjust the coords accordingly:\n\t\t\t\"texcoord.x += resolution.x;\",\n\n\t\t\t// Disambiguate the length added by the last step:\n\t\t\t\"texcoord.x += 2.0 * resolution.x;\", // Undo last step\n\t\t\t\"texcoord.x -= resolution.x * SMAASearchLength(searchTex, e, 0.0, 0.5);\",\n\n\t\t\t\"return texcoord.x;\",\n\t\t\"}\",\n\n\t\t\"float SMAASearchXRight( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\",\n\t\t\t\"vec2 e = vec2( 0.0, 1.0 );\",\n\n\t\t\t\"for ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) {\", // WebGL port note: Changed while to for\n\t\t\t\t\"e = texture2D( edgesTex, texcoord, 0.0 ).rg;\",\n\t\t\t\t\"texcoord += vec2( 2.0, 0.0 ) * resolution;\",\n\t\t\t\t\"if ( ! ( texcoord.x < end && e.g > 0.8281 && e.r == 0.0 ) ) break;\",\n\t\t\t\"}\",\n\n\t\t\t\"texcoord.x -= 0.25 * resolution.x;\",\n\t\t\t\"texcoord.x -= resolution.x;\",\n\t\t\t\"texcoord.x -= 2.0 * resolution.x;\",\n\t\t\t\"texcoord.x += resolution.x * SMAASearchLength( searchTex, e, 0.5, 0.5 );\",\n\n\t\t\t\"return texcoord.x;\",\n\t\t\"}\",\n\n\t\t\"float SMAASearchYUp( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\",\n\t\t\t\"vec2 e = vec2( 1.0, 0.0 );\",\n\n\t\t\t\"for ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) {\", // WebGL port note: Changed while to for\n\t\t\t\t\"e = texture2D( edgesTex, texcoord, 0.0 ).rg;\",\n\t\t\t\t\"texcoord += vec2( 0.0, 2.0 ) * resolution;\", // WebGL port note: Changed sign\n\t\t\t\t\"if ( ! ( texcoord.y > end && e.r > 0.8281 && e.g == 0.0 ) ) break;\",\n\t\t\t\"}\",\n\n\t\t\t\"texcoord.y -= 0.25 * resolution.y;\", // WebGL port note: Changed sign\n\t\t\t\"texcoord.y -= resolution.y;\", // WebGL port note: Changed sign\n\t\t\t\"texcoord.y -= 2.0 * resolution.y;\", // WebGL port note: Changed sign\n\t\t\t\"texcoord.y += resolution.y * SMAASearchLength( searchTex, e.gr, 0.0, 0.5 );\", // WebGL port note: Changed sign\n\n\t\t\t\"return texcoord.y;\",\n\t\t\"}\",\n\n\t\t\"float SMAASearchYDown( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\",\n\t\t\t\"vec2 e = vec2( 1.0, 0.0 );\",\n\n\t\t\t\"for ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) {\", // WebGL port note: Changed while to for\n\t\t\t\t\"e = texture2D( edgesTex, texcoord, 0.0 ).rg;\",\n\t\t\t\t\"texcoord -= vec2( 0.0, 2.0 ) * resolution;\", // WebGL port note: Changed sign\n\t\t\t\t\"if ( ! ( texcoord.y < end && e.r > 0.8281 && e.g == 0.0 ) ) break;\",\n\t\t\t\"}\",\n\n\t\t\t\"texcoord.y += 0.25 * resolution.y;\", // WebGL port note: Changed sign\n\t\t\t\"texcoord.y += resolution.y;\", // WebGL port note: Changed sign\n\t\t\t\"texcoord.y += 2.0 * resolution.y;\", // WebGL port note: Changed sign\n\t\t\t\"texcoord.y -= resolution.y * SMAASearchLength( searchTex, e.gr, 0.5, 0.5 );\", // WebGL port note: Changed sign\n\n\t\t\t\"return texcoord.y;\",\n\t\t\"}\",\n\n\t\t\"vec2 SMAAArea( sampler2D areaTex, vec2 dist, float e1, float e2, float offset ) {\",\n\t\t\t// Rounding prevents precision errors of bilinear filtering:\n\t\t\t\"vec2 texcoord = float( SMAA_AREATEX_MAX_DISTANCE ) * round( 4.0 * vec2( e1, e2 ) ) + dist;\",\n\n\t\t\t// We do a scale and bias for mapping to texel space:\n\t\t\t\"texcoord = SMAA_AREATEX_PIXEL_SIZE * texcoord + ( 0.5 * SMAA_AREATEX_PIXEL_SIZE );\",\n\n\t\t\t// Move to proper place, according to the subpixel offset:\n\t\t\t\"texcoord.y += SMAA_AREATEX_SUBTEX_SIZE * offset;\",\n\n\t\t\t\"return texture2D( areaTex, texcoord, 0.0 ).rg;\",\n\t\t\"}\",\n\n\t\t\"vec4 SMAABlendingWeightCalculationPS( vec2 texcoord, vec2 pixcoord, vec4 offset[ 3 ], sampler2D edgesTex, sampler2D areaTex, sampler2D searchTex, ivec4 subsampleIndices ) {\",\n\t\t\t\"vec4 weights = vec4( 0.0, 0.0, 0.0, 0.0 );\",\n\n\t\t\t\"vec2 e = texture2D( edgesTex, texcoord ).rg;\",\n\n\t\t\t\"if ( e.g > 0.0 ) {\", // Edge at north\n\t\t\t\t\"vec2 d;\",\n\n\t\t\t\t// Find the distance to the left:\n\t\t\t\t\"vec2 coords;\",\n\t\t\t\t\"coords.x = SMAASearchXLeft( edgesTex, searchTex, offset[ 0 ].xy, offset[ 2 ].x );\",\n\t\t\t\t\"coords.y = offset[ 1 ].y;\", // offset[1].y = texcoord.y - 0.25 * resolution.y (@CROSSING_OFFSET)\n\t\t\t\t\"d.x = coords.x;\",\n\n\t\t\t\t// Now fetch the left crossing edges, two at a time using bilinear\n\t\t\t\t// filtering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to\n\t\t\t\t// discern what value each edge has:\n\t\t\t\t\"float e1 = texture2D( edgesTex, coords, 0.0 ).r;\",\n\n\t\t\t\t// Find the distance to the right:\n\t\t\t\t\"coords.x = SMAASearchXRight( edgesTex, searchTex, offset[ 0 ].zw, offset[ 2 ].y );\",\n\t\t\t\t\"d.y = coords.x;\",\n\n\t\t\t\t// We want the distances to be in pixel units (doing this here allow to\n\t\t\t\t// better interleave arithmetic and memory accesses):\n\t\t\t\t\"d = d / resolution.x - pixcoord.x;\",\n\n\t\t\t\t// SMAAArea below needs a sqrt, as the areas texture is compressed\n\t\t\t\t// quadratically:\n\t\t\t\t\"vec2 sqrt_d = sqrt( abs( d ) );\",\n\n\t\t\t\t// Fetch the right crossing edges:\n\t\t\t\t\"coords.y -= 1.0 * resolution.y;\", // WebGL port note: Added\n\t\t\t\t\"float e2 = SMAASampleLevelZeroOffset( edgesTex, coords, ivec2( 1, 0 ) ).r;\",\n\n\t\t\t\t// Ok, we know how this pattern looks like, now it is time for getting\n\t\t\t\t// the actual area:\n\t\t\t\t\"weights.rg = SMAAArea( areaTex, sqrt_d, e1, e2, float( subsampleIndices.y ) );\",\n\t\t\t\"}\",\n\n\t\t\t\"if ( e.r > 0.0 ) {\", // Edge at west\n\t\t\t\t\"vec2 d;\",\n\n\t\t\t\t// Find the distance to the top:\n\t\t\t\t\"vec2 coords;\",\n\n\t\t\t\t\"coords.y = SMAASearchYUp( edgesTex, searchTex, offset[ 1 ].xy, offset[ 2 ].z );\",\n\t\t\t\t\"coords.x = offset[ 0 ].x;\", // offset[1].x = texcoord.x - 0.25 * resolution.x;\n\t\t\t\t\"d.x = coords.y;\",\n\n\t\t\t\t// Fetch the top crossing edges:\n\t\t\t\t\"float e1 = texture2D( edgesTex, coords, 0.0 ).g;\",\n\n\t\t\t\t// Find the distance to the bottom:\n\t\t\t\t\"coords.y = SMAASearchYDown( edgesTex, searchTex, offset[ 1 ].zw, offset[ 2 ].w );\",\n\t\t\t\t\"d.y = coords.y;\",\n\n\t\t\t\t// We want the distances to be in pixel units:\n\t\t\t\t\"d = d / resolution.y - pixcoord.y;\",\n\n\t\t\t\t// SMAAArea below needs a sqrt, as the areas texture is compressed\n\t\t\t\t// quadratically:\n\t\t\t\t\"vec2 sqrt_d = sqrt( abs( d ) );\",\n\n\t\t\t\t// Fetch the bottom crossing edges:\n\t\t\t\t\"coords.y -= 1.0 * resolution.y;\", // WebGL port note: Added\n\t\t\t\t\"float e2 = SMAASampleLevelZeroOffset( edgesTex, coords, ivec2( 0, 1 ) ).g;\",\n\n\t\t\t\t// Get the area for this direction:\n\t\t\t\t\"weights.ba = SMAAArea( areaTex, sqrt_d, e1, e2, float( subsampleIndices.x ) );\",\n\t\t\t\"}\",\n\n\t\t\t\"return weights;\",\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"gl_FragColor = SMAABlendingWeightCalculationPS( vUv, vPixcoord, vOffset, tDiffuse, tArea, tSearch, ivec4( 0.0 ) );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n}, {\n\n\tuniforms: {\n\n\t\t\"tDiffuse\":\t\t{ value: null },\n\t\t\"tColor\":\t\t{ value: null },\n\t\t\"resolution\":\t{ value: new THREE.Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: [\n\n\t\t\"uniform vec2 resolution;\",\n\n\t\t\"varying vec2 vUv;\",\n\t\t\"varying vec4 vOffset[ 2 ];\",\n\n\t\t\"void SMAANeighborhoodBlendingVS( vec2 texcoord ) {\",\n\t\t\t\"vOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -1.0, 0.0, 0.0, 1.0 );\", // WebGL port note: Changed sign in W component\n\t\t\t\"vOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( 1.0, 0.0, 0.0, -1.0 );\", // WebGL port note: Changed sign in W component\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"vUv = uv;\",\n\n\t\t\t\"SMAANeighborhoodBlendingVS( vUv );\",\n\n\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\"),\n\n\tfragmentShader: [\n\n\t\t\"uniform sampler2D tDiffuse;\",\n\t\t\"uniform sampler2D tColor;\",\n\t\t\"uniform vec2 resolution;\",\n\n\t\t\"varying vec2 vUv;\",\n\t\t\"varying vec4 vOffset[ 2 ];\",\n\n\t\t\"vec4 SMAANeighborhoodBlendingPS( vec2 texcoord, vec4 offset[ 2 ], sampler2D colorTex, sampler2D blendTex ) {\",\n\t\t\t// Fetch the blending weights for current pixel:\n\t\t\t\"vec4 a;\",\n\t\t\t\"a.xz = texture2D( blendTex, texcoord ).xz;\",\n\t\t\t\"a.y = texture2D( blendTex, offset[ 1 ].zw ).g;\",\n\t\t\t\"a.w = texture2D( blendTex, offset[ 1 ].xy ).a;\",\n\n\t\t\t// Is there any blending weight with a value greater than 0.0?\n\t\t\t\"if ( dot(a, vec4( 1.0, 1.0, 1.0, 1.0 )) < 1e-5 ) {\",\n\t\t\t\t\"return texture2D( colorTex, texcoord, 0.0 );\",\n\t\t\t\"} else {\",\n\t\t\t\t// Up to 4 lines can be crossing a pixel (one through each edge). We\n\t\t\t\t// favor blending by choosing the line with the maximum weight for each\n\t\t\t\t// direction:\n\t\t\t\t\"vec2 offset;\",\n\t\t\t\t\"offset.x = a.a > a.b ? a.a : -a.b;\", // left vs. right\n\t\t\t\t\"offset.y = a.g > a.r ? -a.g : a.r;\", // top vs. bottom // WebGL port note: Changed signs\n\n\t\t\t\t// Then we go in the direction that has the maximum weight:\n\t\t\t\t\"if ( abs( offset.x ) > abs( offset.y )) {\", // horizontal vs. vertical\n\t\t\t\t\t\"offset.y = 0.0;\",\n\t\t\t\t\"} else {\",\n\t\t\t\t\t\"offset.x = 0.0;\",\n\t\t\t\t\"}\",\n\n\t\t\t\t// Fetch the opposite color and lerp by hand:\n\t\t\t\t\"vec4 C = texture2D( colorTex, texcoord, 0.0 );\",\n\t\t\t\t\"texcoord += sign( offset ) * resolution;\",\n\t\t\t\t\"vec4 Cop = texture2D( colorTex, texcoord, 0.0 );\",\n\t\t\t\t\"float s = abs( offset.x ) > abs( offset.y ) ? abs( offset.x ) : abs( offset.y );\",\n\n\t\t\t\t// WebGL port note: Added gamma correction\n\t\t\t\t\"C.xyz = pow(C.xyz, vec3(2.2));\",\n\t\t\t\t\"Cop.xyz = pow(Cop.xyz, vec3(2.2));\",\n\t\t\t\t\"vec4 mixed = mix(C, Cop, s);\",\n\t\t\t\t\"mixed.xyz = pow(mixed.xyz, vec3(1.0 / 2.2));\",\n\n\t\t\t\t\"return mixed;\",\n\t\t\t\"}\",\n\t\t\"}\",\n\n\t\t\"void main() {\",\n\n\t\t\t\"gl_FragColor = SMAANeighborhoodBlendingPS( vUv, vOffset, tColor, tDiffuse );\",\n\n\t\t\"}\"\n\n\t].join(\"\\n\")\n\n} ];\n\nmodule.exports = THREE.SMAAShader;\n","import {\n attr,\n Model,\n} from 'redux-orm';\n\nclass Asset extends Model {\n static get fields() {\n return {\n id: attr(),\n fileName: attr(),\n contentType: attr(),\n thumbnail: attr(),\n };\n }\n\n static parse(assetData) {\n return this.upsert(assetData);\n }\n\n toJSON() {\n return {\n ...this.ref,\n url: `asset/${this.ref.id}`,\n };\n }\n\n updateFrom(otherAsset) {\n this.update(otherAsset.ref);\n }\n}\n\nAsset.modelName = 'Asset';\n\nexport default Asset;\n","import {\n attr,\n fk,\n Model,\n} from 'redux-orm';\n\nclass Attachment extends Model {\n static get fields() {\n return {\n id: attr(),\n childTranslationOffset: attr(),\n childRotationOffset: attr(),\n twistInterval: attr(),\n boltPattern: fk('BoltPattern'),\n };\n }\n\n static parse(attachmentData) {\n const parsedData = {\n ...attachmentData,\n boltPattern: attachmentData.boltPatternId,\n };\n\n return this.upsert(parsedData);\n }\n\n toJSON() {\n return { ...this.ref };\n }\n\n updateFrom(otherAttachment) {\n this.update(otherAttachment.ref);\n }\n}\n\nAttachment.modelName = 'Attachment';\n\nexport default Attachment;\n","import {\n attr,\n Model,\n} from 'redux-orm';\n\nclass BoltPattern extends Model {\n static get fields() {\n return {\n id: attr(),\n name: attr(),\n };\n }\n\n static parse(boltPatternData) {\n if (!boltPatternData) {\n return;\n }\n\n return this.upsert(boltPatternData);\n }\n\n toJSON() {\n return { ...this.ref };\n }\n\n updateFrom(otherBoltPattern) {\n this.update(otherBoltPattern.ref);\n }\n}\n\nBoltPattern.modelName = 'BoltPattern';\n\nexport default BoltPattern;\n","const { REACT_APP_HEBI_API_BASE_URL } = process.env;\n\nif (!REACT_APP_HEBI_API_BASE_URL || !REACT_APP_HEBI_API_BASE_URL.length) {\n throw new Error('No API base URL set, have you configured your local .env file?');\n}\n\nexport {\n REACT_APP_HEBI_API_BASE_URL,\n};\n","import {\n attr,\n fk,\n many,\n Model,\n} from 'redux-orm';\n\nimport omit from 'lodash-es/omit';\nimport { REACT_APP_HEBI_API_BASE_URL } from '../app/config/env-config';\n\nclass Part extends Model {\n static get fields() {\n return {\n id: attr(),\n name: attr(),\n description: attr(),\n minLength: attr(),\n maxLength: attr(),\n defaultLength: attr(),\n twistInterval: attr(),\n thumbnailId: attr(),\n thumbnailUrl: attr(),\n inputBoltPattern: fk('BoltPattern'),\n partCategory: fk('PartCategory'),\n assets: many('Asset', 'parts'),\n attachments: many('Attachment', 'parts'),\n };\n }\n\n static parse(partData) {\n const {\n Asset,\n Attachment,\n } = this.session;\n\n partData.assets = partData.assets || [];\n partData.attachments = partData.attachments || [];\n\n const parsedData = {\n ...omit(partData, [\n 'category',\n 'assets',\n 'attachments',\n 'inputBoltPatternId',\n 'partCategoryId',\n 'hrdfNodeName',\n ]),\n assets: partData.assets.map(({asset}) => Asset.parse(asset)),\n attachments: partData.attachments.map((partAttachmentEntry) => Attachment.parse(partAttachmentEntry)),\n inputBoltPattern: partData.inputBoltPatternId,\n partCategory: partData.partCategoryId,\n thumbnailUrl: REACT_APP_HEBI_API_BASE_URL + `thumbnail/${partData.thumbnailId}`,\n };\n\n return this.upsert(parsedData);\n }\n\n toJSON() {\n const part = {\n ...this.ref,\n assets: this.assets.toModelArray().map(asset => asset.toJSON()),\n attachments: this.attachments.toModelArray().map(attachment => attachment.toJSON()),\n partCategory: this.partCategory.name,\n };\n \n return part;\n }\n\n updateFrom(otherPart) {\n this.update(otherPart.ref);\n }\n}\n\nPart.modelName = 'Part';\n\nexport default Part;\n","import {\n attr,\n Model,\n} from 'redux-orm';\n\nclass PartLength extends Model {\n static get fields() {\n return {\n id: attr(),\n length: attr(),\n unit: attr(),\n };\n }\n\n static parse(partLengthData) {\n const parsedData = {\n ...partLengthData,\n };\n\n return this.upsert(parsedData);\n }\n\n toJSON() {\n const partLength = {\n ...this.ref,\n };\n \n return partLength;\n }\n\n updateFrom(otherPartLength) {\n this.update(otherPartLength.ref);\n }\n}\n\nPartLength.modelName = 'PartLength';\n\nexport default PartLength;\n","import {\n attr,\n Model,\n} from 'redux-orm';\n\nclass PartCategory extends Model {\n static get fields() {\n return {\n id: attr(),\n name: attr(),\n };\n }\n\n static parse(partCategoryData) {\n return this.upsert(partCategoryData);\n }\n\n toJSON() {\n return { ...this.ref };\n }\n\n updateFrom(otherPartCategory) {\n this.update(otherPartCategory.ref);\n }\n}\n\nPartCategory.modelName = 'PartCategory';\n\nexport default PartCategory;\n","import {\n attr,\n many,\n Model,\n } from 'redux-orm';\n \n class Robot extends Model {\n static get fields() {\n return {\n id: attr(),\n name: attr(),\n description: attr(),\n robotParts: many('RobotPart', 'robots'),\n };\n }\n \n static parse(robotData) {\n const {\n RobotPart,\n } = this.session;\n \n robotData.robotParts = robotData.robotParts || [];\n \n const parsedData = {\n ...robotData,\n robotParts: robotData.robotParts.map((robotPart) => RobotPart.parse(robotPart)),\n };\n \n return this.upsert(parsedData);\n }\n \n toJSON() {\n const robot = {\n ...this.ref,\n robotParts: this.robotParts.toModelArray().map(robotPart => robotPart.toJSON())\n };\n \n return robot;\n }\n \n updateFrom(otherRobot) {\n this.update(otherRobot.ref);\n }\n }\n \n Robot.modelName = 'Robot';\n \n export default Robot;\n ","import {\n attr,\n fk,\n many,\n Model,\n} from 'redux-orm';\n\nimport omit from 'lodash-es/omit';\n\nclass RobotPart extends Model {\n static get fields() {\n return {\n id: attr(),\n robot: fk('Robot'),\n part: fk('Part'),\n length: attr(),\n twist: attr(),\n children: many('RobotPart', 'parent'),\n };\n }\n \n static parse(robotPartData) {\n const {\n RobotPart,\n } = this.session;\n\n robotPartData.children = robotPartData.children || [];\n\n const parsedData = {\n ...omit(robotPartData, [\n 'boltPatternId',\n 'childRotationOffset',\n 'childTranslationOffset',\n 'partName',\n 'partType',\n 'partTypeHRDFName',\n 'children',\n ]),\n children: robotPartData.children.map((robotPart) => RobotPart.parse(robotPart)),\n part: robotPartData.partId,\n robot: robotPartData.robotId,\n };\n\n return this.upsert(parsedData);\n }\n \n toJSON() {\n const part = {\n ...this.ref,\n children: this.children.toModelArray().map(child => child.toJSON())\n };\n \n return part;\n }\n\n updateFrom(otherPart) {\n this.update(otherPart.ref);\n }\n}\n \nRobotPart.modelName = 'RobotPart';\n \nexport default RobotPart;\n ","import { ORM } from 'redux-orm';\n\nimport {\n Asset,\n Attachment,\n BoltPattern,\n Part,\n PartCategory,\n PartLength,\n Robot,\n RobotPart,\n} from '../models';\n\nconst orm = new ORM();\norm.register(\n Asset,\n Attachment,\n BoltPattern,\n Part,\n PartCategory,\n PartLength,\n Robot,\n RobotPart,\n);\n\nexport default orm;\n","export const getEntities = state => state.entities;\n","import { createSelector } from 'reselect';\n\nimport orm from '../../../app/orm';\nimport { getEntities } from './getEntities';\n\nexport const getEntitiesSession = createSelector(\n getEntities,\n entities => orm.session(entities)\n);\n","import { createSelector } from 'reselect';\n\nimport { getEntitiesSession } from '../../entities/selectors';\n\nexport const getPartLengths = createSelector(\n getEntitiesSession,\n session => {\n const { PartLength } = session;\n\n const partLengths = PartLength.all().toModelArray();\n return partLengths;\n }\n);\n","export const getConfigurator = state => state.configurator;\n","import { createSelector as createOrmSelector } from 'redux-orm';\n\nimport orm from '../../../app/orm';\nimport { getEntities } from '../../entities/selectors';\n\nexport const getAssets = createOrmSelector(\n orm,\n getEntities,\n session => {\n const { Asset } = session;\n\n return Asset.all().toModelArray().map(asset => {\n const obj = asset.toJSON();\n\n return {\n id: obj.id,\n url: obj.url,\n };\n });\n }\n);\n","import { createSelector } from 'reselect';\n\nimport { getConfigurator } from './getConfigurator';\n\nexport const getBuilder = createSelector(\n getConfigurator,\n configurator => configurator.builder\n);\n","import { createSelector } from 'reselect';\n\nimport { getConfigurator } from './getConfigurator';\n\nexport const getBootstrapper = createSelector(\n getConfigurator,\n configurator => configurator.bootstrapper,\n);\n","import { createSelector } from 'reselect';\n\nimport { getBootstrapper } from './getBootstrapper';\n\nexport const getConfiguratorIsInitialized = createSelector(\n getBootstrapper,\n bootstrapper => bootstrapper.initialized,\n);\n","import { createSelector } from 'reselect';\n\nimport { getBuilder } from './getBuilder';\n\nexport const getCurrentRobotId = createSelector(\n getBuilder,\n builder => builder.currentRobotId\n);\n","import { createSelector } from 'reselect';\n\nimport { getEntitiesSession } from '../../entities/selectors';\nimport { getCurrentRobotId } from './getCurrentRobotId';\n\nexport const getCurrentRobot = createSelector(\n [getEntitiesSession, getCurrentRobotId],\n (session, currentRobotId) => {\n const { Robot } = session;\n\n if (!currentRobotId || !Robot.idExists(currentRobotId)) {\n return null;\n }\n \n const robot = Robot.withId(currentRobotId);\n return robot;\n }\n);\n","import { createSelector } from 'reselect';\n\nimport { getBuilder } from './getBuilder';\n\nexport const getCurrentRobotPartId = createSelector(\n getBuilder,\n builder => builder.currentRobotPartId\n);\n","import { createSelector } from 'reselect';\n\nimport { getEntitiesSession } from '../../entities/selectors';\nimport { getCurrentRobotPartId } from './getCurrentRobotPartId';\n\nexport const getCurrentRobotPart = createSelector(\n [getEntitiesSession, getCurrentRobotPartId],\n (session, currentRobotPartId) => {\n const { RobotPart } = session;\n\n if (!currentRobotPartId || !RobotPart.idExists(currentRobotPartId)) {\n return null;\n }\n \n const robotPart = RobotPart.withId(currentRobotPartId);\n return robotPart;\n }\n);\n","import { createSelector } from 'reselect';\n\nimport { getCurrentRobotPart } from './getCurrentRobotPart';\n\nexport const getCurrentRobotPartAsset = createSelector(\n getCurrentRobotPart,\n currentRobotPart => {\n if (!currentRobotPart) {\n return null;\n }\n\n const assets = currentRobotPart.part.assets.toModelArray();\n if (!assets || !assets.length) {\n return null;\n }\n\n const asset = assets[0];\n return asset;\n }\n);\n","import { createSelector } from 'reselect';\n\nimport { getCurrentRobotPart } from './getCurrentRobotPart';\n\nexport const getCurrentRobotPartParent = createSelector(\n getCurrentRobotPart,\n currentRobotPart => {\n if (!currentRobotPart) {\n return null;\n }\n\n const parentRobotParts = currentRobotPart.parent.toModelArray();\n if (!parentRobotParts || !parentRobotParts.length) {\n return null;\n }\n\n const parentPart = parentRobotParts[0];\n return parentPart;\n }\n);\n","import { createSelector } from 'reselect';\n\nimport { getCurrentRobotPartAsset } from './getCurrentRobotPartAsset';\n\nexport const getCurrentRobotPartAssetUrl = createSelector(\n getCurrentRobotPartAsset,\n asset => {\n if (!asset) {\n return null;\n }\n\n const { url } = asset.toJSON();\n\n return url;\n }\n);\n","import { createSelector } from 'reselect';\n\nimport { getCurrentRobotPartParent } from './getCurrentRobotPartParent';\n\nconst defaultOffset = {\n rotation: {\n x: 0,\n y: 0,\n z: 0,\n },\n translation: {\n x: 0,\n y: 0,\n z: 0,\n },\n};\n\n// TODO: Update this to getCurrentRobotPartConstraints?\nexport const getCurrentRobotPartParentOffsets = createSelector(\n getCurrentRobotPartParent,\n parentRobotPart => {\n if (!parentRobotPart || !parentRobotPart.part) {\n return defaultOffset;\n }\n\n const attachments = parentRobotPart.part.attachments.toModelArray();\n\n if (!attachments || !attachments.length) {\n return defaultOffset;\n }\n\n // TODO: What do we do if there are more than 1 attachment points?\n const attachment = attachments[0];\n\n const parentPartCategory = parentRobotPart.part.partCategory.name;\n\n switch (parentPartCategory) {\n case 'Link':\n const offset = getLinkOffsets(parentRobotPart);\n return {\n ...offset,\n boltPattern: attachment.boltPattern.name,\n };\n default:\n return {\n rotation: attachment.childRotationOffset,\n translation: attachment.childTranslationOffset,\n boltPattern: attachment.boltPattern.name,\n };\n }\n }\n);\n\nconst getLinkOffsets = (linkRobotPart) => {\n const twist = linkRobotPart.twist || 0;\n\n return {\n rotation: {\n x: 0,\n y: -0.0175 * Math.sin(twist),\n z: 0.0175 * (1 + Math.cos(twist)),\n },\n translation: {\n x: 0,\n y: 0,\n z: 0,\n },\n };\n};\n","import { createSelector } from 'reselect';\nimport omit from 'lodash-es/omit';\nimport pick from 'lodash-es/pick';\n\nimport { getCurrentRobotPart } from './getCurrentRobotPart';\nimport { getCurrentRobotPartParentOffsets } from './getCurrentRobotPartParentOffsets';\n\nexport const getCurrentRobotPartWorkspaceArguments = createSelector(\n [getCurrentRobotPart, getCurrentRobotPartParentOffsets],\n (currentRobotPart, parentOffsets) => {\n if (!currentRobotPart) {\n return {};\n }\n\n const {\n rotation,\n translation,\n boltPattern,\n } = parentOffsets;\n\n return {\n part: currentRobotPart.part.toJSON(),\n userData: {\n ...omit(currentRobotPart.toJSON(), [\n 'children',\n 'part',\n ]),\n ...pick(currentRobotPart.part.toJSON(), [\n 'partCategory',\n 'type',\n 'attachments'\n ]),\n parentOutputBoltPattern: boltPattern,\n rotation,\n translation,\n }\n }\n }\n);\n","export const getCurrentPathname = (state, location) => location.pathname;\n","import { createSelector } from 'reselect';\n\nimport { getCurrentPathname } from '../../shared/router/selectors';\n\nexport const getInBuildMode = createSelector(\n getCurrentPathname,\n pathname => {\n if (!pathname || !pathname.length) {\n return false;\n }\n\n return pathname === '/configurator/build';\n },\n);","import { createSelector } from 'reselect';\n\nimport { getBuilder } from './getBuilder';\n\nexport const getPlacementMode = createSelector(\n getBuilder,\n builder => builder.placementMode\n);\n","import { createSelector } from 'reselect';\nimport { getCurrentRobot } from './getCurrentRobot';\n\nexport const getTestDriveTabShouldBeEnabled = createSelector(\n getCurrentRobot,\n currentRobot => {\n if (!currentRobot) {\n return false;\n }\n \n const baseParts = currentRobot.robotParts.toModelArray();\n if(baseParts && baseParts.length) {\n const nextPart = baseParts[0].children.toModelArray();\n const hasMultipleParts = Boolean(nextPart && nextPart.length);\n return hasMultipleParts;\n }\n\n return false;\n }\n);\n","import { createSelector } from 'reselect';\nimport { getCurrentRobot } from './getCurrentRobot';\n\nexport const getRequestQuoteTabShouldBeEnabled = createSelector(\n getCurrentRobot,\n currentRobot => {\n if (!currentRobot) {\n return false;\n }\n \n const baseParts = currentRobot.robotParts.toModelArray();\n const hasPart = Boolean(baseParts && baseParts.length);\n return hasPart;\n }\n);\n","import { createSelector } from 'reselect';\n\nimport { getCurrentRobot } from './getCurrentRobot';\n\nexport const getPotentialParents = createSelector(\n getCurrentRobot,\n currentRobot => {\n if (!currentRobot) {\n return [];\n }\n\n const hierarchy = currentRobot.robotParts.toModelArray();\n const potentialParents = getLeafNodes(hierarchy);\n return potentialParents;\n }\n);\n\nfunction getLeafNodes(nodes, result = []) {\n for (var i = 0, length = nodes.length; i < length; i++) {\n if (!nodes[i].children.exists()) {\n result.push(nodes[i]);\n } else {\n result = getLeafNodes(nodes[i].children.toModelArray(), result);\n }\n }\n return result;\n}\n","import { createSelector } from 'reselect';\n\nimport { getConfigurator } from './getConfigurator';\n\nexport const getWorkspace = createSelector(\n getConfigurator,\n configurator => configurator.workspace\n);\n","import { createSelector } from 'reselect';\n\nimport { getBuilder } from './getBuilder';\n\nexport const getRobotStatistics = createSelector(\n getBuilder,\n builder => builder.statistics\n);\n","import { createSelector } from 'reselect';\n\nimport { getWorkspace } from './getWorkspace';\n\nexport const getRobotPartIdsInScene = createSelector(\n getWorkspace,\n workspace => workspace.sceneRobotParts\n);\n","import { createSelector } from 'reselect';\n\nimport { getBuilder } from './getBuilder';\n\nexport const getSceneLoaded = createSelector(\n getBuilder,\n builder => builder.sceneLoaded\n);\n","import { createSelector } from 'reselect';\n\nimport { getWorkspace } from './getWorkspace';\n\nexport const getSelectedRobotPartId = createSelector(\n getWorkspace,\n workspace => workspace.selectedRobotPartId\n);\n","import { createSelector } from 'reselect';\n\nimport { getEntitiesSession } from '../../entities/selectors';\nimport { getSelectedRobotPartId } from './getSelectedRobotPartId';\n\nexport const getSelectedRobotPart = createSelector(\n [getEntitiesSession, getSelectedRobotPartId],\n (session, selectedRobotPartId) => {\n const { RobotPart } = session;\n\n if (!selectedRobotPartId || !RobotPart.idExists(selectedRobotPartId)) {\n return null;\n }\n \n const robotPart = RobotPart.withId(selectedRobotPartId);\n return robotPart;\n }\n);\n","import { createSelector } from 'reselect';\n\nimport { getSelectedRobotPart } from './getSelectedRobotPart';\n\nconst defaultConstraints = {\n length: 0,\n twist: 0,\n twistInterval: 0,\n};\n\nexport const getSelectedRobotPartConstraints = createSelector(\n getSelectedRobotPart,\n selectedRobotPart => {\n if (!selectedRobotPart) {\n return defaultConstraints;\n }\n \n const associatedPart = selectedRobotPart.part;\n\n // TODO: Version 1.0+\n // If multiple attachments, get selected attachment point\n let twistInterval = defaultConstraints.twistInterval;\n const attachments = associatedPart.attachments.toModelArray();\n if (attachments && attachments.length) {\n twistInterval = attachments[0].twistInterval;\n }\n\n return {\n length: selectedRobotPart.length || defaultConstraints.length,\n twist: selectedRobotPart.twist || defaultConstraints.twist,\n twistInterval,\n };\n }\n);\n","import { createSelector } from 'reselect';\n\nimport { getSelectedRobotPart } from './getSelectedRobotPart';\n\nexport const getSelectedRobotPartChildren = createSelector(\n getSelectedRobotPart,\n selectedRobotPart => {\n if (!selectedRobotPart) {\n return [];\n }\n\n const childRobotParts = selectedRobotPart.children.toModelArray();\n return childRobotParts;\n }\n);\n","import { createSelector } from 'reselect';\n\nimport { getSelectedRobotPartChildren } from './getSelectedRobotPartChildren';\n\nexport const getShouldWarnBeforeRobotPartRemoval = createSelector(\n getSelectedRobotPartChildren,\n children => {\n if (children && children.length) {\n return true;\n }\n\n return false;\n }\n);\n","import { createSelector } from 'reselect';\n\nimport { getCurrentPathname } from '../../shared/router/selectors';\nimport { getConfiguratorIsInitialized } from '../../configurator/selectors';\n\nexport const getWorkspaceIsVisible = createSelector(\n [getCurrentPathname, getConfiguratorIsInitialized],\n (pathname, isInitialized) => {\n if (!pathname || !pathname.length) {\n return false;\n }\n\n const isWorkspacePage = pathname === '/configurator/build'\n || pathname === '/configurator/test-drive';\n \n return isWorkspacePage && isInitialized;\n },\n);\n\n","export const ADD_PART_TO_WORKSPACE_PREFIX = 'ADD_PART_TO_WORKSPACE';\nexport const ADD_PART_TO_WORKSPACE_REQUEST = `${ADD_PART_TO_WORKSPACE_PREFIX}_REQUEST`;\nexport const ADD_PART_TO_WORKSPACE_SUCCESS = `${ADD_PART_TO_WORKSPACE_PREFIX}_SUCCESS`;\nexport const ADD_PART_TO_WORKSPACE_ERROR = `${ADD_PART_TO_WORKSPACE_PREFIX}_ERROR`;\nexport const ADD_PART_TO_WORKSPACE_ERROR_MESSAGE = 'Error adding part to workspace';\nexport const ADD_PART_TO_WORKSPACE_NOT_SUPPORTED_MESSAGE = 'Cannot currently add a part with multiple potential parents. Please check back later!';\n\nexport const addPartToWorkspaceRequest = (id) => ({\n type: ADD_PART_TO_WORKSPACE_REQUEST,\n payload: {\n id,\n }\n});\n","import { ADD_PART_TO_WORKSPACE_SUCCESS } from './addPartToWorkspaceRequest';\n\nexport const addPartToWorkspaceSuccess = () => ({\n type: ADD_PART_TO_WORKSPACE_SUCCESS,\n payload: {\n }\n});\n","export const CLEAR_SELECTED_ROBOT_PART = 'CLEAR_SELECTED_ROBOT_PART';\n\nexport const clearSelectedRobotPart = () => ({\n type: CLEAR_SELECTED_ROBOT_PART,\n payload: {\n },\n});\n","export const ROBOT_CREATE_WITH_PART_PREFIX = 'ROBOT_CREATE_WITH_PART';\nexport const ROBOT_CREATE_WITH_PART_REQUEST = `${ROBOT_CREATE_WITH_PART_PREFIX}_REQUEST`;\nexport const ROBOT_CREATE_WITH_PART_SUCCESS = `${ROBOT_CREATE_WITH_PART_PREFIX}_SUCCESS`;\nexport const ROBOT_CREATE_WITH_PART_ERROR = `${ROBOT_CREATE_WITH_PART_PREFIX}_ERROR`;\nexport const ROBOT_CREATE_WITH_PART_ERROR_MESSAGE = 'Error creating robot with specified base. Check that the part name is correct';\n\nexport const createRobotWithPartRequest = (robot, partName) => ({\n type: ROBOT_CREATE_WITH_PART_REQUEST,\n payload: {\n robot,\n partName,\n }\n});\n","import {\n ROBOT_CREATE_WITH_PART_SUCCESS,\n} from './createRobotWithPartRequest';\n\nexport const createRobotWithPartSuccess = (id) => ({\n type: ROBOT_CREATE_WITH_PART_SUCCESS,\n payload: {\n id,\n }\n});\n","export const ROBOT_PART_CREATE_SUCCESS = 'ROBOT_PART_CREATE_SUCCESS';\n\nexport const createRobotPartSuccess = (robotPart) => ({\n type: ROBOT_PART_CREATE_SUCCESS,\n payload: {\n robotPart,\n },\n});\n","export const ROBOT_CREATE_PREFIX = 'ROBOT_CREATE';\nexport const ROBOT_CREATE_REQUEST = `${ROBOT_CREATE_PREFIX}_REQUEST`;\nexport const ROBOT_CREATE_SUCCESS = `${ROBOT_CREATE_PREFIX}_SUCCESS`;\nexport const ROBOT_CREATE_ERROR = `${ROBOT_CREATE_PREFIX}_ERROR`;\nexport const ROBOT_CREATE_ERROR_MESSAGE = 'Error creating robot';\n\nexport const createRobotRequest = () => ({\n type: ROBOT_CREATE_REQUEST,\n payload: {\n }\n});\n","import { ROBOT_CREATE_SUCCESS } from './createRobotRequest';\n\nexport const createRobotSuccess = (id) => ({\n type: ROBOT_CREATE_SUCCESS,\n payload: {\n id,\n },\n})\n","export const INITIALIZE_CONFIGURATOR_PREFIX = 'INITIALIZE_CONFIGURATOR';\nexport const INITIALIZE_CONFIGURATOR_REQUEST = `${INITIALIZE_CONFIGURATOR_PREFIX}_REQUEST`;\nexport const INITIALIZE_CONFIGURATOR_SUCCESS = `${INITIALIZE_CONFIGURATOR_PREFIX}_SUCCESS`;\nexport const INITIALIZE_CONFIGURATOR_SUCCESS_CACHED = `${INITIALIZE_CONFIGURATOR_PREFIX}_SUCCESS_CACHED`;\nexport const INITIALIZE_CONFIGURATOR_ERROR = `${INITIALIZE_CONFIGURATOR_PREFIX}_ERROR`;\nexport const INITIALIZE_CONFIGURATOR_ERROR_MESSAGE = 'Error while initializing configurator';\n\nexport const initializeConfiguratorRequest = () => ({\n type: INITIALIZE_CONFIGURATOR_REQUEST,\n payload: {\n },\n});\n","import {\n INITIALIZE_CONFIGURATOR_SUCCESS,\n} from './initializeConfiguratorRequest';\n\nexport const initializeConfiguratorSuccess = () => ({\n type: INITIALIZE_CONFIGURATOR_SUCCESS,\n payload: {\n },\n});\n","export const LOAD_ENTITIES_PREFIX = 'LOAD_ENTITIES';\nexport const LOAD_ENTITIES_REQUEST = `${LOAD_ENTITIES_PREFIX}_REQUEST`;\nexport const LOAD_ENTITIES_SUCCESS = `${LOAD_ENTITIES_PREFIX}_SUCCESS`;\nexport const LOAD_ENTITIES_ERROR = `${LOAD_ENTITIES_PREFIX}_ERROR`;\nexport const LOAD_ENTITIES_ERROR_MESSAGE = 'Error loading robot models';\n\nexport const loadEntitiesRequest = () => ({\n type: LOAD_ENTITIES_REQUEST,\n});\n","import {\n LOAD_ENTITIES_SUCCESS,\n} from './loadEntitiesRequest';\n\nexport const loadEntitiesSuccess = (entities) => ({\n type: LOAD_ENTITIES_SUCCESS,\n payload: {\n ...entities,\n },\n});\n","export const ROBOT_LOAD_PREFIX = 'ROBOT_LOAD';\nexport const ROBOT_LOAD_REQUEST = `${ROBOT_LOAD_PREFIX}_REQUEST`;\nexport const ROBOT_LOAD_SUCCESS = `${ROBOT_LOAD_PREFIX}_SUCCESS`;\nexport const ROBOT_LOAD_ERROR = `${ROBOT_LOAD_PREFIX}_ERROR`;\nexport const ROBOT_LOAD_ERROR_MESSAGE = 'Error loading robot';\n\nexport const loadRobotRequest = (id) => ({\n type: ROBOT_LOAD_REQUEST,\n payload: {\n id,\n },\n});\n","import {\n ROBOT_LOAD_SUCCESS,\n} from './loadRobotRequest';\n\nexport const loadRobotSuccess = (robot) => ({\n type: ROBOT_LOAD_SUCCESS,\n payload: {\n robot,\n },\n});\n","export const ROBOT_PART_PLACE_SUCCESS = 'ROBOT_PART_PLACE_SUCCESS';\n\nexport const placeRobotPartSuccess = (id) => ({\n type: ROBOT_PART_PLACE_SUCCESS,\n payload: {\n id,\n }\n});\n","export const SET_CURRENT_ROBOT = 'SET_CURRENT_ROBOT';\n\nexport const setCurrentRobot = (id) => ({\n type: SET_CURRENT_ROBOT,\n payload: {\n currentRobotId: id\n },\n});\n","export const SET_CURRENT_ROBOT_PART = 'SET_CURRENT_ROBOT_PART';\n\nexport const setCurrentRobotPart = (id) => ({\n type: SET_CURRENT_ROBOT_PART,\n payload: {\n currentRobotPartId: id\n },\n});\n","export const SET_PLACEMENT_MODE = 'SET_PLACEMENT_MODE';\n\nexport const setPlacementMode = (mode) => ({\n type: SET_PLACEMENT_MODE,\n payload: {\n mode,\n },\n});\n","export const SET_SCENE_LOADED = 'SET_SCENE_LOADED';\n\nexport const setSceneLoaded = (loaded) => ({\n type: SET_SCENE_LOADED,\n payload: {\n loaded,\n },\n});\n","export const SET_SELECTED_ROBOT_PART = 'SET_SELECTED_ROBOT_PART';\nexport const SET_SELECTED_ROBOT_PART_ERROR = `${SET_SELECTED_ROBOT_PART}_ERROR`;\nexport const SET_SELECTED_ROBOT_PART_ERROR_MESSAGE = 'Error setting the selected part';\n\nexport const setSelectedRobotPart = (id, x, y) => ({\n type: SET_SELECTED_ROBOT_PART,\n payload: {\n selectedRobotPartId: id,\n location: {\n x,\n y,\n },\n },\n});\n","export const ROBOT_UPLOAD_HRDF_PREFIX = 'ROBOT_UPLOAD_HRDF';\nexport const ROBOT_UPLOAD_HRDF_REQUEST = `${ROBOT_UPLOAD_HRDF_PREFIX}_REQUEST`;\nexport const ROBOT_UPLOAD_HRDF_SUCCESS = `${ROBOT_UPLOAD_HRDF_PREFIX}_SUCCESS`;\nexport const ROBOT_UPLOAD_HRDF_ERROR = `${ROBOT_UPLOAD_HRDF_PREFIX}_ERROR`;\n// TODO: Actually use the error from the server\nexport const ROBOT_UPLOAD_HRDF_ERROR_MESSAGE = 'Error loading HRDF file';\n\nexport const uploadHRDFRequest = (file) => ({\n type: ROBOT_UPLOAD_HRDF_REQUEST,\n payload: {\n file,\n },\n});\n","import {\n ROBOT_UPLOAD_HRDF_SUCCESS,\n} from './uploadHRDFRequest';\n\nexport const uploadHRDFSuccess = (id) => ({\n type: ROBOT_UPLOAD_HRDF_SUCCESS,\n payload: {\n id,\n }\n});","\nexport const ROBOT_PART_REMOVE_PREFIX = 'ROBOT_PART_REMOVE';\nexport const ROBOT_PART_REMOVE_REQUEST = `${ROBOT_PART_REMOVE_PREFIX}_REQUEST`;\nexport const ROBOT_PART_REMOVE_CANCEL = `${ROBOT_PART_REMOVE_PREFIX}_CANCEL`;\nexport const ROBOT_PART_REMOVE_SUCCESS = `${ROBOT_PART_REMOVE_PREFIX}_SUCCESS`;\nexport const ROBOT_PART_REMOVE_ERROR = `${ROBOT_PART_REMOVE_PREFIX}_ERROR`;\nexport const ROBOT_PART_REMOVE_ERROR_MESSAGE = 'Error removing robot part';\n\nexport const removeRobotPartRequest = () => ({\n type: ROBOT_PART_REMOVE_REQUEST,\n});\n","import { ROBOT_PART_REMOVE_SUCCESS } from './removeRobotPartRequest';\n\nexport const removeRobotPartSuccess = (ids) => ({\n type: ROBOT_PART_REMOVE_SUCCESS,\n payload: {\n ids,\n },\n});\n","export const ROBOT_PART_REMOVE_CANCEL = 'ROBOT_PART_REMOVE_CANCEL';\n\nexport const removeRobotPartCancel = () => ({\n type: ROBOT_PART_REMOVE_CANCEL,\n});\n","export const ROBOT_PART_REMOVE_CONFIRM_PREFIX = 'ROBOT_PART_REMOVE_CONFIRM';\nexport const ROBOT_PART_REMOVE_CONFIRM_REQUEST = `${ROBOT_PART_REMOVE_CONFIRM_PREFIX}_REQUEST`;\nexport const ROBOT_PART_REMOVE_CONFIRM_SUCCESS = `${ROBOT_PART_REMOVE_CONFIRM_PREFIX}_SUCCESS`;\nexport const ROBOT_PART_REMOVE_CONFIRM_ERROR = `${ROBOT_PART_REMOVE_CONFIRM_PREFIX}_ERROR`;\nexport const ROBOT_PART_REMOVE_CONFIRM_ERROR_MESSAGE = 'Error removing robot part';\n\nexport const removeRobotPartConfirmRequest = () => ({\n type: ROBOT_PART_REMOVE_CONFIRM_REQUEST,\n});\n","import { ROBOT_PART_REMOVE_CONFIRM_SUCCESS } from './removeRobotPartConfirmRequest';\n\nexport const removeRobotPartConfirmSuccess = () => ({\n type: ROBOT_PART_REMOVE_CONFIRM_SUCCESS,\n payload: {\n },\n});\n","export const ROBOT_PART_REPLACE_PREFIX = 'ROBOT_PART_REPLACE';\nexport const ROBOT_PART_REPLACE_REQUEST = `${ROBOT_PART_REPLACE_PREFIX}_REQUEST`;\nexport const ROBOT_PART_REPLACE_SUCCESS = `${ROBOT_PART_REPLACE_PREFIX}_SUCCESS`;\nexport const ROBOT_PART_REPLACE_ERROR = `${ROBOT_PART_REPLACE_PREFIX}_ERROR`;\nexport const ROBOT_PART_REPLACE_ERROR_MESSAGE = 'Error while initializing configurator';\n\nexport const replaceRobotPartRequest = (replaceId, newPart) => ({\n type: ROBOT_PART_REPLACE_REQUEST,\n payload: {\n replaceId,\n newPart,\n },\n});\n","import {\n ROBOT_PART_REPLACE_SUCCESS,\n} from './replaceRobotPartRequest';\n\nexport const replaceRobotPartSuccess = () => ({\n type: ROBOT_PART_REPLACE_SUCCESS,\n payload: {\n },\n});\n","export const RESET_CAMERA = 'RESET_CAMERA';\n\nexport const resetCamera = () => dispatch => dispatch({ type: RESET_CAMERA });\n","export const TOGGLE_PLACEMENT_MODE = 'TOGGLE_PLACEMENT_MODE';\n\nexport const togglePlacementMode = () => ({\n type: TOGGLE_PLACEMENT_MODE,\n payload: {\n },\n});\n","export const UPDATE_ROBOT_STATISTICS = 'UPDATE_ROBOT_STATISTICS';\nexport const UPDATE_ROBOT_STATISTICS_ERROR = `${UPDATE_ROBOT_STATISTICS}_ERROR`;\nexport const UPDATE_ROBOT_STATISTICS_ERROR_MESSAGE = 'Error setting the selected part';\n\nexport const updateRobotStatistics = (statistics) => ({\n type: UPDATE_ROBOT_STATISTICS,\n payload: {\n statistics,\n },\n});\n","export const ROBOT_PART_UPDATE_CONSTRAINT_PREFIX = 'ROBOT_PART_UPDATE_CONSTRAINT';\nexport const ROBOT_PART_UPDATE_CONSTRAINT_REQUEST = `${ROBOT_PART_UPDATE_CONSTRAINT_PREFIX}_REQUEST`;\nexport const ROBOT_PART_UPDATE_CONSTRAINT_SUCCESS = `${ROBOT_PART_UPDATE_CONSTRAINT_PREFIX}_SUCCESS`;\nexport const ROBOT_PART_UPDATE_CONSTRAINT_ERROR = `${ROBOT_PART_UPDATE_CONSTRAINT_PREFIX}_ERROR`;\nexport const ROBOT_PART_UPDATE_CONSTRAINT_ERROR_MESSAGE = 'Error updating robot part configuration';\n\nexport const updateSelectedRobotPartConstraintRequest = (constraint, value) => ({\n type: ROBOT_PART_UPDATE_CONSTRAINT_REQUEST,\n payload: {\n constraint,\n value,\n },\n});\n","import {\n ROBOT_PART_UPDATE_CONSTRAINT_SUCCESS,\n} from './updateSelectedRobotPartConstraintRequest';\n\nexport const updateSelectedRobotPartConstraintSuccess = (id, constraint, value) => ({\n type: ROBOT_PART_UPDATE_CONSTRAINT_SUCCESS,\n payload: {\n id,\n constraint,\n value,\n },\n});\n","export const ACTIVATE_TEST_DRIVE = 'ACTIVATE_TEST_DRIVE';\n\nexport const activateTestDrive = () => dispatch => dispatch({ type: ACTIVATE_TEST_DRIVE });\n","export const DEACTIVATE_TEST_DRIVE = 'DEACTIVATE_TEST_DRIVE';\n\nexport const deactivateTestDrive = () => dispatch => dispatch({ type: DEACTIVATE_TEST_DRIVE });\n","export const EXPORT_ROBOT_PREFIX = 'EXPORT_ROBOT';\nexport const EXPORT_ROBOT_REQUEST = `${EXPORT_ROBOT_PREFIX}_REQUEST`;\nexport const EXPORT_ROBOT_SUCCESS = `${EXPORT_ROBOT_PREFIX}_SUCCESS`;\nexport const EXPORT_ROBOT_ERROR = `${EXPORT_ROBOT_PREFIX}_ERROR`;\nexport const EXPORT_ROBOT_ERROR_MESSAGE = 'Unable to export robot, please try again.';\n\nexport const exportRobotRequest = () => ({\n type: EXPORT_ROBOT_REQUEST,\n});","export const SUBMIT_FEEDBACK_PREFIX = 'SUBMIT_FEEDBACK';\nexport const SUBMIT_FEEDBACK_REQUEST = `${SUBMIT_FEEDBACK_PREFIX}_REQUEST`;\nexport const SUBMIT_FEEDBACK_SUCCESS = `${SUBMIT_FEEDBACK_PREFIX}_SUCCESS`;\nexport const SUBMIT_FEEDBACK_SUCCESS_MESSAGE = 'Your feedback has been submitted!';\nexport const SUBMIT_FEEDBACK_ERROR = `${SUBMIT_FEEDBACK_PREFIX}_ERROR`;\n\nexport const SUBMIT_FEEDBACK_ERROR_MESSAGE = `\n We are unable to submit your feedback.\n Please try again. If the problem persists, please visit our contact us\n page for other ways to submit this feedback.\n`;\n\nexport const submitFeedbackRequest = (feedback, {\n resetForm,\n setSubmitting,\n}) => ({\n type: SUBMIT_FEEDBACK_REQUEST,\n payload: {\n feedback,\n resetForm,\n setSubmitting,\n }\n});\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Typography from '@material-ui/core/Typography';\n\nimport {\n getShouldWarnBeforeRobotPartRemoval,\n} from '../selectors';\n\nimport {\n removeRobotPartConfirmRequest,\n removeRobotPartCancel,\n} from '../actions';\n\nconst RemovePartConfirmationModal = ({\n title,\n description,\n handleCancel,\n handleConfirm,\n}) => (\n \n \n {title}\n \n \n \n {description}\n \n \n \n \n \n \n \n);\n\nRemovePartConfirmationModal.propTypes = {\n title: PropTypes.string.isRequired,\n description: PropTypes.string.isRequired,\n handleCancel: PropTypes.func.isRequired,\n handleConfirm: PropTypes.func.isRequired,\n};\n\nconst mapStateToProps = state => {\n const shouldWarn = getShouldWarnBeforeRobotPartRemoval(state);\n const title = 'Confirm component removal';\n const description = shouldWarn ?\n 'Removing this component from the robot will also remove all components that are dependent on this one.  Are you sure you want to proceed?' :\n 'Do you want to remove this component from the robot?';\n \n return {\n title,\n description,\n };\n}\n\nconst actions = {\n handleCancel: removeRobotPartCancel,\n handleConfirm: removeRobotPartConfirmRequest,\n};\n\nexport default connect(mapStateToProps, actions)(RemovePartConfirmationModal);\n","export const MODAL_CLOSE = 'MODAL_CLOSE';\n\nexport const closeModal = () => ({\n type: MODAL_CLOSE,\n});\n","export const MODAL_OPEN = 'MODAL_OPEN';\n\nexport const openModal = (type, modalProps) => ({\n type: MODAL_OPEN,\n payload: {\n type,\n modalProps,\n },\n});\n","import axios from 'axios';\n\nimport { REACT_APP_HEBI_API_BASE_URL } from '../app/config/env-config';\n\nexport default axios.create({\n baseURL: REACT_APP_HEBI_API_BASE_URL,\n timeout: 20000,\n headers: {\n 'Accept': 'application/json',\n },\n});","import {\n call,\n} from 'redux-saga/effects';\n\nimport Api from '../api';\n\nexport const create = (someClass, ...args) => call(() => new someClass(...args));\n\nexport const apiGet = (url, config) => Api.get(url, config).then(r => r.data);\nexport const apiPost = (url, config) => Api.post(url, config).then(r => r.data);\nexport const apiPut = (url, config) => Api.put(url, config).then(r => r.data);\nexport const apiPatch = (url, config) => Api.patch(url, config).then(r => r.data);\nexport const apiDelete = (url, config) => Api.delete(url, config).then(r => r.data);\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport Grid from '@material-ui/core/Grid';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Typography from '@material-ui/core/Typography';\nimport TextField from '@material-ui/core/TextField';\nimport { Form, Formik } from 'formik';\n\nimport { closeModal } from '../../modals/actions';\n\nimport { apiPost } from '../../../common/utils/saga-utils';\n\nconst submitFeedback = feedbackMessage => {\n console.log(feedbackMessage);\n // Insert action here\n // e.g. axios.post('/user', values)\n\n apiPost('/Feedback', feedbackMessage);\n};\n\nconst FeedbackForm = ({ setSentStatus }) => {\n return (\n {\n try {\n submitFeedback(values);\n actions.setSubmitting(false);\n setSentStatus(true);\n } catch (e) {\n console.error(e);\n }\n }}\n render={props => (\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n )}\n />\n );\n};\n\nconst ThankYouNote = () => (\n Thank you for your feedback!\n);\n\nconst FeedbackModal = ({ title, description, handleCancel }) => {\n\n const [sentStatus, setSentStatus] = useState(false);\n\n return (\n \n {title}\n \n \n {description}\n \n {sentStatus ? (\n \n ) : (\n \n )}\n \n \n );\n};\n\nFeedbackModal.propTypes = {\n title: PropTypes.string.isRequired,\n description: PropTypes.string.isRequired,\n handleCancel: PropTypes.func.isRequired\n};\n\nconst mapStateToProps = () => {\n\n // NOTE: You can use standard variables for static content\n // mapStateToProps is for pulling values from the connected redux store.\n const title = 'Feedback';\n const description =\n 'Is there something that went wrong? Let us know so we can improve.';\n\n return {\n title,\n description\n };\n};\n\nconst actions = {\n handleCancel: closeModal\n};\n\nexport default connect(\n mapStateToProps,\n actions\n)(FeedbackModal);\n","import React from 'react';\nimport { connect } from 'react-redux';\n\nimport RemovePartConfirmationModal from '../configurator/components/RemovePartConfirmationModal';\nimport FeedbackModal from '../configurator/components/FeedbackModal';\n\nimport { getModals } from './selectors';\n\nconst modalComponentLookupTable = {\n RemovePartConfirmationModal,\n FeedbackModal,\n};\n\nexport class ModalManager extends React.Component {\n render() {\n const { currentModals } = this.props;\n\n const renderedModals = currentModals.map((modalDescription, index) => {\n const { type, modalProps = {} } = modalDescription;\n const ModalComponent = modalComponentLookupTable[type];\n\n return ;\n });\n\n return (\n \n {renderedModals}\n \n )\n }\n}\n\nconst mapStateToProps = (state) => ({\n currentModals: getModals(state),\n});\n\nexport default connect(mapStateToProps)(ModalManager);\n","export const getModals = state => state.modals;\n","export const SELECT_PART = 'SELECT_PART';\n\nexport const selectPart = (id) => ({\n type: SELECT_PART,\n payload: {\n id,\n },\n});\n","export const SET_DRAWER_VISIBLE = 'SET_DRAWER_VISIBLE';\n\nexport const setDrawerVisible = (visible) => ({\n type: SET_DRAWER_VISIBLE,\n payload: {\n visible,\n },\n});\n","export const SET_SELECTED_CATEGORY = 'SET_SELECTED_CATEGORY';\n\nexport const setSelectedCategory = (id) => ({\n type: SET_SELECTED_CATEGORY,\n payload: {\n id,\n },\n});\n","export const TOGGLE_DRAWER_VISIBLE = 'TOGGLE_DRAWER_VISIBLE';\n\nexport const toggleDrawerVisible = () => ({\n type: TOGGLE_DRAWER_VISIBLE,\n});\n","export const UPDATE_AVAILABLE_PARTS_PREFIX = 'UPDATE_AVAILABLE_PARTS';\nexport const UPDATE_AVAILABLE_PARTS_REQUEST = `${UPDATE_AVAILABLE_PARTS_PREFIX}_REQUEST`;\nexport const UPDATE_AVAILABLE_PARTS_SUCCESS = `${UPDATE_AVAILABLE_PARTS_PREFIX}_SUCCESS`;\nexport const UPDATE_AVAILABLE_PARTS_ERROR = `${UPDATE_AVAILABLE_PARTS_PREFIX}_ERROR`;\nexport const UPDATE_AVAILABLE_PARTS_ERROR_MESSAGE = 'Error updating the catalog';\n\nexport const updateAvailablePartsRequest = () => ({\n type: UPDATE_AVAILABLE_PARTS_REQUEST,\n payload: {\n }\n});\n","import { UPDATE_AVAILABLE_PARTS_SUCCESS } from './updateAvailablePartsRequest';\n\nexport const updateAvailablePartsSuccess = (ids) => ({\n type: UPDATE_AVAILABLE_PARTS_SUCCESS,\n payload: {\n ids,\n }\n});\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport Radio from '@material-ui/core/Radio';\nimport RadioGroup from '@material-ui/core/RadioGroup';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormLabel from '@material-ui/core/FormLabel';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport { getSelectedRobotPartConstraints } from '../../selectors';\nimport { getPartLengths } from '../../../entities/selectors';\n\nimport { standardizeLength } from '../../../../common/utils/length-utils';\n\nimport {\n updateSelectedRobotPartConstraintRequest,\n} from '../../actions';\n\nconst styles = theme => ({\n slider: {\n padding: '26px 0px',\n },\n radioGroup: {\n justifyContent: 'space-between',\n },\n radio: {\n color: theme.palette.primary.main,\n '&$checked': {\n color: theme.palette.primary.main,\n }\n },\n checked: {},\n});\n\n/**\n * Note that the length offset below removes the length of the two end caps for display purposes only.\n * For example, although an X5 Link's total length may be 325mm, the tube length is only 300mm.\n * However, the kinematic solver and HRDF upload process require the full link length.\n * http://docs.hebi.us/hardware.html#x5-link\n */\nconst END_CAPS_LENGTH_OFFSET = 0.025;\n\nconst LinkDialogContent = ({\n classes,\n handleConstraintChanged,\n length,\n lengthOptions,\n twist,\n twistInterval,\n}) => (\n \n {Boolean(lengthOptions && lengthOptions.length) && (\n \n Length (mm)\n\n handleConstraintChanged('length', Number(event.target.value))}\n row={true}\n classes={{\n root: classes.radioGroup,\n }}\n >\n {lengthOptions.map(option => (\n \n }\n label={standardizeLength(option.length - END_CAPS_LENGTH_OFFSET, option.unit)}\n labelPlacement=\"end\"\n />\n ))}\n \n \n )}\n \n \n Twist Interval (degrees)\n handleConstraintChanged('twist', Number(event.target.value*twistInterval))}\n row={true}\n classes={{\n root: classes.radioGroup,\n }}\n >\n {[...Array(Math.round(Math.PI * 2 / twistInterval)).keys()].map(option => (\n \n }\n label={(90*option).toString()+'°'}\n labelPlacement=\"end\"\n />\n ))}\n \n \n \n);\n\nLinkDialogContent.propTypes = {\n handleConstraintChanged: PropTypes.func.isRequired,\n length: PropTypes.number.isRequired,\n lengthOptions: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.number.isRequired,\n length: PropTypes.number.isRequired,\n unit: PropTypes.string.isRequired,\n })).isRequired,\n twist: PropTypes.number.isRequired,\n twistInterval: PropTypes.number.isRequired,\n};\n\nconst mapStateToProps = state => {\n const constraints = getSelectedRobotPartConstraints(state);\n const { length, twist, twistInterval } = constraints;\n const lengthOptions = getPartLengths(state);\n\n return {\n length,\n twist,\n twistInterval,\n lengthOptions,\n };\n};\n\nconst actions = {\n handleConstraintChanged: updateSelectedRobotPartConstraintRequest,\n};\n\nexport default withStyles(styles)(\n connect(mapStateToProps, actions)(LinkDialogContent)\n);\n","import React from 'react';\n\nimport LinkDialogContent from './LinkDialogContent';\n\nexport default {\n Link: {\n DialogContent: LinkDialogContent,\n },\n default: {\n DialogContent: () => ,\n },\n}\n","/**\n * All HEBI figures are defined in meters\n * @param {number} length \n * @param {string} targetUnit \n */\nexport const standardizeLength = (length, targetUnit) => {\n switch (targetUnit.toLowerCase()) {\n case 'millimeters':\n return length;\n case 'meters':\n return length * 1000;\n default:\n return length;\n }\n}","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { withStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport IconButton from '@material-ui/core/IconButton';\nimport DragIndicatorIcon from '@material-ui/icons/DragIndicator';\nimport Paper from '@material-ui/core/Paper';\nimport Tooltip from '@material-ui/core/Tooltip';\n\nimport {\n removeRobotPartRequest,\n togglePlacementMode,\n} from '../../actions';\n\nimport {\n getPlacementMode,\n getSelectedRobotPart,\n} from '../../selectors';\n\nimport {\n setDrawerVisible,\n} from '../../../catalog/actions';\n\nimport strategies from './strategies';\n\nconst styles = theme => ({\n card: {\n width: '330px',\n pointerEvents: 'auto',\n },\n title: {\n fontSize: '20px',\n fontWeight: 600,\n },\n subheader: {\n fontSize: '16px',\n whiteSpace: 'pre',\n },\n cardActions: {\n flexDirection: 'row',\n justifyContent: 'flex-end',\n },\n content: {\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n },\n});\n\nconst ConfiguratorDialog = ({\n category,\n classes,\n className,\n handleRemove,\n handleReplace,\n placementMode,\n title,\n subheader,\n}) => {\n const { DialogContent } = strategies[category] || strategies.default;\n\n const onReplaceClicked = () => {\n handleReplace(placementMode);\n };\n\n const getReplaceButton = () => {\n const inReplaceMode = placementMode === 'replace';\n const color = inReplaceMode ? 'primary' : 'default';\n const variant = inReplaceMode ? 'contained' : 'text';\n\n return (\n \n Replace\n \n )\n };\n\n return (\n \n \n \n \n \n \n \n }\n />\n \n \n \n \n \n {getReplaceButton()}\n \n \n \n )\n};\n\nConfiguratorDialog.propTypes = {\n category: PropTypes.string.isRequired,\n classes: PropTypes.object.isRequired,\n className: PropTypes.string,\n handleRemove: PropTypes.func.isRequired,\n handleReplace: PropTypes.func.isRequired,\n placementMode: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n subheader: PropTypes.string,\n};\n\nconst defaultValues = {\n category: '',\n placementMode: 'place',\n subheader: '',\n title: '',\n};\n\nConfiguratorDialog.defaultProps = defaultValues;\n\nconst mapStateToProps = state => {\n const selectedRobotPart = getSelectedRobotPart(state);\n if (!selectedRobotPart) {\n return defaultValues;\n }\n\n const associatedPart = selectedRobotPart.part;\n const placementMode = getPlacementMode(state);\n\n return {\n title: associatedPart.name,\n placementMode,\n subheader: associatedPart.description,\n category: associatedPart.partCategory.name,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n return {\n handleRemove: () => dispatch(removeRobotPartRequest()),\n handleReplace: placementMode => {\n dispatch(togglePlacementMode());\n const drawerShouldBeVisible = placementMode === 'place';\n dispatch(setDrawerVisible(drawerShouldBeVisible));\n },\n };\n}\n\nexport default withStyles(styles)(\n connect(\n mapStateToProps,\n mapDispatchToProps\n )(ConfiguratorDialog)\n);","export const formatNumber = (value) => {\n value = value || 0;\n const minimumFractionDigits = 2;\n const maximumFractionDigits = 2;\n\n const formattedValue = value.toLocaleString(undefined, {\n minimumFractionDigits,\n maximumFractionDigits,\n });\n\n return formattedValue;\n};\n","export const getPopper = state => state.popper;\n","import { createSelector } from 'reselect';\n\nimport { getPopper } from './getPopper';\n\nexport const getPopperLocation = createSelector(\n getPopper,\n popper => popper.location,\n);\n","import { createSelector } from 'reselect';\n\nimport { getPopper } from './getPopper';\n\nexport const getPopperProps = createSelector(\n getPopper,\n popper => popper.popperProps,\n);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withStyles } from '@material-ui/core/styles';\nimport Card from '@material-ui/core/Card';\nimport CardContent from '@material-ui/core/CardContent';\nimport Paper from '@material-ui/core/Paper';\nimport Typography from '@material-ui/core/Typography';\nimport startCase from 'lodash-es/startCase';\n\nimport { formatNumber } from '../../../common/utils/formatters';\n\nimport {\n getPopperProps,\n} from '../../poppers/selectors';\n\nconst styles = theme => ({\n container: {\n display: 'flex',\n flexDirection: 'column',\n opacity: 0.9,\n },\n});\n\nconst formatLabel = (key, value) => {\n let formattedValue = '';\n value = value || 0;\n\n switch (key) {\n case 'x':\n case 'y':\n case 'z':\n formattedValue = `${formatNumber(value * 1000)} mm`;\n break;\n case 'continuousPayload':\n formattedValue = `${formatNumber(value)} kg`;\n break;\n case 'peakPayload':\n formattedValue = `${formatNumber(value)} kg`;\n break;\n default:\n break;\n }\n\n const formattedKey = startCase(key);\n return `${formattedKey}: ${formattedValue}`;\n}\n\nconst TestDriveGrabberLabel = ({\n classes,\n statistics,\n}) => {\n if (!statistics) {\n return null;\n }\n\n return (\n \n \n \n {Object.entries(statistics).map(([key, value]) => (\n \n {formatLabel(key, value)}\n \n ))}\n \n \n \n );\n};\n\nTestDriveGrabberLabel.propTypes = {\n classes: PropTypes.object.isRequired,\n statistics: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n z: PropTypes.number,\n continuousPayload: PropTypes.number,\n peakPayload: PropTypes.number,\n }),\n};\n\nconst mapStateToProps = state => {\n const popperProps = getPopperProps(state);\n if (!popperProps) {\n return {};\n };\n\n const { statistics } = popperProps;\n\n return {\n statistics,\n };\n};\n\nexport default withStyles(styles)(\n connect(mapStateToProps)(TestDriveGrabberLabel)\n);\n","import './proxima-nova/index.css';\nimport './whitney-semibold/index.css';\n\nexport const PRIMARY_FONT = 'proxima-nova';\nexport const SECONDARY_FONT = 'Whitney-Semibold';\n","import { PRIMARY_FONT } from '../fonts';\n\nexport const typography = {\n useNextVariants: true,\n fontFamily: [\n PRIMARY_FONT,\n 'sans-serif',\n ].join(','),\n h1: {\n fontSize: '96px',\n fontFamily: PRIMARY_FONT,\n fontWeight: 300,\n letterSpacing: '-1.5px',\n },\n h2: {\n fontSize: '60px',\n fontFamily: PRIMARY_FONT,\n fontWeight: 300,\n letterSpacing: '-0.5px',\n lineHeight: '73px',\n },\n h3: {\n fontSize: '48px',\n fontFamily: PRIMARY_FONT,\n lineHeight: '58px',\n },\n h4: {\n fontSize: '34px',\n fontFamily: PRIMARY_FONT,\n letterSpacing: '0.25px',\n lineHeight: '41px',\n },\n h5: {\n fontSize: '24px',\n fontFamily: PRIMARY_FONT,\n lineHeight: '29px',\n },\n h6: {\n fontSize: '20px',\n fontFamily: PRIMARY_FONT,\n fontWeight: 600,\n letterSpacing: '0.15px',\n lineHeight: '24px',\n },\n subtitle1: {\n fontSize: '16px',\n fontFamily: PRIMARY_FONT,\n letterSpacing: '0.15px',\n lineHeight: '20px',\n },\n subtitle2: {\n fontSize: '14px',\n fontFamily: PRIMARY_FONT,\n fontWeight: 600,\n letterSpacing: '0.1px',\n lineHeight: '17px',\n },\n body1: {\n fontSize: '16px',\n fontFamily: PRIMARY_FONT,\n letterSpacing: '0.5px',\n lineHeight: '20px',\n },\n body2: {\n fontSize: '14px',\n fontFamily: PRIMARY_FONT,\n letterSpacing: '0.25px',\n lineHeight: '18px',\n },\n button: {\n fontSize: '14px',\n fontFamily: PRIMARY_FONT,\n fontWeight: 600,\n letterSpacing: '1.25px',\n lineHeight: '17px',\n },\n caption: {\n fontSize: '12px',\n fontFamily: PRIMARY_FONT,\n letterSpacing: '0.4px',\n lineHeight: '15px',\n },\n overline: {\n fontSize: '10px',\n fontFamily: PRIMARY_FONT,\n letterSpacing: '1.5px',\n lineHeight: '12px',\n },\n};\n\nexport const zIndex = {\n mobileStepper: 1000,\n workspace: 1099,\n appBar: 1100,\n drawer: 1200,\n modal: 1300,\n snackbar: 1400,\n tooltip: 1500,\n};\n","import { createMuiTheme } from '@material-ui/core/styles';\n\nimport {\n typography,\n zIndex,\n} from './variables';\n\nconst secondaryColor = '#DCD521';\n\nlet theme = createMuiTheme({\n typography: {\n ...typography,\n color: '#F1F1EF',\n },\n zIndex,\n palette: {\n type: 'dark',\n primary: {\n main: '#64F8AF',\n },\n secondary: {\n main: secondaryColor,\n },\n neutral: {\n light: {\n color: '#6F6E68',\n },\n }\n },\n overrides: {\n MuiSlider: {\n track: { backgroundColor: secondaryColor },\n thumb: { backgroundColor: secondaryColor },\n },\n }\n});\n\nexport default theme;\n","export const POPPER_HIDE = 'POPPER_HIDE';\n\nexport const hidePopper = () => ({\n type: POPPER_HIDE,\n});\n","export const POPPER_SHOW = 'POPPER_SHOW';\n\nexport const showPopper = (x, y, type, popperProps) => ({\n type: POPPER_SHOW,\n payload: {\n location: {\n x,\n y,\n },\n type,\n popperProps,\n },\n});\n","export const POPPER_UPDATE_PREFIX = 'POPPER_UPDATE';\nexport const POPPER_UPDATE_REQUEST = `${POPPER_UPDATE_PREFIX}_REQUEST`;\nexport const POPPER_UPDATE_SUCCESS = `${POPPER_UPDATE_PREFIX}_POPPER_UPDATE_SUCCESS`;\n\nexport const updatePopperRequest = (x, y, popperProps) => ({\n type: POPPER_UPDATE_REQUEST,\n payload: {\n location: {\n x,\n y,\n },\n popperProps,\n },\n});\n","import {\n POPPER_UPDATE_SUCCESS,\n} from './updatePopperRequest';\n\nexport const updatePopperSuccess = (location, popperProps) => ({\n type: POPPER_UPDATE_SUCCESS,\n payload: {\n location,\n popperProps,\n },\n});\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport autoBind from 'react-autobind';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport { MuiThemeProvider } from '@material-ui/core/styles';\nimport Draggable from 'react-draggable';\n\nimport darkTheme from '../../common/themes/material-dark-theme';\n\nimport {\n updatePopperRequest,\n} from './actions';\n\nimport {\n getPopperLocation,\n} from './selectors';\n\nconst styles = theme => ({\n container: {\n position: 'absolute',\n zIndex: theme.zIndex.modal,\n pointerEvents: 'none',\n },\n});\n\nclass Popper extends React.Component {\n constructor(props) {\n super(props);\n autoBind(this);\n }\n\n handleDrag(e, position) {\n const { x, y } = position;\n this.props.handlePopperUpdate(x, y);\n }\n\n render() {\n const {\n children,\n classes,\n location,\n } = this.props;\n\n return (\n \n \n
\n {children}\n
\n \n
\n );\n }\n}\n\nPopper.propTypes = {\n children: PropTypes.node.isRequired,\n classes: PropTypes.object.isRequired,\n location: PropTypes.shape({\n x: PropTypes.number,\n y: PropTypes.number,\n }),\n};\n\nconst mapStateToProps = state => ({\n location: getPopperLocation(state),\n});\n\nconst actions = {\n handlePopperUpdate: updatePopperRequest,\n};\n\nexport default withStyles(styles)(\n connect(mapStateToProps, actions)(Popper)\n);\n","import React from 'react';\nimport { connect } from 'react-redux';\n\nimport ConfiguratorDialog from '../configurator/components/dialogs/ConfiguratorDialog';\nimport TestDriveGrabberLabel from '../configurator/components/TestDriveGrabberLabel';\n\nimport Popper from './Popper';\nimport { getPopper } from './selectors';\n\nconst popperTypes = {\n ConfiguratorDialog,\n TestDriveGrabberLabel,\n};\n\nexport class PopperManager extends React.Component {\n render() {\n const { popper } = this.props;\n const { show, location, type, popperProps = {} } = popper;\n\n let dialog = null;\n\n if (show) {\n const PopperComponent = popperTypes[type];\n\n if (PopperComponent) {\n dialog = (\n \n \n \n );\n }\n }\n\n return dialog;\n }\n}\n\nconst mapStateToProps = (state) => ({\n popper: getPopper(state),\n});\n\nexport default connect(mapStateToProps)(PopperManager);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport AddBoxIcon from '@material-ui/icons/AddBox';\nimport Button from '@material-ui/core/Button';\nimport RefreshIcon from '@material-ui/icons/Refresh';\n\nconst styles = theme => ({\n buttons: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n button: {\n minWidth: '170px',\n margin: theme.spacing.unit,\n },\n icon: {\n paddingRight: theme.spacing.unit,\n },\n});\n\nconst RobotBuilderButtonBarDesktop = ({\n classes,\n handleAddComponentClick,\n handleNewSessionClick,\n}) => (\n
\n \n \n New Session\n \n \n \n Component\n \n
\n);\n\nRobotBuilderButtonBarDesktop.propTypes = {\n classes: PropTypes.object.isRequired,\n handleAddComponentClick: PropTypes.func.isRequired,\n handleNewSessionClick: PropTypes.func.isRequired,\n};\n\nexport default withStyles(styles)(RobotBuilderButtonBarDesktop);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport AddBoxIcon from '@material-ui/icons/AddBox';\nimport IconButton from '@material-ui/core/IconButton';\nimport RefreshIcon from '@material-ui/icons/Refresh';\nimport Tooltip from '@material-ui/core/Tooltip';\n\nconst styles = theme => ({\n buttons: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n button: {\n margin: theme.spacing.unit,\n },\n});\n\nconst RobotBuilderButtonBarMobile = ({\n classes,\n handleAddComponentClick,\n handleNewSessionClick,\n}) => (\n
\n \n \n \n \n \n\n \n \n \n \n \n \n
\n);\n\nRobotBuilderButtonBarMobile.propTypes = {\n classes: PropTypes.object.isRequired,\n handleAddComponentClick: PropTypes.func.isRequired,\n handleNewSessionClick: PropTypes.func.isRequired,\n};\n\nexport default withStyles(styles)(RobotBuilderButtonBarMobile);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport withWidth, { isWidthDown } from '@material-ui/core/withWidth';\n\nimport {\n createRobotRequest,\n} from '../../configurator/actions';\n\nimport {\n toggleDrawerVisible as toggleComponentCatalogDrawerVisible,\n} from '../../catalog/actions';\n\nimport RobotBuilderButtonBarDesktop from './RobotBuilderButtonBarDesktop';\nimport RobotBuilderButtonBarMobile from './RobotBuilderButtonBarMobile';\n\nconst RobotBuilderButtonBar = ({\n handleAddComponentClick,\n handleNewSessionClick,\n width,\n}) => {\n if (isWidthDown('xs', width)) {\n return (\n \n )\n }\n\n return (\n \n )\n};\n\nRobotBuilderButtonBar.propTypes = {\n width: PropTypes.string.isRequired,\n handleAddComponentClick: PropTypes.func.isRequired,\n handleNewSessionClick: PropTypes.func.isRequired,\n}\n\nconst actions = {\n handleAddComponentClick: toggleComponentCatalogDrawerVisible,\n handleNewSessionClick: createRobotRequest,\n};\n\nexport default withWidth()(\n connect(null, actions)(RobotBuilderButtonBar)\n);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport { Link } from 'react-router-dom';\nimport logo from '../../../common/images/hebi-logo.svg';\n\nconst styles = theme => ({\n logo: {\n height: '26.98px',\n width: '81.36px',\n },\n});\n\nconst HebiLogo = ({ classes }) => (\n \n \n \n);\n\nHebiLogo.propTypes = {\n height: PropTypes.number,\n width: PropTypes.number,\n};\n\nexport default withStyles(styles)(HebiLogo);\n"," export const createLoadingSelector = actions => state =>\n actions.some(action => state.loading[action]);","import * as catalogActions from '../../catalog/actions';\nimport * as configurationActions from '../../configurator/actions';\n\nimport { createLoadingSelector } from './createLoadingSelector';\n\nconst allActions = {\n ...catalogActions,\n ...configurationActions,\n};\n\nconst actionsToMonitor = Object.entries(allActions).reduce((result, [name, value]) => {\n if (name && name.length && name.endsWith('PREFIX')) {\n result.push(value);\n }\n\n return result;\n}, []);\n\nexport const getApplicationIsLoading = createLoadingSelector(actionsToMonitor);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withStyles } from '@material-ui/core/styles';\nimport LinearProgress from '@material-ui/core/LinearProgress';\n\nimport { getApplicationIsLoading } from '../../selectors';\n\nconst styles = theme => ({\n container: {\n zIndex: theme.zIndex.appBar,\n },\n});\n\nconst ProgressBar = ({\n classes,\n isLoading,\n}) => (\n \n \n \n);\n\nProgressBar.propTypes = {\n classes: PropTypes.object.isRequired,\n isLoading: PropTypes.bool.isRequired,\n};\n\nconst mapStateToProps = state => ({\n isLoading: getApplicationIsLoading(state),\n});\n\nexport default withStyles(styles)(\n connect(mapStateToProps)(ProgressBar)\n);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withRouter } from 'react-router-dom';\nimport { connect } from 'react-redux';\nimport { withStyles } from '@material-ui/core/styles';\nimport AppBar from '@material-ui/core/AppBar';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport Typography from '@material-ui/core/Typography';\n\nimport RobotBuilderButtonBar from './RobotBuilderButtonBar';\nimport HebiLogo from '../../shared/HebiLogo';\nimport { getInBuildMode } from '../../configurator/selectors';\nimport ProgressBar from '../../loading/components/ProgressBar/ProgressBar';\n\nconst styles = theme => ({\n appBar: {\n zIndex: theme.zIndex.drawer + 1,\n },\n toolbar: {\n '& > div': {\n paddingLeft: theme.spacing.unit * 6,\n },\n [theme.breakpoints.up('md')]: {\n paddingLeft: theme.spacing.unit * 6,\n paddingRight: theme.spacing.unit * 6,\n },\n },\n titleContainer: {\n flex: 1,\n },\n title: {\n textTransform: 'uppercase',\n [theme.breakpoints.down('sm')]: {\n display: 'none',\n },\n color: theme.palette.neutral.darker.color,\n },\n});\n\nconst AppNav = ({\n classes,\n showRobotBuilderButtons,\n}) => (\n \n \n \n
\n \n 3D Configurator\n \n
\n\n {\n showRobotBuilderButtons && \n }\n
\n \n
\n);\n\nAppNav.propTypes = {\n classes: PropTypes.object.isRequired,\n location: PropTypes.object.isRequired,\n showRobotBuilderButtons: PropTypes.bool.isRequired,\n};\n\nconst mapStateToProps = (state, props) => {\n const { location } = props;\n const currentlyInBuildMode = getInBuildMode(state, location);\n\n return {\n showRobotBuilderButtons: currentlyInBuildMode,\n };\n};\n\nexport default withRouter(\n withStyles(styles)(connect(mapStateToProps)(AppNav))\n);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport IconButton from '@material-ui/core/IconButton';\nimport Button from '@material-ui/core/Button';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n faEnvelope,\n} from '@fortawesome/free-regular-svg-icons';\nimport {\n faTwitter,\n faYoutube,\n faInstagram,\n faLinkedin,\n} from '@fortawesome/free-brands-svg-icons';\n\nconst styles = theme => ({\n container: {\n display: 'flex',\n flexDirection: 'row',\n minHeight: '104px',\n boxShadow: '0 2px 4px 0 rgba(0,0,0,0.5)',\n backgroundColor: theme.palette.neutral.main.color,\n zIndex: theme.zIndex.appBar,\n },\n innerContainer: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n flex: 1,\n [theme.breakpoints.down('sm')]: {\n paddingTop: theme.spacing.unit,\n paddingBottom: theme.spacing.unit,\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n },\n },\n icon: {\n color: theme.palette.text.primary,\n },\n text: {\n color: theme.palette.text.secondary,\n },\n button: {\n textTransform: 'lowercase',\n fontWeight: 'normal',\n [theme.breakpoints.up('md')]: {\n margin: theme.spacing.unit * 2,\n },\n },\n urlContainer: {\n [theme.breakpoints.up('md')]: {\n marginRight: theme.spacing.unit * 2,\n },\n },\n});\n\nconst links = [{\n id: 'mail',\n icon: faEnvelope,\n href: 'mailto:info@hebirobotics.com',\n newTab: false,\n}, {\n id: 'youtube',\n icon: faYoutube,\n href: 'https://www.youtube.com/channel/UCIOok6K_XlNoDPgCNPhDQnA',\n newTab: true,\n}, {\n id: 'twitter',\n icon: faTwitter,\n href: 'https://twitter.com/HebiRobotics',\n newTab: true,\n}, {\n id: 'instagram',\n icon: faInstagram,\n href: 'https://www.instagram.com/hebirobotics/',\n newTab: true,\n}, {\n id: 'linkedIn',\n icon: faLinkedin,\n href: 'https://www.linkedin.com/company/hebi-robotics/ ',\n newTab: true,\n}];\n\nconst AppFooter = ({ classes }) => (\n \n
\n
\n \n hebirobotics.com\n \n\n \n docs.hebi.us\n \n
\n\n
\n {\n links.map(link => (\n \n \n \n \n \n ))\n }\n
\n
\n
\n);\n\nAppFooter.propTypes = {\n classes: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(AppFooter);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Typography from '@material-ui/core/Typography';\n\nconst GettingStartedCardContent = ({\n description,\n title,\n}) => (\n \n \n {title}\n \n {\n description && description.length &&\n \n {description}\n \n }\n \n);\n\nGettingStartedCardContent.propTypes = {\n description: PropTypes.string,\n title: PropTypes.string,\n};\n\nGettingStartedCardContent.defaultProps = {\n description: '',\n};\n\nexport default GettingStartedCardContent;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\n\nconst styles = theme => ({\n media: {\n height: 182,\n backgroundColor: theme.palette.neutral.dark.color,\n alignItems: 'center',\n justifyContent: 'center',\n display: 'flex',\n },\n});\n\nconst GettingStartedCardIconMedia = ({\n classes,\n icon,\n}) => (\n
\n {icon}\n
\n);\n\nGettingStartedCardIconMedia.propTypes = {\n classes: PropTypes.object.isRequired,\n icon: PropTypes.node.isRequired,\n};\n\nexport default withStyles(styles)(GettingStartedCardIconMedia);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\n\nconst styles = theme => ({\n card: {\n [theme.breakpoints.only('xs')]: {\n flexWrap: 'wrap',\n minWidth: 288,\n },\n [theme.breakpoints.up('sm')]: {\n width: 288,\n },\n display: 'flex',\n flexDirection: 'column',\n marginBottom: '10px',\n },\n actions: {\n display: 'flex',\n flex: 1,\n alignItems: 'flex-end',\n },\n});\n\nconst GettingStartedCard = ({\n classes,\n media,\n content,\n actions,\n}) => (\n \n {media}\n \n {content}\n \n \n {actions}\n \n \n);\n\nGettingStartedCard.propTypes = {\n classes: PropTypes.object.isRequired,\n media: PropTypes.node.isRequired,\n content: PropTypes.node.isRequired,\n actions: PropTypes.node.isRequired,\n};\n\nexport default withStyles(styles)(GettingStartedCard);\n","import { createLoadingSelector } from '../../loading/selectors';\nimport {\n ROBOT_UPLOAD_HRDF_PREFIX,\n ROBOT_LOAD_PREFIX,\n ROBOT_CREATE_PREFIX,\n ROBOT_CREATE_WITH_PART_PREFIX,\n} from '../../configurator/actions';\n\nexport const getIsCreatingRobot = createLoadingSelector([\n ROBOT_UPLOAD_HRDF_PREFIX,\n ROBOT_LOAD_PREFIX,\n ROBOT_CREATE_PREFIX,\n ROBOT_CREATE_WITH_PART_PREFIX,\n]);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Button from '@material-ui/core/Button';\nimport { withStyles } from '@material-ui/core/styles';\nimport { connect } from 'react-redux';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n faCloudUploadAlt,\n} from '@fortawesome/free-solid-svg-icons';\n\nimport DefaultCardBody from '../../components/GettingStartedCardContent';\nimport IconCardMedia from '../../components/GettingStartedCardIconMedia';\nimport GettingStartedCard from '../../components/GettingStartedCard';\n\nimport {\n getIsCreatingRobot,\n} from '../../selectors';\n\nimport {\n uploadHRDFRequest,\n} from '../../../configurator/actions';\n\nconst styles = theme => ({\n input: {\n display: 'none',\n },\n wrapperLabel: {\n position: 'relative',\n },\n buttonProgress: {\n position: 'absolute',\n top: '50%',\n left: '50%',\n marginTop: -12,\n marginLeft: -12,\n },\n icon: {\n color: theme.palette.neutral.darkest.color,\n },\n});\n\nconst LoadHRDFCard = ({\n classes,\n handleHRDFLoad,\n isSubmitting,\n}) => (\n \n }\n />\n }\n content={\n \n }\n actions={\n \n {!isSubmitting && {\n if (!event.target.files || !event.target.files.length) {\n return;\n }\n\n const reader = new FileReader();\n reader.onload = async (event) => {\n const base64 = event.target.result.split(',').pop();\n handleHRDFLoad(base64);\n };\n\n reader.readAsDataURL(event.target.files[0]);\n event.target.value = null;\n }}\n />}\n \n \n }\n />\n);\n\nLoadHRDFCard.propTypes = {\n classes: PropTypes.object.isRequired,\n handleHRDFLoad: PropTypes.func.isRequired,\n isSubmitting: PropTypes.bool.isRequired,\n};\n\nconst mapStateToProps = state => ({\n isSubmitting: getIsCreatingRobot(state),\n});\n\nconst actions = {\n handleHRDFLoad: uploadHRDFRequest,\n};\n\nexport default connect(mapStateToProps, actions)(\n withStyles(styles)(LoadHRDFCard)\n);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport CardMedia from '@material-ui/core/CardMedia';\n\nconst styles = theme => ({\n media: {\n height: 182,\n },\n});\n\nconst GettingStartedCardMedia = ({\n classes,\n imageUrl,\n}) => (\n \n);\n\nGettingStartedCardMedia.propTypes = {\n classes: PropTypes.object.isRequired,\n imageUrl: PropTypes.string.isRequired,\n};\n\nexport default withStyles(styles)(GettingStartedCardMedia);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Button from '@material-ui/core/Button';\n\nconst GettingStartedCardActions = ({\n confirmButtonText,\n confirmButtonDisabled,\n onClick,\n}) => (\n \n {confirmButtonText}\n \n);\n\nGettingStartedCardActions.defaultProps = {\n confirmButtonDisabled: false,\n};\n\nGettingStartedCardActions.propTypes = {\n confirmButtonText: PropTypes.string.isRequired,\n confirmButtonDisabled: PropTypes.bool,\n onClick: PropTypes.func.isRequired,\n};\n\nexport default GettingStartedCardActions;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withRouter } from 'react-router-dom';\nimport { connect } from 'react-redux';\n\nimport DefaultCardBody from '../../components/GettingStartedCardContent';\nimport DefaultCardMedia from '../../components/GettingStartedCardMedia';\nimport DefaultCardActions from '../../components/GettingStartedCardActions';\n\nimport GettingStartedCard from '../../components/GettingStartedCard';\n\nimport emptyWorkspaceImage from './empty-workspace.png';\n\nimport {\n getIsCreatingRobot,\n} from '../../selectors';\n\nimport {\n createRobotRequest,\n} from '../../../configurator/actions';\n\nconst FromScratchCard = ({\n handleCreateRobot,\n isSubmitting,\n}) => (\n \n }\n content={\n \n }\n actions={\n \n }\n />\n);\n\nFromScratchCard.propTypes = {\n handleCreateRobot: PropTypes.func.isRequired,\n isSubmitting: PropTypes.bool.isRequired,\n};\n\nconst mapStateToProps = state => ({\n isSubmitting: getIsCreatingRobot(state),\n});\n\nconst actions = {\n handleCreateRobot: createRobotRequest,\n};\n\nexport default withRouter(\n connect(mapStateToProps, actions)(FromScratchCard)\n);\n","import LoadHRDFCard from './LoadHRDFCard';\nimport FromScratchCard from './FromScratchCard';\n\nexport default [\n LoadHRDFCard,\n FromScratchCard,\n];\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Grow from '@material-ui/core/Grow';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport Cards from '../cards';\n\nconst styles = theme => ({\n container: {\n display: 'flex',\n justifyContent: 'center',\n flexWrap: 'wrap',\n flexDirection: 'row',\n [theme.breakpoints.up('sm')]: {\n '& > div': {\n marginLeft: theme.spacing.unit * 2,\n marginRight: theme.spacing.unit * 2,\n },\n },\n },\n});\n\nconst GettingStartedCardList = ({\n classes,\n}) => (\n
\n {Cards.map((Card, i) => (\n \n
\n \n
\n \n ))}\n
\n);\n\nGettingStartedCardList.propTypes = {\n classes: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(GettingStartedCardList);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\n\nimport { SECONDARY_FONT } from '../../../common/fonts';\n\nimport GettingStartedCardsList from '../components/GettingStartedCardList';\n\nconst styles = theme => ({\n container: {\n backgroundColor: theme.palette.neutral.darkest.color,\n display: 'flex',\n flex: 1,\n flexDirection: 'column'\n },\n title: {\n textAlign: 'center',\n fontFamily: SECONDARY_FONT,\n textTransform: 'uppercase',\n color: theme.palette.secondary.main,\n letterSpacing: '2.5px',\n fontWeight: 'bold',\n marginBottom: '2em',\n },\n});\n\nconst GettingStartedPage = ({\n classes,\n}) => (\n
\n \n How would you like to get started?\n \n\n \n
\n);\n\nGettingStartedPage.propTypes = {\n classes: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(GettingStartedPage);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport Icon from '@material-ui/core/Icon';\n\nconst styles = theme => ({\n container: {\n display: 'flex',\n position: 'absolute',\n alignSelf: 'center',\n flexDirection: 'row',\n justifyContent: 'space-evenly',\n zIndex: theme.zIndex.workspace + 1,\n top: theme.spacing.unit * 2,\n pointerEvents: 'none',\n },\n instructionIcon: {\n margin: theme.spacing.unit * 1.5,\n color: theme.palette.neutral.darkest.color,\n },\n instructionText: {\n alignSelf: 'center',\n marginRight: theme.spacing.unit * 2.5,\n color: theme.palette.neutral.darkest.color\n },\n});\n\nconst WorkspaceInstructions = ({\n classes,\n instructions,\n}) => (\n
\n {instructions.map(({ icon, instruction }) => (\n \n \n {icon}\n \n \n {instruction}\n \n \n ))}\n
\n);\n\nWorkspaceInstructions.propTypes = {\n classes: PropTypes.object.isRequired,\n instructions: PropTypes.arrayOf(PropTypes.shape({\n icon: PropTypes.string.isRequired,\n instruction: PropTypes.string.isRequired,\n })).isRequired,\n};\n\nexport default withStyles(styles)(WorkspaceInstructions);\n","export const getCatalog = state => state.catalog;\n","import { createSelector } from 'reselect';\n\nimport { getCatalog } from './getCatalog';\n\nexport const getSelectedCategoryId = createSelector(\n getCatalog,\n catalog => catalog.selectedCategoryId,\n);\n","import { createSelector } from 'reselect';\n\nimport { getEntitiesSession } from '../../entities/selectors';\nimport { getSelectedCategoryId } from './getSelectedCategoryId';\n\nexport const getPartsInSelectedCategory = createSelector(\n [getEntitiesSession, getSelectedCategoryId],\n (session, selectedCategoryId) => {\n const { Part, PartCategory } = session;\n \n if (!selectedCategoryId || !PartCategory.idExists(selectedCategoryId)) {\n return [];\n }\n \n const parts = Part\n .all()\n .toModelArray()\n .filter(p => p.partCategory.id === selectedCategoryId);\n\n return parts;\n }\n);","import { createSelector } from 'reselect';\n\nimport { getEntitiesSession } from '../../entities/selectors';\n\nexport const getPartIdsAvailableForCatalogSelection = createSelector(\n getEntitiesSession,\n session => {\n const { Part } = session;\n const availablePartIds = Part\n .all()\n .filter(p => p.enabledForWorkspace === true)\n .toRefArray()\n .map(p => p.id);\n\n return availablePartIds;\n }\n);\n","import { createSelector } from 'reselect';\n\nimport { getPartsInSelectedCategory } from './getPartsInSelectedCategory';\nimport { getPartIdsAvailableForCatalogSelection } from './getPartIdsAvailableForCatalogSelection';\n\nexport const getCatalogParts = createSelector(\n [getPartsInSelectedCategory, getPartIdsAvailableForCatalogSelection],\n (partsInSelectedCategory, availablePartIds) => {\n if (!partsInSelectedCategory || !partsInSelectedCategory.length) {\n return [];\n }\n\n availablePartIds = availablePartIds || [];\n\n const parts = partsInSelectedCategory\n .map(({ id, name, description, thumbnailUrl }) => ({\n id,\n name,\n description,\n thumbnailUrl,\n enabled: availablePartIds.includes(id),\n }));\n \n return parts;\n }\n);\n","import { createSelector } from 'reselect';\n\nimport { getCatalog } from './getCatalog';\n\nexport const getDrawerIsVisible = createSelector(\n getCatalog,\n catalog => catalog.componentDrawerVisible,\n);\n","import { createSelector } from 'reselect';\n\nimport { getEntitiesSession } from '../../entities/selectors';\nimport { getSelectedCategoryId } from './getSelectedCategoryId';\n\nexport const getSelectedCategory = createSelector(\n [getEntitiesSession, getSelectedCategoryId],\n (session, selectedCategoryId) => {\n const { PartCategory } = session;\n\n if (!selectedCategoryId || !PartCategory.idExists(selectedCategoryId)) {\n return null;\n }\n \n const category = PartCategory.withId(selectedCategoryId);\n return category;\n }\n);\n","import { createSelector } from 'reselect';\n\nimport { getCatalog } from './getCatalog';\n\nexport const getSelectedPartId = createSelector(\n getCatalog,\n catalog => catalog.selectedPartId\n);\n","import { createSelector } from 'reselect';\n\nimport { getEntitiesSession } from '../../entities/selectors';\nimport { getSelectedPartId } from './getSelectedPartId';\n\nexport const getSelectedPart = createSelector(\n [getEntitiesSession, getSelectedPartId],\n (session, selectedPartId) => {\n const { Part } = session;\n\n if (!selectedPartId || !Part.idExists(selectedPartId)) {\n return null;\n }\n \n const part = Part.withId(selectedPartId);\n return part;\n }\n);\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withStyles } from '@material-ui/core/styles';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport Select from '@material-ui/core/Select';\nimport OutlinedInput from '@material-ui/core/OutlinedInput';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport FormControl from '@material-ui/core/FormControl';\nimport pluralize from 'pluralize';\n\nimport { getEntitiesSession } from '../../entities/selectors';\nimport { getSelectedCategoryId } from '../selectors';\nimport { setSelectedCategory } from '../actions';\n\nconst styles = theme => ({\n formControl: {\n margin: theme.spacing.unit,\n minWidth: '120px',\n },\n});\n\nclass CategorySelect extends React.Component {\n state = {\n labelWidth: 0,\n }\n\n componentDidMount() {\n this.setState({\n labelWidth: ReactDOM.findDOMNode(this.inputLabelRef).offsetWidth,\n });\n }\n\n render() {\n const {\n categories,\n classes,\n handleCategoryChange,\n selectedCategory,\n } = this.props;\n\n return (\n \n {\n this.inputLabelRef = ref;\n }}\n >\n Category\n \n handleCategoryChange(target.value)}\n input={\n \n }\n >\n {\n categories && categories.length &&\n categories.filter(({ id, name, enabled }) => ( name !== \"Base Plates\" )).map(({ id, name, enabled }) => (\n {name}\n ))\n }\n \n \n )\n }\n}\n\nCategorySelect.propTypes = {\n categories: PropTypes.arrayOf(PropTypes.shape({\n id: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n })),\n classes: PropTypes.object.isRequired,\n handleCategoryChange: PropTypes.func.isRequired,\n selectedCategory: PropTypes.oneOfType([\n PropTypes.oneOf(['']),\n PropTypes.number,\n ]).isRequired,\n};\n\nconst mapStateToProps = state => {\n const session = getEntitiesSession(state);\n const { Part, PartCategory } = session;\n\n const categories = PartCategory.all().toModelArray().map(({id, name}) => ({\n id,\n name: pluralize(name),\n enabled: Part.all().toModelArray().filter(p => p.partCategory.id === id).some(p => p.enabledForWorkspace),\n }));\n\n let selectedCategory = getSelectedCategoryId(state);\n selectedCategory = selectedCategory || '';\n\n return {\n categories,\n selectedCategory,\n };\n};\n\nconst actions = {\n handleCategoryChange: id => setSelectedCategory(id || null),\n};\n\nexport default withStyles(styles)(\n connect(mapStateToProps, actions)(CategorySelect)\n);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport pluralize from 'pluralize';\nimport { withStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport Divider from '@material-ui/core/Divider';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport Typography from '@material-ui/core/Typography';\n\nimport { addPartToWorkspaceRequest } from '../../configurator/actions';\n\nimport { getPlacementMode } from '../../configurator/selectors';\n\nimport {\n getCatalogParts,\n getSelectedCategory,\n} from '../selectors';\n\nconst styles = theme => ({\n container: {\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n },\n seriesText: {\n marginLeft: '16px',\n marginTop: '22px'\n },\n listItem: {\n display: 'flex',\n flexDirection: 'row'\n },\n description: {\n whiteSpace: 'pre',\n },\n partImage: {\n flex: 1,\n height: '126px',\n maxWidth: '126px',\n marginRight: '16px',\n display: 'flex',\n justifyContent: 'center',\n border: '1px solid',\n borderColor: theme.palette.neutral.darker.color,\n backgroundColor: theme.palette.neutral.workspace.color\n },\n partImageAltText: {\n alignSelf: 'center'\n },\n itemInfo: {\n flex: 1,\n height: '128px',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between'\n },\n partName: {\n marginBottom: '8px'\n },\n placeButton: {\n maxWidth: '82px'\n }\n});\n\nclass ComponentsList extends React.Component {\n handleAddPart(id) {\n const { addPartToWorkspaceRequest } = this.props;\n\n return () => {\n addPartToWorkspaceRequest(id);\n };\n }\n\n renderThumbnailOrPlaceholder(part, classes) {\n if (part.thumbnailUrl) {\n return (\n \n );\n }\n\n return (\n
\n \n Coming Soon!\n \n
\n );\n }\n\n render() {\n const {\n addPartButtonText,\n classes,\n parts,\n partCategory,\n } = this.props;\n\n if (!partCategory) {\n return
;\n }\n\n return (\n
\n \n {`X-Series ${pluralize(partCategory.name)}`}\n \n \n {parts.sort((a, b) => {\n if (a.enabled === b.enabled) {\n return 0;\n } else if (a.enabled) {\n return -1;\n }\n return 1;\n }).map((part, i) => (\n
\n \n {this.renderThumbnailOrPlaceholder(part, classes)}\n
\n
\n \n {part.name}\n \n\n {\n part.description &&\n \n {part.description}\n \n }\n
\n \n {addPartButtonText}\n \n
\n
\n {i < parts.length && (\n
  • \n \n
  • \n )}\n
    \n ))}\n
    \n
    \n );\n }\n}\n\nComponentsList.propTypes = {\n addPartButtonText: PropTypes.string.isRequired,\n addPartToWorkspaceRequest: PropTypes.func.isRequired,\n parts: PropTypes.array.isRequired,\n partCategory: PropTypes.object\n};\n\nconst mapStateToProps = state => {\n const partCategory = getSelectedCategory(state);\n const parts = getCatalogParts(state);\n const placementMode = getPlacementMode(state);\n\n const addPartButtonText = placementMode;\n\n return {\n addPartButtonText,\n parts,\n partCategory,\n };\n};\n\nconst actions = {\n addPartToWorkspaceRequest,\n};\n\nexport default withStyles(styles)(\n connect(\n mapStateToProps,\n actions\n )(ComponentsList)\n);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withStyles } from '@material-ui/core/styles';\nimport Drawer from '@material-ui/core/Drawer';\nimport Divider from '@material-ui/core/Divider';\nimport Typography from '@material-ui/core/Typography';\nimport IconButton from '@material-ui/core/IconButton';\nimport CloseIcon from '@material-ui/icons/Close';\n\nimport { getDrawerIsVisible as getCatalogDrawerIsVisible } from '../selectors';\nimport { setDrawerVisible as setComponentCatalogDrawerVisible } from '../actions';\n\nimport CategorySelect from './CategorySelect';\nimport ComponentsList from './ComponentsList';\n\nconst drawerWidth = 320;\n\nconst styles = theme => ({\n drawer: {\n width: drawerWidth,\n flexShrink: 0,\n },\n drawerPaper: {\n backgroundColor: theme.palette.neutral.light.color,\n width: drawerWidth,\n },\n content: {\n flexGrow: 1,\n padding: theme.spacing.unit * 3,\n },\n toolbar: theme.mixins.toolbar,\n header: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n margin: theme.spacing.unit,\n },\n});\n\nconst ComponentCatalogDrawer = ({\n classes,\n isVisible,\n handleDrawerClose,\n}) => (\n \n
    \n\n
    \n \n Components\n \n \n \n \n
    \n\n \n\n \n\n \n \n);\n\nComponentCatalogDrawer.propTypes = {\n components: PropTypes.array,\n isVisible: PropTypes.bool.isRequired,\n};\n\nconst mapStateToProps = state => ({\n isVisible: getCatalogDrawerIsVisible(state),\n});\n\nconst actions = {\n handleDrawerClose: () => setComponentCatalogDrawerVisible(false),\n}\n\nexport default withStyles(styles)(connect(mapStateToProps, actions)(ComponentCatalogDrawer));\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport { exportRobotRequest } from '../actions/exportRobotRequest';\nimport { openModal } from '../../modals/actions';\n\nconst styles = theme => ({\n exportRobot: {\n display: 'flex',\n position: 'absolute',\n bottom: theme.spacing.unit * 3,\n alignSelf: 'flex-end',\n flexDirection: 'row',\n justifyContent: 'space-evenly',\n zIndex: theme.zIndex.workspace + 1,\n },\n exportRobotButton: {\n borderColor: theme.palette.neutral.main.color,\n height: '40px',\n },\n feedbackButton: {\n borderColor: theme.palette.neutral.main.color,\n height: '40px',\n marginRight: '10px',\n backgroundColor: '#FDFF0055'\n },\n});\n\nconst ExportRobotButton = ({\n classes,\n handleExportRobot,\n handleFeedbackClick,\n}) => (\n
    \n \n THIS IS A BETA! Provide Feedback\n \n \n Export HRDF\n \n
    \n);\n\nExportRobotButton.propTypes = {\n classes: PropTypes.object.isRequired,\n};\n\nconst actions = {\n handleExportRobot: () => exportRobotRequest(),\n handleFeedbackClick: () => openModal('FeedbackModal'),\n };\n\nexport default withStyles(styles)(connect( null, actions)(ExportRobotButton));\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport ButtonBase from '@material-ui/core/ButtonBase';\n\nconst styles = theme => ({\n toggleButton: {\n height: '48px',\n width: '48px',\n alignContent: 'center',\n border: '1px solid',\n borderColor: theme.palette.neutral.dark.color,\n backgroundColor: theme.palette.neutral.workspace.contrastText,\n boxShadow: '1px 1px 3px 0 rgba(0,0,0,0.4)',\n '&:hover': {\n backgroundColor: '#F1F1EF'\n },\n '&:disabled': {\n color: theme.palette.neutral.main.color\n }\n }\n});\n\nconst ToggleButton = ({ classes, onClick, disabled, children }) => (\n \n {children}\n \n);\n\nToggleButton.propTypes = {\n classes: PropTypes.object.isRequired,\n onClick: PropTypes.func.isRequired,\n disabled: PropTypes.bool,\n children: PropTypes.element.isRequired,\n};\n\nexport default withStyles(styles)(ToggleButton);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { AxisArrow } from 'mdi-material-ui';\nimport { resetCamera } from '../actions';\nimport ToggleButton from '../../shared/Components/ToggleButton';\n\nconst styles = theme => ({\n workspaceToolbar: {\n zIndex: theme.zIndex.appBar,\n position: 'absolute',\n bottom: theme.spacing.unit * 3,\n display: 'flex'\n }\n});\n\nconst WorkspaceToolbar = ({ resetCamera, classes }) => (\n
    \n \n
    \n \n \n \n
    \n
    \n
    \n);\n\nWorkspaceToolbar.propTypes = {\n classes: PropTypes.object.isRequired,\n resetCamera: PropTypes.func.isRequired,\n};\n\nconst actions = {\n resetCamera,\n}\n\nexport default withStyles(styles)(connect(null, actions)(WorkspaceToolbar));\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport WorkspaceInstructions from '../../shared/WorkspaceInstructions';\nimport ComponentCatalogDrawer from '../../catalog/components/ComponentCatalogDrawer';\nimport ExportRobotButton from '../components/ExportRobotButton';\nimport WorkspaceToolbar from '../components/WorkspaceToolbar';\nimport { setDrawerVisible as setComponentCatalogDrawerVisible } from '../../catalog/actions';\n\nimport {\n hidePopper,\n} from '../../poppers/actions';\n\nconst styles = theme => ({\n container: {\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n position: 'relative',\n },\n})\n\nconst instructions = [{\n icon: 'rotate_right',\n instruction: 'Rotate: left click + drag',\n}, {\n icon: 'zoom_in',\n instruction: 'Scroll to zoom',\n}, {\n icon: 'pan_tool',\n instruction: 'Pan: right click + drag',\n}];\n\nclass BuildRobotPage extends React.Component {\n componentWillUnmount() {\n this.props.setComponentCatalogDrawerVisible(false);\n this.props.hidePopper();\n }\n\n render() {\n const { classes } = this.props;\n\n return (\n
    \n \n \n \n \n
    \n )\n }\n}\n\nBuildRobotPage.propTypes = {\n classes: PropTypes.object.isRequired,\n setComponentCatalogDrawerVisible: PropTypes.func.isRequired,\n};\n\nconst actions = {\n hidePopper,\n setComponentCatalogDrawerVisible,\n};\n\nexport default withStyles(styles)(\n connect(\n null,\n actions\n )(BuildRobotPage)\n);\n","import { withStyles } from '@material-ui/core/styles';\nimport MuiExpansionPanel from '@material-ui/core/ExpansionPanel';\n\nconst ExpansionPanel = withStyles({\n root: {\n minHeight: '67px',\n },\n expanded: {\n margin: 0,\n },\n})(MuiExpansionPanel);\n\nexport default ExpansionPanel;\n","import React from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport MuiExpansionPanelSummary from '@material-ui/core/ExpansionPanelSummary';\n\nconst ExpansionPanelSummary = withStyles(theme => ({\n root: {\n minHeight: '67px',\n borderBottom: `1px solid ${theme.palette.neutral.light.color}`,\n '&$expanded': {\n minHeight: '67px',\n },\n },\n expanded: {},\n}))(props => );\n\nExpansionPanelSummary.muiName = 'ExpansionPanelSummary';\n\nexport default ExpansionPanelSummary;\n","import React from 'react';\nimport autoBind from 'react-autobind';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withStyles } from '@material-ui/core/styles';\nimport ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { MuiThemeProvider } from '@material-ui/core/styles';\n\nimport ExpansionPanel from './ExpansionPanel';\nimport ExpansionPanelSummary from './ExpansionPanelSummary';\n\nimport darkTheme from '../../../../common/themes/material-dark-theme';\nimport { formatNumber } from '../../../../common/utils/formatters';\n\nimport {\n getRobotStatistics,\n} from '../../selectors';\n\nconst styles = theme => ({\n container: {\n display: 'flex',\n flexDirection: 'column',\n position: 'absolute',\n top: theme.spacing.unit * 3,\n width: '280px',\n zIndex: theme.zIndex.appBar,\n },\n details: {\n display: 'flex',\n flexDirection: 'column',\n },\n label: {\n whiteSpace: 'pre',\n },\n});\n\nclass TestDriveSpecifications extends React.Component {\n constructor(props) {\n super(props);\n autoBind(this);\n\n this.state = {\n expanded: false,\n };\n }\n\n toggleExpanded() {\n this.setState(prevState => ({\n expanded: !prevState.expanded,\n }));\n }\n\n formatLabel(key, value) {\n let formattedValue = '';\n let formattedKey = '';\n value = value || 0;\n\n switch (key) {\n case 'maxHorizontalReach':\n formattedKey = 'Maximum horizontal reach';\n formattedValue = `${formatNumber(value * 1000)} mm`;\n break;\n case 'continuousPayload':\n formattedKey = 'Continuous payload at max reach';\n formattedValue = `${formatNumber(value)} kg`;\n break;\n case 'peakPayload':\n formattedKey = 'Peak payload at max reach';\n formattedValue = `${formatNumber(value)} kg`;\n break;\n case 'mass':\n formattedKey = 'Mass'\n formattedValue = `${formatNumber(value)} kg`;\n break;\n case 'continuousPower24V':\n formattedKey = 'Continuous power draw (estimated)';\n formattedValue = `${formatNumber(value)} W`;\n break;\n case 'peakPower24V':\n formattedKey = 'Peak power draw';\n formattedValue = `${formatNumber(value)} W`;\n break;\n default:\n break;\n }\n\n return `${formattedKey}\\n${formattedValue}`;\n }\n \n render() {\n const { classes, statistics } = this.props;\n\n return (\n \n \n }>\n Technical Specs\n \n \n
    \n {statistics &&\n Object.entries(statistics).map(([key, value]) => (\n \n {this.formatLabel(key, value)}\n \n ))\n }\n
    \n
    \n \n
    \n );\n }\n}\n\nTestDriveSpecifications.propTypes = {\n classes: PropTypes.object.isRequired,\n statistics: PropTypes.object,\n};\n\nconst mapStateToProps = state => {\n const statistics = getRobotStatistics(state);\n\n return {\n statistics,\n };\n};\n\nexport default withStyles(styles)(\n connect(mapStateToProps)(TestDriveSpecifications)\n);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport ExportRobotButton from '../components/ExportRobotButton';\nimport WorkspaceInstructions from '../../shared/WorkspaceInstructions';\nimport WorkspaceToolbar from '../components/WorkspaceToolbar';\nimport TestDriveSpecifications from '../components/TestDriveSpecifications';\nimport { activateTestDrive, deactivateTestDrive } from '../actions';\nimport {\n getSceneLoaded,\n} from '../selectors';\n\nconst styles = theme => ({\n container: {\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n position: 'relative',\n },\n})\n\nconst instructions = [{\n icon: 'touch_app',\n instruction: 'Grab and move the end of the robot to view measurements',\n}];\n\nclass TestDrivePage extends React.Component {\n componentDidMount() {\n if (this.props.sceneLoaded) {\n this.props.handleActivateTestDrive();\n }\n }\n\n componentDidUpdate(prevProps) {\n if (!prevProps.sceneLoaded && this.props.sceneLoaded) {\n this.props.handleActivateTestDrive();\n }\n }\n\n componentWillUnmount() {\n this.props.handleDeactivateTestDrive();\n }\n\n render() {\n const { classes } = this.props;\n\n return (\n
    \n \n \n \n \n
    \n );\n }\n}\n\nTestDrivePage.propTypes = {\n classes: PropTypes.object.isRequired,\n handleActivateTestDrive: PropTypes.func.isRequired,\n handleDeactivateTestDrive: PropTypes.func.isRequired,\n sceneLoaded: PropTypes.bool,\n};\n\nTestDrivePage.defaultProps = {\n sceneLoaded: false,\n};\n\nconst mapStateToProps = (state) => ({\n sceneLoaded: getSceneLoaded(state),\n});\n\nconst actions = {\n handleActivateTestDrive: activateTestDrive,\n handleDeactivateTestDrive: deactivateTestDrive,\n};\n\nexport default withStyles(styles)(\n connect(\n mapStateToProps,\n actions,\n )(TestDrivePage)\n);\n","import { getNames } from 'country-list';\n\nconst countryNames = getNames();\nexport default countryNames;\n","import React, { PureComponent } from 'react';\nimport { FormikConsumer } from 'formik';\n\nclass FormikPersistor extends PureComponent {\n componentWillMount() {\n window.addEventListener('beforeunload', this.clear);\n }\n\n componentDidMount() {\n const {\n setValues,\n setErrors,\n setStatus,\n setTouched,\n } = this.props;\n\n const data = sessionStorage.getItem(this.storageKey);\n if (data) {\n const {\n errors,\n status,\n touched,\n values,\n } = JSON.parse(data);\n setErrors(errors);\n setStatus(status);\n setTouched(touched || {});\n setValues(values);\n }\n }\n\n componentDidUpdate() {\n const {\n errors,\n status,\n touched,\n values,\n } = this.props;\n sessionStorage.setItem(\n this.storageKey,\n JSON.stringify({\n errors,\n status,\n touched: touched || {},\n values,\n })\n );\n }\n\n componentWillUnmount() {\n window.removeEventListener('beforeunload', this.clear);\n }\n\n get storageKey() {\n return `formik.form.${this.props.name}`;\n }\n\n clear = () => {\n sessionStorage.removeItem(this.storageKey);\n }\n\n render() {\n return null;\n }\n}\n\nconst FormikPersist = ({ name }) => (\n \n {({\n errors,\n status,\n touched,\n values,\n setErrors,\n setStatus,\n setTouched,\n setValues,\n }) => (\n \n )}\n \n);\n\nexport default FormikPersist","import React from 'react';\nimport PropTypes from 'prop-types';\nimport CancelIcon from '@material-ui/icons/Cancel';\n\nconst ClearIndicator = (props) => {\n const {\n children = ,\n getStyles,\n innerProps: { ref, ...restInnerProps },\n } = props;\n\n return (\n \n {children}\n
    \n );\n};\n\nClearIndicator.propTypes = {\n children: PropTypes.node,\n innerProps: PropTypes.object,\n};\n\nexport default ClearIndicator;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport TextField from '@material-ui/core/TextField';\n\nconst styles = theme => ({\n input: {\n display: 'flex',\n padding: 0,\n },\n});\n\nconst inputComponent = ({ inputRef, ...props }) => (\n
    \n);\n\n// Needs to be a class component to support refs\nclass Control extends React.Component {\n render() {\n const {\n children,\n classes,\n innerProps,\n innerRef,\n selectProps,\n } = this.props;\n\n return (\n \n )\n }\n}\n\nControl.propTypes = {\n children: PropTypes.node.isRequired,\n classes: PropTypes.object.isRequired,\n innerProps: PropTypes.object,\n innerRef: PropTypes.func,\n selectProps: PropTypes.shape({\n textFieldProps: PropTypes.object.isRequired,\n }),\n};\n\nexport default withStyles(styles)(Control);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ArrowDropDownIcon from '@material-ui/icons/ArrowDropDown';\n\nconst DropdownIndicator = (props) => {\n const {\n getStyles,\n innerProps: { ref, ...restInnerProps },\n } = props;\n\n return (\n \n \n
    \n );\n};\n\nDropdownIndicator.propTypes = {\n children: PropTypes.node,\n innerProps: PropTypes.object,\n};\n\nexport default DropdownIndicator;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { components } from 'react-select';\n\nconst IndicatorsContainer = (props) => {\n const { getStyles } = props;\n return (\n \n );\n};\n\nIndicatorsContainer.propTypes = {\n getStyles: PropTypes.func.isRequired,\n};\n\nexport default IndicatorsContainer;\n","import React from 'react';\nimport { VariableSizeList } from 'react-window';\n\nconst sum = (a, b) => a + b;\n\n// Used to facilitate virtualization for react-select for long lists\n// https://github.com/JedWatson/react-select/issues/2850\nclass OptionWrapper extends React.PureComponent {\n render() {\n const { style, index, data } = this.props;\n return
    {data[index]}
    ;\n }\n}\n\nexport default (listDefaultHeight = 35, listApproximatedLengthBreak = 50) =>\n // eslint-disable-next-line react/no-multi-comp\n class MenuList extends React.PureComponent {\n constructor(props) {\n super(props);\n this.itemSize = this.itemSize.bind(this);\n this.list = React.createRef();\n\n this.state = {\n rawChildren: null,\n maxHeight: null,\n currentIndex: 0,\n };\n }\n\n static getDerivedStateFromProps({ children: rawChildren, maxHeight }, state) {\n if (rawChildren !== state.rawChildren || maxHeight !== state.maxHeight) {\n const children = Array.isArray(rawChildren)\n ? rawChildren\n : [rawChildren];\n\n // Waiting for https://github.com/bvaughn/react-window/issues/6\n const heights = children.map(\n ({ props: { label } }) =>\n 8 +\n 8 +\n listDefaultHeight *\n Math.ceil((label || '_').length / listApproximatedLengthBreak)\n );\n const totalHeight = heights.reduce(sum);\n const height = Math.min(maxHeight, totalHeight);\n const itemCount = children.length;\n\n const currentIndex = Math.max(\n children.findIndex(({ props: { isFocused } }) => isFocused),\n 0\n );\n\n const estimatedItemSize = Math.floor(totalHeight / itemCount);\n\n return {\n height,\n itemCount,\n heights,\n estimatedItemSize,\n maxHeight,\n rawChildren,\n currentIndex,\n };\n }\n\n return null;\n }\n\n componentDidMount() {\n this.componentDidUpdate()\n }\n\n componentDidUpdate() {\n const { currentIndex } = this.state;\n this.list.current.scrollToItem(currentIndex);\n }\n\n itemSize(index) {\n return this.state.heights[index];\n }\n\n render() {\n const { children, innerRef } = this.props;\n const { height, itemCount, estimatedItemSize } = this.state;\n return (\n
    \n \n {OptionWrapper}\n \n
    \n );\n }\n }\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { withStyles } from '@material-ui/core/styles';\nimport { emphasize } from '@material-ui/core/styles/colorManipulator';\nimport CancelIcon from '@material-ui/icons/Cancel';\nimport Chip from '@material-ui/core/Chip';\n\nconst styles = theme => ({\n chip: {\n margin: `${theme.spacing.unit / 2}px ${theme.spacing.unit / 4}px`,\n },\n chipFocused: {\n backgroundColor: emphasize(\n theme.palette.type === 'light' ? theme.palette.grey[300] : theme.palette.grey[700],\n 0.08,\n ),\n },\n});\n\n// Needs to be a class component to support refs\nclass MultiValue extends React.Component {\n render() {\n const {\n children,\n classes,\n isFocused,\n removeProps,\n } = this.props;\n\n return (\n }\n />\n );\n }\n}\n\nMultiValue.propTypes = {\n children: PropTypes.node.isRequired,\n classes: PropTypes.object.isRequired,\n isFocused: PropTypes.bool.isRequired,\n removeProps: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(MultiValue);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\n\nconst styles = theme => ({\n noOptionsMessage: {\n padding: `${theme.spacing.unit}px ${theme.spacing.unit * 2}px`,\n },\n});\n\nconst NoOptionsMessage = ({\n children,\n classes,\n}) => (\n \n {children}\n \n);\n\nNoOptionsMessage.propTypes = {\n children: PropTypes.node.isRequired,\n classes: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(NoOptionsMessage);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport MenuItem from '@material-ui/core/MenuItem';\n\n// Needs to be a class component to support refs\nclass Option extends React.Component {\n render() {\n const {\n children,\n innerProps,\n innerRef,\n isFocused,\n isSelected,\n } = this.props;\n\n return (\n \n {children}\n \n );\n }\n}\n\nOption.propTypes = {\n children: PropTypes.node.isRequired,\n innerProps: PropTypes.object.isRequired,\n innerRef: PropTypes.func,\n isFocused: PropTypes.bool.isRequired,\n isSelected: PropTypes.bool.isRequired,\n};\n\nexport default Option;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\n\nconst styles = theme => ({\n placeholder: {\n position: 'absolute',\n left: 2,\n fontSize: 16,\n },\n});\n\nconst Placeholder = ({\n children,\n classes,\n innerProps,\n}) => (\n \n {children}\n \n);\n\nPlaceholder.propTypes = {\n children: PropTypes.node,\n classes: PropTypes.object.isRequired,\n innerProps: PropTypes.object,\n};\n\nexport default withStyles(styles)(Placeholder);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\n\nconst styles = theme => ({\n singleValue: {\n fontSize: 16,\n },\n});\n\nconst SingleValue = ({\n children,\n classes,\n innerProps,\n}) => (\n \n {children}\n \n);\n\nSingleValue.propTypes = {\n children: PropTypes.node.isRequired,\n classes: PropTypes.object.isRequired,\n innerProps: PropTypes.object,\n};\n\nexport default withStyles(styles)(SingleValue);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\n\nconst styles = theme => ({\n valueContainer: {\n display: 'flex',\n flexWrap: 'wrap',\n flex: 1,\n alignItems: 'center',\n overflow: 'hidden',\n },\n});\n\nconst ValueContainer = ({\n children,\n classes,\n}) => (\n
    {children}
    \n);\n\nValueContainer.propTypes = {\n children: PropTypes.node.isRequired,\n classes: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(ValueContainer);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Select from 'react-select';\nimport ClearIndicator from './ClearIndicator';\nimport Control from './Control';\nimport DropdownIndicator from './DropdownIndicator';\nimport IndicatorsContainer from './IndicatorsContainer';\nimport MenuList from './MenuList';\nimport MultiValue from './MultiValue';\nimport NoOptionsMessage from './NoOptionsMessage';\nimport Option from './Option';\nimport Placeholder from './Placeholder';\nimport SingleValue from './SingleValue';\nimport ValueContainer from './ValueContainer';\n\n// Implements react-select for autocomplete\n// Uses react-window for virtualizing long lists to improve performance\n// Inspired by https://material-ui.com/demos/autocomplete/\nconst styles = theme => ({\n divider: {\n height: theme.spacing.unit * 2,\n },\n});\n\nconst components = {\n ClearIndicator,\n DropdownIndicator,\n Control,\n IndicatorsContainer,\n MenuList: MenuList(),\n MultiValue,\n NoOptionsMessage,\n Option,\n Placeholder,\n SingleValue,\n ValueContainer,\n};\n\nconst Autocomplete = ({\n classes,\n theme,\n onChange,\n options,\n placeholder,\n value,\n ...rest\n}) => {\n const selectStyles = {\n input: base => ({\n ...base,\n color: theme.palette.text.primary,\n '& input': {\n font: 'inherit',\n },\n }),\n };\n\n return (\n \n );\n};\n\nAutocomplete.propTypes = {\n classes: PropTypes.object.isRequired,\n theme: PropTypes.object.isRequired,\n onChange: PropTypes.func.isRequired,\n options: PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.object,\n ]),\n ).isRequired,\n placeholder: PropTypes.string,\n value: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.object,\n ]),\n};\n\nexport default withStyles(styles, { withTheme: true })(Autocomplete);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Grid from '@material-ui/core/Grid';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport ErrorIcon from '@material-ui/icons/Error';\nimport TextField from '@material-ui/core/TextField';\nimport { Form } from 'formik';\nimport FormikPersist from '../../shared/FormikPersist';\n\nimport Autocomplete from '../../shared/Autocomplete';\n\nconst styles = theme => ({\n container: {\n [theme.breakpoints.up('md')]: {\n paddingLeft: theme.spacing.unit * 16,\n paddingRight: theme.spacing.unit * 16,\n },\n },\n buttonGroup: {\n textAlign: 'center',\n },\n alignBottom: {\n display: 'flex',\n alignItems: 'flex-end',\n },\n errorIcon: {\n color: theme.palette.status.danger.color,\n },\n});\n\nconst RequestQuoteForm = ({\n classes,\n countries,\n isSubmitting,\n isValid,\n errors,\n touched,\n handleSubmit,\n handleBlur,\n handleChange,\n setFieldTouched,\n setFieldValue,\n setStatus,\n setFieldError,\n status,\n values,\n}) => (\n
    \n \n \n \n \n ,\n }}\n />\n \n \n \n \n ,\n }}\n />\n \n \n\n {\n setFieldTouched('country', true);\n setFieldValue('country', option);\n if (option == null || option === undefined || option === '') \n setFieldError('country', 'Required');\n else \n setFieldError('country', null);\n \n setStatus({ ...status, shrink: Boolean(option && option.value && option.value.length) });\n }}\n helperText={'Required'}\n placeholder={null}\n textFieldAdornment={\n errors.country && errors.country.length && touched.country &&\n \n \n \n }\n textFieldProps={{\n label: \"My country\",\n InputLabelProps: status && status.shrink ? { shrink: true } : {},\n error: errors.country && errors.country.length && touched.country, \n helperText: 'Required',\n }}\n />\n \n \n \n {\n setFieldTouched('contactViaPhone', true);\n setFieldValue('contactViaPhone', checked);\n setStatus({ ...status, phoneNumberRequired: checked });\n\n if (!checked) {\n setFieldTouched('phoneNumber', false);\n setFieldValue('phoneNumber', '');\n }\n }}\n color=\"primary\"\n />\n }\n label=\"I have some questions. Please contact me via phone.\"\n />\n \n {\n status && status.phoneNumberRequired &&\n \n \n \n ,\n }}\n />\n \n }\n \n \n \n \n \n \n }\n label=\"Please include quote for HEBI Robotics to assemble\"\n />\n \n \n \n \n\n \n\n \n \n Please contact me with a quote\n \n \n \n \n \n );\n\nRequestQuoteForm.propTypes = {\n classes: PropTypes.object.isRequired,\n countries: PropTypes.arrayOf(PropTypes.shape({\n label: PropTypes.string,\n value: PropTypes.string,\n })).isRequired,\n isSubmitting: PropTypes.bool.isRequired,\n isValid: PropTypes.bool.isRequired,\n errors: PropTypes.object.isRequired,\n touched: PropTypes.object.isRequired,\n handleSubmit: PropTypes.func.isRequired,\n handleBlur: PropTypes.func.isRequired,\n handleChange: PropTypes.func.isRequired,\n setFieldTouched: PropTypes.func.isRequired,\n setFieldValue: PropTypes.func.isRequired,\n setStatus: PropTypes.func.isRequired,\n status: PropTypes.object,\n values: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(RequestQuoteForm);\n","\nexport const SUBMIT_QUOTE_PREFIX = 'SUBMIT_QUOTE';\nexport const SUBMIT_QUOTE_REQUEST = `${SUBMIT_QUOTE_PREFIX}_REQUEST`;\nexport const SUBMIT_QUOTE_SUCCESS = `${SUBMIT_QUOTE_PREFIX}_SUCCESS`;\nexport const SUBMIT_QUOTE_SUCCESS_MESSAGE = 'Your quote has been submitted!';\nexport const SUBMIT_QUOTE_ERROR = `${SUBMIT_QUOTE_PREFIX}_ERROR`;\n\nexport const SUBMIT_QUOTE_ERROR_MESSAGE = `\n We are unable to submit your request for quote.\n Please try again. If the problem persists, please visit our contact us\n page for other ways to submit this request.\n`;\n\nexport const submitQuoteRequest = (quote, {\n resetForm,\n setSubmitting,\n}) => ({\n type: SUBMIT_QUOTE_REQUEST,\n payload: {\n quote,\n resetForm,\n setSubmitting,\n }\n});\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { Formik } from 'formik';\nimport * as Yup from 'yup';\nimport get from 'lodash-es/get';\nimport omit from 'lodash-es/omit';\nimport { connect } from 'react-redux';\n\nimport countryNames from '../../../common/utils/country-names';\n\nimport RequestQuoteForm from '../components/RequestQuoteForm';\n\nimport { submitQuoteRequest } from '../actions';\n\nconst countries = countryNames.map(name => ({\n value: name,\n label: name,\n}));\n\nconst RequestQuoteFormContainer = ({\n handleSubmitQuote,\n}) => (\n val === true,\n then: Yup.string().required('Required'),\n otherwise: Yup.string().notRequired()\n })\n })}\n onSubmit={(values, { setSubmitting, resetForm }) => {\n const formValues = {\n ...omit(values, 'country'),\n country: get(values, ['country', 'value']),\n };\n handleSubmitQuote(formValues, {\n resetForm,\n setSubmitting,\n });\n }}\n render={formikProps =>\n \n }\n />\n);\n\nRequestQuoteFormContainer.propTypes = {\n handleSubmitQuote: PropTypes.func.isRequired,\n};\n\nconst actions = {\n handleSubmitQuote: submitQuoteRequest,\n};\n\nexport default connect(null, actions)(RequestQuoteFormContainer);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\n\nimport { SECONDARY_FONT } from '../../../common/fonts';\nimport RequestQuoteFormContainer from '../containers/RequestQuoteFormContainer';\n\nconst styles = theme => ({\n container: {\n color: theme.palette.neutral.light.contrastText,\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n alignItems: 'center',\n },\n title: {\n color: theme.palette.neutral.darkest.color,\n textTransform: 'uppercase',\n fontFamily: SECONDARY_FONT,\n letterSpacing: '2.5px',\n textAlign: 'center',\n },\n subtitle: {\n textAlign: 'center',\n },\n form: {\n paddingTop: theme.spacing.unit * 3,\n },\n});\n\nconst RequestQuotePage = ({ classes }) => (\n
    \n \n How much would it cost to build this robot?\n \n\n \n Please send me a detailed quote based on this configuration.\n \n\n
    \n \n
    \n
    \n);\n\nRequestQuotePage.propTypes = {\n classes: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(RequestQuotePage);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { Link, withRouter } from 'react-router-dom';\nimport { withStyles } from '@material-ui/core/styles';\nimport AppBar from '@material-ui/core/AppBar';\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\n\nimport { SECONDARY_FONT } from '../../../common/fonts';\n\nimport {\n getTestDriveTabShouldBeEnabled,\n getRequestQuoteTabShouldBeEnabled,\n} from '../selectors';\n\nconst styles = theme => ({\n root: {\n },\n tabsRoot: {\n backgroundColor: theme.palette.neutral.darkest.color,\n },\n tabRoot: {\n fontFamily: SECONDARY_FONT,\n fontSize: '16px',\n color: '#D3D3CE',\n '&:hover': {\n color: theme.palette.neutral.main.color,\n backgroundColor: '#5B5A54',\n },\n '&$tabSelected': {\n color: theme.palette.secondary.main,\n },\n },\n tabSelected: {}, // Needed to override CSS specificity\n});\n\nconst ConfiguratorTabBar = ({\n classes,\n location,\n match,\n testDriveTabEnabled,\n requestQuoteTabEnabled,\n}) => {\n const tabs = [{\n title: 'Build Robot',\n to: `${match.url}/build`,\n disabled: false,\n }, {\n title: 'Test Drive',\n to: `${match.url}/test-drive`,\n disabled: !testDriveTabEnabled,\n }, {\n title: 'Request Quote',\n to: `${match.url}/request-quote`,\n disabled: !requestQuoteTabEnabled,\n }];\n\n return (\n \n \n {\n tabs.map(tab => (\n \n ))\n }\n \n \n );\n};\n\n\n\nConfiguratorTabBar.propTypes = {\n classes: PropTypes.object.isRequired,\n location: PropTypes.shape({\n pathname: PropTypes.string.isRequired,\n }),\n match: PropTypes.shape({\n url: PropTypes.string.isRequired,\n }).isRequired,\n testDriveTabEnabled: PropTypes.bool.isRequired,\n requestQuoteTabEnabled: PropTypes.bool.isRequired,\n};\n\nconst mapStateToProps = state => ({\n testDriveTabEnabled: getTestDriveTabShouldBeEnabled(state),\n requestQuoteTabEnabled: getRequestQuoteTabShouldBeEnabled(state),\n});\n\nexport default withRouter(\n withStyles(styles)(connect(mapStateToProps)(ConfiguratorTabBar))\n);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Route, Switch, withRouter } from 'react-router-dom';\n\nimport BuildRobotPage from '../pages/BuildRobotPage';\nimport TestDrivePage from '../pages/TestDrivePage';\nimport RequestQuotePage from '../../request-quote/pages/RequestQuotePage';\n\nimport ConfiguratorTabBar from '../components/ConfiguratorTabBar';\n\nconst ConfiguratorTabbedRoutes = ({\n match,\n}) => (\n \n \n\n \n \n \n \n \n \n);\n\nConfiguratorTabbedRoutes.propTypes = {\n match: PropTypes.shape({\n url: PropTypes.string.isRequired,\n }).isRequired,\n};\n\nexport default withRouter(ConfiguratorTabbedRoutes);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport autoBind from 'react-autobind';\nimport PropTypes from 'prop-types';\nimport { withRouter } from 'react-router-dom';\nimport { withStyles } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport { RotateRight, ZoomIn, PanTool } from '@material-ui/icons';\nimport queryString from 'query-string'\n\nimport {\n createRobotRequest,\n loadRobotRequest,\n} from '../actions';\nimport { getConfiguratorIsInitialized } from '../selectors';\n\nimport ConfiguratorTabbedRoutes from '../components/ConfiguratorTabbedRoutes';\n\nconst styles = theme => ({\n container: {\n backgroundColor: theme.palette.neutral.darkest.color,\n color: theme.palette.neutral.darkest.contrastText,\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n alignItems: 'center'\n },\n title: {\n textTransform: 'uppercase',\n color: theme.palette.secondary.main\n },\n progress: {\n marginTop: '40px',\n width: '480px'\n },\n instructionsContainer: {\n marginTop: '175px'\n },\n instruction: {\n marginBottom: '42px',\n display: 'flex',\n flexDirection: 'row',\n alignContent: 'flex-start'\n },\n instructionIcon: {\n marginRight: '16px'\n },\n instructionText: {\n color: theme.palette.neutral.darkest.contrastText\n }\n});\n\nconst instructions = [\n {\n id: 1,\n icon: classes => ,\n text: 'Rotate: left-click and drag'\n },\n {\n id: 2,\n icon: classes => ,\n text: 'Zoom: scroll'\n },\n {\n id: 3,\n icon: classes => ,\n text: 'Pan: right-click and drag'\n }\n];\n\nclass ConfiguratorLoader extends React.Component {\n constructor(props) {\n super(props);\n autoBind(this);\n }\n\n componentDidMount() {\n const robotId = this.parseRobotIdFromQueryString(this.props);\n if (robotId) {\n this.loadRobot(robotId);\n } else {\n this.props.createRobotRequest();\n }\n }\n\n componentDidUpdate(prevProps) {\n const currentRobotId = this.parseRobotIdFromQueryString(this.props);\n const previousRobotId = this.parseRobotIdFromQueryString(prevProps);\n\n if (currentRobotId !== previousRobotId) {\n this.loadRobot(currentRobotId);\n }\n }\n\n loadRobot(id) {\n this.props.loadRobotRequest(id);\n }\n\n parseRobotIdFromQueryString(props) {\n const values = queryString.parse(props.location.search);\n if (!values || !values.robotId) {\n return null;\n }\n\n return values.robotId;\n }\n\n render() {\n const {\n classes,\n configuratorInitialized,\n } = this.props;\n\n if (configuratorInitialized) {\n return ;\n }\n\n return (\n
    \n \n Loading 3D Components\n \n \n
    \n {instructions.map(instruction => (\n
    \n {instruction.icon(classes)}\n \n {instruction.text}\n \n
    \n ))}\n
    \n
    \n );\n }\n}\n\nConfiguratorLoader.propTypes = {\n classes: PropTypes.object.isRequired,\n configuratorInitialized: PropTypes.bool.isRequired,\n loadRobotRequest: PropTypes.func.isRequired,\n location: PropTypes.object.isRequired,\n match: PropTypes.object.isRequired,\n};\n\nconst mapStateToProps = state => ({\n configuratorInitialized: getConfiguratorIsInitialized(state),\n});\n\nconst actions = {\n createRobotRequest,\n loadRobotRequest,\n};\n\nexport default withRouter(\n withStyles(styles)(connect(mapStateToProps, actions)(ConfiguratorLoader))\n);\n","import React from 'react';\n\nconst NotFoundPage = () => (\n
    \n The page you're trying to reach can't be found.\n
    \n);\n\nexport default NotFoundPage;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Route } from 'react-router-dom';\nimport { withStyles } from '@material-ui/core/styles'; \n\nconst styles = theme => ({\n container: {\n '& > div': {\n paddingTop: theme.spacing.unit * 6,\n paddingBottom: theme.spacing.unit * 6,\n ...theme.mixins.gutters(),\n },\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n backgroundColor: theme.palette.neutral.light.color,\n },\n});\n\nconst DefaultLayout = ({\n component: Component,\n classes,\n ...rest\n}) => {\n return (\n (\n
    \n \n
    \n )}\n />\n )\n};\n\nDefaultLayout.propTypes = {\n component: PropTypes.func.isRequired,\n classes: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(DefaultLayout);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Switch, withRouter } from 'react-router-dom';\nimport { ToastContainer, toast } from 'react-toastify';\nimport CssBaseline from '@material-ui/core/CssBaseline';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport 'react-toastify/dist/ReactToastify.css';\n\nimport ModalManager from '../features/modals/ModalManager';\nimport PopperManager from '../features/poppers/PopperManager';\n\nimport AppNav from '../features/shared/AppNav';\nimport AppFooter from '../features/shared/AppFooter';\nimport GettingStartedPage from '../features/getting-started/pages/GettingStartedPage';\nimport ConfiguratorLoader from '../features/configurator/pages/ConfiguratorLoader';\nimport NotFoundPage from '../features/shared/NotFoundPage';\n\nimport DefaultLayout from '../features/shared/layouts/DefaultLayout';\n\nconst styles = theme => ({\n container: {\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n },\n});\n\nclass App extends React.Component {\n render() {\n const { classes } = this.props;\n\n return (\n <>\n \n \n \n \n
    \n \n \n \n \n \n \n \n
    \n \n );\n }\n}\n\nApp.propTypes = {\n classes: PropTypes.object.isRequired,\n};\n\nexport default withStyles(styles)(\n withRouter(App)\n);\n","export const createReducer = (initialState, fnMap) => {\n return (state = initialState, { type, payload }) => {\n const handler = fnMap[type];\n\n return handler ? handler(state, payload) : state;\n };\n};\n\nexport const reduceReducers = (...reducers) => {\n return (previous, current) =>\n reducers.reduce(\n (p, r) => r(p, current),\n previous\n );\n};\n\nexport const createConditionalSliceReducer = (sliceName, fnMap) => {\n // Create a reducer that knows how to handle one slice of state, with these action types\n const sliceReducer = createReducer({}, fnMap);\n\n // Create a new wrapping reducer\n return (state, action) => {\n // Check to see if this slice reducer knows how to handle this action\n if (fnMap[action.type]) {\n // If it does, pass the slice to the slice reducer, and update the slice\n return {\n ...state,\n [sliceName]: sliceReducer(state[sliceName], action),\n };\n }\n\n // Otherwise, return the existing state unchanged\n return state;\n }\n};\n","import {\n createReducer,\n} from '../../common/utils/reducer-utils';\n\nimport {\n LOAD_ENTITIES_SUCCESS,\n} from '../../features/configurator/actions';\n\nimport orm from '../orm';\n\nconst initialState = orm.getEmptyState();\n\nconst loadData = (state, payload) => {\n const session = orm.session(state);\n\n const {\n Asset,\n BoltPattern,\n Part,\n PartLength,\n PartCategory,\n Robot,\n } = session;\n\n const {\n boltPatterns,\n parts,\n partCategories,\n partLengths,\n } = payload;\n\n // Clear out any existing models from state so that we can avoid\n // conflicts from the new data coming in if data is reloaded\n const models = [\n Asset,\n BoltPattern,\n Part,\n PartLength,\n PartCategory,\n Robot,\n ];\n\n models.forEach(modelType => {\n modelType.all().toModelArray().forEach(model => model.delete());\n });\n\n boltPatterns.forEach(boltPattern => BoltPattern.parse(boltPattern));\n partCategories.forEach(partCategory => PartCategory.parse(partCategory));\n partLengths.forEach(partLength => PartLength.parse(partLength));\n parts.forEach(part => Part.parse(part));\n\n return session.state;\n}\n\nexport default createReducer(initialState, {\n [LOAD_ENTITIES_SUCCESS]: loadData,\n});\n","import {\n INITIALIZE_CONFIGURATOR_SUCCESS,\n INITIALIZE_CONFIGURATOR_SUCCESS_CACHED,\n} from '../actions';\n\nconst initialState = {\n initialized: false,\n};\n\nexport default (state = initialState, action) => {\n const { type } = action;\n\n switch (type) {\n case INITIALIZE_CONFIGURATOR_SUCCESS:\n case INITIALIZE_CONFIGURATOR_SUCCESS_CACHED:\n return {\n initialized: true,\n };\n default:\n return state;\n }\n};","import { createReducer } from '../../../common/utils/reducer-utils';\n\nimport {\n SET_CURRENT_ROBOT,\n SET_CURRENT_ROBOT_PART,\n SET_PLACEMENT_MODE,\n TOGGLE_PLACEMENT_MODE,\n UPDATE_ROBOT_STATISTICS,\n SET_SCENE_LOADED,\n} from '../actions';\n\nconst placementModes = ['place', 'replace'];\n\nconst initialState = {\n currentRobotId: null,\n currentRobotPartId: null,\n placementMode: 'place',\n statistics: null,\n sceneLoaded: false,\n};\n\nconst setCurrentRobot = (state, payload) => {\n return {\n ...state,\n currentRobotId: payload.currentRobotId,\n };\n}\n\nconst setCurrentRobotPart = (state, payload) => {\n return {\n ...state,\n currentRobotPartId: payload.currentRobotPartId,\n };\n};\n\nconst setPlacementMode = (state, payload) => ({\n ...state,\n placementMode: payload.mode,\n});\n\nconst togglePlacementMode = (state) => {\n const { placementMode: currentPlacementMode } = state;\n const newPlacementMode = placementModes.find(p => p !== currentPlacementMode);\n\n return {\n ...state,\n placementMode: newPlacementMode,\n };\n};\n\nconst updateStatistics = (state, payload) => ({\n ...state,\n statistics: payload.statistics,\n});\n\nconst setSceneLoaded = (state, payload) => ({\n ...state,\n sceneLoaded: payload.loaded,\n});\n\nexport default createReducer(initialState, {\n [SET_CURRENT_ROBOT]: setCurrentRobot,\n [SET_CURRENT_ROBOT_PART]: setCurrentRobotPart,\n [SET_PLACEMENT_MODE]: setPlacementMode,\n [TOGGLE_PLACEMENT_MODE]: togglePlacementMode,\n [UPDATE_ROBOT_STATISTICS]: updateStatistics,\n [SET_SCENE_LOADED]: setSceneLoaded,\n});\n","import { createReducer } from '../../../common/utils/reducer-utils';\n\nimport {\n SET_SELECTED_ROBOT_PART,\n CLEAR_SELECTED_ROBOT_PART,\n} from '../actions';\n\nconst initialState = {\n selectedRobotPartId: null,\n selectedRobotPartLocation: null,\n};\n\nconst setSelectedRobotPart = (state, payload) => ({\n ...state,\n selectedRobotPartId: payload.selectedRobotPartId,\n selectedRobotPartLocation: payload.location,\n});\n\nconst clearSelectedRobotPart = (state) => ({\n ...state,\n selectedRobotPartId: null,\n selectedRobotPartLocation: null,\n});\n\nexport default createReducer(initialState, {\n [SET_SELECTED_ROBOT_PART]: setSelectedRobotPart,\n [CLEAR_SELECTED_ROBOT_PART]: clearSelectedRobotPart,\n});\n","import { combineReducers } from 'redux';\n\nimport bootstrapper from './bootstrapper';\nimport builder from './builder';\nimport workspace from './workspace';\n\nexport default combineReducers({\n bootstrapper,\n builder,\n workspace,\n});\n","import { createReducer } from '../../common/utils/reducer-utils';\nimport {\n SELECT_PART,\n SET_DRAWER_VISIBLE,\n SET_SELECTED_CATEGORY,\n TOGGLE_DRAWER_VISIBLE,\n} from './actions';\n\nconst initialState = {\n componentDrawerVisible: false,\n selectedCategoryId: null,\n selectedPartId: null,\n};\n\nconst setDrawerVisibility = (state, payload) => ({\n ...state,\n componentDrawerVisible: payload.visible,\n});\n\nconst toggleDrawerVisibility = (state) => ({\n ...state,\n componentDrawerVisible: !state.componentDrawerVisible,\n});\n\nconst setSelelectedCategory = (state, payload) => ({\n ...state,\n selectedCategoryId: payload.id,\n});\n\nconst setSelelectedPart = (state, payload) => ({\n ...state,\n selectedPartId: payload.id,\n});\n\nexport default createReducer(initialState, {\n [SET_DRAWER_VISIBLE]: setDrawerVisibility,\n [TOGGLE_DRAWER_VISIBLE]: toggleDrawerVisibility,\n [SET_SELECTED_CATEGORY]: setSelelectedCategory,\n [SELECT_PART]: setSelelectedPart,\n});\n","import {\n MODAL_CLOSE,\n MODAL_OPEN,\n} from './actions';\n\nimport { createReducer } from '../../common/utils/reducer-utils';\n\nconst initialState = [];\n\nconst openModal = (state, payload) => {\n const { type, modalProps } = payload;\n return state.concat({ type, modalProps });\n}\n\nconst closeModal = (state) => {\n const newState = state.slice();\n newState.pop();\n return newState;\n}\n\nexport default createReducer(initialState, {\n [MODAL_OPEN]: openModal,\n [MODAL_CLOSE]: closeModal,\n});\n","import {\n POPPER_HIDE,\n POPPER_SHOW,\n POPPER_UPDATE_SUCCESS,\n} from './actions';\n\nimport { createReducer } from '../../common/utils/reducer-utils';\n\nconst initialState = {\n show: false,\n location: {\n x: null,\n y: null,\n },\n type: null,\n popperProps: undefined,\n};\n\nconst showPopper = (state, payload) => ({\n ...state,\n show: true,\n ...payload,\n});\n\nconst hidePopper = (state, payload) => ({\n ...initialState,\n});\n\nconst updatePopper = (state, payload) => ({\n ...state,\n location: payload.location,\n popperProps: payload.popperProps,\n});\n\nexport default createReducer(initialState, {\n [POPPER_SHOW]: showPopper,\n [POPPER_HIDE]: hidePopper,\n [POPPER_UPDATE_SUCCESS]: updatePopper,\n});\n","const initialState = {};\n\nexport default (state = initialState, action) => {\n const { type } = action;\n const matches = /(.*)_(REQUEST|SUCCESS|ERROR|CANCEL)(.*)/.exec(type);\n \n // not a *_REQUEST / *_SUCCESS / *_ERROR actions, so ignore\n if (!matches) return state;\n \n const [, requestName, requestState] = matches;\n return {\n ...state,\n // Store whether a request is happening at the moment or not\n // e.g. will be true when receiving GET_TODOS_REQUEST\n // and false when receiving GET_TODOS_SUCCESS / GET_TODOS_ERROR\n [requestName]: requestState === 'REQUEST',\n };\n};\n","import { reduceReducers } from '../../../common/utils/reducer-utils';\n\nimport loading from './loading';\n\nexport default reduceReducers(\n loading,\n);\n","import { createConditionalSliceReducer } from '../../../common/utils/reducer-utils';\n\nimport {\n UPDATE_AVAILABLE_PARTS_REQUEST,\n UPDATE_AVAILABLE_PARTS_SUCCESS,\n} from '../../catalog/actions';\n\nimport {\n ADD_PART_TO_WORKSPACE_REQUEST,\n} from '../../configurator/actions';\n\nimport orm from '../../../app/orm';\n\nconst disableParts = (state) => {\n const session = orm.session(state);\n const { Part } = session;\n\n Part.all().update({\n enabledForWorkspace: false,\n });\n\n return session.state;\n};\n\nconst enableAvailableParts = (state, payload) => {\n const session = orm.session(state);\n const { Part } = session;\n const { ids } = payload;\n\n Part.all()\n .filter(p => ids.includes(p.id))\n .update({\n enabledForWorkspace: true,\n });\n\n return session.state;\n};\n\nconst robotHandlers = {\n [UPDATE_AVAILABLE_PARTS_REQUEST]: disableParts,\n [UPDATE_AVAILABLE_PARTS_SUCCESS]: enableAvailableParts,\n [ADD_PART_TO_WORKSPACE_REQUEST]: disableParts,\n};\n\nexport default createConditionalSliceReducer('entities', robotHandlers);\n\n","import { createConditionalSliceReducer } from '../../../common/utils/reducer-utils';\n\nimport {\n ROBOT_PART_CREATE_SUCCESS,\n ROBOT_PART_REMOVE_SUCCESS,\n ROBOT_PART_REPLACE_REQUEST,\n ROBOT_PART_UPDATE_CONSTRAINT_SUCCESS,\n ROBOT_LOAD_SUCCESS,\n} from '../../configurator/actions';\n\nimport orm from '../../../app/orm';\n\nconst loadRobot = (state, payload) => {\n const session = orm.session(state);\n const { Robot } = session;\n const { robot } = payload;\n\n Robot.parse(robot);\n\n return session.state;\n};\n\nconst addRobotPart = (state, payload) => {\n const session = orm.session(state);\n const { Robot, RobotPart } = session;\n const { robotPart } = payload;\n\n const newRobotPart = RobotPart.parse(robotPart);\n\n if (robotPart.parentRobotPartId) {\n RobotPart.withId(robotPart.parentRobotPartId).children.add(newRobotPart);\n } else {\n const { robotId } = robotPart;\n Robot.withId(robotId).robotParts.add(newRobotPart);\n }\n\n return session.state;\n};\n\nconst removeRobotParts = (state, payload) => {\n const session = orm.session(state);\n const { RobotPart } = session;\n const { ids } = payload;\n\n RobotPart.filter(rp => ids.includes(rp.id)).delete();\n\n return session.state;\n};\n\nconst updateRobotPartConstraint = (state, payload) => {\n const session = orm.session(state);\n const { RobotPart } = session;\n const { id, constraint, value } = payload;\n\n RobotPart.withId(id)[constraint] = value;\n\n return session.state;\n};\n\nconst replaceRobotPart = (state, payload) => {\n const session = orm.session(state);\n const { RobotPart } = session;\n const { replaceId, newPart } = payload;\n\n const {\n partId: newPartId,\n length,\n twist,\n } = newPart;\n\n const existingRobotPart = RobotPart.withId(replaceId);\n existingRobotPart.part = newPartId;\n existingRobotPart.length = length;\n existingRobotPart.twist = twist;\n\n return session.state;\n};\n\nconst robotHandlers = {\n [ROBOT_LOAD_SUCCESS]: loadRobot,\n [ROBOT_PART_CREATE_SUCCESS]: addRobotPart,\n [ROBOT_PART_REMOVE_SUCCESS]: removeRobotParts,\n [ROBOT_PART_REPLACE_REQUEST]: replaceRobotPart,\n [ROBOT_PART_UPDATE_CONSTRAINT_SUCCESS]: updateRobotPartConstraint,\n};\n\nexport default createConditionalSliceReducer('entities', robotHandlers);\n","import { reduceReducers } from '../../../common/utils/reducer-utils';\n\nimport part from './part';\nimport robot from './robot';\n\nexport default reduceReducers(\n part,\n robot,\n);\n","import storage from 'redux-persist/lib/storage/session';\nimport autoMergeLevel2 from 'redux-persist/lib/stateReconciler/autoMergeLevel2';\nimport { createWhitelistFilter } from 'redux-persist-transform-filter';\nimport { createMigrate } from 'redux-persist';\n\nconst migrations = {\n 2: (state) => {\n if(state.entities && state.entities.Part.count() === 25) {\n return {\n ...state\n }\n }\n\n return {\n ...state,\n configurator: {\n bootstrapper: {\n initialized: false\n }\n }\n }\n }\n}\n\nconst persistConfig = {\n key: 'HEBI-RobotBuilder',\n version: 2,\n storage,\n blacklist: [\n 'loading',\n 'modals',\n 'popper',\n ],\n stateReconciler: autoMergeLevel2,\n migrate: createMigrate( migrations, {debug: false }),\n transforms: [\n createWhitelistFilter('entities'),\n createWhitelistFilter('catalog', [\n 'selectedCategoryId',\n 'componentDrawerVisible',\n ]),\n createWhitelistFilter('configurator', [\n 'bootstrapper.initialized',\n ]),\n ],\n};\n\nexport default persistConfig;\n","import { createStore, compose, applyMiddleware } from 'redux';\nimport { connectRouter, routerMiddleware } from 'connected-react-router'\nimport { composeWithDevTools } from 'redux-devtools-extension'; // eslint-disable-line import/no-extraneous-dependencies\nimport { createBrowserHistory } from 'history';\nimport { persistReducer, persistStore } from 'redux-persist';\nimport createSagaMiddleware from 'redux-saga';\nimport thunk from 'redux-thunk';\n\nimport createRootReducer from './reducers/root-reducer';\nimport persistConfig from './config/persist-config';\n\nexport const history = createBrowserHistory();\nexport const sagaMiddleware = createSagaMiddleware();\nconst middlewares = [\n sagaMiddleware,\n thunk,\n routerMiddleware(history),\n];\n\nconst middlewareEnhancer = applyMiddleware(...middlewares);\nconst storeEnhancers = [middlewareEnhancer];\n\nconst environmentEnhancer = process.env.NODE_ENV === 'production' ?\n compose(...storeEnhancers) :\n composeWithDevTools(...storeEnhancers);\n\nconst rootReducer = createRootReducer(history);\nexport const persistedReducer = persistReducer(persistConfig, rootReducer);\nconst store = createStore(connectRouter(history)(persistedReducer), environmentEnhancer);\nexport const persistor = persistStore(store);\n\nif (module.hot) {\n module.hot.accept(() => {\n const nextRootReducer = require('./reducers/root-reducer');\n store.replaceReducer(\n persistReducer(persistConfig, nextRootReducer)\n );\n });\n}\n\nexport default store;\n","import { combineReducers } from 'redux';\nimport { connectRouter } from 'connected-react-router';\nimport { reduceReducers } from '../../common/utils/reducer-utils';\n\nimport entities from './entities-reducer';\n\nimport configurator from '../../features/configurator/reducers';\nimport catalog from '../../features/catalog/reducer';\nimport modals from '../../features/modals/reducer';\nimport popper from '../../features/poppers/reducer';\nimport loading from '../../features/loading/reducers';\n\nimport entitiesCrudReducer from '../../features/entities/reducers';\n\nexport default (history) => {\n const combinedReducers = combineReducers({\n catalog,\n entities,\n router: connectRouter(history),\n configurator,\n modals,\n popper,\n loading,\n });\n\n const rootReducer = reduceReducers(\n combinedReducers,\n entitiesCrudReducer,\n );\n\n return rootReducer;\n}\n","import {\n call,\n put,\n select,\n take,\n} from 'redux-saga/effects';\n\nimport { toast } from 'react-toastify';\n\nimport {\n apiGet,\n} from '../../../common/utils/saga-utils';\n\nimport {\n SET_PLACEMENT_MODE,\n SET_CURRENT_ROBOT,\n TOGGLE_PLACEMENT_MODE,\n ADD_PART_TO_WORKSPACE_SUCCESS,\n ROBOT_PART_REMOVE_CONFIRM_SUCCESS,\n} from '../../configurator/actions';\n\nimport {\n getCurrentRobotId,\n getSelectedRobotPartId,\n getPlacementMode,\n} from '../../configurator/selectors';\n\nimport {\n UPDATE_AVAILABLE_PARTS_ERROR,\n UPDATE_AVAILABLE_PARTS_ERROR_MESSAGE,\n updateAvailablePartsRequest,\n updateAvailablePartsSuccess,\n} from '../actions';\n\nconst strategies = {\n place: {\n updateAvailableParts: getAvailablePartsForPlacement,\n },\n replace: {\n updateAvailableParts: getAvailablePartsForReplacement,\n },\n};\n\nexport default function* updateAvailablePartsWatcher() {\n while (true) {\n try {\n yield take([\n ADD_PART_TO_WORKSPACE_SUCCESS,\n SET_CURRENT_ROBOT,\n SET_PLACEMENT_MODE,\n TOGGLE_PLACEMENT_MODE,\n ROBOT_PART_REMOVE_CONFIRM_SUCCESS,\n ]);\n\n const placementMode = yield select(getPlacementMode);\n const { updateAvailableParts } = strategies[placementMode];\n yield put(updateAvailablePartsRequest());\n\n const parts = yield call(updateAvailableParts);\n const partIds = parts.map(p => p.partId);\n yield put(updateAvailablePartsSuccess(partIds))\n } catch (error) {\n yield put({ type: UPDATE_AVAILABLE_PARTS_ERROR, error });\n yield call(toast.error, UPDATE_AVAILABLE_PARTS_ERROR_MESSAGE);\n }\n }\n}\n\nfunction* getAvailablePartsForPlacement() {\n const robotId = yield select(getCurrentRobotId);\n const parts = yield call(apiGet, `/Robot/${robotId}/Parts/Placement`);\n return parts;\n}\n\nfunction* getAvailablePartsForReplacement() {\n const replaceId = yield select(getSelectedRobotPartId);\n const parts = yield call(apiGet, `/Robot/Part/${replaceId}/Replacement`);\n return parts;\n}\n","import {\n fork,\n} from 'redux-saga/effects';\n\nimport updateAvailablePartsWatcher from './updateAvailablePartsWatcher';\n\nexport default function* root() {\n yield fork(updateAvailablePartsWatcher);\n}\n","import { createPartGroup as createLinkPartGroup } from './link';\nimport { createPartGroup as createGenericPartGroup } from './default';\n\nexport default {\n Link: {\n createPartGroup: createLinkPartGroup,\n },\n default: {\n createPartGroup: createGenericPartGroup,\n },\n}\n","import * as THREE from 'three';\n\nexport const createPartGroup = (meshes, userData) => {\n const group = createGroup();\n\n group.userData = {\n ...userData,\n addChild,\n applyTransformation,\n getChild,\n getChildMeshes,\n removeChild,\n updateLength,\n updateTwist,\n addInterfaceItem,\n };\n\n return group;\n\n function createGroup() {\n if (meshes.length !== 3) {\n throw new Error('Link must have three meshes.');\n }\n\n const linkGroup = new THREE.Group();\n const [spacedCap, tubeMesh, tightCap] = meshes;\n\n const beginCap = spacedCap.clone();\n const endCap = tightCap.clone();\n const tube = tubeMesh.clone();\n\n const tubeGroup = new THREE.Group();\n tubeGroup.add(tube);\n\n const endCapGroup = new THREE.Group();\n endCapGroup.add(endCap);\n const childGroup = new THREE.Group();\n endCapGroup.add(childGroup);\n\n const endGroup = new THREE.Group();\n endGroup.add(endCapGroup);\n\n tubeGroup.add(endGroup);\n \n linkGroup.add(beginCap);\n linkGroup.add(tubeGroup);\n\n return linkGroup;\n }\n\n /**\n * Traverses all components in the link, retrieves their correct offsets, and applies them\n */\n function applyTransformation() {\n const offsets = getAdjustedOffsets();\n const components = getComponents();\n\n Object.entries(offsets).forEach(([componentName, offset]) => {\n const component = components[componentName];\n\n if (component) {\n Object.entries(offset).forEach(([offsetType, offsetValues]) => {\n Object.entries(offsetValues).forEach(([axis, value]) => {\n component[offsetType][axis] = value;\n });\n });\n }\n });\n\n // Ensure that the end cap is centered around the tube so that it rotates correctly\n const { endCapMesh } = components;\n endCapMesh.geometry.center();\n }\n\n /**\n * After scaling the tube linearly, the tube must be repositioned to sit in its original position.\n * This equation was derived by manually applying offsets, plotting the resulting points, and determining\n * the best fit line, therefore it may not be 100% accurate for longer tube lengths.\n * @param {number} tubeLength \n */\n function getTubePositionByTubeLength(tubeLength) {\n const tubePosition = 0.4986486 * tubeLength + 0.0130945;\n return tubePosition;\n }\n\n function getAdjustedOffsets() {\n const { length } = group.userData;\n const tubeLength = length;\n const tubePosition = getTubePositionByTubeLength(tubeLength);\n\n const defaultOffsets = {\n tubeMesh: {\n scale: {\n z: tubeLength,\n },\n },\n tubeGroup: {\n rotation: {\n y: THREE.Math.degToRad(90),\n },\n position: {\n x: tubePosition,\n z: 0.02,\n },\n },\n endGroup: {\n rotation: {\n y: THREE.Math.degToRad(90),\n },\n position: {\n z: tubePosition - 0.006,\n },\n },\n childGroup: {\n position: {\n z: -0.018, // adjust for thickness of end cap\n },\n rotation: {\n y: THREE.Math.degToRad(180), // orient correctly\n },\n },\n };\n\n return defaultOffsets;\n }\n\n function getComponents() {\n const beginCapMesh = group.children[0];\n const tubeGroup = group.children[1];\n const tubeMesh = tubeGroup.children[0];\n const endGroup = tubeGroup.children[1];\n const endCapGroup = endGroup.children[0];\n const endCapMesh = endCapGroup.children[0];\n const childGroup = endCapGroup.children[1];\n\n return {\n beginCapMesh,\n tubeGroup,\n tubeMesh,\n endCapGroup,\n endCapMesh,\n endGroup,\n childGroup,\n };\n }\n\n function updateLength(length) {\n group.userData.length = length;\n\n const {\n endGroup,\n tubeGroup,\n tubeMesh,\n } = getComponents();\n\n const {\n endGroup: endGroupOffset,\n tubeGroup: tubeGroupOffset,\n } = getAdjustedOffsets();\n\n tubeMesh.scale.z = length; // scale tube by given length\n tubeGroup.position.x = tubeGroupOffset.position.x; // reposition tube group so that its origin remains the same\n endGroup.position.z = endGroupOffset.position.z; // move end group so that it aligns with tube\n }\n\n function updateTwist(twist) {\n group.userData.twist = twist;\n\n const { endCapGroup } = getComponents();\n endCapGroup.rotation.x = twist;\n }\n\n function addChild(child) {\n const { childGroup } = getComponents();\n childGroup.add(child);\n }\n\n function removeChild(child) {\n const { childGroup } = getComponents();\n childGroup.remove(child);\n }\n\n function getChild() {\n const { childGroup } = getComponents();\n if (!childGroup.children || !childGroup.children.length) {\n return null;\n }\n\n return childGroup.children[0];\n }\n\n function getChildMeshes() {\n const { beginCapMesh, tubeMesh, endCapMesh } = getComponents();\n\n return [\n beginCapMesh,\n tubeMesh,\n endCapMesh,\n ];\n }\n\n function addInterfaceItem(interfaceItem) {\n\n if(group.userData.attachments && group.userData.attachments.length) {\n const { childTranslationOffset, childRotationOffset } = group.userData.attachments[0];\n const { childGroup } = getComponents();\n \n childGroup.add(interfaceItem);\n\n interfaceItem.position.set(childTranslationOffset.x, childTranslationOffset.y, childTranslationOffset.z);\n interfaceItem.rotation.set(childRotationOffset.x, childRotationOffset.y, childRotationOffset.z, 'XYZ');\n }\n }\n}\n","import * as THREE from 'three';\n\nexport const createPartGroup = (meshes, userData) => {\n const group = createGroup();\n\n group.userData = {\n ...userData,\n addChild,\n getChild,\n getChildMeshes,\n removeChild,\n addInterfaceItem,\n };\n\n return group;\n\n function createGroup() {\n const group = new THREE.Group();\n meshes.forEach((mesh) => {\n const clonedMesh = mesh.clone();\n clonedMesh.geometry.computeBoundingBox();\n group.add(clonedMesh);\n });\n \n return group;\n }\n\n function addChild(child) {\n group.add(child);\n }\n\n function removeChild(child) {\n group.remove(child);\n }\n\n function getChildMeshes() {\n const meshesToOutline = group.children.filter(child => child.type === 'Mesh');\n return meshesToOutline;\n }\n\n function getChild() {\n const children = group.children.filter(child => child.type === 'Group');\n if (!children || !children.length) {\n return null;\n }\n\n return children[0];\n }\n\n function addInterfaceItem(interfaceItem) {\n\n if(group.userData.attachments && group.userData.attachments.length) {\n const { childTranslationOffset, childRotationOffset } = group.userData.attachments[0];\n\n group.add(interfaceItem);\n\n interfaceItem.position.set(childTranslationOffset.x, childTranslationOffset.y, childTranslationOffset.z);\n interfaceItem.rotation.set(childRotationOffset.x, childRotationOffset.y, childRotationOffset.z, 'XYZ');\n }\n }\n}\n","import strategies from './part-group-strategies';\n\nexport default (camera) => {\n function create(meshes, userData) {\n const {\n partCategory: category,\n translation,\n rotation,\n } = userData;\n\n const { createPartGroup } = strategies[category] || strategies.default;\n const group = createPartGroup(meshes, userData);\n\n const canRotate = category === 'Actuator';\n\n // Return attributes and functions as part of userData so that the consumer can freely call them\n group.userData = {\n ...group.userData,\n setLocalTransform,\n getOutlineMeshes,\n canRotate,\n updateConstraint,\n };\n\n group.name = userData.id;\n\n setLocalTransform(translation, rotation);\n\n if (group.userData.applyTransformation) {\n group.userData.applyTransformation();\n }\n\n if (group.userData.twist) {\n updateConstraint('twist', group.userData.twist);\n }\n \n return group;\n \n function setLocalTransform(translation, rotation) {\n if (translation) {\n group.position.x = translation.x;\n group.position.y = translation.y;\n group.position.z = translation.z;\n }\n\n if (rotation) {\n group.rotation.x = rotation.x;\n group.rotation.y = rotation.y;\n group.rotation.z = rotation.z;\n }\n }\n\n function getOutlineMeshes() {\n if (!group || !group.userData || !group.userData.getChildMeshes) {\n return [];\n }\n\n const { getChildMeshes } = group.userData;\n const meshesToOutline = getChildMeshes();\n return meshesToOutline;\n }\n\n function updateConstraint(constraint, value) {\n switch (constraint) {\n case 'twist':\n if (group.userData.updateTwist) {\n group.userData.updateTwist(value);\n }\n break;\n case 'length':\n if (group.userData.updateLength) {\n group.userData.updateLength(value);\n }\n break;\n default:\n break;\n }\n }\n }\n\n return {\n create,\n };\n}\n","import GLTFLoader from 'three-gltf-loader';\n\nimport { REACT_APP_HEBI_API_BASE_URL } from '../../../app/config/env-config';\nimport { promisifyLoader } from './three-utils';\n\nconst GltfLoader = new GLTFLoader();\nGltfLoader.setPath(REACT_APP_HEBI_API_BASE_URL);\n\nexport default promisifyLoader(GltfLoader);\n","export const promisifyLoader = (loader, onProgress) => {\n function promiseLoader(url) {\n return new Promise((resolve, reject) => {\n loader.load(url, resolve, onProgress, reject);\n });\n }\n\n return {\n originalLoader: loader,\n load: promiseLoader,\n };\n};\n","export const ASSET_CACHE_ERROR_MESSAGE = 'Failed to load asset during caching process.';","import { toast } from 'react-toastify';\nimport GLTFLoader from './GLTFLoader';\nimport {\n ASSET_CACHE_ERROR_MESSAGE,\n } from './constants';\n\nexport default () => {\n\n //NOTE: This asset cache needs to remain in memory for now.\n // With the local storage limit of 10mb, we won't be \n // able to load the cached asset meshes there.\n let assetCache = [];\n\n async function getPartAssets(part) {\n let matchingAssets = getFirstPartAsset(part);\n if (matchingAssets == null) {\n await addPartToCache(part);\n return getFirstPartAsset(part);\n }\n return matchingAssets;\n }\n\n function getFirstPartAsset(part) {\n let matchingAssets = assetCache.filter(p => p.partId === part.id);\n if (matchingAssets && matchingAssets.length > 0) {\n return matchingAssets[0];\n }\n return null;\n }\n\n async function addPartToCache(part) {\n if (!part.assets)\n return;\n\n for (const partAsset of part.assets) {\n if (!partAsset.url)\n return;\n try {\n const gltf = await GLTFLoader.load(partAsset.url);\n gltf.scene.traverse(child => {\n if (child.type === \"Mesh\") {\n cachePartAsset(part, child);\n }\n });\n } catch (error) {\n toast.error(ASSET_CACHE_ERROR_MESSAGE);\n }\n }\n }\n\n function cachePartAsset(part, mesh) {\n let cachedPartAssets = getCachedPartAssetsById(part.id);\n if (!cachedPartAssets) {\n let addedCachedPart = {\n partId: part.id,\n meshes: [mesh]\n };\n assetCache.push(addedCachedPart);\n }\n else {\n let cachedMesh = cachedPartAssets.meshes.filter(m => m === mesh);\n if (!cachedMesh || cachedMesh.length === 0) {\n cachedPartAssets.meshes.push(mesh);\n }\n }\n }\n\n function getCachedPartAssetsById(partId) {\n let matchingAssets = assetCache.filter(p => p.partId === partId);\n if (matchingAssets && matchingAssets.length > 0)\n return matchingAssets[0];\n else\n return null;\n }\n\n return {\n getPartAssets,\n addPartToCache,\n }\n}","import {\n Vector2,\n Vector3,\n} from 'three';\n\nexport default class WindowManager {\n static instance;\n\n constructor(canvas, camera, renderer, composer) {\n if (this.instance) {\n return this.instance;\n }\n\n this.canvas = canvas;\n this.camera = camera;\n this.renderer = renderer;\n this.composer = composer;\n this.workspaceDimensions = {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n\n this.bindEventListeners = this.bindEventListeners.bind(this);\n this.getWindowCoordinates = this.getWindowCoordinates.bind(this);\n this.normalizeMouseScreenCoords = this.normalizeMouseScreenCoords.bind(this);\n this.removeEventListeners = this.removeEventListeners.bind(this);\n this.resizeCanvas = this.resizeCanvas.bind(this);\n this.bindEventListeners();\n this.instance = this;\n }\n\n removeEventListeners() {\n window.removeEventListener('resize', this.resizeCanvas);\n window.removeEventListener('beforeunload', this.removeEventListeners);\n }\n\n bindEventListeners() {\n window.addEventListener('resize', this.resizeCanvas);\n window.addEventListener('beforeunload', this.removeEventListeners);\n }\n\n getWindowCoordinates(object) {\n const position = new Vector3();\n object.getWorldPosition(position);\n position.project(this.camera);\n\n const x = Math.round((0.5 + position.x / 2) * (this.workspaceDimensions.width / window.devicePixelRatio));\n const y = Math.round((0.5 - position.y / 2) * (this.workspaceDimensions.height / window.devicePixelRatio));\n\n return {\n x,\n y,\n };\n }\n\n resizeCanvas() {\n this.canvas.style.width = '100%';\n this.canvas.style.height= '100%';\n \n this.canvas.width = this.canvas.offsetWidth;\n this.canvas.height = this.canvas.offsetHeight;\n\n this.workspaceDimensions = {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n\n this.camera.aspect = this.workspaceDimensions.width / this.workspaceDimensions.height;\n this.camera.updateProjectionMatrix();\n\n this.renderer.setSize(this.workspaceDimensions.width, this.workspaceDimensions.height);\n this.composer.setSize(this.workspaceDimensions.width, this.workspaceDimensions.height);\n }\n\n normalizeMouseScreenCoords(x, y) {\n //top left is (-1, 1), bottom right is (1, -1)\n\n const mouse2D = new Vector2(\n (x / this.workspaceDimensions.width) * 2 - 1,\n - (y / this.workspaceDimensions.height) * 2 + 1\n );\n\n return mouse2D;\n }\n}\n","\nexport const TranslationMode = {\n xOnly: 1,\n yOnly: 2,\n zOnly: 3,\n all: 4,\n};\n","//Note: these colors will not directly match the hex codes on the React side.\n//These are non-linear color definitions which are then gamma-corrected by WebGL.\n\nexport const WORKSPACE_BKG_COLOR = 0xB5B4AE;\nexport const WORKSPACE_GRID_COLOR = 0x474642;\nexport const PRIMARY_HIGHLIGHT_COLOR = 0x15c663;\nexport const SECONDARY_HIGHLIGHT_COLOR = 0xc8ded5;\n","/* eslint-disable */\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nimport Pass from './Pass';\n\nvar THREE = require('three');\n\n\nTHREE.ShaderPass = function ( shader, textureID ) {\n\n\tPass.call( this );\n\n\tthis.textureID = ( textureID !== undefined ) ? textureID : \"tDiffuse\";\n\n\tif ( shader instanceof THREE.ShaderMaterial ) {\n\n\t\tthis.uniforms = shader.uniforms;\n\n\t\tthis.material = shader;\n\n\t} else if ( shader ) {\n\n\t\tthis.uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\t\tthis.material = new THREE.ShaderMaterial( {\n\n\t\t\tdefines: Object.assign( {}, shader.defines ),\n\t\t\tuniforms: this.uniforms,\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader\n\n\t\t} );\n\n\t}\n\n\tthis.camera = new THREE.OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\tthis.scene = new THREE.Scene();\n\n\tthis.quad = new THREE.Mesh( new THREE.PlaneBufferGeometry( 2, 2 ), null );\n\tthis.quad.frustumCulled = false; // Avoid getting clipped\n\tthis.scene.add( this.quad );\n\n};\n\nTHREE.ShaderPass.prototype = Object.assign( Object.create( Pass.prototype ), {\n\n\tconstructor: THREE.ShaderPass,\n\n\trender: function( renderer, writeBuffer, readBuffer, delta, maskActive ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].value = readBuffer.texture;\n\n\t\t}\n\n\t\tthis.quad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( this.scene, this.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n\t\t}\n\n\t}\n\n} );\n\nexport default THREE.ShaderPass;\n","/* eslint-disable */\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nimport CopyShader from '../Shaders/CopyShader';\nimport ShaderPass from './ShaderPass';\n\nvar THREE = require('three');\n\n\nTHREE.EffectComposer = function ( renderer, renderTarget ) {\n\n\tthis.renderer = renderer;\n\n\tif ( renderTarget === undefined ) {\n\n\t\tvar parameters = {\n\t\t\tminFilter: THREE.LinearFilter,\n\t\t\tmagFilter: THREE.LinearFilter,\n\t\t\tformat: THREE.RGBAFormat,\n\t\t\tstencilBuffer: false\n\t\t};\n\n\t\tvar size = renderer.getDrawingBufferSize();\n\t\trenderTarget = new THREE.WebGLRenderTarget( size.width, size.height, parameters );\n\t\trenderTarget.texture.name = 'EffectComposer.rt1';\n\n\t}\n\n\tthis.renderTarget1 = renderTarget;\n\tthis.renderTarget2 = renderTarget.clone();\n\tthis.renderTarget2.texture.name = 'EffectComposer.rt2';\n\n\tthis.writeBuffer = this.renderTarget1;\n\tthis.readBuffer = this.renderTarget2;\n\n\tthis.passes = [];\n\n\t// dependencies\n\n\tif ( CopyShader === undefined ) {\n\n\t\tconsole.error( 'THREE.EffectComposer relies on THREE.CopyShader' );\n\n\t}\n\n\tif ( ShaderPass === undefined ) {\n\n\t\tconsole.error( 'THREE.EffectComposer relies on THREE.ShaderPass' );\n\n\t}\n\n\tthis.copyPass = new ShaderPass( CopyShader );\n\n};\n\nTHREE.EffectComposer.prototype = Object.assign( THREE.EffectComposer.prototype, {\n\n\tswapBuffers: function () {\n\n\t\tvar tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t},\n\n\taddPass: function ( pass ) {\n\n\t\tthis.passes.push( pass );\n\n\t\tvar size = this.renderer.getDrawingBufferSize();\n\t\tpass.setSize( size.width, size.height );\n\n\t},\n\n\tinsertPass: function ( pass, index ) {\n\n\t\tthis.passes.splice( index, 0, pass );\n\n\t},\n\n\trender: function ( delta ) {\n\n\t\tvar maskActive = false;\n\n\t\tvar pass, i, il = this.passes.length;\n\n\t\tfor ( i = 0; i < il; i ++ ) {\n\n\t\t\tpass = this.passes[ i ];\n\n\t\t\tif ( pass.enabled === false ) continue;\n\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tvar context = this.renderer.context;\n\n\t\t\t\t\tcontext.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta );\n\n\t\t\t\t\tcontext.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( THREE.MaskPass !== undefined ) {\n\n\t\t\t\tif ( pass instanceof THREE.MaskPass ) {\n\n\t\t\t\t\tmaskActive = true;\n\n\t\t\t\t} else if ( pass instanceof THREE.ClearMaskPass ) {\n\n\t\t\t\t\tmaskActive = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\treset: function ( renderTarget ) {\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tvar size = this.renderer.getDrawingBufferSize();\n\n\t\t\trenderTarget = this.renderTarget1.clone();\n\t\t\trenderTarget.setSize( size.width, size.height );\n\n\t\t}\n\n\t\tthis.renderTarget1.dispose();\n\t\tthis.renderTarget2.dispose();\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t},\n\n\tsetSize: function ( width, height ) {\n\n\t\tthis.renderTarget1.setSize( width, height );\n\t\tthis.renderTarget2.setSize( width, height );\n\n\t\tfor ( var i = 0; i < this.passes.length; i ++ ) {\n\n\t\t\tthis.passes[ i ].setSize( width, height );\n\n\t\t}\n\n\t}\n\n} );\n\n\nexport default THREE.EffectComposer;\n","/* eslint-disable */\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\n import Pass from './Pass';\n\nvar THREE = require('three');\n\n\nTHREE.RenderPass = function ( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n\n\tPass.call( this );\n\n\tthis.scene = scene;\n\tthis.camera = camera;\n\n\tthis.overrideMaterial = overrideMaterial;\n\n\tthis.clearColor = clearColor;\n\tthis.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 0;\n\n\tthis.clear = true;\n\tthis.clearDepth = false;\n\tthis.needsSwap = false;\n\n};\n\nTHREE.RenderPass.prototype = Object.assign( Object.create( Pass.prototype ), {\n\n\tconstructor: THREE.RenderPass,\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {\n\n\t\tvar oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\tvar oldClearColor, oldClearAlpha;\n\n\t\tif ( this.clearColor ) {\n\n\t\t\toldClearColor = renderer.getClearColor().getHex();\n\t\t\toldClearAlpha = renderer.getClearAlpha();\n\n\t\t\trenderer.setClearColor( this.clearColor, this.clearAlpha );\n\n\t\t}\n\n\t\tif ( this.clearDepth ) {\n\n\t\t\trenderer.clearDepth();\n\n\t\t}\n\n\t\trenderer.render( this.scene, this.camera, this.renderToScreen ? null : readBuffer, this.clear );\n\n\t\tif ( this.clearColor ) {\n\n\t\t\trenderer.setClearColor( oldClearColor, oldClearAlpha );\n\n\t\t}\n\n\t\tthis.scene.overrideMaterial = null;\n\t\trenderer.autoClear = oldAutoClear;\n\t}\n\n} );\n\nexport default THREE.RenderPass;\n","/* eslint-disable */\n\n/**\n * @author spidersharma / http://eduperiment.com/\n */\n\nimport Pass from './Pass';\n\nvar THREE = require('three');\n\n\nTHREE.OutlinePass = function ( resolution, scene, camera, selectedObjects ) {\n\n\tthis.renderScene = scene;\n\tthis.renderCamera = camera;\n\tthis.selectedObjects = selectedObjects !== undefined ? selectedObjects : [];\n\tthis.visibleEdgeColor = new THREE.Color( 1, 1, 1 );\n\tthis.hiddenEdgeColor = new THREE.Color( 0.1, 0.04, 0.02 );\n\tthis.edgeGlow = 0.0;\n\tthis.usePatternTexture = false;\n\tthis.edgeThickness = 1.0;\n\tthis.edgeStrength = 3.0;\n\tthis.downSampleRatio = 2;\n\tthis.pulsePeriod = 0;\n\n\tPass.call( this );\n\n\tthis.resolution = ( resolution !== undefined ) ? new THREE.Vector2( resolution.x, resolution.y ) : new THREE.Vector2( 256, 256 );\n\n\tvar pars = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat };\n\n\tvar resx = Math.round( this.resolution.x / this.downSampleRatio );\n\tvar resy = Math.round( this.resolution.y / this.downSampleRatio );\n\n\tthis.maskBufferMaterial = new THREE.MeshBasicMaterial( { color: 0xffffff } );\n\tthis.maskBufferMaterial.side = THREE.DoubleSide;\n\tthis.renderTargetMaskBuffer = new THREE.WebGLRenderTarget( this.resolution.x, this.resolution.y, pars );\n\tthis.renderTargetMaskBuffer.texture.name = \"OutlinePass.mask\";\n\tthis.renderTargetMaskBuffer.texture.generateMipmaps = false;\n\n\tthis.depthMaterial = new THREE.MeshDepthMaterial();\n\tthis.depthMaterial.side = THREE.DoubleSide;\n\tthis.depthMaterial.depthPacking = THREE.RGBADepthPacking;\n\tthis.depthMaterial.blending = THREE.NoBlending;\n\n\tthis.prepareMaskMaterial = this.getPrepareMaskMaterial();\n\tthis.prepareMaskMaterial.side = THREE.DoubleSide;\n\tthis.prepareMaskMaterial.fragmentShader = replaceDepthToViewZ( this.prepareMaskMaterial.fragmentShader, this.renderCamera );\n\n\tthis.renderTargetDepthBuffer = new THREE.WebGLRenderTarget( this.resolution.x, this.resolution.y, pars );\n\tthis.renderTargetDepthBuffer.texture.name = \"OutlinePass.depth\";\n\tthis.renderTargetDepthBuffer.texture.generateMipmaps = false;\n\n\tthis.renderTargetMaskDownSampleBuffer = new THREE.WebGLRenderTarget( resx, resy, pars );\n\tthis.renderTargetMaskDownSampleBuffer.texture.name = \"OutlinePass.depthDownSample\";\n\tthis.renderTargetMaskDownSampleBuffer.texture.generateMipmaps = false;\n\n\tthis.renderTargetBlurBuffer1 = new THREE.WebGLRenderTarget( resx, resy, pars );\n\tthis.renderTargetBlurBuffer1.texture.name = \"OutlinePass.blur1\";\n\tthis.renderTargetBlurBuffer1.texture.generateMipmaps = false;\n\tthis.renderTargetBlurBuffer2 = new THREE.WebGLRenderTarget( Math.round( resx / 2 ), Math.round( resy / 2 ), pars );\n\tthis.renderTargetBlurBuffer2.texture.name = \"OutlinePass.blur2\";\n\tthis.renderTargetBlurBuffer2.texture.generateMipmaps = false;\n\n\tthis.edgeDetectionMaterial = this.getEdgeDetectionMaterial();\n\tthis.renderTargetEdgeBuffer1 = new THREE.WebGLRenderTarget( resx, resy, pars );\n\tthis.renderTargetEdgeBuffer1.texture.name = \"OutlinePass.edge1\";\n\tthis.renderTargetEdgeBuffer1.texture.generateMipmaps = false;\n\tthis.renderTargetEdgeBuffer2 = new THREE.WebGLRenderTarget( Math.round( resx / 2 ), Math.round( resy / 2 ), pars );\n\tthis.renderTargetEdgeBuffer2.texture.name = \"OutlinePass.edge2\";\n\tthis.renderTargetEdgeBuffer2.texture.generateMipmaps = false;\n\n\tvar MAX_EDGE_THICKNESS = 4;\n\tvar MAX_EDGE_GLOW = 4;\n\n\tthis.separableBlurMaterial1 = this.getSeperableBlurMaterial( MAX_EDGE_THICKNESS );\n\tthis.separableBlurMaterial1.uniforms[ \"texSize\" ].value = new THREE.Vector2( resx, resy );\n\tthis.separableBlurMaterial1.uniforms[ \"kernelRadius\" ].value = 1;\n\tthis.separableBlurMaterial2 = this.getSeperableBlurMaterial( MAX_EDGE_GLOW );\n\tthis.separableBlurMaterial2.uniforms[ \"texSize\" ].value = new THREE.Vector2( Math.round( resx / 2 ), Math.round( resy / 2 ) );\n\tthis.separableBlurMaterial2.uniforms[ \"kernelRadius\" ].value = MAX_EDGE_GLOW;\n\n\t// Overlay material\n\tthis.overlayMaterial = this.getOverlayMaterial();\n\n\t// copy material\n\tif ( THREE.CopyShader === undefined )\n\t\tconsole.error( \"THREE.OutlinePass relies on THREE.CopyShader\" );\n\n\tvar copyShader = THREE.CopyShader;\n\n\tthis.copyUniforms = THREE.UniformsUtils.clone( copyShader.uniforms );\n\tthis.copyUniforms[ \"opacity\" ].value = 1.0;\n\n\tthis.materialCopy = new THREE.ShaderMaterial( {\n\t\tuniforms: this.copyUniforms,\n\t\tvertexShader: copyShader.vertexShader,\n\t\tfragmentShader: copyShader.fragmentShader,\n\t\tblending: THREE.NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false,\n\t\ttransparent: true\n\t} );\n\n\tthis.enabled = true;\n\tthis.needsSwap = false;\n\n\tthis.oldClearColor = new THREE.Color();\n\tthis.oldClearAlpha = 1;\n\n\tthis.camera = new THREE.OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\tthis.scene = new THREE.Scene();\n\n\tthis.quad = new THREE.Mesh( new THREE.PlaneBufferGeometry( 2, 2 ), null );\n\tthis.quad.frustumCulled = false; // Avoid getting clipped\n\tthis.scene.add( this.quad );\n\n\tthis.tempPulseColor1 = new THREE.Color();\n\tthis.tempPulseColor2 = new THREE.Color();\n\tthis.textureMatrix = new THREE.Matrix4();\n\n\tfunction replaceDepthToViewZ( string, camera ) {\n\n\t\tvar type = camera.isPerspectiveCamera ? 'perspective' : 'orthographic';\n\n\t\treturn string.replace( /DEPTH_TO_VIEW_Z/g, type + 'DepthToViewZ' );\n\n\t}\n\n};\n\nTHREE.OutlinePass.prototype = Object.assign( Object.create( Pass.prototype ), {\n\n\tconstructor: THREE.OutlinePass,\n\n\tdispose: function () {\n\n\t\tthis.renderTargetMaskBuffer.dispose();\n\t\tthis.renderTargetDepthBuffer.dispose();\n\t\tthis.renderTargetMaskDownSampleBuffer.dispose();\n\t\tthis.renderTargetBlurBuffer1.dispose();\n\t\tthis.renderTargetBlurBuffer2.dispose();\n\t\tthis.renderTargetEdgeBuffer1.dispose();\n\t\tthis.renderTargetEdgeBuffer2.dispose();\n\n\t},\n\n\tsetSize: function ( width, height ) {\n\n\t\tthis.renderTargetMaskBuffer.setSize( width, height );\n\n\t\tvar resx = Math.round( width / this.downSampleRatio );\n\t\tvar resy = Math.round( height / this.downSampleRatio );\n\t\tthis.renderTargetMaskDownSampleBuffer.setSize( resx, resy );\n\t\tthis.renderTargetBlurBuffer1.setSize( resx, resy );\n\t\tthis.renderTargetEdgeBuffer1.setSize( resx, resy );\n\t\tthis.separableBlurMaterial1.uniforms[ \"texSize\" ].value = new THREE.Vector2( resx, resy );\n\n\t\tresx = Math.round( resx / 2 );\n\t\tresy = Math.round( resy / 2 );\n\n\t\tthis.renderTargetBlurBuffer2.setSize( resx, resy );\n\t\tthis.renderTargetEdgeBuffer2.setSize( resx, resy );\n\n\t\tthis.separableBlurMaterial2.uniforms[ \"texSize\" ].value = new THREE.Vector2( resx, resy );\n\n\t},\n\n\tchangeVisibilityOfSelectedObjects: function ( bVisible ) {\n\n\t\tfunction gatherSelectedMeshesCallBack( object ) {\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( bVisible ) {\n\n\t\t\t\t\tobject.visible = object.userData.oldVisible;\n\t\t\t\t\tdelete object.userData.oldVisible;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tobject.userData.oldVisible = object.visible;\n\t\t\t\t\tobject.visible = bVisible;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( var i = 0; i < this.selectedObjects.length; i ++ ) {\n\n\t\t\tvar selectedObject = this.selectedObjects[ i ];\n\t\t\tselectedObject.traverse( gatherSelectedMeshesCallBack );\n\n\t\t}\n\n\t},\n\n\tchangeVisibilityOfNonSelectedObjects: function ( bVisible ) {\n\n\t\tvar selectedMeshes = [];\n\n\t\tfunction gatherSelectedMeshesCallBack( object ) {\n\n\t\t\tif ( object.isMesh ) selectedMeshes.push( object );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < this.selectedObjects.length; i ++ ) {\n\n\t\t\tvar selectedObject = this.selectedObjects[ i ];\n\t\t\tselectedObject.traverse( gatherSelectedMeshesCallBack );\n\n\t\t}\n\n\t\tfunction VisibilityChangeCallBack( object ) {\n\n\t\t\tif ( object.isMesh || object.isLine || object.isSprite ) {\n\n\t\t\t\tvar bFound = false;\n\n\t\t\t\tfor ( var i = 0; i < selectedMeshes.length; i ++ ) {\n\n\t\t\t\t\tvar selectedObjectId = selectedMeshes[ i ].id;\n\n\t\t\t\t\tif ( selectedObjectId === object.id ) {\n\n\t\t\t\t\t\tbFound = true;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! bFound ) {\n\n\t\t\t\t\tvar visibility = object.visible;\n\n\t\t\t\t\tif ( ! bVisible || object.bVisible ) object.visible = bVisible;\n\n\t\t\t\t\tobject.bVisible = visibility;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.renderScene.traverse( VisibilityChangeCallBack );\n\n\t},\n\n\tupdateTextureMatrix: function () {\n\n\t\tthis.textureMatrix.set( 0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t0.0, 0.0, 0.0, 1.0 );\n\t\tthis.textureMatrix.multiply( this.renderCamera.projectionMatrix );\n\t\tthis.textureMatrix.multiply( this.renderCamera.matrixWorldInverse );\n\n\t},\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {\n\n\t\tif ( this.selectedObjects.length > 0 ) {\n\n\t\t\tthis.oldClearColor.copy( renderer.getClearColor() );\n\t\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\t\t\tvar oldAutoClear = renderer.autoClear;\n\n\t\t\trenderer.autoClear = false;\n\n\t\t\tif ( maskActive ) renderer.context.disable( renderer.context.STENCIL_TEST );\n\n\t\t\trenderer.setClearColor( 0xffffff, 1 );\n\n\t\t\t// Make selected objects invisible\n\t\t\tthis.changeVisibilityOfSelectedObjects( false );\n\n\t\t\tvar currentBackground = this.renderScene.background;\n\t\t\tthis.renderScene.background = null;\n\n\t\t\t// 1. Draw Non Selected objects in the depth buffer\n\t\t\tthis.renderScene.overrideMaterial = this.depthMaterial;\n\t\t\trenderer.render( this.renderScene, this.renderCamera, this.renderTargetDepthBuffer, true );\n\n\t\t\t// Make selected objects visible\n\t\t\tthis.changeVisibilityOfSelectedObjects( true );\n\n\t\t\t// Update Texture Matrix for Depth compare\n\t\t\tthis.updateTextureMatrix();\n\n\t\t\t// Make non selected objects invisible, and draw only the selected objects, by comparing the depth buffer of non selected objects\n\t\t\tthis.changeVisibilityOfNonSelectedObjects( false );\n\t\t\tthis.renderScene.overrideMaterial = this.prepareMaskMaterial;\n\t\t\tthis.prepareMaskMaterial.uniforms[ \"cameraNearFar\" ].value = new THREE.Vector2( this.renderCamera.near, this.renderCamera.far );\n\t\t\tthis.prepareMaskMaterial.uniforms[ \"depthTexture\" ].value = this.renderTargetDepthBuffer.texture;\n\t\t\tthis.prepareMaskMaterial.uniforms[ \"textureMatrix\" ].value = this.textureMatrix;\n\t\t\trenderer.render( this.renderScene, this.renderCamera, this.renderTargetMaskBuffer, true );\n\t\t\tthis.renderScene.overrideMaterial = null;\n\t\t\tthis.changeVisibilityOfNonSelectedObjects( true );\n\n\t\t\tthis.renderScene.background = currentBackground;\n\n\t\t\t// 2. Downsample to Half resolution\n\t\t\tthis.quad.material = this.materialCopy;\n\t\t\tthis.copyUniforms[ \"tDiffuse\" ].value = this.renderTargetMaskBuffer.texture;\n\t\t\trenderer.render( this.scene, this.camera, this.renderTargetMaskDownSampleBuffer, true );\n\n\t\t\tthis.tempPulseColor1.copy( this.visibleEdgeColor );\n\t\t\tthis.tempPulseColor2.copy( this.hiddenEdgeColor );\n\n\t\t\tif ( this.pulsePeriod > 0 ) {\n\n\t\t\t\tvar scalar = ( 1 + 0.25 ) / 2 + Math.cos( performance.now() * 0.01 / this.pulsePeriod ) * ( 1.0 - 0.25 ) / 2;\n\t\t\t\tthis.tempPulseColor1.multiplyScalar( scalar );\n\t\t\t\tthis.tempPulseColor2.multiplyScalar( scalar );\n\n\t\t\t}\n\n\t\t\t// 3. Apply Edge Detection Pass\n\t\t\tthis.quad.material = this.edgeDetectionMaterial;\n\t\t\tthis.edgeDetectionMaterial.uniforms[ \"maskTexture\" ].value = this.renderTargetMaskDownSampleBuffer.texture;\n\t\t\tthis.edgeDetectionMaterial.uniforms[ \"texSize\" ].value = new THREE.Vector2( this.renderTargetMaskDownSampleBuffer.width, this.renderTargetMaskDownSampleBuffer.height );\n\t\t\tthis.edgeDetectionMaterial.uniforms[ \"visibleEdgeColor\" ].value = this.tempPulseColor1;\n\t\t\tthis.edgeDetectionMaterial.uniforms[ \"hiddenEdgeColor\" ].value = this.tempPulseColor2;\n\t\t\trenderer.render( this.scene, this.camera, this.renderTargetEdgeBuffer1, true );\n\n\t\t\t// 4. Apply Blur on Half res\n\t\t\tthis.quad.material = this.separableBlurMaterial1;\n\t\t\tthis.separableBlurMaterial1.uniforms[ \"colorTexture\" ].value = this.renderTargetEdgeBuffer1.texture;\n\t\t\tthis.separableBlurMaterial1.uniforms[ \"direction\" ].value = THREE.OutlinePass.BlurDirectionX;\n\t\t\tthis.separableBlurMaterial1.uniforms[ \"kernelRadius\" ].value = this.edgeThickness;\n\t\t\trenderer.render( this.scene, this.camera, this.renderTargetBlurBuffer1, true );\n\t\t\tthis.separableBlurMaterial1.uniforms[ \"colorTexture\" ].value = this.renderTargetBlurBuffer1.texture;\n\t\t\tthis.separableBlurMaterial1.uniforms[ \"direction\" ].value = THREE.OutlinePass.BlurDirectionY;\n\t\t\trenderer.render( this.scene, this.camera, this.renderTargetEdgeBuffer1, true );\n\n\t\t\t// Apply Blur on quarter res\n\t\t\tthis.quad.material = this.separableBlurMaterial2;\n\t\t\tthis.separableBlurMaterial2.uniforms[ \"colorTexture\" ].value = this.renderTargetEdgeBuffer1.texture;\n\t\t\tthis.separableBlurMaterial2.uniforms[ \"direction\" ].value = THREE.OutlinePass.BlurDirectionX;\n\t\t\trenderer.render( this.scene, this.camera, this.renderTargetBlurBuffer2, true );\n\t\t\tthis.separableBlurMaterial2.uniforms[ \"colorTexture\" ].value = this.renderTargetBlurBuffer2.texture;\n\t\t\tthis.separableBlurMaterial2.uniforms[ \"direction\" ].value = THREE.OutlinePass.BlurDirectionY;\n\t\t\trenderer.render( this.scene, this.camera, this.renderTargetEdgeBuffer2, true );\n\n\t\t\t// Blend it additively over the input texture\n\t\t\tthis.quad.material = this.overlayMaterial;\n\t\t\tthis.overlayMaterial.uniforms[ \"maskTexture\" ].value = this.renderTargetMaskBuffer.texture;\n\t\t\tthis.overlayMaterial.uniforms[ \"edgeTexture1\" ].value = this.renderTargetEdgeBuffer1.texture;\n\t\t\tthis.overlayMaterial.uniforms[ \"edgeTexture2\" ].value = this.renderTargetEdgeBuffer2.texture;\n\t\t\tthis.overlayMaterial.uniforms[ \"patternTexture\" ].value = this.patternTexture;\n\t\t\tthis.overlayMaterial.uniforms[ \"edgeStrength\" ].value = this.edgeStrength;\n\t\t\tthis.overlayMaterial.uniforms[ \"edgeGlow\" ].value = this.edgeGlow;\n\t\t\tthis.overlayMaterial.uniforms[ \"usePatternTexture\" ].value = this.usePatternTexture;\n\n\n\t\t\tif ( maskActive ) renderer.context.enable( renderer.context.STENCIL_TEST );\n\n\t\t\trenderer.render( this.scene, this.camera, readBuffer, false );\n\n\t\t\trenderer.setClearColor( this.oldClearColor, this.oldClearAlpha );\n\t\t\trenderer.autoClear = oldAutoClear;\n\n\t\t}\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\tthis.quad.material = this.materialCopy;\n\t\t\tthis.copyUniforms[ \"tDiffuse\" ].value = readBuffer.texture;\n\t\t\trenderer.render( this.scene, this.camera );\n\n\t\t}\n\n\t},\n\n\tgetPrepareMaskMaterial: function () {\n\n\t\treturn new THREE.ShaderMaterial( {\n\n\t\t\tuniforms: {\n\t\t\t\t\"depthTexture\": { value: null },\n\t\t\t\t\"cameraNearFar\": { value: new THREE.Vector2( 0.5, 0.5 ) },\n\t\t\t\t\"textureMatrix\": { value: new THREE.Matrix4() }\n\t\t\t},\n\n\t\t\tvertexShader: [\n\t\t\t\t'varying vec4 projTexCoord;',\n\t\t\t\t'varying vec4 vPosition;',\n\t\t\t\t'uniform mat4 textureMatrix;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t'\tvPosition = modelViewMatrix * vec4( position, 1.0 );',\n\t\t\t\t'\tvec4 worldPosition = modelMatrix * vec4( position, 1.0 );',\n\t\t\t\t'\tprojTexCoord = textureMatrix * worldPosition;',\n\t\t\t\t'\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',\n\n\t\t\t\t'}'\n\t\t\t].join( '\\n' ),\n\n\t\t\tfragmentShader: [\n\t\t\t\t'#include ',\n\t\t\t\t'varying vec4 vPosition;',\n\t\t\t\t'varying vec4 projTexCoord;',\n\t\t\t\t'uniform sampler2D depthTexture;',\n\t\t\t\t'uniform vec2 cameraNearFar;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t'\tfloat depth = unpackRGBAToDepth(texture2DProj( depthTexture, projTexCoord ));',\n\t\t\t\t'\tfloat viewZ = - DEPTH_TO_VIEW_Z( depth, cameraNearFar.x, cameraNearFar.y );',\n\t\t\t\t'\tfloat depthTest = (-vPosition.z > viewZ) ? 1.0 : 0.0;',\n\t\t\t\t'\tgl_FragColor = vec4(0.0, depthTest, 1.0, 1.0);',\n\n\t\t\t\t'}'\n\t\t\t].join( '\\n' )\n\n\t\t} );\n\n\t},\n\n\tgetEdgeDetectionMaterial: function () {\n\n\t\treturn new THREE.ShaderMaterial( {\n\n\t\t\tuniforms: {\n\t\t\t\t\"maskTexture\": { value: null },\n\t\t\t\t\"texSize\": { value: new THREE.Vector2( 0.5, 0.5 ) },\n\t\t\t\t\"visibleEdgeColor\": { value: new THREE.Vector3( 1.0, 1.0, 1.0 ) },\n\t\t\t\t\"hiddenEdgeColor\": { value: new THREE.Vector3( 1.0, 1.0, 1.0 ) },\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t\"varying vec2 vUv;\\n\\\n\t\t\t\tvoid main() {\\n\\\n\t\t\t\t\tvUv = uv;\\n\\\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n\\\n\t\t\t\t}\",\n\n\t\t\tfragmentShader:\n\t\t\t\t\"varying vec2 vUv;\\\n\t\t\t\tuniform sampler2D maskTexture;\\\n\t\t\t\tuniform vec2 texSize;\\\n\t\t\t\tuniform vec3 visibleEdgeColor;\\\n\t\t\t\tuniform vec3 hiddenEdgeColor;\\\n\t\t\t\t\\\n\t\t\t\tvoid main() {\\n\\\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\\\n\t\t\t\t\tvec4 uvOffset = vec4(1.0, 0.0, 0.0, 1.0) * vec4(invSize, invSize);\\\n\t\t\t\t\tvec4 c1 = texture2D( maskTexture, vUv + uvOffset.xy);\\\n\t\t\t\t\tvec4 c2 = texture2D( maskTexture, vUv - uvOffset.xy);\\\n\t\t\t\t\tvec4 c3 = texture2D( maskTexture, vUv + uvOffset.yw);\\\n\t\t\t\t\tvec4 c4 = texture2D( maskTexture, vUv - uvOffset.yw);\\\n\t\t\t\t\tfloat diff1 = (c1.r - c2.r)*0.5;\\\n\t\t\t\t\tfloat diff2 = (c3.r - c4.r)*0.5;\\\n\t\t\t\t\tfloat d = length( vec2(diff1, diff2) );\\\n\t\t\t\t\tfloat a1 = min(c1.g, c2.g);\\\n\t\t\t\t\tfloat a2 = min(c3.g, c4.g);\\\n\t\t\t\t\tfloat visibilityFactor = min(a1, a2);\\\n\t\t\t\t\tvec3 edgeColor = 1.0 - visibilityFactor > 0.001 ? visibleEdgeColor : hiddenEdgeColor;\\\n\t\t\t\t\tgl_FragColor = vec4(edgeColor, 1.0) * vec4(d);\\\n\t\t\t\t}\"\n\t\t} );\n\n\t},\n\n\tgetSeperableBlurMaterial: function ( maxRadius ) {\n\n\t\treturn new THREE.ShaderMaterial( {\n\n\t\t\tdefines: {\n\t\t\t\t\"MAX_RADIUS\": maxRadius,\n\t\t\t},\n\n\t\t\tuniforms: {\n\t\t\t\t\"colorTexture\": { value: null },\n\t\t\t\t\"texSize\": { value: new THREE.Vector2( 0.5, 0.5 ) },\n\t\t\t\t\"direction\": { value: new THREE.Vector2( 0.5, 0.5 ) },\n\t\t\t\t\"kernelRadius\": { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t\"varying vec2 vUv;\\n\\\n\t\t\t\tvoid main() {\\n\\\n\t\t\t\t\tvUv = uv;\\n\\\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n\\\n\t\t\t\t}\",\n\n\t\t\tfragmentShader:\n\t\t\t\t\"#include \\\n\t\t\t\tvarying vec2 vUv;\\\n\t\t\t\tuniform sampler2D colorTexture;\\\n\t\t\t\tuniform vec2 texSize;\\\n\t\t\t\tuniform vec2 direction;\\\n\t\t\t\tuniform float kernelRadius;\\\n\t\t\t\t\\\n\t\t\t\tfloat gaussianPdf(in float x, in float sigma) {\\\n\t\t\t\t\treturn 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma;\\\n\t\t\t\t}\\\n\t\t\t\tvoid main() {\\\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\\\n\t\t\t\t\tfloat weightSum = gaussianPdf(0.0, kernelRadius);\\\n\t\t\t\t\tvec3 diffuseSum = texture2D( colorTexture, vUv).rgb * weightSum;\\\n\t\t\t\t\tvec2 delta = direction * invSize * kernelRadius/float(MAX_RADIUS);\\\n\t\t\t\t\tvec2 uvOffset = delta;\\\n\t\t\t\t\tfor( int i = 1; i <= MAX_RADIUS; i ++ ) {\\\n\t\t\t\t\t\tfloat w = gaussianPdf(uvOffset.x, kernelRadius);\\\n\t\t\t\t\t\tvec3 sample1 = texture2D( colorTexture, vUv + uvOffset).rgb;\\\n\t\t\t\t\t\tvec3 sample2 = texture2D( colorTexture, vUv - uvOffset).rgb;\\\n\t\t\t\t\t\tdiffuseSum += ((sample1 + sample2) * w);\\\n\t\t\t\t\t\tweightSum += (2.0 * w);\\\n\t\t\t\t\t\tuvOffset += delta;\\\n\t\t\t\t\t}\\\n\t\t\t\t\tgl_FragColor = vec4(diffuseSum/weightSum, 1.0);\\\n\t\t\t\t}\"\n\t\t} );\n\n\t},\n\n\tgetOverlayMaterial: function () {\n\n\t\treturn new THREE.ShaderMaterial( {\n\n\t\t\tuniforms: {\n\t\t\t\t\"maskTexture\": { value: null },\n\t\t\t\t\"edgeTexture1\": { value: null },\n\t\t\t\t\"edgeTexture2\": { value: null },\n\t\t\t\t\"patternTexture\": { value: null },\n\t\t\t\t\"edgeStrength\": { value: 1.0 },\n\t\t\t\t\"edgeGlow\": { value: 1.0 },\n\t\t\t\t\"usePatternTexture\": { value: 0.0 }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t\"varying vec2 vUv;\\n\\\n\t\t\t\tvoid main() {\\n\\\n\t\t\t\t\tvUv = uv;\\n\\\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n\\\n\t\t\t\t}\",\n\n\t\t\tfragmentShader:\n\t\t\t\t\"varying vec2 vUv;\\\n\t\t\t\tuniform sampler2D maskTexture;\\\n\t\t\t\tuniform sampler2D edgeTexture1;\\\n\t\t\t\tuniform sampler2D edgeTexture2;\\\n\t\t\t\tuniform sampler2D patternTexture;\\\n\t\t\t\tuniform float edgeStrength;\\\n\t\t\t\tuniform float edgeGlow;\\\n\t\t\t\tuniform bool usePatternTexture;\\\n\t\t\t\t\\\n\t\t\t\tvoid main() {\\\n\t\t\t\t\tvec4 edgeValue1 = texture2D(edgeTexture1, vUv);\\\n\t\t\t\t\tvec4 edgeValue2 = texture2D(edgeTexture2, vUv);\\\n\t\t\t\t\tvec4 maskColor = texture2D(maskTexture, vUv);\\\n\t\t\t\t\tvec4 patternColor = texture2D(patternTexture, 6.0 * vUv);\\\n\t\t\t\t\tfloat visibilityFactor = 1.0 - maskColor.g > 0.0 ? 1.0 : 0.5;\\\n\t\t\t\t\tvec4 edgeValue = edgeValue1 + edgeValue2 * edgeGlow;\\\n\t\t\t\t\tvec4 finalColor = edgeStrength * maskColor.r * edgeValue;\\\n\t\t\t\t\tif(usePatternTexture)\\\n\t\t\t\t\t\tfinalColor += + visibilityFactor * (1.0 - maskColor.r) * (1.0 - patternColor.r);\\\n\t\t\t\t\tgl_FragColor = finalColor;\\\n\t\t\t\t}\",\n\t\t\tblending: THREE.AdditiveBlending,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t}\n\n} );\n\nTHREE.OutlinePass.BlurDirectionX = new THREE.Vector2( 1.0, 0.0 );\nTHREE.OutlinePass.BlurDirectionY = new THREE.Vector2( 0.0, 1.0 );\n\nexport default THREE.OutlinePass;\n","/**\n * @author mpk / http://polko.me/\n */\n\n import SMAAShader from '../Shaders/SMAAShader';\n\nvar THREE = require('three');\n\n\nTHREE.SMAAPass = function ( width, height ) {\n\n\tTHREE.Pass.call( this );\n\n\t// render targets\n\n\tthis.edgesRT = new THREE.WebGLRenderTarget( width, height, {\n\t\tdepthBuffer: false,\n\t\tstencilBuffer: false,\n\t\tgenerateMipmaps: false,\n\t\tminFilter: THREE.LinearFilter,\n\t\tformat: THREE.RGBFormat\n\t} );\n\tthis.edgesRT.texture.name = \"SMAAPass.edges\";\n\n\tthis.weightsRT = new THREE.WebGLRenderTarget( width, height, {\n\t\tdepthBuffer: false,\n\t\tstencilBuffer: false,\n\t\tgenerateMipmaps: false,\n\t\tminFilter: THREE.LinearFilter,\n\t\tformat: THREE.RGBAFormat\n\t} );\n\tthis.weightsRT.texture.name = \"SMAAPass.weights\";\n\n\t// textures\n\tvar scope = this;\n\n\tvar areaTextureImage = new Image();\n\tareaTextureImage.src = this.getAreaTexture();\n\tareaTextureImage.onload = function() {\n\t\t// assigning data to HTMLImageElement.src is asynchronous (see #15162)\n\t\tscope.areaTexture.needsUpdate = true;\n\t};\n\n\tthis.areaTexture = new THREE.Texture();\n\tthis.areaTexture.name = \"SMAAPass.area\";\n\tthis.areaTexture.image = areaTextureImage;\n\tthis.areaTexture.format = THREE.RGBFormat;\n\tthis.areaTexture.minFilter = THREE.LinearFilter;\n\tthis.areaTexture.generateMipmaps = false;\n\tthis.areaTexture.flipY = false;\n\n\tvar searchTextureImage = new Image();\n\tsearchTextureImage.src = this.getSearchTexture();\n\tsearchTextureImage.onload = function() {\n\t\t// assigning data to HTMLImageElement.src is asynchronous (see #15162)\n\t\tscope.searchTexture.needsUpdate = true;\n\t};\n\n\tthis.searchTexture = new THREE.Texture();\n\tthis.searchTexture.name = \"SMAAPass.search\";\n\tthis.searchTexture.image = searchTextureImage;\n\tthis.searchTexture.magFilter = THREE.NearestFilter;\n\tthis.searchTexture.minFilter = THREE.NearestFilter;\n\tthis.searchTexture.generateMipmaps = false;\n\tthis.searchTexture.flipY = false;\n\n\t// materials - pass 1\n\n\tif ( SMAAShader === undefined ) {\n\t\tconsole.error( \"THREE.SMAAPass relies on THREE.SMAAShader\" );\n\t}\n\n\tthis.uniformsEdges = THREE.UniformsUtils.clone( SMAAShader[0].uniforms );\n\n\tthis.uniformsEdges[ \"resolution\" ].value.set( 1 / width, 1 / height );\n\n\tthis.materialEdges = new THREE.ShaderMaterial( {\n\t\tdefines: Object.assign( {}, SMAAShader[ 0 ].defines ),\n\t\tuniforms: this.uniformsEdges,\n\t\tvertexShader: SMAAShader[0].vertexShader,\n\t\tfragmentShader: SMAAShader[0].fragmentShader\n\t} );\n\n\t// materials - pass 2\n\n\tthis.uniformsWeights = THREE.UniformsUtils.clone( SMAAShader[1].uniforms );\n\n\tthis.uniformsWeights[ \"resolution\" ].value.set( 1 / width, 1 / height );\n\tthis.uniformsWeights[ \"tDiffuse\" ].value = this.edgesRT.texture;\n\tthis.uniformsWeights[ \"tArea\" ].value = this.areaTexture;\n\tthis.uniformsWeights[ \"tSearch\" ].value = this.searchTexture;\n\n\tthis.materialWeights = new THREE.ShaderMaterial( {\n\t\tdefines: Object.assign( {}, SMAAShader[ 1 ].defines ),\n\t\tuniforms: this.uniformsWeights,\n\t\tvertexShader: SMAAShader[1].vertexShader,\n\t\tfragmentShader: SMAAShader[1].fragmentShader\n\t} );\n\n\t// materials - pass 3\n\n\tthis.uniformsBlend = THREE.UniformsUtils.clone( SMAAShader[2].uniforms );\n\n\tthis.uniformsBlend[ \"resolution\" ].value.set( 1 / width, 1 / height );\n\tthis.uniformsBlend[ \"tDiffuse\" ].value = this.weightsRT.texture;\n\n\tthis.materialBlend = new THREE.ShaderMaterial( {\n\t\tuniforms: this.uniformsBlend,\n\t\tvertexShader: SMAAShader[2].vertexShader,\n\t\tfragmentShader: SMAAShader[2].fragmentShader\n\t} );\n\n\tthis.needsSwap = false;\n\n\tthis.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\tthis.scene = new THREE.Scene();\n\n\tthis.quad = new THREE.Mesh( new THREE.PlaneBufferGeometry( 2, 2 ), null );\n\tthis.quad.frustumCulled = false; // Avoid getting clipped\n\tthis.scene.add( this.quad );\n\n};\n\nTHREE.SMAAPass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), {\n\n\tconstructor: THREE.SMAAPass,\n\n\trender: function ( renderer, writeBuffer, readBuffer, delta, maskActive ) {\n\n\t\t// pass 1\n\n\t\tthis.uniformsEdges[ \"tDiffuse\" ].value = readBuffer.texture;\n\n\t\tthis.quad.material = this.materialEdges;\n\n\t\trenderer.render( this.scene, this.camera, this.edgesRT, this.clear );\n\n\t\t// pass 2\n\n\t\tthis.quad.material = this.materialWeights;\n\n\t\trenderer.render( this.scene, this.camera, this.weightsRT, this.clear );\n\n\t\t// pass 3\n\n\t\tthis.uniformsBlend[ \"tColor\" ].value = readBuffer.texture;\n\n\t\tthis.quad.material = this.materialBlend;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.render( this.scene, this.camera );\n\n\t\t} else {\n\n\t\t\trenderer.render( this.scene, this.camera, writeBuffer, this.clear );\n\n\t\t}\n\n\t},\n\n\tsetSize: function ( width, height ) {\n\n\t\tthis.edgesRT.setSize( width, height );\n\t\tthis.weightsRT.setSize( width, height );\n\n\t\tthis.materialEdges.uniforms[ 'resolution' ].value.set( 1 / width, 1 / height );\n\t\tthis.materialWeights.uniforms[ 'resolution' ].value.set( 1 / width, 1 / height );\n\t\tthis.materialBlend.uniforms[ 'resolution' ].value.set( 1 / width, 1 / height );\n\n\t},\n\n\tgetAreaTexture: function () {\n\t\treturn 'data:image/png;base64,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';\n\t},\n\n\tgetSearchTexture: function () {\n\t\treturn 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAhCAAAAABIXyLAAAAAOElEQVRIx2NgGAWjYBSMglEwEICREYRgFBZBqDCSLA2MGPUIVQETE9iNUAqLR5gIeoQKRgwXjwAAGn4AtaFeYLEAAAAASUVORK5CYII=';\n\t}\n\n} );\n\nexport default THREE.SMAAPass;\n","//TODO: bring this in as a library\n\n/* eslint-disable */\n\nimport * as tslib_1 from \"tslib\";\nimport { Matrix4, Vector3 } from 'three';\nimport { CommonOps, Matrix2d, SizeOps } from \"./hebimath\";\n\n///////////////////////////////////////////////////\n// Extensions/helpers for ThreeJS\n\n/// \n/**\n * Values of interest:\n * --------------------\n * 0 -Wz +Wy x\n * +Wz 0 -Wx y\n * -Wy +Wx 0 z\n * 0 0 0 1\n * --------------------\n *\n * Col-Major Index\n * https://github.com/mrdoob/three.js/blob/dev/src/math/Matrix4.js#L43-L46\n * --------------------\n * 0 4 8 12\n * 1 5 9 13\n * 2 6 10 14\n * 3 7 11 15\n * --------------------\n */\nMatrix4.prototype.getX = function () {\n return this.elements[12];\n};\nMatrix4.prototype.getY = function () {\n return this.elements[13];\n};\nMatrix4.prototype.getZ = function () {\n return this.elements[14];\n};\nMatrix4.prototype.setX = function (value) {\n this.elements[12] = value;\n return this;\n};\nMatrix4.prototype.setY = function (value) {\n this.elements[13] = value;\n return this;\n};\nMatrix4.prototype.setZ = function (value) {\n this.elements[14] = value;\n return this;\n};\nMatrix4.prototype.getWx = function () {\n return (this.elements[6] - this.elements[9]) / 2;\n};\nMatrix4.prototype.getWy = function () {\n return (this.elements[8] - this.elements[2]) / 2;\n};\nMatrix4.prototype.getWz = function () {\n return (this.elements[1] - this.elements[4]) / 2;\n};\nMatrix4.prototype.toString = function () {\n var str = '';\n for (var row = 0; row < 4; row++) {\n for (var col = 0; col < 4; col++) {\n var value = this.elements[col * 4 + row];\n str += value.toFixed(4) + \", \";\n }\n str += '\\n';\n }\n return str;\n};\n\n\n\n///////////////////////////////////////////////////\n\nexport var JointAxis;\n(function (JointAxis) {\n JointAxis[JointAxis[\"rz\"] = 0] = \"rz\"; // rotation about z axis\n})(JointAxis || (JointAxis = {}));\nvar PayloadStats = /** @class */ (function () {\n function PayloadStats() {\n this.continuousPayload = 0;\n this.peakPayload = 0;\n }\n return PayloadStats;\n}());\nexport { PayloadStats };\nvar RobotStats = /** @class */ (function () {\n function RobotStats() {\n this.maxHorizontalReach = 0; // [m]\n this.continuousPayload = 0; // [kg]\n this.peakPayload = 0; // [kg]\n this.mass = 0; // [kg]\n this.continuousPower24V = 0; // [w]\n this.peakPower24V = 0; // [w]\n }\n return RobotStats;\n}());\nexport { RobotStats };\n/**\n * For the simple FK/Jacobian/IK case we only need to know about\n * the output transform. Once we get into gravity and acceleration\n * compensation, we will also need to know about the mass and\n * center of mass locations.\n */\nvar Body = /** @class */ (function () {\n function Body(output, com, mass) {\n this.output = output;\n this.com = com;\n this.mass = mass;\n }\n return Body;\n}());\nvar Joint = /** @class */ (function (_super) {\n tslib_1.__extends(Joint, _super);\n function Joint(axis) {\n var _this = _super.call(this, new Matrix4().identity(), new Matrix4().identity(), 0) || this;\n _this.axis = axis;\n _this.position = 0;\n _this.maxVel = NaN;\n _this.contEffort = NaN;\n _this.peakEffort = NaN;\n _this.contCurrent24V = NaN;\n _this.peakCurrent24V = NaN;\n return _this;\n }\n // Sets transform to match the desired position ([rad] or [m])\n Joint.prototype.setPosition = function (position) {\n // Only update transform if position actually changes\n if (this.position != position) {\n this.position = position;\n switch (this.axis) {\n case JointAxis.rz:\n this.output.makeRotationZ(position);\n break;\n default:\n throw new Error('Unsupported Axis');\n }\n }\n };\n return Joint;\n}(Body));\nvar KinematicChain = /** @class */ (function () {\n function KinematicChain() {\n this.bodies = [];\n this.joints = [];\n }\n KinematicChain.prototype.getNumJoints = function () {\n return this.joints.length;\n };\n KinematicChain.prototype.getNumBodies = function () {\n return this.bodies.length;\n };\n KinematicChain.prototype.addBody = function (body) {\n this.bodies.push(body);\n };\n KinematicChain.prototype.addJoint = function (joint) {\n this.joints.push(joint);\n this.bodies.push(joint);\n };\n KinematicChain.prototype.setPositions = function (positions) {\n if (positions.length != this.joints.length) {\n throw Error('Dimension mismatch');\n }\n for (var i = 0; i < this.joints.length; i++) {\n this.joints[i].setPosition(positions[i]);\n }\n };\n return KinematicChain;\n}());\n/**\n * Public API\n */\nvar RobotModel = /** @class */ (function () {\n function RobotModel() {\n this.EXTENSION_EDGE_TO_CENTER_Z_DISTANCE = 0.035 / 2; // 35mm edge to edge\n this.gravCompEfforts = new Matrix2d();\n this.unitPayloadEfforts = new Matrix2d();\n this.tmpCompEffort = new Matrix2d();\n this.tmpWrench3 = new Matrix2d(3, 1);\n this.tmpR = new Matrix4();\n this.tmpRtrans = new Matrix4();\n this.tmpW = new Matrix4();\n this.tmpAngVel = new Vector3();\n this.tmpFrames = [];\n this.tmpTestFrames = [];\n this.tmpJacobians = [];\n this.tmpMatrix = new Matrix4();\n this.robot = new KinematicChain();\n this.deltas = new Matrix2d();\n }\n RobotModel.prototype.addActuator = function (type) {\n var x = 0;\n var y = 0;\n var z = 0;\n var comZ = 0;\n var joint = new Joint(JointAxis.rz);\n // Class-type dependent variables\n switch (type) {\n case \"X5-1\":\n case \"X5-4\":\n case \"X5-9\":\n z = 0.03105;\n comZ = 0.0165;\n joint.contCurrent24V = 0.8;\n joint.peakCurrent24V = 2.4;\n break;\n case \"X8-3\":\n case \"X8-9\":\n case \"X8-16\":\n z = 0.0451;\n comZ = 0.0242;\n joint.contCurrent24V = 2.0;\n joint.peakCurrent24V = 4.5;\n break;\n case \"R8-3\":\n case \"R8-9\":\n case \"R8-16\":\n z = 0.0510;\n comZ = 0.0256;\n joint.contCurrent24V = 1.3;\n joint.peakCurrent24V = 3.0;\n break;\n default:\n throw new Error(\"Unknown Actuator type: \" + type);\n }\n // Individual type specific variables copied from spec sheet\n var mass = 0;\n switch (type) {\n case \"X5-1\":\n joint.peakEffort = 2.5;\n joint.contEffort = 1.3;\n joint.maxVel = 9.5;\n mass = 0.315;\n break;\n case \"X5-4\":\n joint.peakEffort = 7;\n joint.contEffort = 4;\n joint.maxVel = 3.35;\n mass = 0.335;\n break;\n case \"X5-9\":\n joint.peakEffort = 13;\n joint.contEffort = 9;\n joint.maxVel = 1.466;\n mass = 0.360;\n break;\n case \"X8-3\":\n joint.peakEffort = 7;\n joint.contEffort = 3;\n joint.maxVel = 8.8;\n mass = 0.460;\n break;\n case \"X8-9\":\n joint.peakEffort = 20;\n joint.contEffort = 8;\n joint.maxVel = 3.142;\n mass = 0.480;\n break;\n case \"X8-16\":\n joint.peakEffort = 38;\n joint.contEffort = 16;\n joint.maxVel = 1.571;\n mass = 0.500;\n break;\n case \"R8-3\":\n joint.peakEffort = 7;\n joint.contEffort = 3;\n joint.maxVel = 8.8;\n mass = 0.670;\n break;\n case \"R8-9\":\n joint.peakEffort = 20;\n joint.contEffort = 8;\n joint.maxVel = 3.142;\n mass = 0.685;\n break;\n case \"R8-16\":\n joint.peakEffort = 38;\n joint.contEffort = 16;\n joint.maxVel = 1.571;\n mass = 0.715;\n break;\n }\n // Add static transform to CoM\n var com = new Matrix4().makeTranslation(x, y, comZ);\n // Add static transform part\n var T = new Matrix4().makeTranslation(x, y, z);\n this.addBody(T, com, mass);\n // Add dynamic rotation about z axis\n this.addJoint(joint);\n return this;\n };\n RobotModel.prototype.addBracket = function (type) {\n var rx = Math.PI / 2; // right -> positive, left -> negative\n var x = 0; // center stays the same\n var y = 0;\n var z = 0;\n var mass = 0;\n var comY = 0;\n var HEAVY_IN_Y = 0.0225;\n var HEAVY_OUT_Y = 0.0375;\n switch (type) {\n case \"X5HeavyRightInside\":\n y = HEAVY_IN_Y;\n z = 0.055;\n mass = 0.215;\n comY = HEAVY_OUT_Y / 2;\n break;\n case \"X5HeavyRightOutside\":\n y = -HEAVY_OUT_Y;\n z = 0.055;\n mass = 0.215;\n comY = y / 2;\n break;\n case \"X5HeavyLeftInside\":\n rx *= -1;\n y = -HEAVY_IN_Y;\n z = 0.055;\n mass = 0.215;\n comY = -HEAVY_OUT_Y / 2;\n break;\n case \"X5HeavyLeftOutside\":\n rx *= -1;\n y = HEAVY_OUT_Y;\n z = 0.055;\n mass = 0.215;\n comY = y / 2;\n break;\n case \"X5LightRight\":\n y = -0.043;\n z = 0.040;\n mass = 0.100;\n comY = y / 2;\n break;\n case \"X5LightLeft\":\n rx *= -1;\n y = 0.043;\n z = 0.040;\n mass = 0.100;\n comY = y / 2;\n break;\n case \"R8HeavyRightInside\":\n y = HEAVY_IN_Y;\n z = 0.055;\n mass = 0.215;\n comY = HEAVY_OUT_Y / 2;\n break;\n case \"R8HeavyRightOutside\":\n y = -HEAVY_OUT_Y;\n z = 0.055;\n mass = 0.215;\n comY = y / 2;\n break;\n case \"R8HeavyLeftInside\":\n rx *= -1;\n y = -HEAVY_IN_Y;\n z = 0.055;\n mass = 0.215;\n comY = -HEAVY_OUT_Y / 2;\n break;\n case \"R8HeavyLeftOutside\":\n rx *= -1;\n y = HEAVY_OUT_Y;\n z = 0.055;\n mass = 0.215;\n comY = y / 2;\n break;\n case \"R8LightRight\":\n y = -0.043;\n z = 0.040;\n mass = 0.100;\n comY = y / 2;\n break;\n case \"R8LightLeft\":\n rx *= -1;\n y = 0.043;\n z = 0.040;\n mass = 0.100;\n comY = y / 2;\n break;\n default:\n throw new Error(\"Unknown Bracket type: \" + type);\n }\n // Translation to center of mass\n var com = new Matrix4().identity()\n .setX(x / 2)\n .setY(comY)\n .setZ(z / 2);\n // Form static transform and add to model\n var T = new Matrix4()\n .makeRotationX(rx)\n .setX(x)\n .setY(y)\n .setZ(z);\n this.addBody(T, com, mass);\n return this;\n };\n RobotModel.prototype.addLink = function (type, extension, twist) {\n switch (type) {\n case \"X5\":\n break;\n case \"R8\":\n break;\n default:\n throw new Error(\"Unknown Link type: \" + type);\n }\n // 193g for screws + adapters + ~0.421g / mm pipe\n var mass = 0.42074 * (extension - 0.025) + 0.193;\n // Move first half to CoM\n var com = new Matrix4().makeTranslation(extension / 2, 0, this.EXTENSION_EDGE_TO_CENTER_Z_DISTANCE);\n // Rotate by twist and move second half\n var T = new Matrix4().makeRotationX(twist)\n .premultiply(com)\n .multiply(com); // Move second half to output (second distance is equal to first)\n this.addBody(T, com, mass);\n return this;\n };\n /**\n * Adds a static 4x4 transform\n *\n * @param transform\n * @param com\n * @param mass\n */\n RobotModel.prototype.addBody = function (transform, com, mass) {\n if (com === void 0) { com = new Matrix4().identity(); }\n if (mass === void 0) { mass = 0; }\n this.robot.addBody(new Body(transform, com, mass));\n };\n /**\n * Adds a mass-less body with a dynamic\n * transform around the specified axis\n *\n * @param jointOrAxis\n * @param maxVel\n * @param maxEffort\n */\n RobotModel.prototype.addJoint = function (jointOrAxis) {\n if (jointOrAxis instanceof Joint)\n this.robot.addJoint(jointOrAxis);\n else {\n this.robot.addJoint(new Joint(jointOrAxis));\n }\n };\n /**\n * Computes forward kinematics to end effector given the\n * desired joint positions.\n *\n * @param positions desired positions for all joints\n * @param result store. Modified\n */\n RobotModel.prototype.getEndEffector = function (positions, result) {\n this.robot.setPositions(positions);\n result.identity();\n for (var i = 0; i < this.robot.bodies.length; i++) {\n result.multiply(this.robot.bodies[i].output);\n }\n };\n /**\n * Returns the Jacobian, the partial derivatives of the forward kinematics\n * equation, for the end effector frame.\n *\n * The Jacobian is of size 6x numDoF. Rows 1-3 of this matrix correspond to\n * this body's linear velocities [m/s] along the X-Y-Z axes in the base frame,\n * while rows 4-6 correspond to rotational velocities [rad/s] about the X-Y-Z\n * axes in the world frame. The columns define the contributions to these linear\n * and rotational velocities that would be a result of the respective degree of\n * freedom instantaneously moving at unit velocity (e.g., a rotational joint\n * being driven at 1 rad/s).\n *\n * @param positions\n * @param result\n */\n RobotModel.prototype.getJEndEffector = function (positions) {\n var J = new Matrix2d(6, this.robot.getNumJoints());\n // Calculate FK to compare to\n var frame = new Matrix4();\n this.getEndEffector(positions, frame);\n var testFrame = new Matrix4();\n var R = new Matrix4().extractRotation(frame); // R\n var Rtrans = R.clone().transpose(); // R'\n var W = new Matrix4();\n var angVel = new Vector3();\n // Perturb each joint slightly and compare effect\n var epsilon = RobotModel.EPSILON;\n for (var col = 0; col < this.robot.getNumJoints(); col++) {\n // Re-compute FK with perturbed input\n var originalPosition = positions[col];\n positions[col] += epsilon;\n this.getEndEffector(positions, testFrame);\n positions[col] = originalPosition;\n // Differentiate positions to get translational velocities\n var x = (testFrame.getX() - frame.getX()) / epsilon;\n var y = (testFrame.getY() - frame.getY()) / epsilon;\n var z = (testFrame.getZ() - frame.getZ()) / epsilon;\n // Differentiate rotation matrices to get rotational velocities\n // W = R' * R_test;\n W.multiplyMatrices(Rtrans, testFrame);\n // Extract angular velocities\n angVel.set(W.getWx() / epsilon, W.getWy() / epsilon, W.getWz() / epsilon);\n // Rotate angular velocities into the Body frame of the robot.\n // R * [ w_x; w_y; w_z ]\n angVel.applyMatrix4(R);\n // Set column\n J.unsafe_set(0, col, x);\n J.unsafe_set(1, col, y);\n J.unsafe_set(2, col, z);\n J.unsafe_set(3, col, angVel.x);\n J.unsafe_set(4, col, angVel.y);\n J.unsafe_set(5, col, angVel.z);\n }\n return J;\n };\n /**\n * Reduced Jacobian that only returns upper 3 rows (x/y/z)\n *\n * @param positions\n */\n RobotModel.prototype.getJacobianXyz = function (positions) {\n var J = new Matrix2d(3, this.robot.getNumJoints());\n // Calculate FK to compare to\n var frame = new Matrix4();\n this.getEndEffector(positions, frame);\n var testFrame = new Matrix4();\n // Perturb each joint slightly and compare effect\n var epsilon = RobotModel.EPSILON;\n for (var col = 0; col < this.robot.getNumJoints(); col++) {\n // Re-compute FK with perturbed input\n var originalPosition = positions[col];\n positions[col] += epsilon;\n this.getEndEffector(positions, testFrame);\n positions[col] = originalPosition;\n // Differentiate positions to get translational velocities\n var x = (testFrame.getX() - frame.getX()) / epsilon;\n var y = (testFrame.getY() - frame.getY()) / epsilon;\n var z = (testFrame.getZ() - frame.getZ()) / epsilon;\n // Set column\n J.set(0, col, x);\n J.set(1, col, y);\n J.set(2, col, z);\n }\n return J;\n };\n /**\n *\n * @param initialPositions joint angles to start with\n * @param goal goal object\n * @param positions absolute positions to reach desired effect\n */\n RobotModel.prototype.getInverseKinematics = function (initialPositions, goal, positions) {\n switch (goal.kind) {\n case 'delta-translation':\n // d(position) = J^T * (xyz vector) * tuned scaling factor\n var J = this.getJacobianXyz(initialPositions);\n var vector = Matrix2d.wrap(3, 1, [goal.x, goal.y, goal.z]);\n CommonOps.multTransA(J, vector, this.deltas);\n var tuningFactor = 1.0;\n for (var i = 0; i < this.robot.getNumJoints(); i++) {\n positions[i] = initialPositions[i] + this.deltas.data[i] * tuningFactor;\n }\n return;\n }\n throw new Error(\"Invalid Goal\");\n };\n RobotModel.prototype.getCoMFrames = function (positions, result) {\n SizeOps.resizeTransforms(result, this.robot.getNumBodies());\n this.robot.setPositions(positions);\n var output = this.tmpMatrix.identity();\n for (var i = 0; i < this.robot.getNumBodies(); i++) {\n var body = this.robot.bodies[i];\n // store CoM\n result[i].multiplyMatrices(output, body.com);\n // advance to next output\n output.multiply(body.output);\n }\n };\n /**\n * @param positions array of positions at which to calculate the Jacobians\n * @param jacobians array of Jacobians at the CoM\n */\n RobotModel.prototype.getJacobiansCoM = function (positions, jacobians) {\n if (positions.length != this.robot.getNumJoints())\n throw new Error(\"Expected one value for each joint\");\n SizeOps.resizeMatrices(jacobians, this.robot.getNumBodies(), 3, this.robot.getNumJoints());\n // Make sure Jacobians are zeroed\n for (var _i = 0, jacobians_1 = jacobians; _i < jacobians_1.length; _i++) {\n var J = jacobians_1[_i];\n J.zero();\n }\n // Calculate the state to linearize around and set up the\n // Jacobian matrix based on the return vector\n var numBodies = this.robot.getNumBodies();\n var numJoints = this.robot.getNumJoints();\n var frames = SizeOps.resizeTransforms(this.tmpFrames, numBodies);\n var testFrames = SizeOps.resizeTransforms(this.tmpTestFrames, numBodies);\n this.getCoMFrames(positions, frames);\n // Perturb each joint slightly and compare effect\n var epsilon = RobotModel.EPSILON;\n for (var jointIx = 0; jointIx < this.robot.getNumJoints(); jointIx++) {\n // Re-compute FK with perturbed input\n var originalPosition = positions[jointIx];\n positions[jointIx] += epsilon;\n this.getCoMFrames(positions, testFrames);\n positions[jointIx] = originalPosition;\n // Build each row for a column, corresponding to wrench outputs\n for (var bodyIx = 0; bodyIx < numBodies; bodyIx++) {\n // Extract transforms\n var frame = frames[bodyIx];\n var testFrame = testFrames[bodyIx];\n // Differentiate positions to get translational velocities\n var x = (testFrame.getX() - frame.getX()) / epsilon;\n var y = (testFrame.getY() - frame.getY()) / epsilon;\n var z = (testFrame.getZ() - frame.getZ()) / epsilon;\n // Fill translational rows of Jacobian\n var J = jacobians[bodyIx];\n J.unsafe_set(0, jointIx, x);\n J.unsafe_set(1, jointIx, y);\n J.unsafe_set(2, jointIx, z);\n /*\n // NOTE: we currently only use the first 3 rows for grav comp\n // and we don't do any dynamics comp. Uncomment the lines below\n // to enable 6 dof\n\n // Differentiate rotation matrices to get rotational velocities\n // W = R' * R_test;\n let R = this.tmpR.extractRotation(frame); // R\n let Rtrans = this.tmpRtrans.copy(R).transpose(); // R'\n let W = this.tmpW.multiplyMatrices(Rtrans, testFrame);\n\n // Extract angular velocities\n let angVel = this.tmpAngVel.set(\n W.getWx() / epsilon,\n W.getWy() / epsilon,\n W.getWz() / epsilon);\n\n // Rotate angular velocities into the Body frame of the robot.\n // R * [ w_x; w_y; w_z ]\n angVel.applyMatrix4(R);\n\n // Set rotational rows\n J.unsafe_set(3, jointIx, angVel.x);\n J.unsafe_set(4, jointIx, angVel.y);\n J.unsafe_set(5, jointIx, angVel.z);\n */\n }\n }\n };\n /**\n * @param positions given joint angles. Not modified\n * @param gravCompEfforts vector of torques needed to sustain weight of robot given gravity. Modified\n * @param unitPayloadEfforts vector of torque needed to sustain a unit weight (1kg) at the current position. Modified\n * @param gravity vector showing where gravity is. Defaults to gravity coming from [0 0 -1]\n */\n RobotModel.prototype.getGravCompEfforts = function (positions, gravCompEfforts, unitPayloadEfforts, gravity) {\n if (gravity === void 0) { gravity = RobotModel.DEFAULT_GRAVITY; }\n // Calculate Jacobians at the center of mass\n var numBodies = this.robot.getNumBodies();\n var numJoints = this.robot.getNumJoints();\n var jacobians = SizeOps.resizeMatrices(this.tmpJacobians, numBodies, 3, numJoints);\n this.getJacobiansCoM(positions, jacobians);\n var tmpResult = this.tmpCompEffort.reshape(numJoints, 1).zero();\n gravCompEfforts.reshape(numJoints, 1).zero();\n unitPayloadEfforts.reshape(numJoints, 1).zero();\n // Sum gravity effects for all bodies\n var wrench = this.tmpWrench3.zero();\n for (var bodyIx = 0; bodyIx < numBodies; bodyIx++) {\n // Set translational part of wrench vector\n var mass = this.robot.bodies[bodyIx].mass;\n if (mass == 0)\n continue;\n wrench.data[0] = -gravity.x * mass;\n wrench.data[1] = -gravity.y * mass;\n wrench.data[2] = -gravity.z * mass;\n // compEffort = J' * wrench\n var J_1 = jacobians[bodyIx];\n CommonOps.multTransA(J_1, wrench, tmpResult);\n CommonOps.addEquals(gravCompEfforts, tmpResult);\n }\n // Calculate what torque would be needed per joint for\n // a unit-payload at the end effector\n var J = jacobians[numBodies - 1];\n var unitMass = 1;\n wrench.data[0] = -gravity.x * unitMass;\n wrench.data[1] = -gravity.y * unitMass;\n wrench.data[2] = -gravity.z * unitMass;\n CommonOps.multTransA(J, wrench, unitPayloadEfforts);\n };\n RobotModel.prototype.getPayloadStats = function (positions, result) {\n // Figure out torques needed to cancel the weight of the robot itself\n var numJoints = this.robot.getNumJoints();\n this.getGravCompEfforts(positions, this.gravCompEfforts, this.unitPayloadEfforts);\n // See what we can do with the leftover portion\n result.continuousPayload = Infinity;\n result.peakPayload = Infinity;\n for (var i = 0; i < numJoints; i++) {\n var joint = this.robot.joints[i];\n var multiplier = 1 / Math.abs(this.unitPayloadEfforts.data[i]);\n var cont = (joint.contEffort - this.gravCompEfforts.data[i]) * multiplier;\n var peak = (joint.peakEffort - this.gravCompEfforts.data[i]) * multiplier;\n result.continuousPayload = Math.min(result.continuousPayload, cont);\n result.peakPayload = Math.min(result.peakPayload, peak);\n }\n };\n RobotModel.prototype.getRobotStats = function (result) {\n var numBodies = this.robot.getNumBodies();\n var numJoints = this.robot.getNumJoints();\n // Sum total mass\n result.mass = 0;\n for (var bodyIx = 0; bodyIx < numBodies; bodyIx++) {\n result.mass += this.robot.bodies[bodyIx].mass;\n }\n // Sum total joint power\n result.continuousPower24V = 0;\n result.peakPower24V = 0;\n for (var jointIx = 0; jointIx < numJoints; jointIx++) {\n result.continuousPower24V += this.robot.joints[jointIx].contCurrent24V;\n result.peakPower24V += this.robot.joints[jointIx].peakCurrent24V;\n }\n result.continuousPower24V *= 24; // convert current to watts\n result.peakPower24V *= 24;\n // Find max horizontal reach\n var positions = new Array(numJoints);\n for (var i = 1; i < numJoints; i++) {\n // initialize slightly offset so we never go straight up\n positions[i] = 0.1;\n }\n // Find the maximum distance increase for each joint\n // Brute force with knowledge that parts can be oriented\n // at a minimum of 90 deg increments\n for (var jointIx = 0; jointIx < numJoints; jointIx++) {\n // try zero angle as base line\n var jointMax = 0;\n positions[jointIx] = 0;\n var jointMaxDistance = this.getHorizontalReach(positions);\n // try other 3 options\n for (var angle = Math.PI / 2; angle < 2 * Math.PI; angle += Math.PI / 2) {\n positions[jointIx] = angle;\n var distance = this.getHorizontalReach(positions);\n if (distance > jointMaxDistance) {\n jointMaxDistance = distance;\n jointMax = angle;\n }\n }\n // save highest per joint\n positions[jointIx] = jointMax;\n }\n // Find max payload at the maximum reach\n var payloadStats = new PayloadStats();\n this.getPayloadStats(positions, payloadStats);\n result.continuousPayload = payloadStats.continuousPayload;\n result.peakPayload = payloadStats.peakPayload;\n result.maxHorizontalReach = this.getHorizontalReach(positions);\n };\n RobotModel.prototype.getHorizontalReach = function (positions) {\n var T = this.tmpMatrix;\n this.getEndEffector(positions, T);\n return Math.sqrt(T.getX() * T.getX() + T.getY() * T.getY());\n };\n RobotModel.G_TO_MPS2 = 9.80665;\n RobotModel.DEFAULT_GRAVITY = new Vector3(0, 0, -RobotModel.G_TO_MPS2);\n RobotModel.EPSILON = 1E-6;\n return RobotModel;\n}());\nexport { RobotModel };\n\n","/* eslint-disable */\n\nimport { Matrix4 } from \"three\";\n/**\n * Represents a matrix that has 2 dimensions,\n * i.e., numRows and columns. Modelled after EJML's\n * DMatrixRMaj\n */\nvar Matrix2d = /** @class */ (function () {\n function Matrix2d(numRows, numCols) {\n if (numRows === void 0) { numRows = 0; }\n if (numCols === void 0) { numCols = 0; }\n this.numRows = numRows;\n this.numCols = numCols;\n this.data = new Float64Array(0);\n this.data = new Float64Array(numRows * numCols);\n }\n /**\n * Creates a new Matrix2d around the provided data. The data must encode\n * a row-major matrix. Any modification to the returned matrix will modify the\n * provided data.\n *\n * @param numRows Number of rows in the matrix.\n * @param numCols Number of columns in the matrix.\n * @param data Data that is being wrapped. Referenced Saved.\n * @return A matrix which references the provided data internally.\n *\n */\n Matrix2d.wrap = function (numRows, numCols, data) {\n var s = new Matrix2d();\n s.numRows = numRows;\n s.numCols = numCols;\n s.data = new Float64Array(s.getNumElements());\n for (var i = 0; i < s.getNumElements(); i++) {\n s.data[i] = data[i];\n }\n return s;\n };\n Matrix2d.prototype.getNumElements = function () {\n return this.numRows * this.numCols;\n };\n Matrix2d.prototype.reshape = function (rows, cols) {\n this.numRows = rows;\n this.numCols = cols;\n if (this.data.length < this.getNumElements()) {\n this.data = new Float64Array(this.getNumElements()).fill(0);\n }\n return this;\n };\n Matrix2d.prototype.set = function (row, col, value) {\n if (col < 0 || col >= this.numCols || row < 0 || row >= this.numRows) {\n throw new Error(\"Specified element is out of bounds: (\" + row + \" , \" + col + \")\");\n }\n this.data[row * this.numCols + col] = value;\n };\n Matrix2d.prototype.unsafe_set = function (row, col, value) {\n this.data[row * this.numCols + col] = value;\n };\n Matrix2d.prototype.get = function (row, col) {\n if (col < 0 || col >= this.numCols || row < 0 || row >= this.numRows) {\n throw new Error(\"Specified element is out of bounds: (\" + row + \" , \" + col + \")\");\n }\n return this.data[row * this.numCols + col];\n };\n Matrix2d.prototype.unsafe_get = function (row, col) {\n return this.data[row * this.numCols + col];\n };\n Matrix2d.prototype.zero = function () {\n // Note: we could do from-to index, but documentation is inconsistent\n // on how to exactly use it, i.e., inclusive vs exclusive end index.\n this.data.fill(0.0);\n return this;\n };\n Matrix2d.prototype.getNumCols = function () {\n return this.numCols;\n };\n Matrix2d.prototype.getNumRows = function () {\n return this.numRows;\n };\n Matrix2d.prototype.toString = function () {\n var out = \"[ \";\n for (var row = 0; row < this.getNumRows(); row++) {\n for (var col = 0; col < this.getNumCols(); col++) {\n out += this.unsafe_get(row, col).toFixed(4);\n if (col + 1 < this.getNumCols()) {\n out += \" , \";\n }\n }\n if (row + 1 < this.getNumRows())\n out += \" ;\\n \";\n else\n out += \" ]\";\n }\n return out;\n };\n return Matrix2d;\n}());\nexport { Matrix2d };\n/**\n * Mathematical operations on matrices / vectors\n */\nvar CommonOps = /** @class */ (function () {\n function CommonOps() {\n }\n /**\n * c = a * b\n *\n * @param a Not modified.\n * @param b Not modified.\n * @param c Modified. (optional)\n * @return c\n */\n CommonOps.mult = function (a, b, c) {\n if (c === void 0) { c = new Matrix2d(a.numRows, b.numCols); }\n // NOTE: EJML switches to do a reordered multiply if >15 columns\n // The code below is equivalent to mult_small()\n if (a === c || b === c) {\n throw new Error(\"Neither 'a' or 'b' can be the same matrix as 'c'\");\n }\n else if (a.numCols != b.numCols) {\n throw new Error(\"The 'a' and 'b' matrices do not have compatible dimensions\");\n }\n c.reshape(a.numRows, b.numCols);\n var aIndexStart = 0;\n var cIndex = 0;\n for (var i = 0; i < a.numRows; i++) {\n for (var j = 0; j < b.numCols; j++) {\n var total = 0;\n var indexA = aIndexStart;\n var indexB = j;\n var end = indexA + b.numRows;\n while (indexA < end) {\n total += a.data[indexA++] * b.data[indexB];\n indexB += b.numCols;\n }\n c.data[cIndex++] = total;\n }\n aIndexStart += a.numCols;\n }\n return c;\n };\n /**\n * c = a' * b\n *\n * @param a Not modified.\n * @param b Not modified.\n * @param c Modified. (optional)\n * @return c\n */\n CommonOps.multTransA = function (a, b, c) {\n if (c === void 0) { c = new Matrix2d(a.numCols, b.numRows); }\n // NOTE: EJML switches to do a reordered multiply if >15 columns\n // The code below is equivalent to multTransA_small()\n if (a === c || b === c) {\n throw new Error(\"Neither 'a' or 'b' can be the same matrix as 'c'\");\n }\n else if (a.numRows != b.numRows) {\n throw new Error(\"The 'a' and 'b' matrices do not have compatible dimensions\");\n }\n c.reshape(a.numCols, b.numCols);\n var cIndex = 0;\n for (var i = 0; i < a.numCols; i++) {\n for (var j = 0; j < b.numCols; j++) {\n var indexA = i;\n var indexB = j;\n var end = indexB + b.numRows * b.numCols;\n var total = 0;\n // loop for k\n for (; indexB < end; indexB += b.numCols) {\n total += a.data[indexA] * b.data[indexB];\n indexA += a.numCols;\n }\n c.data[cIndex++] = total;\n }\n }\n return c;\n };\n /**\n *

    Performs the following operation:
    \n *
    \n * a = a + b
    \n * aij = aij + bij
    \n *

    \n *\n * @param a A Matrix. Modified.\n * @param b A Matrix. Not modified.\n */\n CommonOps.addEquals = function (a, b) {\n // NOTE: EJML switches to do a reordered multiply if >15 columns\n // The code below is equivalent to multTransA_small()\n if (a.numCols != b.numCols || a.numRows != b.numRows) {\n throw new Error(\"The 'a' and 'b' matrices do not have compatible dimensions\");\n }\n var length = a.getNumElements();\n for (var i = 0; i < length; i++) {\n a.data[i] += b.data[i];\n }\n };\n return CommonOps;\n}());\nexport { CommonOps };\nvar SizeOps = /** @class */ (function () {\n function SizeOps() {\n }\n /**\n * @return resize the array to the desired length, and reshape each element to the desired rows/cols\n */\n SizeOps.resizeMatrices = function (array, numMatrices, rows, cols) {\n // Reshape any existing entries\n for (var i = 0; i < Math.min(array.length, numMatrices); i++) {\n array[i].reshape(rows, cols);\n }\n // Add/Remove elements if needed\n while (array.length < numMatrices) {\n array.push(new Matrix2d(rows, cols));\n }\n while (array.length > numMatrices) {\n array.pop();\n }\n return array;\n };\n SizeOps.resizeTransforms = function (array, length) {\n if (length == array.length)\n return array;\n while (array.length < length)\n array.push(new Matrix4());\n while (array.length > length)\n array.pop();\n return array;\n };\n return SizeOps;\n}());\nexport { SizeOps };\n\n","import { map } from 'lodash-es';\nimport * as THREE from 'three';\n\nimport store from '../../../app/store';\nimport {TranslationMode} from './TranslationMode';\nimport { RobotModel, PayloadStats, RobotStats } from '../../../features/shared/InverseKinematics/kinematics';\n\nimport {\n updateRobotStatistics,\n} from '../../../features/configurator/actions';\n\nexport default class InverseKinematicsManager {\n static instance;\n\n constructor() {\n if (this.instance) {\n return this.instance;\n }\n\n this.ikRobot = new RobotModel();\n this.directChildrenOfActuators = [];\n this.ikPartsSequence = [];\n this.staticStats = new RobotStats();\n this.dynamicStats = new PayloadStats();\n\n this.resetRobot = this.resetRobot.bind(this);\n this.buildRobot = this.buildRobot.bind(this);\n this.traverseRobot = this.traverseRobot.bind(this);\n this.buildIK = this.buildIK.bind(this);\n this.areAnyChildrenGroups = this.areAnyChildrenGroups.bind(this);\n this.updateInverseKinematics = this.updateInverseKinematics.bind(this);\n this.getDynamicStats = this.getDynamicStats.bind(this);\n this.sanitizeStat = this.sanitizeStat.bind(this);\n this.clampRotations = this.clampRotations.bind(this);\n this.isChangeTooLarge = this.isChangeTooLarge.bind(this);\n\n this.instance = this;\n }\n\n resetRobot() {\n this.ikRobot = new RobotModel();\n this.directChildrenOfActuators = [];\n this.ikPartsSequence = [];\n }\n\n buildRobot(terminatingPart) {\n this.ikRobot = new RobotModel();\n this.dynamicStats = new PayloadStats();\n\n this.traverseRobot(terminatingPart);\n this.buildIK();\n\n this.ikRobot.getRobotStats(this.staticStats);\n store.dispatch(updateRobotStatistics(this.staticStats));\n }\n\n traverseRobot(robotPart) {\n //work backwards from the end and build up the chain\n\n if(robotPart.parent) {\n\n if (robotPart.parent.userData.canRotate) {\n this.directChildrenOfActuators.unshift(robotPart);\n }\n else if(robotPart.userData.canRotate && this.areAnyChildrenGroups(robotPart.children) === false) {\n //the terminating part is a actuator - add a dummy child part after the actuator so\n //that the solver can rotate it like usual using this zeroed rotation property\n this.directChildrenOfActuators.unshift({\n userData: {\n type: 'DummyActuatorChild',\n },\n rotation: {\n x: 0,\n y: 0,\n z: 0,\n },\n });\n }\n\n this.ikPartsSequence.unshift(robotPart);\n\n this.traverseRobot(robotPart.parent);\n }\n }\n\n buildIK() {\n this.ikPartsSequence.forEach(part => {\n switch(part.userData.partCategory) {\n case 'Actuator':\n this.ikRobot.addActuator(part.userData.type);\n break;\n case 'Link':\n this.ikRobot.addLink(\n part.userData.type,\n (part.userData.length && part.userData.length !== 0) ? part.userData.length : part.userData.defaultLength,\n part.userData.twist ? part.userData.twist : 0\n );\n break;\n case 'Bracket':\n this.ikRobot.addBracket(part.userData.type);\n break;\n case 'DummyActuatorChild':\n //this is not a type from the database - it is only inserted at runtime for robots that terminate in an actuator\n this.ikRobot.addBody(new THREE.Matrix4(), new THREE.Matrix4(), 0);\n break;\n default:\n //the solver only cares about the part types above\n break;\n }\n });\n }\n\n areAnyChildrenGroups(robotPartChildren) {\n let hasGroups = false;\n robotPartChildren.forEach(child => {\n if(child.type === \"Group\") {\n hasGroups = true;\n }\n });\n return hasGroups;\n }\n \n updateInverseKinematics(deltaGoal, testDriveTranslationMode, allowClamping, loggingEnabled) {\n if(this.ikRobot) {\n let startingRotations = map(this.directChildrenOfActuators, c => c.rotation.z);\n let updatedRotations = [];\n\n startingRotations.forEach(r => {\n updatedRotations.push(0);\n });\n\n switch(testDriveTranslationMode) {\n case TranslationMode.xOnly:\n deltaGoal = new THREE.Vector3(deltaGoal.x, 0, 0);\n break;\n case TranslationMode.yOnly:\n deltaGoal = new THREE.Vector3(0, deltaGoal.y, 0);\n break;\n case TranslationMode.zOnly:\n deltaGoal = new THREE.Vector3(0, 0, deltaGoal.z);\n break;\n default:\n //keep the vector as-is\n break;\n }\n\n try {\n this.ikRobot.getInverseKinematics(\n startingRotations,\n {kind: \"delta-translation\", x: deltaGoal.x, y: deltaGoal.y, z: deltaGoal.z},\n updatedRotations\n );\n }\n catch(err) {\n console.log('Invalid robot configuration!');\n console.log(err);\n }\n\n if(allowClamping) {\n this.clampRotations(startingRotations, updatedRotations);\n }\n\n //TODO: for HEBI's internal testing\n if(loggingEnabled) {\n console.log(\"vector:\");\n console.log(deltaGoal);\n\n console.log(\"starting rotations:\");\n console.log(startingRotations);\n\n console.log(\"updated rotations:\");\n console.log(updatedRotations);\n\n console.log(\"----------------\");\n }\n\n for(var i = 0; i < updatedRotations.length; i++) {\n this.directChildrenOfActuators[i].rotation.z = updatedRotations[i];\n }\n\n this.ikRobot.getPayloadStats(updatedRotations, this.dynamicStats);\n }\n }\n\n getDynamicStats() {\n this.dynamicStats.continuousPayload = this.sanitizeStat(this.dynamicStats.continuousPayload);\n this.dynamicStats.peakPayload = this.sanitizeStat(this.dynamicStats.peakPayload);\n\n return this.dynamicStats;\n }\n\n sanitizeStat(stat) {\n if(!stat || isNaN(stat)) {\n stat = 0;\n }\n return stat;\n }\n\n clampRotations(startingRotations, updatedRotations) {\n\n const acceptableVariance = 0.02;\n\n for(let i = 0; i < startingRotations.length; i++) {\n if(this.isChangeTooLarge(acceptableVariance, startingRotations[i], updatedRotations[i])) {\n if(startingRotations[i] < updatedRotations[i]) {\n updatedRotations[i] = startingRotations[i] + acceptableVariance;\n }\n else {\n updatedRotations[i] = startingRotations[i] - acceptableVariance;\n }\n }\n }\n }\n\n isChangeTooLarge(acceptableVariance, original, updated) {\n return Math.abs(original - updated) >= acceptableVariance;\n }\n}\n","import { find, isEmpty } from 'lodash-es';\n\nimport * as THREE from 'three';\nimport OrbitControls from 'three-orbitcontrols';\n\nimport TransformControls from '../../../features/shared/threejs/TransformControls';\n\nimport store from '../../../app/store';\nimport PartGroupFactory from './PartGroupFactory';\nimport AssetCacheManager from './AssetCacheManager';\nimport WindowManager from './WindowManager';\nimport {TranslationMode} from './TranslationMode';\n\nimport {\n showPopper,\n hidePopper,\n updatePopperRequest,\n} from '../../../features/poppers/actions';\n\nimport {\n clearSelectedRobotPart,\n setSelectedRobotPart,\n} from '../../../features/configurator/actions';\n\nimport { WORKSPACE_BKG_COLOR, WORKSPACE_GRID_COLOR, PRIMARY_HIGHLIGHT_COLOR } from '../../../common/themes/workspace';\nimport { PostProcessingComposer } from './PostProcessingComposer';\n\nimport Stats from 'stats.js/build/stats';\nimport InverseKinematicsManager from './InverseKinematicsManager';\n\nexport default canvas => {\n const assetCacheManager = new AssetCacheManager();\n\n const origin = new THREE.Vector3(0, 0, 0);\n const { dispatch } = store;\n\n const workspaceDimensions = {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n\n const stats = new Stats();\n if (process.env.NODE_ENV === 'development') {\n stats.showPanel(0);\n document.body.appendChild(stats.dom);\n }\n\n const pointLightForCamera = new THREE.PointLight(0xffffff, 0.8); //this light's position needs to be updated each frame so that it tracks with the camera\n\n const { testDriveTarget, testDriveSnapTarget, screenPlane } = buildTestDriveControls();\n deemphasizeTestDriveTarget();\n\n const workspaceScene = buildWorkspaceScene(pointLightForCamera, testDriveTarget, screenPlane); //scene that will have lights, objects, and postprocessing effects\n\n const camera = buildCamera(workspaceDimensions);\n resetCamera();\n\n const renderer = buildRenderer(workspaceDimensions);\n let sceneIsDirty = true;\n let wasIntersecting = true;\n\n const orbitControls = buildOrbitControls();\n const rotateControls = buildRotationControls();\n\n const controlsScene = buildControlsScene([rotateControls]); //draw controls separately so they are always on top\n\n const { composer, hoverOutlinePass, selectedOutlinePass } = PostProcessingComposer(renderer, workspaceScene, controlsScene, camera, workspaceDimensions.width, workspaceDimensions.height);\n\n const raycaster = new THREE.Raycaster();\n\n let robotParts = [];\n const partGroupFactory = new PartGroupFactory(camera);\n\n const inverseKinematicsManager = new InverseKinematicsManager();\n let testDriveActive = false;\n let isDraggingTarget = false;\n let dragStartPosition = new THREE.Vector3();\n let testDriveTranslationMode = TranslationMode.all;\n\n //////////////////////////////\n //TODO: for HEBI's internal testing\n let allowClamping = true;\n let loggingEnabled = false;\n //////////////////////////////\n\n const windowManager = new WindowManager(canvas, camera, renderer, composer);\n\n // Mark scene as dirty (needs a redraw)\n function invalidateScene() {\n sceneIsDirty = true;\n }\n\n function buildWorkspaceScene(camPointLight, target, plane) {\n const scene = new THREE.Scene();\n scene.background = new THREE.Color(WORKSPACE_BKG_COLOR);\n\n const grid = new THREE.GridHelper(2, 24, WORKSPACE_GRID_COLOR, WORKSPACE_GRID_COLOR);\n grid.rotateX(Math.PI / 2);\n scene.add(grid);\n\n if (process.env.NODE_ENV === 'development') {\n scene.add(new THREE.AxesHelper(1));\n }\n\n scene.add(new THREE.AmbientLight(0xffffff, 0.1));\n scene.add(camPointLight);\n\n scene.add(target);\n target.visible = false;\n\n scene.add(plane);\n\n return scene;\n }\n\n function buildControlsScene(controls) {\n const scene = new THREE.Scene();\n\n controls.forEach(control => {\n scene.add(control);\n });\n\n return scene;\n }\n\n function buildRenderer({ width, height }) {\n const renderer = new THREE.WebGLRenderer({ canvas, antialias: true });\n\n renderer.setPixelRatio(window.devicePixelRatio);\n renderer.setSize(width, height);\n\n renderer.gammaOutput = true;\n\n return renderer;\n }\n\n function buildCamera({ width, height }) {\n const fieldOfView = 45;\n const aspectRatio = width / height;\n const nearPlane = 0.01;\n const farPlane = 5;\n\n const cam = new THREE.PerspectiveCamera(fieldOfView, aspectRatio, nearPlane, farPlane);\n cam.up.set(0, 0, 1); //set z axis of camera to up\n\n return cam;\n }\n\n function resetCamera() {\n camera.position.set(0.5, 0.5, 0.15);\n camera.lookAt(origin);\n camera.updateProjectionMatrix();\n\n if (orbitControls) {\n orbitControls.target.set(0, 0, 0);\n orbitControls.update();\n }\n }\n\n function buildOrbitControls() {\n const orbitControls = new OrbitControls(camera, renderer.domElement);\n orbitControls.target.set(0, 0, 0);\n orbitControls.maxDistance = 2;\n orbitControls.minDistance = 0.3;\n orbitControls.update();\n\n orbitControls.addEventListener('change', () => {\n sceneIsDirty = true;\n if (testDriveActive) {\n updateGrabberLabel();\n }\n });\n\n return orbitControls;\n }\n\n function buildRotationControls() {\n const controls = new TransformControls(camera, renderer.domElement);\n controls.setSpace('local');\n controls.setMode('rotate');\n\n controls.showX = false;\n controls.showY = false;\n controls.showZ = true;\n\n controls.addEventListener('change', render);\n\n controls.addEventListener('dragging-changed', function (event) {\n orbitControls.enabled = !event.value;\n });\n\n return controls;\n }\n\n function buildTestDriveControls() {\n const target = new THREE.Mesh(\n new THREE.SphereGeometry(0.025, 32, 32),\n new THREE.MeshBasicMaterial({color: PRIMARY_HIGHLIGHT_COLOR, transparent: true})\n );\n\n const snapTarget = new THREE.Mesh(\n new THREE.BoxGeometry(0.01, 0.01, 0.01),\n new THREE.MeshBasicMaterial({ color: 0xffffff, visible: false })\n );\n\n const plane = new THREE.Mesh(\n new THREE.PlaneBufferGeometry(10, 10, 16, 16),\n new THREE.MeshBasicMaterial({ color: 0xffffff, alphaTest: 0, visible: false })\n );\n\n return { testDriveTarget: target, testDriveSnapTarget: snapTarget, screenPlane: plane };\n }\n\n function updateGrabberLabel() {\n const targetWindowCoordinates = windowManager.getWindowCoordinates(testDriveTarget);\n const positionOffset = 100;\n const dynamicStats = inverseKinematicsManager.getDynamicStats();\n let worldPositionOfSnapTarget = getWorldSnapTarget();\n\n if(dynamicStats) {\n dispatch(updatePopperRequest(targetWindowCoordinates.x + positionOffset, targetWindowCoordinates.y - positionOffset, {\n statistics: {\n x: Math.abs(worldPositionOfSnapTarget.x),\n y: Math.abs(worldPositionOfSnapTarget.y),\n z: Math.abs(worldPositionOfSnapTarget.z),\n continuousPayload: dynamicStats.continuousPayload,\n peakPayload: dynamicStats.peakPayload,\n },\n }));\n }\n }\n\n function update() {\n pointLightForCamera.position.copy(camera.position);\n screenPlane.lookAt(camera.position);\n\n if (process.env.NODE_ENV === 'development') {\n stats.update();\n }\n }\n\n function render() {\n requestAnimationFrame(render);\n\n if(sceneIsDirty) {\n update();\n composer.render();\n sceneIsDirty = false;\n }\n }\n\n function onTouchStart(x, y) {\n // Prevent event from firing if user is actively rotating\n if (rotateControls.visible && rotateControls.dragging) {\n return;\n }\n\n const mouse2D = windowManager.normalizeMouseScreenCoords(x, y);\n\n if (testDriveActive) {\n // Enable camera rotation if not dragging test drive target\n orbitControls.enableRotate = !raycastAndBuildScreenOffset(mouse2D);\n } else {\n const intersectedPart = checkNearestRaycastIntersectionOnRobot(mouse2D);\n selectRobotPart(intersectedPart);\n // Enable camera rotation if part was not clicked on\n orbitControls.enableRotate = !intersectedPart;\n }\n }\n\n function onMouseDown(x, y) {\n // Prevent event from firing if user is actively rotating\n if (rotateControls.visible && rotateControls.dragging) {\n return;\n }\n\n const mouse2D = windowManager.normalizeMouseScreenCoords(x, y);\n\n if(testDriveActive) {\n raycastAndBuildScreenOffset(mouse2D);\n }\n else {\n const intersectedPart = checkNearestRaycastIntersectionOnRobot(mouse2D);\n selectRobotPart(intersectedPart);\n }\n }\n\n function onMouseMove(x, y) {\n\n // Prevent event from firing if user is actively rotating\n if (rotateControls.visible && rotateControls.dragging) {\n sceneIsDirty = true;\n return;\n }\n\n const mouse2D = windowManager.normalizeMouseScreenCoords(x, y);\n\n if(testDriveActive) {\n raycastForTargetHighlight(mouse2D);\n\n if(isDraggingTarget) {\n // If cursor is over testDriveTarget, need to disable camera rotation (both behaviors are bound to left click)\n orbitControls.enableRotate = false;\n raycastAndUpdateTestDrivePosition(mouse2D);\n sceneIsDirty = true;\n } else {\n // reenable camera rotation once end effector drag is completed\n orbitControls.enableRotate = true;\n }\n }\n else if(!testDriveActive) {\n const intersectedPart = checkNearestRaycastIntersectionOnRobot(mouse2D);\n hoverOverRobotPart(intersectedPart);\n\n if(intersectedPart || wasIntersecting) {\n sceneIsDirty = true;\n }\n wasIntersecting = intersectedPart;\n }\n }\n\n function onMouseUp(x, y) {\n isDraggingTarget = false;\n deemphasizeTestDriveTarget();\n\n //constrain to the snap target\n let worldPositionOfSnapTarget = getWorldSnapTarget();\n testDriveTarget.position.copy(worldPositionOfSnapTarget);\n\n snapScreenspacePlaneToTestDriveTarget();\n sceneIsDirty = true;\n }\n\n //TODO: for HEBI's internal testing\n function onKeyPress(key) {\n switch(key) {\n case 88: //x\n testDriveTranslationMode = TranslationMode.xOnly;\n break;\n case 89: //y\n testDriveTranslationMode = TranslationMode.yOnly;\n break;\n case 90: //z\n testDriveTranslationMode = TranslationMode.zOnly;\n break;\n case 69: //e\n testDriveTranslationMode = TranslationMode.all;\n break;\n case 67: //c\n allowClamping = !allowClamping;\n break;\n case 76: //l\n loggingEnabled = !loggingEnabled;\n break;\n default:\n break;\n }\n }\n\n async function addPart(part, userData) {\n const partAssets = await assetCacheManager.getPartAssets(part);\n const group = partGroupFactory.create(partAssets.meshes, userData);\n const { parentRobotPartId } = getUserData(group);\n\n if (parentRobotPartId) {\n const parent = findRobotPartForId(parentRobotPartId);\n const { addChild } = getUserData(parent);\n addChild(group);\n }\n else {\n workspaceScene.add(group);\n }\n\n robotParts.push(group);\n\n selectRobotPart(group);\n\n return group;\n }\n\n function findRobotPartForId(id) {\n return find(robotParts, p => p.userData.id === id);\n }\n\n function selectRobotPart(robotPart) {\n if(robotPart && !testDriveActive) {\n const { id } = getUserData(robotPart);\n const robotPartGroup = findRobotPartForId(id);\n\n if (robotPartGroup.parent && robotPartGroup.parent.userData && robotPartGroup.parent.userData.canRotate) {\n rotateControls.attach(robotPartGroup);\n } else {\n rotateControls.detach();\n }\n\n const x = 20;\n const y = 130;\n dispatch(setSelectedRobotPart(id, x, y));\n }\n else {\n dispatch(clearSelectedRobotPart());\n rotateControls.detach();\n }\n\n selectedOutlinePass.selectedObjects = selectMeshesForOutline(robotPart);\n sceneIsDirty = true;\n }\n\n /**\n * Traverses up the parent tree until finding the root PartGroup object,\n * returning the userData object and all associated attributes and functions\n * @param {*} robotPart \n */\n function getUserData(robotPart) {\n if (isEmpty(robotPart.userData)) {\n return getUserData(robotPart.parent);\n }\n\n return robotPart.userData;\n }\n\n function hoverOverRobotPart(robotPart) {\n hoverOutlinePass.selectedObjects = selectMeshesForOutline(robotPart);\n }\n\n function selectMeshesForOutline(robotPart) {\n if (!robotPart) {\n return [];\n }\n\n const { getOutlineMeshes } = getUserData(robotPart);\n const meshes = getOutlineMeshes();\n return meshes;\n }\n\n function checkNearestRaycastIntersectionOnRobot(mouseVector) {\n var mouse3D = new THREE.Vector3(mouseVector.x, mouseVector.y, 0.5);\n raycaster.setFromCamera(mouse3D, camera);\n\n var intersections = raycaster.intersectObjects(robotParts, true);\n\n if (intersections.length > 0) {\n return intersections[0].object.parent; //get the Three Group that is holding the particular mesh we intersected\n }\n return null;\n }\n\n function raycastForTargetHighlight(mouseVector) {\n var mouse3D = new THREE.Vector3(mouseVector.x, mouseVector.y, 1);\n raycaster.setFromCamera(mouse3D, camera);\n\n var targetIntersection = raycaster.intersectObject(testDriveTarget);\n\n if(targetIntersection.length > 0) {\n selectedOutlinePass.selectedObjects = [ targetIntersection[0].object ];\n sceneIsDirty = true;\n }\n else if(!isDraggingTarget) {\n if(selectedOutlinePass.selectedObjects.length > 0) {\n sceneIsDirty = true;\n }\n\n selectedOutlinePass.selectedObjects = [];\n }\n }\n\n function raycastAndBuildScreenOffset(mouseVector) {\n var mouse3D = new THREE.Vector3(mouseVector.x, mouseVector.y, 1);\n raycaster.setFromCamera(mouse3D, camera);\n\n var targetIntersection = raycaster.intersectObject(testDriveTarget);\n var planeIntersection = raycaster.intersectObject(screenPlane);\n\n if(targetIntersection.length > 0 && planeIntersection.length > 0) {\n isDraggingTarget = true;\n\n emphasizeTestDriveTarget();\n\n dragStartPosition.copy(planeIntersection[0].point.sub(screenPlane.position));\n }\n else {\n isDraggingTarget = false;\n deemphasizeTestDriveTarget();\n }\n\n return isDraggingTarget;\n }\n\n function raycastAndUpdateTestDrivePosition(mouseVector) {\n var mouse3D = new THREE.Vector3(mouseVector.x, mouseVector.y, 1);\n raycaster.setFromCamera(mouse3D, camera);\n\n var planeIntersection = raycaster.intersectObject(screenPlane);\n\n if(planeIntersection.length > 0) {\n const delta = planeIntersection[0].point.sub(dragStartPosition);\n testDriveTarget.position.copy(delta);\n\n const worldSnapPosition = getWorldSnapTarget();\n const deltaGoal = new THREE.Vector3().subVectors(delta, worldSnapPosition);\n\n inverseKinematicsManager.updateInverseKinematics(deltaGoal, testDriveTranslationMode, allowClamping, loggingEnabled);\n\n workspaceScene.updateMatrixWorld(); //force matrix hierarchy update\n\n //constrain to the snap target\n testDriveTarget.position.copy(worldSnapPosition);\n\n updateGrabberLabel();\n }\n else {\n snapScreenspacePlaneToTestDriveTarget();\n }\n }\n\n function snapScreenspacePlaneToTestDriveTarget() {\n //update plane position so it stays with the target\n screenPlane.position.copy(testDriveTarget.position);\n screenPlane.lookAt(camera.position);\n }\n\n function getWorldSnapTarget() {\n let worldPositionOfSnapTarget = new THREE.Vector3();\n testDriveSnapTarget.getWorldPosition(worldPositionOfSnapTarget);\n return worldPositionOfSnapTarget;\n }\n\n function activateTestDrive(parentPartId) {\n\n disableBuildingControls();\n\n if(parentPartId) {\n const parentPart = findRobotPartForId(parentPartId);\n\n if(parentPart) {\n testDriveTarget.visible = true;\n dragStartPosition = new THREE.Vector3();\n\n parentPart.userData.addInterfaceItem(testDriveSnapTarget);\n\n //set testDriveTarget's local position to the world position of the testDriveSnapTarget - by setting\n //the local position instead of adding it as a child, the coordinate system of testDriveTarget will\n //remain the same as the world because it remains a direct child of the scene\n let worldPositionOfSnapTarget = getWorldSnapTarget();\n testDriveTarget.position.copy(worldPositionOfSnapTarget);\n\n //do the same thing for the plane\n screenPlane.position.copy(worldPositionOfSnapTarget);\n\n snapScreenspacePlaneToTestDriveTarget();\n\n inverseKinematicsManager.buildRobot(parentPart);\n inverseKinematicsManager.updateInverseKinematics(new THREE.Vector3(), allowClamping, loggingEnabled);\n\n dispatch(showPopper(0, 0, 'TestDriveGrabberLabel'));\n updateGrabberLabel();\n }\n }\n\n sceneIsDirty = true;\n }\n\n function deactivateTestDrive() {\n testDriveActive = false;\n testDriveTarget.visible = false;\n\n dispatch(hidePopper());\n\n inverseKinematicsManager.resetRobot();\n sceneIsDirty = true;\n }\n\n function disableBuildingControls() {\n hoverOutlinePass.selectedObjects = [];\n selectedOutlinePass.selectedObjects = [];\n\n testDriveActive = true;\n\n rotateControls.detach(); //don't let the user fight the IK\n sceneIsDirty = true;\n }\n\n function emphasizeTestDriveTarget() {\n testDriveTarget.material.opacity = 1.0; //increase the opacity\n sceneIsDirty = true;\n }\n\n function deemphasizeTestDriveTarget() {\n testDriveTarget.material.opacity = 0.8; //decrease the opacity\n sceneIsDirty = true;\n }\n\n function clearScene(scene) {\n scene.traverse(function (object) {\n if (object instanceof THREE.Group) {\n scene.remove(object);\n }\n });\n }\n\n function clearWorkspace() {\n rotateControls.detach();\n dispatch(hidePopper());\n robotParts = [];\n clearScene(workspaceScene);\n sceneIsDirty = true;\n }\n\n function clearSelectedPart() {\n selectRobotPart(null);\n sceneIsDirty = true;\n }\n\n function removeRobotParts(robotPartsToRemove) {\n clearSelectedPart();\n\n for (let i = robotPartsToRemove.length - 1; i >= 0; i -= 1) {\n const { id, parentRobotPartId } = robotPartsToRemove[i];\n\n const groupToRemove = findRobotPartForId(id);\n\n if (parentRobotPartId) {\n const parentGroup = findRobotPartForId(parentRobotPartId);\n const { removeChild } = parentGroup.userData;\n removeChild(groupToRemove);\n } else {\n workspaceScene.remove(groupToRemove);\n }\n }\n\n const robotPartIds = robotPartsToRemove.map(rp => rp.id);\n robotParts = robotParts.filter(rp => robotPartIds.includes(rp.userData.id) === false);\n }\n\n function updatePartConstraint(id, constraint, value) {\n const robotPart = findRobotPartForId(id);\n if (!robotPart) {\n return;\n }\n\n const { updateConstraint } = getUserData(robotPart);\n updateConstraint(constraint, value);\n sceneIsDirty = true;\n }\n\n function updateRobotPart(id, newRobotPart) {\n const index = robotParts.findIndex(p => p.userData.id === id);\n robotParts[index] = newRobotPart;\n sceneIsDirty = true;\n }\n\n async function replacePart(partToReplace, addPartArgs) {\n clearSelectedPart();\n\n const robotPartToReplace = findRobotPartForId(partToReplace.id);\n const {\n getChild,\n parentRobotPartId,\n } = getUserData(robotPartToReplace);\n\n // First, store child group that we need to recreate\n const partGroupHierarchyToKeep = getChild();\n\n // Then remove the part we are replacing\n if (parentRobotPartId) {\n const parentGroup = findRobotPartForId(parentRobotPartId);\n const { removeChild } = parentGroup.userData;\n removeChild(robotPartToReplace);\n } else {\n workspaceScene.remove(robotPartToReplace);\n }\n\n // Add the new part\n const { part, userData } = addPartArgs;\n const newPart = await addPart(part, userData);\n\n // Finally, re-add all previously existing parts\n if (partGroupHierarchyToKeep) {\n const { setLocalTransform } = getUserData(partGroupHierarchyToKeep);\n const { addChild } = getUserData(newPart);\n addChild(partGroupHierarchyToKeep);\n\n // Apply replacement part's child offset to child\n if (part.attachments && part.attachments.length) {\n const { childTranslationOffset, childRotationOffset } = part.attachments[0];\n setLocalTransform(childTranslationOffset, childRotationOffset);\n }\n }\n\n updateRobotPart(partToReplace.id, newPart);\n selectRobotPart(newPart);\n }\n\n return {\n addPart,\n activateTestDrive,\n deactivateTestDrive,\n disableBuildingControls,\n clearWorkspace,\n render,\n update,\n removeRobotParts,\n replacePart,\n resetCamera,\n onMouseDown,\n onMouseMove,\n onMouseUp,\n onTouchStart,\n onKeyPress,\n updatePartConstraint,\n invalidateScene,\n };\n}\n","import * as THREE from 'three';\n\nimport EffectComposer from '../../../features/shared/threejs/postprocessing/EffectComposer';\nimport RenderPass from '../../../features/shared/threejs/postprocessing/RenderPass';\nimport OutlinePass from '../../../features/shared/threejs/postprocessing/OutlinePass';\nimport SMAAPass from '../../../features/shared/threejs/postprocessing/SMAAPass';\n\nimport { PRIMARY_HIGHLIGHT_COLOR, SECONDARY_HIGHLIGHT_COLOR } from '../../../common/themes/workspace';\n\n\nexport const PostProcessingComposer = (renderer, effectsScene, controlsScene, camera, width, height) => {\n\n const composer = new EffectComposer(renderer);\n\n const effectsRenderPass = new RenderPass(effectsScene, camera);\n effectsRenderPass.clear = true;\n effectsRenderPass.clearDepth = true;\n composer.addPass(effectsRenderPass);\n\n const inScreenControlsRenderPass = new RenderPass(controlsScene, camera);\n inScreenControlsRenderPass.clear = false;\n inScreenControlsRenderPass.clearDepth = true;\n composer.addPass(inScreenControlsRenderPass);\n\n function defineOutlinePass(canvasWidth, canvasHeight, scene, camera, outlineConfig) {\n var outlinePass = new OutlinePass(new THREE.Vector2(canvasWidth, canvasHeight), scene, camera);\n for(var property in outlineConfig) outlinePass[property] = outlineConfig[property];\n return outlinePass;\n }\n\n const hoverOutlinePass = defineOutlinePass(width, height, effectsScene, camera, {\n visibleEdgeColor: new THREE.Color(SECONDARY_HIGHLIGHT_COLOR),\n hiddenEdgeColor: new THREE.Color(SECONDARY_HIGHLIGHT_COLOR),\n edgeStrength: 1.0,\n edgeGlow: 2.0,\n edgeThickness: 1.0,\n pulsePeriod: 0,\n });\n\n const selectedOutlinePass = defineOutlinePass(width, height, effectsScene, camera, {\n visibleEdgeColor: new THREE.Color(PRIMARY_HIGHLIGHT_COLOR),\n hiddenEdgeColor: new THREE.Color(PRIMARY_HIGHLIGHT_COLOR),\n edgeStrength: 4.0,\n edgeGlow: 0.1,\n edgeThickness: 2.0,\n pulsePeriod: 0,\n });\n\n composer.addPass(hoverOutlinePass);\n composer.addPass(selectedOutlinePass);\n\n const smaaPass = new SMAAPass(1 / window.innerWidth, 1 / window.innerHeight);\n smaaPass.renderToScreen = true;\n composer.addPass(smaaPass);\n\n return {\n composer,\n hoverOutlinePass,\n selectedOutlinePass,\n };\n};\n","import SceneManager from './SceneManager';\n\nexport default canvas => {\n const sceneManager = new SceneManager(canvas);\n const isTouchDevice = 'ontouchstart' in document.documentElement;\n\n bindEventListeners();\n\n function bindEventListeners() {\n if (isTouchDevice) {\n canvas.addEventListener('touchstart', touchStart);\n canvas.addEventListener('touchmove', touchMove);\n canvas.addEventListener('touchend', touchEnd);\n } else {\n canvas.addEventListener('mousedown', mouseDown);\n canvas.addEventListener('mousemove', mouseMove);\n canvas.addEventListener('mouseup', mouseUp);\n }\n\n canvas.addEventListener('wheel', wheel);\n\n\n //TODO: for HEBI's debug keybindings\n document.addEventListener('keydown', keyPress);\n }\n\n function touchStart(e) {\n if (!e.touches || e.touches.length !== 1) {\n return;\n }\n\n const touch = e.touches[0];\n sceneManager.onTouchStart(touch.pageX, touch.pageY);\n }\n\n function touchMove(e) {\n if (!e.touches || e.touches.length !== 1) {\n return;\n }\n const touch = e.touches[0];\n sceneManager.onMouseMove(touch.pageX, touch.pageY);\n }\n\n function touchEnd(e) {\n if (!e.touches || e.touches.length !== 1) {\n return;\n }\n const touch = e.touches[0];\n sceneManager.onMouseUp(touch.pageX, touch.pageY);\n }\n\n function wheel(e) {} // The three orbit controls handle everything for now.\n\n function mouseDown(e) {\n e = e || window.event; // support Internet Explorer\n const { clientX, clientY, which } = e;\n const isLeftClick = which === 1;\n\n if (isLeftClick) {\n sceneManager.onMouseDown(clientX, clientY);\n }\n }\n\n function mouseMove({ clientX, clientY }) {\n sceneManager.onMouseMove(clientX, clientY);\n }\n\n function mouseUp(e) {\n e = e || window.event; // support Internet Explorer\n const { clientX, clientY } = e;\n sceneManager.onMouseUp(clientX, clientY);\n }\n\n function keyPress(key) {\n sceneManager.onKeyPress(key.which);\n }\n\n function render() {\n sceneManager.render();\n }\n\n function resetCamera() {\n sceneManager.resetCamera();\n }\n\n async function addPart({ part, userData }) {\n await sceneManager.addPart(part, userData);\n }\n\n function activateTestDrive(parentPartId) {\n sceneManager.activateTestDrive(parentPartId);\n }\n\n function deactivateTestDrive() {\n sceneManager.deactivateTestDrive();\n }\n\n function disableBuildingControls() {\n sceneManager.disableBuildingControls();\n }\n\n function clearScene() {\n sceneManager.clearWorkspace();\n }\n\n function removeRobotParts(robotParts) {\n sceneManager.removeRobotParts(robotParts);\n }\n\n function updatePartConstraint(id, constraint, value) {\n sceneManager.updatePartConstraint(id, constraint, value);\n }\n\n async function replacePart(partToReplace, addPartArgs) {\n await sceneManager.replacePart(partToReplace, addPartArgs);\n }\n\n return {\n addPart,\n activateTestDrive,\n deactivateTestDrive,\n disableBuildingControls,\n clearScene,\n render,\n removeRobotParts,\n replacePart,\n resetCamera,\n updatePartConstraint,\n }\n}\n","import {\n call,\n select,\n take,\n} from 'redux-saga/effects';\n\nimport {\n LOCATION_CHANGE,\n getLocation,\n} from 'connected-react-router';\n\nimport { zIndex } from '../../../common/themes/variables'\n\nimport ThreeProcessor from '../../../common/utils/three/ThreeProcessor';\n\nimport {\n INITIALIZE_CONFIGURATOR_SUCCESS,\n INITIALIZE_CONFIGURATOR_SUCCESS_CACHED,\n} from '../actions';\n\nimport {\n getWorkspaceIsVisible,\n} from '../selectors';\n\nconst CANVAS_ID = 'configurator-workspace';\n\nconst getCanvasVisibility = isVisible => isVisible ? 'visible' : 'hidden';\n\nexport default function* configureCanvasWatcher() {\n while (true) {\n yield take([\n LOCATION_CHANGE,\n INITIALIZE_CONFIGURATOR_SUCCESS,\n INITIALIZE_CONFIGURATOR_SUCCESS_CACHED,\n ]);\n\n const location = yield select(getLocation);\n yield call(updateCanvasVisibility, location);\n }\n}\n\nfunction* updateCanvasVisibility(location) {\n const shouldBeVisible = yield select(getWorkspaceIsVisible, location);\n const canvas = document.getElementById(CANVAS_ID);\n canvas.style.visibility = getCanvasVisibility(shouldBeVisible);\n}\n\nexport function createCanvas() {\n const canvas = document.createElement('canvas');\n canvas.id = CANVAS_ID;\n\n canvas.style.position = 'absolute';\n canvas.style.zIndex = zIndex.workspace;\n document.body.appendChild(canvas);\n\n const threeProcessor = ThreeProcessor(canvas);\n threeProcessor.render();\n\n return {\n threeProcessor,\n };\n}\n","import {\n call,\n take,\n} from 'redux-saga/effects';\n\nimport {\n RESET_CAMERA\n} from '../actions';\n\nexport default function* resetCameraWatcher(threeProcessor) {\n while (true) {\n yield take(RESET_CAMERA);\n \n yield call(threeProcessor.resetCamera);\n }\n}\n","import {\n call,\n put,\n select,\n} from 'redux-saga/effects';\n\nimport {\n setCurrentRobotPart,\n} from '../actions';\n\nimport {\n getCurrentRobotPartWorkspaceArguments,\n getCurrentRobotPart,\n} from '../selectors';\n\nexport default function* addPartToWorkspaceSaga(robotPartId, threeProcessor) {\n yield put(setCurrentRobotPart(robotPartId));\n const robotPart = yield select(getCurrentRobotPart);\n\n const args = yield select(getCurrentRobotPartWorkspaceArguments);\n yield call(threeProcessor.addPart, args);\n\n for (const childPart of robotPart.children.toModelArray()) {\n yield call(addPartToWorkspaceSaga, childPart.id, threeProcessor);\n }\n}\n","import {\n all,\n call,\n put,\n} from 'redux-saga/effects';\nimport { toast } from 'react-toastify';\n\nimport {\n apiGet,\n} from '../../../common/utils/saga-utils';\n\nimport {\n setSelectedCategory,\n} from '../../catalog/actions';\n\nimport {\n LOAD_ENTITIES_REQUEST,\n LOAD_ENTITIES_ERROR,\n LOAD_ENTITIES_ERROR_MESSAGE,\n loadEntitiesSuccess,\n} from '../actions';\n\nfunction* loadEntities() {\n const entities = yield all({\n boltPatterns: call(apiGet, '/Part/Attachment/boltPattern'),\n partLengths: call(apiGet, '/Part/lengths'),\n parts: call(apiGet, '/parts'),\n partCategories: call(apiGet, '/Part/categories?sorts=name'),\n });\n\n return entities;\n}\n\nexport default function* loadEntitiesSaga() {\n try {\n yield put({ type: LOAD_ENTITIES_REQUEST });\n const entities = yield call(loadEntities);\n yield put(loadEntitiesSuccess(entities));\n yield call(setDefaultSelectedCategory, entities.partCategories);\n } catch (error) {\n yield put({ type: LOAD_ENTITIES_ERROR, payload: { error } });\n yield call(toast.error, LOAD_ENTITIES_ERROR_MESSAGE);\n }\n}\n\nfunction* setDefaultSelectedCategory(categories) {\n if (!categories || !categories.length) {\n return;\n }\n\n const { id: defaultCategoryId } = categories[0];\n yield put(setSelectedCategory(defaultCategoryId));\n}","import {\n call,\n put,\n select,\n} from 'redux-saga/effects';\n\nimport { toast } from 'react-toastify';\n\nimport {\n INITIALIZE_CONFIGURATOR_SUCCESS_CACHED,\n INITIALIZE_CONFIGURATOR_ERROR,\n INITIALIZE_CONFIGURATOR_ERROR_MESSAGE,\n initializeConfiguratorSuccess,\n initializeConfiguratorRequest,\n} from '../actions';\n\nimport {\n getConfiguratorIsInitialized,\n} from '../selectors';\n\nimport loadEntitiesSaga from './loadEntitiesSaga';\n\nexport default function* initializeConfiguratorSaga() {\n try {\n yield put(initializeConfiguratorRequest());\n\n const initialized = yield select(getConfiguratorIsInitialized);\n if (initialized) {\n yield put({ type: INITIALIZE_CONFIGURATOR_SUCCESS_CACHED });\n } else {\n yield call(loadEntitiesSaga);\n yield put(initializeConfiguratorSuccess());\n }\n } catch (error) {\n yield put({ type: INITIALIZE_CONFIGURATOR_ERROR, error });\n yield call(toast.error, INITIALIZE_CONFIGURATOR_ERROR_MESSAGE);\n }\n}\n","import {\n call,\n put,\n select,\n take,\n} from 'redux-saga/effects';\n\nimport { toast } from 'react-toastify';\n\nimport {\n apiGet,\n} from '../../../common/utils/saga-utils';\n\nimport {\n ROBOT_LOAD_REQUEST,\n ROBOT_LOAD_ERROR,\n ROBOT_LOAD_ERROR_MESSAGE,\n setCurrentRobot,\n loadRobotSuccess,\n setSceneLoaded,\n} from '../actions';\n\nimport {\n getCurrentRobot,\n} from '../selectors';\n\nimport addPartToWorkspaceSaga from './addPartToWorkspaceSaga';\nimport initializeConfiguratorSaga from './initializeConfiguratorSaga';\n\nexport default function* loadRobotWatcher(threeProcessor) {\n while (true) {\n try {\n const { payload } = yield take([\n ROBOT_LOAD_REQUEST,\n ]);\n\n const { id } = payload;\n yield call(threeProcessor.clearScene);\n yield call(initializeConfiguratorSaga);\n yield put(setCurrentRobot(id));\n yield call(loadRobot, id);\n yield call(addRobotToWorkspace, threeProcessor);\n yield put(setSceneLoaded(true));\n } catch (error) {\n yield put({ type: ROBOT_LOAD_ERROR, error });\n yield call(toast.error, ROBOT_LOAD_ERROR_MESSAGE);\n }\n }\n}\n\nfunction* loadRobot(id) {\n const robot = yield call(apiGet, `/Robot/${id}`);\n yield put(loadRobotSuccess(robot));\n}\n\nfunction* addRobotToWorkspace(threeProcessor) {\n const currentRobot = yield select(getCurrentRobot);\n const robotParts = currentRobot.robotParts.toModelArray();\n\n for (const robotPart of robotParts) {\n yield call(addPartToWorkspaceSaga, robotPart.id, threeProcessor);\n }\n}\n","import {\n call,\n put,\n select,\n takeEvery,\n} from 'redux-saga/effects';\nimport { toast } from 'react-toastify';\nimport saveAs from 'file-saver';\nimport { format } from 'date-fns';\n\nimport { apiGet } from '../../../common/utils/saga-utils';\n\nimport { getCurrentRobot } from '../selectors';\n\nimport {\n EXPORT_ROBOT_REQUEST,\n EXPORT_ROBOT_ERROR,\n EXPORT_ROBOT_ERROR_MESSAGE,\n EXPORT_ROBOT_SUCCESS,\n} from '../actions';\n\nfunction* processRobotExport() {\n try {\n const currentRobot = yield select(getCurrentRobot);\n\n if (currentRobot) {\n var result = yield call(apiGet, `/Robot/${currentRobot.id}`, {\n headers: {\n Accept: 'text/hrdf'\n }\n });\n var blob = new Blob([result], { type: 'text/hrdf;charset=utf-8' });\n saveAs(blob, `HEBI Robot ${format(new Date(), 'yyyy-MM-dd')}.hrdf`);\n yield put({ type: EXPORT_ROBOT_SUCCESS });\n } else {\n yield put({ type: EXPORT_ROBOT_ERROR });\n yield call(toast.error, EXPORT_ROBOT_ERROR_MESSAGE);\n }\n } catch (error) {\n yield put({ type: EXPORT_ROBOT_ERROR, error });\n yield call(toast.error, EXPORT_ROBOT_ERROR_MESSAGE);\n }\n}\n\nexport default function* exportRobotWatcher() {\n yield takeEvery(EXPORT_ROBOT_REQUEST, processRobotExport);\n}\n","import {\n push,\n} from 'connected-react-router';\n\nimport {\n call,\n put,\n take,\n} from 'redux-saga/effects';\n\nimport { toast } from 'react-toastify';\n\nimport {\n apiGet,\n apiPost,\n} from '../../../common/utils/saga-utils';\n\nimport {\n setDrawerVisible,\n} from '../../catalog/actions';\n\nimport {\n ROBOT_CREATE_WITH_PART_REQUEST,\n ROBOT_CREATE_WITH_PART_ERROR,\n ROBOT_CREATE_WITH_PART_ERROR_MESSAGE,\n ROBOT_CREATE_REQUEST,\n ROBOT_CREATE_ERROR,\n ROBOT_CREATE_ERROR_MESSAGE,\n ROBOT_UPLOAD_HRDF_REQUEST,\n ROBOT_UPLOAD_HRDF_ERROR,\n ROBOT_UPLOAD_HRDF_ERROR_MESSAGE,\n createRobotWithPartSuccess,\n createRobotSuccess,\n uploadHRDFSuccess,\n} from '../actions';\n\nexport default function* createRobotWatcher() {\n while (true) {\n try {\n const { payload, type } = yield take([\n ROBOT_CREATE_REQUEST,\n ROBOT_CREATE_WITH_PART_REQUEST,\n ROBOT_UPLOAD_HRDF_REQUEST,\n ]);\n\n const { createRobot } = createRobotStrategies[type];\n const id = yield call(createRobot, payload);\n yield put(push(`/configurator/build?robotId=${id}`));\n } catch (error) {\n yield put({ type: ROBOT_CREATE_ERROR, error });\n yield call(toast.error, ROBOT_CREATE_ERROR_MESSAGE);\n }\n }\n}\n\nfunction* createRobotWithPart({ robot, partName }) {\n try {\n const basePart = yield call(getPartByName, partName);\n if (!basePart) {\n return yield call(createEmptyRobot);\n }\n\n robot = robot || {};\n robot.robotParts = robot.robotParts || [];\n\n robot = {\n ...robot,\n robotParts: [\n ...robot.robotParts,\n {\n partId: basePart.id,\n },\n ]\n }\n\n const id = yield call(createRobot, robot);\n yield put(createRobotWithPartSuccess(id));\n yield put(setDrawerVisible(true));\n return id;\n } catch (error) {\n yield put({ type: ROBOT_CREATE_WITH_PART_ERROR, payload: { error } });\n yield call(toast.error, ROBOT_CREATE_WITH_PART_ERROR_MESSAGE);\n } \n}\n\nfunction* getPartByName(name) {\n const parts = yield call(apiGet, `/Parts?Filters=name==${name}`);\n if (!parts || !parts.length) {\n return null;\n }\n\n return parts[0];\n}\n\nfunction* createEmptyRobot() {\n try {\n const id = yield call(createRobot, {});\n yield put(createRobotSuccess(id));\n yield put(setDrawerVisible(true));\n return id;\n } catch (error) {\n yield put({ type: ROBOT_CREATE_ERROR, payload: { error } });\n yield call(toast.error, ROBOT_CREATE_ERROR_MESSAGE);\n }\n}\n\nfunction* createRobot(robot) {\n const id = yield call(apiPost, '/Robot', {\n name: 'ROBOT_V1',\n ...robot,\n });\n\n return id;\n}\n\nfunction* createRobotFromHRDF({ file }) {\n try {\n const id = yield call(apiPost, '/Robot/Upload', {\n file,\n });\n\n yield put(uploadHRDFSuccess(id));\n yield put(setDrawerVisible(false));\n return id;\n } catch (error) {\n yield put({ type: ROBOT_UPLOAD_HRDF_ERROR, payload: { error } });\n yield call(toast.error, ROBOT_UPLOAD_HRDF_ERROR_MESSAGE);\n }\n}\n\nconst createRobotStrategies = {\n ROBOT_CREATE_REQUEST: {\n createRobot: createEmptyRobot,\n },\n ROBOT_CREATE_WITH_PART_REQUEST: {\n createRobot: createRobotWithPart,\n },\n ROBOT_UPLOAD_HRDF_REQUEST: {\n createRobot: createRobotFromHRDF,\n }\n};\n","import {\n call,\n put,\n select,\n take,\n} from 'redux-saga/effects';\nimport { toast } from 'react-toastify';\n\nimport { apiDelete } from '../../../common/utils/saga-utils';\n\nimport {\n ROBOT_PART_REMOVE_REQUEST,\n ROBOT_PART_REMOVE_CANCEL,\n ROBOT_PART_REMOVE_ERROR,\n ROBOT_PART_REMOVE_ERROR_MESSAGE,\n ROBOT_PART_REMOVE_CONFIRM_REQUEST,\n ROBOT_PART_REMOVE_CONFIRM_SUCCESS,\n removeRobotPartSuccess,\n clearSelectedRobotPart,\n setCurrentRobotPart,\n} from '../actions';\n\nimport {\n getSelectedRobotPart,\n getPotentialParents,\n} from '../selectors';\n\nimport {\n openModal,\n closeModal,\n} from '../../modals/actions';\n\nimport {\n hidePopper,\n} from '../../poppers/actions';\n\nexport default function* removeRobotPartWatcher(threeProcessor) {\n const confirmationModalName = 'RemovePartConfirmationModal';\n const configurationDialogName = 'ConfiguratorDialog';\n\n while (true) {\n try {\n yield take([\n ROBOT_PART_REMOVE_REQUEST,\n ]);\n\n yield put(openModal(confirmationModalName));\n\n const { type } = yield take([\n ROBOT_PART_REMOVE_CONFIRM_REQUEST,\n ROBOT_PART_REMOVE_CANCEL,\n ]);\n\n if (type === ROBOT_PART_REMOVE_CONFIRM_REQUEST) {\n const selectedRobotPart = yield select(getSelectedRobotPart);\n const robotPartsToRemove = getRobotPartsToRemove(selectedRobotPart);\n\n yield call(deleteRobotPart, selectedRobotPart.id); \n yield put(removeRobotPartSuccess(robotPartsToRemove.map(rp => rp.id)));\n threeProcessor.removeRobotParts(robotPartsToRemove);\n yield put(clearSelectedRobotPart());\n yield call(resetCurrentRobotPart);\n\n yield put({ type: ROBOT_PART_REMOVE_CONFIRM_SUCCESS });\n yield put(hidePopper(configurationDialogName));\n }\n\n yield put(closeModal(confirmationModalName));\n } catch (error) {\n yield put({ type: ROBOT_PART_REMOVE_ERROR, error });\n yield call(toast.error, ROBOT_PART_REMOVE_ERROR_MESSAGE);\n }\n }\n}\n\nfunction* resetCurrentRobotPart() {\n const potentialParents = yield select(getPotentialParents);\n if (potentialParents && potentialParents.length) {\n const { id } = potentialParents[0];\n yield put(setCurrentRobotPart(id));\n }\n}\n\nfunction* deleteRobotPart(id) {\n yield call(apiDelete, `/Robot/Part/${id}`);\n}\n\nfunction getRobotPartsToRemove(selectedRobotPart) {\n const children = selectedRobotPart.children.toModelArray();\n\n const robotParts = getChildRobotParts(children, [selectedRobotPart]);\n return robotParts;\n}\n\nfunction getChildRobotParts(robotParts, result = []) {\n for (let i = 0, length = robotParts.length; i < length; i++) {\n result.push(robotParts[i]);\n\n result = getChildRobotParts(robotParts[i].children.toModelArray(), result);\n }\n\n return result;\n}\n","import {\n call,\n put,\n select,\n take,\n} from 'redux-saga/effects';\nimport { toast } from 'react-toastify';\n\nimport {\n CLEAR_SELECTED_ROBOT_PART,\n SET_SELECTED_ROBOT_PART,\n SET_SELECTED_ROBOT_PART_ERROR,\n SET_SELECTED_ROBOT_PART_ERROR_MESSAGE,\n setPlacementMode,\n} from '../actions';\n\nimport {\n getPlacementMode,\n getSceneLoaded,\n} from '../selectors';\n\nimport {\n hidePopper,\n showPopper,\n} from '../../poppers/actions';\n\nexport default function* selectRobotPartWatcher() {\n const configurationDialogName = 'ConfiguratorDialog';\n\n while (true) {\n try {\n const { payload, type } = yield take([\n SET_SELECTED_ROBOT_PART,\n CLEAR_SELECTED_ROBOT_PART,\n ]);\n\n const sceneLoaded = yield select(getSceneLoaded);\n\n if (!sceneLoaded) {\n continue;\n }\n\n const placementMode = yield select(getPlacementMode);\n if (placementMode !== 'place') {\n yield put(setPlacementMode('place'));\n }\n\n if (type === SET_SELECTED_ROBOT_PART) {\n const { location: { x, y }} = payload;\n yield put(showPopper(x, y, configurationDialogName));\n } else if (type === CLEAR_SELECTED_ROBOT_PART) {\n yield put(hidePopper(configurationDialogName));\n }\n } catch (error) {\n yield put({ type: SET_SELECTED_ROBOT_PART_ERROR, error });\n yield call(toast.error, SET_SELECTED_ROBOT_PART_ERROR_MESSAGE);\n }\n }\n}\n","import {\n call,\n take,\n select,\n} from 'redux-saga/effects';\n\nimport {\n ACTIVATE_TEST_DRIVE,\n} from '../actions';\n\nimport {\n getPotentialParents,\n} from '../selectors';\n\nimport { toast } from 'react-toastify';\n\nexport default function* activateTestDriveWatcher(threeProcessor) {\n while (true) {\n yield take(ACTIVATE_TEST_DRIVE);\n\n const potentialParents = yield select(getPotentialParents);\n\n if(potentialParents.length === 0) {\n yield call(toast.error, 'Need a robot to test drive!');\n }\n else if(potentialParents.length === 1) {\n const parentPart = potentialParents[0];\n yield call(threeProcessor.activateTestDrive, parentPart.id);\n }\n else {\n // TODO: Version 1.0+\n // If Multiple potential parents, wait for user to select one, validate, and continue\n yield call(toast.error, 'Unsupported robot configuration');\n }\n }\n}\n","import {\n call,\n take,\n} from 'redux-saga/effects';\n\nimport {\n DEACTIVATE_TEST_DRIVE\n} from '../actions';\n\nexport default function* deactivateTestDriveWatcher(threeProcessor) {\n while (true) {\n yield take(DEACTIVATE_TEST_DRIVE);\n \n yield call(threeProcessor.deactivateTestDrive);\n }\n}\n","import {\n call,\n put,\n select,\n take,\n} from 'redux-saga/effects';\nimport { toast } from 'react-toastify';\n\nimport { apiPatch } from '../../../common/utils/saga-utils';\n\nimport {\n ROBOT_PART_UPDATE_CONSTRAINT_REQUEST,\n ROBOT_PART_UPDATE_CONSTRAINT_ERROR,\n ROBOT_PART_UPDATE_CONSTRAINT_ERROR_MESSAGE,\n updateSelectedRobotPartConstraintSuccess,\n} from '../actions';\n\nimport {\n getSelectedRobotPartId,\n} from '../selectors';\n\nexport default function* configurePartWatcher(threeProcessor) {\n while (true) {\n try {\n const { payload } = yield take(ROBOT_PART_UPDATE_CONSTRAINT_REQUEST)\n const { constraint, value } = payload;\n const selectedRobotPartId = yield select(getSelectedRobotPartId);\n \n yield call(updateConstraint, selectedRobotPartId, constraint, value);\n threeProcessor.updatePartConstraint(selectedRobotPartId, constraint, value);\n\n yield put(updateSelectedRobotPartConstraintSuccess(selectedRobotPartId, constraint, value));\n } catch (error) {\n yield put({ type: ROBOT_PART_UPDATE_CONSTRAINT_ERROR, error });\n yield call(toast.error, ROBOT_PART_UPDATE_CONSTRAINT_ERROR_MESSAGE);\n }\n }\n}\n\nfunction* updateConstraint(robotPartId, constraint, value) {\n yield call(apiPatch, '/Robot/Part/Constraint', {\n id: robotPartId,\n constraint,\n value,\n });\n}\n","\nimport {\n call,\n put,\n select,\n} from 'redux-saga/effects';\n\nimport { apiGet, apiPost } from '../../../../common/utils/saga-utils';\n\nimport {\n getSelectedPartId,\n} from '../../../catalog/selectors';\n\nimport {\n createRobotPartSuccess,\n} from '../../actions';\n\nimport {\n getCurrentRobotId,\n getPotentialParents,\n} from '../../selectors';\n\nimport addPartToWorkspaceSaga from '../addPartToWorkspaceSaga';\n\nexport function* createChildPartSaga(threeProcessor) {\n const potentialParents = yield select(getPotentialParents);\n const parentRobotPart = potentialParents[0];\n const attachments = parentRobotPart.part.attachments.toModelArray();\n const partId = yield select(getSelectedPartId);\n const robotId = yield select(getCurrentRobotId);\n const parentRobotPartId = parentRobotPart.id;\n\n const id = yield call(apiPost, '/Robot/Part', {\n robotId,\n partId,\n parentRobotPartId,\n attachmentId: Boolean(attachments && attachments.length) ? attachments[0].id : null,\n });\n\n const newPart = yield call(apiGet, `/Robot/Part/${id}`);\n\n yield put(createRobotPartSuccess(newPart));\n yield call(addPartToWorkspaceSaga, id, threeProcessor);\n}\n","\nimport {\n call,\n put,\n select,\n} from 'redux-saga/effects';\n\nimport { apiGet, apiPost } from '../../../../common/utils/saga-utils';\n\nimport {\n getSelectedPartId,\n} from '../../../catalog/selectors';\n\nimport {\n getCurrentRobotId,\n} from '../../selectors';\n\nimport {\n createRobotPartSuccess,\n} from '../../actions';\n\nimport addPartToWorkspaceSaga from '../addPartToWorkspaceSaga';\n\nexport function* createRootPartSaga(threeProcessor) {\n const partId = yield select(getSelectedPartId);\n const robotId = yield select(getCurrentRobotId);\n\n const id = yield call(apiPost, '/Robot/Part', {\n robotId,\n partId,\n });\n\n const newPart = yield call(apiGet, `/Robot/Part/${id}`);\n\n yield put(createRobotPartSuccess(newPart));\n yield call(addPartToWorkspaceSaga, id, threeProcessor);\n}\n","\nimport {\n call,\n put,\n} from 'redux-saga/effects';\n\nimport { toast } from 'react-toastify';\n\nimport {\n ADD_PART_TO_WORKSPACE_ERROR,\n ADD_PART_TO_WORKSPACE_NOT_SUPPORTED_MESSAGE,\n} from '../../actions';\n\nexport function* ensurePotentialParentSelectedBeforeCreationSaga() {\n // TODO: Version 1.0+\n // If Multiple potential parents, wait for user to select one, validate, and continue\n yield put({ type: ADD_PART_TO_WORKSPACE_ERROR });\n yield call(toast.error, ADD_PART_TO_WORKSPACE_NOT_SUPPORTED_MESSAGE);\n}","import {\n call,\n select,\n} from 'redux-saga/effects';\n\nimport {\n getPotentialParents,\n} from '../../selectors';\n\nimport { createChildPartSaga } from './createChildPartSaga';\nimport { createRootPartSaga } from './createRootPartSaga';\nimport { ensurePotentialParentSelectedBeforeCreationSaga } from './ensurePotentialParentSelectedBeforeCreationSaga';\n\nexport default function* placePartSaga(threeProcessor) {\n const potentialParents = yield select(getPotentialParents);\n const numberOfPotentialParents = potentialParents.length;\n\n if (numberOfPotentialParents === 0) {\n yield call(createRootPartSaga, threeProcessor);\n } else if (numberOfPotentialParents === 1) {\n yield call(createChildPartSaga, threeProcessor);\n } else {\n yield call(ensurePotentialParentSelectedBeforeCreationSaga);\n }\n}\n","import {\n call,\n put,\n select,\n} from 'redux-saga/effects';\n\nimport { apiGet, apiPut } from '../../../../common/utils/saga-utils';\n\nimport {\n getSelectedPart,\n} from '../../../catalog/selectors';\n\nimport {\n setCurrentRobotPart,\n setPlacementMode,\n replaceRobotPartSuccess,\n replaceRobotPartRequest,\n} from '../../actions';\n\nimport {\n getSelectedRobotPart,\n getCurrentRobotPartWorkspaceArguments,\n} from '../../selectors';\n\nexport default function* replacePartSaga(threeProcessor) {\n const partToReplace = yield select(getSelectedRobotPart);\n const replaceWithPart = yield select(getSelectedPart);\n\n yield call(apiPut, '/Robot/Part', {\n replaceRobotPartId: partToReplace.id,\n withPartId: replaceWithPart.id,\n });\n\n const newPart = yield call(apiGet, `/Robot/Part/${partToReplace.id}`);\n yield put(replaceRobotPartRequest(partToReplace.id, newPart))\n yield put(setCurrentRobotPart(partToReplace.id));\n const args = yield select(getCurrentRobotPartWorkspaceArguments);\n\n yield call(threeProcessor.replacePart, partToReplace, args);\n\n yield put(setPlacementMode('place'));\n yield put(replaceRobotPartSuccess());\n}\n","import placePartSaga from './placePartSaga';\nimport replacePartSaga from './replacePartSaga';\n\nexport default {\n place: {\n createPart: placePartSaga,\n },\n replace: {\n createPart: replacePartSaga,\n },\n};\n","import {\n call,\n put,\n select,\n take,\n} from 'redux-saga/effects';\nimport { toast } from 'react-toastify';\n\nimport {\n ADD_PART_TO_WORKSPACE_REQUEST,\n ADD_PART_TO_WORKSPACE_ERROR,\n ADD_PART_TO_WORKSPACE_ERROR_MESSAGE,\n addPartToWorkspaceSuccess,\n setSceneLoaded,\n} from '../actions';\n\nimport {\n getPlacementMode,\n} from '../selectors';\n\nimport {\n selectPart,\n} from '../../catalog/actions';\n\nimport createPartStrategy from './createPart/strategies';\n\nexport default function* addPartToWorkspaceWatcher(threeProcessor) {\n while (true) {\n try {\n const { payload } = yield take(ADD_PART_TO_WORKSPACE_REQUEST);\n const { id } = payload;\n\n yield put(selectPart(id));\n \n const placementMode = yield select(getPlacementMode);\n const { createPart } = createPartStrategy[placementMode];\n yield call(createPart, threeProcessor);\n yield put(addPartToWorkspaceSuccess());\n yield put(setSceneLoaded(true));\n }\n catch (error) {\n yield put({ type: ADD_PART_TO_WORKSPACE_ERROR, error });\n yield call(toast.error, ADD_PART_TO_WORKSPACE_ERROR_MESSAGE);\n }\n }\n}\n","import {\n fork,\n} from 'redux-saga/effects';\n\nimport configureCanvasWatcher, { createCanvas } from './configureCanvasWatcher';\nimport resetCameraWatcher from './resetCameraWatcher';\nimport loadRobotWatcher from './loadRobotWatcher';\nimport exportRobotWatcher from './exportRobotWatcher';\nimport createRobotWatcher from './createRobotWatcher';\nimport removeRobotPartWatcher from './removeRobotPartWatcher';\nimport selectRobotPartWatcher from './selectRobotPartWatcher';\nimport activateTestDriveWatcher from './activateTestDriveWatcher';\nimport deactivateTestDriveWatcher from './deactivateTestDriveWatcher';\nimport configurePartWatcher from './configurePartWatcher';\nimport addPartToWorkspaceWatcher from './addPartToWorkspaceWatcher';\n\nexport default function* root() {\n const { threeProcessor } = createCanvas();\n yield fork(addPartToWorkspaceWatcher, threeProcessor);\n yield fork(configureCanvasWatcher);\n yield fork(resetCameraWatcher, threeProcessor);\n yield fork(loadRobotWatcher, threeProcessor);\n yield fork(activateTestDriveWatcher, threeProcessor);\n yield fork(deactivateTestDriveWatcher, threeProcessor);\n yield fork(createRobotWatcher);\n yield fork(exportRobotWatcher);\n yield fork(removeRobotPartWatcher, threeProcessor);\n yield fork(selectRobotPartWatcher);\n yield fork(configurePartWatcher, threeProcessor);\n}\n","import {\n put,\n throttle,\n} from 'redux-saga/effects';\n\nimport {\n POPPER_UPDATE_REQUEST,\n updatePopperSuccess,\n} from '../actions';\n\nexport default function* updatePopperSaga() {\n yield throttle(15, POPPER_UPDATE_REQUEST, updatePopper);\n}\n\nfunction* updatePopper(action) {\n const { payload } = action;\n const { location, popperProps } = payload;\n\n yield put(updatePopperSuccess(location, popperProps));\n}\n","import {\n fork,\n} from 'redux-saga/effects';\n\nimport updatePopperSaga from './updatePopperSaga';\n\nexport default function* root() {\n yield fork(updatePopperSaga);\n}\n","import {\n call,\n put,\n select,\n take,\n} from 'redux-saga/effects';\n\nimport { toast } from 'react-toastify';\n\nimport { apiPost } from '../../../common/utils/saga-utils';\n\nimport {\n SUBMIT_QUOTE_REQUEST,\n SUBMIT_QUOTE_SUCCESS,\n SUBMIT_QUOTE_SUCCESS_MESSAGE,\n SUBMIT_QUOTE_ERROR,\n SUBMIT_QUOTE_ERROR_MESSAGE,\n} from '../actions';\n\nimport {\n getCurrentRobotId,\n} from '../../configurator/selectors';\n\nexport default function* submitQuoteWatcher() {\n while (true) {\n try {\n const { payload } = yield take(SUBMIT_QUOTE_REQUEST);\n\n const robotId = yield select(getCurrentRobotId);\n if (!robotId) {\n return;\n }\n\n const {\n quote, \n setSubmitting,\n resetForm,\n } = payload;\n\n yield call(submitQuote, robotId, quote, setSubmitting, resetForm);\n } catch (error) {\n yield call(handleError, error);\n }\n }\n}\n\nfunction* submitQuote(robotId, quote, setSubmitting, resetForm) {\n try {\n yield call(apiPost, '/Quote', {\n robotId,\n ...quote,\n });\n\n resetForm();\n\n yield call(toast.success, SUBMIT_QUOTE_SUCCESS_MESSAGE);\n yield put({ type: SUBMIT_QUOTE_SUCCESS });\n } catch (error) {\n yield call(handleError, error);\n }\n\n setSubmitting(false);\n}\n\nfunction* handleError(error) {\n yield put({ type: SUBMIT_QUOTE_ERROR, payload: { error } });\n yield call(toast.error, SUBMIT_QUOTE_ERROR_MESSAGE);\n}\n","import {\n fork,\n} from 'redux-saga/effects';\n\nimport submitQuoteWatcher from './submitQuoteWatcher';\n\nexport default function* root() {\n yield fork(submitQuoteWatcher);\n}\n","import { all } from 'redux-saga/effects';\n\nimport CatalogSaga from '../features/catalog/sagas/catalogSaga';\nimport ConfiguratorSaga from '../features/configurator/sagas/configuratorSaga';\nimport PopperSaga from '../features/poppers/sagas/popperSaga';\nimport RequestQuoteSaga from '../features/request-quote/sagas';\n\nexport default function* () {\n yield all([\n CatalogSaga(),\n ConfiguratorSaga(),\n PopperSaga(),\n RequestQuoteSaga(),\n ]);\n};\n","import { createMuiTheme } from '@material-ui/core/styles';\n\nimport {\n typography,\n zIndex,\n} from './variables';\n\nlet theme = createMuiTheme({\n typography: {\n ...typography,\n color: '#474642',\n },\n zIndex,\n palette: {\n primary: {\n light: '#FF5D35',\n main: '#C82506',\n dark: '#8F0000',\n contrastText: '#fff',\n },\n secondary: {\n light: '#9cffe1',\n main: '#64F8AF',\n dark: '#1dc47f',\n contrastText: '#1D1D1D',\n },\n neutral: {\n light: {\n color: '#F1F1EF',\n contrastText: '#1D1D1D',\n },\n main: {\n color: '#D3D3CE',\n contrastText: '#1D1D1D',\n },\n dark: {\n color: '#B5B4AE',\n contrastText: '#1D1D1D',\n },\n darker: {\n color: '#6F6E68',\n contrastText: '#FFFFFF',\n },\n darkest: {\n color: '#474642',\n contrastText: '#FFFFFF',\n },\n workspace: {\n color: '#919191',\n contrastText: '#FFFFFF',\n },\n },\n accent: {\n accent1: {\n color: '#DCD521',\n contrastText: '#1D1D1D'\n },\n accent2: {\n color: '#F79205',\n contrastText: '#1D1D1D'\n },\n accent3: {\n color: '#05CE0B',\n contrastText: '#1D1D1D'\n },\n },\n status: {\n danger: {\n color: '#F80B0B',\n contrastText: '#1D1D1D',\n },\n warning: {\n color: '#F79205',\n contrastText: '#1D1D1D',\n },\n success: {\n color: '#05CE0B',\n contrastText: '#1D1D1D',\n },\n },\n text: {\n primary: '#474642',\n secondary: '#C82506',\n },\n },\n});\n\ntheme = {\n ...theme,\n overrides: {\n MuiAppBar: {\n colorDefault: theme.palette.neutral.darker,\n root: {\n backgroundColor: 'white',\n },\n },\n MuiFormLabel: {\n root: {\n color: theme.palette.neutral.darkest.color,\n },\n },\n MuiFormHelperText: {\n root: {\n color: theme.palette.neutral.darkest.color,\n },\n }\n },\n};\n\nexport default theme;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read http://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit http://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See http://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { MuiThemeProvider } from '@material-ui/core/styles';\nimport { Provider } from 'react-redux';\nimport { PersistGate } from 'redux-persist/lib/integration/react';\nimport { ConnectedRouter } from 'connected-react-router';\n\nimport './index.css';\nimport App from './app/App';\nimport store, { history, persistor, sagaMiddleware } from './app/store';\nimport sagas from './app/saga';\nimport theme from './common/themes/material-theme';\n\nimport * as serviceWorker from './serviceWorker';\n\nsagaMiddleware.run(sagas);\n\nconst render = Component => {\n ReactDOM.render(\n \n \n \n \n \n \n \n \n ,\n document.getElementById('root')\n )\n};\n\nrender(App);\n\nif (module.hot) {\n module.hot.accept('./app/App', () => {\n const NextApp = require('./app/App').default;\n render(NextApp);\n });\n}\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: http://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}