Compare commits
	
		
			No commits in common. "useCaseDrivenRefact" and "master" have entirely different histories.
		
	
	
		
			useCaseDri
			...
			master
		
	
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -1,2 +1 @@
 | 
				
			|||||||
node_modules
 | 
					node_modules
 | 
				
			||||||
dist
 | 
					 | 
				
			||||||
							
								
								
									
										18
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								README.md
									
									
									
									
									
								
							@ -1 +1,19 @@
 | 
				
			|||||||
# 🐱Cat 🔫Cannon
 | 
					# 🐱Cat 🔫Cannon
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The Cat Cannon is an automatically aiming water cannon designed to keep cats out of any location in which there presence is not desired. This solution is built on top of the Raspberry Pi driven by TypeScript and very little Python.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Software Setup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Clone this repo and navigate to its saved directory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    npm install
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ts-node ./src/Robitics/main.ts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    open a browser at http://localhost:5005
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    wait for cat to enter view of camera
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    what the machine protect your assets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										12
									
								
								dist/Vision/index.html
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								dist/Vision/index.html
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					<!DOCTYPE html>
 | 
				
			||||||
 | 
					<html>
 | 
				
			||||||
 | 
					  <head>
 | 
				
			||||||
 | 
					    <title>Cat Cannon</title>
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="styles.css">
 | 
				
			||||||
 | 
					  </head>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <body>
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <script src="main.js" defer></script>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										3
									
								
								dist/Vision/main.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								dist/Vision/main.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										149
									
								
								dist/Vision/main.js.LICENSE.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								dist/Vision/main.js.LICENSE.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,149 @@
 | 
				
			|||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @license
 | 
				
			||||||
 | 
					 * Copyright 2017 Google LLC. All Rights Reserved.
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 * =============================================================================
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @license
 | 
				
			||||||
 | 
					 * Copyright 2018 Google LLC
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Use of this source code is governed by an MIT-style
 | 
				
			||||||
 | 
					 * license that can be found in the LICENSE file or at
 | 
				
			||||||
 | 
					 * https://opensource.org/licenses/MIT.
 | 
				
			||||||
 | 
					 * =============================================================================
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @license
 | 
				
			||||||
 | 
					 * Copyright 2018 Google LLC. All Rights Reserved.
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * =============================================================================
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @license
 | 
				
			||||||
 | 
					 * Copyright 2018 Google LLC. All Rights Reserved.
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 * =============================================================================
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @license
 | 
				
			||||||
 | 
					 * Copyright 2019 Google LLC. All Rights Reserved.
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * =============================================================================
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @license
 | 
				
			||||||
 | 
					 * Copyright 2019 Google LLC. All Rights Reserved.
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 * =============================================================================
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @license
 | 
				
			||||||
 | 
					 * Copyright 2020 Google Inc. All Rights Reserved.
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 * =============================================================================
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @license
 | 
				
			||||||
 | 
					 * Copyright 2020 Google LLC. All Rights Reserved.
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 * =============================================================================
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @license
 | 
				
			||||||
 | 
					 * Copyright 2020 Google LLC. All Rights Reserved.
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the License);
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an AS IS BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 * =============================================================================
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** @license See the LICENSE file. */
 | 
				
			||||||
							
								
								
									
										24
									
								
								dist/Vision/styles.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								dist/Vision/styles.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					* {
 | 
				
			||||||
 | 
					  margin: 0;
 | 
				
			||||||
 | 
					  padding: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.PredictedObject {
 | 
				
			||||||
 | 
					  border: 2px solid green;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.predictedObjectLabel {
 | 
				
			||||||
 | 
					  color: white;
 | 
				
			||||||
 | 
					  background-color: green;
 | 
				
			||||||
 | 
					  font-size: 12px;
 | 
				
			||||||
 | 
					  padding: 5px 10px;
 | 
				
			||||||
 | 
					  text-transform: uppercase;
 | 
				
			||||||
 | 
					  font-family:'Segoe UI', Tahoma, Geneva, Verdana, sans-serif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#VideoView {
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  top: 0;
 | 
				
			||||||
 | 
					  left: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										407
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										407
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@ -86,6 +86,49 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-2.8.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-2.8.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-bEYwMeBuiWl+fB5fBmhqwxjjbwBme7KgTDCquOyHoP1P01HZNBAmyJIDCtpqGHBJuGHBOpFga/DBl+9yF7gR6g=="
 | 
					      "integrity": "sha512-bEYwMeBuiWl+fB5fBmhqwxjjbwBme7KgTDCquOyHoP1P01HZNBAmyJIDCtpqGHBJuGHBOpFga/DBl+9yF7gR6g=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/body-parser": {
 | 
				
			||||||
 | 
					      "version": "1.19.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "@types/connect": "*",
 | 
				
			||||||
 | 
					        "@types/node": "*"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/component-emitter": {
 | 
				
			||||||
 | 
					      "version": "1.2.10",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/connect": {
 | 
				
			||||||
 | 
					      "version": "3.4.34",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "@types/node": "*"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/cookie": {
 | 
				
			||||||
 | 
					      "version": "0.4.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/cors": {
 | 
				
			||||||
 | 
					      "version": "2.8.9",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.9.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-zurD1ibz21BRlAOIKP8yhrxlqKx6L9VCwkB5kMiP6nZAhoF5MvC7qS1qPA7nRcr1GJolfkQC7/EAL4hdYejLtg=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/engine.io": {
 | 
				
			||||||
 | 
					      "version": "3.1.5",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/engine.io/-/engine.io-3.1.5.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-DLVpLEGTEZGBXOYoYoagHSxXkDHONc0fZouF2ayw7Q18aRu1Afwci+1CFKvPpouCUOVWP+dmCaAWpQjswe7kpg==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "@types/node": "*"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "@types/eslint": {
 | 
					    "@types/eslint": {
 | 
				
			||||||
      "version": "7.2.6",
 | 
					      "version": "7.2.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz",
 | 
				
			||||||
@ -112,6 +155,29 @@
 | 
				
			|||||||
      "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==",
 | 
					      "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/express": {
 | 
				
			||||||
 | 
					      "version": "4.17.11",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "@types/body-parser": "*",
 | 
				
			||||||
 | 
					        "@types/express-serve-static-core": "^4.17.18",
 | 
				
			||||||
 | 
					        "@types/qs": "*",
 | 
				
			||||||
 | 
					        "@types/serve-static": "*"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/express-serve-static-core": {
 | 
				
			||||||
 | 
					      "version": "4.17.18",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.18.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-m4JTwx5RUBNZvky/JJ8swEJPKFd8si08pPF2PfizYjGZOKr/svUWPcoUmLow6MmPzhasphB7gSTINY67xn3JNA==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "@types/node": "*",
 | 
				
			||||||
 | 
					        "@types/qs": "*",
 | 
				
			||||||
 | 
					        "@types/range-parser": "*"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "@types/glob": {
 | 
					    "@types/glob": {
 | 
				
			||||||
      "version": "7.1.3",
 | 
					      "version": "7.1.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
 | 
				
			||||||
@ -128,6 +194,12 @@
 | 
				
			|||||||
      "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
 | 
					      "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/mime": {
 | 
				
			||||||
 | 
					      "version": "1.3.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==",
 | 
				
			||||||
 | 
					      "dev": true
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "@types/minimatch": {
 | 
					    "@types/minimatch": {
 | 
				
			||||||
      "version": "3.0.3",
 | 
					      "version": "3.0.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
 | 
				
			||||||
@ -153,11 +225,59 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q=="
 | 
					      "integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/qs": {
 | 
				
			||||||
 | 
					      "version": "6.9.5",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==",
 | 
				
			||||||
 | 
					      "dev": true
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/range-parser": {
 | 
				
			||||||
 | 
					      "version": "1.2.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==",
 | 
				
			||||||
 | 
					      "dev": true
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "@types/seedrandom": {
 | 
					    "@types/seedrandom": {
 | 
				
			||||||
      "version": "2.4.27",
 | 
					      "version": "2.4.27",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.27.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.27.tgz",
 | 
				
			||||||
      "integrity": "sha1-nbVjk33YaRX2kJK8QyWdL0hXjkE="
 | 
					      "integrity": "sha1-nbVjk33YaRX2kJK8QyWdL0hXjkE="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/serve-static": {
 | 
				
			||||||
 | 
					      "version": "1.13.9",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "@types/mime": "^1",
 | 
				
			||||||
 | 
					        "@types/node": "*"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/socket.io": {
 | 
				
			||||||
 | 
					      "version": "2.1.12",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/socket.io/-/socket.io-2.1.12.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-oStc5VFkpb0AsjOxQUj9ztX5Iziatyla/rjZTYbFGoVrrKwd+JU2mtxk7iSl5RGYx9WunLo6UXW1fBzQok/ZyA==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "@types/engine.io": "*",
 | 
				
			||||||
 | 
					        "@types/node": "*",
 | 
				
			||||||
 | 
					        "@types/socket.io-parser": "*"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/socket.io-client": {
 | 
				
			||||||
 | 
					      "version": "1.4.35",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/socket.io-client/-/socket.io-client-1.4.35.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-MI8YmxFS+jMkIziycT5ickBWK1sZwDwy16mgH/j99Mcom6zRG/NimNGQ3vJV0uX5G6g/hEw0FG3w3b3sT5OUGw==",
 | 
				
			||||||
 | 
					      "dev": true
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/socket.io-parser": {
 | 
				
			||||||
 | 
					      "version": "2.2.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/socket.io-parser/-/socket.io-parser-2.2.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-+JNb+7N7tSINyXPxAJb62+NcpC1x/fPn7z818W4xeNCdPTp6VsO/X8fCsg6+ug4a56m1v9sEiTIIUKVupcHOFQ==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "@types/node": "*"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "@types/webgl-ext": {
 | 
					    "@types/webgl-ext": {
 | 
				
			||||||
      "version": "0.0.30",
 | 
					      "version": "0.0.30",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/webgl-ext/-/webgl-ext-0.0.30.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/webgl-ext/-/webgl-ext-0.0.30.tgz",
 | 
				
			||||||
@ -374,7 +494,6 @@
 | 
				
			|||||||
      "version": "1.3.7",
 | 
					      "version": "1.3.7",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
 | 
				
			||||||
      "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
 | 
					      "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "mime-types": "~2.1.24",
 | 
					        "mime-types": "~2.1.24",
 | 
				
			||||||
        "negotiator": "0.6.2"
 | 
					        "negotiator": "0.6.2"
 | 
				
			||||||
@ -650,6 +769,11 @@
 | 
				
			|||||||
      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
 | 
					      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "backo2": {
 | 
				
			||||||
 | 
					      "version": "1.0.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "balanced-match": {
 | 
					    "balanced-match": {
 | 
				
			||||||
      "version": "1.0.0",
 | 
					      "version": "1.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
 | 
				
			||||||
@ -711,6 +835,16 @@
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "base64-arraybuffer": {
 | 
				
			||||||
 | 
					      "version": "0.1.4",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "base64id": {
 | 
				
			||||||
 | 
					      "version": "2.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "batch": {
 | 
					    "batch": {
 | 
				
			||||||
      "version": "0.6.1",
 | 
					      "version": "0.6.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
 | 
				
			||||||
@ -743,7 +877,6 @@
 | 
				
			|||||||
      "version": "1.19.0",
 | 
					      "version": "1.19.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
 | 
					      "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "bytes": "3.1.0",
 | 
					        "bytes": "3.1.0",
 | 
				
			||||||
        "content-type": "~1.0.4",
 | 
					        "content-type": "~1.0.4",
 | 
				
			||||||
@ -760,14 +893,12 @@
 | 
				
			|||||||
        "bytes": {
 | 
					        "bytes": {
 | 
				
			||||||
          "version": "3.1.0",
 | 
					          "version": "3.1.0",
 | 
				
			||||||
          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
 | 
					          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
 | 
				
			||||||
          "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
 | 
					          "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
 | 
				
			||||||
          "dev": true
 | 
					 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "debug": {
 | 
					        "debug": {
 | 
				
			||||||
          "version": "2.6.9",
 | 
					          "version": "2.6.9",
 | 
				
			||||||
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
 | 
					          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
 | 
				
			||||||
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
 | 
					          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
 | 
				
			||||||
          "dev": true,
 | 
					 | 
				
			||||||
          "requires": {
 | 
					          "requires": {
 | 
				
			||||||
            "ms": "2.0.0"
 | 
					            "ms": "2.0.0"
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@ -1063,8 +1194,7 @@
 | 
				
			|||||||
    "component-emitter": {
 | 
					    "component-emitter": {
 | 
				
			||||||
      "version": "1.3.0",
 | 
					      "version": "1.3.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
 | 
					      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "compressible": {
 | 
					    "compressible": {
 | 
				
			||||||
      "version": "2.0.18",
 | 
					      "version": "2.0.18",
 | 
				
			||||||
@ -1117,7 +1247,6 @@
 | 
				
			|||||||
      "version": "0.5.3",
 | 
					      "version": "0.5.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
 | 
				
			||||||
      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
 | 
					      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "safe-buffer": "5.1.2"
 | 
					        "safe-buffer": "5.1.2"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@ -1125,20 +1254,17 @@
 | 
				
			|||||||
    "content-type": {
 | 
					    "content-type": {
 | 
				
			||||||
      "version": "1.0.4",
 | 
					      "version": "1.0.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
 | 
				
			||||||
      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
 | 
					      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "cookie": {
 | 
					    "cookie": {
 | 
				
			||||||
      "version": "0.4.0",
 | 
					      "version": "0.4.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
 | 
					      "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "cookie-signature": {
 | 
					    "cookie-signature": {
 | 
				
			||||||
      "version": "1.0.6",
 | 
					      "version": "1.0.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
 | 
				
			||||||
      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
 | 
					      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "copy-descriptor": {
 | 
					    "copy-descriptor": {
 | 
				
			||||||
      "version": "0.1.1",
 | 
					      "version": "0.1.1",
 | 
				
			||||||
@ -1157,6 +1283,15 @@
 | 
				
			|||||||
      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
 | 
					      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "cors": {
 | 
				
			||||||
 | 
					      "version": "2.8.5",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "object-assign": "^4",
 | 
				
			||||||
 | 
					        "vary": "^1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "cross-spawn": {
 | 
					    "cross-spawn": {
 | 
				
			||||||
      "version": "6.0.5",
 | 
					      "version": "6.0.5",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
 | 
				
			||||||
@ -1182,7 +1317,6 @@
 | 
				
			|||||||
      "version": "4.3.1",
 | 
					      "version": "4.3.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
 | 
					      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "ms": "2.1.2"
 | 
					        "ms": "2.1.2"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
@ -1190,8 +1324,7 @@
 | 
				
			|||||||
        "ms": {
 | 
					        "ms": {
 | 
				
			||||||
          "version": "2.1.2",
 | 
					          "version": "2.1.2",
 | 
				
			||||||
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
 | 
					          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
 | 
				
			||||||
          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
 | 
					          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
 | 
				
			||||||
          "dev": true
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@ -1304,14 +1437,12 @@
 | 
				
			|||||||
    "depd": {
 | 
					    "depd": {
 | 
				
			||||||
      "version": "1.1.2",
 | 
					      "version": "1.1.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
 | 
				
			||||||
      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
 | 
					      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "destroy": {
 | 
					    "destroy": {
 | 
				
			||||||
      "version": "1.0.4",
 | 
					      "version": "1.0.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
 | 
				
			||||||
      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
 | 
					      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "detect-node": {
 | 
					    "detect-node": {
 | 
				
			||||||
      "version": "2.0.4",
 | 
					      "version": "2.0.4",
 | 
				
			||||||
@ -1347,8 +1478,7 @@
 | 
				
			|||||||
    "ee-first": {
 | 
					    "ee-first": {
 | 
				
			||||||
      "version": "1.1.1",
 | 
					      "version": "1.1.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
 | 
				
			||||||
      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
 | 
					      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "electron-to-chromium": {
 | 
					    "electron-to-chromium": {
 | 
				
			||||||
      "version": "1.3.633",
 | 
					      "version": "1.3.633",
 | 
				
			||||||
@ -1370,8 +1500,7 @@
 | 
				
			|||||||
    "encodeurl": {
 | 
					    "encodeurl": {
 | 
				
			||||||
      "version": "1.0.2",
 | 
					      "version": "1.0.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
 | 
				
			||||||
      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
 | 
					      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "end-of-stream": {
 | 
					    "end-of-stream": {
 | 
				
			||||||
      "version": "1.4.4",
 | 
					      "version": "1.4.4",
 | 
				
			||||||
@ -1382,6 +1511,64 @@
 | 
				
			|||||||
        "once": "^1.4.0"
 | 
					        "once": "^1.4.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "engine.io": {
 | 
				
			||||||
 | 
					      "version": "4.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-vW7EAtn0HDQ4MtT5QbmCHF17TaYLONv2/JwdYsq9USPRZVM4zG7WB3k0Nc321z8EuSOlhGokrYlYx4176QhD0A==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "accepts": "~1.3.4",
 | 
				
			||||||
 | 
					        "base64id": "2.0.0",
 | 
				
			||||||
 | 
					        "cookie": "~0.4.1",
 | 
				
			||||||
 | 
					        "cors": "~2.8.5",
 | 
				
			||||||
 | 
					        "debug": "~4.3.1",
 | 
				
			||||||
 | 
					        "engine.io-parser": "~4.0.0",
 | 
				
			||||||
 | 
					        "ws": "~7.4.2"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "cookie": {
 | 
				
			||||||
 | 
					          "version": "0.4.1",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "ws": {
 | 
				
			||||||
 | 
					          "version": "7.4.2",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA=="
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "engine.io-client": {
 | 
				
			||||||
 | 
					      "version": "4.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-4.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-OUmn4m71/lW3ixICv4h3DuBRuh3ri0w3cDuepjsrINSbbqbni4Xw1shTFiKhl0v58lEtNpwJTpSKJJ3fondu5Q==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "base64-arraybuffer": "0.1.4",
 | 
				
			||||||
 | 
					        "component-emitter": "~1.3.0",
 | 
				
			||||||
 | 
					        "debug": "~4.3.1",
 | 
				
			||||||
 | 
					        "engine.io-parser": "~4.0.1",
 | 
				
			||||||
 | 
					        "has-cors": "1.1.0",
 | 
				
			||||||
 | 
					        "parseqs": "0.0.6",
 | 
				
			||||||
 | 
					        "parseuri": "0.0.6",
 | 
				
			||||||
 | 
					        "ws": "~7.4.2",
 | 
				
			||||||
 | 
					        "xmlhttprequest-ssl": "~1.5.4",
 | 
				
			||||||
 | 
					        "yeast": "0.1.2"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "ws": {
 | 
				
			||||||
 | 
					          "version": "7.4.2",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA=="
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "engine.io-parser": {
 | 
				
			||||||
 | 
					      "version": "4.0.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "base64-arraybuffer": "0.1.4"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "enhanced-resolve": {
 | 
					    "enhanced-resolve": {
 | 
				
			||||||
      "version": "4.3.0",
 | 
					      "version": "4.3.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz",
 | 
				
			||||||
@ -1463,8 +1650,7 @@
 | 
				
			|||||||
    "escape-html": {
 | 
					    "escape-html": {
 | 
				
			||||||
      "version": "1.0.3",
 | 
					      "version": "1.0.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
 | 
				
			||||||
      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
 | 
					      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "escape-string-regexp": {
 | 
					    "escape-string-regexp": {
 | 
				
			||||||
      "version": "1.0.5",
 | 
					      "version": "1.0.5",
 | 
				
			||||||
@ -1508,8 +1694,7 @@
 | 
				
			|||||||
    "etag": {
 | 
					    "etag": {
 | 
				
			||||||
      "version": "1.8.1",
 | 
					      "version": "1.8.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
 | 
				
			||||||
      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
 | 
					      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "eventemitter3": {
 | 
					    "eventemitter3": {
 | 
				
			||||||
      "version": "4.0.7",
 | 
					      "version": "4.0.7",
 | 
				
			||||||
@ -1595,7 +1780,6 @@
 | 
				
			|||||||
      "version": "4.17.1",
 | 
					      "version": "4.17.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
 | 
					      "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "accepts": "~1.3.7",
 | 
					        "accepts": "~1.3.7",
 | 
				
			||||||
        "array-flatten": "1.1.1",
 | 
					        "array-flatten": "1.1.1",
 | 
				
			||||||
@ -1632,14 +1816,12 @@
 | 
				
			|||||||
        "array-flatten": {
 | 
					        "array-flatten": {
 | 
				
			||||||
          "version": "1.1.1",
 | 
					          "version": "1.1.1",
 | 
				
			||||||
          "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
 | 
					          "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
 | 
				
			||||||
          "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
 | 
					          "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
 | 
				
			||||||
          "dev": true
 | 
					 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "debug": {
 | 
					        "debug": {
 | 
				
			||||||
          "version": "2.6.9",
 | 
					          "version": "2.6.9",
 | 
				
			||||||
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
 | 
					          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
 | 
				
			||||||
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
 | 
					          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
 | 
				
			||||||
          "dev": true,
 | 
					 | 
				
			||||||
          "requires": {
 | 
					          "requires": {
 | 
				
			||||||
            "ms": "2.0.0"
 | 
					            "ms": "2.0.0"
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@ -1779,7 +1961,6 @@
 | 
				
			|||||||
      "version": "1.1.2",
 | 
					      "version": "1.1.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
 | 
					      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "debug": "2.6.9",
 | 
					        "debug": "2.6.9",
 | 
				
			||||||
        "encodeurl": "~1.0.2",
 | 
					        "encodeurl": "~1.0.2",
 | 
				
			||||||
@ -1794,7 +1975,6 @@
 | 
				
			|||||||
          "version": "2.6.9",
 | 
					          "version": "2.6.9",
 | 
				
			||||||
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
 | 
					          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
 | 
				
			||||||
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
 | 
					          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
 | 
				
			||||||
          "dev": true,
 | 
					 | 
				
			||||||
          "requires": {
 | 
					          "requires": {
 | 
				
			||||||
            "ms": "2.0.0"
 | 
					            "ms": "2.0.0"
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@ -1836,8 +2016,7 @@
 | 
				
			|||||||
    "forwarded": {
 | 
					    "forwarded": {
 | 
				
			||||||
      "version": "0.1.2",
 | 
					      "version": "0.1.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
 | 
				
			||||||
      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
 | 
					      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "fragment-cache": {
 | 
					    "fragment-cache": {
 | 
				
			||||||
      "version": "0.2.1",
 | 
					      "version": "0.2.1",
 | 
				
			||||||
@ -1851,8 +2030,7 @@
 | 
				
			|||||||
    "fresh": {
 | 
					    "fresh": {
 | 
				
			||||||
      "version": "0.5.2",
 | 
					      "version": "0.5.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
 | 
				
			||||||
      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
 | 
					      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "fs.realpath": {
 | 
					    "fs.realpath": {
 | 
				
			||||||
      "version": "1.0.0",
 | 
					      "version": "1.0.0",
 | 
				
			||||||
@ -1991,6 +2169,11 @@
 | 
				
			|||||||
        "function-bind": "^1.1.1"
 | 
					        "function-bind": "^1.1.1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "has-cors": {
 | 
				
			||||||
 | 
					      "version": "1.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "has-flag": {
 | 
					    "has-flag": {
 | 
				
			||||||
      "version": "4.0.0",
 | 
					      "version": "4.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
 | 
				
			||||||
@ -2082,7 +2265,6 @@
 | 
				
			|||||||
      "version": "1.7.2",
 | 
					      "version": "1.7.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
 | 
					      "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "depd": "~1.1.2",
 | 
					        "depd": "~1.1.2",
 | 
				
			||||||
        "inherits": "2.0.3",
 | 
					        "inherits": "2.0.3",
 | 
				
			||||||
@ -2094,8 +2276,7 @@
 | 
				
			|||||||
        "inherits": {
 | 
					        "inherits": {
 | 
				
			||||||
          "version": "2.0.3",
 | 
					          "version": "2.0.3",
 | 
				
			||||||
          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
 | 
					          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
 | 
				
			||||||
          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
 | 
					          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
 | 
				
			||||||
          "dev": true
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@ -2243,7 +2424,6 @@
 | 
				
			|||||||
      "version": "0.4.24",
 | 
					      "version": "0.4.24",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
 | 
				
			||||||
      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
 | 
					      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "safer-buffer": ">= 2.1.2 < 3"
 | 
					        "safer-buffer": ">= 2.1.2 < 3"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@ -2359,8 +2539,7 @@
 | 
				
			|||||||
    "ipaddr.js": {
 | 
					    "ipaddr.js": {
 | 
				
			||||||
      "version": "1.9.1",
 | 
					      "version": "1.9.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
 | 
					      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "is-absolute-url": {
 | 
					    "is-absolute-url": {
 | 
				
			||||||
      "version": "3.0.3",
 | 
					      "version": "3.0.3",
 | 
				
			||||||
@ -2697,8 +2876,7 @@
 | 
				
			|||||||
    "media-typer": {
 | 
					    "media-typer": {
 | 
				
			||||||
      "version": "0.3.0",
 | 
					      "version": "0.3.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
 | 
				
			||||||
      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
 | 
					      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "memory-fs": {
 | 
					    "memory-fs": {
 | 
				
			||||||
      "version": "0.5.0",
 | 
					      "version": "0.5.0",
 | 
				
			||||||
@ -2713,8 +2891,7 @@
 | 
				
			|||||||
    "merge-descriptors": {
 | 
					    "merge-descriptors": {
 | 
				
			||||||
      "version": "1.0.1",
 | 
					      "version": "1.0.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
 | 
				
			||||||
      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
 | 
					      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "merge-stream": {
 | 
					    "merge-stream": {
 | 
				
			||||||
      "version": "2.0.0",
 | 
					      "version": "2.0.0",
 | 
				
			||||||
@ -2725,8 +2902,7 @@
 | 
				
			|||||||
    "methods": {
 | 
					    "methods": {
 | 
				
			||||||
      "version": "1.1.2",
 | 
					      "version": "1.1.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
 | 
				
			||||||
      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
 | 
					      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "micromatch": {
 | 
					    "micromatch": {
 | 
				
			||||||
      "version": "4.0.2",
 | 
					      "version": "4.0.2",
 | 
				
			||||||
@ -2741,8 +2917,7 @@
 | 
				
			|||||||
    "mime": {
 | 
					    "mime": {
 | 
				
			||||||
      "version": "1.6.0",
 | 
					      "version": "1.6.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
 | 
					      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "mime-db": {
 | 
					    "mime-db": {
 | 
				
			||||||
      "version": "1.45.0",
 | 
					      "version": "1.45.0",
 | 
				
			||||||
@ -2817,8 +2992,7 @@
 | 
				
			|||||||
    "ms": {
 | 
					    "ms": {
 | 
				
			||||||
      "version": "2.0.0",
 | 
					      "version": "2.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
 | 
				
			||||||
      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
 | 
					      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "multicast-dns": {
 | 
					    "multicast-dns": {
 | 
				
			||||||
      "version": "6.2.3",
 | 
					      "version": "6.2.3",
 | 
				
			||||||
@ -2865,8 +3039,7 @@
 | 
				
			|||||||
    "negotiator": {
 | 
					    "negotiator": {
 | 
				
			||||||
      "version": "0.6.2",
 | 
					      "version": "0.6.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
 | 
					      "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "neo-async": {
 | 
					    "neo-async": {
 | 
				
			||||||
      "version": "2.6.2",
 | 
					      "version": "2.6.2",
 | 
				
			||||||
@ -2915,8 +3088,7 @@
 | 
				
			|||||||
    "object-assign": {
 | 
					    "object-assign": {
 | 
				
			||||||
      "version": "4.1.1",
 | 
					      "version": "4.1.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
 | 
				
			||||||
      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
 | 
					      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "object-copy": {
 | 
					    "object-copy": {
 | 
				
			||||||
      "version": "0.1.0",
 | 
					      "version": "0.1.0",
 | 
				
			||||||
@ -3011,7 +3183,6 @@
 | 
				
			|||||||
      "version": "2.3.0",
 | 
					      "version": "2.3.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
 | 
				
			||||||
      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
 | 
					      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "ee-first": "1.1.1"
 | 
					        "ee-first": "1.1.1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@ -3103,11 +3274,20 @@
 | 
				
			|||||||
      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
 | 
					      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "parseqs": {
 | 
				
			||||||
 | 
					      "version": "0.0.6",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "parseuri": {
 | 
				
			||||||
 | 
					      "version": "0.0.6",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "parseurl": {
 | 
					    "parseurl": {
 | 
				
			||||||
      "version": "1.3.3",
 | 
					      "version": "1.3.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
 | 
				
			||||||
      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
 | 
					      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "pascalcase": {
 | 
					    "pascalcase": {
 | 
				
			||||||
      "version": "0.1.1",
 | 
					      "version": "0.1.1",
 | 
				
			||||||
@ -3154,8 +3334,7 @@
 | 
				
			|||||||
    "path-to-regexp": {
 | 
					    "path-to-regexp": {
 | 
				
			||||||
      "version": "0.1.7",
 | 
					      "version": "0.1.7",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
 | 
				
			||||||
      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
 | 
					      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "picomatch": {
 | 
					    "picomatch": {
 | 
				
			||||||
      "version": "2.2.2",
 | 
					      "version": "2.2.2",
 | 
				
			||||||
@ -3237,7 +3416,6 @@
 | 
				
			|||||||
      "version": "2.0.6",
 | 
					      "version": "2.0.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
 | 
				
			||||||
      "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
 | 
					      "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "forwarded": "~0.1.2",
 | 
					        "forwarded": "~0.1.2",
 | 
				
			||||||
        "ipaddr.js": "1.9.1"
 | 
					        "ipaddr.js": "1.9.1"
 | 
				
			||||||
@ -3268,8 +3446,7 @@
 | 
				
			|||||||
    "qs": {
 | 
					    "qs": {
 | 
				
			||||||
      "version": "6.7.0",
 | 
					      "version": "6.7.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
 | 
					      "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "querystring": {
 | 
					    "querystring": {
 | 
				
			||||||
      "version": "0.2.0",
 | 
					      "version": "0.2.0",
 | 
				
			||||||
@ -3295,14 +3472,12 @@
 | 
				
			|||||||
    "range-parser": {
 | 
					    "range-parser": {
 | 
				
			||||||
      "version": "1.2.1",
 | 
					      "version": "1.2.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
 | 
					      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "raw-body": {
 | 
					    "raw-body": {
 | 
				
			||||||
      "version": "2.4.0",
 | 
					      "version": "2.4.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
 | 
					      "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "bytes": "3.1.0",
 | 
					        "bytes": "3.1.0",
 | 
				
			||||||
        "http-errors": "1.7.2",
 | 
					        "http-errors": "1.7.2",
 | 
				
			||||||
@ -3313,8 +3488,7 @@
 | 
				
			|||||||
        "bytes": {
 | 
					        "bytes": {
 | 
				
			||||||
          "version": "3.1.0",
 | 
					          "version": "3.1.0",
 | 
				
			||||||
          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
 | 
					          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
 | 
				
			||||||
          "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
 | 
					          "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
 | 
				
			||||||
          "dev": true
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@ -3573,8 +3747,7 @@
 | 
				
			|||||||
    "safe-buffer": {
 | 
					    "safe-buffer": {
 | 
				
			||||||
      "version": "5.1.2",
 | 
					      "version": "5.1.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
 | 
					      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "safe-regex": {
 | 
					    "safe-regex": {
 | 
				
			||||||
      "version": "1.1.0",
 | 
					      "version": "1.1.0",
 | 
				
			||||||
@ -3588,8 +3761,7 @@
 | 
				
			|||||||
    "safer-buffer": {
 | 
					    "safer-buffer": {
 | 
				
			||||||
      "version": "2.1.2",
 | 
					      "version": "2.1.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
 | 
					      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "schema-utils": {
 | 
					    "schema-utils": {
 | 
				
			||||||
      "version": "3.0.0",
 | 
					      "version": "3.0.0",
 | 
				
			||||||
@ -3632,7 +3804,6 @@
 | 
				
			|||||||
      "version": "0.17.1",
 | 
					      "version": "0.17.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
 | 
					      "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "debug": "2.6.9",
 | 
					        "debug": "2.6.9",
 | 
				
			||||||
        "depd": "~1.1.2",
 | 
					        "depd": "~1.1.2",
 | 
				
			||||||
@ -3653,7 +3824,6 @@
 | 
				
			|||||||
          "version": "2.6.9",
 | 
					          "version": "2.6.9",
 | 
				
			||||||
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
 | 
					          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
 | 
				
			||||||
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
 | 
					          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
 | 
				
			||||||
          "dev": true,
 | 
					 | 
				
			||||||
          "requires": {
 | 
					          "requires": {
 | 
				
			||||||
            "ms": "2.0.0"
 | 
					            "ms": "2.0.0"
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
@ -3661,16 +3831,14 @@
 | 
				
			|||||||
            "ms": {
 | 
					            "ms": {
 | 
				
			||||||
              "version": "2.0.0",
 | 
					              "version": "2.0.0",
 | 
				
			||||||
              "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
 | 
					              "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
 | 
				
			||||||
              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
 | 
					              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
 | 
				
			||||||
              "dev": true
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "ms": {
 | 
					        "ms": {
 | 
				
			||||||
          "version": "2.1.1",
 | 
					          "version": "2.1.1",
 | 
				
			||||||
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
 | 
					          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
 | 
				
			||||||
          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
 | 
					          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
 | 
				
			||||||
          "dev": true
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@ -3737,7 +3905,6 @@
 | 
				
			|||||||
      "version": "1.14.1",
 | 
					      "version": "1.14.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
 | 
					      "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "encodeurl": "~1.0.2",
 | 
					        "encodeurl": "~1.0.2",
 | 
				
			||||||
        "escape-html": "~1.0.3",
 | 
					        "escape-html": "~1.0.3",
 | 
				
			||||||
@ -3777,8 +3944,7 @@
 | 
				
			|||||||
    "setprototypeof": {
 | 
					    "setprototypeof": {
 | 
				
			||||||
      "version": "1.1.1",
 | 
					      "version": "1.1.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
 | 
					      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "shebang-command": {
 | 
					    "shebang-command": {
 | 
				
			||||||
      "version": "1.2.0",
 | 
					      "version": "1.2.0",
 | 
				
			||||||
@ -3923,6 +4089,51 @@
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "socket.io": {
 | 
				
			||||||
 | 
					      "version": "3.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-Aqg2dlRh6xSJvRYK31ksG65q4kmBOqU4g+1ukhPcoT6wNGYoIwSYPlCPuRwOO9pgLUajojGFztl6+V2opmKcww==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "@types/cookie": "^0.4.0",
 | 
				
			||||||
 | 
					        "@types/cors": "^2.8.8",
 | 
				
			||||||
 | 
					        "@types/node": "^14.14.10",
 | 
				
			||||||
 | 
					        "accepts": "~1.3.4",
 | 
				
			||||||
 | 
					        "base64id": "~2.0.0",
 | 
				
			||||||
 | 
					        "debug": "~4.3.1",
 | 
				
			||||||
 | 
					        "engine.io": "~4.1.0",
 | 
				
			||||||
 | 
					        "socket.io-adapter": "~2.1.0",
 | 
				
			||||||
 | 
					        "socket.io-parser": "~4.0.3"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "socket.io-adapter": {
 | 
				
			||||||
 | 
					      "version": "2.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "socket.io-client": {
 | 
				
			||||||
 | 
					      "version": "3.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-3.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-T4qPOL80KnoBwkdR70zMpiR6aH6zv3ZqLNriofHqsO9wvQllNTOez0mpV4GdVqo1Y55Z+h8YOlBo7c8pOxDlHw==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "@types/component-emitter": "^1.2.10",
 | 
				
			||||||
 | 
					        "backo2": "~1.0.2",
 | 
				
			||||||
 | 
					        "component-emitter": "~1.3.0",
 | 
				
			||||||
 | 
					        "debug": "~4.3.1",
 | 
				
			||||||
 | 
					        "engine.io-client": "~4.1.0",
 | 
				
			||||||
 | 
					        "parseuri": "0.0.6",
 | 
				
			||||||
 | 
					        "socket.io-parser": "~4.0.4"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "socket.io-parser": {
 | 
				
			||||||
 | 
					      "version": "4.0.4",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "@types/component-emitter": "^1.2.10",
 | 
				
			||||||
 | 
					        "component-emitter": "~1.3.0",
 | 
				
			||||||
 | 
					        "debug": "~4.3.1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "sockjs": {
 | 
					    "sockjs": {
 | 
				
			||||||
      "version": "0.3.21",
 | 
					      "version": "0.3.21",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz",
 | 
				
			||||||
@ -4084,8 +4295,7 @@
 | 
				
			|||||||
    "statuses": {
 | 
					    "statuses": {
 | 
				
			||||||
      "version": "1.5.0",
 | 
					      "version": "1.5.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
 | 
				
			||||||
      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
 | 
					      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "string-width": {
 | 
					    "string-width": {
 | 
				
			||||||
      "version": "4.2.0",
 | 
					      "version": "4.2.0",
 | 
				
			||||||
@ -4243,8 +4453,7 @@
 | 
				
			|||||||
    "toidentifier": {
 | 
					    "toidentifier": {
 | 
				
			||||||
      "version": "1.0.0",
 | 
					      "version": "1.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
 | 
					      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "ts-loader": {
 | 
					    "ts-loader": {
 | 
				
			||||||
      "version": "8.0.13",
 | 
					      "version": "8.0.13",
 | 
				
			||||||
@ -4321,7 +4530,6 @@
 | 
				
			|||||||
      "version": "1.6.18",
 | 
					      "version": "1.6.18",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
 | 
				
			||||||
      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
 | 
					      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "media-typer": "0.3.0",
 | 
					        "media-typer": "0.3.0",
 | 
				
			||||||
        "mime-types": "~2.1.24"
 | 
					        "mime-types": "~2.1.24"
 | 
				
			||||||
@ -4348,8 +4556,7 @@
 | 
				
			|||||||
    "unpipe": {
 | 
					    "unpipe": {
 | 
				
			||||||
      "version": "1.0.0",
 | 
					      "version": "1.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
 | 
				
			||||||
      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
 | 
					      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "unset-value": {
 | 
					    "unset-value": {
 | 
				
			||||||
      "version": "1.0.0",
 | 
					      "version": "1.0.0",
 | 
				
			||||||
@ -4455,8 +4662,7 @@
 | 
				
			|||||||
    "utils-merge": {
 | 
					    "utils-merge": {
 | 
				
			||||||
      "version": "1.0.1",
 | 
					      "version": "1.0.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
 | 
				
			||||||
      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
 | 
					      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "uuid": {
 | 
					    "uuid": {
 | 
				
			||||||
      "version": "3.4.0",
 | 
					      "version": "3.4.0",
 | 
				
			||||||
@ -4473,8 +4679,7 @@
 | 
				
			|||||||
    "vary": {
 | 
					    "vary": {
 | 
				
			||||||
      "version": "1.1.2",
 | 
					      "version": "1.1.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
 | 
				
			||||||
      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
 | 
					      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "watchpack": {
 | 
					    "watchpack": {
 | 
				
			||||||
      "version": "2.1.0",
 | 
					      "version": "2.1.0",
 | 
				
			||||||
@ -5122,6 +5327,11 @@
 | 
				
			|||||||
        "async-limiter": "~1.0.0"
 | 
					        "async-limiter": "~1.0.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "xmlhttprequest-ssl": {
 | 
				
			||||||
 | 
					      "version": "1.5.5",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "y18n": {
 | 
					    "y18n": {
 | 
				
			||||||
      "version": "5.0.5",
 | 
					      "version": "5.0.5",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
 | 
				
			||||||
@ -5146,6 +5356,11 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
 | 
				
			||||||
      "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA=="
 | 
					      "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "yeast": {
 | 
				
			||||||
 | 
					      "version": "0.1.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "yocto-queue": {
 | 
					    "yocto-queue": {
 | 
				
			||||||
      "version": "0.1.0",
 | 
					      "version": "0.1.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										12
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								package.json
									
									
									
									
									
								
							@ -4,16 +4,24 @@
 | 
				
			|||||||
  "description": "",
 | 
					  "description": "",
 | 
				
			||||||
  "main": "index.js",
 | 
					  "main": "index.js",
 | 
				
			||||||
  "scripts": {
 | 
					  "scripts": {
 | 
				
			||||||
    "start": "webpack serve",
 | 
					    "dev": "ts-node ./src/Robotics/main.ts",
 | 
				
			||||||
 | 
					    "vision": "webpack serve",
 | 
				
			||||||
 | 
					    "build": "webpack",
 | 
				
			||||||
    "test": "echo \"Error: no test specified\" && exit 1"
 | 
					    "test": "echo \"Error: no test specified\" && exit 1"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "author": "",
 | 
					  "author": "",
 | 
				
			||||||
  "license": "ISC",
 | 
					  "license": "ISC",
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@tensorflow-models/coco-ssd": "^2.2.1",
 | 
					    "@tensorflow-models/coco-ssd": "^2.2.1",
 | 
				
			||||||
    "@tensorflow/tfjs": "^2.8.2"
 | 
					    "@tensorflow/tfjs": "^2.8.2",
 | 
				
			||||||
 | 
					    "express": "^4.17.1",
 | 
				
			||||||
 | 
					    "socket.io": "^3.1.0",
 | 
				
			||||||
 | 
					    "socket.io-client": "^3.1.0"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
 | 
					    "@types/express": "^4.17.11",
 | 
				
			||||||
 | 
					    "@types/socket.io": "^2.1.12",
 | 
				
			||||||
 | 
					    "@types/socket.io-client": "^1.4.35",
 | 
				
			||||||
    "ts-loader": "^8.0.13",
 | 
					    "ts-loader": "^8.0.13",
 | 
				
			||||||
    "typescript": "^4.1.3",
 | 
					    "typescript": "^4.1.3",
 | 
				
			||||||
    "webpack": "^5.11.1",
 | 
					    "webpack": "^5.11.1",
 | 
				
			||||||
 | 
				
			|||||||
@ -1,32 +0,0 @@
 | 
				
			|||||||
import PredictedObject from "../Models/PredictedObject"
 | 
					 | 
				
			||||||
import PredictedObjectCollection from "../Models/PredictedObjectCollection"
 | 
					 | 
				
			||||||
import PredictedObjectView from "../Views/PredictedObjectView"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class PredictedObjectCollectionController {
 | 
					 | 
				
			||||||
  private model: PredictedObjectCollection
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  constructor () {
 | 
					 | 
				
			||||||
    this.model = new PredictedObjectCollection()
 | 
					 | 
				
			||||||
    this.renderView()
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  set predictedObjects (objects: PredictedObject[]) {
 | 
					 | 
				
			||||||
    this.model.objects = objects
 | 
					 | 
				
			||||||
    this.renderView()
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  public renderView = () => {
 | 
					 | 
				
			||||||
    const existingPredictedObjectViews = document.querySelectorAll('.PredictedObject')
 | 
					 | 
				
			||||||
    existingPredictedObjectViews.forEach(v => {
 | 
					 | 
				
			||||||
      v.outerHTML = ''
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const body = document.querySelector('body')!
 | 
					 | 
				
			||||||
    this.model.objects.forEach((object: PredictedObject) => {
 | 
					 | 
				
			||||||
      const predictedObjectView = new PredictedObjectView(object)
 | 
					 | 
				
			||||||
      body.appendChild(predictedObjectView.element)
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default PredictedObjectCollectionController
 | 
					 | 
				
			||||||
@ -1,48 +0,0 @@
 | 
				
			|||||||
import Video from "../Models/Video"
 | 
					 | 
				
			||||||
import VideoView from '../Views/VideoView'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class VideoController {
 | 
					 | 
				
			||||||
  private defaultWidth: number = 640
 | 
					 | 
				
			||||||
  private defaultHeight: number = 480
 | 
					 | 
				
			||||||
  private userMediaConstraints = { video: true }
 | 
					 | 
				
			||||||
  public model: Video
 | 
					 | 
				
			||||||
  private view: VideoView
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  constructor (props: { width?: number, height?: number } = {}) {
 | 
					 | 
				
			||||||
    this.model = new Video({
 | 
					 | 
				
			||||||
      width: props.width || this.defaultWidth,
 | 
					 | 
				
			||||||
      height: props.height || this.defaultHeight
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    this.view = new VideoView(this.model)
 | 
					 | 
				
			||||||
    this.renderView()
 | 
					 | 
				
			||||||
    this.enableCamera()
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  get imageData () {
 | 
					 | 
				
			||||||
    if (!this.view.element.srcObject) return null
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const canvas: HTMLCanvasElement = document.createElement('canvas')
 | 
					 | 
				
			||||||
    canvas.width = this.model.width
 | 
					 | 
				
			||||||
    canvas.height = this.model.height
 | 
					 | 
				
			||||||
    const context = canvas.getContext('2d')!
 | 
					 | 
				
			||||||
    context.drawImage(this.view.element, 0, 0, this.model.width, this.model.height)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return context.getImageData(0, 0, this.model.width, this.model.height)
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  private enableCamera = async () => {
 | 
					 | 
				
			||||||
    const stream = await navigator.mediaDevices.getUserMedia(this.userMediaConstraints)
 | 
					 | 
				
			||||||
    this.view.srcObject = stream
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  private renderView () {
 | 
					 | 
				
			||||||
    const existingVideoView = document.querySelector('#videoView')
 | 
					 | 
				
			||||||
    if (existingVideoView) existingVideoView.outerHTML = ''
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const body = document.querySelector('body')!
 | 
					 | 
				
			||||||
    body.appendChild(this.view.element)
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default VideoController
 | 
					 | 
				
			||||||
							
								
								
									
										26
									
								
								src/Robotics/Entities/EventManager.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/Robotics/Entities/EventManager.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					import { EventEmitter } from 'events'
 | 
				
			||||||
 | 
					import IEventManager from '../Interfaces/IEventManager'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let instance: EventManager | null = null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class EventManager implements IEventManager {
 | 
				
			||||||
 | 
					  eventEmitter: EventEmitter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  constructor () {
 | 
				
			||||||
 | 
					    if (!instance) instance = this
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.eventEmitter = new EventEmitter()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return instance
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  listen = (eventName: string, callback: any)  => {
 | 
				
			||||||
 | 
					    this.eventEmitter.addListener(eventName, callback)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  emit = (eventName: string, detail: any) => {
 | 
				
			||||||
 | 
					    this.eventEmitter.emit(eventName, detail)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default EventManager
 | 
				
			||||||
							
								
								
									
										17
									
								
								src/Robotics/Entities/Motor.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/Robotics/Entities/Motor.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					import IMotor from "../Interfaces/IMotor"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Motor implements IMotor {
 | 
				
			||||||
 | 
					  public pinOne: number
 | 
				
			||||||
 | 
					  public pinTwo: number
 | 
				
			||||||
 | 
					  public pinThree: number
 | 
				
			||||||
 | 
					  public pinFour: number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  constructor (props: IMotor) {
 | 
				
			||||||
 | 
					    this.pinOne = props.pinOne
 | 
				
			||||||
 | 
					    this.pinTwo = props.pinTwo
 | 
				
			||||||
 | 
					    this.pinThree = props.pinThree
 | 
				
			||||||
 | 
					    this.pinFour = props.pinFour
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default Motor
 | 
				
			||||||
							
								
								
									
										70
									
								
								src/Robotics/Entities/MotorMover.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								src/Robotics/Entities/MotorMover.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,70 @@
 | 
				
			|||||||
 | 
					import IMotor from "../Interfaces/IMotor"
 | 
				
			||||||
 | 
					import makeMotor from "../UseCases/Factories/makeMotor"
 | 
				
			||||||
 | 
					import * as childProcesses from 'child_process'
 | 
				
			||||||
 | 
					import IMotorMoverConstructor from "../Interfaces/IMotorMoverConstructor"
 | 
				
			||||||
 | 
					import IMotorMover from "../Interfaces/IMotorMover"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class MotorMover implements IMotorMover {
 | 
				
			||||||
 | 
					  motor: IMotor
 | 
				
			||||||
 | 
					  moveProcess: childProcesses.ChildProcessWithoutNullStreams | null = null
 | 
				
			||||||
 | 
					  pauseIntervalTime: number
 | 
				
			||||||
 | 
					  movementState: 'CLOCKWISE' | 'COUNTERCLOCKWISE' | "IDLE" = 'IDLE'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  constructor (props: IMotorMoverConstructor) {
 | 
				
			||||||
 | 
					    this.motor = makeMotor(props.motor)
 | 
				
			||||||
 | 
					    this.pauseIntervalTime = props.pauseIntervalTime
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public moveClockwise = () => {
 | 
				
			||||||
 | 
					    if (this.movementState === 'CLOCKWISE') return
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					      if (!this.moveProcess?.killed) this.moveProcess?.kill()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const motorProcessArguments = [
 | 
				
			||||||
 | 
					      'src/Robotics/moveStepper.py',
 | 
				
			||||||
 | 
					      this.motor.pinOne.toString(),
 | 
				
			||||||
 | 
					      this.motor.pinTwo.toString(),
 | 
				
			||||||
 | 
					      this.motor.pinThree.toString(),
 | 
				
			||||||
 | 
					      this.motor.pinFour.toString(),
 | 
				
			||||||
 | 
					      'clockwise',
 | 
				
			||||||
 | 
					      this.pauseIntervalTime.toString()
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    console.log('start clockwise')
 | 
				
			||||||
 | 
					    this.moveProcess = childProcesses.spawn('python', motorProcessArguments)
 | 
				
			||||||
 | 
					    this.movementState = 'CLOCKWISE'
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public moveCounterClockwise = () => {
 | 
				
			||||||
 | 
					    if (this.movementState === 'COUNTERCLOCKWISE') return
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					      if (!this.moveProcess?.killed) this.moveProcess?.kill()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const motorProcessArguments = [
 | 
				
			||||||
 | 
					      'src/Robotics/moveStepper.py',
 | 
				
			||||||
 | 
					      this.motor.pinOne.toString(),
 | 
				
			||||||
 | 
					      this.motor.pinTwo.toString(),
 | 
				
			||||||
 | 
					      this.motor.pinThree.toString(),
 | 
				
			||||||
 | 
					      this.motor.pinFour.toString(),
 | 
				
			||||||
 | 
					      'counterClockwise',
 | 
				
			||||||
 | 
					      this.pauseIntervalTime.toString()
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    console.log('start counterclockwise')
 | 
				
			||||||
 | 
					    this.moveProcess = childProcesses.spawn('python', motorProcessArguments)
 | 
				
			||||||
 | 
					    this.movementState = 'COUNTERCLOCKWISE'
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public stopMovement = () => {
 | 
				
			||||||
 | 
					    if (this.movementState === 'IDLE') return
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					      if (!this.moveProcess?.killed) this.moveProcess?.kill()
 | 
				
			||||||
 | 
					      console.log('start idle')
 | 
				
			||||||
 | 
					      this.movementState = 'IDLE'
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default MotorMover
 | 
				
			||||||
							
								
								
									
										69
									
								
								src/Robotics/Entities/Server.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								src/Robotics/Entities/Server.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,69 @@
 | 
				
			|||||||
 | 
					import express from 'express'
 | 
				
			||||||
 | 
					import path from 'path'
 | 
				
			||||||
 | 
					import bodyParser from 'body-parser'
 | 
				
			||||||
 | 
					import http from 'http'
 | 
				
			||||||
 | 
					import { Socket } from 'socket.io'
 | 
				
			||||||
 | 
					import IEventManager from '../Interfaces/IEventManager'
 | 
				
			||||||
 | 
					import EventManager from './EventManager'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Server {
 | 
				
			||||||
 | 
					  public app = express()
 | 
				
			||||||
 | 
					  private eventManager: IEventManager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  constructor (port: number) {
 | 
				
			||||||
 | 
					    this.createApp()
 | 
				
			||||||
 | 
					    this.setupAppOptions()
 | 
				
			||||||
 | 
					    this.setupAppRoutes()
 | 
				
			||||||
 | 
					    this.startServer(port)
 | 
				
			||||||
 | 
					    this.eventManager = new EventManager()
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  createApp = () => {
 | 
				
			||||||
 | 
					    this.app.use(express.json())
 | 
				
			||||||
 | 
					    this.app.use(express.urlencoded({ extended: false }))
 | 
				
			||||||
 | 
					    this.app.use(express.static(path.join(process.cwd(), '/dist/Vision/')))
 | 
				
			||||||
 | 
					    this.app.use(bodyParser.json())
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  setupAppRoutes = () => {
 | 
				
			||||||
 | 
					    this.app.use('/', (request, response, next) => {
 | 
				
			||||||
 | 
					      response.sendFile(path.join(process.cwd(), './dist/Vision/index.html'))
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  setupAppOptions = () => {
 | 
				
			||||||
 | 
					    this.app.use((request, response, next) => {
 | 
				
			||||||
 | 
					      response.header('Access-Control-Allow-Origin', request.headers.origin || '*')
 | 
				
			||||||
 | 
					      response.header('Access-Control-Allow-Methods', 'GET,POST,PUT,PATCH,HEAD,DELETE,OPTIONS')
 | 
				
			||||||
 | 
					      response.header('Access-Control-Allow-Headers', 'Content-Type,x-requested-with')
 | 
				
			||||||
 | 
					      next()
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  startServer = (port: number) => {
 | 
				
			||||||
 | 
					    const webService = new http.Server(this.app)
 | 
				
			||||||
 | 
					    const socketService = require("socket.io")(webService)
 | 
				
			||||||
 | 
					    this.openSockets(socketService)
 | 
				
			||||||
 | 
					    webService.listen(port, () => {
 | 
				
			||||||
 | 
					      console.log(`Server is listening on ${port}`)
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  openSockets = (socketService: any) => {
 | 
				
			||||||
 | 
					    socketService.on('connection', (socket: Socket) => {
 | 
				
			||||||
 | 
					      console.log('client connected')
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      socket.on('offsets', (offsets: any[]) => {
 | 
				
			||||||
 | 
					        this.onReceiveOffsets(offsets)
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public onReceiveOffsets = (offsets: any[]) => {
 | 
				
			||||||
 | 
					    this.eventManager.emit('onReceiveOffsets', offsets)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default Server
 | 
				
			||||||
							
								
								
									
										13
									
								
								src/Robotics/Entities/WaterPump.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/Robotics/Entities/WaterPump.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					import IWaterPump from '../Interfaces/IWaterPump'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class WaterPump implements IWaterPump {
 | 
				
			||||||
 | 
					  public pinOne: number
 | 
				
			||||||
 | 
					  public pinTwo: number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  constructor (props: IWaterPump) {
 | 
				
			||||||
 | 
					    this.pinOne = props.pinOne
 | 
				
			||||||
 | 
					    this.pinTwo = props.pinTwo
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default WaterPump
 | 
				
			||||||
							
								
								
									
										46
									
								
								src/Robotics/Entities/WaterPumper.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/Robotics/Entities/WaterPumper.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,46 @@
 | 
				
			|||||||
 | 
					import IWaterPump from '../Interfaces/IWaterPump'
 | 
				
			||||||
 | 
					import * as childProcesses from 'child_process'
 | 
				
			||||||
 | 
					import IWaterPumperConstructor from '../Interfaces/IWaterPumperConstructor'
 | 
				
			||||||
 | 
					import IWaterPumper from '../Interfaces/IWaterPumper'
 | 
				
			||||||
 | 
					import makeWaterPump from '../UseCases/Factories/makeWaterPump'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class WaterPumper implements IWaterPumper {
 | 
				
			||||||
 | 
					  public waterPump: IWaterPump
 | 
				
			||||||
 | 
					  public isActive: boolean = false
 | 
				
			||||||
 | 
					  private pumpProcess: childProcesses.ChildProcessWithoutNullStreams | null = null
 | 
				
			||||||
 | 
					  private pumpActiveTimeInSeconds: number
 | 
				
			||||||
 | 
					  private pumpCoolDownTimeInSeconds: number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  constructor (props: IWaterPumperConstructor) {
 | 
				
			||||||
 | 
					    this.waterPump = makeWaterPump({
 | 
				
			||||||
 | 
					      pinOne: props.pinOne,
 | 
				
			||||||
 | 
					      pinTwo: props.pinTwo
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.pumpActiveTimeInSeconds =props.pumpActiveTimeInSeconds
 | 
				
			||||||
 | 
					    this.pumpCoolDownTimeInSeconds = props.pumpCoolDownTimeInSeconds
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private async coolDown () {
 | 
				
			||||||
 | 
					    return new Promise(resolve => setTimeout(resolve, this.pumpCoolDownTimeInSeconds * 1000))
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public async pump () {
 | 
				
			||||||
 | 
					    if (this.isActive) return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const pumpProcessArguments = [
 | 
				
			||||||
 | 
					      'src/Robotics/moveDcMotor.py',
 | 
				
			||||||
 | 
					      this.waterPump.pinOne.toString(),
 | 
				
			||||||
 | 
					      this.waterPump.pinTwo.toString(),
 | 
				
			||||||
 | 
					      this.pumpActiveTimeInSeconds.toString()
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.pumpProcess = childProcesses.spawn('python', pumpProcessArguments)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.isActive = true
 | 
				
			||||||
 | 
					    await this.coolDown()
 | 
				
			||||||
 | 
					    this.isActive = false
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default WaterPumper
 | 
				
			||||||
							
								
								
									
										6
									
								
								src/Robotics/Interfaces/IEventManager.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/Robotics/Interfaces/IEventManager.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					interface IEventManager {
 | 
				
			||||||
 | 
					  listen(eventName: string, callback: any): void,
 | 
				
			||||||
 | 
					  emit(eventName: string, detail: any): void
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default IEventManager
 | 
				
			||||||
							
								
								
									
										8
									
								
								src/Robotics/Interfaces/IMotor.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/Robotics/Interfaces/IMotor.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					interface IMotor {
 | 
				
			||||||
 | 
					  pinOne: number,
 | 
				
			||||||
 | 
					  pinTwo: number,
 | 
				
			||||||
 | 
					  pinThree: number,
 | 
				
			||||||
 | 
					  pinFour: number
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default IMotor
 | 
				
			||||||
							
								
								
									
										8
									
								
								src/Robotics/Interfaces/IMotorMover.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/Robotics/Interfaces/IMotorMover.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					interface IMotorMover {
 | 
				
			||||||
 | 
					  moveClockwise(): void,
 | 
				
			||||||
 | 
					  moveCounterClockwise(): void,
 | 
				
			||||||
 | 
					  stopMovement(): void,
 | 
				
			||||||
 | 
					  movementState: 'CLOCKWISE' | 'COUNTERCLOCKWISE' | "IDLE"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default IMotorMover
 | 
				
			||||||
							
								
								
									
										8
									
								
								src/Robotics/Interfaces/IMotorMoverConstructor.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/Robotics/Interfaces/IMotorMoverConstructor.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					import IMotor from "./IMotor";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface IMotorMoverConstructor {
 | 
				
			||||||
 | 
					  motor: IMotor,
 | 
				
			||||||
 | 
					  pauseIntervalTime: number
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default IMotorMoverConstructor
 | 
				
			||||||
							
								
								
									
										5
									
								
								src/Robotics/Interfaces/IServer.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/Robotics/Interfaces/IServer.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					interface IServer {
 | 
				
			||||||
 | 
					  port: number
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default IServer
 | 
				
			||||||
							
								
								
									
										6
									
								
								src/Robotics/Interfaces/IWaterPump.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/Robotics/Interfaces/IWaterPump.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					interface IWaterPump {
 | 
				
			||||||
 | 
					  pinOne: number,
 | 
				
			||||||
 | 
					  pinTwo: number
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default IWaterPump
 | 
				
			||||||
							
								
								
									
										9
									
								
								src/Robotics/Interfaces/IWaterPumper.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/Robotics/Interfaces/IWaterPumper.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					import IWaterPump from "./IWaterPump";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface IWaterPumper {
 | 
				
			||||||
 | 
					  pump(): void
 | 
				
			||||||
 | 
					  isActive: boolean
 | 
				
			||||||
 | 
					  waterPump: IWaterPump
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default IWaterPumper
 | 
				
			||||||
							
								
								
									
										8
									
								
								src/Robotics/Interfaces/IWaterPumperConstructor.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/Robotics/Interfaces/IWaterPumperConstructor.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					interface IWaterPumperConstructor {
 | 
				
			||||||
 | 
					  pinOne: number,
 | 
				
			||||||
 | 
					  pinTwo: number,
 | 
				
			||||||
 | 
					  pumpActiveTimeInSeconds: number,
 | 
				
			||||||
 | 
					  pumpCoolDownTimeInSeconds: number
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default IWaterPumperConstructor
 | 
				
			||||||
							
								
								
									
										7
									
								
								src/Robotics/UseCases/Factories/makeEventManager.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/Robotics/UseCases/Factories/makeEventManager.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					import EventManager from "../../Entities/EventManager"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function makeEventManager () {
 | 
				
			||||||
 | 
					  return new EventManager()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default makeEventManager
 | 
				
			||||||
							
								
								
									
										8
									
								
								src/Robotics/UseCases/Factories/makeMotor.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/Robotics/UseCases/Factories/makeMotor.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					import Motor from "../../Entities/Motor"
 | 
				
			||||||
 | 
					import IMotor from "../../Interfaces/IMotor"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function makeMotor (props: IMotor) {
 | 
				
			||||||
 | 
					  return new Motor(props)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default makeMotor
 | 
				
			||||||
							
								
								
									
										8
									
								
								src/Robotics/UseCases/Factories/makeMotorMover.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/Robotics/UseCases/Factories/makeMotorMover.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					import MotorMover from "../../Entities/MotorMover"
 | 
				
			||||||
 | 
					import IMotorMoverConstructor from "../../Interfaces/IMotorMoverConstructor"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function makeMotorMover (props: IMotorMoverConstructor) {
 | 
				
			||||||
 | 
					  return new MotorMover(props)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default makeMotorMover
 | 
				
			||||||
							
								
								
									
										9
									
								
								src/Robotics/UseCases/Factories/makeServer.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/Robotics/UseCases/Factories/makeServer.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					import Server from "../../Entities/Server"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function makeServer (port: number) {
 | 
				
			||||||
 | 
					  const defaultPort = 5005
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return new Server(port || defaultPort)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default makeServer
 | 
				
			||||||
							
								
								
									
										8
									
								
								src/Robotics/UseCases/Factories/makeWaterPump.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/Robotics/UseCases/Factories/makeWaterPump.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					import WaterPump from "../../Entities/WaterPump"
 | 
				
			||||||
 | 
					import IWaterPump from "../../Interfaces/IWaterPump"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function makeWaterPump (props: IWaterPump) {
 | 
				
			||||||
 | 
					  return new WaterPump(props)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default makeWaterPump
 | 
				
			||||||
							
								
								
									
										8
									
								
								src/Robotics/UseCases/Factories/makeWaterPumper.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/Robotics/UseCases/Factories/makeWaterPumper.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					import WaterPumper from "../../Entities/WaterPumper"
 | 
				
			||||||
 | 
					import IWaterPumperConstructor from "../../Interfaces/IWaterPumperConstructor"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function makeWaterPumper (props: IWaterPumperConstructor) {
 | 
				
			||||||
 | 
					  return new WaterPumper(props)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default makeWaterPumper
 | 
				
			||||||
							
								
								
									
										60
									
								
								src/Robotics/main.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/Robotics/main.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,60 @@
 | 
				
			|||||||
 | 
					import IEventManager from './Interfaces/IEventManager'
 | 
				
			||||||
 | 
					import IMotorMover from './Interfaces/IMotorMover'
 | 
				
			||||||
 | 
					import IWaterPumper from './Interfaces/IWaterPumper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import makeServer from './UseCases/Factories/makeServer'
 | 
				
			||||||
 | 
					import makeEventManager from './UseCases/Factories/makeEventManager'
 | 
				
			||||||
 | 
					import makeMotorMover from './UseCases/Factories/makeMotorMover'
 | 
				
			||||||
 | 
					import makeWaterPumper from './UseCases/Factories/makeWaterPumper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const main = () => {
 | 
				
			||||||
 | 
					  console.log('Starting Robotics')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const port = 5005
 | 
				
			||||||
 | 
					  makeServer(port)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const eventManager: IEventManager = makeEventManager()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const xAxisMotorMover: IMotorMover = makeMotorMover({
 | 
				
			||||||
 | 
					    motor: { pinOne: 3, pinTwo: 5, pinThree: 7, pinFour: 11 },
 | 
				
			||||||
 | 
					    pauseIntervalTime: 0.05
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const yAxisMotorMover: IMotorMover = makeMotorMover({
 | 
				
			||||||
 | 
					    motor: { pinOne: 13, pinTwo: 15, pinThree: 19, pinFour: 21 },
 | 
				
			||||||
 | 
					    pauseIntervalTime: 0.05
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const waterPumper: IWaterPumper = makeWaterPumper({
 | 
				
			||||||
 | 
					    pinOne: 37,
 | 
				
			||||||
 | 
					    pinTwo: 35,
 | 
				
			||||||
 | 
					    pumpActiveTimeInSeconds: 1,
 | 
				
			||||||
 | 
					    pumpCoolDownTimeInSeconds: 5
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  eventManager.listen('onReceiveOffsets', (offsets: any[]) => {
 | 
				
			||||||
 | 
					    if (offsets[0]?.x > 50) {
 | 
				
			||||||
 | 
					      xAxisMotorMover.moveCounterClockwise()
 | 
				
			||||||
 | 
					    } else if (offsets[0]?.x < - 50) {
 | 
				
			||||||
 | 
					      xAxisMotorMover.moveClockwise()
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      xAxisMotorMover.stopMovement()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (offsets[0]?.y > 50) {
 | 
				
			||||||
 | 
					      yAxisMotorMover.moveClockwise()
 | 
				
			||||||
 | 
					    } else if (offsets[0]?.y < - 50) {
 | 
				
			||||||
 | 
					      yAxisMotorMover.moveCounterClockwise()
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      yAxisMotorMover.stopMovement()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (offsets[0]?.hypotenuse <= 80) {
 | 
				
			||||||
 | 
					      waterPumper.pump()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export { main }
 | 
				
			||||||
							
								
								
									
										22
									
								
								src/Robotics/moveDcMotor.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/Robotics/moveDcMotor.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					# command arguments to run process
 | 
				
			||||||
 | 
					# 1: int pin_one
 | 
				
			||||||
 | 
					# 2: int pin_two
 | 
				
			||||||
 | 
					# 3: int motor_active_time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import RPi.GPIO as GPIO
 | 
				
			||||||
 | 
					from time import sleep
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					motor_channel = (int(sys.argv[1]), int(sys.argv[2])) # (37, 35)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					motor_active_time = int(sys.argv[3])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GPIO.setwarnings(True)
 | 
				
			||||||
 | 
					GPIO.setmode(GPIO.BOARD)
 | 
				
			||||||
 | 
					GPIO.setup(motor_channel, GPIO.OUT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GPIO.output(motor_channel, (GPIO.HIGH, GPIO.LOW))
 | 
				
			||||||
 | 
					print('Should be on')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sleep(motor_active_time)
 | 
				
			||||||
 | 
					GPIO.output(motor_channel, (GPIO.LOW, GPIO.LOW))
 | 
				
			||||||
							
								
								
									
										48
									
								
								src/Robotics/moveStepper.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/Robotics/moveStepper.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,48 @@
 | 
				
			|||||||
 | 
					# command arguments to run process
 | 
				
			||||||
 | 
					# 1: int pin_one
 | 
				
			||||||
 | 
					# 2: int pin_two
 | 
				
			||||||
 | 
					# 3: int pin_three
 | 
				
			||||||
 | 
					# 4: int pin_four
 | 
				
			||||||
 | 
					# 5: string clockwise or counterClockwise
 | 
				
			||||||
 | 
					# 6: float: interval_time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import RPi.GPIO as GPIO
 | 
				
			||||||
 | 
					from time import sleep
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					motor_channel = (int(sys.argv[1]), int(sys.argv[2]), int(sys.argv[3]), int(sys.argv[4]))
 | 
				
			||||||
 | 
					motor_direction = sys.argv[5]
 | 
				
			||||||
 | 
					interval_time = float(sys.argv[6])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GPIO.setwarnings(True)
 | 
				
			||||||
 | 
					GPIO.setmode(GPIO.BOARD)
 | 
				
			||||||
 | 
					GPIO.setup(motor_channel, GPIO.OUT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					while True:
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        if(motor_direction == 'clockwise'):
 | 
				
			||||||
 | 
					            print('motor running clockwise\n')
 | 
				
			||||||
 | 
					            GPIO.output(motor_channel, (GPIO.HIGH,GPIO.LOW,GPIO.LOW,GPIO.HIGH))
 | 
				
			||||||
 | 
					            sleep(interval_time)
 | 
				
			||||||
 | 
					            GPIO.output(motor_channel, (GPIO.HIGH,GPIO.HIGH,GPIO.LOW,GPIO.LOW))
 | 
				
			||||||
 | 
					            sleep(interval_time)
 | 
				
			||||||
 | 
					            GPIO.output(motor_channel, (GPIO.LOW,GPIO.HIGH,GPIO.HIGH,GPIO.LOW))
 | 
				
			||||||
 | 
					            sleep(interval_time)
 | 
				
			||||||
 | 
					            GPIO.output(motor_channel, (GPIO.LOW,GPIO.LOW,GPIO.HIGH,GPIO.HIGH))
 | 
				
			||||||
 | 
					            sleep(interval_time)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        elif(motor_direction == 'counterClockwise'):
 | 
				
			||||||
 | 
					            print('motor running anti-clockwise\n')
 | 
				
			||||||
 | 
					            GPIO.output(motor_channel, (GPIO.HIGH,GPIO.LOW,GPIO.LOW,GPIO.HIGH))
 | 
				
			||||||
 | 
					            sleep(interval_time)
 | 
				
			||||||
 | 
					            GPIO.output(motor_channel, (GPIO.LOW,GPIO.LOW,GPIO.HIGH,GPIO.HIGH))
 | 
				
			||||||
 | 
					            sleep(interval_time)
 | 
				
			||||||
 | 
					            GPIO.output(motor_channel, (GPIO.LOW,GPIO.HIGH,GPIO.HIGH,GPIO.LOW))
 | 
				
			||||||
 | 
					            sleep(interval_time)
 | 
				
			||||||
 | 
					            GPIO.output(motor_channel, (GPIO.HIGH,GPIO.HIGH,GPIO.LOW,GPIO.LOW))
 | 
				
			||||||
 | 
					            sleep(interval_time)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    except KeyboardInterrupt:
 | 
				
			||||||
 | 
					        sys.exit(0)
 | 
				
			||||||
							
								
								
									
										7
									
								
								src/Vision/Interfaces/IRoboticsCommunicator.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/Vision/Interfaces/IRoboticsCommunicator.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					import IOffset from "./IOffset";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface IRoboticsCommunicator {
 | 
				
			||||||
 | 
					  sendOffsets(offsets: IOffset[]): void
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default IRoboticsCommunicator
 | 
				
			||||||
@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					import RoboticsCommunicator from "../RoboticsCommunicator"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function makeRoboticsCommunicator () {
 | 
				
			||||||
 | 
					  return new RoboticsCommunicator()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default makeRoboticsCommunicator
 | 
				
			||||||
							
								
								
									
										16
									
								
								src/Vision/UseCases/RoboticsCommunicator.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/Vision/UseCases/RoboticsCommunicator.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					import * as io from 'socket.io-client'
 | 
				
			||||||
 | 
					import IOffset from '../Interfaces/IOffset'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class RoboticsCommunicator {
 | 
				
			||||||
 | 
					  socket: SocketIOClient.Socket
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  constructor () {
 | 
				
			||||||
 | 
					    this.socket = io.connect()
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  sendOffsets = (offsets: IOffset[]) => {
 | 
				
			||||||
 | 
					    this.socket.emit('offsets', offsets)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default RoboticsCommunicator
 | 
				
			||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
import IObjectDetector from './Interfaces/IObjectDetector'
 | 
					import IObjectDetector from './Interfaces/IObjectDetector'
 | 
				
			||||||
import IObjectLocator from './Interfaces/IObjectLocator'
 | 
					import IObjectLocator from './Interfaces/IObjectLocator'
 | 
				
			||||||
import IOffset from './Interfaces/IOffset'
 | 
					import IOffset from './Interfaces/IOffset'
 | 
				
			||||||
 | 
					import IRoboticsCommunicator from './Interfaces/IRoboticsCommunicator'
 | 
				
			||||||
import IUiRenderer from './Interfaces/IUiRenderer'
 | 
					import IUiRenderer from './Interfaces/IUiRenderer'
 | 
				
			||||||
import IVideoCapturer from "./Interfaces/IVideoCapturer"
 | 
					import IVideoCapturer from "./Interfaces/IVideoCapturer"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -8,17 +9,20 @@ import makeObjectDetector from './UseCases/Factories/makeObjectDetector'
 | 
				
			|||||||
import makeObjectLocator from './UseCases/Factories/makeObjectLocator'
 | 
					import makeObjectLocator from './UseCases/Factories/makeObjectLocator'
 | 
				
			||||||
import makeUiRenderer from './UseCases/Factories/makeUiRenderer'
 | 
					import makeUiRenderer from './UseCases/Factories/makeUiRenderer'
 | 
				
			||||||
import makeVideoCapturer from './UseCases/Factories/makeVideoCatpurer'
 | 
					import makeVideoCapturer from './UseCases/Factories/makeVideoCatpurer'
 | 
				
			||||||
 | 
					import makeRoboticsCommunicator from './UseCases/Factories/mkaeRoboticsCommunicator'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class App {
 | 
					class App {
 | 
				
			||||||
  private objectDetector: IObjectDetector
 | 
					  private objectDetector: IObjectDetector
 | 
				
			||||||
  private objectLocator: IObjectLocator
 | 
					  private objectLocator: IObjectLocator
 | 
				
			||||||
  private videoCapturer: IVideoCapturer
 | 
					  private videoCapturer: IVideoCapturer
 | 
				
			||||||
 | 
					  private roboticsCommunicator: IRoboticsCommunicator
 | 
				
			||||||
  private uiRenderer: IUiRenderer
 | 
					  private uiRenderer: IUiRenderer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  constructor () {
 | 
					  constructor () {
 | 
				
			||||||
    this.videoCapturer = makeVideoCapturer()
 | 
					    this.videoCapturer = makeVideoCapturer()
 | 
				
			||||||
    this.objectDetector = makeObjectDetector()
 | 
					    this.objectDetector = makeObjectDetector()
 | 
				
			||||||
    this.objectLocator = makeObjectLocator()
 | 
					    this.objectLocator = makeObjectLocator()
 | 
				
			||||||
 | 
					    this.roboticsCommunicator = makeRoboticsCommunicator()
 | 
				
			||||||
    this.uiRenderer = makeUiRenderer()
 | 
					    this.uiRenderer = makeUiRenderer()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const eventTarget = new EventTarget()
 | 
					    const eventTarget = new EventTarget()
 | 
				
			||||||
@ -36,6 +40,7 @@ class App {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    const predictedObjects = await this.objectDetector.getPredictionsFromImageData(imageData)
 | 
					    const predictedObjects = await this.objectDetector.getPredictionsFromImageData(imageData)
 | 
				
			||||||
    const offsets: IOffset[] = predictedObjects.map(obj => this.objectLocator.getOffsetsFromPredictions(obj))
 | 
					    const offsets: IOffset[] = predictedObjects.map(obj => this.objectLocator.getOffsetsFromPredictions(obj))
 | 
				
			||||||
 | 
					    this.roboticsCommunicator.sendOffsets(offsets)
 | 
				
			||||||
    this.uiRenderer.render({ imageData, predictedObjects, offsets })
 | 
					    this.uiRenderer.render({ imageData, predictedObjects, offsets })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    window.requestAnimationFrame(this.predictImage)
 | 
					    window.requestAnimationFrame(this.predictImage)
 | 
				
			||||||
@ -1,10 +1,10 @@
 | 
				
			|||||||
const path = require('path');
 | 
					const path = require('path');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = {
 | 
					module.exports = {
 | 
				
			||||||
  entry: './src/app.ts',
 | 
					  entry: './src/Vision/main.ts',
 | 
				
			||||||
  devtool: 'inline-source-map',
 | 
					  devtool: 'inline-source-map',
 | 
				
			||||||
  devServer: {
 | 
					  devServer: {
 | 
				
			||||||
    contentBase: './dist',
 | 
					    contentBase: './dist/Vision',
 | 
				
			||||||
   hot: true,
 | 
					   hot: true,
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  module: {
 | 
					  module: {
 | 
				
			||||||
@ -20,7 +20,7 @@ module.exports = {
 | 
				
			|||||||
    extensions: [ '.tsx', '.ts', '.js' ],
 | 
					    extensions: [ '.tsx', '.ts', '.js' ],
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  output: {
 | 
					  output: {
 | 
				
			||||||
    filename: 'app.js',
 | 
					    filename: 'main.js',
 | 
				
			||||||
    path: path.resolve(__dirname, 'dist'),
 | 
					    path: path.resolve(__dirname, 'dist', 'Vision'),
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user