Contract con_testfarm03


Contract Code


  
1 import currency # For buy function
2
3 #NFTs are always part of a collection.
4
5 collection_name = Variable() # The name of the collection for display
6 collection_owner = Variable() # Only the owner can mint new NFTs for this collection
7 collection_nfts = Hash(default_value=0) # All NFTs of the collection
8 collection_balances = Hash(default_value=0) # All user balances of the NFTs
9 collection_balances_approvals = Hash(default_value=0) # Approval amounts of certain NFTs
10
11 market = Hash(default_value=0) # Stores NFTs up for sale
12 plants = Hash(default_value=0)
13 metadata = Hash()
14 nicknames = Hash()
15
16 random.seed()
17
18 @construct
19 def seed():
20 collection_name.set("Test_plants") # Sets the name
21 collection_owner.set(ctx.caller) # Sets the owner
22 metadata['operator'] = ctx.caller
23 metadata['royalties'] = 0.05
24
25 metadata['growing_season_length'] = 4 #change back to 30
26 metadata['plant price'] = 1 #change back to 100
27 metadata['event_handler'] = 'con_bbf_events_01'
28
29 plants['growing_season'] = False
30 plants['growing_season_start_time'] = now
31 plants['count'] = 0
32 plants['active_generation'] = -1
33
34 nicknames = {}
35
36
37 @export
38 def change_metadata(key: str, new_value: str):
39 assert ctx.caller == metadata['operator'], "only operator can set metadata"
40 metadata[key] = new_value
41
42 # function to mint a new NFT
43 @export
44 def mint_nft(name: str, description: str, ipfs_image_url: str, nft_metadata: dict, amount: int):
45 assert name != "", "Name cannot be empty"
46 assert collection_nfts[name] == 0, "Name already exists"
47 assert amount > 0, "You cannot transfer negative amounts"
48 #assert collection_owner.get() == ctx.caller, "Only the collection owner can mint NFTs"
49
50 collection_nfts[name] = {"description": description, "ipfs_image_url": ipfs_image_url, "nft_metadata": nft_metadata, "amount": amount} # Adds NFT to collection with all details
51 collection_balances[ctx.caller, name] = amount # Mints the NFT
52
53 # standard transfer function
54 @export
55 def transfer(name: str, amount:int, to: str):
56 assert amount > 0, "You cannot transfer negative amounts"
57 assert name != "", "Please specify the name of the NFT you want to transfer"
58 assert collection_balances[ctx.caller, name] >= amount, "You don't have enough NFTs to send"
59
60 collection_balances[ctx.caller, name] -= amount # Removes amount from sender
61 collection_balances[to, name] += amount # Adds amount to receiver
62
63 # allows other account to spend on your behalf
64 @export
65 def approve(amount: int, name: str, to: str):
66 assert amount > 0, "Cannot approve negative amounts"
67
68 collection_balances_approvals[ctx.caller, to, name] += amount # Approves certain amount for spending by another account
69
70 # transfers on your behalf
71 @export
72 def transfer_from(name:str, amount:int, to: str, main_account: str):
73 assert amount > 0, 'Cannot send negative balances!'
74
75 assert collection_balances_approvals[main_account, to, name] >= amount, "Not enough NFTs approved to send! You have {} and are trying to spend {}"\
76 .format(collection_balances_approvals[main_account, to, name], amount)
77 assert collection_balances[main_account, name] >= amount, "Not enough NFTs to send!"
78
79 collection_balances_approvals[main_account, to, name] -= amount # Removes Approval Amount
80 collection_balances[main_account, name] -= amount # Removes amount from sender
81
82 collection_balances[to, name] += amount # Adds amount to receiver
83
84 # put nft up for sale in collection market
85 @export
86 def sell_nft(name: str, amount: int, currency_price: float):
87 assert amount > 0, 'Cannot sell negative NFT amount'
88 assert currency_price > 0, 'Cannot sell for negative balances!'
89 assert collection_balances[ctx.caller, name] > 0,'You dont own that amount of the NFT'
90
91 collection_balances[ctx.caller, name] -= amount # Removes amount from seller
92 market[ctx.caller, name] = {"amount": amount, "price": currency_price} # Adds amount to market
93
94 # buy nft in collection market
95 @export
96 def buy_nft(name: str, seller: str, amount:int):
97 assert amount > 0, 'Cannot buy negative NFT amount'
98 assert market[seller, name]["amount"] >= amount, 'Not enough for sale'
99 royalties = metadata['royalties']
100
101 currency.transfer_from(amount=market[seller, name]["price"] * amount * (1-royalties), to=seller, main_account=ctx.caller) # Transfers TAU (minus royalties) to Seller
102 currency.transfer_from(amount=market[seller, name]["price"] * amount * royalties, to=collection_owner.get(), main_account=ctx.caller) # Transfers TAU royalties to creator
103
104 old_market_entry = market[ctx.caller, name] # Saves the old market entry for overwrite
105 market[ctx.caller, name] = {"amount": old_market_entry["amount"] - amount, "price": currency_price} # Removing the amount sold of market entry
106
107 collection_balances[ctx.caller, name] += amount # Adds amount bought to buyer
108
109 @export
110 def start_growing_season():
111 assert collection_owner.get() == ctx.caller, "Only the owner can start a growing season."
112 grow_season = plants['growing_season']
113 assert grow_season == False, "It is already growing season."
114 growing_season_length = metadata['growing_season_length']
115 active_gen = plants['active_generation']
116 active_gen += 1
117 plants['growing_season'] = True
118 plants['growing_season_start_time'] = now
119 plants['growing_season_end_time'] = now + datetime.timedelta(days = growing_season_length)
120 plants['finalize_time'] = now + datetime.timedelta(days = growing_season_length + 3)
121 plants['active_generation'] = active_gen
122 plants[active_gen, 'total_berries'] = 0
123 plants[active_gen, 'total_tau'] = 0
124 plants[active_gen,'stale_claim_time'] = now + datetime.timedelta(days = growing_season_length + 30)
125
126
127 @export
128 def buy_plant():
129 assert plants['growing_season'] == True, 'The growing season has not started, so you cannot buy a plant.'
130 assert plants['growing_season_end_time'] >= now + datetime.timedelta(days = 25), "It's too far into the growing season and you cannot buy a plant now."
131 plant_generation = plants['active_generation']
132
133 plant_data = {
134 #"drought_resist": (random.randint(0, 25)),
135 #"crop_yield": (random.randint(90, 110)),
136 #"bug_resist": (random.randint(0, 25)),
137 #"photosynthesis_rate": (random.randint(90, 110)),
138 "current_water": (random.randint(50, 80)),
139 "current_bugs" : (random.randint(5, 25)),
140 "current_photosynthesis" : 0,
141 "current_nutrients" : (random.randint(50, 80)),
142 "current_weeds" : (random.randint(5, 25)),
143 "current_toxicity" : 0,
144 "current_weather" : 1,
145 "last_interaction" : now,
146 "last_daily" : now,
147 "last_calc" : now,
148 "alive" : True,
149 "generation" : plant_generation,
150 "last_squash_weed" : (now + datetime.timedelta(days = -1)),
151 "last_grow_light" : (now + datetime.timedelta(days = -1)),
152 "burn_amount" : 0
153 }
154
155 plant_calc_data = {
156 "previous_water": plant_data["current_water"],
157 "previous_bugs" : plant_data["current_bugs"],
158 "previous_nutrients" : plant_data["current_nutrients"],
159 "previous_weeds" : plant_data["current_weeds"],
160 "total_water": 0,
161 "total_bugs" : 0,
162 "total_nutrients" : 0,
163 "total_weeds": 0
164 }
165
166 p_count = plants['count'] + 1
167 name = f"Gen_{plant_generation}_{p_count}"
168 payment(plant_generation, metadata['plant price'])
169 mint_nft(name,'placeholder description','placeholder image URL',plant_data,1)
170 collection_nfts[name,'plant_calc_data'] = plant_calc_data
171 plants['count'] = p_count
172
173 def action_setup(plant_generation : int, plant_number : int):
174 active_generation = plants['active_generation']
175 assert plant_generation == active_generation, f'The plant you are trying to interact with is not part of the current generation. The current generation is {active_generation}.'
176 name = f'Gen_{plant_generation}_{plant_number}'
177 assert collection_balances[ctx.caller, name] == 1, "You do not own this plant."
178 assert now <= plants['growing_season_end_time'], 'The growing season is not active, so you cannot interact with your plant.'
179 if ctx.caller.startswith('con_'): return
180 plant_name = collection_nfts[name]
181 plant_data = plant_name['nft_metadata']
182 assert plant_data["alive"] == True, 'Your plant is dead due to neglect and you must buy a new plant to try again. Try not to kill it too.'
183
184 #interaction idle check. If idle too long, plant gets penalized.
185 if now > plant_data['last_interaction'] + datetime.timedelta(hours = 12):
186 plant_data["current_water"] -= (random.randint(5, 15))
187 plant_data["current_bugs"] += (random.randint(5, 15))
188 plant_data["current_nutrients"] -= (random.randint(5, 15))
189 plant_data["current_weeds"] += (random.randint(5, 15))
190
191 plant_data = daily_conditions(plant_data)
192 plant_data = totalizer_calc(plant_data,name)
193
194 if (random.randint(1, 10)) == 10 : #10% chance of an event happening
195 event_contract = importlib.import_module(metadata['event_handler'])
196 plant_data = event_contract.event(plant_data)
197
198 plant_data = dead_check(plant_data)
199 plant_data['last_interaction'] = now #resets the interaction time
200
201 plant_all = {
202 'plant_name' : plant_name,
203 'plant_data' : plant_data,
204 'name' : name
205 }
206
207 return plant_all
208
209 def daily_conditions(plant_data):
210 while now - plant_data["last_daily"] > datetime.timedelta(days = 1): #Loops through to calculate changes to plant if it's been more than a day since the last day's changes. Does multiple days worth too if needed
211 current_weather = random.randint(1, 3) # 1=sunny 2=cloudy 3=rainy
212 if current_weather == 1:
213 plant_data["current_water"] -= (random.randint(10, 20)) #how much water is lost each sunny day
214 plant_data["current_photosynthesis"] += (random.randint(4, 6)) #How much photosynthesis increases each sunny day
215 if current_weather == 2:
216 plant_data["current_water"] -= (random.randint(5, 15)) #how much water is lost each cloudy day
217 plant_data["current_photosynthesis"] += (random.randint(2, 4)) #How much photosynthesis increases each cloudy day
218 if current_weather == 3:
219 plant_data["current_water"] += (random.randint(5, 25)) #how much water is gained each rainy day
220 plant_data["current_photosynthesis"] += (random.randint(1, 2)) #How much photosynthesis increases each rainy day
221
222 plant_data["current_bugs"] += (random.randint(3, 15)) #how many bugs are added each day
223 plant_data["current_nutrients"] -= (random.randint(5, 10)) #how many nutrients are consumed each day
224 plant_data["current_weeds"] += (random.randint(3, 15)) #how many weeds grow each day
225 plant_data["last_daily"] += datetime.timedelta(days = 1)
226 plant_data["current_weather"] = current_weather
227 plant_data['current_toxicity'] -= (random.randint(0, 2))
228
229 if plant_data['current_water'] > 100 : #water can't be above 1
230 plant_data['current_water'] = 100
231
232 if plant_data["current_photosynthesis"] > 100 :
233 plant_data["burn_amount"] += (plant_data["current_photosynthesis"]-100)
234 plant_data["current_photosynthesis"] = 100
235
236 return plant_data
237
238 def totalizer_calc(plant_data,name):
239 if now > plant_data['last_calc'] + datetime.timedelta(hours = 3):
240 delta = now - plant_data['last_calc']
241 delta_d = (delta.seconds / 86400)
242 plant_calc_data = collection_nfts[name,'plant_calc_data']
243 #This sections performs an integral on the various properties for use in determining total berries produced.
244 plant_calc_data["total_water"] += (delta_d**2*((plant_calc_data["current_water"]/100-plant_calc_data["previous_water"]/100)/(delta_d))/2)+plant_calc_data["previous_water"]/100*delta_d
245 plant_calc_data["total_bugs"] += (delta_d**2*(((1-plant_calc_data["current_bugs"]/100)-(1-plant_calc_data["previous_bugs"]/100))/(delta_d))/2)+(1-plant_calc_data["previous_bugs"]/100)*delta_d
246 plant_calc_data["total_nutrients"] += (delta_d**2*((plant_calc_data["current_nutrients"]/100-plant_calc_data["previous_nutrients"]/100)/(delta_d))/2)+plant_calc_data["previous_nutrients"]/100*delta_d
247 plant_calc_data["total_weeds"] += (delta_d**2*(((1-plant_calc_data["current_weeds"]/100)-(1-plant_calc_data["previous_weeds"]/100))/(delta_d))/2)+(1-plant_calc_data["previous_weeds"]/100)*delta_d
248 collection_nfts[name,'plant_calc_data'] = plant_calc_data
249 plant_data['last_calc'] = now
250
251 return plant_data
252
253 def dead_check(plant_data):
254 if plant_data["current_toxicity"] >= 100 or plant_data["current_bugs"] >= 100 or plant_data["current_weeds"] >= 100:
255 plant_data["alive"] = False
256 if plant_data["current_water"] <= 0 or plant_data["current_nutrients"] <= 0:
257 plant_data["alive"] = False
258 return plant_data
259
260 @export
261 def water(plant_generation : int, plant_number : int, num_times : int = 1):
262 plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
263 plant_data = plant_all['plant_data']
264 plant_name = plant_all['plant_name']
265 name = plant_all['name']
266
267 for x in range(0, num_times):
268 plant_data['current_water'] += (random.randint(5, 15))
269 if plant_data['current_water'] > 100 : #water can't be above 1
270 plant_data['current_water'] = 100
271
272 plant_name['nft_metadata'] = plant_data
273 collection_nfts[name] = plant_name
274
275 @export
276 def squash_bugs(plant_generation : int, plant_number : int):
277 plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
278 plant_data = plant_all['plant_data']
279 plant_name = plant_all['plant_name']
280 name = plant_all['name']
281
282 t_delta = plant_data["last_squash_weed"] + datetime.timedelta(minutes = 5)
283 assert now > t_delta, f"You are still squashing bugs or pulling weeds. Try again at {t_delta}."
284
285 plant_data['current_bugs'] -= (random.randint(2, 5))
286 if plant_data['current_bugs'] < 0 :
287 plant_data['current_bugs'] = 0
288
289 plant_data["last_squash_weed"] = now
290 plant_name['nft_metadata'] = plant_data
291 collection_nfts[name] = plant_name
292
293 @export
294 def spray_bugs(plant_generation : int, plant_number : int):
295 plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
296 plant_data = plant_all['plant_data']
297 plant_name = plant_all['plant_name']
298 name = plant_all['name']
299
300 plant_data['current_toxicity'] += (random.randint(1, 3))
301
302 plant_data['current_bugs'] -= (random.randint(10, 20))
303 if plant_data['current_bugs'] < 0 :
304 plant_data['current_bugs'] = 0
305
306 payment(plant_generation, 5)
307 plant_name['nft_metadata'] = plant_data
308 collection_nfts[name] = plant_name
309
310 @export
311 def grow_lights(plant_generation : int, plant_number : int):
312 plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
313 plant_data = plant_all['plant_data']
314 plant_name = plant_all['plant_name']
315 name = plant_all['name']
316
317 t_delta = plant_data["last_grow_light"] + datetime.timedelta(days = 1)
318 assert now > t_delta, f"You have used a grow light or shade too recently. Try again at {t_delta}."
319
320 payment(plant_generation, 5)
321 plant_data['current_photosynthesis'] += (random.randint(3, 5))
322 plant_data["last_grow_light"] = now
323
324 if plant_data["current_photosynthesis"] > 100 :
325 plant_data["burn_amount"] += (plant_data["current_photosynthesis"]-100)
326 plant_data["current_photosynthesis"] = 100
327
328 plant_name['nft_metadata'] = plant_data
329 collection_nfts[name] = plant_name
330
331 @export
332 def shade_plant(plant_generation : int, plant_number : int):
333 plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
334 plant_data = plant_all['plant_data']
335 plant_name = plant_all['plant_name']
336 name = plant_all['name']
337
338 t_delta = plant_data["last_grow_light"] + datetime.timedelta(days = 1)
339 assert now > t_delta, f"You have used a grow light or shade too recently. Try again at {t_delta}."
340
341 plant_data['current_photosynthesis'] -= (random.randint(3, 5))
342 plant_data["last_grow_light"] = now
343
344 if plant_data["current_photosynthesis"] > 100 :
345 plant_data["burn_amount"] += (plant_data["current_photosynthesis"]-100)
346 plant_data["current_photosynthesis"] = 100
347
348 plant_name['nft_metadata'] = plant_data
349 collection_nfts[name] = plant_name
350
351 @export
352 def fertilize(plant_generation : int, plant_number : int, num_times : int = 1): #increases nutrients of the plant
353 plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
354 plant_data = plant_all['plant_data']
355 plant_name = plant_all['plant_name']
356 name = plant_all['name']
357
358 payment(plant_generation, 2*num_times)
359 for x in range(0, num_times):
360 plant_data['current_nutrients'] += (random.randint(3, 5))
361
362 if plant_data['current_nutrients'] > 100 :
363 plant_data["burn_amount"] += (plant_data['current_nutrients']-100)
364 plant_data['current_nutrients'] = 100
365
366 plant_name['nft_metadata'] = plant_data
367 collection_nfts[name] = plant_name
368
369 @export
370 def pull_weeds(plant_generation : int, plant_number : int): #reduces current weeds in plant and takes 5 minutes to do. Share's a timer.
371
372 plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
373 plant_data = plant_all['plant_data']
374 plant_name = plant_all['plant_name']
375 name = plant_all['name']
376
377 t_delta = plant_data["last_squash_weed"] + datetime.timedelta(minutes = 5)
378 assert now > t_delta, f"You are still squashing bugs or pulling weeds. Try again at {t_delta}."
379
380 plant_data['current_weeds'] -= (random.randint(2, 5))
381 if plant_data['current_weeds'] < 0 :
382 plant_data['current_weeds'] = 0
383
384 plant_data["last_squash_weed"] = now
385 plant_name['nft_metadata'] = plant_data
386 collection_nfts[name] = plant_name
387
388 @export
389 def spray_weeds(plant_generation : int, plant_number : int):
390 plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
391 plant_data = plant_all['plant_data']
392 plant_name = plant_all['plant_name']
393 name = plant_all['name']
394
395 plant_data['current_toxicity'] += (random.randint(1, 3))
396
397 plant_data['current_weeds'] -= (random.randint(10, 20))
398 if plant_data['current_weeds'] < 0 :
399 plant_data['current_weeds'] = 0
400
401 plant_name['nft_metadata'] = plant_data
402 collection_nfts[name] = plant_name
403
404 @export
405 def finalize_plant(plant_generation : int, plant_number : int): #Finalizes your plant at the end of growing season to deterimine your berry yield.
406 assert plant_generation == active_generation, f'The plant you are trying to interact with is not part of the current generation. The current generation is {active_generation}.'
407 name = f'Gen_{plant_generation}_{plant_number}'
408 assert collection_balances[ctx.caller, name] == 1, "You do not own this plant."
409 assert collection_nfts[name,'finalized'] == False, 'This plant has already been finalized.'
410 end_time = plants['growing_season_end_time']
411 assert now <= plants['finalize_time'] and now >= end_time, 'It is not time to finalize your plant.'
412 if ctx.caller.startswith('con_'): return
413 plant_name = collection_nfts[name]
414 plant_data = plant_name['nft_metadata']
415 assert plant_data["alive"] == True, 'Your plant is dead due to neglect and you must buy a new plant to try again. Try not to kill it too.'
416
417 delta = end_time - plant_data['last_calc']
418 delta_d = (delta.seconds / 86400)
419
420 plant_calc_data = collection_nfts[name,'plant_calc_data']
421 #This sections performs an integral on the various properties for use in determining total berries produced.
422 plant_calc_data["total_water"] += (delta_d**2*((plant_calc_data["current_water"]/100-plant_calc_data["previous_water"]/100)/(delta_d))/2)+plant_calc_data["previous_water"]/100*delta_d
423 plant_calc_data["total_bugs"] += (delta_d**2*(((1-plant_calc_data["current_bugs"]/100)-(1-plant_calc_data["previous_bugs"]/100))/(delta_d))/2)+(1-plant_calc_data["previous_bugs"]/100)*delta_d
424 plant_calc_data["total_nutrients"] += (delta_d**2*((plant_calc_data["current_nutrients"]/100-plant_calc_data["previous_nutrients"]/100)/(delta_d))/2)+plant_calc_data["previous_nutrients"]/100*delta_d
425 plant_calc_data["total_weeds"] += (delta_d**2*(((1-plant_calc_data["current_weeds"]/100)-(1-plant_calc_data["previous_weeds"]/100))/(delta_d))/2)+(1-plant_calc_data["previous_weeds"]/100)*delta_d
426
427 collection_nfts[name,'plant_calc_data'] = plant_calc_data
428
429 plant_data['last_calc'] = now
430 plant_name['nft_metadata'] = plant_data
431 collection_nfts[name] = plant_name
432
433 length = metadata['growing_season_length']
434 berries = int(1000 * ((plant_calc_data["total_water"]*plant_calc_data["total_bugs"]*plant_calc_data["total_nutrients"]*plant_calc_data["total_weeds"])/(length**4))*(1-plant_data['current_toxicity']/100)*(plant_data["current_photosynthesis"]/100)*(1-plant_data["burn_amount"]/100))
435 collection_nfts[name,'berries'] = berries
436 collection_nfts[name,'final_score'] = berries
437 plants[plant_generation,'total_berries'] += berries
438 collection_nfts[name,'finalized'] == True
439
440 def sell_berries(plant_generation : int, plant_number : int): #redeem berries for TAU. Must be done after plant finalize time is over.
441 name = f'Gen_{plant_generation}_{plant_number}'
442 assert collection_balances[ctx.caller, name] == 1, "You do not own this plant."
443 berries = collection_nfts[name,'berries']
444 assert berries > 0, "You don't have any berries to sell."
445 assert now >= plants['finalize_time'], f"You can't sell yet. Try again after {plants['finalize_time']} but do not wait too long."
446 sell_price = plants[plant_generation, 'total_tau'] / plants[plant_generation,'total_berries']
447 proceeds = sell_price * berries
448 currency.transfer(amount=proceeds, to=ctx.caller)
449 collection_nfts[name,'berries'] = 0
450 plants[plant_generation, 'total_tau'] -= proceeds
451
452 def payment(plant_generation, amount): #used to process payments
453 currency.transfer_from(amount=amount*0.95, to=ctx.this, main_account=ctx.caller)
454 currency.transfer_from(amount=amount*0.05, to=metadata['operator'], main_account=ctx.caller)
455 plants[plant_generation, 'total_tau'] += amount
456
457 @export
458 def manual_reward_add(plant_generation : int, amount : int): #used to manually add more tau to the prize pool
459 currency.transfer_from(amount=amount, to=ctx.this, main_account=ctx.caller)
460 plants[plant_generation, 'total_tau'] += amount
461
462 @export
463 def stale_claims(plant_generation : int): #used by the operator to claim tau from a plant generation that ended at least 30 days prior. This allows players aple time to sell their berries
464 assert metadata['operator'] == ctx.caller, "Only the operator can claim stale tau."
465 stale_claim_time = plants[plant_generation,'stale_claim_time']
466 assert now >= stale_claim_time, f"The tau is not stale yet and cannot be claimed. Try again after {stale_claim_time}"
467 stale_tau = plants[plant_generation, 'total_tau']
468 assert stale_tau > 0, "There is no stale tau to claim."
469 currency.transfer(amount=stale_tau, to=ctx.caller)
470
471 @export
472 def nickname(plant_generation : int, plant_number : int, nick : str):
473 name = f'Gen_{plant_generation}_{plant_number}'
474 assert collection_balances[ctx.caller, name] == 1, "You do not own this plant."
475 assert bool(collection_nfts[nick]) == False, "This nickname already exists."
476 payment(plant_generation, 2)
477 collection_nfts[nick] = [plant_generation , plant_number]
478
479 @export
480 def nickname_interaction(nickname : str, function_name :str):
481 nick = collection_nfts[nickname]
482
483 function_names = {
484 'water' : water,
485 'squash_bugs' : squash_bugs,
486 'spray_bugs' : spray_bugs,
487 'grow_lights' : grow_lights,
488 'shade_plant' : shade_plant,
489 'fertilize' : fertilize,
490 'pull_weeds' : pull_weeds,
491 'spray_weeds' : spray_weeds
492 }
493
494 function_names[function_name](nick[0],nick[1])
495
496 @export
497 def emergency_withdraw(amount:float): #temporary function used in testing. will be removed from final contract.
498 assert metadata['operator'] == ctx.caller, "Only the operator can claim tau."
499 currency.transfer(amount=amount, to=ctx.caller)

