You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@openwhisk.apache.org by GitBox <gi...@apache.org> on 2018/06/11 21:33:35 UTC

[GitHub] mrutkows closed pull request #951: Adding support for API path parameters and repsonse type HTTP

mrutkows closed pull request #951: Adding support for API path parameters and repsonse type HTTP
URL: https://github.com/apache/incubator-openwhisk-wskdeploy/pull/951
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/deployers/manifestreader.go b/deployers/manifestreader.go
index 64349076..efe9a923 100644
--- a/deployers/manifestreader.go
+++ b/deployers/manifestreader.go
@@ -108,7 +108,7 @@ func (reader *ManifestReader) HandleYaml(manifestParser *parsers.YAMLParser, man
 		return wskderrors.NewYAMLFileFormatError(manifestName, err)
 	}
 
-	apis, err := manifestParser.ComposeApiRecordsFromAllPackages(reader.serviceDeployer.ClientConfig, manifest)
+	apis, responses, err := manifestParser.ComposeApiRecordsFromAllPackages(reader.serviceDeployer.ClientConfig, manifest)
 	if err != nil {
 		return wskderrors.NewYAMLFileFormatError(manifestName, err)
 	}
@@ -138,7 +138,7 @@ func (reader *ManifestReader) HandleYaml(manifestParser *parsers.YAMLParser, man
 		return wskderrors.NewYAMLFileFormatError(manifestName, err)
 	}
 
-	err = reader.SetApis(apis)
+	err = reader.SetApis(apis, responses)
 	if err != nil {
 		return wskderrors.NewYAMLFileFormatError(manifestName, err)
 	}
@@ -304,19 +304,20 @@ func (reader *ManifestReader) SetRules(rules []*whisk.Rule) error {
 	return nil
 }
 
