From 3772942c78702115eae8cee4cc769733703848f7 Mon Sep 17 00:00:00 2001 From: Gazebo Date: Sun, 12 Jul 2020 22:28:17 -0300 Subject: [PATCH] DeletandoDados/ArrumandoDatas --- .../DevicesFragments/ViewDevicesFragment.java | 44 ++++++++-- .../ViewInteractionFragment.java | 51 +++++------ .../AddHomeWorkFragment.java | 10 ++- .../ViewHomeWorkFragment.java | 80 +++++++++++++----- .../ViewProjectsFragment.java | 41 +++++++-- Server/DataBase.py | 6 +- Server/__pycache__/DataBase.cpython-36.pyc | Bin 5454 -> 5374 bytes 7 files changed, 165 insertions(+), 67 deletions(-) diff --git a/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/DevicesFragments/ViewDevicesFragment.java b/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/DevicesFragments/ViewDevicesFragment.java index b1e016b..903d4f9 100644 --- a/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/DevicesFragments/ViewDevicesFragment.java +++ b/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/DevicesFragments/ViewDevicesFragment.java @@ -1,6 +1,8 @@ package com.gazeboindustries.sextafeiramobile.Fragments.DevicesFragments; import android.annotation.SuppressLint; +import android.app.AlertDialog; +import android.content.DialogInterface; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; @@ -36,11 +38,17 @@ public class ViewDevicesFragment extends Fragment { private ServerConnection connection; + private AlertDialog.Builder removeAlert; + private AlertDialog removeDialog; + + @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_viewdevice, container, false); + connection = new ServerConnection(); + txtDevice = view.findViewById(R.id.txtViewDevice); txtDescription = view.findViewById(R.id.txtViewDeviceDescription); @@ -53,6 +61,29 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c btnEditSend = view.findViewById(R.id.btnEditDevice); btnDeleteCancel = view.findViewById(R.id.btnRemoveDevice); + removeAlert = new AlertDialog.Builder(view.getContext()); + removeAlert.setMessage("Deseja remover a interação?"); + removeAlert.setCancelable(false); + + removeAlert.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + Toast.makeText(getContext(), "Cancelado", Toast.LENGTH_SHORT).show(); + } + }); + + removeAlert.setPositiveButton("Excluir", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + connection.sendRequest(connection.prepareDelete("deleteDevice", ID)); + + if(connection.getMsgStatus()) { + Toast.makeText(getContext(), "Excluído", Toast.LENGTH_SHORT).show(); + }else{ + Toast.makeText(getContext(), "Erro ao remover device", Toast.LENGTH_SHORT).show(); + } + } + }); btnEditSend.setOnClickListener(new View.OnClickListener() { @SuppressLint("SetTextI18n") @@ -72,7 +103,6 @@ public void onClick(View view) { btnDeleteCancel.setCompoundDrawablesWithIntrinsicBounds(cancelIcon, null, null, null); }else{ - connection = new ServerConnection(); connection.sendRequest(connection.prepareUpdateDevice("updateDevice", ID, txtDevice.getText().toString(), txtDescription.getText().toString(), "json")); @@ -89,18 +119,14 @@ public void onClick(View view) { btnDeleteCancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - if(btnDeleteCancel.getText().equals("Remover")){ - - //Adicionar log de confirmação - connection = new ServerConnection(); - - connection.sendRequest(connection.prepareDelete("deleteDevice", ID)); - + if(btnDeleteCancel.getText().equals("Excluir")){ + removeDialog = removeAlert.create(); + removeDialog.show(); }else{ txtDevice.setEnabled(false); txtDescription.setEnabled(false); - btnDeleteCancel.setText("Remover"); + btnDeleteCancel.setText("Excluir"); btnEditSend.setText("Editar"); editIcon = getResources().getDrawable(R.drawable.ic_edit_black_24dp); diff --git a/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/InteractionsFragments/ViewInteractionFragment.java b/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/InteractionsFragments/ViewInteractionFragment.java index f1f991a..1764593 100644 --- a/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/InteractionsFragments/ViewInteractionFragment.java +++ b/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/InteractionsFragments/ViewInteractionFragment.java @@ -54,24 +54,7 @@ public class ViewInteractionFragment extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_viewinteractions, container, false); - removeAlert = new AlertDialog.Builder(view.getContext()); - removeAlert.setMessage("Deseja remover a interação?"); - removeAlert.setCancelable(false); - - removeAlert.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - Toast.makeText(getContext(), "Cancelado", Toast.LENGTH_SHORT).show(); - } - }); - - removeAlert.setPositiveButton("Remover", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - Toast.makeText(getContext(), "Removido", Toast.LENGTH_SHORT).show(); - - } - }); + connection = new ServerConnection(); keyWord1 = view.findViewById(R.id.txtViewInteractionKeyword1); keyWord2 = view.findViewById(R.id.txtViewInteractionKeyword2); @@ -95,6 +78,30 @@ public void onClick(DialogInterface dialogInterface, int i) { response3.setText(intent.getStringExtra("Response3")); command.setText(intent.getStringExtra("Command")); + removeAlert = new AlertDialog.Builder(view.getContext()); + removeAlert.setMessage("Deseja remover a interação?"); + removeAlert.setCancelable(false); + + removeAlert.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + Toast.makeText(getContext(), "Cancelado", Toast.LENGTH_SHORT).show(); + } + }); + + removeAlert.setPositiveButton("Excluir", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + connection.sendRequest(connection.prepareDelete("deleteInteraction", ID)); + + if(connection.getMsgStatus()) { + Toast.makeText(getContext(), "Excluído", Toast.LENGTH_SHORT).show(); + }else{ + Toast.makeText(getContext(), "Erro ao remover Interação", Toast.LENGTH_SHORT).show(); + } + } + }); + btnEditSend.setOnClickListener(new View.OnClickListener() { @SuppressLint("SetTextI18n") @Override @@ -118,7 +125,6 @@ public void onClick(View view) { btnDeleteCancel.setCompoundDrawablesWithIntrinsicBounds(cancelIcon, null, null, null); }else{ - connection = new ServerConnection(); connection.sendRequest(connection.prepareUpdateInteraction("updateInteraction", ID, keyWord1.getText().toString(), keyWord2.getText().toString(), keyWord3.getText().toString(), response1.getText().toString(), response2.getText().toString(), response3.getText().toString(), @@ -137,13 +143,10 @@ public void onClick(View view) { @SuppressLint("SetTextI18n") @Override public void onClick(View view) { - if(btnDeleteCancel.getText().equals("Remover")){ + if(btnDeleteCancel.getText().equals("Excluir")){ removeDialog = removeAlert.create(); removeDialog.show(); - //connection = new ServerConnection(); - - }else{ keyWord1.setEnabled(false); keyWord2.setEnabled(false); @@ -153,7 +156,7 @@ public void onClick(View view) { response3.setEnabled(false); command.setEnabled(false); - btnDeleteCancel.setText("Remover"); + btnDeleteCancel.setText("Excluir"); btnEditSend.setText("Editar"); editIcon = getResources().getDrawable(R.drawable.ic_edit_black_24dp); diff --git a/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/SkillsFragments/HomeworkFragments/AddHomeWorkFragment.java b/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/SkillsFragments/HomeworkFragments/AddHomeWorkFragment.java index 7c54a18..7ec3e94 100644 --- a/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/SkillsFragments/HomeworkFragments/AddHomeWorkFragment.java +++ b/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/SkillsFragments/HomeworkFragments/AddHomeWorkFragment.java @@ -17,6 +17,7 @@ import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.Date; public class AddHomeWorkFragment extends Fragment { private Button btnAddHomeWork; @@ -28,11 +29,14 @@ public class AddHomeWorkFragment extends Fragment { private ServerConnection connection; private SimpleDateFormat sdf; + private SimpleDateFormat dateOutput; + private Date dateFormated; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { sdf = new SimpleDateFormat("dd/MM/yyyy"); + dateOutput = new SimpleDateFormat("yyyy-MM-dd"); View view = inflater.inflate(R.layout.fragment_addhomework, container, false); @@ -50,10 +54,10 @@ public void onClick(View view) { connection = new ServerConnection(); try { - sdf.parse(delivery.getText().toString()); + dateFormated = sdf.parse(delivery.getText().toString()); - connection.sendRequest(connection.prepareAddHomework("insertHomeWork", type.getText().toString(), subject.getText().toString(), - homeWork.getText().toString(), delivery.getText().toString(), desc.getText().toString())); + connection.sendRequest(connection.prepareAddHomework("insertHomeWork", type.getText().toString(), subject.getText().toString(), + homeWork.getText().toString(), dateOutput.format(dateFormated), desc.getText().toString())); if(connection.getMsgStatus()){ Toast.makeText(view.getContext(), "Tarefa enviada", Toast.LENGTH_SHORT).show(); diff --git a/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/SkillsFragments/HomeworkFragments/ViewHomeWorkFragment.java b/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/SkillsFragments/HomeworkFragments/ViewHomeWorkFragment.java index ebd427f..3525bd5 100644 --- a/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/SkillsFragments/HomeworkFragments/ViewHomeWorkFragment.java +++ b/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/SkillsFragments/HomeworkFragments/ViewHomeWorkFragment.java @@ -1,6 +1,8 @@ package com.gazeboindustries.sextafeiramobile.Fragments.SkillsFragments.HomeworkFragments; import android.annotation.SuppressLint; +import android.app.AlertDialog; +import android.content.DialogInterface; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; @@ -40,16 +42,24 @@ public class ViewHomeWorkFragment extends Fragment { private Drawable removeIcon; private SimpleDateFormat sdf; + private SimpleDateFormat dateOutput; + private Date dateFormated; private ServerConnection connection; private int ID; + private AlertDialog.Builder removeAlert; + private AlertDialog removeDialog; + @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_viewhomework, container, false); + connection = new ServerConnection(); + sdf = new SimpleDateFormat("dd/MM/yyyy"); + dateOutput = new SimpleDateFormat("yyyy-MM-dd"); txtType = view.findViewById(R.id.txtViewHomeWorkType); @@ -70,6 +80,30 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c txtDelivery.setText(intent.getStringExtra("Delivery")); txtDescription.setText(intent.getStringExtra("Description")); + removeAlert = new AlertDialog.Builder(view.getContext()); + removeAlert.setMessage("Deseja remover a interação?"); + removeAlert.setCancelable(false); + + removeAlert.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + Toast.makeText(getContext(), "Cancelado", Toast.LENGTH_SHORT).show(); + } + }); + + removeAlert.setPositiveButton("Excluir", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + connection.sendRequest(connection.prepareDelete("deleteHomeWork", ID)); + + if(connection.getMsgStatus()) { + Toast.makeText(getContext(), "Excluído", Toast.LENGTH_SHORT).show(); + }else{ + Toast.makeText(getContext(), "Erro ao remover tarefa", Toast.LENGTH_SHORT).show(); + } + } + }); + btnEditSend.setOnClickListener(new View.OnClickListener() { @SuppressLint("SetTextI18n") @Override @@ -92,15 +126,31 @@ public void onClick(View view) { }else{ try { - sdf.parse(txtDelivery.getText().toString()); + dateFormated = sdf.parse(txtDelivery.getText().toString()); + + connection.sendRequest(connection.prepareUpdateHomework("updateHomeWork", ID, txtType.getText().toString(), txtSubject.getText().toString(), + txtHomeWork.getText().toString(), dateOutput.format(dateFormated), txtDescription.getText().toString())); + + + txtType.setEnabled(false); + txtSubject.setEnabled(false); + txtHomeWork.setEnabled(false); + txtDelivery.setEnabled(false); + txtDescription.setEnabled(false); + + btnDeleteCancel.setText("Excluir"); + btnEditSend.setText("Editar"); - } catch (ParseException e) { + editIcon = getResources().getDrawable(R.drawable.ic_edit_black_24dp); + removeIcon = getResources().getDrawable(R.drawable.ic_delete_black_24dp); + + btnEditSend.setCompoundDrawablesWithIntrinsicBounds(editIcon, null, null, null); + btnDeleteCancel.setCompoundDrawablesWithIntrinsicBounds(removeIcon, null, null, null); + + } catch (ParseException e ) { Toast.makeText(view.getContext(), "Insira um formato válido", Toast.LENGTH_SHORT).show(); } - connection = new ServerConnection(); - connection.sendRequest(connection.prepareUpdateHomework("updateHomeWork", ID, txtType.getText().toString(), txtSubject.getText().toString(), - txtHomeWork.getText().toString(), txtDelivery.getText().toString(), txtDescription.getText().toString())); if(connection.getMsgStatus()){ Toast.makeText(getContext(), "Salvo", Toast.LENGTH_SHORT).show(); @@ -114,25 +164,11 @@ public void onClick(View view) { btnDeleteCancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - if(btnDeleteCancel.getText().equals("Remover")){ - //show dialog - System.out.println("Remove"); + if(btnDeleteCancel.getText().equals("Excluir")){ + removeDialog = removeAlert.create(); + removeDialog.show(); }else{ - txtType.setEnabled(false); - txtSubject.setEnabled(false); - txtHomeWork.setEnabled(false); - txtDelivery.setEnabled(false); - txtDescription.setEnabled(false); - - btnDeleteCancel.setText("Remover"); - btnEditSend.setText("Editar"); - - editIcon = getResources().getDrawable(R.drawable.ic_edit_black_24dp); - removeIcon = getResources().getDrawable(R.drawable.ic_delete_black_24dp); - - btnEditSend.setCompoundDrawablesWithIntrinsicBounds(editIcon, null, null, null); - btnDeleteCancel.setCompoundDrawablesWithIntrinsicBounds(removeIcon, null, null, null); txtType.setText(intent.getStringExtra("Type")); txtSubject.setText(intent.getStringExtra("Subject")); diff --git a/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/SkillsFragments/ProjectsFragments/ViewProjectsFragment.java b/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/SkillsFragments/ProjectsFragments/ViewProjectsFragment.java index 58090ef..3c35370 100644 --- a/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/SkillsFragments/ProjectsFragments/ViewProjectsFragment.java +++ b/App/app/src/main/java/com/gazeboindustries/sextafeiramobile/Fragments/SkillsFragments/ProjectsFragments/ViewProjectsFragment.java @@ -1,6 +1,8 @@ package com.gazeboindustries.sextafeiramobile.Fragments.SkillsFragments.ProjectsFragments; import android.annotation.SuppressLint; +import android.app.AlertDialog; +import android.content.DialogInterface; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; @@ -35,11 +37,16 @@ public class ViewProjectsFragment extends Fragment { private ServerConnection connection; private int ID; + private AlertDialog.Builder removeAlert; + private AlertDialog removeDialog; + @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_viewproject , container, false); + connection = new ServerConnection(); + txtProject = view.findViewById(R.id.txtViewProject); txtRepository = view.findViewById(R.id.txtViewRepository); @@ -52,6 +59,30 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c txtProject.setText(intent.getStringExtra("Project")); txtRepository.setText(intent.getStringExtra("Repository")); + removeAlert = new AlertDialog.Builder(view.getContext()); + removeAlert.setMessage("Deseja remover a interação?"); + removeAlert.setCancelable(false); + + removeAlert.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + Toast.makeText(getContext(), "Cancelado", Toast.LENGTH_SHORT).show(); + } + }); + + removeAlert.setPositiveButton("Excluir", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + connection.sendRequest(connection.prepareDelete("deleteProject", ID)); + + if(connection.getMsgStatus()) { + Toast.makeText(getContext(), "Excluído", Toast.LENGTH_SHORT).show(); + }else{ + Toast.makeText(getContext(), "Erro ao remover projeto", Toast.LENGTH_SHORT).show(); + } + } + }); + btnEditSend.setOnClickListener(new View.OnClickListener() { @SuppressLint("SetTextI18n") @Override @@ -71,8 +102,6 @@ public void onClick(View view) { btnDeleteCancel.setCompoundDrawablesWithIntrinsicBounds(cancelIcon, null, null, null); }else{ - connection = new ServerConnection(); - connection.sendRequest(connection.prepareUpdateProject("updateProject", ID, txtProject.getText().toString(), txtRepository.getText().toString())); if(connection.getMsgStatus()){ @@ -87,15 +116,15 @@ public void onClick(View view) { btnDeleteCancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - if(btnDeleteCancel.getText().equals("Remover")){ - //show dialog - System.out.println("Remove"); + if(btnDeleteCancel.getText().equals("Excluir")){ + removeDialog = removeAlert.create(); + removeDialog.show(); }else{ txtProject.setEnabled(false); txtRepository.setEnabled(false); - btnDeleteCancel.setText("Remover"); + btnDeleteCancel.setText("Excluir"); btnEditSend.setText("Editar"); editIcon = getResources().getDrawable(R.drawable.ic_edit_black_24dp); diff --git a/Server/DataBase.py b/Server/DataBase.py index fd81b1a..8285481 100644 --- a/Server/DataBase.py +++ b/Server/DataBase.py @@ -34,7 +34,7 @@ def insertInteraction(self, key1, key2, key3, res1, res2, res3, command): self.dataBaseConnector.commit() def insertHomeWork(self, Type, subject, homeWork, delivery, desc): - self.dataBaseCursor.execute('INSERT INTO HomeWorkManagement(HomeWorkType, HomeWorkSubject, HomeWork, HomeWorkDelivery, HomeWorkDescription) VALUES (%s,%s,%s,%s,%s)', (Type, subject, homeWork, datetime.strptime(delivery, '%d/%m/%Y').date(), desc)) + self.dataBaseCursor.execute('INSERT INTO HomeWorkManagement(HomeWorkType, HomeWorkSubject, HomeWork, HomeWorkDelivery, HomeWorkDescription) VALUES (%s,%s,%s,%s,%s)', (Type, subject, homeWork, delivery, desc)) self.dataBaseConnector.commit() def insertProject(self, name, repository): @@ -50,8 +50,8 @@ def updateInteraction(self, updateId, key1, key2, key3, res1, res2, res3, comman self.dataBaseCursor.execute(f"UPDATE Interactions set KeyWord1 = '{key1}', KeyWord2 = '{key2}', KeyWord3 = '{key3}', Response1 = '{res1}', Response2 = '{res2}', Response3 = '{res3}', Command = '{command}' WHERE InteractionId = '{updateId}' ") self.dataBaseConnector.commit() - def updateHomeWork(self, updateId, type, subject, homeWork, delivery, desc): - self.dataBaseCursor.execute(f"UPDATE HomeWorkManagement set HomeWorkType = '{type}', HomeWorkSubject = '{subject}', HomeWork = '{homeWork}', HomeWorkDelivery = '{datetime.strptime(delivery, '%d/%m/%Y').date()}', HomeWorkDescription = '{desc}' WHERE HomeWorkID ='{updateId}' ") + def updateHomeWork(self, updateId, type, subject, homeWork, delivery, desc):#datetime.strptime(delivery, '%d/%m/%Y').date() + self.dataBaseCursor.execute(f"UPDATE HomeWorkManagement set HomeWorkType = '{type}', HomeWorkSubject = '{subject}', HomeWork = '{homeWork}', HomeWorkDelivery = '{delivery}', HomeWorkDescription = '{desc}' WHERE HomeWorkID ='{updateId}' ") self.dataBaseConnector.commit() def updateProject(self, updateId, name, repository): diff --git a/Server/__pycache__/DataBase.cpython-36.pyc b/Server/__pycache__/DataBase.cpython-36.pyc index a379d7d5eef3a0bc3810ff862be94abea2cbf190..cbad1de51751d4ddfd74646379fdf38872eae8e6 100644 GIT binary patch delta 325 zcmX@7^-q)2n3tD}XB&6?>5ZI4?27CR3=GadT&xBpY8bK@vKUhsYZz;oYM5(SYFN`) zCo6J_P2R`eKKTrr;AB4mw#n5Tk&F_P4TZ%vzvkG*$fg3+SERIgHJ1Vtqr>DgJhCD+ ztg{(XSZmmTBwGz5kYu0BJ9#0WFeArgS>BS#vw6)Yi}Q#nu@`ZJv}yv0TP!7&1*t{y zAie^KPy`W5lQ*&oPuAg+Vl)C-H#wH?G&e|f5!gyqknCnReo;mwL8Zxh{1Th%1eP%} z>VtJ#2%Unm#Dot+S#O0qjFmy=fV^C!0V1?Ogbs+%1rd56!T>}Vf(RoJVLVwuRDAM& Gk$wO^&q@*i delta 463 zcmeyTc}|Pdn3tD}yO=5d#YWB|c1I2d1_oy!E;a%ZH4Iq{S&S)+HH9EtZtTlGMqr94U+{lOGC+Z9c%Ui;+zYq)=sZ1D665qtE1p zJhCQWds$O}wt?)O&5*)Y!v-YTYZ!qf$6VfKMhsVQPJYHy!U=c8