Update database model for new guesses

This commit is contained in:
2024-02-14 14:38:41 +01:00
parent 2ca7cee539
commit c56c94d794
10 changed files with 219 additions and 117 deletions

View File

@ -1,23 +0,0 @@
name,team,country_code
NONE,NONE,NO
Max Verstappen,RedBull,NL
Sergio Perez,RedBull,MX
Lewis Hamilton,Mercedes,UK
George Russel,Mercedes,UK
Charles Leclerc,Ferrari,MC
Carlos Sainz,Ferrari,ES
Lando Norris,McLaren,UK
Oscar Piastri,McLaren,AU
Fernando Alonso,Aston Martin,ES
Lance Stroll,Aston Martin,CA
Pierre Gasly,Alpine,FR
Esteban Ocon,Alpine,FR
Alexander Albon,Williams,TH
Logan Sargeant,Williams,US
Yuki Tsunoda,AlphaTauri,JP
Daniel Ricciardo,AlphaTauri,AU
Valteri Bottas,Alfa Romeo,FL
Zhou Guanyu,Alfa Romeo,CN
Nico Hulkenberg,Haas,DE
Kevin Magnussen,Haas,DK
Nyck de Vries,AlphaTauri,NL
1 name team country_code
2 NONE NONE NO
3 Max Verstappen RedBull NL
4 Sergio Perez RedBull MX
5 Lewis Hamilton Mercedes UK
6 George Russel Mercedes UK
7 Charles Leclerc Ferrari MC
8 Carlos Sainz Ferrari ES
9 Lando Norris McLaren UK
10 Oscar Piastri McLaren AU
11 Fernando Alonso Aston Martin ES
12 Lance Stroll Aston Martin CA
13 Pierre Gasly Alpine FR
14 Esteban Ocon Alpine FR
15 Alexander Albon Williams TH
16 Logan Sargeant Williams US
17 Yuki Tsunoda AlphaTauri JP
18 Daniel Ricciardo AlphaTauri AU
19 Valteri Bottas Alfa Romeo FL
20 Zhou Guanyu Alfa Romeo CN
21 Nico Hulkenberg Haas DE
22 Kevin Magnussen Haas DK
23 Nyck de Vries AlphaTauri NL

View File

@ -1,20 +0,0 @@
id,user_id,race_id,p10_id,dnf_id,raceresult_id
1,Henri,1,Valteri Bottas,Zhou Guanyu,1
2,Henri,2,Valteri Bottas,Logan Sargeant,2
3,Henri,3,Alexander Albon,Valteri Bottas,3
4,Henri,4,Oscar Piastri,Nyck de Vries,4
5,Henri,5,Esteban Ocon,Charles Leclerc,5
6,Henri,7,Yuki Tsunoda,Charles Leclerc,6
7,Henri,8,Charles Leclerc,Carlos Sainz,7
8,Henri,9,Oscar Piastri,Kevin Magnussen,8
9,Henri,10,Alexander Albon,NONE,9
10,Henri,11,Pierre Gasly,Yuki Tsunoda,10
11,Henri,12,Esteban Ocon,Kevin Magnussen,11
12,Henri,13,Lance Stroll,Esteban Ocon,12
13,Henri,14,Lance Stroll,Pierre Gasly,13
14,Henri,15,Oscar Piastri,Alexander Albon,14
15,Henri,16,Pierre Gasly,Logan Sargeant,15
16,Henri,17,Fernando Alonso,Logan Sargeant,16
17,Henri,18,Alexander Albon,Logan Sargeant,17
18,Henri,19,Yuki Tsunoda,Logan Sargeant,18
19,Henri,20,Valteri Bottas,Logan Sargeant,19
1 id user_id race_id p10_id dnf_id raceresult_id
2 1 Henri 1 Valteri Bottas Zhou Guanyu 1
3 2 Henri 2 Valteri Bottas Logan Sargeant 2
4 3 Henri 3 Alexander Albon Valteri Bottas 3
5 4 Henri 4 Oscar Piastri Nyck de Vries 4
6 5 Henri 5 Esteban Ocon Charles Leclerc 5
7 6 Henri 7 Yuki Tsunoda Charles Leclerc 6
8 7 Henri 8 Charles Leclerc Carlos Sainz 7
9 8 Henri 9 Oscar Piastri Kevin Magnussen 8
10 9 Henri 10 Alexander Albon NONE 9
11 10 Henri 11 Pierre Gasly Yuki Tsunoda 10
12 11 Henri 12 Esteban Ocon Kevin Magnussen 11
13 12 Henri 13 Lance Stroll Esteban Ocon 12
14 13 Henri 14 Lance Stroll Pierre Gasly 13
15 14 Henri 15 Oscar Piastri Alexander Albon 14
16 15 Henri 16 Pierre Gasly Logan Sargeant 15
17 16 Henri 17 Fernando Alonso Logan Sargeant 16
18 17 Henri 18 Alexander Albon Logan Sargeant 17
19 18 Henri 19 Yuki Tsunoda Logan Sargeant 18
20 19 Henri 20 Valteri Bottas Logan Sargeant 19

