How to use getValue method of com.intuit.karate.core.Variable class

Best Karate code snippet using com.intuit.karate.core.Variable.getValue

Source:OpenApiExamplesHook.java Github

copy

Full Screen

...73 String karateVar = (String) firstNotNull(example.getExtensions(), Collections.emptyMap()).get("x-apimock-karate-var");74 if(isNotEmpty(karateVar)) {75 Object seeds = firstNotNull(firstNotNull(example.getExtensions(), Collections.emptyMap()).get("x-apimock-seed"), 1);76 Map<String, Object> seedsMap = seeds instanceof Integer? defaultRootSeed((Integer) seeds): (Map<String, Object>) seeds;77 Object seededExample = seed(example.getValue(), seedsMap);78 try {79 Map<String, String> transforms = (Map) firstNotNull(example.getExtensions(), Collections.emptyMap()).get("x-apimock-transform");80 String json = processObjectDynamicProperties(engine, transforms, seededExample);81 Variable exampleVariable = new Variable(Json.of(json).value());82 addExamplesVariableToKarateGlobals(globals, karateVar, exampleVariable);83 } catch (Exception e) {84 logger.error("Error setting openapi examples {} into karate globals ({})", karateVar, e.getMessage(), e);85 }86 }87 }88 }89 }90 private Map<String, Object> defaultRootSeed(Integer seed) {91 Map<String, Object> seedMap = new HashMap<>();92 seedMap.put("$", seed);93 return seedMap;94 }95 private Object seed(Object value, Map<String, Object> seedsMap) {96 Json json = Json.of(value);97 for (Map.Entry<String, Object> seedEntry : seedsMap.entrySet()) {98 int seed = (Integer) seedEntry.getValue();99 if(seed == 1) {100 continue;101 }102 String seedPath = String.valueOf(seedEntry.getKey());103 Object inner = json.get(seedPath);104 Object seeded = seedValue(inner, seed);105 json = replace(json, seedPath, seeded);106 }107 return json.get("$");108 }109 private List seedValue(Object value, int seed) {110 List seeded = new ArrayList();111 for (int i = 0; i < seed; i++) {112 if(value instanceof List) {113 seeded.addAll((List) JsonUtils.deepCopy(value));114 } else {115 seeded.add(JsonUtils.deepCopy(value));116 }117 }118 return seeded;119 }120 private Json replace(Json json, String path, Object replacement) {121 if("$".equals(path)) {122 return Json.of(replacement);123 }124 json.set(path, replacement);125 return json;126 }127 private void addExamplesVariableToKarateGlobals(Map<String, Variable> globals, String karateVar, Variable examplesVariable) {128 if(!globals.containsKey(karateVar)) {129 globals.put(karateVar, examplesVariable);130 } else {131 Variable karateVariable = globals.get(karateVar);132 if(karateVariable.isList()) {133 if(examplesVariable.isList()) {134 ((List)karateVariable.getValue()).addAll(examplesVariable.getValue());135 } else {136 ((List)karateVariable.getValue()).add(examplesVariable.getValue());137 }138 }139 if(karateVariable.isMap() && examplesVariable.isMap()) {140 ((Map)karateVariable.getValue()).putAll(examplesVariable.getValue());141 }142 }143 }144 @Override145 public Response noMatchingScenario(Request req, Response response, ScenarioEngine engine) {146 Operation operation = OpenApiValidator4Karate.findOperation(req.getMethod(), req.getPath(), api);147 if(operation == null) {148 logger.debug("Operation not found for {}", req.getPath());149 return response;150 }151 logger.debug("Searching examples in openapi definition for operationId {}", operation.getOperationId());152 Map<String, org.openapi4j.parser.model.v3.Response> responses = OpenApiValidator4Karate.find2xxResponses(operation);153 loadPathParams(req.getPath(), (String) operation.getExtensions().get("x-apimock-internal-path"), engine);154 if(!responses.isEmpty()) {155 String status = responses.keySet().stream().findFirst().get();156 org.openapi4j.parser.model.v3.Response oasRespose = responses.get(status);157 // match media type from request158 String contentType = getContentType(req);159 Map.Entry<String, MediaType> mediaTypeEntry = oasRespose.getContentMediaTypes().entrySet().stream()160 .filter(e -> e.getKey().startsWith(contentType))161 .findFirst().orElse(new AbstractMap.SimpleEntry("", new MediaType()));162 if(mediaTypeEntry.getValue().getExamples() == null && mediaTypeEntry.getValue().getExample() != null) {163 logger.debug("Returning default example in openapi for operationId {}", operation.getOperationId());164 response = new Response(Integer.valueOf(status.toLowerCase().replaceAll("x", "0")));165 response.setBody(processObjectDynamicProperties(engine, null, mediaTypeEntry.getValue().getExample()));166 response.setContentType(mediaTypeEntry.getKey());167 response.setHeader("access-control-allow-origin", "*");168 unloadPathParams(engine);169 return response;170 }171 for (Map.Entry<String, Example> exampleEntry: mediaTypeEntry.getValue().getExamples().entrySet()) {172 Map<String, Object> extensions = exampleEntry.getValue().getExtensions();173 if(extensions == null) {174 continue;175 }176 Object when = extensions.get("x-apimock-when");177 Map<String, String> generators = (Map<String, String>) extensions.get("x-apimock-transform");178 if(when != null) {179 if(evalBooleanJs(engine, when.toString())) {180 logger.debug("Found example[{}] for x-apimock-when {} in openapi for operationId {}", exampleEntry.getKey(), when, operation.getOperationId());181 Example example = exampleEntry.getValue();182 Object seeds = firstNotNull(firstNotNull(example.getExtensions(), Collections.emptyMap()).get("x-apimock-seed"), 1);183 Map<String, Object> seedsMap = seeds instanceof Integer? defaultRootSeed((Integer) seeds): (Map<String, Object>) seeds;184 Object seededExample = seed(example.getValue(), seedsMap);185 logger.debug("Returning example in openapi for operationId {}", operation.getOperationId());186 response = new Response(Integer.valueOf(status.toLowerCase().replaceAll("x", "0")));187 response.setBody(processObjectDynamicProperties(engine, generators, seededExample));188 response.setContentType(mediaTypeEntry.getKey());189 response.setHeader("access-control-allow-origin", "*");190 break;191 }192 }193 }194 }195 unloadPathParams(engine);196 return response;197 }198 private String getContentType(Request req) {199 String contentType = firstNotNull(req.getContentType(), "application/json");200 return contentType.contains(";")? contentType.substring(0, contentType.indexOf(";")) : contentType;201 }202 protected void evaluateJsAndReplacePath(ScenarioEngine engine, Json json, String path, String js) {203 Object replacement = evalJsAsObject(engine, js);204 try {205 if (replacement != null) {206 json.set(path, replacement);207 }208 } catch (Exception e) {209 logger.error("Error replacing jsonPath: {} ({})", path, e.getMessage());210 }211 }212 Pattern generatorsPattern = Pattern.compile("\\{\\{(.+)\\}\\}");213 protected String processObjectDynamicProperties(ScenarioEngine engine, Map<String, String> generators, Object value) {214 if(value == null) {215 return null;216 }217 Json json = Json.of(value);218 if(generators != null) {219 for (Map.Entry<String, String> entry: generators.entrySet()){220 if(entry.getKey().startsWith("$[*]") && json.isArray()) {221 List list = json.asList();222 for(int i = 0; i < list.size(); i++) {223 evaluateJsAndReplacePath(engine, json, entry.getKey().replace("$[*]", "$[" + i + "]"), entry.getValue());224 }225 } else {226 evaluateJsAndReplacePath(engine, json, entry.getKey(), entry.getValue());227 }228 }229 }230 String jsonString = toJsonPrettyString(json);231 final Matcher matcher = generatorsPattern.matcher(jsonString);232 while (matcher.find()) {233 String match = matcher.group(0);234 String script = matcher.group(1);235 logger.trace("Processing inline replacement for script: {}", script);236 String replacement = evalJsAsString(engine, script);237 if(replacement != null) {238 jsonString = jsonString.replace(match, replacement);239 }240 }241 return JsonUtils.toStrictJson(jsonString);242 }243 private String toJsonPrettyString(Json json) {244 try {245 return jacksonMapper.writerWithDefaultPrettyPrinter().writeValueAsString(json.value());246 } catch (JsonProcessingException e) {247 return json.toStringPretty();248 }249 }250 private void loadPathParams(String uri, String pattern, ScenarioEngine engine) {251 Map<String, String> pathParams = HttpUtils.parseUriPattern(pattern, uri);252 if (pathParams != null) {253 engine.setVariable("pathParams", pathParams);254 }255 }256 private void unloadPathParams(ScenarioEngine engine) {257 engine.setVariable("pathParams", null);258 }259 private boolean evalBooleanJs(ScenarioEngine engine, String js) {260 try {261 return engine.evalJs(js).isTrue();262 } catch (Exception e) {263 logger.error("Error evaluating boolean script: '{}' ({})", js, e.getMessage());264 return false;265 }266 }267 private String evalJsAsString(ScenarioEngine engine, String js) {268 try {269 return engine.evalJs(js).getAsString();270 } catch (Exception e) {271 logger.error("Error evaluating string script: '{}' ({})", js, e.getMessage());272 return null;273 }274 }275 private Object evalJsAsObject(ScenarioEngine engine, String js) {276 try {277 Object result = engine.evalJs(js).getValue();278 return result != null? result : "";279 } catch (Exception e) {280 logger.error("Error evaluating script: '{}' ({})", js, e.getMessage());281 return null;282 }283 }284 private String uuid() {285 return java.util.UUID.randomUUID().toString();286 }287 private int sequenceNext = 0;288 private int sequenceNext() {289 return sequenceNext++;290 }291 private String now(String format) {...

Full Screen

Full Screen

Source:OpenApiExamplesHookSeedAndTransformTest.java Github

copy

Full Screen

...32 globalVars.put("variable", new Variable(new ArrayList<>()));33 Map<Feature, ScenarioRuntime> featureScenarioRuntimeMap = createTestFeatureScenarioRuntimeMap();34 OpenApiExamplesHook examplesHook = new OpenApiExamplesHook(OpenApiValidator4Karate.fromClasspath("openapi-examples/transforms-value.yml"));35 examplesHook.onSetup(featureScenarioRuntimeMap, globalVars);36 Object value = globalVars.get("variable").getValue();37 assertThat(JsonPath.read(value, "$[0].id"), is(1));38 assertThat(JsonPath.read(value, "$[0].status"), not("before-transform"));39 }40 @Test41 public void test_transforms_array_items() throws Exception {42 Map<String, Variable> globalVars = new HashMap<>();43 globalVars.put("variable", new Variable(new ArrayList<>()));44 Map<Feature, ScenarioRuntime> featureScenarioRuntimeMap = createTestFeatureScenarioRuntimeMap();45 OpenApiExamplesHook examplesHook = new OpenApiExamplesHook(OpenApiValidator4Karate.fromClasspath("openapi-examples/transforms-array-items.yml"));46 examplesHook.onSetup(featureScenarioRuntimeMap, globalVars);47 Object value = globalVars.get("variable").getValue();48 assertThat(JsonPath.read(value, "$[*].id"), hasItems(1, 2));49 }50 @Test51 public void test_when_seed_is_an_integer() throws Exception {52 Map<String, Variable> globalVars = new HashMap<>();53 globalVars.put("variable", new Variable(new ArrayList<>()));54 Map<Feature, ScenarioRuntime> featureScenarioRuntimeMap = createTestFeatureScenarioRuntimeMap();55 OpenApiExamplesHook examplesHook = new OpenApiExamplesHook(OpenApiValidator4Karate.fromClasspath("openapi-examples/seed-as-integer.yml"));56 examplesHook.onSetup(featureScenarioRuntimeMap, globalVars);57 Object value = globalVars.get("variable").getValue();58 assertThat(JsonPath.read(value, "$[*]"), hasSize(10));59 }60 @Test61 public void test_when_seed_is_a_map() throws Exception {62 Map<String, Variable> globalVars = new HashMap<>();63 globalVars.put("variable", new Variable(new ArrayList<>()));64 Map<Feature, ScenarioRuntime> featureScenarioRuntimeMap = createTestFeatureScenarioRuntimeMap();65 OpenApiExamplesHook examplesHook = new OpenApiExamplesHook(OpenApiValidator4Karate.fromClasspath("openapi-examples/seed-as-map.yml"));66 examplesHook.onSetup(featureScenarioRuntimeMap, globalVars);67 Object value = globalVars.get("variable").getValue();68 assertThat(JsonPath.read(value, "$[0].data"), hasSize(10));69 }70}...