-func (reader *ManifestReader) SetApis(ar []*whisk.ApiCreateRequest) error {
+func (reader *ManifestReader) SetApis(ar []*whisk.ApiCreateRequest, responses map[string]*whisk.ApiCreateRequestOptions) error {
 	dep := reader.serviceDeployer
 
 	dep.mt.Lock()
 	defer dep.mt.Unlock()
 
 	for _, api := range ar {
-		apiPath := api.ApiDoc.ApiName + api.ApiDoc.GatewayBasePath + api.ApiDoc.GatewayRelPath + api.ApiDoc.GatewayMethod
-
-		// uniqueness issue when using action name as key as there can be multiple APIs pointing to same action.
-		// using apiPath instead as it is uniqueue
+		apiPath := api.ApiDoc.ApiName + " " + api.ApiDoc.GatewayBasePath +
+			api.ApiDoc.GatewayRelPath + " " + api.ApiDoc.GatewayMethod
 		dep.Deployment.Apis[apiPath] = api
 	}
+	for apiPath, response := range responses {
+		dep.Deployment.ApiOptions[apiPath] = response
+	}
 
 	return nil
 }
diff --git a/deployers/servicedeployer.go b/deployers/servicedeployer.go
index a0e84e7c..970629aa 100644
--- a/deployers/servicedeployer.go
+++ b/deployers/servicedeployer.go
@@ -45,10 +45,11 @@ const (
 )
 
 type DeploymentProject struct {
-	Packages map[string]*DeploymentPackage
-	Triggers map[string]*whisk.Trigger
-	Rules    map[string]*whisk.Rule
-	Apis     map[string]*whisk.ApiCreateRequest
+	Packages   map[string]*DeploymentPackage
+	Triggers   map[string]*whisk.Trigger
+	Rules      map[string]*whisk.Rule
+	Apis       map[string]*whisk.ApiCreateRequest
+	ApiOptions map[string]*whisk.ApiCreateRequestOptions
 }
 
 func NewDeploymentProject() *DeploymentProject {
@@ -57,6 +58,7 @@ func NewDeploymentProject() *DeploymentProject {
 	dep.Triggers = make(map[string]*whisk.Trigger)
 	dep.Rules = make(map[string]*whisk.Rule)
 	dep.Apis = make(map[string]*whisk.ApiCreateRequest)
+	dep.ApiOptions = make(map[string]*whisk.ApiCreateRequestOptions)
 	return &dep
 }
 
@@ -1014,10 +1016,9 @@ func (deployer *ServiceDeployer) createApi(api *whisk.ApiCreateRequest) error {
 	var err error
 	var response *http.Response
 
-	apiCreateReqOptions := new(whisk.ApiCreateRequestOptions)
+	apiCreateReqOptions := deployer.Deployment.ApiOptions[apiPath]
 	apiCreateReqOptions.SpaceGuid = strings.Split(deployer.Client.Config.AuthToken, ":")[0]
 	apiCreateReqOptions.AccessToken = deployer.Client.Config.ApigwAccessToken
-	// TODO() Add Response type apiCreateReqOptions.ResponseType
 
 	err = retry(DEFAULT_ATTEMPTS, DEFAULT_INTERVAL, func() error {
 		_, response, err = deployer.Client.Apis.Insert(api, apiCreateReqOptions, true)
diff --git a/parsers/manifest_parser.go b/parsers/manifest_parser.go
index f7853be6..3223225e 100644
--- a/parsers/manifest_parser.go
+++ b/parsers/manifest_parser.go
@@ -41,14 +41,16 @@ import (
 )
 
 const (
-	API                 = "API"
-	HTTPS               = "https://"
-	HTTP                = "http://"
-	API_VERSION         = "v1"
-	WEB                 = "web"
-	PATH_SEPARATOR      = "/"
-	DEFAULT_PACKAGE     = "default"
-	NATIVE_DOCKER_IMAGE = "openwhisk/dockerskeleton"
+	API                   = "API"
+	HTTPS                 = "https://"
+	HTTP                  = "http://"
+	API_VERSION           = "v1"
+	WEB                   = "web"
+	PATH_SEPARATOR        = "/"
+	DEFAULT_PACKAGE       = "default"
+	NATIVE_DOCKER_IMAGE   = "openwhisk/dockerskeleton"
+	PARAM_OPENING_BRACKET = "{"
+	PARAM_CLOSING_BRACKET = "}"
 )
 
 // Read existing manifest file or create new if none exists
@@ -1089,8 +1091,9 @@ func (dm *YAMLParser) ComposeRules(pkg Package, packageName string, managedAnnot
 	return rules, nil
 }
 
-func (dm *YAMLParser) ComposeApiRecordsFromAllPackages(client *whisk.Config, manifest *YAML) ([]*whisk.ApiCreateRequest, error) {
-	var requests []*whisk.ApiCreateRequest = make([]*whisk.ApiCreateRequest, 0)
+func (dm *YAMLParser) ComposeApiRecordsFromAllPackages(client *whisk.Config, manifest *YAML) ([]*whisk.ApiCreateRequest, map[string]*whisk.ApiCreateRequestOptions, error) {
+	var requests = make([]*whisk.ApiCreateRequest, 0)
+	var responses = make(map[string]*whisk.ApiCreateRequestOptions, 0)
 	manifestPackages := make(map[string]Package)
 
 	if len(manifest.Packages) != 0 {
@@ -1100,23 +1103,26 @@ func (dm *YAMLParser) ComposeApiRecordsFromAllPackages(client *whisk.Config, man
 	}
 
 	for packageName, p := range manifestPackages {
-		r, err := dm.ComposeApiRecords(client, packageName, p, manifest.Filepath)
+		r, response, err := dm.ComposeApiRecords(client, packageName, p, manifest.Filepath)
 		if err == nil {
 			requests = append(requests, r...)
+			for k, v := range response {
+				responses[k] = v
+			}
 		} else {
-			return nil, err
+			return nil, nil, err
 		}
 	}
-	return requests, nil
+	return requests, responses, nil
 }
 
 /*
  * read API section from manifest file:
  * apis: # List of APIs
- *     hello-world: #API name
- *	/hello: #gateway base path
- *	    /world:   #gateway rel path
- *		greeting: get #action name: gateway method
+ * 		hello-world: #API name
+ *			/hello: #gateway base path
+ *	    		/world:   #gateway rel path
+ *					greeting: get #action name: gateway method
  *
  * compose APIDoc structure from the manifest:
  * {
@@ -1135,29 +1141,41 @@ func (dm *YAMLParser) ComposeApiRecordsFromAllPackages(client *whisk.Config, man
  * 	}
  * }
  */
-func (dm *YAMLParser) ComposeApiRecords(client *whisk.Config, packageName string, pkg Package, manifestPath string) ([]*whisk.ApiCreateRequest, error) {
-	var requests []*whisk.ApiCreateRequest = make([]*whisk.ApiCreateRequest, 0)
+func (dm *YAMLParser) ComposeApiRecords(client *whisk.Config, packageName string, pkg Package, manifestPath string) ([]*whisk.ApiCreateRequest, map[string]*whisk.ApiCreateRequestOptions, error) {
+	var requests = make([]*whisk.ApiCreateRequest, 0)
 
+	// verify APIGW_ACCESS_TOKEN is set before composing APIs
+	// until this point, we dont know whether APIs are specified in manifest or not
 	if pkg.Apis != nil && len(pkg.Apis) != 0 {
-		// verify APIGW_ACCESS_TOKEN is set before composing APIs
-		// until this point, we dont know whether APIs are specified in manifest or not
 		if len(client.ApigwAccessToken) == 0 {
-			return nil, wskderrors.NewWhiskClientInvalidConfigError(wski18n.ID_MSG_CONFIG_MISSING_APIGW_ACCESS_TOKEN)
+			return nil, nil, wskderrors.NewWhiskClientInvalidConfigError(
+				wski18n.ID_MSG_CONFIG_MISSING_APIGW_ACCESS_TOKEN)
 		}
 	}
 
+	requestOptions := make(map[string]*whisk.ApiCreateRequestOptions, 0)
+
 	for apiName, apiDoc := range pkg.Apis {
 		for gatewayBasePath, gatewayBasePathMap := range apiDoc {
+			// Base Path
+			// validate base path should not have any path parameters
+			if !isGatewayBasePathValid(gatewayBasePath) {
+				err := wskderrors.NewYAMLParserErr(manifestPath,
+					wski18n.T(wski18n.ID_ERR_API_GATEWAY_BASE_PATH_INVALID_X_api_X,
+						map[string]interface{}{wski18n.KEY_API_BASE_PATH: gatewayBasePath}))
+				return requests, requestOptions, err
+			}
 			// append "/" to the gateway base path if its missing
 			if !strings.HasPrefix(gatewayBasePath, PATH_SEPARATOR) {
 				gatewayBasePath = PATH_SEPARATOR + gatewayBasePath
 			}
 			for gatewayRelPath, gatewayRelPathMap := range gatewayBasePathMap {
+				// Relative Path
 				// append "/" to the gateway relative path if its missing
 				if !strings.HasPrefix(gatewayRelPath, PATH_SEPARATOR) {
 					gatewayRelPath = PATH_SEPARATOR + gatewayRelPath
 				}
-				for actionName, gatewayMethod := range gatewayRelPathMap {
+				for actionName, gatewayMethodResponse := range gatewayRelPathMap {
 					// verify that the action is defined under actions sections
 					if _, ok := pkg.Actions[actionName]; ok {
 						// verify that the action is defined as web action
@@ -1194,48 +1212,84 @@ func (dm *YAMLParser) ComposeApiRecords(client *whisk.Config, packageName string
 						}
 						// return failure since action or sequence are not defined in the manifest
 					} else {
-						return nil, wskderrors.NewYAMLFileFormatError(manifestPath,
+						return nil, nil, wskderrors.NewYAMLFileFormatError(manifestPath,
 							wski18n.T(wski18n.ID_ERR_API_MISSING_ACTION_OR_SEQUENCE_X_action_or_sequence_X_api_X,
 								map[string]interface{}{
 									wski18n.KEY_ACTION: actionName,
 									wski18n.KEY_API:    apiName}))
 					}
-					request := new(whisk.ApiCreateRequest)
-					request.ApiDoc = new(whisk.Api)
-					request.ApiDoc.GatewayBasePath = gatewayBasePath
-					// is API verb is valid, it must be one of (GET, PUT, POST, DELETE)
-					request.ApiDoc.GatewayRelPath = gatewayRelPath
-					if _, ok := whisk.ApiVerbs[strings.ToUpper(gatewayMethod)]; !ok {
-						return nil, wskderrors.NewInvalidAPIGatewayMethodError(manifestPath,
+
+					// get the list of path parameters from relative path
+					pathParameters := generatePathParameters(gatewayRelPath)
+
+					// Check if response type is set to http for API using path parameters
+					if strings.ToLower(gatewayMethodResponse.Method) != utils.HTTP_FILE_EXTENSION &&
+						len(pathParameters) > 0 {
+						warningString := wski18n.T(wski18n.ID_WARN_API_INVALID_RESPONSE_TYPE,
+							map[string]interface{}{
+								wski18n.KEY_API:               apiName,
+								wski18n.KEY_API_RELATIVE_PATH: gatewayRelPath,
+								wski18n.KEY_RESPONSE:          gatewayMethodResponse.Response})
+						wskprint.PrintlnOpenWhiskWarning(warningString)
+						gatewayMethodResponse.Response = utils.HTTP_FILE_EXTENSION
+					}
+
+					// Chekc if API verb is valid, it must be one of (GET, PUT, POST, DELETE)
+					if _, ok := whisk.ApiVerbs[strings.ToUpper(gatewayMethodResponse.Method)]; !ok {
+						return nil, nil, wskderrors.NewInvalidAPIGatewayMethodError(manifestPath,
 							gatewayBasePath+gatewayRelPath,
-							gatewayMethod,
+							gatewayMethodResponse.Method,
 							dm.getGatewayMethods())
 					}
-					request.ApiDoc.GatewayMethod = strings.ToUpper(gatewayMethod)
-					request.ApiDoc.Namespace = client.Namespace
-					request.ApiDoc.ApiName = apiName
-					request.ApiDoc.Id = strings.Join([]string{API, request.ApiDoc.Namespace, request.ApiDoc.GatewayRelPath}, ":")
+
+					apiDocActionName := actionName
+					if strings.ToLower(packageName) != DEFAULT_PACKAGE {
+						apiDocActionName = packageName + PATH_SEPARATOR + actionName
+					}
+
 					// set action of an API Doc
-					request.ApiDoc.Action = new(whisk.ApiAction)
-					if packageName == DEFAULT_PACKAGE {
-						request.ApiDoc.Action.Name = actionName
-					} else {
-						request.ApiDoc.Action.Name = packageName + PATH_SEPARATOR + actionName
+					apiDocAction := whisk.ApiAction{
+						Name:      apiDocActionName,
+						Namespace: client.Namespace,
+						BackendUrl: strings.Join([]string{HTTPS +
+							client.Host, strings.ToLower(API),
+							API_VERSION, WEB, client.Namespace, packageName,
+							actionName + "." + utils.HTTP_FILE_EXTENSION},
+							PATH_SEPARATOR),
+						BackendMethod: gatewayMethodResponse.Method,
+						Auth:          client.AuthToken,
+					}
+
+					requestApiDoc := whisk.Api{
+						GatewayBasePath: gatewayBasePath,
+						PathParameters:  pathParameters,
+						GatewayRelPath:  gatewayRelPath,
+						GatewayMethod:   strings.ToUpper(gatewayMethodResponse.Method),
+						Namespace:       client.Namespace,
+						ApiName:         apiName,
+						Id:              strings.Join([]string{API, client.Namespace, gatewayRelPath}, ":"),
+						Action:          &apiDocAction,
+					}
+
+					request := whisk.ApiCreateRequest{
+						ApiDoc: &requestApiDoc,
 					}
-					url := []string{HTTPS + client.Host, strings.ToLower(API),
-						API_VERSION, WEB, client.Namespace, packageName,
-						actionName + "." + utils.HTTP_FILE_EXTENSION}
-					request.ApiDoc.Action.Namespace = client.Namespace
-					request.ApiDoc.Action.BackendUrl = strings.Join(url, PATH_SEPARATOR)
-					request.ApiDoc.Action.BackendMethod = gatewayMethod
-					request.ApiDoc.Action.Auth = client.AuthToken
+
 					// add a newly created ApiCreateRequest object to a list of requests
-					requests = append(requests, request)
+					requests = append(requests, &request)
+
+					// Create an instance of ApiCreateRequestOptions
+					options := whisk.ApiCreateRequestOptions{
+						ResponseType: gatewayMethodResponse.Response,
+					}
+					apiPath := request.ApiDoc.ApiName + " " + request.ApiDoc.GatewayBasePath +
+						request.ApiDoc.GatewayRelPath + " " + request.ApiDoc.GatewayMethod
+					requestOptions[apiPath] = &options
 				}
 			}
 		}
 	}
-	return requests, nil
+	return requests, requestOptions, nil
 }
 
 func (dm *YAMLParser) getGatewayMethods() []string {
@@ -1245,3 +1299,74 @@ func (dm *YAMLParser) getGatewayMethods() []string {
 	}
 	return methods
 }
+
+func doesPathParamExist(params []string, param string) bool {
+	for _, e := range params {
+		if e == param {
+			return true
+		}
+	}
+	return false
+}
+
+func getPathParameterNames(path string) []string {
+	var pathParameters []string
+	pathElements := strings.Split(path, PATH_SEPARATOR)
+	for _, e := range pathElements {
+		paramName := getParamName(e)
+		if len(paramName) > 0 {
+			if !doesPathParamExist(pathParameters, paramName) {
+				pathParameters = append(pathParameters, paramName)
+			}
+		}
+	}
+	return pathParameters
+}
+
+func generatePathParameters(relativePath string) []whisk.ApiParameter {
+	pathParams := []whisk.ApiParameter{}
+
+	pathParamNames := getPathParameterNames(relativePath)
+	for _, paramName := range pathParamNames {
+		param := whisk.ApiParameter{Name: paramName, In: "path", Required: true, Type: "string",
+			Description: wski18n.T("Default description for '{{.name}}'", map[string]interface{}{"name": paramName})}
+		pathParams = append(pathParams, param)
+	}
+
+	return pathParams
+}
+
+func isParam(param string) bool {
+	if strings.HasPrefix(param, PARAM_OPENING_BRACKET) &&
+		strings.HasSuffix(param, PARAM_CLOSING_BRACKET) {
+		return true
+	}
+	return false
+}
+
+func getParamName(param string) string {
+	paramName := ""
+	if isParam(param) {
+		paramName = param[1 : len(param)-1]
+	}
+	return paramName
+}
+
+func isGatewayBasePathValid(basePath string) bool {
+	// return false if base path is empty string
+	if len(basePath) == 0 {
+		return false
+	}
+	// drop preceding "/" if exists
+	if strings.HasPrefix(basePath, PATH_SEPARATOR) {
+		basePath = basePath[1:]
+	}
+	// slice base path into substrings seperated by "/"
+	// if there are more than one substrings, basePath has path parameters
+	// basePath will have path parameters if substrings count is more than 1
+	basePathElements := strings.Split(basePath, PATH_SEPARATOR)
+	if len(basePathElements) > 1 {
+		return false
+	}
+	return true
+}
diff --git a/parsers/manifest_parser_test.go b/parsers/manifest_parser_test.go
index b4a3cc80..ec7dc24a 100644
--- a/parsers/manifest_parser_test.go
+++ b/parsers/manifest_parser_test.go
@@ -31,6 +31,7 @@ import (
 
 	"github.com/apache/incubator-openwhisk-client-go/whisk"
 	"github.com/apache/incubator-openwhisk-wskdeploy/runtimes"
+	"github.com/apache/incubator-openwhisk-wskdeploy/utils"
 	"github.com/apache/incubator-openwhisk-wskdeploy/wskderrors"
 	"github.com/apache/incubator-openwhisk-wskdeploy/wskprint"
 	"github.com/stretchr/testify/assert"
@@ -1499,11 +1500,11 @@ func TestComposeApiRecords(t *testing.T) {
 		ApigwAccessToken: "token",
 	}
 
-	apiList, err := p.ComposeApiRecordsFromAllPackages(&config, m)
+	apiList, apiRequestOptions, err := p.ComposeApiRecordsFromAllPackages(&config, m)
 	if err != nil {
 		assert.Fail(t, "Failed to compose api records: "+err.Error())
 	}
-	assert.Equal(t, 7, len(apiList), "Failed to get api records")
+	assert.Equal(t, 10, len(apiList), "Failed to get api records")
 	for _, apiRecord := range apiList {
 		apiDoc := apiRecord.ApiDoc
 		action := apiDoc.Action
@@ -1539,7 +1540,30 @@ func TestComposeApiRecords(t *testing.T) {
 			assert.Equal(t, "/club2", apiDoc.GatewayBasePath, "Failed to set api base path")
 			assert.Equal(t, "/members2", apiDoc.GatewayRelPath, "Failed to set api rel path")
 			assert.Equal(t, "get", action.BackendMethod, "Failed to set api backend method")
-
+		case "apiTest/getBooks3":
+			assert.Equal(t, "book-club3", apiDoc.ApiName, "Failed to set api name")
+			assert.Equal(t, "/club3", apiDoc.GatewayBasePath, "Failed to set api base path")
+			assert.Equal(t, "/booksByISBN/{isbn}", apiDoc.GatewayRelPath, "Failed to set api rel path")
+			assert.Equal(t, "get", action.BackendMethod, "Failed to set api backend method")
+			assert.Equal(t, 1, len(apiDoc.PathParameters), "Failed to set api path parameters")
+			apiPath := apiDoc.ApiName + " " + apiDoc.GatewayBasePath + apiDoc.GatewayRelPath + " " + apiDoc.GatewayMethod
+			assert.Equal(t, utils.HTTP_FILE_EXTENSION, apiRequestOptions[apiPath].ResponseType, "Failed to set response type")
+		case "apiTest/putBooks3":
+			assert.Equal(t, "book-club3", apiDoc.ApiName, "Failed to set api name")
+			assert.Equal(t, "/club3", apiDoc.GatewayBasePath, "Failed to set api base path")
+			assert.Equal(t, "/booksWithParams/path/{params}/more/{params1}/", apiDoc.GatewayRelPath, "Failed to set api rel path")
+			assert.Equal(t, "put", action.BackendMethod, "Failed to set api backend method")
+			assert.Equal(t, 2, len(apiDoc.PathParameters), "Failed to set api path parameters")
+			apiPath := apiDoc.ApiName + " " + apiDoc.GatewayBasePath + apiDoc.GatewayRelPath + " " + apiDoc.GatewayMethod
+			assert.Equal(t, utils.HTTP_FILE_EXTENSION, apiRequestOptions[apiPath].ResponseType, "Failed to set response type")
+		case "apiTest/deleteBooks3":
+			assert.Equal(t, "book-club3", apiDoc.ApiName, "Failed to set api name")
+			assert.Equal(t, "/club3", apiDoc.GatewayBasePath, "Failed to set api base path")
+			assert.Equal(t, "/booksWithDuplicateParams/path/{params}/more/{params}/", apiDoc.GatewayRelPath, "Failed to set api rel path")
+			assert.Equal(t, "delete", action.BackendMethod, "Failed to set api backend method")
+			assert.Equal(t, 1, len(apiDoc.PathParameters), "Failed to set api path parameters")
+			apiPath := apiDoc.ApiName + " " + apiDoc.GatewayBasePath + apiDoc.GatewayRelPath + " " + apiDoc.GatewayMethod
+			assert.Equal(t, utils.HTTP_FILE_EXTENSION, apiRequestOptions[apiPath].ResponseType, "Failed to set response type")
 		default:
 			assert.Fail(t, "Failed to get api action name")
 		}
diff --git a/parsers/yamlparser.go b/parsers/yamlparser.go
index 1cb31747..5f12370a 100644
--- a/parsers/yamlparser.go
+++ b/parsers/yamlparser.go
@@ -194,25 +194,30 @@ type Repository struct {
 	Credential  string `yaml:"credential,omitempty"`
 }
 
+type APIMethodResponse struct {
+	Method   string `yaml:"method"`
+	Response string `yaml:"response"`
+}
+
 type Package struct {
-	Packagename      string                                             `yaml:"name"`
-	Version          string                                             `yaml:"version"` //mandatory
-	License          string                                             `yaml:"license"` //mandatory
-	Public           bool                                               `yaml:"public,omitempty"`
-	Repositories     []Repository                                       `yaml:"repositories,omitempty"`
-	Dependencies     map[string]Dependency                              `yaml:"dependencies"`
-	Namespace        string                                             `yaml:"namespace"`
-	Credential       string                                             `yaml:"credential"`
-	ApiHost          string                                             `yaml:"apiHost"`
-	ApigwAccessToken string                                             `yaml:"apigwAccessToken"`
-	Actions          map[string]Action                                  `yaml:"actions"`
-	Triggers         map[string]Trigger                                 `yaml:"triggers"`
-	Feeds            map[string]Feed                                    `yaml:"feeds"`
-	Rules            map[string]Rule                                    `yaml:"rules"`
-	Inputs           map[string]Parameter                               `yaml:"inputs"`
-	Sequences        map[string]Sequence                                `yaml:"sequences"`
-	Annotations      map[string]interface{}                             `yaml:"annotations,omitempty"`
-	Apis             map[string]map[string]map[string]map[string]string `yaml:"apis"`
+	Packagename      string                                                        `yaml:"name"`
+	Version          string                                                        `yaml:"version"` //mandatory
+	License          string                                                        `yaml:"license"` //mandatory
+	Public           bool                                                          `yaml:"public,omitempty"`
+	Repositories     []Repository                                                  `yaml:"repositories,omitempty"`
+	Dependencies     map[string]Dependency                                         `yaml:"dependencies"`
+	Namespace        string                                                        `yaml:"namespace"`
+	Credential       string                                                        `yaml:"credential"`
+	ApiHost          string                                                        `yaml:"apiHost"`
+	ApigwAccessToken string                                                        `yaml:"apigwAccessToken"`
+	Actions          map[string]Action                                             `yaml:"actions"`
+	Triggers         map[string]Trigger                                            `yaml:"triggers"`
+	Feeds            map[string]Feed                                               `yaml:"feeds"`
+	Rules            map[string]Rule                                               `yaml:"rules"`
+	Inputs           map[string]Parameter                                          `yaml:"inputs"`
+	Sequences        map[string]Sequence                                           `yaml:"sequences"`
+	Annotations      map[string]interface{}                                        `yaml:"annotations,omitempty"`
+	Apis             map[string]map[string]map[string]map[string]APIMethodResponse `yaml:"apis"`
 }
 
 type Project struct {
@@ -371,7 +376,7 @@ func (pkg *Package) GetApis() []*whisk.Api {
 					api.GatewayRelPath = gatewayRelPath
 					action := &whisk.ApiAction{}
 					action.Name = k
-					action.BackendMethod = v
+					action.BackendMethod = v.Method
 					api.Action = action
 					apis = append(apis, api)
 				}
diff --git a/tests/dat/manifest_data_compose_api_records.yaml b/tests/dat/manifest_data_compose_api_records.yaml
index b0d7baac..6beee8d8 100644
--- a/tests/dat/manifest_data_compose_api_records.yaml
+++ b/tests/dat/manifest_data_compose_api_records.yaml
@@ -2,38 +2,65 @@
 # license agreements; and to You under the Apache License, Version 2.0.
 
 packages:
-  apiTest:
-    actions:
-      putBooks:
-        function: ../tests/src/integration/helloworld/actions/hello.js
-        web-export: true
-      deleteBooks:
-        function: ../tests/src/integration/helloworld/actions/hello.js
-      listMembers:
-        function: ../tests/src/integration/helloworld/actions/hello.js
-      getBooks2:
-        function: ../tests/src/integration/helloworld/actions/hello.js
-      postBooks2:
-        function: ../tests/src/integration/helloworld/actions/hello.js
-      listMembers2:
-        function: ../tests/src/integration/helloworld/actions/hello.js
-    sequences:
-      listAllMembers:
-        actions: listMembers, listMembers2
-        web: true
-    apis:
-      book-club:
-        club:
-          books:
-            putBooks: put
-            deleteBooks: delete
-          members:
-            listMembers: get
-      book-club2:
-        club2:
-          books2:
-            getBooks2: get
-            postBooks2: post
-          members2:
-            listMembers2: get
-            listAllMembers: get
+    apiTest:
+        actions:
+            putBooks:
+                function: ../tests/src/integration/helloworld/actions/hello.js
+                web-export: true
+            deleteBooks:
+                function: ../tests/src/integration/helloworld/actions/hello.js
+            listMembers:
+                function: ../tests/src/integration/helloworld/actions/hello.js
+            getBooks2:
+                function: ../tests/src/integration/helloworld/actions/hello.js
+            postBooks2:
+                function: ../tests/src/integration/helloworld/actions/hello.js
+            listMembers2:
+                function: ../tests/src/integration/helloworld/actions/hello.js
+            getBooks3:
+                function: ../tests/src/integration/helloworld/actions/hello.js
+            putBooks3:
+                function: ../tests/src/integration/helloworld/actions/hello.js
+            deleteBooks3:
+                function: ../tests/src/integration/helloworld/actions/hello.js
+        sequences:
+            listAllMembers:
+                actions: listMembers, listMembers2
+                web: true
+        apis:
+            book-club:
+                club:
+                    books:
+                        putBooks:
+                            method: put
+                        deleteBooks:
+                            method: delete
+                    members:
+                        listMembers:
+                            method: get
+            book-club2:
+                club2:
+                    books2:
+                        getBooks2:
+                            method: get
+                        postBooks2:
+                            method: post
+                    members2:
+                        listMembers2:
+                            method: get
+                        listAllMembers:
+                            method: get
+            book-club3:
+                club3:
+                    booksByISBN/{isbn}:
+                        getBooks3:
+                            method: get
+                            response: http
+                    booksWithParams/path/{params}/more/{params1}/:
+                        putBooks3:
+                            method: put
+                            response: json
+                    booksWithDuplicateParams/path/{params}/more/{params}/:
+                        deleteBooks3:
+                            method: delete
+
diff --git a/tests/dat/manifest_validate_trigger_action_rule_grammar.yaml b/tests/dat/manifest_validate_trigger_action_rule_grammar.yaml
index c5417cd4..26045dfb 100644
--- a/tests/dat/manifest_validate_trigger_action_rule_grammar.yaml
+++ b/tests/dat/manifest_validate_trigger_action_rule_grammar.yaml
@@ -3,41 +3,46 @@
 
 # This test file is used to test the basic Trigger-Action-Rule grammar
 packages:
-  manifest2:
-      version: 1.0
-      license: Apache-2.0
-      actions:
-        first_action:
-          function: actions/dump_params.js
-        second_action:
-          function: actions/dump_params.js
-        third_action:
-          function: actions/dump_params.js
-      triggers:
-        trigger1:
-        trigger2:
-      rules:
-        rule1:
-          trigger: trigger1
-          action: first_action
-        rule3:
-          trigger: trigger2
-          action: second_action
-        rule2:
-          trigger: trigger1
-          action: second_action
-      feeds:
-        feed1:
-        feed2:
-        feed3:
-        feed4:
-      apis:
-        book-club: #api name
-          club: # shared base path
-            books:   #path
-               getBooks: get #action name:verb
-               postBooks: post
-               putBooks: put
-               deleteBooks: delete
-            members: #path
-               listMembers: get #action name:verb
+    manifest2:
+        version: 1.0
+        license: Apache-2.0
+        actions:
+            first_action:
+                function: actions/dump_params.js
+            second_action:
+                function: actions/dump_params.js
+            third_action:
+                function: actions/dump_params.js
+        triggers:
+            trigger1:
+            trigger2:
+        rules:
+            rule1:
+                trigger: trigger1
+                action: first_action
+            rule3:
+                trigger: trigger2
+                action: second_action
+            rule2:
+                trigger: trigger1
+                action: second_action
+        feeds:
+            feed1:
+            feed2:
+            feed3:
+            feed4:
+        apis:
+            book-club: #api name
+                club: # shared base path
+                    books:   #path
+                        getBooks: #action name:verb
+                            method: get
+                        postBooks:
+                            method: post
+                        putBooks:
+                            method: put
+                        deleteBooks:
+                            method: delete
+                    members: #path
+                        listMembers: #action name:verb
+                            method: get
diff --git a/tests/src/integration/apigateway/apigateway_test.go b/tests/src/integration/apigateway/apigateway_test.go
index 6bc33558..a6cf3de1 100644
--- a/tests/src/integration/apigateway/apigateway_test.go
+++ b/tests/src/integration/apigateway/apigateway_test.go
@@ -26,10 +26,20 @@ import (
 	"testing"
 )
 
-// TODO: write the integration against openwhisk
-func TestTriggerRule(t *testing.T) {
+const PATH = "/src/github.com/apache/incubator-openwhisk-wskdeploy/tests/src/integration/apigateway/"
+
+func TestApiGateway(t *testing.T) {
+	wskdeploy := common.NewWskdeploy()
+	manifestPath := os.Getenv("GOPATH") + PATH + "manifest.yml"
+	_, err := wskdeploy.DeployManifestPathOnly(manifestPath)
+	assert.Equal(t, nil, err, "Failed to deploy based on the manifest file.")
+	_, err = wskdeploy.UndeployManifestPathOnly(manifestPath)
+	assert.Equal(t, nil, err, "Failed to undeploy based on the manifest file.")
+}
+
+func TestApiGatewayWithParams(t *testing.T) {
 	wskdeploy := common.NewWskdeploy()
-	manifestPath := os.Getenv("GOPATH") + "/src/github.com/apache/incubator-openwhisk-wskdeploy/tests/src/integration/apigateway/manifest.yml"
+	manifestPath := os.Getenv("GOPATH") + PATH + "manifest-apis-with-params.yaml"
 	_, err := wskdeploy.DeployManifestPathOnly(manifestPath)
 	assert.Equal(t, nil, err, "Failed to deploy based on the manifest file.")
 	_, err = wskdeploy.UndeployManifestPathOnly(manifestPath)
diff --git a/tests/src/integration/apigateway/manifest-apis-with-params.yaml b/tests/src/integration/apigateway/manifest-apis-with-params.yaml
new file mode 100644
index 00000000..5ebeb11e
--- /dev/null
+++ b/tests/src/integration/apigateway/manifest-apis-with-params.yaml
@@ -0,0 +1,29 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more contributor
+# license agreements; and to You under the Apache License, Version 2.0.
+
+packages:
+    api-gateway-test-with-params:
+        version: 1.0
+        license: Apache-2.0
+        actions:
+            getBooksWithISBN:
+                function: src/get-books.js
+            putBooksWithParams:
+                function: src/put-books.js
+            deleteBooksWithDuplicateParams:
+                function: src/delete-books.js
+        # new top-level key for defining groups of named APIs
+        apis:
+            book-club-with-params:
+                club-with-params:
+                    booksWithISBN/{isbn}:
+                        getBooksWithISBN:
+                            method: GET
+                            response: http
+                    booksWithParams/path/{params}/more/{params1}/:
+                        putBooksWithParams:
+                            method: PUT
+                    booksWithDuplicateParams/path/{params}/more/{params}/:
+                        deleteBooksWithDuplicateParams:
+                            method: DELETE
+
diff --git a/tests/src/integration/apigateway/manifest.yml b/tests/src/integration/apigateway/manifest.yml
index 888ab869..6848b29f 100644
--- a/tests/src/integration/apigateway/manifest.yml
+++ b/tests/src/integration/apigateway/manifest.yml
@@ -29,15 +29,29 @@ packages:
             hello-world:
                 hello:
                     world:
-                        greeting: GET
+                        greeting:
+                            method: GET
             book-club:
                 club:
                     books:
-                        getBooks: GET
-                        postBooks: POST
-                        putBooks: PUT
-                        deleteBooks: DELETE
+                        getBooks:
+                            method: GET
+                            response: http
+                        postBooks:
+                            method: POST
+                            response: http
+                        putBooks:
+                            method: PUT
+                            response: http
+                        deleteBooks:
+                            method: DELETE
+                            response: http
                     members:
-                        listMembers: GET
+                        listMembers:
+                            method: GET
+                            response: http
                     allMembers:
-                        listAllMembers: GET
+                        listAllMembers:
+                            method: GET
+                            response: http
+
diff --git a/wski18n/i18n_ids.go b/wski18n/i18n_ids.go
index dc978720..7c45bbab 100644
--- a/wski18n/i18n_ids.go
+++ b/wski18n/i18n_ids.go
@@ -47,42 +47,45 @@ const (
 // DO NOT TRANSLATE
 // Known keys used for text replacement in i18n translated strings
 const (
-	KEY_ACTION          = "action"
-	KEY_CMD             = "cmd"
-	KEY_CODE            = "code"
-	KEY_DEPLOYMENT_NAME = "dname"
-	KEY_DEPLOYMENT_PATH = "dpath"
-	KEY_ERR             = "err"
-	KEY_EXTENSION       = "ext"
-	KEY_FILE_TYPE       = "filetype"
-	KEY_HOST            = "host"
-	KEY_KEY             = "key"
-	KEY_LIMIT           = "limit"
-	KEY_MANIFEST_NAME   = "mname"
-	KEY_MANIFEST_PATH   = "mpath"
-	KEY_NAME            = "name"
-	KEY_NAMESPACE       = "namespace"
-	KEY_NEW             = "newkey"
-	KEY_OLD             = "oldkey"
-	KEY_PATH            = "path"
-	KEY_PROJECT         = "project"
-	KEY_RUNTIME         = "runtime"
-	KEY_SOURCE          = "source"
-	KEY_VALUE           = "value"
-	KEY_VALUE_MIN       = "min" // TODO() attempt to use this for Limit value range errors
-	KEY_VALUE_MAX       = "max" // TODO() attempt to use this for Limit value range errors
-	KEY_API             = "api"
-	KEY_URL             = "url"
-	KEY_PACKAGE         = "package"
-	KEY_BINDINGS        = "bindings"
-	KEY_DEPENDENCY      = "dependency"
-	KEY_LOCATION        = "location"
-	KEY_SEQUENCE        = "sequence"
-	KEY_TRIGGER         = "trigger"
-	KEY_TRIGGER_FEED    = "feed"
-	KEY_RULE            = "rule"
-	KEY_ARG             = "arg"
-	KEY_INPUTS          = "inputs"
+	KEY_ACTION            = "action"
+	KEY_CMD               = "cmd"
+	KEY_CODE              = "code"
+	KEY_DEPLOYMENT_NAME   = "dname"
+	KEY_DEPLOYMENT_PATH   = "dpath"
+	KEY_ERR               = "err"
+	KEY_EXTENSION         = "ext"
+	KEY_FILE_TYPE         = "filetype"
+	KEY_HOST              = "host"
+	KEY_KEY               = "key"
+	KEY_LIMIT             = "limit"
+	KEY_MANIFEST_NAME     = "mname"
+	KEY_MANIFEST_PATH     = "mpath"
+	KEY_NAME              = "name"
+	KEY_NAMESPACE         = "namespace"
+	KEY_NEW               = "newkey"
+	KEY_OLD               = "oldkey"
+	KEY_PATH              = "path"
+	KEY_PROJECT           = "project"
+	KEY_RUNTIME           = "runtime"
+	KEY_SOURCE            = "source"
+	KEY_VALUE             = "value"
+	KEY_VALUE_MIN         = "min" // TODO() attempt to use this for Limit value range errors
+	KEY_VALUE_MAX         = "max" // TODO() attempt to use this for Limit value range errors
+	KEY_API               = "api"
+	KEY_URL               = "url"
+	KEY_PACKAGE           = "package"
+	KEY_BINDINGS          = "bindings"
+	KEY_DEPENDENCY        = "dependency"
+	KEY_LOCATION          = "location"
+	KEY_SEQUENCE          = "sequence"
+	KEY_TRIGGER           = "trigger"
+	KEY_TRIGGER_FEED      = "feed"
+	KEY_RULE              = "rule"
+	KEY_ARG               = "arg"
+	KEY_INPUTS            = "inputs"
+	KEY_API_BASE_PATH     = "apibasepath"
+	KEY_RESPONSE          = "response"
+	KEY_API_RELATIVE_PATH = "apirelativepath"
 )
 
 // DO NOT TRANSLATE
@@ -199,6 +202,7 @@ const (
 	ID_ERR_ARG_MISSING_KEY_VALUE_X_arg_X                                 = "msg_err_arg_missing_key_value"
 	ID_ERR_INVALID_PARAM_FILE_X_file_X                                   = "msg_err_invalid_param_file"
 	ID_ERR_REQUIRED_INPUTS_MISSING_VALUE_X_inputs_X                      = "msg_err_required_inputs_missing_value"
+	ID_ERR_API_GATEWAY_BASE_PATH_INVALID_X_api_X                         = "msg_err_api_gateway_base_path_invalid"
 	ID_ERR_RUNTIME_PARSER_ERROR                                          = "msg_err_runtime_parser_error"
 
 	// Server-side Errors (wskdeploy as an Action)
@@ -227,6 +231,7 @@ const (
 	ID_WARN_ACTION_WEB_X_action_X                             = "msg_warn_action_web_export_ignored"
 	ID_WARN_API_MISSING_WEB_ACTION_X_action_X_api_X           = "msg_warn_api_missing_web_action"
 	ID_WARN_API_MISSING_WEB_SEQUENCE_X_sequence_X_api_X       = "msg_warn_api_missing_web_sequence"
+	ID_WARN_API_INVALID_RESPONSE_TYPE                         = "msg_warn_api_invalid_response_type"
 
 	// Verbose (Debug/Trace) messages
 	ID_DEBUG_PROJECT_SEARCH_X_path_X_key_X                = "msg_dbg_searching_project_directory"
diff --git a/wski18n/i18n_resources.go b/wski18n/i18n_resources.go
old mode 100755
new mode 100644
index eb033ff0..198a009d
--- a/wski18n/i18n_resources.go
+++ b/wski18n/i18n_resources.go
@@ -97,7 +97,7 @@ func wski18nResourcesDe_deAllJson() (*asset, error) {
 	return a, nil
 }
 
-var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x5b\x5f\x6f\x1b\x39\x92\x7f\xcf\xa7\x28\x0c\x0e\x98\x19\x40\x91\x33\x7b\x38\xe0\x10\x20\x0f\xb9\xc4\xd9\xf5\x6d\x12\x07\x76\xbc\xc1\x22\x67\xb4\xa9\xee\x92\xc4\x55\x37\xd9\x43\xb2\xa5\x68\x0c\x7d\xf7\x43\x15\xc9\xee\x96\xac\xfe\x23\x25\x73\x97\x97\x48\x26\x59\xf5\xab\x62\xb1\x58\x7f\xa8\xaf\xcf\x00\x1e\x9f\x01\x00\xfc\x24\xb3\x9f\x5e\xc2\x4f\x85\x5d\x24\xa5\xc1\xb9\xfc\x96\xa0\x31\xda\xfc\x34\xf1\xa3\xce\x08\x65\x73\xe1\xa4\x56\x34\xed\x92\xc7\x9e\x01\xec\x26\x3d\x14\xa4\x9a\xeb\x0e\x02\x57\x34\x34\xb4\xde\x56\x69\x8a\xd6\x76\x90\xb8\x0d\xa3\x43\x54\x36\xc2\x28\xa9\x16\x1d\x54\xbe\x84\xd1\x4e\x2a\x69\x91\x25\x19\xda\x34\xc9\xb5\x5a\x24\x06\x4b\x6d\x5c\x07\xad\x1b\x1e\xb4\xa0\x15\x64\x58\xe6\x7a\x8b\x19\xa0\x72\xd2\x49\xb4\xf0\x8b\x9c\xe2\x74\x02\x9f\x44\xba\x12\x0b\xb4\x13\x78\x9d\xd2\x3a\x3b\x81\xcf\x46\x2e\x16\x68\xec\x04\x6e\xaa\x9c\x46\xd0\xa5\xd3\x5f\x41\x58\xd8\x60\x9e\xd3\xff\x06\x53\x54\x8e\x57\xac\x99\x9b\x05\xa9\xc0\x2d\x11\x6c\x89\xa9\x9c\x4b\xcc\x40\x89\x02\x6d\x29\x52\x9c\x8e\x96\x45\xeb\x2e\x49\x5e\x83\xd3\x3a\x07\xa7\x83\x20\x13\xa8\x94\xff\x04\x42\x65\x60\xb7\x2a\x05\x5d\xa2\xda\x2c\xa5\x5d\x41\x19\x64\x82\xca\x4a\xb5\x00\x01\x85\x50\x72\x8e\xd6\xf1\x64\x5d\x12\x55\x91\x07\x52\x05\x49\x32\x97\x79\x3d\xfd\x9f\xaf\x3f\xbc\x1f\x83\xd9\x2e\xb5\x71\xfd\x1b\xf0\xc9\xe8\xb5\xcc\xd0\x82\x00\x5b\x15\x85\x30\x5b\xf0\xf3\x41\xcf\x61\xb3\x14\xee\x67\x0b\x33\xc4\xd6\xf6\x7c\x9f\x1a\x03\xa4\x41\x3d\x5a\x74\xa4\xcb\x25\xe6\x65\x60\x0d\x5b\x5d\x99\x51\x2a\x24\x55\x8d\xc7\xb2\x46\x63\x89\x77\x97\x7e\xa4\x72\x2c\x70\x98\x07\xaa\x2a\x66\x68\x58\x3d\x76\xe5\xa1\x8d\xe6\x45\x56\x30\x68\x3f\x6c\x2a\x2c\xec\x75\x89\xea\xcb\xbe\xb0\x33\x74\x1b\xda\x8e\x34\x97\x64\x15\x6c\x5a\x68\xd6\x68\x46\xdb\xf0\x78\x0c\x2d\xeb\x23\x3e\xd1\x9e\xf9\x0f\x7a\xfe\x7f\x69\xcd\xf3\x5c\x2c\x12\x51\xca\x64\xa9\x6d\x97\xe1\x78\x28\xaf\x3f\x5d\xc1\xc3\xdf\xae\x6f\x3f\x3f\x8c\xa4\xd8\xbf\xfd\x2d\xa2\xff\xb8\xbc\xb9\xbd\xba\xfe\x38\x8a\x6e\xe5\x96\xc9\x0a\xb7\x1d\x44\x69\x58\x1b\xf9\x07\xff\x01\x1e\xfe\x7e\xf9\xcf\x31\x44\x53\x34\x2e\x21\xbd\x75\x50\x2d\x85\x5b\xd2\xb6\x90\xad\x4e\x69\x32\x2b\x79\x0c\x61\xad\xe6\xb2\xcb\xd9\xfb\x41\x26\x05\xbf\x64\x38\x17\x55\xee\x40\x5a\xf8\xb7\xbf\x5d\x7f\xb8\xbc\x98\x6e\xec\xaa\x34\xba\xb4\xbf\x8e\xd1\x4a\x9e\xeb\x4d\x12\x68\x74\x5d\x51\x3c\x09\xea\x49\xc3\x54\x1b\xa3\xea\xd3\x4b\xed\x96\x6b\xeb\x1b\x41\xba\x34\xb8\x96\xb8\xe9\xa0\x6b\x97\x0c\x34\x12\xbd\xd8\x3b\x1e\x65\x2e\xd4\x08\x0e\x2b\xdc\x8e\xde\xd2\x15\x6e\xc7\x02\xf7\x9a\x2e\x84\x12\x0b\xcc\x7a\x15\x5d\x1a\xfd\x2f\x4c\x5d\x73\xe7\x3a\x0d\x33\x84\x42\x98\x15\x66\x10\x29\x8c\x51\x15\xd3\x49\xe8\x2e\xe8\x12\x26\xb0\xe2\x29\xc3\x14\xa3\x0b\x19\xd8\xd5\x3d\xa7\x3f\x82\x6c\x7d\x59\x75\xd0\x6d\xc6\x47\x0b\x3d\x80\xd0\xbb\xe7\x1c\xad\x8d\xda\x1e\x41\xda\x3a\x23\x3b\x29\xfb\xad\xab\x2c\x1a\x3a\x28\x52\x61\x06\xa6\x52\x4e\x16\xf5\x25\x35\x82\x83\x33\xdd\x4a\xe0\x31\xd0\x95\x2b\xab\x31\x60\xbd\xb9\xad\xd1\xcc\xb4\xed\x22\x19\x46\x4f\x25\x5a\x0a\x23\x8a\x4e\x05\x1b\x51\xa0\x43\x03\x6b\x91\x57\xc8\x01\x1e\x39\x53\xf8\xc7\xeb\xf7\x77\x97\x0f\x30\xd7\xa6\x10\x27\xb2\xea\x3b\x8d\x0f\xef\xae\xde\x5f\x3e\x40\xaa\x95\x13\x92\x22\x60\x38\x86\xe0\xbf\x6f\xaf\x3f\x0e\xb3\x66\xaf\x9a\x14\xd2\xd2\x0d\xc8\xf7\x45\xf7\x75\xf1\x79\x89\x40\x33\xe8\x8c\xa6\xfe\xce\x20\x5f\x20\x2d\x28\xed\xc0\x93\xaa\x0c\x66\xd3\xff\xe9\xdb\xf7\x03\x8e\xa5\xec\xb9\x4a\x89\x23\xdd\x79\x34\xe5\xfb\xf8\x0c\x1d\x37\xe2\x54\xcf\x39\x8f\x55\x10\xa5\x2f\x75\x3a\x94\xe7\xeb\xe3\xe3\x94\x3e\xef\x76\xf7\x13\x98\x1b\x5d\xc0\xe3\xe3\xd4\xea\xca\xa4\xb8\xdb\x8d\xe2\xe9\x37\x6c\x88\x27\x4d\x8b\x7b\x65\xd1\x9d\xc7\xab\x56\xcf\x10\xb7\x3d\x3d\x92\x88\xf5\x1f\xce\x97\xb3\x94\x8b\x4d\x22\x38\x6b\x4c\x9c\x5e\xa1\x1a\x14\x99\x56\x80\x5f\x01\xbc\xe2\x3c\xe1\x2b\x55\x08\x63\x97\x22\x4f\x72\x9d\x8a\xbc\x83\xe3\x5d\x9c\xd5\x0a\x95\x83\x2b\xb4\x9e\x1f\xaf\x0e\xc7\x73\x24\x43\x85\x6e\xa3\xcd\xea\x6c\x96\x52\x39\x34\x0a\x1d\x08\x47\xe2\x56\x26\x1f\x90\xb5\x89\x1b\x92\x54\xa8\x14\xf3\xbc\xf3\xd6\xbe\xfe\xfb\x14\xde\xf8\x39\xe4\x80\x9a\x95\x63\x19\xcc\x85\xec\xa6\xfe\xb6\x09\x60\x32\x99\x85\xb3\x58\x94\x39\x3a\x04\x5b\xd1\x96\xce\xab\x3c\xdf\x4e\xe1\xa6\x52\xf0\x50\xa7\x3f\x75\x66\xf0\x40\xf7\x9d\xc1\x42\xaf\x91\x7c\xa3\x93\x22\xcf\xb7\x4d\xe6\x28\xac\x45\xd7\xbf\x0b\x2d\xa4\x3e\x0d\x4d\xac\x13\xae\xea\x8a\x16\x9f\x3f\x7f\xfe\xfc\xd5\xab\x57\xaf\x5a\x7b\xd1\x92\xe1\x96\x97\x02\x4d\xa0\x89\xa3\xb8\x72\x01\x05\xb3\x31\x2a\x8a\xaa\xc9\x20\x54\x5d\xbc\x72\xfa\x8d\xec\xfc\xbd\x6e\xaf\x1d\xcf\xa4\x77\xbf\xef\xda\x21\x6b\xef\x8e\x8f\xe6\x37\xa4\xbf\x3d\x96\x67\x68\x30\xd5\x45\x21\x54\x96\x70\xea\xc8\xb7\x35\x79\xb9\x44\xb8\x84\xe2\xad\x0e\xa6\x8f\x8f\xd3\xb4\xc8\x76\xbb\x90\x70\x3e\x3e\x4e\x69\xa1\xdb\x96\xb8\xdb\xb1\xa7\xa4\xb5\xbb\xdd\xfd\x74\xda\xcb\x9b\x83\xe4\x6d\x12\xed\x79\xa0\xd8\xf6\xf8\x48\x21\x7b\x60\x40\x20\x77\xbb\x7b\x58\x8a\x50\x4e\x69\x0b\x5c\x9f\x90\xf1\xdc\xbb\xab\x73\x6f\xe3\x38\x1c\x05\x30\x9d\xf6\xa4\xda\x81\x45\xdc\xd0\x1f\x29\x62\x43\x73\x8c\x90\x71\x76\xb7\x98\x77\xcd\x8c\xa3\x82\xf6\xca\x99\x61\x89\x2a\x43\x95\x9e\xa2\xce\x66\xd1\xf9\x7c\x9a\x23\xd2\xa9\xd3\xb7\x47\xd9\x7c\x8f\xe1\x1c\x47\x41\x8e\xa1\x32\x5d\x71\xd9\xdb\xbd\x4a\xcf\x71\xd1\xff\x1f\xef\x88\x28\xcf\x69\x76\xf2\x7d\x3b\xf8\xd4\xcd\xfd\x98\x3d\x1c\x79\x32\xba\x90\xf4\xef\xe3\xdd\x41\xcd\xee\x9c\x9d\xec\x43\x15\x2a\x04\xe7\xde\x39\x8c\xc8\xdf\x00\x75\x05\xa2\x0f\x0b\x64\x95\xa1\x9d\x0c\x6c\xdb\xf1\xcf\x9f\x67\x6f\x51\xc6\xb9\xae\x54\x96\x04\xbc\xc1\x53\x75\x1a\x40\x8e\xae\xd3\x07\x6f\x96\x32\x5d\xc2\x86\xbb\x14\x84\x2b\xf3\x71\xa3\x5b\x22\xa4\x95\x31\xa4\x98\x28\x60\x2c\x9a\xf0\x25\xe5\x3f\x13\x05\x61\x59\x16\xd2\xdf\xe8\xb0\x20\xd4\xd4\x92\x50\xac\xed\xaa\x77\xfb\x51\x4e\x26\xa0\x55\xef\x33\xc8\x75\x8c\x6c\x02\x22\x6f\x87\xbe\xf5\xb6\x11\x0e\x53\xaf\x08\x4c\x40\x18\xac\x75\x7d\xd1\x58\x3a\x64\xd2\x60\xea\x82\xf5\x1b\x5f\xed\x1e\xea\x23\x5c\xde\xdc\x5c\xdf\xdc\x76\xe0\x7e\x75\xf8\x0f\xfc\x74\x78\x32\xf0\xea\x55\xcf\xf5\x63\xcc\xfe\x41\x5b\x29\xbd\x51\x09\x45\x0a\xc3\x47\x9d\x66\x91\xaa\xc2\xaa\x29\x34\x0d\x02\xd0\x2a\xdf\x82\xad\x4a\xdf\xed\xba\xe0\xb2\xf2\xd4\x6e\xad\xc3\x02\x66\x52\x65\x52\x2d\x2c\x68\x03\x0b\xe9\x96\xd5\x6c\x9a\xea\xa2\x2e\xaa\xf7\xdf\x97\xc6\xc4\x3b\x33\x35\x28\x5c\x17\x4c\xee\x3e\x02\x4f\xd9\x33\xcb\x8d\x74\x4b\xe0\xb6\x25\x14\x68\xad\x58\xe0\x4b\x1a\x44\x63\x76\x3b\x2e\xde\xfb\xb1\x54\x67\x7e\x80\x3e\x0c\x64\x33\x2d\x48\xfe\xac\xf4\x42\xca\x9e\x9c\x94\x3f\x09\xd2\x1c\x31\x4b\xa4\x5a\xeb\x55\x17\xa0\x77\xec\xb6\xc8\x5d\xf8\x69\x7c\x20\x69\x19\x6c\x96\xdc\x00\x0b\x48\x9d\x6f\x3e\x86\xa1\x3f\x07\xed\x0a\xb7\x75\x0d\x85\xe2\x5d\xe1\xb4\xe9\xab\x0f\xd5\x73\xb8\xdc\xf0\x35\x2a\xf3\x9e\xec\x31\xd0\x19\xe4\x19\x4b\xa9\x89\xd2\xce\x3b\xbb\x0e\x86\x1f\xda\x35\x57\xf6\xd5\x3c\x9b\xf2\x5d\x2e\x7a\xb6\x23\xea\x21\xa6\x1c\xbd\x17\xd2\x16\xc2\xa5\x5d\xe1\x3b\x09\x58\x9b\x07\x2d\xc8\x98\x45\x16\xfd\xa9\x54\x87\xc5\x7d\x3f\x1e\x30\x40\xa6\xd1\x17\x96\x98\x09\x6f\x2b\xbb\x37\x9a\x54\xb4\x88\xec\xd5\x92\xfd\x68\x14\xa3\x5f\x88\x90\xff\x93\x79\x89\x5c\x76\xa9\xed\xca\x8f\xd2\x31\x0f\x5b\x52\x97\x6d\x89\x57\xf8\x4c\x58\x9a\xde\xea\x1e\x2a\x6d\x18\xbb\xe0\x2e\x38\xaf\xf1\x1f\xc7\xe8\x39\x42\x1c\x50\xf5\xcd\x29\x80\x0e\xf4\xca\x47\xc1\x23\xfa\xd9\x82\xaf\xf2\x78\x55\xe2\x37\x87\xca\x46\xd0\xf8\x8d\xef\x30\x12\xe7\x7b\x44\xb1\xc9\x02\xbb\x0a\x98\xcd\x51\x5e\xa0\xef\xde\x06\xdf\xdb\x94\xca\x43\xb1\xa6\xb9\xc9\xe8\x7e\x93\x69\xeb\xf8\x8e\xd6\xa9\x87\x9e\x78\x89\xf9\xf4\xd4\xdc\x3a\xf0\xed\x09\xcc\x71\x21\xa9\xb1\xd1\xb2\x50\xdb\xda\x36\xc8\x89\xb4\xb6\x7d\x50\xaf\xa1\x88\x5a\x43\x18\x14\xa3\x32\xf9\xe9\x96\xeb\x0b\x5b\x21\x85\xbe\xbb\x79\xcf\x08\xb8\xd4\xc5\x47\xe9\xeb\x5e\x8e\x7d\xef\x5b\xf2\x63\x80\x14\x22\x9f\x6b\x53\x74\x6a\xee\x43\x1c\xef\x43\x30\x85\xcf\x66\x0b\x62\x21\xa4\x1a\x4a\xe9\x8d\x49\xfe\x65\xb5\xaa\x9d\x6d\x5a\x64\x3d\x9d\x5b\x2e\xee\x4b\x55\x56\x0e\x32\xe1\x04\x7c\x08\xda\xf8\x39\x2d\xb2\x9f\xc9\xf5\xf6\x73\x12\xa5\x6c\x2a\xf0\xde\x68\xb4\x49\x2c\xfe\x5e\xa1\xea\x2c\x91\xfb\x47\x2f\x17\xb7\x61\xd6\xfe\x61\x69\xf9\x77\x6f\xcf\x7b\x3e\x6c\xc2\x55\x6f\x5e\x50\x4a\x9a\x9d\x0a\xe5\x43\x91\x19\xfa\x60\x00\x33\x98\x09\x8b\x19\x68\xd5\x32\xb2\x8b\x08\xe9\x08\xcd\x29\x7c\xca\x51\x58\x84\xaa\xcc\x84\xc3\x03\xa7\xc9\x97\x67\x9a\x57\xd9\x21\x4e\x61\x41\xc0\x06\x67\x87\x1c\x06\x77\x27\xe8\xa9\xdf\x40\x5f\x1f\xf1\x23\xa4\x9a\xb0\x6a\x0a\x57\xce\x67\x5f\xda\x2d\xf9\x2e\xe6\x53\x35\xaf\x54\x38\x53\xf1\xe0\x4d\xbc\x76\xb4\xc2\xd0\x76\x2d\x88\x0a\x7e\x2b\x31\x1d\x73\x92\x02\xd6\xb8\xc5\xd1\x3f\x90\x63\x4c\x88\xeb\x77\xa2\x67\xe0\x8d\x93\x20\xb2\xba\x72\x6d\x67\x31\x85\x2f\x8d\x13\x8e\xae\x82\x96\x4d\x6a\x77\x42\x06\x13\x83\x85\x81\x6b\x2d\x88\x13\xd5\x94\x50\xb6\xe2\x30\xc9\xa4\x19\xe5\xe4\x8e\x8a\x45\x72\xd4\x7a\x2f\xb5\x54\x3e\xa4\xf2\x29\x9a\xc3\x90\x18\x50\x20\xd3\x1c\xe7\x09\xa5\x80\x51\x2a\xcb\x39\xc5\xbe\x87\xeb\x17\x23\x15\x94\xb0\x8b\x35\x26\x99\x4e\x57\xd8\xf5\x40\xef\x8d\x50\x4c\x55\xac\x11\xde\xf2\x44\x90\x05\x07\xe0\x03\x81\xa5\xcc\x31\x11\xb9\x41\x91\x6d\x13\xfc\x26\x6d\xe7\xdb\x86\x77\x74\x42\xc2\x4c\xf0\x33\x07\x68\x67\x72\x3e\x47\x4a\x08\x9b\xac\x44\xa2\xf5\x06\x65\x29\x72\xca\xc5\x0c\xbb\x9a\x23\xd7\x0a\x81\xec\x30\xc7\xc3\xb4\xbf\xf9\x1a\xb7\xc4\x6d\x34\xd4\xcc\xb8\x69\xe2\x75\x4d\xb3\xe3\x37\xef\x58\x97\xd2\xc2\x4a\xaa\x8c\x0e\x48\xb0\xc5\xd0\x94\x7c\x72\xf1\x1c\x78\x0a\xf2\x2f\x2d\x20\x0c\xfd\x08\x9c\xf0\xbe\xec\x89\x5f\x61\x63\xe1\x86\x3a\xc5\x6e\x11\x14\xc4\xb4\x06\x59\x06\x8b\xa5\x30\xf4\x85\xa9\x5b\x1f\x33\x1d\x97\x6d\x9c\xf1\x87\x43\x96\x90\xc8\xa7\xda\xb9\xd2\x5e\x53\x16\xdd\x69\xcc\x4e\xf5\x15\x81\x59\xeb\xbc\x0f\xf0\x8b\xde\x37\x59\x8a\x35\x79\x2a\xb6\x25\x5f\x48\xb7\x01\x4c\xd7\x13\xd2\xf6\x35\x14\xc9\x04\x7f\x15\x4d\x3b\x3e\x4a\x20\x9f\xaf\xa2\x33\xf2\x89\x3e\x87\x62\xb4\x7f\x21\xbb\x9d\xc6\x37\x9d\xe1\x25\x9b\xa7\x67\xf9\xa2\x22\x63\x5a\xd2\x69\xe4\x05\x1c\xb1\x4b\x05\x22\xda\x74\xa4\x30\x70\xf8\xb5\x9a\xe7\x32\x25\x2f\x93\x84\xc4\x8d\x24\x34\xda\xda\x58\x09\xe9\x3a\xae\xad\xf3\x13\x53\x3e\x12\x3a\x7c\x0e\x32\x47\x59\x39\xf8\x2d\xaa\xdc\xc9\x32\xf7\x59\xa3\x3f\x3c\xf4\x29\x44\x24\x9e\x39\xbb\xaf\x78\xf7\x1e\x94\x41\x5c\xbb\x8b\x3b\x01\xe9\xfc\x89\x2a\xb5\xb5\x72\xe6\x4f\x01\x2b\x24\x0a\xe2\xb9\x36\xea\x99\x51\x5c\x52\x5b\x3a\x83\x78\x72\x08\x83\x24\xcc\xe6\x49\xd2\x73\x82\x32\x4d\x95\xe3\x19\x9a\xa4\x65\x21\xbb\xc8\xf1\x98\x0e\x1b\xfc\xd1\xdf\x1f\x04\x12\x2a\xbb\xa0\x43\x1d\x55\xb0\xbf\x25\x53\xff\x20\xf8\x47\x28\x99\x05\x3c\xa6\x61\x61\xad\x4e\x25\x93\x3e\x8e\xf8\x22\x82\x3b\x54\x3e\x0b\x7f\x96\xe6\x85\x69\xde\x54\x70\x33\xbb\xf3\x05\x67\x68\x90\x41\x2e\x15\x82\x30\x8b\x8a\x93\x62\x52\xa1\x59\xec\x76\xed\x78\x91\xe9\x4c\xa0\xf4\x10\xbd\x2f\xdf\xb2\x3e\x78\xe4\x04\x44\x2b\xdc\xfe\x30\x54\x2b\xdc\x5e\x30\x2d\x28\x85\x34\x4f\xe0\xed\x0f\xb3\x7f\xc7\x6f\xa2\x28\x29\xd8\xad\xc9\xad\x70\x3b\x4a\x86\x10\x60\x0d\x3f\xfd\xe9\x12\xe0\x97\xc8\xf2\x57\xf6\xc1\x81\x9e\x7f\x17\xe4\x2f\xae\xba\x14\x32\xf1\x05\xc9\x56\x7a\x19\x8d\x23\x8a\x26\xc0\xaf\xe6\x24\xa3\x21\x31\x54\x7b\xc0\xdf\x2b\x69\xb8\xb6\x55\x56\xce\x8e\xb2\x92\x9b\xb0\xc6\xa7\x32\xfe\xb4\xec\x59\x85\x05\x5c\xa3\x02\x31\x77\x68\x40\x94\x65\xce\xfd\x13\x7e\xd8\x50\x6a\x4f\x27\xf4\x52\x51\xad\xa7\xb0\x16\x46\x8a\x59\x8e\x8d\xc1\x5b\x74\x35\xc5\xfd\x29\xf1\x00\xfb\x2c\xaa\x79\x37\x15\x4f\xc3\xc5\x61\x29\x47\x1b\x4a\x4e\xde\xbc\xbf\xe2\xcd\x9e\xeb\x3c\xd7\x1b\x8f\x86\xb0\xb3\x3e\xfd\xc7\xdd\x6e\x5c\xba\x5e\x0a\x63\xd1\xf4\xfe\x58\xa3\xa9\x1f\x18\x74\x46\x22\xbb\x83\x50\x36\xa8\xf7\x2f\x70\x3b\x64\xf7\xe5\xf5\xcd\xc7\xab\x8f\x7f\x1d\x5f\xa8\x8e\x0b\x4e\x2b\x55\x6f\x84\x51\x75\x37\x9c\x50\x76\xe5\xac\x37\x34\x46\x0a\xfb\x1a\xdb\xe0\xf7\x61\x63\x59\x03\x2f\x7d\xed\x80\x24\xba\xef\xcb\x6f\x02\x3f\x7e\x16\x74\x72\xb5\xa0\xfd\x8a\xb8\x55\x1d\x84\x0c\xdd\x70\x66\xc5\x9c\xc9\xc5\x64\x58\x1a\x4c\xc9\xf1\x26\x06\xcb\x5c\xa4\x9d\xa9\xc7\xe7\xa5\xe7\xa3\xf3\x2c\xd4\x41\xf9\x15\x96\x8f\x2c\xf7\xdb\xff\x1b\x99\xe7\x60\xb5\x56\x94\x13\x37\x1c\x6a\xc7\x53\x59\x1f\xb9\x72\x03\x07\x37\x7b\xe4\xac\x43\x31\x12\x7b\xd0\xc4\x39\x25\x5c\xbb\xd4\x55\x9e\x11\x3c\x0a\x24\xe1\xce\xfa\x5e\xa6\x6f\xb4\x78\x5f\x48\xb3\xf9\xd3\xf0\x23\x86\x1a\x11\xcf\x1f\xd8\x4a\xc2\xe5\x39\xd0\xd9\x7b\x5a\x5a\xa6\x8b\xd3\xe7\xa8\x27\xb0\xe4\xdc\x51\xac\x7b\x37\x6f\x88\x29\xaf\x8f\x1b\x1a\x9b\x66\xf1\x17\x1a\xed\x9f\x66\x0c\x03\xcb\x65\x21\x5d\x22\x17\x4a\x9b\x4e\x48\xd1\xa4\x43\x2c\xcb\x4b\x7c\x6e\x44\x9f\x0e\xcb\xc7\x94\xba\x7b\x72\x63\xb9\xa7\x4b\xa1\x16\x48\xfe\xb1\x03\xc0\xfb\x9a\x63\x5d\xaf\xb6\x51\xee\x7c\xeb\xfb\xa5\x35\x8d\x29\x5c\x11\x7b\xa9\x16\x63\x6c\x81\x11\xd8\x24\xd7\x8b\xc4\xca\x3f\xba\x00\xe4\x7a\x71\x2b\xff\xe0\xb2\x88\x5f\xb0\x27\x71\x63\xa2\x42\xf1\x35\x41\x21\x66\xfc\xa9\xca\x0b\x8e\xed\x7f\x7b\x31\x1a\x4a\x81\x85\x36\xdb\x3e\x34\x7e\xc6\xb9\x80\x7e\xfb\xcb\x7f\x32\xa4\xff\xf8\xed\x2f\xa3\x31\x91\xef\xd7\x55\x57\xbd\x39\x8c\x9e\x05\xe6\x85\xd7\xcf\xbf\xbf\xa0\x7f\xc3\x78\xb8\x75\x98\x94\x46\x97\x68\x9c\xec\x0c\xb9\xa3\x07\x6c\xf9\x2b\xdf\x70\xf6\xd7\x59\x68\x39\xfb\x3e\x64\x43\x2c\xb6\xa6\x8f\xfb\xc4\xe8\x12\x33\xcd\x06\x47\x9e\x51\x3a\xd0\x95\xb3\x32\xe3\x8d\xf8\x6c\xc4\x5a\x5a\x98\x55\x32\xcf\xfa\xfb\x96\x2c\x8a\x77\x07\x86\xcc\x76\x94\x2b\xa8\xad\x7f\xcf\x21\xa8\x03\x87\x1e\xb4\xcd\xdd\x58\xca\x0d\xfc\x5f\xa3\xba\x1f\x1f\xa7\x85\x54\xa1\x37\x47\x5f\x44\x3a\x50\xe9\x67\xa8\x31\x76\xf0\x87\xac\xcb\x4d\xc4\xee\x49\x98\x45\xf1\xc3\x41\x23\xe5\x48\xb1\xb5\xb3\x57\x72\x56\x83\x84\xd1\x86\xf6\x2b\x27\xf4\xbd\x15\xa9\x27\x9d\xb5\x3d\x17\x73\x50\xaa\x6a\x62\xbb\x1c\x53\x07\x42\x69\xb7\x0c\x99\xe4\x30\xa4\x98\x21\x0e\x36\x17\x3f\x3f\xa9\xfd\xb4\x03\x86\xf0\xf8\x1e\x33\x50\x7a\x5c\x87\x9c\xb9\xb7\x1e\xa7\xb0\x52\xc6\x80\x38\xfa\x74\x23\xdc\x38\x87\x31\xea\x26\x74\x70\x7c\x1f\xf4\x58\x05\x6b\x84\x86\x5a\x3f\xa1\x49\xf4\x1a\x8d\x91\x59\x86\x5d\x75\x18\x42\xd8\xfe\x45\x4d\xf3\xb8\xa8\x59\x1a\x63\x85\xf6\xdb\x91\xb1\x1b\x95\x48\x9b\x94\xd5\x2c\x97\x5d\xbf\x15\xf4\xbb\xc2\x73\x63\x1f\xc2\xff\x68\x48\x58\xf0\x0b\x9f\xe4\xb8\x94\x6c\x7b\xdf\x32\x43\x58\x4b\x9f\x6e\xd3\x39\x4c\x05\x7b\x1a\xff\x6a\x1c\x33\x98\x6d\x41\xa8\xad\x56\x3d\x3f\xc2\x61\xac\xb1\x6c\x86\xb3\x04\xbf\xf1\x6b\xe1\xfe\x6b\xfc\x69\xd5\x8c\x1b\x02\xdc\x96\x50\x19\xfd\xff\xdc\xd3\x79\xd2\x11\xa0\x83\x40\xaa\xdc\xe0\x6c\xe2\x2f\xf7\xf0\x2d\x2c\xe8\x49\xd2\x3c\xd2\x56\xe7\x87\xe0\xf6\xd6\xd8\xba\xfa\x01\x64\x61\xed\x26\xca\xa8\xf6\x8e\x4f\xd3\x9a\x45\x53\x78\xa3\xd5\x9a\xdc\x7d\x48\x09\x1a\x16\x4e\xef\x91\x1f\x36\xd9\x43\xa9\x06\x3a\x59\x7d\xb5\xc3\x46\xb6\x38\x70\xa2\x74\x75\x43\xe9\x50\xbe\x36\xa3\x5a\xc2\xc1\xf6\xd3\xdb\xcb\xff\xba\xfb\xeb\xe8\x14\x8e\x67\x9f\x96\xbf\x65\xb3\x45\x62\x51\x98\x74\x49\xda\x8b\x87\xbf\x6e\x7f\x74\xaa\x30\xac\xa8\x0f\xff\x7e\xc3\x24\xfa\x49\xba\x3b\x9a\x4b\x72\x20\x0c\x24\x28\x87\x1e\xf2\x47\x7b\xc7\x33\x3d\x23\x41\xab\xaf\x0e\xff\x00\xaf\xe7\xb7\xe3\x6f\x8f\xbc\x02\x09\x1a\x79\x09\xef\x18\x41\xf3\x53\x65\x2e\x06\x12\xb1\x53\x01\xf4\xff\xec\xef\x74\x0c\xed\x37\x7e\xf1\x4d\x6a\x80\xf4\xec\xfe\xd9\xff\x06\x00\x00\xff\xff\x64\x87\x26\x11\x70\x42\x00\x00")
+var _wski18nResourcesEn_usAllJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x5c\x5f\xaf\xdb\xb6\x92\x7f\xcf\xa7\x18\x14\x0b\xb4\x05\x1c\x9f\xf6\x2e\x16\x58\x14\xc8\x43\x36\x49\x7b\xcf\xde\xa4\x09\x4e\x92\x1b\x5c\x64\x03\x85\x96\xc6\x36\xaf\x25\x52\x97\xa4\xec\xb8\x07\xfe\xee\x8b\x19\x92\x92\xec\x63\x4a\xb2\x93\xee\xf6\x25\x3e\x26\x39\xf3\x9b\xe1\x70\x38\x7f\xe8\x7e\x7c\x04\x70\xff\x08\x00\xe0\x3b\x59\x7c\xf7\x0b\x7c\x57\xd9\x55\x56\x1b\x5c\xca\x2f\x19\x1a\xa3\xcd\x77\x33\x3f\xea\x8c\x50\xb6\x14\x4e\x6a\x45\xd3\x5e\xf0\xd8\x23\x80\xc3\x6c\x80\x82\x54\x4b\x9d\x20\x70\x4b\x43\x63\xeb\x6d\x93\xe7\x68\x6d\x82\xc4\xdb\x30\x3a\x46\x65\x27\x8c\x92\x6a\x95\xa0\xf2\x21\x8c\x26\xa9\xe4\x55\x91\x15\x68\xf3\xac\xd4\x6a\x95\x19\xac\xb5\x71\x09\x5a\x77\x3c\x68\x41\x2b\x28\xb0\x2e\xf5\x1e\x0b\x40\xe5\xa4\x93\x68\xe1\x07\x39\xc7\xf9\x0c\xde\x88\x7c\x23\x56\x68\x67\xf0\x34\xa7\x75\x76\x06\xef\x8c\x5c\xad\xd0\xd8\x19\xdc\x35\x25\x8d\xa0\xcb\xe7\x3f\x82\xb0\xb0\xc3\xb2\xa4\x7f\x0d\xe6\xa8\x1c\xaf\xd8\x32\x37\x0b\x52\x81\x5b\x23\xd8\x1a\x73\xb9\x94\x58\x80\x12\x15\xda\x5a\xe4\x38\x9f\x2c\x8b\xd6\x29\x49\x9e\x82\xd3\xba\x04\xa7\x83\x20\x33\x68\x94\xff\x04\x42\x15\x60\xf7\x2a\x07\x5d\xa3\xda\xad\xa5\xdd\x40\x1d\x64\x82\xc6\x4a\xb5\x02\x01\x95\x50\x72\x89\xd6\xf1\x64\x5d\x13\x55\x51\x06\x52\x15\x49\xb2\x94\x65\x3b\xfd\x1f\x4f\x5f\xbd\x9c\x82\xd9\xae\xb5\x71\xc3\x1b\xf0\xc6\xe8\xad\x2c\xd0\x82\x00\xdb\x54\x95\x30\x7b\xf0\xf3\x41\x2f\x61\xb7\x16\xee\x7b\x0b\x0b\xc4\xde\xf6\x7c\x9d\x1a\x03\xa4\x51\x3d\x5a\x74\xa4\xcb\x35\x96\x75\x60\x0d\x7b\xdd\x98\x49\x2a\x24\x55\x4d\xc7\xb2\x45\x63\x89\x77\x4a\x3f\x52\x39\x16\x38\xcc\x03\xd5\x54\x0b\x34\xac\x1e\xbb\xf1\xd0\x26\xf3\x22\x2b\x18\xb5\x1f\x36\x15\x16\xf6\x75\x8d\xea\xc3\xb1\xb0\x0b\x74\x3b\xda\x8e\xbc\x94\x64\x15\x6c\x5a\x68\xb6\x68\x26\xdb\xf0\x74\x0c\x3d\xeb\x23\x3e\xd1\x9e\xf9\x0b\xbd\xfc\xbf\xb4\xe6\x65\x29\x56\x99\xa8\x65\xb6\xd6\x36\x65\x38\x1e\xca\xd3\x37\xb7\xf0\xf9\xaf\xaf\xdf\xbe\xfb\x3c\x91\xe2\xf0\xf6\xf7\x88\xfe\xfd\xc5\xdd\xdb\xdb\xd7\xbf\x4f\xa2\xdb\xb8\x75\xb6\xc1\x7d\x82\x28\x0d\x6b\x23\xff\xe0\x2f\xe0\xf3\xdf\x5e\xfc\x63\x0a\xd1\x1c\x8d\xcb\x48\x6f\x09\xaa\xb5\x70\x6b\xda\x16\xb2\xd5\x39\x4d\x66\x25\x4f\x21\xac\xd5\x52\xa6\x9c\xbd\x1f\x64\x52\xf0\x43\x81\x4b\xd1\x94\x0e\xa4\x85\x7f\xfb\xeb\xeb\x57\x2f\x6e\xe6\x3b\xbb\xa9\x8d\xae\xed\x8f\x53\xb4\x52\x96\x7a\x97\x05\x1a\xa9\x2b\x8a\x27\x41\x3b\x69\x9c\x6a\x67\x54\x43\x7a\x69\xdd\x72\x6b\x7d\x13\x48\xd7\x06\xb7\x12\x77\x09\xba\x76\xcd\x40\x23\xd1\x9b\xa3\xe3\x51\x97\x42\x4d\xe0\xb0\xc1\xfd\xe4\x2d\xdd\xe0\x7e\x2a\x70\xaf\xe9\x4a\x28\xb1\xc2\x62\x50\xd1\xb5\xd1\xff\xc4\xdc\x75\x77\xae\xd3\xb0\x40\xa8\x84\xd9\x60\x01\x91\xc2\x14\x55\x31\x9d\x8c\xee\x82\x94\x30\x81\x15\x4f\x19\xa7\x18\x5d\xc8\xc8\xae\x1e\x39\xfd\x09\x64\xdb\xcb\x2a\x41\xb7\x1b\x9f\x2c\xf4\x08\x42\xef\x9e\x4b\xb4\x36\x6a\x7b\x02\x69\xeb\x8c\x4c\x52\xf6\x5b\xd7\x58\x34\x74\x50\xa4\xc2\x02\x4c\xa3\x9c\xac\xda\x4b\x6a\x02\x07\x67\xd2\x4a\xe0\x31\xd0\x8d\xab\x9b\x29\x60\xbd\xb9\x6d\xd1\x2c\xb4\x4d\x91\x0c\xa3\x97\x12\xad\x85\x11\x55\x52\xc1\x46\x54\xe8\xd0\xc0\x56\x94\x0d\x72\x80\x47\xce\x14\xfe\xfe\xf4\xe5\xfb\x17\x9f\x61\xa9\x4d\x25\x2e\x64\x35\x74\x1a\x3f\xff\x7a\xfb\xf2\xc5\x67\xc8\xb5\x72\x42\x52\x04\x0c\xe7\x10\xfc\xf7\xdb\xd7\xbf\x8f\xb3\x66\xaf\x9a\x55\xd2\xd2\x0d\xc8\xf7\x45\xfa\xba\x78\xb7\x46\xa0\x19\x74\x46\x73\x7f\x67\x90\x2f\x90\x16\x94\x76\xe0\x49\x35\x06\x8b\xf9\xff\x0c\xed\xfb\x09\xc7\x5a\x0e\x5c\xa5\xc4\x91\xee\x3c\x9a\xf2\x75\x7c\xc6\x8e\x1b\x71\x6a\xe7\x5c\xc7\x2a\x88\x32\x94\x3a\x9d\xca\xf3\xf1\xfe\x7e\x4e\x9f\x0f\x87\x4f\x33\x58\x1a\x5d\xc1\xfd\xfd\xdc\xea\xc6\xe4\x78\x38\x4c\xe2\xe9\x37\x6c\x8c\x27\x4d\x8b\x7b\x65\xd1\x5d\xc7\xab\x55\xcf\x18\xb7\x23\x3d\x92\x88\xed\x17\xd7\xcb\x59\xcb\xd5\x2e\x13\x9c\x35\x66\x4e\x6f\x50\x8d\x8a\x4c\x2b\xc0\xaf\x00\x5e\x71\x9d\xf0\x8d\xaa\x84\xb1\x6b\x51\x66\xa5\xce\x45\x99\xe0\xf8\x3e\xce\xea\x85\xca\xc1\x15\x5a\xcf\x8f\x57\x87\xe3\x39\x91\xa1\x42\xb7\xd3\x66\x73\x35\x4b\xa9\x1c\x1a\x85\x0e\x84\x23\x71\x1b\x53\x8e\xc8\xda\xc5\x0d\x59\x2e\x54\x8e\x65\x99\xbc\xb5\x5f\xff\x6d\x0e\xcf\xfc\x1c\x72\x40\xdd\xca\xa9\x0c\x96\x42\xa6\xa9\x3f\xef\x02\x98\x42\x16\xe1\x2c\x56\x75\x89\x0e\xc1\x36\xb4\xa5\xcb\xa6\x2c\xf7\x73\xb8\x6b\x14\x7c\x6e\xd3\x9f\x36\x33\xf8\x4c\xf7\x9d\xc1\x4a\x6f\x91\x7c\xa3\x93\xa2\x2c\xf7\x5d\xe6\x28\xac\x45\x37\xbc\x0b\x3d\xa4\x3e\x0d\xcd\xac\x13\xae\x49\x45\x8b\x8f\x1f\x3f\x7e\xfc\xe4\xc9\x93\x27\xbd\xbd\xe8\xc9\xf0\x96\x97\x02\x4d\xa0\x89\x93\xb8\x72\x01\x05\x8b\x29\x2a\x8a\xaa\x29\x20\x54\x5d\xbc\x72\x86\x8d\xec\xfa\xbd\xee\xaf\x9d\xce\x64\x70\xbf\xdf\xf7\x43\xd6\xc1\x1d\x9f\xcc\x6f\x4c\x7f\x47\x2c\xaf\xd0\x60\xae\xab\x4a\xa8\x22\xe3\xd4\x91\x6f\x6b\xf2\x72\x99\x70\x19\xc5\x5b\x09\xa6\xf7\xf7\xf3\xbc\x2a\x0e\x87\x90\x70\xde\xdf\xcf\x69\xa1\xdb\xd7\x78\x38\xb0\xa7\xa4\xb5\x87\xc3\xa7\xf9\x7c\x90\x37\x07\xc9\xfb\x2c\xda\xf3\x48\xb1\xed\xfe\x9e\x42\xf6\xc0\x80\x40\x1e\x0e\x9f\x60\x2d\x42\x39\xa5\x2f\x70\x7b\x42\xa6\x73\x4f\x57\xe7\x9e\xc7\x71\x38\x0b\x60\x3e\x1f\x48\xb5\x03\x8b\xb8\xa1\xdf\x52\xc4\x8e\xe6\x14\x21\xe3\xec\xb4\x98\xef\xbb\x19\x67\x05\x1d\x94\xb3\xc0\x1a\x55\x81\x2a\xbf\x44\x9d\xdd\xa2\xeb\xf9\x74\x47\x24\xa9\xd3\xe7\x67\xd9\x7c\x8d\xe1\x9c\x47\x41\x8e\xa1\x31\xa9\xb8\xec\xf9\x51\xa5\xe7\xbc\xe8\xff\x8f\x77\x44\x94\xe7\x32\x3b\xf9\xba\x1d\x7c\xe8\xe6\xbe\xcd\x1e\x4e\x3c\x19\x29\x24\xc3\xfb\xf8\xfe\xa4\x66\x77\xcd\x4e\x0e\xa1\x0a\x15\x82\x6b\xef\x1c\x46\xe4\x6f\x80\xb6\x02\x31\x84\x05\x8a\xc6\xd0\x4e\x06\xb6\xfd\xf8\xe7\xcf\xb3\xb7\x28\xe3\x52\x37\xaa\xc8\x02\xde\xe0\xa9\x92\x06\x50\xa2\x4b\xfa\xe0\xdd\x5a\xe6\x6b\xd8\x71\x97\x82\x70\x15\x3e\x6e\x74\x6b\x84\xbc\x31\x86\x14\x13\x05\x8c\x45\x13\xbe\xa4\xfc\x67\xa2\x20\x2c\xcb\x42\xfa\x9b\x1c\x16\x84\x9a\x5a\x16\x8a\xb5\xa9\x7a\xb7\x1f\xe5\x64\x02\x7a\xf5\x3e\x83\x5c\xc7\x28\x66\x20\xca\x7e\xe8\xdb\x6e\x1b\xe1\x30\xed\x8a\xc0\x04\x84\xc1\x56\xd7\x37\x9d\xa5\x43\x21\x0d\xe6\x2e\x58\xbf\xf1\xd5\xee\xb1\x3e\xc2\x8b\xbb\xbb\xd7\x77\x6f\x13\xb8\x9f\x9c\xfe\x07\x7e\x3a\x3c\x18\x78\xf2\x64\xe0\xfa\x31\xe6\xf8\xa0\x6d\x94\xde\xa9\x8c\x22\x85\xf1\xa3\x4e\xb3\x48\x55\x61\xd5\x1c\xba\x06\x01\x68\x55\xee\xc1\x36\xb5\xef\x76\xdd\x70\x59\x79\x6e\xf7\xd6\x61\x05\x0b\xa9\x0a\xa9\x56\x16\xb4\x81\x95\x74\xeb\x66\x31\xcf\x75\xd5\x16\xd5\x87\xef\x4b\x63\xe2\x9d\x99\x1b\x14\x2e\x05\x93\xbb\x8f\xc0\x53\x8e\xcc\x72\x27\xdd\x1a\xb8\x6d\x09\x15\x5a\x2b\x56\xf8\x0b\x0d\xa2\x31\x87\x03\x17\xef\xfd\x58\xae\x0b\x3f\x40\x1f\x46\xb2\x99\x1e\x24\x7f\x56\x06\x21\x15\x0f\x4e\xca\x9f\x04\x69\x89\x58\x64\x52\x6d\xf5\x26\x05\xe8\x57\x76\x5b\xe4\x2e\xfc\x34\x3e\x90\xb4\x0c\x76\x6b\x6e\x80\x05\xa4\xce\x37\x1f\xc3\xd0\x9f\x83\x76\x83\xfb\xb6\x86\x42\xf1\xae\x70\xda\x0c\xd5\x87\xda\x39\x5c\x6e\xf8\x18\x95\xf9\x89\xec\x31\xd0\x19\xe5\x19\x4b\xa9\x99\xd2\xce\x3b\xbb\x04\xc3\x57\xfd\x9a\x2b\xfb\x6a\x9e\x4d\xf9\x2e\x17\x3d\xfb\x11\xf5\x18\x53\x8e\xde\x2b\x69\x2b\xe1\xf2\x54\xf8\x4e\x02\xb6\xe6\x41\x0b\x0a\x66\x51\x44\x7f\x2a\xd5\x69\x71\xdf\x8f\x07\x0c\x50\x68\xf4\x85\x25\x66\xc2\xdb\xca\xee\x8d\x26\x55\x3d\x22\x47\xb5\x64\x3f\x1a\xc5\x18\x16\x22\xe4\xff\x64\x5e\xa2\x94\x29\xb5\xdd\xfa\x51\x3a\xe6\x61\x4b\xda\xb2\x2d\xf1\x0a\x9f\x09\x4b\xd7\x5b\x3d\x42\xa5\x0d\x63\x17\xdc\x05\xe7\x35\xfe\xe3\x14\x3d\x47\x88\x23\xaa\xbe\xbb\x04\xd0\x89\x5e\xf9\x28\x78\x44\xdf\x5b\xf0\x55\x1e\xaf\x4a\xfc\xe2\x50\xd9\x08\x1a\xbf\xf0\x1d\x46\xe2\x7c\x8d\x28\x36\x5b\x61\xaa\x80\xd9\x1d\xe5\x15\xfa\xee\x6d\xf0\xbd\x5d\xa9\x3c\x14\x6b\xba\x9b\x8c\xee\x37\x99\xf7\x8e\xef\x64\x9d\x7a\xe8\x99\x97\x98\x4f\x4f\xcb\x2d\x81\xef\x48\x60\x8e\x0b\x49\x8d\x9d\x96\x85\xda\xb7\xb6\x41\x4e\xa4\xb7\xed\xa3\x7a\x0d\x45\xd4\x16\xc2\xa8\x18\x8d\x29\x2f\xb7\x5c\x5f\xd8\x0a\x29\xf4\xfb\xbb\x97\x8c\x80\x4b\x5d\x7c\x94\x3e\x1e\xe5\xd8\x9f\x7c\x4b\x7e\x0a\x90\x4a\x94\x4b\x6d\xaa\xa4\xe6\x5e\xc5\xf1\x21\x04\x73\x78\x67\xf6\x20\x56\x42\xaa\xb1\x94\xde\x98\xec\x9f\x56\xab\xd6\xd9\xe6\x55\x31\xd0\xb9\xe5\xe2\xbe\x54\x75\xe3\xa0\x10\x4e\xc0\xab\xa0\x8d\xef\xf3\xaa\xf8\x9e\x5c\xef\x30\x27\x51\xcb\xae\x02\xef\x8d\x46\x9b\xcc\xe2\xbf\x1a\x54\xc9\x12\xb9\x7f\xf4\x72\xf3\x36\xcc\x3a\x3e\x2c\x3d\xff\xee\xed\xf9\xc8\x87\xcd\xb8\xea\xcd\x0b\x6a\x49\xb3\x73\xa1\x7c\x28\xb2\x40\x1f\x0c\x60\x01\x0b\x61\xb1\x00\xad\x7a\x46\x76\x13\x21\x9d\xa1\x39\x87\x37\x25\x0a\x8b\xd0\xd4\x85\x70\x78\xe2\x34\xf9\xf2\xcc\xcb\xa6\x38\xc5\x29\x2c\x08\xd8\xe1\xe2\x94\xc3\xe8\xee\x04\x3d\x0d\x1b\xe8\xd3\x33\x7e\x84\x54\x13\x56\xcd\xe1\xd6\xf9\xec\x4b\xbb\x35\xdf\xc5\x7c\xaa\x96\x8d\x0a\x67\x2a\x1e\xbc\x99\xd7\x8e\x56\x18\xda\xae\x15\x51\xc1\x2f\x35\xe6\x53\x4e\x52\xc0\x1a\xb7\x38\xfa\x07\x72\x8c\x19\x71\xfd\x4a\xf4\x0c\xbc\x73\x12\x44\x56\x37\xae\xef\x2c\xe6\xf0\xa1\x73\xc2\xd1\x55\xd0\xb2\x59\xeb\x4e\xc8\x60\x62\xb0\x30\x72\xad\x05\x71\xa2\x9a\x32\xca\x56\x1c\x66\x85\x34\x93\x9c\xdc\x59\xb1\x48\x8e\x56\xef\xb5\x96\xca\x87\x54\x3e\x45\x73\x18\x12\x03\x0a\x64\xba\xe3\x3c\xa3\x14\x30\x4a\x65\x39\xa7\x38\xf6\x70\xc3\x62\xe4\x82\x12\x76\xb1\xc5\xac\xd0\xf9\x06\x53\x0f\xf4\x9e\x09\xc5\x54\xc5\x16\xe1\x39\x4f\x04\x59\x71\x00\x3e\x12\x58\xca\x12\x33\x51\x1a\x14\xc5\x3e\xc3\x2f\xd2\x26\xdf\x36\xfc\x4a\x27\x24\xcc\x04\x3f\x73\x84\x76\x21\x97\x4b\xa4\x84\xb0\xcb\x4a\x24\x5a\x6f\x50\x96\x22\xa7\x52\x2c\x30\xd5\x1c\x79\xad\x10\xc8\x0e\x4b\x3c\x4d\xfb\xbb\x3f\xe3\x96\xb8\x9d\x86\x96\x19\x37\x4d\xbc\xae\x69\x76\xfc\xcb\x3b\xd6\xb5\xb4\xb0\x91\xaa\xa0\x03\x12\x6c\x31\x34\x25\x1f\x5c\x3c\x27\x9e\x82\xfc\x4b\x0f\x08\x43\x3f\x03\x27\xbc\x2f\x7b\xe0\x57\xd8\x58\xb8\xa1\x4e\xb1\x5b\x04\x05\x31\xad\x41\x96\xc1\x62\x2d\x0c\xfd\xc1\xd4\xad\x8f\x99\xce\xcb\x36\xcd\xf8\xc3\x21\xcb\x48\xe4\x4b\xed\x5c\x69\xaf\x29\x8b\xee\x32\x66\x97\xfa\x8a\xc0\xac\x77\xde\x47\xf8\x45\xef\x9b\xad\xc5\x96\x3c\x15\xdb\x92\x2f\xa4\xdb\x00\x26\xf5\x84\xb4\x7f\x0d\x45\x32\xc1\x5f\x45\xd3\x8e\x8f\x12\xc8\xe7\xab\xe8\x8c\x7c\xa2\xcf\xa1\x18\xed\x5f\xc8\x6e\xe7\xf1\x4d\x67\x78\xc9\xe6\xe9\x59\xbe\xa8\xc8\x98\xd6\x74\x1a\x79\x01\x47\xec\x52\x81\x88\x36\x1d\x29\x8c\x1c\x7e\xad\x96\xa5\xcc\xc9\xcb\x64\x21\x71\x23\x09\x8d\xb6\x36\x56\x42\x52\xc7\xb5\x77\x7e\x62\xca\x47\x42\x87\xcf\x41\xe6\x28\x2b\x07\xbf\x55\x53\x3a\x59\x97\x3e\x6b\xf4\x87\x87\x3e\x85\x88\xc4\x33\x67\xf7\x15\xef\xde\x93\x32\x88\xeb\x77\x71\x67\x20\x9d\x3f\x51\xb5\xb6\x56\x2e\xfc\x29\x60\x85\x44\x41\x3c\xd7\x4e\x3d\x0b\x8a\x4b\x5a\x4b\x67\x10\x0f\x0e\x61\x90\x84\xd9\x3c\x48\x7a\x2e\x50\xa6\x69\x4a\xbc\x42\x93\xb4\x2c\x64\x17\x25\x9e\xd3\x61\x87\x3f\xfa\xfb\x93\x40\x42\x15\x37\x74\xa8\xa3\x0a\x8e\xb7\x64\xee\x1f\x04\x7f\x0b\x25\xb3\x80\xe7\x34\x2c\xac\xd5\xb9\x64\xd2\xe7\x11\xdf\x44\x70\xa7\xca\x67\xe1\xaf\xd2\xbc\x30\xdd\x9b\x0a\x6e\x66\x27\x5f\x70\x86\x06\x19\x94\x52\x21\x08\xb3\x6a\x38\x29\x26\x15\x9a\xd5\xe1\xd0\x8f\x17\x99\xce\x0c\x6a\x0f\xd1\xfb\xf2\x3d\xeb\x83\x47\x2e\x40\xb4\xc1\xfd\x37\x43\xb5\xc1\xfd\x0d\xd3\x82\x5a\x48\xf3\x00\xde\xf1\x30\xfb\x77\xfc\x22\xaa\x9a\x82\xdd\x96\xdc\x06\xf7\x93\x64\x08\x01\xd6\xf8\xd3\x9f\x94\x00\x3f\x44\x96\x3f\xb2\x0f\x0e\xf4\xfc\xbb\x20\x7f\x71\xb5\xa5\x90\x99\x2f\x48\xf6\xd2\xcb\x68\x1c\x51\x34\x01\x7e\x35\x27\x19\x1d\x89\xb1\xda\x03\xfe\xab\x91\x86\x6b\x5b\x75\xe3\xec\x24\x2b\xb9\x0b\x6b\x7c\x2a\xe3\x4f\xcb\x91\x55\x58\xc0\x2d\x2a\x10\x4b\x87\x06\x44\x5d\x97\xdc\x3f\xe1\x87\x0d\xb5\xf6\x74\x42\x2f\x15\xd5\x76\x0e\x5b\x61\xa4\x58\x94\xd8\x19\xbc\x45\xd7\x52\x3c\x9e\x12\x0f\xb0\xcf\xa2\xba\x77\x53\xf1\x34\xdc\x9c\x96\x72\xb4\xa1\xe4\xe4\xd9\xcb\x5b\xde\xec\xa5\x2e\x4b\xbd\xf3\x68\x08\x3b\xeb\xd3\x7f\x3c\x1c\xc6\xb3\xaf\x95\x70\xb8\x13\xfb\x8c\x92\x1e\xee\x18\x8f\x25\x16\x6f\x6e\xe1\x37\xbf\x86\x13\xa5\xae\xc0\x25\x6a\x49\x5f\xc4\x1a\xd3\x99\x70\x9d\xa7\xb6\x4f\xc4\x6c\x28\xfb\x9f\x46\x49\x21\xe5\x30\x48\x4c\xb7\x81\x41\x5b\x29\x3e\xa1\x31\xb1\x0e\x55\x0b\x63\xd1\x0c\xfe\x1c\xa5\xab\x90\x18\x74\x46\x22\x3b\xbc\x50\x18\x69\x2d\x34\x70\x3b\x65\xf7\xe1\xe9\xdd\xef\xb7\xbf\xff\x36\xbd\x14\x1f\x17\x5c\x56\x8c\xdf\x09\xa3\xda\x7e\x3f\xa1\x4c\x65\xe5\x77\x34\x46\x26\xf1\x31\x36\xfa\x3f\x05\xd3\x65\x0d\xfc\xe2\xab\x23\x24\xd1\xa7\xa1\x0c\x2e\xf0\xe3\x87\x4f\x17\xd7\x43\xfa\xef\xa4\x7b\xf5\x4f\x28\xd0\x8d\xe7\x8e\xcc\x99\x9c\x68\x81\xb5\xc1\x9c\xae\x96\xcc\x60\x5d\x8a\x3c\x99\x5c\xbd\x5b\x7b\x3e\xba\x2c\x42\xa5\x97\xdf\x99\xf9\xd8\xf9\xf8\x81\xc3\x4e\x96\x25\x58\xad\x15\x65\xfd\x1d\x87\xd6\xb5\x36\xd6\xc7\xe6\xdc\xa2\xc2\xdd\x11\x39\xeb\x50\x4c\xc4\x1e\x34\x71\x4d\x91\xda\xae\x75\x53\x16\x04\x8f\x42\x65\x78\x6f\x7d\xb7\xd6\xb7\x92\xbc\xb7\xa7\xd9\xfc\x69\xfc\x99\x46\x8b\x88\xe7\x8f\x6c\x25\xe1\xf2\x1c\xc8\xbb\x3c\x2c\x9e\xd3\x59\xf5\xc7\xfa\x02\x96\x9c\x1d\x8b\xed\xe0\xe6\x8d\x31\xe5\xf5\x71\x43\x63\x5b\x30\xfe\x06\xa5\xff\xe3\x93\x71\x60\xa5\xac\xa4\xcb\xe4\x4a\x69\x93\x84\x14\x4d\x3a\x44\xeb\xbc\xc4\x67\x7f\xf4\xe9\xb4\x40\x4e\xde\xce\x93\x9b\xca\x3d\x5f\x0b\xb5\x42\xba\x01\x12\x00\x5e\xb6\x1c\xdb\x8a\xbc\x8d\x72\x97\x7b\xdf\x11\x6e\x69\xcc\xe1\x96\xd8\x4b\xb5\x9a\x62\x0b\x8c\xc0\x66\xa5\x5e\x65\x56\xfe\x91\x02\x50\xea\xd5\x5b\xf9\x07\x17\x7e\xfc\x82\x23\x89\x3b\x13\x15\x8a\x2f\x42\x0a\xa2\xe3\x8f\x71\x7e\xe2\xec\xe5\xe7\x9f\x26\x43\xa9\xb0\xd2\x66\x3f\x84\xc6\xcf\xb8\x16\xd0\xcf\x7f\xf9\x4f\x86\xf4\x1f\x3f\xff\x65\x32\x26\xf2\xfd\xba\x49\x55\xd4\xc3\xe8\x55\x60\x7e\xf2\xfa\xf9\xf7\x9f\xe8\xbf\x71\x3c\xdc\x1c\xcd\x6a\xa3\x6b\x34\x4e\x26\x93\x8a\xe8\x01\x7b\xfe\xca\xb7\xd4\xfd\x75\x16\x9a\xea\xbe\xd3\xda\x11\x8b\xcd\xf7\xf3\x3e\x31\xba\xc4\x42\xb3\xc1\x91\x67\x94\x0e\x74\xe3\xac\x2c\x78\x23\xde\x19\xb1\x95\x16\x16\x8d\x2c\x8b\xe1\xce\x2c\x8b\xe2\xdd\x81\x21\xb3\x9d\xe4\x0a\x5a\xeb\x3f\x72\x08\xea\xc4\xa1\x07\x6d\x73\xbf\x99\xb2\x1f\xff\x6d\x54\xf7\xfd\xfd\xbc\x92\x2a\x74\x1f\xe9\x0f\x91\x8f\xf4\x32\x18\x6a\x8c\x1d\xfc\x21\x4b\xb9\x89\xd8\x1f\x0a\xb3\x28\x7e\x38\x69\x15\x9d\x29\x27\x27\xbb\x41\x57\xb5\x80\x18\x6d\x68\x30\x73\xc9\x62\xb0\xe6\xf6\xa0\x77\x78\xe4\x62\x4e\x8a\x71\x5d\xf4\x5a\x62\xee\x40\x28\xed\xd6\x21\x57\x1e\x87\x14\x73\xe0\xd1\xf6\xe9\xbb\x07\xd5\xad\x7e\xc0\x10\x7e\x5e\x80\x05\x28\x3d\xed\x0d\x00\x73\xef\x3d\xbf\x61\xa5\x4c\x01\x71\xf6\x71\x4a\xb8\x71\x4e\xa3\xf0\x5d\xe8\x51\xf9\x4e\xef\xb9\x1a\xdd\x04\x0d\xf5\x7e\x24\x94\xe9\x2d\x1a\x23\x8b\x02\x53\x95\x26\x42\xd8\xff\xcd\x50\xf7\x7c\xaa\x5b\x1a\x63\x85\xfe\xeb\x98\xa9\x1b\x95\x49\x9b\xd5\xcd\xa2\x94\xa9\x5f\x43\xfa\x5d\xe1\xb9\xb1\xd3\xe2\x7f\x16\x45\xb1\x3d\x2f\x7c\x90\xc5\xcf\xc8\x5d\xb0\x6f\x59\x20\x6c\xa5\x2f\x28\xd0\x39\xcc\x05\x7b\x1a\xff\x2e\x1e\x0b\x58\xec\x41\xa8\xbd\x56\x03\x3f\x33\x62\xac\xb1\x30\x88\x8b\x0c\xbf\xf0\x7b\xe8\xe1\x6b\xfc\x61\x5d\x90\x5b\x1e\xdc\x78\x51\x05\xfd\xfb\xd8\xd3\x79\xd0\xf3\xa0\x83\x40\xaa\xdc\xe1\x62\xe6\x2f\xf7\xf0\x57\x58\x30\x90\x7a\x78\xa4\xbd\xde\x16\xc1\x1d\xac\x22\xa6\x3a\x1e\x64\x61\xfd\x36\xd1\xa4\x06\x96\x4f\x44\xbb\x45\x73\x78\xa6\xd5\x96\xdc\x7d\x48\x09\x3a\x16\x4e\x1f\x91\x1f\x37\xd9\x53\xa9\x46\x7a\x75\x43\xd5\xd1\x4e\xb6\x38\x70\xa1\x74\x6d\xcb\xec\x54\xbe\x3e\xa3\x56\xc2\x49\x0d\xb6\x56\xc6\x58\x09\x31\x68\x6b\xad\x2c\x0e\x3d\x79\x3a\x01\xcd\x35\xb0\xd3\x5c\x37\x8c\xc7\xac\xb6\x97\x25\xc7\x7a\x45\x5b\x67\x5b\x3b\x57\xfb\x5f\xec\x7b\xd6\x7c\xaf\xcd\xe1\x19\xdd\x30\xfc\x46\xa2\xff\xbd\xbf\xd4\xf9\xca\x09\x5f\x07\xa1\x99\x0a\xdd\x27\x1d\xb2\x84\xc5\x3e\x7f\xf1\x5f\xef\x7f\x9b\x9c\xba\xf2\xec\xcb\xf2\xd6\x62\xb1\xca\x2c\x0a\x93\xaf\xc9\x6a\xa2\xd3\x6b\x1b\x5b\x49\xd3\x09\x2b\x5a\xa7\x77\xdc\x0a\x8b\x2a\x8c\x32\xfa\xe0\x60\x24\xfc\x25\x28\xa7\x37\xc3\xb7\xbe\x15\xae\xbc\x11\x08\x5a\x7b\x65\xfa\xa7\x95\x03\xff\x57\x80\xe7\x67\xde\xf7\x04\x8d\xfc\x02\xbf\x32\x82\xee\x47\xe8\x5c\xe6\x25\x62\x97\x02\x18\xfe\x41\xe7\xe5\x18\xfa\xaf\x37\xe3\x6b\xe3\x00\xe9\xd1\xa7\x47\xff\x1b\x00\x00\xff\xff\x37\xe8\x8a\x21\x4a\x44\x00\x00")
 
 func wski18nResourcesEn_usAllJsonBytes() ([]byte, error) {
 	return bindataRead(
@@ -112,7 +112,7 @@ func wski18nResourcesEn_usAllJson() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 17008, mode: os.FileMode(420), modTime: time.Unix(1528157319, 0)}
+	info := bindataFileInfo{name: "wski18n/resources/en_US.all.json", size: 17482, mode: os.FileMode(420), modTime: time.Unix(1528407012, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
diff --git a/wski18n/resources/en_US.all.json b/wski18n/resources/en_US.all.json
index 614d434d..d6283a95 100644
--- a/wski18n/resources/en_US.all.json
+++ b/wski18n/resources/en_US.all.json
@@ -363,6 +363,10 @@
     "id": "msg_err_required_inputs_missing_value",
     "translation": "Required inputs are missing values even after applying interpolation using env. variables. Please set missing env. variables and/or input values in manifest/deployment file or on CLI for following inputs: {{.inputs}}"
   },
+  {
+    "id": "msg_err_api_gateway_base_path_invalid",
+    "translation": "API Gateway base path [{{.apibasepath}}] is invalid. It has path parameters which is not supported, only relative path supports path parameters."
+  },
   {
     "id": "msg_err_runtime_parser_error",
     "translation": "Failed to retrieve runtimes {{.err}}."
@@ -460,6 +464,10 @@
     "id": "msg_warn_api_missing_web_sequence",
     "translation": "Sequence [{{.sequence}}] is not a web sequence, API [{{.api}}] can only be created using web sequence. Converting [{{.sequence}}] to a web sequence.\n"
   },
+  {
+    "id": "msg_warn_api_invalid_response_type",
+    "translation": "API [{{.api}}] with path parameters [{{.apirelativepath}}] is required to have http as response type. Changing response type from [{{.response}}] to http for [{{.api}}]."
+  },
   {
     "id": "DEBUG",
     "translation": "================= DEBUG ==================="
diff --git a/wskprint/console.go b/wskprint/console.go
index 62228bc0..1863bdaa 100644
--- a/wskprint/console.go
+++ b/wskprint/console.go
@@ -51,13 +51,17 @@ func PrintOpenWhiskFromError(err error) {
 }
 
 func PrintOpenWhiskWarning(message string) {
-	outputStream := colorable.NewColorableStdout()
-	fmt.Fprintf(outputStream, clrWarning.Sprintf(STR_PREFIXED_MESSAGE,
-		wski18n.T(wski18n.ID_MSG_PREFIX_WARNING), message))
+	if DetectVerbose() {
+		outputStream := colorable.NewColorableStdout()
+		fmt.Fprintf(outputStream, clrWarning.Sprintf(STR_PREFIXED_MESSAGE,
+			wski18n.T(wski18n.ID_MSG_PREFIX_WARNING), message))
+	}
 }
 
 func PrintlnOpenWhiskWarning(message string) {
-	PrintOpenWhiskWarning(message + "\n")
+	if DetectVerbose() {
+		PrintOpenWhiskWarning(message + "\n")
+	}
 }
 
 func PrintOpenWhiskSuccess(message string) {
@@ -129,3 +133,14 @@ func DetectGoTestVerbose() bool {
 	}
 	return false
 }
+
+func DetectVerbose() bool {
+	arguments := os.Args
+	for i := range arguments {
+		if strings.HasPrefix(arguments[i], "-v") ||
+			strings.HasPrefix(arguments[i], "--verbose") {
+			return true
+		}
+	}
+	return false
+}


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services