Contract con_testfarm18
Creator | 9ab69d2caa0c14886d462ef4756d7b61b3b81cfb5968f738e6b8c321959e248a |
Creation Hash | ddb421ee88f0e1bcc305c18b4036a03a3d19d4ff568ee00bc338c84ca2021118 |
Created On | 670 days ago - 6/26/2022, 12:11:30 AM UTC+0 |
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
plants = Hash(default_value=0) #store various data related to plants and growing seasons
11
metadata = Hash()
12
nicknames = Hash()
13
emergency = Hash()
14
15
random.seed()
16
17
@construct
18
def seed():
19
collection_name.set("Test_plants") # Sets the name
20
collection_owner.set(ctx.caller) # Sets the owner
21
metadata['operator'] = ctx.caller
22
23
metadata['growing_season_length'] = 2
24
metadata['plant price'] = 5
25
#metadata['event_handler'] = 'con_bbf_events_01'
26
metadata['ipfs_contract'] = 'con_testipfs1'
27
28
plants['growing_season'] = False
29
plants['growing_season_start_time'] = now
30
plants['count'] = 0
31
plants['active_generation'] = -1
32
emergency['addresses'] = {
33
'ae7d14d6d9b8443f881ba6244727b69b681010e782d4fe482dbfb0b6aca02d5d' : 0,
34
'49aceeabdccdcb39f8c2c112e110ead1a5fef22c644825c1917b2df3204c433f' : 0,
35
'e8dc708028e049397b5baf9579924dde58ce5bebee5655da0b53066117572e73' : 0
36
}
37
38
nicknames = {}
39
40
41
@export
42
def change_metadata(key: str, new_value: str, convert_to_decimal: bool=False):
43
assert ctx.caller == metadata['operator'], "only operator can set metadata"
44
if convert_to_decimal:
45
new_value = decimal(new_value)
46
metadata[key] = new_value
47
48
# function to mint a new NFT
49
def mint_nft(name: str, description: str, ipfs_image_url: str, nft_metadata: dict, amount: int):
50
assert name != "", "Name cannot be empty"
51
assert collection_nfts[name] == 0, "Name already exists"
52
assert amount > 0, "You cannot transfer negative amounts"
53
54
collection_nfts[name] = {"description": description, "ipfs_image_url": ipfs_image_url, "nft_metadata": f"See collection_nfts[{name},'nft_metadata']", "amount": amount} # Adds NFT to collection with all details
55
collection_nfts[name,"nft_metadata"] = nft_metadata
56
collection_balances[ctx.caller, name] = amount # Mints the NFT
57
58
# standard transfer function
59
@export
60
def transfer(name: str, amount:int, to: str):
61
assert amount > 0, "You cannot transfer negative amounts"
62
assert name != "", "Please specify the name of the NFT you want to transfer"
63
assert collection_balances[ctx.caller, name] >= amount, "You don't have enough NFTs to send"
64
65
collection_balances[ctx.caller, name] -= amount # Removes amount from sender
66
collection_balances[to, name] += amount # Adds amount to receiver
67
68
# allows other account to spend on your behalf
69
@export
70
def approve(amount: int, name: str, to: str):
71
assert amount > 0, "Cannot approve negative amounts"
72
73
collection_balances_approvals[ctx.caller, to, name] += amount # Approves certain amount for spending by another account
74
75
# transfers on your behalf
76
@export
77
def transfer_from(name:str, amount:int, to: str, main_account: str):
78
assert amount > 0, 'Cannot send negative balances!'
79
80
assert collection_balances_approvals[main_account, to, name] >= amount, "Not enough NFTs approved to send! You have {} and are trying to spend {}"\
81
.format(collection_balances_approvals[main_account, to, name], amount)
82
assert collection_balances[main_account, name] >= amount, "Not enough NFTs to send!"
83
84
collection_balances_approvals[main_account, to, name] -= amount # Removes Approval Amount
85
collection_balances[main_account, name] -= amount # Removes amount from sender
86
87
collection_balances[to, name] += amount # Adds amount to receiver
88
89
@export
90
def start_growing_season():
91
assert collection_owner.get() == ctx.caller, "Only the owner can start a growing season."
92
grow_season = plants['growing_season']
93
assert grow_season == False, "It is already growing season."
94
growing_season_length = metadata['growing_season_length']
95
active_gen = plants['active_generation']
96
active_gen += 1
97
plants['growing_season'] = True
98
plants['growing_season_start_time'] = now
99
plants['growing_season_end_time'] = now + datetime.timedelta(days = growing_season_length)
100
plants[active_gen, 'finalize_time'] = now + datetime.timedelta(hours = growing_season_length + 6)
101
plants['active_generation'] = active_gen
102
plants[active_gen, 'total_berries'] = 0
103
plants[active_gen, 'sellable_berries'] = 0
104
plants[active_gen, 'total_tau'] = 0
105
plants[active_gen, 'claimable_tau'] = 0
106
plants[active_gen,'stale_claim_time'] = now + datetime.timedelta(days = growing_season_length + 30)
107
108
109
@export
110
def buy_plant(nick : str):
111
assert plants['growing_season'] == True, 'The growing season has not started, so you cannot buy a plant.'
112
#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."
113
assert not nick.isdigit(), "The plant nickname can't be an integer."
114
assert bool(collection_nfts[nick]) == False, "This nickname already exists."
115
assert nick.isalnum() == True, "Only alphanumeric characters allowed."
116
assert nick != "", "Name cannot be empty"
117
assert len(nick) >= 3, "The minimum length is 3 characters."
118
plant_generation = plants['active_generation']
119
120
plant_data = {
121
"current_water": (random.randint(70, 90)),
122
"current_bugs" : (random.randint(5, 25)),
123
"current_photosynthesis" : 0,
124
"current_nutrients" : (random.randint(70, 90)),
125
"current_weeds" : (random.randint(5, 25)),
126
"current_toxicity" : 0,
127
"current_weather" : 1,
128
"last_interaction" : now,
129
"last_daily" : now,
130
"last_calc" : now,
131
"alive" : True,
132
"last_squash_weed" : (now + datetime.timedelta(days = -1)),
133
"last_grow_light" : (now + datetime.timedelta(days = -1)),
134
"burn_amount" : 0
135
}
136
137
plant_calc_data = {
138
"previous_water": plant_data["current_water"],
139
"previous_bugs" : plant_data["current_bugs"],
140
"previous_nutrients" : plant_data["current_nutrients"],
141
"previous_weeds" : plant_data["current_weeds"],
142
"total_water": 0,
143
"total_bugs" : 0,
144
"total_nutrients" : 0,
145
"total_weeds": 0
146
}
147
148
p_count = plants['count'] + 1
149
name = f"Gen_{plant_generation}_{p_count}"
150
collection_nfts[nick] = [plant_generation , p_count]
151
payment(plant_generation, metadata['plant price'])
152
153
#assigns random, one time use IPFS image
154
ipfs_c = importlib.import_module(metadata['ipfs_contract'])
155
ipfs_image_url = ipfs_c.pick_random()
156
157
mint_nft(name,'This is a blueberry plant. Keep it alive and healthy by tending to it during growing season.' , ipfs_image_url , plant_data,1)
158
collection_nfts[name,'plant_calc_data'] = plant_calc_data
159
plants['count'] = p_count
160
return [plant_data["current_water"],plant_data["current_photosynthesis"],plant_data["current_bugs"],plant_data["current_nutrients"],plant_data["current_weeds"],plant_data['current_toxicity'],plant_data["burn_amount"],plant_data["current_weather"],ipfs_image_url]
161
162
def action_setup(plant_generation : int, plant_number : int):
163
active_generation = plants['active_generation']
164
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}.'
165
name = f'Gen_{plant_generation}_{plant_number}'
166
assert collection_balances[ctx.caller, name] == 1, "You do not own this plant."
167
assert now <= plants['growing_season_end_time'], 'The growing season is not active, so you cannot interact with your plant.'
168
if ctx.caller.startswith('con_'): return
169
plant_data = collection_nfts[name,"nft_metadata"]
170
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.'
171
172
#interaction idle check. If idle too long, plant gets penalized.
173
if now > plant_data['last_interaction'] + datetime.timedelta(hours = 12):
174
plant_data["current_water"] -= (random.randint(5, 15))
175
plant_data["current_bugs"] += (random.randint(5, 15))
176
plant_data["current_nutrients"] -= (random.randint(5, 15))
177
plant_data["current_weeds"] += (random.randint(5, 15))
178
179
plant_data = daily_conditions(plant_data) #checks if weather and other daily conditions need updating
180
plant_data = totalizer_calc(plant_data,name) #checks if enough time has passed to add info to the plant totalizer calculations
181
182
#if (random.randint(1, 10)) == 10 : #10% chance of an event happening #RANDOM EVENTS NOT WORKING. COMMENTING OUT UNTIL FIXED
183
# event_contract = importlib.import_module(metadata['event_handler'])
184
# plant_data = event_contract.event(plant_data)
185
186
plant_data = dead_check(plant_data)
187
plant_data['last_interaction'] = now #resets the interaction time
188
189
plant_all = {
190
'plant_data' : plant_data,
191
'name' : name
192
}
193
194
return plant_all
195
196
def daily_conditions(plant_data):
197
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
198
current_weather = random.randint(1, 3) # 1=sunny 2=cloudy 3=rainy
199
if current_weather == 1:
200
plant_data["current_water"] -= (random.randint(10, 20)) #how much water is lost each sunny day
201
plant_data["current_photosynthesis"] += (random.randint(4, 6)) #How much photosynthesis increases each sunny day
202
if current_weather == 2:
203
plant_data["current_water"] -= (random.randint(5, 15)) #how much water is lost each cloudy day
204
plant_data["current_photosynthesis"] += (random.randint(2, 4)) #How much photosynthesis increases each cloudy day
205
if current_weather == 3:
206
plant_data["current_water"] += (random.randint(5, 25)) #how much water is gained each rainy day
207
plant_data["current_photosynthesis"] += (random.randint(1, 2)) #How much photosynthesis increases each rainy day
208
209
plant_data["current_bugs"] += (random.randint(5, 20)) #how many bugs are added each day
210
plant_data["current_nutrients"] -= (random.randint(5, 10)) #how many nutrients are consumed each day
211
plant_data["current_weeds"] += (random.randint(5, 20)) #how many weeds grow each day
212
plant_data["last_daily"] += datetime.timedelta(days = 1)
213
plant_data["current_weather"] = current_weather
214
plant_data['current_toxicity'] -= (random.randint(0, 2))
215
216
if plant_data['current_toxicity'] < 0:
217
plant_data['current_toxicity'] = 0
218
219
if plant_data['current_water'] > 100 : #water can't be above 100%
220
plant_data['current_water'] = 100
221
222
if plant_data['current_water'] < 0 : #water can't be below 0
223
plant_data['current_water'] = 0
224
225
if plant_data["current_photosynthesis"] > 100 :
226
plant_data["burn_amount"] += (plant_data["current_photosynthesis"]-100)
227
plant_data["current_photosynthesis"] = 100
228
229
return plant_data
230
231
def totalizer_calc(plant_data,name):
232
if now > plant_data['last_calc'] + datetime.timedelta(hours = 3):
233
delta = now - plant_data['last_calc']
234
delta_d = (delta.seconds / 86400)
235
plant_calc_data = collection_nfts[name,'plant_calc_data']
236
#This sections performs an integral on the various properties for use in determining total berries produced.
237
plant_calc_data["total_water"] += (delta_d**2*((plant_data["current_water"]/100-plant_calc_data["previous_water"]/100)/(delta_d))/2)+plant_calc_data["previous_water"]/100*delta_d
238
plant_calc_data["total_bugs"] += (delta_d**2*(((1-plant_data["current_bugs"]/100)-(1-plant_calc_data["previous_bugs"]/100))/(delta_d))/2)+(1-plant_calc_data["previous_bugs"]/100)*delta_d
239
plant_calc_data["total_nutrients"] += (delta_d**2*((plant_data["current_nutrients"]/100-plant_calc_data["previous_nutrients"]/100)/(delta_d))/2)+plant_calc_data["previous_nutrients"]/100*delta_d
240
plant_calc_data["total_weeds"] += (delta_d**2*(((1-plant_data["current_weeds"]/100)-(1-plant_calc_data["previous_weeds"]/100))/(delta_d))/2)+(1-plant_calc_data["previous_weeds"]/100)*delta_d
241
plant_data['last_calc'] = now
242
#Updates previous values for next calculation period.
243
plant_calc_data["previous_water"] = plant_data["current_water"]
244
plant_calc_data["previous_bugs"] = plant_data["current_bugs"]
245
plant_calc_data["previous_nutrients"] = plant_data["current_nutrients"]
246
plant_calc_data["previous_weeds"] = plant_data["current_weeds"]
247
248
collection_nfts[name,'plant_calc_data'] = plant_calc_data
249
250
return plant_data
251
252
def dead_check(plant_data): #checks to see if your plant has died.
253
if plant_data["current_toxicity"] >= 100 or plant_data["current_bugs"] >= 100 or plant_data["current_weeds"] >= 100 or plant_data["burn_amount"] >= 100:
254
plant_data["alive"] = False
255
if plant_data["current_water"] <= 0 or plant_data["current_nutrients"] <= 0:
256
plant_data["alive"] = False
257
return plant_data
258
259
@export
260
def water(plant_generation : int, plant_number : int, num_times : int = 1): #Water your plant to increase its current_water.
261
plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
262
plant_data = plant_all['plant_data']
263
name = plant_all['name']
264
265
for x in range(0, num_times):
266
plant_data['current_water'] += (random.randint(5, 15))
267
if plant_data['current_water'] > 100 : #water can't be above 1
268
plant_data['current_water'] = 100
269
270
collection_nfts[name,"nft_metadata"] = plant_data
271
return [plant_data["current_water"],plant_data["current_photosynthesis"],plant_data["current_bugs"],plant_data["current_nutrients"],plant_data["current_weeds"],plant_data['current_toxicity'],plant_data["burn_amount"],plant_data["current_weather"]]
272
273
@export
274
def squash(plant_generation : int, plant_number : int): #Squash bugs to reduce current_bugs and takes 5 minutes. Share's a timer with pullweeds.
275
plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
276
plant_data = plant_all['plant_data']
277
name = plant_all['name']
278
279
t_delta = plant_data["last_squash_weed"] + datetime.timedelta(minutes = 5)
280
assert now > t_delta, f"You are still squashing bugs or pulling weeds. Try again at {t_delta}."
281
282
plant_data['current_bugs'] -= (random.randint(2, 5))
283
if plant_data['current_bugs'] < 0 :
284
plant_data['current_bugs'] = 0
285
286
plant_data["last_squash_weed"] = now
287
collection_nfts[name,"nft_metadata"] = plant_data
288
return [plant_data["current_water"],plant_data["current_photosynthesis"],plant_data["current_bugs"],plant_data["current_nutrients"],plant_data["current_weeds"],plant_data['current_toxicity'],plant_data["burn_amount"],plant_data["current_weather"]]
289
290
@export
291
def spraybugs(plant_generation : int, plant_number : int): #Spray bugs to instantly reduce current_bugs but costs tau and adds small amount of toxicity
292
plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
293
plant_data = plant_all['plant_data']
294
name = plant_all['name']
295
296
plant_data['current_toxicity'] += (random.randint(1, 3))
297
298
plant_data['current_bugs'] -= (random.randint(10, 20))
299
if plant_data['current_bugs'] < 0 :
300
plant_data['current_bugs'] = 0
301
302
payment(plant_generation, 5)
303
collection_nfts[name,"nft_metadata"] = plant_data
304
return [plant_data["current_water"],plant_data["current_photosynthesis"],plant_data["current_bugs"],plant_data["current_nutrients"],plant_data["current_weeds"],plant_data['current_toxicity'],plant_data["burn_amount"],plant_data["current_weather"]]
305
306
@export
307
def growlights(plant_generation : int, plant_number : int): #add photosynthesis to help plant catchup after several rainy days. Adds amount to current_photosynthesis but if it goes over 100%, burns your plant.
308
plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
309
plant_data = plant_all['plant_data']
310
name = plant_all['name']
311
312
t_delta = plant_data["last_grow_light"] + datetime.timedelta(days = 1)
313
assert now > t_delta, f"You have used a grow light or shade too recently. Try again at {t_delta}."
314
315
payment(plant_generation, 5)
316
plant_data['current_photosynthesis'] += (random.randint(3, 5))
317
plant_data["last_grow_light"] = now
318
319
if plant_data["current_photosynthesis"] > 100 :
320
plant_data["burn_amount"] += (plant_data["current_photosynthesis"]-100)
321
plant_data["current_photosynthesis"] = 100
322
323
collection_nfts[name,"nft_metadata"] = plant_data
324
return [plant_data["current_water"],plant_data["current_photosynthesis"],plant_data["current_bugs"],plant_data["current_nutrients"],plant_data["current_weeds"],plant_data['current_toxicity'],plant_data["burn_amount"],plant_data["current_weather"]]
325
326
@export
327
def shade(plant_generation : int, plant_number : int): #shades your plant to reduce photosynthesis by a small amount
328
plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
329
plant_data = plant_all['plant_data']
330
name = plant_all['name']
331
332
t_delta = plant_data["last_grow_light"] + datetime.timedelta(days = 1)
333
assert now > t_delta, f"You have used a grow light or shade too recently. Try again at {t_delta}."
334
335
plant_data['current_photosynthesis'] -= (random.randint(3, 5))
336
plant_data["last_grow_light"] = now
337
338
if plant_data["current_photosynthesis"] < 100 :
339
plant_data["current_photosynthesis"] = 0
340
341
collection_nfts[name,"nft_metadata"] = plant_data
342
return [plant_data["current_water"],plant_data["current_photosynthesis"],plant_data["current_bugs"],plant_data["current_nutrients"],plant_data["current_weeds"],plant_data['current_toxicity'],plant_data["burn_amount"],plant_data["current_weather"]]
343
344
@export
345
def fertilize(plant_generation : int, plant_number : int, num_times : int = 1): #increases current nutrients of the plant but if nutrients go over 100%, it burns your plant.
346
plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
347
plant_data = plant_all['plant_data']
348
name = plant_all['name']
349
350
for x in range(0, num_times):
351
plant_data['current_nutrients'] += (random.randint(4, 6))
352
353
if plant_data['current_nutrients'] > 100 :
354
plant_data["burn_amount"] += (plant_data['current_nutrients']-100)
355
plant_data['current_nutrients'] = 100
356
357
collection_nfts[name,"nft_metadata"] = plant_data
358
return [plant_data["current_water"],plant_data["current_photosynthesis"],plant_data["current_bugs"],plant_data["current_nutrients"],plant_data["current_weeds"],plant_data['current_toxicity'],plant_data["burn_amount"],plant_data["current_weather"]]
359
360
@export
361
def pullweeds(plant_generation : int, plant_number : int): #reduces current weeds in plant and takes 5 minutes to do. Share's a timer with squash bugs.
362
363
plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
364
plant_data = plant_all['plant_data']
365
name = plant_all['name']
366
367
t_delta = plant_data["last_squash_weed"] + datetime.timedelta(minutes = 5)
368
assert now > t_delta, f"You are still squashing bugs or pulling weeds. Try again at {t_delta}."
369
370
plant_data['current_weeds'] -= (random.randint(2, 5))
371
if plant_data['current_weeds'] < 0 :
372
plant_data['current_weeds'] = 0
373
374
plant_data["last_squash_weed"] = now
375
collection_nfts[name,"nft_metadata"] = plant_data
376
return [plant_data["current_water"],plant_data["current_photosynthesis"],plant_data["current_bugs"],plant_data["current_nutrients"],plant_data["current_weeds"],plant_data['current_toxicity'],plant_data["burn_amount"],plant_data["current_weather"]]
377
378
@export
379
def sprayweeds(plant_generation : int, plant_number : int): #Spray weeds to instantly reduce current_weeds but costs tau and adds small amount of toxicity
380
plant_all = action_setup(plant_generation,plant_number) #Runs the main method that performs all of the various checks required for the plant.
381
plant_data = plant_all['plant_data']
382
name = plant_all['name']
383
384
plant_data['current_toxicity'] += (random.randint(1, 3))
385
386
plant_data['current_weeds'] -= (random.randint(10, 20))
387
if plant_data['current_weeds'] < 0 :
388
plant_data['current_weeds'] = 0
389
390
collection_nfts[name,"nft_metadata"] = plant_data
391
return [plant_data["current_water"],plant_data["current_photosynthesis"],plant_data["current_bugs"],plant_data["current_nutrients"],plant_data["current_weeds"],plant_data['current_toxicity'],plant_data["burn_amount"],plant_data["current_weather"]]
392
393
@export
394
def finalize(plant_generation : int, plant_number : int): #Finalizes your plant at the end of growing season to deterimine your berry yield.
395
active_generation = plants['active_generation']
396
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}.'
397
name = f'Gen_{plant_generation}_{plant_number}'
398
assert collection_balances[ctx.caller, name] == 1, "You do not own this plant."
399
assert collection_nfts[name,'finalized'] == False, 'This plant has already been finalized.'
400
end_time = plants['growing_season_end_time']
401
finalize_time = plants[plant_generation, 'finalize_time']
402
assert now <= finalize_time and now >= end_time, f'It is not time to finalize your plant. Try between {end_time} and {finalize_time}'
403
if ctx.caller.startswith('con_'): return
404
plant_data = collection_nfts[name,"nft_metadata"]
405
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.'
406
407
if plants['growing_season'] == True : #first person to run this also turns growing_season to false and resets plant counter for next growing season
408
plants['growing_season'] = False
409
plants['count'] = 0
410
411
delta = end_time - plant_data['last_calc']
412
delta_d = (delta.seconds / 86400)
413
414
plant_calc_data = collection_nfts[name,'plant_calc_data']
415
#This sections performs an integral on the various properties for use in determining total berries produced.
416
plant_calc_data["total_water"] += (delta_d**2*((plant_data["current_water"]/100-plant_calc_data["previous_water"]/100)/(delta_d))/2)+plant_calc_data["previous_water"]/100*delta_d
417
plant_calc_data["total_bugs"] += (delta_d**2*(((1-plant_data["current_bugs"]/100)-(1-plant_calc_data["previous_bugs"]/100))/(delta_d))/2)+(1-plant_calc_data["previous_bugs"]/100)*delta_d
418
plant_calc_data["total_nutrients"] += (delta_d**2*((plant_data["current_nutrients"]/100-plant_calc_data["previous_nutrients"]/100)/(delta_d))/2)+plant_calc_data["previous_nutrients"]/100*delta_d
419
plant_calc_data["total_weeds"] += (delta_d**2*(((1-plant_data["current_weeds"]/100)-(1-plant_calc_data["previous_weeds"]/100))/(delta_d))/2)+(1-plant_calc_data["previous_weeds"]/100)*delta_d
420
collection_nfts[name,'plant_calc_data'] = plant_calc_data
421
422
plant_data['last_calc'] = now
423
collection_nfts[name,"nft_metadata"] = plant_data
424
425
length = metadata['growing_season_length']
426
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))
427
collection_nfts[name,'berries'] = berries
428
collection_nfts[name,'final_score'] = berries
429
plants[plant_generation,'total_berries'] += berries
430
431
if plants[plant_generation, 'claimable_tau'] == 0: #sets the total amount of tau that can be claimed by players.
432
plants[plant_generation, 'claimable_tau'] = plants[plant_generation, 'total_tau']
433
434
collection_nfts[name,'finalized'] == True
435
berries = str(berries)
436
return berries
437
438
@export
439
def sellberries(plant_generation : int, plant_number : int): #redeem berries for TAU. Must be done after plant finalize time is over.
440
name = f'Gen_{plant_generation}_{plant_number}'
441
assert collection_balances[ctx.caller, name] == 1, "You do not own this plant."
442
berries = collection_nfts[name,'berries']
443
assert berries > 0, "You don't have any berries to sell."
444
assert now >= plants[plant_generation, 'finalize_time'], f"You can't sell yet. Try again after {plants[plant_generation, 'finalize_time']} but do not wait too long."
445
sell_price = plants[plant_generation, 'total_tau'] / plants[plant_generation,'total_berries']
446
proceeds = sell_price * berries
447
currency.transfer(amount=proceeds, to=ctx.caller)
448
collection_nfts[name,'berries'] = 0
449
plants[plant_generation, 'claimable_tau'] -= proceeds
450
proceeds = str(proceeds)
451
return proceeds
452
453
def payment(plant_generation, amount): #used to process payments
454
dev_reward = 0.05
455
currency.transfer_from(amount=amount*(1-dev_reward), to=ctx.this, main_account=ctx.caller)
456
currency.transfer_from(amount=amount*dev_reward, to=metadata['operator'], main_account=ctx.caller)
457
plants[plant_generation, 'total_tau'] += amount*(1-dev_reward)
458
459
@export
460
def manual_reward_add(plant_generation : int, amount : int): #used to manually add more tau to the prize pool
461
currency.transfer_from(amount=amount, to=ctx.this, main_account=ctx.caller)
462
plants[plant_generation, 'total_tau'] += amount
463
464
@export
465
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 ample time to sell their berries
466
assert metadata['operator'] == ctx.caller, "Only the operator can claim stale tau."
467
stale_claim_time = plants[plant_generation,'stale_claim_time']
468
assert now >= stale_claim_time, f"The tau is not stale yet and cannot be claimed. Try again after {stale_claim_time}"
469
stale_tau = plants[plant_generation, 'claimable_tau']
470
assert stale_tau > 0, "There is no stale tau to claim."
471
currency.transfer(amount=stale_tau, to=ctx.caller)
472
473
@export
474
def manual_season_end(): #only needed if for some reason there were no finalized plants in the current grow season
475
assert metadata['operator'] == ctx.caller, "Only the operator can do this."
476
assert now > plants['growing_season_end_time'], "You can't end the season before the end_time."
477
plants['growing_season'] = False
478
plants['count'] = 0
479
480
@export
481
def new_nickname(plant_generation : int, plant_number : int, nick : str):
482
name = f'Gen_{plant_generation}_{plant_number}'
483
assert collection_balances[ctx.caller, name] == 1, "You do not own this plant."
484
assert not nick.isdigit(), "The plant nickname can't be an integer."
485
assert bool(collection_nfts[nick]) == False, "This nickname already exists."
486
assert nick.isalnum() == True, "Only alphanumeric characters allowed."
487
assert nick != "", "Name cannot be empty"
488
assert len(nick) >= 3, "The minimum length is 3 characters."
489
payment(plant_generation, 25)
490
collection_nfts[nick] = [plant_generation , plant_number]
491
492
@export
493
def nickname_interaction(nickname : str, function_name :str): #allows players to interact with a plant based on its nickname
494
nick = collection_nfts[nickname]
495
496
function_names = {
497
'water' : water,
498
'squash' : squash,
499
'spraybugs' : spraybugs,
500
'growlights' : growlights,
501
'shade' : shade,
502
'fertilize' : fertilize,
503
'pullweeds' : pullweeds,
504
'sprayweeds' : sprayweeds,
505
'finalize' : finalize,
506
'sellberries' : sellberries
507
}
508
509
return function_names[function_name](nick[0],nick[1])
510
511
@export
512
def enable_emergency_withdraw():
513
emergency_addresses = emergency['addresses']
514
call_address = ctx.caller
515
assert call_address in emergency_addresses.keys(), "You are not approved to do this."
516
emergency_addresses[call_address] = 1
517
emergency['addresses'] = emergency_addresses
518
519
@export
520
def disable_emergency_withdraw():
521
emergency_addresses = emergency['addresses']
522
call_address = ctx.caller
523
assert call_address in emergency_addresses.keys(), "You are not approved to do this."
524
emergency_addresses[call_address] = 0
525
emergency['addresses'] = emergency_addresses
526
527
@export
528
def safe_emergency_withdraw(amount:float): #can only be run if at least 2 of 3 multisig accounts approve of the emergency_withdraw
529
emergency_addresses = emergency['addresses']
530
call_address = ctx.caller
531
approval_check = sum(emergency_addresses.values())
532
assert approval_check >= 2, "An emergency withdrawal is not approved."
533
assert metadata['operator'] == call_address, "Only the operator can claim tau."
534
currency.transfer(amount=amount, to=call_address)
535
536
@export
537
def emergency_withdraw(amount:float): #temporary function used in testing. will be removed from final contract.
538
assert metadata['operator'] == ctx.caller, "Only the operator can claim tau."
539
currency.transfer(amount=amount, to=ctx.caller)
540
Byte Code
e30000000000000000000000000600000040000000731c030000640064016c005a0065016402640364048d025a0265016402640564048d025a03650464006402640664078d035a05650464006402640864078d035a06650464006402640964078d035a07650464006402640a64078d035a0865046402640b64048d025a0965046402640c64048d025a0a65046402640d64048d025a0b650c6a0d83000100640e640f84005a0e650f64028301645d65106510651164119c0364126413840583015a126510651065106513651464149c056415641684045a15650f6402830165106514651064179c0364186419840483015a16650f64028301651465106510641a9c03641b641c840483015a17650f640283016510651465106510641d9c04641e641f840483015a18650f6402830164206421840083015a19650f64028301651064229c0164236424840483015a1a6514651464259c026426642784045a1b6428642984005a1c642a642b84005a1d642c642d84005a1e650f64028301645e651465146514642f9c0364306431840583015a1f650f640283016514651464259c0264326433840483015a20650f640283016514651464259c0264346435840483015a21650f640283016514651464259c0264366437840483015a22650f640283016514651464259c0264386439840483015a23650f64028301645f651465146514642f9c03643a643b840583015a24650f640283016514651464259c02643c643d840483015a25650f640283016514651464259c02643e643f840483015a26650f640283016514651464259c0264406441840483015a27650f640283016514651464259c0264426443840483015a286444644584005a29650f640283016514651464469c0264476448840483015a2a650f64028301651464499c01644a644b840483015a2b650f64028301644c644d840083015a2c650f64028301651465146510644e9c03644f6450840483015a2d650f640283016510651064519c0264526453840483015a2e650f6402830164546455840083015a2f650f6402830164566457840083015a30650f64028301653164589c016459645a840483015a32650f64028301653164589c01645b645c840483015a33640153002960e9000000004eda0e636f6e5f746573746661726d3138da0f636f6c6c656374696f6e5f6e616d652902da08636f6e7472616374da046e616d65da10636f6c6c656374696f6e5f6f776e6572da0f636f6c6c656374696f6e5f6e6674732903da0d64656661756c745f76616c756572040000007205000000da13636f6c6c656374696f6e5f62616c616e636573da1d636f6c6c656374696f6e5f62616c616e6365735f617070726f76616c73da06706c616e7473da086d65746164617461da096e69636b6e616d6573da09656d657267656e6379630000000000000000010000000400000043000000737000000074006a0164018301010074026a0174036a048301010074036a04740564023c006403740564043c006405740564063c006407740564083c0064097406640a3c0074077406640b3c00640c7406640d3c0064127406640f3c00640c640c640c64109c03740864113c0069007d006400530029134eda0b546573745f706c616e7473da086f70657261746f72e902000000da1567726f77696e675f736561736f6e5f6c656e677468e9050000007a0b706c616e74207072696365da0d636f6e5f746573746970667331da0d697066735f636f6e747261637446da0e67726f77696e675f736561736f6eda1967726f77696e675f736561736f6e5f73746172745f74696d657201000000da05636f756e74e901000000da116163746976655f67656e65726174696f6e2903da4061653764313464366439623834343366383831626136323434373237623639623638313031306537383264346665343832646266623062366163613032643564da4034396163656561626463636463623339663863326331313265313130656164316135666566323263363434383235633139313762326466333230346334333366da4065386463373038303238653034393339376235626166393537393932346464653538636535626562656535363535646130623533303636313137353732653733da09616464726573736573e9ffffffff2909da115f5f636f6c6c656374696f6e5f6e616d65da03736574da125f5f636f6c6c656374696f6e5f6f776e6572da03637478da0663616c6c6572da0a5f5f6d65746164617461da085f5f706c616e7473da036e6f77da0b5f5f656d657267656e63792901da0b5f5f6e69636b6e616d6573a900722a000000da00da045f5f5f5f12000000731c00000000010a010c010a010801080108010801080108010803020202010c01722c000000462903da036b6579da096e65775f76616c7565da12636f6e766572745f746f5f646563696d616c630300000000000000030000000300000043000000732e00000074006a017402640119006b02731674036402830182017c02722274047c0183017d017c0174027c003c006400530029034e72100000007a1e6f6e6c79206f70657261746f722063616e20736574206d657461646174612905722300000072240000007225000000da0e417373657274696f6e4572726f72da07646563696d616c2903722d000000722e000000722f000000722a000000722a000000722b000000da0f6368616e67655f6d6574616461746126000000730a00000000021001060104010801723200000029057205000000da0b6465736372697074696f6eda0e697066735f696d6167655f75726cda0c6e66745f6d65746164617461da06616d6f756e74630500000000000000050000000500000043000000736c0000007c0064016b037310740064028301820174017c00190064036b02732474006404830182017c0464036b04733474006405830182017c017c0264067c009b0064079d037c0464089c0474017c003c007c0374017c00640966023c007c04740274036a047c0066023c0064005300290a4e722b0000007a144e616d652063616e6e6f7420626520656d70747972010000007a134e616d6520616c7265616479206578697374737a24596f752063616e6e6f74207472616e73666572206e6567617469766520616d6f756e74737a1453656520636f6c6c656374696f6e5f6e6674735b7a102c276e66745f6d65746164617461275d29047233000000723400000072350000007236000000723500000029057230000000da115f5f636f6c6c656374696f6e5f6e667473da155f5f636f6c6c656374696f6e5f62616c616e63657372230000007224000000290572050000007233000000723400000072350000007236000000722a000000722a000000722b000000da0a5f5f6d696e745f6e66742f000000731000000000021001140110010201020116010c017239000000290372050000007236000000da02746f63030000000000000003000000040000004300000073680000007c0164016b04731074006402830182017c0064036b0373207400640483018201740174026a037c00660219007c016b05733a7400640583018201740174026a037c006602050019007c01380003003c0074017c027c006602050019007c01370003003c006400530029064e72010000007a24596f752063616e6e6f74207472616e73666572206e6567617469766520616d6f756e7473722b0000007a37506c65617365207370656369667920746865206e616d65206f6620746865204e465420796f752077616e7420746f207472616e736665727a22596f7520646f6e2774206861766520656e6f756768204e46547320746f2073656e6429047230000000723800000072230000007224000000290372050000007236000000723a000000722a000000722a000000722b000000da087472616e736665723b000000730c0000000002100110010c010e011601723b000000290372360000007205000000723a000000630300000000000000030000000400000043000000732c0000007c0064016b0473107400640283018201740174026a037c027c016603050019007c00370003003c006400530029034e72010000007a1f43616e6e6f7420617070726f7665206e6567617469766520616d6f756e747329047230000000da1f5f5f636f6c6c656374696f6e5f62616c616e6365735f617070726f76616c7372230000007224000000290372360000007205000000723a000000722a000000722a000000722b000000da07617070726f766545000000730400000000021001723d000000290472050000007236000000723a000000da0c6d61696e5f6163636f756e7463040000000000000004000000060000004300000073960000007c0164016b047310740064028301820174017c037c027c00660319007c016b05733c740064036a0274017c037c027c00660319007c0183028301820174037c037c00660219007c016b057354740064048301820174017c037c027c006603050019007c01380003003c0074037c037c006602050019007c01380003003c0074037c027c006602050019007c01370003003c006400530029054e72010000007a1e43616e6e6f742073656e64206e656761746976652062616c616e636573217a484e6f7420656e6f756768204e46547320617070726f76656420746f2073656e642120596f752068617665207b7d20616e642061726520747279696e6720746f207370656e64207b7d7a184e6f7420656e6f756768204e46547320746f2073656e642129047230000000723c000000da06666f726d61747238000000290472050000007236000000723a000000723e000000722a000000722a000000722b000000da0d7472616e736665725f66726f6d4b0000007312000000000210010c010c0114010a010e0116011401724000000063000000000000000003000000040000004300000073de00000074006a01830074026a036b02731674046401830182017405640219007d007c0064036b02732e74046404830182017406640519007d017405640619007d027c02640737007d026408740564023c007407740564093c00740774086a097c01640a8d0117007405640b3c00740774086a097c01640c1700640d8d01170074057c02640e66023c007c02740564063c00640f74057c02641066023c00640f74057c02641166023c00640f74057c02641266023c00640f74057c02641366023c00740774086a097c0164141700640a8d01170074057c02641566023c006400530029164e7a2a4f6e6c7920746865206f776e65722063616e20737461727420612067726f77696e6720736561736f6e2e7216000000467a1d497420697320616c72656164792067726f77696e6720736561736f6e2e7212000000721a00000072190000005472170000002901da0464617973da1767726f77696e675f736561736f6e5f656e645f74696d65e9060000002901da05686f757273da0d66696e616c697a655f74696d657201000000da0d746f74616c5f62657272696573da1073656c6c61626c655f62657272696573da09746f74616c5f746175da0d636c61696d61626c655f746175e91e000000da107374616c655f636c61696d5f74696d65290a7222000000da03676574722300000072240000007230000000722600000072250000007227000000da086461746574696d65da0974696d6564656c74612903da0b67726f775f736561736f6e7212000000da0a6163746976655f67656e722a000000722a000000722b000000da1473746172745f67726f77696e675f736561736f6e580000007328000000000206011001080110010801080108010801080106010e010601160108010c010c010c010c01060172510000002901da046e69636b63010000000000000008000000100000004300000073a401000074006401190064026b02731474016403830182017c006a0283000c0073267401640483018201740374047c001900830164056b02733e74016406830182017c006a05830064026b02735274016407830182017c0064086b037362740164098301820174067c008301640a6b0573767401640b830182017400640c19007d0174076a08640d640e830274076a08640f64108302641174076a08640d640e830274076a08640f641083026411641274097409740964027409740a6a0b642564138d0117007409740a6a0b642664138d011700641164149c0e7d027c02641519007c02641619007c02641719007c0264181900641164116411641164199c087d037400641a1900641217007d04641b7c019b00641c7c049b009d047d057c017c04670274047c003c00740c7c01740d641d190083020100740e6a0f740d641e190083017d067c066a1083007d0774117c05641f7c077c026412830501007c0374047c05642066023c007c047400641a3c007c02641519007c02642119007c02641619007c02641719007c02641819007c02642219007c02642319007c02642419007c076709530029274e7216000000547a3e5468652067726f77696e6720736561736f6e20686173206e6f7420737461727465642c20736f20796f752063616e6e6f7420627579206120706c616e742e7a2754686520706c616e74206e69636b6e616d652063616e277420626520616e20696e74656765722e467a1d54686973206e69636b6e616d6520616c7265616479206578697374732e7a254f6e6c7920616c7068616e756d65726963206368617261637465727320616c6c6f7765642e722b0000007a144e616d652063616e6e6f7420626520656d707479e9030000007a23546865206d696e696d756d206c656e677468206973203320636861726163746572732e721a000000e946000000e95a0000007213000000e9190000007201000000721900000029017241000000290eda0d63757272656e745f7761746572da0c63757272656e745f62756773da1663757272656e745f70686f746f73796e746865736973da1163757272656e745f6e75747269656e7473da0d63757272656e745f7765656473da1063757272656e745f746f786963697479da0f63757272656e745f77656174686572da106c6173745f696e746572616374696f6eda0a6c6173745f6461696c79da096c6173745f63616c63da05616c697665da106c6173745f7371756173685f77656564da0f6c6173745f67726f775f6c69676874da0b6275726e5f616d6f756e7472570000007258000000725a000000725b0000002908da0e70726576696f75735f7761746572da0d70726576696f75735f62756773da1270726576696f75735f6e75747269656e7473da0e70726576696f75735f7765656473da0b746f74616c5f7761746572da0a746f74616c5f62756773da0f746f74616c5f6e75747269656e7473da0b746f74616c5f77656564737218000000da0447656e5fda015f7a0b706c616e7420707269636572150000007a5c54686973206973206120626c7565626572727920706c616e742e204b65657020697420616c69766520616e64206865616c7468792062792074656e64696e6720746f20697420647572696e672067726f77696e6720736561736f6e2eda0f706c616e745f63616c635f646174617259000000725c0000007264000000725d000000721f000000721f000000291272260000007230000000da0769736469676974da04626f6f6c7237000000da076973616c6e756dda036c656eda0672616e646f6dda0772616e64696e747227000000724d000000724e000000da095f5f7061796d656e747225000000da09696d706f72746c6962da0d696d706f72745f6d6f64756c65da0b7069636b5f72616e646f6d723900000029087252000000da10706c616e745f67656e65726174696f6eda0a706c616e745f64617461726f000000da07705f636f756e747205000000da06697066735f637234000000722a000000722a000000722b000000da096275795f706c616e7470000000734c000000000206010e0112010a010e0114011001140108010a010c010a010e01060110010e01080106010601080108010a010c0110010c010e010e010801040102010a010c01080108010c010c010c01727e0000002902727a000000da0c706c616e745f6e756d62657263020000000000000006000000060000004300000073380100007400640119007d027c007c026b027320740164027c029b0064039d038301820164047c009b0064057c019b009d047d03740274036a047c036602190064066b02734a740164078301820174057400640819006b01735e740164098301820174036a046a06640a8301726e6400530074077c03640b660219007d047c04640c1900640d6b02738e7401640e8301820174057c04640f190074086a09641064118d0117006b04900172087c04641205001900740a6a0b641364148302380003003c007c04641505001900740a6a0b641364148302370003003c007c04641605001900740a6a0b641364148302380003003c007c04641705001900740a6a0b641364148302370003003c00740c7c0483017d04740d7c047c0383027d04740e7c0483017d0474057c04640f3c007c047c0364189c027d057c05530029194e721a0000007a6b54686520706c616e7420796f752061726520747279696e6720746f20696e7465726163742077697468206973206e6f742070617274206f66207468652063757272656e742067656e65726174696f6e2e205468652063757272656e742067656e65726174696f6e20697320da012e726d000000726e00000072190000007a1a596f7520646f206e6f74206f776e207468697320706c616e742e72420000007a495468652067726f77696e6720736561736f6e206973206e6f74206163746976652c20736f20796f752063616e6e6f7420696e746572616374207769746820796f757220706c616e742eda04636f6e5f72350000007261000000547a64596f757220706c616e7420697320646561642064756520746f206e65676c65637420616e6420796f75206d757374206275792061206e657720706c616e7420746f2074727920616761696e2e20547279206e6f7420746f206b696c6c20697420746f6f2e725e000000e90c0000002901724400000072570000007213000000e90f0000007258000000725a000000725b0000002902727b0000007205000000290f722600000072300000007238000000722300000072240000007227000000da0a737461727473776974687237000000724d000000724e00000072740000007275000000da125f5f6461696c795f636f6e646974696f6e73da105f5f746f74616c697a65725f63616c63da0c5f5f646561645f636865636b2906727a000000727f000000721a0000007205000000727b000000da09706c616e745f616c6c722a000000722a000000722b000000da0e5f5f616374696f6e5f73657475709a000000732e00000000010801180110010c010e010e0106010c0104010c0106010e011a01180118011801180108010a01080108010a01728900000063010000000000000002000000060000004300000073c8010000900178c074007c0064011900180074016a02640264038d016b04900172c274036a046402640483027d017c0164026b0272627c0064050500190074036a04640664078302380003003c007c0064080500190074036a046409640a8302370003003c007c01640b6b02729a7c0064050500190074036a04640c640d8302380003003c007c0064080500190074036a04640b64098302370003003c007c0164046b0272d27c0064050500190074036a04640c640e8302370003003c007c0064080500190074036a046402640b8302370003003c007c00640f0500190074036a04640c64078302370003003c007c0064100500190074036a04640c64068302380003003c007c0064110500190074036a04640c64078302370003003c007c0064010500190074016a02640264038d01370003003c007c017c0064123c007c0064130500190074036a046414640b8302380003003c007c006413190064146b009001726864147c0064133c007c006405190064156b049001727e64157c0064053c007c006405190064146b009001729464147c0064053c007c006408190064156b0472047c006416050019007c006408190064151800370003003c0064157c0064083c00710457007c00530029174e725f00000072190000002901724100000072530000007257000000e90a000000e9140000007259000000e904000000724300000072110000007213000000728300000072560000007258000000725a000000725b000000725d000000725c0000007201000000e964000000726400000029057227000000724d000000724e000000727400000072750000002902727b000000725d000000722a000000722a000000722b0000007285000000b4000000733800000000011e010c010801180118010801180118010801180118011801180118011801080118010e0108010e0108010e0108010c010e010a010c01728500000063020000000000000005000000080000004300000073ac01000074007c006401190074016a02640264038d0117006b04900172a874007c006401190018007d027c026a0364041b007d0374047c016405660219007d047c046406050019007c03640713007c006408190064091b007c04640a190064091b0018007c031b00140064071b007c04640a190064091b007c0314001700370003003c007c04640b050019007c0364071300640c7c00640d190064091b001800640c7c04640e190064091b00180018007c031b00140064071b00640c7c04640e190064091b0018007c0314001700370003003c007c04640f050019007c03640713007c006410190064091b007c046411190064091b0018007c031b00140064071b007c046411190064091b007c0314001700370003003c007c046412050019007c0364071300640c7c006413190064091b001800640c7c046414190064091b00180018007c031b00140064071b00640c7c046414190064091b0018007c0314001700370003003c0074007c0064013c007c00640819007c04640a3c007c00640d19007c04640e3c007c00641019007c0464113c007c00641319007c0464143c007c0474047c01640566023c007c00530029154e72600000007253000000290172440000006980510100726f000000726900000072110000007257000000728d0000007265000000726a000000721900000072580000007266000000726b000000725a0000007267000000726c000000725b000000726800000029057227000000724d000000724e000000da077365636f6e647372370000002905727b0000007205000000da0564656c7461da0764656c74615f64726f000000722a000000722a000000722b0000007286000000d3000000732e00000000011a010c010a010c0108022601160108023c010c0108022601160108023c010c0108010c010c010c010c010c017286000000630100000000000000010000000300000043000000735c0000007c006401190064026b0573307c006403190064026b0573307c006404190064026b0573307c006405190064026b05723864067c0064073c007c006408190064096b0173507c00640a190064096b01725864067c0064073c007c005300290b4e725c000000728d0000007258000000725b000000726400000046726100000072570000007201000000725a000000722a0000002901727b000000722a000000722a000000722b0000007287000000f100000073100000000001120114010a010801120106010801728700000072190000002903727a000000727f000000da096e756d5f74696d6573630300000000000000070000000900000043000000739a00000074007c007c0183027d037c03640119007d047c03640219007d05782a740164037c02830244005d1c7d067c0464040500190074026a03640564068302370003003c00712657007c046404190064076b04725a64077c0464043c007c0474047c05640866023c007c04640419007c04640919007c04640a19007c04640b19007c04640c19007c04640d19007c04640e19007c04640f19006708530029104e727b00000072050000007201000000725700000072130000007283000000728d000000723500000072590000007258000000725a000000725b000000725c0000007264000000725d00000029057289000000da0572616e67657274000000727500000072370000002907727a000000727f00000072910000007288000000727b0000007205000000da0178722a000000722a000000722b000000da057761746572fc000000731a00000000020a010801080110011c010c0108010c0108010c010c010c01729400000063020000000000000006000000090000004300000073ba00000074007c007c0183027d027c02640119007d037c02640219007d047c036403190074016a02640464058d0117007d0574037c056b047346740464067c059b0064079d03830182017c0364080500190074056a06640964048302380003003c007c0364081900640a6b007272640a7c0364083c0074037c0364033c007c0374077c04640b66023c007c03640c19007c03640d19007c03640819007c03640e19007c03640f19007c03641019007c03641119007c03641219006708530029134e727b0000007205000000726200000072130000002901da076d696e757465737a3c596f7520617265207374696c6c20737175617368696e672062756773206f722070756c6c696e672077656564732e2054727920616761696e206174207280000000725800000072110000007201000000723500000072570000007259000000725a000000725b000000725c0000007264000000725d00000029087289000000724d000000724e000000722700000072300000007274000000727500000072370000002906727a000000727f0000007288000000727b0000007205000000da07745f64656c7461722a000000722a000000722b000000da067371756173680d010000731e00000000020a01080108011401180118010c01080108010c0108010c010c010c01729700000063020000000000000005000000090000004300000073a800000074007c007c0183027d027c02640119007d037c02640219007d047c0364030500190074016a02640464058302370003003c007c0364060500190074016a02640764088302380003003c007c036406190064096b00725e64097c0364063c0074037c00640a830201007c0374047c04640b66023c007c03640c19007c03640d19007c03640619007c03640e19007c03640f19007c03640319007c03641019007c03641119006708530029124e727b0000007205000000725c000000721900000072530000007258000000728a000000728b00000072010000007213000000723500000072570000007259000000725a000000725b0000007264000000725d0000002905728900000072740000007275000000727600000072370000002905727a000000727f0000007288000000727b0000007205000000722a000000722a000000722b000000da0973707261796275677320010000731c00000000020a0108010801180118010c0108010a010c0108010c010c010c01729800000063020000000000000006000000090000004300000073dc00000074007c007c0183027d027c02640119007d037c02640219007d047c036403190074016a02640464058d0117007d0574037c056b047346740464067c059b0064079d038301820174057c006408830201007c0364090500190074066a07640a64088302370003003c0074037c0364033c007c0364091900640b6b04729c7c03640c050019007c0364091900640b1800370003003c00640b7c0364093c007c0374087c04640d66023c007c03640e19007c03640919007c03640f19007c03641019007c03641119007c03641219007c03640c19007c03641319006708530029144e727b000000720500000072630000007219000000290172410000007a3f596f752068617665207573656420612067726f77206c69676874206f7220736861646520746f6f20726563656e746c792e2054727920616761696e206174207280000000721300000072590000007253000000728d0000007264000000723500000072570000007258000000725a000000725b000000725c000000725d00000029097289000000724d000000724e0000007227000000723000000072760000007274000000727500000072370000002906727a000000727f0000007288000000727b00000072050000007296000000722a000000722a000000722b000000da0a67726f776c696768747332010000732200000000020a0108010801140118010a01180108010c01180108010c0108010c010c010c01729900000063020000000000000006000000090000004300000073ba00000074007c007c0183027d027c02640119007d037c02640219007d047c036403190074016a02640464058d0117007d0574037c056b047346740464067c059b0064079d03830182017c0364080500190074056a066409640a8302380003003c0074037c0364033c007c0364081900640b6b00727a640c7c0364083c007c0374077c04640d66023c007c03640e19007c03640819007c03640f19007c03641019007c03641119007c03641219007c03641319007c03641419006708530029154e727b000000720500000072630000007219000000290172410000007a3f596f752068617665207573656420612067726f77206c69676874206f7220736861646520746f6f20726563656e746c792e2054727920616761696e206174207280000000725900000072530000007213000000728d0000007201000000723500000072570000007258000000725a000000725b000000725c0000007264000000725d00000029087289000000724d000000724e000000722700000072300000007274000000727500000072370000002906727a000000727f0000007288000000727b00000072050000007296000000722a000000722a000000722b000000da05736861646547010000731e00000000020a010801080114011801180108010c0108010c0108010c010c010c01729a00000063030000000000000007000000090000004300000073b200000074007c007c0183027d037c03640119007d047c03640219007d05782a740164037c02830244005d1c7d067c0464040500190074026a03640564068302370003003c00712657007c046404190064076b0472727c046408050019007c046404190064071800370003003c0064077c0464043c007c0474047c05640966023c007c04640a19007c04640b19007c04640c19007c04640419007c04640d19007c04640e19007c04640819007c04640f19006708530029104e727b00000072050000007201000000725a000000728c0000007243000000728d00000072640000007235000000725700000072590000007258000000725b000000725c000000725d0000002905728900000072920000007274000000727500000072370000002907727a000000727f00000072910000007288000000727b00000072050000007293000000722a000000722a000000722b000000da0966657274696c697a655a010000731c00000000020a010801080110011c010c01180108010c0108010c010c010c01729b00000063020000000000000006000000090000004300000073ba00000074007c007c0183027d027c02640119007d037c02640219007d047c036403190074016a02640464058d0117007d0574037c056b047346740464067c059b0064079d03830182017c0364080500190074056a06640964048302380003003c007c0364081900640a6b007272640a7c0364083c0074037c0364033c007c0374077c04640b66023c007c03640c19007c03640d19007c03640e19007c03640f19007c03640819007c03641019007c03641119007c03641219006708530029134e727b000000720500000072620000007213000000290172950000007a3c596f7520617265207374696c6c20737175617368696e672062756773206f722070756c6c696e672077656564732e2054727920616761696e206174207280000000725b000000721100000072010000007235000000725700000072590000007258000000725a000000725c0000007264000000725d00000029087289000000724d000000724e000000722700000072300000007274000000727500000072370000002906727a000000727f0000007288000000727b00000072050000007296000000722a000000722a000000722b000000da0970756c6c77656564736c010000731e00000000020a01080108011401180118010c01080108010c0108010c010c010c01729c000000630200000000000000050000000900000043000000739e00000074007c007c0183027d027c02640119007d037c02640219007d047c0364030500190074016a02640464058302370003003c007c0364060500190074016a02640764088302380003003c007c036406190064096b00725e64097c0364063c007c0374037c04640a66023c007c03640b19007c03640c19007c03640d19007c03640e19007c03640619007c03640319007c03640f19007c03641019006708530029114e727b0000007205000000725c00000072190000007253000000725b000000728a000000728b00000072010000007235000000725700000072590000007258000000725a0000007264000000725d000000290472890000007274000000727500000072370000002905727a000000727f0000007288000000727b0000007205000000722a000000722a000000722b000000da0a737072617977656564737f010000731a00000000020a0108010801180118010c0108010c0108010c010c010c01729d0000006302000000000000000c000000080000004300000073220300007400640119007d027c007c026b027320740164027c029b0064039d038301820164047c009b0064057c019b009d047d03740274036a047c036602190064066b02734a740164078301820174057c0364086602190064096b0273627401640a830182017400640b19007d0474007c00640c660219007d0574067c056b01728674067c046b05739a7401640d7c049b00640e7c059b009d048301820174036a046a07640f830172aa6400530074057c036410660219007d067c066411190064126b0273ca740164138301820174006414190064126b0272e66409740064143c006415740064163c007c047c066417190018007d077c076a0864181b007d0874057c036419660219007d097c09641a050019007c08641b13007c06641c1900641d1b007c09641e1900641d1b0018007c081b001400641b1b007c09641e1900641d1b007c0814001700370003003c007c09641f050019007c08641b130064067c0664201900641d1b00180064067c0964211900641d1b00180018007c081b001400641b1b0064067c0964211900641d1b0018007c0814001700370003003c007c096422050019007c08641b13007c0664231900641d1b007c0964241900641d1b0018007c081b001400641b1b007c0964241900641d1b007c0814001700370003003c007c096425050019007c08641b130064067c0664261900641d1b00180064067c0964271900641d1b00180018007c081b001400641b1b0064067c0964271900641d1b0018007c0814001700370003003c007c0974057c03641966023c0074067c0664173c007c0674057c03641066023c007409642819007d0a740a64297c09641a19007c09641f190014007c096422190014007c096425190014007c0a642a13001b00140064067c06642b1900641d1b00180014007c06642c1900641d1b00140064067c06642d1900641d1b001800140083017d0b7c0b74057c03642e66023c007c0b74057c03642f66023c0074007c0064306602050019007c0b370003003c0074007c0064316602190064156b029003720674007c0064326602190074007c00643166023c0074057c0364086602190064126b020100740b7c0b83017d0b7c0b530029334e721a0000007a6b54686520706c616e7420796f752061726520747279696e6720746f20696e7465726163742077697468206973206e6f742070617274206f66207468652063757272656e742067656e65726174696f6e2e205468652063757272656e742067656e65726174696f6e206973207280000000726d000000726e00000072190000007a1a596f7520646f206e6f74206f776e207468697320706c616e742eda0966696e616c697a6564467a265468697320706c616e742068617320616c7265616479206265656e2066696e616c697a65642e724200000072450000007a334974206973206e6f742074696d6520746f2066696e616c697a6520796f757220706c616e742e20547279206265747765656e207a0520616e6420728100000072350000007261000000547a64596f757220706c616e7420697320646561642064756520746f206e65676c65637420616e6420796f75206d757374206275792061206e657720706c616e7420746f2074727920616761696e2e20547279206e6f7420746f206b696c6c20697420746f6f2e72160000007201000000721800000072600000006980510100726f000000726900000072110000007257000000728d0000007265000000726a00000072580000007266000000726b000000725a0000007267000000726c000000725b0000007268000000721200000069e8030000728c000000725c00000072590000007264000000da0762657272696573da0b66696e616c5f73636f7265724600000072490000007248000000290c72260000007230000000723800000072230000007224000000723700000072270000007284000000728e0000007225000000da03696e74da03737472290c727a000000727f000000721a0000007205000000da08656e645f74696d657245000000727b000000728f0000007290000000726f000000da066c656e677468729f000000722a000000722a000000722b000000da0866696e616c697a6590010000735e00000000020801180110010c010e010a010e0108010c0124010c0104010c0106010e010c01080108010c010a010c0108023c0108023c010c0108022601160108023c010c010c0108010c01080102045a010c010c0114011201020112011001080172a500000063020000000000000006000000050000004300000073ca00000064017c009b0064027c019b009d047d02740074016a027c026602190064036b02732a740364048301820174047c026405660219007d037c0364066b0473467403640783018201740574067c006408660219006b05736e7403640974067c006408660219009b00640a9d038301820174067c00640b6602190074067c00640c660219001b007d047c047c0314007d0574076a087c0574016a02640d8d020100640674047c02640566023c0074067c00640e6602050019007c05380003003c0074097c0583017d057c055300290f4e726d000000726e00000072190000007a1a596f7520646f206e6f74206f776e207468697320706c616e742e729f00000072010000007a23596f7520646f6e2774206861766520616e79206265727269657320746f2073656c6c2e72450000007a24596f752063616e27742073656c6c207965742e2054727920616761696e206166746572207a1a2062757420646f206e6f74207761697420746f6f206c6f6e672e7248000000724600000029027236000000723a0000007249000000290a7238000000722300000072240000007230000000723700000072270000007226000000da0863757272656e6379723b00000072a20000002906727a000000727f0000007205000000729f000000da0a73656c6c5f7072696365da0870726f6365656473722a000000722a000000722b000000da0b73656c6c62657272696573ca010000731e000000000210010c010e010c011001120116010c010c01080110010c011401080172a9000000630200000000000000030000000600000043000000735e0000007400640183017d0274016a027c0164027c021800140074036a0474036a0564038d03010074016a027c017c02140074066404190074036a0564038d03010074077c0064056602050019007c0164027c0218001400370003003c006400530029064e7a04302e3035721900000029037236000000723a000000723e000000721000000072480000002908723100000072a600000072400000007223000000da04746869737224000000722500000072260000002903727a0000007236000000da0a6465765f726577617264722a000000722a000000722b0000007276000000dd010000730c0000000001080112010a010c010e0172760000002902727a0000007236000000630200000000000000020000000500000043000000732c00000074006a017c0174026a0374026a0464018d03010074057c0064026602050019007c01370003003c006400530029034e29037236000000723a000000723e0000007248000000290672a60000007240000000722300000072aa000000722400000072260000002902727a0000007236000000722a000000722a000000722b000000da116d616e75616c5f7265776172645f616464e601000073040000000002140172ac0000002901727a000000630100000000000000030000000400000043000000736800000074006401190074016a026b027316740364028301820174047c006403660219007d0174057c016b057338740364047c019b009d028301820174047c006405660219007d027c0264066b047354740364078301820174066a077c0274016a0264088d0201006400530029094e72100000007a264f6e6c7920746865206f70657261746f722063616e20636c61696d207374616c65207461752e724b0000007a4054686520746175206973206e6f74207374616c652079657420616e642063616e6e6f7420626520636c61696d65642e2054727920616761696e20616674657220724900000072010000007a1f5468657265206973206e6f207374616c652074617520746f20636c61696d2e29027236000000723a000000290872250000007223000000722400000072300000007226000000722700000072a6000000723b0000002903727a000000724b000000da097374616c655f746175722a000000722a000000722b000000da0c7374616c655f636c61696d73ec010000730e0000000002060110010c0116010c01100172ae000000630000000000000000000000000300000043000000733e00000074006401190074016a026b027316740364028301820174047405640319006b04732a74036404830182016405740564063c006407740564083c006400530029094e72100000007a1e4f6e6c7920746865206f70657261746f722063616e20646f20746869732e72420000007a2d596f752063616e277420656e642074686520736561736f6e206265666f72652074686520656e645f74696d652e467216000000720100000072180000002906722500000072230000007224000000723000000072270000007226000000722a000000722a000000722a000000722b000000da116d616e75616c5f736561736f6e5f656e64f7010000730c0000000002060110010e010601080172af0000002903727a000000727f000000725200000063030000000000000004000000040000004300000073a600000064017c009b0064027c019b009d047d03740074016a027c036602190064036b02732a74036404830182017c026a0483000c00733c7403640583018201740574067c021900830164066b02735474036407830182017c026a07830064086b02736874036409830182017c02640a6b0373787403640b8301820174087c028301640c6b05738c7403640d8301820174097c00640e830201007c007c01670274067c023c0064005300290f4e726d000000726e00000072190000007a1a596f7520646f206e6f74206f776e207468697320706c616e742e7a2754686520706c616e74206e69636b6e616d652063616e277420626520616e20696e74656765722e467a1d54686973206e69636b6e616d6520616c7265616479206578697374732e547a254f6e6c7920616c7068616e756d65726963206368617261637465727320616c6c6f7765642e722b0000007a144e616d652063616e6e6f7420626520656d70747972530000007a23546865206d696e696d756d206c656e677468206973203320636861726163746572732e7256000000290a72380000007223000000722400000072300000007270000000727100000072370000007272000000727300000072760000002904727a000000727f00000072520000007205000000722a000000722a000000722b000000da0c6e65775f6e69636b6e616d65010200007316000000000210010c010e0112010a010e011401100114010a0172b00000002902da086e69636b6e616d65da0d66756e6374696f6e5f6e616d65630200000000000000040000000b00000043000000733800000074007c0019007d02740174027403740474057406740774087409740a64019c0a7d037c037c0119007c02640219007c02640319008302530029044e290a7294000000729700000072980000007299000000729a000000729b000000729c000000729d00000072a500000072a900000072010000007219000000290b72370000007294000000729700000072980000007299000000729a000000729b000000729c000000729d00000072a500000072a9000000290472b100000072b20000007252000000da0e66756e6374696f6e5f6e616d6573722a000000722a000000722b000000da146e69636b6e616d655f696e746572616374696f6e10020000730c000000000208010401060106010a0172b400000063000000000000000002000000030000004300000073360000007400640119007d0074016a027d017c017c006a0383006b067322740464028301820164037c007c013c007c00740064013c006400530029044e721e0000007a20596f7520617265206e6f7420617070726f76656420746f20646f20746869732e72190000002905722800000072230000007224000000da046b65797372300000002902da13656d657267656e63795f616464726573736573da0c63616c6c5f61646472657373722a000000722a000000722b000000da19656e61626c655f656d657267656e63795f77697468647261771a020000730c0000000002080106010e010601080172b800000063000000000000000002000000030000004300000073360000007400640119007d0074016a027d017c017c006a0383006b067322740464028301820164037c007c013c007c00740064013c006400530029044e721e0000007a20596f7520617265206e6f7420617070726f76656420746f20646f20746869732e7201000000290572280000007223000000722400000072b50000007230000000290272b600000072b7000000722a000000722a000000722b000000da1a64697361626c655f656d657267656e63795f776974686472617724020000730c0000000002080106010e010601080172b90000002901723600000063010000000000000004000000040000004300000073500000007400640119007d0174016a027d0274037c016a04830083017d037c0364026b05732a74056403830182017406640419007c026b02733e740564058301820174076a087c007c0264068d0201006400530029074e721e00000072110000007a28416e20656d657267656e6379207769746864726177616c206973206e6f7420617070726f7665642e72100000007a204f6e6c7920746865206f70657261746f722063616e20636c61696d207461752e29027236000000723a0000002909722800000072230000007224000000da0373756dda0676616c7565737230000000722500000072a6000000723b0000002904723600000072b600000072b7000000da0e617070726f76616c5f636865636b722a000000722a000000722b000000da17736166655f656d657267656e63795f77697468647261772e020000730e0000000002080106010c01100106010e0172bd000000630100000000000000010000000400000043000000732a00000074006401190074016a026b027316740364028301820174046a057c0074016a0264038d0201006400530029044e72100000007a204f6e6c7920746865206f70657261746f722063616e20636c61696d207461752e29027236000000723a0000002906722500000072230000007224000000723000000072a6000000723b00000029017236000000722a000000722a000000722b000000da12656d657267656e63795f776974686472617739020000730600000000020601100172be0000002901462901721900000029017219000000293472a6000000da085661726961626c6572200000007222000000da044861736872370000007238000000723c00000072260000007225000000722900000072280000007274000000da0473656564722c000000da085f5f6578706f727472a200000072710000007232000000da046469637472a10000007239000000723b000000723d00000072400000007251000000727e00000072890000007285000000728600000072870000007294000000729700000072980000007299000000729a000000729b000000729c000000729d00000072a500000072a9000000727600000072ac00000072ae00000072af00000072b000000072b400000072b800000072b9000000da05666c6f617472bd00000072be000000722a000000722a000000722a000000722b000000da083c6d6f64756c653e01000000738800000008010c0104010801060108010601080104010a010e010c010c010c0108030814060116080601100b06011409060114050601160c101806011029101a081f081e080b060116100601121206011211060112140601121206011611060112120601121006011239060112120809060112050601100a100a0601140e06011209100a100a0601100a0601