· 6 years ago · Nov 13, 2019, 04:12 PM
1
2from selenium import webdriver
3from flask import Flask
4import time
5import os
6import shutil
7import sqlite3
8import csv
9import json
10import pandas as pd
11
12def teste_danzo():
13
14 # OPEN URL / ABRE PÁGINA
15 print('Hi! I´m DANZO. i need some Computers info to start')
16 chrome = str(input('chromedrive path: '))
17 # C:\Windows\chromedriver.exe
18 local = str(input('downloads path: '))
19 # C:\Users\wamore\Downloads
20 print('Now i need some informations about what do you want')
21
22 # RouboVeiculo
23 # FurtoVeiculo
24 # RouboCelular
25 # Latrocinio
26 selectcrime = str(input('select type of crime: '))
27 if selectcrime == 'RouboVeiculo':
28 crime = "RouboVeiculo"
29 elif selectcrime == 'FurtoVeiculo':
30 crime = "FurtoVeiculo"
31 elif selectcrime == 'RouboCelular':
32 crime = "RouboCelular"
33 elif selectcrime == 'Latrocinio':
34 crime = "Latrocinio"
35
36 selectmonth = str(input('select month: '))
37 if selectmonth == 'Janeiro':
38 month = "1"
39 elif selectmonth == 'Fevereiro':
40 month = "2"
41 elif selectmonth == 'Março':
42 month = "3"
43 elif selectmonth == 'Abril':
44 month = "4"
45 elif selectmonth == 'Maio':
46 month = "5"
47 elif selectmonth == 'Junho':
48 month = "6"
49 elif selectmonth == 'Julho':
50 month = "7"
51 elif selectmonth == 'Agosto':
52 month = "8"
53 elif selectmonth == 'Setembro':
54 month = "9"
55 elif selectmonth == 'Outubro':
56 month = "10"
57 elif selectmonth == 'Novembro':
58 month = "11"
59 elif selectmonth == 'Dezembro':
60 month = "12"
61
62 selectyear = str(input('selecione year: '))
63 if selectyear == '2015':
64 year = "15"
65 elif selectyear == '2016':
66 year = "16"
67 elif selectyear == '2017':
68 year = "17"
69 elif selectyear == '2018':
70 year = "18"
71 elif selectyear == '2019':
72 year = "19"
73 elif selectyear == '2020':
74 year = "20"
75 print('Now i will open the URL to find the archives')
76 url = 'http://www.ssp.sp.gov.br/transparenciassp/Consulta.aspx'
77 # driver = webdriver.Chrome(executable_path='https://sites.google.com/a/chromium.org/chromedriver/downloads')
78 # o local do chromedriver.exe varia de pc para pc, se possivel alocar conforme linha abaixo
79 driver = webdriver.Chrome(executable_path=chrome)
80 driver.get(url)
81 driver.maximize_window()
82 driver.implicitly_wait(3)
83
84 name = "20" + year + "_" + month + ""
85
86 print('Now, I´m choosing the criteria give 4 u.')
87 driver.find_element_by_xpath("//*[@id='cphBody_btn" + str(crime) + "']").click()
88 driver.implicitly_wait(1)
89 driver.find_element_by_xpath("//*[@id='cphBody_filtroDepartamento']").send_keys("DEINTER 1 - SAO JOSE DOS CAMPOS")
90 driver.implicitly_wait(1)
91 driver.find_element_by_xpath("//*[@id='cphBody_filtroSeccional']").send_keys("DEL.SEC.S.JOSÉ DOS CAMPOS")
92 driver.implicitly_wait(1)
93 driver.find_element_by_xpath("//*[@id='cphBody_filtroDelegacia']").send_keys("05° D.P. S.JOSE DOS CAMPOS")
94 driver.implicitly_wait(1)
95 driver.find_element_by_xpath("//*[@id='cphBody_lkAno" + str(year) + "']").click()
96 driver.implicitly_wait(1)
97 driver.find_element_by_xpath("//*[@id='cphBody_lkMes" + str(month) + "']").click()
98 driver.implicitly_wait(1)
99 driver.find_element_by_xpath("//*[@id='cphBody_ExportarBOLink']").click()
100 driver.implicitly_wait(1)
101 time.sleep(3)
102
103 # fechar a página web
104 driver.close()
105
106 # criando o diretório para armazenar os dados:
107 print('Creating a folder...')
108 danzo = r'C:\DANZO'
109 try:
110 os.mkdir(danzo)
111 except FileExistsError as e:
112 print('A pasta DANZO já foi criada!')
113 repository = r'C:\DANZO\repository'
114 time.sleep(3)
115 try:
116 os.mkdir(repository)
117 except FileExistsError as e:
118 print('A pasta repository já foi criada!')
119 time.sleep(3)
120
121 if crime == 'RouboVeiculo':
122 crime = "ROUBO DE VEÍCULOS"
123 elif crime == 'FurtoVeiculo':
124 crime = "FURTO DE VEÍCULOS"
125 elif crime == 'RouboCelular':
126 crime = "ROUBO DE CELULAR"
127 elif crime == 'Latrocinio':
128 crime = "LATROCÍNIO"
129
130 # enviando arquivos para o diretório
131 download = '' + str(local) + '\DadosBO_' + str(name) + '(' + str(crime) + ').xls'
132 diretory = '' + str(repository) + '\DadosBO_' + str(name) + '(' + str(crime) + ').xls'
133 shutil.move(download, diretory)
134 time.sleep(3)
135 print('folder OK!')
136
137 # criando banco de dados
138 conn = sqlite3.connect(danzo + '\database.db')
139 cursor = conn.cursor()
140
141
142 def select_all(conn):
143
144 #Query all rows in the tasks table
145 #:param conn: the Connection object
146 #:return:
147
148 cur = conn.cursor()
149 cur.execute("SELECT * FROM RouboVeiculo")
150
151 rows = cur.fetchall()
152
153 lista = []
154 for row in rows:
155 lista.append(row)
156
157 jsonDadosBanco = json.dumps(lista)
158 print(jsonDadosBanco)
159
160 # para iniciar o servidor local (localhost) escreva o seguinte comando no terminal do windows (cmd): python -m http.server
161 # para acessar o localhost, entre no seu navegador no localhost:8000 (porta 8000 padrao web local)
162
163 # criando as tabelas no banco de dados e buscando informações de acordo com o tipo de crime
164
165 if crime == "ROUBO DE VEÍCULOS":
166 cursor.execute(
167 "CREATE TABLE IF NOT EXISTS RouboVeiculo (ano_bo,num_bo,numero_boletim,bo_iniciado,bo_emitido,dataocorrencia,peridoocorrencia,datacomunicacao,dataelaboracao,bo_autoria,flagrante,numero_boletim_principal,logradouro,numero,bairro,cidade,uf,latitude,longitude,descricaolocal,exame,solucao,delegacia_nome,delegacia_circunscricao,especie,rubrica,desdobramento,status,nomepessoa,tipopessoa,vitimafatal,rg,rg_uf,naturalidade,nacionalidade,sexo,datanascimento,idade,estadocivil,profissao,grauinstrucao,corcutis,naturezavinculada,tipovinculo,relacionamento,parentesco,placa_veiculo,uf_veiculo,cidade_veiculo,descr_cor_veiculo,descr_marca_veiculo,ano_fabricacao,ano_modelo,descr_tipo_veiculo,quant_celular,marca_celular);")
168 # tratando o arquivo
169 f = open(repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').xls')
170 f = f.read()
171 f = f.lower().replace('\x00', '').replace(' ', '_').replace('\t', ";")
172 n = len(f)
173 arquivo = open(repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').csv', 'w')
174 arquivo.write(f)
175 arquivo.close()
176 with open(repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').csv') as File:
177 reader = csv.reader(File, delimiter=';')
178 for coluna in reader:
179 lista = [(coluna[0]), (coluna[1]), (coluna[2]), (coluna[3]), (coluna[4]), (coluna[5]), (coluna[6]),
180 (coluna[7]), (coluna[8]), (coluna[9]), (coluna[10]), (coluna[11]), (coluna[12]), (coluna[13]),
181 (coluna[14]), (coluna[15]), (coluna[16]), (coluna[17]), (coluna[18]), (coluna[19]), (coluna[20]),
182 (coluna[21]), (coluna[22]), (coluna[23]), (coluna[24]), (coluna[25]), (coluna[26]), (coluna[27]),
183 (coluna[28]), (coluna[29]), (coluna[30]), (coluna[31]), (coluna[32]), (coluna[33]), (coluna[34]),
184 (coluna[35]), (coluna[36]), (coluna[37]), (coluna[38]), (coluna[39]), (coluna[40]), (coluna[41]),
185 (coluna[42]), (coluna[43]), (coluna[44]), (coluna[45]), (coluna[46]), (coluna[47]), (coluna[48]),
186 (coluna[49]), (coluna[50]), (coluna[51]), (coluna[52]), (coluna[53]), (coluna[54]), (coluna[55])]
187 cursor.execute("""INSERT INTO RouboVeiculo (ano_bo,num_bo,numero_boletim,bo_iniciado,bo_emitido,dataocorrencia,peridoocorrencia,datacomunicacao,dataelaboracao,bo_autoria,flagrante,numero_boletim_principal,logradouro,numero,bairro,cidade,uf,latitude,longitude,descricaolocal,exame,solucao,delegacia_nome,delegacia_circunscricao,especie,rubrica,desdobramento,status,nomepessoa,tipopessoa,vitimafatal,rg,rg_uf,naturalidade,nacionalidade,sexo,datanascimento,idade,estadocivil,profissao,grauinstrucao,corcutis,naturezavinculada,tipovinculo,relacionamento,parentesco,placa_veiculo,uf_veiculo,cidade_veiculo,descr_cor_veiculo,descr_marca_veiculo,ano_fabricacao,ano_modelo,descr_tipo_veiculo,quant_celular,marca_celular)
188 VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);""",
189 lista)
190 conn.commit()
191 # excluindo .xls e .csv
192 myfile = repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').xls'
193 ## If file exists, delete it ##
194 if os.path.isfile(myfile):
195 os.remove(myfile)
196 else: ## Show an error ##
197 print("Error: %s file not found" % myfile)
198 myfile = repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').csv'
199 ## If file exists, delete it ##
200 if os.path.isfile(myfile):
201 os.remove(myfile)
202 else: ## Show an error ##
203 print("Error: %s file not found" % myfile)
204
205 elif crime == 'FURTO DE VEÍCULOS':
206 cursor.execute(
207 "CREATE TABLE IF NOT EXISTS FurtoVeiculo (ano_bo,num_bo,numero_boletim,bo_iniciado,bo_emitido,dataocorrencia,peridoocorrencia,datacomunicacao,dataelaboracao,bo_autoria,flagrante,numero_boletim_principal,logradouro,numero,bairro,cidade,uf,latitude,longitude,descricaolocal,exame,solucao,delegacia_nome,delegacia_circunscricao,especie,rubrica,desdobramento,status,nomepessoa,tipopessoa,vitimafatal,rg,rg_uf,naturalidade,nacionalidade,sexo,datanascimento,idade,estadocivil,profissao,grauinstrucao,corcutis,naturezavinculada,tipovinculo,relacionamento,parentesco,placa_veiculo,uf_veiculo,cidade_veiculo,descr_cor_veiculo,descr_marca_veiculo,ano_fabricacao,ano_modelo,descr_tipo_veiculo,quant_celular,marca_celular);")
208 # tratando o arquivo
209 f = open(repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').xls')
210 f = f.read()
211 f = f.lower().replace('\x00', '').replace(' ', '_').replace('\t', ";")
212 n = len(f)
213 arquivo = open(repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').csv', 'w')
214 arquivo.write(f)
215 arquivo.close()
216 with open(repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').csv') as File:
217 reader = csv.reader(File, delimiter=';')
218 for coluna in reader:
219 lista = [(coluna[0]), (coluna[1]), (coluna[2]), (coluna[3]), (coluna[4]), (coluna[5]), (coluna[6]),
220 (coluna[7]), (coluna[8]), (coluna[9]), (coluna[10]), (coluna[11]), (coluna[12]), (coluna[13]),
221 (coluna[14]), (coluna[15]), (coluna[16]), (coluna[17]), (coluna[18]), (coluna[19]), (coluna[20]),
222 (coluna[21]), (coluna[22]), (coluna[23]), (coluna[24]), (coluna[25]), (coluna[26]), (coluna[27]),
223 (coluna[28]), (coluna[29]), (coluna[30]), (coluna[31]), (coluna[32]), (coluna[33]), (coluna[34]),
224 (coluna[35]), (coluna[36]), (coluna[37]), (coluna[38]), (coluna[39]), (coluna[40]), (coluna[41]),
225 (coluna[42]), (coluna[43]), (coluna[44]), (coluna[45]), (coluna[46]), (coluna[47]), (coluna[48]),
226 (coluna[49]), (coluna[50]), (coluna[51]), (coluna[52]), (coluna[53]), (coluna[54]), (coluna[55])]
227 cursor.execute("""INSERT INTO FurtoVeiculo (ano_bo,num_bo,numero_boletim,bo_iniciado,bo_emitido,dataocorrencia,peridoocorrencia,datacomunicacao,dataelaboracao,bo_autoria,flagrante,numero_boletim_principal,logradouro,numero,bairro,cidade,uf,latitude,longitude,descricaolocal,exame,solucao,delegacia_nome,delegacia_circunscricao,especie,rubrica,desdobramento,status,nomepessoa,tipopessoa,vitimafatal,rg,rg_uf,naturalidade,nacionalidade,sexo,datanascimento,idade,estadocivil,profissao,grauinstrucao,corcutis,naturezavinculada,tipovinculo,relacionamento,parentesco,placa_veiculo,uf_veiculo,cidade_veiculo,descr_cor_veiculo,descr_marca_veiculo,ano_fabricacao,ano_modelo,descr_tipo_veiculo,quant_celular,marca_celular)
228 VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);""",
229 lista)
230 conn.commit()
231 # excluindo .xls e .csv
232 myfile = repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').xls'
233 ## If file exists, delete it ##
234 if os.path.isfile(myfile):
235 os.remove(myfile)
236 else: ## Show an error ##
237 print("Error: %s file not found" % myfile)
238 myfile = repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').csv'
239 ## If file exists, delete it ##
240 if os.path.isfile(myfile):
241 os.remove(myfile)
242 else: ## Show an error ##
243 print("Error: %s file not found" % myfile)
244
245 elif crime == 'ROUBO DE CELULAR':
246 cursor.execute(
247 "CREATE TABLE IF NOT EXISTS RouboCelular (ano_bo,num_bo,numero_boletim,bo_iniciado,bo_emitido,dataocorrencia,peridoocorrencia,datacomunicacao,dataelaboracao,bo_autoria,flagrante,numero_boletim_principal,logradouro,numero,bairro,cidade,uf,latitude,longitude,descricaolocal,exame,solucao,delegacia_nome,delegacia_circunscricao,especie,rubrica,desdobramento,status,nomepessoa,tipopessoa,vitimafatal,rg,rg_uf,naturalidade,nacionalidade,sexo,datanascimento,idade,estadocivil,profissao,grauinstrucao,corcutis,naturezavinculada,tipovinculo,relacionamento,parentesco,placa_veiculo,uf_veiculo,cidade_veiculo,descr_cor_veiculo,descr_marca_veiculo,ano_fabricacao,ano_modelo,descr_tipo_veiculo,quant_celular,marca_celular);")
248 # tratando o arquivo
249 f = open(repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').xls')
250 f = f.read()
251 f = f.lower().replace('\x00', '').replace(' ', '_').replace('\t', ";")
252 n = len(f)
253 arquivo = open(repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').csv', 'w')
254 arquivo.write(f)
255 arquivo.close()
256 with open(repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').csv') as File:
257 reader = csv.reader(File, delimiter=';')
258 for coluna in reader:
259 lista = [(coluna[0]), (coluna[1]), (coluna[2]), (coluna[3]), (coluna[4]), (coluna[5]), (coluna[6]),
260 (coluna[7]), (coluna[8]), (coluna[9]), (coluna[10]), (coluna[11]), (coluna[12]), (coluna[13]),
261 (coluna[14]), (coluna[15]), (coluna[16]), (coluna[17]), (coluna[18]), (coluna[19]), (coluna[20]),
262 (coluna[21]), (coluna[22]), (coluna[23]), (coluna[24]), (coluna[25]), (coluna[26]), (coluna[27]),
263 (coluna[28]), (coluna[29]), (coluna[30]), (coluna[31]), (coluna[32]), (coluna[33]), (coluna[34]),
264 (coluna[35]), (coluna[36]), (coluna[37]), (coluna[38]), (coluna[39]), (coluna[40]), (coluna[41]),
265 (coluna[42]), (coluna[43]), (coluna[44]), (coluna[45]), (coluna[46]), (coluna[47]), (coluna[48]),
266 (coluna[49]), (coluna[50]), (coluna[51]), (coluna[52]), (coluna[53]), (coluna[54]), (coluna[55])]
267 cursor.execute("""INSERT INTO RouboCelular (ano_bo,num_bo,numero_boletim,bo_iniciado,bo_emitido,dataocorrencia,peridoocorrencia,datacomunicacao,dataelaboracao,bo_autoria,flagrante,numero_boletim_principal,logradouro,numero,bairro,cidade,uf,latitude,longitude,descricaolocal,exame,solucao,delegacia_nome,delegacia_circunscricao,especie,rubrica,desdobramento,status,nomepessoa,tipopessoa,vitimafatal,rg,rg_uf,naturalidade,nacionalidade,sexo,datanascimento,idade,estadocivil,profissao,grauinstrucao,corcutis,naturezavinculada,tipovinculo,relacionamento,parentesco,placa_veiculo,uf_veiculo,cidade_veiculo,descr_cor_veiculo,descr_marca_veiculo,ano_fabricacao,ano_modelo,descr_tipo_veiculo,quant_celular,marca_celular)
268 VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);""",
269 lista)
270 conn.commit()
271 # excluindo .xls e .csv
272 myfile = repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').xls'
273 ## If file exists, delete it ##
274 if os.path.isfile(myfile):
275 os.remove(myfile)
276 else: ## Show an error ##
277 print("Error: %s file not found" % myfile)
278 myfile = repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').csv'
279 ## If file exists, delete it ##
280 if os.path.isfile(myfile):
281 os.remove(myfile)
282 else: ## Show an error ##
283 print("Error: %s file not found" % myfile)
284
285
286 elif crime == 'LATROCÍNIO':
287 cursor.execute(
288 "CREATE TABLE IF NOT EXISTS Latrocinio (ano_bo,num_bo,numero_boletim,bo_iniciado,bo_emitido,dataocorrencia,peridoocorrencia,datacomunicacao,dataelaboracao,bo_autoria,flagrante,numero_boletim_principal,logradouro,numero,bairro,cidade,uf,latitude,longitude,descricaolocal,exame,solucao,delegacia_nome,delegacia_circunscricao,especie,rubrica,desdobramento,status,nomepessoa,tipopessoa,vitimafatal,rg,rg_uf,naturalidade,nacionalidade,sexo,datanascimento,idade,estadocivil,profissao,grauinstrucao,corcutis,naturezavinculada,tipovinculo,relacionamento,parentesco,placa_veiculo,uf_veiculo,cidade_veiculo,descr_cor_veiculo,descr_marca_veiculo,ano_fabricacao,ano_modelo,descr_tipo_veiculo,quant_celular,marca_celular);")
289 # tratando o arquivo
290 f = open(repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').xls')
291 f = f.read()
292 f = f.lower().replace('\x00', '').replace(' ', '_').replace('\t', ";")
293 n = len(f)
294 arquivo = open(repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').csv', 'w')
295 arquivo.write(f)
296 arquivo.close()
297 with open(repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').csv') as File:
298 reader = csv.reader(File, delimiter=';')
299 for coluna in reader:
300 lista = [(coluna[0]), (coluna[1]), (coluna[2]), (coluna[3]), (coluna[4]), (coluna[5]), (coluna[6]),
301 (coluna[7]), (coluna[8]), (coluna[9]), (coluna[10]), (coluna[11]), (coluna[12]), (coluna[13]),
302 (coluna[14]), (coluna[15]), (coluna[16]), (coluna[17]), (coluna[18]), (coluna[19]), (coluna[20]),
303 (coluna[21]), (coluna[22]), (coluna[23]), (coluna[24]), (coluna[25]), (coluna[26]), (coluna[27]),
304 (coluna[28]), (coluna[29]), (coluna[30]), (coluna[31]), (coluna[32]), (coluna[33]), (coluna[34]),
305 (coluna[35]), (coluna[36]), (coluna[37]), (coluna[38]), (coluna[39]), (coluna[40]), (coluna[41]),
306 (coluna[42]), (coluna[43]), (coluna[44]), (coluna[45]), (coluna[46]), (coluna[47]), (coluna[48]),
307 (coluna[49]), (coluna[50]), (coluna[51]), (coluna[52]), (coluna[53]), (coluna[54]), (coluna[55])]
308 cursor.execute("""INSERT INTO Latrocinio (ano_bo,num_bo,numero_boletim,bo_iniciado,bo_emitido,dataocorrencia,peridoocorrencia,datacomunicacao,dataelaboracao,bo_autoria,flagrante,numero_boletim_principal,logradouro,numero,bairro,cidade,uf,latitude,longitude,descricaolocal,exame,solucao,delegacia_nome,delegacia_circunscricao,especie,rubrica,desdobramento,status,nomepessoa,tipopessoa,vitimafatal,rg,rg_uf,naturalidade,nacionalidade,sexo,datanascimento,idade,estadocivil,profissao,grauinstrucao,corcutis,naturezavinculada,tipovinculo,relacionamento,parentesco,placa_veiculo,uf_veiculo,cidade_veiculo,descr_cor_veiculo,descr_marca_veiculo,ano_fabricacao,ano_modelo,descr_tipo_veiculo,quant_celular,marca_celular)
309 VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);""",
310 lista)
311 conn.commit()
312 # excluindo .xls e .csv
313 myfile = repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').xls'
314 ## If file exists, delete it ##
315 if os.path.isfile(myfile):
316 os.remove(myfile)
317 else: ## Show an error ##
318 print("Error: %s file not found" % myfile)
319 myfile = repository + '\DadosBO_' + str(name) + '(' + str(crime) + ').csv'
320 ## If file exists, delete it ##
321 if os.path.isfile(myfile):
322 os.remove(myfile)
323 else: ## Show an error ##
324 print("Error: %s file not found" % myfile)
325
326 print("Finalizado.")
327 select_all(conn)
328 return()
329
330 app.run()