Full Screen

Full Screen

Source:VariableTest.java Github

copy

Full Screen

...30 JsValue jv = je.eval("(function(a, b){ return a + b })");31 Variable var = new Variable(jv);32 assertTrue(var.isJsFunction());33 assertFalse(var.isJavaFunction());34 JsValue res = new JsValue(JsEngine.execute(var.getValue(), new Object[]{1, 2}));35 assertEquals(3, res.<Integer>getValue());36 }37 @Test38 void testPojo() {39 JsValue jv = je.eval("new com.intuit.karate.core.SimplePojo()");40 assertTrue(jv.isOther());41 }42 @Test43 void testClass() {44 JsValue jv = je.eval("Java.type('com.intuit.karate.core.MockUtils')");45 assertTrue(jv.isOther());46 Variable v = new Variable(jv);47 assertEquals(v.type, Variable.Type.OTHER);48 assertTrue(v.getValue() instanceof Value);49 }50 51 public String simpleFunction(String arg) {52 return arg;53 }54 55 public String simpleBiFunction(String arg1, String arg2) {56 return arg1 + arg2;57 } 58 @Test59 void testJavaFunction() {60 Variable v = new Variable((Function<String, String>) this::simpleFunction);61 assertTrue(v.isJavaFunction());62 v = new Variable((BiFunction<String, String, String>) this::simpleBiFunction);...

Full Screen

Full Screen

getValue

Using AI Code Generation

copy

Full Screen

1import com.intuit.karate.core.Variable;2import java.util.HashMap;3import java.util.Map;4public class 4 {5 public static void main(String[] args) {6 Map<String, Object> map = new HashMap();7 map.put("a", "hello");8 map.put("b", "world");9 Variable var = new Variable(map);10 Object value = var.getValue("a");11 System.out.println(value);12 }13}14import com.intuit.karate.core.Variable;15import java.util.HashMap;16import java.util.Map;17public class 5 {18 public static void main(String[] args) {19 Map<String, Object> map = new HashMap();20 map.put("a", "hello");21 map.put("b", "world");22 Variable var = new Variable(map);23 var.setValue("a", "foo");24 System.out.println(var.getValue("a"));25 }26}27import com.intuit.karate.core.Variable;28import java.util.HashMap;29import java.util.Map;30public class 6 {31 public static void main(String[] args) {32 Map<String, Object> map = new HashMap();33 map.put("a", "hello");34 map.put("b", "world");35 Variable var = new Variable(map);36 System.out.println(var.getKeys());37 }38}39import com.intuit.karate.core.Variable;40import java.util.HashMap;41import java.util.Map;42public class 7 {43 public static void main(String[] args) {44 Map<String, Object> map = new HashMap();45 map.put("a", "hello");46 map.put("b", "world");47 Variable var = new Variable(map);48 System.out.println(var.getValues());49 }50}51import com.intuit.karate.core.Variable;52import java.util.HashMap;53import java.util.Map;54public class 8 {55 public static void main(String[] args) {56 Map<String, Object> map = new HashMap();57 map.put("

Full Screen

Full Screen

getValue

Using AI Code Generation

copy

Full Screen

1import com.intuit.karate.core.Variable;2import com.intuit.karate.core.Variable.Type;3import java.util.HashMap;4import java.util.Map;5public class Test {6 public static void main(String[] args) {7 Map<String, Object> map = new HashMap<>();8 map.put("firstName", "John");9 map.put("lastName", "Doe");10 map.put("age", 21);11 map.put("address", "123 Main St");12 map.put("city", "New York");13 map.put("state", "NY");14 map.put("zip", 10001);15 map.put("phone", "123-456-7890");16 map.put("email", "

Full Screen

Full Screen

getValue

Using AI Code Generation

copy

Full Screen

1import com.intuit.karate.core.Variable;2import com.intuit.karate.core.VariableValue;3import com.intuit.karate.core.ScenarioContext;4import java.util.Map;5import java.util.HashMap;6public class 4 {7 public static void main(String[] args) {8 ScenarioContext context = new ScenarioContext();9 Map<String, Object> map = new HashMap<>();10 map.put("foo", "bar");11 context.vars.put("myMap", map);12 VariableValue value = Variable.getValue("myMap.foo", context);13 System.out.println(value);14 }15}16VariableValue{type=STRING, value=bar, isNull=false}17import com.intuit.karate.core.Variable;18import com.intuit.karate.core.VariableValue;19import com.intuit.karate.core.ScenarioContext;20import java.util.Map;21import java.util.HashMap;22public class 5 {23 public static void main(String[] args) {24 ScenarioContext context = new ScenarioContext();25 context.vars.put("foo", "bar");26 VariableValue value = Variable.getValue("foo.bar", context);27 System.out.println(value);28 }29}30VariableValue{type=STRING, value=bar, isNull=false}

Full Screen

Full Screen

getValue

Using AI Code Generation

copy

Full Screen

1import com.intuit.karate.core.Variable;2public class 4 {3 public static void main(String[] args) {4 Variable v = new Variable("foo", "bar");5 System.out.println(v.getValue());6 }7}8import com.intuit.karate.core.ScenarioContext;9public class 5 {10 public static void main(String[] args) {11 ScenarioContext context = new ScenarioContext();12 System.out.println(context.getVariables());13 }14}15{__arg=, __args=[], __env={}, __exit=false, __exitMessage=, __exitStatus=0, __file=, __karate=, __line=, __request=, __response=, __threadId=1, __threadName=Thread-1, __vars={}, __world=, __xml=}16import com.intuit.karate.core.ScenarioContext;17public class 6 {18 public static void main(String[] args) {19 ScenarioContext context = new ScenarioContext();20 System.out.println(context.getVariableNames());21 }22}23import com.intuit.karate.core.ScenarioContext;24public class 7 {25 public static void main(String[] args) {26 ScenarioContext context = new ScenarioContext();27 System.out.println(context.getVariable("__exitStatus"));28 }29}30import com.intuit.karate.core.ScenarioContext;31public class 8 {32 public static void main(String[] args) {33 ScenarioContext context = new ScenarioContext();34 context.setVariable("foo", "bar");35 System.out.println(context.getVariable("foo"));36 }37}

Full Screen

Full Screen

getValue

Using AI Code Generation

copy

Full Screen

1package demo;2import com.intuit.karate.FileUtils;3import com.intuit.karate.core.ScenarioRuntime;4import com.intuit.karate.core.Variable;5import java.util.Map;6public class Demo {7 public static void main(String[] args) {8 String text = FileUtils.toString("src/test/java/demo/demo.feature");9 ScenarioRuntime runtime = ScenarioRuntime.of(text);10 Map<String, Object> vars = runtime.getScenario().getVars();11 Variable var = new Variable(vars);12 System.out.println(var.getValue("var1"));13 System.out.println(var.getValue("var2"));14 }15}

Full Screen

Full Screen

getValue

Using AI Code Generation

copy

Full Screen

1import com.intuit.karate.core.Variable;2import com.intuit.karate.core.VariableType;3import com.intuit.karate.core.VariableValue;4public class 4 {5 public static void main(String[] args) {6 VariableValue value = new VariableValue("hello", VariableType.STRING);7 System.out.println(value.getValue());8 }9}10import com.intuit.karate.core.Variable;11import com.intuit.karate.core.VariableType;12import com.intuit.karate.core.VariableValue;13public class 5 {14 public static void main(String[] args) {15 VariableValue value = new VariableValue(1, VariableType.INTEGER);16 System.out.println(value.getValue());17 }18}19import com.intuit.karate.core.Variable;20import com.intuit.karate.core.VariableType;21import com.intuit.karate.core.VariableValue;22public class 6 {23 public static void main(String[] args) {24 VariableValue value = new VariableValue(1.0, VariableType.DOUBLE);25 System.out.println(value.getValue());26 }27}28import com.intuit.karate.core.Variable;29import com.intuit.karate.core.VariableType;30import com.intuit.karate.core.VariableValue;31public class 7 {32 public static void main(String[] args) {33 VariableValue value = new VariableValue(true, VariableType.BOOLEAN);34 System.out.println(value.getValue());35 }36}37import com.intuit.karate.core.Variable;38import com.intuit.karate.core.VariableType;39import com.intuit.karate.core.VariableValue;40public class 8 {41 public static void main(String[] args) {42 VariableValue value = new VariableValue(null, VariableType.NULL);43 System.out.println(value.getValue());44 }45}

Full Screen

Full Screen

getValue

Using AI Code Generation

copy

Full Screen

1package demo;2import com.intuit.karate.KarateOptions;3import com.intuit.karate.junit4.Karate;4import org.junit.runner.RunWith;5@RunWith(Karate.class)6@KarateOptions(features = "classpath:demo/4.feature")7public class 4Runner {8}9 * def a = { name: 'John', age: 30 }10 * def b = { name: 'Jane', age: 32 }11 * def d = { name: 'Jack', age: 34, friends: c }12 * def e = { name: 'Jill', age: 36, friends: c }13 * def g = { name: 'Jen', age: 38, friends: f }14 * def h = { name: 'Jim', age: 40, friends: f }15 * def j = { name: 'Jon', age: 42, friends: i }16 * def k = { name: 'Joy', age: 44, friends: i }17 * def m = { name: 'Joe', age: 46, friends: l }18 * def n = { name: 'Jas', age: 48, friends: l }19 * def p = { name: 'Jaz', age: 50, friends: o }20 * def q = { name: 'Jin', age: 52, friends: o }21 * def s = { name: 'Jex', age: 54, friends: r }22 * def t = { name: 'Jax', age: 56, friends: r }23 * def v = { name: 'Jat', age: 58, friends: u }24 * def w = { name: 'Jeb', age: 60, friends: u }25 * def y = { name

Full Screen

Full Screen

getValue

Using AI Code Generation

copy

Full Screen

1import com.intuit.karate.core.*;2public class 4 {3 public static void main(String[] args) {4 VariablePool pool = new VariablePool();5 pool.put("x", 10);6 pool.put("y", 20);7 System.out.println(pool.getValue("x"));8 System.out.println(pool.getValue("y"));9 }10}11import com.intuit.karate.core.*;12public class 5 {13 public static void main(String[] args) {14 VariablePool pool = new VariablePool();15 pool.put("x", 10);16 pool.put("y", 20);17 System.out.println(pool.get("x"));18 System.out.println(pool.get("y"));19 }20}21import com.intuit.karate.core.*;22public class 6 {23 public static void main(String[] args) {24 VariablePool pool = new VariablePool();25 pool.put("x", 10);26 pool.put("y", 20);27 System.out.println(pool.get("x"));28 System.out.println(pool.get("y"));29 System.out.println(pool.get("z"));30 }31}32import com.intuit.karate.core.*;33public class 7 {34 public static void main(String[] args) {35 VariablePool pool = new VariablePool();36 pool.put("x", 10);37 pool.put("y", 20);38 System.out.println(pool.get("x"));39 System.out.println(pool.get("y"));40 pool.put("z", 30);41 System.out.println(pool.get("z"));42 }43}44import com.intuit.karate.core.*;45public class 8 {

Full Screen

Full Screen

getValue

Using AI Code Generation

copy

Full Screen

1package com.intuit.karate.core;2import com.intuit.karate.core.Variable;3import java.util.HashMap;4import java.util.Map;5public class 4 {6 public static void main(String[] args) {7 Map<String, Variable> map = new HashMap<>();8 map.put("name", new Variable("John"));9 map.put("age", new Variable(25));10 System.out.println(map.get("name").getValue());11 System.out.println(map.get("age").getValue());12 }13}14package com.intuit.karate.core;15import com.intuit.karate.core.Variable;16import java.util.HashMap;17import java.util.Map;18public class 5 {19 public static void main(String[] args) {20 Map<String, Variable> map = new HashMap<>();21 map.put("name", new Variable("John"));22 map.put("age", new Variable(2

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful