diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a6a0bde --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +freeze_frame.jpg +qr.jpg +users.json +merged_image.jpg +drawing.png diff --git a/__pycache__/addtoDB.cpython-38.pyc b/__pycache__/addtoDB.cpython-38.pyc index 0a9d183..a818972 100644 Binary files a/__pycache__/addtoDB.cpython-38.pyc and b/__pycache__/addtoDB.cpython-38.pyc differ diff --git a/addtoDB.py b/addtoDB.py index 44187a8..2f54312 100644 --- a/addtoDB.py +++ b/addtoDB.py @@ -27,20 +27,25 @@ def main(): -def addToSSB(pathToImage,description): - #SEND TO SSB! WOOOO - try: - result = subprocess.Popen('./ssb-post.sh mint "' + description + '" ' + pathToImage, shell=True, stdout=subprocess.PIPE, ) - except: - print('traceback.format_exc():\n%s' % traceback.format_exc()) - exit() +def addToSSB(pathToImage,description,mintOrGive): - # for testing: - #print(result) + # mint + if mintOrGive == 1: + try: + result = subprocess.Popen('./ssb-post.sh mint "' + description + '" ' + pathToImage, shell=True, stdout=subprocess.PIPE, ) + except: + print('traceback.format_exc():\n%s' % traceback.format_exc()) + exit() + + # else give + elif mintOrGive == 2: + try: + result = subprocess.Popen('./ssb-post.sh give "' + pathToImage + '" ' + description, shell=True, stdout=subprocess.PIPE, ) + except: + print('traceback.format_exc():\n%s' % traceback.format_exc()) + exit() # get the ssb json from the bash command we just ran - #newssb=result.stdout.read() - ##chatgpt's version: newssb = result.stdout.read().decode() # decode bytes to string print(newssb) diff --git a/drawing.png b/drawing.png index 53794c0..dbad1ca 100644 Binary files a/drawing.png and b/drawing.png differ diff --git a/freeze_frame.jpg b/freeze_frame.jpg index 88d6215..529bc72 100644 Binary files a/freeze_frame.jpg and b/freeze_frame.jpg differ diff --git a/freeze_frame.png b/freeze_frame.png deleted file mode 100644 index 90c8bcd..0000000 Binary files a/freeze_frame.png and /dev/null differ diff --git a/kiosk6.py b/kiosk6.py index 7b54db1..e76ec35 100644 --- a/kiosk6.py +++ b/kiosk6.py @@ -1,9 +1,12 @@ +## this is the custodisco kiosk code for dweb camp 2023 + import tkinter as tk from tkinter import font as tkfont from tkinter import Canvas from tkinter import ttk from tkinter import Text from PIL import Image, ImageTk, ImageDraw +from tkinter import messagebox import tozpl import subprocess import threading @@ -23,6 +26,7 @@ class Kiosk(tk.Tk): self.frames_history = [] self.geometry('1366x768') self.attributes('-fullscreen', True) + self.config(cursor="crosshair") self.switch_frame(Screen0) def switch_frame(self, frame_class, keep_history=True): @@ -82,6 +86,8 @@ class Screen1(tk.Frame): # find yourself in list of ssb users class Screen2(tk.Frame): selected_user = None # This is the global variable to store selected user + selected_label = None # This is the global variable to store selected label + def __init__(self, master): tk.Frame.__init__(self, master, bg='#bcfef9') @@ -89,14 +95,6 @@ class Screen2(tk.Frame): self.top_frame = tk.Frame(self) self.top_frame.pack(side="top", fill="x", pady=40) - # The 'Done' button to navigate to next screen - self.done_button = tk.Button(self, text="Done", command=lambda: master.switch_frame(Screen3), height=3, width=30, bg='peach puff', font=('Helvetica', 16)) - self.done_button.pack(side="right", padx=20, pady=10) - - # The 'Refresh List' button - self.refresh_button = tk.Button(self, text="Refresh List (takes a minute)", command=self.refresh_users, height=3, width=30, bg='peach puff', font=('Helvetica', 16)) - self.refresh_button.pack(side="right", padx=20, pady=10) - # Add a label and text box to the top frame self.label = tk.Label(self.top_frame, text="Start typing your public key to find yourself in the list then click on your key to select it.", font=('Helvetica', 16)) self.label.pack(side="left") @@ -109,19 +107,30 @@ class Screen2(tk.Frame): # Create container for user list self.container = ttk.Frame(self, height=500) # Define a height here - self.container.pack(fill='both', expand=True) - + self.container.pack(fill='both', expand=True, padx=20, pady=20) + # Initialize users list from users.json self.users = self.get_users_from_file() self.update_users_list() + # The 'Done' button to navigate to next screen + self.done_button = tk.Button(self, text="Done", command=lambda: master.switch_frame(Screen3), height=3, width=30, bg='peach puff', font=('Helvetica', 16)) + self.done_button.pack(side="bottom", padx=20, pady=10) + + # The 'Refresh List' button + self.refresh_button = tk.Button(self, text="Refresh List (takes a minute)", command=self.refresh_users, height=3, width=30, bg='peach puff', font=('Helvetica', 16)) + self.refresh_button.pack(side="bottom", padx=20, pady=10) + master.add_home_button(self) - def refresh_users(self): - # Update users list from Scuttlebutt and display it - self.users = self.get_scuttlebutt_users() - self.update_users_list() + try: + # Update users list from Scuttlebutt and display it + self.users = self.get_scuttlebutt_users() + self.update_users_list() + except Exception as e: + print(f"An error occurred while refreshing the user list: {e}") + messagebox.showerror("Error", "An error occurred while refreshing the user list. Please try again later.") def get_scuttlebutt_users(self): result = subprocess.run(['node', 'scuttlebot.js'], capture_output=True, text=True) @@ -150,8 +159,11 @@ class Screen2(tk.Frame): def display_users(self, users): # Scrollable list of users - canvas = tk.Canvas(self.container, width=500) # Increase the width if necessary - scrollbar = ttk.Scrollbar(self.container, orient='vertical', command=canvas.yview) + canvas = tk.Canvas(self.container, width=460) # Decrease the width by scrollbar's width + style = ttk.Style() + style.configure("Vertical.TScrollbar", gripcount=0, + arrowsize=15, width=40) # Adjust width here + scrollbar = ttk.Scrollbar(self.container, orient='vertical', command=canvas.yview, style="Vertical.TScrollbar") scrollable_frame = ttk.Frame(canvas) scrollable_frame.bind( @@ -164,25 +176,35 @@ class Screen2(tk.Frame): canvas.create_window((0, 0), window=scrollable_frame, anchor="nw") canvas.configure(yscrollcommand=scrollbar.set) - # Add user labels to scrollable frame + # Add user buttons to scrollable frame for user in users: - label = tk.Label(scrollable_frame, text=user['id'], font=('Helvetica', 16)) - label.bind("", self.on_user_clicked) - label.pack(anchor="w") + button = tk.Button(scrollable_frame, text=user['id'], font=('Helvetica', 24), bd=0) # Adjust font size here + button.pack(anchor="w") + button.config(command=lambda button=button, user=user: self.on_user_clicked(button, user)) canvas.pack(side="left", fill="both", expand=True) scrollbar.pack(side="right", fill="y") - def on_user_clicked(self, event): + def widget_exists(self, widget): + try: + widget.winfo_exists() + return True + except tk.TclError: + return False + + def on_user_clicked(self, button, user): # Remove highlight from previously selected user - if Screen2.selected_user is not None: - self.selected_user.configure(bg=self.container.cget("bg")) + if Screen2.selected_label is not None and self.widget_exists(Screen2.selected_label): + Screen2.selected_label.configure(relief=tk.FLAT, bg='SystemButtonFace') # default color + + # Store selected user and button + Screen2.selected_user = user['id'] + Screen2.selected_label = button # Highlight clicked label - event.widget.configure(bg="light blue") + Screen2.selected_label.configure(relief=tk.SUNKEN, bg="light blue") + - # Store selected user - Screen2.selected_user = event.widget.cget("text") #take photo of item @@ -306,81 +328,99 @@ class Screen8(tk.Frame): def __init__(self, master): tk.Frame.__init__(self, master, bg='#bcfef9') - # Creating a frame for the left side of the screen for drawing and right side for the buttons + # Creating a frame for the left side of the screen for drawing self.left_frame = tk.Frame(self, bg='#bcfef9') + self.left_frame.pack(side='left', padx=50) + + # Frame for the instructions + self.center_frame = tk.Frame(self, bg='#bcfef9') + self.center_frame.pack(side='left', padx=50) + + # Frame for the tools self.right_frame = tk.Frame(self, bg='#bcfef9') - self.left_frame.pack(side='left', padx=10) - self.right_frame.pack(side='right', padx=10) + self.right_frame.pack(side='left', padx=50) # Add instructions - self.label = tk.Label(self.left_frame, text="You may now draw your tag! This will be printed as either a sticker or a ribbon, both of which are 1.25 by 2.25 inches. You can include contact info for yourself, the name of the item, a drawing, or whatever you want, it's your artistic expression. In the bottom right will be a small QR code which links to the Scuttlebutt post for your item.", - wraplength=500, # adjust to suit needs + self.label = tk.Label(self.center_frame, text="You may now draw your tag! This will be printed as either a sticker or a ribbon, both of which are 1.25 by 2.25 inches. You can include contact info for yourself, the name of the item, a drawing, or whatever you want, it's your artistic expression. In the bottom right will be a small QR code which links to the Scuttlebutt post for your item. The image you are drawing now will not be posted to Scuttlebutt.", + wraplength=400, # adjust to suit needs font=("Helvetica", 16)) - self.label.pack(pady=20) - - self.drawing = Image.new('1', (300, 540), 1) + self.label.pack(pady=50) + + # is this the drawing area? + self.drawing = Image.new('1', (361, 675), 1) self.draw = ImageDraw.Draw(self.drawing) self.last_draw = None - # Set initial drawing color to black + # Set initial drawing color to black and size to 1 self.draw_color = 'black' + self.draw_size = 1 # Creating the Canvas for drawing - self.canvas = Canvas(self.left_frame, width=300, height=540, bg='white') + self.canvas = Canvas(self.left_frame, width=361, height=675, bg='white') self.canvas.bind("", self.draw_line) self.canvas.pack(pady=20) self.canvas.bind("", self.reset_last_draw) self.add_qr_box() # Add QR box to the canvas - + + #Create a frame for the buttons grid + self.buttons_frame = tk.Frame(self.right_frame, bg='#bcfef9') + self.buttons_frame.pack(pady=10) + + # Add Draw Size buttons + tk.Button(self.buttons_frame, text=".", command=lambda: self.set_draw_size(1), height=3, width=10, bg='peach puff').grid(row=0, column=0, padx=5, pady=5) + tk.Button(self.buttons_frame, text="*", command=lambda: self.set_draw_size(2), height=3, width=10, bg='peach puff').grid(row=1, column=0, padx=5, pady=5) + tk.Button(self.buttons_frame, text="⚬", command=lambda: self.set_draw_size(3), height=3, width=10, bg='peach puff').grid(row=2, column=0, padx=5, pady=5) + tk.Button(self.buttons_frame, text="⬤", command=lambda: self.set_draw_size(4), height=3, width=10, bg='peach puff').grid(row=3, column=0, padx=5, pady=5) + # Creating color buttons - tk.Button(self.right_frame, height=10, width=10, bg='black', command=lambda: self.set_draw_color('black')).pack(pady=5) - tk.Button(self.right_frame, height=10, width=10, bg='white', command=lambda: self.set_draw_color('white')).pack(pady=5) + tk.Button(self.buttons_frame, height=5, width=10, bg='black', command=lambda: self.set_draw_color('black')).grid(row=0, column=1, padx=5, pady=5) + tk.Button(self.buttons_frame, height=5, width=10, bg='white', command=lambda: self.set_draw_color('white')).grid(row=1, column=1, padx=5, pady=5) # Add label for pen color buttons - self.color_label = tk.Label(self.right_frame, text="switch pen color", font=("Helvetica", 16)) + self.color_label = tk.Label(self.right_frame, text="^ drawing tools ^", font=("Helvetica", 16)) self.color_label.pack(pady=5) # Add Clear Drawing Button tk.Button(self.right_frame, text="clear drawing", command=self.clear_drawing, height=3, width=20, bg='peach puff').pack(pady=10) - # done button + # Done button tk.Button(self.right_frame, text="Done", command=self.next, height=3, width=30, bg='peach puff').pack(pady=10) # Adding a home button - master.add_home_button(self.right_frame) + master.add_home_button(self.center_frame) def draw_line(self, event): x, y = event.x, event.y if self.last_draw: - self.canvas.create_line(*self.last_draw, x, y, fill=self.draw_color) - self.draw.line([*self.last_draw, x, y], fill=0 if self.draw_color == 'black' else 1) + self.canvas.create_line(*self.last_draw, x, y, fill=self.draw_color, width=self.draw_size) + self.draw.line([*self.last_draw, x, y], fill=0 if self.draw_color == 'black' else 1, width=self.draw_size) self.last_draw = (x, y) def next(self): - # Save the drawing as a .png file self.drawing.save("drawing.png") # next screen self.master.switch_frame(Screen11) - def reset_last_draw(self, event): self.last_draw = None def set_draw_color(self, color): self.draw_color = color + def set_draw_size(self, size): + self.draw_size = size + def clear_drawing(self): self.canvas.delete("all") # Clear canvas - self.drawing = Image.new('1', (300, 540), 1) # Create new blank drawing image + self.drawing = Image.new('1', (361, 675), 1) # Create new blank drawing image self.draw = ImageDraw.Draw(self.drawing) # Prepare to draw on the new blank image self.add_qr_box() # Add QR box to the canvas def add_qr_box(self): - self.canvas.create_rectangle(300-43, 540-43, 300, 540, outline='black', fill='white') - self.canvas.create_text(300-22, 540-22, text="QR", fill="black") - + self.canvas.create_rectangle(232, 546, 361, 667, outline='black', fill='white') + self.canvas.create_text(300, 600, text="QR", fill="black") # txt update class Screen9(tk.Frame): @@ -424,14 +464,18 @@ class Screen11(tk.Frame): path_to_image = "/home/trav/Documents/custodiosk/freeze_frame.jpg" # make ssb post - key = addtoDB.addToSSB(path_to_image,info_text) + key = addtoDB.addToSSB(path_to_image,info_text,1) + + # ssb give! (make sure we have a UID to give to first) + if Screen2.selected_user != "": + nothing = addtoDB.addToSSB(Screen2.selected_user,key,2) # Create qr code #from https://ourcodeworld.com/articles/read/554/how-to-create-a-qr-code-image-or-svg-in-python qr = qrcode.QRCode( version = 1, error_correction = qrcode.constants.ERROR_CORRECT_H, - box_size = 1, + box_size = 3, border = 1, ) # Add data @@ -447,9 +491,9 @@ class Screen11(tk.Frame): qr = Image.open("qr.jpg") # qr # merge em - merged_image = Image.new('L', drawing.size) - merged_image.paste(drawing, (0, 0)) - merged_image.paste(qr, (257, 497)) # paste without mask + merged_image = Image.new('L', (367, 725), "white") + merged_image.paste(drawing, (0, 25)) + merged_image.paste(qr, (232, 571)) # paste without mask merged_image.save("merged_image.png") @@ -489,10 +533,6 @@ class Screen11(tk.Frame): print('traceback.format_exc():\n%s' % traceback.format_exc()) exit() - - # post update to SSB transferring ownership to the user - # fill this in ^^^ - self.master.switch_frame(Screen10) # Switching to Screen10 after Done class Screen12(tk.Frame): diff --git a/merged_image.png b/merged_image.png index 9322769..2ac3942 100644 Binary files a/merged_image.png and b/merged_image.png differ diff --git a/custodiscokiosk.pde b/old kiosks/custodiscokiosk.pde similarity index 100% rename from custodiscokiosk.pde rename to old kiosks/custodiscokiosk.pde diff --git a/description for gpt.txt b/old kiosks/description for gpt.txt similarity index 100% rename from description for gpt.txt rename to old kiosks/description for gpt.txt diff --git a/my version.py b/old kiosks/my version.py similarity index 100% rename from my version.py rename to old kiosks/my version.py diff --git a/theirversion.py b/old kiosks/theirversion.py similarity index 100% rename from theirversion.py rename to old kiosks/theirversion.py diff --git a/pythonzpl.zpl b/pythonzpl.zpl deleted file mode 100644 index 7b34d57..0000000 --- a/pythonzpl.zpl +++ /dev/null @@ -1 +0,0 @@ -^XA ^FO0,0^GFA,14400,14400,32, ,:::L0GFGChV0K0G3G0G2hV0K0G4G0G1hV0K0G4H0GChU0K0G8H0G2hU0K0G8H0G1GChT0J0G1S0GFhK0J0G1T0GEhJ0J0G1T0G1GFhI0J0G1V0G8hH0J0G1V0G4V0G3gK0J0G2O0G8L0G3O0G1HFI0G3HCgJ0J0G2N0G1GCM0G8N0G2G7GEGCH0G4G0G2gJ0J0G2N0G3GFGEL0G8N0G1G8G0G2J0G2L0G1GFGCU0J0G2N0G6G0G1G8K0G8N0G2H0G1J0G1J0G1GFGEG0G4U0J0G2N0G8H0G4K0G4N0G2H0G1J0G1H0G3GFGEI0G4U0J0G1G8M0G8H0G2K0G4N0G4H0G1J0G1H0G6K0G8U0K0G6L0G1I0G1K0G4N0G4H0G1J0G1N0G8U0K0G1G8K0G1J0G8J0G8N0G4H0G1J0G1N0G8U0L0G6K0G1J0G8J0G8N0G4H0G1J0G1M0G1V0L0G1G8J0G2J0G8I0G1O0G4H0G1J0G1M0G1V0M0G6J0G2J0G8I0G2O0G2H0G1J0G1M0G2V0M0G1G8I0G2J0G8I0G4O0G2H0G2J0G1M0G4V0N0G4I0G2J0G8I0G4O0G1H0G2J0G2M0G4V0N0G2I0G4J0G8I0G4P0G8G0G4J0G2M0G8V0N0G2I0G4J0G8I0G4P0G8G0G4J0G2L0G1W0N0G1I0G4I0G1J0G4H0G1G8L0G4G0G8J0G2L0G1W0O0G8H0G4I0G1J0G2I0G7IFI0G4G1K0G2L0G2W0O0G8H0G4I0G1J0G2P0H2K0G4L0G2W0O0G8H0G4I0G2J0G1P0G1G2K0G4L0G4W0O0G8H0G4I0G4K0G8P0GCK0G4L0G4W0O0G8H0G4I0G4K0G4P0GCK0G4L0G8W0N0G1I0G4I0G8K0G4P0GCK0G4L0G8W0N0G1I0G4I0G8K0G4P0GCK0G8K0G1X0N0G2I0G4H0G3L0G4O0G1G2K0G8K0G1X0N0G2I0G2H0G4L0G4O0G1G2K0G8K0G2X0N0G4I0G2H0G8L0G4O0G2G1J0G1L0G2X0N0G8I0G1G8G3M0G4O0G2G1I0GFG1G0G1J0G4X0M0G1K0G7GCM0G4O0G2G0G8I0HFGEJ0G4K0G3GCQ0M0G2T0G4O0G4G0G8I0G2L0G8L0G3GCP0M0G4T0G4O0G4G0G8I0G2L0G8M0G3GCO0M0G8T0G4O0G4G0G8I0G2K0G1Y0L0G1U0G8O0G8G0G8I0G4K0G1Y0L0G2U0G8O0G8G0G4I0G4K0G2Y0L0G4T0G1P0G8G0G4I0G4K0G2Y0L0G8S0G8G1P0G8G0G4I0G4K0G4Y0K0G1T0G8G2P0G8G0G4I0G8K0GCY0J0G1G6T0G4GCP0G8G0G4I0G8K0GBHFGEV0J0G2G8T0G3Q0G8G0G8I0G8K0G8Y0J0G5gM0G8G0G8I0G8K0G8Y0J0GEX0G7GEM0G8G1I0G1K0G1g0gH0G1G8G1G8L0G4G1I0G1K0G1g0gH0GEH0G6L0G4GEI0G1K0G2g0gG0G3I0G1G8K0G3J0G1K0G2g0gG0GCJ0G4P0G1K0G2g0g0G1K0G2P0G2K0G2g0g0G6K0G2P0G2K0G4g0g0G8K0G1V0G4g0Y0G1M0G8U0G4g0Y0G1M0G4U0G4g0Q0G3GFGCK0G2M0G2U0G8g0Q0GCG0G3K0G4M0G2U0G8g0P0G1I0GEJ0G4M0G1U0G8g0P0G2I0G1G8I0G8M0G1T0G1gG0P0GCJ0G4H0G1O0G8S0G1gG0O0G1H0G1HFGAH0G1O0G8S0G1gG0O0G1H0G6H0G7G8G0G2J0G3J0G8S0G1G8g0O0G2H0G4H0G1G6G0G4J0HCI0G4T0G8g0O0G4H0G4H0H1G0G4I0H1GEI0G4gU0O0G4H0G2I0G8GCG8I0H2G3I0G4gU0O0G8H0G2I0G8G3G8I0H2G7I0G4O0G7GFgJ0O0G8H0G1I0G8G1G6I0G4G2G6I0G4N0G3G8G0G8S0GFO0N0G1J0G8H0G8G1J0G4G1G2I0G4N0G4H0G4Q0G3GFG0G8N0N0G1J0G8H0G8G1J0G8G1GBG0G8G0G4N0G4H0G2Q0GCH0G8N0N0G1H0GFG0G8H0G8G1J0G8G0GEG0G8G0G4N0G8H0G1L0G1GCH0G7I0G8N0N0G2G0G1H8G4H0G8G1I0G1J0GCG0G4N0G8H0G1L0GEG3GEG1G8I0G8N0N0G2G0G1G0G8G4G0G1G0G1I0G1J0G4G0G4N0G8H0G2H0G3G8G0G1G0G6H2J0G8N0N0G2G0G1GEG8G4G0G1G0G1I0G1J0G8G0G8Q0G2H0G4J0G8G1K0G8N0N0G2G0G1GBG8G4G0G1G0G1I0G1J0G8G0G8Q0G2H0G4I0G3G0G1K0G8N0N0G2H0GFG8G4G0G1G0G1I0G1J0G8G1R0G4H0G8I0G4G0G1J0G1O0N0G2H0GDHCG0G1G0G1I0G1I0G1G0G1R0G8G0G1J0G8G0G1J0G1O0N0G2H0G7G3H0G2H0GCH0G1I0G2G0G6Q0G1H0G1I0G1H0G1J0G1O0N0G2L0G2H0G2I0GCH0G4G0G8Q0G2H0G2I0G2H0G2J0G1O0N0G2L0G2H0G1I0G3H0G4G0G8Q0G2H0G4I0G4H0G2J0G1O0N0G2L0G4I0GCI0GCG0G8G7R0G4H0G8I0G4H0G2J0G1O0N0G2L0G4I0G3I0G3HFG8R0G8H0G8I0G4H0G4J0G1O0N0G2L0G4J0HFG9GFGCS0G3I0G8I0G4H0G4J0G2O0N0G1L0G8L0G6U0G4I0G8I0G2H0G8J0G2O0N0G1L0G8gH0G4I0G8I0G1H0G8J0G2O0N0G1L0G8gH0G8H0G1K0G8G1K0G4O0N0G1L0G8gG0G1I0G1K0G8G1K0G4O0O0G8J0G1gH0G2I0G1K0G6G2K0G4O0O0G8J0G1gH0G2I0G1K0G1G4K0G4O0O0G8J0G1gH0G4I0G1G0G1GEH0G1G4K0G8O0O0G8J0G2gH0G4I0G1G0H2I0GCK0G8O0O0G4J0G2gH0G4I0H1GCG1H0G1G2K0G8O0O0G4J0G2gH0G2I0G1G2G0G2H0G1G2K0G8O0O0G2J0G4gH0G1G8I0G8G0G2H0G2G1I0GEG1H0GCM0O0G2J0G4gI0G4I0G8G0GCH0G4G1I0G1IFN0O0G1J0G4gI0G3I0G4G3I0G8G1J0G1P0O0G1J0G8gJ0GFGEG0G3GCI0G8G1J0G1P0P0G8H0G1gR0G1G0G1J0G2P0P0G8H0G2gR0G1G0G1J0G2P0P0G4H0G2gL0G1G8J0G2G0G2J0G2P0P0G2H0GCgL0G1K0G2G0G4J0G2P0P0G1G0G3gM0G1K0G4G0G4J0G4P0Q0GFGCgK0G8G0HFJ0G4G1G8J0G4P0gX0G8G3G2G0GDI0G4G2K0G4P0gX0G8GCG2G0G3I0G7GCK0G4P0gX0GBG0G2G0G1P0G4P0gX0GCG0G2G0G1G8O0G4P0gW0G3G8G0G2G0G1G4H0G8L0G8P0gW0GCG8G0G2G0G1G2H0G8L0G8P0gU0G4G3G0G8G0G4G0H1H0G8L0G8P0gK0GEO0HCG0G8G0G4G0G1G0G8G0G4L0G8P0gK0GAO0GBH0G8G0G4G0G1G0G4G0G4W0gJ0G1P0GCH0G8G0G4G0G1G0G2G0G4W0gJ0G2O0G3G8G0G1H0G4G0G1G0G1G8G4W0gJ0G4O0GCG8G0G1H0G4G0G1H0G6G4W0gJ0G8N0G1G0G8G0G1H0G4G0G1H0G1G4W0gI0G1O0G6G0G8G0G1H0G4G0G1I0GCM0G3O0gI0G2N0G1G8G0G8G0G1H0G4G0G1I0GBG0G1H0G1G8G0G7O0gI0G2N0G6H0G8G0G1H0G4G0G2I0G8GEG1G0G1GEGCG0G5I0G1K0gI0G4N0GCH0G8G0G1H0G4G0G2I0G8G1HFGEG0G4G0G1G0G8G0G1K0gI0G8M0G1G4H0G8G0G1H0G4G0G2I0G8G0G1I0G4G0G1G0G8G0G1K0gH0G1N0G2G4H0G8G0G1H0G4G0G2I0G8G0G1I0G2G0G1G0G4G0G1K0gH0G2N0H4H0G8G0G1H0G4G0G2I0G8G0G1I0G2G0G2G0G4G0G1K0gH0G4M0G1G8G4H0G8G0G1H0G4G0G2I0G8G0G1I0G2G0G2G0G4G0G1K0gH0G8M0G6G0G4H0G8G0G1H0G8G0G2I0G8G0G1I0G2G0G2G0G4G0G1K0gH0G8M0G8G0G4H0G8G0G1H0G8G0G2I0G8G0G1I0G2G0G2G0G4G0G1K0gG0G1N0G8G0G4H0G8G0G1H0G8G0G2I0G8G0G1I0G2G0G2G0G4G0G1K0gG0G2M0G1H0G4H0G8G0G1H0G8G0G2I0G8G0G1I0G2G0G2G0G4G0G1K0gG0G4M0G1H0G4H0G8G0G1H0G8G0G2I0G8G0G1I0G2G0G2G0G4G0G1K0gG0G4M0G2H0G4H0G8G0G1H0G8G0G2I0G8G0G1I0G2G0G2G0G4G0G1K0gG0G8M0G2H0G4H0G8G0G1H0G8G0G2I0G8G0G1I0G2G0G2G0G4G0G1K0g0G1N0G4H0G4H0G8G0G1H0G8G0G2I0G8G0G1I0G2G0G2G0G4G0G1K0g0G2N0G4H0G4H0G8G0G1H0G8G0G2H0G1H0G2I0G4G0G2G0G4G0G2K0g0G2N0G2H0G4H0G8G0G1H0G8G0G2H0G1H0G2I0G4G0G2G0G4G0G2K0g0G4N0G2H0G4H0G8G0G1H0G8G0G2H0G1H0G2I0G4G0G2G0G4G0G2K0g0G8N0G1G8G0G4H0G8G0G1H0G8G0G2H0G1H0G2I0G4G0G2G0G4G0G2K0Y0G1P0G6G0G4H0G8G0G1H0G8G0G2H0G1H0G2I0G4G0G2G0G4G0G2K0Y0G2P0G1G8G2H0G8G0G1H0G8G0G2H0G2H0G2I0G4G0G2G0G4G0G2K0Y0G2Q0G4G2H0G8G0G1H0G8G0G2H0G2H0G2I0G4G0G2G0G4G0G2K0Y0G4Q0G3G2H0G8G0G1H0G8G0G2H0G2H0G2I0G4G0G2G0G4G0G2K0Y0G8R0GCH0G8G0G1H0G8G0G2H0G2H0G2I0G4G0G2G0G4G0G2K0X0G1S0G3H0G8G0G1H0G8G0G2H0G2H0G2I0G4G0G2G0G4G0G2K0X0G1T0G8G0G8G0G1H0G8G0G4H0G2H0G2I0G4G0G2G0G4G0G2K0X0G2T0G6G0G8G0G1H0G8G0G4H0G2H0G2I0G4G0G4G0G4G0G4K0X0G4T0G1G0G6G0G1H0G8G0G4H0G2H0G2I0G4G0G4G0G4G0G4K0X0G4U0GCG6G0G1H0G8G0G4H0G2H0G2I0G4G0G4G0G4G0G4K0X0G8U0G2H0G1H0G8G0G4H0G2H0G2I0G4G0G4G0G4G0G4K0W0G1V0G1H0G1G0G1H0G4H0G2H0G2I0G4G0G4G0G4G0G4K0W0G1W0G8G0G1G0G1H0G4H0G2H0G2I0G4G0G4G0G4G0G4K0W0G2W0G4G0G1G0G1H0G4H0G4H0G2I0G4G0G4G0G4G0G4K0W0G2W0G3G0G1G0G1H0G4H0G4H0G4I0G4G0G4G0G8G0G4K0W0G4X0G8G1G0G1H0G4H0G4H0G4I0G4G0G4G0G8G0G4K0W0G4X0G6G1G0G1H0G4H0G4H0G4I0G4G0G4G0G8G0G4K0W0G8X0H1G0G1H0G4H0G4H0G4I0G4G0G4G0G8G0G4K0V0G1g0G9G0G1H0G4H0G4H0G4I0G4G0G4G0G8G0G4K0:V0G2g0G7G0G1H0G4H0G8H0G4I0G4G0G4G0G8G0G4K0V0G2g0G3G0G1H0G4H0G8H0G4I0G4G0G4G0G8G0G4K0V0G4g0G1G0G1H0G4H0G8H0G4I0G4G0G4G0G8G0G4K0V0G4gG0G8G1H0G4H0G8H0G4I0G4G0G4G0G8G0G4K0V0G8gG0G8G1H0G4H0G8H0G8I0G8G0G4G0G8G0G4K0V0G8gG0G4G1H0G4H0G8H0G8I0G8G0G4G0G8G0G4K0U0G1gH0G4G1H0G4H0G8H0G8I0G8G0G4G0G8G0G4K0:U0G2gH0G2G1H0G4H0G8H0G8I0G8G0G8G0G8G0G4K0U0G2gH0G2G1H0G8H0G8H0G8I0G8G0G8G0G8G0G4K0U0G4gH0H1H0G8H0G8H0G8I0G8G0G8G0G8G0G4K0:U0G4gI0G9H0G8H0G8H0G8I0G8G0G8G0G8G0G4K0U0G8gI0G9H0G8H0G8H0G8I0G8G0G8G0G8G0G4K0U0G8gI0G9H0G8G0G1I0G8I0G8G0G8G0G8G0G4K0T0G1gJ0G9H0G8G0G1I0G8I0G8G0G8G0G8G0G4K0T0G1gJ0G5H0G8G0G1H0G1J0G8G0G8G0G8G0G4K0:T0G2gJ0G5H0G8G0G1H0G1J0G8G0G8G0G8G0G4K0::T0G4gJ0G5H0G8G0G1H0G1I0G1H0G8G0G8G0G4K0:T0G8gJ0G5H0G8G0G1H0G1I0G1H0G8G0G8G0G8K0:S0G1gK0G5H0G8G0G1H0G1I0G1H0G8G0G8G0G8K0S0G1gK0G4H0G8G0G1H0G1I0G1G0G1H0G8G0G8K0:S0G2gK0G4H0G8G0G2H0G1I0G1G0G1H0G8G0G8K0S0G2gK0G4H0G8G0G2H0G1I0G1G0G1G0G1H0G8K0::S0G4gK0G4H0G8G0G2H0G1I0G1G0G1G0G1H0G8K0S0G4gK0G4G0G1H0G2H0G1I0G1G0G1G0G1H0G8K0S0G4gK0G4G0G1H0G2H0G2I0G1G0G1G0G1H0G8K0:S0G8gK0G4G0G1H0G2H0G2I0G1G0G1G0G1H0G8K0:S0G8gK0GCG0G1H0G2H0G2I0G1G0G1G0G1H0G8K0S0G8gK0GAG0G1H0G2H0G2I0G2G0G1G0G1G0G1L0R0G1gL0GAG0G1H0G2H0G2I0G2G0G1G0G2G0G1L0::R0G1gK0G1G2G0G1H0G2H0G2I0G2G0G1G0G2G0G1L0R0G1gK0G1G2G0G1H0G2H0G2I0G2G0G2G0G2G0G2L0:R0G2gK0G1G2G0G1H0G2H0G2I0G2G0G2G0G2G0G2L0R0G2gK0G1G2G0G1H0G2H0G2I0G4G0G2G0G2G0G2L0R0G2gK0H2G0G1H0G2H0G2I0G4G0G2G0G2G0G2L0::R0G2gK0H2G0G1H0G2H0G2I0G4G0G2G0G4G0G2L0:R0G4gK0H2G0G1H0G2H0G2I0G4G0G2G0G4G0G2L0R0G4gK0G4G2G0G1H0G4H0G2I0G4G0G2G0G4G0G4L0:R0G4gK0G4G2G0G1H0G4H0G2I0G4G0G2G0G8G0G4L0:R0G4gK0G8G2G0G1H0G4H0G2I0G4G0G2G0G8G0G4L0:R0G8gJ0G1G0G2G0G1H0G4H0G2I0G4G0G2G0G8G0G4L0R0G8gJ0G1G0G2G0G1H0G4H0G2I0G4G0G4G0G8G0G4L0:R0G8gJ0G1G0G2G0G1H0G4H0G2I0G8G0G4G0G8G0G4L0R0G8gJ0G2G0G2G0G1H0G4H0G2I0G8G0G4G0G8G0G4L0R0G8gJ0G2G0G2G0G1H0G2H0G2I0G8G0G4G0G8G0G4L0::R0G8gJ0G4G0G2G0G1H0G2H0G2I0G8G0G4G0G8G0G8L0R0G8gJ0G4G0G2G0G1H0G2H0G2I0G8G0G4G1H0G8L0R0G8gJ0G8G0G2G0G1H0G2H0G2I0G8G0G4G1H0G8L0::R0G4gI0G1H0G2G0G1H0G2H0G2I0G8G0G4G1H0G8L0:R0G4gI0G2H0G2G0G1H0G2H0G2I0G8G0G4G1H0G8L0:R0G4gI0G4G2G0G2G0G1H0G2H0G2I0G8G0G4G1H0G8L0R0G4gI0G4G2G0G2G0G1H0G2H0G2I0G8G0G8G1H0G8L0R0G2gI0G8G2G0G2G0G1H0G2H0G2I0G8G0G8G1H0G8L0:R0G2gH0G1G0G2G0G2G0G1H0G2H0G2I0G8G0G8G1H0G8L0R0G2gH0G2G0G2G0G2G0G1H0G2H0G2I0G8G0G8G1H0G8L0:R0G1gH0G4G0G2G0G2G0G1H0G2H0G2I0G8G0G8G1H0G8L0R0G1gH0G4G0G2G0G2G0G1H0G2H0G1I0G8G0G8G1H0G8L0R0G1gH0G8G0G2G0G2G0G1H0G2H0G1I0G8G0G8G1H0G8L0S0G8g0G1H0G2G0G2G0G1H0G2H0G1I0G8G0G8G1H0G8L0:S0G8g0G2GCG0G1G0G2G0G1H0G2H0G1I0G8G0G8G1H0G8L0S0G4g0G4G8G0G1G0G2G0G1H0G2H0G1I0G8G0G8G1H0G8L0S0G4g0H8G0G1G0G2G0G1H0G2H0G1I0G8G0G8G1H0G8L0S0G2g0H8G0G1G0G2G0G1H0G2H0G1I0G8G0G8G1H0G8L0S0G2Y0G1G0G8G0G1G0G2G0G1H0G2H0G1I0G8G0G8G1H0G8L0S0G1Y0G1G0G8G0G1G0G2G0G1H0G2H0G1I0G8G0G8G1H0G8L0S0G1Y0G2G0G4G0G1G0G2G0G1H0G2H0G1I0G8G0G8G1H0G8L0T0G8X0G4G0G4G0G1G0G2G0G1H0G2H0G1I0G8G0G8G1H0G8L0T0G8X0G8G0G4G0G1G0G2G0G1H0G1H0G1I0G8G0G8G1H0G8L0T0G4X0G8G0G4G0G1G0G2G0G1H0G1H0G1I0G8G0G8G1H0G8L0T0G2W0G1H0G4G0G1G0G2G0G1H0G1I0G8H0G8G0G8G1H0G8L0T0G2W0G2H0G4H0G8G2G0G1H0G1I0G8H0G8G0G8G1H0G8L0T0G1W0G7H0G4H0G8G2G0G1H0G1I0G8H0G8G0G8G1H0G8L0T0G1W0G9H0G4H0G8G1G0G1H0G1I0G8H0G4G0G8G1H0G8L0U0G8V0G9H0G4H0G8G1H0G8G0G1I0G8H0G4G0G8G1H0G8L0U0G4U0H1H0G2H0G8G1H0G8G0G1I0GCH0G4G0G8G1H0G8L0U0G2U0G2G0G8G0G2H0G4G1H0G8G0G1I0GCH0G4G0G8G1H0G8L0U0G2U0G4G0G8G0G2H0G4G1H0G8G0G1I0G4H0G4G0G8G1H0G8L0U0G1S0G8G0G8G0G8G0G2H0G5GDH0G8G0G1I0G4H0G4G0G8G1G8G0G8L0V0G8R0G8G1H0G8G0G2H0G7G1H0G8G0G1L0G4G0G8G0G8G0G8L0V0G4R0G8G2H0G8G0G2H0G6G1H0G8G0G1L0G4I0G8G0G8L0V0G2R0G8G4H0G8G0G2H0G4G1H0G8G0G1L0G4I0G8G0G8L0V0G1R0G9G8H0G8G0G2H0GCG1H0G8G0G1L0G4K0G8L0W0GCQ0G6I0G8G0G2G0G1G6G1H0G8G0G1L0G4K0G8L0W0G3Q0G4I0G8G0G2G0G2G0G1H0G4H0G8K0G4K0G8L0X0G8O0G1GCI0G8G0G2G0G2G0G1H0G4H0G8K0G4K0G8L0X0G6O0G6G4I0G8G0G2G0GCG0G1H0G4H0G8K0G4K0G8L0X0G1G8L0H1G8G4I0G8G0G2G1H0G1H0G4H0G8K0G4K0G8L0Y0G7L0G1GEG0G4I0G8G0H2H0G1H0G4H0G4K0G4K0G8L0X0G1G0GFK0G7H0G4I0G8G0G2G4H0G1H0G4H0G4K0G4K0G8L0X0G1H0GEG2H0G3G9H0G4I0G8G0G2G8H0G3H0G6H0G4Q0G4L0X0G1H0G1IFGCG1H0G2I0G8G0G3I0G3H0G2H0G4Q0G4L0X0G1I0G2I0G1H0G2I0G8G0G2L0G2H0G6Q0G4L0X0G1I0G2I0G1H0G2I0G8G0GEL0G2H0G6Q0G4L0X0G1I0G2I0G1H0G1I0G8G1M0G3I0G3P0G4L0X0G1I0G2I0G1H0G1I0G8G2M0G3J0GEO0G4L0Y0G8H0G2I0G1H0G1I0G8G4M0G2J0G1GFG8M0G4L0Y0G8H0G2I0G1H0G1I0G9G8T0G7GFL0G4L0Y0G4H0G2I0G1H0G1I0GAW0HFJ0G4L0Y0G4H0G1I0G1H0G1I0GCY0GFI0G4L0Y0G4H0G1I0G1I0G8G0G1G8g0GEH0G4L0Y0G4H0G1I0G1I0G8G0G6G8g0G1GFG0G6L0Y0G4H0G1I0G1I0G8G0H8gH0GFM0Y0G4H0G1I0G1I0G8G1G0G8gI0GFL0Y0G4H0G1I0G1I0G8G6G0G8gI0G1L0Y0G2I0G8H0G1I0G9G8G0G8gP0Y0G2I0G8H0G1I0GEH0G8Q0JFGCT0Y0G2I0G8H0G1I0GCG0G1V0G3GES0Y0G1I0G8H0G1H0G3G4G0G1M0G6O0G1HFQ0Y0G1I0G8H0G1G0G1GCG4G0G1M0G1GEQ0GFP0Y0G1I0G8H0G1G0G6G0G4G0G1N0G1GFGEP0GFO0g0G8H0G8H0H1G8G0G4G0G1P0G1GFP0GFGCG4L0g0G8H0G4H0G1G6H0G2G0G1R0GFG8O0G3GEL0g0G8H0G4H0G1G8H0G2G0G1S0G7GCV0g0G8H0G4H0GFI0G2G0G1T0G3GFU0g0G8H0G4H0G1I0G2G0G1V0GFGCS0g0G8H0G4H0G1I0G2G0G1J0G2R0G3GFR0g0G8H0G4H0G1I0G2G0G1J0G2T0GFQ0g0G4H0G4H0G1I0G1G3H8I0G1GET0GFG8O0g0G4H0G2H0G1I0G1G0G7G8I0G3IFGER0G7GFG0G2L0g0G4H0G2H0G1I0G1H0GEK0G3G8G1HFGEQ0GFG9L0g0G4H0G2H0G1I0G2H0G9GEK0G7GFGEG0G1IFO0G7G8K0g0G2H0G2H0G1L0GCG1GFL0G1GFG8I0IFS0g0G2H0G2H0G1L0GCH0GFG8L0G7GFK0HFGEP0W0HFG8G2H0G2H0G1L0GCI0G7GEM0IFJ0G1GEO0Y0G7GFGEG0G1H0G1L0GCJ0G1GFGCN0GFGCI0G1GFG8G3L0g0G2G1IFG0G1S0G3GFG8M0G3HFG8H0G7GFL0g0G3H0G1G0IFGCS0G7HFGCM0G7GFG8N0gI0G1H0G1G0G3KFG8P0G3GFN0G7GCG1G8K0gI0G1H0G1M0G7IFO0HFGEL0G3GFGCK0gI0G1H0G1P0G3IFGCL0G3G1IFG8J0G8K0gJ0G8G0G1P0G1I0G3HFGCI0G5G8I0G7GEO0gJ0G8G0G1P0G1H0G2I0G3HFGEH4J0G1GEN0gL0G1P0G1H0G4K0G4G9GFGCK0G3GFM0gL0G1P0G1H0GCK0I8G3GFGCI0G4G2GEG8K0gW0G2G0G1J0G6G0G8G5G0G1HFH0G1G8H1GCK0gW0G2G0G1J0G7G0G8G7J0GFGEG2H0G8L0gW0G2G0G1J0G5G1G0G2J0G4G1GFGEG0G4L0gW0G2G0G1J0G5G2L0G2G1G8G2G0G2L0gW0G2G0G1J0G9GAL0G1GEI0G3L0gW0G2G0G1J0G8GCR0GEK0gW0G2G0G1G0G3H0G8S0G1K0gW0G2G0G2G0G4G8G0GFG8S0G8J0gW0G2G0G2G0G8G4GFG8G6S0G8J0gR0G3J0G2G0G2G0G8G3G0G8G1S0G4J0gR0G1J0G4G0G2G1G0G6G1H0G8R0G4J0gR0G1J0G4G0G2G1G0G9G1L0G3GFG8L0G2J0gS0G8I0G4G0G2H1G0G9K0G7GCG0G7GEK0G2J0gS0G8I0G4G0G4G1G2G0G9G0G1IFG8I0G1GCJ0G1J0M0G4gK0G8I0G4G0G4G1G4G0G7G0G1GEM0G3J0G1J0M0G6N0GFGEU0G8I0G4G0G4G0G8G0G6H0GFGCM0G8I0G1J0M0G2M0G3G0G1G8M0G1G8K0G4I0G4G0G4G0G8I0G7G0GBG8L0G4I0G1J0M0G2M0G2H0G4M0G2G4K0G4I0G4G0G4G1I0G3G8G0G6G7G8K0G3I0G1J0M0G2I0G3GEH0G4H0G2M0G4G2K0G4I0G4G0G4G1I0G4H0G1G0G6L0G8I0G8I0M0G2H0GFGCG1G8G0G4H0G1M0G4G1K0G2I0G4G0G4G2I0G4I0GCG1GEG0G3G8H0G4I0G8I0M0G2G0G3I0G6G0G4H0G1M0G8G1K0G2I0G4G0G4G2I0G8I0G2G0G1G8G4G8H0G2I0G8I0M0G2G0GCK0G4I0G8L0G8G1K0G1I0G4G0H4H0G1J0G1H0G6G8G4H0G1I0G8I0M0G1G7L0G8I0G8L0G8G1K0G1I0G4G0H4H0G1G0G7H0G1H0G1GEG2I0G8H0G4I0M0G3G8L0G8I0G8L0G8G0G8K0G8H0G4G0G4G8H0G2G0G7G8H0G8G0H1G2I0G8H0G4I0L0G1GDM0G8I0G8L0G8G0G8K0G8H0G4G0H8H0G2G0G6G8H0G8G0G1G0GEI0G4H0G4I0L0G6G0G8L0G8H0G1L0G1H0G4K0G4H0G4G0H8H0G2G0G3G8H0G4G0G1G7G3I0G4H0G2I0K0G1G8G0G8L0G4H0G1L0G1H0G4K0G4H0G4G0G9I0G2G0G1GCH0G2G0G1GFG7I0G4H0G2I0K0GEH0G4L0G4H0G2L0G1H0G2K0G4H0G4G0G9I0G4H0GCH0G2G0G3GFGDI0G2H0G2I0J0G7I0G4L0G2H0G2L0G1H0G2K0G2H0G4G0G9I0G4K0G2G0G3G7GAI0G2H0G2I0I0G3G8I0G4L0G2H0G2L0G2H0G1K0G2H0G8G0G9I0G2K0G2H0G2GCI0G2H0G1I0H0G7GCJ0G2L0G2H0G4L0G2H0G1K0G1H0G8G0GAI0G2K0G2H0G1G8I0G1H0G1I0H0GCK0G2L0G1H0G4L0G2H0G1K0G1H0G8G0GAI0G2K0G4M0G1H0G1I0H0G4K0G1L0G1H0G8L0G2I0G8K0G8G0G8G0GAI0G2K0G4M0G1H0G1I0N0G1L0G1H0G8L0G4I0G8K0G4G0G8G0GAI0G1G8J0G8M0G1H0G1I0N0G1L0G1G0G1M0G4I0G4K0G4G0G8G0GAJ0G6I0G1O0G8G0G1I0O0G8L0G8G2M0G4I0G4K0G2G0G8G0GAJ0G1G8H0G6O0G8G0G1I0O0G8L0G8G4M0G4I0G2K0G1G0G8G0GAK0G7HFG8O0G8G0G1I0O0G8L0H4M0G4I0G2L0H8G0GAX0G8G0G1I0O0G4L0G4G8M0G4I0G1H0GCI0G9H0GAX0G8G0G1I0O0G4L0G3N0G4I0G1G0GFJ0G7H0GAO0G1GEM0G8G0G1I0O0G4L0G2N0G4I0HFN0GAL0GFGBIFGEL0G8G0G1I0O0G2L0G2N0G4G0G7GFG0G4N0GAI0G7G1LFG7IFI0G8G0G1I0O0G2L0G3N0G4G1G8H0G4N0G6H0JFGEG2G0GCG0GCG1G8G1G8H0G8G0G1I0O0G1L0G3N0G4G6I0G2N0G5H0G3HCH0G2G1H0G4G1H0G8H0G8G0G1I0O0G1L0G3G8M0G4G8I0G2N0G5G0G3GCG7I0G2G6H0G4G6H0G8H0G8G0G1I0O0G1M0G8M0H8I0G1N0G5G0GEG0G4I0G2G8H0G4GCH0G8H0G8G0G1I0P0G8L0G7M0G8K0G8M0G4G9G4G0G4I0G3I0G7I0G8H0G8G0G1I0P0G8L0G4GCL0G8K0G6M0G4G9G8G0G4I0G2I0GEI0G8H0G8G0G2I0P0G8L0G2G3GCK0G8K0G3M0G4G5G8G0G4I0G6H0G1G8H0H8H0G8G0G2I0P0G4L0G2G0G3G8J0G8K0G1M0H4G8G0GCI0G4H0G6G8G0G1H8H0G8G0G2I0P0G4L0G1H0G6J0G8S0H4GCG1GCI0G4H0H8G0G3G0G8H0G8G0G2I0P0G2L0G1H0G1J0G8S0H4GCG3G4H0G1G8G0G3G0G8G0G6G0G8H0G8G0G2I0P0G2M0G8H0G8I0G8S0H2GBGEG4H0GEG8G0G6G0G8G0G8G0G8H0G8G0G2I0P0G1M0G8H0G6I0G8S0H2G8G0G4G0G3G0G8G0G4G0G8G3H0G8H0G8G0G4I0P0G1M0G8H0G1G8H0G8O0G1GFH0H2G4G0G7GBGCG0G8G0G8G0GFGCH0G8H0G8G0G4I0Q0G8L0G4I0G6H0G8O0GEG0G8G0G2G1G4H0G4G0G1H0G8J0G1I0G8G0G4I0Q0G8L0G4I0G1G8G0G8O0G8G0G4G0G2G1G4J0G1G0G1K0G1I0G8G0G8I0Q0G4L0G2J0G4P0G1H0G2G0G2G0GAJ0G1G0G1K0G1I0G8G0G8I0Q0G4L0G2J0G3P0G1H0G2G0G1G0GAJ0H1GFK0G1I0G8G0G8I0Q0G2G8K0G2K0GEO0G1H0G2G0G1G0G6K0GEL0G1I0G8G0G8I0Q0G2G4K0G7U0G1H0G2G0G1G0G2R0G1I0G8G1J0Q0G1G4K0G3U0G1H0G2H0G8G3R0G1I0G8G1J0R0GAgG0G1H0G2H0G8G1R0G2H0G1G0G1J0R0GAgG0G1H0G2H0G8G1G8Q0G2H0G1G0G1J0R0G6S0G3M0G1H0G2H0G4G0G8N0G3G8G0G4H0G1G0G2J0gL0G2N0G8G0G2H0G4G0GCN0G6G4G0G4H0G1G0G2J0gL0G2K0G6H0G8G0G2H0G4G0G4H0G7K0G8G2G0G4H0G1G0G2J0gL0G2K0GAH0G8G0G4H0G2G0G6G0G3G9G8J0G8G2G0G8H0G1G0G2J0V0G4O0G4J0G1I0G8G0G4H0G2G0G2G0G2G0G8H0G3H8G2G0G8H0G1G0G4J0U0G3GBO0G4J0G1I0G8G0G4H0G2G0G1G0G4G0G8H0G4G6G8H1I0G1G0G4J0U0GCG0G8N0G4J0G2I0G8G0G4H0G2H0G8G4G0G4GFGCG8G2G8H1I0G2G0G4J0T0G1H0G4N0G4J0G4I0G8G0G4H0G1H0GCG4G0G5G0G6G8G1G8G1G2I0G2G0G4J0T0G1H0G2N0G4J0G8I0G8G0G4I0G8G0G6G4G0G5G0G2G8G1G8G0GAI0G2G0G8J0Q0GEH0G2H0G2N0G4J0G8I0G4G0G4I0G6G0G3G2G0G5G0G2G8G1G8G0GCI0G2G0G8J0P0G3I0G2H0G2K0G8H0G8I0G1J0G4G0G4I0G1G0G1GAG0G5G0G2G8G1G8G0G8I0G4G0G8J0O0G1GCI0G2H0G2K0G8H0G8I0G1J0G4G0G4J0GCG0GAG0G5G0G2G8G0G8G1G8I0G4G0G8J0O0G2J0G2H0G2K0G8H0G8I0G2J0G2G0G4J0G2G0G6G0G5G0G2G8H0G2G8I0G4G1K0O0GCJ0G2H0G2K0G8G0G1J0G2J0G2G0G4J0G2G0G2G0G5G0G1G8H0G4J0G8G1K0N0G3K0G2H0G2K0G4G0G1J0G2J0G2G0G2J0G1G0G3G0G5G0G1G8H0G8J0G8G1K0N0G4K0G2H0G2K0G2G0G2J0G2J0G1G0G1K0G8G1G8G5G0G1G8G0G1K0G8G1K0N0G8K0G2H0G2K0G1G0G2J0G2J0G1H0G8J0G8G1GEG5G0G1G8G0G2J0G1G0G1K0M0G3L0G1H0G2K0G1G0G4J0G2J0G1H0G8J0G4G1G5GBG0G1H0GCJ0G1G0G1K0M0GCL0G1H0G4L0GCG8J0G3G1GEH0G1H0G6J0G4G0G2G7G0G1G0G1K0G2G0G1K0L0G1N0G8G0G4L0G3L0GEG2H0G1H0G1G8I0G4G0G1G3I0G2K0G6G0G1K0L0G2N0G8G0G4M0G1L0G4H0G1I0G4I0G2H0GBGCH0GCK0G8G0G1K0L0G4N0G8G0G8M0G1L0G4I0G8H0G2I0G2H0G6GBG8G7K0G3H0G1K0L0G8N0G4G0G8M0G1L0G8I0G8H0G1G8H0G1H0G3G8G7G8K0GCH0G1K0K0G3O0G4G1N0G1K0G1J0G8I0G6H0G1H0G1G8L0G3I0G1K0K0G2O0G4G1N0G1K0G1J0G4I0G1GCH0G8H0G8K0G1GCI0G1K0K0G2O0G2G1N0G1K0G2J0G4J0G3H0G8H0G6K0GEJ0G1K0K0G3G8N0G2G1N0G1K0G2J0G4K0GCG0G8H0G1J0G7K0G1K0L0G4N0G1G2K0G1H0G1K0G2J0G4K0G3GCG8I0GCH0G7G8K0G1K0L0G3G8M0G1G2K0G1H0G1K0G4J0G4M0G8I0G3HFG8L0G1K0M0G8N0GAK0G2H0G1K0G4J0G4M0G4S0G1K0M0G6N0GAK0G2I0G8J0G4J0G4M0G4J0G1G8M0G1K0M0G1N0GAK0G4I0G8J0G4J0G4M0G2J0G2G6M0G1K0M0G1N0G5K0G8I0G8J0G4J0G4M0G1J0G2G3M0G1K0N0GCG0G1HFG8H0G4GFI0G7J0G4J0G4J0G4N0HFG8G0G4G0G8M0G8J0N0G2G0G6H0G7G8G0G2G0IFG8J0G4J0G2J0G4P0G4G0G8G0G8M0G8J0N0G2G3G8I0G6G0G2O0G4J0G2J0G4P0G3GFG8G0G4M0G8J0N0G1GCL0G1O0G2J0G1J0G8T0G4M0G8J0N0G3M0G1O0G2J0G1I0G7U0G2M0G8J0M0G8G4G8L0G1O0G1K0GFG0GFG8U0G2M0G8J0M0GFH8M0G8N0G1L0GFW0G1G8L0G4J0O0G4M0G8O0G8gJ0G4L0G4J0O0G2M0G4O0GAgJ0G2L0G4J0O0G2M0G4O0G6gJ0G1L0G4J0O0G1M0G2gU0G8K0G4J0O0G1M0G2gU0G4K0G4J0P0G8L0G1gU0G2K0G4J0P0G8L0G1gU0G1G8J0G8J0P0G4L0G1gV0G6J0G8J0P0G4L0G1gV0G1G8I0G8J0P0G4hJ0G7I0G8J0hV0GCH0G8J0hV0G2H0G8J0:hV0G1H0G8J0hW0G8G1K0::hW0G4G1K0^FS^XZ diff --git a/qr.jpg b/qr.jpg index f3db6b3..63daab1 100644 Binary files a/qr.jpg and b/qr.jpg differ diff --git a/ssb-post.sh b/ssb-post.sh index 65df240..e4ccfdf 100755 --- a/ssb-post.sh +++ b/ssb-post.sh @@ -4,9 +4,8 @@ ## ok we need to be passed a number of arguments -## item description = $2 -## image path = $3 -## give to account = $4 +## item description/GIVE to account ID = $2 +## image path/messageID of existing item = $3 if [ -z "$1" ] @@ -49,7 +48,20 @@ fi ## give if [ "$1" == "give" ] then - : + account=$2 + messageID=$3 + + ssb-server publish . <