// +build integration

/*
 * 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.
 */

package tests

import (
	"fmt"
	"github.com/apache/incubator-openwhisk-cli/tests/src/integration/common"
	"github.com/stretchr/testify/assert"
	"os"
	"strings"
	"testing"
)

var invalidArgs []common.InvalidArg
var invalidArgsMsg = "error: Invalid argument(s)"
var tooFewArgsMsg = invalidArgsMsg + "."
var tooManyArgsMsg = invalidArgsMsg + ": "
var actionNameActionReqMsg = "An action name and code artifact are required."
var actionNameReqMsg = "An action name is required."
var actionOptMsg = "A code artifact is optional."
var packageNameReqMsg = "A package name is required."
var packageNameBindingReqMsg = "A package name and binding name are required."
var ruleNameReqMsg = "A rule name is required."
var ruleTriggerActionReqMsg = "A rule, trigger and action name are required."
var activationIdReq = "An activation ID is required."
var triggerNameReqMsg = "A trigger name is required."
var optNamespaceMsg = "An optional namespace is the only valid argument."
var noArgsReqMsg = "No arguments are required."
var invalidArg = "invalidArg"
var apiCreateReqMsg = "Specify a swagger file or specify an API base path with an API path, an API verb, and an action name."
var apiGetReqMsg = "An API base path or API name is required."
var apiDeleteReqMsg = "An API base path or API name is required.  An optional API relative path and operation may also be provided."
var apiListReqMsg = "Optional parameters are: API base path (or API name), API relative path and operation."
var invalidShared = "Cannot use value '" + invalidArg + "' for shared"