Byte Code

e300000000000000000000000007000000400000007302030000640064016c005a0065016402640364048d025a0265016402640564048d025a03650464006402640664078d035a05650464006402640864078d035a06650464006402640964078d035a07650464006402640a64078d035a08650464006402640b64078d035a0965046402640c64048d025a0a65046402640d64048d025a0b650c6a0d83000100640e640f84005a0e650f640283016510651064109c0264116412840483015a11650f640283016510651065106512651364139c0564146415840483015a14650f6402830165106513651064169c0364176418840483015a15650f6402830165136510651064199c03641a641b840483015a16650f640283016510651365106510641c9c04641d641e840483015a17650f64028301651065136518641f9c0364206421840483015a19650f6402830165106510651364229c0364236424840483015a1a650f6402830164256426840083015a1b650f6402830164276428840083015a1c6513651364299c02642a642b84045a1d642c642d84005a1e642e642f84005a1f6430643184005a20650f64028301645965136513651364339c0364346435840583015a21650f640283016513651364299c0264366437840483015a22650f640283016513651364299c0264386439840483015a23650f640283016513651364299c02643a643b840483015a24650f640283016513651364299c02643c643d840483015a25650f64028301645a65136513651364339c03643e643f840583015a26650f640283016513651364299c0264406441840483015a27650f640283016513651364299c0264426443840483015a28650f640283016513651364299c0264446445840483015a296513651364299c026446644784045a2a6448644984005a2b650f6402830165136513644a9c02644b644c840483015a2c650f640283016513644d9c01644e644f840483015a2d650f6402830165136513651064509c0364516452840483015a2e650f640283016510651064539c0264546455840483015a2f650f64028301651864569c0164576458840483015a3064015300295be9000000004eda0e636f6e5f746573746661726d3033da0f636f6c6c656374696f6e5f6e616d652902da08636f6e7472616374da046e616d65da10636f6c6c656374696f6e5f6f776e6572da0f636f6c6c656374696f6e5f6e6674732903da0d64656661756c745f76616c756572040000007205000000da13636f6c6c656374696f6e5f62616c616e636573da1d636f6c6c656374696f6e5f62616c616e6365735f617070726f76616c73da066d61726b6574da06706c616e7473da086d65746164617461da096e69636b6e616d6573630000000000000000010000000300000043000000736c00000074006a0164018301010074026a0174036a048301010074036a04740564023c00740664038301740564043c006405740564063c006407740564083c0064097405640a3c00640b7407640c3c0074087407640d3c00640e7407640f3c006411740764103c0069007d006400530029124eda0b546573745f706c616e7473da086f70657261746f727a04302e3035da09726f79616c74696573e904000000da1567726f77696e675f736561736f6e5f6c656e677468e9010000007a0b706c616e74207072696365da11636f6e5f6262665f6576656e74735f3031da0d6576656e745f68616e646c657246da0e67726f77696e675f736561736f6eda1967726f77696e675f736561736f6e5f73746172745f74696d657201000000da05636f756e74da116163746976655f67656e65726174696f6ee9ffffffff2909da115f5f636f6c6c656374696f6e5f6e616d65da03736574da125f5f636f6c6c656374696f6e5f6f776e6572da03637478da0663616c6c6572da0a5f5f6d65746164617461da07646563696d616cda085f5f706c616e7473da036e6f772901da0b5f5f6e69636b6e616d6573a9007226000000da00da045f5f5f5f12000000731800000000010a010c010a010c01080108010801080108010801080172280000002902da036b6579da096e65775f76616c7565630200000000000000020000000300000043000000732200000074006a017402640119006b02731674036402830182017c0174027c003c006400530029034e72100000007a1e6f6e6c79206f70657261746f722063616e20736574206d657461646174612904721f00000072200000007221000000da0e417373657274696f6e4572726f7229027229000000722a000000722600000072260000007227000000da0f6368616e67655f6d65746164617461210000007306000000000210010601722c00000029057205000000da0b6465736372697074696f6eda0e697066735f696d6167655f75726cda0c6e66745f6d65746164617461da06616d6f756e7463050000000000000005000000050000004300000073580000007c0064016b037310740064028301820174017c00190064036b02732474006404830182017c0464036b04733474006405830182017c017c027c037c0464069c0474017c003c007c04740274036a047c0066023c006400530029074e72270000007a144e616d652063616e6e6f7420626520656d70747972010000007a134e616d6520616c7265616479206578697374737a24596f752063616e6e6f74207472616e73666572206e6567617469766520616d6f756e74732904722d000000722e000000722f00000072300000002905722b000000da115f5f636f6c6c656374696f6e5f6e667473da155f5f636f6c6c656374696f6e5f62616c616e636573721f000000722000000029057205000000722d000000722e000000722f0000007230000000722600000072260000007227000000da086d696e745f6e667428000000730c0000000003100114011001020110017233000000290372050000007230000000da02746f63030000000000000003000000040000004300000073680000007c0164016b04731074006402830182017c0064036b0373207400640483018201740174026a037c00660219007c016b05733a7400640583018201740174026a037c006602050019007c01380003003c0074017c027c006602050019007c01370003003c006400530029064e72010000007a24596f752063616e6e6f74207472616e73666572206e6567617469766520616d6f756e747372270000007a37506c65617365207370656369667920746865206e616d65206f6620746865204e465420796f752077616e7420746f207472616e736665727a22596f7520646f6e2774206861766520656e6f756768204e46547320746f2073656e642904722b0000007232000000721f00000072200000002903720500000072300000007234000000722600000072260000007227000000da087472616e7366657233000000730c0000000002100110010c010e01160172350000002903723000000072050000007234000000630300000000000000030000000400000043000000732c0000007c0064016b0473107400640283018201740174026a037c027c016603050019007c00370003003c006400530029034e72010000007a1f43616e6e6f7420617070726f7665206e6567617469766520616d6f756e74732904722b000000da1f5f5f636f6c6c656374696f6e5f62616c616e6365735f617070726f76616c73721f00000072200000002903723000000072050000007234000000722600000072260000007227000000da07617070726f76653d00000073040000000002100172370000002904720500000072300000007234000000da0c6d61696e5f6163636f756e7463040000000000000004000000060000004300000073960000007c0164016b047310740064028301820174017c037c027c00660319007c016b05733c740064036a0274017c037c027c00660319007c0183028301820174037c037c00660219007c016b057354740064048301820174017c037c027c006603050019007c01380003003c0074037c037c006602050019007c01380003003c0074037c027c006602050019007c01370003003c006400530029054e72010000007a1e43616e6e6f742073656e64206e656761746976652062616c616e636573217a484e6f7420656e6f756768204e46547320617070726f76656420746f2073656e642120596f752068617665207b7d20616e642061726520747279696e6720746f207370656e64207b7d7a184e6f7420656e6f756768204e46547320746f2073656e64212904722b0000007236000000da06666f726d6174723200000029047205000000723000000072340000007238000000722600000072260000007227000000da0d7472616e736665725f66726f6d430000007312000000000210010c010c0114010a010e0116011401723a000000290372050000007230000000da0e63757272656e63795f707269636563030000000000000003000000040000004300000073680000007c0164016b04731074006402830182017c0264016b0473207400640383018201740174026a037c006602190064016b04733a7400640483018201740174026a037c006602050019007c01380003003c007c017c0264059c02740474026a037c0066023c006400530029064e72010000007a1f43616e6e6f742073656c6c206e65676174697665204e465420616d6f756e747a2243616e6e6f742073656c6c20666f72206e656761746976652062616c616e636573217a23596f7520646f6e74206f776e207468617420616d6f756e74206f6620746865204e465429027230000000da0570726963652905722b0000007232000000721f0000007220000000da085f5f6d61726b6574290372050000007230000000723b000000722600000072260000007227000000da0873656c6c5f6e667450000000730c0000000002100110010c010e011601723e00000029037205000000da0673656c6c6572723000000063030000000000000005000000050000004300000073cc0000007c0264016b047310740064028301820174017c017c0066021900640319007c026b05732c74006404830182017402640519007d0374036a0474017c017c0066021900640619007c02140064077c03180014007c0174056a0664088d03010074036a0474017c017c0066021900640619007c0214007c03140074076a08830074056a0664088d030100740174056a067c00660219007d047c04640319007c021800740964099c02740174056a067c0066023c00740a74056a067c006602050019007c02370003003c0064005300290a4e72010000007a1e43616e6e6f7420627579206e65676174697665204e465420616d6f756e7472300000007a134e6f7420656e6f75676820666f722073616c657211000000723c0000007214000000290372300000007234000000723800000029027230000000723c000000290b722b000000723d0000007221000000da0863757272656e6379723a000000721f0000007220000000721e000000da03676574723b000000723200000029057205000000723f00000072300000007211000000da106f6c645f6d61726b65745f656e747279722600000072260000007227000000da076275795f6e66745a0000007316000000000210011c01080116011401160114010e0106011601724300000063000000000000000003000000040000004300000073c200000074006a01830074026a036b02731674046401830182017405640219007d007c0064036b02732e74046404830182017406640519007d017405640619007d027c02640737007d026408740564023c007407740564093c00740774086a097c01640a8d0117007405640b3c00740774086a097c01640c1700640a8d0117007405640d3c007c02740564063c00640e74057c02640f66023c00640e74057c02641066023c00740774086a097c0164111700640a8d01170074057c02641266023c006400530029134e7a2a4f6e6c7920746865206f776e65722063616e20737461727420612067726f77696e6720736561736f6e2e7217000000467a1d497420697320616c72656164792067726f77696e6720736561736f6e2e7213000000721a00000072140000005472180000002901da0464617973da1767726f77696e675f736561736f6e5f656e645f74696d65e903000000da0d66696e616c697a655f74696d657201000000da0d746f74616c5f62657272696573da09746f74616c5f746175e91e000000da107374616c655f636c61696d5f74696d65290a721e0000007241000000721f0000007220000000722b000000722300000072210000007224000000da086461746574696d65da0974696d6564656c74612903da0b67726f775f736561736f6e7213000000da0a6163746976655f67656e722600000072260000007227000000da1473746172745f67726f77696e675f736561736f6e690000007324000000000206011001080110010801080108010801080106010e010601120108010c010c0106017250000000630000000000000000050000001100000043000000731001000074006401190064026b0273147401640383018201740064041900740274036a04640564068d0117006b05733474016407830182017400640819007d0074056a066409640a830274056a06640b64058302640c74056a066409640a830274056a06640b64058302640c640d74027402740264027c00740274036a04641b64068d011700740274036a04641c64068d011700640c640e9c0f7d017c01640f19007c01641019007c01641119007c0164121900640c640c640c640c64139c087d02740064141900640d17007d0364157c009b0064167c039b009d047d0474077c007408641719008302010074097c04641864197c01640d830501007c02740a7c04641a66023c007c03740064143c0064005300291d4e7217000000547a3e5468652067726f77696e6720736561736f6e20686173206e6f7420737461727465642c20736f20796f752063616e6e6f7420627579206120706c616e742e7245000000e919000000290172440000007a444974277320746f6f2066617220696e746f207468652067726f77696e6720736561736f6e20616e6420796f752063616e6e6f7420627579206120706c616e74206e6f772e721a000000e932000000e950000000e90500000072010000007214000000290fda0d63757272656e745f7761746572da0c63757272656e745f62756773da1663757272656e745f70686f746f73796e746865736973da1163757272656e745f6e75747269656e7473da0d63757272656e745f7765656473da1063757272656e745f746f786963697479da0f63757272656e745f77656174686572da106c6173745f696e746572616374696f6eda0a6c6173745f6461696c79da096c6173745f63616c63da05616c697665da0a67656e65726174696f6eda106c6173745f7371756173685f77656564da0f6c6173745f67726f775f6c69676874da0b6275726e5f616d6f756e7472550000007256000000725800000072590000002908da0e70726576696f75735f7761746572da0d70726576696f75735f62756773da1270726576696f75735f6e75747269656e7473da0e70726576696f75735f7765656473da0b746f74616c5f7761746572da0a746f74616c5f62756773da0f746f74616c5f6e75747269656e7473da0b746f74616c5f77656564737219000000da0447656e5fda015f7a0b706c616e742070726963657a17706c616365686f6c646572206465736372697074696f6e7a15706c616365686f6c64657220696d6167652055524cda0f706c616e745f63616c635f64617461721b000000721b000000290b7223000000722b0000007224000000724c000000724d000000da0672616e646f6dda0772616e64696e74da095f5f7061796d656e747221000000723300000072310000002905da10706c616e745f67656e65726174696f6eda0a706c616e745f64617461726e000000da07705f636f756e747205000000722600000072260000007227000000da096275795f706c616e747f0000007334000000000206010e010c010e01060108010a010c010a010e01060104011001140106010601080108010a010c0110010e01080108010c01727500000029027272000000da0c706c616e745f6e756d62657263020000000000000008000000060000004300000073680100007400640119007d027c007c026b027320740164027c029b0064039d038301820164047c009b0064057c019b009d047d03740274036a047c036602190064066b02734a740164078301820174057400640819006b01735e740164098301820174036a046a06640a8301726e6400530074077c0319007d047c04640b19007d057c05640c1900640d6b0273927401640e8301820174057c05640f190074086a09641064118d0117006b049001720c7c05641205001900740a6a0b641364148302380003003c007c05641505001900740a6a0b641364148302370003003c007c05641605001900740a6a0b641364148302380003003c007c05641705001900740a6a0b641364148302370003003c00740c7c0583017d05740d7c057c0383027d05740a6a0b64066418830264186b0290017248740e6a0f74106419190083017d067c066a117c0583017d0574127c0583017d0574057c05640f3c007c047c057c03641a9c037d077c075300291b4e721a0000007a6b54686520706c616e7420796f752061726520747279696e6720746f20696e7465726163742077697468206973206e6f742070617274206f66207468652063757272656e742067656e65726174696f6e2e205468652063757272656e742067656e65726174696f6e20697320da012e726c000000726d00000072140000007a1a596f7520646f206e6f74206f776e207468697320706c616e742e72450000007a495468652067726f77696e6720736561736f6e206973206e6f74206163746976652c20736f20796f752063616e6e6f7420696e746572616374207769746820796f757220706c616e742eda04636f6e5f722f000000725f000000547a64596f757220706c616e7420697320646561642064756520746f206e65676c65637420616e6420796f75206d757374206275792061206e657720706c616e7420746f2074727920616761696e2e20547279206e6f7420746f206b696c6c20697420746f6f2e725c000000e90c0000002901da05686f75727372550000007254000000e90f000000725600000072580000007259000000e90a00000072160000002903da0a706c616e745f6e616d657273000000720500000029137223000000722b0000007232000000721f00000072200000007224000000da0a737461727473776974687231000000724c000000724d000000726f0000007270000000da125f5f6461696c795f636f6e646974696f6e73da105f5f746f74616c697a65725f63616c63da09696d706f72746c6962da0d696d706f72745f6d6f64756c657221000000da056576656e74da0c5f5f646561645f636865636b290872720000007276000000721a0000007205000000727d0000007273000000da0e6576656e745f636f6e7472616374da09706c616e745f616c6c722600000072260000007227000000da0e5f5f616374696f6e5f73657475709d000000733800000000010801180110010c010e010e0106010c0104010801080106010e011a01180118011801180108010a0112010e010a0108010801040108017287000000630100000000000000020000000600000043000000739c0100009001789474007c0064011900180074016a02640264038d016b049001729674036a046402640483027d017c0164026b0272627c0064050500190074036a04640664078302380003003c007c0064080500190074036a046409640a8302370003003c007c01640b6b02729a7c0064050500190074036a04640c640d8302380003003c007c0064080500190074036a04640b64098302370003003c007c0164046b0272d27c0064050500190074036a04640c640e8302370003003c007c0064080500190074036a046402640b8302370003003c007c00640f0500190074036a046404640d8302370003003c007c0064100500190074036a04640c64068302380003003c007c0064110500190074036a046404640d8302370003003c007c0064010500190074016a02640264038d01370003003c007c017c0064123c007c0064130500190074036a046414640b8302380003003c007c006405190064156b049001726864157c0064053c007c006408190064156b0472047c006416050019007c006408190064151800370003003c0064157c0064083c00710457007c00530029174e725d00000072140000002901724400000072460000007255000000727c000000e91400000072570000007212000000e906000000e9020000007254000000727b0000007251000000725600000072580000007259000000725b000000725a0000007201000000e964000000726300000029057224000000724c000000724d000000726f000000727000000029027273000000725b000000722600000072260000007227000000727f000000bc000000733000000000011e010c010801180118010801180118010801180118011801180118011801080118010e0108010c010e010a010c01727f000000630200000000000000050000000800000043000000737c01000074007c006401190074016a02640264038d0117006b049001727874007c006401190018007d027c026a0364041b007d0374047c016405660219007d047c046406050019007c03640713007c046408190064091b007c04640a190064091b0018007c031b00140064071b007c04640a190064091b007c0314001700370003003c007c04640b050019007c0364071300640c7c04640d190064091b001800640c7c04640e190064091b00180018007c031b00140064071b00640c7c04640e190064091b0018007c0314001700370003003c007c04640f050019007c03640713007c046410190064091b007c046411190064091b0018007c031b00140064071b007c046411190064091b007c0314001700370003003c007c046412050019007c0364071300640c7c046413190064091b001800640c7c046414190064091b00180018007c031b00140064071b00640c7c046414190064091b0018007c0314001700370003003c007c0474047c01640566023c0074007c0064013c007c00530029154e725e00000072460000002901727a0000006980510100726e0000007268000000728a0000007255000000728b00000072640000007269000000721400000072560000007265000000726a00000072580000007266000000726b0000007259000000726700000029057224000000724c000000724d000000da077365636f6e64737231000000290572730000007205000000da0564656c7461da0764656c74615f64726e0000007226000000722600000072270000007280000000d7000000732600000000011a010c010a010c010802260116010802320116010802260116010802320116010c010801728000000063010000000000000001000000030000004300000073500000007c006401190064026b0573247c006403190064026b0573247c006404190064026b05722c64057c0064063c007c006407190064086b0173447c006409190064086b01724c64057c0064063c007c005300290a4e725a000000728b0000007256000000725900000046725f0000007255000000720100000072580000007226000000290172730000007226000000722600000072270000007284000000f1000000730e000000000112011201080112010601080172840000007214000000290372720000007276000000da096e756d5f74696d6573630300000000000000080000000700000043000000737600000074007c007c0183027d037c03640119007d047c03640219007d057c03640319007d06782a740164047c02830244005d1c7d077c0464050500190074026a03640664078302370003003c00712e57007c046405190064086b04726264087c0464053c007c047c0564093c007c0574047c063c0064005300290a4e7273000000727d0000007205000000720100000072550000007254000000727b000000728b000000722f00000029057287000000da0572616e6765726f00000072700000007231000000290872720000007276000000728f00000072860000007273000000727d0000007205000000da0178722600000072260000007227000000da057761746572fb000000731400000000020a0108010801080110011c010c01080108017292000000630200000000000000070000000600000043000000739600000074007c007c0183027d027c02640119007d037c02640219007d047c02640319007d057c036404190074016a02640564068d0117007d0674037c066b04734e740464077c069b0064089d03830182017c0364090500190074056a06640a64058302380003003c007c0364091900640b6b00727a640b7c0364093c0074037c0364043c007c037c04640c3c007c0474077c053c0064005300290d4e7273000000727d0000007205000000726100000072540000002901da076d696e757465737a3c596f7520617265207374696c6c20737175617368696e672062756773206f722070756c6c696e672077656564732e2054727920616761696e2061742072770000007256000000728a0000007201000000722f00000029087287000000724c000000724d0000007224000000722b000000726f0000007270000000723100000029077272000000727600000072860000007273000000727d0000007205000000da07745f64656c7461722600000072260000007227000000da0b7371756173685f6275677309010000731800000000020a010801080108011401180118010c010801080108017295000000630200000000000000060000000600000043000000738400000074007c007c0183027d027c02640119007d037c02640219007d047c02640319007d057c0364040500190074016a02640564068302370003003c007c0364070500190074016a02640864098302380003003c007c0364071900640a6b007266640a7c0364073c0074037c00640b830201007c037c04640c3c007c0474047c053c0064005300290d4e7273000000727d0000007205000000725a000000721400000072460000007256000000727c000000728800000072010000007254000000722f00000029057287000000726f00000072700000007271000000723100000029067272000000727600000072860000007273000000727d0000007205000000722600000072260000007227000000da0a73707261795f6275677319010000731600000000020a01080108010801180118010c0108010a010801729600000063020000000000000007000000060000004300000073b800000074007c007c0183027d027c02640119007d037c02640219007d047c02640319007d057c036404190074016a02640564068d0117007d0674037c066b04734e740464077c069b0064089d038301820174057c006409830201007c03640a0500190074066a07640b64098302370003003c0074037c0364043c007c03640a1900640c6b0472a47c03640d050019007c03640a1900640c1800370003003c00640c7c03640a3c007c037c04640e3c007c0474087c053c0064005300290f4e7273000000727d000000720500000072620000007214000000290172440000007a3f596f752068617665207573656420612067726f77206c69676874206f7220736861646520746f6f20726563656e746c792e2054727920616761696e206174207277000000725400000072570000007246000000728b0000007263000000722f00000029097287000000724c000000724d0000007224000000722b0000007271000000726f0000007270000000723100000029077272000000727600000072860000007273000000727d00000072050000007294000000722600000072260000007227000000da0b67726f775f6c696768747328010000731c00000000020a01080108010801140118010a01180108010c01180108010801729700000063020000000000000007000000060000004300000073ae00000074007c007c0183027d027c02640119007d037c02640219007d047c02640319007d057c036404190074016a02640564068d0117007d0674037c066b04734e740464077c069b0064089d03830182017c0364090500190074056a06640a640b8302380003003c0074037c0364043c007c0364091900640c6b04729a7c03640d050019007c0364091900640c1800370003003c00640c7c0364093c007c037c04640e3c007c0474077c053c0064005300290f4e7273000000727d000000720500000072620000007214000000290172440000007a3f596f752068617665207573656420612067726f77206c69676874206f7220736861646520746f6f20726563656e746c792e2054727920616761696e206174207277000000725700000072460000007254000000728b0000007263000000722f00000029087287000000724c000000724d0000007224000000722b000000726f0000007270000000723100000029077272000000727600000072860000007273000000727d00000072050000007294000000722600000072260000007227000000da0b73686164655f706c616e743a010000731a00000000020a0108010801080114011801180108010c011801080108017298000000630300000000000000080000000700000043000000739c00000074007c007c0183027d037c03640119007d047c03640219007d057c03640319007d0674017c0064047c02140083020100782a740264057c02830244005d1c7d077c0464060500190074036a04640764088302370003003c00713c57007c046406190064096b0472887c04640a050019007c046406190064091800370003003c0064097c0464063c007c047c05640b3c007c0574057c063c0064005300290c4e7273000000727d0000007205000000728a0000007201000000725800000072460000007254000000728b0000007263000000722f0000002906728700000072710000007290000000726f00000072700000007231000000290872720000007276000000728f00000072860000007273000000727d00000072050000007291000000722600000072260000007227000000da0966657274696c697a654b010000731800000000020a010801080108010e0110011c010c011801080108017299000000630200000000000000070000000600000043000000739600000074007c007c0183027d027c02640119007d037c02640219007d047c02640319007d057c036404190074016a02640564068d0117007d0674037c066b04734e740464077c069b0064089d03830182017c0364090500190074056a06640a64058302380003003c007c0364091900640b6b00727a640b7c0364093c0074037c0364043c007c037c04640c3c007c0474077c053c0064005300290d4e7273000000727d000000720500000072610000007254000000290172930000007a3c596f7520617265207374696c6c20737175617368696e672062756773206f722070756c6c696e672077656564732e2054727920616761696e2061742072770000007259000000728a0000007201000000722f00000029087287000000724c000000724d0000007224000000722b000000726f0000007270000000723100000029077272000000727600000072860000007273000000727d00000072050000007294000000722600000072260000007227000000da0a70756c6c5f77656564735b010000731800000000020a010801080108011401180118010c01080108010801729a000000630200000000000000060000000600000043000000737a00000074007c007c0183027d027c02640119007d037c02640219007d047c02640319007d057c0364040500190074016a02640564068302370003003c007c0364070500190074016a02640864098302380003003c007c0364071900640a6b007266640a7c0364073c007c037c04640b3c007c0474037c053c0064005300290c4e7273000000727d0000007205000000725a000000721400000072460000007259000000727c00000072880000007201000000722f00000029047287000000726f0000007270000000723100000029067272000000727600000072860000007273000000727d0000007205000000722600000072260000007227000000da0b73707261795f77656564736b010000731400000000020a01080108010801180118010c0108010801729b0000006302000000000000000b000000080000004300000073c40200007c0074006b0273187401640174009b0064029d038301820164037c009b0064047c019b009d047d02740274036a047c026602190064056b027342740164068301820174057c0264076602190064086b02735a74016409830182017406640a19007d0374077406640b19006b01727674077c036b05737e7401640c8301820174036a046a08640d8301728e6400530074057c0219007d047c04640e19007d057c05640f190064106b0273b274016411830182017c037c056412190018007d067c066a0964131b007d0774057c026414660219007d087c086415050019007c07641613007c086417190064181b007c086419190064181b0018007c071b00140064161b007c086419190064181b007c0714001700370003003c007c08641a050019007c076416130064057c08641b190064181b00180064057c08641c190064181b00180018007c071b00140064161b0064057c08641c190064181b0018007c0714001700370003003c007c08641d050019007c07641613007c08641e190064181b007c08641f190064181b0018007c071b00140064161b007c08641f190064181b007c0714001700370003003c007c086420050019007c076416130064057c086421190064181b00180064057c086422190064181b00180018007c071b00140064161b0064057c086422190064181b0018007c0714001700370003003c007c0874057c02641466023c0074077c0564123c007c057c04640e3c007c0474057c023c00740a642319007d09740b64247c08641519007c08641a190014007c08641d190014007c086420190014007c09642513001b00140064057c056426190064181b00180014007c056427190064181b00140064057c056428190064181b001800140083017d0a7c0a74057c02642966023c007c0a74057c02642a66023c0074067c00642b6602050019007c0a370003003c0074057c0264076602190064106b02010064005300292c4e7a6b54686520706c616e7420796f752061726520747279696e6720746f20696e7465726163742077697468206973206e6f742070617274206f66207468652063757272656e742067656e65726174696f6e2e205468652063757272656e742067656e65726174696f6e206973207277000000726c000000726d00000072140000007a1a596f7520646f206e6f74206f776e207468697320706c616e742eda0966696e616c697a6564467a265468697320706c616e742068617320616c7265616479206265656e2066696e616c697a65642e724500000072470000007a264974206973206e6f742074696d6520746f2066696e616c697a6520796f757220706c616e742e7278000000722f000000725f000000547a64596f757220706c616e7420697320646561642064756520746f206e65676c65637420616e6420796f75206d757374206275792061206e657720706c616e7420746f2074727920616761696e2e20547279206e6f7420746f206b696c6c20697420746f6f2e725e0000006980510100726e0000007268000000728a0000007255000000728b0000007264000000726900000072560000007265000000726a00000072580000007266000000726b00000072590000007267000000721300000069e80300007212000000725a00000072570000007263000000da0762657272696573da0b66696e616c5f73636f72657248000000290c721a000000722b0000007232000000721f0000007220000000723100000072230000007224000000727e000000728c0000007221000000da03696e74290b727200000072760000007205000000da08656e645f74696d65727d0000007273000000728d000000728e000000726e000000da066c656e677468729d000000722600000072260000007227000000da0e66696e616c697a655f706c616e747901000073500000000002180110010c010e010a010e0108010c0110010c0104010801080106010e010c010a010c0108023c0108023c010c0108022601160108023c010c010c01080108010801080102045a010c010c01140172a200000063020000000000000006000000040000004300000073ba00000064017c009b0064027c019b009d047d02740074016a027c026602190064036b02732a740364048301820174047c026405660219007d037c0364066b047346740364078301820174057406640819006b057366740364097406640819009b00640a9d038301820174067c00640b6602190074067c00640c660219001b007d047c047c0314007d0574076a087c0574016a02640d8d020100640674047c02640566023c0074067c00640b6602050019007c05380003003c0064005300290e4e726c000000726d00000072140000007a1a596f7520646f206e6f74206f776e207468697320706c616e742e729d00000072010000007a23596f7520646f6e2774206861766520616e79206265727269657320746f2073656c6c2e72470000007a24596f752063616e27742073656c6c207965742e2054727920616761696e206166746572207a1a2062757420646f206e6f74207761697420746f6f206c6f6e672e7249000000724800000029027230000000723400000029097232000000721f0000007220000000722b000000723100000072240000007223000000724000000072350000002906727200000072760000007205000000729d000000da0a73656c6c5f7072696365da0870726f6365656473722600000072260000007227000000da0e5f5f73656c6c5f62657272696573ac010000731a000000000110010c010e010c0110010e0112010c010c01080110010c0172a5000000630200000000000000020000000500000043000000735200000074006a017c01740264018301140074036a0474036a0564028d03010074006a017c01740264038301140074066404190074036a0564028d03010074077c0064056602050019007c01370003003c006400530029064e7a04302e393529037230000000723400000072380000007a04302e30357210000000724900000029087240000000723a0000007222000000721f000000da04746869737220000000722100000072230000002902727200000072300000007226000000722600000072270000007271000000bc010000730a000000000112010a0110010e017271000000290272720000007230000000630200000000000000020000000500000043000000732c00000074006a017c0174026a0374026a0464018d03010074057c0064026602050019007c01370003003c006400530029034e2903723000000072340000007238000000724900000029067240000000723a000000721f00000072a600000072200000007223000000290272720000007230000000722600000072260000007227000000da116d616e75616c5f7265776172645f616464c401000073040000000002140172a700000029017272000000630100000000000000030000000400000043000000736800000074006401190074016a026b027316740364028301820174047c006403660219007d0174057c016b057338740364047c019b009d028301820174047c006405660219007d027c0264066b047354740364078301820174066a077c0274016a0264088d0201006400530029094e72100000007a264f6e6c7920746865206f70657261746f722063616e20636c61696d207374616c65207461752e724b0000007a4054686520746175206973206e6f74207374616c652079657420616e642063616e6e6f7420626520636c61696d65642e2054727920616761696e20616674657220724900000072010000007a1f5468657265206973206e6f207374616c652074617520746f20636c61696d2e29027230000000723400000029087221000000721f0000007220000000722b000000722300000072240000007240000000723500000029037272000000724b000000da097374616c655f746175722600000072260000007227000000da0c7374616c655f636c61696d73ca010000730e0000000002060110010c0116010c01100172a9000000290372720000007276000000da046e69636b630300000000000000040000000400000043000000735c00000064017c009b0064027c019b009d047d03740074016a027c036602190064036b02732a7403640483018201740474057c021900830164056b027342740364068301820174067c006407830201007c007c01670274057c023c006400530029084e726c000000726d00000072140000007a1a596f7520646f206e6f74206f776e207468697320706c616e742e467a1d54686973206e69636b6e616d6520616c7265616479206578697374732e728a00000029077232000000721f0000007220000000722b000000da04626f6f6c7231000000727100000029047272000000727600000072aa0000007205000000722600000072260000007227000000da086e69636b6e616d65d5010000730e000000000210010c010e010a010e010a0172ac000000290272ac000000da0d66756e6374696f6e5f6e616d65630200000000000000040000000900000043000000733800000074007c0019007d027401740274037404740574067407740864019c087d037c037c0119007c02640219007c0264031900830201006400530029044e2908729200000072950000007296000000729700000072980000007299000000729a000000729b0000007201000000721400000029097231000000729200000072950000007296000000729700000072980000007299000000729a000000729b000000290472ac00000072ad00000072aa000000da0e66756e6374696f6e5f6e616d6573722600000072260000007227000000da146e69636b6e616d655f696e746572616374696f6ee0010000730c00000000020801040104010601080172af00000029017230000000630100000000000000010000000400000043000000732a00000074006401190074016a026b027316740364028301820174046a057c0074016a0264038d0201006400530029044e72100000007a204f6e6c7920746865206f70657261746f722063616e20636c61696d207461752e29027230000000723400000029067221000000721f0000007220000000722b0000007240000000723500000029017230000000722600000072260000007227000000da12656d657267656e63795f7769746864726177ea010000730600000000020601100172b0000000290172140000002901721400000029317240000000da085661726961626c65721c000000721e000000da0448617368723100000072320000007236000000723d000000722300000072210000007225000000726f000000da04736565647228000000da085f5f6578706f7274da03737472722c000000da0464696374729f000000723300000072350000007237000000723a000000da05666c6f6174723e0000007243000000725000000072750000007287000000727f00000072800000007284000000729200000072950000007296000000729700000072980000007299000000729a000000729b00000072a200000072a5000000727100000072a700000072a900000072ac00000072af00000072b00000007226000000722600000072260000007227000000da083c6d6f64756c653e01000000738400000008010c0104010801060108010601080104010a010e010e010c010c010803080f0601120606010601120906011409060114050601160c060114090601140e1016101e101f081b081a080a0601160d0601120f0601120e06011211060112100601160f0601120f0601120d0601123210100808060112050601100a0601140a060112090601