View File

@ -1,20 +0,0 @@
id,race_id,p10_id,dnf_id
1,1,Alexander Albon,Oscar Piastri
2,2,Kevin Magnussen,Lance Stroll
3,3,Yuki Tsunoda,Charles Leclerc
4,4,Yuki Tsunoda,Nyck de Vries
5,5,Kevin Magnussen,NONE
6,7,Oscar Piastri,Lance Stroll
7,8,Pierre Gasly,NONE
8,9,Valteri Bottas,Logan Sargeant
9,10,Pierre Gasly,Nico Hulkenberg
10,11,Carlos Sainz,Esteban Ocon
11,12,Lance Stroll,Pierre Gasly
12,13,Yuki Tsunoda,Oscar Piastri
13,14,Esteban Ocon,Logan Sargeant
14,15,Valteri Bottas,Esteban Ocon
15,16,Kevin Magnussen,Yuki Tsunoda
16,17,Pierre Gasly,Valteri Bottas
17,18,Sergio Perez,Lewis Hamilton
18,19,Logan Sargeant,Esteban Ocon
19,20,Esteban Ocon,Sergio Perez
1 id race_id p10_id dnf_id
2 1 1 Alexander Albon Oscar Piastri
3 2 2 Kevin Magnussen Lance Stroll
4 3 3 Yuki Tsunoda Charles Leclerc
5 4 4 Yuki Tsunoda Nyck de Vries
6 5 5 Kevin Magnussen NONE
7 6 7 Oscar Piastri Lance Stroll
8 7 8 Pierre Gasly NONE
9 8 9 Valteri Bottas Logan Sargeant
10 9 10 Pierre Gasly Nico Hulkenberg
11 10 11 Carlos Sainz Esteban Ocon
12 11 12 Lance Stroll Pierre Gasly
13 12 13 Yuki Tsunoda Oscar Piastri
14 13 14 Esteban Ocon Logan Sargeant
15 14 15 Valteri Bottas Esteban Ocon
16 15 16 Kevin Magnussen Yuki Tsunoda
17 16 17 Pierre Gasly Valteri Bottas
18 17 18 Sergio Perez Lewis Hamilton
19 18 19 Logan Sargeant Esteban Ocon
20 19 20 Esteban Ocon Sergio Perez

View File

@ -1,2 +0,0 @@
name
Henri
1 name
2 Henri

View File

@ -3,7 +3,7 @@ from model import *
def load_csv(filename):
with open("data/" + filename + ".csv", newline="") as file:
with open("init_data/" + filename + ".csv", newline="") as file:
reader = csv.reader(file, delimiter=",")
next(reader, None) # skip header
return list(reader)
@ -11,12 +11,10 @@ def load_csv(filename):
# @todo CSV-Writer
def write_csv(filename):
with open("data/" + filename + ".csv", newline="") as file:
with open("dynamic_data/" + filename + ".csv", newline="") as file:
writer = csv.writer(file, delimiter=",")
# @todo Complete CSV Files
# @todo Reload Static Data
# Reload static database data, this has to be called from the app context
def reload_static_data(db):
print("Initializing DataBase with Static Values...")
@ -24,23 +22,20 @@ def reload_static_data(db):
db.create_all()
# Clear static data
Team.query.delete()
Driver.query.delete()
Race.query.delete()
RaceResult.query.delete()
User.query.delete()
Guess.query.delete()
# Reload static data
for row in load_csv("teams"):
db.session.add(Team().from_csv(row))
for row in load_csv("drivers"):
db.session.add(Driver().from_csv(row))
for row in load_csv("races"):
db.session.add(Race().from_csv(row))
for row in load_csv("raceresults"):
db.session.add(RaceResult().from_csv(row))
for row in load_csv("users"):
db.session.add(User().from_csv(row))
for row in load_csv("guesses"):
db.session.add(Guess().from_csv(row))
db.session.commit()

