Compare commits
	
		
			401 Commits
		
	
	
		
			e0e1ae1108
			...
			dean/updat
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 170ff70b7a | |||
| 8df09b8c93 | |||
| 644ea66e98 | |||
| 0a5097c5c0 | |||
| f4445f7ecb | |||
| b18fedae8e | |||
| 31baa2b096 | |||
| 85cd37f70f | |||
| b53aa172fa | |||
| df2e534745 | |||
| 
						 | 
					ea4980947f | ||
| 65475bca9b | |||
| 280f5a66bd | |||
| 84daf2d136 | |||
| 6558fb60e9 | |||
| 6462a6a464 | |||
| 41a5bb7609 | |||
| b8aaabea8b | |||
| 2745521664 | |||
| 8efa2e067c | |||
| 919fe5ba24 | |||
| 7ff60dc9c5 | |||
| 7e0d8a84ee | |||
| 9f26b5aa0f | |||
| 70303b9363 | |||
| 9ee1422d3e | |||
| 7a9d2545c4 | |||
| c561ea20ab | |||
| 7ce0c058b7 | |||
| c399edd882 | |||
| 32d8cb0d41 | |||
| 9d912ed21e | |||
| 0bcfd32b14 | |||
| 9b27d288da | |||
| b0f94f5ea8 | |||
| de653ba54c | |||
| 2657628a54 | |||
| cd20cfcb40 | |||
| 2657a9baf7 | |||
| 9bb4b7c513 | |||
| a5050ed08d | |||
| b9e26243e9 | |||
| 021cd35278 | |||
| 8dda81236a | |||
| c7ff615fe4 | |||
| 365cbb5f70 | |||
| 194d0dcd22 | |||
| 8fcaa1397a | |||
| e8e318b919 | |||
| ff0a11ea0d | |||
| 84192d1387 | |||
| f1ae2b62d6 | |||
| 4f78cd94ab | |||
| bfdda67d1a | |||
| 881350619a | |||
| 8bc67f75b0 | |||
| df8495df77 | |||
| 0c45855f7d | |||
| a2e659dfcb | |||
| 2a36a392ce | |||
| 145c2f9558 | |||
| 3f2e5d331f | |||
| bf8e851139 | |||
| eb15f4f3b8 | |||
| 82ff8546d4 | |||
| 284334606d | |||
| a883bc3e2f | |||
| b50ea5b573 | |||
| de17659dbb | |||
| 33886b4e9e | |||
| 9d0ba908dc | |||
| 7b4880a990 | |||
| 8ed177b0f3 | |||
| 976cc66ccb | |||
| af461fff00 | |||
| 7a39b4ca60 | |||
| 9befbe3833 | |||
| 68a4c064f3 | |||
| 54fd741670 | |||
| 2f9e630de4 | |||
| 5efd8ef8e5 | |||
| 6ad3d449d8 | |||
| 8fe20d1c41 | |||
| e151f39582 | |||
| f136ddb9ca | |||
| 5d05614e07 | |||
| c4c3ccde00 | |||
| e137ce8ad1 | |||
| bd5bebb747 | |||
| 034facebf3 | |||
| ac1fceb648 | |||
| fd87ade629 | |||
| 1fab007654 | |||
| cd2cdb475a | |||
| c3c74379fb | |||
| da21627f15 | |||
| 8fabfd67cf | |||
| e6960038f2 | |||
| b6ec7ed39d | |||
| 545ba638c2 | |||
| 94e4e55558 | |||
| 2536f5db6b | |||
| ffd0814a98 | |||
| 55bfe42484 | |||
| dabb0d1d9c | |||
| a538c1d81c | |||
| 872bce3adb | |||
| 457d375bed | |||
| 12798e368c | |||
| a3d6e6e19e | |||
| f7a6e393e7 | |||
| ee11e506ed | |||
| 90ec47848b | |||
| 21acb5219d | |||
| 087d511efc | |||
| 7cc0dca821 | |||
| f826121aa3 | |||
| 2aadb8b49b | |||
| 5468b7ccda | |||
| 08dfafe1a3 | |||
| 36b6804719 | |||
| 0120c15064 | |||
| 9cc99d956a | |||
| 985fa8b8e5 | |||
| c4868e7ebe | |||
| 58e1c18034 | |||
| 592dea0ca2 | |||
| 0e00ae9297 | |||
| e16812f242 | |||
| 3e9b7a0d16 | |||
| 309deb9473 | |||
| d5ba9c2ba5 | |||
| 73771a263a | |||
| 655e59c43c | |||
| 056120a68a | |||
| bd7ffa7fdb | |||
| ec58923c65 | |||
| 63869cd7ca | |||
| 08ae9611cf | |||
| 4e610b7df2 | |||
| 2d6d3964ad | |||
| 73a58de36e | |||
| dc6f246489 | |||
| c0a3aa97dc | |||
| f4e43b24f2 | |||
| 51ab8320d7 | |||
| f9a00ad3eb | |||
| 998b2ffc8c | |||
| c7642e6204 | |||
| b2ce1c2f96 | |||
| d0cf071934 | |||
| 6b410b3d78 | |||
| 607504261c | |||
| 0421be855d | |||
| 014aab473b | |||
| 353872401e | |||
| 433dfdaf74 | |||
| a2d9e688e9 | |||
| b3259dac1f | |||
| 0982b9e60c | |||
| 1710ae451c | |||
| de9e7dea6a | |||
| cfcf1dbcd2 | |||
| 05e3182e8b | |||
| baf139aab5 | |||
| b3b454ef83 | |||
| f6e4a1bc0b | |||
| 9d8155527d | |||
| 8690e81029 | |||
| 4ef13a482a | |||
| 9db95c4e6c | |||
| 249807c935 | |||
| eec79b2dc5 | |||
| 464c013095 | |||
| e2f4995cad | |||
| a43b286e39 | |||
| 148f5362f0 | |||
| 4d01e9814d | |||
| b9e3e1f310 | |||
| b0da48c4fb | |||
| 1e53dc21ee | |||
| 5c5014339f | |||
| 84188a6066 | |||
| 7c7be319d1 | |||
| 79784faba1 | |||
| f3ea44755c | |||
| 9b6559559c | |||
| 2398216bf2 | |||
| d942b91d17 | |||
| 24d9b9225e | |||
| f6f6404302 | |||
| 4609af726b | |||
| c5919c90d0 | |||
| 605adc3293 | |||
| b40554d38d | |||
| 194d7c66a0 | |||
| 3adc301935 | |||
| 9232c673e8 | |||
| c2cb411469 | |||
| 44ddc732a1 | |||
| d6ef3e0487 | |||
| 8c191bdb90 | |||
| 8246699915 | |||
| de9d47c289 | |||
| 39b1808cab | |||
| a78f9e7b9d | |||
| f573026853 | |||
| f98c98ecdd | |||
| 3f6314aab7 | |||
| 3051c155e2 | |||
| e686be5acd | |||
| d49f9b213a | |||
| 8f346d7832 | |||
| 163c6a4e0c | |||
| b9036001aa | |||
| b16b36588f | |||
| efaaeeaad1 | |||
| 5d93f7166e | |||
| 72ac956758 | |||
| 5cb7df174b | |||
| d15dae23c1 | |||
| c98a65bb6f | |||
| e701c79469 | |||
| 18cd3efe80 | |||
| d71974d385 | |||
| 0defdf0892 | |||
| 8d1f79b8a8 | |||
| 9dc426ea0f | |||
| 19a63b9d19 | |||
| ae97f956b3 | |||
| d619751144 | |||
| e431a1751f | |||
| 209f0aa019 | |||
| 70015a942c | |||
| 91cfcb28e7 | |||
| b2a09c1b8c | |||
| 59aaf47cbe | |||
| c426e753cd | |||
| c8cf97421b | |||
| 9718137ad3 | |||
| af1fb3fee7 | |||
| 025baf257a | |||
| 8239ab6e1b | |||
| 1f018f954e | |||
| fd78ddf641 | |||
| 7662f1f050 | |||
| 890bea2571 | |||
| f57f6dc32d | |||
| 14863e3357 | |||
| 
						 | 
					58f01c567c | ||
| 937368c753 | |||
| d8c11875d4 | |||
| bacd9e77f0 | |||
| 69d755ba32 | |||
| 31fb95e3b0 | |||
| 7d0f9870dd | |||
| 4a493b4e8d | |||
| 341dc819a0 | |||
| b58aecf7a5 | |||
| 301c017d5e | |||
| 1a4b676635 | |||
| ce54bef0b4 | |||
| 2699d29d7b | |||
| 63a07d58ca | |||
| 59fe332fe0 | |||
| 33723f4ea2 | |||
| c0ee55069e | |||
| 492ae4a225 | |||
| dcdb324391 | |||
| 90685cfdbf | |||
| ab61894373 | |||
| 662e0ade64 | |||
| 75aa847ae1 | |||
| c013228f79 | |||
| 740daf95ae | |||
| 768d29f93e | |||
| 837e084a5a | |||
| caea1b9572 | |||
| 0a255f161a | |||
| 85a2da4b5c | |||
| 647ef3049b | |||
| 7b48a5b6e2 | |||
| ec2e3da513 | |||
| 72729e410b | |||
| 5a9205a9b8 | |||
| a33601158f | |||
| 3c6b37b567 | |||
| 9b18ada78d | |||
| d57bb607e4 | |||
| 1f88ee4a0c | |||
| a32317e72f | |||
| b60cbe3854 | |||
| e0b150aa2a | |||
| 2bdfcb994e | |||
| d5c6014548 | |||
| de6fcacfd0 | |||
| 
						 | 
					993f62b6cf | ||
| aabd74d7d7 | |||
| 15b307a88f | |||
| 72b338bfc2 | |||
| 267486774c | |||
| b94a568ef1 | |||
| b773ccfc8f | |||
| fd5c28e073 | |||
| 4c232829b6 | |||
| ddf1036009 | |||
| 9b3e5c23a0 | |||
| a7eae9d46b | |||
| 8c3e9d6273 | |||
| f306cc6c16 | |||
| 643cdb29e3 | |||
| 89287a0100 | |||
| f9b02f65e0 | |||
| 41169e2848 | |||
| ba36bc709c | |||
| 4005416233 | |||
| db4a6315cd | |||
| af38fdea64 | |||
| 172df69340 | |||
| a030a0ef16 | |||
| 7a6cc2739f | |||
| 41c9701e18 | |||
| 16e79ed608 | |||
| f401e1879b | |||
| 72b451d322 | |||
| 5350c46e0a | |||
| 1f5c5774e1 | |||
| 3b29502e7e | |||
| abc7e9fd05 | |||
| dd5ce77102 | |||
| dabaa3d1e1 | |||
| a6604a3a6d | |||
| 09a3e0e294 | |||
| f20ca53a2a | |||
| a2b912500c | |||
| 7de3d196ba | |||
| 6d5669aaf8 | |||
| 2c583509a2 | |||
| 3480637600 | |||
| f4665f51b1 | |||
| 810212dc12 | |||
| c3210df517 | |||
| 9f5c354433 | |||
| 23d9fef2b1 | |||
| df3087de7d | |||
| 5dd8318dab | |||
| 56c8bcce20 | |||
| 1c4961db5b | |||
| 5e0d01ea5b | |||
| e8938621fc | |||
| 8c8dcdd8e1 | |||
| 5085c9af90 | |||
| 85bc743c8e | |||
| b8efa644e3 | |||
| c18628a4ca | |||
| 535e24c9c2 | |||
| 04308b1003 | |||
| 43c626141e | |||
| c49266e4c1 | |||
| 6677b9232f | |||
| 76e792be88 | |||
| 5eac3d9d40 | |||
| 64593f09b7 | |||
| e20b68799f | |||
| 378878967a | |||
| 251ebe7056 | |||
| 615e4d5467 | |||
| a4f602d651 | |||
| c48512fc45 | |||
| d75822c465 | |||
| 4feeba5150 | |||
| e1237363f0 | |||
| b1550b31c5 | |||
| 81b9fd9f12 | |||
| d3559ede21 | |||
| ef6ccca3f9 | |||
| f781e9648f | |||
| 18d2eea029 | |||
| a95bdab8bf | |||
| eaeb1ed0ea | |||
| f9d6377fe4 | |||
| 30cf72de78 | |||
| fd49dec34c | |||
| cdd1cdd526 | |||
| bce363e8ff | |||
| 80f609b8a2 | |||
| 6205e9a353 | |||
| 12f7e1f115 | |||
| 296ad969f4 | |||
| d25c08447e | |||
| 7502a75753 | |||
| 1a14db1a17 | |||
| 67d8bcac21 | |||
| 4ca27317b4 | |||
| dc214e878f | |||
| d669dba320 | |||
| 235f4a58e9 | |||
| 03c1d08d8c | |||
| cc36a8b51d | |||
| d743ad83e3 | |||
| 194c258dcd | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -3,3 +3,4 @@ dist
 | 
				
			|||||||
.direnv
 | 
					.direnv
 | 
				
			||||||
/after.txt
 | 
					/after.txt
 | 
				
			||||||
/before.txt
 | 
					/before.txt
 | 
				
			||||||
 | 
					**/__pycache__/**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,7 @@
 | 
				
			|||||||
overwrite: true
 | 
					overwrite: true
 | 
				
			||||||
schema: "src/schema.gql"
 | 
					schema:
 | 
				
			||||||
 | 
					  - "src/schema.gql"
 | 
				
			||||||
 | 
					  - "src/client-schema.gql"
 | 
				
			||||||
documents: "src/**/*.gql"
 | 
					documents: "src/**/*.gql"
 | 
				
			||||||
generates:
 | 
					generates:
 | 
				
			||||||
  src/index.tsx:
 | 
					  src/index.tsx:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,7 @@
 | 
				
			|||||||
  "author": "Ivan Malison <IvanMalison@gmail.com>",
 | 
					  "author": "Ivan Malison <IvanMalison@gmail.com>",
 | 
				
			||||||
  "license": "MIT",
 | 
					  "license": "MIT",
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@apollo/client": "^3.9.2",
 | 
					    "@apollo/client": "^3.11.10",
 | 
				
			||||||
    "@graphql-codegen/cli": "^5.0.0",
 | 
					    "@graphql-codegen/cli": "^5.0.0",
 | 
				
			||||||
    "@graphql-codegen/typescript": "^4.0.1",
 | 
					    "@graphql-codegen/typescript": "^4.0.1",
 | 
				
			||||||
    "@graphql-codegen/typescript-operations": "^4.0.1",
 | 
					    "@graphql-codegen/typescript-operations": "^4.0.1",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@ readme = "README.md"
 | 
				
			|||||||
packages = [{include = "rbproto"}]
 | 
					packages = [{include = "rbproto"}]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[tool.poetry.dependencies]
 | 
					[tool.poetry.dependencies]
 | 
				
			||||||
python = ">=3.10,<3.12"
 | 
					python = ">=3.10,<=3.13"
 | 
				
			||||||
protobuf = "^4.25.3"
 | 
					protobuf = "^4.25.3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,13 +13,15 @@ _sym_db = _symbol_database.Default()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nshot.proto\x12\x0fserialized_shot\"?\n\x03\x42ox\x12\x0c\n\x04left\x18\x01 \x01(\x02\x12\x0b\n\x03top\x18\x02 \x01(\x02\x12\r\n\x05width\x18\x03 \x01(\x02\x12\x0e\n\x06height\x18\x04 \x01(\x02\"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\"\x7f\n\rBallDetection\x12.\n\x0eplane_position\x18\x01 \x01(\x0b\x32\x16.serialized_shot.Point\x12(\n\nannotation\x18\x02 \x01(\x0b\x32\x14.serialized_shot.Box\x12\x14\n\x0cinterpolated\x18\x03 \x01(\x08\"T\n\x10RLEBallDetection\x12\x31\n\tdetection\x18\x01 \x01(\x0b\x32\x1e.serialized_shot.BallDetection\x12\r\n\x05\x63ount\x18\x02 \x01(\r\"L\n\x13RLEDetectionHistory\x12\x35\n\ndetections\x18\x01 \x03(\x0b\x32!.serialized_shot.RLEBallDetection\"F\n\x10\x44\x65tectionHistory\x12\x32\n\ndetections\x18\x01 \x03(\x0b\x32\x1e.serialized_shot.BallDetection\"\xe6\x01\n\x04Path\x12\x13\n\x0bstart_frame\x18\x01 \x01(\r\x12\x11\n\tend_frame\x18\x02 \x01(\r\x12\x37\n\ndetections\x18\x03 \x01(\x0b\x32!.serialized_shot.DetectionHistoryH\x00\x12>\n\x0erle_detections\x18\x04 \x01(\x0b\x32$.serialized_shot.RLEDetectionHistoryH\x00\x12\x15\n\x0bnot_present\x18\x05 \x01(\x08H\x00\x12\x11\n\tis_static\x18\x06 \x01(\x08\x42\x13\n\x11\x64\x65tection_history\"R\n\x11IdentifierHistory\x12\x17\n\x0f\x62\x61ll_identifier\x18\x01 \x01(\r\x12$\n\x05paths\x18\x02 \x03(\x0b\x32\x15.serialized_shot.Path\"H\n\x04Shot\x12@\n\x14identifier_histories\x18\x03 \x03(\x0b\x32\".serialized_shot.IdentifierHistoryb\x06proto3')
 | 
					DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nshot.proto\x12\x0fserialized_shot\"?\n\x03\x42ox\x12\x0c\n\x04left\x18\x01 \x01(\x02\x12\x0b\n\x03top\x18\x02 \x01(\x02\x12\r\n\x05width\x18\x03 \x01(\x02\x12\x0e\n\x06height\x18\x04 \x01(\x02\"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02\"\x7f\n\rBallDetection\x12.\n\x0eplane_position\x18\x01 \x01(\x0b\x32\x16.serialized_shot.Point\x12(\n\nannotation\x18\x02 \x01(\x0b\x32\x14.serialized_shot.Box\x12\x14\n\x0cinterpolated\x18\x03 \x01(\x08\"T\n\x10RLEBallDetection\x12\x31\n\tdetection\x18\x01 \x01(\x0b\x32\x1e.serialized_shot.BallDetection\x12\r\n\x05\x63ount\x18\x02 \x01(\r\"L\n\x13RLEDetectionHistory\x12\x35\n\ndetections\x18\x01 \x03(\x0b\x32!.serialized_shot.RLEBallDetection\"F\n\x10\x44\x65tectionHistory\x12\x32\n\ndetections\x18\x01 \x03(\x0b\x32\x1e.serialized_shot.BallDetection\"\xfc\x01\n\rCollisionInfo\x12\x0e\n\x06source\x18\x01 \x01(\r\x12M\n\x10\x62\x61ll_identifiers\x18\x02 \x03(\x0b\x32\x33.serialized_shot.CollisionInfo.BallIdentifiersEntry\x12\x17\n\x0fwall_identifier\x18\x03 \x01(\r\x12\x13\n\x0b\x66rame_index\x18\x04 \x01(\r\x12\x0e\n\x06static\x18\x05 \x01(\x08\x1aN\n\x14\x42\x61llIdentifiersEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12%\n\x05value\x18\x02 \x01(\x0b\x32\x16.serialized_shot.Point:\x02\x38\x01\"\xcc\x02\n\x04Path\x12\x13\n\x0bstart_frame\x18\x01 \x01(\r\x12\x11\n\tend_frame\x18\x02 \x01(\r\x12\x37\n\ndetections\x18\x03 \x01(\x0b\x32!.serialized_shot.DetectionHistoryH\x00\x12>\n\x0erle_detections\x18\x04 \x01(\x0b\x32$.serialized_shot.RLEDetectionHistoryH\x00\x12\x15\n\x0bnot_present\x18\x05 \x01(\x08H\x00\x12\x11\n\tis_static\x18\x06 \x01(\x08\x12\x32\n\nstart_info\x18\x07 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfo\x12\x30\n\x08\x65nd_info\x18\x08 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfoB\x13\n\x11\x64\x65tection_history\"R\n\x11IdentifierHistory\x12\x17\n\x0f\x62\x61ll_identifier\x18\x01 \x01(\r\x12$\n\x05paths\x18\x02 \x03(\x0b\x32\x15.serialized_shot.Path\"\xf4\x01\n\x12KeyBallIdentifiers\x12\x10\n\x08\x63ue_ball\x18\x01 \x01(\r\x12\x13\n\x0bobject_ball\x18\x02 \x01(\r\x12\x13\n\x0btarget_ball\x18\x03 \x01(\r\x12\x18\n\x10\x63ontact_sequence\x18\x04 \x03(\r\x12\x18\n\x0b\x63ue_ball_id\x18\x05 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x0eobject_ball_id\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0etarget_ball_id\x18\x07 \x01(\rH\x02\x88\x01\x01\x42\x0e\n\x0c_cue_ball_idB\x11\n\x0f_object_ball_idB\x11\n\x0f_target_ball_id\"\xa8\x01\n\x04Shot\x12@\n\x14identifier_histories\x18\x03 \x03(\x0b\x32\".serialized_shot.IdentifierHistory\x12\x36\n\tkey_balls\x18\x04 \x01(\x0b\x32#.serialized_shot.KeyBallIdentifiers\x12\x13\n\x0bstart_index\x18\x05 \x01(\r\x12\x11\n\tend_index\x18\x06 \x01(\rb\x06proto3')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