func initInvalidArgs() {
	invalidArgs = []common.InvalidArg{
		{
			Cmd: []string{"action", "create"},
			Err: tooFewArgsMsg + " " + actionNameActionReqMsg,
		},
		{
			Cmd: []string{"action", "create", "someAction"},
			Err: tooFewArgsMsg + " " + actionNameActionReqMsg,
		},
		{
			Cmd: []string{"action", "create", "actionName", "artifactName", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"action", "update"},
			Err: tooFewArgsMsg + " " + actionNameReqMsg + " " + actionOptMsg,
		},
		{
			Cmd: []string{"action", "update", "actionName", "artifactName", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ". " + actionNameReqMsg + " " + actionOptMsg,
		},
		{
			Cmd: []string{"action", "delete"},
			Err: tooFewArgsMsg + " " + actionNameReqMsg,
		},
		{
			Cmd: []string{"action", "delete", "actionName", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"action", "get"},
			Err: tooFewArgsMsg + " " + actionNameReqMsg,
		},
		{
			Cmd: []string{"action", "get", "actionName", "namespace", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"action", "list", "namespace", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ". " + optNamespaceMsg,
		},
		{
			Cmd: []string{"action", "invoke"},
			Err: tooFewArgsMsg + " " + actionNameReqMsg,
		},
		{
			Cmd: []string{"action", "invoke", "actionName", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"activation", "list", "namespace", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ". " + optNamespaceMsg,
		},
		{
			Cmd: []string{"activation", "get"},
			Err: tooFewArgsMsg + " " + activationIdReq,
		},
		{
			Cmd: []string{"activation", "get", "activationID", "namespace", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"activation", "logs"},
			Err: tooFewArgsMsg + " " + activationIdReq,
		},
		{
			Cmd: []string{"activation", "logs", "activationID", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},

		{
			Cmd: []string{"activation", "result"},
			Err: tooFewArgsMsg + " " + activationIdReq,
		},
		{
			Cmd: []string{"activation", "result", "activationID", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"activation", "poll", "activationID", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ". " + optNamespaceMsg,
		},
		{
			Cmd: []string{"namespace", "list", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ". " + noArgsReqMsg,
		},
		{
			Cmd: []string{"namespace", "get", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ". " + noArgsReqMsg,
		},
		{
			Cmd: []string{"package", "create"},
			Err: tooFewArgsMsg + " " + packageNameReqMsg,
		},
		{
			Cmd: []string{"package", "create", "packageName", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"package", "create", "packageName", "--shared", invalidArg},
			Err: invalidShared,
		},
		{
			Cmd: []string{"package", "update"},
			Err: tooFewArgsMsg + " " + packageNameReqMsg,
		},
		{
			Cmd: []string{"package", "update", "packageName", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"package", "update", "packageName", "--shared", invalidArg},
			Err: invalidShared,
		},
		{
			Cmd: []string{"package", "get"},
			Err: tooFewArgsMsg + " " + packageNameReqMsg,
		},
		{
			Cmd: []string{"package", "get", "packageName", "namespace", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"package", "bind"},
			Err: tooFewArgsMsg + " " + packageNameBindingReqMsg,
		},
		{
			Cmd: []string{"package", "bind", "packageName"},
			Err: tooFewArgsMsg + " " + packageNameBindingReqMsg,
		},
		{
			Cmd: []string{"package", "bind", "packageName", "bindingName", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"package", "list", "namespace", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ". " + optNamespaceMsg,
		},
		{
			Cmd: []string{"package", "delete"},
			Err: tooFewArgsMsg + " " + packageNameReqMsg,
		},
		{
			Cmd: []string{"package", "delete", "namespace", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"package", "refresh", "namespace", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ". " + optNamespaceMsg,
		},
		{
			Cmd: []string{"rule", "enable"},
			Err: tooFewArgsMsg + " " + ruleNameReqMsg,
		},
		{
			Cmd: []string{"rule", "enable", "ruleName", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"rule", "disable"},
			Err: tooFewArgsMsg + " " + ruleNameReqMsg,
		},
		{
			Cmd: []string{"rule", "disable", "ruleName", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"rule", "status"},
			Err: tooFewArgsMsg + " " + ruleNameReqMsg,
		},
		{
			Cmd: []string{"rule", "status", "ruleName", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"rule", "create"},
			Err: tooFewArgsMsg + " " + ruleTriggerActionReqMsg,
		},
		{
			Cmd: []string{"rule", "create", "ruleName"},
			Err: tooFewArgsMsg + " " + ruleTriggerActionReqMsg,
		},
		{
			Cmd: []string{"rule", "create", "ruleName", "triggerName"},
			Err: tooFewArgsMsg + " " + ruleTriggerActionReqMsg,
		},
		{
			Cmd: []string{"rule", "create", "ruleName", "triggerName", "actionName", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},

		{
			Cmd: []string{"rule", "update"},
			Err: tooFewArgsMsg + " " + ruleTriggerActionReqMsg,
		},
		{
			Cmd: []string{"rule", "update", "ruleName"},
			Err: tooFewArgsMsg + " " + ruleTriggerActionReqMsg,
		},
		{
			Cmd: []string{"rule", "update", "ruleName", "triggerName"},
			Err: tooFewArgsMsg + " " + ruleTriggerActionReqMsg,
		},
		{
			Cmd: []string{"rule", "update", "ruleName", "triggerName", "actionName", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"rule", "get"},
			Err: tooFewArgsMsg + " " + ruleNameReqMsg,
		},
		{
			Cmd: []string{"rule", "get", "ruleName", "namespace", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"rule", "delete"},
			Err: tooFewArgsMsg + " " + ruleNameReqMsg,
		},
		{
			Cmd: []string{"rule", "delete", "ruleName", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"rule", "list", "namespace", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ". " + optNamespaceMsg,
		},

		{
			Cmd: []string{"trigger", "fire"},
			Err: tooFewArgsMsg + " " + triggerNameReqMsg,
		},
		{
			Cmd: []string{"trigger", "fire", "triggerName", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ". " + triggerNameReqMsg,
		},
		{
			Cmd: []string{"trigger", "create"},
			Err: tooFewArgsMsg + " " + triggerNameReqMsg,
		},
		{
			Cmd: []string{"trigger", "create", "triggerName", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"trigger", "update"},
			Err: tooFewArgsMsg + " " + triggerNameReqMsg,
		},
		{
			Cmd: []string{"trigger", "update", "triggerName", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},

		{
			Cmd: []string{"trigger", "get"},
			Err: tooFewArgsMsg + " " + triggerNameReqMsg,
		},
		{
			Cmd: []string{"trigger", "get", "triggerName", "namespace", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"trigger", "delete"},
			Err: tooFewArgsMsg + " " + triggerNameReqMsg,
		},
		{
			Cmd: []string{"trigger", "delete", "triggerName", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ".",
		},
		{
			Cmd: []string{"trigger", "list", "namespace", invalidArg},
			Err: tooManyArgsMsg + invalidArg + ". " + optNamespaceMsg,
		},
	}
}

var wsk *common.Wsk = common.NewWsk()
var tmpProp = common.GetRepoPath() + "/wskprops.tmp"

// Test case to set apihost, auth, and namespace.
func TestSetAPIHostAuthNamespace(t *testing.T) {
	common.CreateFile(tmpProp)
	common.WriteFile(tmpProp, []string{})

	os.Setenv("WSK_CONFIG_FILE", tmpProp)
	assert.Equal(t, os.Getenv("WSK_CONFIG_FILE"), tmpProp, "The environment variable WSK_CONFIG_FILE has not been set.")

	namespace, _ := wsk.ListNamespaces()
	namespaces := strings.Split(strings.TrimSpace(string(namespace)), "\n")
	expectedNamespace := string(namespaces[len(namespaces)-1])
	fmt.Println(wsk.Wskprops.APIHost)
	if wsk.Wskprops.APIHost != "" && wsk.Wskprops.AuthKey != "" {
		stdout, err := wsk.RunCommand("property", "set", "--apihost", wsk.Wskprops.APIHost,
			"--auth", wsk.Wskprops.AuthKey, "--namespace", expectedNamespace)
		ouputString := string(stdout)
		assert.Equal(t, nil, err, "The command property set --apihost --auth --namespace failed to run.")
		assert.Contains(t, ouputString, "ok: whisk auth set. Run 'wsk property get --auth' to see the new value.",
			"The output of the command property set --apihost --auth --namespace does not contain \"whisk auth set\".")
		assert.Contains(t, ouputString, "ok: whisk API host set to "+wsk.Wskprops.APIHost,
			"The output of the command property set --apihost --auth --namespace does not contain \"whisk API host set\".")
		assert.Contains(t, ouputString, "ok: whisk namespace set to "+expectedNamespace,
			"The output of the command property set --apihost --auth --namespace does not contain \"whisk namespace set\".")
	}
	common.DeleteFile(tmpProp)
}

// Test case to show api build version using property file.
func TestShowAPIBuildVersion(t *testing.T) {
	common.CreateFile(tmpProp)

	os.Setenv("WSK_CONFIG_FILE", tmpProp)
	assert.Equal(t, os.Getenv("WSK_CONFIG_FILE"), tmpProp, "The environment variable WSK_CONFIG_FILE has not been set.")

	stdout, err := wsk.RunCommand("property", "set", "--apihost", wsk.Wskprops.APIHost,
		"--apiversion", wsk.Wskprops.Apiversion)
	assert.Equal(t, nil, err, "The command property set --apihost --apiversion failed to run.")
	stdout, err = wsk.RunCommand("property", "get", "-i", "--apibuild")
	assert.Equal(t, nil, err, "The command property get -i --apibuild failed to run.")
	println(common.RemoveRedundentSpaces(string(stdout)))
	assert.NotContains(t, common.RemoveRedundentSpaces(string(stdout)), "whisk API build Unknown",
		"The output of the command property get --apibuild does not contain \"whisk API build Unknown\".")
	assert.NotContains(t, common.RemoveRedundentSpaces(string(stdout)), "Unable to obtain API build information",
		"The output of the command property get --apibuild does not contain \"Unable to obtain API build information\".")
	assert.Contains(t, common.RemoveRedundentSpaces(string(stdout)), "whisk API build 20",
		"The output of the command property get --apibuild does not contain \"whisk API build 20\".")
	common.DeleteFile(tmpProp)
}

// Test case to fail to show api build when setting apihost to bogus value.
func TestFailShowAPIBuildVersion(t *testing.T) {
	common.CreateFile(tmpProp)

	os.Setenv("WSK_CONFIG_FILE", tmpProp)
	assert.Equal(t, os.Getenv("WSK_CONFIG_FILE"), tmpProp, "The environment variable WSK_CONFIG_FILE has not been set.")

	_, err := wsk.RunCommand("property", "set", "--apihost", "xxxx.yyyy")
	assert.Equal(t, nil, err, "The command property set --apihost failed to run.")
	stdout, err := wsk.RunCommand("property", "get", "-i", "--apibuild")
	assert.NotEqual(t, nil, err, "The command property get -i --apibuild does not raise any error.")
	assert.Contains(t, common.RemoveRedundentSpaces(string(stdout)), "whisk API build Unknown",
		"The output of the command property get --apibuild does not contain \"whisk API build Unknown\".")
	assert.Contains(t, common.RemoveRedundentSpaces(string(stdout)), "Unable to obtain API build information",
		"The output of the command property get --apibuild does not contain \"Unable to obtain API build information\".")
}

// Test case to show api build using http apihost.
func TestShowAPIBuildVersionHTTP(t *testing.T) {
	common.CreateFile(tmpProp)

	os.Setenv("WSK_CONFIG_FILE", tmpProp)
	assert.Equal(t, os.Getenv("WSK_CONFIG_FILE"), tmpProp, "The environment variable WSK_CONFIG_FILE has not been set.")

	apihost := wsk.Wskprops.APIHost
	stdout, err := wsk.RunCommand("property", "set", "--apihost", apihost)
	assert.Equal(t, nil, err, "The command property set --apihost failed to run.")
	stdout, err = wsk.RunCommand("property", "get", "-i", "--apibuild")
	println(common.RemoveRedundentSpaces(string(stdout)))
	//assert.Equal(t, nil, err, "The command property get -i --apibuild failed to run.")
	assert.NotContains(t, common.RemoveRedundentSpaces(string(stdout)), "whisk API build Unknown",
		"The output of the command property get --apibuild does not contain \"whisk API build Unknown\".")
	assert.NotContains(t, common.RemoveRedundentSpaces(string(stdout)), "Unable to obtain API build information",
		"The output of the command property get --apibuild does not contain \"Unable to obtain API build information\".")
	assert.Contains(t, common.RemoveRedundentSpaces(string(stdout)), "whisk API build 20",
		"The output of the command property get --apibuild does not contain \"whisk API build 20\".")
	common.DeleteFile(tmpProp)
}

// Test case to reject bad command.
func TestRejectAuthCommNoKey(t *testing.T) {
	common.CreateFile(tmpProp)

	os.Setenv("WSK_CONFIG_FILE", tmpProp)
	assert.Equal(t, os.Getenv("WSK_CONFIG_FILE"), tmpProp, "The environment variable WSK_CONFIG_FILE has not been set.")

	stdout, err := wsk.RunCommand("list", "--apihost", wsk.Wskprops.APIHost,
		"--apiversion", wsk.Wskprops.Apiversion)
	assert.NotEqual(t, nil, err, "The command list should fail to run.")
	assert.Contains(t, common.RemoveRedundentSpaces(string(stdout)), "usage.",
		"The output of the command does not contain \"usage.\".")
	assert.Contains(t, common.RemoveRedundentSpaces(string(stdout)), "--auth is required",
		"The output of the command does not contain \"--auth is required\".")
	common.DeleteFile(tmpProp)
}

// Test case to reject commands that are executed with invalid arguments.
func TestRejectCommInvalidArgs(t *testing.T) {
	initInvalidArgs()
	for _, invalidArg := range invalidArgs {
		cs := invalidArg.Cmd
		cs = append(cs, "--apihost", wsk.Wskprops.APIHost)
		stdout, err := wsk.RunCommand(cs...)
		outputString := string(stdout)
		assert.NotEqual(t, nil, err, "The command should fail to run.")
		if err.Error() == "exit status 1" {
			assert.Equal(t, "exit status 1", err.Error(), "The error should be exit status 1 or 2.")
		} else {
			assert.Equal(t, "exit status 2", err.Error(), "The error should be exit status 1 or 2.")
		}
		assert.Contains(t, outputString, invalidArg.Err,
			"The output of the command does not contain "+invalidArg.Err)
		assert.Contains(t, outputString, "Run 'wsk --help' for usage",
			"The output of the command does not contain \"Run 'wsk --help' for usage\".")
	}
}

// Test case to reject commands that are executed with invalid JSON for annotations and parameters.
func TestRejectCommInvalidJSON(t *testing.T) {
	helloFile := common.GetTestActionFilename("hello.js")
	var invalidJSONInputs = []string{
		"{\"invalid1\": }",
		"{\"invalid2\": bogus}",
		"{\"invalid1\": \"aKey\"",
		"invalid \"string\"",
		"{\"invalid1\": [1, 2, \"invalid\"\"arr\"]}",
	}
	var invalidJSONFiles = []string{
		common.GetTestActionFilename("malformed.js"),
		common.GetTestActionFilename("invalidInput1.json"),
		common.GetTestActionFilename("invalidInput2.json"),
		common.GetTestActionFilename("invalidInput3.json"),
		common.GetTestActionFilename("invalidInput4.json"),
	}
	var invalidParamArg = "Invalid parameter argument"
	var invalidAnnoArg = "Invalid annotation argument"
	var paramCmds = []common.InvalidArg{
		{
			Cmd: []string{"action", "create", "actionName", helloFile},
			Err: invalidParamArg,
		},
		{
			Cmd: []string{"action", "update", "actionName", helloFile},
			Err: invalidParamArg,
		},
		{
			Cmd: []string{"action", "invoke", "actionName"},
			Err: invalidParamArg,
		},
		{
			Cmd: []string{"package", "create", "packageName"},
			Err: invalidParamArg,
		},
		{
			Cmd: []string{"package", "update", "packageName"},
			Err: invalidParamArg,
		},
		{
			Cmd: []string{"package", "bind", "packageName", "boundPackageName"},
			Err: invalidParamArg,
		},
		{
			Cmd: []string{"trigger", "create", "triggerName"},
			Err: invalidParamArg,
		},
		{
			Cmd: []string{"trigger", "update", "triggerName"},
			Err: invalidParamArg,
		},
		{
			Cmd: []string{"trigger", "fire", "triggerName"},
			Err: invalidParamArg,
		},
	}

	var annotCmds = []common.InvalidArg{
		{
			Cmd: []string{"action", "create", "actionName", helloFile},
			Err: invalidAnnoArg,
		},
		{
			Cmd: []string{"action", "update", "actionName", helloFile},
			Err: invalidAnnoArg,
		},
		{
			Cmd: []string{"package", "create", "packageName"},
			Err: invalidAnnoArg,
		},
		{
			Cmd: []string{"package", "update", "packageName"},
			Err: invalidAnnoArg,
		},
		{
			Cmd: []string{"package", "bind", "packageName", "boundPackageName"},
			Err: invalidAnnoArg,
		},
		{
			Cmd: []string{"trigger", "create", "triggerName"},
			Err: invalidAnnoArg,
		},
		{
			Cmd: []string{"trigger", "update", "triggerName"},
			Err: invalidAnnoArg,
		},
	}

	for _, cmd := range paramCmds {
		for _, invalid := range invalidJSONInputs {
			cs := cmd.Cmd
			cs = append(cs, "-p", "key", invalid, "--apihost", wsk.Wskprops.APIHost)
			stdout, err := wsk.RunCommand(cs...)
			outputString := string(stdout)
			assert.NotEqual(t, nil, err, "The command should fail to run.")
			assert.Equal(t, "exit status 1", err.Error(), "The error should be exit status 1.")
			assert.Contains(t, outputString, cmd.Err,
				"The output of the command does not contain "+cmd.Err+" .")
		}
		for _, invalid := range invalidJSONFiles {
			cs := cmd.Cmd
			cs = append(cs, "-P", invalid, "--apihost", wsk.Wskprops.APIHost)
			stdout, err := wsk.RunCommand(cs...)
			outputString := string(stdout)
			assert.NotEqual(t, nil, err, "The command should fail to run.")
			assert.Equal(t, "exit status 1", err.Error(), "The error should be exit status 1.")
			assert.Contains(t, outputString, cmd.Err,
				"The output of the command does not contain "+cmd.Err+" .")
		}
	}

	for _, cmd := range annotCmds {
		for _, invalid := range invalidJSONInputs {
			cs := cmd.Cmd
			cs = append(cs, "-a", "key", invalid, "--apihost", wsk.Wskprops.APIHost)
			stdout, err := wsk.RunCommand(cs...)
			outputString := string(stdout)
			assert.NotEqual(t, nil, err, "The command should fail to run.")
			assert.Equal(t, "exit status 1", err.Error(), "The error should be exit status 1.")
			assert.Contains(t, outputString, cmd.Err,
				"The output of the command does not contain "+cmd.Err+" .")
		}
		for _, invalid := range invalidJSONFiles {
			cs := cmd.Cmd
			cs = append(cs, "-A", invalid, "--apihost", wsk.Wskprops.APIHost)
			stdout, err := wsk.RunCommand(cs...)
			outputString := string(stdout)
			assert.NotEqual(t, nil, err, "The command should fail to run.")
			assert.Equal(t, "exit status 1", err.Error(), "The error should be exit status 1.")
			assert.Contains(t, outputString, cmd.Err,
				"The output of the command does not contain "+cmd.Err+" .")
		}
	}
}
