fogman / nakamoto-station (public) (License: MIT) (since 2020-05-02) (hash sha1)
python pyglet game engine influenced by infiniminer and forked from work by git hub / fogleman et al
List of commits:
Subject Hash Author Date (UTC)
reticle performance, time-based queue handling, terrain generation tweaks d28386fcd85f04a3ce2ec6843b33ad1a4bfe357d Michael Fogleman 2012-01-30 19:07:58
first commit 9ad9b952348ec7fc424ab056fe2c776c69cf9741 Michael Fogleman 2012-01-30 15:31:51
Commit d28386fcd85f04a3ce2ec6843b33ad1a4bfe357d - reticle performance, time-based queue handling, terrain generation tweaks
Author: Michael Fogleman
Author date (UTC): 2012-01-30 19:07
Committer name: Michael Fogleman
Committer date (UTC): 2012-01-30 19:07
Parent(s): 9ad9b952348ec7fc424ab056fe2c776c69cf9741
Signer:
Signing key:
Signing status: N
Tree: 66f97469020f19413968314ade01cc63505dd272
File Lines added Lines deleted
encode.py 1 1
main.py 153 142
File encode.py changed (mode: 100644) (index d58d1b1..96811c5)
... ... EXTENSIONS = [
6 6 ] ]
7 7
8 8 def print_data(data): def print_data(data):
9 size = 64
9 size = 72
10 10 offset = 0 offset = 0
11 11 length = len(data) length = len(data)
12 12 while offset < length: while offset < length:
File main.py changed (mode: 100644) (index a44b01f..7476e29)
1 1 from pyglet.gl import * from pyglet.gl import *
2 2 from pyglet.window import key from pyglet.window import key
3 import StringIO
3 4 import base64 import base64
4 5 import math import math
5 6 import random import random
6 import StringIO
7 import time
7 8
8 9 SECTOR_SIZE = 16 SECTOR_SIZE = 16
9 10
10 def cube_vertices(x, y, z, n): # GL_QUADS
11 def cube_vertices(x, y, z, n):
11 12 return [ return [
12 13 x-n,y+n,z-n, x-n,y+n,z+n, x+n,y+n,z+n, x+n,y+n,z-n, # top x-n,y+n,z-n, x-n,y+n,z+n, x+n,y+n,z+n, x+n,y+n,z-n, # top
13 14 x-n,y-n,z-n, x+n,y-n,z-n, x+n,y-n,z+n, x-n,y-n,z+n, # bottom x-n,y-n,z-n, x+n,y-n,z-n, x+n,y-n,z+n, x-n,y-n,z+n, # bottom
 
... ... BRICK = tex_coords((2, 0), (2, 0), (2, 0))
39 40 STONE = tex_coords((2, 1), (2, 1), (2, 1)) STONE = tex_coords((2, 1), (2, 1), (2, 1))
40 41
41 42 FACES = [ FACES = [
43 ( 0, 1, 0),
44 ( 0,-1, 0),
42 45 (-1, 0, 0), (-1, 0, 0),
43 46 ( 1, 0, 0), ( 1, 0, 0),
44 ( 0,-1, 0),
45 ( 0, 1, 0),
46 ( 0, 0,-1),
47 47 ( 0, 0, 1), ( 0, 0, 1),
48 ( 0, 0,-1),
48 49 ] ]
49 50
50 51 class TextureGroup(pyglet.graphics.Group): class TextureGroup(pyglet.graphics.Group):
 
... ... class Model(object):
79 80 self.queue = [] self.queue = []
80 81 self.initialize() self.initialize()
81 82 def initialize(self): def initialize(self):
82 n = 50
83 n = 80
83 84 s = 1 s = 1
84 85 y = 0 y = 0
85 86 for x in xrange(-n, n + 1, s): for x in xrange(-n, n + 1, s):
 
... ... class Model(object):
90 91 for dy in xrange(-2, 3): for dy in xrange(-2, 3):
91 92 self.init_block((x, y + dy, z), STONE) self.init_block((x, y + dy, z), STONE)
92 93 o = n - 10 o = n - 10
93 for _ in xrange(50):
94 for _ in xrange(120):
94 95 a = random.randint(-o, o) a = random.randint(-o, o)
95 96 b = random.randint(-o, o) b = random.randint(-o, o)
96 97 c = -1 c = -1
97 98 h = random.randint(1, 6) h = random.randint(1, 6)
98 99 s = random.randint(4, 8) s = random.randint(4, 8)
99 d = random.randint(0, 1)
100 d = 1
100 101 t = random.choice([GRASS, SAND, BRICK]) t = random.choice([GRASS, SAND, BRICK])
101 102 for y in xrange(c, c + h): for y in xrange(c, c + h):
102 103 for x in xrange(a - s, a + s + 1): for x in xrange(a - s, a + s + 1):
103 104 for z in xrange(b - s, b + s + 1): for z in xrange(b - s, b + s + 1):
104 if (x - a) ** 2 + (z - b) ** 2 > s ** 2:
105 if (x - a) ** 2 + (z - b) ** 2 > (s + 1) ** 2:
105 106 continue continue
106 107 if (x - 0) ** 2 + (z - 0) ** 2 < 5 ** 2: if (x - 0) ** 2 + (z - 0) ** 2 < 5 ** 2:
107 108 continue continue
 
... ... class Model(object):
168 169 self.enqueue(self._show_block, position, texture) self.enqueue(self._show_block, position, texture)
169 170 def _show_block(self, position, texture): def _show_block(self, position, texture):
170 171 x, y, z = position x, y, z = position
171 self._shown[position] = self.batch.add(24, GL_QUADS, self.group,
172 ('v3f/static', cube_vertices(x, y, z, 0.5)),
173 ('t2f/static', texture))
172 # only show exposed faces
173 index = 0
174 count = 24
175 vertex_data = cube_vertices(x, y, z, 0.5)
176 texture_data = list(texture)
177 for dx, dy, dz in []:#FACES:
178 if (x + dx, y + dy, z + dz) in self.world:
179 count -= 4
180 i = index * 12
181 j = index * 8
182 del vertex_data[i:i + 12]
183 del texture_data[j:j + 8]
184 else:
185 index += 1
186 # create vertex list
187 self._shown[position] = self.batch.add(count, GL_QUADS, self.group,
188 ('v3f/static', vertex_data),
189 ('t2f/static', texture_data))
174 190 def hide_block(self, position, immediate=True): def hide_block(self, position, immediate=True):
175 191 self.shown.pop(position) self.shown.pop(position)
176 192 if immediate: if immediate:
 
... ... class Model(object):
190 206 def change_sectors(self, before, after): def change_sectors(self, before, after):
191 207 before_set = set() before_set = set()
192 208 after_set = set() after_set = set()
193 pad = 3
209 pad = 4
194 210 for dx in xrange(-pad, pad + 1): for dx in xrange(-pad, pad + 1):
195 for dy in xrange(-pad, pad + 1):
211 for dy in [0]: # xrange(-pad, pad + 1):
196 212 for dz in xrange(-pad, pad + 1): for dz in xrange(-pad, pad + 1):
213 if dx ** 2 + dy ** 2 + dz ** 2 > (pad + 1) ** 2:
214 continue
197 215 if before: if before:
198 216 x, y, z = before x, y, z = before
199 217 before_set.add((x + dx, y + dy, z + dz)) before_set.add((x + dx, y + dy, z + dz))
 
... ... class Model(object):
212 230 func, args = self.queue.pop(0) func, args = self.queue.pop(0)
213 231 func(*args) func(*args)
214 232 def process_queue(self): def process_queue(self):
215 for _ in xrange(64):
216 if not self.queue:
217 break
233 start = time.clock()
234 while self.queue and time.clock() - start < 1 / 60.0:
218 235 self.dequeue() self.dequeue()
219 236 def process_entire_queue(self): def process_entire_queue(self):
220 237 while self.queue: while self.queue:
 
... ... class Window(pyglet.window.Window):
229 246 self.position = (0, 0, 0) self.position = (0, 0, 0)
230 247 self.rotation = (0, 0) self.rotation = (0, 0)
231 248 self.sector = None self.sector = None
249 self.reticle = None
232 250 self.dy = 0 self.dy = 0
233 251 self.model = Model() self.model = Model()
234 252 self.label = pyglet.text.Label('', font_name='Arial', font_size=18, self.label = pyglet.text.Label('', font_name='Arial', font_size=18,
 
... ... class Window(pyglet.window.Window):
282 300 self._update(dt / m) self._update(dt / m)
283 301 def _update(self, dt): def _update(self, dt):
284 302 # walking # walking
285 d = dt * 5
303 speed = 15 if self.flying else 5
304 d = dt * speed
286 305 dx, dy, dz = self.get_motion_vector() dx, dy, dz = self.get_motion_vector()
287 306 dx, dy, dz = dx * d, dy * d, dz * d dx, dy, dz = dx * d, dy * d, dz * d
288 307 # gravity # gravity
 
... ... class Window(pyglet.window.Window):
370 389 elif symbol == key.D: elif symbol == key.D:
371 390 self.strafe[1] -= 1 self.strafe[1] -= 1
372 391 def on_resize(self, width, height): def on_resize(self, width, height):
392 # label
373 393 self.label.y = height - 10 self.label.y = height - 10
394 # reticle
395 if self.reticle:
396 self.reticle.delete()
397 x, y = self.width / 2, self.height / 2
398 n = 10
399 self.reticle = pyglet.graphics.vertex_list(4,
400 ('v2i', (x - n, y, x + n, y, x, y - n, x, y + n))
401 )
374 402 def set_2d(self): def set_2d(self):
375 403 width, height = self.get_size() width, height = self.get_size()
376 404 glDisable(GL_DEPTH_TEST) glDisable(GL_DEPTH_TEST)
 
... ... class Window(pyglet.window.Window):
386 414 glViewport(0, 0, width, height) glViewport(0, 0, width, height)
387 415 glMatrixMode(GL_PROJECTION) glMatrixMode(GL_PROJECTION)
388 416 glLoadIdentity() glLoadIdentity()
389 gluPerspective(60.0, width / float(height), 0.1, 50.0)
417 gluPerspective(65.0, width / float(height), 0.1, 60.0)
390 418 glMatrixMode(GL_MODELVIEW) glMatrixMode(GL_MODELVIEW)
391 419 glLoadIdentity() glLoadIdentity()
392 420 x, y = self.rotation x, y = self.rotation
 
... ... class Window(pyglet.window.Window):
410 438 self.label.draw() self.label.draw()
411 439 def draw_reticle(self): def draw_reticle(self):
412 440 glColor3d(0, 0, 0) glColor3d(0, 0, 0)
413 x, y = self.width / 2, self.height / 2
414 n = 10
415 pyglet.graphics.draw(4, pyglet.gl.GL_LINES,
416 ('v2i', (x - n, y, x + n, y, x, y - n, x, y + n))
417 )
441 self.reticle.draw(GL_LINES)
418 442
419 443 def setup_fog(): def setup_fog():
420 444 glEnable(GL_FOG) glEnable(GL_FOG)
 
... ... def setup_fog():
423 447 glFogi(GL_FOG_MODE, GL_LINEAR) glFogi(GL_FOG_MODE, GL_LINEAR)
424 448 glFogf(GL_FOG_DENSITY, 0.35) glFogf(GL_FOG_DENSITY, 0.35)
425 449 glFogf(GL_FOG_START, 20.0) glFogf(GL_FOG_START, 20.0)
426 glFogf(GL_FOG_END, 50.0)
450 glFogf(GL_FOG_END, 60.0)
427 451
428 452 def setup(): def setup():
429 453 glClearColor(0.53, 0.81, 0.98, 1) glClearColor(0.53, 0.81, 0.98, 1)
 
... ... def main():
439 463 pyglet.app.run() pyglet.app.run()
440 464
441 465 TEXTURE_DATA = ( TEXTURE_DATA = (
442 "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAABGdBTUEAALGPC/xh"
443 "BQAAAAlwSFlzAAALEAAACxABrSO9dQAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVU"
444 "IHYzLjUuMTAw9HKhAAAVbUlEQVR4Xu1d+ZNWxRWdvyK/WeWuQREUERAwIIpYiAgq"
445 "UdyQuEVFRS1CjEFBg0JcWCOLI4LsCAqOgKAixkQQkGF12BF3KzFlyspemWj6eThf"
446 "zXfxPr75huG759X5YepNf/1ed9/z7unu291V9bpUA4FroCpw2VV01UC9CCAjCF0D"
447 "IkDo5lfhRQDZQOgaEAFCN78KLwLIBkLXgAgQuvlVeBFANhC6BkSA0M2vwosAsoHQ"
448 "NSAChG5+FV4EkA2ErgERIHTzq/AigGwgdA2IAKGbX4UXAWQDoWtABAjd/Cq8CCAb"
449 "CF0DIkDo5lfhRQDZQOgaEAFCN78KLwLIBkLXgAgQuvlVeBFANhC6BkSA0M2vwosA"
450 "soHQNSAChG5+FV4EkA2ErgERIHTzq/AigGwgdA2IAKGbX4UXAWQDoWtABAjd/Cq8"
451 "CCAbCF0DIkDo5lfhRQDZQOgaEAFCN78KLwLIBkLXgAgQuvlVeBFANhC6BkSA0M2v"
452 "wosAsoHQNSAChG5+FV4EkA2ErgERIHTzq/AigGwgdA2IAKGbX4UXAWQDoWtABAjd"
453 "/Cq8CCAbCF0DIkDo5lfhRQDZQOgaEAFCN78KLwLIBkLXgAgQuvlVeBFANhC6BkSA"
454 "0M2vwosAsoHQNSAChG5+FV4EkA2ErgERIHTzq/AigGwgdA2IAKGbX4UXAWQDoWtA"
455 "BAjd/Cq8CCAbCF0DIkDo5lfhRQDZQOgaEAFCN78KLwLIBkLXgAgQuvlVeBFANhC6"
456 "BkSA0M2vwosAsoHQNSAChG5+FV4EkA2ErgERIHTzq/AigGwgdA2IAKGbX4UXAWQD"
457 "oWtABAjd/Cq8CCAbCF0DIkDo5lfhRQDZQOgaEAFCN78KLwLIBkLXgAgQuvlVeBFA"
458 "NhC6BkSA0M2vwosAsoHQNSAChG5+FV4EkA2ErgERIHTzq/AigGwgdA2IAKGbX4UX"
459 "AWQDoWtABAjd/Cq8CCAbCF0DIkDo5lfhRQDZQOgaEAFCN78KLwLIBkLXgAgQuvlV"
460 "eBFANhC6BkSA0M2vwosAsoHQNSAChG5+FV4EkA2ErgERIHTzq/AigGwgdA2IAKGb"
461 "X4UXAWQDoWtABAjd/Cq8CCAbCF0DIkDo5lfhRQDZQOgaEAFCN78KLwLIBkLXgAgQ"
462 "uvlVeBFANhC6BkSA0M2vwosAsoHQNSAChG5+FV4EkA2ErgERIHTzq/AigGwgdA2I"
463 "AKGbX4Wvmn5fb+DX/TsXxYALWhVFKb/t1uo4wJM/p+HnTplwLbDng+eB3dufA3Zu"
464 "fRbYXvsMwPc3r58A1G2eAhzYPQvg/OtqpwLbaycBtWvGAlvWTwTee+dJYMfmqcAa"
465 "uv6Q8+LfbjCu1XRxklKeO5euo51CIkDGDRHAzz4RIHMI8gDJCcgDHL1+QB5AHmCN"
466 "/9ufUlaUB2BtzR0Aj0bn9PfTZf3W8hhWH8B6H85/7wfTAdbu+7fNBz7btRhYVfM4"
467 "wLKn9r1xAGv3t1aMAD7d+RJQX78P4P4G/5bfh73EFx8tAFiLs2G93EjXC3R5sqym"
468 "i9+H/36YrqP325/evEoESDQQARI9RIBsIEgeIH3L5QEa+gF5gKwTLAmUVJAk0NEr"
469 "hAo6wZYWZ2/AOt5Kb43Ze9LzszzPPbB9PvDVgaXAP796G9j+/iSgrnYywLp817bq"
470 "omDj5jkB7g98vnsx8Me3RgEb14wBuL/xjz+tBrgPwPKDtTv/7Ulj6X6+b+l7qx/C"
471 "9x+j6+g1/awP4DFojyHmnczykM3zXBHAokq6zx1fEaAhXeUBsklceYCGPoHJIw+Q"
472 "RS54PIYkUFJBkkDNXyBVcUf2arosQ/fMFeSdIeY8LfJYada/+zRQqPUPxupwDE/t"
473 "2vHAvh3TgU3vjQc2rh0LsHbfvvEZgON5uG/A8UU8D8D3Vy0fDnAfwPriWnrdGrL0"
474 "5HNo4XTo/1ZUH0AESBwQAfyUEAF+YK5AHiB97+UBJIF6e0KsJYGSEPJIF5ZDkkCl"
475 "E6ygD2CFRfAXnYcmLcPNG17BfY+8v/147xyANTqPzVv3Oc0nOxYBfJ/H+ze8Owbg"
476 "vgGn+WDdNODt1x8FuL+x9u3fAlYfwBq+9AsV//CoJ0aI0wylq3QTPLI5iADZHJYI"
477 "4KeBCJANicoDJD8gD3Bkv+KlPF0eQB7A/+nPUlaUB2DNbel760vvidf3RJV60ljz"
478 "AzwPsK/ueWDjmnFAff3XAMfrf/HRiwCvK9izaQ7A8UJff1kDcIzQO2+OBPi5PLTK"
479 "8wDcN+DFKHlDFTz9AU+nmdN4YpAqahhUBEgcEAESDUSAIvpeHiD5AXmANPAqD1Bk"
480 "PYAVxuyRN540kkANAyIkgUrp/hYJh/YYIq/99YRAWzFFfN8Td2TND7y+dBiwb8s8"
481 "YN2qCQBHeq5aPgL4cNcLAO/zUxD/Q2sJuD/AcwX1f18P7N42DeDRoYI9hTbMqPse"
482 "vFdP3okwz3pfT9x/3rXIFdUJtia5LOMWARINRIBEg9K/wUc2h4L1APIAyQ/IAxx6"
483 "ZFQeIHMDkkDJD0gCHdmveClPN1eEWRrdE9zmiecpJR/+beG+nwf36Px05yKAozK5"
484 "P8Dj9J/snQv8+5s3gIK1BO9Mrv0e3B/guQWO+eG9iazYIWulFY+08C4MpfzNX+68"
485 "+fD7VNQoUN5OaimGm3eizSKSCJDXfFN6ESDHmmB5gOQE5AESeeQBsl3U5QGSCpIE"
486 "SpQoRX83h9+awXCW/PDct0aT8pLHCtPg+/t3zAB4HuDPHy4FeDx+/9Z5AGt3Htbk"
487 "fP762Uqg/r+bgdUrHgF47J/XJe/aOBPgPgD3Q0rZ45/jiDgf62/rDIG893mMqDkY"
488 "cSnvIAJkZ1iIAH4aiABFQiE8X2t5gOQH5AFK+WY37m/lAeQB/J/+LGXFegDPnj/W"
489 "l94zi+zZGzRvjNDqlY8CL8+7F/i4biHAe/jwnMCezbMB7iewXud5Btb6/PdXny8G"
490 "OD33N3jNAK9DYL3uCW7zpGmsNQBWrFFFzQNYssRj0FYEqMfQS5lF5ncWARpSQgTw"
491 "y6QCCSQPkPyAPEBDUrHskQfIOsHyAEkISQL5v7jNLaXpAawFKJ7QCcuT5NX31gEc"
492 "/G776mYA+7fOBea9cCfAW57w/v08V/DBpskAj99//emKg/hyydff49P98wDed8iK"
493 "TbLOJ/acEWbpfitm03OegGclvLWWIIQHEAESDUSAhjQQAbKwCM9OztYhF55VYPIA"
494 "6TstD1A+4SQJlEVMSAI1FEXhJJA1NGkNlXq+4rzvp2cm2LP3KKfh/TpZ63+ybzaw"
495 "9o2xAEd3ctwOj+vzOWKcviDN5imYUqj/19sAjyDx37z2YOUrw4DVdHnW7+bdO8jS"
496 "+p5nWb+tqBVhebc35PQiQOKACFA+iVLunHOHQogAyQ/wjLIIUG4zLV/+IkB2gqok"
497 "0KEPyavY7dE9WyN6libmPTwvb7iENYfAZwOzXudY/798tgTgNbub100EDuycCby5"
498 "7CHg3VWjgEKSHDyDjPU9x/9wn6R2zViA+x7liAXy7BfkiSmy0lTUMKgIkDggAvgp"
499 "IQJkZ4R5+gN5v/R5g+TkAQ7vJBi/uTdMKQKIANN4K0VJoPJ1Usudc5VnjS+nubb7"
500 "OYCnb2BJLM+WjJ7TJuv/swngmH4+N+CVhUMANlYep+c+wzefvwHw3j5/++JNgJ/F"
501 "8Ugf7ZkJ8MJ5Tr9t7XOAdUaYpeOtg/E8e/x7YoSs+QHuBI+jq9wGWu78RYDv1ih+"
502 "CxEg0UMEyOSNpcXlAZITkAdIbqDcX+hy5y8PIA9Q7QmvqFgJZIVCWFGcnt0fPMsp"
503 "Pfl4+hgHts8HsOn+t3/wWPvGtWOBvVvmANvWVgN85hefG1CzaAjAWn9lzTDA0vrr"
504 "Vo0H+B24X2GtB8ir6a1RHY+ksc4lCDEPIAIkDogAiQYe4lXUMKgIIALIAxTp+EoC"
505 "JSEkCVThE2GWB/CMwbNG56OTrLj/UkKvrT4Da/2P9swGWJfz1in19ZsAPlfYWivM"
506 "a3x5eSTPJ/AQasHeoNuqsQkcvw8/i83Ls+k5x+LzeDz/be3kbN33PLdid4cWARIN"
507 "RIBD00AEKBL+IA+Q/IA8QLlH68uXv7keQBIobZoiCVThB2QMru4A3P98J4Dv3/RU"
508 "q6IYNKktcP1jLYDbJ7QBHpzXDeD8bxvfBrh5TCvglnGtgQGjWgC9hx4D3PG7tsDP"
509 "5p0L3LygEzBwbgfgyslnFMV1M9oCvceeClzzfBtgUE03gPO/uvpMoN+UVsBVz7YG"
510 "+oxvAXQdfgxw7fSzgepe7YDxPdoAfP99uvj+tEvbA2MvagPM6XsuwOkX9esMPNX9"
511 "LGALXZx+3uUdAb7Pf5fv29w0OVeJAIkDIkBigQiQOQF5gOQE5AGSE5AHKKKCJIGS"
512 "CpIEahq5Uo6nVN03rRPA2n34zB7A0MldgV892xU4/4xjgZvHtAYGjj4d4L7BE4su"
513 "A0bN7wWwt2Hdz+/D/QS+f9P8jgBr918u6gHcPbMLcO/s84HLxv0Y+OnU1kDfCacB"
514 "LI1GLO8DPPTqpQD3N1j38/swSfo/dxbwQKfTimLk+a2A/XQt7d8F4B/e2fZk4KYz"
515 "TwA4zf0dTgUe7XoGYPUBhp13OsD5PNj5NKAcRtmUeYoAGQdEgIZ9ABEgcwLyAMkP"
516 "yAMkPyAPkKkgSaCkgiSBmlK0NO6zqkbO7gmwQU9c1h9gTc/j9Jx+0KR2AN9nfc9z"
517 "AqMX9gbGLLkC4N/2e+gEgPsSnObBJT2BCesGAE/8/mrg8mdOB3icnmXPDTPPKQqe"
518 "Z7jr1QuA4csuAx574wqAtf5Fjx8PcH9jzJrrANbWT1x4JvDzs08C8mr0we1OAaw+"
519 "Bt/n/Ed0aQnw3AKn5zmExjXHps9NBMj6viJAooEIkA3syAMkSsgDJD8gD5CNbEoC"
520 "JRUkCZSEUNOLlsZ9YhXr6avo4vv8911T2gFWGr5vaXeO5+H013VrCVj5c5qLHjsO"
521 "uHJSS4BjdW55sRMwYFY74LZF5wG9nj4F6PnkSQDPA1w+8XSA43k4f44v4vF+vs/P"
522 "WkHXcrqW0LWdrhrHtZguTv4aXXx/D11W9rxqbBVdjWuOTZ+bCJBxQARILBABMi8g"
523 "D5CcgDxAooQ8QNY5lgRKKkgSKOmgphctjfvEqgeu7giwtub71YN7AewZrN96dLzV"
524 "97DeweonDH6tO8Aancfm+f7I1y8HHn/zSmDA+DYAp5m44Uag+8hjAR7Xf3hpb+A3"
525 "K/sCl445BeA5BybP6AtaA1bEpXXfWj/A4/oc089/T+/dHsj73E10Na45Nn1uIkDG"
526 "ARHATwMRIJND8gDJD8gDNP2Xu7GeKA8gD9De/+1PKSvKA1h6nb/unn6CZ06An2U9"
527 "10rD97lPwmP5ty7sDPQYdQLAsfscr89rfHldwf1zLwA4tofTsKbnPgY/l9PwPADP"
528 "LrPx8Wzr1EvOAfj+rWedCPD9oR1bAFbsEKe34oXuaHsSYMUR8bxEY32Jj1Q+VSJA"
529 "ooEIkMxdBCii7+UBkh+QB0gkkQfIohWYGJJASQhJAh0pMXN4z62yxvgtLX7PvfcA"
530 "VhrOk/+2dLyVxuN5eKydtfuwml4AhzrfOLs9wNqdY4cKZn9pLQH3B55+91qA5w04"
531 "1ohHhzhe6NapHQDuA9zQ6jjg8W6tAF7vy7p8YOvjAb6/m675V3QEOB9eE8xrhT3r"
532 "BzbTdXhm13x+JQJk8W0iQKKBCJD1AeQBkh/g1WTyAIke8gCZCpIESipIEqj5SJq8"
533 "b1IggTwa3TM/4InnKSWfgr4B7e/JX+ghCy4EOC6f+wOXPHUycN/KHgB/9Vm7W2t/"
534 "eW6Bx/t5byJrfyFHeH8Nrw14hS4rvt+zfoCjOz3vwGkqahQobye1FMO1Auk8IRXm"
535 "c0WA//PAMlBPfL8IkAV7ygMkJyAPcGhKyAMcjKAuGkotCZSEkCRQXkXe9OnNYDjL"
536 "iD33rdj9vPLJEy/E+pvnAXjvnUdW9AG4w8q/ZX3P+Tz5Tn+A8+H9Q3lugdcl3zGt"
537 "E8DzFfy3Jy6fY3sm92wL8BzCrD7nAsv6dwHy5m8FxnGeFbUzXF79LQIkGogAiQZN"
538 "/81u3CfKA2SHuMgDNNwcl72BPECm++UB5AEqVgJZwW2eOH5L93vi+z2jTxbxeJye"
539 "ZcnYtdcDvAaX9+wfPKsrwPqe1/vy3ALH+bDuH7q6F8DzANx/4Pvc9/CEHmyka+LF"
540 "ZwOe3/I5A7z+mNcPbKCLv/ocj2Q9q3EFSdPnViCBRIBEAxEg0UAE+IG4IM/ObfIA"
541 "yQ/IAzT9193zRHmATAVJAiUdJAlUpLObN77fklKefKy5Amsdwu2LuwC/eLE7wH0D"
542 "XhvA/QSeK+AvNI/fT916K3Dx6BOBIat6AryugPPhNcF8UDGnYV3OOpvlx166rDXE"
543 "17Q8FuB8+JwB3vqc0/Aidyt/7kvwbz1f2eacxvQAeTumbNwiQDJxEaA5m356NxEg"
544 "O6xFHiD5AXkASaC2kkCJBix1Qkgga8TG0uWetbx85oAnFsiz9yin4chNns1lzc3n"
545 "iHHfgH/L4/p8jhin5zQ8n2CdJ8BrAHj7dV5+acVdvkiXJ74/b0gzrzGoo4vXG/DZ"
546 "BdaZA81f5Bz6DXOHQlib5loTVSJAooEI0DypIgJkB0jKAyQ3IA9w8IQifNQlgZIQ"
547 "kgRKQojlVvP8rvvfyrU1oiVvPHIo70xw3oX2vH8/63WOt2HNzXuJcmwPx/HzeH/7"
548 "IT8COD3nyfJm6MKLAJ5/4Dz5WdMubQ9w7P6ifp0Bz+a1fFbAero4dogjOq08rfUG"
549 "/J4f0uU3teaZUgTIzswTARIlRIAf2Ps/rxySB0h+QB5AHqBI78JPDyuMQhIofbkl"
550 "gQ6PYAUSyLM8spT1vvxbz56kVngFvyfH/fPh1Xx+MJ/txXqdw565zzCt7nbggZcu"
551 "BmbsGgTwszge6e5lFwIcCsHp+Wwya+aV4/U9cf98bgD3ATj/vHnywpeHf9IS4DXK"
552 "h2d2zedXIsB3Zxx9CxGgIc1EgCKiRR4gOQF5gOQHms+3/PDeRB5AHuC7/W6LIoQH"
553 "sHS/pdc9e/XkXR/sSW+NPnGcD+t1jufhWB1ep8tn+vK5XQPndgB4Dx8+IYb/5nXD"
554 "I5b3Aaz9SXnDLNbofU89BrCCzzz9ga10WX0MKx9rzUDF9gFEgEQDESBRQgTIdL88"
555 "QHIC8gCJGPIARTbQtaSLR9J4pJQnBEMSqKGYkQTyd4jNaFDPGDwbKK/ZtfS6Z54h"
556 "75oBDmHgc395DL7r8GMAPgeAzxVmCTT+vRsAXik2ZcstAJ8twEOovMaAzyLg9xlU"
557 "0w3gwDKOxFxA1zK6OL11n9cPWGcIWOcDWOn5ue/T5Te15plSBMjO1hYBkomLAFkf"
558 "QB4gOQF5gIZrzeQBiqwblgRKQkgSqHlKHeut/ge3zJk2qVNS4wAAAABJRU5ErkJg"
466 "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAABGdBTUEAALGPC/xhBQAAAAlw"
467 "SFlzAAALEAAACxABrSO9dQAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKh"
468 "AAAVbUlEQVR4Xu1d+ZNWxRWdvyK/WeWuQREUERAwIIpYiAgqUdyQuEVFRS1CjEFBg0JcWCOL"
469 "I4LsCAqOgKAixkQQkGF12BF3KzFlyspemWj6eThfzXfxPr75huG759X5YepNf/1ed9/z7unu"
470 "291V9bpUA4FroCpw2VV01UC9CCAjCF0DIkDo5lfhRQDZQOgaEAFCN78KLwLIBkLXgAgQuvlV"
471 "eBFANhC6BkSA0M2vwosAsoHQNSAChG5+FV4EkA2ErgERIHTzq/AigGwgdA2IAKGbX4UXAWQD"
472 "oWtABAjd/Cq8CCAbCF0DIkDo5lfhRQDZQOgaEAFCN78KLwLIBkLXgAgQuvlVeBFANhC6BkSA"
473 "0M2vwosAsoHQNSAChG5+FV4EkA2ErgERIHTzq/AigGwgdA2IAKGbX4UXAWQDoWtABAjd/Cq8"
474 "CCAbCF0DIkDo5lfhRQDZQOgaEAFCN78KLwLIBkLXgAgQuvlVeBFANhC6BkSA0M2vwosAsoHQ"
475 "NSAChG5+FV4EkA2ErgERIHTzq/AigGwgdA2IAKGbX4UXAWQDoWtABAjd/Cq8CCAbCF0DIkDo"
476 "5lfhRQDZQOgaEAFCN78KLwLIBkLXgAgQuvlVeBFANhC6BkSA0M2vwosAsoHQNSAChG5+FV4E"
477 "kA2ErgERIHTzq/AigGwgdA2IAKGbX4UXAWQDoWtABAjd/Cq8CCAbCF0DIkDo5lfhRQDZQOga"
478 "EAFCN78KLwLIBkLXgAgQuvlVeBFANhC6BkSA0M2vwosAsoHQNSAChG5+FV4EkA2ErgERIHTz"
479 "q/AigGwgdA2IAKGbX4UXAWQDoWtABAjd/Cq8CCAbCF0DIkDo5lfhRQDZQOgaEAFCN78KLwLI"
480 "BkLXgAgQuvlVeBFANhC6BkSA0M2vwosAsoHQNSAChG5+FV4EkA2ErgERIHTzq/AigGwgdA2I"
481 "AKGbX4UXAWQDoWtABAjd/Cq8CCAbCF0DIkDo5lfhRQDZQOgaEAFCN78KLwLIBkLXgAgQuvlV"
482 "eBFANhC6BkSA0M2vwosAsoHQNSAChG5+FV4EkA2ErgERIHTzq/AigGwgdA2IAKGbX4UXAWQD"
483 "oWtABAjd/Cq8CCAbCF0DIkDo5lfhRQDZQOgaEAFCN78KLwLIBkLXgAgQuvlVeBFANhC6BkSA"
484 "0M2vwosAsoHQNSAChG5+FV4EkA2ErgERIHTzq/AigGwgdA2IAKGbX4Wvmn5fb+DX/TsXxYAL"
485 "WhVFKb/t1uo4wJM/p+HnTplwLbDng+eB3dufA3ZufRbYXvsMwPc3r58A1G2eAhzYPQvg/Otq"
486 "pwLbaycBtWvGAlvWTwTee+dJYMfmqcAauv6Q8+LfbjCu1XRxklKeO5euo51CIkDGDRHAzz4R"
487 "IHMI8gDJCcgDHL1+QB5AHmCN/9ufUlaUB2BtzR0Aj0bn9PfTZf3W8hhWH8B6H85/7wfTAdbu"
488 "+7fNBz7btRhYVfM4wLKn9r1xAGv3t1aMAD7d+RJQX78P4P4G/5bfh73EFx8tAFiLs2G93EjX"
489 "C3R5sqymi9+H/36YrqP325/evEoESDQQARI9RIBsIEgeIH3L5QEa+gF5gKwTLAmUVJAk0NEr"
490 "hAo6wZYWZ2/AOt5Kb43Ze9LzszzPPbB9PvDVgaXAP796G9j+/iSgrnYywLp817bqomDj5jkB"
491 "7g98vnsx8Me3RgEb14wBuL/xjz+tBrgPwPKDtTv/7Ulj6X6+b+l7qx/C9x+j6+g1/awP4DFo"
492 "jyHmnczykM3zXBHAokq6zx1fEaAhXeUBsklceYCGPoHJIw+QRS54PIYkUFJBkkDNXyBVcUf2"
493 "arosQ/fMFeSdIeY8LfJYada/+zRQqPUPxupwDE/t2vHAvh3TgU3vjQc2rh0LsHbfvvEZgON5"
494 "uG/A8UU8D8D3Vy0fDnAfwPriWnrdGrL05HNo4XTo/1ZUH0AESBwQAfyUEAF+YK5AHiB97+UB"
495 "JIF6e0KsJYGSEPJIF5ZDkkClE6ygD2CFRfAXnYcmLcPNG17BfY+8v/147xyANTqPzVv3Oc0n"
496 "OxYBfJ/H+ze8OwbgvgGn+WDdNODt1x8FuL+x9u3fAlYfwBq+9AsV//CoJ0aI0wylq3QTPLI5"
497 "iADZHJYI4KeBCJANicoDJD8gD3Bkv+KlPF0eQB7A/+nPUlaUB2DNbel760vvidf3RJV60ljz"
498 "AzwPsK/ueWDjmnFAff3XAMfrf/HRiwCvK9izaQ7A8UJff1kDcIzQO2+OBPi5PLTK8wDcN+DF"
499 "KHlDFTz9AU+nmdN4YpAqahhUBEgcEAESDUSAIvpeHiD5AXmANPAqD1BkPYAVxuyRN540kkAN"
500 "AyIkgUrp/hYJh/YYIq/99YRAWzFFfN8Td2TND7y+dBiwb8s8YN2qCQBHeq5aPgL4cNcLAO/z"
501 "UxD/Q2sJuD/AcwX1f18P7N42DeDRoYI9hTbMqPsevFdP3okwz3pfT9x/3rXIFdUJtia5LOMW"
502 "ARINRIBEg9K/wUc2h4L1APIAyQ/IAxx6ZFQeIHMDkkDJD0gCHdmveClPN1eEWRrdE9zmiecp"
503 "JR/+beG+nwf36Px05yKAozK5P8Dj9J/snQv8+5s3gIK1BO9Mrv0e3B/guQWO+eG9iazYIWul"
504 "FY+08C4MpfzNX+68+fD7VNQoUN5OaimGm3eizSKSCJDXfFN6ESDHmmB5gOQE5AESeeQBsl3U"
505 "5QGSCpIESpQoRX83h9+awXCW/PDct0aT8pLHCtPg+/t3zAB4HuDPHy4FeDx+/9Z5AGt3Htbk"
506 "fP762Uqg/r+bgdUrHgF47J/XJe/aOBPgPgD3Q0rZ45/jiDgf62/rDIG893mMqDkYcSnvIAJk"
507 "Z1iIAH4aiABFQiE8X2t5gOQH5AFK+WY37m/lAeQB/J/+LGXFegDPnj/Wl94zi+zZGzRvjNDq"
508 "lY8CL8+7F/i4biHAe/jwnMCezbMB7iewXud5Btb6/PdXny8GOD33N3jNAK9DYL3uCW7zpGms"
509 "NQBWrFFFzQNYssRj0FYEqMfQS5lF5ncWARpSQgTwy6QCCSQPkPyAPEBDUrHskQfIOsHyAEkI"
510 "SQL5v7jNLaXpAawFKJ7QCcuT5NX31gEc/G776mYA+7fOBea9cCfAW57w/v08V/DBpskAj99/"
511 "/emKg/hyydff49P98wDed8iKTbLOJ/acEWbpfitm03OegGclvLWWIIQHEAESDUSAhjQQAbKw"
512 "CM9OztYhF55VYPIA6TstD1A+4SQJlEVMSAI1FEXhJJA1NGkNlXq+4rzvp2cm2LP3KKfh/TpZ"
513 "63+ybzaw9o2xAEd3ctwOj+vzOWKcviDN5imYUqj/19sAjyDx37z2YOUrw4DVdHnW7+bdO8jS"
514 "+p5nWb+tqBVhebc35PQiQOKACFA+iVLunHOHQogAyQ/wjLIIUG4zLV/+IkB2gqok0KEPyavY"
515 "7dE9WyN6libmPTwvb7iENYfAZwOzXudY/798tgTgNbub100EDuycCby57CHg3VWjgEKSHDyD"
516 "jPU9x/9wn6R2zViA+x7liAXy7BfkiSmy0lTUMKgIkDggAvgpIQJkZ4R5+gN5v/R5g+TkAQ7v"
517 "JBi/uTdMKQKIANN4K0VJoPJ1Usudc5VnjS+nubb7OYCnb2BJLM+WjJ7TJuv/swngmH4+N+CV"
518 "hUMANlYep+c+wzefvwHw3j5/++JNgJ/F8Ugf7ZkJ8MJ5Tr9t7XOAdUaYpeOtg/E8e/x7YoSs"
519 "+QHuBI+jq9wGWu78RYDv1ih+CxEg0UMEyOSNpcXlAZITkAdIbqDcX+hy5y8PIA9Q7QmvqFgJ"
520 "ZIVCWFGcnt0fPMspPfl4+hgHts8HsOn+t3/wWPvGtWOBvVvmANvWVgN85hefG1CzaAjAWn9l"
521 "zTDA0vrrVo0H+B24X2GtB8ir6a1RHY+ksc4lCDEPIAIkDogAiQYe4lXUMKgIIALIAxTp+EoC"
522 "JSEkCVThE2GWB/CMwbNG56OTrLj/UkKvrT4Da/2P9swGWJfz1in19ZsAPlfYWivMa3x5eSTP"
523 "J/AQasHeoNuqsQkcvw8/i83Ls+k5x+LzeDz/be3kbN33PLdid4cWARINRIBD00AEKBL+IA+Q"
524 "/IA8QLlH68uXv7keQBIobZoiCVThB2QMru4A3P98J4Dv3/RUq6IYNKktcP1jLYDbJ7QBHpzX"
525 "DeD8bxvfBrh5TCvglnGtgQGjWgC9hx4D3PG7tsDP5p0L3LygEzBwbgfgyslnFMV1M9oCvcee"
526 "ClzzfBtgUE03gPO/uvpMoN+UVsBVz7YG+oxvAXQdfgxw7fSzgepe7YDxPdoAfP99uvj+tEvb"
527 "A2MvagPM6XsuwOkX9esMPNX9LGALXZx+3uUdAb7Pf5fv29w0OVeJAIkDIkBigQiQOQF5gOQE"
528 "5AGSE5AHKKKCJIGSCpIEahq5Uo6nVN03rRPA2n34zB7A0MldgV892xU4/4xjgZvHtAYGjj4d"
529 "4L7BE4suA0bN7wWwt2Hdz+/D/QS+f9P8jgBr918u6gHcPbMLcO/s84HLxv0Y+OnU1kDfCacB"
530 "LI1GLO8DPPTqpQD3N1j38/swSfo/dxbwQKfTimLk+a2A/XQt7d8F4B/e2fZk4KYzTwA4zf0d"
531 "TgUe7XoGYPUBhp13OsD5PNj5NKAcRtmUeYoAGQdEgIZ9ABEgcwLyAMkPyAMkPyAPkKkgSaCk"
532 "giSBmlK0NO6zqkbO7gmwQU9c1h9gTc/j9Jx+0KR2AN9nfc9zAqMX9gbGLLkC4N/2e+gEgPsS"
533 "nObBJT2BCesGAE/8/mrg8mdOB3icnmXPDTPPKQqeZ7jr1QuA4csuAx574wqAtf5Fjx8PcH9j"
534 "zJrrANbWT1x4JvDzs08C8mr0we1OAaw+Bt/n/Ed0aQnw3AKn5zmExjXHps9NBMj6viJAooEI"
535 "kA3syAMkSsgDJD8gD5CNbEoCJRUkCZSEUNOLlsZ9YhXr6avo4vv8911T2gFWGr5vaXeO5+H0"
536 "13VrCVj5c5qLHjsOuHJSS4BjdW55sRMwYFY74LZF5wG9nj4F6PnkSQDPA1w+8XSA43k4f44v"
537 "4vF+vs/PWkHXcrqW0LWdrhrHtZguTv4aXXx/D11W9rxqbBVdjWuOTZ+bCJBxQARILBABMi8g"
538 "D5CcgDxAooQ8QNY5lgRKKkgSKOmgphctjfvEqgeu7giwtub71YN7AewZrN96dLzV97Deweon"
539 "DH6tO8Aancfm+f7I1y8HHn/zSmDA+DYAp5m44Uag+8hjAR7Xf3hpb+A3K/sCl445BeA5BybP"
540 "6AtaA1bEpXXfWj/A4/oc089/T+/dHsj73E10Na45Nn1uIkDGARHATwMRIJND8gDJD8gDNP2X"
541 "u7GeKA8gD9De/+1PKSvKA1h6nb/unn6CZ06An2U910rD97lPwmP5ty7sDPQYdQLAsfscr89r"
542 "fHldwf1zLwA4tofTsKbnPgY/l9PwPADPLrPx8Wzr1EvOAfj+rWedCPD9oR1bAFbsEKe34oXu"
543 "aHsSYMUR8bxEY32Jj1Q+VSJAooEIkMxdBCii7+UBkh+QB0gkkQfIohWYGJJASQhJAh0pMXN4"
544 "z62yxvgtLX7PvfcAVhrOk/+2dLyVxuN5eKydtfuwml4AhzrfOLs9wNqdY4cKZn9pLQH3B55+"
545 "91qA5w041ohHhzhe6NapHQDuA9zQ6jjg8W6tAF7vy7p8YOvjAb6/m675V3QEOB9eE8xrhT3r"
546 "BzbTdXhm13x+JQJk8W0iQKKBCJD1AeQBkh/g1WTyAIke8gCZCpIESipIEqj5SJq8b1IggTwa"
547 "3TM/4InnKSWfgr4B7e/JX+ghCy4EOC6f+wOXPHUycN/KHgB/9Vm7W2t/eW6Bx/t5byJrfyFH"
548 "eH8Nrw14hS4rvt+zfoCjOz3vwGkqahQobye1FMO1Auk8IRXmc0WA//PAMlBPfL8IkAV7ygMk"
549 "JyAPcGhKyAMcjKAuGkotCZSEkCRQXkXe9OnNYDjLiD33rdj9vPLJEy/E+pvnAXjvnUdW9AG4"
550 "w8q/ZX3P+Tz5Tn+A8+H9Q3lugdcl3zGtE8DzFfy3Jy6fY3sm92wL8BzCrD7nAsv6dwHy5m8F"
551 "xnGeFbUzXF79LQIkGogAiQZN/81u3CfKA2SHuMgDNNwcl72BPECm++UB5AEqVgJZwW2eOH5L"
552 "93vi+z2jTxbxeJyeZcnYtdcDvAaX9+wfPKsrwPqe1/vy3ALH+bDuH7q6F8DzANx/4Pvc9/CE"
553 "Hmyka+LFZwOe3/I5A7z+mNcPbKCLv/ocj2Q9q3EFSdPnViCBRIBEAxEg0UAE+IG4IM/ObfIA"
554 "yQ/IAzT9193zRHmATAVJAiUdJAlUpLObN77fklKefKy5Amsdwu2LuwC/eLE7wH0DXhvA/QSe"
555 "K+AvNI/fT916K3Dx6BOBIat6AryugPPhNcF8UDGnYV3OOpvlx166rDXE17Q8FuB8+JwB3vqc"
556 "0/Aidyt/7kvwbz1f2eacxvQAeTumbNwiQDJxEaA5m356NxEgO6xFHiD5AXkASaC2kkCJBix1"
557 "Qkgga8TG0uWetbx85oAnFsiz9yin4chNns1lzc3niHHfgH/L4/p8jhin5zQ8n2CdJ8BrAHj7"
558 "dV5+acVdvkiXJ74/b0gzrzGoo4vXG/DZBdaZA81f5Bz6DXOHQlib5loTVSJAooEI0DypIgJk"
559 "B0jKAyQ3IA9w8IQifNQlgZIQkgRKQojlVvP8rvvfyrU1oiVvPHIo70xw3oX2vH8/63WOt2HN"
560 "zXuJcmwPx/HzeH/7IT8COD3nyfJm6MKLAJ5/4Dz5WdMubQ9w7P6ifp0Bz+a1fFbAero4dogj"
561 "Oq08rfUG/J4f0uU3teaZUgTIzswTARIlRIAf2Ps/rxySB0h+QB5AHqBI78JPDyuMQhIofbkl"
562 "gQ6PYAUSyLM8spT1vvxbz56kVngFvyfH/fPh1Xx+MJ/txXqdw565zzCt7nbggZcuBmbsGgTw"
563 "szge6e5lFwIcCsHp+Wwya+aV4/U9cf98bgD3ATj/vHnywpeHf9IS4DXKh2d2zedXIsB3Zxx9"
564 "CxGgIc1EgCKiRR4gOQF5gOQHms+3/PDeRB5AHuC7/W6LIoQHsHS/pdc9e/XkXR/sSW+NPnGc"
565 "D+t1jufhWB1ep8tn+vK5XQPndgB4Dx8+IYb/5nXDI5b3Aaz9SXnDLNbofU89BrCCzzz9ga10"
566 "WX0MKx9rzUDF9gFEgEQDESBRQgTIdL88QHIC8gCJGPIARTbQtaSLR9J4pJQnBEMSqKGYkQTy"
567 "d4jNaFDPGDwbKK/ZtfS6Z54h75oBDmHgc395DL7r8GMAPgeAzxVmCTT+vRsAXik2ZcstAJ8t"
568 "wEOovMaAzyLg9xlU0w3gwDKOxFxA1zK6OL11n9cPWGcIWOcDWOn5ue/T5Te15plSBMjO1hYB"
569 "komLAFkfQB4gOQF5gIZrzeQBiqwblgRKQkgSqHlKHeut/ge3zJk2qVNS4wAAAABJRU5ErkJg"
559 570 "gg==" "gg=="
560 571 ) )
561 572
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/fogman/nakamoto-station

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

Clone this repository using git:
git clone git://git.rocketgit.com/user/fogman/nakamoto-station

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