_globals = globals()
 | 
					_globals = globals()
 | 
				
			||||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
 | 
					_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
 | 
				
			||||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'shot_pb2', _globals)
 | 
					_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'shot_pb2', _globals)
 | 
				
			||||||
if _descriptor._USE_C_DESCRIPTORS == False:
 | 
					if _descriptor._USE_C_DESCRIPTORS == False:
 | 
				
			||||||
  DESCRIPTOR._options = None
 | 
					  DESCRIPTOR._options = None
 | 
				
			||||||
 | 
					  _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._options = None
 | 
				
			||||||
 | 
					  _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_options = b'8\001'
 | 
				
			||||||
  _globals['_BOX']._serialized_start=31
 | 
					  _globals['_BOX']._serialized_start=31
 | 
				
			||||||
  _globals['_BOX']._serialized_end=94
 | 
					  _globals['_BOX']._serialized_end=94
 | 
				
			||||||
  _globals['_POINT']._serialized_start=96
 | 
					  _globals['_POINT']._serialized_start=96
 | 
				
			||||||
@@ -32,10 +34,16 @@ if _descriptor._USE_C_DESCRIPTORS == False:
 | 
				
			|||||||
  _globals['_RLEDETECTIONHISTORY']._serialized_end=418
 | 
					  _globals['_RLEDETECTIONHISTORY']._serialized_end=418
 | 
				
			||||||
  _globals['_DETECTIONHISTORY']._serialized_start=420
 | 
					  _globals['_DETECTIONHISTORY']._serialized_start=420
 | 
				
			||||||
  _globals['_DETECTIONHISTORY']._serialized_end=490
 | 
					  _globals['_DETECTIONHISTORY']._serialized_end=490
 | 
				
			||||||
  _globals['_PATH']._serialized_start=493
 | 
					  _globals['_COLLISIONINFO']._serialized_start=493
 | 
				
			||||||
  _globals['_PATH']._serialized_end=723
 | 
					  _globals['_COLLISIONINFO']._serialized_end=745
 | 
				
			||||||
  _globals['_IDENTIFIERHISTORY']._serialized_start=725
 | 
					  _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_start=667
 | 
				
			||||||
  _globals['_IDENTIFIERHISTORY']._serialized_end=807
 | 
					  _globals['_COLLISIONINFO_BALLIDENTIFIERSENTRY']._serialized_end=745
 | 
				
			||||||
  _globals['_SHOT']._serialized_start=809
 | 
					  _globals['_PATH']._serialized_start=748
 | 
				
			||||||
  _globals['_SHOT']._serialized_end=881
 | 
					  _globals['_PATH']._serialized_end=1080
 | 
				
			||||||
 | 
					  _globals['_IDENTIFIERHISTORY']._serialized_start=1082
 | 
				
			||||||
 | 
					  _globals['_IDENTIFIERHISTORY']._serialized_end=1164
 | 
				
			||||||
 | 
					  _globals['_KEYBALLIDENTIFIERS']._serialized_start=1167
 | 
				
			||||||
 | 
					  _globals['_KEYBALLIDENTIFIERS']._serialized_end=1411
 | 
				
			||||||
 | 
					  _globals['_SHOT']._serialized_start=1414
 | 
				
			||||||
 | 
					  _globals['_SHOT']._serialized_end=1582
 | 
				
			||||||
# @@protoc_insertion_point(module_scope)
 | 
					# @@protoc_insertion_point(module_scope)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -55,21 +55,46 @@ class DetectionHistory(_message.Message):
 | 
				
			|||||||
    detections: _containers.RepeatedCompositeFieldContainer[BallDetection]
 | 
					    detections: _containers.RepeatedCompositeFieldContainer[BallDetection]
 | 
				
			||||||
    def __init__(self, detections: _Optional[_Iterable[_Union[BallDetection, _Mapping]]] = ...) -> None: ...
 | 
					    def __init__(self, detections: _Optional[_Iterable[_Union[BallDetection, _Mapping]]] = ...) -> None: ...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class CollisionInfo(_message.Message):
 | 
				
			||||||
 | 
					    __slots__ = ["source", "ball_identifiers", "wall_identifier", "frame_index", "static"]
 | 
				
			||||||
 | 
					    class BallIdentifiersEntry(_message.Message):
 | 
				
			||||||
 | 
					        __slots__ = ["key", "value"]
 | 
				
			||||||
 | 
					        KEY_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					        VALUE_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					        key: int
 | 
				
			||||||
 | 
					        value: Point
 | 
				
			||||||
 | 
					        def __init__(self, key: _Optional[int] = ..., value: _Optional[_Union[Point, _Mapping]] = ...) -> None: ...
 | 
				
			||||||
 | 
					    SOURCE_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					    BALL_IDENTIFIERS_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					    WALL_IDENTIFIER_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					    FRAME_INDEX_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					    STATIC_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					    source: int
 | 
				
			||||||
 | 
					    ball_identifiers: _containers.MessageMap[int, Point]
 | 
				
			||||||
 | 
					    wall_identifier: int
 | 
				
			||||||
 | 
					    frame_index: int
 | 
				
			||||||
 | 
					    static: bool
 | 
				
			||||||
 | 
					    def __init__(self, source: _Optional[int] = ..., ball_identifiers: _Optional[_Mapping[int, Point]] = ..., wall_identifier: _Optional[int] = ..., frame_index: _Optional[int] = ..., static: bool = ...) -> None: ...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Path(_message.Message):
 | 
					class Path(_message.Message):
 | 
				
			||||||
    __slots__ = ["start_frame", "end_frame", "detections", "rle_detections", "not_present", "is_static"]
 | 
					    __slots__ = ["start_frame", "end_frame", "detections", "rle_detections", "not_present", "is_static", "start_info", "end_info"]
 | 
				
			||||||
    START_FRAME_FIELD_NUMBER: _ClassVar[int]
 | 
					    START_FRAME_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
    END_FRAME_FIELD_NUMBER: _ClassVar[int]
 | 
					    END_FRAME_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
    DETECTIONS_FIELD_NUMBER: _ClassVar[int]
 | 
					    DETECTIONS_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
    RLE_DETECTIONS_FIELD_NUMBER: _ClassVar[int]
 | 
					    RLE_DETECTIONS_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
    NOT_PRESENT_FIELD_NUMBER: _ClassVar[int]
 | 
					    NOT_PRESENT_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
    IS_STATIC_FIELD_NUMBER: _ClassVar[int]
 | 
					    IS_STATIC_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					    START_INFO_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					    END_INFO_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
    start_frame: int
 | 
					    start_frame: int
 | 
				
			||||||
    end_frame: int
 | 
					    end_frame: int
 | 
				
			||||||
    detections: DetectionHistory
 | 
					    detections: DetectionHistory
 | 
				
			||||||
    rle_detections: RLEDetectionHistory
 | 
					    rle_detections: RLEDetectionHistory
 | 
				
			||||||
    not_present: bool
 | 
					    not_present: bool
 | 
				
			||||||
    is_static: bool
 | 
					    is_static: bool
 | 
				
			||||||
    def __init__(self, start_frame: _Optional[int] = ..., end_frame: _Optional[int] = ..., detections: _Optional[_Union[DetectionHistory, _Mapping]] = ..., rle_detections: _Optional[_Union[RLEDetectionHistory, _Mapping]] = ..., not_present: bool = ..., is_static: bool = ...) -> None: ...
 | 
					    start_info: CollisionInfo
 | 
				
			||||||
 | 
					    end_info: CollisionInfo
 | 
				
			||||||
 | 
					    def __init__(self, start_frame: _Optional[int] = ..., end_frame: _Optional[int] = ..., detections: _Optional[_Union[DetectionHistory, _Mapping]] = ..., rle_detections: _Optional[_Union[RLEDetectionHistory, _Mapping]] = ..., not_present: bool = ..., is_static: bool = ..., start_info: _Optional[_Union[CollisionInfo, _Mapping]] = ..., end_info: _Optional[_Union[CollisionInfo, _Mapping]] = ...) -> None: ...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class IdentifierHistory(_message.Message):
 | 
					class IdentifierHistory(_message.Message):
 | 
				
			||||||
    __slots__ = ["ball_identifier", "paths"]
 | 
					    __slots__ = ["ball_identifier", "paths"]
 | 
				
			||||||
