From 434f7c12a55118f14863968eb26e5cfb84cb21fb Mon Sep 17 00:00:00 2001 From: carnesirone Date: Mon, 10 Dec 2018 20:31:26 +0100 Subject: [PATCH 1/3] #30 updated intent --- models/de-DE.json | 110 +++++++++++++++--- .../ModifyRecipeByUnitsIntentHandler.java | 68 ++++------- .../java/verkocht/model/PhrasesForAlexa.java | 6 +- src/main/java/verkocht/model/Recipe.java | 27 ++++- 4 files changed, 149 insertions(+), 62 deletions(-) diff --git a/models/de-DE.json b/models/de-DE.json index c1f03ab..a01df2e 100644 --- a/models/de-DE.json +++ b/models/de-DE.json @@ -115,17 +115,19 @@ { "name": "ModifyRecipeByUnitsIntent", "slots": [ + { + "name": "Ingredient_Value", + "type": "AMAZON.NUMBER" + }, { "name": "Ingredient", - "type": "AMAZON.NUMBER", - "samples": [ - "Bitte sage mir die neue Menge dieser Zutat" - ] + "type": "Ingredient" } ], "samples": [ "{Ingredient} anpassen", - "kann ich ein Rezept nach Zutaten aendern" + "kann ich ein Rezept nach Zutaten aendern", + "{Ingredient} auf {Ingredient_Value} anpassen" ] }, { @@ -181,6 +183,71 @@ } } ] + }, + { + "name": "Ingredient", + "values": [ + { + "name": { + "value": "Eis" + } + }, + { + "name": { + "value": "Oel" + } + }, + { + "name": { + "value": "Paniermehl" + } + }, + { + "name": { + "value": "Tomatensauce" + } + }, + { + "name": { + "value": "Salz" + } + }, + { + "name": { + "value": "Zucker" + } + }, + { + "name": { + "value": "Erdbeeren" + } + }, + { + "name": { + "value": "Fleisch" + } + }, + { + "name": { + "value": "Spaghetti" + } + }, + { + "name": { + "value": "Milch" + } + }, + { + "name": { + "value": "Ei" + } + }, + { + "name": { + "value": "Mehl" + } + } + ] } ] }, @@ -192,13 +259,21 @@ "prompts": {}, "slots": [ { - "name": "Ingredient", + "name": "Ingredient_Value", "type": "AMAZON.NUMBER", - "confirmationRequired": true, + "confirmationRequired": false, "elicitationRequired": true, "prompts": { - "confirmation": "Confirm.Slot.170099915505.1240512610375", - "elicitation": "Elicit.Slot.170099915505.1240512610375" + "elicitation": "Elicit.Slot.682863053956.858965062831" + } + }, + { + "name": "Ingredient", + "type": "Ingredient", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.682863053956.290760397782" } } ] @@ -207,20 +282,29 @@ }, "prompts": [ { - "id": "Elicit.Slot.170099915505.1240512610375", + "id": "Elicit.Slot.682863053956.1144850427396", + "variations": [ + { + "type": "PlainText", + "value": "Bitte waehle zuerst ein Rezept aus" + } + ] + }, + { + "id": "Elicit.Slot.682863053956.290760397782", "variations": [ { "type": "PlainText", - "value": "Bitte sage mir die neue Menge dieser Zutat" + "value": "Bitte waehle eine Zutat aus" } ] }, { - "id": "Confirm.Slot.170099915505.1240512610375", + "id": "Elicit.Slot.682863053956.858965062831", "variations": [ { "type": "PlainText", - "value": "Ist {Ingredient} richtig?" + "value": "Bitte sage mir die gewuenschte neue Menge" } ] } diff --git a/src/main/java/verkocht/handlers/ModifyRecipeByUnitsIntentHandler.java b/src/main/java/verkocht/handlers/ModifyRecipeByUnitsIntentHandler.java index 3543274..0eb0682 100644 --- a/src/main/java/verkocht/handlers/ModifyRecipeByUnitsIntentHandler.java +++ b/src/main/java/verkocht/handlers/ModifyRecipeByUnitsIntentHandler.java @@ -7,23 +7,16 @@ import com.amazon.ask.dispatcher.request.handler.HandlerInput; import com.amazon.ask.dispatcher.request.handler.RequestHandler; -import com.amazon.ask.model.Intent; -import com.amazon.ask.model.IntentRequest; -import com.amazon.ask.model.Request; import com.amazon.ask.model.Response; -import com.amazon.ask.model.Slot; import verkocht.model.PhrasesForAlexa; import verkocht.model.Recipe; public class ModifyRecipeByUnitsIntentHandler implements RequestHandler { - static int step; + static boolean state = false; public static final String INGREDIENT_SLOT = "Ingredient"; - public static final String INGREDIENT_VALUE_SLOT = "IngredientValue"; - - private String ingredientToModify; - private String ingredientValue; + public static final String INGREDIENT_VALUE_SLOT = "Ingredient_Value"; @Override public boolean canHandle(HandlerInput input) { @@ -32,51 +25,40 @@ public boolean canHandle(HandlerInput input) { @Override public Optional handle(HandlerInput input) { + Map sessionAttributes = input.getAttributesManager().getSessionAttributes(); String speechText = PhrasesForAlexa.MODIFY_UNIT_ERROR; Recipe recipeToModify = Recipe.getSavedRecipe(); try { - if (step == 3) { - recipeToModify.modifyByUnit(this.ingredientToModify, this.ingredientValue); - speechText = PhrasesForAlexa.MODIFY_UNIT_DONE; - step = 0; - } else if (step == 2) { - Request request = input.getRequestEnvelope().getRequest(); - IntentRequest intentRequest = (IntentRequest) request; - Intent intent = intentRequest.getIntent(); - Map slots = intent.getSlots(); - String getIngredientValue = slots.get(INGREDIENT_VALUE_SLOT).getValue(); - - if (getIngredientValue.isEmpty()) { - speechText = PhrasesForAlexa.MODIFY_UNIT_VALUE; - } else { - speechText = "Ok!"; - this.ingredientValue = getIngredientValue; - step++; - } - } else if (step == 1) { - Request request = input.getRequestEnvelope().getRequest(); - IntentRequest intentRequest = (IntentRequest) request; - Intent intent = intentRequest.getIntent(); - Map slots = intent.getSlots(); - String getIngredientToModify = slots.get(INGREDIENT_SLOT).getValue(); - - if (getIngredientToModify.isEmpty()) { - speechText = PhrasesForAlexa.MODIFY_UNIT_SELECT_INGREDIENT; + if (recipeToModify != null) { + if (state) { + String getIngredient = (String) sessionAttributes.get(INGREDIENT_SLOT); + int getIngredientValue = (int) sessionAttributes.get(INGREDIENT_VALUE_SLOT); + boolean worked = recipeToModify.modifyByUnit(getIngredient, getIngredientValue); + if (worked) { + speechText = PhrasesForAlexa.MODIFY_UNIT_DONE; + resetState(); + } else { + speechText = PhrasesForAlexa.MODIFY_UNIT_NOT_DONE; + } } else { - speechText = "Ok!"; - this.ingredientToModify = getIngredientToModify; - step++; + speechText = PhrasesForAlexa.MODIFY_UNIT_WELCOME; + toggleState(); } - } else if (step == 0) { - speechText = PhrasesForAlexa.MODIFY_UNIT_WELCOME; - step++; } } catch (Exception e) { - speechText = PhrasesForAlexa.MODIFY_UNIT_ERROR; + speechText = PhrasesForAlexa.MODIFY_UNIT_ERROR + "Exception"; } return input.getResponseBuilder().withSpeech(speechText).withSimpleCard("Rezeptschritte", speechText) .withReprompt("Wie kann ich dir helfen?").withShouldEndSession(false).build(); } + + public static void resetState() { + state = false; + } + + public static void toggleState() { + state = !state; + } } \ No newline at end of file diff --git a/src/main/java/verkocht/model/PhrasesForAlexa.java b/src/main/java/verkocht/model/PhrasesForAlexa.java index 37ae502..eccbff4 100644 --- a/src/main/java/verkocht/model/PhrasesForAlexa.java +++ b/src/main/java/verkocht/model/PhrasesForAlexa.java @@ -49,12 +49,10 @@ private PhrasesForAlexa() { + "Markiere zuerst Favoriten, damit ich sie dir vorlesen kann."; // Modify Unit - public static final String MODIFY_UNIT_WELCOME = "Hier kannst du ein Rezept entsprechend einer Zutat modifizieren. Sage {Zutat} anpassen."; + public static final String MODIFY_UNIT_WELCOME = "Hier kannst du ein Rezept entsprechend einer Zutat modifizieren. Sage: {Zutat} auf {Menge} anpassen."; public static final String MODIFY_UNIT_REPROMT = "Bitte nenne eine Zutat des Rezept."; - public static final String MODIFY_UNIT_SELECT_FIRST = "Du musst erst ein Rezept auswaehlen, bevor du es modifizieren kannst."; - public static final String MODIFY_UNIT_SELECT_INGREDIENT = "Waehle eine Zutat."; - public static final String MODIFY_UNIT_VALUE = "Auf welchen Wert soll die Zutat geaendert werden."; public static final String MODIFY_UNIT_ERROR = "Dies ist nicht moeglich."; + public static final String MODIFY_UNIT_NOT_DONE = "Das Rezept konnte nicht angepasst werden."; public static final String MODIFY_UNIT_DONE = "Das Rezept wurde angepasst."; // Cancel-/Stop-/Help-/Fallback-Intent diff --git a/src/main/java/verkocht/model/Recipe.java b/src/main/java/verkocht/model/Recipe.java index adfb3fc..b729a90 100644 --- a/src/main/java/verkocht/model/Recipe.java +++ b/src/main/java/verkocht/model/Recipe.java @@ -4,6 +4,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; + +import verkocht.handlers.ModifyRecipeByUnitsIntentHandler; /* * The class that represents a recipe. @@ -46,8 +49,27 @@ public Recipe changeIngredientAmounts() { return null; } - public void modifyByUnit(String ingredient, String value) { - throw new UnsupportedOperationException(); + public boolean modifyByUnit(String ingredient, int value) { + Set keys = this.ingredientAmounts.keySet(); + int originValue = 1; + boolean found = false; + + for (Ingredient key : keys) { + found = key.getIngredient() == ingredient; + + while (found) { + originValue = ingredientAmounts.get(key); + break; + } + } + + if (found) { + double difference = (value * 100) / originValue; + + ingredientAmounts.forEach((Ingredient k, Integer v) -> v = v * (int) difference); + } + + return found; } public String getName() { @@ -76,6 +98,7 @@ public static Recipe getSavedRecipe() { public static void saveRecipe(Recipe recipeToSave) { Recipe.savedRecipe = recipeToSave; + ModifyRecipeByUnitsIntentHandler.resetState(); } public int getNumberOfPeople() { From bd9c4ff7e4faed77cae20aadc44719acbab009dc Mon Sep 17 00:00:00 2001 From: carnesirone Date: Mon, 10 Dec 2018 23:37:15 +0100 Subject: [PATCH 2/3] #30 finished issue with one little exception --- models/de-DE.json | 64 +------------------ .../ModifyRecipeByUnitsIntentHandler.java | 30 ++++++--- .../java/verkocht/model/PhrasesForAlexa.java | 1 + src/main/java/verkocht/model/Recipe.java | 27 +++++--- src/test/java/test/RecipeTest.java | 44 +++++++++++++ 5 files changed, 87 insertions(+), 79 deletions(-) create mode 100644 src/test/java/test/RecipeTest.java diff --git a/models/de-DE.json b/models/de-DE.json index a01df2e..a83668f 100644 --- a/models/de-DE.json +++ b/models/de-DE.json @@ -159,7 +159,7 @@ "values": [ { "name": { - "value": "spagettiBolognese" + "value": "nudeln" } }, { @@ -169,7 +169,7 @@ }, { "name": { - "value": "milchschake" + "value": "milchshake" } } ] @@ -250,64 +250,6 @@ ] } ] - }, - "dialog": { - "intents": [ - { - "name": "ModifyRecipeByUnitsIntent", - "confirmationRequired": false, - "prompts": {}, - "slots": [ - { - "name": "Ingredient_Value", - "type": "AMAZON.NUMBER", - "confirmationRequired": false, - "elicitationRequired": true, - "prompts": { - "elicitation": "Elicit.Slot.682863053956.858965062831" - } - }, - { - "name": "Ingredient", - "type": "Ingredient", - "confirmationRequired": false, - "elicitationRequired": true, - "prompts": { - "elicitation": "Elicit.Slot.682863053956.290760397782" - } - } - ] - } - ] - }, - "prompts": [ - { - "id": "Elicit.Slot.682863053956.1144850427396", - "variations": [ - { - "type": "PlainText", - "value": "Bitte waehle zuerst ein Rezept aus" - } - ] - }, - { - "id": "Elicit.Slot.682863053956.290760397782", - "variations": [ - { - "type": "PlainText", - "value": "Bitte waehle eine Zutat aus" - } - ] - }, - { - "id": "Elicit.Slot.682863053956.858965062831", - "variations": [ - { - "type": "PlainText", - "value": "Bitte sage mir die gewuenschte neue Menge" - } - ] - } - ] + } } } \ No newline at end of file diff --git a/src/main/java/verkocht/handlers/ModifyRecipeByUnitsIntentHandler.java b/src/main/java/verkocht/handlers/ModifyRecipeByUnitsIntentHandler.java index 0eb0682..6d3b4c2 100644 --- a/src/main/java/verkocht/handlers/ModifyRecipeByUnitsIntentHandler.java +++ b/src/main/java/verkocht/handlers/ModifyRecipeByUnitsIntentHandler.java @@ -16,7 +16,7 @@ public class ModifyRecipeByUnitsIntentHandler implements RequestHandler { static boolean state = false; public static final String INGREDIENT_SLOT = "Ingredient"; - public static final String INGREDIENT_VALUE_SLOT = "Ingredient_Value"; + public static final String INGREDIENT_VALUE_SLOT = "IngredientValue"; @Override public boolean canHandle(HandlerInput input) { @@ -31,23 +31,35 @@ public Optional handle(HandlerInput input) { try { if (recipeToModify != null) { + String getIngredient = ""; + String getIngredientSlotValue = ""; + int getIngredientValue = 0; + boolean worked = false; if (state) { - String getIngredient = (String) sessionAttributes.get(INGREDIENT_SLOT); - int getIngredientValue = (int) sessionAttributes.get(INGREDIENT_VALUE_SLOT); - boolean worked = recipeToModify.modifyByUnit(getIngredient, getIngredientValue); - if (worked) { - speechText = PhrasesForAlexa.MODIFY_UNIT_DONE; - resetState(); - } else { + try { + getIngredient = (String) sessionAttributes.get(INGREDIENT_SLOT); + getIngredientSlotValue = (String) sessionAttributes.get(INGREDIENT_VALUE_SLOT); + getIngredientValue = Integer.parseInt(getIngredientSlotValue); + worked = recipeToModify.modifyByUnit(getIngredient, getIngredientValue); + speechText = getIngredientSlotValue; + if (worked) { + speechText = PhrasesForAlexa.MODIFY_UNIT_DONE; + resetState(); + } else { + speechText = PhrasesForAlexa.MODIFY_UNIT_NOT_DONE; + } + } catch (Exception e) { speechText = PhrasesForAlexa.MODIFY_UNIT_NOT_DONE; } } else { speechText = PhrasesForAlexa.MODIFY_UNIT_WELCOME; toggleState(); } + } else { + speechText = PhrasesForAlexa.MODIFY_UNIT_SELECT_RECIPE_FIRST; } } catch (Exception e) { - speechText = PhrasesForAlexa.MODIFY_UNIT_ERROR + "Exception"; + speechText = PhrasesForAlexa.MODIFY_UNIT_ERROR; } return input.getResponseBuilder().withSpeech(speechText).withSimpleCard("Rezeptschritte", speechText) diff --git a/src/main/java/verkocht/model/PhrasesForAlexa.java b/src/main/java/verkocht/model/PhrasesForAlexa.java index eccbff4..fcc08a5 100644 --- a/src/main/java/verkocht/model/PhrasesForAlexa.java +++ b/src/main/java/verkocht/model/PhrasesForAlexa.java @@ -52,6 +52,7 @@ private PhrasesForAlexa() { public static final String MODIFY_UNIT_WELCOME = "Hier kannst du ein Rezept entsprechend einer Zutat modifizieren. Sage: {Zutat} auf {Menge} anpassen."; public static final String MODIFY_UNIT_REPROMT = "Bitte nenne eine Zutat des Rezept."; public static final String MODIFY_UNIT_ERROR = "Dies ist nicht moeglich."; + public static final String MODIFY_UNIT_SELECT_RECIPE_FIRST = "Waehle bitte zuerst ein Rezept aus."; public static final String MODIFY_UNIT_NOT_DONE = "Das Rezept konnte nicht angepasst werden."; public static final String MODIFY_UNIT_DONE = "Das Rezept wurde angepasst."; diff --git a/src/main/java/verkocht/model/Recipe.java b/src/main/java/verkocht/model/Recipe.java index b729a90..ae947f1 100644 --- a/src/main/java/verkocht/model/Recipe.java +++ b/src/main/java/verkocht/model/Recipe.java @@ -45,8 +45,12 @@ public Map getIngredients() { * * @return */ - public Recipe changeIngredientAmounts() { - return null; + public void addIngredient(Ingredient ingredient, int value) { + if (ingredientAmounts.containsKey(ingredient)) { + ingredientAmounts.replace(ingredient, value); + } else { + ingredientAmounts.put(ingredient, value); + } } public boolean modifyByUnit(String ingredient, int value) { @@ -55,19 +59,24 @@ public boolean modifyByUnit(String ingredient, int value) { boolean found = false; for (Ingredient key : keys) { - found = key.getIngredient() == ingredient; + found = key.getIngredient().equals(ingredient); - while (found) { + if (found) { originValue = ingredientAmounts.get(key); break; } } - if (found) { - double difference = (value * 100) / originValue; - - ingredientAmounts.forEach((Ingredient k, Integer v) -> v = v * (int) difference); - } + if (found) { + int difference = ((value * 100) / originValue); + ingredientAmounts.forEach((k, v) -> { + if (k.getIngredient() != ingredient) { + ingredientAmounts.replace(k, (v * difference) / 100); + } else { + ingredientAmounts.replace(k, value); + } + }); + } return found; } diff --git a/src/test/java/test/RecipeTest.java b/src/test/java/test/RecipeTest.java new file mode 100644 index 0000000..1ec8017 --- /dev/null +++ b/src/test/java/test/RecipeTest.java @@ -0,0 +1,44 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import verkocht.model.Category; +import verkocht.model.Ingredient; +import verkocht.model.Recipe; +import verkocht.model.Unit; + +public class RecipeTest { + Recipe recipe = new Recipe("Pfannenkuchen", Category.VEGETARIAN, 2, 20); + Ingredient mehl = new Ingredient("Mehl", Unit.GRAMM); + Ingredient salz = new Ingredient("Salz", Unit.BRISE); + Ingredient ei = new Ingredient("Ei", Unit.STUECK); + Ingredient milch = new Ingredient("Milch", Unit.MILLILITER); + Ingredient notAdded = new Ingredient("NotAdded", Unit.ESSLOEFFEL); + + @Test + public void testConstructorAndGetter() { + assertEquals("Should be Pfannenkuchen", "Pfannenkuchen", recipe.getName()); + assertEquals("Should be vegetarian", Category.VEGETARIAN, recipe.getCategory()); + assertEquals("Should be for two persons", 2, recipe.getNumberOfPeople()); + assertEquals("Should be done in 20 minutes", 20, recipe.getCookingTime()); + } + + @Test + public void testIngredients() { + recipe.addIngredient(mehl, 200); + recipe.addIngredient(ei, 1); + recipe.addIngredient(salz, 1); + recipe.addIngredient(milch, 100); + + assertEquals("Should have four ingredients", 4, recipe.getIngredients().size()); + + assertFalse(recipe.modifyByUnit("NotAdded", 4)); + assertTrue(recipe.modifyByUnit("Mehl", new Integer(300))); + assertEquals("Should have four ingredients", 4, recipe.getIngredients().size()); + + assertEquals("Should be 300 now", 300, (int) recipe.getIngredients().get(mehl)); + } + +} From 6cd7b9a227d3be0fdd7007c012075d0391a6f23d Mon Sep 17 00:00:00 2001 From: langehm <38280183+langehm@users.noreply.github.com> Date: Mon, 10 Dec 2018 23:54:46 +0100 Subject: [PATCH 3/3] Add files via upload #22 UML --- .../sprint2/SaveRecipeToFavoriteHandler.png | Bin 0 -> 27969 bytes .../sprint2/SaveRecipeToFavoriteHandler.xml | 1 + 2 files changed, 1 insertion(+) create mode 100644 sprint_ressources/sprint2/SaveRecipeToFavoriteHandler.png create mode 100644 sprint_ressources/sprint2/SaveRecipeToFavoriteHandler.xml diff --git a/sprint_ressources/sprint2/SaveRecipeToFavoriteHandler.png b/sprint_ressources/sprint2/SaveRecipeToFavoriteHandler.png new file mode 100644 index 0000000000000000000000000000000000000000..0fdbfe4dfaeb934bb42e519033c80b5b98acbd19 GIT binary patch literal 27969 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 literal 0 HcmV?d00001 diff --git a/sprint_ressources/sprint2/SaveRecipeToFavoriteHandler.xml b/sprint_ressources/sprint2/SaveRecipeToFavoriteHandler.xml new file mode 100644 index 0000000..aeb7a08 --- /dev/null +++ b/sprint_ressources/sprint2/SaveRecipeToFavoriteHandler.xml @@ -0,0 +1 @@ +5Vldk9o2FP01zLQPy/hLNn5c2Gzy0M5kSjJtH4UtbE2E5cgysPvrK9mSbVkQnIXdJhMeQLr69Dn3Hl2Zmb/aHd8zWOZ/0hSRmeekx5n/MPO8CPjiWxqeWkMYRa0hYzhtTW5vWONnpIyOstY4RZXRkVNKOC5NY0KLAiXcsEHG6MHstqXEXLWEGbIM6wQS2/o3TnmurG4Y9w0fEM5yvXQIgrZlA5MvGaN1oRacef62+bTNO6gnU09a5TClh4HJfzfzV4xS3pZ2xxUiEluNWzvu8Uxrt3GGCj5lgN73HpJaPfw9QUc480IiJlhumChlsqT2y580SGLrpSzWO/IH3iKCC1FblojhHeKIiRaizB972/KQY47WJUzk0IPwHmHL+Y6ImiuKglEOxRDW1QmBZYU3zaqOsDCU1KzCe/QXqlrHkVZac7nSqnMIp9vyEAyFzx4xjo4DkwLnPaJin+xJdFGtvq+IetJMK08+9H7h+cqWD1wCAOUrUPli1s3d0yEKipEz7ACLHYuGAXglxQVvlgPLGXgYsUEZz2lGC0iGfNgYdS4xGSTX9Q2QFo6FkY7sIUSu7ncNRK4m6FsYoSK9l7IgUShRYbqcaHzEcv7GZ1JY5ShVTefB4ZBliI8eH6WGrNh4DQABJwDRNoYI5MLDTV07AZJa4aPkfUhHYNDhgXgOzEkqWrMEqXFDeRhNBS7O1AJhzdTQ1j35NGePLCLXUIZ5gkv0iT7CPWVCOz7AIiXCdX9JOQIL77IcBeC15Gjxf8hR9L0guW5kguRN0yP/BnIUTlCjHwKihRnYzjSIgltAZB9qCSzasP7t9wmJxwA/+cRY5G33BGdC1h82lHO6a0VdK/6G0ORLYxIb/UfFYlP591JgtjJpnsVD5dcBcVH4r1R0Px7RtYgm6fkLVDgMLXY2IvW+lgR17Bqnq2hWqf9C1o6Yd+yIckPOPAaT+Vmc4Ae8FT+xwY/vvtopGdqnZN6Fzg8bKFoWLxKhAL1z5o7jqOTjSnIAMIPHD6cFTz+R7ki32wpdS2Bky59IHUpaVOgNg2wuTwAj0GJdH5w100nXBL8o+hRRknM95krOg9i8kQRjwTwTkFM4txZbxP7cCRdxCIAbecEo+w6dcN63+dEoD7udcruuZ3nW5+pXzZQ915TkU5my6yhluHmm3F0J3zQP7D1gMkyBqY3aOy+kgd+MyOkY2e+eLIwG6pYQWFU4Md3urKcYQhRMFKK3uZ97kXk/6fL3772dB954onCSyr1EXHzboaW4VA0cX2tUcYs74YLcZIvJyIe9JNhuD2tOlTrIAVCddgRt+YlDkFOpQpUQJVxkn2Tl4S640Ys/HUsaW8/Wj/hUaNzkndaZt7It2meShZ8c7tA8sJ1TSvRaeAenbu3tPTTFewPm8Gst380vJdp3Cq970SMRzy7PWt3e317VfXZs2NImlO2ZZcNdS4qc2AvKoz3tWsZc8ZzijMHdTnR7ruX3Z+kXzgo2P/0o/e6skAuWCCc5YoUxKWl/H9tdmTsVZmv3wtYgc+aK/lP74jh1iOzID4PbuKKo9v/1tLLc/6Hmv/sP \ No newline at end of file