Compare commits
	
		
			465 Commits
		
	
	
		
			v2.4.1
			...
			release/v2
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					4405c01b73 | ||
| 
						 | 
					c1db70d8c4 | ||
| 
						 | 
					ef6e4809f5 | ||
| 
						 | 
					4b190a571f | ||
| 
						 | 
					c6b84434ea | ||
| 
						 | 
					acad0cd99f | ||
| 
						 | 
					7f675733df | ||
| 
						 | 
					4f1d05467f | ||
| 
						 | 
					27bffaa734 | ||
| 
						 | 
					b005b57137 | ||
| 
						 | 
					2bae52e67e | ||
| 
						 | 
					7766fe08cd | ||
| 
						 | 
					f677c8765b | ||
| 
						 | 
					c0c5dd7ac6 | ||
| 
						 | 
					9c619367c3 | ||
| 
						 | 
					a0a0a15f07 | ||
| 
						 | 
					ab047be875 | ||
| 
						 | 
					567b440db7 | ||
| 
						 | 
					35fa62c8cc | ||
| 
						 | 
					be374d683e | ||
| 
						 | 
					cd3b867370 | ||
| 
						 | 
					42bca6842c | ||
| 
						 | 
					de3a96b62d | ||
| 
						 | 
					600ba8a2b5 | ||
| 
						 | 
					95a536dc1e | ||
| 
						 | 
					0639d09163 | ||
| 
						 | 
					f723ea719d | ||
| 
						 | 
					5c83d76680 | ||
| 
						 | 
					ad977ad5eb | ||
| 
						 | 
					a1c3e087c6 | ||
| 
						 | 
					78d8af27b6 | ||
| 
						 | 
					ac59ce3eda | ||
| 
						 | 
					e473395cfe | ||
| 
						 | 
					a9d89c7039 | ||
| 
						 | 
					fdc66405c0 | ||
| 
						 | 
					f17f66db93 | ||
| 
						 | 
					07efbfcdd4 | ||
| 
						 | 
					a4d3b61799 | ||
| 
						 | 
					096c2aafc7 | ||
| 
						 | 
					025c486b6c | ||
| 
						 | 
					70150d13e4 | ||
| 
						 | 
					374cab1b1c | ||
| 
						 | 
					e17c59d844 | ||
| 
						 | 
					db60feacc8 | ||
| 
						 | 
					5420e23832 | ||
| 
						 | 
					d6e5656e5a | ||
| 
						 | 
					c9b7edcdd9 | ||
| 
						 | 
					5333f45f93 | ||
| 
						 | 
					737c432446 | ||
| 
						 | 
					4f44e17ee0 | ||
| 
						 | 
					262011e7bf | ||
| 
						 | 
					d48a97673a | ||
| 
						 | 
					19c8773768 | ||
| 
						 | 
					498f2aa1b5 | ||
| 
						 | 
					b696c50097 | ||
| 
						 | 
					585b4ae09e | ||
| 
						 | 
					9bf5dcad21 | ||
| 
						 | 
					0ad253bb3a | ||
| 
						 | 
					16894d4fb4 | ||
| 
						 | 
					976149bbde | ||
| 
						 | 
					fd4105127c | ||
| 
						 | 
					a7f77f3d91 | ||
| 
						 | 
					bbb7687f8b | ||
| 
						 | 
					6333ca48d8 | ||
| 
						 | 
					c19499deaa | ||
| 
						 | 
					358abb2a83 | ||
| 
						 | 
					c259fdae8e | ||
| 
						 | 
					f17a83a5cf | ||
| 
						 | 
					611e384117 | ||
| 
						 | 
					e47756ab68 | ||
| 
						 | 
					3709ea9a92 | ||
| 
						 | 
					62a2fbd6d7 | ||
| 
						 | 
					c34a88343e | ||
| 
						 | 
					7cd36da795 | ||
| 
						 | 
					6f4a34c78d | ||
| 
						 | 
					4d65beb440 | ||
| 
						 | 
					15cdeb3578 | ||
| 
						 | 
					1148705294 | ||
| 
						 | 
					d0cd33af47 | ||
| 
						 | 
					161758eca6 | ||
| 
						 | 
					1cb4df113a | ||
| 
						 | 
					8b1c053e7a | ||
| 
						 | 
					f95f1dd501 | ||
| 
						 | 
					bdb4a218ee | ||
| 
						 | 
					970fabb604 | ||
| 
						 | 
					56e151481a | ||
| 
						 | 
					7e6e6c6884 | ||
| 
						 | 
					d977decd79 | ||
| 
						 | 
					876c50c916 | ||
| 
						 | 
					e3331a8fc2 | ||
| 
						 | 
					39fa84e6ae | ||
| 
						 | 
					037e3a01a4 | ||
| 
						 | 
					819d74c0d9 | ||
| 
						 | 
					4c753893c9 | ||
| 
						 | 
					037c82c689 | ||
| 
						 | 
					88acbf449d | ||
| 
						 | 
					aa13cfa41b | ||
| 
						 | 
					c1522b9b0d | ||
| 
						 | 
					d3a6dc9161 | ||
| 
						 | 
					8f6e64e256 | ||
| 
						 | 
					69488bdac1 | ||
| 
						 | 
					ba3ff1577d | ||
| 
						 | 
					8aa9cf8449 | ||
| 
						 | 
					dabefb781a | ||
| 
						 | 
					c247344faa | ||
| 
						 | 
					f3532141da | ||
| 
						 | 
					e049e2e5c7 | ||
| 
						 | 
					481f18cb29 | ||
| 
						 | 
					b783158b23 | ||
| 
						 | 
					f982ef10d1 | ||
| 
						 | 
					6047364525 | ||
| 
						 | 
					0594f3310e | ||
| 
						 | 
					f888018a0b | ||
| 
						 | 
					54e308d3c5 | ||
| 
						 | 
					687b0a95a6 | ||
| 
						 | 
					5abfa205c9 | ||
| 
						 | 
					eb029b7b09 | ||
| 
						 | 
					92218e764c | ||
| 
						 | 
					66b75b8d9b | ||
| 
						 | 
					bfd76cd6be | ||
| 
						 | 
					3cf7609092 | ||
| 
						 | 
					cb61821f7b | ||
| 
						 | 
					86ec85ebd8 | ||
| 
						 | 
					ba8b02e630 | ||
| 
						 | 
					ce26e48773 | ||
| 
						 | 
					cc04b861ac | ||
| 
						 | 
					3277451e8e | ||
| 
						 | 
					eb5a5563c0 | ||
| 
						 | 
					5f09b47b68 | ||
| 
						 | 
					e2ad19c670 | ||
| 
						 | 
					ee6273c248 | ||
| 
						 | 
					c9f211439e | ||
| 
						 | 
					f656296a9a | ||
| 
						 | 
					764f3f3bef | ||
| 
						 | 
					36dce2112b | ||
| 
						 | 
					24709e45a6 | ||
| 
						 | 
					a3dba734d3 | ||
| 
						 | 
					07e2231763 | ||
| 
						 | 
					0ba7a03bd5 | ||
| 
						 | 
					39901ed547 | ||
| 
						 | 
					d9d03fe111 | ||
| 
						 | 
					1999838420 | ||
| 
						 | 
					05fa6a5806 | ||
| 
						 | 
					398bf0a94f | ||
| 
						 | 
					04a15eb629 | ||
| 
						 | 
					e84582a0d5 | ||
| 
						 | 
					b61a35d70d | ||
| 
						 | 
					34304c2b80 | ||
| 
						 | 
					d5ca25a3da | ||
| 
						 | 
					7f196193cc | ||
| 
						 | 
					b5ddcef66a | ||
| 
						 | 
					0b61d0f943 | ||
| 
						 | 
					e2e75c3223 | ||
| 
						 | 
					457802c56d | ||
| 
						 | 
					88b13a8d0c | ||
| 
						 | 
					8c22f3576b | ||
| 
						 | 
					4c392361a9 | ||
| 
						 | 
					021ba4963b | ||
| 
						 | 
					d9868d47f7 | ||
| 
						 | 
					c2d2955538 | ||
| 
						 | 
					1f20e12a56 | ||
| 
						 | 
					3d733b861b | ||
| 
						 | 
					333d20365d | ||
| 
						 | 
					f3b00cd5c9 | ||
| 
						 | 
					7b85d617aa | ||
| 
						 | 
					9eb3b67064 | ||
| 
						 | 
					4ed12d1f5b | ||
| 
						 | 
					d2ede19e4a | ||
| 
						 | 
					de028b8dc0 | ||
| 
						 | 
					4ebd8b451b | ||
| 
						 | 
					7889017579 | ||
| 
						 | 
					7fb9c8c675 | ||
| 
						 | 
					268c542602 | ||
| 
						 | 
					01bf9ed000 | ||
| 
						 | 
					00e1d15203 | ||
| 
						 | 
					21bdeab870 | ||
| 
						 | 
					467261b9ca | ||
| 
						 | 
					ae336478c0 | ||
| 
						 | 
					1479f8bde2 | ||
| 
						 | 
					10359d5de4 | ||
| 
						 | 
					fff323aee4 | ||
| 
						 | 
					9c87371535 | ||
| 
						 | 
					7ca1a0c6a9 | ||
| 
						 | 
					2238ba3c64 | ||
| 
						 | 
					4d3f0ee4d6 | ||
| 
						 | 
					2ea9c98b7b | ||
| 
						 | 
					b6da3cb016 | ||
| 
						 | 
					b841bdb6ca | ||
| 
						 | 
					70978f577f | ||
| 
						 | 
					846d55417f | ||
| 
						 | 
					e3884ba062 | ||
| 
						 | 
					0bf0186e50 | ||
| 
						 | 
					1d0a0a0bd0 | ||
| 
						 | 
					41f3f08432 | ||
| 
						 | 
					e9403d878d | ||
| 
						 | 
					d555600c75 | ||
| 
						 | 
					e18b57857d | ||
| 
						 | 
					7eb8d0d971 | ||
| 
						 | 
					865759f0dd | ||
| 
						 | 
					055549290b | ||
| 
						 | 
					ca702a172e | ||
| 
						 | 
					f4e8ef10a9 | ||
| 
						 | 
					7adc77d881 | ||
| 
						 | 
					a64e0418f9 | ||
| 
						 | 
					0b1d66c413 | ||
| 
						 | 
					1aafde15b4 | ||
| 
						 | 
					03f0af07c8 | ||
| 
						 | 
					fa9eafc33b | ||
| 
						 | 
					09fb78765c | ||
| 
						 | 
					e7bfb960dc | ||
| 
						 | 
					5e95f4eb67 | ||
| 
						 | 
					eaaa8dbc15 | ||
| 
						 | 
					e93ce14f6e | ||
| 
						 | 
					7c06be78fb | ||
| 
						 | 
					b97da20446 | ||
| 
						 | 
					d7c17fbab1 | ||
| 
						 | 
					68789fe9de | ||
| 
						 | 
					724beb607c | ||
| 
						 | 
					3ba845cf06 | ||
| 
						 | 
					4f6deba793 | ||
| 
						 | 
					ba1e735290 | ||
| 
						 | 
					be8877d346 | ||
| 
						 | 
					5922727336 | ||
| 
						 | 
					6f5902b3f0 | ||
| 
						 | 
					9c37930c99 | ||
| 
						 | 
					87ada37a76 | ||
| 
						 | 
					c082910438 | ||
| 
						 | 
					777d67a649 | ||
| 
						 | 
					563032eecc | ||
| 
						 | 
					88dd85cf26 | ||
| 
						 | 
					33c7da572e | ||
| 
						 | 
					d8bfa28a21 | ||
| 
						 | 
					09f482a3d4 | ||
| 
						 | 
					93e09cc2dd | ||
| 
						 | 
					a71adc417c | ||
| 
						 | 
					0dae09ac9a | ||
| 
						 | 
					771bd51be7 | ||
| 
						 | 
					7d5d6177d2 | ||
| 
						 | 
					0530a4c03f | ||
| 
						 | 
					6eead07d1c | ||
| 
						 | 
					c7452aeeb9 | ||
| 
						 | 
					669638a4e3 | ||
| 
						 | 
					d2bfc38736 | ||
| 
						 | 
					58a1740294 | ||
| 
						 | 
					c00effc8bc | ||
| 
						 | 
					8b22611142 | ||
| 
						 | 
					6a4bbc3362 | ||
| 
						 | 
					88867aea73 | ||
| 
						 | 
					d7ece096ac | ||
| 
						 | 
					227114f247 | ||
| 
						 | 
					8b2741d624 | ||
| 
						 | 
					2e18694e40 | ||
| 
						 | 
					1715703c4e | ||
| 
						 | 
					a5e7c1dc8a | ||
| 
						 | 
					5f325e75d5 | ||
| 
						 | 
					49aeddb186 | ||
| 
						 | 
					5413e2cdf3 | ||
| 
						 | 
					2190652029 | ||
| 
						 | 
					77229ee248 | ||
| 
						 | 
					9db7fea7cd | ||
| 
						 | 
					65811c5e7f | ||
| 
						 | 
					e70303f986 | ||
| 
						 | 
					b55b0a23d7 | ||
| 
						 | 
					f66a2d0bdc | ||
| 
						 | 
					200f0cbe79 | ||
| 
						 | 
					2d833c33d3 | ||
| 
						 | 
					9d7afe9fa4 | ||
| 
						 | 
					42bc5321aa | ||
| 
						 | 
					dabfb9b949 | ||
| 
						 | 
					f344a23f3a | ||
| 
						 | 
					0c83ed528a | ||
| 
						 | 
					bdf37c7f8a | ||
| 
						 | 
					fff91dd572 | ||
| 
						 | 
					2a7ce8c297 | ||
| 
						 | 
					5a17f7e727 | ||
| 
						 | 
					a25e456b8b | ||
| 
						 | 
					7d68dd40c3 | ||
| 
						 | 
					5784a6297b | ||
| 
						 | 
					b6b3fbaac9 | ||
| 
						 | 
					617d018252 | ||
| 
						 | 
					a1e4019ee8 | ||
| 
						 | 
					11a63628b3 | ||
| 
						 | 
					49f523d831 | ||
| 
						 | 
					7ac0866f4c | ||
| 
						 | 
					6ae29a7b5f | ||
| 
						 | 
					d88fe4eea3 | ||
| 
						 | 
					89a5a0efc9 | ||
| 
						 | 
					6f6e365393 | ||
| 
						 | 
					d56acf1ffe | ||
| 
						 | 
					a10ce9f304 | ||
| 
						 | 
					d40e926971 | ||
| 
						 | 
					e96f222c45 | ||
| 
						 | 
					30fc21e6cb | ||
| 
						 | 
					deea40cbc4 | ||
| 
						 | 
					9a36ad60e1 | ||
| 
						 | 
					53cea05c95 | ||
| 
						 | 
					9b96b88de2 | ||
| 
						 | 
					2cc70a6af1 | ||
| 
						 | 
					f6653cf818 | ||
| 
						 | 
					127fe2100c | ||
| 
						 | 
					3645718352 | ||
| 
						 | 
					724ae46752 | ||
| 
						 | 
					70ff02fea2 | ||
| 
						 | 
					5d6ed11cd9 | ||
| 
						 | 
					23f6b34fe9 | ||
| 
						 | 
					a864502c3e | ||
| 
						 | 
					33ba38938c | ||
| 
						 | 
					9f65476795 | ||
| 
						 | 
					712459e5eb | ||
| 
						 | 
					68e4df6de3 | ||
| 
						 | 
					4a49ed347c | ||
| 
						 | 
					5a8ac97d9a | ||
| 
						 | 
					1ac3fb2f44 | ||
| 
						 | 
					88cd05b629 | ||
| 
						 | 
					c74efb0287 | ||
| 
						 | 
					5e8b23cbeb | ||
| 
						 | 
					e47c9ea07a | ||
| 
						 | 
					4a4ed2039b | ||
| 
						 | 
					e65987dd8f | ||
| 
						 | 
					d07608c7a1 | ||
| 
						 | 
					4b49e0d4b1 | ||
| 
						 | 
					9f21328d55 | ||
| 
						 | 
					eed4263076 | ||
| 
						 | 
					3e84e8fde5 | ||
| 
						 | 
					fc28bcffd2 | ||
| 
						 | 
					dae71c0ca9 | ||
| 
						 | 
					78d2f16e4e | ||
| 
						 | 
					a61962d1ff | ||
| 
						 | 
					36a5f9bcdd | ||
| 
						 | 
					c09d65b25d | ||
| 
						 | 
					ecc39b6a6f | ||
| 
						 | 
					b0947c973d | ||
| 
						 | 
					328bec9948 | ||
| 
						 | 
					4920f293f5 | ||
| 
						 | 
					9e4af88bc3 | ||
| 
						 | 
					063ceada41 | ||
| 
						 | 
					4749345f49 | ||
| 
						 | 
					14dc41b8ce | ||
| 
						 | 
					48a56c7802 | ||
| 
						 | 
					e8fb42644d | ||
| 
						 | 
					3e663de7fa | ||
| 
						 | 
					409c0e1f90 | ||
| 
						 | 
					1a67850aec | ||
| 
						 | 
					3bb67b3a62 | ||
| 
						 | 
					a864b8170d | ||
| 
						 | 
					72b3b0c119 | ||
| 
						 | 
					8039243cb3 | ||
| 
						 | 
					a90e89b16b | ||
| 
						 | 
					1742535a71 | ||
| 
						 | 
					b96c4f74ec | ||
| 
						 | 
					f224097c17 | ||
| 
						 | 
					2815f2c3a2 | ||
| 
						 | 
					43b933bc39 | ||
| 
						 | 
					0e169a92eb | ||
| 
						 | 
					73a9802ed9 | ||
| 
						 | 
					b760b6451c | ||
| 
						 | 
					73c317ce49 | ||
| 
						 | 
					9ad45b0f73 | ||
| 
						 | 
					bd27d4403f | ||
| 
						 | 
					b676310e4b | ||
| 
						 | 
					69d41fd14d | ||
| 
						 | 
					46ad6c0933 | ||
| 
						 | 
					b5b97adbed | ||
| 
						 | 
					527897fe5b | ||
| 
						 | 
					5f58594f1c | ||
| 
						 | 
					7f7326e876 | ||
| 
						 | 
					fda7b14a62 | ||
| 
						 | 
					04b2ee926c | ||
| 
						 | 
					e4aca1a137 | ||
| 
						 | 
					4af688de77 | ||
| 
						 | 
					7c20f22f46 | ||
| 
						 | 
					d7171daaa7 | ||
| 
						 | 
					3a5c406f1c | ||
| 
						 | 
					5643d237fd | ||
| 
						 | 
					cec893466e | ||
| 
						 | 
					f390075e92 | ||
| 
						 | 
					c4d47a0ebf | ||
| 
						 | 
					ab75abfef4 | ||
| 
						 | 
					714d8fc857 | ||
| 
						 | 
					c1ca8421b5 | ||
| 
						 | 
					6d9c5eae46 | ||
| 
						 | 
					d64032785a | ||
| 
						 | 
					9865e19385 | ||
| 
						 | 
					f88ac7711f | ||
| 
						 | 
					d91c7e61be | ||
| 
						 | 
					d02fff040b | ||
| 
						 | 
					1fb4d0d633 | ||
| 
						 | 
					81d76536fb | ||
| 
						 | 
					36e4e36188 | ||
| 
						 | 
					b3f3c87f7e | ||
| 
						 | 
					599c8787c3 | ||
| 
						 | 
					ba4edde793 | ||
| 
						 | 
					66680636f3 | ||
| 
						 | 
					cdd29fa6e2 | ||
| 
						 | 
					f4e5b4b0ed | ||
| 
						 | 
					d9bba781d4 | ||
| 
						 | 
					ded5c3c0f5 | ||
| 
						 | 
					093e92fbb6 | ||
| 
						 | 
					6fd6941860 | ||
| 
						 | 
					f46337a35e | ||
| 
						 | 
					8c9332c109 | ||
| 
						 | 
					4902bb2583 | ||
| 
						 | 
					933cf82a41 | ||
| 
						 | 
					3e828ac11f | ||
| 
						 | 
					0929851ed8 | ||
| 
						 | 
					d7c08f1068 | ||
| 
						 | 
					b656c59962 | ||
| 
						 | 
					3356dbb2e3 | ||
| 
						 | 
					ca87dcb9a1 | ||
| 
						 | 
					07ffc5e8b5 | ||
| 
						 | 
					14fa2e3543 | ||
| 
						 | 
					38934cdfc2 | ||
| 
						 | 
					43d1574fdc | ||
| 
						 | 
					d40567b7ff | ||
| 
						 | 
					5e9a631789 | ||
| 
						 | 
					6859a90fa1 | ||
| 
						 | 
					769438a383 | ||
| 
						 | 
					34385c5ab6 | ||
| 
						 | 
					b082617924 | ||
| 
						 | 
					356e97b856 | ||
| 
						 | 
					e50a1efb86 | ||
| 
						 | 
					ed3355eea7 | ||
| 
						 | 
					9ae63a8c7e | ||
| 
						 | 
					5c89d08669 | ||
| 
						 | 
					068934eaa3 | ||
| 
						 | 
					f75f6d5844 | ||
| 
						 | 
					32fdd0f1a9 | ||
| 
						 | 
					04141c3e4d | ||
| 
						 | 
					4b3654b05e | ||
| 
						 | 
					2b9f9e16ae | ||
| 
						 | 
					c08d06c3c3 | ||
| 
						 | 
					e47979ed6d | ||
| 
						 | 
					563e84aede | ||
| 
						 | 
					380f1df811 | ||
| 
						 | 
					4419af1e0f | ||
| 
						 | 
					629b53c4e9 | ||
| 
						 | 
					2cbab49c87 | ||
| 
						 | 
					d064b7c889 | ||
| 
						 | 
					80b6391e75 | ||
| 
						 | 
					82441dc289 | ||
| 
						 | 
					4cbfe039fc | ||
| 
						 | 
					bfca4ccd6f | ||
| 
						 | 
					b540172e0b | ||
| 
						 | 
					5361ab05a3 | ||
| 
						 | 
					8e169067d2 | ||
| 
						 | 
					59fd796458 | ||
| 
						 | 
					fa6c227d04 | ||
| 
						 | 
					001fcd311d | ||
| 
						 | 
					e9d3cc8796 | ||
| 
						 | 
					f639ea9b39 | ||
| 
						 | 
					20201d366b | ||
| 
						 | 
					a4db631031 | ||
| 
						 | 
					963dabbb14 | ||
| 
						 | 
					4f944cc0af | ||
| 
						 | 
					b413368c6c | ||
| 
						 | 
					87b054f98d | ||
| 
						 | 
					b8c0f95bc5 | ||
| 
						 | 
					c192b90caa | ||
| 
						 | 
					0f3a8810cf | ||
| 
						 | 
					a2d483eff3 | ||
| 
						 | 
					bd09e72707 | ||
| 
						 | 
					9b1d184be9 | ||
| 
						 | 
					d25bc2c6a3 | ||
| 
						 | 
					b02f54badc | ||
| 
						 | 
					23b3e9b279 | 
							
								
								
									
										123
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -25,105 +25,44 @@ jobs:
 | 
				
			|||||||
      DOCKER_REGISTRY_URL: tip-tip-wlan-cloud-ucentral.jfrog.io
 | 
					      DOCKER_REGISTRY_URL: tip-tip-wlan-cloud-ucentral.jfrog.io
 | 
				
			||||||
      DOCKER_REGISTRY_USERNAME: ucentral
 | 
					      DOCKER_REGISTRY_USERNAME: ucentral
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
    - uses: actions/checkout@v2
 | 
					    - name: Checkout actions repo
 | 
				
			||||||
 | 
					      uses: actions/checkout@v2
 | 
				
			||||||
    - name: Build Docker image
 | 
					 | 
				
			||||||
      run: docker build -t wlan-cloud-owgw:${{ github.sha }} .
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    - name: Tag Docker image
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        TAGS="${{ github.sha }}"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if [[ ${GITHUB_REF} == "refs/heads/"* ]]
 | 
					 | 
				
			||||||
        then
 | 
					 | 
				
			||||||
          CURRENT_TAG=$(echo ${GITHUB_REF#refs/heads/} | tr '/' '-')
 | 
					 | 
				
			||||||
          TAGS="$TAGS $CURRENT_TAG"
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
          if [[ ${GITHUB_REF} == "refs/tags/"* ]]
 | 
					 | 
				
			||||||
          then
 | 
					 | 
				
			||||||
            CURRENT_TAG=$(echo ${GITHUB_REF#refs/tags/} | tr '/' '-')
 | 
					 | 
				
			||||||
            TAGS="$TAGS $CURRENT_TAG"
 | 
					 | 
				
			||||||
          else # PR build
 | 
					 | 
				
			||||||
            CURRENT_TAG=$(echo ${GITHUB_HEAD_REF#refs/heads/} | tr '/' '-')
 | 
					 | 
				
			||||||
            TAGS="$TAGS $CURRENT_TAG"
 | 
					 | 
				
			||||||
          fi
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        echo "Result tags: $TAGS"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for tag in $TAGS; do
 | 
					 | 
				
			||||||
          docker tag wlan-cloud-owgw:${{ github.sha }} ${{ env.DOCKER_REGISTRY_URL }}/owgw:$tag
 | 
					 | 
				
			||||||
        done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    - name: Log into Docker registry
 | 
					 | 
				
			||||||
      if: startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/pull/') || github.ref == 'refs/heads/master'
 | 
					 | 
				
			||||||
      uses: docker/login-action@v1
 | 
					 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        registry: ${{ env.DOCKER_REGISTRY_URL }}
 | 
					        repository: Telecominfraproject/.github
 | 
				
			||||||
        username: ${{ env.DOCKER_REGISTRY_USERNAME }}
 | 
					        path: github
 | 
				
			||||||
        password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Push Docker images
 | 
					    - name: Build and push Docker image
 | 
				
			||||||
      if: startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/pull/') || github.ref == 'refs/heads/master'
 | 
					      uses: ./github/composite-actions/docker-image-build
 | 
				
			||||||
      run: |
 | 
					      with:
 | 
				
			||||||
        docker images | grep ${{ env.DOCKER_REGISTRY_URL }}/owgw | awk -F ' ' '{print $1":"$2}' | xargs -I {} docker push {}
 | 
					        image_name: owgw
 | 
				
			||||||
 | 
					        registry: tip-tip-wlan-cloud-ucentral.jfrog.io
 | 
				
			||||||
 | 
					        registry_user: ucentral
 | 
				
			||||||
 | 
					        registry_password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  docker-compose:
 | 
					  trigger-testing:
 | 
				
			||||||
    if: startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/pull/') || github.ref == 'refs/heads/master'
 | 
					    if: startsWith(github.ref, 'refs/pull/')
 | 
				
			||||||
    runs-on: ubuntu-20.04
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    needs: docker
 | 
					    needs: docker
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
    - name: Check out wlan-cloud-ucentral-deploy repository
 | 
					    - name: Get base branch name and set as output
 | 
				
			||||||
 | 
					      id: get_base_branch
 | 
				
			||||||
 | 
					      run: |
 | 
				
			||||||
 | 
					        echo ::set-output name=branch::$(echo ${GITHUB_BASE_REF##*/} | sed 's/master/main/g')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Checkout actions repo
 | 
				
			||||||
      uses: actions/checkout@v2
 | 
					      uses: actions/checkout@v2
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        repository: Telecominfraproject/wlan-cloud-ucentral-deploy
 | 
					        repository: Telecominfraproject/.github
 | 
				
			||||||
        path: wlan-cloud-ucentral-deploy
 | 
					        path: github
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Instantiate Docker Compose deployment
 | 
					    - name: Trigger testing of OpenWifi Docker Compose deployment and wait for result
 | 
				
			||||||
      working-directory: ./wlan-cloud-ucentral-deploy/docker-compose
 | 
					      uses: ./github/composite-actions/trigger-workflow-and-wait
 | 
				
			||||||
      env:
 | 
					      env:
 | 
				
			||||||
        OWGW_TAG: ${{ github.sha }}
 | 
					        BASE_BRANCH: ${{ steps.get_base_branch.outputs.branch }}
 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        docker-compose up -d
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    - name: Wait for OWSec to be alive and kicking
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        n=0
 | 
					 | 
				
			||||||
        until [ "$n" -ge 3 ]
 | 
					 | 
				
			||||||
        do
 | 
					 | 
				
			||||||
          curl -s 127.0.0.1:16102 && break
 | 
					 | 
				
			||||||
          n=$((n+1))
 | 
					 | 
				
			||||||
          if [ "$n" -eq 3]; then
 | 
					 | 
				
			||||||
            exit 1
 | 
					 | 
				
			||||||
          else
 | 
					 | 
				
			||||||
            sleep 3
 | 
					 | 
				
			||||||
          fi
 | 
					 | 
				
			||||||
        done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    - name: Check out wlan-cloud-ucentralgw repository
 | 
					 | 
				
			||||||
      uses: actions/checkout@v2
 | 
					 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        path: wlan-cloud-ucentralgw
 | 
					        owner: Telecominfraproject
 | 
				
			||||||
 | 
					        repo: wlan-testing
 | 
				
			||||||
    - name: Check functionality of microservices
 | 
					        workflow: ow_docker-compose.yml
 | 
				
			||||||
      env:
 | 
					        token: ${{ secrets.WLAN_TESTING_PAT }}
 | 
				
			||||||
        OWSEC: "openwifi.wlan.local:16001"
 | 
					        ref: master
 | 
				
			||||||
        FLAGS: "-s --cacert ./wlan-cloud-ucentral-deploy/docker-compose/certs/restapi-ca.pem --resolve openwifi.wlan.local:16001:127.0.0.1"
 | 
					        inputs: '{"owgw_version": "${{ github.sha }}", "owgwui_version": "${{ env.BASE_BRANCH }}", "owsec_version": "${{ env.BASE_BRANCH }}", "owfms_version": "${{ env.BASE_BRANCH }}", "owprov_version": "main", "owprovui_version": "main"}'
 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        ./wlan-cloud-ucentralgw/test_scripts/curl/cli listdevices
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    - name: Display information about running containers and log ucentralgw output
 | 
					 | 
				
			||||||
      working-directory: ./wlan-cloud-ucentral-deploy/docker-compose
 | 
					 | 
				
			||||||
      if: always()
 | 
					 | 
				
			||||||
      run: |
 | 
					 | 
				
			||||||
        docker-compose ps -a
 | 
					 | 
				
			||||||
        docker-compose logs
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # disable until repo is public
 | 
					 | 
				
			||||||
    #- name: export Docker image
 | 
					 | 
				
			||||||
    #  run: docker image save -o wlan-cloud-ucentralgw-${{ github.sha }}.tar wlan-cloud-ucentralgw:${{ github.sha }}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    #- uses: actions/upload-artifact@v2
 | 
					 | 
				
			||||||
    #  with:
 | 
					 | 
				
			||||||
    #    name: docker-image
 | 
					 | 
				
			||||||
    #    path: wlan-cloud-ucentralgw-${{ github.sha }}.tar
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										24
									
								
								.github/workflows/enforce-jira-issue-key.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					name: Ensure Jira issue is linked
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  pull_request:
 | 
				
			||||||
 | 
					    types: [opened, edited, reopened, synchronize]
 | 
				
			||||||
 | 
					    branches:
 | 
				
			||||||
 | 
					      - 'release/*'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  check_for_issue_key:
 | 
				
			||||||
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - name: Checkout actions repo
 | 
				
			||||||
 | 
					        uses: actions/checkout@v2
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          repository: Telecominfraproject/.github
 | 
				
			||||||
 | 
					          path: github
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Run JIRA check
 | 
				
			||||||
 | 
					        uses: ./github/composite-actions/enforce-jira-issue-key
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          jira_base_url: ${{ secrets.TIP_JIRA_URL }}
 | 
				
			||||||
 | 
					          jira_user_email: ${{ secrets.TIP_JIRA_USER_EMAIL }}
 | 
				
			||||||
 | 
					          jira_api_token: ${{ secrets.TIP_JIRA_API_TOKEN }}
 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
cmake_minimum_required(VERSION 3.13)
 | 
					cmake_minimum_required(VERSION 3.13)
 | 
				
			||||||
project(owgw VERSION 2.4.0)
 | 
					project(owgw VERSION 2.5.0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set(CMAKE_CXX_STANDARD 17)
 | 
					set(CMAKE_CXX_STANDARD 17)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -20,16 +20,28 @@ endif()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Auto build increment. You must define BUILD_INCREMENT with cmake -DBUILD_INCREMENT=1
 | 
					# Auto build increment. You must define BUILD_INCREMENT with cmake -DBUILD_INCREMENT=1
 | 
				
			||||||
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/build)
 | 
					if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/build)
 | 
				
			||||||
    file(READ build BUILD_NUM)
 | 
					    file(READ ${CMAKE_CURRENT_SOURCE_DIR}/build BUILD_NUM)
 | 
				
			||||||
    if(BUILD_INCREMENT)
 | 
					    if(BUILD_INCREMENT)
 | 
				
			||||||
        MATH(EXPR BUILD_NUM "${BUILD_NUM}+1")
 | 
					        MATH(EXPR BUILD_NUM "${BUILD_NUM}+1")
 | 
				
			||||||
        file(WRITE build ${BUILD_NUM})
 | 
					        file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/build ${BUILD_NUM})
 | 
				
			||||||
    endif()
 | 
					    endif()
 | 
				
			||||||
else()
 | 
					else()
 | 
				
			||||||
    set(BUILD_NUM 1)
 | 
					    set(BUILD_NUM 1)
 | 
				
			||||||
    file(WRITE build ${BUILD_NUM})
 | 
					    file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/build ${BUILD_NUM})
 | 
				
			||||||
endif()
 | 
					endif()
 | 
				
			||||||
add_definitions(-DAPP_VERSION="${CMAKE_PROJECT_VERSION}" -DBUILD_NUMBER="${BUILD_NUM}")
 | 
					
 | 
				
			||||||
 | 
					find_package(Git QUIET)
 | 
				
			||||||
 | 
					if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
 | 
				
			||||||
 | 
					    execute_process(COMMAND ${GIT_EXECUTABLE} describe --always --tags
 | 
				
			||||||
 | 
					            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
 | 
				
			||||||
 | 
					            RESULT_VARIABLE GIT_RESULT
 | 
				
			||||||
 | 
					            OUTPUT_VARIABLE GIT_HASH)
 | 
				
			||||||
 | 
					    if(NOT GIT_RESULT EQUAL "0")
 | 
				
			||||||
 | 
					        message(FATAL_ERROR "git describe --always --tags failed with ${GIT_RESULT}")
 | 
				
			||||||
 | 
					    endif()
 | 
				
			||||||
 | 
					    string(REGEX REPLACE "\n$" "" GIT_HASH "${GIT_HASH}")
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
add_definitions(-DTIP_GATEWAY_SERVICE="1")
 | 
					add_definitions(-DTIP_GATEWAY_SERVICE="1")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set(Boost_USE_STATIC_LIBS OFF)
 | 
					set(Boost_USE_STATIC_LIBS OFF)
 | 
				
			||||||
@@ -52,8 +64,11 @@ endif()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
include_directories(/usr/local/include  /usr/local/opt/openssl/include src include/kafka /usr/local/opt/mysql-client/include)
 | 
					include_directories(/usr/local/include  /usr/local/opt/openssl/include src include/kafka /usr/local/opt/mysql-client/include)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					configure_file(src/ow_version.h.in ${PROJECT_SOURCE_DIR}/src/ow_version.h @ONLY)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
add_executable( owgw
 | 
					add_executable( owgw
 | 
				
			||||||
        build
 | 
					        build
 | 
				
			||||||
 | 
					        src/ow_version.h.in
 | 
				
			||||||
        src/framework/CountryCodes.h
 | 
					        src/framework/CountryCodes.h
 | 
				
			||||||
        src/framework/KafkaTopics.h
 | 
					        src/framework/KafkaTopics.h
 | 
				
			||||||
        src/framework/MicroService.h
 | 
					        src/framework/MicroService.h
 | 
				
			||||||
@@ -81,17 +96,15 @@ add_executable( owgw
 | 
				
			|||||||
        src/RESTAPI/RESTAPI_capabilities_handler.cpp src/RESTAPI/RESTAPI_capabilities_handler.h
 | 
					        src/RESTAPI/RESTAPI_capabilities_handler.cpp src/RESTAPI/RESTAPI_capabilities_handler.h
 | 
				
			||||||
        src/RESTAPI/RESTAPI_RPC.cpp src/RESTAPI/RESTAPI_RPC.h
 | 
					        src/RESTAPI/RESTAPI_RPC.cpp src/RESTAPI/RESTAPI_RPC.h
 | 
				
			||||||
        src/RESTAPI/RESTAPI_deviceDashboardHandler.cpp src/RESTAPI/RESTAPI_deviceDashboardHandler.h
 | 
					        src/RESTAPI/RESTAPI_deviceDashboardHandler.cpp src/RESTAPI/RESTAPI_deviceDashboardHandler.h
 | 
				
			||||||
        src/RESTAPI/RESTAPI_TelemetryWebSocket.cpp src/RESTAPI/RESTAPI_TelemetryWebSocket.h
 | 
					        src/RESTAPI/RESTAPI_telemetryWebSocket.cpp src/RESTAPI/RESTAPI_telemetryWebSocket.h
 | 
				
			||||||
        src/RESTAPI/RESTAPI_webSocketServer.cpp src/RESTAPI/RESTAPI_webSocketServer.h
 | 
					        src/RESTAPI/RESTAPI_webSocketServer.cpp src/RESTAPI/RESTAPI_webSocketServer.h
 | 
				
			||||||
        src/storage/storage_blacklist.cpp src/storage/storage_tables.cpp src/storage/storage_logs.cpp
 | 
					        src/storage/storage_blacklist.cpp src/storage/storage_tables.cpp src/storage/storage_logs.cpp
 | 
				
			||||||
        src/storage/storage_command.cpp src/storage/storage_healthcheck.cpp src/storage/storage_statistics.cpp
 | 
					        src/storage/storage_command.cpp src/storage/storage_healthcheck.cpp src/storage/storage_statistics.cpp
 | 
				
			||||||
        src/storage/storage_device.cpp src/storage/storage_capabilities.cpp src/storage/storage_defconfig.cpp
 | 
					        src/storage/storage_device.cpp src/storage/storage_capabilities.cpp src/storage/storage_defconfig.cpp
 | 
				
			||||||
        src/storage/storage_tables.cpp
 | 
					        src/storage/storage_tables.cpp
 | 
				
			||||||
        src/APIServers.cpp
 | 
					        src/RESTAPI/RESTAPI_routers.cpp
 | 
				
			||||||
        src/Daemon.cpp src/Daemon.h
 | 
					        src/Daemon.cpp src/Daemon.h
 | 
				
			||||||
        src/StateProcessor.cpp src/StateProcessor.h
 | 
					        src/WS_Server.cpp src/WS_Server.h
 | 
				
			||||||
        src/storage/storage_lifetime_stats.cpp
 | 
					 | 
				
			||||||
        src/WebSocketServer.cpp src/WebSocketServer.h
 | 
					 | 
				
			||||||
        src/StorageService.cpp src/StorageService.h
 | 
					        src/StorageService.cpp src/StorageService.h
 | 
				
			||||||
        src/DeviceRegistry.cpp src/DeviceRegistry.h
 | 
					        src/DeviceRegistry.cpp src/DeviceRegistry.h
 | 
				
			||||||
        src/CommandManager.cpp src/CommandManager.h
 | 
					        src/CommandManager.cpp src/CommandManager.h
 | 
				
			||||||
@@ -103,8 +116,8 @@ add_executable( owgw
 | 
				
			|||||||
        src/SerialNumberCache.cpp src/SerialNumberCache.h
 | 
					        src/SerialNumberCache.cpp src/SerialNumberCache.h
 | 
				
			||||||
        src/TelemetryStream.cpp src/TelemetryStream.h
 | 
					        src/TelemetryStream.cpp src/TelemetryStream.h
 | 
				
			||||||
        src/framework/ConfigurationValidator.cpp src/framework/ConfigurationValidator.h
 | 
					        src/framework/ConfigurationValidator.cpp src/framework/ConfigurationValidator.h
 | 
				
			||||||
        src/ConfigurationCache.cpp src/ConfigurationCache.h
 | 
					        src/ConfigurationCache.h
 | 
				
			||||||
        )
 | 
					        src/CapabilitiesCache.h src/FindCountry.h src/rttys/RTTYS_server.cpp src/rttys/RTTYS_server.h src/rttys/RTTYS_device.cpp src/rttys/RTTYS_device.h src/rttys/RTTYS_ClientConnection.cpp src/rttys/RTTYS_ClientConnection.h src/rttys/RTTYS_WebServer.cpp src/rttys/RTTYS_WebServer.h src/RESTAPI/RESTAPI_device_helper.h src/SDKcalls.cpp src/SDKcalls.h src/StateUtils.cpp src/StateUtils.h src/WS_ReactorPool.h src/WS_Connection.h src/WS_Connection.cpp src/TelemetryClient.h src/TelemetryClient.cpp src/RESTAPI/RESTAPI_iptocountry_handler.cpp src/RESTAPI/RESTAPI_iptocountry_handler.h)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(NOT SMALL_BUILD)
 | 
					if(NOT SMALL_BUILD)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										69
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						@@ -1,25 +1,15 @@
 | 
				
			|||||||
FROM alpine AS builder
 | 
					FROM alpine:3.15 AS build-base
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN apk add --update --no-cache \
 | 
					RUN apk add --update --no-cache \
 | 
				
			||||||
    openssl openssh \
 | 
					    make cmake g++ git \
 | 
				
			||||||
    ncurses-libs \
 | 
					    unixodbc-dev postgresql-dev mariadb-dev \
 | 
				
			||||||
    bash util-linux coreutils curl \
 | 
					    librdkafka-dev boost-dev openssl-dev \
 | 
				
			||||||
    make cmake gcc g++ libstdc++ libgcc git zlib-dev yaml-cpp-dev \
 | 
					    zlib-dev nlohmann-json
 | 
				
			||||||
    openssl-dev boost-dev unixodbc-dev postgresql-dev mariadb-dev \
 | 
					 | 
				
			||||||
    apache2-utils yaml-dev apr-util-dev \
 | 
					 | 
				
			||||||
    lua-dev librdkafka-dev \
 | 
					 | 
				
			||||||
    nlohmann-json
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FROM build-base AS poco-build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ADD https://api.github.com/repos/stephb9959/poco/git/refs/heads/master version.json
 | 
				
			||||||
RUN git clone https://github.com/stephb9959/poco /poco
 | 
					RUN git clone https://github.com/stephb9959/poco /poco
 | 
				
			||||||
RUN git clone https://github.com/stephb9959/cppkafka /cppkafka
 | 
					 | 
				
			||||||
RUN git clone https://github.com/pboettch/json-schema-validator /json-schema-validator
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
WORKDIR /cppkafka
 | 
					 | 
				
			||||||
RUN mkdir cmake-build
 | 
					 | 
				
			||||||
WORKDIR cmake-build
 | 
					 | 
				
			||||||
RUN cmake ..
 | 
					 | 
				
			||||||
RUN cmake --build . --config Release -j8
 | 
					 | 
				
			||||||
RUN cmake --build . --target install
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
WORKDIR /poco
 | 
					WORKDIR /poco
 | 
				
			||||||
RUN mkdir cmake-build
 | 
					RUN mkdir cmake-build
 | 
				
			||||||
@@ -28,6 +18,23 @@ RUN cmake ..
 | 
				
			|||||||
RUN cmake --build . --config Release -j8
 | 
					RUN cmake --build . --config Release -j8
 | 
				
			||||||
RUN cmake --build . --target install
 | 
					RUN cmake --build . --target install
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FROM build-base AS cppkafka-build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ADD https://api.github.com/repos/stephb9959/cppkafka/git/refs/heads/master version.json
 | 
				
			||||||
 | 
					RUN git clone https://github.com/stephb9959/cppkafka /cppkafka
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					WORKDIR /cppkafka
 | 
				
			||||||
 | 
					RUN mkdir cmake-build
 | 
				
			||||||
 | 
					WORKDIR cmake-build
 | 
				
			||||||
 | 
					RUN cmake ..
 | 
				
			||||||
 | 
					RUN cmake --build . --config Release -j8
 | 
				
			||||||
 | 
					RUN cmake --build . --target install
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FROM build-base AS json-schema-validator-build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ADD https://api.github.com/repos/pboettch/json-schema-validator/git/refs/heads/master version.json
 | 
				
			||||||
 | 
					RUN git clone https://github.com/pboettch/json-schema-validator /json-schema-validator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
WORKDIR /json-schema-validator
 | 
					WORKDIR /json-schema-validator
 | 
				
			||||||
RUN mkdir cmake-build
 | 
					RUN mkdir cmake-build
 | 
				
			||||||
WORKDIR cmake-build
 | 
					WORKDIR cmake-build
 | 
				
			||||||
@@ -35,9 +42,19 @@ RUN cmake ..
 | 
				
			|||||||
RUN make
 | 
					RUN make
 | 
				
			||||||
RUN make install
 | 
					RUN make install
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FROM build-base AS owgw-build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ADD CMakeLists.txt build /owgw/
 | 
					ADD CMakeLists.txt build /owgw/
 | 
				
			||||||
ADD cmake /owgw/cmake
 | 
					ADD cmake /owgw/cmake
 | 
				
			||||||
ADD src /owgw/src
 | 
					ADD src /owgw/src
 | 
				
			||||||
 | 
					ADD .git /owgw/.git
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					COPY --from=poco-build /usr/local/include /usr/local/include
 | 
				
			||||||
 | 
					COPY --from=poco-build /usr/local/lib /usr/local/lib
 | 
				
			||||||
 | 
					COPY --from=cppkafka-build /usr/local/include /usr/local/include
 | 
				
			||||||
 | 
					COPY --from=cppkafka-build /usr/local/lib /usr/local/lib
 | 
				
			||||||
 | 
					COPY --from=json-schema-validator-build /usr/local/include /usr/local/include
 | 
				
			||||||
 | 
					COPY --from=json-schema-validator-build /usr/local/lib /usr/local/lib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
WORKDIR /owgw
 | 
					WORKDIR /owgw
 | 
				
			||||||
RUN mkdir cmake-build
 | 
					RUN mkdir cmake-build
 | 
				
			||||||
@@ -45,7 +62,7 @@ WORKDIR /owgw/cmake-build
 | 
				
			|||||||
RUN cmake ..
 | 
					RUN cmake ..
 | 
				
			||||||
RUN cmake --build . --config Release -j8
 | 
					RUN cmake --build . --config Release -j8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FROM alpine
 | 
					FROM alpine:3.15
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENV OWGW_USER=owgw \
 | 
					ENV OWGW_USER=owgw \
 | 
				
			||||||
    OWGW_ROOT=/owgw-data \
 | 
					    OWGW_ROOT=/owgw-data \
 | 
				
			||||||
@@ -57,18 +74,22 @@ RUN addgroup -S "$OWGW_USER" && \
 | 
				
			|||||||
RUN mkdir /openwifi
 | 
					RUN mkdir /openwifi
 | 
				
			||||||
RUN mkdir -p "$OWGW_ROOT" "$OWGW_CONFIG" && \
 | 
					RUN mkdir -p "$OWGW_ROOT" "$OWGW_CONFIG" && \
 | 
				
			||||||
    chown "$OWGW_USER": "$OWGW_ROOT" "$OWGW_CONFIG"
 | 
					    chown "$OWGW_USER": "$OWGW_ROOT" "$OWGW_CONFIG"
 | 
				
			||||||
RUN apk add --update --no-cache librdkafka mariadb-connector-c libpq unixodbc su-exec gettext ca-certificates bash jq curl
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
COPY --from=builder /owgw/cmake-build/owgw /openwifi/owgw
 | 
					RUN apk add --update --no-cache librdkafka su-exec gettext ca-certificates bash jq curl \
 | 
				
			||||||
COPY --from=builder /cppkafka/cmake-build/src/lib/* /lib/
 | 
					    mariadb-connector-c libpq unixodbc postgresql-client
 | 
				
			||||||
COPY --from=builder /poco/cmake-build/lib/* /lib/
 | 
					
 | 
				
			||||||
 | 
					COPY readiness_check /readiness_check
 | 
				
			||||||
 | 
					COPY test_scripts/curl/cli /cli
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COPY owgw.properties.tmpl /
 | 
					COPY owgw.properties.tmpl /
 | 
				
			||||||
COPY docker-entrypoint.sh /
 | 
					COPY docker-entrypoint.sh /
 | 
				
			||||||
 | 
					COPY wait-for-postgres.sh /
 | 
				
			||||||
RUN wget https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentral-deploy/main/docker-compose/certs/restapi-ca.pem \
 | 
					RUN wget https://raw.githubusercontent.com/Telecominfraproject/wlan-cloud-ucentral-deploy/main/docker-compose/certs/restapi-ca.pem \
 | 
				
			||||||
    -O /usr/local/share/ca-certificates/restapi-ca-selfsigned.pem
 | 
					    -O /usr/local/share/ca-certificates/restapi-ca-selfsigned.pem
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COPY readiness_check /readiness_check
 | 
					COPY --from=owgw-build /owgw/cmake-build/owgw /openwifi/owgw
 | 
				
			||||||
 | 
					COPY --from=cppkafka-build /cppkafka/cmake-build/src/lib /usr/local/lib/
 | 
				
			||||||
 | 
					COPY --from=poco-build /poco/cmake-build/lib /usr/local/lib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EXPOSE 15002 16002 16003 17002 16102
 | 
					EXPOSE 15002 16002 16003 17002 16102
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										26
									
								
								PROTOCOL.md
									
									
									
									
									
								
							
							
						
						@@ -609,6 +609,32 @@ The device should answer:
 | 
				
			|||||||
    "id" : <same number>
 | 
					    "id" : <same number>
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Controller wants to ping the device
 | 
				
			||||||
 | 
					Controller sends this command when it tries to establish latency to the device.
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					{    "jsonrpc" : "2.0" , 
 | 
				
			||||||
 | 
					     "method" : "ping" , 
 | 
				
			||||||
 | 
					     "params" : {
 | 
				
			||||||
 | 
						        "serial" : <serial number>
 | 
				
			||||||
 | 
					     },
 | 
				
			||||||
 | 
					     "id" : <some number>
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The device should answer:
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					{     "jsonrpc" : "2.0" , 
 | 
				
			||||||
 | 
					      "result" : {
 | 
				
			||||||
 | 
					              "serial" : <serial number> ,
 | 
				
			||||||
 | 
					              "uuid" : <uuid of the current active configuration>,
 | 
				
			||||||
 | 
					              "deviceUTCTime" : <UTC Time on device in milliseconds>
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					      "id" : <same number>
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### `rtty server`
 | 
					#### `rtty server`
 | 
				
			||||||
More information about the [rtty server](https://github.com/zhaojh329/rtty) can be found here.
 | 
					More information about the [rtty server](https://github.com/zhaojh329/rtty) can be found here.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										26
									
								
								README.md
									
									
									
									
									
								
							
							
						
						@@ -28,8 +28,9 @@ These instructions have proven to work on Ubuntu 20.4.
 | 
				
			|||||||
```
 | 
					```
 | 
				
			||||||
sudo apt install git cmake g++ libssl-dev libmariadb-dev 
 | 
					sudo apt install git cmake g++ libssl-dev libmariadb-dev 
 | 
				
			||||||
sudo apt install libpq-dev libaprutil1-dev apache2-dev libboost-all-dev
 | 
					sudo apt install libpq-dev libaprutil1-dev apache2-dev libboost-all-dev
 | 
				
			||||||
sudo apt install librdkafka-dev libmysqlclient-dev default-libmysqlclient-dev
 | 
					sudo apt install librdkafka-dev // default-libmysqlclient-dev
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cd ~
 | 
				
			||||||
git clone https://github.com/stephb9959/poco
 | 
					git clone https://github.com/stephb9959/poco
 | 
				
			||||||
cd poco
 | 
					cd poco
 | 
				
			||||||
mkdir cmake-build
 | 
					mkdir cmake-build
 | 
				
			||||||
@@ -38,6 +39,7 @@ cmake ..
 | 
				
			|||||||
cmake --build . --config Release
 | 
					cmake --build . --config Release
 | 
				
			||||||
sudo cmake --build . --target install
 | 
					sudo cmake --build . --target install
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cd ~
 | 
				
			||||||
git clone https://github.com/stephb9959/cppkafka
 | 
					git clone https://github.com/stephb9959/cppkafka
 | 
				
			||||||
cd cppkafka
 | 
					cd cppkafka
 | 
				
			||||||
mkdir cmake-build
 | 
					mkdir cmake-build
 | 
				
			||||||
@@ -46,13 +48,33 @@ cmake ..
 | 
				
			|||||||
cmake --build . --config Release
 | 
					cmake --build . --config Release
 | 
				
			||||||
sudo cmake --build . --target install
 | 
					sudo cmake --build . --target install
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cd ~
 | 
				
			||||||
 | 
					git clone https://github.com/nlohmann/json.git
 | 
				
			||||||
 | 
					cd json
 | 
				
			||||||
 | 
					mkdir cmake-build
 | 
				
			||||||
 | 
					cd cmake-build
 | 
				
			||||||
 | 
					cmake ..
 | 
				
			||||||
 | 
					make -j
 | 
				
			||||||
 | 
					sudo make install
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cd ~
 | 
				
			||||||
 | 
					git clone https://github.com/pboettch/json-schema-validator.git
 | 
				
			||||||
 | 
					cd json-schema-validator
 | 
				
			||||||
 | 
					mkdir cmake-build
 | 
				
			||||||
 | 
					cd cmake-build
 | 
				
			||||||
 | 
					cmake ..
 | 
				
			||||||
 | 
					make -j
 | 
				
			||||||
 | 
					sudo make install
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cd ~
 | 
					cd ~
 | 
				
			||||||
git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralgw
 | 
					git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralgw
 | 
				
			||||||
cd wlan-cloud-ucentralgw
 | 
					cd wlan-cloud-ucentralgw
 | 
				
			||||||
mkdir cmake-build
 | 
					mkdir cmake-build
 | 
				
			||||||
cd cmake-build
 | 
					cd cmake-build
 | 
				
			||||||
cmake ..
 | 
					cmake ..
 | 
				
			||||||
make
 | 
					make -j 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Fedora
 | 
					### Fedora
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								capabilities/edgecore_eap101.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					{"compatible":"edgecore_eap101","model":"EdgeCore EAP101","network":{"lan":["eth1","eth2"],"wan":["eth0"]},"platform":"ap","switch":{"switch0":{"enable":false,"reset":false}},"wifi":{"platform/soc/c000000.wifi":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"dfs_channels":[52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"he_mac_capa":[13,-26104,4160],"he_phy_capa":[7168,19568,8072,-31807,260,44],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80","HE20","HE40","HE80","HE160","HE80+80"],"rx_ant":3,"tx_ant":3,"vht_capa":1939470770},"platform/soc/c000000.wifi+1":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462],"he_mac_capa":[13,-26104,4160],"he_phy_capa":[512,3184,8072,-31807,260,44],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80","HE20","HE40"],"rx_ant":3,"tx_ant":3,"vht_capa":1939437970}}}
 | 
				
			||||||
							
								
								
									
										1
									
								
								capabilities/edgecore_eap102.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					{"compatible":"edgecore_eap102","model":"Edgecore EAP102","network":{"lan":["eth1"],"wan":["eth0"]},"platform":"ap","switch":{"switch0":{"enable":false,"reset":false}},"wifi":{"platform/soc/c000000.wifi1":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"he_mac_capa":[13,-26088,4160],"he_phy_capa":[1024,19552,32648,-31781,412,12],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80","HE20","HE40","HE80"],"rx_ant":240,"tx_ant":240,"vht_capa":1939601842},"platform/soc/c000000.wifi1+1":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462],"he_mac_capa":[13,-26088,4160],"he_phy_capa":[512,19552,32648,-31807,412,12],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80","HE20","HE40"],"rx_ant":3,"tx_ant":3,"vht_capa":1939437970}}}
 | 
				
			||||||
							
								
								
									
										1
									
								
								capabilities/edgecore_ecw5211.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					{"compatible":"edgecore_ecw5211","model":"Edgecore ECW5211","network":{"lan":["eth1"],"wan":["eth0"]},"platform":"ap","wifi":{"platform/soc/a000000.wifi":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11,12,13,14],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,2484],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"platform/soc/a800000.wifi":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"dfs_channels":[52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986}}}
 | 
				
			||||||
							
								
								
									
										1
									
								
								capabilities/edgecore_ecw5410.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					{"compatible":"edgecore_ecw5410","model":"Edgecore ECW5410","network":{"lan":["eth1"],"wan":["eth0"]},"platform":"ap","wifi":{"soc/1b700000.pci/pci0001:00/0001:00:00.0/0001:01:00.0":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"dfs_channels":[52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80","VHT80+80","VHT160"],"rx_ant":15,"tx_ant":15,"vht_capa":865827322},"soc/1b900000.pci/pci0002:00/0002:00:00.0/0002:01:00.0":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11,12,13,14],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,2484],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":15,"tx_ant":15,"vht_capa":865827250}}}
 | 
				
			||||||
							
								
								
									
										1
									
								
								capabilities/edgecore_spw2ac1200-lan-poe.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					{"compatible":"edgecore_spw2ac1200-lan-poe","model":"Edgecore SPW2AC1200","network":{"lan":["eth0"],"wan":["eth1"]},"platform":"ap","wifi":{"platform/soc/a000000.wifi":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11,12,13,14],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,2484],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"platform/soc/a800000.wifi":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"dfs_channels":[52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986}}}
 | 
				
			||||||
							
								
								
									
										1
									
								
								capabilities/edgecore_spw2ac1200.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					{"compatible":"edgecore_spw2ac1200","model":"Edgecore SPW2AC1200","network":{"lan":["eth1"],"wan":["eth0"]},"platform":"ap","wifi":{"platform/soc/a000000.wifi":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11,12,13,14],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,2484],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"platform/soc/a800000.wifi":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986}}}
 | 
				
			||||||
							
								
								
									
										1
									
								
								capabilities/edgecore_sswac2600.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					{"compatible":"edgecore_ssw2ac2600","model":"Edgecore SSW2AC2600","network":{"lan":["eth1"],"wan":["eth0"]},"platform":"ap","wifi":{"soc/1b700000.pci/pci0001:00/0001:00:00.0/0001:01:00.0":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80","VHT80+80","VHT160"],"rx_ant":15,"tx_ant":15,"vht_capa":865827322},"soc/1b900000.pci/pci0002:00/0002:00:00.0/0002:01:00.0":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11,12,13,14],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,2484],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":15,"tx_ant":15,"vht_capa":865827250}}}
 | 
				
			||||||
							
								
								
									
										1
									
								
								capabilities/linksys_ea6350-v4.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					{"compatible":"linksys_ea6350-v4","model":"Linksys EA6350 v4","network":{"lan":["lan1","lan2","lan3","lan4"],"wan":["wan"]},"platform":"ap","wifi":{"1e140000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11,12,13,14],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,2484],"ht_capa":510,"htmode":["HT20","HT40"],"rx_ant":3,"tx_ant":3},"1e140000.pcie/pci0000:00/0000:00:01.0/0000:02:00.0":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":511,"htmode":["HT20","HT40","VHT20","VHT40","VHT80","VHT80+80","VHT160"],"rx_ant":3,"tx_ant":3,"vht_capa":864027128}}}
 | 
				
			||||||
							
								
								
									
										1
									
								
								capabilities/linksys_ea8300.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					{"compatible":"linksys_ea8300","model":"Linksys EA8300 (Dallas)","network":{"lan":["eth0"],"wan":["eth1"]},"platform":"ap","switch":{"switch0":{"enable":true,"ports":[{"device":"eth0","need_tag":false,"num":0,"want_untag":true},{"num":1,"role":"lan"},{"num":2,"role":"lan"},{"num":3,"role":"lan"},{"num":4,"role":"lan"}],"reset":true,"roles":[{"device":"eth0","ports":"1 2 3 4 0","role":"lan"}]}},"wifi":{"platform/soc/a000000.wifi":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"platform/soc/a800000.wifi":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64],"dfs_channels":[52,56,60,64],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"soc/40000000.pci/pci0000:00/0000:00:00.0/0000:01:00.0":{"band":["5G"],"channels":[100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"dfs_channels":[100,104,108,112,116,120,124,128,132,136,140,144],"frequencies":[5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865696178}}}
 | 
				
			||||||
							
								
								
									
										1
									
								
								capabilities/wallys_dr40x9.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					{"compatible":"wallys_dr40x9","model":"Wallys DR40X9","network":{"lan":["eth0"],"wan":["eth1"]},"platform":"ap","wifi":{"platform/soc/a000000.wifi":{"band":["2G"],"channels":[1,2,3,4,5,6,7,8,9,10,11,12,13,14],"frequencies":[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,2484],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986},"platform/soc/a800000.wifi":{"band":["5G"],"channels":[36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165],"frequencies":[5180,5200,5220,5240,5260,5280,5300,5320,5500,5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5720,5745,5765,5785,5805,5825],"ht_capa":6639,"htmode":["HT20","HT40","VHT20","VHT40","VHT80"],"rx_ant":3,"tx_ant":3,"vht_capa":865687986}}}
 | 
				
			||||||
@@ -38,6 +38,11 @@ if [[ "$TEMPLATE_CONFIG" = 'true' && ! -f "$OWGW_CONFIG"/owgw.properties ]]; the
 | 
				
			|||||||
  SYSTEM_URI_PRIVATE=${SYSTEM_URI_PRIVATE:-"https://localhost:17002"} \
 | 
					  SYSTEM_URI_PRIVATE=${SYSTEM_URI_PRIVATE:-"https://localhost:17002"} \
 | 
				
			||||||
  SYSTEM_URI_PUBLIC=${SYSTEM_URI_PUBLIC:-"https://localhost:16002"} \
 | 
					  SYSTEM_URI_PUBLIC=${SYSTEM_URI_PUBLIC:-"https://localhost:16002"} \
 | 
				
			||||||
  SYSTEM_URI_UI=${SYSTEM_URI_UI:-"http://localhost"} \
 | 
					  SYSTEM_URI_UI=${SYSTEM_URI_UI:-"http://localhost"} \
 | 
				
			||||||
 | 
					  SIMULATORID=${SIMULATORID:-""} \
 | 
				
			||||||
 | 
					  IPTOCOUNTRY_PROVIDER=${IPTOCOUNTRY_PROVIDER:-"ipinfo"} \
 | 
				
			||||||
 | 
					  IPTOCOUNTRY_IPINFO_TOKEN=${IPTOCOUNTRY_IPINFO_TOKEN:-""} \
 | 
				
			||||||
 | 
					  IPTOCOUNTRY_IPDATA_APIKEY=${IPTOCOUNTRY_IPDATA_APIKEY:-""} \
 | 
				
			||||||
 | 
					  AUTOPROVISIONING_PROCESS=${AUTOPROVISIONING_PROCESS:-"prov,default"} \
 | 
				
			||||||
  RTTY_ENABLED=${RTTY_ENABLED:-"false"} \
 | 
					  RTTY_ENABLED=${RTTY_ENABLED:-"false"} \
 | 
				
			||||||
  RTTY_SERVER=${RTTY_SERVER:-"localhost"} \
 | 
					  RTTY_SERVER=${RTTY_SERVER:-"localhost"} \
 | 
				
			||||||
  RTTY_PORT=${RTTY_PORT:-"5912"} \
 | 
					  RTTY_PORT=${RTTY_PORT:-"5912"} \
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,12 @@
 | 
				
			|||||||
dependencies:
 | 
					dependencies:
 | 
				
			||||||
- name: postgresql
 | 
					- name: postgresql
 | 
				
			||||||
  repository: https://charts.bitnami.com/bitnami
 | 
					  repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
 | 
				
			||||||
  version: 10.9.2
 | 
					  version: 10.9.2
 | 
				
			||||||
- name: mysql
 | 
					- name: mysql
 | 
				
			||||||
  repository: https://charts.bitnami.com/bitnami
 | 
					  repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
 | 
				
			||||||
  version: 8.8.3
 | 
					  version: 8.8.3
 | 
				
			||||||
- name: mariadb
 | 
					- name: mariadb
 | 
				
			||||||
  repository: https://charts.bitnami.com/bitnami
 | 
					  repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
 | 
				
			||||||
  version: 9.4.2
 | 
					  version: 9.4.2
 | 
				
			||||||
digest: sha256:1fdae7cbea906e41dccd8618ff9e2c68d0c684724ae27c79a12bb6089968df5c
 | 
					digest: sha256:e9df5a5d8a0a193bfda33ea06060203aace01f0f7df9eda662a84185322c7ab5
 | 
				
			||||||
generated: "2021-08-17T12:18:40.341427893+03:00"
 | 
					generated: "2022-06-03T15:38:31.063022252+03:00"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,14 +5,14 @@ name: owgw
 | 
				
			|||||||
version: 0.1.0
 | 
					version: 0.1.0
 | 
				
			||||||
dependencies:
 | 
					dependencies:
 | 
				
			||||||
- name: postgresql
 | 
					- name: postgresql
 | 
				
			||||||
  repository: https://charts.bitnami.com/bitnami
 | 
					  repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
 | 
				
			||||||
  version: 10.9.2
 | 
					  version: 10.9.2
 | 
				
			||||||
  condition: postgresql.enabled
 | 
					  condition: postgresql.enabled
 | 
				
			||||||
- name: mysql
 | 
					- name: mysql
 | 
				
			||||||
  repository: https://charts.bitnami.com/bitnami
 | 
					  repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
 | 
				
			||||||
  version: 8.8.3
 | 
					  version: 8.8.3
 | 
				
			||||||
  condition: mysql.enabled
 | 
					  condition: mysql.enabled
 | 
				
			||||||
- name: mariadb
 | 
					- name: mariadb
 | 
				
			||||||
  repository: https://charts.bitnami.com/bitnami
 | 
					  repository: https://tip.jfrog.io/artifactory/tip-wlan-cloud-ucentral-helm/
 | 
				
			||||||
  version: 9.4.2
 | 
					  version: 9.4.2
 | 
				
			||||||
  condition: mariadb.enabled
 | 
					  condition: mariadb.enabled
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,3 +30,13 @@ Create chart name and version as used by the chart label.
 | 
				
			|||||||
{{- define "owgw.chart" -}}
 | 
					{{- define "owgw.chart" -}}
 | 
				
			||||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
 | 
					{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
 | 
				
			||||||
{{- end -}}
 | 
					{{- end -}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{- define "owgw.ingress.apiVersion" -}}
 | 
				
			||||||
 | 
					  {{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1" -}}
 | 
				
			||||||
 | 
					      {{- print "networking.k8s.io/v1" -}}
 | 
				
			||||||
 | 
					  {{- else if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" -}}
 | 
				
			||||||
 | 
					    {{- print "networking.k8s.io/v1beta1" -}}
 | 
				
			||||||
 | 
					  {{- else -}}
 | 
				
			||||||
 | 
					    {{- print "extensions/v1beta1" -}}
 | 
				
			||||||
 | 
					  {{- end -}}
 | 
				
			||||||
 | 
					{{- end -}}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,6 +13,7 @@ spec:
 | 
				
			|||||||
  replicas: {{ .Values.replicaCount }}
 | 
					  replicas: {{ .Values.replicaCount }}
 | 
				
			||||||
  strategy:
 | 
					  strategy:
 | 
				
			||||||
    type: {{ .Values.strategyType }}
 | 
					    type: {{ .Values.strategyType }}
 | 
				
			||||||
 | 
					  revisionHistoryLimit: {{ .Values.revisionHistoryLimit }}
 | 
				
			||||||
  selector:
 | 
					  selector:
 | 
				
			||||||
    matchLabels:
 | 
					    matchLabels:
 | 
				
			||||||
      app.kubernetes.io/name: {{ include "owgw.name" . }}
 | 
					      app.kubernetes.io/name: {{ include "owgw.name" . }}
 | 
				
			||||||
@@ -24,6 +25,9 @@ spec:
 | 
				
			|||||||
    metadata:
 | 
					    metadata:
 | 
				
			||||||
      annotations:
 | 
					      annotations:
 | 
				
			||||||
        checksum/config: {{ include "owgw.config" . | sha256sum }}
 | 
					        checksum/config: {{ include "owgw.config" . | sha256sum }}
 | 
				
			||||||
 | 
					        {{- if .Values.podSecurityPolicy.enabled }}
 | 
				
			||||||
 | 
					        kubernetes.io/psp: {{ include "owgw.fullname" . }}-{{ .Release.Namespace }}-owgw-unsafe-sysctl
 | 
				
			||||||
 | 
					        {{- end }}
 | 
				
			||||||
        {{- with .Values.podAnnotations }}
 | 
					        {{- with .Values.podAnnotations }}
 | 
				
			||||||
        {{- toYaml . | nindent 8 }}
 | 
					        {{- toYaml . | nindent 8 }}
 | 
				
			||||||
        {{- end }}
 | 
					        {{- end }}
 | 
				
			||||||
@@ -35,6 +39,16 @@ spec:
 | 
				
			|||||||
        {{- end }}
 | 
					        {{- end }}
 | 
				
			||||||
    spec:
 | 
					    spec:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      initContainers:
 | 
				
			||||||
 | 
					        - name: wait-kafka
 | 
				
			||||||
 | 
					          image: "{{ .Values.images.dockerize.repository }}:{{ .Values.images.dockerize.tag }}"
 | 
				
			||||||
 | 
					          imagePullPolicy: {{ .Values.images.dockerize.pullPolicy }}
 | 
				
			||||||
 | 
					          args:
 | 
				
			||||||
 | 
					            - -wait
 | 
				
			||||||
 | 
					            - tcp://{{ index .Values.configProperties "openwifi.kafka.brokerlist" }}
 | 
				
			||||||
 | 
					            - -timeout
 | 
				
			||||||
 | 
					            - 600s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      containers:
 | 
					      containers:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        - name: owgw
 | 
					        - name: owgw
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,7 @@
 | 
				
			|||||||
{{- range $ingress, $ingressValue := .Values.ingresses }}
 | 
					{{- range $ingress, $ingressValue := .Values.ingresses }}
 | 
				
			||||||
{{- if $ingressValue.enabled }}
 | 
					{{- if $ingressValue.enabled }}
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
apiVersion: extensions/v1beta1
 | 
					apiVersion: {{ include "owgw.ingress.apiVersion" $root }}
 | 
				
			||||||
kind: Ingress
 | 
					kind: Ingress
 | 
				
			||||||
metadata:
 | 
					metadata:
 | 
				
			||||||
  name: {{ include "owgw.fullname" $root }}-{{ $ingress }}
 | 
					  name: {{ include "owgw.fullname" $root }}-{{ $ingress }}
 | 
				
			||||||
@@ -36,11 +36,25 @@ spec:
 | 
				
			|||||||
      paths:
 | 
					      paths:
 | 
				
			||||||
      {{- range $ingressValue.paths }}
 | 
					      {{- range $ingressValue.paths }}
 | 
				
			||||||
        - path: {{ .path }}
 | 
					        - path: {{ .path }}
 | 
				
			||||||
 | 
					          {{- if $root.Capabilities.APIVersions.Has "networking.k8s.io/v1" }}
 | 
				
			||||||
 | 
					          pathType: {{ .pathType | default "ImplementationSpecific" }}
 | 
				
			||||||
 | 
					          {{- end }}
 | 
				
			||||||
          backend:
 | 
					          backend:
 | 
				
			||||||
 | 
					            {{- if $root.Capabilities.APIVersions.Has "networking.k8s.io/v1" }}
 | 
				
			||||||
 | 
					            service:
 | 
				
			||||||
 | 
					              name: {{ include "owgw.fullname" $root }}-{{ .serviceName }}
 | 
				
			||||||
 | 
					              port:
 | 
				
			||||||
 | 
					              {{- if kindIs "string" .servicePort }}
 | 
				
			||||||
 | 
					                name: {{ .servicePort }}
 | 
				
			||||||
 | 
					              {{- else }}
 | 
				
			||||||
 | 
					                number: {{ .servicePort }}
 | 
				
			||||||
 | 
					              {{- end }}
 | 
				
			||||||
 | 
					            {{- else }}
 | 
				
			||||||
            serviceName: {{ include "owgw.fullname" $root }}-{{ .serviceName }}
 | 
					            serviceName: {{ include "owgw.fullname" $root }}-{{ .serviceName }}
 | 
				
			||||||
            servicePort: {{ .servicePort }}
 | 
					            servicePort: {{ .servicePort }}
 | 
				
			||||||
            {{- end }}
 | 
					            {{- end }}
 | 
				
			||||||
      {{- end }}
 | 
					      {{- end }}
 | 
				
			||||||
 | 
					  {{- end }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{- end }}
 | 
					{{- end }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										28
									
								
								helm/templates/psp.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					{{- if .Values.podSecurityPolicy.enabled }}
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					apiVersion: policy/v1beta1
 | 
				
			||||||
 | 
					kind: PodSecurityPolicy
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: {{ include "owgw.fullname" . }}-{{ .Release.Namespace }}-owgw-unsafe-sysctl
 | 
				
			||||||
 | 
					  labels:
 | 
				
			||||||
 | 
					    app.kubernetes.io/name: {{ include "owgw.name" . }}
 | 
				
			||||||
 | 
					    helm.sh/chart: {{ include "owgw.chart" . }}
 | 
				
			||||||
 | 
					    app.kubernetes.io/instance: {{ .Release.Name }}
 | 
				
			||||||
 | 
					    app.kubernetes.io/managed-by: {{ .Release.Service }}
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  allowedUnsafeSysctls:
 | 
				
			||||||
 | 
					  {{- range $unsafeSysctl := .Values.securityContext.sysctls }}
 | 
				
			||||||
 | 
					  - {{ $unsafeSysctl.name }}
 | 
				
			||||||
 | 
					  {{- end }}
 | 
				
			||||||
 | 
					  privileged: false
 | 
				
			||||||
 | 
					  seLinux:
 | 
				
			||||||
 | 
					    rule: RunAsAny
 | 
				
			||||||
 | 
					  supplementalGroups:
 | 
				
			||||||
 | 
					    rule: RunAsAny
 | 
				
			||||||
 | 
					  runAsUser:
 | 
				
			||||||
 | 
					    rule: RunAsAny
 | 
				
			||||||
 | 
					  fsGroup:
 | 
				
			||||||
 | 
					    rule: RunAsAny
 | 
				
			||||||
 | 
					  volumes:
 | 
				
			||||||
 | 
					  - '*'
 | 
				
			||||||
 | 
					{{- end }}
 | 
				
			||||||
							
								
								
									
										16
									
								
								helm/templates/role.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					{{- if .Values.podSecurityPolicy.enabled }}
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					kind: Role
 | 
				
			||||||
 | 
					apiVersion: rbac.authorization.k8s.io/v1
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: {{ include "owgw.fullname" . }}-owgw-use-unsafe-sysctl
 | 
				
			||||||
 | 
					rules:
 | 
				
			||||||
 | 
					- apiGroups:
 | 
				
			||||||
 | 
					  - policy
 | 
				
			||||||
 | 
					  resources:
 | 
				
			||||||
 | 
					  - podsecuritypolicies
 | 
				
			||||||
 | 
					  verbs:
 | 
				
			||||||
 | 
					  - use
 | 
				
			||||||
 | 
					  resourceNames:
 | 
				
			||||||
 | 
					  - {{ include "owgw.fullname" . }}-{{ .Release.Namespace }}-owgw-unsafe-sysctl
 | 
				
			||||||
 | 
					{{- end }}
 | 
				
			||||||
							
								
								
									
										15
									
								
								helm/templates/rolebinding.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					{{- if .Values.podSecurityPolicy.enabled }}
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					apiVersion: rbac.authorization.k8s.io/v1
 | 
				
			||||||
 | 
					kind: RoleBinding
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: {{ include "owgw.fullname" . }}-owgw-use-unsafe-sysctl-to-default
 | 
				
			||||||
 | 
					roleRef:
 | 
				
			||||||
 | 
					  apiGroup: rbac.authorization.k8s.io
 | 
				
			||||||
 | 
					  kind: Role
 | 
				
			||||||
 | 
					  name: {{ include "owgw.fullname" . }}-owgw-use-unsafe-sysctl
 | 
				
			||||||
 | 
					subjects:
 | 
				
			||||||
 | 
					- kind: ServiceAccount
 | 
				
			||||||
 | 
					  name: default
 | 
				
			||||||
 | 
					  namespace: {{ .Release.Namespace }}
 | 
				
			||||||
 | 
					{{- end }}
 | 
				
			||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
# System
 | 
					# System
 | 
				
			||||||
replicaCount: 1
 | 
					replicaCount: 1
 | 
				
			||||||
strategyType: Recreate
 | 
					strategyType: Recreate
 | 
				
			||||||
 | 
					revisionHistoryLimit: 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
nameOverride: ""
 | 
					nameOverride: ""
 | 
				
			||||||
fullnameOverride: ""
 | 
					fullnameOverride: ""
 | 
				
			||||||
@@ -8,16 +9,20 @@ fullnameOverride: ""
 | 
				
			|||||||
images:
 | 
					images:
 | 
				
			||||||
  owgw:
 | 
					  owgw:
 | 
				
			||||||
    repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owgw
 | 
					    repository: tip-tip-wlan-cloud-ucentral.jfrog.io/owgw
 | 
				
			||||||
    tag: master
 | 
					    tag: v2.5.3
 | 
				
			||||||
    pullPolicy: Always
 | 
					    pullPolicy: Always
 | 
				
			||||||
#    regcred:
 | 
					#    regcred:
 | 
				
			||||||
#      registry: tip-tip-wlan-cloud-ucentral.jfrog.io
 | 
					#      registry: tip-tip-wlan-cloud-ucentral.jfrog.io
 | 
				
			||||||
#      username: username
 | 
					#      username: username
 | 
				
			||||||
#      password: password
 | 
					#      password: password
 | 
				
			||||||
 | 
					  dockerize:
 | 
				
			||||||
 | 
					    repository: tip-tip-wlan-cloud-ucentral.jfrog.io/dockerize
 | 
				
			||||||
 | 
					    tag: 0.16.0
 | 
				
			||||||
 | 
					    pullPolicy: IfNotPresent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
services:
 | 
					services:
 | 
				
			||||||
  owgw:
 | 
					  owgw:
 | 
				
			||||||
    type: LoadBalancer
 | 
					    type: ClusterIP
 | 
				
			||||||
    ports:
 | 
					    ports:
 | 
				
			||||||
      websocket:
 | 
					      websocket:
 | 
				
			||||||
        servicePort: 15002
 | 
					        servicePort: 15002
 | 
				
			||||||
@@ -46,7 +51,6 @@ checks:
 | 
				
			|||||||
      exec:
 | 
					      exec:
 | 
				
			||||||
        command:
 | 
					        command:
 | 
				
			||||||
          - /readiness_check
 | 
					          - /readiness_check
 | 
				
			||||||
      failureThreshold: 1
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
ingresses:
 | 
					ingresses:
 | 
				
			||||||
  restapi:
 | 
					  restapi:
 | 
				
			||||||
@@ -58,6 +62,7 @@ ingresses:
 | 
				
			|||||||
    - restapi.chart-example.local
 | 
					    - restapi.chart-example.local
 | 
				
			||||||
    paths:
 | 
					    paths:
 | 
				
			||||||
    - path: /
 | 
					    - path: /
 | 
				
			||||||
 | 
					      pathType: ImplementationSpecific
 | 
				
			||||||
      serviceName: owgw
 | 
					      serviceName: owgw
 | 
				
			||||||
      servicePort: restapi
 | 
					      servicePort: restapi
 | 
				
			||||||
  fileuploader:
 | 
					  fileuploader:
 | 
				
			||||||
@@ -69,6 +74,7 @@ ingresses:
 | 
				
			|||||||
    - fileuploader.chart-example.local
 | 
					    - fileuploader.chart-example.local
 | 
				
			||||||
    paths:
 | 
					    paths:
 | 
				
			||||||
    - path: /
 | 
					    - path: /
 | 
				
			||||||
 | 
					      pathType: ImplementationSpecific
 | 
				
			||||||
      serviceName: owgw
 | 
					      serviceName: owgw
 | 
				
			||||||
      servicePort: fileuploader
 | 
					      servicePort: fileuploader
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -112,6 +118,17 @@ resources: {}
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
securityContext:
 | 
					securityContext:
 | 
				
			||||||
  fsGroup: 101
 | 
					  fsGroup: 101
 | 
				
			||||||
 | 
					  # Usage of unsafe sysctls requires multiple things:
 | 
				
			||||||
 | 
					  # - allow these unsafe sysctls on kubelet level (by adding --allowed-unsafe-sysctls flag)
 | 
				
			||||||
 | 
					  # - enabling addition of PodSecurityContext setting podSecurityPolicy.enabled to "true" below
 | 
				
			||||||
 | 
					  # - uncommenting parameters below
 | 
				
			||||||
 | 
					  #sysctls:
 | 
				
			||||||
 | 
					  #- name: net.ipv4.tcp_keepalive_intvl
 | 
				
			||||||
 | 
					  #  value: "5"
 | 
				
			||||||
 | 
					  #- name: net.ipv4.tcp_keepalive_probes
 | 
				
			||||||
 | 
					  #  value: "2"
 | 
				
			||||||
 | 
					  #- name: net.ipv4.tcp_keepalive_time
 | 
				
			||||||
 | 
					  #  value: "45"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
nodeSelector: {}
 | 
					nodeSelector: {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -121,6 +138,9 @@ affinity: {}
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
podAnnotations: {}
 | 
					podAnnotations: {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					podSecurityPolicy:
 | 
				
			||||||
 | 
					  enabled: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
persistence:
 | 
					persistence:
 | 
				
			||||||
  enabled: true
 | 
					  enabled: true
 | 
				
			||||||
  # storageClassName: "-"
 | 
					  # storageClassName: "-"
 | 
				
			||||||
@@ -240,22 +260,20 @@ configProperties:
 | 
				
			|||||||
  openwifi.system.uri.public: https://localhost:16002
 | 
					  openwifi.system.uri.public: https://localhost:16002
 | 
				
			||||||
  openwifi.system.commandchannel: /tmp/app_owgw
 | 
					  openwifi.system.commandchannel: /tmp/app_owgw
 | 
				
			||||||
  # Logging
 | 
					  # Logging
 | 
				
			||||||
  logging.formatters.f1.class: PatternFormatter
 | 
					  logging.type: console
 | 
				
			||||||
  logging.formatters.f1.pattern: "%Y-%m-%d %H:%M:%S %s: [%p] %t"
 | 
					  logging.path: $OWGW_ROOT/logs
 | 
				
			||||||
  logging.formatters.f1.times: UTC
 | 
					  logging.level: debug
 | 
				
			||||||
  logging.channels.c1.class: ConsoleChannel
 | 
					  # Archiving
 | 
				
			||||||
  logging.channels.c1.formatter: f1
 | 
					  archiver.enabled: "true"
 | 
				
			||||||
  logging.channels.c2.class: FileChannel
 | 
					  archiver.schedule: 03:00
 | 
				
			||||||
  logging.channels.c2.path: /tmp/log_owgw
 | 
					  archiver.db.0.name: healthchecks
 | 
				
			||||||
  logging.channels.c2.formatter.class: PatternFormatter
 | 
					  archiver.db.0.keep: 7
 | 
				
			||||||
  logging.channels.c2.formatter.pattern: "%Y-%m-%d %H:%M:%S %s: [%p] %t"
 | 
					  archiver.db.1.name: statistics
 | 
				
			||||||
  logging.channels.c2.rotation: "20 M"
 | 
					  archiver.db.1.keep: 7
 | 
				
			||||||
  logging.channels.c2.archive: timestamp
 | 
					  archiver.db.2.name: devicelogs
 | 
				
			||||||
  logging.channels.c2.purgeCount: 20
 | 
					  archiver.db.2.keep: 7
 | 
				
			||||||
  logging.channels.c3.class: ConsoleChannel
 | 
					  archiver.db.3.name: commandlist
 | 
				
			||||||
  logging.channels.c3.pattern: "%s: [%p] %t"
 | 
					  archiver.db.3.keep: 7
 | 
				
			||||||
  logging.loggers.root.channel: c1
 | 
					 | 
				
			||||||
  logging.loggers.root.level: debug
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # -> Secret part
 | 
					  # -> Secret part
 | 
				
			||||||
  # Websocket
 | 
					  # Websocket
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,158 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
 | 
					 | 
				
			||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 | 
					 | 
				
			||||||
	 viewBox="0 0 141.5 185.6" style="enable-background:new 0 0 141.5 185.6;" xml:space="preserve">
 | 
					 | 
				
			||||||
<style type="text/css">
 | 
					 | 
				
			||||||
	.st0{fill:#FFFFFF;}
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
	<g>
 | 
					 | 
				
			||||||
		<path class="st0" d="M120.7,183.9H21.5c-10.8,0-19.5-8.7-19.5-19.5V20.5c0-10.8,8.7-19.5,19.5-19.5h99.2
 | 
					 | 
				
			||||||
			c10.8,0,19.5,8.7,19.5,19.5v143.9C140.2,175.2,131.5,183.9,120.7,183.9z"/>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M46.3,166.2v-3.4h-1.2v-0.6h3.1v0.6H47v3.4H46.3z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M49,166.2v-4h2.7v0.6h-2v1h2v0.6h-2v1.1h2v0.6H49z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M52.6,166.2v-4h0.7v3.4h1.8v0.6H52.6z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M55.7,166.2v-4h2.7v0.6h-2v1h2v0.6h-2v1.1h2v0.6H55.7z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M59.1,164.2c0-1.2,0.9-2.1,2.1-2.1c0.8,0,1.3,0.4,1.6,0.9l-0.6,0.3c-0.2-0.3-0.6-0.6-1-0.6c-0.8,0-1.4,0.6-1.4,1.4
 | 
					 | 
				
			||||||
						c0,0.8,0.6,1.4,1.4,1.4c0.4,0,0.8-0.3,1-0.6l0.6,0.3c-0.3,0.5-0.8,0.9-1.6,0.9C60,166.3,59.1,165.5,59.1,164.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M63.2,164.2c0-1.2,0.8-2.1,2-2.1c1.2,0,2,0.9,2,2.1c0,1.2-0.8,2.1-2,2.1C64,166.3,63.2,165.4,63.2,164.2z M66.5,164.2
 | 
					 | 
				
			||||||
						c0-0.8-0.5-1.4-1.3-1.4c-0.8,0-1.3,0.6-1.3,1.4c0,0.8,0.5,1.4,1.3,1.4C66,165.7,66.5,165,66.5,164.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M71.3,166.2v-3.1l-1.2,3.1h-0.3l-1.2-3.1v3.1h-0.7v-4h1l1.1,2.7l1.1-2.7h1v4H71.3z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M75.7,166.2v-4h0.7v4H75.7z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M80.4,166.2l-2.1-2.8v2.8h-0.7v-4h0.7l2,2.8v-2.8h0.7v4H80.4z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M82.3,166.2v-4H85v0.6h-2v1h2v0.6h-2v1.7H82.3z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M87.9,166.2l-0.9-1.5h-0.7v1.5h-0.7v-4h1.7c0.8,0,1.3,0.5,1.3,1.2c0,0.7-0.5,1.1-0.9,1.2l1,1.6H87.9z M88,163.5
 | 
					 | 
				
			||||||
						c0-0.4-0.3-0.6-0.7-0.6h-1v1.3h1C87.7,164.1,88,163.9,88,163.5z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M92.4,166.2l-0.3-0.8h-1.8l-0.3,0.8h-0.8l1.6-4h0.9l1.6,4H92.4z M91.2,162.9l-0.7,1.9h1.4L91.2,162.9z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M95.8,166.2v-4h1.5c0.8,0,1.2,0.5,1.2,1.2c0,0.6-0.4,1.2-1.2,1.2h-1.2v1.7H95.8z M98.2,163.4c0-0.5-0.3-0.9-0.9-0.9
 | 
					 | 
				
			||||||
						h-1.1v1.7h1.1C97.8,164.3,98.2,163.9,98.2,163.4z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M101.5,166.2l-1.1-1.6h-0.9v1.6h-0.3v-4h1.5c0.7,0,1.2,0.4,1.2,1.2c0,0.7-0.5,1.1-1.1,1.1l1.2,1.7H101.5z M101.6,163.4
 | 
					 | 
				
			||||||
						c0-0.5-0.4-0.9-0.9-0.9h-1.1v1.7h1.1C101.2,164.3,101.6,163.9,101.6,163.4z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M102.8,164.2c0-1.2,0.8-2.1,1.9-2.1c1.2,0,1.9,0.9,1.9,2.1c0,1.2-0.8,2.1-1.9,2.1C103.6,166.3,102.8,165.4,102.8,164.2
 | 
					 | 
				
			||||||
						z M106.3,164.2c0-1-0.6-1.7-1.6-1.7c-1,0-1.6,0.7-1.6,1.7c0,1,0.6,1.7,1.6,1.7C105.7,166,106.3,165.2,106.3,164.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M106.9,165.8l0.2-0.3c0.2,0.2,0.4,0.4,0.8,0.4c0.5,0,0.9-0.4,0.9-0.9v-2.8h0.3v2.8c0,0.8-0.5,1.2-1.2,1.2
 | 
					 | 
				
			||||||
						C107.5,166.3,107.2,166.1,106.9,165.8z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M110.4,166.2v-4h2.5v0.3h-2.2v1.5h2.1v0.3h-2.1v1.6h2.2v0.3H110.4z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M113.5,164.2c0-1.2,0.9-2.1,2-2.1c0.6,0,1.1,0.3,1.5,0.7l-0.3,0.2c-0.3-0.3-0.7-0.6-1.2-0.6c-0.9,0-1.7,0.7-1.7,1.7
 | 
					 | 
				
			||||||
						c0,1,0.7,1.7,1.7,1.7c0.5,0,0.9-0.2,1.2-0.6l0.3,0.2c-0.4,0.4-0.8,0.7-1.5,0.7C114.4,166.3,113.5,165.5,113.5,164.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M118.7,166.2v-3.7h-1.3v-0.3h2.9v0.3H119v3.7H118.7z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<polygon points="26.3,163.8 31.6,158.5 36.9,163.8 37.7,163.8 31.6,157.6 25.5,163.8 				"/>
 | 
					 | 
				
			||||||
				<polygon points="36.9,164.7 31.6,170 26.3,164.7 25.5,164.7 31.6,170.8 37.7,164.7 				"/>
 | 
					 | 
				
			||||||
				<polygon points="31,163.8 36.3,158.5 41.6,163.8 42.5,163.8 36.3,157.6 30.2,163.8 				"/>
 | 
					 | 
				
			||||||
				<polygon points="41.6,164.7 36.3,170 31,164.7 30.2,164.7 36.3,170.8 42.5,164.7 				"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<path d="M33.2,100.7c-4.6,0-8.3,3.7-8.3,8.3s3.7,8.3,8.3,8.3s8.3-3.7,8.3-8.3S37.8,100.7,33.2,100.7z"/>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M33.2,35.2c40.7,0,73.8,33.1,73.8,73.8c0,0.7,0,1.4,0,2.1c0,1.7,0.6,3.3,1.7,4.6c1.2,1.2,2.8,1.9,4.5,2l0.2,0
 | 
					 | 
				
			||||||
						c3.5,0,6.3-2.7,6.4-6.2c0-0.8,0-1.7,0-2.5c0-47.7-38.8-86.6-86.6-86.6c-0.8,0-1.7,0-2.5,0c-1.7,0-3.3,0.8-4.5,2
 | 
					 | 
				
			||||||
						c-1.2,1.2-1.8,2.9-1.7,4.6c0.1,3.5,3,6.3,6.6,6.2C31.8,35.2,32.5,35.2,33.2,35.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M33.2,60.5c26.7,0,48.5,21.7,48.5,48.5c0,0.6,0,1.3,0,2c-0.1,1.7,0.5,3.3,1.7,4.6c1.2,1.3,2.7,2,4.4,2.1
 | 
					 | 
				
			||||||
						c1.7,0.1,3.3-0.5,4.6-1.7c1.2-1.2,2-2.7,2-4.4c0-0.9,0.1-1.8,0.1-2.6c0-33.8-27.5-61.2-61.2-61.2c-0.8,0-1.6,0-2.6,0.1
 | 
					 | 
				
			||||||
						c-1.7,0.1-3.3,0.8-4.4,2.1c-1.2,1.3-1.8,2.9-1.7,4.6s0.8,3.3,2.1,4.4c1.3,1.2,2.9,1.8,4.6,1.7C31.9,60.5,32.6,60.5,33.2,60.5z"
 | 
					 | 
				
			||||||
						/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path d="M33.2,86.7c12.3,0,22.3,10,22.3,22.3c0,0.5,0,1.1-0.1,1.8c-0.3,3.5,2.3,6.6,5.8,6.9c3.5,0.3,6.6-2.3,6.9-5.8
 | 
					 | 
				
			||||||
						c0.1-1,0.1-1.9,0.1-2.8c0-19.3-15.7-35.1-35.1-35.1c-0.9,0-1.8,0-2.8,0.1c-1.7,0.1-3.2,0.9-4.3,2.2c-1.1,1.3-1.6,2.9-1.5,4.6
 | 
					 | 
				
			||||||
						c0.1,1.7,0.9,3.2,2.2,4.3c1.3,1.1,2.9,1.6,4.6,1.5C32.1,86.7,32.7,86.7,33.2,86.7z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
	</g>
 | 
					 | 
				
			||||||
	<g>
 | 
					 | 
				
			||||||
		<path d="M35.8,130.4c1.1,0.6,2.1,1.5,2.7,2.6c0.7,1.1,1,2.3,1,3.7s-0.3,2.6-1,3.7c-0.7,1.1-1.6,2-2.7,2.6c-1.1,0.6-2.4,1-3.8,1
 | 
					 | 
				
			||||||
			s-2.7-0.3-3.8-1c-1.1-0.6-2.1-1.5-2.7-2.6c-0.7-1.1-1-2.3-1-3.7c0-1.3,0.3-2.6,1-3.7c0.7-1.1,1.6-2,2.7-2.6
 | 
					 | 
				
			||||||
			c1.1-0.6,2.4-0.9,3.8-0.9C33.4,129.5,34.7,129.8,35.8,130.4z M29.9,132.9c-0.7,0.4-1.2,0.9-1.6,1.6s-0.6,1.4-0.6,2.2
 | 
					 | 
				
			||||||
			c0,0.8,0.2,1.6,0.6,2.3c0.4,0.7,0.9,1.2,1.6,1.6c0.7,0.4,1.4,0.6,2.1,0.6c0.8,0,1.5-0.2,2.1-0.6c0.6-0.4,1.2-0.9,1.5-1.6
 | 
					 | 
				
			||||||
			c0.4-0.7,0.6-1.4,0.6-2.3c0-0.8-0.2-1.6-0.6-2.2s-0.9-1.2-1.5-1.6c-0.6-0.4-1.4-0.6-2.1-0.6C31.3,132.3,30.6,132.5,29.9,132.9z"/>
 | 
					 | 
				
			||||||
		<path d="M50.6,133.6c0.8,0.5,1.4,1.1,1.8,2c0.4,0.8,0.6,1.8,0.6,2.9c0,1.1-0.2,2-0.6,2.8c-0.4,0.8-1,1.5-1.8,1.9
 | 
					 | 
				
			||||||
			c-0.8,0.5-1.6,0.7-2.6,0.7c-0.7,0-1.4-0.1-2-0.4s-1.1-0.7-1.5-1.2v5.4h-3.1V133h3.1v1.6c0.4-0.5,0.9-1,1.4-1.2s1.2-0.4,2-0.4
 | 
					 | 
				
			||||||
			C48.9,132.9,49.8,133.1,50.6,133.6z M49.1,140.5c0.5-0.6,0.7-1.3,0.7-2.2c0-0.9-0.2-1.6-0.7-2.1c-0.5-0.6-1.1-0.8-1.9-0.8
 | 
					 | 
				
			||||||
			s-1.4,0.3-1.9,0.8c-0.5,0.6-0.8,1.3-0.8,2.1c0,0.9,0.2,1.6,0.8,2.2s1.1,0.8,1.9,0.8S48.6,141,49.1,140.5z"/>
 | 
					 | 
				
			||||||
		<path d="M63.4,134.4c0.9,1,1.4,2.4,1.4,4.2c0,0.3,0,0.6,0,0.7H57c0.2,0.7,0.5,1.2,1,1.6c0.5,0.4,1.1,0.6,1.8,0.6
 | 
					 | 
				
			||||||
			c0.5,0,1-0.1,1.5-0.3s0.9-0.5,1.3-0.9l1.6,1.6c-0.5,0.6-1.2,1.1-2,1.4c-0.8,0.3-1.6,0.5-2.6,0.5c-1.1,0-2.1-0.2-3-0.7
 | 
					 | 
				
			||||||
			s-1.5-1.1-2-1.9c-0.5-0.8-0.7-1.8-0.7-2.9c0-1.1,0.2-2.1,0.7-2.9s1.1-1.5,2-1.9c0.8-0.5,1.8-0.7,2.9-0.7
 | 
					 | 
				
			||||||
			C61.2,132.9,62.5,133.4,63.4,134.4z M61.8,137.5c0-0.7-0.3-1.3-0.7-1.7s-1-0.6-1.7-0.6c-0.7,0-1.2,0.2-1.7,0.6
 | 
					 | 
				
			||||||
			c-0.4,0.4-0.7,1-0.9,1.7H61.8z"/>
 | 
					 | 
				
			||||||
		<path d="M76.2,134c0.7,0.7,1.1,1.7,1.1,3v6.8h-3.1v-5.9c0-0.7-0.2-1.2-0.6-1.6s-0.9-0.6-1.5-0.6c-0.8,0-1.4,0.3-1.8,0.8
 | 
					 | 
				
			||||||
			c-0.4,0.5-0.7,1.2-0.7,2v5.3h-3.1V133h3.1v1.9c0.7-1.3,2-2,3.7-2C74.6,132.8,75.5,133.2,76.2,134z"/>
 | 
					 | 
				
			||||||
		<path d="M96,129.7h3.3l-4.7,14h-3.3l-2.9-10.1l-3,10.1h-3.2l-4.7-14h3.4l3,10.7l3-10.7H90l3.1,10.7L96,129.7z"/>
 | 
					 | 
				
			||||||
		<path d="M103.3,128.7c0.3,0.3,0.5,0.7,0.5,1.2s-0.2,0.9-0.5,1.2c-0.3,0.3-0.7,0.5-1.2,0.5c-0.5,0-0.9-0.2-1.2-0.5
 | 
					 | 
				
			||||||
			c-0.3-0.3-0.5-0.7-0.5-1.2c0-0.5,0.2-0.9,0.5-1.2c0.3-0.3,0.7-0.5,1.2-0.5C102.6,128.2,103,128.3,103.3,128.7z M100.6,133h3.1
 | 
					 | 
				
			||||||
			v10.8h-3.1V133z"/>
 | 
					 | 
				
			||||||
		<path d="M106.5,129.7h10.1l0,2.6h-6.9v3.4h6.3v2.6h-6.3v5.3h-3.2V129.7z"/>
 | 
					 | 
				
			||||||
		<path d="M120.9,128.7c0.3,0.3,0.5,0.7,0.5,1.2s-0.2,0.9-0.5,1.2c-0.3,0.3-0.7,0.5-1.2,0.5c-0.5,0-0.9-0.2-1.2-0.5
 | 
					 | 
				
			||||||
			c-0.3-0.3-0.5-0.7-0.5-1.2c0-0.5,0.2-0.9,0.5-1.2c0.3-0.3,0.7-0.5,1.2-0.5C120.1,128.2,120.5,128.3,120.9,128.7z M118.1,133h3.1
 | 
					 | 
				
			||||||
			v10.8h-3.1V133z"/>
 | 
					 | 
				
			||||||
	</g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
</svg>
 | 
					 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 7.5 KiB  | 
@@ -1,165 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
 | 
					 | 
				
			||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 | 
					 | 
				
			||||||
	 viewBox="0 0 141.5 185.6" style="enable-background:new 0 0 141.5 185.6;" xml:space="preserve">
 | 
					 | 
				
			||||||
<style type="text/css">
 | 
					 | 
				
			||||||
	.st0{fill:#414141;}
 | 
					 | 
				
			||||||
	.st1{fill:#FFFFFF;}
 | 
					 | 
				
			||||||
	.st2{fill:#FED206;}
 | 
					 | 
				
			||||||
	.st3{fill:#EB6F53;}
 | 
					 | 
				
			||||||
	.st4{fill:#3BA9B6;}
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
	<g>
 | 
					 | 
				
			||||||
		<path class="st0" d="M120.7,183.9H21.5c-10.8,0-19.5-8.7-19.5-19.5V20.5c0-10.8,8.7-19.5,19.5-19.5h99.2
 | 
					 | 
				
			||||||
			c10.8,0,19.5,8.7,19.5,19.5v143.9C140.2,175.2,131.5,183.9,120.7,183.9z"/>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M46.3,166.2v-3.4h-1.2v-0.6h3.1v0.6H47v3.4H46.3z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M49,166.2v-4h2.7v0.6h-2v1h2v0.6h-2v1.1h2v0.6H49z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M52.6,166.2v-4h0.7v3.4h1.8v0.6H52.6z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M55.7,166.2v-4h2.7v0.6h-2v1h2v0.6h-2v1.1h2v0.6H55.7z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M59.1,164.2c0-1.2,0.9-2.1,2.1-2.1c0.8,0,1.3,0.4,1.6,0.9l-0.6,0.3c-0.2-0.3-0.6-0.6-1-0.6
 | 
					 | 
				
			||||||
						c-0.8,0-1.4,0.6-1.4,1.4c0,0.8,0.6,1.4,1.4,1.4c0.4,0,0.8-0.3,1-0.6l0.6,0.3c-0.3,0.5-0.8,0.9-1.6,0.9
 | 
					 | 
				
			||||||
						C60,166.3,59.1,165.5,59.1,164.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M63.2,164.2c0-1.2,0.8-2.1,2-2.1c1.2,0,2,0.9,2,2.1c0,1.2-0.8,2.1-2,2.1C64,166.3,63.2,165.4,63.2,164.2z
 | 
					 | 
				
			||||||
						 M66.5,164.2c0-0.8-0.5-1.4-1.3-1.4c-0.8,0-1.3,0.6-1.3,1.4c0,0.8,0.5,1.4,1.3,1.4C66,165.7,66.5,165,66.5,164.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M71.3,166.2v-3.1l-1.2,3.1h-0.3l-1.2-3.1v3.1h-0.7v-4h1l1.1,2.7l1.1-2.7h1v4H71.3z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M75.7,166.2v-4h0.7v4H75.7z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M80.4,166.2l-2.1-2.8v2.8h-0.7v-4h0.7l2,2.8v-2.8h0.7v4H80.4z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M82.3,166.2v-4H85v0.6h-2v1h2v0.6h-2v1.7H82.3z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M87.9,166.2l-0.9-1.5h-0.7v1.5h-0.7v-4h1.7c0.8,0,1.3,0.5,1.3,1.2c0,0.7-0.5,1.1-0.9,1.2l1,1.6H87.9z
 | 
					 | 
				
			||||||
						 M88,163.5c0-0.4-0.3-0.6-0.7-0.6h-1v1.3h1C87.7,164.1,88,163.9,88,163.5z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M92.4,166.2l-0.3-0.8h-1.8l-0.3,0.8h-0.8l1.6-4h0.9l1.6,4H92.4z M91.2,162.9l-0.7,1.9h1.4L91.2,162.9z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M95.8,166.2v-4h1.5c0.8,0,1.2,0.5,1.2,1.2c0,0.6-0.4,1.2-1.2,1.2h-1.2v1.7H95.8z M98.2,163.4
 | 
					 | 
				
			||||||
						c0-0.5-0.3-0.9-0.9-0.9h-1.1v1.7h1.1C97.8,164.3,98.2,163.9,98.2,163.4z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M101.5,166.2l-1.1-1.6h-0.9v1.6h-0.3v-4h1.5c0.7,0,1.2,0.4,1.2,1.2c0,0.7-0.5,1.1-1.1,1.1l1.2,1.7H101.5z
 | 
					 | 
				
			||||||
						 M101.6,163.4c0-0.5-0.4-0.9-0.9-0.9h-1.1v1.7h1.1C101.2,164.3,101.6,163.9,101.6,163.4z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M102.8,164.2c0-1.2,0.8-2.1,1.9-2.1c1.2,0,1.9,0.9,1.9,2.1c0,1.2-0.8,2.1-1.9,2.1
 | 
					 | 
				
			||||||
						C103.6,166.3,102.8,165.4,102.8,164.2z M106.3,164.2c0-1-0.6-1.7-1.6-1.7c-1,0-1.6,0.7-1.6,1.7c0,1,0.6,1.7,1.6,1.7
 | 
					 | 
				
			||||||
						C105.7,166,106.3,165.2,106.3,164.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M106.9,165.8l0.2-0.3c0.2,0.2,0.4,0.4,0.8,0.4c0.5,0,0.9-0.4,0.9-0.9v-2.8h0.3v2.8c0,0.8-0.5,1.2-1.2,1.2
 | 
					 | 
				
			||||||
						C107.5,166.3,107.2,166.1,106.9,165.8z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M110.4,166.2v-4h2.5v0.3h-2.2v1.5h2.1v0.3h-2.1v1.6h2.2v0.3H110.4z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M113.5,164.2c0-1.2,0.9-2.1,2-2.1c0.6,0,1.1,0.3,1.5,0.7l-0.3,0.2c-0.3-0.3-0.7-0.6-1.2-0.6
 | 
					 | 
				
			||||||
						c-0.9,0-1.7,0.7-1.7,1.7c0,1,0.7,1.7,1.7,1.7c0.5,0,0.9-0.2,1.2-0.6l0.3,0.2c-0.4,0.4-0.8,0.7-1.5,0.7
 | 
					 | 
				
			||||||
						C114.4,166.3,113.5,165.5,113.5,164.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M118.7,166.2v-3.7h-1.3v-0.3h2.9v0.3H119v3.7H118.7z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<polygon class="st1" points="26.3,163.8 31.6,158.5 36.9,163.8 37.7,163.8 31.6,157.6 25.5,163.8 				"/>
 | 
					 | 
				
			||||||
				<polygon class="st1" points="36.9,164.7 31.6,170 26.3,164.7 25.5,164.7 31.6,170.8 37.7,164.7 				"/>
 | 
					 | 
				
			||||||
				<polygon class="st1" points="31,163.8 36.3,158.5 41.6,163.8 42.5,163.8 36.3,157.6 30.2,163.8 				"/>
 | 
					 | 
				
			||||||
				<polygon class="st1" points="41.6,164.7 36.3,170 31,164.7 30.2,164.7 36.3,170.8 42.5,164.7 				"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<path class="st1" d="M33.2,100.7c-4.6,0-8.3,3.7-8.3,8.3s3.7,8.3,8.3,8.3s8.3-3.7,8.3-8.3S37.8,100.7,33.2,100.7z"/>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st2" d="M33.2,35.2c40.7,0,73.8,33.1,73.8,73.8c0,0.7,0,1.4,0,2.1c0,1.7,0.6,3.3,1.7,4.6c1.2,1.2,2.8,1.9,4.5,2
 | 
					 | 
				
			||||||
						l0.2,0c3.5,0,6.3-2.7,6.4-6.2c0-0.8,0-1.7,0-2.5c0-47.7-38.8-86.6-86.6-86.6c-0.8,0-1.7,0-2.5,0c-1.7,0-3.3,0.8-4.5,2
 | 
					 | 
				
			||||||
						c-1.2,1.2-1.8,2.9-1.7,4.6c0.1,3.5,3,6.3,6.6,6.2C31.8,35.2,32.5,35.2,33.2,35.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st3" d="M33.2,60.5c26.7,0,48.5,21.7,48.5,48.5c0,0.6,0,1.3,0,2c-0.1,1.7,0.5,3.3,1.7,4.6c1.2,1.3,2.7,2,4.4,2.1
 | 
					 | 
				
			||||||
						c1.7,0.1,3.3-0.5,4.6-1.7c1.2-1.2,2-2.7,2-4.4c0-0.9,0.1-1.8,0.1-2.6c0-33.8-27.5-61.2-61.2-61.2c-0.8,0-1.6,0-2.6,0.1
 | 
					 | 
				
			||||||
						c-1.7,0.1-3.3,0.8-4.4,2.1c-1.2,1.3-1.8,2.9-1.7,4.6s0.8,3.3,2.1,4.4c1.3,1.2,2.9,1.8,4.6,1.7C31.9,60.5,32.6,60.5,33.2,60.5z"
 | 
					 | 
				
			||||||
						/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st4" d="M33.2,86.7c12.3,0,22.3,10,22.3,22.3c0,0.5,0,1.1-0.1,1.8c-0.3,3.5,2.3,6.6,5.8,6.9
 | 
					 | 
				
			||||||
						c3.5,0.3,6.6-2.3,6.9-5.8c0.1-1,0.1-1.9,0.1-2.8c0-19.3-15.7-35.1-35.1-35.1c-0.9,0-1.8,0-2.8,0.1c-1.7,0.1-3.2,0.9-4.3,2.2
 | 
					 | 
				
			||||||
						c-1.1,1.3-1.6,2.9-1.5,4.6c0.1,1.7,0.9,3.2,2.2,4.3c1.3,1.1,2.9,1.6,4.6,1.5C32.1,86.7,32.7,86.7,33.2,86.7z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
	</g>
 | 
					 | 
				
			||||||
	<g>
 | 
					 | 
				
			||||||
		<path class="st1" d="M35.8,130.4c1.1,0.6,2.1,1.5,2.7,2.6c0.7,1.1,1,2.3,1,3.7s-0.3,2.6-1,3.7c-0.7,1.1-1.6,2-2.7,2.6
 | 
					 | 
				
			||||||
			c-1.1,0.6-2.4,1-3.8,1s-2.7-0.3-3.8-1c-1.1-0.6-2.1-1.5-2.7-2.6c-0.7-1.1-1-2.3-1-3.7c0-1.3,0.3-2.6,1-3.7c0.7-1.1,1.6-2,2.7-2.6
 | 
					 | 
				
			||||||
			c1.1-0.6,2.4-0.9,3.8-0.9C33.4,129.5,34.7,129.8,35.8,130.4z M29.9,132.9c-0.7,0.4-1.2,0.9-1.6,1.6s-0.6,1.4-0.6,2.2
 | 
					 | 
				
			||||||
			c0,0.8,0.2,1.6,0.6,2.3c0.4,0.7,0.9,1.2,1.6,1.6c0.7,0.4,1.4,0.6,2.1,0.6c0.8,0,1.5-0.2,2.1-0.6c0.6-0.4,1.2-0.9,1.5-1.6
 | 
					 | 
				
			||||||
			c0.4-0.7,0.6-1.4,0.6-2.3c0-0.8-0.2-1.6-0.6-2.2s-0.9-1.2-1.5-1.6c-0.6-0.4-1.4-0.6-2.1-0.6C31.3,132.3,30.6,132.5,29.9,132.9z"/>
 | 
					 | 
				
			||||||
		<path class="st1" d="M50.6,133.6c0.8,0.5,1.4,1.1,1.8,2c0.4,0.8,0.6,1.8,0.6,2.9c0,1.1-0.2,2-0.6,2.8c-0.4,0.8-1,1.5-1.8,1.9
 | 
					 | 
				
			||||||
			c-0.8,0.5-1.6,0.7-2.6,0.7c-0.7,0-1.4-0.1-2-0.4s-1.1-0.7-1.5-1.2v5.4h-3.1V133h3.1v1.6c0.4-0.5,0.9-1,1.4-1.2s1.2-0.4,2-0.4
 | 
					 | 
				
			||||||
			C48.9,132.9,49.8,133.1,50.6,133.6z M49.1,140.5c0.5-0.6,0.7-1.3,0.7-2.2c0-0.9-0.2-1.6-0.7-2.1c-0.5-0.6-1.1-0.8-1.9-0.8
 | 
					 | 
				
			||||||
			s-1.4,0.3-1.9,0.8c-0.5,0.6-0.8,1.3-0.8,2.1c0,0.9,0.2,1.6,0.8,2.2s1.1,0.8,1.9,0.8S48.6,141,49.1,140.5z"/>
 | 
					 | 
				
			||||||
		<path class="st1" d="M63.4,134.4c0.9,1,1.4,2.4,1.4,4.2c0,0.3,0,0.6,0,0.7H57c0.2,0.7,0.5,1.2,1,1.6c0.5,0.4,1.1,0.6,1.8,0.6
 | 
					 | 
				
			||||||
			c0.5,0,1-0.1,1.5-0.3s0.9-0.5,1.3-0.9l1.6,1.6c-0.5,0.6-1.2,1.1-2,1.4c-0.8,0.3-1.6,0.5-2.6,0.5c-1.1,0-2.1-0.2-3-0.7
 | 
					 | 
				
			||||||
			s-1.5-1.1-2-1.9c-0.5-0.8-0.7-1.8-0.7-2.9c0-1.1,0.2-2.1,0.7-2.9s1.1-1.5,2-1.9c0.8-0.5,1.8-0.7,2.9-0.7
 | 
					 | 
				
			||||||
			C61.2,132.9,62.5,133.4,63.4,134.4z M61.8,137.5c0-0.7-0.3-1.3-0.7-1.7s-1-0.6-1.7-0.6c-0.7,0-1.2,0.2-1.7,0.6
 | 
					 | 
				
			||||||
			c-0.4,0.4-0.7,1-0.9,1.7H61.8z"/>
 | 
					 | 
				
			||||||
		<path class="st1" d="M76.2,134c0.7,0.7,1.1,1.7,1.1,3v6.8h-3.1v-5.9c0-0.7-0.2-1.2-0.6-1.6s-0.9-0.6-1.5-0.6
 | 
					 | 
				
			||||||
			c-0.8,0-1.4,0.3-1.8,0.8c-0.4,0.5-0.7,1.2-0.7,2v5.3h-3.1V133h3.1v1.9c0.7-1.3,2-2,3.7-2C74.6,132.8,75.5,133.2,76.2,134z"/>
 | 
					 | 
				
			||||||
		<path class="st1" d="M96,129.7h3.3l-4.7,14h-3.3l-2.9-10.1l-3,10.1h-3.2l-4.7-14h3.4l3,10.7l3-10.7H90l3.1,10.7L96,129.7z"/>
 | 
					 | 
				
			||||||
		<path class="st1" d="M103.3,128.7c0.3,0.3,0.5,0.7,0.5,1.2s-0.2,0.9-0.5,1.2c-0.3,0.3-0.7,0.5-1.2,0.5c-0.5,0-0.9-0.2-1.2-0.5
 | 
					 | 
				
			||||||
			c-0.3-0.3-0.5-0.7-0.5-1.2c0-0.5,0.2-0.9,0.5-1.2c0.3-0.3,0.7-0.5,1.2-0.5C102.6,128.2,103,128.3,103.3,128.7z M100.6,133h3.1
 | 
					 | 
				
			||||||
			v10.8h-3.1V133z"/>
 | 
					 | 
				
			||||||
		<path class="st1" d="M106.5,129.7h10.1l0,2.6h-6.9v3.4h6.3v2.6h-6.3v5.3h-3.2V129.7z"/>
 | 
					 | 
				
			||||||
		<path class="st1" d="M120.9,128.7c0.3,0.3,0.5,0.7,0.5,1.2s-0.2,0.9-0.5,1.2c-0.3,0.3-0.7,0.5-1.2,0.5c-0.5,0-0.9-0.2-1.2-0.5
 | 
					 | 
				
			||||||
			c-0.3-0.3-0.5-0.7-0.5-1.2c0-0.5,0.2-0.9,0.5-1.2c0.3-0.3,0.7-0.5,1.2-0.5C120.1,128.2,120.5,128.3,120.9,128.7z M118.1,133h3.1
 | 
					 | 
				
			||||||
			v10.8h-3.1V133z"/>
 | 
					 | 
				
			||||||
	</g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
</svg>
 | 
					 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 8.0 KiB  | 
@@ -1,165 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
 | 
					 | 
				
			||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 | 
					 | 
				
			||||||
	 viewBox="0 0 141.5 185.6" style="enable-background:new 0 0 141.5 185.6;" xml:space="preserve">
 | 
					 | 
				
			||||||
<style type="text/css">
 | 
					 | 
				
			||||||
	.st0{fill:#FFFFFF;}
 | 
					 | 
				
			||||||
	.st1{fill:#414141;}
 | 
					 | 
				
			||||||
	.st2{fill:#D3D3D3;}
 | 
					 | 
				
			||||||
	.st3{fill:#808386;}
 | 
					 | 
				
			||||||
	.st4{fill:#BCBEC0;}
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
	<g>
 | 
					 | 
				
			||||||
		<path class="st0" d="M120.7,183.9H21.5c-10.8,0-19.5-8.7-19.5-19.5V20.5c0-10.8,8.7-19.5,19.5-19.5h99.2
 | 
					 | 
				
			||||||
			c10.8,0,19.5,8.7,19.5,19.5v143.9C140.2,175.2,131.5,183.9,120.7,183.9z"/>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M46.3,166.2v-3.4h-1.2v-0.6h3.1v0.6H47v3.4H46.3z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M49,166.2v-4h2.7v0.6h-2v1h2v0.6h-2v1.1h2v0.6H49z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M52.6,166.2v-4h0.7v3.4h1.8v0.6H52.6z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M55.7,166.2v-4h2.7v0.6h-2v1h2v0.6h-2v1.1h2v0.6H55.7z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M59.1,164.2c0-1.2,0.9-2.1,2.1-2.1c0.8,0,1.3,0.4,1.6,0.9l-0.6,0.3c-0.2-0.3-0.6-0.6-1-0.6
 | 
					 | 
				
			||||||
						c-0.8,0-1.4,0.6-1.4,1.4c0,0.8,0.6,1.4,1.4,1.4c0.4,0,0.8-0.3,1-0.6l0.6,0.3c-0.3,0.5-0.8,0.9-1.6,0.9
 | 
					 | 
				
			||||||
						C60,166.3,59.1,165.5,59.1,164.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M63.2,164.2c0-1.2,0.8-2.1,2-2.1c1.2,0,2,0.9,2,2.1c0,1.2-0.8,2.1-2,2.1C64,166.3,63.2,165.4,63.2,164.2z
 | 
					 | 
				
			||||||
						 M66.5,164.2c0-0.8-0.5-1.4-1.3-1.4c-0.8,0-1.3,0.6-1.3,1.4c0,0.8,0.5,1.4,1.3,1.4C66,165.7,66.5,165,66.5,164.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M71.3,166.2v-3.1l-1.2,3.1h-0.3l-1.2-3.1v3.1h-0.7v-4h1l1.1,2.7l1.1-2.7h1v4H71.3z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M75.7,166.2v-4h0.7v4H75.7z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M80.4,166.2l-2.1-2.8v2.8h-0.7v-4h0.7l2,2.8v-2.8h0.7v4H80.4z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M82.3,166.2v-4H85v0.6h-2v1h2v0.6h-2v1.7H82.3z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M87.9,166.2l-0.9-1.5h-0.7v1.5h-0.7v-4h1.7c0.8,0,1.3,0.5,1.3,1.2c0,0.7-0.5,1.1-0.9,1.2l1,1.6H87.9z
 | 
					 | 
				
			||||||
						 M88,163.5c0-0.4-0.3-0.6-0.7-0.6h-1v1.3h1C87.7,164.1,88,163.9,88,163.5z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M92.4,166.2l-0.3-0.8h-1.8l-0.3,0.8h-0.8l1.6-4h0.9l1.6,4H92.4z M91.2,162.9l-0.7,1.9h1.4L91.2,162.9z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M95.8,166.2v-4h1.5c0.8,0,1.2,0.5,1.2,1.2c0,0.6-0.4,1.2-1.2,1.2h-1.2v1.7H95.8z M98.2,163.4
 | 
					 | 
				
			||||||
						c0-0.5-0.3-0.9-0.9-0.9h-1.1v1.7h1.1C97.8,164.3,98.2,163.9,98.2,163.4z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M101.5,166.2l-1.1-1.6h-0.9v1.6h-0.3v-4h1.5c0.7,0,1.2,0.4,1.2,1.2c0,0.7-0.5,1.1-1.1,1.1l1.2,1.7H101.5z
 | 
					 | 
				
			||||||
						 M101.6,163.4c0-0.5-0.4-0.9-0.9-0.9h-1.1v1.7h1.1C101.2,164.3,101.6,163.9,101.6,163.4z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M102.8,164.2c0-1.2,0.8-2.1,1.9-2.1c1.2,0,1.9,0.9,1.9,2.1c0,1.2-0.8,2.1-1.9,2.1
 | 
					 | 
				
			||||||
						C103.6,166.3,102.8,165.4,102.8,164.2z M106.3,164.2c0-1-0.6-1.7-1.6-1.7c-1,0-1.6,0.7-1.6,1.7c0,1,0.6,1.7,1.6,1.7
 | 
					 | 
				
			||||||
						C105.7,166,106.3,165.2,106.3,164.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M106.9,165.8l0.2-0.3c0.2,0.2,0.4,0.4,0.8,0.4c0.5,0,0.9-0.4,0.9-0.9v-2.8h0.3v2.8c0,0.8-0.5,1.2-1.2,1.2
 | 
					 | 
				
			||||||
						C107.5,166.3,107.2,166.1,106.9,165.8z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M110.4,166.2v-4h2.5v0.3h-2.2v1.5h2.1v0.3h-2.1v1.6h2.2v0.3H110.4z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M113.5,164.2c0-1.2,0.9-2.1,2-2.1c0.6,0,1.1,0.3,1.5,0.7l-0.3,0.2c-0.3-0.3-0.7-0.6-1.2-0.6
 | 
					 | 
				
			||||||
						c-0.9,0-1.7,0.7-1.7,1.7c0,1,0.7,1.7,1.7,1.7c0.5,0,0.9-0.2,1.2-0.6l0.3,0.2c-0.4,0.4-0.8,0.7-1.5,0.7
 | 
					 | 
				
			||||||
						C114.4,166.3,113.5,165.5,113.5,164.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M118.7,166.2v-3.7h-1.3v-0.3h2.9v0.3H119v3.7H118.7z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<polygon class="st1" points="26.3,163.8 31.6,158.5 36.9,163.8 37.7,163.8 31.6,157.6 25.5,163.8 				"/>
 | 
					 | 
				
			||||||
				<polygon class="st1" points="36.9,164.7 31.6,170 26.3,164.7 25.5,164.7 31.6,170.8 37.7,164.7 				"/>
 | 
					 | 
				
			||||||
				<polygon class="st1" points="31,163.8 36.3,158.5 41.6,163.8 42.5,163.8 36.3,157.6 30.2,163.8 				"/>
 | 
					 | 
				
			||||||
				<polygon class="st1" points="41.6,164.7 36.3,170 31,164.7 30.2,164.7 36.3,170.8 42.5,164.7 				"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<path class="st1" d="M33.2,100.7c-4.6,0-8.3,3.7-8.3,8.3s3.7,8.3,8.3,8.3s8.3-3.7,8.3-8.3S37.8,100.7,33.2,100.7z"/>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st2" d="M33.2,35.2c40.7,0,73.8,33.1,73.8,73.8c0,0.7,0,1.4,0,2.1c0,1.7,0.6,3.3,1.7,4.6c1.2,1.2,2.8,1.9,4.5,2
 | 
					 | 
				
			||||||
						l0.2,0c3.5,0,6.3-2.7,6.4-6.2c0-0.8,0-1.7,0-2.5c0-47.7-38.8-86.6-86.6-86.6c-0.8,0-1.7,0-2.5,0c-1.7,0-3.3,0.8-4.5,2
 | 
					 | 
				
			||||||
						c-1.2,1.2-1.8,2.9-1.7,4.6c0.1,3.5,3,6.3,6.6,6.2C31.8,35.2,32.5,35.2,33.2,35.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st3" d="M33.2,60.5c26.7,0,48.5,21.7,48.5,48.5c0,0.6,0,1.3,0,2c-0.1,1.7,0.5,3.3,1.7,4.6c1.2,1.3,2.7,2,4.4,2.1
 | 
					 | 
				
			||||||
						c1.7,0.1,3.3-0.5,4.6-1.7c1.2-1.2,2-2.7,2-4.4c0-0.9,0.1-1.8,0.1-2.6c0-33.8-27.5-61.2-61.2-61.2c-0.8,0-1.6,0-2.6,0.1
 | 
					 | 
				
			||||||
						c-1.7,0.1-3.3,0.8-4.4,2.1c-1.2,1.3-1.8,2.9-1.7,4.6s0.8,3.3,2.1,4.4c1.3,1.2,2.9,1.8,4.6,1.7C31.9,60.5,32.6,60.5,33.2,60.5z"
 | 
					 | 
				
			||||||
						/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st4" d="M33.2,86.7c12.3,0,22.3,10,22.3,22.3c0,0.5,0,1.1-0.1,1.8c-0.3,3.5,2.3,6.6,5.8,6.9
 | 
					 | 
				
			||||||
						c3.5,0.3,6.6-2.3,6.9-5.8c0.1-1,0.1-1.9,0.1-2.8c0-19.3-15.7-35.1-35.1-35.1c-0.9,0-1.8,0-2.8,0.1c-1.7,0.1-3.2,0.9-4.3,2.2
 | 
					 | 
				
			||||||
						c-1.1,1.3-1.6,2.9-1.5,4.6c0.1,1.7,0.9,3.2,2.2,4.3c1.3,1.1,2.9,1.6,4.6,1.5C32.1,86.7,32.7,86.7,33.2,86.7z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
	</g>
 | 
					 | 
				
			||||||
	<g>
 | 
					 | 
				
			||||||
		<path class="st1" d="M35.8,130.4c1.1,0.6,2.1,1.5,2.7,2.6c0.7,1.1,1,2.3,1,3.7s-0.3,2.6-1,3.7c-0.7,1.1-1.6,2-2.7,2.6
 | 
					 | 
				
			||||||
			c-1.1,0.6-2.4,1-3.8,1s-2.7-0.3-3.8-1c-1.1-0.6-2.1-1.5-2.7-2.6c-0.7-1.1-1-2.3-1-3.7c0-1.3,0.3-2.6,1-3.7c0.7-1.1,1.6-2,2.7-2.6
 | 
					 | 
				
			||||||
			c1.1-0.6,2.4-0.9,3.8-0.9C33.4,129.5,34.7,129.8,35.8,130.4z M29.9,132.9c-0.7,0.4-1.2,0.9-1.6,1.6s-0.6,1.4-0.6,2.2
 | 
					 | 
				
			||||||
			c0,0.8,0.2,1.6,0.6,2.3c0.4,0.7,0.9,1.2,1.6,1.6c0.7,0.4,1.4,0.6,2.1,0.6c0.8,0,1.5-0.2,2.1-0.6c0.6-0.4,1.2-0.9,1.5-1.6
 | 
					 | 
				
			||||||
			c0.4-0.7,0.6-1.4,0.6-2.3c0-0.8-0.2-1.6-0.6-2.2s-0.9-1.2-1.5-1.6c-0.6-0.4-1.4-0.6-2.1-0.6C31.3,132.3,30.6,132.5,29.9,132.9z"/>
 | 
					 | 
				
			||||||
		<path class="st1" d="M50.6,133.6c0.8,0.5,1.4,1.1,1.8,2c0.4,0.8,0.6,1.8,0.6,2.9c0,1.1-0.2,2-0.6,2.8c-0.4,0.8-1,1.5-1.8,1.9
 | 
					 | 
				
			||||||
			c-0.8,0.5-1.6,0.7-2.6,0.7c-0.7,0-1.4-0.1-2-0.4s-1.1-0.7-1.5-1.2v5.4h-3.1V133h3.1v1.6c0.4-0.5,0.9-1,1.4-1.2s1.2-0.4,2-0.4
 | 
					 | 
				
			||||||
			C48.9,132.9,49.8,133.1,50.6,133.6z M49.1,140.5c0.5-0.6,0.7-1.3,0.7-2.2c0-0.9-0.2-1.6-0.7-2.1c-0.5-0.6-1.1-0.8-1.9-0.8
 | 
					 | 
				
			||||||
			s-1.4,0.3-1.9,0.8c-0.5,0.6-0.8,1.3-0.8,2.1c0,0.9,0.2,1.6,0.8,2.2s1.1,0.8,1.9,0.8S48.6,141,49.1,140.5z"/>
 | 
					 | 
				
			||||||
		<path class="st1" d="M63.4,134.4c0.9,1,1.4,2.4,1.4,4.2c0,0.3,0,0.6,0,0.7H57c0.2,0.7,0.5,1.2,1,1.6c0.5,0.4,1.1,0.6,1.8,0.6
 | 
					 | 
				
			||||||
			c0.5,0,1-0.1,1.5-0.3s0.9-0.5,1.3-0.9l1.6,1.6c-0.5,0.6-1.2,1.1-2,1.4c-0.8,0.3-1.6,0.5-2.6,0.5c-1.1,0-2.1-0.2-3-0.7
 | 
					 | 
				
			||||||
			s-1.5-1.1-2-1.9c-0.5-0.8-0.7-1.8-0.7-2.9c0-1.1,0.2-2.1,0.7-2.9s1.1-1.5,2-1.9c0.8-0.5,1.8-0.7,2.9-0.7
 | 
					 | 
				
			||||||
			C61.2,132.9,62.5,133.4,63.4,134.4z M61.8,137.5c0-0.7-0.3-1.3-0.7-1.7s-1-0.6-1.7-0.6c-0.7,0-1.2,0.2-1.7,0.6
 | 
					 | 
				
			||||||
			c-0.4,0.4-0.7,1-0.9,1.7H61.8z"/>
 | 
					 | 
				
			||||||
		<path class="st1" d="M76.2,134c0.7,0.7,1.1,1.7,1.1,3v6.8h-3.1v-5.9c0-0.7-0.2-1.2-0.6-1.6s-0.9-0.6-1.5-0.6
 | 
					 | 
				
			||||||
			c-0.8,0-1.4,0.3-1.8,0.8c-0.4,0.5-0.7,1.2-0.7,2v5.3h-3.1V133h3.1v1.9c0.7-1.3,2-2,3.7-2C74.6,132.8,75.5,133.2,76.2,134z"/>
 | 
					 | 
				
			||||||
		<path class="st1" d="M96,129.7h3.3l-4.7,14h-3.3l-2.9-10.1l-3,10.1h-3.2l-4.7-14h3.4l3,10.7l3-10.7H90l3.1,10.7L96,129.7z"/>
 | 
					 | 
				
			||||||
		<path class="st1" d="M103.3,128.7c0.3,0.3,0.5,0.7,0.5,1.2s-0.2,0.9-0.5,1.2c-0.3,0.3-0.7,0.5-1.2,0.5c-0.5,0-0.9-0.2-1.2-0.5
 | 
					 | 
				
			||||||
			c-0.3-0.3-0.5-0.7-0.5-1.2c0-0.5,0.2-0.9,0.5-1.2c0.3-0.3,0.7-0.5,1.2-0.5C102.6,128.2,103,128.3,103.3,128.7z M100.6,133h3.1
 | 
					 | 
				
			||||||
			v10.8h-3.1V133z"/>
 | 
					 | 
				
			||||||
		<path class="st1" d="M106.5,129.7h10.1l0,2.6h-6.9v3.4h6.3v2.6h-6.3v5.3h-3.2V129.7z"/>
 | 
					 | 
				
			||||||
		<path class="st1" d="M120.9,128.7c0.3,0.3,0.5,0.7,0.5,1.2s-0.2,0.9-0.5,1.2c-0.3,0.3-0.7,0.5-1.2,0.5c-0.5,0-0.9-0.2-1.2-0.5
 | 
					 | 
				
			||||||
			c-0.3-0.3-0.5-0.7-0.5-1.2c0-0.5,0.2-0.9,0.5-1.2c0.3-0.3,0.7-0.5,1.2-0.5C120.1,128.2,120.5,128.3,120.9,128.7z M118.1,133h3.1
 | 
					 | 
				
			||||||
			v10.8h-3.1V133z"/>
 | 
					 | 
				
			||||||
	</g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
</svg>
 | 
					 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 8.0 KiB  | 
@@ -1,171 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
 | 
					 | 
				
			||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 | 
					 | 
				
			||||||
	 viewBox="0 0 141.5 185.6" style="enable-background:new 0 0 141.5 185.6;" xml:space="preserve">
 | 
					 | 
				
			||||||
<style type="text/css">
 | 
					 | 
				
			||||||
	.st0{fill:#FFFFFF;}
 | 
					 | 
				
			||||||
	.st1{fill:#D3D3D3;}
 | 
					 | 
				
			||||||
	.st2{fill:#808386;}
 | 
					 | 
				
			||||||
	.st3{fill:#BCBEC0;}
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
	<g>
 | 
					 | 
				
			||||||
		<path d="M120.7,183.9H21.5c-10.8,0-19.5-8.7-19.5-19.5V20.5c0-10.8,8.7-19.5,19.5-19.5h99.2c10.8,0,19.5,8.7,19.5,19.5v143.9
 | 
					 | 
				
			||||||
			C140.2,175.2,131.5,183.9,120.7,183.9z"/>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M46.3,166.2v-3.4h-1.2v-0.6h3.1v0.6H47v3.4H46.3z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M49,166.2v-4h2.7v0.6h-2v1h2v0.6h-2v1.1h2v0.6H49z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M52.6,166.2v-4h0.7v3.4h1.8v0.6H52.6z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M55.7,166.2v-4h2.7v0.6h-2v1h2v0.6h-2v1.1h2v0.6H55.7z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M59.1,164.2c0-1.2,0.9-2.1,2.1-2.1c0.8,0,1.3,0.4,1.6,0.9l-0.6,0.3c-0.2-0.3-0.6-0.6-1-0.6
 | 
					 | 
				
			||||||
							c-0.8,0-1.4,0.6-1.4,1.4c0,0.8,0.6,1.4,1.4,1.4c0.4,0,0.8-0.3,1-0.6l0.6,0.3c-0.3,0.5-0.8,0.9-1.6,0.9
 | 
					 | 
				
			||||||
							C60,166.3,59.1,165.5,59.1,164.2z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M63.2,164.2c0-1.2,0.8-2.1,2-2.1c1.2,0,2,0.9,2,2.1c0,1.2-0.8,2.1-2,2.1C64,166.3,63.2,165.4,63.2,164.2z
 | 
					 | 
				
			||||||
							 M66.5,164.2c0-0.8-0.5-1.4-1.3-1.4c-0.8,0-1.3,0.6-1.3,1.4c0,0.8,0.5,1.4,1.3,1.4C66,165.7,66.5,165,66.5,164.2z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M71.3,166.2v-3.1l-1.2,3.1h-0.3l-1.2-3.1v3.1h-0.7v-4h1l1.1,2.7l1.1-2.7h1v4H71.3z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M75.7,166.2v-4h0.7v4H75.7z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M80.4,166.2l-2.1-2.8v2.8h-0.7v-4h0.7l2,2.8v-2.8h0.7v4H80.4z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M82.3,166.2v-4H85v0.6h-2v1h2v0.6h-2v1.7H82.3z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M87.9,166.2l-0.9-1.5h-0.7v1.5h-0.7v-4h1.7c0.8,0,1.3,0.5,1.3,1.2c0,0.7-0.5,1.1-0.9,1.2l1,1.6H87.9z
 | 
					 | 
				
			||||||
							 M88,163.5c0-0.4-0.3-0.6-0.7-0.6h-1v1.3h1C87.7,164.1,88,163.9,88,163.5z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M92.4,166.2l-0.3-0.8h-1.8l-0.3,0.8h-0.8l1.6-4h0.9l1.6,4H92.4z M91.2,162.9l-0.7,1.9h1.4L91.2,162.9z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M95.8,166.2v-4h1.5c0.8,0,1.2,0.5,1.2,1.2c0,0.6-0.4,1.2-1.2,1.2h-1.2v1.7H95.8z M98.2,163.4
 | 
					 | 
				
			||||||
							c0-0.5-0.3-0.9-0.9-0.9h-1.1v1.7h1.1C97.8,164.3,98.2,163.9,98.2,163.4z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M101.5,166.2l-1.1-1.6h-0.9v1.6h-0.3v-4h1.5c0.7,0,1.2,0.4,1.2,1.2c0,0.7-0.5,1.1-1.1,1.1l1.2,1.7H101.5z
 | 
					 | 
				
			||||||
							 M101.6,163.4c0-0.5-0.4-0.9-0.9-0.9h-1.1v1.7h1.1C101.2,164.3,101.6,163.9,101.6,163.4z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M102.8,164.2c0-1.2,0.8-2.1,1.9-2.1c1.2,0,1.9,0.9,1.9,2.1c0,1.2-0.8,2.1-1.9,2.1
 | 
					 | 
				
			||||||
							C103.6,166.3,102.8,165.4,102.8,164.2z M106.3,164.2c0-1-0.6-1.7-1.6-1.7c-1,0-1.6,0.7-1.6,1.7c0,1,0.6,1.7,1.6,1.7
 | 
					 | 
				
			||||||
							C105.7,166,106.3,165.2,106.3,164.2z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M106.9,165.8l0.2-0.3c0.2,0.2,0.4,0.4,0.8,0.4c0.5,0,0.9-0.4,0.9-0.9v-2.8h0.3v2.8c0,0.8-0.5,1.2-1.2,1.2
 | 
					 | 
				
			||||||
							C107.5,166.3,107.2,166.1,106.9,165.8z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M110.4,166.2v-4h2.5v0.3h-2.2v1.5h2.1v0.3h-2.1v1.6h2.2v0.3H110.4z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M113.5,164.2c0-1.2,0.9-2.1,2-2.1c0.6,0,1.1,0.3,1.5,0.7l-0.3,0.2c-0.3-0.3-0.7-0.6-1.2-0.6
 | 
					 | 
				
			||||||
							c-0.9,0-1.7,0.7-1.7,1.7c0,1,0.7,1.7,1.7,1.7c0.5,0,0.9-0.2,1.2-0.6l0.3,0.2c-0.4,0.4-0.8,0.7-1.5,0.7
 | 
					 | 
				
			||||||
							C114.4,166.3,113.5,165.5,113.5,164.2z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
					<g>
 | 
					 | 
				
			||||||
						<path class="st0" d="M118.7,166.2v-3.7h-1.3v-0.3h2.9v0.3H119v3.7H118.7z"/>
 | 
					 | 
				
			||||||
					</g>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<polygon class="st0" points="26.3,163.8 31.6,158.5 36.9,163.8 37.7,163.8 31.6,157.6 25.5,163.8 					"/>
 | 
					 | 
				
			||||||
					<polygon class="st0" points="36.9,164.7 31.6,170 26.3,164.7 25.5,164.7 31.6,170.8 37.7,164.7 					"/>
 | 
					 | 
				
			||||||
					<polygon class="st0" points="31,163.8 36.3,158.5 41.6,163.8 42.5,163.8 36.3,157.6 30.2,163.8 					"/>
 | 
					 | 
				
			||||||
					<polygon class="st0" points="41.6,164.7 36.3,170 31,164.7 30.2,164.7 36.3,170.8 42.5,164.7 					"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M33.2,100.7c-4.6,0-8.3,3.7-8.3,8.3s3.7,8.3,8.3,8.3s8.3-3.7,8.3-8.3S37.8,100.7,33.2,100.7z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st1" d="M33.2,35.2c40.7,0,73.8,33.1,73.8,73.8c0,0.7,0,1.4,0,2.1c0,1.7,0.6,3.3,1.7,4.6c1.2,1.2,2.8,1.9,4.5,2
 | 
					 | 
				
			||||||
						l0.2,0c3.5,0,6.3-2.7,6.4-6.2c0-0.8,0-1.7,0-2.5c0-47.7-38.8-86.6-86.6-86.6c-0.8,0-1.7,0-2.5,0c-1.7,0-3.3,0.8-4.5,2
 | 
					 | 
				
			||||||
						c-1.2,1.2-1.8,2.9-1.7,4.6c0.1,3.5,3,6.3,6.6,6.2C31.8,35.2,32.5,35.2,33.2,35.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st2" d="M33.2,60.5c26.7,0,48.5,21.7,48.5,48.5c0,0.6,0,1.3,0,2c-0.1,1.7,0.5,3.3,1.7,4.6c1.2,1.3,2.7,2,4.4,2.1
 | 
					 | 
				
			||||||
						c1.7,0.1,3.3-0.5,4.6-1.7c1.2-1.2,2-2.7,2-4.4c0-0.9,0.1-1.8,0.1-2.6c0-33.8-27.5-61.2-61.2-61.2c-0.8,0-1.6,0-2.6,0.1
 | 
					 | 
				
			||||||
						c-1.7,0.1-3.3,0.8-4.4,2.1c-1.2,1.3-1.8,2.9-1.7,4.6s0.8,3.3,2.1,4.4c1.3,1.2,2.9,1.8,4.6,1.7C31.9,60.5,32.6,60.5,33.2,60.5z"
 | 
					 | 
				
			||||||
						/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st3" d="M33.2,86.7c12.3,0,22.3,10,22.3,22.3c0,0.5,0,1.1-0.1,1.8c-0.3,3.5,2.3,6.6,5.8,6.9
 | 
					 | 
				
			||||||
						c3.5,0.3,6.6-2.3,6.9-5.8c0.1-1,0.1-1.9,0.1-2.8c0-19.3-15.7-35.1-35.1-35.1c-0.9,0-1.8,0-2.8,0.1c-1.7,0.1-3.2,0.9-4.3,2.2
 | 
					 | 
				
			||||||
						c-1.1,1.3-1.6,2.9-1.5,4.6c0.1,1.7,0.9,3.2,2.2,4.3c1.3,1.1,2.9,1.6,4.6,1.5C32.1,86.7,32.7,86.7,33.2,86.7z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
	</g>
 | 
					 | 
				
			||||||
	<g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<path class="st0" d="M35.8,130.4c1.1,0.6,2.1,1.5,2.7,2.6c0.7,1.1,1,2.3,1,3.7s-0.3,2.6-1,3.7c-0.7,1.1-1.6,2-2.7,2.6
 | 
					 | 
				
			||||||
				c-1.1,0.6-2.4,1-3.8,1s-2.7-0.3-3.8-1c-1.1-0.6-2.1-1.5-2.7-2.6c-0.7-1.1-1-2.3-1-3.7c0-1.3,0.3-2.6,1-3.7c0.7-1.1,1.6-2,2.7-2.6
 | 
					 | 
				
			||||||
				c1.1-0.6,2.4-0.9,3.8-0.9C33.4,129.5,34.7,129.8,35.8,130.4z M29.9,132.9c-0.7,0.4-1.2,0.9-1.6,1.6s-0.6,1.4-0.6,2.2
 | 
					 | 
				
			||||||
				c0,0.8,0.2,1.6,0.6,2.3c0.4,0.7,0.9,1.2,1.6,1.6c0.7,0.4,1.4,0.6,2.1,0.6c0.8,0,1.5-0.2,2.1-0.6c0.6-0.4,1.2-0.9,1.5-1.6
 | 
					 | 
				
			||||||
				c0.4-0.7,0.6-1.4,0.6-2.3c0-0.8-0.2-1.6-0.6-2.2s-0.9-1.2-1.5-1.6c-0.6-0.4-1.4-0.6-2.1-0.6C31.3,132.3,30.6,132.5,29.9,132.9z"
 | 
					 | 
				
			||||||
				/>
 | 
					 | 
				
			||||||
			<path class="st0" d="M50.6,133.6c0.8,0.5,1.4,1.1,1.8,2c0.4,0.8,0.6,1.8,0.6,2.9c0,1.1-0.2,2-0.6,2.8c-0.4,0.8-1,1.5-1.8,1.9
 | 
					 | 
				
			||||||
				c-0.8,0.5-1.6,0.7-2.6,0.7c-0.7,0-1.4-0.1-2-0.4s-1.1-0.7-1.5-1.2v5.4h-3.1V133h3.1v1.6c0.4-0.5,0.9-1,1.4-1.2s1.2-0.4,2-0.4
 | 
					 | 
				
			||||||
				C48.9,132.9,49.8,133.1,50.6,133.6z M49.1,140.5c0.5-0.6,0.7-1.3,0.7-2.2c0-0.9-0.2-1.6-0.7-2.1c-0.5-0.6-1.1-0.8-1.9-0.8
 | 
					 | 
				
			||||||
				s-1.4,0.3-1.9,0.8c-0.5,0.6-0.8,1.3-0.8,2.1c0,0.9,0.2,1.6,0.8,2.2s1.1,0.8,1.9,0.8S48.6,141,49.1,140.5z"/>
 | 
					 | 
				
			||||||
			<path class="st0" d="M63.4,134.4c0.9,1,1.4,2.4,1.4,4.2c0,0.3,0,0.6,0,0.7H57c0.2,0.7,0.5,1.2,1,1.6c0.5,0.4,1.1,0.6,1.8,0.6
 | 
					 | 
				
			||||||
				c0.5,0,1-0.1,1.5-0.3s0.9-0.5,1.3-0.9l1.6,1.6c-0.5,0.6-1.2,1.1-2,1.4c-0.8,0.3-1.6,0.5-2.6,0.5c-1.1,0-2.1-0.2-3-0.7
 | 
					 | 
				
			||||||
				s-1.5-1.1-2-1.9c-0.5-0.8-0.7-1.8-0.7-2.9c0-1.1,0.2-2.1,0.7-2.9s1.1-1.5,2-1.9c0.8-0.5,1.8-0.7,2.9-0.7
 | 
					 | 
				
			||||||
				C61.2,132.9,62.5,133.4,63.4,134.4z M61.8,137.5c0-0.7-0.3-1.3-0.7-1.7s-1-0.6-1.7-0.6c-0.7,0-1.2,0.2-1.7,0.6
 | 
					 | 
				
			||||||
				c-0.4,0.4-0.7,1-0.9,1.7H61.8z"/>
 | 
					 | 
				
			||||||
			<path class="st0" d="M76.2,134c0.7,0.7,1.1,1.7,1.1,3v6.8h-3.1v-5.9c0-0.7-0.2-1.2-0.6-1.6s-0.9-0.6-1.5-0.6
 | 
					 | 
				
			||||||
				c-0.8,0-1.4,0.3-1.8,0.8c-0.4,0.5-0.7,1.2-0.7,2v5.3h-3.1V133h3.1v1.9c0.7-1.3,2-2,3.7-2C74.6,132.8,75.5,133.2,76.2,134z"/>
 | 
					 | 
				
			||||||
			<path class="st0" d="M96,129.7h3.3l-4.7,14h-3.3l-2.9-10.1l-3,10.1h-3.2l-4.7-14h3.4l3,10.7l3-10.7H90l3.1,10.7L96,129.7z"/>
 | 
					 | 
				
			||||||
			<path class="st0" d="M103.3,128.7c0.3,0.3,0.5,0.7,0.5,1.2s-0.2,0.9-0.5,1.2c-0.3,0.3-0.7,0.5-1.2,0.5c-0.5,0-0.9-0.2-1.2-0.5
 | 
					 | 
				
			||||||
				c-0.3-0.3-0.5-0.7-0.5-1.2c0-0.5,0.2-0.9,0.5-1.2c0.3-0.3,0.7-0.5,1.2-0.5C102.6,128.2,103,128.3,103.3,128.7z M100.6,133h3.1
 | 
					 | 
				
			||||||
				v10.8h-3.1V133z"/>
 | 
					 | 
				
			||||||
			<path class="st0" d="M106.5,129.7h10.1l0,2.6h-6.9v3.4h6.3v2.6h-6.3v5.3h-3.2V129.7z"/>
 | 
					 | 
				
			||||||
			<path class="st0" d="M120.9,128.7c0.3,0.3,0.5,0.7,0.5,1.2s-0.2,0.9-0.5,1.2c-0.3,0.3-0.7,0.5-1.2,0.5c-0.5,0-0.9-0.2-1.2-0.5
 | 
					 | 
				
			||||||
				c-0.3-0.3-0.5-0.7-0.5-1.2c0-0.5,0.2-0.9,0.5-1.2c0.3-0.3,0.7-0.5,1.2-0.5C120.1,128.2,120.5,128.3,120.9,128.7z M118.1,133h3.1
 | 
					 | 
				
			||||||
				v10.8h-3.1V133z"/>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
	</g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
</svg>
 | 
					 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 8.2 KiB  | 
@@ -1,161 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
 | 
					 | 
				
			||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 | 
					 | 
				
			||||||
	 viewBox="0 0 141.5 185.6" style="enable-background:new 0 0 141.5 185.6;" xml:space="preserve">
 | 
					 | 
				
			||||||
<style type="text/css">
 | 
					 | 
				
			||||||
	.st0{fill:#FFFFFF;}
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
	<g>
 | 
					 | 
				
			||||||
		<path d="M120.7,183.9H21.5c-10.8,0-19.5-8.7-19.5-19.5V20.5c0-10.8,8.7-19.5,19.5-19.5h99.2c10.8,0,19.5,8.7,19.5,19.5v143.9
 | 
					 | 
				
			||||||
			C140.2,175.2,131.5,183.9,120.7,183.9z"/>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M46.3,166.2v-3.4h-1.2v-0.6h3.1v0.6H47v3.4H46.3z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M49,166.2v-4h2.7v0.6h-2v1h2v0.6h-2v1.1h2v0.6H49z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M52.6,166.2v-4h0.7v3.4h1.8v0.6H52.6z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M55.7,166.2v-4h2.7v0.6h-2v1h2v0.6h-2v1.1h2v0.6H55.7z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M59.1,164.2c0-1.2,0.9-2.1,2.1-2.1c0.8,0,1.3,0.4,1.6,0.9l-0.6,0.3c-0.2-0.3-0.6-0.6-1-0.6
 | 
					 | 
				
			||||||
						c-0.8,0-1.4,0.6-1.4,1.4c0,0.8,0.6,1.4,1.4,1.4c0.4,0,0.8-0.3,1-0.6l0.6,0.3c-0.3,0.5-0.8,0.9-1.6,0.9
 | 
					 | 
				
			||||||
						C60,166.3,59.1,165.5,59.1,164.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M63.2,164.2c0-1.2,0.8-2.1,2-2.1c1.2,0,2,0.9,2,2.1c0,1.2-0.8,2.1-2,2.1C64,166.3,63.2,165.4,63.2,164.2z
 | 
					 | 
				
			||||||
						 M66.5,164.2c0-0.8-0.5-1.4-1.3-1.4c-0.8,0-1.3,0.6-1.3,1.4c0,0.8,0.5,1.4,1.3,1.4C66,165.7,66.5,165,66.5,164.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M71.3,166.2v-3.1l-1.2,3.1h-0.3l-1.2-3.1v3.1h-0.7v-4h1l1.1,2.7l1.1-2.7h1v4H71.3z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M75.7,166.2v-4h0.7v4H75.7z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M80.4,166.2l-2.1-2.8v2.8h-0.7v-4h0.7l2,2.8v-2.8h0.7v4H80.4z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M82.3,166.2v-4H85v0.6h-2v1h2v0.6h-2v1.7H82.3z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M87.9,166.2l-0.9-1.5h-0.7v1.5h-0.7v-4h1.7c0.8,0,1.3,0.5,1.3,1.2c0,0.7-0.5,1.1-0.9,1.2l1,1.6H87.9z
 | 
					 | 
				
			||||||
						 M88,163.5c0-0.4-0.3-0.6-0.7-0.6h-1v1.3h1C87.7,164.1,88,163.9,88,163.5z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M92.4,166.2l-0.3-0.8h-1.8l-0.3,0.8h-0.8l1.6-4h0.9l1.6,4H92.4z M91.2,162.9l-0.7,1.9h1.4L91.2,162.9z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M95.8,166.2v-4h1.5c0.8,0,1.2,0.5,1.2,1.2c0,0.6-0.4,1.2-1.2,1.2h-1.2v1.7H95.8z M98.2,163.4
 | 
					 | 
				
			||||||
						c0-0.5-0.3-0.9-0.9-0.9h-1.1v1.7h1.1C97.8,164.3,98.2,163.9,98.2,163.4z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M101.5,166.2l-1.1-1.6h-0.9v1.6h-0.3v-4h1.5c0.7,0,1.2,0.4,1.2,1.2c0,0.7-0.5,1.1-1.1,1.1l1.2,1.7H101.5z
 | 
					 | 
				
			||||||
						 M101.6,163.4c0-0.5-0.4-0.9-0.9-0.9h-1.1v1.7h1.1C101.2,164.3,101.6,163.9,101.6,163.4z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M102.8,164.2c0-1.2,0.8-2.1,1.9-2.1c1.2,0,1.9,0.9,1.9,2.1c0,1.2-0.8,2.1-1.9,2.1
 | 
					 | 
				
			||||||
						C103.6,166.3,102.8,165.4,102.8,164.2z M106.3,164.2c0-1-0.6-1.7-1.6-1.7c-1,0-1.6,0.7-1.6,1.7c0,1,0.6,1.7,1.6,1.7
 | 
					 | 
				
			||||||
						C105.7,166,106.3,165.2,106.3,164.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M106.9,165.8l0.2-0.3c0.2,0.2,0.4,0.4,0.8,0.4c0.5,0,0.9-0.4,0.9-0.9v-2.8h0.3v2.8c0,0.8-0.5,1.2-1.2,1.2
 | 
					 | 
				
			||||||
						C107.5,166.3,107.2,166.1,106.9,165.8z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M110.4,166.2v-4h2.5v0.3h-2.2v1.5h2.1v0.3h-2.1v1.6h2.2v0.3H110.4z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M113.5,164.2c0-1.2,0.9-2.1,2-2.1c0.6,0,1.1,0.3,1.5,0.7l-0.3,0.2c-0.3-0.3-0.7-0.6-1.2-0.6
 | 
					 | 
				
			||||||
						c-0.9,0-1.7,0.7-1.7,1.7c0,1,0.7,1.7,1.7,1.7c0.5,0,0.9-0.2,1.2-0.6l0.3,0.2c-0.4,0.4-0.8,0.7-1.5,0.7
 | 
					 | 
				
			||||||
						C114.4,166.3,113.5,165.5,113.5,164.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M118.7,166.2v-3.7h-1.3v-0.3h2.9v0.3H119v3.7H118.7z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<polygon class="st0" points="26.3,163.8 31.6,158.5 36.9,163.8 37.7,163.8 31.6,157.6 25.5,163.8 				"/>
 | 
					 | 
				
			||||||
				<polygon class="st0" points="36.9,164.7 31.6,170 26.3,164.7 25.5,164.7 31.6,170.8 37.7,164.7 				"/>
 | 
					 | 
				
			||||||
				<polygon class="st0" points="31,163.8 36.3,158.5 41.6,163.8 42.5,163.8 36.3,157.6 30.2,163.8 				"/>
 | 
					 | 
				
			||||||
				<polygon class="st0" points="41.6,164.7 36.3,170 31,164.7 30.2,164.7 36.3,170.8 42.5,164.7 				"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<path class="st0" d="M33.2,100.7c-4.6,0-8.3,3.7-8.3,8.3s3.7,8.3,8.3,8.3s8.3-3.7,8.3-8.3S37.8,100.7,33.2,100.7z"/>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M33.2,35.2c40.7,0,73.8,33.1,73.8,73.8c0,0.7,0,1.4,0,2.1c0,1.7,0.6,3.3,1.7,4.6c1.2,1.2,2.8,1.9,4.5,2
 | 
					 | 
				
			||||||
						l0.2,0c3.5,0,6.3-2.7,6.4-6.2c0-0.8,0-1.7,0-2.5c0-47.7-38.8-86.6-86.6-86.6c-0.8,0-1.7,0-2.5,0c-1.7,0-3.3,0.8-4.5,2
 | 
					 | 
				
			||||||
						c-1.2,1.2-1.8,2.9-1.7,4.6c0.1,3.5,3,6.3,6.6,6.2C31.8,35.2,32.5,35.2,33.2,35.2z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M33.2,60.5c26.7,0,48.5,21.7,48.5,48.5c0,0.6,0,1.3,0,2c-0.1,1.7,0.5,3.3,1.7,4.6c1.2,1.3,2.7,2,4.4,2.1
 | 
					 | 
				
			||||||
						c1.7,0.1,3.3-0.5,4.6-1.7c1.2-1.2,2-2.7,2-4.4c0-0.9,0.1-1.8,0.1-2.6c0-33.8-27.5-61.2-61.2-61.2c-0.8,0-1.6,0-2.6,0.1
 | 
					 | 
				
			||||||
						c-1.7,0.1-3.3,0.8-4.4,2.1c-1.2,1.3-1.8,2.9-1.7,4.6s0.8,3.3,2.1,4.4c1.3,1.2,2.9,1.8,4.6,1.7C31.9,60.5,32.6,60.5,33.2,60.5z"
 | 
					 | 
				
			||||||
						/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<g>
 | 
					 | 
				
			||||||
					<path class="st0" d="M33.2,86.7c12.3,0,22.3,10,22.3,22.3c0,0.5,0,1.1-0.1,1.8c-0.3,3.5,2.3,6.6,5.8,6.9
 | 
					 | 
				
			||||||
						c3.5,0.3,6.6-2.3,6.9-5.8c0.1-1,0.1-1.9,0.1-2.8c0-19.3-15.7-35.1-35.1-35.1c-0.9,0-1.8,0-2.8,0.1c-1.7,0.1-3.2,0.9-4.3,2.2
 | 
					 | 
				
			||||||
						c-1.1,1.3-1.6,2.9-1.5,4.6c0.1,1.7,0.9,3.2,2.2,4.3c1.3,1.1,2.9,1.6,4.6,1.5C32.1,86.7,32.7,86.7,33.2,86.7z"/>
 | 
					 | 
				
			||||||
				</g>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
	</g>
 | 
					 | 
				
			||||||
	<g>
 | 
					 | 
				
			||||||
		<path class="st0" d="M35.8,130.4c1.1,0.6,2.1,1.5,2.7,2.6c0.7,1.1,1,2.3,1,3.7s-0.3,2.6-1,3.7c-0.7,1.1-1.6,2-2.7,2.6
 | 
					 | 
				
			||||||
			c-1.1,0.6-2.4,1-3.8,1s-2.7-0.3-3.8-1c-1.1-0.6-2.1-1.5-2.7-2.6c-0.7-1.1-1-2.3-1-3.7c0-1.3,0.3-2.6,1-3.7c0.7-1.1,1.6-2,2.7-2.6
 | 
					 | 
				
			||||||
			c1.1-0.6,2.4-0.9,3.8-0.9C33.4,129.5,34.7,129.8,35.8,130.4z M29.9,132.9c-0.7,0.4-1.2,0.9-1.6,1.6s-0.6,1.4-0.6,2.2
 | 
					 | 
				
			||||||
			c0,0.8,0.2,1.6,0.6,2.3c0.4,0.7,0.9,1.2,1.6,1.6c0.7,0.4,1.4,0.6,2.1,0.6c0.8,0,1.5-0.2,2.1-0.6c0.6-0.4,1.2-0.9,1.5-1.6
 | 
					 | 
				
			||||||
			c0.4-0.7,0.6-1.4,0.6-2.3c0-0.8-0.2-1.6-0.6-2.2s-0.9-1.2-1.5-1.6c-0.6-0.4-1.4-0.6-2.1-0.6C31.3,132.3,30.6,132.5,29.9,132.9z"/>
 | 
					 | 
				
			||||||
		<path class="st0" d="M50.6,133.6c0.8,0.5,1.4,1.1,1.8,2c0.4,0.8,0.6,1.8,0.6,2.9c0,1.1-0.2,2-0.6,2.8c-0.4,0.8-1,1.5-1.8,1.9
 | 
					 | 
				
			||||||
			c-0.8,0.5-1.6,0.7-2.6,0.7c-0.7,0-1.4-0.1-2-0.4s-1.1-0.7-1.5-1.2v5.4h-3.1V133h3.1v1.6c0.4-0.5,0.9-1,1.4-1.2s1.2-0.4,2-0.4
 | 
					 | 
				
			||||||
			C48.9,132.9,49.8,133.1,50.6,133.6z M49.1,140.5c0.5-0.6,0.7-1.3,0.7-2.2c0-0.9-0.2-1.6-0.7-2.1c-0.5-0.6-1.1-0.8-1.9-0.8
 | 
					 | 
				
			||||||
			s-1.4,0.3-1.9,0.8c-0.5,0.6-0.8,1.3-0.8,2.1c0,0.9,0.2,1.6,0.8,2.2s1.1,0.8,1.9,0.8S48.6,141,49.1,140.5z"/>
 | 
					 | 
				
			||||||
		<path class="st0" d="M63.4,134.4c0.9,1,1.4,2.4,1.4,4.2c0,0.3,0,0.6,0,0.7H57c0.2,0.7,0.5,1.2,1,1.6c0.5,0.4,1.1,0.6,1.8,0.6
 | 
					 | 
				
			||||||
			c0.5,0,1-0.1,1.5-0.3s0.9-0.5,1.3-0.9l1.6,1.6c-0.5,0.6-1.2,1.1-2,1.4c-0.8,0.3-1.6,0.5-2.6,0.5c-1.1,0-2.1-0.2-3-0.7
 | 
					 | 
				
			||||||
			s-1.5-1.1-2-1.9c-0.5-0.8-0.7-1.8-0.7-2.9c0-1.1,0.2-2.1,0.7-2.9s1.1-1.5,2-1.9c0.8-0.5,1.8-0.7,2.9-0.7
 | 
					 | 
				
			||||||
			C61.2,132.9,62.5,133.4,63.4,134.4z M61.8,137.5c0-0.7-0.3-1.3-0.7-1.7s-1-0.6-1.7-0.6c-0.7,0-1.2,0.2-1.7,0.6
 | 
					 | 
				
			||||||
			c-0.4,0.4-0.7,1-0.9,1.7H61.8z"/>
 | 
					 | 
				
			||||||
		<path class="st0" d="M76.2,134c0.7,0.7,1.1,1.7,1.1,3v6.8h-3.1v-5.9c0-0.7-0.2-1.2-0.6-1.6s-0.9-0.6-1.5-0.6
 | 
					 | 
				
			||||||
			c-0.8,0-1.4,0.3-1.8,0.8c-0.4,0.5-0.7,1.2-0.7,2v5.3h-3.1V133h3.1v1.9c0.7-1.3,2-2,3.7-2C74.6,132.8,75.5,133.2,76.2,134z"/>
 | 
					 | 
				
			||||||
		<path class="st0" d="M96,129.7h3.3l-4.7,14h-3.3l-2.9-10.1l-3,10.1h-3.2l-4.7-14h3.4l3,10.7l3-10.7H90l3.1,10.7L96,129.7z"/>
 | 
					 | 
				
			||||||
		<path class="st0" d="M103.3,128.7c0.3,0.3,0.5,0.7,0.5,1.2s-0.2,0.9-0.5,1.2c-0.3,0.3-0.7,0.5-1.2,0.5c-0.5,0-0.9-0.2-1.2-0.5
 | 
					 | 
				
			||||||
			c-0.3-0.3-0.5-0.7-0.5-1.2c0-0.5,0.2-0.9,0.5-1.2c0.3-0.3,0.7-0.5,1.2-0.5C102.6,128.2,103,128.3,103.3,128.7z M100.6,133h3.1
 | 
					 | 
				
			||||||
			v10.8h-3.1V133z"/>
 | 
					 | 
				
			||||||
		<path class="st0" d="M106.5,129.7h10.1l0,2.6h-6.9v3.4h6.3v2.6h-6.3v5.3h-3.2V129.7z"/>
 | 
					 | 
				
			||||||
		<path class="st0" d="M120.9,128.7c0.3,0.3,0.5,0.7,0.5,1.2s-0.2,0.9-0.5,1.2c-0.3,0.3-0.7,0.5-1.2,0.5c-0.5,0-0.9-0.2-1.2-0.5
 | 
					 | 
				
			||||||
			c-0.3-0.3-0.5-0.7-0.5-1.2c0-0.5,0.2-0.9,0.5-1.2c0.3-0.3,0.7-0.5,1.2-0.5C120.1,128.2,120.5,128.3,120.9,128.7z M118.1,133h3.1
 | 
					 | 
				
			||||||
			v10.8h-3.1V133z"/>
 | 
					 | 
				
			||||||
	</g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
</svg>
 | 
					 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 7.9 KiB  | 
@@ -1,130 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
 | 
					 | 
				
			||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 | 
					 | 
				
			||||||
	 viewBox="0 0 251.2 114.2" style="enable-background:new 0 0 251.2 114.2;" xml:space="preserve">
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
	<path d="M219.6,43.3C219.5,43.3,219.5,43.3,219.6,43.3c-1.3,0-2.2-1-2.2-2.2c0-0.2,0-0.4,0-0.6c0-11.9-9.7-21.6-21.6-21.6
 | 
					 | 
				
			||||||
		c-0.2,0-0.4,0-0.6,0c-1.2,0-2.2-0.9-2.2-2.1c0-1.2,0.9-2.2,2.1-2.2c0.2,0,0.5,0,0.7,0c14.3,0,25.9,11.6,25.9,25.9
 | 
					 | 
				
			||||||
		c0,0.2,0,0.5,0,0.7C221.7,42.4,220.7,43.3,219.6,43.3z"/>
 | 
					 | 
				
			||||||
	<path d="M212.1,43.3C212,43.3,212,43.3,212.1,43.3c-1.3-0.1-2.2-1.1-2.2-2.3c0-0.2,0-0.4,0-0.6c0-7.7-6.3-14.1-14.1-14.1
 | 
					 | 
				
			||||||
		c-0.2,0-0.4,0-0.6,0c-1.2,0.1-2.2-0.9-2.3-2.1c0-1.2,0.9-2.2,2.1-2.3c0.3,0,0.5,0,0.8,0c10.2,0,18.4,8.3,18.4,18.4
 | 
					 | 
				
			||||||
		c0,0.2,0,0.5,0,0.8C214.2,42.4,213.2,43.3,212.1,43.3z"/>
 | 
					 | 
				
			||||||
	<path d="M204.3,43.3c-0.1,0-0.1,0-0.2,0c-1.2-0.1-2.1-1.1-2-2.3c0-0.2,0-0.4,0-0.5c0-3.5-2.8-6.3-6.3-6.3c-0.1,0-0.3,0-0.5,0
 | 
					 | 
				
			||||||
		c-1.2,0.1-2.3-0.8-2.3-2c-0.1-1.2,0.8-2.3,2-2.3c0.3,0,0.6,0,0.9,0c5.9,0,10.7,4.8,10.7,10.7c0,0.3,0,0.5,0,0.9
 | 
					 | 
				
			||||||
		C206.4,42.4,205.4,43.3,204.3,43.3z"/>
 | 
					 | 
				
			||||||
	<g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M61.9,89.9v-4.7h-1.7v-0.9h4.4v0.9h-1.7v4.7H61.9z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M65.6,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H65.6z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M70.7,89.9v-5.6h1V89h2.5v0.9H70.7z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M74.9,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H74.9z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M79.8,87.1c0-1.7,1.3-2.9,2.9-2.9c1.1,0,1.8,0.6,2.2,1.3l-0.8,0.4c-0.3-0.5-0.8-0.8-1.4-0.8c-1.1,0-1.9,0.8-1.9,2
 | 
					 | 
				
			||||||
					c0,1.2,0.8,2,1.9,2c0.6,0,1.1-0.4,1.4-0.8l0.8,0.4c-0.4,0.7-1.1,1.3-2.2,1.3C81.1,90,79.8,88.8,79.8,87.1z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M85.5,87.1c0-1.7,1.2-2.9,2.9-2.9c1.7,0,2.9,1.2,2.9,2.9S90,90,88.3,90C86.7,90,85.5,88.8,85.5,87.1z M90.2,87.1
 | 
					 | 
				
			||||||
					c0-1.2-0.7-2-1.9-2c-1.1,0-1.9,0.9-1.9,2c0,1.1,0.7,2,1.9,2C89.5,89.1,90.2,88.3,90.2,87.1z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M96.9,89.9v-4.3l-1.7,4.3h-0.4l-1.7-4.3v4.3h-1v-5.6h1.4l1.5,3.8l1.5-3.8h1.4v5.6H96.9z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M103,89.9v-5.6h1v5.6H103z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M109.7,89.9l-2.9-4v4h-1v-5.6h1l2.9,3.9v-3.9h1v5.6H109.7z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M112.4,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8v2.4H112.4z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M120.3,89.9l-1.2-2.1h-1v2.1h-1v-5.6h2.5c1.1,0,1.8,0.7,1.8,1.8c0,1-0.7,1.5-1.3,1.6l1.4,2.2H120.3z M120.4,86.1
 | 
					 | 
				
			||||||
					c0-0.5-0.4-0.9-1-0.9h-1.4V87h1.4C120,87,120.4,86.6,120.4,86.1z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M126.6,89.9l-0.4-1.1h-2.6l-0.4,1.1h-1.1l2.2-5.6h1.2l2.2,5.6H126.6z M124.9,85.3l-1,2.7h2L124.9,85.3z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M131.4,89.9v-5.6h2.1c1.1,0,1.7,0.8,1.7,1.6c0,0.9-0.6,1.6-1.7,1.6h-1.6v2.3H131.4z M134.7,86c0-0.7-0.5-1.2-1.2-1.2
 | 
					 | 
				
			||||||
					h-1.6v2.4h1.6C134.2,87.2,134.7,86.6,134.7,86z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M139.4,89.9l-1.6-2.3h-1.2v2.3h-0.5v-5.6h2.1c1,0,1.7,0.6,1.7,1.6c0,1-0.7,1.6-1.6,1.6l1.6,2.3H139.4z M139.4,86
 | 
					 | 
				
			||||||
					c0-0.7-0.5-1.2-1.2-1.2h-1.6v2.4h1.6C138.9,87.2,139.4,86.7,139.4,86z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M141.2,87.1c0-1.6,1.1-2.9,2.7-2.9c1.6,0,2.7,1.3,2.7,2.9c0,1.6-1.1,2.9-2.7,2.9C142.3,90,141.2,88.8,141.2,87.1z
 | 
					 | 
				
			||||||
					 M146.1,87.1c0-1.4-0.9-2.5-2.2-2.5c-1.4,0-2.2,1-2.2,2.5c0,1.4,0.9,2.5,2.2,2.5C145.2,89.6,146.1,88.5,146.1,87.1z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M147,89.3l0.3-0.4c0.3,0.3,0.6,0.6,1.1,0.6c0.8,0,1.2-0.5,1.2-1.3v-4h0.5v4c0,1.2-0.8,1.7-1.7,1.7
 | 
					 | 
				
			||||||
					C147.9,90,147.4,89.8,147,89.3z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M151.8,89.9v-5.6h3.5v0.4h-3.1v2.1h3v0.4h-3v2.2h3.1v0.4H151.8z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M156.3,87.1c0-1.7,1.3-2.9,2.8-2.9c0.9,0,1.6,0.4,2,1l-0.4,0.3c-0.4-0.5-1-0.8-1.6-0.8c-1.3,0-2.3,1-2.3,2.5
 | 
					 | 
				
			||||||
					c0,1.4,1,2.5,2.3,2.5c0.7,0,1.3-0.3,1.6-0.8l0.4,0.3c-0.5,0.6-1.2,1-2,1C157.5,90,156.3,88.8,156.3,87.1z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path d="M163.5,89.9v-5.2h-1.8v-0.4h4.1v0.4H164v5.2H163.5z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<polygon points="33.7,86.5 41.2,79 48.6,86.5 49.8,86.5 41.2,77.9 32.6,86.5 			"/>
 | 
					 | 
				
			||||||
			<polygon points="48.6,87.8 41.2,95.2 33.7,87.8 32.6,87.8 41.2,96.4 49.8,87.8 			"/>
 | 
					 | 
				
			||||||
			<polygon points="40.3,86.5 47.8,79 55.3,86.5 56.4,86.5 47.8,77.9 39.2,86.5 			"/>
 | 
					 | 
				
			||||||
			<polygon points="55.3,87.8 47.8,95.2 40.3,87.8 39.2,87.8 47.8,96.4 56.4,87.8 			"/>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
	</g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
	<path d="M51.2,41.3c2,1.1,3.6,2.6,4.7,4.5c1.1,1.9,1.7,4,1.7,6.4c0,2.3-0.6,4.5-1.7,6.4c-1.1,1.9-2.7,3.4-4.7,4.6
 | 
					 | 
				
			||||||
		c-2,1.1-4.2,1.7-6.6,1.7c-2.4,0-4.6-0.6-6.6-1.7c-2-1.1-3.6-2.6-4.7-4.6c-1.1-1.9-1.7-4.1-1.7-6.4c0-2.3,0.6-4.5,1.7-6.4
 | 
					 | 
				
			||||||
		c1.1-1.9,2.7-3.4,4.7-4.5c2-1.1,4.2-1.6,6.6-1.6C47,39.6,49.2,40.2,51.2,41.3z M40.5,44.9c-1.3,0.7-2.3,1.7-3,3
 | 
					 | 
				
			||||||
		c-0.7,1.3-1.1,2.7-1.1,4.2s0.4,3,1.1,4.2c0.8,1.3,1.8,2.3,3,3c1.3,0.7,2.7,1.1,4.1,1.1c1.5,0,2.8-0.4,4.1-1.1c1.3-0.7,2.3-1.8,3-3
 | 
					 | 
				
			||||||
		c0.7-1.3,1.1-2.7,1.1-4.2s-0.4-2.9-1.1-4.2c-0.7-1.3-1.7-2.3-3-3c-1.3-0.7-2.6-1.1-4.1-1.1C43.2,43.8,41.8,44.2,40.5,44.9z"/>
 | 
					 | 
				
			||||||
	<path d="M76.9,46.8c1.3,0.8,2.4,1.9,3.1,3.4c0.7,1.4,1.1,3.1,1.1,5c0,1.9-0.4,3.5-1.1,4.9c-0.7,1.4-1.8,2.5-3.1,3.3
 | 
					 | 
				
			||||||
		c-1.3,0.8-2.9,1.2-4.6,1.2c-1.4,0-2.6-0.3-3.7-0.8c-1.1-0.5-2-1.3-2.7-2.4v9.8h-4.6V45.7H66v3.1c0.7-1.1,1.5-1.8,2.6-2.4
 | 
					 | 
				
			||||||
		c1.1-0.5,2.3-0.8,3.7-0.8C74,45.6,75.6,46,76.9,46.8z M75.1,59.1c1-1.1,1.5-2.4,1.5-4.1c0-1.7-0.5-3-1.5-4.1
 | 
					 | 
				
			||||||
		c-1-1.1-2.2-1.6-3.8-1.6c-1.6,0-2.8,0.5-3.8,1.6c-1,1-1.5,2.4-1.5,4.1c0,1.7,0.5,3,1.5,4.1c1,1.1,2.3,1.6,3.8,1.6
 | 
					 | 
				
			||||||
		C72.8,60.7,74.1,60.2,75.1,59.1z"/>
 | 
					 | 
				
			||||||
	<path d="M99.3,48.1c1.5,1.7,2.3,4.1,2.3,7.2c0,0.6,0,1.1,0,1.4H87.7c0.3,1.3,0.9,2.4,1.9,3.1c0.9,0.8,2.1,1.1,3.5,1.1
 | 
					 | 
				
			||||||
		c1,0,1.9-0.2,2.7-0.5c0.9-0.4,1.6-0.9,2.3-1.6l2.5,2.6c-0.9,1-2.1,1.8-3.4,2.4c-1.3,0.6-2.8,0.8-4.5,0.8c-1.9,0-3.6-0.4-5.1-1.2
 | 
					 | 
				
			||||||
		c-1.5-0.8-2.6-1.9-3.4-3.3c-0.8-1.4-1.2-3.1-1.2-5c0-1.9,0.4-3.5,1.2-5c0.8-1.4,1.9-2.6,3.4-3.4c1.4-0.8,3.1-1.2,4.9-1.2
 | 
					 | 
				
			||||||
		C95.5,45.6,97.8,46.4,99.3,48.1z M97.4,53.6c0-1.4-0.5-2.5-1.4-3.3c-0.9-0.8-2-1.2-3.4-1.2c-1.3,0-2.4,0.4-3.3,1.2
 | 
					 | 
				
			||||||
		c-0.9,0.8-1.5,1.9-1.7,3.3H97.4z"/>
 | 
					 | 
				
			||||||
	<path d="M121.5,47.5c1.2,1.3,1.9,3.1,1.9,5.3v11.7h-4.6V54.1c0-1.3-0.4-2.3-1.1-3.1c-0.7-0.8-1.8-1.1-3-1.1c-1.5,0-2.7,0.5-3.6,1.5
 | 
					 | 
				
			||||||
		s-1.3,2.3-1.3,3.8v9.2h-4.5V45.7h4.5v3.5c1.3-2.4,3.5-3.6,6.7-3.7C118.5,45.5,120.2,46.2,121.5,47.5z"/>
 | 
					 | 
				
			||||||
	<path d="M156.5,39.9h4.9l-8.3,24.5h-4.9l-5.6-18.6l-5.7,18.6h-4.8l-8.3-24.5h5l5.8,19.4l5.7-19.4h4.6l5.8,19.5L156.5,39.9z"/>
 | 
					 | 
				
			||||||
	<path d="M168,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
 | 
					 | 
				
			||||||
		c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C166.9,37.7,167.6,37.9,168,38.4z M164,45.7h4.5v18.7H164
 | 
					 | 
				
			||||||
		V45.7z"/>
 | 
					 | 
				
			||||||
	<path d="M174,39.9h16.9l0,4.1h-12.2v6.6h11.1v4.1h-11.1v9.7H174V39.9z"/>
 | 
					 | 
				
			||||||
	<path d="M197.9,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
 | 
					 | 
				
			||||||
		c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C196.8,37.7,197.4,37.9,197.9,38.4z M193.8,45.7h4.5v18.7
 | 
					 | 
				
			||||||
		h-4.5V45.7z"/>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
</svg>
 | 
					 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 6.8 KiB  | 
@@ -1,140 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
 | 
					 | 
				
			||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 | 
					 | 
				
			||||||
	 viewBox="0 0 251.2 114.2" style="enable-background:new 0 0 251.2 114.2;" xml:space="preserve">
 | 
					 | 
				
			||||||
<style type="text/css">
 | 
					 | 
				
			||||||
	.st0{fill:#FED206;}
 | 
					 | 
				
			||||||
	.st1{fill:#EB6F53;}
 | 
					 | 
				
			||||||
	.st2{fill:#3BA9B6;}
 | 
					 | 
				
			||||||
	.st3{fill:#414141;}
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
	<path class="st0" d="M219.6,43.3C219.5,43.3,219.5,43.3,219.6,43.3c-1.3,0-2.2-1-2.2-2.2c0-0.2,0-0.4,0-0.6
 | 
					 | 
				
			||||||
		c0-11.9-9.7-21.6-21.6-21.6c-0.2,0-0.4,0-0.6,0c-1.2,0-2.2-0.9-2.2-2.1c0-1.2,0.9-2.2,2.1-2.2c0.2,0,0.5,0,0.7,0
 | 
					 | 
				
			||||||
		c14.3,0,25.9,11.6,25.9,25.9c0,0.2,0,0.5,0,0.7C221.7,42.4,220.7,43.3,219.6,43.3z"/>
 | 
					 | 
				
			||||||
	<path class="st1" d="M212.1,43.3C212,43.3,212,43.3,212.1,43.3c-1.3-0.1-2.2-1.1-2.2-2.3c0-0.2,0-0.4,0-0.6
 | 
					 | 
				
			||||||
		c0-7.7-6.3-14.1-14.1-14.1c-0.2,0-0.4,0-0.6,0c-1.2,0.1-2.2-0.9-2.3-2.1c0-1.2,0.9-2.2,2.1-2.3c0.3,0,0.5,0,0.8,0
 | 
					 | 
				
			||||||
		c10.2,0,18.4,8.3,18.4,18.4c0,0.2,0,0.5,0,0.8C214.2,42.4,213.2,43.3,212.1,43.3z"/>
 | 
					 | 
				
			||||||
	<path class="st2" d="M204.3,43.3c-0.1,0-0.1,0-0.2,0c-1.2-0.1-2.1-1.1-2-2.3c0-0.2,0-0.4,0-0.5c0-3.5-2.8-6.3-6.3-6.3
 | 
					 | 
				
			||||||
		c-0.1,0-0.3,0-0.5,0c-1.2,0.1-2.3-0.8-2.3-2c-0.1-1.2,0.8-2.3,2-2.3c0.3,0,0.6,0,0.9,0c5.9,0,10.7,4.8,10.7,10.7c0,0.3,0,0.5,0,0.9
 | 
					 | 
				
			||||||
		C206.4,42.4,205.4,43.3,204.3,43.3z"/>
 | 
					 | 
				
			||||||
	<g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M61.9,89.9v-4.7h-1.7v-0.9h4.4v0.9h-1.7v4.7H61.9z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M65.6,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H65.6z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M70.7,89.9v-5.6h1V89h2.5v0.9H70.7z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M74.9,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H74.9z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M79.8,87.1c0-1.7,1.3-2.9,2.9-2.9c1.1,0,1.8,0.6,2.2,1.3l-0.8,0.4c-0.3-0.5-0.8-0.8-1.4-0.8
 | 
					 | 
				
			||||||
					c-1.1,0-1.9,0.8-1.9,2c0,1.2,0.8,2,1.9,2c0.6,0,1.1-0.4,1.4-0.8l0.8,0.4c-0.4,0.7-1.1,1.3-2.2,1.3C81.1,90,79.8,88.8,79.8,87.1z
 | 
					 | 
				
			||||||
					"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M85.5,87.1c0-1.7,1.2-2.9,2.9-2.9c1.7,0,2.9,1.2,2.9,2.9S90,90,88.3,90C86.7,90,85.5,88.8,85.5,87.1z
 | 
					 | 
				
			||||||
					 M90.2,87.1c0-1.2-0.7-2-1.9-2c-1.1,0-1.9,0.9-1.9,2c0,1.1,0.7,2,1.9,2C89.5,89.1,90.2,88.3,90.2,87.1z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M96.9,89.9v-4.3l-1.7,4.3h-0.4l-1.7-4.3v4.3h-1v-5.6h1.4l1.5,3.8l1.5-3.8h1.4v5.6H96.9z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M103,89.9v-5.6h1v5.6H103z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M109.7,89.9l-2.9-4v4h-1v-5.6h1l2.9,3.9v-3.9h1v5.6H109.7z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M112.4,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8v2.4H112.4z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M120.3,89.9l-1.2-2.1h-1v2.1h-1v-5.6h2.5c1.1,0,1.8,0.7,1.8,1.8c0,1-0.7,1.5-1.3,1.6l1.4,2.2H120.3z
 | 
					 | 
				
			||||||
					 M120.4,86.1c0-0.5-0.4-0.9-1-0.9h-1.4V87h1.4C120,87,120.4,86.6,120.4,86.1z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M126.6,89.9l-0.4-1.1h-2.6l-0.4,1.1h-1.1l2.2-5.6h1.2l2.2,5.6H126.6z M124.9,85.3l-1,2.7h2L124.9,85.3z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M131.4,89.9v-5.6h2.1c1.1,0,1.7,0.8,1.7,1.6c0,0.9-0.6,1.6-1.7,1.6h-1.6v2.3H131.4z M134.7,86
 | 
					 | 
				
			||||||
					c0-0.7-0.5-1.2-1.2-1.2h-1.6v2.4h1.6C134.2,87.2,134.7,86.6,134.7,86z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M139.4,89.9l-1.6-2.3h-1.2v2.3h-0.5v-5.6h2.1c1,0,1.7,0.6,1.7,1.6c0,1-0.7,1.6-1.6,1.6l1.6,2.3H139.4z
 | 
					 | 
				
			||||||
					 M139.4,86c0-0.7-0.5-1.2-1.2-1.2h-1.6v2.4h1.6C138.9,87.2,139.4,86.7,139.4,86z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M141.2,87.1c0-1.6,1.1-2.9,2.7-2.9c1.6,0,2.7,1.3,2.7,2.9c0,1.6-1.1,2.9-2.7,2.9
 | 
					 | 
				
			||||||
					C142.3,90,141.2,88.8,141.2,87.1z M146.1,87.1c0-1.4-0.9-2.5-2.2-2.5c-1.4,0-2.2,1-2.2,2.5c0,1.4,0.9,2.5,2.2,2.5
 | 
					 | 
				
			||||||
					C145.2,89.6,146.1,88.5,146.1,87.1z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M147,89.3l0.3-0.4c0.3,0.3,0.6,0.6,1.1,0.6c0.8,0,1.2-0.5,1.2-1.3v-4h0.5v4c0,1.2-0.8,1.7-1.7,1.7
 | 
					 | 
				
			||||||
					C147.9,90,147.4,89.8,147,89.3z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M151.8,89.9v-5.6h3.5v0.4h-3.1v2.1h3v0.4h-3v2.2h3.1v0.4H151.8z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M156.3,87.1c0-1.7,1.3-2.9,2.8-2.9c0.9,0,1.6,0.4,2,1l-0.4,0.3c-0.4-0.5-1-0.8-1.6-0.8
 | 
					 | 
				
			||||||
					c-1.3,0-2.3,1-2.3,2.5c0,1.4,1,2.5,2.3,2.5c0.7,0,1.3-0.3,1.6-0.8l0.4,0.3c-0.5,0.6-1.2,1-2,1C157.5,90,156.3,88.8,156.3,87.1z"
 | 
					 | 
				
			||||||
					/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M163.5,89.9v-5.2h-1.8v-0.4h4.1v0.4H164v5.2H163.5z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<polygon class="st3" points="33.7,86.5 41.2,79 48.6,86.5 49.8,86.5 41.2,77.9 32.6,86.5 			"/>
 | 
					 | 
				
			||||||
			<polygon class="st3" points="48.6,87.8 41.2,95.2 33.7,87.8 32.6,87.8 41.2,96.4 49.8,87.8 			"/>
 | 
					 | 
				
			||||||
			<polygon class="st3" points="40.3,86.5 47.8,79 55.3,86.5 56.4,86.5 47.8,77.9 39.2,86.5 			"/>
 | 
					 | 
				
			||||||
			<polygon class="st3" points="55.3,87.8 47.8,95.2 40.3,87.8 39.2,87.8 47.8,96.4 56.4,87.8 			"/>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
	</g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
	<path class="st3" d="M51.2,41.3c2,1.1,3.6,2.6,4.7,4.5c1.1,1.9,1.7,4,1.7,6.4c0,2.3-0.6,4.5-1.7,6.4c-1.1,1.9-2.7,3.4-4.7,4.6
 | 
					 | 
				
			||||||
		c-2,1.1-4.2,1.7-6.6,1.7c-2.4,0-4.6-0.6-6.6-1.7c-2-1.1-3.6-2.6-4.7-4.6c-1.1-1.9-1.7-4.1-1.7-6.4c0-2.3,0.6-4.5,1.7-6.4
 | 
					 | 
				
			||||||
		c1.1-1.9,2.7-3.4,4.7-4.5c2-1.1,4.2-1.6,6.6-1.6C47,39.6,49.2,40.2,51.2,41.3z M40.5,44.9c-1.3,0.7-2.3,1.7-3,3
 | 
					 | 
				
			||||||
		c-0.7,1.3-1.1,2.7-1.1,4.2s0.4,3,1.1,4.2c0.8,1.3,1.8,2.3,3,3c1.3,0.7,2.7,1.1,4.1,1.1c1.5,0,2.8-0.4,4.1-1.1c1.3-0.7,2.3-1.8,3-3
 | 
					 | 
				
			||||||
		c0.7-1.3,1.1-2.7,1.1-4.2s-0.4-2.9-1.1-4.2c-0.7-1.3-1.7-2.3-3-3c-1.3-0.7-2.6-1.1-4.1-1.1C43.2,43.8,41.8,44.2,40.5,44.9z"/>
 | 
					 | 
				
			||||||
	<path class="st3" d="M76.9,46.8c1.3,0.8,2.4,1.9,3.1,3.4c0.7,1.4,1.1,3.1,1.1,5c0,1.9-0.4,3.5-1.1,4.9c-0.7,1.4-1.8,2.5-3.1,3.3
 | 
					 | 
				
			||||||
		c-1.3,0.8-2.9,1.2-4.6,1.2c-1.4,0-2.6-0.3-3.7-0.8c-1.1-0.5-2-1.3-2.7-2.4v9.8h-4.6V45.7H66v3.1c0.7-1.1,1.5-1.8,2.6-2.4
 | 
					 | 
				
			||||||
		c1.1-0.5,2.3-0.8,3.7-0.8C74,45.6,75.6,46,76.9,46.8z M75.1,59.1c1-1.1,1.5-2.4,1.5-4.1c0-1.7-0.5-3-1.5-4.1
 | 
					 | 
				
			||||||
		c-1-1.1-2.2-1.6-3.8-1.6c-1.6,0-2.8,0.5-3.8,1.6c-1,1-1.5,2.4-1.5,4.1c0,1.7,0.5,3,1.5,4.1c1,1.1,2.3,1.6,3.8,1.6
 | 
					 | 
				
			||||||
		C72.8,60.7,74.1,60.2,75.1,59.1z"/>
 | 
					 | 
				
			||||||
	<path class="st3" d="M99.3,48.1c1.5,1.7,2.3,4.1,2.3,7.2c0,0.6,0,1.1,0,1.4H87.7c0.3,1.3,0.9,2.4,1.9,3.1c0.9,0.8,2.1,1.1,3.5,1.1
 | 
					 | 
				
			||||||
		c1,0,1.9-0.2,2.7-0.5c0.9-0.4,1.6-0.9,2.3-1.6l2.5,2.6c-0.9,1-2.1,1.8-3.4,2.4c-1.3,0.6-2.8,0.8-4.5,0.8c-1.9,0-3.6-0.4-5.1-1.2
 | 
					 | 
				
			||||||
		c-1.5-0.8-2.6-1.9-3.4-3.3c-0.8-1.4-1.2-3.1-1.2-5c0-1.9,0.4-3.5,1.2-5c0.8-1.4,1.9-2.6,3.4-3.4c1.4-0.8,3.1-1.2,4.9-1.2
 | 
					 | 
				
			||||||
		C95.5,45.6,97.8,46.4,99.3,48.1z M97.4,53.6c0-1.4-0.5-2.5-1.4-3.3c-0.9-0.8-2-1.2-3.4-1.2c-1.3,0-2.4,0.4-3.3,1.2
 | 
					 | 
				
			||||||
		c-0.9,0.8-1.5,1.9-1.7,3.3H97.4z"/>
 | 
					 | 
				
			||||||
	<path class="st3" d="M121.5,47.5c1.2,1.3,1.9,3.1,1.9,5.3v11.7h-4.6V54.1c0-1.3-0.4-2.3-1.1-3.1c-0.7-0.8-1.8-1.1-3-1.1
 | 
					 | 
				
			||||||
		c-1.5,0-2.7,0.5-3.6,1.5s-1.3,2.3-1.3,3.8v9.2h-4.5V45.7h4.5v3.5c1.3-2.4,3.5-3.6,6.7-3.7C118.5,45.5,120.2,46.2,121.5,47.5z"/>
 | 
					 | 
				
			||||||
	<path class="st3" d="M156.5,39.9h4.9l-8.3,24.5h-4.9l-5.6-18.6l-5.7,18.6h-4.8l-8.3-24.5h5l5.8,19.4l5.7-19.4h4.6l5.8,19.5
 | 
					 | 
				
			||||||
		L156.5,39.9z"/>
 | 
					 | 
				
			||||||
	<path class="st3" d="M168,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
 | 
					 | 
				
			||||||
		c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C166.9,37.7,167.6,37.9,168,38.4z M164,45.7h4.5v18.7H164
 | 
					 | 
				
			||||||
		V45.7z"/>
 | 
					 | 
				
			||||||
	<path class="st3" d="M174,39.9h16.9l0,4.1h-12.2v6.6h11.1v4.1h-11.1v9.7H174V39.9z"/>
 | 
					 | 
				
			||||||
	<path class="st3" d="M197.9,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
 | 
					 | 
				
			||||||
		c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C196.8,37.7,197.4,37.9,197.9,38.4z M193.8,45.7h4.5v18.7
 | 
					 | 
				
			||||||
		h-4.5V45.7z"/>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
</svg>
 | 
					 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 7.3 KiB  | 
@@ -1,137 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
 | 
					 | 
				
			||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 | 
					 | 
				
			||||||
	 viewBox="0 0 251.2 114.2" style="enable-background:new 0 0 251.2 114.2;" xml:space="preserve">
 | 
					 | 
				
			||||||
<style type="text/css">
 | 
					 | 
				
			||||||
	.st0{fill:#FFFFFF;}
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
	<path class="st0" d="M219.6,43.3C219.5,43.3,219.5,43.3,219.6,43.3c-1.3,0-2.2-1-2.2-2.2c0-0.2,0-0.4,0-0.6
 | 
					 | 
				
			||||||
		c0-11.9-9.7-21.6-21.6-21.6c-0.2,0-0.4,0-0.6,0c-1.2,0-2.2-0.9-2.2-2.1c0-1.2,0.9-2.2,2.1-2.2c0.2,0,0.5,0,0.7,0
 | 
					 | 
				
			||||||
		c14.3,0,25.9,11.6,25.9,25.9c0,0.2,0,0.5,0,0.7C221.7,42.4,220.7,43.3,219.6,43.3z"/>
 | 
					 | 
				
			||||||
	<path class="st0" d="M212.1,43.3C212,43.3,212,43.3,212.1,43.3c-1.3-0.1-2.2-1.1-2.2-2.3c0-0.2,0-0.4,0-0.6
 | 
					 | 
				
			||||||
		c0-7.7-6.3-14.1-14.1-14.1c-0.2,0-0.4,0-0.6,0c-1.2,0.1-2.2-0.9-2.3-2.1c0-1.2,0.9-2.2,2.1-2.3c0.3,0,0.5,0,0.8,0
 | 
					 | 
				
			||||||
		c10.2,0,18.4,8.3,18.4,18.4c0,0.2,0,0.5,0,0.8C214.2,42.4,213.2,43.3,212.1,43.3z"/>
 | 
					 | 
				
			||||||
	<path class="st0" d="M204.3,43.3c-0.1,0-0.1,0-0.2,0c-1.2-0.1-2.1-1.1-2-2.3c0-0.2,0-0.4,0-0.5c0-3.5-2.8-6.3-6.3-6.3
 | 
					 | 
				
			||||||
		c-0.1,0-0.3,0-0.5,0c-1.2,0.1-2.3-0.8-2.3-2c-0.1-1.2,0.8-2.3,2-2.3c0.3,0,0.6,0,0.9,0c5.9,0,10.7,4.8,10.7,10.7c0,0.3,0,0.5,0,0.9
 | 
					 | 
				
			||||||
		C206.4,42.4,205.4,43.3,204.3,43.3z"/>
 | 
					 | 
				
			||||||
	<g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M61.9,89.9v-4.7h-1.7v-0.9h4.4v0.9h-1.7v4.7H61.9z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M65.6,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H65.6z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M70.7,89.9v-5.6h1V89h2.5v0.9H70.7z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M74.9,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H74.9z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M79.8,87.1c0-1.7,1.3-2.9,2.9-2.9c1.1,0,1.8,0.6,2.2,1.3l-0.8,0.4c-0.3-0.5-0.8-0.8-1.4-0.8
 | 
					 | 
				
			||||||
					c-1.1,0-1.9,0.8-1.9,2c0,1.2,0.8,2,1.9,2c0.6,0,1.1-0.4,1.4-0.8l0.8,0.4c-0.4,0.7-1.1,1.3-2.2,1.3C81.1,90,79.8,88.8,79.8,87.1z
 | 
					 | 
				
			||||||
					"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M85.5,87.1c0-1.7,1.2-2.9,2.9-2.9c1.7,0,2.9,1.2,2.9,2.9S90,90,88.3,90C86.7,90,85.5,88.8,85.5,87.1z
 | 
					 | 
				
			||||||
					 M90.2,87.1c0-1.2-0.7-2-1.9-2c-1.1,0-1.9,0.9-1.9,2c0,1.1,0.7,2,1.9,2C89.5,89.1,90.2,88.3,90.2,87.1z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M96.9,89.9v-4.3l-1.7,4.3h-0.4l-1.7-4.3v4.3h-1v-5.6h1.4l1.5,3.8l1.5-3.8h1.4v5.6H96.9z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M103,89.9v-5.6h1v5.6H103z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M109.7,89.9l-2.9-4v4h-1v-5.6h1l2.9,3.9v-3.9h1v5.6H109.7z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M112.4,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8v2.4H112.4z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M120.3,89.9l-1.2-2.1h-1v2.1h-1v-5.6h2.5c1.1,0,1.8,0.7,1.8,1.8c0,1-0.7,1.5-1.3,1.6l1.4,2.2H120.3z
 | 
					 | 
				
			||||||
					 M120.4,86.1c0-0.5-0.4-0.9-1-0.9h-1.4V87h1.4C120,87,120.4,86.6,120.4,86.1z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M126.6,89.9l-0.4-1.1h-2.6l-0.4,1.1h-1.1l2.2-5.6h1.2l2.2,5.6H126.6z M124.9,85.3l-1,2.7h2L124.9,85.3z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M131.4,89.9v-5.6h2.1c1.1,0,1.7,0.8,1.7,1.6c0,0.9-0.6,1.6-1.7,1.6h-1.6v2.3H131.4z M134.7,86
 | 
					 | 
				
			||||||
					c0-0.7-0.5-1.2-1.2-1.2h-1.6v2.4h1.6C134.2,87.2,134.7,86.6,134.7,86z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M139.4,89.9l-1.6-2.3h-1.2v2.3h-0.5v-5.6h2.1c1,0,1.7,0.6,1.7,1.6c0,1-0.7,1.6-1.6,1.6l1.6,2.3H139.4z
 | 
					 | 
				
			||||||
					 M139.4,86c0-0.7-0.5-1.2-1.2-1.2h-1.6v2.4h1.6C138.9,87.2,139.4,86.7,139.4,86z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M141.2,87.1c0-1.6,1.1-2.9,2.7-2.9c1.6,0,2.7,1.3,2.7,2.9c0,1.6-1.1,2.9-2.7,2.9
 | 
					 | 
				
			||||||
					C142.3,90,141.2,88.8,141.2,87.1z M146.1,87.1c0-1.4-0.9-2.5-2.2-2.5c-1.4,0-2.2,1-2.2,2.5c0,1.4,0.9,2.5,2.2,2.5
 | 
					 | 
				
			||||||
					C145.2,89.6,146.1,88.5,146.1,87.1z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M147,89.3l0.3-0.4c0.3,0.3,0.6,0.6,1.1,0.6c0.8,0,1.2-0.5,1.2-1.3v-4h0.5v4c0,1.2-0.8,1.7-1.7,1.7
 | 
					 | 
				
			||||||
					C147.9,90,147.4,89.8,147,89.3z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M151.8,89.9v-5.6h3.5v0.4h-3.1v2.1h3v0.4h-3v2.2h3.1v0.4H151.8z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M156.3,87.1c0-1.7,1.3-2.9,2.8-2.9c0.9,0,1.6,0.4,2,1l-0.4,0.3c-0.4-0.5-1-0.8-1.6-0.8
 | 
					 | 
				
			||||||
					c-1.3,0-2.3,1-2.3,2.5c0,1.4,1,2.5,2.3,2.5c0.7,0,1.3-0.3,1.6-0.8l0.4,0.3c-0.5,0.6-1.2,1-2,1C157.5,90,156.3,88.8,156.3,87.1z"
 | 
					 | 
				
			||||||
					/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st0" d="M163.5,89.9v-5.2h-1.8v-0.4h4.1v0.4H164v5.2H163.5z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<polygon class="st0" points="33.7,86.5 41.2,79 48.6,86.5 49.8,86.5 41.2,77.9 32.6,86.5 			"/>
 | 
					 | 
				
			||||||
			<polygon class="st0" points="48.6,87.8 41.2,95.2 33.7,87.8 32.6,87.8 41.2,96.4 49.8,87.8 			"/>
 | 
					 | 
				
			||||||
			<polygon class="st0" points="40.3,86.5 47.8,79 55.3,86.5 56.4,86.5 47.8,77.9 39.2,86.5 			"/>
 | 
					 | 
				
			||||||
			<polygon class="st0" points="55.3,87.8 47.8,95.2 40.3,87.8 39.2,87.8 47.8,96.4 56.4,87.8 			"/>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
	</g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
	<path class="st0" d="M51.2,41.3c2,1.1,3.6,2.6,4.7,4.5c1.1,1.9,1.7,4,1.7,6.4c0,2.3-0.6,4.5-1.7,6.4c-1.1,1.9-2.7,3.4-4.7,4.6
 | 
					 | 
				
			||||||
		c-2,1.1-4.2,1.7-6.6,1.7c-2.4,0-4.6-0.6-6.6-1.7c-2-1.1-3.6-2.6-4.7-4.6c-1.1-1.9-1.7-4.1-1.7-6.4c0-2.3,0.6-4.5,1.7-6.4
 | 
					 | 
				
			||||||
		c1.1-1.9,2.7-3.4,4.7-4.5c2-1.1,4.2-1.6,6.6-1.6C47,39.6,49.2,40.2,51.2,41.3z M40.5,44.9c-1.3,0.7-2.3,1.7-3,3
 | 
					 | 
				
			||||||
		c-0.7,1.3-1.1,2.7-1.1,4.2s0.4,3,1.1,4.2c0.8,1.3,1.8,2.3,3,3c1.3,0.7,2.7,1.1,4.1,1.1c1.5,0,2.8-0.4,4.1-1.1c1.3-0.7,2.3-1.8,3-3
 | 
					 | 
				
			||||||
		c0.7-1.3,1.1-2.7,1.1-4.2s-0.4-2.9-1.1-4.2c-0.7-1.3-1.7-2.3-3-3c-1.3-0.7-2.6-1.1-4.1-1.1C43.2,43.8,41.8,44.2,40.5,44.9z"/>
 | 
					 | 
				
			||||||
	<path class="st0" d="M76.9,46.8c1.3,0.8,2.4,1.9,3.1,3.4c0.7,1.4,1.1,3.1,1.1,5c0,1.9-0.4,3.5-1.1,4.9c-0.7,1.4-1.8,2.5-3.1,3.3
 | 
					 | 
				
			||||||
		c-1.3,0.8-2.9,1.2-4.6,1.2c-1.4,0-2.6-0.3-3.7-0.8c-1.1-0.5-2-1.3-2.7-2.4v9.8h-4.6V45.7H66v3.1c0.7-1.1,1.5-1.8,2.6-2.4
 | 
					 | 
				
			||||||
		c1.1-0.5,2.3-0.8,3.7-0.8C74,45.6,75.6,46,76.9,46.8z M75.1,59.1c1-1.1,1.5-2.4,1.5-4.1c0-1.7-0.5-3-1.5-4.1
 | 
					 | 
				
			||||||
		c-1-1.1-2.2-1.6-3.8-1.6c-1.6,0-2.8,0.5-3.8,1.6c-1,1-1.5,2.4-1.5,4.1c0,1.7,0.5,3,1.5,4.1c1,1.1,2.3,1.6,3.8,1.6
 | 
					 | 
				
			||||||
		C72.8,60.7,74.1,60.2,75.1,59.1z"/>
 | 
					 | 
				
			||||||
	<path class="st0" d="M99.3,48.1c1.5,1.7,2.3,4.1,2.3,7.2c0,0.6,0,1.1,0,1.4H87.7c0.3,1.3,0.9,2.4,1.9,3.1c0.9,0.8,2.1,1.1,3.5,1.1
 | 
					 | 
				
			||||||
		c1,0,1.9-0.2,2.7-0.5c0.9-0.4,1.6-0.9,2.3-1.6l2.5,2.6c-0.9,1-2.1,1.8-3.4,2.4c-1.3,0.6-2.8,0.8-4.5,0.8c-1.9,0-3.6-0.4-5.1-1.2
 | 
					 | 
				
			||||||
		c-1.5-0.8-2.6-1.9-3.4-3.3c-0.8-1.4-1.2-3.1-1.2-5c0-1.9,0.4-3.5,1.2-5c0.8-1.4,1.9-2.6,3.4-3.4c1.4-0.8,3.1-1.2,4.9-1.2
 | 
					 | 
				
			||||||
		C95.5,45.6,97.8,46.4,99.3,48.1z M97.4,53.6c0-1.4-0.5-2.5-1.4-3.3c-0.9-0.8-2-1.2-3.4-1.2c-1.3,0-2.4,0.4-3.3,1.2
 | 
					 | 
				
			||||||
		c-0.9,0.8-1.5,1.9-1.7,3.3H97.4z"/>
 | 
					 | 
				
			||||||
	<path class="st0" d="M121.5,47.5c1.2,1.3,1.9,3.1,1.9,5.3v11.7h-4.6V54.1c0-1.3-0.4-2.3-1.1-3.1c-0.7-0.8-1.8-1.1-3-1.1
 | 
					 | 
				
			||||||
		c-1.5,0-2.7,0.5-3.6,1.5s-1.3,2.3-1.3,3.8v9.2h-4.5V45.7h4.5v3.5c1.3-2.4,3.5-3.6,6.7-3.7C118.5,45.5,120.2,46.2,121.5,47.5z"/>
 | 
					 | 
				
			||||||
	<path class="st0" d="M156.5,39.9h4.9l-8.3,24.5h-4.9l-5.6-18.6l-5.7,18.6h-4.8l-8.3-24.5h5l5.8,19.4l5.7-19.4h4.6l5.8,19.5
 | 
					 | 
				
			||||||
		L156.5,39.9z"/>
 | 
					 | 
				
			||||||
	<path class="st0" d="M168,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
 | 
					 | 
				
			||||||
		c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C166.9,37.7,167.6,37.9,168,38.4z M164,45.7h4.5v18.7H164
 | 
					 | 
				
			||||||
		V45.7z"/>
 | 
					 | 
				
			||||||
	<path class="st0" d="M174,39.9h16.9l0,4.1h-12.2v6.6h11.1v4.1h-11.1v9.7H174V39.9z"/>
 | 
					 | 
				
			||||||
	<path class="st0" d="M197.9,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
 | 
					 | 
				
			||||||
		c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C196.8,37.7,197.4,37.9,197.9,38.4z M193.8,45.7h4.5v18.7
 | 
					 | 
				
			||||||
		h-4.5V45.7z"/>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
</svg>
 | 
					 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 7.3 KiB  | 
@@ -1,140 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
 | 
					 | 
				
			||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 | 
					 | 
				
			||||||
	 viewBox="0 0 251.2 114.2" style="enable-background:new 0 0 251.2 114.2;" xml:space="preserve">
 | 
					 | 
				
			||||||
<style type="text/css">
 | 
					 | 
				
			||||||
	.st0{fill:#FED206;}
 | 
					 | 
				
			||||||
	.st1{fill:#EB6F53;}
 | 
					 | 
				
			||||||
	.st2{fill:#3BA9B6;}
 | 
					 | 
				
			||||||
	.st3{fill:#FFFFFF;}
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
	<path class="st0" d="M219.6,43.3C219.5,43.3,219.5,43.3,219.6,43.3c-1.3,0-2.2-1-2.2-2.2c0-0.2,0-0.4,0-0.6
 | 
					 | 
				
			||||||
		c0-11.9-9.7-21.6-21.6-21.6c-0.2,0-0.4,0-0.6,0c-1.2,0-2.2-0.9-2.2-2.1c0-1.2,0.9-2.2,2.1-2.2c0.2,0,0.5,0,0.7,0
 | 
					 | 
				
			||||||
		c14.3,0,25.9,11.6,25.9,25.9c0,0.2,0,0.5,0,0.7C221.7,42.4,220.7,43.3,219.6,43.3z"/>
 | 
					 | 
				
			||||||
	<path class="st1" d="M212.1,43.3C212,43.3,212,43.3,212.1,43.3c-1.3-0.1-2.2-1.1-2.2-2.3c0-0.2,0-0.4,0-0.6
 | 
					 | 
				
			||||||
		c0-7.7-6.3-14.1-14.1-14.1c-0.2,0-0.4,0-0.6,0c-1.2,0.1-2.2-0.9-2.3-2.1c0-1.2,0.9-2.2,2.1-2.3c0.3,0,0.5,0,0.8,0
 | 
					 | 
				
			||||||
		c10.2,0,18.4,8.3,18.4,18.4c0,0.2,0,0.5,0,0.8C214.2,42.4,213.2,43.3,212.1,43.3z"/>
 | 
					 | 
				
			||||||
	<path class="st2" d="M204.3,43.3c-0.1,0-0.1,0-0.2,0c-1.2-0.1-2.1-1.1-2-2.3c0-0.2,0-0.4,0-0.5c0-3.5-2.8-6.3-6.3-6.3
 | 
					 | 
				
			||||||
		c-0.1,0-0.3,0-0.5,0c-1.2,0.1-2.3-0.8-2.3-2c-0.1-1.2,0.8-2.3,2-2.3c0.3,0,0.6,0,0.9,0c5.9,0,10.7,4.8,10.7,10.7c0,0.3,0,0.5,0,0.9
 | 
					 | 
				
			||||||
		C206.4,42.4,205.4,43.3,204.3,43.3z"/>
 | 
					 | 
				
			||||||
	<g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M61.9,89.9v-4.7h-1.7v-0.9h4.4v0.9h-1.7v4.7H61.9z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M65.6,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H65.6z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M70.7,89.9v-5.6h1V89h2.5v0.9H70.7z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M74.9,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H74.9z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M79.8,87.1c0-1.7,1.3-2.9,2.9-2.9c1.1,0,1.8,0.6,2.2,1.3l-0.8,0.4c-0.3-0.5-0.8-0.8-1.4-0.8
 | 
					 | 
				
			||||||
					c-1.1,0-1.9,0.8-1.9,2c0,1.2,0.8,2,1.9,2c0.6,0,1.1-0.4,1.4-0.8l0.8,0.4c-0.4,0.7-1.1,1.3-2.2,1.3C81.1,90,79.8,88.8,79.8,87.1z
 | 
					 | 
				
			||||||
					"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M85.5,87.1c0-1.7,1.2-2.9,2.9-2.9c1.7,0,2.9,1.2,2.9,2.9S90,90,88.3,90C86.7,90,85.5,88.8,85.5,87.1z
 | 
					 | 
				
			||||||
					 M90.2,87.1c0-1.2-0.7-2-1.9-2c-1.1,0-1.9,0.9-1.9,2c0,1.1,0.7,2,1.9,2C89.5,89.1,90.2,88.3,90.2,87.1z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M96.9,89.9v-4.3l-1.7,4.3h-0.4l-1.7-4.3v4.3h-1v-5.6h1.4l1.5,3.8l1.5-3.8h1.4v5.6H96.9z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M103,89.9v-5.6h1v5.6H103z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M109.7,89.9l-2.9-4v4h-1v-5.6h1l2.9,3.9v-3.9h1v5.6H109.7z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M112.4,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8v2.4H112.4z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M120.3,89.9l-1.2-2.1h-1v2.1h-1v-5.6h2.5c1.1,0,1.8,0.7,1.8,1.8c0,1-0.7,1.5-1.3,1.6l1.4,2.2H120.3z
 | 
					 | 
				
			||||||
					 M120.4,86.1c0-0.5-0.4-0.9-1-0.9h-1.4V87h1.4C120,87,120.4,86.6,120.4,86.1z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M126.6,89.9l-0.4-1.1h-2.6l-0.4,1.1h-1.1l2.2-5.6h1.2l2.2,5.6H126.6z M124.9,85.3l-1,2.7h2L124.9,85.3z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M131.4,89.9v-5.6h2.1c1.1,0,1.7,0.8,1.7,1.6c0,0.9-0.6,1.6-1.7,1.6h-1.6v2.3H131.4z M134.7,86
 | 
					 | 
				
			||||||
					c0-0.7-0.5-1.2-1.2-1.2h-1.6v2.4h1.6C134.2,87.2,134.7,86.6,134.7,86z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M139.4,89.9l-1.6-2.3h-1.2v2.3h-0.5v-5.6h2.1c1,0,1.7,0.6,1.7,1.6c0,1-0.7,1.6-1.6,1.6l1.6,2.3H139.4z
 | 
					 | 
				
			||||||
					 M139.4,86c0-0.7-0.5-1.2-1.2-1.2h-1.6v2.4h1.6C138.9,87.2,139.4,86.7,139.4,86z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M141.2,87.1c0-1.6,1.1-2.9,2.7-2.9c1.6,0,2.7,1.3,2.7,2.9c0,1.6-1.1,2.9-2.7,2.9
 | 
					 | 
				
			||||||
					C142.3,90,141.2,88.8,141.2,87.1z M146.1,87.1c0-1.4-0.9-2.5-2.2-2.5c-1.4,0-2.2,1-2.2,2.5c0,1.4,0.9,2.5,2.2,2.5
 | 
					 | 
				
			||||||
					C145.2,89.6,146.1,88.5,146.1,87.1z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M147,89.3l0.3-0.4c0.3,0.3,0.6,0.6,1.1,0.6c0.8,0,1.2-0.5,1.2-1.3v-4h0.5v4c0,1.2-0.8,1.7-1.7,1.7
 | 
					 | 
				
			||||||
					C147.9,90,147.4,89.8,147,89.3z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M151.8,89.9v-5.6h3.5v0.4h-3.1v2.1h3v0.4h-3v2.2h3.1v0.4H151.8z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M156.3,87.1c0-1.7,1.3-2.9,2.8-2.9c0.9,0,1.6,0.4,2,1l-0.4,0.3c-0.4-0.5-1-0.8-1.6-0.8
 | 
					 | 
				
			||||||
					c-1.3,0-2.3,1-2.3,2.5c0,1.4,1,2.5,2.3,2.5c0.7,0,1.3-0.3,1.6-0.8l0.4,0.3c-0.5,0.6-1.2,1-2,1C157.5,90,156.3,88.8,156.3,87.1z"
 | 
					 | 
				
			||||||
					/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
			<g>
 | 
					 | 
				
			||||||
				<path class="st3" d="M163.5,89.9v-5.2h-1.8v-0.4h4.1v0.4H164v5.2H163.5z"/>
 | 
					 | 
				
			||||||
			</g>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
		<g>
 | 
					 | 
				
			||||||
			<polygon class="st3" points="33.7,86.5 41.2,79 48.6,86.5 49.8,86.5 41.2,77.9 32.6,86.5 			"/>
 | 
					 | 
				
			||||||
			<polygon class="st3" points="48.6,87.8 41.2,95.2 33.7,87.8 32.6,87.8 41.2,96.4 49.8,87.8 			"/>
 | 
					 | 
				
			||||||
			<polygon class="st3" points="40.3,86.5 47.8,79 55.3,86.5 56.4,86.5 47.8,77.9 39.2,86.5 			"/>
 | 
					 | 
				
			||||||
			<polygon class="st3" points="55.3,87.8 47.8,95.2 40.3,87.8 39.2,87.8 47.8,96.4 56.4,87.8 			"/>
 | 
					 | 
				
			||||||
		</g>
 | 
					 | 
				
			||||||
	</g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
	<path class="st3" d="M51.2,41.3c2,1.1,3.6,2.6,4.7,4.5c1.1,1.9,1.7,4,1.7,6.4c0,2.3-0.6,4.5-1.7,6.4c-1.1,1.9-2.7,3.4-4.7,4.6
 | 
					 | 
				
			||||||
		c-2,1.1-4.2,1.7-6.6,1.7c-2.4,0-4.6-0.6-6.6-1.7c-2-1.1-3.6-2.6-4.7-4.6c-1.1-1.9-1.7-4.1-1.7-6.4c0-2.3,0.6-4.5,1.7-6.4
 | 
					 | 
				
			||||||
		c1.1-1.9,2.7-3.4,4.7-4.5c2-1.1,4.2-1.6,6.6-1.6C47,39.6,49.2,40.2,51.2,41.3z M40.5,44.9c-1.3,0.7-2.3,1.7-3,3
 | 
					 | 
				
			||||||
		c-0.7,1.3-1.1,2.7-1.1,4.2s0.4,3,1.1,4.2c0.8,1.3,1.8,2.3,3,3c1.3,0.7,2.7,1.1,4.1,1.1c1.5,0,2.8-0.4,4.1-1.1c1.3-0.7,2.3-1.8,3-3
 | 
					 | 
				
			||||||
		c0.7-1.3,1.1-2.7,1.1-4.2s-0.4-2.9-1.1-4.2c-0.7-1.3-1.7-2.3-3-3c-1.3-0.7-2.6-1.1-4.1-1.1C43.2,43.8,41.8,44.2,40.5,44.9z"/>
 | 
					 | 
				
			||||||
	<path class="st3" d="M76.9,46.8c1.3,0.8,2.4,1.9,3.1,3.4c0.7,1.4,1.1,3.1,1.1,5c0,1.9-0.4,3.5-1.1,4.9c-0.7,1.4-1.8,2.5-3.1,3.3
 | 
					 | 
				
			||||||
		c-1.3,0.8-2.9,1.2-4.6,1.2c-1.4,0-2.6-0.3-3.7-0.8c-1.1-0.5-2-1.3-2.7-2.4v9.8h-4.6V45.7H66v3.1c0.7-1.1,1.5-1.8,2.6-2.4
 | 
					 | 
				
			||||||
		c1.1-0.5,2.3-0.8,3.7-0.8C74,45.6,75.6,46,76.9,46.8z M75.1,59.1c1-1.1,1.5-2.4,1.5-4.1c0-1.7-0.5-3-1.5-4.1
 | 
					 | 
				
			||||||
		c-1-1.1-2.2-1.6-3.8-1.6c-1.6,0-2.8,0.5-3.8,1.6c-1,1-1.5,2.4-1.5,4.1c0,1.7,0.5,3,1.5,4.1c1,1.1,2.3,1.6,3.8,1.6
 | 
					 | 
				
			||||||
		C72.8,60.7,74.1,60.2,75.1,59.1z"/>
 | 
					 | 
				
			||||||
	<path class="st3" d="M99.3,48.1c1.5,1.7,2.3,4.1,2.3,7.2c0,0.6,0,1.1,0,1.4H87.7c0.3,1.3,0.9,2.4,1.9,3.1c0.9,0.8,2.1,1.1,3.5,1.1
 | 
					 | 
				
			||||||
		c1,0,1.9-0.2,2.7-0.5c0.9-0.4,1.6-0.9,2.3-1.6l2.5,2.6c-0.9,1-2.1,1.8-3.4,2.4c-1.3,0.6-2.8,0.8-4.5,0.8c-1.9,0-3.6-0.4-5.1-1.2
 | 
					 | 
				
			||||||
		c-1.5-0.8-2.6-1.9-3.4-3.3c-0.8-1.4-1.2-3.1-1.2-5c0-1.9,0.4-3.5,1.2-5c0.8-1.4,1.9-2.6,3.4-3.4c1.4-0.8,3.1-1.2,4.9-1.2
 | 
					 | 
				
			||||||
		C95.5,45.6,97.8,46.4,99.3,48.1z M97.4,53.6c0-1.4-0.5-2.5-1.4-3.3c-0.9-0.8-2-1.2-3.4-1.2c-1.3,0-2.4,0.4-3.3,1.2
 | 
					 | 
				
			||||||
		c-0.9,0.8-1.5,1.9-1.7,3.3H97.4z"/>
 | 
					 | 
				
			||||||
	<path class="st3" d="M121.5,47.5c1.2,1.3,1.9,3.1,1.9,5.3v11.7h-4.6V54.1c0-1.3-0.4-2.3-1.1-3.1c-0.7-0.8-1.8-1.1-3-1.1
 | 
					 | 
				
			||||||
		c-1.5,0-2.7,0.5-3.6,1.5s-1.3,2.3-1.3,3.8v9.2h-4.5V45.7h4.5v3.5c1.3-2.4,3.5-3.6,6.7-3.7C118.5,45.5,120.2,46.2,121.5,47.5z"/>
 | 
					 | 
				
			||||||
	<path class="st3" d="M156.5,39.9h4.9l-8.3,24.5h-4.9l-5.6-18.6l-5.7,18.6h-4.8l-8.3-24.5h5l5.8,19.4l5.7-19.4h4.6l5.8,19.5
 | 
					 | 
				
			||||||
		L156.5,39.9z"/>
 | 
					 | 
				
			||||||
	<path class="st3" d="M168,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
 | 
					 | 
				
			||||||
		c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C166.9,37.7,167.6,37.9,168,38.4z M164,45.7h4.5v18.7H164
 | 
					 | 
				
			||||||
		V45.7z"/>
 | 
					 | 
				
			||||||
	<path class="st3" d="M174,39.9h16.9l0,4.1h-12.2v6.6h11.1v4.1h-11.1v9.7H174V39.9z"/>
 | 
					 | 
				
			||||||
	<path class="st3" d="M197.9,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
 | 
					 | 
				
			||||||
		c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C196.8,37.7,197.4,37.9,197.9,38.4z M193.8,45.7h4.5v18.7
 | 
					 | 
				
			||||||
		h-4.5V45.7z"/>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
<g>
 | 
					 | 
				
			||||||
</g>
 | 
					 | 
				
			||||||
</svg>
 | 
					 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 7.3 KiB  | 
| 
		 Before Width: | Height: | Size: 2.1 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/cig_wf160d.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 104 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/cig_wf188.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 80 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/cig_wf188n.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 80 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/cig_wf194c.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 75 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/cig_wf194c4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 75 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/cig_wf808.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 218 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/cig_wf809.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 158 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_eap101.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 140 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_eap102.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 121 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_ecs4100-12ph.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 44 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_ecw5211.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 192 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_ecw5410.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 197 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_oap100.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 50 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_spw2ac1200-lan-poe.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 59 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_spw2ac1200.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 59 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/edgecore_ssw2ac2600.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 51 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/hfcl_ion4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 72 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/hfcl_ion4.yml.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 72 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/indio_um-305ac.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 34 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/linksys_e8450-ubi.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 98 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/linksys_ea6350-v4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 89 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/linksys_ea6350.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 89 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/linksys_ea8300.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 204 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/tp-link_ec420-g1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 159 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/tplink_ec420.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 159 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/tplink_ex227.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 103 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/tplink_ex228.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 103 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/tplink_ex447.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 103 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/wallys_dr40x9.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 59 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/wallys_dr6018.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 80 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								images/device_types/wallys_dr6018_v4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 80 KiB  | 
| 
		 Before Width: | Height: | Size: 2.8 KiB  | 
| 
		 Before Width: | Height: | Size: 1.4 KiB  | 
| 
		 Before Width: | Height: | Size: 2.4 KiB  | 
@@ -2,7 +2,7 @@ openapi: 3.0.1
 | 
				
			|||||||
info:
 | 
					info:
 | 
				
			||||||
  title: uCentral gateway API
 | 
					  title: uCentral gateway API
 | 
				
			||||||
  description: A process to manage configuration for devices.
 | 
					  description: A process to manage configuration for devices.
 | 
				
			||||||
  version: 2.0.0
 | 
					  version: 2.5.0
 | 
				
			||||||
  license:
 | 
					  license:
 | 
				
			||||||
    name: BSD3
 | 
					    name: BSD3
 | 
				
			||||||
    url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
 | 
					    url: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE
 | 
				
			||||||
@@ -61,6 +61,11 @@ components:
 | 
				
			|||||||
                  - 6     # INTERNAL_ERROR,
 | 
					                  - 6     # INTERNAL_ERROR,
 | 
				
			||||||
                  - 7     # ACCESS_DENIED,
 | 
					                  - 7     # ACCESS_DENIED,
 | 
				
			||||||
                  - 8     # INVALID_TOKEN
 | 
					                  - 8     # INVALID_TOKEN
 | 
				
			||||||
 | 
					                  - 9     # EXPIRED_TOKEN
 | 
				
			||||||
 | 
					                  - 10    # RATE_LIMIT_EXCEEDED
 | 
				
			||||||
 | 
					                  - 11    # BAD_MFA_TRANSACTION
 | 
				
			||||||
 | 
					                  - 12    # MFA_FAILURE
 | 
				
			||||||
 | 
					                  - 13    # SECURITY_SERVICE_UNREACHABLE
 | 
				
			||||||
              ErrorDetails:
 | 
					              ErrorDetails:
 | 
				
			||||||
                type: string
 | 
					                type: string
 | 
				
			||||||
              ErrorDescription:
 | 
					              ErrorDescription:
 | 
				
			||||||
@@ -339,16 +344,6 @@ components:
 | 
				
			|||||||
          items:
 | 
					          items:
 | 
				
			||||||
            $ref: '#/components/schemas/NameValuePair'
 | 
					            $ref: '#/components/schemas/NameValuePair'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    LifetimeStatistics:
 | 
					 | 
				
			||||||
      type: object
 | 
					 | 
				
			||||||
      properties:
 | 
					 | 
				
			||||||
        serialNumber:
 | 
					 | 
				
			||||||
          type: string
 | 
					 | 
				
			||||||
        interfaces:
 | 
					 | 
				
			||||||
          type: array
 | 
					 | 
				
			||||||
          items:
 | 
					 | 
				
			||||||
            $ref: '#/components/schemas/InterfaceStatistics'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    CommandDetails:
 | 
					    CommandDetails:
 | 
				
			||||||
      type: object
 | 
					      type: object
 | 
				
			||||||
      properties:
 | 
					      properties:
 | 
				
			||||||
@@ -446,6 +441,8 @@ components:
 | 
				
			|||||||
        name:
 | 
					        name:
 | 
				
			||||||
          type: string
 | 
					          type: string
 | 
				
			||||||
        modelIds:
 | 
					        modelIds:
 | 
				
			||||||
 | 
					          type: array
 | 
				
			||||||
 | 
					          items:
 | 
				
			||||||
            type: string
 | 
					            type: string
 | 
				
			||||||
        description:
 | 
					        description:
 | 
				
			||||||
          type: string
 | 
					          type: string
 | 
				
			||||||
@@ -475,6 +472,8 @@ components:
 | 
				
			|||||||
        when:
 | 
					        when:
 | 
				
			||||||
          type: integer
 | 
					          type: integer
 | 
				
			||||||
          format: int64
 | 
					          format: int64
 | 
				
			||||||
 | 
					        keepRedirector:
 | 
				
			||||||
 | 
					          type: boolean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    RebootRequest:
 | 
					    RebootRequest:
 | 
				
			||||||
      type: object
 | 
					      type: object
 | 
				
			||||||
@@ -651,8 +650,16 @@ components:
 | 
				
			|||||||
          type: string
 | 
					          type: string
 | 
				
			||||||
        interval:
 | 
					        interval:
 | 
				
			||||||
          type: integer
 | 
					          type: integer
 | 
				
			||||||
          example:
 | 
					          description:
 | 
				
			||||||
            0 - means to stop streaming, values 1-120 in seconds.
 | 
					            0 - means to stop streaming, values 1-120 in seconds.
 | 
				
			||||||
 | 
					        lifetime:
 | 
				
			||||||
 | 
					          type: integer
 | 
				
			||||||
 | 
					          format: int64
 | 
				
			||||||
 | 
					          description: how long should the telemetry run
 | 
				
			||||||
 | 
					        kafka:
 | 
				
			||||||
 | 
					          type: boolean
 | 
				
			||||||
 | 
					          default: false
 | 
				
			||||||
 | 
					          description: set to true to start kafka telemetry, false to start websocket telemetry
 | 
				
			||||||
        types:
 | 
					        types:
 | 
				
			||||||
          type: array
 | 
					          type: array
 | 
				
			||||||
          items:
 | 
					          items:
 | 
				
			||||||
@@ -663,7 +670,8 @@ components:
 | 
				
			|||||||
              - state
 | 
					              - state
 | 
				
			||||||
        uuid:
 | 
					        uuid:
 | 
				
			||||||
          type: string
 | 
					          type: string
 | 
				
			||||||
          example:
 | 
					          format: uuid
 | 
				
			||||||
 | 
					          description:
 | 
				
			||||||
            only valid when terminating a stream
 | 
					            only valid when terminating a stream
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    TelemetryStreamResponse:
 | 
					    TelemetryStreamResponse:
 | 
				
			||||||
@@ -679,6 +687,24 @@ components:
 | 
				
			|||||||
          format: uri
 | 
					          format: uri
 | 
				
			||||||
          example:
 | 
					          example:
 | 
				
			||||||
            wss://host.domain:port/endpoint
 | 
					            wss://host.domain:port/endpoint
 | 
				
			||||||
 | 
					        action:
 | 
				
			||||||
 | 
					          type: string
 | 
				
			||||||
 | 
					          description: what action resulted from running the command
 | 
				
			||||||
 | 
					        status:
 | 
				
			||||||
 | 
					          type: object
 | 
				
			||||||
 | 
					          properties:
 | 
				
			||||||
 | 
					            running:
 | 
				
			||||||
 | 
					              type: boolean
 | 
				
			||||||
 | 
					            interval:
 | 
				
			||||||
 | 
					              type: integer
 | 
				
			||||||
 | 
					            websocketTimer:
 | 
				
			||||||
 | 
					              type: integer
 | 
				
			||||||
 | 
					            kafkaTimer:
 | 
				
			||||||
 | 
					              type: integer
 | 
				
			||||||
 | 
					            websocketClients:
 | 
				
			||||||
 | 
					              type: integer
 | 
				
			||||||
 | 
					            kafkaClients:
 | 
				
			||||||
 | 
					              type: integer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #########################################################################################
 | 
					    #########################################################################################
 | 
				
			||||||
    ##
 | 
					    ##
 | 
				
			||||||
@@ -990,7 +1016,7 @@ components:
 | 
				
			|||||||
    CapabilitiesModelList:
 | 
					    CapabilitiesModelList:
 | 
				
			||||||
      type: object
 | 
					      type: object
 | 
				
			||||||
      properties:
 | 
					      properties:
 | 
				
			||||||
        devices:
 | 
					        device_types:
 | 
				
			||||||
          type: array
 | 
					          type: array
 | 
				
			||||||
          items:
 | 
					          items:
 | 
				
			||||||
            $ref: '#/components/schemas/CapabilitiesModel'
 | 
					            $ref: '#/components/schemas/CapabilitiesModel'
 | 
				
			||||||
@@ -1703,13 +1729,7 @@ paths:
 | 
				
			|||||||
            format: int64
 | 
					            format: int64
 | 
				
			||||||
          required: false
 | 
					          required: false
 | 
				
			||||||
        - in: query
 | 
					        - in: query
 | 
				
			||||||
          description: Selecting this option means the LifetimeStatistics will be returned. All other parameters will be ignored.
 | 
					          description: Selecting this option means the Last Statistics block
 | 
				
			||||||
          name: lifetime
 | 
					 | 
				
			||||||
          schema:
 | 
					 | 
				
			||||||
            type: boolean
 | 
					 | 
				
			||||||
          required: false
 | 
					 | 
				
			||||||
        - in: query
 | 
					 | 
				
			||||||
          description: Selecting this option means the LifetimeStatistics will be returned. All other parameters will be ignored.
 | 
					 | 
				
			||||||
          name: lastOnly
 | 
					          name: lastOnly
 | 
				
			||||||
          schema:
 | 
					          schema:
 | 
				
			||||||
            type: boolean
 | 
					            type: boolean
 | 
				
			||||||
@@ -1729,7 +1749,6 @@ paths:
 | 
				
			|||||||
              schema:
 | 
					              schema:
 | 
				
			||||||
                oneOf:
 | 
					                oneOf:
 | 
				
			||||||
                  - $ref: '#/components/schemas/StatisticsRecords'
 | 
					                  - $ref: '#/components/schemas/StatisticsRecords'
 | 
				
			||||||
                  - $ref: '#/components/schemas/LifetimeStatistics'
 | 
					 | 
				
			||||||
        403:
 | 
					        403:
 | 
				
			||||||
          $ref: '#/components/responses/Unauthorized'
 | 
					          $ref: '#/components/responses/Unauthorized'
 | 
				
			||||||
        404:
 | 
					        404:
 | 
				
			||||||
@@ -1847,6 +1866,54 @@ paths:
 | 
				
			|||||||
        404:
 | 
					        404:
 | 
				
			||||||
          $ref: '#/components/responses/NotFound'
 | 
					          $ref: '#/components/responses/NotFound'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /device/{serialNumber}/ping:
 | 
				
			||||||
 | 
					    post:
 | 
				
			||||||
 | 
					      tags:
 | 
				
			||||||
 | 
					        - Commands
 | 
				
			||||||
 | 
					      summary: Configure a device.
 | 
				
			||||||
 | 
					      operationId: createConfigurationForADevice
 | 
				
			||||||
 | 
					      parameters:
 | 
				
			||||||
 | 
					        - in: path
 | 
				
			||||||
 | 
					          name: serialNumber
 | 
				
			||||||
 | 
					          schema:
 | 
				
			||||||
 | 
					            type: string
 | 
				
			||||||
 | 
					          required: true
 | 
				
			||||||
 | 
					      requestBody:
 | 
				
			||||||
 | 
					        description: Command details
 | 
				
			||||||
 | 
					        content:
 | 
				
			||||||
 | 
					          application/json:
 | 
				
			||||||
 | 
					            schema:
 | 
				
			||||||
 | 
					              type: object
 | 
				
			||||||
 | 
					              properties:
 | 
				
			||||||
 | 
					                serialNumber:
 | 
				
			||||||
 | 
					                  type: string
 | 
				
			||||||
 | 
					      responses:
 | 
				
			||||||
 | 
					        200:
 | 
				
			||||||
 | 
					          description:
 | 
				
			||||||
 | 
					            Successfull ping os a device
 | 
				
			||||||
 | 
					          content:
 | 
				
			||||||
 | 
					            application/json:
 | 
				
			||||||
 | 
					              schema:
 | 
				
			||||||
 | 
					                type: object
 | 
				
			||||||
 | 
					                properties:
 | 
				
			||||||
 | 
					                  serialNumber:
 | 
				
			||||||
 | 
					                    type: string
 | 
				
			||||||
 | 
					                  currentUTCTime:
 | 
				
			||||||
 | 
					                    type: integer
 | 
				
			||||||
 | 
					                    format: int64
 | 
				
			||||||
 | 
					                  deviceUTCTime:
 | 
				
			||||||
 | 
					                    type: integer
 | 
				
			||||||
 | 
					                    format: int64
 | 
				
			||||||
 | 
					                  latency:
 | 
				
			||||||
 | 
					                    type: number
 | 
				
			||||||
 | 
					                  configurationUUID:
 | 
				
			||||||
 | 
					                    type: integer
 | 
				
			||||||
 | 
					                    format: int64
 | 
				
			||||||
 | 
					        403:
 | 
				
			||||||
 | 
					          $ref: '#/components/responses/Unauthorized'
 | 
				
			||||||
 | 
					        404:
 | 
				
			||||||
 | 
					          $ref: '#/components/responses/NotFound'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /device/{serialNumber}/upgrade:
 | 
					  /device/{serialNumber}/upgrade:
 | 
				
			||||||
    post:
 | 
					    post:
 | 
				
			||||||
      tags:
 | 
					      tags:
 | 
				
			||||||
@@ -2067,6 +2134,12 @@ paths:
 | 
				
			|||||||
          schema:
 | 
					          schema:
 | 
				
			||||||
            type: string
 | 
					            type: string
 | 
				
			||||||
          required: true
 | 
					          required: true
 | 
				
			||||||
 | 
					        - in: query
 | 
				
			||||||
 | 
					          name: statusOnly
 | 
				
			||||||
 | 
					          schema:
 | 
				
			||||||
 | 
					            type: boolean
 | 
				
			||||||
 | 
					            default: false
 | 
				
			||||||
 | 
					          required: false
 | 
				
			||||||
      requestBody:
 | 
					      requestBody:
 | 
				
			||||||
        description: Message request details
 | 
					        description: Message request details
 | 
				
			||||||
        content:
 | 
					        content:
 | 
				
			||||||
@@ -2348,6 +2421,39 @@ paths:
 | 
				
			|||||||
        404:
 | 
					        404:
 | 
				
			||||||
          $ref: '#/components/responses/NotFound'
 | 
					          $ref: '#/components/responses/NotFound'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /iptocountry:
 | 
				
			||||||
 | 
					    get:
 | 
				
			||||||
 | 
					      tags:
 | 
				
			||||||
 | 
					        - Utility
 | 
				
			||||||
 | 
					      summary: Get the country code for an IP address
 | 
				
			||||||
 | 
					      operationId: getIpToCountry
 | 
				
			||||||
 | 
					      parameters:
 | 
				
			||||||
 | 
					        - in: query
 | 
				
			||||||
 | 
					          name: iplist
 | 
				
			||||||
 | 
					          schema:
 | 
				
			||||||
 | 
					            type: string
 | 
				
			||||||
 | 
					            example:
 | 
				
			||||||
 | 
					              10.2.2.2,10.3.4.3
 | 
				
			||||||
 | 
					          required: true
 | 
				
			||||||
 | 
					      responses:
 | 
				
			||||||
 | 
					        200:
 | 
				
			||||||
 | 
					          description: List of country codes.
 | 
				
			||||||
 | 
					          content:
 | 
				
			||||||
 | 
					            application/json:
 | 
				
			||||||
 | 
					              schema:
 | 
				
			||||||
 | 
					                type: object
 | 
				
			||||||
 | 
					                properties:
 | 
				
			||||||
 | 
					                  enabled:
 | 
				
			||||||
 | 
					                    type: boolean
 | 
				
			||||||
 | 
					                  countryCodes:
 | 
				
			||||||
 | 
					                    type: array
 | 
				
			||||||
 | 
					                    items:
 | 
				
			||||||
 | 
					                      type: string
 | 
				
			||||||
 | 
					        403:
 | 
				
			||||||
 | 
					          $ref: '#/components/responses/Unauthorized'
 | 
				
			||||||
 | 
					        404:
 | 
				
			||||||
 | 
					          $ref: '#/components/responses/NotFound'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  #########################################################################################
 | 
					  #########################################################################################
 | 
				
			||||||
  ##
 | 
					  ##
 | 
				
			||||||
  ## These are endpoints that all services in the uCentral stack must provide
 | 
					  ## These are endpoints that all services in the uCentral stack must provide
 | 
				
			||||||
@@ -75,17 +75,26 @@ openwifi.devicetypes.0 = AP:linksys_ea8300,edgecore_eap101,linksys_e8450-ubi
 | 
				
			|||||||
openwifi.devicetypes.1 = SWITCH:edgecore_ecs4100-12ph
 | 
					openwifi.devicetypes.1 = SWITCH:edgecore_ecs4100-12ph
 | 
				
			||||||
openwifi.devicetypes.2 = IOT:esp32
 | 
					openwifi.devicetypes.2 = IOT:esp32
 | 
				
			||||||
oui.download.uri = https://linuxnet.ca/ieee/oui.txt
 | 
					oui.download.uri = https://linuxnet.ca/ieee/oui.txt
 | 
				
			||||||
firmware.autoupdate.policy.default = auto
 | 
					
 | 
				
			||||||
 | 
					iptocountry.default = US
 | 
				
			||||||
 | 
					iptocountry.provider = ipinfo
 | 
				
			||||||
 | 
					#iptocountry.provider = ipdata
 | 
				
			||||||
 | 
					iptocountry.ipinfo.token =
 | 
				
			||||||
 | 
					iptocountry.ipdata.apikey =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					autoprovisioning.process = prov,default
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# rtty
 | 
					# rtty
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					rtty.internal = true
 | 
				
			||||||
rtty.enabled = true
 | 
					rtty.enabled = true
 | 
				
			||||||
rtty.server = rtty-tip.arilia.com
 | 
					rtty.server = rtty-tip.arilia.com
 | 
				
			||||||
rtty.port = 5912
 | 
					rtty.port = 5912
 | 
				
			||||||
rtty.token = 96181c567b4d0d98c50f127230068fa8
 | 
					rtty.token = 96181c567b4d0d98c50f127230068fa8
 | 
				
			||||||
rtty.timeout = 60
 | 
					rtty.timeout = 60
 | 
				
			||||||
rtty.viewport = 5913
 | 
					rtty.viewport = 5913
 | 
				
			||||||
 | 
					rtty.assets = $OWGW_ROOT/rtty_ui
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#############################
 | 
					#############################
 | 
				
			||||||
# Generic information for all micro services
 | 
					# Generic information for all micro services
 | 
				
			||||||
@@ -155,38 +164,6 @@ archiver.db.3.keep = 7
 | 
				
			|||||||
# Logging: please leave as is for now.
 | 
					# Logging: please leave as is for now.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
########################################################################
 | 
					########################################################################
 | 
				
			||||||
 | 
					logging.type = file
 | 
				
			||||||
logging.formatters.f1.class = PatternFormatter
 | 
					logging.path = $OWGW_ROOT/logs
 | 
				
			||||||
logging.formatters.f1.pattern = %s: [%p] %t
 | 
					logging.level = debug
 | 
				
			||||||
logging.formatters.f1.times = UTC
 | 
					 | 
				
			||||||
logging.channels.c1.class = ConsoleChannel
 | 
					 | 
				
			||||||
logging.channels.c1.formatter = f1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# This is where the logs will be written. This path MUST exist
 | 
					 | 
				
			||||||
logging.channels.c2.class = FileChannel
 | 
					 | 
				
			||||||
logging.channels.c2.path = $OWGW_ROOT/logs/log
 | 
					 | 
				
			||||||
logging.channels.c2.formatter.class = PatternFormatter
 | 
					 | 
				
			||||||
logging.channels.c2.formatter.pattern = %Y-%m-%d %H:%M:%S %s: [%p] %t
 | 
					 | 
				
			||||||
logging.channels.c2.rotation = 20 M
 | 
					 | 
				
			||||||
logging.channels.c2.archive = timestamp
 | 
					 | 
				
			||||||
logging.channels.c2.purgeCount = 20
 | 
					 | 
				
			||||||
logging.channels.c3.class = ConsoleChannel
 | 
					 | 
				
			||||||
logging.channels.c3.pattern = %s: [%p] %t
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# External Channel
 | 
					 | 
				
			||||||
logging.loggers.root.channel = c2
 | 
					 | 
				
			||||||
logging.loggers.root.level = debug
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Inline Channel with PatternFormatter
 | 
					 | 
				
			||||||
# logging.loggers.l1.name = logger1
 | 
					 | 
				
			||||||
# logging.loggers.l1.channel.class = ConsoleChannel
 | 
					 | 
				
			||||||
# logging.loggers.l1.channel.pattern = %s: [%p] %t
 | 
					 | 
				
			||||||
# logging.loggers.l1.level = information
 | 
					 | 
				
			||||||
# SplitterChannel
 | 
					 | 
				
			||||||
# logging.channels.splitter.class = SplitterChannel
 | 
					 | 
				
			||||||
# logging.channels.splitter.channels = l1,l2
 | 
					 | 
				
			||||||
# logging.loggers.l2.name = logger2
 | 
					 | 
				
			||||||
# logging.loggers.l2.channel = splitter
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -52,8 +52,8 @@ openwifi.fileuploader.host.0.cert = ${FILEUPLOADER_HOST_CERT}
 | 
				
			|||||||
openwifi.fileuploader.host.0.key = ${FILEUPLOADER_HOST_KEY}
 | 
					openwifi.fileuploader.host.0.key = ${FILEUPLOADER_HOST_KEY}
 | 
				
			||||||
openwifi.fileuploader.host.0.key.password = ${FILEUPLOADER_HOST_KEY_PASSWORD}
 | 
					openwifi.fileuploader.host.0.key.password = ${FILEUPLOADER_HOST_KEY_PASSWORD}
 | 
				
			||||||
openwifi.fileuploader.path = ${FILEUPLOADER_PATH}
 | 
					openwifi.fileuploader.path = ${FILEUPLOADER_PATH}
 | 
				
			||||||
openwifi.fileuploader.uri = ${FILEUPLOADER_URI}
 | 
					 | 
				
			||||||
openwifi.fileuploader.maxsize = 10000
 | 
					openwifi.fileuploader.maxsize = 10000
 | 
				
			||||||
 | 
					openwifi.fileuploader.uri = ${FILEUPLOADER_URI}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Generic section that all microservices must have
 | 
					# Generic section that all microservices must have
 | 
				
			||||||
@@ -75,7 +75,14 @@ openwifi.devicetypes.0 = AP:linksys_ea8300,edgecore_eap101,linksys_e8450-ubi
 | 
				
			|||||||
openwifi.devicetypes.1 = SWITCH:edgecore_ecs4100-12ph
 | 
					openwifi.devicetypes.1 = SWITCH:edgecore_ecs4100-12ph
 | 
				
			||||||
openwifi.devicetypes.2 = IOT:esp32
 | 
					openwifi.devicetypes.2 = IOT:esp32
 | 
				
			||||||
oui.download.uri = https://linuxnet.ca/ieee/oui.txt
 | 
					oui.download.uri = https://linuxnet.ca/ieee/oui.txt
 | 
				
			||||||
firmware.autoupdate.policy.default = auto
 | 
					simulatorid = ${SIMULATORID}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					iptocountry.default = US
 | 
				
			||||||
 | 
					iptocountry.provider = ${IPTOCOUNTRY_PROVIDER}
 | 
				
			||||||
 | 
					iptocountry.ipinfo.token = ${IPTOCOUNTRY_IPINFO_TOKEN}
 | 
				
			||||||
 | 
					iptocountry.ipdata.apikey = ${IPTOCOUNTRY_IPDATA_APIKEY}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					autoprovisioning.process = ${AUTOPROVISIONING_PROCESS}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# rtty
 | 
					# rtty
 | 
				
			||||||
@@ -152,38 +159,6 @@ archiver.db.3.keep = 7
 | 
				
			|||||||
# Logging: please leave as is for now.
 | 
					# Logging: please leave as is for now.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
########################################################################
 | 
					########################################################################
 | 
				
			||||||
 | 
					logging.type = console
 | 
				
			||||||
logging.formatters.f1.class = PatternFormatter
 | 
					logging.path = $OWGW_ROOT/logs
 | 
				
			||||||
logging.formatters.f1.pattern = %Y-%m-%d %H:%M:%S %s: [%p] %t
 | 
					logging.level = debug
 | 
				
			||||||
logging.formatters.f1.times = UTC
 | 
					 | 
				
			||||||
logging.channels.c1.class = ConsoleChannel
 | 
					 | 
				
			||||||
logging.channels.c1.formatter = f1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# This is where the logs will be written. This path MUST exist
 | 
					 | 
				
			||||||
logging.channels.c2.class = FileChannel
 | 
					 | 
				
			||||||
logging.channels.c2.path = $OWGW_ROOT/logs/log
 | 
					 | 
				
			||||||
logging.channels.c2.formatter.class = PatternFormatter
 | 
					 | 
				
			||||||
logging.channels.c2.formatter.pattern = %Y-%m-%d %H:%M:%S %s: [%p] %t
 | 
					 | 
				
			||||||
logging.channels.c2.rotation = 20 M
 | 
					 | 
				
			||||||
logging.channels.c2.archive = timestamp
 | 
					 | 
				
			||||||
logging.channels.c2.purgeCount = 20
 | 
					 | 
				
			||||||
logging.channels.c3.class = ConsoleChannel
 | 
					 | 
				
			||||||
logging.channels.c3.pattern = %s: [%p] %t
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# External Channel
 | 
					 | 
				
			||||||
logging.loggers.root.channel = c1
 | 
					 | 
				
			||||||
logging.loggers.root.level = debug
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Inline Channel with PatternFormatter
 | 
					 | 
				
			||||||
# logging.loggers.l1.name = logger1
 | 
					 | 
				
			||||||
# logging.loggers.l1.channel.class = ConsoleChannel
 | 
					 | 
				
			||||||
# logging.loggers.l1.channel.pattern = %s: [%p] %t
 | 
					 | 
				
			||||||
# logging.loggers.l1.level = information
 | 
					 | 
				
			||||||
# SplitterChannel
 | 
					 | 
				
			||||||
# logging.channels.splitter.class = SplitterChannel
 | 
					 | 
				
			||||||
# logging.channels.splitter.channels = l1,l2
 | 
					 | 
				
			||||||
# logging.loggers.l2.name = logger2
 | 
					 | 
				
			||||||
# logging.loggers.l2.channel = splitter
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,29 +13,30 @@ then
 | 
				
			|||||||
  exit 1
 | 
					  exit 1
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [[ "${OWSEC}" == "" ]]
 | 
					 | 
				
			||||||
then
 | 
					 | 
				
			||||||
  echo "You must set the variable OWSEC in order to use this script. Something like"
 | 
					 | 
				
			||||||
  echo "OWSEC=security.isp.com:16001"
 | 
					 | 
				
			||||||
  exit 1
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if [[ "${OWSEC_USERNAME}" == "" ]]
 | 
					 | 
				
			||||||
then
 | 
					 | 
				
			||||||
  echo "You must set the variable OWSEC_USERNAME in order to use this script. Something like"
 | 
					 | 
				
			||||||
  echo "OWSEC_USERNAME=tip@ucentral.com"
 | 
					 | 
				
			||||||
  exit 1
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if [[ "${OWSEC_PASSWORD}" == "" ]]
 | 
					 | 
				
			||||||
then
 | 
					 | 
				
			||||||
  echo "You must set the variable OWSEC_PASSWORD in order to use this script. Something like"
 | 
					 | 
				
			||||||
  echo "OWSEC_PASSWORD=openwifi"
 | 
					 | 
				
			||||||
  exit 1
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [[ "${READINESS_METHOD}" == "systeminfo" ]]
 | 
					if [[ "${READINESS_METHOD}" == "systeminfo" ]]
 | 
				
			||||||
then
 | 
					then
 | 
				
			||||||
 | 
					  if [[ "${OWSEC}" == "" ]]
 | 
				
			||||||
 | 
					  then
 | 
				
			||||||
 | 
					    echo "You must set the variable OWSEC in order to use this script. Something like"
 | 
				
			||||||
 | 
					    echo "OWSEC=security.isp.com:16001"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if [[ "${OWSEC_USERNAME}" == "" ]]
 | 
				
			||||||
 | 
					  then
 | 
				
			||||||
 | 
					    echo "You must set the variable OWSEC_USERNAME in order to use this script. Something like"
 | 
				
			||||||
 | 
					    echo "OWSEC_USERNAME=tip@ucentral.com"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if [[ "${OWSEC_PASSWORD}" == "" ]]
 | 
				
			||||||
 | 
					  then
 | 
				
			||||||
 | 
					    echo "You must set the variable OWSEC_PASSWORD in order to use this script. Something like"
 | 
				
			||||||
 | 
					    echo "OWSEC_PASSWORD=openwifi"
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Get OAuth token from OWSEC and cache it or use cached one
 | 
					  # Get OAuth token from OWSEC and cache it or use cached one
 | 
				
			||||||
  payload="{ \"userId\" : \"$OWSEC_USERNAME\" , \"password\" : \"$OWSEC_PASSWORD\" }"
 | 
					  payload="{ \"userId\" : \"$OWSEC_USERNAME\" , \"password\" : \"$OWSEC_PASSWORD\" }"
 | 
				
			||||||
  if [[ -f "/tmp/token" ]]
 | 
					  if [[ -f "/tmp/token" ]]
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								rtty_ui/css/app.0e046291.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								rtty_ui/css/chunk-vendors.b221ddbd.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								rtty_ui/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.1 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								rtty_ui/fonts/ionicons.143146fa.woff2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								rtty_ui/fonts/ionicons.99ac3308.woff
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								rtty_ui/fonts/ionicons.d535a25a.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										32
									
								
								rtty_ui/img/iconfont.84ceafda.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" standalone="no"?>
 | 
				
			||||||
 | 
					<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
 | 
				
			||||||
 | 
					<!--
 | 
				
			||||||
 | 
					2013-9-30: Created.
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					<svg>
 | 
				
			||||||
 | 
					<metadata>
 | 
				
			||||||
 | 
					Created by iconfont
 | 
				
			||||||
 | 
					</metadata>
 | 
				
			||||||
 | 
					<defs>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<font id="iconfont" horiz-adv-x="1024" >
 | 
				
			||||||
 | 
					  <font-face
 | 
				
			||||||
 | 
					    font-family="iconfont"
 | 
				
			||||||
 | 
					    font-weight="500"
 | 
				
			||||||
 | 
					    font-stretch="normal"
 | 
				
			||||||
 | 
					    units-per-em="1024"
 | 
				
			||||||
 | 
					    ascent="896"
 | 
				
			||||||
 | 
					    descent="-128"
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					    <missing-glyph />
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <glyph glyph-name="web" unicode="" d="M983.806 667.807c19.143 71.103 27.347 207.84-98.45 226.982-103.92 10.94-224.249-54.694-287.147-98.45-19.144 2.735-43.756 5.47-65.634 5.47-164.084 2.734-270.738-51.96-363.72-172.289-32.816-43.755-62.898-117.593-73.837-199.635 46.49 79.307 188.697 224.248 336.372 281.677 0 0-226.983-161.349-336.372-391.066v-2.735c-5.47-10.939-10.939-19.143-16.408-32.817-109.39-270.738-19.143-388.331 62.899-407.475 76.572-19.143 183.226 16.409 268.003 109.39 144.94-32.817 289.882 5.47 341.841 32.816C852.54 74.37 923.642 175.555 940.05 276.74H663.842s-13.674-87.511-161.349-87.511c-136.737 0-144.94 158.614-144.94 158.614h590.701s10.939 172.288-73.838 287.147c-49.225 62.899-112.124 120.328-199.635 150.41 27.347 19.143 73.838 51.96 114.859 60.164 76.572 19.143 125.797 8.204 158.614-49.225 43.756-76.572-24.612-251.595-24.612-251.595s38.286 49.225 60.164 123.063z m-612.58-672.744c-117.594-95.716-213.31-84.777-251.595-27.347-32.817 51.96-38.287 139.47 0 262.534 19.143-46.49 46.49-92.981 87.511-134.002 49.225-49.225 106.655-82.042 164.084-101.185z m-5.47 494.986s5.47 114.859 128.533 123.063c109.389 10.939 164.084-38.286 180.492-128.532l-309.025 5.47z"  horiz-adv-x="1024" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <glyph glyph-name="shell" unicode="" d="M810.666667 768c46.933333 0 85.333333-38.4 85.333333-85.333333v-597.333334c0-46.933333-38.4-85.333333-85.333333-85.333333H213.333333c-46.933333 0-85.333333 38.4-85.333333 85.333333V682.666667c0 46.933333 38.4 85.333333 85.333333 85.333333z m-18.090667-597.333333h-267.434667v-55.722667h267.434667V170.666667zM250.666667 469.034667v-69.717334l176.469333-64.426666 5.546667-1.194667-0.298667-1.706667-5.248-0.597333-176.469333-65.92v-69.717333l251.989333 108.501333v56.32l-251.989333 108.458667z"  horiz-adv-x="1024" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </font>
 | 
				
			||||||
 | 
					</defs></svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 2.2 KiB  | 
							
								
								
									
										870
									
								
								rtty_ui/img/ionicons.a2c4a261.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 542 KiB  | 
							
								
								
									
										1
									
								
								rtty_ui/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>Rttys</title><link href="/css/app.0e046291.css" rel="preload" as="style"><link href="/css/chunk-vendors.b221ddbd.css" rel="preload" as="style"><link href="/js/app.79bf330a.js" rel="preload" as="script"><link href="/js/chunk-vendors.7fd2577a.js" rel="preload" as="script"><link href="/css/chunk-vendors.b221ddbd.css" rel="stylesheet"><link href="/css/app.0e046291.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but Rttys doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.7fd2577a.js"></script><script src="/js/app.79bf330a.js"></script></body></html>
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								rtty_ui/js/app.79bf330a.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								rtty_ui/js/chunk-vendors.7fd2577a.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										147
									
								
								src/CapabilitiesCache.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,147 @@
 | 
				
			|||||||
 | 
					//
 | 
				
			||||||
 | 
					// Created by stephane bourque on 2021-11-17.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "framework/MicroService.h"
 | 
				
			||||||
 | 
					#include "nlohmann/json.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace OpenWifi {
 | 
				
			||||||
 | 
						const std::string PlatformCacheFileName{"/plat_cache.json"};
 | 
				
			||||||
 | 
						const std::string CapabilitiesCacheFileName{"/caps_cache.json"};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						typedef std::map<std::string,nlohmann::json>	CapabilitiesCache_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						class CapabilitiesCache {
 | 
				
			||||||
 | 
						  public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							static auto instance() {
 | 
				
			||||||
 | 
								static auto instance = new CapabilitiesCache;
 | 
				
			||||||
 | 
								return instance;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline void Add(const std::string & DeviceType, const std::string & Platform, const std::string & FullCapabilities) {
 | 
				
			||||||
 | 
								if(DeviceType.empty() || Platform.empty())
 | 
				
			||||||
 | 
									return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								std::lock_guard	G(Mutex_);
 | 
				
			||||||
 | 
								if(!PlatformsLoaded_)
 | 
				
			||||||
 | 
									LoadPlatforms();
 | 
				
			||||||
 | 
								auto P = Poco::toUpper(Platform);
 | 
				
			||||||
 | 
								auto Hint = Platforms_.find(DeviceType);
 | 
				
			||||||
 | 
								if(Hint==Platforms_.end()) {
 | 
				
			||||||
 | 
									Platforms_.insert(std::make_pair(DeviceType,P));
 | 
				
			||||||
 | 
									SavePlatforms();
 | 
				
			||||||
 | 
								} else if(Hint->second != P) {
 | 
				
			||||||
 | 
									Hint->second = P;
 | 
				
			||||||
 | 
									SavePlatforms();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if(!CapabilitiesLoaded_)
 | 
				
			||||||
 | 
									LoadCapabilities();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								auto CapHint = Capabilities_.find(DeviceType);
 | 
				
			||||||
 | 
								if(CapHint==Capabilities_.end()) {
 | 
				
			||||||
 | 
									Capabilities_[DeviceType] = nlohmann::json::parse(FullCapabilities);
 | 
				
			||||||
 | 
									SaveCapabilities();
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									CapHint->second = nlohmann::json::parse(FullCapabilities);
 | 
				
			||||||
 | 
									SaveCapabilities();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline std::string GetPlatform(const std::string & DeviceType) {
 | 
				
			||||||
 | 
								std::lock_guard	G(Mutex_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if(!PlatformsLoaded_) {
 | 
				
			||||||
 | 
									LoadPlatforms();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								auto Hint = Platforms_.find(DeviceType);
 | 
				
			||||||
 | 
								if(Hint==Platforms_.end())
 | 
				
			||||||
 | 
									return "AP";
 | 
				
			||||||
 | 
								return Hint->second;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline nlohmann::json GetCapabilities(const std::string & DeviceType) {
 | 
				
			||||||
 | 
								std::lock_guard	G(Mutex_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if(!CapabilitiesLoaded_) {
 | 
				
			||||||
 | 
									LoadCapabilities();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								auto Hint = Capabilities_.find(DeviceType);
 | 
				
			||||||
 | 
								if(Hint==Capabilities_.end())
 | 
				
			||||||
 | 
									return nlohmann::json{};
 | 
				
			||||||
 | 
								return Hint->second;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline const CapabilitiesCache_t & AllCapabilities() {
 | 
				
			||||||
 | 
								std::lock_guard	G(Mutex_);
 | 
				
			||||||
 | 
								if(!CapabilitiesLoaded_) {
 | 
				
			||||||
 | 
									LoadCapabilities();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return Capabilities_;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						  private:
 | 
				
			||||||
 | 
							std::recursive_mutex					Mutex_;
 | 
				
			||||||
 | 
							std::atomic_bool 						PlatformsLoaded_=false;
 | 
				
			||||||
 | 
							std::atomic_bool 						CapabilitiesLoaded_=false;
 | 
				
			||||||
 | 
							std::map<std::string,std::string>		Platforms_;
 | 
				
			||||||
 | 
							CapabilitiesCache_t						Capabilities_;
 | 
				
			||||||
 | 
							std::string 							PlatformCacheFileName_{ MicroService::instance().DataDir()+PlatformCacheFileName };
 | 
				
			||||||
 | 
							std::string 							CapabilitiesCacheFileName_{ MicroService::instance().DataDir()+CapabilitiesCacheFileName };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline void LoadPlatforms() {
 | 
				
			||||||
 | 
								try {
 | 
				
			||||||
 | 
									std::ifstream i(PlatformCacheFileName_);
 | 
				
			||||||
 | 
									nlohmann::json cache;
 | 
				
			||||||
 | 
									i >> cache;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									for(const auto &[Type,Platform]:cache.items()) {
 | 
				
			||||||
 | 
										Platforms_[Type] = Platform;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} catch(...) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								PlatformsLoaded_ = true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline void SavePlatforms() {
 | 
				
			||||||
 | 
								try {
 | 
				
			||||||
 | 
									std::ofstream i(PlatformCacheFileName_);
 | 
				
			||||||
 | 
									nlohmann::json cache(Platforms_);
 | 
				
			||||||
 | 
									i << cache;
 | 
				
			||||||
 | 
								} catch (...) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline void LoadCapabilities() {
 | 
				
			||||||
 | 
								try {
 | 
				
			||||||
 | 
									std::ifstream i(CapabilitiesCacheFileName_, std::ios_base::binary|std::ios_base::in);
 | 
				
			||||||
 | 
									nlohmann::json cache;
 | 
				
			||||||
 | 
									i >> cache;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									for(const auto &[Type,Caps]:cache.items()) {
 | 
				
			||||||
 | 
										Capabilities_[Type] = Caps;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} catch(...) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								CapabilitiesLoaded_ = true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline void SaveCapabilities() {
 | 
				
			||||||
 | 
								try {
 | 
				
			||||||
 | 
									std::ofstream i(CapabilitiesCacheFileName_, std::ios_base::trunc | std::ios_base::out | std::ios_base::binary );
 | 
				
			||||||
 | 
									nlohmann::json cache(Capabilities_);
 | 
				
			||||||
 | 
									i << cache;
 | 
				
			||||||
 | 
								} catch (...) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -17,9 +17,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi::Config {
 | 
					namespace OpenWifi::Config {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static std::string DefaultConfiguration;
 | 
						const static std::string BasicConfig {
 | 
				
			||||||
 | 
					 | 
				
			||||||
	static std::string BasicConfig {
 | 
					 | 
				
			||||||
			R"lit({
 | 
								R"lit({
 | 
				
			||||||
			"uuid": 1,
 | 
								"uuid": 1,
 | 
				
			||||||
			"radios": [
 | 
								"radios": [
 | 
				
			||||||
@@ -117,38 +115,38 @@ namespace OpenWifi::Config {
 | 
				
			|||||||
					"port": 22
 | 
										"port": 22
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
})lit"};
 | 
							})lit"};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void SetBasicConfigFile() {
 | 
						void Config::SetBasicConfigFile() {
 | 
				
			||||||
		Poco::File DefaultConfigFileName{MicroService::instance().DataDir()+"/default_config.json"};
 | 
							try {
 | 
				
			||||||
		DefaultConfiguration = BasicConfig;
 | 
								Poco::File DefaultConfigFileName{MicroService::instance().DataDir() + "/default_config.json"};
 | 
				
			||||||
		std::ofstream F;
 | 
								DefaultConfiguration_ = BasicConfig;
 | 
				
			||||||
		F.open(DefaultConfigFileName.path(),std::ios::binary);
 | 
								std::ofstream OS(DefaultConfigFileName.path(), std::ios::binary | std::ios::trunc );
 | 
				
			||||||
		F << BasicConfig ;
 | 
								std::istringstream	IS(DefaultConfiguration_);
 | 
				
			||||||
		F.close();
 | 
								Poco::StreamCopier::copyStream(IS, OS);
 | 
				
			||||||
 | 
							} catch (...) {
 | 
				
			||||||
 | 
								DefaultConfiguration_ = BasicConfig;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Config::Config() {
 | 
						Config::Config() {
 | 
				
			||||||
		Config_ = DefaultConfiguration;
 | 
							if(DefaultConfiguration_.empty())
 | 
				
			||||||
 | 
								Init();
 | 
				
			||||||
 | 
							Config_ = DefaultConfiguration_;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void Config::Init() {
 | 
						void Config::Init() {
 | 
				
			||||||
		if(DefaultConfiguration.empty()) {
 | 
							if(DefaultConfiguration_.empty()) {
 | 
				
			||||||
			//	open the file
 | 
								//	open the file
 | 
				
			||||||
			Poco::File DefaultConfigFileName{MicroService::instance().DataDir()+"/default_config.json"};
 | 
					 | 
				
			||||||
			try {
 | 
								try {
 | 
				
			||||||
 | 
									Poco::File DefaultConfigFileName{MicroService::instance().DataDir()+"/default_config.json"};
 | 
				
			||||||
				if (!DefaultConfigFileName.exists()) {
 | 
									if (!DefaultConfigFileName.exists()) {
 | 
				
			||||||
					SetBasicConfigFile();
 | 
										SetBasicConfigFile();
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					std::ifstream F;
 | 
										std::ifstream F(DefaultConfigFileName.path(),std::ios::binary | std::ios::in);
 | 
				
			||||||
					F.open(DefaultConfigFileName.path(),std::ios::binary);
 | 
										std::ostringstream C;
 | 
				
			||||||
					while(!F.eof()) {
 | 
										Poco::StreamCopier::copyStream(F,C);
 | 
				
			||||||
						std::string Line;
 | 
										DefaultConfiguration_ = C.str();
 | 
				
			||||||
						F >> Line;
 | 
					 | 
				
			||||||
						DefaultConfiguration += Line + "\n" ;
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					F.close();
 | 
					 | 
				
			||||||
					// std::cout << "Default config: " << DefaultConfiguration << std::endl;
 | 
					 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} catch (...) {
 | 
								} catch (...) {
 | 
				
			||||||
				SetBasicConfigFile();
 | 
									SetBasicConfigFile();
 | 
				
			||||||
@@ -159,8 +157,8 @@ namespace OpenWifi::Config {
 | 
				
			|||||||
    bool Config::SetUUID(uint64_t UUID) {
 | 
					    bool Config::SetUUID(uint64_t UUID) {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            Poco::JSON::Parser Parser;
 | 
					            Poco::JSON::Parser Parser;
 | 
				
			||||||
            Poco::JSON::Object::Ptr Object = Parser.parse(Config_).extract<Poco::JSON::Object::Ptr>();
 | 
					            auto Object = Parser.parse(Config_).extract<Poco::JSON::Object::Ptr>();
 | 
				
			||||||
			Object->set("uuid",UUID);
 | 
								Object->set("uuid", UUID);
 | 
				
			||||||
			std::ostringstream NewConfig;
 | 
								std::ostringstream NewConfig;
 | 
				
			||||||
            Poco::JSON::Stringifier Stringifier;
 | 
					            Poco::JSON::Stringifier Stringifier;
 | 
				
			||||||
			Stringifier.condense(Object, NewConfig);
 | 
								Stringifier.condense(Object, NewConfig);
 | 
				
			||||||
@@ -182,7 +180,7 @@ namespace OpenWifi::Config {
 | 
				
			|||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        catch (const Poco::Exception &E)
 | 
					        catch (...)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
			return false;
 | 
								return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -193,7 +191,11 @@ namespace OpenWifi::Config {
 | 
				
			|||||||
        return Parser.parse(Config_).extract<Poco::JSON::Object::Ptr>();
 | 
					        return Parser.parse(Config_).extract<Poco::JSON::Object::Ptr>();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	std::string Config::Default() { return DefaultConfiguration; }
 | 
						std::string Config::Default() {
 | 
				
			||||||
 | 
							if(DefaultConfiguration_.empty())
 | 
				
			||||||
 | 
								Init();
 | 
				
			||||||
 | 
							return DefaultConfiguration_;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    std::string Capabilities::Default() {
 | 
					    std::string Capabilities::Default() {
 | 
				
			||||||
        return std::string(R"lit({"model":{"id":"linksys,ea8300","name":"Linksys EA8300 (Dallas)"},
 | 
					        return std::string(R"lit({"model":{"id":"linksys,ea8300","name":"Linksys EA8300 (Dallas)"},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,8 +6,7 @@
 | 
				
			|||||||
//	Arilia Wireless Inc.
 | 
					//	Arilia Wireless Inc.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef UCENTRAL_UCENTRALCONFIG_H
 | 
					#pragma once
 | 
				
			||||||
#define UCENTRAL_UCENTRALCONFIG_H
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
#include "Poco/JSON/Object.h"
 | 
					#include "Poco/JSON/Object.h"
 | 
				
			||||||
@@ -17,18 +16,20 @@ namespace OpenWifi::Config {
 | 
				
			|||||||
	class Config {
 | 
						class Config {
 | 
				
			||||||
    public:
 | 
					    public:
 | 
				
			||||||
        explicit Config(const std::string &Config)
 | 
					        explicit Config(const std::string &Config)
 | 
				
			||||||
        :Config_(Config) {}
 | 
					        	:Config_(Config) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Config();
 | 
					        Config();
 | 
				
			||||||
 | 
					 | 
				
			||||||
		static void Init();
 | 
					 | 
				
			||||||
        bool SetUUID(uint64_t UUID);
 | 
					        bool SetUUID(uint64_t UUID);
 | 
				
			||||||
        [[nodiscard]] bool Valid();
 | 
					        [[nodiscard]] bool Valid();
 | 
				
			||||||
		[[nodiscard]] std::string get() { return Config_; };
 | 
							[[nodiscard]] std::string get() { return Config_; };
 | 
				
			||||||
		[[nodiscard]] static std::string Default();
 | 
							[[nodiscard]] std::string Default();
 | 
				
			||||||
		[[nodiscard]] Poco::JSON::Object::Ptr to_json();
 | 
							[[nodiscard]] Poco::JSON::Object::Ptr to_json();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private:
 | 
					    private:
 | 
				
			||||||
 | 
						  	void Init();
 | 
				
			||||||
 | 
						  	void SetBasicConfigFile();
 | 
				
			||||||
 | 
						  	inline static std::string DefaultConfiguration_ = "";
 | 
				
			||||||
	  	std::string Config_;
 | 
						  	std::string Config_;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -63,4 +64,3 @@ namespace OpenWifi::Config {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
} // namespace
 | 
					} // namespace
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif //UCENTRAL_UCENTRALCONFIG_H
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,7 +17,6 @@
 | 
				
			|||||||
#include "framework/MicroService.h"
 | 
					#include "framework/MicroService.h"
 | 
				
			||||||
#include "framework/uCentral_Protocol.h"
 | 
					#include "framework/uCentral_Protocol.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void CommandManager::run() {
 | 
						void CommandManager::run() {
 | 
				
			||||||
@@ -29,131 +28,156 @@ namespace OpenWifi {
 | 
				
			|||||||
				break;
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            std::vector<GWObjects::CommandDetails> Commands;
 | 
					            std::vector<GWObjects::CommandDetails> Commands;
 | 
				
			||||||
            if(StorageService()->GetReadyToExecuteCommands(1,200,Commands))
 | 
					            if(StorageService()->GetReadyToExecuteCommands(0,200,Commands))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                for(auto & Cmd: Commands)
 | 
					                for(auto & Cmd: Commands)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                	if(!Running_)
 | 
					                	if(!Running_)
 | 
				
			||||||
                		break;
 | 
					                		break;
 | 
				
			||||||
 | 
										try {
 | 
				
			||||||
					uint64_t RPC_Id;
 | 
					 | 
				
			||||||
						Poco::JSON::Parser	P;
 | 
											Poco::JSON::Parser	P;
 | 
				
			||||||
 | 
											bool Sent;
 | 
				
			||||||
 | 
											Logger().information(Poco::format("Parsing: %s", Cmd.UUID));
 | 
				
			||||||
						auto Params = P.parse(Cmd.Details).extract<Poco::JSON::Object::Ptr>();
 | 
											auto Params = P.parse(Cmd.Details).extract<Poco::JSON::Object::Ptr>();
 | 
				
			||||||
					if(SendCommand(	Cmd.SerialNumber,
 | 
											Logger().information(Poco::format("Parsed: %s", Cmd.UUID));
 | 
				
			||||||
 | 
											auto Result = PostCommandDisk(	Cmd.SerialNumber,
 | 
				
			||||||
													  	Cmd.Command,
 | 
																		  	Cmd.Command,
 | 
				
			||||||
													  	*Params,
 | 
																		  	*Params,
 | 
				
			||||||
													  	Cmd.UUID,
 | 
																		  	Cmd.UUID,
 | 
				
			||||||
									RPC_Id)) {
 | 
						  												    Sent);
 | 
				
			||||||
 | 
											if(Sent) {
 | 
				
			||||||
							StorageService()->SetCommandExecuted(Cmd.UUID);
 | 
												StorageService()->SetCommandExecuted(Cmd.UUID);
 | 
				
			||||||
						Logger_.information(Poco::format("Sent command '%s' to '%s'",Cmd.Command,Cmd.SerialNumber));
 | 
												Logger().information(Poco::format("%s: Sent command '%s-%s'", Cmd.SerialNumber, Cmd.Command, Cmd.UUID));
 | 
				
			||||||
						} else {
 | 
											} else {
 | 
				
			||||||
                        Logger_.information(Poco::format("Failed to send command '%s' to %s",Cmd.Command,Cmd.SerialNumber));
 | 
												Logger().information(Poco::format("%s: Could not send command '%s-%s'", Cmd.SerialNumber, Cmd.Command, Cmd.UUID));
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										} catch (const Poco::Exception &E) {
 | 
				
			||||||
 | 
											Logger().information(Poco::format("%s: Failed command '%s-%s'", Cmd.SerialNumber, Cmd.Command, Cmd.UUID));
 | 
				
			||||||
 | 
											Logger().log(E);
 | 
				
			||||||
 | 
											StorageService()->SetCommandExecuted(Cmd.UUID);
 | 
				
			||||||
 | 
										} catch (...) {
 | 
				
			||||||
 | 
											Logger().information(Poco::format("%s: Exception - hard fail - Failed command '%s-%s'", Cmd.SerialNumber, Cmd.Command, Cmd.UUID));
 | 
				
			||||||
 | 
											StorageService()->SetCommandExecuted(Cmd.UUID);
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
			Janitor();
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int CommandManager::Start() {
 | 
					    int CommandManager::Start() {
 | 
				
			||||||
        Logger_.notice("Starting...");
 | 
					        Logger().notice("Starting...");
 | 
				
			||||||
        ManagerThread.start(*this);
 | 
					        ManagerThread.start(*this);
 | 
				
			||||||
 | 
							JanitorCallback_ = std::make_unique<Poco::TimerCallback<CommandManager>>(*this,&CommandManager::onTimer);
 | 
				
			||||||
 | 
							Timer_.setStartInterval( 10000 );
 | 
				
			||||||
 | 
							Timer_.setPeriodicInterval(5 * 60 * 1000); // 1 hours
 | 
				
			||||||
 | 
							Timer_.start(*JanitorCallback_);
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void CommandManager::Stop() {
 | 
					    void CommandManager::Stop() {
 | 
				
			||||||
        Logger_.notice("Stopping...");
 | 
					        Logger().notice("Stopping...");
 | 
				
			||||||
		Running_ = false;
 | 
							Running_ = false;
 | 
				
			||||||
 | 
							Timer_.stop();
 | 
				
			||||||
		ManagerThread.wakeUp();
 | 
							ManagerThread.wakeUp();
 | 
				
			||||||
        ManagerThread.join();
 | 
					        ManagerThread.join();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void CommandManager::WakeUp() {
 | 
					    void CommandManager::WakeUp() {
 | 
				
			||||||
        Logger_.notice("Waking up..");
 | 
					        Logger().notice("Waking up...");
 | 
				
			||||||
        ManagerThread.wakeUp();
 | 
					        ManagerThread.wakeUp();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void CommandManager::Janitor() {
 | 
						void CommandManager::onTimer(Poco::Timer & timer) {
 | 
				
			||||||
		std::lock_guard G(Mutex_);
 | 
							std::lock_guard G(Mutex_);
 | 
				
			||||||
		uint64_t Now = time(nullptr);
 | 
							Logger().information("Removing expired commands: start");
 | 
				
			||||||
		Logger_.information("Janitor starting.");
 | 
							auto Now = std::chrono::high_resolution_clock::now();
 | 
				
			||||||
		for(auto i=OutStandingRequests_.begin();i!=OutStandingRequests_.end();) {
 | 
							for(auto i=OutStandingRequests_.begin();i!=OutStandingRequests_.end();) {
 | 
				
			||||||
			if((Now-i->second.Submitted)>120)
 | 
								std::chrono::duration<double, std::milli> delta = Now - i->second->submitted;
 | 
				
			||||||
 | 
								if(delta > 120000ms) {
 | 
				
			||||||
				i = OutStandingRequests_.erase(i);
 | 
									i = OutStandingRequests_.erase(i);
 | 
				
			||||||
			else
 | 
								} else {
 | 
				
			||||||
				++i;
 | 
									++i;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		Logger_.information("Janitor finished.");
 | 
							}
 | 
				
			||||||
 | 
							Logger().information("Removing expired commands: done");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool CommandManager::GetCommand(uint64_t Id, const std::string &SerialNumber, CommandTag &T) {
 | 
						std::shared_ptr<CommandManager::promise_type_t> CommandManager::PostCommand(	const std::string &SerialNumber,
 | 
				
			||||||
		std::lock_guard G(Mutex_);
 | 
					 | 
				
			||||||
		CommandTagIndex	TI{.Id=Id,.SerialNumber=SerialNumber};
 | 
					 | 
				
			||||||
		auto Hint=OutStandingRequests_.find(TI);
 | 
					 | 
				
			||||||
		if(Hint==OutStandingRequests_.end() || Hint->second.Completed==0)
 | 
					 | 
				
			||||||
			return false;
 | 
					 | 
				
			||||||
		T = Hint->second;
 | 
					 | 
				
			||||||
		OutStandingRequests_.erase(Hint);
 | 
					 | 
				
			||||||
		return true;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	bool CommandManager::SendCommand(	const std::string &SerialNumber,
 | 
					 | 
				
			||||||
							  			const std::string &Method,
 | 
												  			const std::string &Method,
 | 
				
			||||||
										const Poco::JSON::Object &Params,
 | 
															const Poco::JSON::Object &Params,
 | 
				
			||||||
							  			const std::string &UUID,
 | 
												  			const std::string &UUID,
 | 
				
			||||||
									 	uint64_t & Id,
 | 
														 	bool oneway_rpc,
 | 
				
			||||||
									 	bool oneway_rpc) {
 | 
														 	bool disk_only,
 | 
				
			||||||
 | 
															bool & Sent) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Sent=false;
 | 
				
			||||||
 | 
							if(!DeviceRegistry()->Connected(SerialNumber)) {
 | 
				
			||||||
 | 
								return nullptr;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		std::stringstream 	ToSend;
 | 
							std::stringstream 	ToSend;
 | 
				
			||||||
		std::unique_lock G(Mutex_);
 | 
							auto Object = std::make_shared<RpcObject>();
 | 
				
			||||||
		if(oneway_rpc)
 | 
					
 | 
				
			||||||
			Id = 1;
 | 
							CommandTagIndex 	Idx;
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								std::lock_guard M(Mutex_);
 | 
				
			||||||
 | 
								if (oneway_rpc)
 | 
				
			||||||
 | 
									Idx.Id = 1;
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
			Id = ++Id_;
 | 
									Idx.Id = ++Id_;
 | 
				
			||||||
 | 
								Idx.SerialNumber = SerialNumber;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			Poco::JSON::Object CompleteRPC;
 | 
								Poco::JSON::Object CompleteRPC;
 | 
				
			||||||
			CompleteRPC.set(uCentralProtocol::JSONRPC, uCentralProtocol::JSONRPC_VERSION);
 | 
								CompleteRPC.set(uCentralProtocol::JSONRPC, uCentralProtocol::JSONRPC_VERSION);
 | 
				
			||||||
		CompleteRPC.set(uCentralProtocol::ID, Id);
 | 
								CompleteRPC.set(uCentralProtocol::ID, Idx.Id);
 | 
				
			||||||
			CompleteRPC.set(uCentralProtocol::METHOD, Method);
 | 
								CompleteRPC.set(uCentralProtocol::METHOD, Method);
 | 
				
			||||||
			CompleteRPC.set(uCentralProtocol::PARAMS, Params);
 | 
								CompleteRPC.set(uCentralProtocol::PARAMS, Params);
 | 
				
			||||||
			Poco::JSON::Stringifier::stringify(CompleteRPC, ToSend);
 | 
								Poco::JSON::Stringifier::stringify(CompleteRPC, ToSend);
 | 
				
			||||||
		Logger_.information(
 | 
								Logger().information(
 | 
				
			||||||
			Poco::format("(%s): Sending command '%s', ID: %lu", SerialNumber, Method, Id));
 | 
									Poco::format("(%s): Sending command '%s', ID: %lu", SerialNumber, Method, Idx.Id));
 | 
				
			||||||
		CommandTagIndex Idx{.Id = Id, .SerialNumber = SerialNumber};
 | 
					
 | 
				
			||||||
		CommandTag Tag;
 | 
								Object->submitted = std::chrono::high_resolution_clock::now();
 | 
				
			||||||
		Tag.UUID = UUID;
 | 
								Object->uuid = UUID;
 | 
				
			||||||
		Tag.Submitted = std::time(nullptr);
 | 
								if(disk_only) {
 | 
				
			||||||
		Tag.Completed = 0;
 | 
									Object->rpc_entry = nullptr;
 | 
				
			||||||
		Tag.Result = Poco::makeShared<Poco::JSON::Object>();
 | 
								} else {
 | 
				
			||||||
		OutStandingRequests_[Idx] = Tag;
 | 
									Object->rpc_entry = std::make_shared<CommandManager::promise_type_t>();
 | 
				
			||||||
		G.unlock();
 | 
								}
 | 
				
			||||||
		return DeviceRegistry()->SendFrame(SerialNumber, ToSend.str());
 | 
								OutStandingRequests_[Idx] = Object;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if(DeviceRegistry()->SendFrame(SerialNumber, ToSend.str())) {
 | 
				
			||||||
 | 
								Sent=true;
 | 
				
			||||||
 | 
								return Object->rpc_entry;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return nullptr;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void CommandManager::PostCommandResult(const std::string &SerialNumber, Poco::JSON::Object::Ptr Obj) {
 | 
						void CommandManager::PostCommandResult(const std::string &SerialNumber, Poco::JSON::Object::Ptr Obj) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if(!Obj->has(uCentralProtocol::ID)){
 | 
							if(!Obj->has(uCentralProtocol::ID)){
 | 
				
			||||||
			Logger_.error(Poco::format("(%s): Invalid RPC response.",SerialNumber));
 | 
								Logger().error(Poco::format("(%s): Invalid RPC response.",SerialNumber));
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		uint64_t ID = Obj->get(uCentralProtocol::ID);
 | 
							uint64_t ID = Obj->get(uCentralProtocol::ID);
 | 
				
			||||||
		if(ID<2) {
 | 
							if(ID<2) {
 | 
				
			||||||
			Logger_.error(Poco::format("(%s): Ignoring RPC response.",SerialNumber));
 | 
								Logger().error(Poco::format("(%s): Ignoring RPC response.",SerialNumber));
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		std::unique_lock G(Mutex_);
 | 
							std::lock_guard G(Mutex_);
 | 
				
			||||||
		auto Idx = CommandTagIndex{.Id = ID, .SerialNumber = SerialNumber};
 | 
							auto Idx = CommandTagIndex{.Id = ID, .SerialNumber = SerialNumber};
 | 
				
			||||||
		auto RPC = OutStandingRequests_.find(Idx);
 | 
							auto RPC = OutStandingRequests_.find(Idx);
 | 
				
			||||||
		if (RPC == OutStandingRequests_.end()) {
 | 
							if (RPC == OutStandingRequests_.end()) {
 | 
				
			||||||
			Logger_.warning(Poco::format("(%s): Outdated RPC %lu", SerialNumber, ID));
 | 
								Logger().warning(Poco::format("(%s): Outdated RPC %lu", SerialNumber, ID));
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		RPC->second.Completed = std::time(nullptr);
 | 
							std::chrono::duration<double, std::milli> rpc_execution_time = std::chrono::high_resolution_clock::now() - RPC->second->submitted;
 | 
				
			||||||
		RPC->second.Result = Obj;
 | 
							StorageService()->CommandCompleted(RPC->second->uuid, Obj, rpc_execution_time, true);
 | 
				
			||||||
		Logger_.information(Poco::format("(%s): Received RPC answer %lu", SerialNumber, ID));
 | 
							if(RPC->second->rpc_entry) {
 | 
				
			||||||
		G.unlock();
 | 
								RPC->second->rpc_entry->set_value(Obj);
 | 
				
			||||||
		StorageService()->CommandCompleted(RPC->second.UUID, Obj, true);
 | 
							}
 | 
				
			||||||
 | 
							Logger().information(Poco::format("(%s): Received RPC answer %lu", SerialNumber, ID));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}  // namespace
 | 
					}  // namespace
 | 
				
			||||||
@@ -6,8 +6,7 @@
 | 
				
			|||||||
//	Arilia Wireless Inc.
 | 
					//	Arilia Wireless Inc.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef UCENTRAL_UCOMMANDMANAGER_H
 | 
					#pragma once
 | 
				
			||||||
#define UCENTRAL_UCOMMANDMANAGER_H
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <chrono>
 | 
					#include <chrono>
 | 
				
			||||||
#include <future>
 | 
					#include <future>
 | 
				
			||||||
@@ -18,6 +17,7 @@
 | 
				
			|||||||
#include "Poco/JSON/Object.h"
 | 
					#include "Poco/JSON/Object.h"
 | 
				
			||||||
#include "Poco/Net/HTTPServerRequest.h"
 | 
					#include "Poco/Net/HTTPServerRequest.h"
 | 
				
			||||||
#include "Poco/Net/HTTPServerResponse.h"
 | 
					#include "Poco/Net/HTTPServerResponse.h"
 | 
				
			||||||
 | 
					#include "Poco/Timer.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "RESTObjects//RESTAPI_GWobjects.h"
 | 
					#include "RESTObjects//RESTAPI_GWobjects.h"
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					#include "framework/MicroService.h"
 | 
				
			||||||
@@ -43,50 +43,108 @@ namespace OpenWifi {
 | 
				
			|||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct CommandTag {
 | 
					 | 
				
			||||||
		std::string 			UUID;
 | 
					 | 
				
			||||||
		Poco::JSON::Object::Ptr Result;
 | 
					 | 
				
			||||||
		uint64_t 				Submitted=0;
 | 
					 | 
				
			||||||
		uint64_t 				Completed=0;
 | 
					 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    class CommandManager : public SubSystemServer, Poco::Runnable {
 | 
					    class CommandManager : public SubSystemServer, Poco::Runnable {
 | 
				
			||||||
	    public:
 | 
						    public:
 | 
				
			||||||
 | 
							  	typedef Poco::JSON::Object::Ptr objtype_t;
 | 
				
			||||||
 | 
							  	typedef std::promise<objtype_t> promise_type_t;
 | 
				
			||||||
 | 
								struct RpcObject {
 | 
				
			||||||
 | 
									std::string uuid;
 | 
				
			||||||
 | 
									std::chrono::time_point<std::chrono::high_resolution_clock> submitted = std::chrono::high_resolution_clock::now();
 | 
				
			||||||
 | 
									std::shared_ptr<promise_type_t> rpc_entry;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			int Start() override;
 | 
								int Start() override;
 | 
				
			||||||
			void Stop() override;
 | 
								void Stop() override;
 | 
				
			||||||
			void WakeUp();
 | 
								void WakeUp();
 | 
				
			||||||
			void PostCommandResult(const std::string &SerialNumber, Poco::JSON::Object::Ptr Obj);
 | 
								void PostCommandResult(const std::string &SerialNumber, Poco::JSON::Object::Ptr Obj);
 | 
				
			||||||
			bool SendCommand(	const std::string &SerialNumber,
 | 
					
 | 
				
			||||||
 | 
								std::shared_ptr<promise_type_t> PostCommandOneWayDisk(
 | 
				
			||||||
 | 
									const std::string &SerialNumber,
 | 
				
			||||||
				const std::string &Method,
 | 
									const std::string &Method,
 | 
				
			||||||
				const Poco::JSON::Object &Params,
 | 
									const Poco::JSON::Object &Params,
 | 
				
			||||||
				const std::string &UUID,
 | 
									const std::string &UUID,
 | 
				
			||||||
							 	uint64_t & Id,
 | 
									bool & Sent) {
 | 
				
			||||||
							 	bool oneway_rpc=false);
 | 
										return 	PostCommand(SerialNumber,
 | 
				
			||||||
			void Janitor();
 | 
														Method,
 | 
				
			||||||
 | 
														Params,
 | 
				
			||||||
 | 
														UUID,
 | 
				
			||||||
 | 
													   	true, true, Sent );
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								std::shared_ptr<promise_type_t> PostCommandDisk(
 | 
				
			||||||
 | 
									const std::string &SerialNumber,
 | 
				
			||||||
 | 
									const std::string &Method,
 | 
				
			||||||
 | 
									const Poco::JSON::Object &Params,
 | 
				
			||||||
 | 
									const std::string &UUID,
 | 
				
			||||||
 | 
									bool & Sent) {
 | 
				
			||||||
 | 
										return 	PostCommand(SerialNumber,
 | 
				
			||||||
 | 
													   Method,
 | 
				
			||||||
 | 
													   Params,
 | 
				
			||||||
 | 
													   UUID,
 | 
				
			||||||
 | 
													   false, true, Sent  );
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								std::shared_ptr<promise_type_t> PostCommand(
 | 
				
			||||||
 | 
									const std::string &SerialNumber,
 | 
				
			||||||
 | 
									const std::string &Method,
 | 
				
			||||||
 | 
									const Poco::JSON::Object &Params,
 | 
				
			||||||
 | 
									const std::string &UUID,
 | 
				
			||||||
 | 
									bool & Sent) {
 | 
				
			||||||
 | 
										return 	PostCommand(SerialNumber,
 | 
				
			||||||
 | 
													   Method,
 | 
				
			||||||
 | 
													   Params,
 | 
				
			||||||
 | 
													   UUID,
 | 
				
			||||||
 | 
													   false,
 | 
				
			||||||
 | 
													   false, Sent );
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								std::shared_ptr<promise_type_t> PostCommandOneWay(
 | 
				
			||||||
 | 
									const std::string &SerialNumber,
 | 
				
			||||||
 | 
									const std::string &Method,
 | 
				
			||||||
 | 
									const Poco::JSON::Object &Params,
 | 
				
			||||||
 | 
									const std::string &UUID,
 | 
				
			||||||
 | 
									bool & Sent) {
 | 
				
			||||||
 | 
										return 	PostCommand(SerialNumber,
 | 
				
			||||||
 | 
													   Method,
 | 
				
			||||||
 | 
													   Params,
 | 
				
			||||||
 | 
													   UUID,
 | 
				
			||||||
 | 
													   true,
 | 
				
			||||||
 | 
													   false, Sent  );
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			void run() override;
 | 
								void run() override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			bool GetCommand(uint64_t Id, const std::string & SerialNumber, CommandTag &T);
 | 
								static auto instance() {
 | 
				
			||||||
 | 
								    static auto instance_ = new CommandManager;
 | 
				
			||||||
			static CommandManager *instance() {
 | 
					 | 
				
			||||||
			    static CommandManager *instance_ = new CommandManager;
 | 
					 | 
				
			||||||
				return instance_;
 | 
									return instance_;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			inline bool Running() const { return Running_; }
 | 
								inline bool Running() const { return Running_; }
 | 
				
			||||||
 | 
								void onTimer(Poco::Timer & timer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	    private:
 | 
						    private:
 | 
				
			||||||
			std::atomic_bool 						Running_ = false;
 | 
								std::atomic_bool 						Running_ = false;
 | 
				
			||||||
			Poco::Thread    						ManagerThread;
 | 
								Poco::Thread    						ManagerThread;
 | 
				
			||||||
			uint64_t 					Id_=2;	//	do not start @1. We ignore ID=1 & 0 is illegal..
 | 
								uint64_t 								Id_=3;	//	do not start @1. We ignore ID=1 & 0 is illegal..
 | 
				
			||||||
			std::map<CommandTagIndex,CommandTag>	OutStandingRequests_;
 | 
								std::map<CommandTagIndex,std::shared_ptr<RpcObject>>		OutStandingRequests_;
 | 
				
			||||||
 | 
								Poco::Timer                     		Timer_;
 | 
				
			||||||
 | 
								std::unique_ptr<Poco::TimerCallback<CommandManager>>   JanitorCallback_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								std::shared_ptr<promise_type_t> PostCommand(
 | 
				
			||||||
 | 
									const std::string &SerialNumber,
 | 
				
			||||||
 | 
									const std::string &Method,
 | 
				
			||||||
 | 
									const Poco::JSON::Object &Params,
 | 
				
			||||||
 | 
									const std::string &UUID,
 | 
				
			||||||
 | 
									bool oneway_rpc,
 | 
				
			||||||
 | 
									bool disk_only,
 | 
				
			||||||
 | 
									bool & Sent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			CommandManager() noexcept:
 | 
								CommandManager() noexcept:
 | 
				
			||||||
				SubSystemServer("CommandManager", "CMD-MGR", "command.manager")
 | 
									SubSystemServer("CommandManager", "CMD-MGR", "command.manager") {
 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inline CommandManager * CommandManager() { return CommandManager::instance(); }
 | 
						inline auto CommandManager() { return CommandManager::instance(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}  // namespace
 | 
					}  // namespace
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif //UCENTRAL_UCOMMANDMANAGER_H
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +0,0 @@
 | 
				
			|||||||
//
 | 
					 | 
				
			||||||
// Created by stephane bourque on 2021-09-21.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "ConfigurationCache.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace OpenWifi {
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -2,12 +2,12 @@
 | 
				
			|||||||
// Created by stephane bourque on 2021-09-21.
 | 
					// Created by stephane bourque on 2021-09-21.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef OWGW_CONFIGURATIONCACHE_H
 | 
					#pragma once
 | 
				
			||||||
#define OWGW_CONFIGURATIONCACHE_H
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <map>
 | 
					#include <map>
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
#include <mutex>
 | 
					#include <mutex>
 | 
				
			||||||
 | 
					#include "framework/MicroService.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
	class ConfigurationCache {
 | 
						class ConfigurationCache {
 | 
				
			||||||
@@ -18,7 +18,7 @@ namespace OpenWifi {
 | 
				
			|||||||
			return instance;
 | 
								return instance;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		inline uint64_t CurrentConfig(const std::string &SerialNumber) {
 | 
							inline uint64_t CurrentConfig(uint64_t SerialNumber) {
 | 
				
			||||||
			std::lock_guard G(Mutex_);
 | 
								std::lock_guard G(Mutex_);
 | 
				
			||||||
			const auto Hint = Cache_.find(SerialNumber);
 | 
								const auto Hint = Cache_.find(SerialNumber);
 | 
				
			||||||
			if(Hint==end(Cache_))
 | 
								if(Hint==end(Cache_))
 | 
				
			||||||
@@ -26,17 +26,25 @@ namespace OpenWifi {
 | 
				
			|||||||
			return Hint->second;
 | 
								return Hint->second;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		inline void Add(const std::string &SerialNumber, uint64_t Id) {
 | 
							inline void Add(uint64_t SerialNumber, uint64_t Id) {
 | 
				
			||||||
			std::lock_guard	G(Mutex_);
 | 
								std::lock_guard	G(Mutex_);
 | 
				
			||||||
			Cache_[SerialNumber]=Id;
 | 
								Cache_[SerialNumber]=Id;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	  private:
 | 
						  private:
 | 
				
			||||||
		std::mutex						Mutex_;
 | 
							std::recursive_mutex					Mutex_;
 | 
				
			||||||
		std::map<std::string,uint64_t>	Cache_;
 | 
							std::map<uint64_t,uint64_t>	Cache_;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inline uint64_t GetCurrentConfigurationID(const std::string &S) { return ConfigurationCache::instance().CurrentConfig(S); }
 | 
						inline uint64_t GetCurrentConfigurationID(uint64_t SerialNumber) {
 | 
				
			||||||
	inline void SetCurrentConfigurationID(const std::string &S, uint64_t ID) { ConfigurationCache::instance().Add(S,ID); }
 | 
							return ConfigurationCache::instance().CurrentConfig(SerialNumber);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						inline void SetCurrentConfigurationID(const std::string & SerialNumber, uint64_t ID) {
 | 
				
			||||||
 | 
							return ConfigurationCache::instance().Add(Utils::SerialNumberToInt(SerialNumber), ID);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						inline void SetCurrentConfigurationID(uint64_t SerialNumber, uint64_t ID) {
 | 
				
			||||||
 | 
							return ConfigurationCache::instance().Add(SerialNumber, ID);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif // OWGW_CONFIGURATIONCACHE_H
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,9 +21,11 @@
 | 
				
			|||||||
#include "StorageArchiver.h"
 | 
					#include "StorageArchiver.h"
 | 
				
			||||||
#include "StorageService.h"
 | 
					#include "StorageService.h"
 | 
				
			||||||
#include "TelemetryStream.h"
 | 
					#include "TelemetryStream.h"
 | 
				
			||||||
#include "WebSocketServer.h"
 | 
					#include "WS_Server.h"
 | 
				
			||||||
#include "framework/ConfigurationValidator.h"
 | 
					#include "framework/ConfigurationValidator.h"
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					#include "framework/MicroService.h"
 | 
				
			||||||
 | 
					#include "FindCountry.h"
 | 
				
			||||||
 | 
					#include "rttys/RTTYS_server.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
	class Daemon *Daemon::instance() {
 | 
						class Daemon *Daemon::instance() {
 | 
				
			||||||
@@ -36,42 +38,55 @@ namespace OpenWifi {
 | 
				
			|||||||
										StorageService(),
 | 
															StorageService(),
 | 
				
			||||||
										SerialNumberCache(),
 | 
															SerialNumberCache(),
 | 
				
			||||||
										ConfigurationValidator(),
 | 
															ConfigurationValidator(),
 | 
				
			||||||
 | 
															OUIServer(),
 | 
				
			||||||
 | 
															FindCountryFromIP(),
 | 
				
			||||||
										DeviceRegistry(),
 | 
															DeviceRegistry(),
 | 
				
			||||||
									   WebSocketServer(),
 | 
					 | 
				
			||||||
										CommandManager(),
 | 
															CommandManager(),
 | 
				
			||||||
										FileUploader(),
 | 
															FileUploader(),
 | 
				
			||||||
									   OUIServer(),
 | 
					 | 
				
			||||||
										StorageArchiver(),
 | 
															StorageArchiver(),
 | 
				
			||||||
									   TelemetryStream()
 | 
															TelemetryStream(),
 | 
				
			||||||
 | 
															RTTYS_server(),
 | 
				
			||||||
 | 
															WebSocketServer()
 | 
				
			||||||
							   });
 | 
												   });
 | 
				
			||||||
        return &instance;
 | 
					        return &instance;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						static const std::vector<std::pair<std::string,std::string>>		DefaultDeviceTypes{
 | 
				
			||||||
 | 
							{"cig_wf160d","AP"},
 | 
				
			||||||
 | 
							{"cig_wf188","AP"},
 | 
				
			||||||
 | 
							{"cig_wf188n","AP"},
 | 
				
			||||||
 | 
							{"cig_wf194c","AP"},
 | 
				
			||||||
 | 
							{"cig_wf194c4","AP"},
 | 
				
			||||||
 | 
							{"edgecore_eap101","AP"},
 | 
				
			||||||
 | 
							{"edgecore_eap102","AP"},
 | 
				
			||||||
 | 
							{"edgecore_ecs4100-12ph","AP"},
 | 
				
			||||||
 | 
							{"edgecore_ecw5211","AP"},
 | 
				
			||||||
 | 
							{"edgecore_ecw5410","AP"},
 | 
				
			||||||
 | 
							{"edgecore_oap100","AP"},
 | 
				
			||||||
 | 
							{"edgecore_spw2ac1200","SWITCH"},
 | 
				
			||||||
 | 
							{"edgecore_spw2ac1200-lan-poe","SWITCH"},
 | 
				
			||||||
 | 
							{"edgecore_ssw2ac2600","SWITCH"},
 | 
				
			||||||
 | 
							{"hfcl_ion4","AP"},
 | 
				
			||||||
 | 
							{"indio_um-305ac","AP"},
 | 
				
			||||||
 | 
							{"linksys_e8450-ubi","AP"},
 | 
				
			||||||
 | 
							{"linksys_ea6350","AP"},
 | 
				
			||||||
 | 
							{"linksys_ea6350-v4","AP"},
 | 
				
			||||||
 | 
							{"linksys_ea8300","AP"},
 | 
				
			||||||
 | 
							{"mikrotik_nand","AP"},
 | 
				
			||||||
 | 
							{"tp-link_ec420-g1","AP"},
 | 
				
			||||||
 | 
							{"tplink_cpe210_v3","AP"},
 | 
				
			||||||
 | 
							{"tplink_cpe510_v3","AP"},
 | 
				
			||||||
 | 
							{"tplink_eap225_outdoor_v1","AP"},
 | 
				
			||||||
 | 
							{"tplink_ec420","AP"},
 | 
				
			||||||
 | 
							{"tplink_ex227","AP"},
 | 
				
			||||||
 | 
							{"tplink_ex228","AP"},
 | 
				
			||||||
 | 
							{"tplink_ex447","AP"},
 | 
				
			||||||
 | 
							{"wallys_dr40x9","AP"}
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	void Daemon::initialize() {
 | 
						void Daemon::initialize() {
 | 
				
			||||||
		Config::Config::Init();
 | 
					 | 
				
			||||||
        AutoProvisioning_ = config().getBool("openwifi.autoprovisioning",false);
 | 
					        AutoProvisioning_ = config().getBool("openwifi.autoprovisioning",false);
 | 
				
			||||||
 | 
					        DeviceTypes_ = DefaultDeviceTypes;
 | 
				
			||||||
        // DeviceTypeIdentifications_
 | 
					 | 
				
			||||||
        Types::StringVec   Keys;
 | 
					 | 
				
			||||||
        config().keys("openwifi.devicetypes",Keys);
 | 
					 | 
				
			||||||
        for(const auto & i:Keys)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
        	std::string Line = config().getString("openwifi.devicetypes."+i);
 | 
					 | 
				
			||||||
            auto P1 = Line.find_first_of(':');
 | 
					 | 
				
			||||||
            auto Type = Line.substr(0, P1);
 | 
					 | 
				
			||||||
            auto List = Line.substr(P1+1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            Types::StringVec  Tokens = Utils::Split(List);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            auto Entry = DeviceTypeIdentifications_.find(Type);
 | 
					 | 
				
			||||||
			if(DeviceTypeIdentifications_.end() == Entry) {
 | 
					 | 
				
			||||||
				std::set<std::string>	S;
 | 
					 | 
				
			||||||
				S.insert(Tokens.begin(),Tokens.end());
 | 
					 | 
				
			||||||
				DeviceTypeIdentifications_[Type] = S;
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				Entry->second.insert(Tokens.begin(),Tokens.end());
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void MicroServicePostInitialization() {
 | 
					    void MicroServicePostInitialization() {
 | 
				
			||||||
@@ -79,16 +94,15 @@ namespace OpenWifi {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [[nodiscard]] std::string Daemon::IdentifyDevice(const std::string & Id ) const {
 | 
					    [[nodiscard]] std::string Daemon::IdentifyDevice(const std::string & Id ) const {
 | 
				
			||||||
        for(const auto &[Type,List]:DeviceTypeIdentifications_)
 | 
						    for(const auto &[DeviceType,Type]:DeviceTypes_)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
			if(List.find(Id)!=List.end())
 | 
					        	if(Id == DeviceType)
 | 
				
			||||||
        		return Type;
 | 
					        		return Type;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return "AP";
 | 
					        return "AP";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
int main(int argc, char **argv) {
 | 
					int main(int argc, char **argv) {
 | 
				
			||||||
	try {
 | 
						try {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,8 +6,7 @@
 | 
				
			|||||||
//	Arilia Wireless Inc.
 | 
					//	Arilia Wireless Inc.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef UCENTRAL_UCENTRAL_H
 | 
					#pragma once
 | 
				
			||||||
#define UCENTRAL_UCENTRAL_H
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <array>
 | 
					#include <array>
 | 
				
			||||||
#include <iostream>
 | 
					#include <iostream>
 | 
				
			||||||
@@ -55,7 +54,7 @@ namespace OpenWifi {
 | 
				
			|||||||
			Poco::Logger & Log() { return Poco::Logger::get(AppName()); }
 | 
								Poco::Logger & Log() { return Poco::Logger::get(AppName()); }
 | 
				
			||||||
	  	private:
 | 
						  	private:
 | 
				
			||||||
			bool                        AutoProvisioning_ = false;
 | 
								bool                        AutoProvisioning_ = false;
 | 
				
			||||||
			Types::StringMapStringSet   DeviceTypeIdentifications_;
 | 
								std::vector<std::pair<std::string,std::string>> DeviceTypes_;
 | 
				
			||||||
			DeviceDashboard				DB_;
 | 
								DeviceDashboard				DB_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
@@ -63,4 +62,3 @@ namespace OpenWifi {
 | 
				
			|||||||
	inline Daemon * Daemon() { return Daemon::instance(); }
 | 
						inline Daemon * Daemon() { return Daemon::instance(); }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif //UCENTRAL_UCENTRAL_H
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,8 +2,7 @@
 | 
				
			|||||||
// Created by stephane bourque on 2021-07-21.
 | 
					// Created by stephane bourque on 2021-07-21.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef UCENTRALGW_DASHBOARD_H
 | 
					#pragma once
 | 
				
			||||||
#define UCENTRALGW_DASHBOARD_H
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "RESTObjects//RESTAPI_GWobjects.h"
 | 
					#include "RESTObjects//RESTAPI_GWobjects.h"
 | 
				
			||||||
#include "framework/OpenWifiTypes.h"
 | 
					#include "framework/OpenWifiTypes.h"
 | 
				
			||||||
@@ -21,4 +20,3 @@ namespace OpenWifi {
 | 
				
			|||||||
	};
 | 
						};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // UCENTRALGW_DASHBOARD_H
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,39 +10,35 @@
 | 
				
			|||||||
#include "Poco/JSON/Parser.h"
 | 
					#include "Poco/JSON/Parser.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "DeviceRegistry.h"
 | 
					#include "DeviceRegistry.h"
 | 
				
			||||||
#include "WebSocketServer.h"
 | 
					#include "WS_Server.h"
 | 
				
			||||||
#include "framework/MicroService.h"
 | 
					 | 
				
			||||||
#include "OUIServer.h"
 | 
					#include "OUIServer.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					namespace OpenWifi {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int DeviceRegistry::Start() {
 | 
						int DeviceRegistry::Start() {
 | 
				
			||||||
		std::lock_guard		Guard(Mutex_);
 | 
							std::lock_guard		Guard(Mutex_);
 | 
				
			||||||
        Logger_.notice("Starting ");
 | 
					        Logger().notice("Starting ");
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void DeviceRegistry::Stop() {
 | 
					    void DeviceRegistry::Stop() {
 | 
				
			||||||
		std::lock_guard		Guard(Mutex_);
 | 
							std::lock_guard		Guard(Mutex_);
 | 
				
			||||||
        Logger_.notice("Stopping ");
 | 
					        Logger().notice("Stopping ");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool DeviceRegistry::GetStatistics(const std::string &SerialNumber, std::string & Statistics) {
 | 
					    bool DeviceRegistry::GetStatistics(uint64_t SerialNumber, std::string & Statistics) {
 | 
				
			||||||
		std::lock_guard		Guard(Mutex_);
 | 
							std::lock_guard		Guard(Mutex_);
 | 
				
			||||||
 | 
					 | 
				
			||||||
        auto Device = Devices_.find(SerialNumber);
 | 
					        auto Device = Devices_.find(SerialNumber);
 | 
				
			||||||
        if(Device == Devices_.end())
 | 
					        if(Device == Devices_.end())
 | 
				
			||||||
			return false;
 | 
								return false;
 | 
				
			||||||
 | 
					 | 
				
			||||||
		Statistics = Device->second->LastStats;
 | 
							Statistics = Device->second->LastStats;
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void DeviceRegistry::SetStatistics(const std::string &SerialNumber, const std::string &Statistics) {
 | 
					    void DeviceRegistry::SetStatistics(uint64_t SerialNumber, const std::string &Statistics) {
 | 
				
			||||||
		std::lock_guard		Guard(Mutex_);
 | 
							std::lock_guard		Guard(Mutex_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        auto Device = Devices_.find(SerialNumber);
 | 
					        auto Device = Devices_.find(SerialNumber);
 | 
				
			||||||
 | 
					 | 
				
			||||||
        if(Device != Devices_.end())
 | 
					        if(Device != Devices_.end())
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
			Device->second->Conn_.LastContact = time(nullptr);
 | 
								Device->second->Conn_.LastContact = time(nullptr);
 | 
				
			||||||
@@ -50,7 +46,7 @@ namespace OpenWifi {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool DeviceRegistry::GetState(const std::string &SerialNumber, GWObjects::ConnectionState & State) {
 | 
					    bool DeviceRegistry::GetState(uint64_t SerialNumber, GWObjects::ConnectionState & State) {
 | 
				
			||||||
		std::lock_guard		Guard(Mutex_);
 | 
							std::lock_guard		Guard(Mutex_);
 | 
				
			||||||
        auto Device = Devices_.find(SerialNumber);
 | 
					        auto Device = Devices_.find(SerialNumber);
 | 
				
			||||||
        if(Device == Devices_.end())
 | 
					        if(Device == Devices_.end())
 | 
				
			||||||
@@ -60,7 +56,7 @@ namespace OpenWifi {
 | 
				
			|||||||
		return true;
 | 
							return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void DeviceRegistry::SetState(const std::string & SerialNumber, GWObjects::ConnectionState & State) {
 | 
					    void DeviceRegistry::SetState(uint64_t SerialNumber, const GWObjects::ConnectionState & State) {
 | 
				
			||||||
		std::lock_guard		Guard(Mutex_);
 | 
							std::lock_guard		Guard(Mutex_);
 | 
				
			||||||
        auto Device = Devices_.find(SerialNumber);
 | 
					        auto Device = Devices_.find(SerialNumber);
 | 
				
			||||||
        if(Device != Devices_.end())
 | 
					        if(Device != Devices_.end())
 | 
				
			||||||
@@ -70,7 +66,7 @@ namespace OpenWifi {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool DeviceRegistry::GetHealthcheck(const std::string &SerialNumber, GWObjects::HealthCheck & CheckData) {
 | 
						bool DeviceRegistry::GetHealthcheck(uint64_t SerialNumber, GWObjects::HealthCheck & CheckData) {
 | 
				
			||||||
		std::lock_guard		Guard(Mutex_);
 | 
							std::lock_guard		Guard(Mutex_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		auto Device = Devices_.find(SerialNumber);
 | 
							auto Device = Devices_.find(SerialNumber);
 | 
				
			||||||
@@ -81,27 +77,22 @@ namespace OpenWifi {
 | 
				
			|||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void DeviceRegistry::SetHealthcheck(const std::string &SerialNumber, const GWObjects::HealthCheck & CheckData) {
 | 
						void DeviceRegistry::SetHealthcheck(uint64_t SerialNumber, const GWObjects::HealthCheck & CheckData) {
 | 
				
			||||||
		std::lock_guard		Guard(Mutex_);
 | 
							std::lock_guard		Guard(Mutex_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		auto Device = Devices_.find(SerialNumber);
 | 
							auto Device = Devices_.find(SerialNumber);
 | 
				
			||||||
 | 
					 | 
				
			||||||
		if(Device != Devices_.end())
 | 
							if(Device != Devices_.end())
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			Device->second->LastHealthcheck = CheckData;
 | 
								Device->second->LastHealthcheck = CheckData;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	std::shared_ptr<DeviceRegistry::ConnectionEntry> DeviceRegistry::Register(const std::string & SerialNumber, WSConnection *Ptr)
 | 
						std::shared_ptr<DeviceRegistry::ConnectionEntry> DeviceRegistry::Register(uint64_t SerialNumber, WSConnection *Ptr, uint64_t & ConnectionId )
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
		std::lock_guard		Guard(Mutex_);
 | 
							std::lock_guard		Guard(Mutex_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        auto Device = Devices_.find(SerialNumber);
 | 
							const auto & E = Devices_[SerialNumber] = std::make_shared<ConnectionEntry>();
 | 
				
			||||||
        if( Device == Devices_.end()) {
 | 
					 | 
				
			||||||
        	auto E = Devices_[SerialNumber] = std::make_shared<ConnectionEntry>();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		E->WSConn_ = Ptr;
 | 
							E->WSConn_ = Ptr;
 | 
				
			||||||
            E->Conn_.SerialNumber = SerialNumber;
 | 
					 | 
				
			||||||
		E->Conn_.LastContact = std::time(nullptr);
 | 
							E->Conn_.LastContact = std::time(nullptr);
 | 
				
			||||||
		E->Conn_.Connected = true ;
 | 
							E->Conn_.Connected = true ;
 | 
				
			||||||
		E->Conn_.UUID = 0 ;
 | 
							E->Conn_.UUID = 0 ;
 | 
				
			||||||
@@ -110,42 +101,35 @@ namespace OpenWifi {
 | 
				
			|||||||
		E->Conn_.TX = 0 ;
 | 
							E->Conn_.TX = 0 ;
 | 
				
			||||||
		E->Conn_.RX = 0;
 | 
							E->Conn_.RX = 0;
 | 
				
			||||||
		E->Conn_.VerifiedCertificate = GWObjects::CertificateValidation::NO_CERTIFICATE;
 | 
							E->Conn_.VerifiedCertificate = GWObjects::CertificateValidation::NO_CERTIFICATE;
 | 
				
			||||||
 | 
							ConnectionId = E->ConnectionId = ++Id_;
 | 
				
			||||||
		return E;
 | 
							return E;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            Device->second->WSConn_ = Ptr;
 | 
					 | 
				
			||||||
            Device->second->Conn_.Connected = true;
 | 
					 | 
				
			||||||
            Device->second->Conn_.LastContact = std::time(nullptr);
 | 
					 | 
				
			||||||
			Device->second->Conn_.VerifiedCertificate = GWObjects::CertificateValidation::NO_CERTIFICATE;
 | 
					 | 
				
			||||||
            return Device->second;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool DeviceRegistry::Connected(const std::string & SerialNumber) {
 | 
					    bool DeviceRegistry::Connected(uint64_t SerialNumber) {
 | 
				
			||||||
		std::lock_guard		Guard(Mutex_);
 | 
							std::lock_guard		Guard(Mutex_);
 | 
				
			||||||
 | 
					 | 
				
			||||||
        auto Device = Devices_.find(SerialNumber);
 | 
					        auto Device = Devices_.find(SerialNumber);
 | 
				
			||||||
 | 
					 | 
				
			||||||
        if(Device == Devices_.end())
 | 
					        if(Device == Devices_.end())
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
 | 
					 | 
				
			||||||
        return Device->second->Conn_.Connected;
 | 
					        return Device->second->Conn_.Connected;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void DeviceRegistry::UnRegister(const std::string & SerialNumber, WSConnection *Ptr) {
 | 
					    void DeviceRegistry::UnRegister(uint64_t SerialNumber, uint64_t ConnectionId) {
 | 
				
			||||||
		std::lock_guard		Guard(Mutex_);
 | 
							std::lock_guard		Guard(Mutex_);
 | 
				
			||||||
 | 
							auto It = Devices_.find(SerialNumber);
 | 
				
			||||||
 | 
							if(It!=Devices_.end()) {
 | 
				
			||||||
 | 
								if(It->second->ConnectionId == ConnectionId)
 | 
				
			||||||
				Devices_.erase(SerialNumber);
 | 
									Devices_.erase(SerialNumber);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool DeviceRegistry::SendFrame(const std::string & SerialNumber, const std::string & Payload) {
 | 
						bool DeviceRegistry::SendFrame(uint64_t SerialNumber, const std::string & Payload) {
 | 
				
			||||||
		std::lock_guard		Guard(Mutex_);
 | 
							std::lock_guard		Guard(Mutex_);
 | 
				
			||||||
		auto Device = Devices_.find(SerialNumber);
 | 
							auto Device = Devices_.find(SerialNumber);
 | 
				
			||||||
		if(Device!=Devices_.end() && Device->second->WSConn_!= nullptr) {
 | 
							if(Device!=Devices_.end() && Device->second->WSConn_!= nullptr) {
 | 
				
			||||||
			try {
 | 
								try {
 | 
				
			||||||
				return Device->second->WSConn_->Send(Payload);
 | 
									return Device->second->WSConn_->Send(Payload);
 | 
				
			||||||
			} catch (...) {
 | 
								} catch (...) {
 | 
				
			||||||
				Logger_.debug(Poco::format("Could not send data to device '%s'", SerialNumber));
 | 
									Logger().debug(Poco::format("Could not send data to device '%s'", SerialNumber));
 | 
				
			||||||
				Device->second->Conn_.Address = "";
 | 
									Device->second->Conn_.Address = "";
 | 
				
			||||||
				Device->second->WSConn_ = nullptr;
 | 
									Device->second->WSConn_ = nullptr;
 | 
				
			||||||
				Device->second->Conn_.Connected = false;
 | 
									Device->second->Conn_.Connected = false;
 | 
				
			||||||
@@ -155,7 +139,7 @@ namespace OpenWifi {
 | 
				
			|||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void DeviceRegistry::SetPendingUUID(const std::string & SerialNumber, uint64_t PendingUUID) {
 | 
						void DeviceRegistry::SetPendingUUID(uint64_t SerialNumber, uint64_t PendingUUID) {
 | 
				
			||||||
		std::lock_guard		Guard(Mutex_);
 | 
							std::lock_guard		Guard(Mutex_);
 | 
				
			||||||
		auto Device = Devices_.find(SerialNumber);
 | 
							auto Device = Devices_.find(SerialNumber);
 | 
				
			||||||
		if(Device!=Devices_.end()) {
 | 
							if(Device!=Devices_.end()) {
 | 
				
			||||||
@@ -163,103 +147,4 @@ namespace OpenWifi {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	std::string ComputeCertificateTag( GWObjects::CertificateValidation V) {
 | 
					 | 
				
			||||||
		switch(V) {
 | 
					 | 
				
			||||||
		case GWObjects::NO_CERTIFICATE: return "no certificate";
 | 
					 | 
				
			||||||
		case GWObjects::VALID_CERTIFICATE: return "non TIP certificate";
 | 
					 | 
				
			||||||
		case GWObjects::MISMATCH_SERIAL: return "serial mismatch";
 | 
					 | 
				
			||||||
		case GWObjects::VERIFIED: return "verified";
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return "unknown";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	const uint64_t SECONDS_MONTH = 30*24*60*60;
 | 
					 | 
				
			||||||
	const uint64_t SECONDS_WEEK = 7*24*60*60;
 | 
					 | 
				
			||||||
	const uint64_t SECONDS_DAY = 1*24*60*60;
 | 
					 | 
				
			||||||
	const uint64_t SECONDS_HOUR = 1*24*60*60;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	std::string ComputeUpLastContactTag(uint64_t T1) {
 | 
					 | 
				
			||||||
		uint64_t T = T1 - std::time(nullptr);
 | 
					 | 
				
			||||||
		if( T>SECONDS_MONTH) return ">month";
 | 
					 | 
				
			||||||
		if( T>SECONDS_WEEK) return ">week";
 | 
					 | 
				
			||||||
		if( T>SECONDS_DAY) return ">day";
 | 
					 | 
				
			||||||
		if( T>SECONDS_HOUR) return ">hour";
 | 
					 | 
				
			||||||
		return "now";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	std::string ComputeSanityTag(uint64_t T) {
 | 
					 | 
				
			||||||
		if( T==100) return "100%";
 | 
					 | 
				
			||||||
		if( T>90) return ">90%";
 | 
					 | 
				
			||||||
		if( T>60) return ">60%";
 | 
					 | 
				
			||||||
		return "<60%";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	std::string ComputeUpTimeTag(uint64_t T) {
 | 
					 | 
				
			||||||
		if( T>SECONDS_MONTH) return ">month";
 | 
					 | 
				
			||||||
		if( T>SECONDS_WEEK) return ">week";
 | 
					 | 
				
			||||||
		if( T>SECONDS_DAY) return ">day";
 | 
					 | 
				
			||||||
		if( T>SECONDS_HOUR) return ">hour";
 | 
					 | 
				
			||||||
		return "now";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	std::string ComputeLoadTag(uint64_t T) {
 | 
					 | 
				
			||||||
		float V=100.0*((float)T/65536.0);
 | 
					 | 
				
			||||||
		if(V<5.0) return "< 5%";
 | 
					 | 
				
			||||||
		if(V<25.0) return "< 25%";
 | 
					 | 
				
			||||||
		if(V<50.0) return "< 50%";
 | 
					 | 
				
			||||||
		if(V<75.0) return "< 75%";
 | 
					 | 
				
			||||||
		return ">75%";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	std::string ComputeFreeMemoryTag(uint64_t Free, uint64_t Total) {
 | 
					 | 
				
			||||||
		float V = 100.0 * ((float)Free/(float(Total)));
 | 
					 | 
				
			||||||
		if(V<5.0) return "< 5%";
 | 
					 | 
				
			||||||
		if(V<25.0) return "< 25%";
 | 
					 | 
				
			||||||
		if(V<50.0) return "< 50%";
 | 
					 | 
				
			||||||
		if(V<75.0) return "< 75%";
 | 
					 | 
				
			||||||
		return ">75%";
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	bool DeviceRegistry::AnalyzeRegistry(GWObjects::Dashboard &D) {
 | 
					 | 
				
			||||||
		std::lock_guard		Guard(Mutex_);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		for(auto const &[SerialNumber,Connection]:Devices_) {
 | 
					 | 
				
			||||||
			Types::UpdateCountedMap(D.status, Connection->Conn_.Connected ? "connected" : "not connected");
 | 
					 | 
				
			||||||
			Types::UpdateCountedMap(D.vendors, OUIServer()->GetManufacturer(SerialNumber));
 | 
					 | 
				
			||||||
			Types::UpdateCountedMap(D.certificates, ComputeCertificateTag(Connection->Conn_.VerifiedCertificate));
 | 
					 | 
				
			||||||
			Types::UpdateCountedMap(D.lastContact, ComputeUpLastContactTag(Connection->Conn_.LastContact));
 | 
					 | 
				
			||||||
			Types::UpdateCountedMap(D.healths, ComputeSanityTag(Connection->LastHealthcheck.Sanity));
 | 
					 | 
				
			||||||
			Types::UpdateCountedMap(D.deviceType, Connection->Conn_.Compatible);
 | 
					 | 
				
			||||||
			if(!Connection->LastStats.empty()) {
 | 
					 | 
				
			||||||
				Poco::JSON::Parser	P;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				auto RawObject = P.parse(Connection->LastStats).extract<Poco::JSON::Object::Ptr>();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				if(RawObject->has("unit")) {
 | 
					 | 
				
			||||||
					auto Unit = RawObject->getObject("unit");
 | 
					 | 
				
			||||||
					if (Unit->has("uptime")) {
 | 
					 | 
				
			||||||
						Types::UpdateCountedMap(D.upTimes, ComputeUpTimeTag(Unit->get("uptime")));
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					if (Unit->has("memory")) {
 | 
					 | 
				
			||||||
						auto Memory = Unit->getObject("memory");
 | 
					 | 
				
			||||||
						uint64_t Free = Memory->get("free");
 | 
					 | 
				
			||||||
						uint64_t Total = Memory->get("total");
 | 
					 | 
				
			||||||
						Types::UpdateCountedMap(D.memoryUsed, ComputeFreeMemoryTag(Free, Total));
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					if (Unit->has("load")) {
 | 
					 | 
				
			||||||
						auto Load = Unit->getArray("load");
 | 
					 | 
				
			||||||
						Types::UpdateCountedMap(D.load1,
 | 
					 | 
				
			||||||
												ComputeLoadTag(Load->getElement<uint64_t>(0)));
 | 
					 | 
				
			||||||
						Types::UpdateCountedMap(D.load5,
 | 
					 | 
				
			||||||
												ComputeLoadTag(Load->getElement<uint64_t>(1)));
 | 
					 | 
				
			||||||
						Types::UpdateCountedMap(D.load15,
 | 
					 | 
				
			||||||
												ComputeLoadTag(Load->getElement<uint64_t>(2)));
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return false;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace
 | 
					}  // namespace
 | 
				
			||||||
@@ -6,8 +6,7 @@
 | 
				
			|||||||
//	Arilia Wireless Inc.
 | 
					//	Arilia Wireless Inc.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef UCENTRAL_UDEVICEREGISTRY_H
 | 
					#pragma once
 | 
				
			||||||
#define UCENTRAL_UDEVICEREGISTRY_H
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "Poco/JSON/Object.h"
 | 
					#include "Poco/JSON/Object.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -22,44 +21,98 @@ namespace OpenWifi {
 | 
				
			|||||||
    class DeviceRegistry : public SubSystemServer {
 | 
					    class DeviceRegistry : public SubSystemServer {
 | 
				
			||||||
    public:
 | 
					    public:
 | 
				
			||||||
		struct ConnectionEntry {
 | 
							struct ConnectionEntry {
 | 
				
			||||||
			WSConnection 				*WSConn_;
 | 
								WSConnection 				* WSConn_ = nullptr;
 | 
				
			||||||
			GWObjects::ConnectionState 	Conn_;
 | 
								GWObjects::ConnectionState 	Conn_;
 | 
				
			||||||
			std::string        			LastStats;
 | 
								std::string        			LastStats;
 | 
				
			||||||
			GWObjects::HealthCheck		LastHealthcheck;
 | 
								GWObjects::HealthCheck		LastHealthcheck;
 | 
				
			||||||
 | 
								uint64_t 					ConnectionId=0;
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        static DeviceRegistry *instance() {
 | 
					        static auto instance() {
 | 
				
			||||||
            static DeviceRegistry *instance_ = new DeviceRegistry;
 | 
					            static auto instance_ = new DeviceRegistry;
 | 
				
			||||||
            return instance_;
 | 
					            return instance_;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		int Start() override;
 | 
							int Start() override;
 | 
				
			||||||
		void Stop() override;
 | 
							void Stop() override;
 | 
				
			||||||
		bool GetStatistics(const std::string &SerialNumber, std::string & Statistics);
 | 
					 | 
				
			||||||
		void SetStatistics(const std::string &SerialNumber, const std::string &stats);
 | 
					 | 
				
			||||||
		bool GetState(const std::string & SerialNumber, GWObjects::ConnectionState & State);
 | 
					 | 
				
			||||||
		void SetState(const std::string & SerialNumber, GWObjects::ConnectionState & State);
 | 
					 | 
				
			||||||
		bool GetHealthcheck(const std::string &SerialNumber, GWObjects::HealthCheck & CheckData);
 | 
					 | 
				
			||||||
		void SetHealthcheck(const std::string &SerialNumber, const GWObjects::HealthCheck &H);
 | 
					 | 
				
			||||||
		std::shared_ptr<ConnectionEntry> Register(const std::string & SerialNumber, WSConnection *);
 | 
					 | 
				
			||||||
		void UnRegister(const std::string & SerialNumber, WSConnection *);
 | 
					 | 
				
			||||||
		bool SendCommand(GWObjects::CommandDetails & Command);
 | 
					 | 
				
			||||||
		bool Connected(const std::string & SerialNumber);
 | 
					 | 
				
			||||||
		bool SendFrame(const std::string & SerialNumber, const std::string & Payload);
 | 
					 | 
				
			||||||
		void SetPendingUUID(const std::string & SerialNumber, uint64_t PendingUUID);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		bool AnalyzeRegistry(GWObjects::Dashboard &D);
 | 
							inline bool GetStatistics(const std::string &SerialNumber, std::string & Statistics) {
 | 
				
			||||||
 | 
								return GetStatistics(Utils::SerialNumberToInt(SerialNumber),Statistics);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							bool GetStatistics(uint64_t SerialNumber, std::string & Statistics);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline void SetStatistics(const std::string &SerialNumber, const std::string &Statistics) {
 | 
				
			||||||
 | 
								return SetStatistics(Utils::SerialNumberToInt(SerialNumber),Statistics);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							void SetStatistics(uint64_t SerialNumber, const std::string &stats);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline bool GetState(const std::string & SerialNumber, GWObjects::ConnectionState & State) {
 | 
				
			||||||
 | 
								return GetState(Utils::SerialNumberToInt(SerialNumber), State);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							bool GetState(uint64_t SerialNumber, GWObjects::ConnectionState & State);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline void SetState(const std::string & SerialNumber, const GWObjects::ConnectionState & State) {
 | 
				
			||||||
 | 
								return SetState(Utils::SerialNumberToInt(SerialNumber), State);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							void SetState(uint64_t SerialNumber, const GWObjects::ConnectionState & State);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline bool GetHealthcheck(const std::string &SerialNumber, GWObjects::HealthCheck & CheckData) {
 | 
				
			||||||
 | 
								return GetHealthcheck(Utils::SerialNumberToInt(SerialNumber), CheckData);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							bool GetHealthcheck(uint64_t SerialNumber, GWObjects::HealthCheck & CheckData);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline void SetHealthcheck(const std::string &SerialNumber, const GWObjects::HealthCheck &H) {
 | 
				
			||||||
 | 
								return SetHealthcheck(Utils::SerialNumberToInt(SerialNumber),H);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							void SetHealthcheck(uint64_t SerialNumber, const GWObjects::HealthCheck &H);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							std::shared_ptr<ConnectionEntry> Register(uint64_t SerialNumber, WSConnection *Conn, uint64_t & ConnectionId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline void UnRegister(const std::string & SerialNumber, uint64_t ConnectionId) {
 | 
				
			||||||
 | 
								return UnRegister(Utils::SerialNumberToInt(SerialNumber),ConnectionId);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							void UnRegister(uint64_t SerialNumber, uint64_t ConnectionId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline bool Connected(const std::string & SerialNumber) {
 | 
				
			||||||
 | 
								return Connected(Utils::SerialNumberToInt(SerialNumber));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							bool Connected(uint64_t SerialNumber);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline bool SendFrame(const std::string & SerialNumber, const std::string & Payload) {
 | 
				
			||||||
 | 
								return SendFrame(Utils::SerialNumberToInt(SerialNumber), Payload);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							bool SendFrame(uint64_t SerialNumber, const std::string & Payload);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline void SetPendingUUID(const std::string & SerialNumber, uint64_t PendingUUID) {
 | 
				
			||||||
 | 
								return SetPendingUUID(Utils::SerialNumberToInt(SerialNumber), PendingUUID);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							void SetPendingUUID(uint64_t SerialNumber, uint64_t PendingUUID);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							[[nodiscard]] inline std::shared_ptr<ConnectionEntry> GetDeviceConnection(const std::string & SerialNumber) {
 | 
				
			||||||
 | 
								return GetDeviceConnection(Utils::SerialNumberToInt(SerialNumber));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							[[nodiscard]] inline std::shared_ptr<ConnectionEntry> GetDeviceConnection(uint64_t SerialNumber) {
 | 
				
			||||||
 | 
								std::lock_guard		Guard(Mutex_);
 | 
				
			||||||
 | 
								auto Device = Devices_.find(SerialNumber);
 | 
				
			||||||
 | 
								if(Device!=Devices_.end() && Device->second->WSConn_!= nullptr) {
 | 
				
			||||||
 | 
									return Device->second;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return nullptr;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	  private:
 | 
						  private:
 | 
				
			||||||
		std::map<std::string,std::shared_ptr<ConnectionEntry>>   Devices_;
 | 
							inline static std::atomic_uint64_t 						Id_=1;
 | 
				
			||||||
 | 
							std::map<uint64_t ,std::shared_ptr<ConnectionEntry>>  	Devices_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		DeviceRegistry() noexcept:
 | 
							DeviceRegistry() noexcept:
 | 
				
			||||||
    		SubSystemServer("DeviceRegistry", "DevStatus", "devicestatus") {
 | 
					    		SubSystemServer("DeviceRegistry", "DevStatus", "devicestatus") {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inline DeviceRegistry * DeviceRegistry() { return DeviceRegistry::instance(); }
 | 
						inline auto DeviceRegistry() { return DeviceRegistry::instance(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}  // namespace
 | 
					}  // namespace
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif //UCENTRAL_UDEVICEREGISTRY_H
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,7 @@ namespace OpenWifi {
 | 
				
			|||||||
    static const std::string URI_BASE{"/v1/upload/"};
 | 
					    static const std::string URI_BASE{"/v1/upload/"};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int FileUploader::Start() {
 | 
					    int FileUploader::Start() {
 | 
				
			||||||
        Logger_.notice("Starting.");
 | 
					        Logger().notice("Starting.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Poco::File UploadsDir(MicroService::instance().ConfigPath("openwifi.fileuploader.path","/tmp"));
 | 
					        Poco::File UploadsDir(MicroService::instance().ConfigPath("openwifi.fileuploader.path","/tmp"));
 | 
				
			||||||
        Path_ = UploadsDir.path();
 | 
					        Path_ = UploadsDir.path();
 | 
				
			||||||
@@ -37,7 +37,7 @@ namespace OpenWifi {
 | 
				
			|||||||
        	try {
 | 
					        	try {
 | 
				
			||||||
        		UploadsDir.createDirectory();
 | 
					        		UploadsDir.createDirectory();
 | 
				
			||||||
        	} catch (const Poco::Exception &E) {
 | 
					        	} catch (const Poco::Exception &E) {
 | 
				
			||||||
        		Logger_.log(E);
 | 
					        		Logger().log(E);
 | 
				
			||||||
        		Path_ = "/tmp";
 | 
					        		Path_ = "/tmp";
 | 
				
			||||||
        	}
 | 
					        	}
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -46,13 +46,13 @@ namespace OpenWifi {
 | 
				
			|||||||
                          Svr.Address() + ":" + std::to_string(Svr.Port()) +
 | 
					                          Svr.Address() + ":" + std::to_string(Svr.Port()) +
 | 
				
			||||||
                          " key:" + Svr.KeyFile() +
 | 
					                          " key:" + Svr.KeyFile() +
 | 
				
			||||||
                          " cert:" + Svr.CertFile()};
 | 
					                          " cert:" + Svr.CertFile()};
 | 
				
			||||||
            Logger_.information(l);
 | 
					            Logger().information(l);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            auto Sock{Svr.CreateSecureSocket(Logger_)};
 | 
					            auto Sock{Svr.CreateSecureSocket(Logger())};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			Svr.LogCert(Logger_);
 | 
								Svr.LogCert(Logger());
 | 
				
			||||||
			if(!Svr.RootCA().empty())
 | 
								if(!Svr.RootCA().empty())
 | 
				
			||||||
				Svr.LogCas(Logger_);
 | 
									Svr.LogCas(Logger());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            auto Params = new Poco::Net::HTTPServerParams;
 | 
					            auto Params = new Poco::Net::HTTPServerParams;
 | 
				
			||||||
            Params->setMaxThreads(16);
 | 
					            Params->setMaxThreads(16);
 | 
				
			||||||
@@ -66,10 +66,10 @@ namespace OpenWifi {
 | 
				
			|||||||
            	} else {
 | 
					            	} else {
 | 
				
			||||||
            		FullName_ = TmpName + URI_BASE ;
 | 
					            		FullName_ = TmpName + URI_BASE ;
 | 
				
			||||||
            	}
 | 
					            	}
 | 
				
			||||||
            	Logger_.information(Poco::format("Uploader URI base is '%s'", FullName_));
 | 
					            	Logger().information(Poco::format("Uploader URI base is '%s'", FullName_));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            auto NewServer = std::make_unique<Poco::Net::HTTPServer>(new FileUpLoaderRequestHandlerFactory(Logger_), Pool_, Sock, Params);
 | 
					            auto NewServer = std::make_unique<Poco::Net::HTTPServer>(new FileUpLoaderRequestHandlerFactory(Logger()), Pool_, Sock, Params);
 | 
				
			||||||
            NewServer->start();
 | 
					            NewServer->start();
 | 
				
			||||||
            Servers_.push_back(std::move(NewServer));
 | 
					            Servers_.push_back(std::move(NewServer));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -81,7 +81,7 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	void FileUploader::reinitialize(Poco::Util::Application &self) {
 | 
						void FileUploader::reinitialize(Poco::Util::Application &self) {
 | 
				
			||||||
		MicroService::instance().LoadConfigurationFile();
 | 
							MicroService::instance().LoadConfigurationFile();
 | 
				
			||||||
    	Logger_.information("Reinitializing.");
 | 
					    	Logger().information("Reinitializing.");
 | 
				
			||||||
		Stop();
 | 
							Stop();
 | 
				
			||||||
		Start();
 | 
							Start();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -144,7 +144,7 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				std::string FinalFileName = FileUploader()->Path() + "/" + UUID_;
 | 
									std::string FinalFileName = FileUploader()->Path() + "/" + UUID_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				Logger_.information(Poco::format("FILE-UPLOADER: uploading trace for %s", FinalFileName));
 | 
									Logger().information(Poco::format("FILE-UPLOADER: uploading trace for %s", FinalFileName));
 | 
				
			||||||
				Poco::CountingInputStream InputStream(Stream);
 | 
									Poco::CountingInputStream InputStream(Stream);
 | 
				
			||||||
				std::ofstream OutputStream(FinalFileName, std::ofstream::out);
 | 
									std::ofstream OutputStream(FinalFileName, std::ofstream::out);
 | 
				
			||||||
				Poco::StreamCopier::copyStream(InputStream, OutputStream);
 | 
									Poco::StreamCopier::copyStream(InputStream, OutputStream);
 | 
				
			||||||
@@ -159,7 +159,7 @@ namespace OpenWifi {
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
				return;
 | 
									return;
 | 
				
			||||||
			} catch (const Poco::Exception &E ) {
 | 
								} catch (const Poco::Exception &E ) {
 | 
				
			||||||
				Logger_.log(E);
 | 
									Logger().log(E);
 | 
				
			||||||
				Error_ = std::string("Upload caused an internal error: ") + E.what() ;
 | 
									Error_ = std::string("Upload caused an internal error: ") + E.what() ;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -168,6 +168,7 @@ namespace OpenWifi {
 | 
				
			|||||||
        [[nodiscard]] const std::string& Name() const { return Name_; }
 | 
					        [[nodiscard]] const std::string& Name() const { return Name_; }
 | 
				
			||||||
		[[nodiscard]] bool Good() const { return Good_; }
 | 
							[[nodiscard]] bool Good() const { return Good_; }
 | 
				
			||||||
		std::string & Error() { return Error_; }
 | 
							std::string & Error() { return Error_; }
 | 
				
			||||||
 | 
							inline Poco::Logger & Logger() { return Logger_; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private:
 | 
					    private:
 | 
				
			||||||
        uint64_t        Length_=0;
 | 
					        uint64_t        Length_=0;
 | 
				
			||||||
@@ -191,7 +192,7 @@ namespace OpenWifi {
 | 
				
			|||||||
        void handleRequest(Poco::Net::HTTPServerRequest& Request, Poco::Net::HTTPServerResponse& Response) override
 | 
					        void handleRequest(Poco::Net::HTTPServerRequest& Request, Poco::Net::HTTPServerResponse& Response) override
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
				FileUploaderPartHandler partHandler(UUID_,Logger_);
 | 
									FileUploaderPartHandler partHandler(UUID_,Logger());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                Poco::Net::HTMLForm form(Request, Request.stream(), partHandler);
 | 
					                Poco::Net::HTMLForm form(Request, Request.stream(), partHandler);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -215,12 +216,13 @@ namespace OpenWifi {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            catch( const Poco::Exception & E )
 | 
					            catch( const Poco::Exception & E )
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Logger_.warning(Poco::format("Error occurred while performing upload. Error='%s'",E.displayText()));
 | 
					                Logger().warning(Poco::format("Error occurred while performing upload. Error='%s'",E.displayText()));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            catch( ... )
 | 
					            catch( ... )
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
							inline Poco::Logger & Logger() { return Logger_; }
 | 
				
			||||||
    private:
 | 
					    private:
 | 
				
			||||||
        std::string     UUID_;
 | 
					        std::string     UUID_;
 | 
				
			||||||
        Poco::Logger    & Logger_;
 | 
					        Poco::Logger    & Logger_;
 | 
				
			||||||
@@ -228,7 +230,7 @@ namespace OpenWifi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    Poco::Net::HTTPRequestHandler *FileUpLoaderRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest & Request) {
 | 
					    Poco::Net::HTTPRequestHandler *FileUpLoaderRequestHandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest & Request) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Logger_.debug(Poco::format("REQUEST(%s): %s %s", Utils::FormatIPv6(Request.clientAddress().toString()), Request.getMethod(), Request.getURI()));
 | 
							Logger().debug(Poco::format("REQUEST(%s): %s %s", Utils::FormatIPv6(Request.clientAddress().toString()), Request.getMethod(), Request.getURI()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //  The UUID should be after the /v1/upload/ part...
 | 
					        //  The UUID should be after the /v1/upload/ part...
 | 
				
			||||||
        auto UUIDLocation = Request.getURI().find_first_of(URI_BASE);
 | 
					        auto UUIDLocation = Request.getURI().find_first_of(URI_BASE);
 | 
				
			||||||
@@ -240,18 +242,18 @@ namespace OpenWifi {
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                //  make sure we do not allow anyone else to overwrite our file
 | 
					                //  make sure we do not allow anyone else to overwrite our file
 | 
				
			||||||
				FileUploader()->RemoveRequest(UUID);
 | 
									FileUploader()->RemoveRequest(UUID);
 | 
				
			||||||
                return new FormRequestHandler(UUID,Logger_);
 | 
					                return new FormRequestHandler(UUID,Logger());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Logger_.warning(Poco::format("Unknown UUID=%s",UUID));
 | 
					                Logger().warning(Poco::format("Unknown UUID=%s",UUID));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return nullptr;
 | 
					        return nullptr;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void FileUploader::Stop() {
 | 
					    void FileUploader::Stop() {
 | 
				
			||||||
        Logger_.notice("Stopping ");
 | 
					        Logger().notice("Stopping ");
 | 
				
			||||||
        for( const auto & svr : Servers_ )
 | 
					        for( const auto & svr : Servers_ )
 | 
				
			||||||
            svr->stop();
 | 
					            svr->stop();
 | 
				
			||||||
		Servers_.clear();
 | 
							Servers_.clear();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,8 +6,7 @@
 | 
				
			|||||||
//	Arilia Wireless Inc.
 | 
					//	Arilia Wireless Inc.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef UCENTRAL_UFILEUPLOADER_H
 | 
					#pragma once
 | 
				
			||||||
#define UCENTRAL_UFILEUPLOADER_H
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "Poco/Net/HTTPRequestHandler.h"
 | 
					#include "Poco/Net/HTTPRequestHandler.h"
 | 
				
			||||||
#include "Poco/Net/HTTPRequestHandlerFactory.h"
 | 
					#include "Poco/Net/HTTPRequestHandlerFactory.h"
 | 
				
			||||||
@@ -29,8 +28,8 @@ namespace OpenWifi {
 | 
				
			|||||||
		void RemoveRequest(const std::string &UUID);
 | 
							void RemoveRequest(const std::string &UUID);
 | 
				
			||||||
		const std::string & Path() { return Path_; };
 | 
							const std::string & Path() { return Path_; };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        static FileUploader *instance() {
 | 
					        static auto instance() {
 | 
				
			||||||
            static FileUploader * instance_ = new FileUploader;
 | 
					            static auto instance_ = new FileUploader;
 | 
				
			||||||
			return instance_;
 | 
								return instance_;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -45,7 +44,8 @@ namespace OpenWifi {
 | 
				
			|||||||
		uint64_t 						MaxSize_=10000000;
 | 
							uint64_t 						MaxSize_=10000000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		explicit FileUploader() noexcept:
 | 
							explicit FileUploader() noexcept:
 | 
				
			||||||
			SubSystemServer("FileUploader", "FILE-UPLOAD", "openwifi.fileuploader")
 | 
								SubSystemServer("FileUploader", "FILE-UPLOAD", "openwifi.fileuploader"),
 | 
				
			||||||
 | 
							   	Pool_("FileUpLoaderPool")
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
@@ -56,11 +56,11 @@ namespace OpenWifi {
 | 
				
			|||||||
                Logger_(L){}
 | 
					                Logger_(L){}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Poco::Net::HTTPRequestHandler *createRequestHandler(const Poco::Net::HTTPServerRequest &request) override;
 | 
					        Poco::Net::HTTPRequestHandler *createRequestHandler(const Poco::Net::HTTPServerRequest &request) override;
 | 
				
			||||||
 | 
							inline Poco::Logger & Logger() { return Logger_; }
 | 
				
			||||||
    private:
 | 
					    private:
 | 
				
			||||||
        Poco::Logger    & Logger_;
 | 
					        Poco::Logger    & Logger_;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inline FileUploader * FileUploader() { return FileUploader::instance(); }
 | 
						inline auto FileUploader() { return FileUploader::instance(); }
 | 
				
			||||||
} //   namespace
 | 
					} //   namespace
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif //UCENTRAL_UFILEUPLOADER_H
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||