@@ -79,8 +104,32 @@ class IdentifierHistory(_message.Message):
 | 
				
			|||||||
    paths: _containers.RepeatedCompositeFieldContainer[Path]
 | 
					    paths: _containers.RepeatedCompositeFieldContainer[Path]
 | 
				
			||||||
    def __init__(self, ball_identifier: _Optional[int] = ..., paths: _Optional[_Iterable[_Union[Path, _Mapping]]] = ...) -> None: ...
 | 
					    def __init__(self, ball_identifier: _Optional[int] = ..., paths: _Optional[_Iterable[_Union[Path, _Mapping]]] = ...) -> None: ...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class KeyBallIdentifiers(_message.Message):
 | 
				
			||||||
 | 
					    __slots__ = ["cue_ball", "object_ball", "target_ball", "contact_sequence", "cue_ball_id", "object_ball_id", "target_ball_id"]
 | 
				
			||||||
 | 
					    CUE_BALL_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					    OBJECT_BALL_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					    TARGET_BALL_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					    CONTACT_SEQUENCE_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					    CUE_BALL_ID_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					    OBJECT_BALL_ID_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					    TARGET_BALL_ID_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					    cue_ball: int
 | 
				
			||||||
 | 
					    object_ball: int
 | 
				
			||||||
 | 
					    target_ball: int
 | 
				
			||||||
 | 
					    contact_sequence: _containers.RepeatedScalarFieldContainer[int]
 | 
				
			||||||
 | 
					    cue_ball_id: int
 | 
				
			||||||
 | 
					    object_ball_id: int
 | 
				
			||||||
 | 
					    target_ball_id: int
 | 
				
			||||||
 | 
					    def __init__(self, cue_ball: _Optional[int] = ..., object_ball: _Optional[int] = ..., target_ball: _Optional[int] = ..., contact_sequence: _Optional[_Iterable[int]] = ..., cue_ball_id: _Optional[int] = ..., object_ball_id: _Optional[int] = ..., target_ball_id: _Optional[int] = ...) -> None: ...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Shot(_message.Message):
 | 
					class Shot(_message.Message):
 | 
				
			||||||
    __slots__ = ["identifier_histories"]
 | 
					    __slots__ = ["identifier_histories", "key_balls", "start_index", "end_index"]
 | 
				
			||||||
    IDENTIFIER_HISTORIES_FIELD_NUMBER: _ClassVar[int]
 | 
					    IDENTIFIER_HISTORIES_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					    KEY_BALLS_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					    START_INDEX_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
 | 
					    END_INDEX_FIELD_NUMBER: _ClassVar[int]
 | 
				
			||||||
    identifier_histories: _containers.RepeatedCompositeFieldContainer[IdentifierHistory]
 | 
					    identifier_histories: _containers.RepeatedCompositeFieldContainer[IdentifierHistory]
 | 
				
			||||||
    def __init__(self, identifier_histories: _Optional[_Iterable[_Union[IdentifierHistory, _Mapping]]] = ...) -> None: ...
 | 
					    key_balls: KeyBallIdentifiers
 | 
				
			||||||
 | 
					    start_index: int
 | 
				
			||||||
 | 
					    end_index: int
 | 
				
			||||||
 | 
					    def __init__(self, identifier_histories: _Optional[_Iterable[_Union[IdentifierHistory, _Mapping]]] = ..., key_balls: _Optional[_Union[KeyBallIdentifiers, _Mapping]] = ..., start_index: _Optional[int] = ..., end_index: _Optional[int] = ...) -> None: ...
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,12 +25,16 @@ message RLEBallDetection {
 | 
				
			|||||||
  uint32 count = 2;
 | 
					  uint32 count = 2;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
message RLEDetectionHistory {
 | 
					message RLEDetectionHistory { repeated RLEBallDetection detections = 1; }
 | 
				
			||||||
  repeated RLEBallDetection detections = 1;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
message DetectionHistory {
 | 
					message DetectionHistory { repeated BallDetection detections = 1; }
 | 
				
			||||||
  repeated BallDetection detections = 1;
 | 
					
 | 
				
			||||||
 | 
					message CollisionInfo {
 | 
				
			||||||
 | 
					  uint32 source = 1;
 | 
				
			||||||
 | 
					  map<uint32, Point> ball_identifiers = 2;
 | 
				
			||||||
 | 
					  uint32 wall_identifier = 3;
 | 
				
			||||||
 | 
					  uint32 frame_index = 4;
 | 
				
			||||||
 | 
					  bool static = 5;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
message Path {
 | 
					message Path {
 | 
				
			||||||
@@ -42,13 +46,32 @@ message Path {
 | 
				
			|||||||
    bool not_present = 5;
 | 
					    bool not_present = 5;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  bool is_static = 6;
 | 
					  bool is_static = 6;
 | 
				
			||||||
 | 
					  CollisionInfo start_info = 7;
 | 
				
			||||||
 | 
					  CollisionInfo end_info = 8;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
message IdentifierHistory {
 | 
					message IdentifierHistory {
 | 
				
			||||||
  uint32 ball_identifier = 1;
 | 
					  uint32 ball_identifier = 1;
 | 
				
			||||||
  repeated Path paths = 2;
 | 
					  repeated Path paths = 2;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					message KeyBallIdentifiers {
 | 
				
			||||||
 | 
					  uint32 cue_ball = 1;
 | 
				
			||||||
 | 
					  uint32 object_ball = 2;
 | 
				
			||||||
 | 
					  uint32 target_ball = 3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // For now this will just be cue->object/target->target
 | 
				
			||||||
 | 
					  // Long term this will potentially represent a linked list
 | 
				
			||||||
 | 
					  // of all balls in a shot.
 | 
				
			||||||
 | 
					  repeated uint32 contact_sequence = 4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  optional uint32 cue_ball_id = 5;
 | 
				
			||||||
 | 
					  optional uint32 object_ball_id = 6;
 | 
				
			||||||
 | 
					  optional uint32 target_ball_id = 7;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
message Shot {
 | 
					message Shot {
 | 
				
			||||||
  repeated IdentifierHistory identifier_histories = 3;
 | 
					  repeated IdentifierHistory identifier_histories = 3;
 | 
				
			||||||
 | 
					  KeyBallIdentifiers key_balls = 4;
 | 
				
			||||||
 | 
					  uint32 start_index = 5;
 | 
				
			||||||
 | 
					  uint32 end_index = 6;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -427,6 +427,150 @@ function _decodeDetectionHistory(bb: ByteBuffer): DetectionHistory {
 | 
				
			|||||||
  return message;
 | 
					  return message;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface CollisionInfo {
 | 
				
			||||||
 | 
					  source?: number;
 | 
				
			||||||
 | 
					  ball_identifiers?: { [key: number]: Point };
 | 
				
			||||||
 | 
					  wall_identifier?: number;
 | 
				
			||||||
 | 
					  frame_index?: number;
 | 
				
			||||||
 | 
					  static?: boolean;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function encodeCollisionInfo(message: CollisionInfo): Uint8Array {
 | 
				
			||||||
 | 
					  let bb = popByteBuffer();
 | 
				
			||||||
 | 
					  _encodeCollisionInfo(message, bb);
 | 
				
			||||||
 | 
					  return toUint8Array(bb);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function _encodeCollisionInfo(message: CollisionInfo, bb: ByteBuffer): void {
 | 
				
			||||||
 | 
					  // optional uint32 source = 1;
 | 
				
			||||||
 | 
					  let $source = message.source;
 | 
				
			||||||
 | 
					  if ($source !== undefined) {
 | 
				
			||||||
 | 
					    writeVarint32(bb, 8);
 | 
				
			||||||
 | 
					    writeVarint32(bb, $source);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // optional map<uint32, Point> ball_identifiers = 2;
 | 
				
			||||||
 | 
					  let map$ball_identifiers = message.ball_identifiers;
 | 
				
			||||||
 | 
					  if (map$ball_identifiers !== undefined) {
 | 
				
			||||||
 | 
					    for (let key in map$ball_identifiers) {
 | 
				
			||||||
 | 
					      let nested = popByteBuffer();
 | 
				
			||||||
 | 
					      let value = map$ball_identifiers[key];
 | 
				
			||||||
 | 
					      writeVarint32(nested, 8);
 | 
				
			||||||
 | 
					      writeVarint32(nested, +key);
 | 
				
			||||||
 | 
					      writeVarint32(nested, 18);
 | 
				
			||||||
 | 
					      let nestedValue = popByteBuffer();
 | 
				
			||||||
 | 
					      _encodePoint(value, nestedValue);
 | 
				
			||||||
 | 
					      writeVarint32(nested, nestedValue.limit);
 | 
				
			||||||
 | 
					      writeByteBuffer(nested, nestedValue);
 | 
				
			||||||
 | 
					      pushByteBuffer(nestedValue);
 | 
				
			||||||
 | 
					      writeVarint32(bb, 18);
 | 
				
			||||||
 | 
					      writeVarint32(bb, nested.offset);
 | 
				
			||||||
 | 
					      writeByteBuffer(bb, nested);
 | 
				
			||||||
 | 
					      pushByteBuffer(nested);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // optional uint32 wall_identifier = 3;
 | 
				
			||||||
 | 
					  let $wall_identifier = message.wall_identifier;
 | 
				
			||||||
 | 
					  if ($wall_identifier !== undefined) {
 | 
				
			||||||
 | 
					    writeVarint32(bb, 24);
 | 
				
			||||||
 | 
					    writeVarint32(bb, $wall_identifier);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // optional uint32 frame_index = 4;
 | 
				
			||||||
 | 
					  let $frame_index = message.frame_index;
 | 
				
			||||||
 | 
					  if ($frame_index !== undefined) {
 | 
				
			||||||
 | 
					    writeVarint32(bb, 32);
 | 
				
			||||||
 | 
					    writeVarint32(bb, $frame_index);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // optional bool static = 5;
 | 
				
			||||||
 | 
					  let $static = message.static;
 | 
				
			||||||
 | 
					  if ($static !== undefined) {
 | 
				
			||||||
 | 
					    writeVarint32(bb, 40);
 | 
				
			||||||
 | 
					    writeByte(bb, $static ? 1 : 0);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function decodeCollisionInfo(binary: Uint8Array): CollisionInfo {
 | 
				
			||||||
 | 
					  return _decodeCollisionInfo(wrapByteBuffer(binary));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function _decodeCollisionInfo(bb: ByteBuffer): CollisionInfo {
 | 
				
			||||||
 | 
					  let message: CollisionInfo = {} as any;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  end_of_message: while (!isAtEnd(bb)) {
 | 
				
			||||||
 | 
					    let tag = readVarint32(bb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (tag >>> 3) {
 | 
				
			||||||
 | 
					      case 0:
 | 
				
			||||||
 | 
					        break end_of_message;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // optional uint32 source = 1;
 | 
				
			||||||
 | 
					      case 1: {
 | 
				
			||||||
 | 
					        message.source = readVarint32(bb) >>> 0;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // optional map<uint32, Point> ball_identifiers = 2;
 | 
				
			||||||
 | 
					      case 2: {
 | 
				
			||||||
 | 
					        let values =
 | 
				
			||||||
 | 
					          message.ball_identifiers || (message.ball_identifiers = {});
 | 
				
			||||||
 | 
					        let outerLimit = pushTemporaryLength(bb);
 | 
				
			||||||
 | 
					        let key: number | undefined;
 | 
				
			||||||
 | 
					        let value: Point | undefined;
 | 
				
			||||||
 | 
					        end_of_entry: while (!isAtEnd(bb)) {
 | 
				
			||||||
 | 
					          let tag = readVarint32(bb);
 | 
				
			||||||
 | 
					          switch (tag >>> 3) {
 | 
				
			||||||
 | 
					            case 0:
 | 
				
			||||||
 | 
					              break end_of_entry;
 | 
				
			||||||
 | 
					            case 1: {
 | 
				
			||||||
 | 
					              key = readVarint32(bb) >>> 0;
 | 
				
			||||||
 | 
					              break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            case 2: {
 | 
				
			||||||
 | 
					              let valueLimit = pushTemporaryLength(bb);
 | 
				
			||||||
 | 
					              value = _decodePoint(bb);
 | 
				
			||||||
 | 
					              bb.limit = valueLimit;
 | 
				
			||||||
 | 
					              break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					              skipUnknownField(bb, tag & 7);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (key === undefined || value === undefined)
 | 
				
			||||||
 | 
					          throw new Error("Invalid data for map: ball_identifiers");
 | 
				
			||||||
 | 
					        values[key] = value;
 | 
				
			||||||
 | 
					        bb.limit = outerLimit;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // optional uint32 wall_identifier = 3;
 | 
				
			||||||
 | 
					      case 3: {
 | 
				
			||||||
 | 
					        message.wall_identifier = readVarint32(bb) >>> 0;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // optional uint32 frame_index = 4;
 | 
				
			||||||
 | 
					      case 4: {
 | 
				
			||||||
 | 
					        message.frame_index = readVarint32(bb) >>> 0;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // optional bool static = 5;
 | 
				
			||||||
 | 
					      case 5: {
 | 
				
			||||||
 | 
					        message.static = !!readByte(bb);
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      default:
 | 
				
			||||||
 | 
					        skipUnknownField(bb, tag & 7);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return message;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface Path {
 | 
					export interface Path {
 | 
				
			||||||
  start_frame?: number;
 | 
					  start_frame?: number;
 | 
				
			||||||
  end_frame?: number;
 | 
					  end_frame?: number;
 | 
				
			||||||
@@ -434,6 +578,8 @@ export interface Path {
 | 
				
			|||||||
  rle_detections?: RLEDetectionHistory;
 | 
					  rle_detections?: RLEDetectionHistory;
 | 
				
			||||||
  not_present?: boolean;
 | 
					  not_present?: boolean;
 | 
				
			||||||
  is_static?: boolean;
 | 
					  is_static?: boolean;
 | 
				
			||||||
 | 
					  start_info?: CollisionInfo;
 | 
				
			||||||
 | 
					  end_info?: CollisionInfo;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function encodePath(message: Path): Uint8Array {
 | 
					export function encodePath(message: Path): Uint8Array {
 | 
				
			||||||
@@ -492,6 +638,28 @@ function _encodePath(message: Path, bb: ByteBuffer): void {
 | 
				
			|||||||
    writeVarint32(bb, 48);
 | 
					    writeVarint32(bb, 48);
 | 
				
			||||||
    writeByte(bb, $is_static ? 1 : 0);
 | 
					    writeByte(bb, $is_static ? 1 : 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // optional CollisionInfo start_info = 7;
 | 
				
			||||||
 | 
					  let $start_info = message.start_info;
 | 
				
			||||||
 | 
					  if ($start_info !== undefined) {
 | 
				
			||||||
 | 
					    writeVarint32(bb, 58);
 | 
				
			||||||
 | 
					    let nested = popByteBuffer();
 | 
				
			||||||
 | 
					    _encodeCollisionInfo($start_info, nested);
 | 
				
			||||||
 | 
					    writeVarint32(bb, nested.limit);
 | 
				
			||||||
 | 
					    writeByteBuffer(bb, nested);
 | 
				
			||||||
 | 
					    pushByteBuffer(nested);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // optional CollisionInfo end_info = 8;
 | 
				
			||||||
 | 
					  let $end_info = message.end_info;
 | 
				
			||||||
 | 
					  if ($end_info !== undefined) {
 | 
				
			||||||
 | 
					    writeVarint32(bb, 66);
 | 
				
			||||||
 | 
					    let nested = popByteBuffer();
 | 
				
			||||||
 | 
					    _encodeCollisionInfo($end_info, nested);
 | 
				
			||||||
 | 
					    writeVarint32(bb, nested.limit);
 | 
				
			||||||
 | 
					    writeByteBuffer(bb, nested);
 | 
				
			||||||
 | 
					    pushByteBuffer(nested);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function decodePath(binary: Uint8Array): Path {
 | 
					export function decodePath(binary: Uint8Array): Path {
 | 
				
			||||||
@@ -548,6 +716,22 @@ function _decodePath(bb: ByteBuffer): Path {
 | 
				
			|||||||
        break;
 | 
					        break;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // optional CollisionInfo start_info = 7;
 | 
				
			||||||
 | 
					      case 7: {
 | 
				
			||||||
 | 
					        let limit = pushTemporaryLength(bb);
 | 
				
			||||||
 | 
					        message.start_info = _decodeCollisionInfo(bb);
 | 
				
			||||||
 | 
					        bb.limit = limit;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // optional CollisionInfo end_info = 8;
 | 
				
			||||||
 | 
					      case 8: {
 | 
				
			||||||
 | 
					        let limit = pushTemporaryLength(bb);
 | 
				
			||||||
 | 
					        message.end_info = _decodeCollisionInfo(bb);
 | 
				
			||||||
 | 
					        bb.limit = limit;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      default:
 | 
					      default:
 | 
				
			||||||
        skipUnknownField(bb, tag & 7);
 | 
					        skipUnknownField(bb, tag & 7);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -631,8 +815,165 @@ function _decodeIdentifierHistory(bb: ByteBuffer): IdentifierHistory {
 | 
				
			|||||||
  return message;
 | 
					  return message;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface KeyBallIdentifiers {
 | 
				
			||||||
 | 
					  cue_ball?: number;
 | 
				
			||||||
 | 
					  object_ball?: number;
 | 
				
			||||||
 | 
					  target_ball?: number;
 | 
				
			||||||
 | 
					  contact_sequence?: number[];
 | 
				
			||||||
 | 
					  cue_ball_id?: number;
 | 
				
			||||||
 | 
					  object_ball_id?: number;
 | 
				
			||||||
 | 
					  target_ball_id?: number;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function encodeKeyBallIdentifiers(
 | 
				
			||||||
 | 
					  message: KeyBallIdentifiers,
 | 
				
			||||||
 | 
					): Uint8Array {
 | 
				
			||||||
 | 
					  let bb = popByteBuffer();
 | 
				
			||||||
 | 
					  _encodeKeyBallIdentifiers(message, bb);
 | 
				
			||||||
 | 
					  return toUint8Array(bb);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function _encodeKeyBallIdentifiers(
 | 
				
			||||||
 | 
					  message: KeyBallIdentifiers,
 | 
				
			||||||
 | 
					  bb: ByteBuffer,
 | 
				
			||||||
 | 
					): void {
 | 
				
			||||||
 | 
					  // optional uint32 cue_ball = 1;
 | 
				
			||||||
 | 
					  let $cue_ball = message.cue_ball;
 | 
				
			||||||
 | 
					  if ($cue_ball !== undefined) {
 | 
				
			||||||
 | 
					    writeVarint32(bb, 8);
 | 
				
			||||||
 | 
					    writeVarint32(bb, $cue_ball);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // optional uint32 object_ball = 2;
 | 
				
			||||||
 | 
					  let $object_ball = message.object_ball;
 | 
				
			||||||
 | 
					  if ($object_ball !== undefined) {
 | 
				
			||||||
 | 
					    writeVarint32(bb, 16);
 | 
				
			||||||
 | 
					    writeVarint32(bb, $object_ball);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // optional uint32 target_ball = 3;
 | 
				
			||||||
 | 
					  let $target_ball = message.target_ball;
 | 
				
			||||||
 | 
					  if ($target_ball !== undefined) {
 | 
				
			||||||
 | 
					    writeVarint32(bb, 24);
 | 
				
			||||||
 | 
					    writeVarint32(bb, $target_ball);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // repeated uint32 contact_sequence = 4;
 | 
				
			||||||
 | 
					  let array$contact_sequence = message.contact_sequence;
 | 
				
			||||||
 | 
					  if (array$contact_sequence !== undefined) {
 | 
				
			||||||
 | 
					    let packed = popByteBuffer();
 | 
				
			||||||
 | 
					    for (let value of array$contact_sequence) {
 | 
				
			||||||
 | 
					      writeVarint32(packed, value);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    writeVarint32(bb, 34);
 | 
				
			||||||
 | 
					    writeVarint32(bb, packed.offset);
 | 
				
			||||||
 | 
					    writeByteBuffer(bb, packed);
 | 
				
			||||||
 | 
					    pushByteBuffer(packed);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // optional uint32 cue_ball_id = 5;
 | 
				
			||||||
 | 
					  let $cue_ball_id = message.cue_ball_id;
 | 
				
			||||||
 | 
					  if ($cue_ball_id !== undefined) {
 | 
				
			||||||
 | 
					    writeVarint32(bb, 40);
 | 
				
			||||||
 | 
					    writeVarint32(bb, $cue_ball_id);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // optional uint32 object_ball_id = 6;
 | 
				
			||||||
 | 
					  let $object_ball_id = message.object_ball_id;
 | 
				
			||||||
 | 
					  if ($object_ball_id !== undefined) {
 | 
				
			||||||
 | 
					    writeVarint32(bb, 48);
 | 
				
			||||||
 | 
					    writeVarint32(bb, $object_ball_id);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // optional uint32 target_ball_id = 7;
 | 
				
			||||||
 | 
					  let $target_ball_id = message.target_ball_id;
 | 
				
			||||||
 | 
					  if ($target_ball_id !== undefined) {
 | 
				
			||||||
 | 
					    writeVarint32(bb, 56);
 | 
				
			||||||
 | 
					    writeVarint32(bb, $target_ball_id);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function decodeKeyBallIdentifiers(
 | 
				
			||||||
 | 
					  binary: Uint8Array,
 | 
				
			||||||
 | 
					): KeyBallIdentifiers {
 | 
				
			||||||
 | 
					  return _decodeKeyBallIdentifiers(wrapByteBuffer(binary));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function _decodeKeyBallIdentifiers(bb: ByteBuffer): KeyBallIdentifiers {
 | 
				
			||||||
 | 
					  let message: KeyBallIdentifiers = {} as any;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  end_of_message: while (!isAtEnd(bb)) {
 | 
				
			||||||
 | 
					    let tag = readVarint32(bb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (tag >>> 3) {
 | 
				
			||||||
 | 
					      case 0:
 | 
				
			||||||
 | 
					        break end_of_message;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // optional uint32 cue_ball = 1;
 | 
				
			||||||
 | 
					      case 1: {
 | 
				
			||||||
 | 
					        message.cue_ball = readVarint32(bb) >>> 0;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // optional uint32 object_ball = 2;
 | 
				
			||||||
 | 
					      case 2: {
 | 
				
			||||||
 | 
					        message.object_ball = readVarint32(bb) >>> 0;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // optional uint32 target_ball = 3;
 | 
				
			||||||
 | 
					      case 3: {
 | 
				
			||||||
 | 
					        message.target_ball = readVarint32(bb) >>> 0;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // repeated uint32 contact_sequence = 4;
 | 
				
			||||||
 | 
					      case 4: {
 | 
				
			||||||
 | 
					        let values =
 | 
				
			||||||
 | 
					          message.contact_sequence || (message.contact_sequence = []);
 | 
				
			||||||
 | 
					        if ((tag & 7) === 2) {
 | 
				
			||||||
 | 
					          let outerLimit = pushTemporaryLength(bb);
 | 
				
			||||||
 | 
					          while (!isAtEnd(bb)) {
 | 
				
			||||||
 | 
					            values.push(readVarint32(bb) >>> 0);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          bb.limit = outerLimit;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          values.push(readVarint32(bb) >>> 0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // optional uint32 cue_ball_id = 5;
 | 
				
			||||||
 | 
					      case 5: {
 | 
				
			||||||
 | 
					        message.cue_ball_id = readVarint32(bb) >>> 0;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // optional uint32 object_ball_id = 6;
 | 
				
			||||||
 | 
					      case 6: {
 | 
				
			||||||
 | 
					        message.object_ball_id = readVarint32(bb) >>> 0;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // optional uint32 target_ball_id = 7;
 | 
				
			||||||
 | 
					      case 7: {
 | 
				
			||||||
 | 
					        message.target_ball_id = readVarint32(bb) >>> 0;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      default:
 | 
				
			||||||
 | 
					        skipUnknownField(bb, tag & 7);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return message;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface Shot {
 | 
					export interface Shot {
 | 
				
			||||||
  identifier_histories?: IdentifierHistory[];
 | 
					  identifier_histories?: IdentifierHistory[];
 | 
				
			||||||
 | 
					  key_balls?: KeyBallIdentifiers;
 | 
				
			||||||
 | 
					  start_index?: number;
 | 
				
			||||||
 | 
					  end_index?: number;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function encodeShot(message: Shot): Uint8Array {
 | 
					export function encodeShot(message: Shot): Uint8Array {
 | 
				
			||||||
@@ -654,6 +995,31 @@ function _encodeShot(message: Shot, bb: ByteBuffer): void {
 | 
				
			|||||||
      pushByteBuffer(nested);
 | 
					      pushByteBuffer(nested);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // optional KeyBallIdentifiers key_balls = 4;
 | 
				
			||||||
 | 
					  let $key_balls = message.key_balls;
 | 
				
			||||||
 | 
					  if ($key_balls !== undefined) {
 | 
				
			||||||
 | 
					    writeVarint32(bb, 34);
 | 
				
			||||||
 | 
					    let nested = popByteBuffer();
 | 
				
			||||||
 | 
					    _encodeKeyBallIdentifiers($key_balls, nested);
 | 
				
			||||||
 | 
					    writeVarint32(bb, nested.limit);
 | 
				
			||||||
 | 
					    writeByteBuffer(bb, nested);
 | 
				
			||||||
 | 
					    pushByteBuffer(nested);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // optional uint32 start_index = 5;
 | 
				
			||||||
 | 
					  let $start_index = message.start_index;
 | 
				
			||||||
 | 
					  if ($start_index !== undefined) {
 | 
				
			||||||
 | 
					    writeVarint32(bb, 40);
 | 
				
			||||||
 | 
					    writeVarint32(bb, $start_index);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // optional uint32 end_index = 6;
 | 
				
			||||||
 | 
					  let $end_index = message.end_index;
 | 
				
			||||||
 | 
					  if ($end_index !== undefined) {
 | 
				
			||||||
 | 
					    writeVarint32(bb, 48);
 | 
				
			||||||
 | 
					    writeVarint32(bb, $end_index);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function decodeShot(binary: Uint8Array): Shot {
 | 
					export function decodeShot(binary: Uint8Array): Shot {
 | 
				
			||||||
@@ -680,6 +1046,26 @@ function _decodeShot(bb: ByteBuffer): Shot {
 | 
				
			|||||||
        break;
 | 
					        break;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // optional KeyBallIdentifiers key_balls = 4;
 | 
				
			||||||
 | 
					      case 4: {
 | 
				
			||||||
 | 
					        let limit = pushTemporaryLength(bb);
 | 
				
			||||||
 | 
					        message.key_balls = _decodeKeyBallIdentifiers(bb);
 | 
				
			||||||
 | 
					        bb.limit = limit;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // optional uint32 start_index = 5;
 | 
				
			||||||
 | 
					      case 5: {
 | 
				
			||||||
 | 
					        message.start_index = readVarint32(bb) >>> 0;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // optional uint32 end_index = 6;
 | 
				
			||||||
 | 
					      case 6: {
 | 
				
			||||||
 | 
					        message.end_index = readVarint32(bb) >>> 0;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      default:
 | 
					      default:
 | 
				
			||||||
        skipUnknownField(bb, tag & 7);
 | 
					        skipUnknownField(bb, tag & 7);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										32
									
								
								src/client-schema.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/client-schema.gql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					# see: https://www.apollographql.com/docs/react/local-state/managing-state-with-field-policies/
 | 
				
			||||||
 | 
					directive @client on FIELD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SegmentInfo {
 | 
				
			||||||
 | 
					  index: Int!
 | 
				
			||||||
 | 
					  time: Float!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extend type ShotGQL {
 | 
				
			||||||
 | 
					  startTime: Float!
 | 
				
			||||||
 | 
					  endTime: Float!
 | 
				
			||||||
 | 
					  startSegment: SegmentInfo!
 | 
				
			||||||
 | 
					  endSegment: SegmentInfo!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extend type UploadStreamGQL {
 | 
				
			||||||
 | 
					  segmentEndFrames: [Int!]!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extend type HLSPlaylistGQL {
 | 
				
			||||||
 | 
					  segmentStartTimes: [Float!]!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SegmentEndFramesGQL {
 | 
				
			||||||
 | 
					  id: Int!
 | 
				
			||||||
 | 
					  segmentEndFrames: [Int!]!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SegmentStartTimesGQL {
 | 
				
			||||||
 | 
					  id: Int!
 | 
				
			||||||
 | 
					  segmentStartTimes: [Float!]!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										6464
									
								
								src/index.tsx
									
									
									
									
									
								
							
							
						
						
									
										6464
									
								
								src/index.tsx
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -4,5 +4,6 @@ query getDeployedConfig {
 | 
				
			|||||||
    devMode
 | 
					    devMode
 | 
				
			||||||
    environment
 | 
					    environment
 | 
				
			||||||
    firebase
 | 
					    firebase
 | 
				
			||||||
 | 
					    minimumAllowedAppVersion
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					# DO NOT USE: use getVideoFeed instead
 | 
				
			||||||
query GetFeed(
 | 
					query GetFeed(
 | 
				
			||||||
  $limit: Int! = 5
 | 
					  $limit: Int! = 5
 | 
				
			||||||
  $after: String = null
 | 
					  $after: String = null
 | 
				
			||||||
@@ -5,30 +6,92 @@ query GetFeed(
 | 
				
			|||||||
) {
 | 
					) {
 | 
				
			||||||
  getUserVideos(limit: $limit, after: $after, filters: $filters) {
 | 
					  getUserVideos(limit: $limit, after: $after, filters: $filters) {
 | 
				
			||||||
    videos {
 | 
					    videos {
 | 
				
			||||||
      id
 | 
					      ...VideoCardFields
 | 
				
			||||||
      owner {
 | 
					    }
 | 
				
			||||||
        username
 | 
					    pageInfo {
 | 
				
			||||||
      }
 | 
					      hasNextPage
 | 
				
			||||||
      name
 | 
					      endCursor
 | 
				
			||||||
      screenshotUri
 | 
					    }
 | 
				
			||||||
      totalShotsMade
 | 
					  }
 | 
				
			||||||
      totalShots
 | 
					}
 | 
				
			||||||
      makePercentage
 | 
					
 | 
				
			||||||
      createdAt
 | 
					fragment VideoCardFields on VideoGQL {
 | 
				
			||||||
      updatedAt
 | 
					  id
 | 
				
			||||||
      startTime
 | 
					  owner {
 | 
				
			||||||
      endTime
 | 
					    id
 | 
				
			||||||
      elapsedTime
 | 
					    username
 | 
				
			||||||
      screenshotUri
 | 
					    profileImageUri
 | 
				
			||||||
      stream {
 | 
					  }
 | 
				
			||||||
        isCompleted
 | 
					  name
 | 
				
			||||||
      }
 | 
					  screenshotUri
 | 
				
			||||||
      tags {
 | 
					  totalShotsMade
 | 
				
			||||||
        tagClasses {
 | 
					  totalShots
 | 
				
			||||||
          name
 | 
					  makePercentage
 | 
				
			||||||
        }
 | 
					  averageTimeBetweenShots
 | 
				
			||||||
        name
 | 
					  averageDifficulty
 | 
				
			||||||
      }
 | 
					  createdAt
 | 
				
			||||||
 | 
					  updatedAt
 | 
				
			||||||
 | 
					  startTime
 | 
				
			||||||
 | 
					  endTime
 | 
				
			||||||
 | 
					  private
 | 
				
			||||||
 | 
					  elapsedTime
 | 
				
			||||||
 | 
					  screenshotUri
 | 
				
			||||||
 | 
					  stream {
 | 
				
			||||||
 | 
					    id
 | 
				
			||||||
 | 
					    lastIntendedSegmentBound
 | 
				
			||||||
 | 
					    isCompleted
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  tableSize
 | 
				
			||||||
 | 
					  tags {
 | 
				
			||||||
 | 
					    tagClasses {
 | 
				
			||||||
 | 
					      name
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    name
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  currentProcessing {
 | 
				
			||||||
 | 
					    id
 | 
				
			||||||
 | 
					    errors {
 | 
				
			||||||
 | 
					      message
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    status
 | 
				
			||||||
 | 
					    statuses {
 | 
				
			||||||
 | 
					      status
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  reactions {
 | 
				
			||||||
 | 
					    videoId
 | 
				
			||||||
 | 
					    user {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      username
 | 
				
			||||||
 | 
					      profileImageUri
 | 
				
			||||||
 | 
					      followers {
 | 
				
			||||||
 | 
					        id
 | 
				
			||||||
 | 
					        username
 | 
				
			||||||
 | 
					        profileImageUri
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    reaction
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetVideoFeed(
 | 
				
			||||||
 | 
					  $limit: Int! = 5
 | 
				
			||||||
 | 
					  $after: String = null
 | 
				
			||||||
 | 
					  $filters: VideoFilterInput = null
 | 
				
			||||||
 | 
					  $includeCallersVideos: Boolean = null
 | 
				
			||||||
 | 
					  $includePrivate: IncludePrivateEnum = MINE
 | 
				
			||||||
 | 
					  $feedInput: VideoFeedInputGQL = null
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					  getFeedVideos(
 | 
				
			||||||
 | 
					    limit: $limit
 | 
				
			||||||
 | 
					    after: $after
 | 
				
			||||||
 | 
					    filters: $filters
 | 
				
			||||||
 | 
					    includeCallersVideos: $includeCallersVideos
 | 
				
			||||||
 | 
					    includePrivate: $includePrivate
 | 
				
			||||||
 | 
					    feedInput: $feedInput
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    videos {
 | 
				
			||||||
 | 
					      ...VideoCardFields
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    pageInfo {
 | 
					    pageInfo {
 | 
				
			||||||
      hasNextPage
 | 
					      hasNextPage
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										32
									
								
								src/operations/leaderboards.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/operations/leaderboards.gql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					query GetMakesLeaderboard($interval: TimeInterval, $when: DateTime) {
 | 
				
			||||||
 | 
					  getMakesLeaderboard(interval: $interval, when: $when) {
 | 
				
			||||||
 | 
					    entries {
 | 
				
			||||||
 | 
					      user {
 | 
				
			||||||
 | 
					        id
 | 
				
			||||||
 | 
					        username
 | 
				
			||||||
 | 
					        profileImageUri
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      value
 | 
				
			||||||
 | 
					      proportionMade
 | 
				
			||||||
 | 
					      total
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetRunsLeaderboard($interval: TimeInterval, $when: DateTime) {
 | 
				
			||||||
 | 
					  getLongestRunsLeaderboard(interval: $interval, when: $when) {
 | 
				
			||||||
 | 
					    entries {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      runLength
 | 
				
			||||||
 | 
					      video {
 | 
				
			||||||
 | 
					        name
 | 
				
			||||||
 | 
					        createdAt
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      user {
 | 
				
			||||||
 | 
					        id
 | 
				
			||||||
 | 
					        username
 | 
				
			||||||
 | 
					        profileImageUri
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										75
									
								
								src/operations/medals.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								src/operations/medals.gql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,75 @@
 | 
				
			|||||||
 | 
					fragment MedalFields on MedalGQL {
 | 
				
			||||||
 | 
					  count
 | 
				
			||||||
 | 
					  nickname
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query getMedals($scope: MedalScope!, $userId: Int) {
 | 
				
			||||||
 | 
					  getMedals(scope: $scope, userId: $userId) {
 | 
				
			||||||
 | 
					    distanceOver78 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    distanceOver90 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    runLength3 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    runLength5 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    runLength8 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    runLength10 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    runLength15 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    runLength20 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    runLength25 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    runLength30 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    runLength40 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    runLength50 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    totalMakes100 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    totalMakes500 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    totalMakes1000 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    totalMakes5000 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    totalMakes10000 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    dailyMakes50 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    dailyMakes100 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    dailyMakes150 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    dailyMakes200 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    dailyMakes250 {
 | 
				
			||||||
 | 
					      ...MedalFields
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										3
									
								
								src/operations/reactions.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/operations/reactions.gql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					mutation ReactToVideo($videoId: Int!, $reaction: ReactionEnum) {
 | 
				
			||||||
 | 
					  reactToVideo(videoId: $videoId, reaction: $reaction)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										24
									
								
								src/operations/runs.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/operations/runs.gql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					query GetRunsForHighlights(
 | 
				
			||||||
 | 
					  $filterInput: RunFilterInput!
 | 
				
			||||||
 | 
					  $runIds: [Int!] = null
 | 
				
			||||||
 | 
					  $runsOrdering: GetRunsOrdering
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					  getRuns(
 | 
				
			||||||
 | 
					    filterInput: $filterInput
 | 
				
			||||||
 | 
					    runIds: $runIds
 | 
				
			||||||
 | 
					    runsOrdering: $runsOrdering
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    count
 | 
				
			||||||
 | 
					    runs {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      runLength
 | 
				
			||||||
 | 
					      userId
 | 
				
			||||||
 | 
					      videoId
 | 
				
			||||||
 | 
					      shots {
 | 
				
			||||||
 | 
					        videoId
 | 
				
			||||||
 | 
					        id
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    runIds
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,38 +1,200 @@
 | 
				
			|||||||
query GetShots(
 | 
					query GetSerializedShotPaths($filterInput: FilterInput!) {
 | 
				
			||||||
  $filterInput: FilterInput!
 | 
					 | 
				
			||||||
  $includeCreatedAt: Boolean! = false
 | 
					 | 
				
			||||||
  $includeUpdatedAt: Boolean! = false
 | 
					 | 
				
			||||||
  $includeCueObjectFeatures: Boolean! = false
 | 
					 | 
				
			||||||
  $includePocketingIntentionFeatures: Boolean! = false
 | 
					 | 
				
			||||||
  $includeCueObjectDistance: Boolean! = false
 | 
					 | 
				
			||||||
  $includeCueObjectAngle: Boolean! = false
 | 
					 | 
				
			||||||
  $includeCueBallSpeed: Boolean! = false
 | 
					 | 
				
			||||||
  $includeShotDirection: Boolean! = false
 | 
					 | 
				
			||||||
  $includeTargetPocketDistance: Boolean! = false
 | 
					 | 
				
			||||||
  $includeMake: Boolean! = false
 | 
					 | 
				
			||||||
  $includeIntendedPocketType: Boolean! = false
 | 
					 | 
				
			||||||
) {
 | 
					 | 
				
			||||||
  getShots(filterInput: $filterInput) {
 | 
					  getShots(filterInput: $filterInput) {
 | 
				
			||||||
    id
 | 
					    id
 | 
				
			||||||
    videoId
 | 
					    videoId
 | 
				
			||||||
    startFrame
 | 
					    startFrame
 | 
				
			||||||
    endFrame
 | 
					    endFrame
 | 
				
			||||||
 | 
					    serializedShotPaths {
 | 
				
			||||||
 | 
					      b64EncodedBuffer
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetShotAnnotationTypes {
 | 
				
			||||||
 | 
					  getShotAnnotationTypes {
 | 
				
			||||||
 | 
					    id
 | 
				
			||||||
 | 
					    name
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mutation UpdateShotAnnotations(
 | 
				
			||||||
 | 
					  $shotId: Int!
 | 
				
			||||||
 | 
					  $annotations: [UpdateAnnotationInputGQL!]!
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					  updateShotAnnotations(shotId: $shotId, annotations: $annotations) {
 | 
				
			||||||
 | 
					    shot {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      annotations {
 | 
				
			||||||
 | 
					        shotId
 | 
				
			||||||
 | 
					        type {
 | 
				
			||||||
 | 
					          id
 | 
				
			||||||
 | 
					          name
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        notes
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    error {
 | 
				
			||||||
 | 
					      shotId
 | 
				
			||||||
 | 
					      msg
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Should be deprecated
 | 
				
			||||||
 | 
					query GetShotsWithVideoGql(
 | 
				
			||||||
 | 
					  $filterInput: FilterInput!
 | 
				
			||||||
 | 
					  $shotsOrdering: GetShotsOrdering
 | 
				
			||||||
 | 
					  $limit: Int
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					  getOrderedShots(
 | 
				
			||||||
 | 
					    filterInput: $filterInput
 | 
				
			||||||
 | 
					    shotsOrdering: $shotsOrdering
 | 
				
			||||||
 | 
					    limit: $limit
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    shots {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      videoId
 | 
				
			||||||
 | 
					      video {
 | 
				
			||||||
 | 
					        screenshotUri
 | 
				
			||||||
 | 
					        endTime
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetShotsWithJustIds(
 | 
				
			||||||
 | 
					  $filterInput: FilterInput!
 | 
				
			||||||
 | 
					  $shotsOrdering: GetShotsOrdering
 | 
				
			||||||
 | 
					  $limit: Int
 | 
				
			||||||
 | 
					  $countRespectsLimit: Boolean
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					  getOrderedShots(
 | 
				
			||||||
 | 
					    filterInput: $filterInput
 | 
				
			||||||
 | 
					    shotsOrdering: $shotsOrdering
 | 
				
			||||||
 | 
					    limit: $limit
 | 
				
			||||||
 | 
					    countRespectsLimit: $countRespectsLimit
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    count
 | 
				
			||||||
 | 
					    shots {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      videoId
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Reserved for playlists (which are created from a filter)
 | 
				
			||||||
 | 
					query GetShotsWithMetadataFilterResult(
 | 
				
			||||||
 | 
					  $filterInput: FilterInput!
 | 
				
			||||||
 | 
					  $shotsOrdering: GetShotsOrdering
 | 
				
			||||||
 | 
					  $limit: Int
 | 
				
			||||||
 | 
					  $ids: [Int!]
 | 
				
			||||||
 | 
					  $countRespectsLimit: Boolean
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					  getOrderedShots(
 | 
				
			||||||
 | 
					    filterInput: $filterInput
 | 
				
			||||||
 | 
					    shotsOrdering: $shotsOrdering
 | 
				
			||||||
 | 
					    limit: $limit
 | 
				
			||||||
 | 
					    ids: $ids
 | 
				
			||||||
 | 
					    countRespectsLimit: $countRespectsLimit
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    count
 | 
				
			||||||
 | 
					    shots {
 | 
				
			||||||
 | 
					      ...ShotWithAllFeatures
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    ids
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# TODO: Delete
 | 
				
			||||||
 | 
					query GetShotsWithMetadata(
 | 
				
			||||||
 | 
					  $filterInput: FilterInput!
 | 
				
			||||||
 | 
					  $shotsPagination: GetShotsPagination
 | 
				
			||||||
 | 
					  $limit: Int
 | 
				
			||||||
 | 
					  $ids: [Int!]
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					  getShotsWithMetadata(
 | 
				
			||||||
 | 
					    filterInput: $filterInput
 | 
				
			||||||
 | 
					    shotsPagination: $shotsPagination
 | 
				
			||||||
 | 
					    limit: $limit
 | 
				
			||||||
 | 
					    ids: $ids
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    count
 | 
				
			||||||
 | 
					    shots {
 | 
				
			||||||
 | 
					      ...ShotWithAllFeatures
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    ids
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetShotsByIds($ids: [Int!]!) {
 | 
				
			||||||
 | 
					  getShotsByIds(ids: $ids) {
 | 
				
			||||||
 | 
					    ...ShotWithAllFeatures
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fragment ShotWithAllFeatures on ShotGQL {
 | 
				
			||||||
 | 
					  id
 | 
				
			||||||
 | 
					  videoId
 | 
				
			||||||
 | 
					  startFrame
 | 
				
			||||||
 | 
					  endFrame
 | 
				
			||||||
 | 
					  startTime @client
 | 
				
			||||||
 | 
					  endTime @client
 | 
				
			||||||
 | 
					  startSegment @client {
 | 
				
			||||||
 | 
					    index
 | 
				
			||||||
 | 
					    time
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  endSegment @client {
 | 
				
			||||||
 | 
					    index
 | 
				
			||||||
 | 
					    time
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  user {
 | 
					  user {
 | 
				
			||||||
    id
 | 
					    id
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
    createdAt @include(if: $includeCreatedAt)
 | 
					  falsePositiveScore
 | 
				
			||||||
    updatedAt @include(if: $includeUpdatedAt)
 | 
					  createdAt
 | 
				
			||||||
    cueObjectFeatures @include(if: $includeCueObjectFeatures) {
 | 
					  updatedAt
 | 
				
			||||||
      cueObjectDistance @include(if: $includeCueObjectDistance)
 | 
					  cueObjectFeatures {
 | 
				
			||||||
      cueObjectAngle @include(if: $includeCueObjectAngle)
 | 
					    cueObjectDistance
 | 
				
			||||||
      cueBallSpeed @include(if: $includeCueBallSpeed)
 | 
					    cueObjectAngle
 | 
				
			||||||
      shotDirection @include(if: $includeShotDirection)
 | 
					    cueBallSpeed
 | 
				
			||||||
 | 
					    shotDirection
 | 
				
			||||||
 | 
					    spinType
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
    pocketingIntentionFeatures
 | 
					  pocketingIntentionFeatures {
 | 
				
			||||||
      @include(if: $includePocketingIntentionFeatures) {
 | 
					    make
 | 
				
			||||||
      targetPocketDistance @include(if: $includeTargetPocketDistance)
 | 
					    targetPocketDistance
 | 
				
			||||||
      make @include(if: $includeMake)
 | 
					    targetPocketAngle
 | 
				
			||||||
      intendedPocketType @include(if: $includeIntendedPocketType)
 | 
					    targetPocketAngleDirection
 | 
				
			||||||
 | 
					    marginOfErrorInDegrees
 | 
				
			||||||
 | 
					    intendedPocketType
 | 
				
			||||||
 | 
					    difficulty
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  pocketingIntentionInfo {
 | 
				
			||||||
 | 
					    ballId
 | 
				
			||||||
 | 
					    pocketId
 | 
				
			||||||
 | 
					    pathMetadataIndex
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  serializedShotPaths {
 | 
				
			||||||
 | 
					    b64EncodedBuffer
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  annotations {
 | 
				
			||||||
 | 
					    shotId
 | 
				
			||||||
 | 
					    type {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      name
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    notes
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mutation EditShot($shotId: Int!, $fieldsToEdit: EditableShotFieldInputGQL!) {
 | 
				
			||||||
 | 
					  editShot(shotId: $shotId, fieldsToEdit: $fieldsToEdit) {
 | 
				
			||||||
 | 
					    error {
 | 
				
			||||||
 | 
					      shotId
 | 
				
			||||||
 | 
					      msg
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    shot {
 | 
				
			||||||
 | 
					      ...ShotWithAllFeatures
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										7
									
								
								src/operations/tags.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/operations/tags.gql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					mutation RetireTags($tagIds: [Int!]!) {
 | 
				
			||||||
 | 
					  retireTags(tagIds: $tagIds)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mutation DeleteTags($videoId: Int!, $tagsToDelete: [VideoTagInput!]!) {
 | 
				
			||||||
 | 
					  deleteTags(videoId: $videoId, tagsToDelete: $tagsToDelete)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,38 +1,171 @@
 | 
				
			|||||||
mutation getProfileImageUploadLink($fileExt: String = ".png") {
 | 
					mutation getProfileImageUploadLink($fileExt: String = ".png") {
 | 
				
			||||||
  getProfileImageUploadLink(fileExt: $fileExt) {
 | 
					  getProfileImageUploadLink(fileExt: $fileExt) {
 | 
				
			||||||
 | 
					    value {
 | 
				
			||||||
 | 
					      ... on UploadLink {
 | 
				
			||||||
        uploadUrl
 | 
					        uploadUrl
 | 
				
			||||||
        headers {
 | 
					        headers {
 | 
				
			||||||
          key
 | 
					          key
 | 
				
			||||||
          value
 | 
					          value
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					      ... on GetProfileUploadLinkErrors {
 | 
				
			||||||
 | 
					        error {
 | 
				
			||||||
 | 
					          ... on TooManyProfileImageUploadsErr {
 | 
				
			||||||
 | 
					            linksRequested
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mutation editProfileImageUri($profileImageUri: String!) {
 | 
					mutation editProfileImageUri($profileImageUri: String!) {
 | 
				
			||||||
  editProfileImageUri(profileImageUri: $profileImageUri) {
 | 
					  editProfileImageUri(profileImageUri: $profileImageUri) {
 | 
				
			||||||
    id
 | 
					    ...UserFragment
 | 
				
			||||||
    firebaseUid
 | 
					 | 
				
			||||||
    username
 | 
					 | 
				
			||||||
    profileImageUri
 | 
					 | 
				
			||||||
    createdAt
 | 
					 | 
				
			||||||
    updatedAt
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
query getLoggedInUser {
 | 
					query getLoggedInUser {
 | 
				
			||||||
  getLoggedInUser {
 | 
					  getLoggedInUser {
 | 
				
			||||||
    id
 | 
					    ...UserFragment
 | 
				
			||||||
    firebaseUid
 | 
					 | 
				
			||||||
    username
 | 
					 | 
				
			||||||
    profileImageUri
 | 
					 | 
				
			||||||
    activeVideoId
 | 
					 | 
				
			||||||
    createdAt
 | 
					 | 
				
			||||||
    updatedAt
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
query GetUserPlayTime($userId: Int!) {
 | 
					query GetUser($userId: Int!) {
 | 
				
			||||||
  getPlayTime(userId: $userId) {
 | 
					  getUser(userId: $userId) {
 | 
				
			||||||
 | 
					    ...UserFragment
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetUserPlayTime($userId: Int!, $filters: VideoFilterInput) {
 | 
				
			||||||
 | 
					  getPlayTime(userId: $userId, filters: $filters) {
 | 
				
			||||||
    totalSeconds
 | 
					    totalSeconds
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query getUsernames(
 | 
				
			||||||
 | 
					  $matchString: String!
 | 
				
			||||||
 | 
					  $limit: Int = null
 | 
				
			||||||
 | 
					  $after: String = null
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					  getUsernames(matchString: $matchString, limit: $limit, after: $after)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query getUserRelationshipsMatching(
 | 
				
			||||||
 | 
					  $userId: Int!
 | 
				
			||||||
 | 
					  $matchString: String!
 | 
				
			||||||
 | 
					  $limit: Int = null
 | 
				
			||||||
 | 
					  $after: String = null
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					  getUserRelationshipsMatching(
 | 
				
			||||||
 | 
					    userId: $userId
 | 
				
			||||||
 | 
					    matchString: $matchString
 | 
				
			||||||
 | 
					    limit: $limit
 | 
				
			||||||
 | 
					    after: $after
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    relationships {
 | 
				
			||||||
 | 
					      toUser {
 | 
				
			||||||
 | 
					        username
 | 
				
			||||||
 | 
					        profileImageUri
 | 
				
			||||||
 | 
					        id
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      toUserFollows
 | 
				
			||||||
 | 
					      toUserIsFollowedBy
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetUserTags {
 | 
				
			||||||
 | 
					  getUserTags {
 | 
				
			||||||
 | 
					    id
 | 
				
			||||||
 | 
					    name
 | 
				
			||||||
 | 
					    tagClasses {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      name
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mutation followUser($followedUserId: Int!) {
 | 
				
			||||||
 | 
					  followUser(followedUserId: $followedUserId) {
 | 
				
			||||||
 | 
					    username
 | 
				
			||||||
 | 
					    id
 | 
				
			||||||
 | 
					    following {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      username
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    followers {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      username
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mutation unfollowUser($followedUserId: Int!) {
 | 
				
			||||||
 | 
					  unfollowUser(followedUserId: $followedUserId) {
 | 
				
			||||||
 | 
					    username
 | 
				
			||||||
 | 
					    id
 | 
				
			||||||
 | 
					    following {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      username
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    followers {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      username
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query getUserFollowingFollowers {
 | 
				
			||||||
 | 
					  getLoggedInUser {
 | 
				
			||||||
 | 
					    id
 | 
				
			||||||
 | 
					    following {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      username
 | 
				
			||||||
 | 
					      profileImageUri
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    followers {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      username
 | 
				
			||||||
 | 
					      profileImageUri
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query doesUsernameExist($candidateUsername: String!) {
 | 
				
			||||||
 | 
					  doesUsernameExist(candidateUsername: $candidateUsername)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mutation editUser(
 | 
				
			||||||
 | 
					  $username: String
 | 
				
			||||||
 | 
					  $fargoRating: Int
 | 
				
			||||||
 | 
					  $videosPrivateByDefault: Boolean
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					  editUser(
 | 
				
			||||||
 | 
					    input: {
 | 
				
			||||||
 | 
					      username: $username
 | 
				
			||||||
 | 
					      fargoRating: $fargoRating
 | 
				
			||||||
 | 
					      videosPrivateByDefault: $videosPrivateByDefault
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ) {
 | 
				
			||||||
 | 
					    id
 | 
				
			||||||
 | 
					    firebaseUid
 | 
				
			||||||
 | 
					    username
 | 
				
			||||||
 | 
					    fargoRating
 | 
				
			||||||
 | 
					    updatedAt
 | 
				
			||||||
 | 
					    videosPrivateByDefault
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fragment UserFragment on UserGQL {
 | 
				
			||||||
 | 
					  id
 | 
				
			||||||
 | 
					  firebaseUid
 | 
				
			||||||
 | 
					  username
 | 
				
			||||||
 | 
					  isAdmin
 | 
				
			||||||
 | 
					  profileImageUri
 | 
				
			||||||
 | 
					  fargoRating
 | 
				
			||||||
 | 
					  activeVideoId
 | 
				
			||||||
 | 
					  createdAt
 | 
				
			||||||
 | 
					  updatedAt
 | 
				
			||||||
 | 
					  videosPrivateByDefault
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,248 @@
 | 
				
			|||||||
query GetStreamMonitoringDetails($videoId: Int!) {
 | 
					query GetStreamMonitoringDetails($videoId: Int!, $debuggingJson: JSON) {
 | 
				
			||||||
  getVideo(videoId: $videoId) {
 | 
					  getVideo(videoId: $videoId, debuggingJson: $debuggingJson) {
 | 
				
			||||||
    id
 | 
					    id
 | 
				
			||||||
    totalShots
 | 
					    totalShots
 | 
				
			||||||
    makePercentage
 | 
					    makePercentage
 | 
				
			||||||
    elapsedTime
 | 
					    elapsedTime
 | 
				
			||||||
 | 
					    currentHomography {
 | 
				
			||||||
 | 
					      ...HomographyInfo
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    stream {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      linksRequested
 | 
				
			||||||
 | 
					      uploadsCompleted
 | 
				
			||||||
 | 
					      segmentProcessingCursor
 | 
				
			||||||
 | 
					      isCompleted
 | 
				
			||||||
 | 
					      uploadCompletionCursor
 | 
				
			||||||
 | 
					      lastIntendedSegmentBound
 | 
				
			||||||
 | 
					      initPlaylistUploadStatus
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    currentProcessing {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      errors {
 | 
				
			||||||
 | 
					        message
 | 
				
			||||||
 | 
					        startSegmentIndex
 | 
				
			||||||
 | 
					        endSegmentIndex
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetVideoUpdatePageDetails($videoId: Int!) {
 | 
				
			||||||
 | 
					  getVideo(videoId: $videoId) {
 | 
				
			||||||
 | 
					    id
 | 
				
			||||||
 | 
					    name
 | 
				
			||||||
 | 
					    totalShots
 | 
				
			||||||
 | 
					    makePercentage
 | 
				
			||||||
 | 
					    elapsedTime
 | 
				
			||||||
 | 
					    tableSize
 | 
				
			||||||
 | 
					    private
 | 
				
			||||||
 | 
					    tags {
 | 
				
			||||||
 | 
					      tagClasses {
 | 
				
			||||||
 | 
					        name
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      name
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mutation DeleteVideo($videoId: Int!) {
 | 
				
			||||||
 | 
					  deleteVideo(videoId: $videoId)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetVideoDetails($videoId: Int!) {
 | 
				
			||||||
 | 
					  getVideo(videoId: $videoId) {
 | 
				
			||||||
 | 
					    id
 | 
				
			||||||
 | 
					    name
 | 
				
			||||||
 | 
					    screenshotUri
 | 
				
			||||||
 | 
					    averageTimeBetweenShots
 | 
				
			||||||
 | 
					    elapsedTime
 | 
				
			||||||
 | 
					    endTime
 | 
				
			||||||
 | 
					    makePercentage
 | 
				
			||||||
 | 
					    medianRun
 | 
				
			||||||
 | 
					    startTime
 | 
				
			||||||
 | 
					    totalShots
 | 
				
			||||||
 | 
					    totalShotsMade
 | 
				
			||||||
 | 
					    createdAt
 | 
				
			||||||
 | 
					    updatedAt
 | 
				
			||||||
 | 
					    tableSize
 | 
				
			||||||
 | 
					    private
 | 
				
			||||||
 | 
					    owner {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      firebaseUid
 | 
				
			||||||
 | 
					      username
 | 
				
			||||||
 | 
					      profileImageUri
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    tags {
 | 
				
			||||||
 | 
					      tagClasses {
 | 
				
			||||||
 | 
					        name
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      name
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetVideos($videoIds: [Int!]!) {
 | 
				
			||||||
 | 
					  getVideos(videoIds: $videoIds) {
 | 
				
			||||||
 | 
					    ...VideoStreamMetadata
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fragment VideoStreamMetadata on VideoGQL {
 | 
				
			||||||
 | 
					  id
 | 
				
			||||||
 | 
					  framesPerSecond
 | 
				
			||||||
 | 
					  stream {
 | 
				
			||||||
 | 
					    id
 | 
				
			||||||
 | 
					    streamSegmentType
 | 
				
			||||||
 | 
					    segments {
 | 
				
			||||||
 | 
					      uploaded
 | 
				
			||||||
 | 
					      valid
 | 
				
			||||||
 | 
					      segmentIndex
 | 
				
			||||||
 | 
					      endFrameIndex
 | 
				
			||||||
 | 
					      framesPerSecond
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  playlist {
 | 
				
			||||||
 | 
					    segmentDurations
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetVideoForShotTime($videoId: Int!) {
 | 
				
			||||||
 | 
					  getVideo(videoId: $videoId) {
 | 
				
			||||||
 | 
					    ...VideoStreamMetadata
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetVideo($videoId: Int!) {
 | 
				
			||||||
 | 
					  getVideo(videoId: $videoId) {
 | 
				
			||||||
 | 
					    id
 | 
				
			||||||
 | 
					    playlist {
 | 
				
			||||||
 | 
					      segmentDurations
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    homographyHistory {
 | 
					    homographyHistory {
 | 
				
			||||||
 | 
					      ...HomographyInfo
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    stream {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      streamSegmentType
 | 
				
			||||||
 | 
					      segments {
 | 
				
			||||||
 | 
					        segmentIndex
 | 
				
			||||||
 | 
					        endFrameIndex
 | 
				
			||||||
 | 
					        framesPerSecond
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      resolution {
 | 
				
			||||||
 | 
					        width
 | 
				
			||||||
 | 
					        height
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetAverageTimePerShotForVideo($videoId: Int!) {
 | 
				
			||||||
 | 
					  getVideo(videoId: $videoId) {
 | 
				
			||||||
 | 
					    id
 | 
				
			||||||
 | 
					    averageTimeBetweenShots
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetElapsedTimeForVideo($videoId: Int!) {
 | 
				
			||||||
 | 
					  getVideo(videoId: $videoId) {
 | 
				
			||||||
 | 
					    id
 | 
				
			||||||
 | 
					    elapsedTime
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetMedianRunForVideo($videoId: Int!) {
 | 
				
			||||||
 | 
					  getVideo(videoId: $videoId) {
 | 
				
			||||||
 | 
					    id
 | 
				
			||||||
 | 
					    medianRun
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fragment StreamWithEndFrames on UploadStreamGQL {
 | 
				
			||||||
 | 
					  id
 | 
				
			||||||
 | 
					  streamSegmentType
 | 
				
			||||||
 | 
					  segmentEndFrames @client
 | 
				
			||||||
 | 
					  resolution {
 | 
				
			||||||
 | 
					    width
 | 
				
			||||||
 | 
					    height
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  segments {
 | 
				
			||||||
 | 
					    uploaded
 | 
				
			||||||
 | 
					    valid
 | 
				
			||||||
 | 
					    segmentIndex
 | 
				
			||||||
 | 
					    endFrameIndex
 | 
				
			||||||
 | 
					    framesPerSecond
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fragment SegmentEndFrames on SegmentEndFramesGQL {
 | 
				
			||||||
 | 
					  id
 | 
				
			||||||
 | 
					  segmentEndFrames
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fragment SegmentStartTimes on SegmentStartTimesGQL {
 | 
				
			||||||
 | 
					  id
 | 
				
			||||||
 | 
					  segmentStartTimes
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fragment PlaylistWithSegmentStartTimes on HLSPlaylistGQL {
 | 
				
			||||||
 | 
					  videoId
 | 
				
			||||||
 | 
					  segmentDurations
 | 
				
			||||||
 | 
					  segmentStartTimes @client
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fragment VideoDurationData on VideoGQL {
 | 
				
			||||||
 | 
					  id
 | 
				
			||||||
 | 
					  framesPerSecond
 | 
				
			||||||
 | 
					  playlist {
 | 
				
			||||||
 | 
					    ...PlaylistWithSegmentStartTimes
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  stream {
 | 
				
			||||||
 | 
					    ...StreamWithEndFrames
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetVideoForClipTimes($videoId: Int!) {
 | 
				
			||||||
 | 
					  getVideo(videoId: $videoId) {
 | 
				
			||||||
 | 
					    ...VideoDurationData
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetHeaderInfoByVideoId($videoId: Int!) {
 | 
				
			||||||
 | 
					  getVideo(videoId: $videoId) {
 | 
				
			||||||
 | 
					    id
 | 
				
			||||||
 | 
					    name
 | 
				
			||||||
 | 
					    startTime
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					query GetBannerInfoByVideoId($videoId: Int!) {
 | 
				
			||||||
 | 
					  getVideo(videoId: $videoId) {
 | 
				
			||||||
 | 
					    id
 | 
				
			||||||
 | 
					    name
 | 
				
			||||||
 | 
					    stream {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      lastIntendedSegmentBound
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    owner {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    currentProcessing {
 | 
				
			||||||
 | 
					      id
 | 
				
			||||||
 | 
					      status
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mutation FindPrerecordTableLayout($b64Image: String!, $videoId: Int!) {
 | 
				
			||||||
 | 
					  findPrerecordTableLayout(b64Image: $b64Image, videoId: $videoId) {
 | 
				
			||||||
 | 
					    ...HomographyInfo
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fragment HomographyInfo on HomographyInfoGQL {
 | 
				
			||||||
 | 
					  id
 | 
				
			||||||
 | 
					  frameIndex
 | 
				
			||||||
  crop {
 | 
					  crop {
 | 
				
			||||||
    left
 | 
					    left
 | 
				
			||||||
    top
 | 
					    top
 | 
				
			||||||
@@ -44,124 +282,3 @@ query GetStreamMonitoringDetails($videoId: Int!) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
    stream {
 | 
					 | 
				
			||||||
      linksRequested
 | 
					 | 
				
			||||||
      uploadsCompleted
 | 
					 | 
				
			||||||
      segmentProcessingCursor
 | 
					 | 
				
			||||||
      isCompleted
 | 
					 | 
				
			||||||
      uploadCompletionCursor
 | 
					 | 
				
			||||||
      lastIntendedSegmentBound
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    currentProcessing {
 | 
					 | 
				
			||||||
      errors {
 | 
					 | 
				
			||||||
        message
 | 
					 | 
				
			||||||
        startSegmentIndex
 | 
					 | 
				
			||||||
        endSegmentIndex
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
query GetVideoUpdatePageDetails($videoId: Int!) {
 | 
					 | 
				
			||||||
  getVideo(videoId: $videoId) {
 | 
					 | 
				
			||||||
    id
 | 
					 | 
				
			||||||
    name
 | 
					 | 
				
			||||||
    totalShots
 | 
					 | 
				
			||||||
    makePercentage
 | 
					 | 
				
			||||||
    elapsedTime
 | 
					 | 
				
			||||||
    tags {
 | 
					 | 
				
			||||||
      tagClasses {
 | 
					 | 
				
			||||||
        name
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      name
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
mutation DeleteVideo($videoId: Int!) {
 | 
					 | 
				
			||||||
  deleteVideo(videoId: $videoId)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
query GetVideoDetails($videoId: Int!) {
 | 
					 | 
				
			||||||
  getVideo(videoId: $videoId) {
 | 
					 | 
				
			||||||
    id
 | 
					 | 
				
			||||||
    name
 | 
					 | 
				
			||||||
    screenshotUri
 | 
					 | 
				
			||||||
    averageTimeBetweenShots
 | 
					 | 
				
			||||||
    elapsedTime
 | 
					 | 
				
			||||||
    endTime
 | 
					 | 
				
			||||||
    makePercentage
 | 
					 | 
				
			||||||
    medianRun
 | 
					 | 
				
			||||||
    startTime
 | 
					 | 
				
			||||||
    totalShots
 | 
					 | 
				
			||||||
    totalShotsMade
 | 
					 | 
				
			||||||
    createdAt
 | 
					 | 
				
			||||||
    updatedAt
 | 
					 | 
				
			||||||
    owner {
 | 
					 | 
				
			||||||
      id
 | 
					 | 
				
			||||||
      firebaseUid
 | 
					 | 
				
			||||||
      username
 | 
					 | 
				
			||||||
      profileImageUri
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    tags {
 | 
					 | 
				
			||||||
      tagClasses {
 | 
					 | 
				
			||||||
        name
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      name
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
query GetVideos($videoIds: [Int!]!) {
 | 
					 | 
				
			||||||
  getVideos(videoIds: $videoIds) {
 | 
					 | 
				
			||||||
    id
 | 
					 | 
				
			||||||
    playlist {
 | 
					 | 
				
			||||||
      segmentDurations
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    stream {
 | 
					 | 
				
			||||||
      id
 | 
					 | 
				
			||||||
      segments {
 | 
					 | 
				
			||||||
        uploaded
 | 
					 | 
				
			||||||
        valid
 | 
					 | 
				
			||||||
        segmentIndex
 | 
					 | 
				
			||||||
        endFrameIndex
 | 
					 | 
				
			||||||
        framesPerSecond
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
query GetVideo($videoId: Int!) {
 | 
					 | 
				
			||||||
  getVideo(videoId: $videoId) {
 | 
					 | 
				
			||||||
    id
 | 
					 | 
				
			||||||
    playlist {
 | 
					 | 
				
			||||||
      segmentDurations
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    stream {
 | 
					 | 
				
			||||||
      segments {
 | 
					 | 
				
			||||||
        segmentIndex
 | 
					 | 
				
			||||||
        endFrameIndex
 | 
					 | 
				
			||||||
        framesPerSecond
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
query GetAverageTimePerShotForVideo($videoId: Int!) {
 | 
					 | 
				
			||||||
  getVideo(videoId: $videoId) {
 | 
					 | 
				
			||||||
    id
 | 
					 | 
				
			||||||
    averageTimeBetweenShots
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
query GetElapsedTimeForVideo($videoId: Int!) {
 | 
					 | 
				
			||||||
  getVideo(videoId: $videoId) {
 | 
					 | 
				
			||||||
    id
 | 
					 | 
				
			||||||
    elapsedTime
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
query GetMedianRunForVideo($videoId: Int!) {
 | 
					 | 
				
			||||||
  getVideo(videoId: $videoId) {
 | 
					 | 
				
			||||||
    id
 | 
					 | 
				
			||||||
    medianRun
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,12 +6,77 @@ mutation CreateUploadStream($videoMetadataInput: VideoMetadataInput!) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
mutation GetUploadLink($videoId: Int!, $segmentIndex: Int!) {
 | 
					mutation GetUploadLink($videoId: Int!, $segmentIndex: Int!) {
 | 
				
			||||||
  getUploadLink(videoId: $videoId, segmentIndex: $segmentIndex) {
 | 
					  getUploadLink(videoId: $videoId, segmentIndex: $segmentIndex) {
 | 
				
			||||||
 | 
					    value {
 | 
				
			||||||
 | 
					      ... on UploadLink {
 | 
				
			||||||
        uploadUrl
 | 
					        uploadUrl
 | 
				
			||||||
        headers {
 | 
					        headers {
 | 
				
			||||||
          key
 | 
					          key
 | 
				
			||||||
          value
 | 
					          value
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					      ... on GetUploadLinkErrors {
 | 
				
			||||||
 | 
					        error {
 | 
				
			||||||
 | 
					          ... on MustHaveSetForUploadLinkErr {
 | 
				
			||||||
 | 
					            resolution
 | 
				
			||||||
 | 
					            framesPerSecond
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          ... on SegmentAlreadyUploadedErr {
 | 
				
			||||||
 | 
					            segmentId
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          ... on ProcessingFailedErr {
 | 
				
			||||||
 | 
					            processing {
 | 
				
			||||||
 | 
					              status
 | 
				
			||||||
 | 
					              errors {
 | 
				
			||||||
 | 
					                message
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    stream {
 | 
				
			||||||
 | 
					      uploadCompletionCursor
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mutation GetHlsInitUploadLink($videoId: Int!) {
 | 
				
			||||||
 | 
					  getHlsInitUploadLink(videoId: $videoId) {
 | 
				
			||||||
 | 
					    value {
 | 
				
			||||||
 | 
					      ... on UploadLink {
 | 
				
			||||||
 | 
					        uploadUrl
 | 
				
			||||||
 | 
					        headers {
 | 
				
			||||||
 | 
					          key
 | 
				
			||||||
 | 
					          value
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      ... on GetUploadLinkErrors {
 | 
				
			||||||
 | 
					        error {
 | 
				
			||||||
 | 
					          ... on NoInitForChunkedUploadErr {
 | 
				
			||||||
 | 
					            segmentType
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          ... on InitUploadAlreadyCompletedErr {
 | 
				
			||||||
 | 
					            segmentType
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          ... on TooManyInitUploadsErr {
 | 
				
			||||||
 | 
					            linksRequested
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mutation SetSegmentDuration(
 | 
				
			||||||
 | 
					  $videoId: Int!
 | 
				
			||||||
 | 
					  $segmentIndex: Int!
 | 
				
			||||||
 | 
					  $duration: Float!
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					  setSegmentDuration(
 | 
				
			||||||
 | 
					    videoId: $videoId
 | 
				
			||||||
 | 
					    segmentIndex: $segmentIndex
 | 
				
			||||||
 | 
					    duration: $duration
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mutation EditUploadStream(
 | 
					mutation EditUploadStream(
 | 
				
			||||||
@@ -36,13 +101,8 @@ query GetUploadStreams(
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
query GetUploadStreamsWithDetails(
 | 
					
 | 
				
			||||||
  $limit: Int! = 5
 | 
					fragment UploadStreamWithDetails on VideoGQL {
 | 
				
			||||||
  $after: String = null
 | 
					 | 
				
			||||||
  $filters: VideoFilterInput = null
 | 
					 | 
				
			||||||
) {
 | 
					 | 
				
			||||||
  getUserVideos(limit: $limit, after: $after, filters: $filters) {
 | 
					 | 
				
			||||||
    videos {
 | 
					 | 
				
			||||||
  id
 | 
					  id
 | 
				
			||||||
  name
 | 
					  name
 | 
				
			||||||
  startTime
 | 
					  startTime
 | 
				
			||||||
@@ -50,8 +110,19 @@ query GetUploadStreamsWithDetails(
 | 
				
			|||||||
    isCompleted
 | 
					    isCompleted
 | 
				
			||||||
    lastIntendedSegmentBound
 | 
					    lastIntendedSegmentBound
 | 
				
			||||||
    uploadCompletionCursor
 | 
					    uploadCompletionCursor
 | 
				
			||||||
 | 
					    uploadsCompleted
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					query GetUploadStreamsWithDetails(
 | 
				
			||||||
 | 
					  $limit: Int! = 5
 | 
				
			||||||
 | 
					  $after: String = null
 | 
				
			||||||
 | 
					  $filters: VideoFilterInput = null
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
					  getUserVideos(limit: $limit, after: $after, filters: $filters) {
 | 
				
			||||||
 | 
					    videos {
 | 
				
			||||||
 | 
					      ...UploadStreamWithDetails
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    pageInfo {
 | 
					    pageInfo {
 | 
				
			||||||
      hasNextPage
 | 
					      hasNextPage
 | 
				
			||||||
      endCursor
 | 
					      endCursor
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										696
									
								
								src/schema.gql
									
									
									
									
									
								
							
							
						
						
									
										696
									
								
								src/schema.gql
									
									
									
									
									
								
							@@ -4,23 +4,83 @@ type Query {
 | 
				
			|||||||
  ): [AggregateResultGQL!]!
 | 
					  ): [AggregateResultGQL!]!
 | 
				
			||||||
  getBucketSet(keyName: String!): BucketSetGQL
 | 
					  getBucketSet(keyName: String!): BucketSetGQL
 | 
				
			||||||
  getDeployedConfig: DeployedConfigGQL!
 | 
					  getDeployedConfig: DeployedConfigGQL!
 | 
				
			||||||
 | 
					  waitFor(duration: Float!): Float!
 | 
				
			||||||
  getVideoMakePercentageIntervals(
 | 
					  getVideoMakePercentageIntervals(
 | 
				
			||||||
    videoId: ID!
 | 
					    videoId: ID!
 | 
				
			||||||
    intervalDuration: Int! = 300
 | 
					    intervalDuration: Int! = 300
 | 
				
			||||||
  ): [MakePercentageIntervalGQL!]!
 | 
					  ): [MakePercentageIntervalGQL!]!
 | 
				
			||||||
  getShots(filterInput: FilterInput!): [ShotGQL!]!
 | 
					  getMedals(scope: MedalScope!, userId: Int = null): RequestedMedalsGQL!
 | 
				
			||||||
  getShotAnnotationTypes: [ShotAnnotationTypeGQL!]!
 | 
					  getRuns(
 | 
				
			||||||
 | 
					    filterInput: RunFilterInput!
 | 
				
			||||||
 | 
					    runIds: [Int!] = null
 | 
				
			||||||
 | 
					    runsOrdering: GetRunsOrdering = null
 | 
				
			||||||
 | 
					    limit: Int! = 500
 | 
				
			||||||
 | 
					    countRespectsLimit: Boolean! = false
 | 
				
			||||||
 | 
					  ): GetRunsResult!
 | 
				
			||||||
 | 
					  getOrderedShots(
 | 
				
			||||||
 | 
					    filterInput: FilterInput!
 | 
				
			||||||
 | 
					    ids: [Int!] = null
 | 
				
			||||||
 | 
					    shotsOrdering: GetShotsOrdering = null
 | 
				
			||||||
 | 
					    limit: Int! = 500
 | 
				
			||||||
 | 
					    countRespectsLimit: Boolean! = false
 | 
				
			||||||
 | 
					  ): GetShotsResult!
 | 
				
			||||||
 | 
					  getShotsWithMetadata(
 | 
				
			||||||
 | 
					    filterInput: FilterInput!
 | 
				
			||||||
 | 
					    ids: [Int!] = null
 | 
				
			||||||
 | 
					    shotsPagination: GetShotsPagination = null
 | 
				
			||||||
 | 
					    limit: Int! = 500
 | 
				
			||||||
 | 
					    countRespectsLimit: Boolean! = false
 | 
				
			||||||
 | 
					  ): GetShotsResult!
 | 
				
			||||||
 | 
					  getShots(
 | 
				
			||||||
 | 
					    filterInput: FilterInput!
 | 
				
			||||||
 | 
					    shotsPagination: GetShotsPagination = null
 | 
				
			||||||
 | 
					    limit: Int! = 500
 | 
				
			||||||
 | 
					    countRespectsLimit: Boolean! = false
 | 
				
			||||||
 | 
					  ): [ShotGQL!]!
 | 
				
			||||||
 | 
					  getShotsByIds(ids: [Int!]!): [ShotGQL!]!
 | 
				
			||||||
 | 
					  getShotAnnotationTypes(errorTypes: Boolean = false): [ShotAnnotationTypeGQL!]!
 | 
				
			||||||
  getUser(userId: Int!): UserGQL
 | 
					  getUser(userId: Int!): UserGQL
 | 
				
			||||||
 | 
					  doesUsernameExist(candidateUsername: String!): Boolean!
 | 
				
			||||||
  getLoggedInUser: UserGQL
 | 
					  getLoggedInUser: UserGQL
 | 
				
			||||||
  getPlayTime(userId: Int!): UserPlayTimeGQL!
 | 
					  getUsernames(
 | 
				
			||||||
 | 
					    matchString: String = null
 | 
				
			||||||
 | 
					    limit: Int = null
 | 
				
			||||||
 | 
					    after: String = null
 | 
				
			||||||
 | 
					  ): [String!]!
 | 
				
			||||||
 | 
					  getUserRelationshipsMatching(
 | 
				
			||||||
 | 
					    userId: Int!
 | 
				
			||||||
 | 
					    matchString: String = null
 | 
				
			||||||
 | 
					    limit: Int = 100
 | 
				
			||||||
 | 
					    after: String = null
 | 
				
			||||||
 | 
					  ): UserRelationshipsResult!
 | 
				
			||||||
 | 
					  getPlayTime(userId: Int!, filters: VideoFilterInput = null): UserPlayTimeGQL!
 | 
				
			||||||
  getUserVideos(
 | 
					  getUserVideos(
 | 
				
			||||||
    userId: Int = null
 | 
					    userId: Int = null
 | 
				
			||||||
    limit: Int! = 5
 | 
					    limit: Int! = 5
 | 
				
			||||||
    after: String = null
 | 
					    after: String = null
 | 
				
			||||||
    filters: VideoFilterInput = null
 | 
					    filters: VideoFilterInput = null
 | 
				
			||||||
  ): VideoHistoryGQL!
 | 
					  ): VideoHistoryGQL!
 | 
				
			||||||
  getVideo(videoId: Int!): VideoGQL!
 | 
					  getUserTags(includeRetiredTags: Boolean = false): [TagGQL!]!
 | 
				
			||||||
 | 
					  getVideo(videoId: Int!, debuggingJson: JSON = null): VideoGQL!
 | 
				
			||||||
  getVideos(videoIds: [Int!]!): [VideoGQL!]!
 | 
					  getVideos(videoIds: [Int!]!): [VideoGQL!]!
 | 
				
			||||||
 | 
					  getFeedVideos(
 | 
				
			||||||
 | 
					    limit: Int! = 5
 | 
				
			||||||
 | 
					    after: String = null
 | 
				
			||||||
 | 
					    includePrivate: IncludePrivateEnum! = MINE
 | 
				
			||||||
 | 
					    includeCallersVideos: Boolean = true
 | 
				
			||||||
 | 
					    filters: VideoFilterInput = null
 | 
				
			||||||
 | 
					    feedInput: VideoFeedInputGQL = null
 | 
				
			||||||
 | 
					  ): VideoHistoryGQL!
 | 
				
			||||||
 | 
					  getLongestRunsLeaderboard(
 | 
				
			||||||
 | 
					    interval: TimeInterval = null
 | 
				
			||||||
 | 
					    when: DateTime = null
 | 
				
			||||||
 | 
					    limit: Int! = 100
 | 
				
			||||||
 | 
					    requiredTags: [String!] = null
 | 
				
			||||||
 | 
					  ): RunLeaderboardGQL!
 | 
				
			||||||
 | 
					  getMakesLeaderboard(
 | 
				
			||||||
 | 
					    interval: TimeInterval = null
 | 
				
			||||||
 | 
					    when: DateTime = null
 | 
				
			||||||
 | 
					  ): CountLeaderboardGQL!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type AggregateResultGQL {
 | 
					type AggregateResultGQL {
 | 
				
			||||||
@@ -37,6 +97,21 @@ type TargetMetricsGQL {
 | 
				
			|||||||
  count: Int!
 | 
					  count: Int!
 | 
				
			||||||
  makePercentage: Float
 | 
					  makePercentage: Float
 | 
				
			||||||
  averageDifficulty: Float
 | 
					  averageDifficulty: Float
 | 
				
			||||||
 | 
					  spinTypeCounts: SpinTypeCountsGQL
 | 
				
			||||||
 | 
					  shotDirectionCounts: ShotDirectionCountsGQL
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SpinTypeCountsGQL {
 | 
				
			||||||
 | 
					  follow: Int!
 | 
				
			||||||
 | 
					  draw: Int!
 | 
				
			||||||
 | 
					  center: Int!
 | 
				
			||||||
 | 
					  unknown: Int!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ShotDirectionCountsGQL {
 | 
				
			||||||
 | 
					  left: Int!
 | 
				
			||||||
 | 
					  right: Int!
 | 
				
			||||||
 | 
					  straight: Int!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
input AggregateInputGQL {
 | 
					input AggregateInputGQL {
 | 
				
			||||||
@@ -47,6 +122,7 @@ input AggregateInputGQL {
 | 
				
			|||||||
input AggregationInput @oneOf {
 | 
					input AggregationInput @oneOf {
 | 
				
			||||||
  bucketSet: BucketSetInputGQL
 | 
					  bucketSet: BucketSetInputGQL
 | 
				
			||||||
  enum: EnumAggregation
 | 
					  enum: EnumAggregation
 | 
				
			||||||
 | 
					  datetimeRange: DatetimeRangeAggregationInput
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
input BucketSetInputGQL {
 | 
					input BucketSetInputGQL {
 | 
				
			||||||
@@ -63,19 +139,53 @@ input EnumAggregation {
 | 
				
			|||||||
  feature: String!
 | 
					  feature: String!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input DatetimeRangeAggregationInput {
 | 
				
			||||||
 | 
					  startDatetime: DateTime = null
 | 
				
			||||||
 | 
					  endDatetime: DateTime = null
 | 
				
			||||||
 | 
					  interval: TimeInterval!
 | 
				
			||||||
 | 
					  feature: String! = "created_at"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					Date with time (isoformat)
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					scalar DateTime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input TimeInterval @oneOf {
 | 
				
			||||||
 | 
					  timedelta: TimeDeltaGQL
 | 
				
			||||||
 | 
					  aligned: AlignedIntervalEnum
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input TimeDeltaGQL {
 | 
				
			||||||
 | 
					  days: Int = 0
 | 
				
			||||||
 | 
					  weeks: Int = 0
 | 
				
			||||||
 | 
					  months: Int = 0
 | 
				
			||||||
 | 
					  years: Int = 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum AlignedIntervalEnum {
 | 
				
			||||||
 | 
					  MONTH
 | 
				
			||||||
 | 
					  YEAR
 | 
				
			||||||
 | 
					  WEEK
 | 
				
			||||||
 | 
					  DAY
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
input FilterInput @oneOf {
 | 
					input FilterInput @oneOf {
 | 
				
			||||||
  andFilters: [FilterInput!]
 | 
					  andFilters: [FilterInput!]
 | 
				
			||||||
  orFilters: [FilterInput!]
 | 
					  orFilters: [FilterInput!]
 | 
				
			||||||
  notFilter: FilterInput
 | 
					  notFilter: FilterInput
 | 
				
			||||||
  cueObjectDistance: RangeFilter
 | 
					  cueObjectDistance: FloatRangeFilter
 | 
				
			||||||
  targetPocketDistance: RangeFilter
 | 
					  targetPocketDistance: FloatRangeFilter
 | 
				
			||||||
  cueObjectAngle: RangeFilter
 | 
					  cueObjectAngle: FloatRangeFilter
 | 
				
			||||||
  cueBallSpeed: RangeFilter
 | 
					  cueBallSpeed: FloatRangeFilter
 | 
				
			||||||
  difficulty: RangeFilter
 | 
					  difficulty: FloatRangeFilter
 | 
				
			||||||
  intendedPocketType: [PocketEnum!]
 | 
					  intendedPocketType: [PocketEnum!]
 | 
				
			||||||
  shotDirection: [ShotDirectionEnum!]
 | 
					  shotDirection: [ShotDirectionEnum!]
 | 
				
			||||||
  videoId: [Int!]
 | 
					  videoId: [Int!]
 | 
				
			||||||
  userId: [Int!]
 | 
					  userId: [Int!]
 | 
				
			||||||
 | 
					  runId: [Int!]
 | 
				
			||||||
 | 
					  username: [String!]
 | 
				
			||||||
 | 
					  fargoRating: FloatRangeFilter
 | 
				
			||||||
  make: [Boolean!]
 | 
					  make: [Boolean!]
 | 
				
			||||||
  tags: [VideoTagInput!]
 | 
					  tags: [VideoTagInput!]
 | 
				
			||||||
  annotations: [ShotAnnotationInput!]
 | 
					  annotations: [ShotAnnotationInput!]
 | 
				
			||||||
@@ -85,15 +195,33 @@ input FilterInput @oneOf {
 | 
				
			|||||||
  isLeftMiss: [Boolean!]
 | 
					  isLeftMiss: [Boolean!]
 | 
				
			||||||
  isRightMiss: [Boolean!]
 | 
					  isRightMiss: [Boolean!]
 | 
				
			||||||
  isDirect: [Boolean!]
 | 
					  isDirect: [Boolean!]
 | 
				
			||||||
  bankAngle: RangeFilter
 | 
					  isBreakHeuristic: [Boolean!]
 | 
				
			||||||
  bankDistance: RangeFilter
 | 
					  tableSize: FloatRangeFilter
 | 
				
			||||||
  kickAngle: RangeFilter
 | 
					  bankAngle: FloatRangeFilter
 | 
				
			||||||
  kickDistance: RangeFilter
 | 
					  bankDistance: FloatRangeFilter
 | 
				
			||||||
 | 
					  kickAngle: FloatRangeFilter
 | 
				
			||||||
 | 
					  kickDistance: FloatRangeFilter
 | 
				
			||||||
 | 
					  cueAngleAfterObject: FloatRangeFilter
 | 
				
			||||||
 | 
					  spinType: [SpinTypeEnum!]
 | 
				
			||||||
 | 
					  cueSpeedAfterObject: FloatRangeFilter
 | 
				
			||||||
 | 
					  falsePositiveScore: FloatRangeFilter
 | 
				
			||||||
 | 
					  backcut: [Boolean!]
 | 
				
			||||||
 | 
					  targetPocketAngleDirection: [ShotDirectionEnum!]
 | 
				
			||||||
 | 
					  targetPocketAngle: FloatRangeFilter
 | 
				
			||||||
 | 
					  missAngleInDegrees: FloatRangeFilter
 | 
				
			||||||
 | 
					  marginOfErrorInDegrees: FloatRangeFilter
 | 
				
			||||||
 | 
					  createdAt: DateRangeFilter
 | 
				
			||||||
 | 
					  totalDistance: FloatRangeFilter
 | 
				
			||||||
 | 
					  runLength: FloatRangeFilter
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
input RangeFilter {
 | 
					input FloatRangeFilter {
 | 
				
			||||||
  lessThan: Float = null
 | 
					  lessThan: Float = null
 | 
				
			||||||
  greaterThanEqualTo: Float = null
 | 
					  greaterThanEqualTo: Float = null
 | 
				
			||||||
 | 
					  greaterThan: Float = null
 | 
				
			||||||
 | 
					  includeOnNone: Boolean! = false
 | 
				
			||||||
 | 
					  lessThanInclusive: Boolean! = false
 | 
				
			||||||
 | 
					  greaterThanInclusive: Boolean! = true
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum PocketEnum {
 | 
					enum PocketEnum {
 | 
				
			||||||
@@ -120,6 +248,27 @@ input ShotAnnotationInput {
 | 
				
			|||||||
  name: String!
 | 
					  name: String!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum SpinTypeEnum {
 | 
				
			||||||
 | 
					  DRAW
 | 
				
			||||||
 | 
					  FOLLOW
 | 
				
			||||||
 | 
					  CENTER
 | 
				
			||||||
 | 
					  UNKNOWN
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input DateRangeFilter {
 | 
				
			||||||
 | 
					  lessThan: Date = null
 | 
				
			||||||
 | 
					  greaterThanEqualTo: Date = null
 | 
				
			||||||
 | 
					  greaterThan: Date = null
 | 
				
			||||||
 | 
					  includeOnNone: Boolean! = false
 | 
				
			||||||
 | 
					  lessThanInclusive: Boolean! = false
 | 
				
			||||||
 | 
					  greaterThanInclusive: Boolean! = true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					Date (isoformat)
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					scalar Date
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type BucketSetGQL {
 | 
					type BucketSetGQL {
 | 
				
			||||||
  keyName: String!
 | 
					  keyName: String!
 | 
				
			||||||
  feature: String!
 | 
					  feature: String!
 | 
				
			||||||
@@ -136,6 +285,7 @@ type DeployedConfigGQL {
 | 
				
			|||||||
  firebase: Boolean!
 | 
					  firebase: Boolean!
 | 
				
			||||||
  devMode: Boolean!
 | 
					  devMode: Boolean!
 | 
				
			||||||
  environment: String!
 | 
					  environment: String!
 | 
				
			||||||
 | 
					  minimumAllowedAppVersion: String!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type MakePercentageIntervalGQL {
 | 
					type MakePercentageIntervalGQL {
 | 
				
			||||||
@@ -143,6 +293,67 @@ type MakePercentageIntervalGQL {
 | 
				
			|||||||
  elapsedTime: Float!
 | 
					  elapsedTime: Float!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RequestedMedalsGQL {
 | 
				
			||||||
 | 
					  distanceOver66: MedalGQL
 | 
				
			||||||
 | 
					  distanceOver78: MedalGQL
 | 
				
			||||||
 | 
					  distanceOver90: MedalGQL
 | 
				
			||||||
 | 
					  runLength3: MedalGQL
 | 
				
			||||||
 | 
					  runLength5: MedalGQL
 | 
				
			||||||
 | 
					  runLength8: MedalGQL
 | 
				
			||||||
 | 
					  runLength10: MedalGQL
 | 
				
			||||||
 | 
					  runLength15: MedalGQL
 | 
				
			||||||
 | 
					  runLength20: MedalGQL
 | 
				
			||||||
 | 
					  runLength25: MedalGQL
 | 
				
			||||||
 | 
					  runLength30: MedalGQL
 | 
				
			||||||
 | 
					  runLength40: MedalGQL
 | 
				
			||||||
 | 
					  runLength50: MedalGQL
 | 
				
			||||||
 | 
					  totalMakes25: MedalGQL @deprecated(reason: "no longer supported")
 | 
				
			||||||
 | 
					  totalMakes50: MedalGQL @deprecated(reason: "no longer supported")
 | 
				
			||||||
 | 
					  totalMakes75: MedalGQL @deprecated(reason: "no longer supported")
 | 
				
			||||||
 | 
					  totalMakes200: MedalGQL @deprecated(reason: "no longer supported")
 | 
				
			||||||
 | 
					  totalMakes300: MedalGQL @deprecated(reason: "no longer supported")
 | 
				
			||||||
 | 
					  totalMakes400: MedalGQL @deprecated(reason: "no longer supported")
 | 
				
			||||||
 | 
					  totalMakes750: MedalGQL @deprecated(reason: "no longer supported")
 | 
				
			||||||
 | 
					  totalMakes100: MedalGQL
 | 
				
			||||||
 | 
					  totalMakes500: MedalGQL
 | 
				
			||||||
 | 
					  totalMakes1000: MedalGQL
 | 
				
			||||||
 | 
					  totalMakes5000: MedalGQL
 | 
				
			||||||
 | 
					  totalMakes10000: MedalGQL
 | 
				
			||||||
 | 
					  dailyMakes50: MedalGQL
 | 
				
			||||||
 | 
					  dailyMakes100: MedalGQL
 | 
				
			||||||
 | 
					  dailyMakes150: MedalGQL
 | 
				
			||||||
 | 
					  dailyMakes200: MedalGQL
 | 
				
			||||||
 | 
					  dailyMakes250: MedalGQL
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type MedalGQL {
 | 
				
			||||||
 | 
					  count: Int!
 | 
				
			||||||
 | 
					  nickname: String
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input MedalScope @oneOf {
 | 
				
			||||||
 | 
					  videoId: Int
 | 
				
			||||||
 | 
					  interval: TimeInterval
 | 
				
			||||||
 | 
					    @deprecated(reason: "NO LONGER SUPPORTED, USE DATETIME_RANGE")
 | 
				
			||||||
 | 
					  datetimeRange: DatetimeRangeAggregationInput
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type GetRunsResult {
 | 
				
			||||||
 | 
					  runs: [RunGQL!]!
 | 
				
			||||||
 | 
					  count: Int
 | 
				
			||||||
 | 
					  runIds: [Int!]!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RunGQL {
 | 
				
			||||||
 | 
					  id: Int!
 | 
				
			||||||
 | 
					  runLength: Int!
 | 
				
			||||||
 | 
					  videoId: Int!
 | 
				
			||||||
 | 
					  userId: Int!
 | 
				
			||||||
 | 
					  shots: [ShotGQL!]!
 | 
				
			||||||
 | 
					  video: VideoGQL!
 | 
				
			||||||
 | 
					  user: UserGQL!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ShotGQL {
 | 
					type ShotGQL {
 | 
				
			||||||
  id: Int!
 | 
					  id: Int!
 | 
				
			||||||
  videoId: Int!
 | 
					  videoId: Int!
 | 
				
			||||||
@@ -152,21 +363,23 @@ type ShotGQL {
 | 
				
			|||||||
  updatedAt: DateTime
 | 
					  updatedAt: DateTime
 | 
				
			||||||
  cueObjectFeatures: CueObjectFeaturesGQL
 | 
					  cueObjectFeatures: CueObjectFeaturesGQL
 | 
				
			||||||
  pocketingIntentionFeatures: PocketingIntentionFeaturesGQL
 | 
					  pocketingIntentionFeatures: PocketingIntentionFeaturesGQL
 | 
				
			||||||
 | 
					  pocketingIntentionInfo: PocketingIntentionInfoGQL
 | 
				
			||||||
  bankFeatures: BankFeaturesGQL
 | 
					  bankFeatures: BankFeaturesGQL
 | 
				
			||||||
  serializedShotPaths: SerializedShotPathsGQL
 | 
					  serializedShotPaths: SerializedShotPathsGQL
 | 
				
			||||||
  user: UserGQL
 | 
					  user: UserGQL
 | 
				
			||||||
 | 
					  annotations: [ShotAnnotationGQL!]!
 | 
				
			||||||
 | 
					  falsePositiveScore: Float
 | 
				
			||||||
 | 
					  video: VideoGQL
 | 
				
			||||||
 | 
					  run: RunGQL
 | 
				
			||||||
 | 
					  runFeatures: RunFeaturesGQL
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"""
 | 
					 | 
				
			||||||
Date with time (isoformat)
 | 
					 | 
				
			||||||
"""
 | 
					 | 
				
			||||||
scalar DateTime
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type CueObjectFeaturesGQL {
 | 
					type CueObjectFeaturesGQL {
 | 
				
			||||||
  cueObjectDistance: Float
 | 
					  cueObjectDistance: Float
 | 
				
			||||||
  cueObjectAngle: Float
 | 
					  cueObjectAngle: Float
 | 
				
			||||||
  cueBallSpeed: Float
 | 
					  cueBallSpeed: Float
 | 
				
			||||||
  shotDirection: ShotDirectionEnum
 | 
					  shotDirection: ShotDirectionEnum
 | 
				
			||||||
 | 
					  spinType: SpinTypeEnum
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type PocketingIntentionFeaturesGQL {
 | 
					type PocketingIntentionFeaturesGQL {
 | 
				
			||||||
@@ -174,6 +387,25 @@ type PocketingIntentionFeaturesGQL {
 | 
				
			|||||||
  make: Boolean
 | 
					  make: Boolean
 | 
				
			||||||
  intendedPocketType: PocketEnum
 | 
					  intendedPocketType: PocketEnum
 | 
				
			||||||
  difficulty: Float
 | 
					  difficulty: Float
 | 
				
			||||||
 | 
					  targetPocketAngle: Float
 | 
				
			||||||
 | 
					  targetPocketAngleDirection: ShotDirectionEnum
 | 
				
			||||||
 | 
					  marginOfErrorInDegrees: Float
 | 
				
			||||||
 | 
					  backcut: Boolean
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type PocketingIntentionInfoGQL {
 | 
				
			||||||
 | 
					  ballId: Int!
 | 
				
			||||||
 | 
					  pocketId: PocketIdentifier!
 | 
				
			||||||
 | 
					  pathMetadataIndex: Int!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum PocketIdentifier {
 | 
				
			||||||
 | 
					  TOP_LEFT
 | 
				
			||||||
 | 
					  TOP_SIDE
 | 
				
			||||||
 | 
					  TOP_RIGHT
 | 
				
			||||||
 | 
					  BOTTOM_LEFT
 | 
				
			||||||
 | 
					  BOTTOM_SIDE
 | 
				
			||||||
 | 
					  BOTTOM_RIGHT
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type BankFeaturesGQL {
 | 
					type BankFeaturesGQL {
 | 
				
			||||||
@@ -193,12 +425,27 @@ type SerializedShotPathsGQL {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
type UserGQL {
 | 
					type UserGQL {
 | 
				
			||||||
  id: Int!
 | 
					  id: Int!
 | 
				
			||||||
  firebaseUid: String!
 | 
					  firebaseUid: String
 | 
				
			||||||
  username: String!
 | 
					  username: String!
 | 
				
			||||||
 | 
					  isAdmin: Boolean
 | 
				
			||||||
 | 
					  fargoRating: Int
 | 
				
			||||||
  activeVideoId: Int
 | 
					  activeVideoId: Int
 | 
				
			||||||
  profileImageUri: String
 | 
					  profileImageUri: String
 | 
				
			||||||
  createdAt: DateTime
 | 
					  createdAt: DateTime
 | 
				
			||||||
  updatedAt: DateTime
 | 
					  updatedAt: DateTime
 | 
				
			||||||
 | 
					  videosPrivateByDefault: Boolean
 | 
				
			||||||
 | 
					  following: [UserGQL!]
 | 
				
			||||||
 | 
					  followers: [UserGQL!]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ShotAnnotationGQL {
 | 
				
			||||||
 | 
					  shotId: Int!
 | 
				
			||||||
 | 
					  type: ShotAnnotationTypeGQL!
 | 
				
			||||||
 | 
					  creator: UserGQL!
 | 
				
			||||||
 | 
					  notes: String!
 | 
				
			||||||
 | 
					  errorDefault: Boolean!
 | 
				
			||||||
 | 
					  createdAt: DateTime
 | 
				
			||||||
 | 
					  updatedAt: DateTime
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ShotAnnotationTypeGQL {
 | 
					type ShotAnnotationTypeGQL {
 | 
				
			||||||
@@ -206,15 +453,6 @@ type ShotAnnotationTypeGQL {
 | 
				
			|||||||
  name: String!
 | 
					  name: String!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type UserPlayTimeGQL {
 | 
					 | 
				
			||||||
  totalSeconds: Float!
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type VideoHistoryGQL {
 | 
					 | 
				
			||||||
  videos: [VideoGQL!]!
 | 
					 | 
				
			||||||
  pageInfo: PageInfoGQL!
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type VideoGQL {
 | 
					type VideoGQL {
 | 
				
			||||||
  id: Int!
 | 
					  id: Int!
 | 
				
			||||||
  owner: UserGQL
 | 
					  owner: UserGQL
 | 
				
			||||||
@@ -225,6 +463,7 @@ type VideoGQL {
 | 
				
			|||||||
  makePercentage: Float!
 | 
					  makePercentage: Float!
 | 
				
			||||||
  medianRun: Float
 | 
					  medianRun: Float
 | 
				
			||||||
  averageTimeBetweenShots: Float
 | 
					  averageTimeBetweenShots: Float
 | 
				
			||||||
 | 
					  averageDifficulty: Float
 | 
				
			||||||
  createdAt: DateTime
 | 
					  createdAt: DateTime
 | 
				
			||||||
  updatedAt: DateTime
 | 
					  updatedAt: DateTime
 | 
				
			||||||
  shots: [ShotGQL!]!
 | 
					  shots: [ShotGQL!]!
 | 
				
			||||||
@@ -232,11 +471,15 @@ type VideoGQL {
 | 
				
			|||||||
  endTime: DateTime
 | 
					  endTime: DateTime
 | 
				
			||||||
  elapsedTime: Float
 | 
					  elapsedTime: Float
 | 
				
			||||||
  framesPerSecond: Float!
 | 
					  framesPerSecond: Float!
 | 
				
			||||||
 | 
					  tableSize: Float!
 | 
				
			||||||
 | 
					  private: Boolean!
 | 
				
			||||||
  stream: UploadStreamGQL
 | 
					  stream: UploadStreamGQL
 | 
				
			||||||
  playlist: HLSPlaylistGQL
 | 
					  playlist: HLSPlaylistGQL
 | 
				
			||||||
  tags: [VideoTag!]!
 | 
					  tags: [VideoTag!]!
 | 
				
			||||||
 | 
					  currentHomography: HomographyInfoGQL
 | 
				
			||||||
  homographyHistory: [HomographyInfoGQL!]!
 | 
					  homographyHistory: [HomographyInfoGQL!]!
 | 
				
			||||||
  currentProcessing: VideoProcessingGQL
 | 
					  currentProcessing: VideoProcessingGQL
 | 
				
			||||||
 | 
					  reactions: [ReactionGQL!]!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type UploadStreamGQL {
 | 
					type UploadStreamGQL {
 | 
				
			||||||
@@ -246,12 +489,22 @@ type UploadStreamGQL {
 | 
				
			|||||||
  segmentProcessingCursor: Int!
 | 
					  segmentProcessingCursor: Int!
 | 
				
			||||||
  lastIntendedSegmentBound: Int
 | 
					  lastIntendedSegmentBound: Int
 | 
				
			||||||
  isCompleted: Boolean!
 | 
					  isCompleted: Boolean!
 | 
				
			||||||
 | 
					  initPlaylistUploadStatus: InitPlaylistUploadStatusEnum
 | 
				
			||||||
  lowestUnuploadedSegmentIndex: Int!
 | 
					  lowestUnuploadedSegmentIndex: Int!
 | 
				
			||||||
  uploadCompletionCursor: Int!
 | 
					  uploadCompletionCursor: Int!
 | 
				
			||||||
  errors: [StreamErrorGQL!]!
 | 
					  errors: [StreamErrorGQL!]!
 | 
				
			||||||
  createdAt: DateTime!
 | 
					  createdAt: DateTime!
 | 
				
			||||||
  updatedAt: DateTime!
 | 
					  updatedAt: DateTime!
 | 
				
			||||||
  segments: [UploadSegmentGQL!]!
 | 
					  segments: [UploadSegmentGQL!]!
 | 
				
			||||||
 | 
					  clientUploadStatus: ClientUploadStatusEnum
 | 
				
			||||||
 | 
					  resolution: VideoResolutionGQL!
 | 
				
			||||||
 | 
					  streamSegmentType: StreamSegmentTypeEnum!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum InitPlaylistUploadStatusEnum {
 | 
				
			||||||
 | 
					  NOT_APPLICABLE
 | 
				
			||||||
 | 
					  NOT_UPLOADED
 | 
				
			||||||
 | 
					  UPLOADED
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type StreamErrorGQL {
 | 
					type StreamErrorGQL {
 | 
				
			||||||
@@ -264,10 +517,25 @@ type UploadSegmentGQL {
 | 
				
			|||||||
  valid: Boolean!
 | 
					  valid: Boolean!
 | 
				
			||||||
  endFrameIndex: Int
 | 
					  endFrameIndex: Int
 | 
				
			||||||
  framesPerSecond: Float
 | 
					  framesPerSecond: Float
 | 
				
			||||||
  durationsInSeconds: Float
 | 
					  durationInSeconds: Float
 | 
				
			||||||
  linksRequested: Int!
 | 
					  linksRequested: Int!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum ClientUploadStatusEnum {
 | 
				
			||||||
 | 
					  UPLOAD_ENABLED
 | 
				
			||||||
 | 
					  UPLOAD_DISABLED
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type VideoResolutionGQL {
 | 
				
			||||||
 | 
					  width: Int
 | 
				
			||||||
 | 
					  height: Int
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum StreamSegmentTypeEnum {
 | 
				
			||||||
 | 
					  FRAGMENTED_MP4
 | 
				
			||||||
 | 
					  RB_CHUNKED_MP4
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type HLSPlaylistGQL {
 | 
					type HLSPlaylistGQL {
 | 
				
			||||||
  videoId: Int!
 | 
					  videoId: Int!
 | 
				
			||||||
  m3u8Text: String!
 | 
					  m3u8Text: String!
 | 
				
			||||||
@@ -284,6 +552,7 @@ type VideoTagClass {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type HomographyInfoGQL {
 | 
					type HomographyInfoGQL {
 | 
				
			||||||
 | 
					  id: Int!
 | 
				
			||||||
  frameIndex: Int!
 | 
					  frameIndex: Int!
 | 
				
			||||||
  crop: BoundingBoxGQL!
 | 
					  crop: BoundingBoxGQL!
 | 
				
			||||||
  pockets: [BoundingBoxGQL!]!
 | 
					  pockets: [BoundingBoxGQL!]!
 | 
				
			||||||
@@ -313,7 +582,10 @@ type IntPoint2D {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type VideoProcessingGQL {
 | 
					type VideoProcessingGQL {
 | 
				
			||||||
 | 
					  id: Int!
 | 
				
			||||||
  errors: [VideoProcessingErrorGQL!]!
 | 
					  errors: [VideoProcessingErrorGQL!]!
 | 
				
			||||||
 | 
					  status: ProcessingStatusEnum!
 | 
				
			||||||
 | 
					  statuses: [VideoProcessingStatusGQL!]!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type VideoProcessingErrorGQL {
 | 
					type VideoProcessingErrorGQL {
 | 
				
			||||||
@@ -322,27 +594,230 @@ type VideoProcessingErrorGQL {
 | 
				
			|||||||
  endSegmentIndex: Int
 | 
					  endSegmentIndex: Int
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type PageInfoGQL {
 | 
					enum ProcessingStatusEnum {
 | 
				
			||||||
  hasNextPage: Boolean!
 | 
					  STARTED
 | 
				
			||||||
  endCursor: String
 | 
					  FAILED
 | 
				
			||||||
 | 
					  SUCCEEDED
 | 
				
			||||||
 | 
					  SUSPENDED
 | 
				
			||||||
 | 
					  CREATED
 | 
				
			||||||
 | 
					  QUEUED
 | 
				
			||||||
 | 
					  RUNNING
 | 
				
			||||||
 | 
					  REEXTRACTING_FEATURES
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type VideoProcessingStatusGQL {
 | 
				
			||||||
 | 
					  status: ProcessingStatusEnum!
 | 
				
			||||||
 | 
					  appVersion: String!
 | 
				
			||||||
 | 
					  sequenceId: Int!
 | 
				
			||||||
 | 
					  createdAt: DateTime
 | 
				
			||||||
 | 
					  updatedAt: DateTime
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ReactionGQL {
 | 
				
			||||||
 | 
					  videoId: Int!
 | 
				
			||||||
 | 
					  user: UserGQL!
 | 
				
			||||||
 | 
					  reaction: ReactionEnum!
 | 
				
			||||||
 | 
					  createdAt: DateTime
 | 
				
			||||||
 | 
					  updatedAt: DateTime
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum ReactionEnum {
 | 
				
			||||||
 | 
					  LIKE
 | 
				
			||||||
 | 
					  HEART
 | 
				
			||||||
 | 
					  BULLSEYE
 | 
				
			||||||
 | 
					  HUNDRED
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RunFeaturesGQL {
 | 
				
			||||||
 | 
					  runId: Int!
 | 
				
			||||||
 | 
					  indexInRun: Int!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input RunFilterInput {
 | 
				
			||||||
 | 
					  videoId: [Int!]
 | 
				
			||||||
 | 
					  userId: [Int!]
 | 
				
			||||||
 | 
					  username: [String!]
 | 
				
			||||||
 | 
					  andFilters: [RunFilterInput!]
 | 
				
			||||||
 | 
					  orFilters: [RunFilterInput!]
 | 
				
			||||||
 | 
					  notFilter: RunFilterInput
 | 
				
			||||||
 | 
					  tableSize: FloatRangeFilter
 | 
				
			||||||
 | 
					  createdAt: DateRangeFilter
 | 
				
			||||||
 | 
					  runLength: FloatRangeFilter
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input GetRunsOrdering {
 | 
				
			||||||
 | 
					  orderings: [RunsOrderingComponent!]!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input RunsOrderingComponent @oneOf {
 | 
				
			||||||
 | 
					  runLength: IntOrdering
 | 
				
			||||||
 | 
					  videoId: IntOrdering
 | 
				
			||||||
 | 
					  videoCreation: DatetimeOrdering
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input IntOrdering {
 | 
				
			||||||
 | 
					  descending: Boolean! = true
 | 
				
			||||||
 | 
					  startingAt: Int = null
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input DatetimeOrdering {
 | 
				
			||||||
 | 
					  descending: Boolean! = true
 | 
				
			||||||
 | 
					  startingAt: DateTime = null
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type GetShotsResult {
 | 
				
			||||||
 | 
					  shots: [ShotGQL!]!
 | 
				
			||||||
 | 
					  count: Int
 | 
				
			||||||
 | 
					  ids: [Int!]!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input GetShotsOrdering {
 | 
				
			||||||
 | 
					  orderings: [ShotsOrderingComponent!]!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input ShotsOrderingComponent @oneOf {
 | 
				
			||||||
 | 
					  videoCreation: DatetimeOrdering
 | 
				
			||||||
 | 
					  marginOfError: FloatOrdering
 | 
				
			||||||
 | 
					  difficulty: FloatOrdering
 | 
				
			||||||
 | 
					  videoId: IntOrdering
 | 
				
			||||||
 | 
					  startFrame: IntOrdering
 | 
				
			||||||
 | 
					  runLength: IntOrdering
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input FloatOrdering {
 | 
				
			||||||
 | 
					  descending: Boolean! = true
 | 
				
			||||||
 | 
					  startingAt: Float = null
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input GetShotsPagination {
 | 
				
			||||||
 | 
					  createdAfter: CreatedAfter!
 | 
				
			||||||
 | 
					  startFrameAfter: Int!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input CreatedAfter @oneOf {
 | 
				
			||||||
 | 
					  videoId: Int
 | 
				
			||||||
 | 
					  createdAt: DateTime
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UserRelationshipsResult {
 | 
				
			||||||
 | 
					  inquiringUser: UserGQL!
 | 
				
			||||||
 | 
					  relationships: [UserRelationship!]!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UserRelationship {
 | 
				
			||||||
 | 
					  toUser: UserGQL!
 | 
				
			||||||
 | 
					  toUserFollows: Boolean!
 | 
				
			||||||
 | 
					  toUserIsFollowedBy: Boolean!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UserPlayTimeGQL {
 | 
				
			||||||
 | 
					  totalSeconds: Float!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
input VideoFilterInput {
 | 
					input VideoFilterInput {
 | 
				
			||||||
  isStreamCompleted: Boolean = null
 | 
					  isStreamCompleted: Boolean = null
 | 
				
			||||||
  requireCursorCompletion: Boolean! = true
 | 
					  requireCursorCompletion: Boolean! = true
 | 
				
			||||||
 | 
					  createdAt: DateRangeFilter = null
 | 
				
			||||||
 | 
					  excludeVideosWithNoShots: Boolean = null
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type VideoHistoryGQL {
 | 
				
			||||||
 | 
					  videos: [VideoGQL!]!
 | 
				
			||||||
 | 
					  pageInfo: PageInfoGQL!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type PageInfoGQL {
 | 
				
			||||||
 | 
					  hasNextPage: Boolean!
 | 
				
			||||||
 | 
					  endCursor: String
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TagGQL {
 | 
				
			||||||
 | 
					  id: Int!
 | 
				
			||||||
 | 
					  name: String!
 | 
				
			||||||
 | 
					  tagClasses: [TagClassGQL!]
 | 
				
			||||||
 | 
					  retired: Boolean!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TagClassGQL {
 | 
				
			||||||
 | 
					  id: Int!
 | 
				
			||||||
 | 
					  name: String!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					The `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					scalar JSON
 | 
				
			||||||
 | 
					  @specifiedBy(
 | 
				
			||||||
 | 
					    url: "https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf"
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum IncludePrivateEnum {
 | 
				
			||||||
 | 
					  ALL
 | 
				
			||||||
 | 
					  MINE
 | 
				
			||||||
 | 
					  NONE
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input VideoFeedInputGQL @oneOf {
 | 
				
			||||||
 | 
					  followedByUserId: Int
 | 
				
			||||||
 | 
					  userId: Int
 | 
				
			||||||
 | 
					  allUsers: Boolean
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RunLeaderboardGQL {
 | 
				
			||||||
 | 
					  entries: [RunGQL!]!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type CountLeaderboardGQL {
 | 
				
			||||||
 | 
					  entries: [UserShotCountEntry!]!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UserShotCountEntry {
 | 
				
			||||||
 | 
					  user: UserGQL!
 | 
				
			||||||
 | 
					  value: Int!
 | 
				
			||||||
 | 
					  total: Int!
 | 
				
			||||||
 | 
					  proportionMade: Float!
 | 
				
			||||||
 | 
					  videos: Int!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Mutation {
 | 
					type Mutation {
 | 
				
			||||||
  createBucketSet(params: CreateBucketSetInput!): BucketSetGQL!
 | 
					  createBucketSet(params: CreateBucketSetInput!): BucketSetGQL!
 | 
				
			||||||
  setLoggerLevel(path: String!, level: String!): Boolean!
 | 
					  setLoggerLevel(path: String!, level: String!): Boolean!
 | 
				
			||||||
  getProfileImageUploadLink(fileExt: String = ".png"): GetUploadLinkReturn!
 | 
					  editShot(
 | 
				
			||||||
 | 
					    shotId: Int!
 | 
				
			||||||
 | 
					    fieldsToEdit: EditableShotFieldInputGQL!
 | 
				
			||||||
 | 
					  ): EditShotReturn!
 | 
				
			||||||
 | 
					  addAnnotationToShot(
 | 
				
			||||||
 | 
					    shotId: Int!
 | 
				
			||||||
 | 
					    annotationName: String!
 | 
				
			||||||
 | 
					    notes: String = null
 | 
				
			||||||
 | 
					  ): AddShotAnnotationReturn!
 | 
				
			||||||
 | 
					  updateShotAnnotations(
 | 
				
			||||||
 | 
					    shotId: Int!
 | 
				
			||||||
 | 
					    annotations: [UpdateAnnotationInputGQL!]!
 | 
				
			||||||
 | 
					  ): UpdateShotAnnotationReturn!
 | 
				
			||||||
 | 
					  getProfileImageUploadLink(
 | 
				
			||||||
 | 
					    fileExt: String = ".png"
 | 
				
			||||||
 | 
					  ): GetProfileUploadLinkReturn!
 | 
				
			||||||
  editProfileImageUri(profileImageUri: String!): UserGQL!
 | 
					  editProfileImageUri(profileImageUri: String!): UserGQL!
 | 
				
			||||||
 | 
					  editUser(input: EditUserInputGQL!): UserGQL!
 | 
				
			||||||
 | 
					  followUser(followedUserId: Int!): UserGQL!
 | 
				
			||||||
 | 
					  unfollowUser(followedUserId: Int!): UserGQL!
 | 
				
			||||||
 | 
					  retireTags(tagIds: [Int!]!): Boolean!
 | 
				
			||||||
 | 
					  findPrerecordTableLayout(b64Image: String!, videoId: Int!): HomographyInfoGQL
 | 
				
			||||||
  createUploadStream(
 | 
					  createUploadStream(
 | 
				
			||||||
    videoMetadata: VideoMetadataInput!
 | 
					    videoMetadata: VideoMetadataInput!
 | 
				
			||||||
  ): CreateUploadStreamReturn!
 | 
					  ): CreateUploadStreamReturn!
 | 
				
			||||||
  getUploadLink(videoId: Int!, segmentIndex: Int!): GetUploadLinkReturn!
 | 
					  getUploadLink(videoId: Int!, segmentIndex: Int!): GetUploadLinkReturn!
 | 
				
			||||||
 | 
					  getHlsInitUploadLink(videoId: Int!): GetUploadLinkReturn!
 | 
				
			||||||
 | 
					  setSegmentDuration(
 | 
				
			||||||
 | 
					    videoId: Int!
 | 
				
			||||||
 | 
					    segmentIndex: Int!
 | 
				
			||||||
 | 
					    duration: Float!
 | 
				
			||||||
 | 
					  ): Boolean!
 | 
				
			||||||
  editUploadStream(videoId: Int!, videoMetadata: VideoMetadataInput!): Boolean!
 | 
					  editUploadStream(videoId: Int!, videoMetadata: VideoMetadataInput!): Boolean!
 | 
				
			||||||
  deleteVideo(videoId: Int!): Boolean!
 | 
					  deleteVideo(videoId: Int!): Boolean!
 | 
				
			||||||
 | 
					  deleteTags(videoId: Int!, tagsToDelete: [VideoTagInput!]!): Boolean!
 | 
				
			||||||
 | 
					  reactToVideo(videoId: Int!, reaction: ReactionEnum): Boolean!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
input CreateBucketSetInput {
 | 
					input CreateBucketSetInput {
 | 
				
			||||||
@@ -351,7 +826,70 @@ input CreateBucketSetInput {
 | 
				
			|||||||
  buckets: [BucketInputGQL!]!
 | 
					  buckets: [BucketInputGQL!]!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type GetUploadLinkReturn {
 | 
					type EditShotReturn {
 | 
				
			||||||
 | 
					  shot: ShotGQL
 | 
				
			||||||
 | 
					  error: DoesNotOwnShotErr
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type DoesNotOwnShotErr {
 | 
				
			||||||
 | 
					  shotId: Int!
 | 
				
			||||||
 | 
					  msg: String
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input EditableShotFieldInputGQL {
 | 
				
			||||||
 | 
					  intendedPocketType: PocketEnum
 | 
				
			||||||
 | 
					  shotDirection: ShotDirectionEnum
 | 
				
			||||||
 | 
					  spinType: SpinTypeEnum
 | 
				
			||||||
 | 
					  targetPocketAngleDirection: ShotDirectionEnum
 | 
				
			||||||
 | 
					  make: Boolean
 | 
				
			||||||
 | 
					  backcut: Boolean
 | 
				
			||||||
 | 
					  excludeFromStats: Boolean
 | 
				
			||||||
 | 
					  notes: String
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type AddShotAnnotationReturn {
 | 
				
			||||||
 | 
					  value: SuccessfulAddAddShotAnnotationErrors!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					union SuccessfulAddAddShotAnnotationErrors =
 | 
				
			||||||
 | 
					    SuccessfulAdd
 | 
				
			||||||
 | 
					  | AddShotAnnotationErrors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SuccessfulAdd {
 | 
				
			||||||
 | 
					  value: Boolean!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type AddShotAnnotationErrors {
 | 
				
			||||||
 | 
					  error: DoesNotOwnShotErrOtherErrorNeedsNote!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					union DoesNotOwnShotErrOtherErrorNeedsNote =
 | 
				
			||||||
 | 
					    DoesNotOwnShotErr
 | 
				
			||||||
 | 
					  | OtherErrorNeedsNote
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type OtherErrorNeedsNote {
 | 
				
			||||||
 | 
					  msg: String
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UpdateShotAnnotationReturn {
 | 
				
			||||||
 | 
					  shot: ShotGQL
 | 
				
			||||||
 | 
					  error: DoesNotOwnShotErr
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input UpdateAnnotationInputGQL {
 | 
				
			||||||
 | 
					  name: String!
 | 
				
			||||||
 | 
					  notes: String = null
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type GetProfileUploadLinkReturn {
 | 
				
			||||||
 | 
					  value: UploadLinkGetProfileUploadLinkErrors!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					union UploadLinkGetProfileUploadLinkErrors =
 | 
				
			||||||
 | 
					    UploadLink
 | 
				
			||||||
 | 
					  | GetProfileUploadLinkErrors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UploadLink {
 | 
				
			||||||
  uploadUrl: String!
 | 
					  uploadUrl: String!
 | 
				
			||||||
  headers: [Header]!
 | 
					  headers: [Header]!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -361,6 +899,20 @@ type Header {
 | 
				
			|||||||
  value: String!
 | 
					  value: String!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type GetProfileUploadLinkErrors {
 | 
				
			||||||
 | 
					  error: TooManyProfileImageUploadsErr!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TooManyProfileImageUploadsErr {
 | 
				
			||||||
 | 
					  linksRequested: Int!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input EditUserInputGQL {
 | 
				
			||||||
 | 
					  username: String = null
 | 
				
			||||||
 | 
					  fargoRating: Int = null
 | 
				
			||||||
 | 
					  videosPrivateByDefault: Boolean = null
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type CreateUploadStreamReturn {
 | 
					type CreateUploadStreamReturn {
 | 
				
			||||||
  videoId: Int!
 | 
					  videoId: Int!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -370,26 +922,68 @@ input VideoMetadataInput {
 | 
				
			|||||||
  startTime: DateTime = null
 | 
					  startTime: DateTime = null
 | 
				
			||||||
  endTime: DateTime = null
 | 
					  endTime: DateTime = null
 | 
				
			||||||
  gameType: String = null
 | 
					  gameType: String = null
 | 
				
			||||||
  tableSize: String = null
 | 
					    @deprecated(reason: "`game_type` is deprecated. Use `tags` instead.")
 | 
				
			||||||
  uploadStreamMetadataInput: UploadStreamMetadataInput = null
 | 
					
 | 
				
			||||||
 | 
					  """
 | 
				
			||||||
 | 
					  A list of tags associated with the video. Replace `game_type`
 | 
				
			||||||
 | 
					  """
 | 
				
			||||||
 | 
					  tags: [VideoTagInput!] = null
 | 
				
			||||||
 | 
					  tableSize: Float = null
 | 
				
			||||||
  lastIntendedSegmentBound: Int = null
 | 
					  lastIntendedSegmentBound: Int = null
 | 
				
			||||||
 | 
					  streamSegmentType: StreamSegmentTypeEnum = null
 | 
				
			||||||
 | 
					  private: Boolean = null
 | 
				
			||||||
  endStream: Boolean! = false
 | 
					  endStream: Boolean! = false
 | 
				
			||||||
 | 
					  clientUploadStatus: ClientUploadStatusEnum = null
 | 
				
			||||||
 | 
					  resolution: VideoResolution = null
 | 
				
			||||||
 | 
					  framesPerSecond: Float = null
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
input UploadStreamMetadataInput {
 | 
					input VideoResolution {
 | 
				
			||||||
  deviceType: DeviceTypeEnum = null
 | 
					  width: Int!
 | 
				
			||||||
  osVersion: String = null
 | 
					  height: Int!
 | 
				
			||||||
  appVersion: String = null
 | 
					 | 
				
			||||||
  browserName: String = null
 | 
					 | 
				
			||||||
  browserVersion: String = null
 | 
					 | 
				
			||||||
  locale: String = null
 | 
					 | 
				
			||||||
  timezone: String = null
 | 
					 | 
				
			||||||
  networkType: String = null
 | 
					 | 
				
			||||||
  ipAddress: String = null
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum DeviceTypeEnum {
 | 
					type GetUploadLinkReturn {
 | 
				
			||||||
  IOS
 | 
					  value: UploadLinkGetUploadLinkErrors!
 | 
				
			||||||
  ANDROID
 | 
					  stream: UploadStreamGQL
 | 
				
			||||||
  BROWSER
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					union UploadLinkGetUploadLinkErrors = UploadLink | GetUploadLinkErrors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type GetUploadLinkErrors {
 | 
				
			||||||
 | 
					  error: MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErr!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					union MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErr =
 | 
				
			||||||
 | 
					    MustHaveSetForUploadLinkErr
 | 
				
			||||||
 | 
					  | SegmentAlreadyUploadedErr
 | 
				
			||||||
 | 
					  | ProcessingFailedErr
 | 
				
			||||||
 | 
					  | NoInitForChunkedUploadErr
 | 
				
			||||||
 | 
					  | TooManyProfileImageUploadsErr
 | 
				
			||||||
 | 
					  | InitUploadAlreadyCompletedErr
 | 
				
			||||||
 | 
					  | TooManyInitUploadsErr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type MustHaveSetForUploadLinkErr {
 | 
				
			||||||
 | 
					  resolution: Boolean
 | 
				
			||||||
 | 
					  framesPerSecond: Boolean
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SegmentAlreadyUploadedErr {
 | 
				
			||||||
 | 
					  segmentId: Int!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ProcessingFailedErr {
 | 
				
			||||||
 | 
					  processing: VideoProcessingGQL!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type NoInitForChunkedUploadErr {
 | 
				
			||||||
 | 
					  segmentType: StreamSegmentTypeEnum!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type InitUploadAlreadyCompletedErr {
 | 
				
			||||||
 | 
					  segmentType: StreamSegmentTypeEnum!
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TooManyInitUploadsErr {
 | 
				
			||||||
 | 
					  linksRequested: Int!
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										18
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								yarn.lock
									
									
									
									
									
								
							@@ -10,10 +10,10 @@
 | 
				
			|||||||
    "@jridgewell/gen-mapping" "^0.3.0"
 | 
					    "@jridgewell/gen-mapping" "^0.3.0"
 | 
				
			||||||
    "@jridgewell/trace-mapping" "^0.3.9"
 | 
					    "@jridgewell/trace-mapping" "^0.3.9"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"@apollo/client@^3.9.2":
 | 
					"@apollo/client@^3.11.10":
 | 
				
			||||||
  version "3.9.2"
 | 
					  version "3.12.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.9.2.tgz#96edf2c212f828bad1ef3d84234fa473c5a27ff8"
 | 
					  resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.12.3.tgz#0d252749baad8328e06883fe118dc7e73e3bbb1f"
 | 
				
			||||||
  integrity sha512-Zw9WvXjqhpbgkvAvnj52vstOWwM0iedKWtn1hSq1cODQyoe1CF2uFwMYFI7l56BrAY9CzLi6MQA0AhxpgJgvxw==
 | 
					  integrity sha512-KZ5zymRdb8bMbGUb1wP2U04ff7qIGgaC1BCdCVC+IPFiXkxEhHBc5fDEQOwAUT+vUo9KbBh3g7QK/JCOswn59w==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "@graphql-typed-document-node/core" "^3.1.1"
 | 
					    "@graphql-typed-document-node/core" "^3.1.1"
 | 
				
			||||||
    "@wry/caches" "^1.0.0"
 | 
					    "@wry/caches" "^1.0.0"
 | 
				
			||||||
@@ -23,7 +23,7 @@
 | 
				
			|||||||
    hoist-non-react-statics "^3.3.2"
 | 
					    hoist-non-react-statics "^3.3.2"
 | 
				
			||||||
    optimism "^0.18.0"
 | 
					    optimism "^0.18.0"
 | 
				
			||||||
    prop-types "^15.7.2"
 | 
					    prop-types "^15.7.2"
 | 
				
			||||||
    rehackt "0.0.3"
 | 
					    rehackt "^0.1.0"
 | 
				
			||||||
    response-iterator "^0.2.6"
 | 
					    response-iterator "^0.2.6"
 | 
				
			||||||
    symbol-observable "^4.0.0"
 | 
					    symbol-observable "^4.0.0"
 | 
				
			||||||
    ts-invariant "^0.10.3"
 | 
					    ts-invariant "^0.10.3"
 | 
				
			||||||
@@ -2633,10 +2633,10 @@ regenerator-runtime@^0.14.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
 | 
					  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
 | 
				
			||||||
  integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
 | 
					  integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
rehackt@0.0.3:
 | 
					rehackt@^0.1.0:
 | 
				
			||||||
  version "0.0.3"
 | 
					  version "0.1.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/rehackt/-/rehackt-0.0.3.tgz#1ea454620d4641db8342e2db44595cf0e7ac6aa0"
 | 
					  resolved "https://registry.yarnpkg.com/rehackt/-/rehackt-0.1.0.tgz#a7c5e289c87345f70da8728a7eb878e5d03c696b"
 | 
				
			||||||
  integrity sha512-aBRHudKhOWwsTvCbSoinzq+Lej/7R8e8UoPvLZo5HirZIIBLGAgdG7SL9QpdcBoQ7+3QYPi3lRLknAzXBlhZ7g==
 | 
					  integrity sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
relay-runtime@12.0.0:
 | 
					relay-runtime@12.0.0:
 | 
				
			||||||
  version "12.0.0"
 | 
					  version "12.0.0"
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user