22
init_data/drivers.csv Normal file
View File

@ -0,0 +1,22 @@
name,abbr,team_id,country_code
NONE,NON,NONE,NO
Alexander Albon,ALB,Williams,TH
Fernando Alonso,ALO,Aston Martin,ES
Valteri Bottas,BOT,Stake,FL
Pierre Gasly,GAS,Alpine,FR
Lewis Hamilton,HAM,Mercedes,UK
Nico Hulkenberg,HUL,Haas,DE
Charles Leclerc,LEC,Ferrari,MC
Kevin Magnussen,MAG,Haas,DK
Lando Norris,NOR,McLaren,UK
Esteban Ocon,OCO,Alpine,FR
Sergio Perez,PER,RedBull,MX
Oscar Piastri,PIA,McLaren,AU
Daniel Ricciardo,RIC,VCARB,AU
George Russel,RUS,Mercedes,UK
Carlos Sainz,SAI,Ferrari,ES
Logan Sargeant,SAR,Williams,US
Lance Stroll,STR,Aston Martin,CA
Yuki Tsunoda,TSU,VCARB,JP
Max Verstappen,VER,RedBull,NL
Zhou Guanyu,ZHO,Stake,CN
1 name abbr team_id country_code
2 NONE NON NONE NO
3 Alexander Albon ALB Williams TH
4 Fernando Alonso ALO Aston Martin ES
5 Valteri Bottas BOT Stake FL
6 Pierre Gasly GAS Alpine FR
7 Lewis Hamilton HAM Mercedes UK
8 Nico Hulkenberg HUL Haas DE
9 Charles Leclerc LEC Ferrari MC
10 Kevin Magnussen MAG Haas DK
11 Lando Norris NOR McLaren UK
12 Esteban Ocon OCO Alpine FR
13 Sergio Perez PER RedBull MX
14 Oscar Piastri PIA McLaren AU
15 Daniel Ricciardo RIC VCARB AU
16 George Russel RUS Mercedes UK
17 Carlos Sainz SAI Ferrari ES
18 Logan Sargeant SAR Williams US
19 Lance Stroll STR Aston Martin CA
20 Yuki Tsunoda TSU VCARB JP
21 Max Verstappen VER RedBull NL
22 Zhou Guanyu ZHO Stake CN

11
init_data/teams.csv Normal file
View File

@ -0,0 +1,11 @@
team
Alpine
Aston Martin
Ferrari
Haas
McLaren
Mercedes
RedBull
Stake
VCARB
Williams
1 team
2 Alpine
3 Aston Martin
4 Ferrari
5 Haas
6 McLaren
7 Mercedes
8 RedBull
9 Stake
10 VCARB
11 Williams

11
init_data/users.csv Normal file
View File

@ -0,0 +1,11 @@
name
Henri
Christoph
Vinzent
Sven
Linus
Phil
Ipp
Melissa
Julian
Käptn
1 name
2 Henri
3 Christoph
4 Vinzent
5 Sven
6 Linus
7 Phil
8 Ipp
9 Melissa
10 Julian
11 Käptn

212
model.py
View File

