#   Licensed to the Apache Software Foundation (ASF) under one or more
#   contributor license agreements.  See the NOTICE file distributed with
#   this work for additional information regarding copyright ownership.
#   The ASF licenses this file to You under the Apache License, Version 2.0
#   (the "License"); you may not use this file except in compliance with
#   the License.  You may obtain a copy of the License at
# 
#       http://www.apache.org/licenses/LICENSE-2.0
# 
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.

displayName=BSF Listener
scriptingLanguage.displayName=Script language (e.g. beanshell, javascript, jexl)
scriptLanguage.displayName=Language
scriptLanguage.shortDescription=Name of BSF language, e.g. beanshell, javascript, jexl
scripting.displayName=Script (variables: ctx vars props sampleResult (aka prev) sampleEvent sampler log Label Filename Parameters args[] OUT)
script.displayName=Script
script.shortDescription=Script in the appropriate BSF language
parameterGroup.displayName=Parameters to be passed to script (=> String Parameters and String []args)
parameters.displayName=Parameters
parameters.shortDescription=Parameters to be passed to the file or script
filenameGroup.displayName=Script file (overrides script)
filename.displayName=File Name
filename.shortDescription=Script file (overrides script)