List of commits:
Subject Hash Author Date (UTC)
Werk van Simulator na testen 05/12/17. 80af7ffb5438b855a2e73fb185ba66c1cd50efe3 Jan Allersma 2017-12-05 09:45:11
More Waypoints! 465108ac6a127bbda26b40989fd6a68cd3e00aad Jan Allersma 2017-11-30 12:52:22
Added voetganger. dad12c3d2eb2a7160838c3495e4a7a2d382e493f Jan Allersma 2017-11-30 12:32:35
Added all waiting waypoints for 1xx. bbba002738e0a26b085673400c76329d3055d8ba Jan Allersma 2017-11-29 12:00:37
Simulation now working correctly for ID's 101, 102 and 103. 1bc2fb65bb75b3a1f63cf7690472152fe1f32564 Jan Allersma 2017-11-28 16:22:53
Autos kunnen gespawned worden en rijden dan de goede richting op. b36ef1cafeda20d5753b72c6f8e6ac8423c42d95 Jan Allersma 2017-11-26 21:44:39
Last changes before test case 5. 258ba4735dfd2078f8e4f034fffed2bbbb086f2a Jan Allersma 2017-11-22 14:08:37
hallo dit is kapot maar het werkt woehoe 4475c2633e962688c71634d633ac8789524f16cf XCBouke 2017-11-22 13:58:54
It's actually working now! With a gameloop and new icons :D 0b65d450fea6d9f679029f2d6765c7e2d1126cdd Jan Allersma 2017-11-20 22:02:23
Something... Works?? 9a6afe028642b571483fccd6d6bdab10dee68e9c Jan Allersma 2017-11-20 15:14:07
User input for sending msg. cdd1c17cfe8cc73985945aad5878e4891e92eab1 Jan Allersma 2017-11-14 23:05:53
prutsen veel prusten f37cf730ff7a0ad2e08cd769da5f488051ac6dd4 XCBouke 2017-11-09 21:32:15
uglyJsonCode created online with Bitbucket ed6c9c541947ec64827b6e80ed959feb1b0f9b85 XCBouke 2017-11-09 14:29:36
Connectie created online with Bitbucket (send en recieve in 1) b484aff52014ff8d1dbaf8387cf1479cf236f33a XCBouke 2017-11-09 14:28:29
Ready for test case 3. Also BIG cleanup. bda906e19e3b82fb91df53eb2208e8def822c6b5 Jan Allersma 2017-11-05 21:38:16
test case 2 fix(?) dd86d637d166707a31b644dad711c7a9e39dbc8d Jan Allersma 2017-11-04 10:55:03
Test case 2 9ea6eadbd85dde0e9522068718092b1f0e9b49f0 Jan Allersma 2017-10-29 22:37:57
Added threading. 4540fe1669c9e145e613edf2459031e7bec500ea Jan Allersma 2017-10-29 20:47:49
Code for testing 16/10/17. Use simulatie/rabbit/combination.py mainly. c5e87d7fe5abbcd3316b1538a0d647fd23faa59f Jan Allersma 2017-10-15 19:13:23
Added more paths. Some of them are WIP. 03ad1039e22bd1ebd301bda99e78f38239a15077 Jan Allersma 2017-09-21 14:40:44
Commit 80af7ffb5438b855a2e73fb185ba66c1cd50efe3 - Werk van Simulator na testen 05/12/17.
Author: Jan Allersma
Author date (UTC): 2017-12-05 09:45
Committer name: Jan Allersma
Committer date (UTC): 2017-12-05 09:45
Parent(s): 465108ac6a127bbda26b40989fd6a68cd3e00aad
Signing key:
Tree: 8b7980223c684eccdab61f0a3493ee0ce71a5bd4
File Lines added Lines deleted
simulatie/Button.py 49 0
simulatie/Buttons.py 47 0
simulatie/Example.py 44 0
simulatie/connection.py 6 0
simulatie/light_color.png 0 0
simulatie/light_color.xcf 0 0
simulatie/model.py 1 1
simulatie/pyg.py 62 7
simulatie/traffic.py 5 4
simulatie/trafficModel.py 204 8
File simulatie/Button.py added (mode: 100644) (index 0000000..afbccc9)
1 # -*- coding: cp1252 -*-
2 #/usr/bin/env python
3
4 import pygame
5
6 from pygame.locals import *
7
8 pygame.init()
9
10 class Button:
11 def create_button(self, surface, color, x, y, text):
12 surface = self.draw_button(surface, color, x, y)
13 surface = self.write_text(surface, text, x, y)
14 self.rect = pygame.Rect(x,y, 50, 200)
15 self.isGreen = False
16 return surface
17
18 def write_text(self, surface, text, x, y):
19 font_size = int(50//len(text))
20 myFont = pygame.font.SysFont("Calibri", font_size)
21 myText = myFont.render(text, 1, (255,255,255))
22 surface.blit(myText, ((x+50/2) - myText.get_width()/2, (y+200/2) - myText.get_height()/2))
23 return surface
24
25 def draw_button(self, surface, x, y):
26 for i in range(1,10):
27 s = pygame.Surface((50+(i*2),200+(i*2)))
28 s.fill(color)
29 alpha = (255/(i+2))
30 if alpha <= 0:
31 alpha = 1
32 s.set_alpha(alpha)
33 pygame.draw.rect(s, color, (x-i,y-i,50+i,200+i), 0)
34 surface.blit(s, (x-i,y-i))
35 pygame.draw.rect(surface, (50,150,50), (x,y,50,200), 0)
36 pygame.draw.rect(surface, (190,190,190), (x,y,50,200), 1)
37 return surface
38
39 def pressed(self, mouse):
40 if mouse[0] > self.rect.topleft[0] and mouse[1] > self.rect.topleft[1] and mouse[0] < self.rect.bottomright[0] and mouse[1] < self.rect.bottomright[1]:
41 print "Some button was pressed!"
42 return True
43 else:
44 return False
45
46 def toggleLight(self):
47 self.isGreen = !self.isGreen
48 if isGreen:
49 pygame.draw.rect(surface, (50,150,50), (x,y,50,200), 0)
File simulatie/Buttons.py added (mode: 100644) (index 0000000..55c09be)
1 # -*- coding: cp1252 -*-
2 #/usr/bin/env python
3 #Simon H. Larsen
4 #Buttons
5 #Project startet: d. 26. august 2012
6 import pygame
7 from pygame.locals import *
8 pygame.init()
9 class Button:
10 def create_button(self, surface, color, x, y, length, height, width, text, text_color):
11 surface = self.draw_button(surface, color, length, height, x, y, width)
12 surface = self.write_text(surface, text, text_color, length, height, x, y)
13 self.rect = pygame.Rect(x,y, length, height)
14 return surface
15
16 def write_text(self, surface, text, text_color, length, height, x, y):
17 font_size = int(length//len(text))
18 myFont = pygame.font.SysFont("Calibri", font_size)
19 myText = myFont.render(text, 1, text_color)
20 surface.blit(myText, ((x+length/2) - myText.get_width()/2, (y+height/2) - myText.get_height()/2))
21 return surface
22
23 def draw_button(self, surface, color, length, height, x, y, width):
24 for i in range(1,10):
25 s = pygame.Surface((length+(i*2),height+(i*2)))
26 s.fill(color)
27 alpha = (255/(i+2))
28 if alpha <= 0:
29 alpha = 1
30 s.set_alpha(alpha)
31 pygame.draw.rect(s, color, (x-i,y-i,length+i,height+i), width)
32 surface.blit(s, (x-i,y-i))
33 pygame.draw.rect(surface, color, (x,y,length,height), 0)
34 pygame.draw.rect(surface, (190,190,190), (x,y,length,height), 1)
35 return surface
36
37 def pressed(self, mouse):
38 if mouse[0] > self.rect.topleft[0]:
39 if mouse[1] > self.rect.topleft[1]:
40 if mouse[0] < self.rect.bottomright[0]:
41 if mouse[1] < self.rect.bottomright[1]:
42 print "Some button was pressed!"
43 return True
44 else: return False
45 else: return False
46 else: return False
47 else: return False
File simulatie/Example.py added (mode: 100644) (index 0000000..f2a4c76)
1 # -*- coding: cp1252 -*-
2 #/usr/bin/env python
3 #Simon H. Larsen
4 #Buttons.py - example
5 #Project startet: d. 28. august 2012
6 #Import pygame modules and Buttons.py(it must be in same dir)
7 import pygame, Buttons
8 from pygame.locals import *
9
10 #Initialize pygame
11 pygame.init()
12
13 class Button_Example:
14 def __init__(self):
15 self.main()
16
17 #Create a display
18 def display(self):
19 self.screen = pygame.display.set_mode((650,370),0,32)
20 pygame.display.set_caption("Buttons.py - example")
21
22 #Update the display and show the button
23 def update_display(self):
24 self.screen.fill((30,144,255))
25 #Parameters: surface, color, x, y, length, height, width, text, text_color
26 self.Button1.create_button(self.screen, (107,142,35), 225, 135, 200, 100, 0, "Example", (255,255,255))
27 pygame.display.flip()
28
29
30 #Run the loop
31 def main(self):
32 self.Button1 = Buttons.Button()
33 self.display()
34 while True:
35 self.update_display()
36 for event in pygame.event.get():
37 if event.type == pygame.QUIT:
38 pygame.quit()
39 elif event.type == MOUSEBUTTONDOWN:
40 if self.Button1.pressed(pygame.mouse.get_pos()):
41 print "Give me a command!"
42
43 if __name__ == '__main__':
44 obj = Button_Example()
File simulatie/connection.py changed (mode: 100644) (index e3018ee..085c47c)
... ... lights = [
31 31 [404, 0, None], [404, 0, None],
32 32 [405, 0, None], [405, 0, None],
33 33 [406, 0, None], [406, 0, None],
34 [407, 0, None],
35 [408, 0, None],
36 [409, 0, None],
37 [410, 0, None],
38 [411, 0, None],
39 [412, 0, None],
34 40 [501, 0, None], [501, 0, None],
35 41 [601, 0, None] [601, 0, None]
36 42 ] ]
File simulatie/light_color.png added (mode: 100644) (index 0000000..817b651)
File simulatie/light_color.xcf added (mode: 100644) (index 0000000..25e7ec4)
File simulatie/model.py changed (mode: 100644) (index ca92648..33f1d9c)
2 2 uname = 'softdev' uname = 'softdev'
3 3 passwd = 'softdev' passwd = 'softdev'
4 4 vhost = '/8' vhost = '/8'
5 host = '127.0.0.1'#'141.252.237.90'
5 host = '141.252.237.60'
6 6
7 7 recieveQueue = 'simulator' recieveQueue = 'simulator'
8 8 sendQueue = 'controller' sendQueue = 'controller'
File simulatie/pyg.py changed (mode: 100644) (index 749b178..08f55a2)
... ... import trafficModel as tm
9 9 import connection import connection
10 10
11 11 vehicles = list() vehicles = list()
12 lights = list()
12 13
13 14 pygame.init() pygame.init()
14 15
 
... ... screen = pygame.display.set_mode((800,800))
16 17 screen.fill((255,255,255)) screen.fill((255,255,255))
17 18 bg = pygame.transform.scale(pygame.image.load("./PlattegrondV5.png"), (800,800)) bg = pygame.transform.scale(pygame.image.load("./PlattegrondV5.png"), (800,800))
18 19
20 class Light(object):
21 def __init__(self, lightIndex):
22 self.lamp = pygame.image.load("light_color.png")
23 #self.lamp_tint = self.lamp()
24 self.rect = self.lamp.get_rect()
25
26 print("Light " + str(lightIndex) + " -> " + str(tm.lightsPos[lightIndex]))
27
28 self.rect.x = tm.lightsPos[lightIndex]["position"][0]
29 self.rect.y = tm.lightsPos[lightIndex]["position"][1]
30 self.lightIndex = lightIndex
31
32 def lightCheck(self):
33 self.lamp_tint = self.lamp.copy()
34 #if tm.lights[self.lightIndex] == 0: # ROOD
35 # self.lamp_tint.fill((250, 150, 150), None, pygame.BLEND_RGB_MULT)
36 #elif tm.lights[self.lightIndex] == 1: # ORANJE
37 self.lamp_tint.fill((190, 60, 60), None, pygame.BLEND_RGB_MULT)
38 #elif tm.lights[self.lightIndex] == 2: # GROEN
39
40 screen.blit(self.lamp_tint, self.rect)
41
42
19 43 class Vehicle(object): class Vehicle(object):
20 44 def __init__(self, x, y, trafficId): def __init__(self, x, y, trafficId):
21 45 trafficType = tm.lights[trafficId]["Id"] trafficType = tm.lights[trafficId]["Id"]
22 46 print("Traffic type: " + str(trafficType)) print("Traffic type: " + str(trafficType))
23 print(trafficType)
47
24 48 if trafficType >= 100 and trafficType < 200: # Is een auto if trafficType >= 100 and trafficType < 200: # Is een auto
25 49 self.auto = pygame.transform.scale(pygame.image.load("Auto.png"), (64,64)) self.auto = pygame.transform.scale(pygame.image.load("Auto.png"), (64,64))
26 50 elif trafficType < 300: # Is een bus elif trafficType < 300: # Is een bus
 
... ... class Vehicle(object):
33 57 self.auto = pygame.transform.scale(pygame.image.load("Trein.png"), (64,64)) self.auto = pygame.transform.scale(pygame.image.load("Trein.png"), (64,64))
34 58 else: # zijn slagbomen else: # zijn slagbomen
35 59 pass pass
60
36 61 self.rect = self.auto.get_rect() self.rect = self.auto.get_rect()
37 62 self.dest = [x,y] self.dest = [x,y]
38 63 self.speed = [0,0] self.speed = [0,0]
 
... ... class Vehicle(object):
40 65
41 66 self.wp = 1 self.wp = 1
42 67 self.waiting = True self.waiting = True
68 self.transform = 0
43 69
44 70 self.rect.x = tm.queues[trafficId][0][0] self.rect.x = tm.queues[trafficId][0][0]
45 71 self.rect.y = tm.queues[trafficId][0][1] self.rect.y = tm.queues[trafficId][0][1]
46 72
73 # Bij sommige ID's moet de texture gespiegeld worden.
47 74 if trafficType == 103 or trafficType == 106 or trafficType == 108 or trafficType == 109 or trafficType == 110 or trafficType == 303 or trafficType == 402: if trafficType == 103 or trafficType == 106 or trafficType == 108 or trafficType == 109 or trafficType == 110 or trafficType == 303 or trafficType == 402:
48 75 self.auto = pygame.transform.flip(self.auto, True, False) self.auto = pygame.transform.flip(self.auto, True, False)
49 76
77 self.transform = self.checkForTransform()
78 print(self.transform)
79
80 def checkForTransform(self):
81 trafficType = tm.lights[self.trafficId]["Id"]
82 for i in range(0, len(tm.transforms)):
83 if tm.transforms[i]["from"] == trafficType:
84 return tm.transforms[i]["to"]
85 print("transform found!")
86 return 0
87
50 88 def update(self): def update(self):
51 89 screen.blit(self.auto, self.rect) screen.blit(self.auto, self.rect)
52 90 self.rect = self.rect.move(self.speed) self.rect = self.rect.move(self.speed)
 
... ... class Vehicle(object):
75 113 self.wp += 1 self.wp += 1
76 114 print("W: " + str(self.wp) + " / " + str(len(tm.queues[self.trafficId]))) print("W: " + str(self.wp) + " / " + str(len(tm.queues[self.trafficId])))
77 115
78 # elif self.waiting: # Debug
79 # time.sleep(1)
80 # tm.lights[self.trafficId]["Status"] = 1 # Debug
116 #elif self.waiting: # Debug
117 # time.sleep(1)
118 # tm.lights[self.trafficId]["Status"] = 1 # Debug
81 119
82 120 elif not self.waiting and self.wp < len(tm.waypoints[self.trafficId]): elif not self.waiting and self.wp < len(tm.waypoints[self.trafficId]):
83 121 self.goto(tm.waypoints[self.trafficId][self.wp][0], tm.waypoints[self.trafficId][self.wp][1]) self.goto(tm.waypoints[self.trafficId][self.wp][0], tm.waypoints[self.trafficId][self.wp][1])
84 122 self.wp += 1 self.wp += 1
85 123 print("NW: " + str(self.wp) + " / " + str(len(tm.waypoints[self.trafficId]))) print("NW: " + str(self.wp) + " / " + str(len(tm.waypoints[self.trafficId])))
86 124
125 elif not self.waiting: # Check for transform
126 if self.transform != 0:
127 self.trafficId = self.transform
128 self.wp = 1
129 self.waiting = True
130
131 self.transform = self.checkForTransform()
132 connection.update(self.trafficId, 1, None)
133 else:
134 pass # Desctructor here?
135
87 136
88 137
89 138 def trafficCheck(self): def trafficCheck(self):
 
... ... def update(jsonObj):
102 151
103 152 def spawnTrein(naarGroningen): def spawnTrein(naarGroningen):
104 153 if naarGroningen: if naarGroningen:
105 train = Vehicle(0,0,28)
154 train = Vehicle(tm.queues[28][0][0], tm.queues[28][0][1], 28)
106 155
107 156 else: else:
108 train = Vehicle(0,0,29)
157 train = Vehicle(tm.queues[28][0][0], tm.queues[28][0][1],28)#9)
109 158
110 159 def slagbomenDalen(): def slagbomenDalen():
111 160 print("Lichten knipperen & bellen luiden") print("Lichten knipperen & bellen luiden")
 
... ... def spawnVehicle(index):
124 173
125 174 # Mainloop # Mainloop
126 175 def gameloop(): def gameloop():
127 #id = 16
176 #id = 28
128 177 #car = Vehicle(tm.queues[id][0][0],tm.queues[id][0][1],id) #car = Vehicle(tm.queues[id][0][0],tm.queues[id][0][1],id)
178
179 for i in range(0, len(tm.lights)):
180 lights.append(Light(i))
181
129 182 while True: while True:
130 183 clock.tick(60) clock.tick(60)
131 184 for event in pygame.event.get(): for event in pygame.event.get():
 
... ... def gameloop():
135 188 screen.blit(bg, bg.get_rect()) screen.blit(bg, bg.get_rect())
136 189 for vehicle in vehicles: for vehicle in vehicles:
137 190 vehicle.trafficCheck() vehicle.trafficCheck()
191 #for light in lights:
192 # light.lightCheck()
138 193 #car.trafficCheck() #car.trafficCheck()
139 194 pygame.display.flip() pygame.display.flip()
140 195
File simulatie/traffic.py changed (mode: 100644) (index ab50a6d..9d8c434)
... ... import sys
3 3 import connection import connection
4 4
5 5 while True: while True:
6 ui = raw_input()
7 ui = list(ui)
8 print([connection.lights[int(ui[0])], int(ui[1]), None])
9 connection.update(int(ui[0]), int(ui[1]), None)
6 vehicle = raw_input()
7 aantal = raw_input()
8 #ui = list(ui)
9 print([connection.lights[int(vehicle)], int(aantal), None])
10 connection.update(int(vehicle), int(aantal), None)
10 11
11 12 sys.exit() sys.exit()
File simulatie/trafficModel.py changed (mode: 100644) (index e67a96e..d8bd5da)
... ... import json
25 25 lights = [ lights = [
26 26 { {
27 27 "Id": 101, "Id": 101,
28 "Status": 0
28 "Status": 0,
29 29 }, },
30 30 { {
31 31 "Id": 102, "Id": 102,
 
... ... lights = [
149 149 } }
150 150 ] ]
151 151
152 lightsPos = [
153 {
154 "Id": 101,
155 "position": [0, 0],
156 },
157 {
158 "Id": 102,
159 "position": [0, 0]
160 },
161 {
162 "Id": 103,
163 "position": [0, 0]
164 },
165 {
166 "Id": 104,
167 "position": [0, 0]
168 },
169 {
170 "Id": 105,
171 "position": [0, 0]
172 },
173 {
174 "Id": 106,
175 "position": [0, 0]
176 },
177 {
178 "Id": 107,
179 "position": [0, 0]
180 },
181 {
182 "Id": 108,
183 "position": [0, 0]
184 },
185 {
186 "Id": 109,
187 "position": [0, 0]
188 },
189 {
190 "Id": 110,
191 "position": [0, 0]
192 },
193 {
194 "Id": 201,
195 "position": [0, 0]
196 },
197 {
198 "Id": 301,
199 "position": [0, 0]
200 },
201 {
202 "Id": 302,
203 "position": [0, 0]
204 },
205 {
206 "Id": 303,
207 "position": [0, 0]
208 },
209 {
210 "Id": 304,
211 "position": [0, 0]
212 },
213 {
214 "Id": 305,
215 "position": [0, 0]
216 },
217 {
218 "Id": 401,
219 "position": [0, 0]
220 },
221 {
222 "Id": 402,
223 "position": [0, 0]
224 },
225 {
226 "Id": 403,
227 "position": [0, 0]
228 },
229 {
230 "Id": 404,
231 "position": [0, 0]
232 },
233 {
234 "Id": 405,
235 "position": [0, 0]
236 },
237 {
238 "Id": 406,
239 "position": [0, 0]
240 },
241 {
242 "Id": 407,
243 "position": [0, 0]
244 },
245 {
246 "Id": 408,
247 "position": [0, 0]
248 },
249 {
250 "Id": 409,
251 "position": [0, 0]
252 },
253 {
254 "Id": 410,
255 "position": [0, 0]
256 },
257 {
258 "Id": 411,
259 "position": [0, 0]
260 },
261 {
262 "Id": 412,
263 "position": [0, 0]
264 },
265 {
266 "Id": 501,
267 "position": [0, 0]
268 },
269 {
270 "Id": 502,
271 "position": [0, 0]
272 },
273 {
274 "Id": 601,
275 "position": [0, 0]
276 }
277 ]
278
152 279 queues = [ queues = [
153 280 [ # 101 [ # 101
154 281 [300, -50], [300, 140] [300, -50], [300, 140]
 
... ... queues = [
203 330 ], ],
204 331 [ # 402 [ # 402
205 332 [-50, 200], [270, 200] [-50, 200], [270, 200]
333 ],
334 [ # 403
335 [850, 200], [520, 200]
336 ],
337 [ # 404
338 [570, -50],
339 [570, 250]
340 ],
341 [ # 405
342 [570, 850],
343 [570, 570]
344 ],
345 [ # 406
346 [220, 850], [220, 500]
347 ],
348 [ # 407
349 [460, 200]
350 ],
351 [ # 408
352 [470, 200]
353 ],
354 [ # 409
355 [570, 410]
356 ],
357 [ # 410
358 [570, 420]
359 ],
360 [ # 411
361 [220, 325]
362 ],
363 [ # 412
364 [220, 325]
365 ],
366 [ # 501
367 [-50, 650],
368 [100, 650]
206 369 ] ]
207 370 ] ]
208 371
 
... ... waypoints = [
260 423 ], ],
261 424 [ # 402 [ # 402
262 425 [470, 200] [470, 200]
426 ],
427 [ # 403
428 [460, 200]
429 ],
430 [ # 404
431 [570, 420]
432 ],
433 [ # 405
434 [570, 410]
435 ],
436 [ # 406
437 [220, 500], [220, 325]
438 ],
439 [ # 407
440 [-50, 200]
441 ],
442 [ # 408
443 [850, 200]
444 ],
445 [ # 409
446 [570, -50]
447 ],
448 [ # 410
449 [570, 850]
450 ],
451 [ # 411
452 [220, 850]
453 ],
454 [ # 412
455 [220, -50]
456 ],
457 [ # 501
458 [850, 650]
263 459 ] ]
264 460 ] ]
265 461
266 transforms = [
267 { "from": 401, "to": 411},
268 { "from": 402, "to": 408},
269 { "from": 403, "to": 407},
270 { "from": 404, "to": 410},
271 { "from": 405, "to": 409},
272 { "from": 406, "to": 412}
462 transforms = [ # { "from": (trafficType)originalType, "to": (trafficId)newId }
463 { "from": 401, "to": 26},
464 { "from": 402, "to": 23},
465 { "from": 403, "to": 22},
466 { "from": 404, "to": 25},
467 { "from": 405, "to": 24},
468 { "from": 406, "to": 27}
273 469 ] ]
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/kapstok/NHL-SoftDev

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/kapstok/NHL-SoftDev

Clone this repository using git:
git clone git://git.rocketgit.com/user/kapstok/NHL-SoftDev

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main