@ -6,6 +6,17 @@ from datetime import datetime
db = SQLAlchemy()
# This table contains users that can guess
class User(db.Model):
__tablename__ = "user"
def from_csv(self, row):
self.name = str(row[0])
return self
name: Mapped[str] = mapped_column(String(32), primary_key=True)
# This table contains manifestations of GPs, with dates
class Race(db.Model):
__tablename__ = "race"
@ -18,30 +29,40 @@ class Race(db.Model):
return self
id: Mapped[int] = mapped_column(Integer, primary_key=True)
grandprix: Mapped[str] = mapped_column(String(32))
number: Mapped[int] = mapped_column(Integer)
date: Mapped[datetime] = mapped_column(DateTime)
class Team(db.Model):
__tablename__ = "team"
def from_csv(self, row):
self.name = str(row[0])
return self
name: Mapped[str] = mapped_column(String(32), primary_key=True)
# This table contains drivers and their team associations, e.g. Max Verschtappen
class Driver(db.Model):
__tablename__ = "driver"
def from_csv(self, row):
self.name = str(row[0])
self.team = str(row[1])
self.country_code = str(row[2])
self.abbr = str(row[1])
self.team_id = str(row[2])
self.country_code = str(row[3])
return self
name: Mapped[str] = mapped_column(String(32), primary_key=True)
team: Mapped[str] = mapped_column(String(32))
abbr: Mapped[str] = mapped_column(String(3))
team_id: Mapped[str] = mapped_column(ForeignKey("team.name"))
country_code: Mapped[str] = mapped_column(String(2)) # alpha-2 code
# Relationships
team: Mapped["Team"] = relationship("Team", foreign_keys=[team_id])
class RaceResult(db.Model):
__tablename__ = "raceresult"
@ -49,31 +70,133 @@ class RaceResult(db.Model):
def from_csv(self, row):
self.id = int(row[0])
self.race_id = str(row[1])
self.p10_id = str(row[2])
self.dnf_id = str(row[3])
self.p01_id = str(row[2])
self.p02_id = str(row[3])
self.p03_id = str(row[4])
self.p04_id = str(row[5])
self.p05_id = str(row[6])
self.p06_id = str(row[7])
self.p07_id = str(row[8])
self.p08_id = str(row[9])
self.p09_id = str(row[10])
self.p10_id = str(row[11])
self.p11_id = str(row[12])
self.p12_id = str(row[13])
self.p13_id = str(row[14])
self.p14_id = str(row[15])
self.p15_id = str(row[16])
self.p16_id = str(row[17])
self.p17_id = str(row[18])
self.p18_id = str(row[19])
self.p19_id = str(row[20])
self.p20_id = str(row[21])
self.dnf01_id = str(row[22])
self.dnf02_id = str(row[23])
self.dnf03_id = str(row[24])
self.dnf04_id = str(row[25])
self.dnf05_id = str(row[26])
self.dnf06_id = str(row[27])
self.dnf07_id = str(row[28])
self.dnf08_id = str(row[29])
self.dnf09_id = str(row[30])
self.dnf10_id = str(row[31])
self.dnf11_id = str(row[32])
self.dnf12_id = str(row[33])
self.dnf13_id = str(row[34])
self.dnf14_id = str(row[35])
self.dnf15_id = str(row[36])
self.dnf16_id = str(row[37])
self.dnf17_id = str(row[38])
self.dnf18_id = str(row[39])
self.dnf19_id = str(row[40])
self.dnf20_id = str(row[41])
return self
id: Mapped[int] = mapped_column(Integer, primary_key=True)
race_id: Mapped[str] = mapped_column(ForeignKey("race.id"))
race: Mapped["Race"] = relationship("Race", foreign_keys=[race_id])
p01_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p02_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p03_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p04_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p05_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p06_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p07_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p08_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p09_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p10_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p11_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p12_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p13_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p14_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p15_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p16_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p17_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p18_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p19_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p20_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf01_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf02_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf03_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf04_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf05_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf06_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf07_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf08_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf09_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf10_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf11_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf12_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf13_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf14_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf15_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf16_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf17_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf18_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf19_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf20_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
# Relationships
race: Mapped["Race"] = relationship("Race", foreign_keys=[race_id])
p01: Mapped["Driver"] = relationship("Driver", foreign_keys=[p01_id])
p02: Mapped["Driver"] = relationship("Driver", foreign_keys=[p02_id])
p03: Mapped["Driver"] = relationship("Driver", foreign_keys=[p03_id])
p04: Mapped["Driver"] = relationship("Driver", foreign_keys=[p04_id])
p05: Mapped["Driver"] = relationship("Driver", foreign_keys=[p05_id])
p06: Mapped["Driver"] = relationship("Driver", foreign_keys=[p06_id])
p07: Mapped["Driver"] = relationship("Driver", foreign_keys=[p07_id])
p08: Mapped["Driver"] = relationship("Driver", foreign_keys=[p08_id])
p09: Mapped["Driver"] = relationship("Driver", foreign_keys=[p09_id])
p10: Mapped["Driver"] = relationship("Driver", foreign_keys=[p10_id])
dnf_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf_id]) # Only store first DNF
# This table contains users that can guess
class User(db.Model):
__tablename__ = "user"
def from_csv(self, row):
self.name = str(row[0])
return self
name: Mapped[str] = mapped_column(String(32), primary_key=True)
p11: Mapped["Driver"] = relationship("Driver", foreign_keys=[p11_id])
p12: Mapped["Driver"] = relationship("Driver", foreign_keys=[p12_id])
p13: Mapped["Driver"] = relationship("Driver", foreign_keys=[p13_id])
p14: Mapped["Driver"] = relationship("Driver", foreign_keys=[p14_id])
p15: Mapped["Driver"] = relationship("Driver", foreign_keys=[p15_id])
p16: Mapped["Driver"] = relationship("Driver", foreign_keys=[p16_id])
p17: Mapped["Driver"] = relationship("Driver", foreign_keys=[p17_id])
p18: Mapped["Driver"] = relationship("Driver", foreign_keys=[p18_id])
p19: Mapped["Driver"] = relationship("Driver", foreign_keys=[p19_id])
p20: Mapped["Driver"] = relationship("Driver", foreign_keys=[p20_id])
dnf01: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf01_id])
dnf02: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf02_id])
dnf03: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf03_id])
dnf04: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf04_id])
dnf05: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf05_id])
dnf06: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf06_id])
dnf07: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf07_id])
dnf08: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf08_id])
dnf09: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf09_id])
dnf10: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf10_id])
dnf11: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf11_id])
dnf12: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf12_id])
dnf13: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf13_id])
dnf14: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf14_id])
dnf15: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf15_id])
dnf16: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf16_id])
dnf17: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf17_id])
dnf18: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf18_id])
dnf19: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf19_id])
dnf20: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf20_id])
# Per race guesses: PX, DNF
@ -81,32 +204,37 @@ class User(db.Model):
# At least 1 podium
# This table contains guesses made by users
class Guess(db.Model):
__tablename__ = "guess"
# This table contains race guesses made by users
class RaceGuess(db.Model):
__tablename__ = "raceguess"
def from_csv(self, row):
self.id = int(row[0])
self.user_id = str(row[1])
self.race_id = str(row[2])
self.p10_id = str(row[3])
self.pXX_id = str(row[3])
self.dnf_id = str(row[4])
self.raceresult_id = int(row[5])
return self
id: Mapped[int] = mapped_column(Integer, primary_key=True)
user_id: Mapped[str] = mapped_column(ForeignKey("user.name"))
user: Mapped["User"] = relationship("User", foreign_keys=[user_id])
race_id: Mapped[str] = mapped_column(ForeignKey("race.id"))
race: Mapped["Race"] = relationship("Race", foreign_keys=[race_id])
p10_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
p10: Mapped["Driver"] = relationship("Driver", foreign_keys=[p10_id])
pXX_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
dnf_id: Mapped[str] = mapped_column(ForeignKey("driver.name"))
# Relationships
user: Mapped["User"] = relationship("User", foreign_keys=[user_id])
race: Mapped["Race"] = relationship("Race", foreign_keys=[race_id])
pXX: Mapped["Driver"] = relationship("Driver", foreign_keys=[pXX_id])
dnf: Mapped["Driver"] = relationship("Driver", foreign_keys=[dnf_id])
raceresult_id: Mapped[int] = mapped_column(ForeignKey("raceresult.id"))
raceresult: Mapped["RaceResult"] = relationship("RaceResult", foreign_keys=[raceresult_id])
class SeasonGuess(db.Model):
__tablename__ = "seasonguess"
def from_csv(self, row):
return self
id: Mapped[int] = mapped_column(Integer, primary_key=True)
user_id: Mapped[str] = mapped_column(ForeignKey("user.name"))
hot_take: Mapped[str] = mapped_column(String(512))