From 6bb2e4ccb4cc5a36b6d4134eb61eeffec720a4b5 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Thu, 5 Feb 2015 07:17:38 -0800 Subject: [PATCH] moved to modules per #411 --- modules/swagger-codegen-distribution/pom.xml | 63 + modules/swagger-codegen/pom.xml | 391 ++ .../swagger/codegen/ClientOptInput.java | 59 + .../wordnik/swagger/codegen/ClientOpts.java | 52 + .../com/wordnik/swagger/codegen/Codegen.java | 123 + .../swagger/codegen/CodegenConfig.java | 51 + .../wordnik/swagger/codegen/CodegenModel.java | 16 + .../swagger/codegen/CodegenModelFactory.java | 38 + .../swagger/codegen/CodegenModelType.java | 20 + .../swagger/codegen/CodegenOperation.java | 29 + .../swagger/codegen/CodegenParameter.java | 37 + .../swagger/codegen/CodegenProperty.java | 24 + .../swagger/codegen/CodegenResponse.java | 10 + .../swagger/codegen/DefaultCodegen.java | 883 +++ .../swagger/codegen/DefaultGenerator.java | 371 + .../wordnik/swagger/codegen/Generator.java | 8 + .../swagger/codegen/SupportingFile.java | 13 + .../swagger/codegen/auth/AuthMethod.java | 6 + .../com/wordnik/swagger/codegen/haproxy.cfg | 86 + .../languages/AndroidClientCodegen.java | 106 + .../codegen/languages/JavaClientCodegen.java | 115 + .../codegen/languages/JaxRSServerCodegen.java | 129 + .../languages/NodeJSServerCodegen.java | 79 + .../codegen/languages/ObjcClientCodegen.java | 216 + .../codegen/languages/PhpClientCodegen.java | 110 + .../languages/PythonClientCodegen.java | 117 + .../codegen/languages/ScalaClientCodegen.java | 182 + .../languages/ScalatraServerCodegen.java | 174 + .../codegen/languages/StaticDocCodegen.java | 72 + .../languages/StaticHtmlGenerator.java | 81 + .../codegen/languages/SwaggerGenerator.java | 38 + .../codegen/languages/TizenClientCodegen.java | 243 + .../main/resources/Groovy/ApiUtils.mustache | 50 + .../src/main/resources/Groovy/api.mustache | 56 + .../resources/Groovy/build.gradle.mustache | 32 + .../src/main/resources/Groovy/model.mustache | 21 + .../src/main/resources/Java/JsonUtil.mustache | 23 + .../src/main/resources/Java/api.mustache | 109 + .../main/resources/Java/apiException.mustache | 29 + .../main/resources/Java/apiInvoker.mustache | 187 + .../src/main/resources/Java/model.mustache | 49 + .../src/main/resources/Java/pom.mustache | 168 + .../resources/JavaJaxRS/ApiException.mustache | 9 + .../JavaJaxRS/ApiOriginFilter.mustache | 26 + .../JavaJaxRS/ApiResponseMessage.mustache | 68 + .../JavaJaxRS/NotFoundException.mustache | 9 + .../main/resources/JavaJaxRS/README.mustache | 10 + .../src/main/resources/JavaJaxRS/api.mustache | 40 + .../resources/JavaJaxRS/bodyParams.mustache | 1 + .../resources/JavaJaxRS/formParams.mustache | 1 + .../resources/JavaJaxRS/headerParams.mustache | 1 + .../main/resources/JavaJaxRS/model.mustache | 47 + .../resources/JavaJaxRS/pathParams.mustache | 1 + .../src/main/resources/JavaJaxRS/pom.mustache | 141 + .../JavaJaxRS/project/build.properties | 1 + .../resources/JavaJaxRS/project/plugins.sbt | 9 + .../resources/JavaJaxRS/queryParams.mustache | 1 + .../src/main/resources/JavaJaxRS/web.mustache | 54 + .../com.wordnik.swagger.codegen.CodegenConfig | 13 + .../main/resources/android-java/api.mustache | 88 + .../android-java/apiException.mustache | 29 + .../android-java/apiInvoker.mustache | 283 + .../resources/android-java/httpPatch.mustache | 16 + .../resources/android-java/jsonUtil.mustache | 20 + .../resources/android-java/model.mustache | 47 + .../main/resources/android-java/pom.mustache | 162 + .../main/resources/asyncscala/api.mustache | 59 + .../main/resources/asyncscala/client.mustache | 26 + .../main/resources/asyncscala/model.mustache | 15 + .../main/resources/asyncscala/sbt.mustache | 11 + .../main/resources/csharp/Newtonsoft.Json.dll | Bin 0 -> 426496 bytes .../src/main/resources/csharp/api.mustache | 101 + .../resources/csharp/apiException.mustache | 21 + .../main/resources/csharp/apiInvoker.mustache | 207 + .../main/resources/csharp/compile.mustache | 2 + .../src/main/resources/csharp/model.mustache | 30 + .../src/main/resources/flash/ASAXB-0.1.1.swc | Bin 0 -> 46948 bytes .../resources/flash/AirExecutorApp-app.xml | 146 + .../main/resources/flash/ApiClientEvent.as | 36 + .../src/main/resources/flash/ApiError.as | 10 + .../src/main/resources/flash/ApiErrorCodes.as | 34 + .../src/main/resources/flash/ApiInvoker.as | 289 + .../src/main/resources/flash/ApiUrlHelper.as | 41 + .../resources/flash/ApiUserCredentials.as | 63 + .../src/main/resources/flash/ListWrapper.as | 9 + .../src/main/resources/flash/Response.as | 56 + .../src/main/resources/flash/SwaggerApi.as | 75 + .../src/main/resources/flash/XMLWriter.as | 28 + .../src/main/resources/flash/api.mustache | 73 + .../src/main/resources/flash/as3corelib.swc | Bin 0 -> 255357 bytes .../src/main/resources/flash/build.properties | 29 + .../src/main/resources/flash/build.xml | 192 + .../src/main/resources/flash/facetValue.as | 8 + ...flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc | Bin 0 -> 194680 bytes ...aircilistener-4.1.0_RC2-28-3.5.0.12683.swc | Bin 0 -> 2294 bytes ...it-cilistener-4.1.0_RC2-28-3.5.0.12683.swc | Bin 0 -> 11827 bytes ...xunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc | Bin 0 -> 165338 bytes .../src/main/resources/flash/model.mustache | 40 + .../main/resources/flash/modelList.mustache | 23 + .../resources/htmlDocs/bodyParam.mustache | 3 + .../resources/htmlDocs/formParam.mustache | 3 + .../resources/htmlDocs/headerParam.mustache | 3 + .../main/resources/htmlDocs/index.mustache | 60 + .../resources/htmlDocs/pathParam.mustache | 3 + .../resources/htmlDocs/queryParam.mustache | 3 + .../resources/htmlDocs/style.css.mustache | 136 + .../src/main/resources/logback.xml | 12 + .../src/main/resources/nodejs/README.mustache | 10 + .../src/main/resources/nodejs/api.mustache | 62 + .../src/main/resources/nodejs/main.mustache | 52 + .../src/main/resources/nodejs/models.mustache | 3 + .../main/resources/nodejs/package.mustache | 16 + .../src/main/resources/objc/Podfile.mustache | 3 + .../src/main/resources/objc/SWGApiClient.h | 64 + .../src/main/resources/objc/SWGApiClient.m | 419 ++ .../src/main/resources/objc/SWGDate.h | 12 + .../src/main/resources/objc/SWGDate.m | 34 + .../src/main/resources/objc/SWGFile.h | 13 + .../src/main/resources/objc/SWGFile.m | 26 + .../src/main/resources/objc/SWGObject.h | 6 + .../src/main/resources/objc/SWGObject.m | 17 + .../src/main/resources/objc/api-body.mustache | 234 + .../main/resources/objc/api-header.mustache | 29 + .../main/resources/objc/model-body.mustache | 94 + .../main/resources/objc/model-header.mustache | 24 + .../src/main/resources/php/Swagger.mustache | 231 + .../src/main/resources/php/api.mustache | 86 + .../src/main/resources/php/model.mustache | 40 + .../main/resources/python/__init__.mustache | 9 + .../src/main/resources/python/api.mustache | 98 + .../src/main/resources/python/model.mustache | 40 + .../main/resources/python/swagger.mustache | 208 + .../main/resources/python3/__init__.mustache | 9 + .../src/main/resources/python3/api.mustache | 96 + .../src/main/resources/python3/model.mustache | 40 + .../main/resources/python3/swagger.mustache | 203 + .../src/main/resources/ruby/api.mustache | 85 + .../src/main/resources/ruby/model.mustache | 41 + .../src/main/resources/ruby/monkey.mustache | 90 + .../src/main/resources/ruby/swagger.mustache | 84 + .../ruby/swagger/configuration.mustache | 22 + .../resources/ruby/swagger/request.mustache | 199 + .../resources/ruby/swagger/response.mustache | 70 + .../resources/ruby/swagger/version.mustache | 4 + .../src/main/resources/scala/api.mustache | 68 + .../main/resources/scala/apiInvoker.mustache | 164 + .../src/main/resources/scala/model.mustache | 15 + .../src/main/resources/scala/pom.mustache | 232 + .../resources/scalatra/Bootstrap.mustache | 20 + .../main/resources/scalatra/JettyMain.scala | 43 + .../main/resources/scalatra/JsonUtil.scala | 12 + .../main/resources/scalatra/README.mustache | 10 + .../resources/scalatra/ServletApp.mustache | 39 + .../src/main/resources/scalatra/api.mustache | 94 + .../src/main/resources/scalatra/build.sbt | 64 + .../main/resources/scalatra/model.mustache | 15 + .../scalatra/project/build.properties | 1 + .../resources/scalatra/project/plugins.sbt | 9 + .../src/main/resources/scalatra/sbt | 525 ++ .../src/main/resources/scalatra/web.xml | 17 + .../assets/css/bootstrap-responsive.css | 1092 +++ .../swagger-static/assets/css/bootstrap.css | 6057 +++++++++++++++++ .../swagger-static/assets/css/site.css | 1 + .../swagger-static/assets/css/style.css | 292 + .../swagger-static/assets/images/logo.png | Bin 0 -> 14577 bytes .../swagger-static/assets/js/bootstrap.js | 2159 ++++++ .../assets/js/jquery-1.8.3.min.js | 2 + .../swagger-static/assets/js/main.js | 75 + .../resources/swagger-static/index.mustache | 58 + .../resources/swagger-static/main.mustache | 7 + .../resources/swagger-static/model.mustache | 13 + .../swagger-static/operation.mustache | 52 + .../resources/swagger-static/package.mustache | 12 + .../src/main/resources/swagger-static/pom.xml | 100 + .../src/main/resources/tizen/README.md | 2 + .../main/resources/tizen/api-body.mustache | 131 + .../main/resources/tizen/api-header.mustache | 37 + .../resources/tizen/apiclient-body.mustache | 124 + .../resources/tizen/apiclient-header.mustache | 73 + .../main/resources/tizen/error-body.mustache | 55 + .../resources/tizen/error-header.mustache | 35 + .../resources/tizen/helpers-body.mustache | 273 + .../resources/tizen/helpers-header.mustache | 45 + .../main/resources/tizen/model-body.mustache | 158 + .../resources/tizen/model-header.mustache | 58 + .../resources/tizen/modelFactory.mustache | 31 + .../src/main/resources/tizen/object.mustache | 27 + .../main/resources/validator/index.mustache | 262 + .../test/resources/1_2/petstore-1.2/api-docs | 60 + .../src/test/resources/1_2/petstore-1.2/pet | 425 ++ .../src/test/resources/1_2/petstore-1.2/store | 145 + .../src/test/resources/1_2/petstore-1.2/user | 299 + .../src/test/resources/2_0/petstore.json | 951 +++ .../src/test/resources/2_0/postBodyTest.json | 102 + .../src/test/scala/CodegenTest.scala | 98 + .../test/scala/Java/JavaModelEnumTest.scala | 33 + .../src/test/scala/Java/JavaModelTest.scala | 268 + .../src/test/scala/Objc/ObjcModelTest.scala | 260 + .../src/test/scala/SwaggerMigratorTest.scala | 19 + .../src/test/scala/php/PhpModelTest.scala | 259 + .../src/test/scala/scala/ScalaModelTest.scala | 241 + .../staticDocs/StaticOperationTest.scala | 65 + 202 files changed, 26147 insertions(+) create mode 100644 modules/swagger-codegen-distribution/pom.xml create mode 100644 modules/swagger-codegen/pom.xml create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOptInput.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOpts.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Codegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenConfig.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModel.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModelType.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenOperation.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenParameter.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenProperty.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenResponse.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultGenerator.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Generator.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/SupportingFile.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/auth/AuthMethod.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/haproxy.cfg create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/AndroidClientCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JavaClientCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JaxRSServerCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/NodeJSServerCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ObjcClientCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/PhpClientCodegen.java create mode 100755 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/PythonClientCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ScalaClientCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ScalatraServerCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/StaticDocCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/StaticHtmlGenerator.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/SwaggerGenerator.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/TizenClientCodegen.java create mode 100644 modules/swagger-codegen/src/main/resources/Groovy/ApiUtils.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Groovy/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Groovy/build.gradle.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Groovy/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/JsonUtil.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/apiException.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/apiInvoker.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/pom.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiException.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiOriginFilter.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiResponseMessage.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/NotFoundException.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/bodyParams.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/formParams.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/headerParams.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/pathParams.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/project/build.properties create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/project/plugins.sbt create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/queryParams.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/web.mustache create mode 100644 modules/swagger-codegen/src/main/resources/META-INF/services/com.wordnik.swagger.codegen.CodegenConfig create mode 100644 modules/swagger-codegen/src/main/resources/android-java/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/android-java/apiException.mustache create mode 100644 modules/swagger-codegen/src/main/resources/android-java/apiInvoker.mustache create mode 100644 modules/swagger-codegen/src/main/resources/android-java/httpPatch.mustache create mode 100644 modules/swagger-codegen/src/main/resources/android-java/jsonUtil.mustache create mode 100644 modules/swagger-codegen/src/main/resources/android-java/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/android-java/pom.mustache create mode 100644 modules/swagger-codegen/src/main/resources/asyncscala/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/asyncscala/client.mustache create mode 100644 modules/swagger-codegen/src/main/resources/asyncscala/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/asyncscala/sbt.mustache create mode 100644 modules/swagger-codegen/src/main/resources/csharp/Newtonsoft.Json.dll create mode 100644 modules/swagger-codegen/src/main/resources/csharp/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/csharp/apiException.mustache create mode 100644 modules/swagger-codegen/src/main/resources/csharp/apiInvoker.mustache create mode 100644 modules/swagger-codegen/src/main/resources/csharp/compile.mustache create mode 100644 modules/swagger-codegen/src/main/resources/csharp/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/flash/ASAXB-0.1.1.swc create mode 100644 modules/swagger-codegen/src/main/resources/flash/AirExecutorApp-app.xml create mode 100644 modules/swagger-codegen/src/main/resources/flash/ApiClientEvent.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/ApiError.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/ApiErrorCodes.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/ApiInvoker.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/ApiUrlHelper.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/ApiUserCredentials.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/ListWrapper.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/Response.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/SwaggerApi.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/XMLWriter.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/flash/as3corelib.swc create mode 100644 modules/swagger-codegen/src/main/resources/flash/build.properties create mode 100644 modules/swagger-codegen/src/main/resources/flash/build.xml create mode 100644 modules/swagger-codegen/src/main/resources/flash/facetValue.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc create mode 100644 modules/swagger-codegen/src/main/resources/flash/flexunit-aircilistener-4.1.0_RC2-28-3.5.0.12683.swc create mode 100644 modules/swagger-codegen/src/main/resources/flash/flexunit-cilistener-4.1.0_RC2-28-3.5.0.12683.swc create mode 100644 modules/swagger-codegen/src/main/resources/flash/flexunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc create mode 100644 modules/swagger-codegen/src/main/resources/flash/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/flash/modelList.mustache create mode 100644 modules/swagger-codegen/src/main/resources/htmlDocs/bodyParam.mustache create mode 100644 modules/swagger-codegen/src/main/resources/htmlDocs/formParam.mustache create mode 100644 modules/swagger-codegen/src/main/resources/htmlDocs/headerParam.mustache create mode 100644 modules/swagger-codegen/src/main/resources/htmlDocs/index.mustache create mode 100644 modules/swagger-codegen/src/main/resources/htmlDocs/pathParam.mustache create mode 100644 modules/swagger-codegen/src/main/resources/htmlDocs/queryParam.mustache create mode 100644 modules/swagger-codegen/src/main/resources/htmlDocs/style.css.mustache create mode 100644 modules/swagger-codegen/src/main/resources/logback.xml create mode 100644 modules/swagger-codegen/src/main/resources/nodejs/README.mustache create mode 100644 modules/swagger-codegen/src/main/resources/nodejs/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/nodejs/main.mustache create mode 100644 modules/swagger-codegen/src/main/resources/nodejs/models.mustache create mode 100755 modules/swagger-codegen/src/main/resources/nodejs/package.mustache create mode 100644 modules/swagger-codegen/src/main/resources/objc/Podfile.mustache create mode 100644 modules/swagger-codegen/src/main/resources/objc/SWGApiClient.h create mode 100644 modules/swagger-codegen/src/main/resources/objc/SWGApiClient.m create mode 100644 modules/swagger-codegen/src/main/resources/objc/SWGDate.h create mode 100644 modules/swagger-codegen/src/main/resources/objc/SWGDate.m create mode 100644 modules/swagger-codegen/src/main/resources/objc/SWGFile.h create mode 100644 modules/swagger-codegen/src/main/resources/objc/SWGFile.m create mode 100644 modules/swagger-codegen/src/main/resources/objc/SWGObject.h create mode 100644 modules/swagger-codegen/src/main/resources/objc/SWGObject.m create mode 100644 modules/swagger-codegen/src/main/resources/objc/api-body.mustache create mode 100644 modules/swagger-codegen/src/main/resources/objc/api-header.mustache create mode 100644 modules/swagger-codegen/src/main/resources/objc/model-body.mustache create mode 100644 modules/swagger-codegen/src/main/resources/objc/model-header.mustache create mode 100644 modules/swagger-codegen/src/main/resources/php/Swagger.mustache create mode 100644 modules/swagger-codegen/src/main/resources/php/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/php/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/python/__init__.mustache create mode 100644 modules/swagger-codegen/src/main/resources/python/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/python/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/python/swagger.mustache create mode 100644 modules/swagger-codegen/src/main/resources/python3/__init__.mustache create mode 100644 modules/swagger-codegen/src/main/resources/python3/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/python3/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/python3/swagger.mustache create mode 100644 modules/swagger-codegen/src/main/resources/ruby/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/ruby/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/ruby/monkey.mustache create mode 100644 modules/swagger-codegen/src/main/resources/ruby/swagger.mustache create mode 100644 modules/swagger-codegen/src/main/resources/ruby/swagger/configuration.mustache create mode 100644 modules/swagger-codegen/src/main/resources/ruby/swagger/request.mustache create mode 100644 modules/swagger-codegen/src/main/resources/ruby/swagger/response.mustache create mode 100644 modules/swagger-codegen/src/main/resources/ruby/swagger/version.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scala/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scala/apiInvoker.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scala/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scala/pom.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/Bootstrap.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/JettyMain.scala create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/JsonUtil.scala create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/README.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/ServletApp.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/build.sbt create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/project/build.properties create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/project/plugins.sbt create mode 100755 modules/swagger-codegen/src/main/resources/scalatra/sbt create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/web.xml create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/assets/css/bootstrap-responsive.css create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/assets/css/bootstrap.css create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/assets/css/site.css create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/assets/css/style.css create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/assets/images/logo.png create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/assets/js/bootstrap.js create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/assets/js/jquery-1.8.3.min.js create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/assets/js/main.js create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/index.mustache create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/main.mustache create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/operation.mustache create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/package.mustache create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/pom.xml create mode 100644 modules/swagger-codegen/src/main/resources/tizen/README.md create mode 100644 modules/swagger-codegen/src/main/resources/tizen/api-body.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/api-header.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/apiclient-body.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/apiclient-header.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/error-body.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/error-header.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/helpers-body.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/helpers-header.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/model-body.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/model-header.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/modelFactory.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/object.mustache create mode 100644 modules/swagger-codegen/src/main/resources/validator/index.mustache create mode 100644 modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/api-docs create mode 100644 modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/pet create mode 100644 modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/store create mode 100644 modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/user create mode 100644 modules/swagger-codegen/src/test/resources/2_0/petstore.json create mode 100644 modules/swagger-codegen/src/test/resources/2_0/postBodyTest.json create mode 100644 modules/swagger-codegen/src/test/scala/CodegenTest.scala create mode 100644 modules/swagger-codegen/src/test/scala/Java/JavaModelEnumTest.scala create mode 100644 modules/swagger-codegen/src/test/scala/Java/JavaModelTest.scala create mode 100644 modules/swagger-codegen/src/test/scala/Objc/ObjcModelTest.scala create mode 100644 modules/swagger-codegen/src/test/scala/SwaggerMigratorTest.scala create mode 100644 modules/swagger-codegen/src/test/scala/php/PhpModelTest.scala create mode 100644 modules/swagger-codegen/src/test/scala/scala/ScalaModelTest.scala create mode 100644 modules/swagger-codegen/src/test/scala/staticDocs/StaticOperationTest.scala diff --git a/modules/swagger-codegen-distribution/pom.xml b/modules/swagger-codegen-distribution/pom.xml new file mode 100644 index 000000000000..a70a79c27e1d --- /dev/null +++ b/modules/swagger-codegen-distribution/pom.xml @@ -0,0 +1,63 @@ + + + com.wordnik + swagger-codegen-project + 2.1.0-SNAPSHOT + ../.. + + 4.0.0 + com.wordnik + swagger-codegen-distribution + jar + swagger-codegen-distribution + 2.1.0-SNAPSHOT + + src/test/scala + target/classes + target/test-classes + install + target + ${project.artifactId}-${project.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + + package + + shade + + + false + true + + ${java.io.tmpdir}/dependency-reduced-pom.xml + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + com.wordnik.swagger.codegen.Codegen + + + + + + + + + com.wordnik + swagger-codegen + ${project.parent.version} + + + \ No newline at end of file diff --git a/modules/swagger-codegen/pom.xml b/modules/swagger-codegen/pom.xml new file mode 100644 index 000000000000..8f0de9f7ddbc --- /dev/null +++ b/modules/swagger-codegen/pom.xml @@ -0,0 +1,391 @@ + + + com.wordnik + swagger-codegen-project + 2.1.0-SNAPSHOT + ../.. + + 4.0.0 + com.wordnik + swagger-codegen + jar + swagger-codegen + 2.1.0-SNAPSHOT + + src/main/java + install + + + org.jvnet.wagon-svn + wagon-svn + 1.8 + + + org.apache.maven.wagon + wagon-ssh-external + 1.0-alpha-6 + + + org.apache.maven.wagon + wagon-webdav + 1.0-beta-1 + + + target + ${project.artifactId}-${project.version} + + + org.codehaus.mojo + exec-maven-plugin + 1.3.2 + + + + java + + + + + com.wordnik.swagger.codegen.Codegen + + + + org.apache.maven.plugins + maven-jar-plugin + + + + true + com.wordnik.swagger.codegen.Codegen + + + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + net.alchim31.maven + scala-maven-plugin + + + + add-source + compile + testCompile + + + + + + incremental + + + -Xmx384m + + + -target:jvm-1.6 + -deprecation + + + + run-scalatest + org.scalatest.tools.Runner + + -p + ${project.build.testOutputDirectory} + + + -Xmx512m + + + + + + + org.apache.maven.plugins + maven-source-plugin + 2.1.2 + + + attach-sources + verify + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.7 + + true + 1.6 + UTF-8 + 1g + + http://java.sun.com/javase/6/docs/api/ + + ${javadoc.package.exclude} + + + + attach-javadocs + verify + + jar + + + + + + maven-compiler-plugin + 3.0 + + 1.6 + 1.6 + + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + + development + ${project.url} + ${project.version} + com.wordnik + + + + + + org.apache.maven.plugins + maven-site-plugin + 2.1 + + + org.apache.maven.plugins + maven-release-plugin + 2.1 + + + + + + net.alchim31.maven + scala-maven-plugin + ${scala-maven-plugin-version} + + + org.apache.maven.plugins + maven-gpg-plugin + + release + sign + + + + + + + + release-profile + + true + + + + + net.alchim31.maven + scala-maven-plugin + + + + compile + testCompile + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source + prepare-package + + add-source + + + + src/main/scala + + + + + + + + + + release-sign-artifacts + + + performRelease + true + + + + + + org.apache.maven.plugins + maven-gpg-plugin + + + sign-artifacts + verify + + sign + + + + + + + + + + target/site + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9 + + true + true + + http://java.sun.com/javaee/5/docs/api + http://java.sun.com/j2se/1.5.0/docs/api + + + + + + net.alchim31.maven + scala-maven-plugin + ${scala-maven-plugin-version} + + + org.apache.maven.plugins + maven-jxr-plugin + 2.3 + + true + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + 2.6 + + + + project-team + + + + + + + + + io.swagger + swagger-parser + ${swagger-parser-version} + + + io.swagger + swagger-legacy-spec-parser + ${swagger-parser-version} + + + ${project.groupId} + swagger-core + ${swagger-core-version} + + + com.samskivert + jmustache + ${jmustache-version} + + + commons-io + commons-io + ${commons-io-version} + + + org.apache.maven + maven-plugin-tools-api + 2.0 + + + org.apache.felix + maven-bundle-plugin + ${felix-version} + + + org.slf4j + slf4j-ext + ${slf4j-version} + + + org.slf4j + slf4j-api + ${slf4j-version} + + + commons-lang + commons-lang + ${commons-lang-version} + + + commons-cli + commons-cli + ${commons-cli-version} + + + org.scalatest + scalatest_2.11 + ${scala-test-version} + test + + + + + sonatype-snapshots + https://oss.sonatype.org/content/repositories/snapshots + + true + + + + diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOptInput.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOptInput.java new file mode 100644 index 000000000000..cdfb1191b2f7 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOptInput.java @@ -0,0 +1,59 @@ +/** + * Copyright 2014 Reverb, Inc. + * + * Licensed 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 com.wordnik.swagger.codegen; + +import com.wordnik.swagger.codegen.ClientOpts; + +import com.wordnik.swagger.models.Swagger; + +public class ClientOptInput { + private ClientOpts opts; + private Swagger swagger; + protected CodegenConfig config; + + public ClientOptInput swagger(Swagger swagger) { + this.setSwagger(swagger); + return this; + } + public ClientOptInput opts(ClientOpts opts) { + this.setOpts(opts); + return this; + } + + public CodegenConfig getConfig() { + return config; + } + public void setConfig(CodegenConfig config) { + this.config = config; + } + + public void setOpts(ClientOpts opts) { + this.opts = opts; + } + + public ClientOpts getOpts() { + return opts; + } + + public void setSwagger(Swagger swagger) { + this.swagger = swagger; + } + + public Swagger getSwagger() { + return swagger; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOpts.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOpts.java new file mode 100644 index 000000000000..b8d681cc3078 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOpts.java @@ -0,0 +1,52 @@ +package com.wordnik.swagger.codegen; + +import com.wordnik.swagger.codegen.auth.*; + +import java.util.*; + +public class ClientOpts { + protected String uri; + protected String target; + protected AuthMethod auth; + protected Map properties = new HashMap(); + protected String outputDirectory; + + public String getUri() { + return uri; + } + public void setUri(String uri) { + this.uri = uri; + } + + public String getTarget() { + return target; + } + public void setTarget(String target) { + this.target = target; + } + + public Map getProperties() { + return properties; + } + public void setProperties(Map properties) { + this.properties = properties; + } + + public String getOutputDirectory() { + return outputDirectory; + } + public void setOutputDirectory(String outputDirectory) { + this.outputDirectory = outputDirectory; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("ClientOpts: {\n"); + sb.append(" uri: ").append(uri).append(","); + sb.append(" auth: ").append(auth).append(","); + sb.append(properties); + sb.append("}"); + return sb.toString(); + } +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Codegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Codegen.java new file mode 100644 index 000000000000..c9e39c7f2f3f --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Codegen.java @@ -0,0 +1,123 @@ +package com.wordnik.swagger.codegen; + +import com.wordnik.swagger.codegen.languages.*; +import com.wordnik.swagger.models.Swagger; +import com.wordnik.swagger.util.*; + +import io.swagger.parser.SwaggerParser; + +import org.apache.commons.cli.*; + +import java.io.File; +import java.util.*; + +public class Codegen extends DefaultGenerator { + static String debugInfoOptions = "\nThe following additional debug options are available for all codegen targets:" + + "\n -DdebugSwagger prints the swagger specification as interpreted by the codegen" + + "\n -DdebugModels prints models passed to the template engine" + + "\n -DdebugOperations prints operations passed to the template engine" + + "\n -DdebugSupportingFiles prints additional data passed to the template engine"; + public static void main(String[] args) { + List extensions = getExtensions(); + Map configs = new HashMap(); + + StringBuilder sb = new StringBuilder(); + for(CodegenConfig config : extensions) { + if(sb.toString().length() != 0) + sb.append(", "); + sb.append(config.getName()); + configs.put(config.getName(), config); + } + + Options options = new Options(); + options.addOption("h", "help", false, "shows this message"); + options.addOption("l", "lang", true, "client language to generate.\nAvailable languages include:\n\t[" + sb.toString() + "]"); + options.addOption("o", "output", true, "where to write the generated files"); + options.addOption("i", "input-spec", true, "location of the swagger spec, as URL or file"); + options.addOption("t", "template-dir", true, "folder containing the template files"); + options.addOption("d", "debug-info", false, "prints additional info for debugging"); + + ClientOptInput clientOptInput = new ClientOptInput(); + ClientOpts clientOpts = new ClientOpts(); + Swagger swagger = null; + + CommandLine cmd = null; + try { + CommandLineParser parser = new BasicParser(); + CodegenConfig config = null; + + cmd = parser.parse(options, args); + if (cmd.hasOption("d")) { + usage(options); + System.out.println(debugInfoOptions); + return; + } + if (cmd.hasOption("l")) + clientOptInput.setConfig(getConfig(cmd.getOptionValue("l"), configs)); + if (cmd.hasOption("o")) + clientOptInput.getConfig().setOutputDir(cmd.getOptionValue("o")); + if (cmd.hasOption("h")) { + if(cmd.hasOption("l")) { + config = getConfig(String.valueOf(cmd.getOptionValue("l")), configs); + if(config != null) { + options.addOption("h", "help", true, config.getHelp()); + usage(options); + return; + } + } + usage(options); + return; + } + if (cmd.hasOption("i")) + swagger = new SwaggerParser().read(cmd.getOptionValue("i")); + if (cmd.hasOption("t")) + clientOpts.getProperties().put("templateDir", String.valueOf(cmd.getOptionValue("t"))); + } + catch (Exception e) { + usage(options); + return; + } + try{ + clientOptInput + .opts(clientOpts) + .swagger(swagger); + new Codegen().opts(clientOptInput).generate(); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + public static List getExtensions() { + ServiceLoader loader = ServiceLoader.load(CodegenConfig.class); + List output = new ArrayList(); + Iterator itr = loader.iterator(); + while(itr.hasNext()) { + output.add(itr.next()); + } + return output; + } + + static void usage(Options options) { + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp( "Codegen", options ); + } + + static CodegenConfig getConfig(String name, Map configs) { + if(configs.containsKey(name)) { + return configs.get(name); + } + else { + // see if it's a class + try { + System.out.println("loading class " + name); + Class customClass = Class.forName(name); + System.out.println("loaded"); + return (CodegenConfig)customClass.newInstance(); + } + catch (Exception e) { + throw new RuntimeException("can't load class " + name); + } + } + } +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenConfig.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenConfig.java new file mode 100644 index 000000000000..73abe291c1d4 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenConfig.java @@ -0,0 +1,51 @@ +package com.wordnik.swagger.codegen; + +import com.wordnik.swagger.models.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; + +public interface CodegenConfig { + String getName(); + String getHelp(); + Map additionalProperties(); + String apiPackage(); + String apiFileFolder(); + String fileSuffix(); + String outputFolder(); + String templateDir(); + String modelFileFolder(); + String modelPackage(); + String toApiName(String name); + String toModelName(String name); + String toParamName(String name); + String escapeReservedWord(String name); + String getTypeDeclaration(Property p); + String getTypeDeclaration(String name); + void processOpts(); + + Set reservedWords(); + + List supportingFiles(); + + void setOutputDir(String dir); + String getOutputDir(); + + CodegenModel fromModel(String name, Model model); + CodegenOperation fromOperation(String resourcePath, String httpMethod, Operation operation); + Set defaultIncludes(); + Map typeMapping(); + Map instantiationTypes(); + Map importMapping(); + Map apiTemplateFiles(); + Map modelTemplateFiles(); + void processSwagger(Swagger swagger); + + String toApiFilename(String name); + String toModelFilename(String name); + String toModelImport(String name); + String toApiImport(String name); + void addOperationToGroup(String tag, String resourcePath, Operation operation, CodegenOperation co, Map> operations); + Map postProcessModels(Map objs); + Map postProcessOperations(Map objs); +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModel.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModel.java new file mode 100644 index 000000000000..169886da22e3 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModel.java @@ -0,0 +1,16 @@ +package com.wordnik.swagger.codegen; + +import com.wordnik.swagger.models.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; + +public class CodegenModel { + public String parent; + public String name, classname, description, classVarName, modelJson; + public String defaultValue; + public List vars = new ArrayList(); + public Set imports = new HashSet(); + public Boolean hasVars, emptyVars, hasMoreModels; + public ExternalDocs externalDocs; +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java new file mode 100644 index 000000000000..b369623f37c7 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java @@ -0,0 +1,38 @@ +package com.wordnik.swagger.codegen; + +import java.util.HashMap; +import java.util.Map; + +public final class CodegenModelFactory { + + private static final Map> typeMapping = new HashMap>(); + + /** + * Configure a different implementation class. + * @param type the type that shall be replaced + * @param implementation the implementation class must extend the default class and must provide a public no-arg constructor + */ + public static void setTypeMapping(CodegenModelType type, Class implementation) { + if (!type.getDefaultImplementation().isAssignableFrom(implementation)) { + throw new IllegalArgumentException(implementation.getSimpleName() + " doesn't extend " + type.getDefaultImplementation().getSimpleName()); + } + try { + implementation.newInstance(); + } catch (Exception e) { + throw new IllegalArgumentException(e); + } + typeMapping.put(type, implementation); + } + + @SuppressWarnings("unchecked") + public static T newInstance(CodegenModelType type) { + Class classType = typeMapping.get(type); + try { + return (T) (classType != null ? classType : type.getDefaultImplementation()).newInstance(); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModelType.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModelType.java new file mode 100644 index 000000000000..41c877532f07 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModelType.java @@ -0,0 +1,20 @@ +package com.wordnik.swagger.codegen; + +public enum CodegenModelType { + + MODEL(CodegenModel.class), + OPERATION(CodegenOperation.class), + PARAMETER(CodegenParameter.class), + PROPERTY(CodegenProperty.class), + RESPONSE(CodegenResponse.class); + + private final Class defaultImplementation; + + private CodegenModelType(Class defaultImplementation) { + this.defaultImplementation = defaultImplementation; + } + + public Class getDefaultImplementation() { + return defaultImplementation; + } +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenOperation.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenOperation.java new file mode 100644 index 000000000000..3609e53d9eed --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenOperation.java @@ -0,0 +1,29 @@ +package com.wordnik.swagger.codegen; + +import com.wordnik.swagger.models.*; + +import java.util.*; + +public class CodegenOperation { + public Boolean hasConsumes, hasProduces, hasParams, returnTypeIsPrimitive, returnSimpleType, subresourceOperation; + public String path, operationId, returnType, httpMethod, returnBaseType, + returnContainer, summary, notes, baseName, defaultResponse; + + public List> consumes, produces; + public CodegenParameter bodyParam; + public List allParams = new ArrayList(); + public List bodyParams = new ArrayList(); + public List pathParams = new ArrayList(); + public List queryParams = new ArrayList(); + public List headerParams = new ArrayList(); + public List formParams = new ArrayList(); + public List tags; + public List responses = new ArrayList(); + public final List responseHeaders = new ArrayList(); + public Set imports = new HashSet(); + public List> examples; + public ExternalDocs externalDocs; + + // legacy support + public String nickname; +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenParameter.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenParameter.java new file mode 100644 index 000000000000..4480c172c322 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenParameter.java @@ -0,0 +1,37 @@ +package com.wordnik.swagger.codegen; + +public class CodegenParameter { + public Boolean isFormParam, isQueryParam, isPathParam, isHeaderParam, + isCookieParam, isBodyParam, isFile, notFile, hasMore, isContainer, secondaryParam; + public String baseName, paramName, dataType, collectionFormat, description, baseType; + /** + * Determines whether this parameter is mandatory. If the parameter is in "path", + * this property is required and its value MUST be true. Otherwise, the property + * MAY be included and its default value is false. + */ + public Boolean required; + + public CodegenParameter copy() { + CodegenParameter output = new CodegenParameter(); + output.isFile = this.isFile; + output.notFile = this.notFile; + output.hasMore = this.hasMore; + output.isContainer = this.isContainer; + output.secondaryParam = this.secondaryParam; + output.baseName = this.baseName; + output.paramName = this.paramName; + output.dataType = this.dataType; + output.collectionFormat = this.collectionFormat; + output.description = this.description; + output.baseType = this.baseType; + output.isFormParam = this.isFormParam; + output.isQueryParam = this.isQueryParam; + output.isPathParam = this.isPathParam; + output.isHeaderParam = this.isHeaderParam; + output.isCookieParam = this.isCookieParam; + output.isBodyParam = this.isBodyParam; + output.required = this.required; + + return output; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenProperty.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenProperty.java new file mode 100644 index 000000000000..cda9ab714d40 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenProperty.java @@ -0,0 +1,24 @@ +package com.wordnik.swagger.codegen; + +import java.util.*; + +public class CodegenProperty { + public String baseName, complexType, getter, setter, description, datatype, + name, min, max, defaultValue, baseType, containerType; + + /** maxLength validation for strings, see http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.2.1 */ + public Integer maxLength; + /** minLength validation for strings, see http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.2.2 */ + public Integer minLength; + /** pattern validation for strings, see http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.2.3 */ + public String pattern; + /** A free-form property to include an example of an instance for this schema. */ + public String example; + + public Double minimum, maximum, exclusiveMinimum, exclusiveMaximum; + public Boolean hasMore = null, required = null, secondaryParam = null; + public Boolean isPrimitiveType, isContainer, isNotContainer; + public boolean isEnum; + public List _enum; + public Map allowableValues; +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenResponse.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenResponse.java new file mode 100644 index 000000000000..92b908759b10 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenResponse.java @@ -0,0 +1,10 @@ +package com.wordnik.swagger.codegen; + +import java.util.*; + +public class CodegenResponse { + public String code, message; + public Boolean hasMore; + public List> examples; + Object schema; +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java new file mode 100644 index 000000000000..e89b0f0b26f4 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java @@ -0,0 +1,883 @@ +package com.wordnik.swagger.codegen; + +import com.wordnik.swagger.models.*; +import com.wordnik.swagger.models.parameters.*; +import com.wordnik.swagger.models.properties.*; +import com.wordnik.swagger.util.Json; + +import org.apache.commons.lang.StringUtils; + +import java.util.*; + +public class DefaultCodegen { + protected String outputFolder = ""; + protected Set defaultIncludes = new HashSet(); + protected Map typeMapping = new HashMap(); + protected Map instantiationTypes = new HashMap(); + protected Set reservedWords = new HashSet(); + protected Set languageSpecificPrimitives = new HashSet(); + protected Map importMapping = new HashMap(); + protected String modelPackage = "", apiPackage = "", fileSuffix; + protected Map apiTemplateFiles = new HashMap(); + protected Map modelTemplateFiles = new HashMap(); + protected String templateDir; + protected Map additionalProperties = new HashMap(); + protected List supportingFiles = new ArrayList(); + + public void processOpts(){ + if(additionalProperties.containsKey("templateDir")) { + this.setTemplateDir((String)additionalProperties.get("templateDir")); + } + } + + // override with any special post-processing + public Map postProcessModels(Map objs) { + return objs; + } + + // override with any special post-processing + public Map postProcessOperations(Map objs) { + return objs; + } + + // override with any special handling of the entire swagger spec + public void processSwagger(Swagger swagger) {} + + // override with any special text escaping logic + public String escapeText(String input) { + if(input != null) { + String output = input.replaceAll("\n", " "); + output = output.replace("\"", "\\\""); + return output; + } + return input; + } + + public Set defaultIncludes() { + return defaultIncludes; + } + public Map typeMapping() { + return typeMapping; + } + public Map instantiationTypes() { + return instantiationTypes; + } + public Set reservedWords() { + return reservedWords; + } + public Set languageSpecificPrimitives() { + return languageSpecificPrimitives; + } + public Map importMapping() { + return importMapping; + } + public String modelPackage() { + return modelPackage; + } + public String apiPackage() { + return apiPackage; + } + public String fileSuffix() { + return fileSuffix; + } + public String templateDir() { + return templateDir; + } + public Map apiTemplateFiles() { + return apiTemplateFiles; + } + public Map modelTemplateFiles() { + return modelTemplateFiles; + } + + public String apiFileFolder() { + return outputFolder + "/" + apiPackage().replaceAll("\\.", "/"); + } + + public String modelFileFolder() { + return outputFolder + "/" + modelPackage().replaceAll("\\.", "/"); + } + + public Map additionalProperties() { + return additionalProperties; + } + public List supportingFiles() { + return supportingFiles; + } + public String outputFolder() { + return outputFolder; + } + + public void setOutputDir(String dir) { + this.outputFolder = dir; + } + public String getOutputDir() { + return outputFolder(); + } + + public void setTemplateDir(String templateDir) { + this.templateDir = templateDir; + } + + public String toApiFilename(String name) { + return initialCaps(name) + "Api"; + } + + public String toModelFilename(String name) { + return name; + } + + public String toVarName(String name) { + if(reservedWords.contains(name)) + return escapeReservedWord(name); + else + return name; + } + + public String toParamName(String name) { + if(reservedWords.contains(name)) { + return escapeReservedWord(name); + } + return name; + } + + public String escapeReservedWord(String name) { + throw new RuntimeException("reserved word " + name + " not allowed"); + } + + public String toModelImport(String name) { + if("".equals(modelPackage())) + return name; + else + return modelPackage() + "." + name; + } + + public String toApiImport(String name) { + return apiPackage() + "." + name; + } + + public DefaultCodegen() { + defaultIncludes = new HashSet( + Arrays.asList("double", + "int", + "long", + "short", + "char", + "float", + "String", + "boolean", + "Boolean", + "Double", + "Void", + "Integer", + "Long", + "Float") + ); + + typeMapping = new HashMap(); + typeMapping.put("array", "List"); + typeMapping.put("map", "Map"); + typeMapping.put("List", "List"); + typeMapping.put("boolean", "Boolean"); + typeMapping.put("string", "String"); + typeMapping.put("int", "Integer"); + typeMapping.put("float", "Float"); + typeMapping.put("number", "BigDecimal"); + typeMapping.put("DateTime", "Date"); + typeMapping.put("long", "Long"); + typeMapping.put("short", "Short"); + typeMapping.put("char", "String"); + typeMapping.put("double", "Double"); + typeMapping.put("object", "Object"); + typeMapping.put("integer", "Integer"); + + instantiationTypes = new HashMap(); + + reservedWords = new HashSet(); + + importMapping = new HashMap(); + importMapping.put("BigDecimal", "java.math.BigDecimal"); + importMapping.put("UUID", "java.util.UUID"); + importMapping.put("File", "java.io.File"); + importMapping.put("Date", "java.util.Date"); + importMapping.put("Timestamp", "java.sql.Timestamp"); + importMapping.put("Map", "java.util.Map"); + importMapping.put("HashMap", "java.util.HashMap"); + importMapping.put("Array", "java.util.List"); + importMapping.put("ArrayList", "java.util.ArrayList"); + importMapping.put("List", "java.util.*"); + importMapping.put("Set", "java.util.*"); + importMapping.put("DateTime", "org.joda.time.*"); + importMapping.put("LocalDateTime", "org.joda.time.*"); + importMapping.put("LocalDate", "org.joda.time.*"); + importMapping.put("LocalTime", "org.joda.time.*"); + } + + public String toInstantiationType(Property p) { + if (p instanceof MapProperty) { + MapProperty ap = (MapProperty) p; + String inner = getSwaggerType(ap.getAdditionalProperties()); + return instantiationTypes.get("map") + ""; + } + else if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + String inner = getSwaggerType(ap.getItems()); + return instantiationTypes.get("array") + "<" + inner + ">"; + } + else + return null; + } + + public String toDefaultValue(Property p) { + if(p instanceof StringProperty) + return "null"; + else if (p instanceof BooleanProperty) + return "null"; + else if(p instanceof DateProperty) + return "null"; + else if(p instanceof DateTimeProperty) + return "null"; + else if (p instanceof DoubleProperty) + return "null"; + else if (p instanceof FloatProperty) + return "null"; + else if (p instanceof IntegerProperty) + return "null"; + else if (p instanceof LongProperty) + return "null"; + else if (p instanceof MapProperty) { + MapProperty ap = (MapProperty) p; + String inner = getSwaggerType(ap.getAdditionalProperties()); + return "new HashMap() "; + } + else if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + String inner = getSwaggerType(ap.getItems()); + return "new ArrayList<" + inner + ">() "; + } + else + return "null"; + } + + /** + * returns the swagger type for the property + **/ + public String getSwaggerType(Property p) { + String datatype = null; + if(p instanceof StringProperty) + datatype = "string"; + else if (p instanceof BooleanProperty) + datatype = "boolean"; + else if(p instanceof DateProperty) + datatype = "date"; + else if(p instanceof DateTimeProperty) + datatype = "DateTime"; + else if (p instanceof DoubleProperty) + datatype = "double"; + else if (p instanceof FloatProperty) + datatype = "float"; + else if (p instanceof IntegerProperty) + datatype = "integer"; + else if (p instanceof LongProperty) + datatype = "long"; + else if (p instanceof MapProperty) + datatype = "map"; + else if (p instanceof DecimalProperty) + datatype = "number"; + else if (p instanceof RefProperty) { + RefProperty r = (RefProperty)p; + datatype = r.get$ref(); + if(datatype.indexOf("#/definitions/") == 0) + datatype = datatype.substring("#/definitions/".length()); + } + else { + if(p != null) datatype = p.getType(); + } + return datatype; + } + + public String initialCaps(String name) { + return Character.toUpperCase(name.charAt(0)) + name.substring(1); + } + + public String getTypeDeclaration(String name) { + return name; + } + + public String getTypeDeclaration(Property p) { + String swaggerType = getSwaggerType(p); + if(typeMapping.containsKey(swaggerType)) + return typeMapping.get(swaggerType); + return swaggerType; + } + + public String toApiName(String name) { + if(name.length() == 0) + return "DefaultApi"; + return initialCaps(name) + "Api"; + } + + public String toModelName(String name) { + return initialCaps(name); + } + + public CodegenModel fromModel(String name, Model model) { + CodegenModel m = CodegenModelFactory.newInstance(CodegenModelType.MODEL); + if(reservedWords.contains(name)) + m.name = escapeReservedWord(name); + else + m.name = name; + m.description = model.getDescription(); + m.classname = toModelName(name); + m.classVarName = toVarName(name); + m.modelJson = Json.pretty(model); + m.externalDocs = model.getExternalDocs(); + int count = 0; + if(model instanceof ArrayModel) { + ArrayModel am = (ArrayModel) model; + ArrayProperty arrayProperty = new ArrayProperty(am.getItems()); + CodegenProperty cp = fromProperty(name, arrayProperty); + if(cp.complexType != null && !defaultIncludes.contains(cp.complexType)) + m.imports.add(cp.complexType); + m.parent = toInstantiationType(arrayProperty); + String containerType = cp.containerType; + if(instantiationTypes.containsKey(containerType)) + m.imports.add(instantiationTypes.get(containerType)); + if(typeMapping.containsKey(containerType)) { + containerType = typeMapping.get(containerType); + cp.containerType = containerType; + m.imports.add(containerType); + } + } + else if (model instanceof RefModel) { + // TODO + } + else { + ModelImpl impl = (ModelImpl) model; + if(impl.getAdditionalProperties() != null) { + MapProperty mapProperty = new MapProperty(impl.getAdditionalProperties()); + CodegenProperty cp = fromProperty(name, mapProperty); + if(cp.complexType != null && !defaultIncludes.contains(cp.complexType)) + m.imports.add(cp.complexType); + m.parent = toInstantiationType(mapProperty); + String containerType = cp.containerType; + if(instantiationTypes.containsKey(containerType)) + m.imports.add(instantiationTypes.get(containerType)); + if(typeMapping.containsKey(containerType)) { + containerType = typeMapping.get(containerType); + cp.containerType = containerType; + m.imports.add(containerType); + } + } + if(impl.getProperties() != null && impl.getProperties().size() > 0) { + m.hasVars = true; + for(String key: impl.getProperties().keySet()) { + Property prop = impl.getProperties().get(key); + + if(prop == null) { + System.out.println("null property for " + key); + } + else { + CodegenProperty cp = fromProperty(key, prop); + cp.required = false; + if(impl.getRequired() != null) { + for(String req : impl.getRequired()) { + if(key.equals(req)) + cp.required = true; + } + } + if(cp.complexType != null && !defaultIncludes.contains(cp.complexType)) { + m.imports.add(cp.complexType); + } + m.vars.add(cp); + count += 1; + if(count != impl.getProperties().keySet().size()) + cp.hasMore = new Boolean(true); + if(cp.isContainer != null) { + String arrayImport = typeMapping.get("array"); + if(arrayImport != null && + !languageSpecificPrimitives.contains(arrayImport) && + !defaultIncludes.contains(arrayImport)) + m.imports.add(arrayImport); + } + + if(cp.complexType != null && + !languageSpecificPrimitives.contains(cp.complexType) && + !defaultIncludes.contains(cp.complexType)) + m.imports.add(cp.complexType); + + if(cp.baseType != null && + !languageSpecificPrimitives.contains(cp.baseType) && + !defaultIncludes.contains(cp.baseType)) + m.imports.add(cp.baseType); + } + } + } + else { + m.emptyVars = true; + } + } + return m; + } + + public CodegenProperty fromProperty(String name, Property p) { + if(p == null) { + System.out.println("unexpected missing property for name " + null); + return null; + } + CodegenProperty property = CodegenModelFactory.newInstance(CodegenModelType.PROPERTY); + + property.name = toVarName(name); + property.baseName = name; + property.description = escapeText(p.getDescription()); + property.getter = "get" + initialCaps(name); + property.setter = "set" + initialCaps(name); + property.example = p.getExample(); + property.defaultValue = toDefaultValue(p); + + String type = getSwaggerType(p); + + if(p instanceof AbstractNumericProperty) { + AbstractNumericProperty np = (AbstractNumericProperty) p; + property.minimum = np.getMinimum(); + property.maximum = np.getMaximum(); + property.exclusiveMinimum = np.getExclusiveMinimum(); + property.exclusiveMaximum = np.getExclusiveMaximum(); + + // legacy support + Map allowableValues = new HashMap(); + if(np.getMinimum() != null) + allowableValues.put("min", np.getMinimum()); + if(np.getMaximum() != null) + allowableValues.put("max", np.getMaximum()); + property.allowableValues = allowableValues; + } + + if(p instanceof StringProperty) { + StringProperty sp = (StringProperty) p; + property.maxLength = sp.getMaxLength(); + property.minLength = sp.getMinLength(); + property.pattern = sp.getPattern(); + if(sp.getEnum() != null) { + List _enum = sp.getEnum(); + property._enum = _enum; + property.isEnum = true; + + // legacy support + Map allowableValues = new HashMap(); + allowableValues.put("values", _enum); + property.allowableValues = allowableValues; + } + } + + property.datatype = property.isEnum + ? StringUtils.capitalize(property.name) + "Enum" + : getTypeDeclaration(p); + property.baseType = getSwaggerType(p); + + if(p instanceof ArrayProperty) { + property.isContainer = true; + property.containerType = "array"; + ArrayProperty ap = (ArrayProperty) p; + CodegenProperty cp = fromProperty("inner", ap.getItems()); + if(cp == null) { + System.out.println("skipping invalid property:"); + Json.prettyPrint(p); + } + else { + property.baseType = getSwaggerType(p); + if(!languageSpecificPrimitives.contains(cp.baseType)) + property.complexType = cp.baseType; + else + property.isPrimitiveType = true; + } + } + else if(p instanceof MapProperty) { + property.isContainer = true; + property.containerType = "map"; + MapProperty ap = (MapProperty) p; + CodegenProperty cp = fromProperty("inner", ap.getAdditionalProperties()); + + property.baseType = getSwaggerType(p); + if(!languageSpecificPrimitives.contains(cp.baseType)) + property.complexType = cp.baseType; + else + property.isPrimitiveType = true; + } + else { + property.isNotContainer = true; + if(languageSpecificPrimitives().contains(type)) + property.isPrimitiveType = true; + else + property.complexType = property.baseType; + } + return property; + } + + public CodegenOperation fromOperation(String path, String httpMethod, Operation operation){ + CodegenOperation op = CodegenModelFactory.newInstance(CodegenModelType.OPERATION); + Set imports = new HashSet(); + + String operationId = operation.getOperationId(); + if(operationId == null) { + String tmpPath = path; + tmpPath = tmpPath.replaceAll("\\{", ""); + tmpPath = tmpPath.replaceAll("\\}", ""); + String[] parts = (tmpPath + "/" + httpMethod).split("/"); + StringBuilder builder = new StringBuilder(); + if("/".equals(tmpPath)) { + // must be root tmpPath + builder.append("root"); + } + for(int i = 0; i < parts.length; i++) { + String part = parts[i]; + if(part.length() > 0) { + if(builder.toString().length() == 0) + part = Character.toLowerCase(part.charAt(0)) + part.substring(1); + else + part = initialCaps(part); + builder.append(part); + } + } + operationId = builder.toString(); + System.out.println("generated operationId " + operationId); + } + op.path = path; + op.operationId = operationId; + op.summary = escapeText(operation.getSummary()); + op.notes = escapeText(operation.getDescription()); + op.tags = operation.getTags(); + + Response methodResponse = null; + + if(operation.getConsumes() != null && operation.getConsumes().size() > 0) { + List> c = new ArrayList>(); + int count = 0; + for(String key: operation.getConsumes()) { + Map mediaType = new HashMap(); + mediaType.put("mediaType", key); + count += 1; + if (count < operation.getConsumes().size()) + mediaType.put("hasMore", "true"); + c.add(mediaType); + } + op.consumes = c; + op.hasConsumes = true; + } + + if(operation.getProduces() != null && operation.getProduces().size() > 0) { + List> c = new ArrayList>(); + int count = 0; + for(String key: operation.getProduces()) { + Map mediaType = new HashMap(); + mediaType.put("mediaType", key); + count += 1; + if (count < operation.getProduces().size()) + mediaType.put("hasMore", "true"); + c.add(mediaType); + } + op.produces = c; + op.hasProduces = true; + } + + if(operation.getResponses() != null) { + for(String responseCode: new TreeSet(operation.getResponses().keySet())) { + Response response = operation.getResponses().get(responseCode); + if (responseCode.startsWith("2")) { + // use the first, i.e. the smallest 2xx response status as methodResponse + methodResponse = response; + break; + } + } + if(methodResponse == null && operation.getResponses().keySet().contains("default")) { + methodResponse = operation.getResponses().get("default"); + } + for(String responseCode: operation.getResponses().keySet()) { + Response response = operation.getResponses().get(responseCode); + if(response != methodResponse) { + CodegenResponse r = fromResponse(responseCode, response); + op.responses.add(r); + } + for(int i = 0; i < op.responses.size() - 1; i++) { + CodegenResponse r = op.responses.get(i); + r.hasMore = new Boolean(true); + } + } + } + + if(methodResponse != null) { + if (methodResponse.getSchema() != null) { + CodegenProperty cm = fromProperty("response", methodResponse.getSchema()); + + Property responseProperty = methodResponse.getSchema(); + + if(responseProperty instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) responseProperty; + CodegenProperty innerProperty = fromProperty("response", ap.getItems()); + op.returnBaseType = innerProperty.baseType; + } + else { + if(cm.complexType != null) + op.returnBaseType = cm.complexType; + else + op.returnBaseType = cm.baseType; + } + op.examples = toExamples(methodResponse.getExamples()); + op.defaultResponse = toDefaultValue(responseProperty); + op.returnType = cm.datatype; + if(cm.isContainer != null) { + op.returnContainer = cm.complexType; + } + else + op.returnSimpleType = true; + if (languageSpecificPrimitives().contains(op.returnBaseType) || op.returnBaseType == null) + op.returnTypeIsPrimitive = true; + } + addHeaders(methodResponse, op.responseHeaders); + } + + if(op.returnBaseType == null) { + op.returnTypeIsPrimitive = true; + op.returnSimpleType = true; + } + + if(op.returnBaseType != null && + !defaultIncludes.contains(op.returnBaseType) && + !languageSpecificPrimitives.contains(op.returnBaseType)) + imports.add(op.returnBaseType); + + List parameters = operation.getParameters(); + CodegenParameter bodyParam = null; + List allParams = new ArrayList(); + List bodyParams = new ArrayList(); + List pathParams = new ArrayList(); + List queryParams = new ArrayList(); + List headerParams = new ArrayList(); + List cookieParams = new ArrayList(); + List formParams = new ArrayList(); + + if(parameters != null) { + for(Parameter param : parameters) { + CodegenParameter p = fromParameter(param, imports); + allParams.add(p); + if(param instanceof QueryParameter) { + p.isQueryParam = new Boolean(true); + queryParams.add(p.copy()); + } + else if(param instanceof PathParameter) { + p.required = true; + p.isPathParam = new Boolean(true); + pathParams.add(p.copy()); + } + else if(param instanceof HeaderParameter) { + p.isHeaderParam = new Boolean(true); + headerParams.add(p.copy()); + } + else if(param instanceof CookieParameter) { + p.isCookieParam = new Boolean(true); + cookieParams.add(p.copy()); + } + else if(param instanceof BodyParameter) { + p.isBodyParam = new Boolean(true); + bodyParam = p; + bodyParams.add(p.copy()); + } + else if(param instanceof FormParameter) { + if("file".equals(p.dataType)) + p.isFile = true; + else + p.notFile = true; + p.isFormParam = new Boolean(true); + formParams.add(p.copy()); + } + } + } + for(String i: imports) { + if(!defaultIncludes.contains(i) && !languageSpecificPrimitives.contains(i)){ + op.imports.add(i); + } + } + op.bodyParam = bodyParam; + op.httpMethod = httpMethod.toUpperCase(); + op.allParams = addHasMore(allParams); + op.bodyParams = addHasMore(bodyParams); + op.pathParams = addHasMore(pathParams); + op.queryParams = addHasMore(queryParams); + op.headerParams = addHasMore(headerParams); + // op.cookieParams = cookieParams; + op.formParams = addHasMore(formParams); + // legacy support + op.nickname = operationId; + + if(op.allParams.size() > 0) + op.hasParams = true; + op.externalDocs = operation.getExternalDocs(); + + return op; + } + + public CodegenResponse fromResponse(String responseCode, Response response) { + CodegenResponse r = CodegenModelFactory.newInstance(CodegenModelType.RESPONSE); + if("default".equals(responseCode)) + r.code = "0"; + else + r.code = responseCode; + r.message = response.getDescription(); + r.schema = response.getSchema(); + r.examples = toExamples(response.getExamples()); + return r; + } + + public CodegenParameter fromParameter(Parameter param, Set imports) { + CodegenParameter p = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER); + p.baseName = param.getName(); + p.description = param.getDescription(); + p.required = param.getRequired(); + + if(param instanceof SerializableParameter) { + SerializableParameter qp = (SerializableParameter) param; + Property property = null; + String collectionFormat = null; + if("array".equals(qp.getType())) { + Property inner = qp.getItems(); + if(inner == null) { + System.out.println("warning! No inner type supplied for array parameter \"" + qp.getName() + "\", using String"); + inner = new StringProperty().description("//TODO automatically added by swagger-codegen"); + } + property = new ArrayProperty(inner); + collectionFormat = qp.getCollectionFormat(); + CodegenProperty pr = fromProperty("inner", inner); + p.baseType = pr.datatype; + imports.add(pr.baseType); + } + else + property = PropertyBuilder.build(qp.getType(), qp.getFormat(), null); + if(property == null) { + System.out.println("warning! Property type \"" + qp.getType() + "\" not found for parameter \"" + param.getName() + "\", using String"); + property = new StringProperty().description("//TODO automatically added by swagger-codegen. Type was " + qp.getType() + " but not supported"); + } + CodegenProperty model = fromProperty(qp.getName(), property); + p.collectionFormat = collectionFormat; + p.dataType = model.datatype; + p.paramName = toParamName(qp.getName()); + + if(model.complexType != null) { + imports.add(model.complexType); + } + } + else { + BodyParameter bp = (BodyParameter) param; + Model model = bp.getSchema(); + + if(model instanceof ModelImpl) { + ModelImpl impl = (ModelImpl) model; + CodegenModel cm = fromModel(bp.getName(), impl); + if(cm.emptyVars != null && cm.emptyVars == false) { + p.dataType = getTypeDeclaration(cm.classname); + imports.add(p.dataType); + } + else { + // TODO: missing format, so this will not always work + Property prop = PropertyBuilder.build(impl.getType(), null, null); + CodegenProperty cp = fromProperty("property", prop); + if(cp != null) { + p.dataType = cp.datatype; + } + } + } + else if(model instanceof ArrayModel) { + // to use the built-in model parsing, we unwrap the ArrayModel + // and get a single property from it + ArrayModel impl = (ArrayModel) model; + CodegenModel cm = fromModel(bp.getName(), impl); + // get the single property + ArrayProperty ap = new ArrayProperty().items(impl.getItems()); + CodegenProperty cp = fromProperty("inner", ap); + if(cp.complexType != null) { + imports.add(cp.complexType); + } + imports.add(cp.baseType); + p.dataType = cp.datatype; + p.isContainer = true; + } + else{ + Model sub = bp.getSchema(); + if(sub instanceof RefModel) { + String name = ((RefModel)sub).getSimpleRef(); + if(typeMapping.containsKey(name)) + name = typeMapping.get(name); + else { + name = toModelName(name); + if(defaultIncludes.contains(name)) { + imports.add(name); + } + imports.add(name); + name = getTypeDeclaration(name); + } + p.dataType = name; + } + } + p.paramName = toParamName(bp.getName()); + } + return p; + } + + protected List> toExamples(Map examples) { + if(examples == null) + return null; + + List> output = new ArrayList>(); + for(String key: examples.keySet()) { + String value = examples.get(key); + + Map kv = new HashMap(); + kv.put("contentType", key); + kv.put("example", value); + output.add(kv); + } + return output; + } + + private void addHeaders(Response response, List target) { + if (response.getHeaders() != null) { + for (Map.Entry headers : response.getHeaders().entrySet()) { + target.add(fromProperty(headers.getKey(), headers.getValue())); + } + } + } + + private List addHasMore(List objs) { + if(objs != null) { + for(int i = 0; i < objs.size(); i++) { + if(i > 0) + objs.get(i).secondaryParam = new Boolean(true); + if(i < objs.size() - 1) + objs.get(i).hasMore = new Boolean(true); + } + } + return objs; + } + + private Map addHasMore(Map objs) { + if(objs != null) { + for(int i = 0; i < objs.size() - 1; i++) { + if(i > 0) + objs.put("secondaryParam", new Boolean(true)); + if(i < objs.size() - 1) + objs.put("hasMore", true); + } + } + return objs; + } + + + public void addOperationToGroup(String tag, String resourcePath, Operation operation, CodegenOperation co, Map> operations) { + List opList = operations.get(tag); + if(opList == null) { + opList = new ArrayList(); + operations.put(tag, opList); + } + opList.add(co); + co.baseName = tag; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultGenerator.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultGenerator.java new file mode 100644 index 000000000000..d852adfec83b --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultGenerator.java @@ -0,0 +1,371 @@ +package com.wordnik.swagger.codegen; + +import com.wordnik.swagger.models.*; +import com.wordnik.swagger.util.*; +import com.samskivert.mustache.*; + +import org.apache.commons.io.FileUtils; + +import java.util.*; +import java.util.regex.*; +import java.io.*; + +public class DefaultGenerator implements Generator { + private CodegenConfig config; + private ClientOptInput opts = null; + private Swagger swagger = null; + + public Generator opts(ClientOptInput opts) { + this.opts = opts; + + this.swagger = opts.getSwagger(); + ClientOpts clientOpts = opts.getOpts(); + this.config = opts.getConfig(); + this.config.additionalProperties().putAll(clientOpts.getProperties()); + + return this; + } + + public void generate() { + if(swagger == null || config == null) { + throw new RuntimeException("missing swagger input or config!"); + } + if(System.getProperty("debugSwagger") != null) { + Json.prettyPrint(swagger); + } + try { + config.processOpts(); + if(swagger.getInfo() != null) { + Info info = swagger.getInfo(); + if(info.getTitle() != null) + config.additionalProperties().put("appName", info.getTitle()); + if(info.getDescription() != null) + config.additionalProperties().put("appDescription", info.getDescription()); + if(info.getContact() != null) { + Contact contact = info.getContact(); + config.additionalProperties().put("infoUrl", contact.getUrl()); + if(contact.getEmail() != null) + config.additionalProperties().put("infoEmail", contact.getEmail()); + } + if(info.getLicense() != null) { + License license = info.getLicense(); + if(license.getName() != null) + config.additionalProperties().put("licenseInfo", license.getName()); + if(license.getUrl() != null) + config.additionalProperties().put("licenseUrl", license.getUrl()); + } + } + + StringBuilder hostBuilder = new StringBuilder(); + if(swagger.getSchemes() != null && swagger.getSchemes().size() > 0) { + hostBuilder.append(swagger.getSchemes().get(0).toValue()); + hostBuilder.append("://"); + } + else + hostBuilder.append("https://"); + hostBuilder.append(swagger.getHost()).append(swagger.getBasePath()); + String basePath = hostBuilder.toString(); + + List allOperations = new ArrayList(); + List allModels = new ArrayList(); + + // models + Map definitions = swagger.getDefinitions(); + for(String name: definitions.keySet()) { + Model model = definitions.get(name); + Map modelMap = new HashMap(); + modelMap.put(name, model); + Map models = processModels(config, modelMap); + models.putAll(config.additionalProperties()); + + allModels.add(((List)models.get("models")).get(0)); + + for(String templateName : config.modelTemplateFiles().keySet()) { + String suffix = config.modelTemplateFiles().get(templateName); + String filename = config.modelFileFolder() + File.separator + config.toModelFilename(name) + suffix; + String template = readTemplate(config.templateDir() + File.separator + templateName); + Template tmpl = Mustache.compiler() + .withLoader(new Mustache.TemplateLoader() { + public Reader getTemplate (String name) { + return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); + }; + }) + .defaultValue("") + .compile(template); + writeToFile(filename, tmpl.execute(models)); + } + } + if(System.getProperty("debugModels") != null) { + System.out.println("############ Model info ############"); + Json.prettyPrint(allModels); + } + + // apis + Map> paths = processPaths(swagger.getPaths()); + for(String tag : paths.keySet()) { + List ops = paths.get(tag); + Map operation = processOperations(config, tag, ops); + operation.put("basePath", basePath); + operation.put("baseName", tag); + operation.put("modelPackage", config.modelPackage()); + operation.putAll(config.additionalProperties()); + operation.put("classname", config.toApiName(tag)); + allOperations.add(operation); + for(String templateName : config.apiTemplateFiles().keySet()) { + String suffix = config.apiTemplateFiles().get(templateName); + String filename = config.apiFileFolder() + + File.separator + + config.toApiFilename(tag) + + suffix; + + String template = readTemplate(config.templateDir() + File.separator + templateName); + Template tmpl = Mustache.compiler() + .withLoader(new Mustache.TemplateLoader() { + public Reader getTemplate (String name) { + return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); + }; + }) + .defaultValue("") + .compile(template); + + writeToFile(filename, tmpl.execute(operation)); + } + } + if(System.getProperty("debugOperations") != null) { + System.out.println("############ Operation info ############"); + Json.prettyPrint(allOperations); + } + + // supporting files + Map bundle = new HashMap(); + bundle.putAll(config.additionalProperties()); + bundle.put("apiPackage", config.apiPackage()); + + Map apis = new HashMap(); + apis.put("apis", allOperations); + if(swagger.getBasePath() != null) { + bundle.put("basePath", swagger.getBasePath()); + } + bundle.put("apiInfo", apis); + bundle.put("models", allModels); + bundle.put("apiFolder", config.apiPackage().replaceAll("\\.", "/")); + bundle.put("modelPackage", config.modelPackage()); + if (swagger.getExternalDocs() != null) { + bundle.put("externalDocs", swagger.getExternalDocs()); + } + for(int i = 0; i < allModels.size() - 1; i++) { + HashMap cm = (HashMap) allModels.get(i); + CodegenModel m = cm.get("model"); + m.hasMoreModels = true; + } + + if(System.getProperty("debugSupportingFiles") != null) { + System.out.println("############ Supporting file info ############"); + Json.prettyPrint(bundle); + } + + for(SupportingFile support : config.supportingFiles()) { + String outputFolder = config.outputFolder(); + if(support.folder != null && !"".equals(support.folder)) + outputFolder += File.separator + support.folder; + File of = new File(outputFolder); + if(!of.isDirectory()) + of.mkdirs(); + String outputFilename = outputFolder + File.separator + support.destinationFilename; + + if(support.templateFile.endsWith("mustache")) { + String template = readTemplate(config.templateDir() + File.separator + support.templateFile); + Template tmpl = Mustache.compiler() + .withLoader(new Mustache.TemplateLoader() { + public Reader getTemplate (String name) { + return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); + }; + }) + .defaultValue("") + .compile(template); + + writeToFile(outputFilename, tmpl.execute(bundle)); + } + else { + String template = readTemplate(config.templateDir() + File.separator + support.templateFile); + FileUtils.writeStringToFile(new File(outputFilename), template); + System.out.println("copying file to " + outputFilename); + } + } + + config.processSwagger(swagger); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + public Map> processPaths(Map paths) { + Map> ops = new HashMap>(); + List tags = null; + + for(String resourcePath : paths.keySet()) { + Path path = paths.get(resourcePath); + processOperation(resourcePath, "get", path.getGet(), ops); + processOperation(resourcePath, "put", path.getPut(), ops); + processOperation(resourcePath, "post", path.getPost(), ops); + processOperation(resourcePath, "delete", path.getDelete(), ops); + processOperation(resourcePath, "patch", path.getPatch(), ops); + processOperation(resourcePath, "options", path.getOptions(), ops); + } + return ops; + } + + public void processOperation(String resourcePath, String httpMethod, Operation operation, Map> operations) { + if(operation != null) { + List tags = operation.getTags(); + if(tags == null) { + tags = new ArrayList(); + tags.add("default"); + } + + for(String tag : tags) { + CodegenOperation co = config.fromOperation(resourcePath, httpMethod, operation); + co.tags = new ArrayList(); + co.tags.add(sanitizeTag(tag)); + + config.addOperationToGroup(sanitizeTag(tag), resourcePath, operation, co, operations); + } + } + } + + protected String sanitizeTag(String tag) { + // remove spaces and make strong case + String [] parts = tag.split(" "); + StringBuffer buf = new StringBuffer(); + for(String part: parts) { + if(!"".equals(part)) { + buf.append(Character.toUpperCase(part.charAt(0))); + if(part.length() > 1) + buf.append(part.substring(1)); + } + } + return buf.toString().replaceAll("[^a-zA-Z ]", ""); + } + + public File writeToFile(String filename, String contents) throws IOException { + System.out.println("writing file " + filename); + File output = new File(filename); + + if(output.getParent() != null && !new File(output.getParent()).exists()) { + File parent = new File(output.getParent()); + parent.mkdirs(); + } + Writer out = new BufferedWriter(new OutputStreamWriter( + new FileOutputStream(output), "UTF-8")); + + out.write(contents); + out.close(); + return output; + } + + public String readTemplate(String name) { + try{ + Reader reader = getTemplateReader(name); + if(reader == null) + throw new RuntimeException("no file found"); + java.util.Scanner s = new java.util.Scanner(reader).useDelimiter("\\A"); + return s.hasNext() ? s.next() : ""; + } + catch(Exception e) { + e.printStackTrace(); + } + throw new RuntimeException("can't load template " + name); + } + + public Reader getTemplateReader(String name) { + try{ + InputStream is = this.getClass().getClassLoader().getResourceAsStream(getCPResourcePath(name)); + if(is == null) + is = new FileInputStream(new File(name)); + if(is == null) + throw new RuntimeException("no file found"); + return new InputStreamReader(is); + } + catch(Exception e) { + e.printStackTrace(); + } + throw new RuntimeException("can't load template " + name); + } + + private String getCPResourcePath(String name) { + if (!"/".equals(File.separator)) + return name.replaceAll(Pattern.quote(File.separator), "/"); + return name; + } + +public Map processOperations(CodegenConfig config, String tag, List ops) { + Map operations = new HashMap(); + Map objs = new HashMap(); + objs.put("classname", config.toApiName(tag)); + objs.put("operation", ops); + operations.put("operations", objs); + operations.put("package", config.apiPackage()); + + Set allImports = new HashSet(); + for(CodegenOperation op: ops) { + allImports.addAll(op.imports); + } + + List> imports = new ArrayList>(); + for(String i: allImports) { + Map im = new HashMap(); + String m = config.importMapping().get(i); + if(m == null) + m = config.toModelImport(i); + if(m != null) { + im.put("import", m); + imports.add(im); + } + } + + operations.put("imports", imports); + config.postProcessOperations(operations); + return operations; + } + + public Map processModels(CodegenConfig config, Map definitions) { + Map objs = new HashMap(); + objs.put("package", config.modelPackage()); + List models = new ArrayList(); + List model = new ArrayList(); + Set allImports = new HashSet(); + for(String key: definitions.keySet()) { + Model mm = definitions.get(key); + CodegenModel cm = config.fromModel(key, mm); + Map mo = new HashMap(); + mo.put("model", cm); + models.add(mo); + allImports.addAll(cm.imports); + } + objs.put("models", models); + + List> imports = new ArrayList>(); + for(String i: allImports) { + Map im = new HashMap(); + String m = config.importMapping().get(i); + if(m == null) + m = config.toModelImport(i); + if(m != null && !config.defaultIncludes().contains(m)) { + im.put("import", m); + imports.add(im); + } + // add instantiation types + m = config.instantiationTypes().get(i); + if(m != null && !config.defaultIncludes().contains(m)) { + im.put("import", m); + imports.add(im); + } + } + + objs.put("imports", imports); + config.postProcessModels(objs); + + return objs; + } +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Generator.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Generator.java new file mode 100644 index 000000000000..929ae580991f --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Generator.java @@ -0,0 +1,8 @@ +package com.wordnik.swagger.codegen; + +import com.wordnik.swagger.models.Swagger; + +public interface Generator { + Generator opts(ClientOptInput opts); + void generate(); +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/SupportingFile.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/SupportingFile.java new file mode 100644 index 000000000000..85f08bfa70c3 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/SupportingFile.java @@ -0,0 +1,13 @@ +package com.wordnik.swagger.codegen; + +public class SupportingFile { + public String templateFile; + public String folder; + public String destinationFilename; + + public SupportingFile(String templateFile, String folder, String destinationFilename) { + this.templateFile = templateFile; + this.folder = folder; + this.destinationFilename = destinationFilename; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/auth/AuthMethod.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/auth/AuthMethod.java new file mode 100644 index 000000000000..7de102ec3501 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/auth/AuthMethod.java @@ -0,0 +1,6 @@ +package com.wordnik.swagger.codegen.auth; + +public interface AuthMethod { + String getType(); + void setType(String type); +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/haproxy.cfg b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/haproxy.cfg new file mode 100644 index 000000000000..9fd8d61f2ce1 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/haproxy.cfg @@ -0,0 +1,86 @@ +#--------------------------------------------------------------------- +# Global settings +#--------------------------------------------------------------------- +global + log 127.0.0.1 local2 + chroot /var/lib/haproxy + pidfile /var/run/haproxy.pid + maxconn 4000 + user haproxy + group haproxy + daemon + +#--------------------------------------------------------------------- +# common defaults that all the 'listen' and 'backend' sections will +# use if not designated in their block +#--------------------------------------------------------------------- +defaults + mode http + log global + option dontlognull + option httpclose + option httplog + option forwardfor + option redispatch + timeout connect 10000 # default 10 second time out if a backend is not found + timeout client 300000 + timeout server 300000 + maxconn 60000 + retries 3 + +#--------------------------------------------------------------------- +# main frontend which proxys to the backends +#--------------------------------------------------------------------- +frontend main *:80 + default_backend app + + acl is_swagger_online hdr_beg(host) -i online.swagger.io + acl is_swagger_io hdr_beg(host) -i swagger.io + acl is_old hdr_beg(host) -i swagger.wordnik.com + acl is_old_editor hdr_beg(host) -i editor.swagger.wordnik.com + acl is_validator_swagger path_beg /swagger.json + + # online spec validator + reqrep ([^\ ]*)\ /validator/(.*) \1\ /validator/validator/\2 if is_swagger_online + + # something that didn't work + reqrep ([^\ ]*)\ /swagger.json(.*) \1\ /validator/swagger.json if is_validator_swagger + + # swagger schema + reqrep ^([^\ :]*)\ /v2/schema.json(.*) \1\ /swagger-api/swagger-spec/master/schemas/v2.0/schema.json\2 + acl is_swagger_spec path_beg /swagger-api/swagger-spec + + # swagger docs + reqrep ^([^\ :]*)\ /swagger-core/documentation/annotations/apidocs/current(.*) \1\ /swagger-core/apidocs/\2 + acl is_swagger_docs path_beg /swagger-core/apidocs + + use_backend github_swagger_io if is_swagger_docs + use_backend validator if is_swagger_online + use_backend validator if is_validator_swagger + use_backend github_swagger_io if is_swagger_io !is_swagger_spec + use_backend github_swagger_spec if is_swagger_spec + + redirect location http://editor.swagger.io if is_old_editor + redirect location http://swagger.io if is_old + +#--------------------------------------------------------------------- +# round robin balancing between the various backends +#--------------------------------------------------------------------- +backend github_swagger_io + balance roundrobin + server gh1 swagger-api.github.io:80 check + +backend github_swagger_spec + http-request set-header Host raw.githubusercontent.com + rspirep ^Content-type:(.*) Content-Type:\ application/json + rspirep ^Access-Control-Allow-Origin:(.*) Access-Control-Allow-Origin:* + balance roundrobin + server gh2 raw.githubusercontent.com:443 check ssl verify none + +backend validator + balance roundrobin + server app1 127.0.0.1:8000 check + +backend app + balance roundrobin + server app1 127.0.0.1:8000 check diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/AndroidClientCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/AndroidClientCodegen.java new file mode 100644 index 000000000000..754ab46ac15d --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/AndroidClientCodegen.java @@ -0,0 +1,106 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class AndroidClientCodegen extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage = "com.wordnik.client"; + protected String groupId = "com.wordnik"; + protected String artifactId = "swagger-client"; + protected String artifactVersion = "1.0.0"; + protected String sourceFolder = "src/main/java"; + + public String getName() { + return "android"; + } + + public String getHelp() { + return "Generates an Android client library."; + } + + public AndroidClientCodegen() { + super(); + outputFolder = "generated-code/android"; + modelTemplateFiles.put("model.mustache", ".java"); + apiTemplateFiles.put("api.mustache", ".java"); + templateDir = "android-java"; + apiPackage = "com.wordnik.client.api"; + modelPackage = "com.wordnik.client.model"; + + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + + supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); + supportingFiles.add(new SupportingFile("apiInvoker.mustache", + (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "ApiInvoker.java")); + supportingFiles.add(new SupportingFile("httpPatch.mustache", + (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "HttpPatch.java")); + supportingFiles.add(new SupportingFile("jsonUtil.mustache", + (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "JsonUtil.java")); + supportingFiles.add(new SupportingFile("apiException.mustache", + (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "ApiException.java")); + + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "String", + "boolean", + "Boolean", + "Double", + "Integer", + "Long", + "Float", + "Object") + ); + instantiationTypes.put("array", "ArrayList"); + instantiationTypes.put("map", "HashMap"); + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + apiPackage().replaceAll("\\.", "/"); + } + + public String modelFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + modelPackage().replaceAll("\\.", "/"); + } + + @Override + public String getTypeDeclaration(Property p) { + if(p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + Property inner = ap.getItems(); + return getSwaggerType(p) + "<" + getTypeDeclaration(inner) + ">"; + } + else if (p instanceof MapProperty) { + MapProperty mp = (MapProperty) p; + Property inner = mp.getAdditionalProperties(); + + return getSwaggerType(p) + ""; + } + return super.getTypeDeclaration(p); + } + + @Override + public String getSwaggerType(Property p) { + String swaggerType = super.getSwaggerType(p); + String type = null; + if(typeMapping.containsKey(swaggerType)) { + type = typeMapping.get(swaggerType); + if(languageSpecificPrimitives.contains(type)) + return toModelName(type); + } + else + type = swaggerType; + return toModelName(type); + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JavaClientCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JavaClientCodegen.java new file mode 100644 index 000000000000..ab710431b78e --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JavaClientCodegen.java @@ -0,0 +1,115 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage = "io.swagger.client"; + protected String groupId = "io.swagger"; + protected String artifactId = "swagger-client"; + protected String artifactVersion = "1.0.0"; + protected String sourceFolder = "src/main/java"; + + public String getName() { + return "java"; + } + + public String getHelp() { + return "Generates a Java client library."; + } + + public JavaClientCodegen() { + super(); + outputFolder = "generated-code/java"; + modelTemplateFiles.put("model.mustache", ".java"); + apiTemplateFiles.put("api.mustache", ".java"); + templateDir = "Java"; + apiPackage = "io.swagger.client.api"; + modelPackage = "io.swagger.client.model"; + + reservedWords = new HashSet ( + Arrays.asList( + "abstract", "continue", "for", "new", "switch", "assert", + "default", "if", "package", "synchronized", "boolean", "do", "goto", "private", + "this", "break", "double", "implements", "protected", "throw", "byte", "else", + "import", "public", "throws", "case", "enum", "instanceof", "return", "transient", + "catch", "extends", "int", "short", "try", "char", "final", "interface", "static", + "void", "class", "finally", "long", "strictfp", "volatile", "const", "float", + "native", "super", "while") + ); + + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + + supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); + supportingFiles.add(new SupportingFile("apiInvoker.mustache", + (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "ApiInvoker.java")); + supportingFiles.add(new SupportingFile("JsonUtil.mustache", + (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "JsonUtil.java")); + supportingFiles.add(new SupportingFile("apiException.mustache", + (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "ApiException.java")); + + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "String", + "boolean", + "Boolean", + "Double", + "Integer", + "Long", + "Float", + "Object") + ); + instantiationTypes.put("array", "ArrayList"); + instantiationTypes.put("map", "HashMap"); + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + apiPackage().replaceAll("\\.", "/"); + } + + public String modelFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + modelPackage().replaceAll("\\.", "/"); + } + + @Override + public String getTypeDeclaration(Property p) { + if(p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + Property inner = ap.getItems(); + return getSwaggerType(p) + "<" + getTypeDeclaration(inner) + ">"; + } + else if (p instanceof MapProperty) { + MapProperty mp = (MapProperty) p; + Property inner = mp.getAdditionalProperties(); + + return getSwaggerType(p) + ""; + } + return super.getTypeDeclaration(p); + } + + @Override + public String getSwaggerType(Property p) { + String swaggerType = super.getSwaggerType(p); + String type = null; + if(typeMapping.containsKey(swaggerType)) { + type = typeMapping.get(swaggerType); + if(languageSpecificPrimitives.contains(type)) + return toModelName(type); + } + else + type = swaggerType; + return toModelName(type); + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JaxRSServerCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JaxRSServerCodegen.java new file mode 100644 index 000000000000..6c805e993c9e --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JaxRSServerCodegen.java @@ -0,0 +1,129 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.models.Operation; +import com.wordnik.swagger.models.Path; +import com.wordnik.swagger.util.Json; +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConfig { + protected String invokerPackage = "com.wordnik.api"; + protected String groupId = "com.wordnik"; + protected String artifactId = "swagger-server"; + protected String artifactVersion = "1.0.0"; + protected String sourceFolder = "src/main/java"; + protected String title = "Swagger Server"; + + public String getName() { + return "jaxrs"; + } + + public String getHelp() { + return "Generates a Java JAXRS Server application."; + } + + public JaxRSServerCodegen() { + super(); + outputFolder = "generated-code/javaJaxRS"; + modelTemplateFiles.put("model.mustache", ".java"); + apiTemplateFiles.put("api.mustache", ".java"); + templateDir = "JavaJaxRS"; + apiPackage = "com.wordnik.api"; + modelPackage = "com.wordnik.model"; + + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + additionalProperties.put("title", title); + + supportingFiles.clear(); + supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); + supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); + supportingFiles.add(new SupportingFile("ApiException.mustache", + (sourceFolder + File.separator + apiPackage).replace(".", java.io.File.separator), "ApiException.java")); + supportingFiles.add(new SupportingFile("ApiOriginFilter.mustache", + (sourceFolder + File.separator + apiPackage).replace(".", java.io.File.separator), "ApiOriginFilter.java")); + supportingFiles.add(new SupportingFile("ApiResponseMessage.mustache", + (sourceFolder + File.separator + apiPackage).replace(".", java.io.File.separator), "ApiResponseMessage.java")); + supportingFiles.add(new SupportingFile("NotFoundException.mustache", + (sourceFolder + File.separator + apiPackage).replace(".", java.io.File.separator), "NotFoundException.java")); + supportingFiles.add(new SupportingFile("web.mustache", + ("src/main/webapp/WEB-INF"), "web.xml")); + + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "String", + "boolean", + "Boolean", + "Double", + "Integer", + "Long", + "Float") + ); + } + + @Override + public void addOperationToGroup(String tag, String resourcePath, Operation operation, CodegenOperation co, Map> operations) { + String basePath = resourcePath; + if(basePath.startsWith("/")) + basePath = basePath.substring(1); + int pos = basePath.indexOf("/"); + if(pos > 0) + basePath = basePath.substring(0, pos); + + if(basePath == "") + basePath = "default"; + else { + if(co.path.startsWith("/" + basePath)) + co.path = co.path.substring(("/" + basePath).length()); + co.subresourceOperation = !co.path.isEmpty(); + } + List opList = operations.get(basePath); + if(opList == null) { + opList = new ArrayList(); + operations.put(basePath, opList); + } + opList.add(co); + co.baseName = basePath; + } + + public Map postProcessOperations(Map objs) { + Map operations = (Map)objs.get("operations"); + if(operations != null) { + List ops = (List) operations.get("operation"); + for(CodegenOperation operation : ops) { + if(operation.returnType == null) + operation.returnType = "Void"; + else if(operation.returnType.startsWith("List")) { + String rt = operation.returnType; + int end = rt.lastIndexOf(">"); + if(end > 0) { + operation.returnType = rt.substring("List<".length(), end); + operation.returnContainer = "List"; + } + } + else if(operation.returnType.startsWith("Map")) { + String rt = operation.returnType; + int end = rt.lastIndexOf(">"); + if(end > 0) { + operation.returnType = rt.substring("Map<".length(), end); + operation.returnContainer = "Map"; + } + } + else if(operation.returnType.startsWith("Set")) { + String rt = operation.returnType; + int end = rt.lastIndexOf(">"); + if(end > 0) { + operation.returnType = rt.substring("Set<".length(), end); + operation.returnContainer = "Set"; + } + } + } + } + return objs; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/NodeJSServerCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/NodeJSServerCodegen.java new file mode 100644 index 000000000000..b2f824989890 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/NodeJSServerCodegen.java @@ -0,0 +1,79 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage = "com.wordnik.client"; + protected String groupId = "com.wordnik"; + protected String artifactId = "swagger-client"; + protected String artifactVersion = "1.0.0"; + + public String getName() { + return "nodejs"; + } + + public String getHelp() { + return "Generates a node.js server application compatible with the 1.2 swagger specification."; + } + + public NodeJSServerCodegen() { + super(); + outputFolder = "generated-code/nodejs"; + apiTemplateFiles.put("api.mustache", ".js"); + templateDir = "nodejs"; + apiPackage = "app.apis"; + modelPackage = "app"; + + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + + supportingFiles.add(new SupportingFile("package.mustache", "", "package.json")); + supportingFiles.add(new SupportingFile("models.mustache", modelPackage, "models.js")); + supportingFiles.add(new SupportingFile("main.mustache", "", "main.js")); + supportingFiles.add(new SupportingFile("README.mustache", "", "README.js")); + + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "String", + "boolean", + "Boolean", + "Double", + "Integer", + "Long", + "Float") + ); + typeMapping.put("array", "array"); + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + File.separator + apiPackage().replaceAll("\\.", File.separator); + } + + public String modelFileFolder() { + return outputFolder + File.separator + modelPackage().replaceAll("\\.", File.separator); + } + + @Override + public String getSwaggerType(Property p) { + String swaggerType = super.getSwaggerType(p); + String type = null; + if(typeMapping.containsKey(swaggerType)) { + return typeMapping.get(swaggerType); + } + else + type = swaggerType; + return toModelName(type); + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ObjcClientCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ObjcClientCodegen.java new file mode 100644 index 000000000000..271c353b2336 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ObjcClientCodegen.java @@ -0,0 +1,216 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.util.Json; +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { + protected Set foundationClasses = new HashSet(); + protected String sourceFolder = "client"; + protected static String PREFIX = "SWG"; + + public String getName() { + return "objc"; + } + + public String getHelp() { + return "Generates an Objective-C client library."; + } + + public ObjcClientCodegen() { + super(); + outputFolder = "generated-code/objc"; + modelTemplateFiles.put("model-header.mustache", ".h"); + modelTemplateFiles.put("model-body.mustache", ".m"); + apiTemplateFiles.put("api-header.mustache", ".h"); + apiTemplateFiles.put("api-body.mustache", ".m"); + templateDir = "objc"; + modelPackage = ""; + + defaultIncludes = new HashSet( + Arrays.asList( + "bool", + "int", + "NSString", + "NSObject", + "NSArray", + "NSNumber", + "NSDictionary", + "NSMutableArray", + "NSMutableDictionary") + ); + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "NSNumber", + "NSString", + "NSObject", + "bool") + ); + + reservedWords = new HashSet( + Arrays.asList( + "void", "char", "short", "int", "void", "char", "short", "int", + "long", "float", "double", "signed", "unsigned", "id", "const", + "volatile", "in", "out", "inout", "bycopy", "byref", "oneway", + "self", "super" + )); + + typeMapping = new HashMap(); + typeMapping.put("enum", "NSString"); + typeMapping.put("Date", "SWGDate"); + typeMapping.put("DateTime", "SWGDate"); + // typeMapping.put("Date", "SWGDate"); + typeMapping.put("boolean", "NSNumber"); + typeMapping.put("string", "NSString"); + typeMapping.put("integer", "NSNumber"); + typeMapping.put("int", "NSNumber"); + typeMapping.put("float", "NSNumber"); + typeMapping.put("long", "NSNumber"); + typeMapping.put("double", "NSNumber"); + typeMapping.put("array", "NSArray"); + typeMapping.put("map", "NSDictionary"); + typeMapping.put("number", "NSNumber"); + typeMapping.put("List", "NSArray"); + typeMapping.put("object", "NSObject"); + + importMapping = new HashMap (); + importMapping.put("Date", "SWGDate"); + + foundationClasses = new HashSet ( + Arrays.asList( + "NSNumber", + "NSObject", + "NSString", + "NSDictionary") + ); + + instantiationTypes.put("array", "NSMutableArray"); + instantiationTypes.put("map", "NSMutableDictionary"); + + supportingFiles.add(new SupportingFile("SWGObject.h", sourceFolder, "SWGObject.h")); + supportingFiles.add(new SupportingFile("SWGObject.m", sourceFolder, "SWGObject.m")); + supportingFiles.add(new SupportingFile("SWGApiClient.h", sourceFolder, "SWGApiClient.h")); + supportingFiles.add(new SupportingFile("SWGApiClient.m", sourceFolder, "SWGApiClient.m")); + supportingFiles.add(new SupportingFile("SWGFile.h", sourceFolder, "SWGFile.h")); + supportingFiles.add(new SupportingFile("SWGFile.m", sourceFolder, "SWGFile.m")); + supportingFiles.add(new SupportingFile("SWGDate.h", sourceFolder, "SWGDate.h")); + supportingFiles.add(new SupportingFile("SWGDate.m", sourceFolder, "SWGDate.m")); + supportingFiles.add(new SupportingFile("Podfile.mustache", "", "Podfile")); + } + + @Override + public String toInstantiationType(Property p) { + if (p instanceof MapProperty) { + MapProperty ap = (MapProperty) p; + String inner = getSwaggerType(ap.getAdditionalProperties()); + return instantiationTypes.get("map"); + } + else if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + String inner = getSwaggerType(ap.getItems()); + return instantiationTypes.get("array"); + } + else + return null; + } + + @Override + public String getTypeDeclaration(String name) { + if(languageSpecificPrimitives.contains(name) && !foundationClasses.contains(name)) + return name; + else + return name + "*"; + } + + @Override + public String getSwaggerType(Property p) { + String swaggerType = super.getSwaggerType(p); + String type = null; + if(typeMapping.containsKey(swaggerType)) { + type = typeMapping.get(swaggerType); + if(languageSpecificPrimitives.contains(type) && !foundationClasses.contains(type)) + return toModelName(type); + } + else + type = swaggerType; + return toModelName(type); + } + + @Override + public String getTypeDeclaration(Property p) { + String swaggerType = getSwaggerType(p); + if(languageSpecificPrimitives.contains(swaggerType) && !foundationClasses.contains(swaggerType)) + return toModelName(swaggerType); + else + return swaggerType + "*"; + } + + @Override + public String toModelName(String type) { + if(typeMapping.keySet().contains(type) || + foundationClasses.contains(type) || + importMapping.values().contains(type) || + defaultIncludes.contains(type) || + languageSpecificPrimitives.contains(type)) { + return Character.toUpperCase(type.charAt(0)) + type.substring(1); + } + else { + return PREFIX + Character.toUpperCase(type.charAt(0)) + type.substring(1); + } + } + + @Override + public String toModelImport(String name) { + // name = name + ".h"; + if("".equals(modelPackage())) + return name; + else + return modelPackage() + "." + name; + } + + @Override + public String toDefaultValue(Property p) { + return null; + } + + @Override + public String apiFileFolder() { + return outputFolder + File.separator + sourceFolder; + } + + @Override + public String modelFileFolder() { + return outputFolder + File.separator + sourceFolder; + } + + @Override + public String toModelFilename(String name) { + return PREFIX + initialCaps(name); + } + + @Override + public String toApiName(String name) { + return PREFIX + initialCaps(name) + "Api"; + } + + public String toApiFilename(String name) { + return PREFIX + initialCaps(name) + "Api"; + } + + @Override + public String toVarName(String name) { + String paramName = name.replaceAll("[^a-zA-Z0-9_]",""); + if(paramName.startsWith("new") || reservedWords.contains(paramName)) { + return escapeReservedWord(paramName); + } + else + return paramName; + } + + public String escapeReservedWord(String name) { + return "_" + name; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/PhpClientCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/PhpClientCodegen.java new file mode 100644 index 000000000000..f27044c2db77 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/PhpClientCodegen.java @@ -0,0 +1,110 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.util.Json; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage = "com.wordnik.client"; + protected String groupId = "com.wordnik"; + protected String artifactId = "swagger-client"; + protected String artifactVersion = "1.0.0"; + // protected String sourceFolder = ""; + + public String getName() { + return "php"; + } + + public String getHelp() { + return "Generates a PHP client library."; + } + + public PhpClientCodegen() { + super(); + outputFolder = "generated-code/php"; + modelTemplateFiles.put("model.mustache", ".php"); + apiTemplateFiles.put("api.mustache", ".php"); + templateDir = "php"; + + typeMapping.clear(); + languageSpecificPrimitives.clear(); + + reservedWords = new HashSet ( + Arrays.asList( + "int") + ); + + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + + languageSpecificPrimitives.add("int"); + languageSpecificPrimitives.add("array"); + languageSpecificPrimitives.add("map"); + languageSpecificPrimitives.add("string"); + languageSpecificPrimitives.add("DateTime"); + + typeMapping.put("long", "int"); + typeMapping.put("integer", "int"); + typeMapping.put("Array", "array"); + typeMapping.put("String", "string"); + typeMapping.put("List", "array"); + typeMapping.put("map", "map"); + + supportingFiles.add(new SupportingFile("Swagger.mustache", "", "Swagger.php")); + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + "/" + apiPackage().replaceAll("\\.", "/"); + } + + public String modelFileFolder() { + return outputFolder + "/" + modelPackage().replaceAll("\\.", "/"); + } + + @Override + public String getTypeDeclaration(Property p) { + if(p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + Property inner = ap.getItems(); + return getSwaggerType(p) + "[" + getTypeDeclaration(inner) + "]"; + } + else if (p instanceof MapProperty) { + MapProperty mp = (MapProperty) p; + Property inner = mp.getAdditionalProperties(); + return getSwaggerType(p) + "[string," + getTypeDeclaration(inner) + "]"; + } + return super.getTypeDeclaration(p); + } + + @Override + public String getSwaggerType(Property p) { + String swaggerType = super.getSwaggerType(p); + String type = null; + if(typeMapping.containsKey(swaggerType)) { + type = typeMapping.get(swaggerType); + if(languageSpecificPrimitives.contains(type)) { + return type; + } + } + else + type = swaggerType; + if(type == null) + return null; + return type; + } + + public String toDefaultValue(Property p) { + return "null"; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/PythonClientCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/PythonClientCodegen.java new file mode 100755 index 000000000000..c3cf36481231 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/PythonClientCodegen.java @@ -0,0 +1,117 @@ +/** + * Copyright 2014 Wordnik, Inc. + * + * Licensed 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 com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig { + + public String getName() { + return "python"; + } + + public String getHelp() { + return "Generates a Python client library."; + } + + public PythonClientCodegen() { + super(); + outputFolder = "generated-code/python"; + modelTemplateFiles.put("model.mustache", ".py"); + apiTemplateFiles.put("api.mustache", ".py"); + templateDir = "python"; + + apiPackage = ""; + modelPackage = "models"; + + languageSpecificPrimitives.clear(); + languageSpecificPrimitives.add("int"); + languageSpecificPrimitives.add("float"); + languageSpecificPrimitives.add("long"); + languageSpecificPrimitives.add("list"); + languageSpecificPrimitives.add("bool"); + languageSpecificPrimitives.add("str"); + languageSpecificPrimitives.add("datetime"); + + typeMapping.clear(); + typeMapping.put("integer", "int"); + typeMapping.put("float", "float"); + typeMapping.put("long", "long"); + typeMapping.put("double", "float"); + typeMapping.put("array", "list"); + typeMapping.put("map", "map"); + typeMapping.put("boolean", "bool"); + typeMapping.put("string", "str"); + typeMapping.put("date", "datetime"); + + + supportingFiles.add(new SupportingFile("swagger.mustache", "", "swagger.py")); + supportingFiles.add(new SupportingFile("__init__.mustache", "", "__init__.py")); + supportingFiles.add(new SupportingFile("__init__.mustache", modelPackage, "__init__.py")); + + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + "/" + apiPackage().replaceAll("\\.", "/"); + } + + public String modelFileFolder() { + return outputFolder + "/" + modelPackage().replaceAll("\\.", "/"); + } + + @Override + public String getTypeDeclaration(Property p) { + if(p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + Property inner = ap.getItems(); + return getSwaggerType(p) + "[" + getTypeDeclaration(inner) + "]"; + } + else if (p instanceof MapProperty) { + MapProperty mp = (MapProperty) p; + Property inner = mp.getAdditionalProperties(); + + return getSwaggerType(p) + "(String, " + getTypeDeclaration(inner) + ")"; + } + return super.getTypeDeclaration(p); + } + + @Override + public String getSwaggerType(Property p) { + String swaggerType = super.getSwaggerType(p); + String type = null; + if(typeMapping.containsKey(swaggerType)) { + type = typeMapping.get(swaggerType); + if(languageSpecificPrimitives.contains(type)) { + return type; + } + } + else + type = swaggerType; + return type; + } + + public String toDefaultValue(Property p) { + // TODO: Support Python def value + return "null"; + } +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ScalaClientCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ScalaClientCodegen.java new file mode 100644 index 000000000000..6c845a9ccb74 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ScalaClientCodegen.java @@ -0,0 +1,182 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class ScalaClientCodegen extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage = "io.swagger.client"; + protected String groupId = "com.wordnik"; + protected String artifactId = "swagger-client"; + protected String artifactVersion = "1.0.0"; + protected String sourceFolder = "src/main/java"; + + public String getName() { + return "scala"; + } + + public String getHelp() { + return "Generates a Scala client library."; + } + + public ScalaClientCodegen() { + super(); + outputFolder = "generated-code/scala"; + modelTemplateFiles.put("model.mustache", ".scala"); + apiTemplateFiles.put("api.mustache", ".scala"); + templateDir = "scala"; + apiPackage = "io.swagger.client.api"; + modelPackage = "io.swagger.client.model"; + + reservedWords = new HashSet ( + Arrays.asList( + "abstract", "case", "catch", "class", "def", "do", "else", "extends", + "false", "final", "finally", "for", "forSome", "if", "implicit", + "import", "lazy", "match", "new", "null", "object", "override", "package", + "private", "protected", "return", "sealed", "super", "this", "throw", + "trait", "try", "true", "type", "val", "var", "while", "with", "yield") + ); + + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + + supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); + supportingFiles.add(new SupportingFile("apiInvoker.mustache", + (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "ApiInvoker.scala")); + + importMapping.remove("List"); + importMapping.remove("Set"); + importMapping.remove("Map"); + + importMapping.put("DateTime", "org.joda.time.DateTime"); + importMapping.put("ListBuffer", "scala.collections.mutable.ListBuffer"); + + typeMapping = new HashMap(); + typeMapping.put("enum", "NSString"); + typeMapping.put("array", "List"); + typeMapping.put("set", "Set"); + typeMapping.put("boolean", "Boolean"); + typeMapping.put("string", "String"); + typeMapping.put("int", "Int"); + typeMapping.put("long", "Long"); + typeMapping.put("float", "Float"); + typeMapping.put("byte", "Byte"); + typeMapping.put("short", "Short"); + typeMapping.put("char", "Char"); + typeMapping.put("long", "Long"); + typeMapping.put("double", "Double"); + typeMapping.put("object", "Any"); + typeMapping.put("file", "File"); + + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "String", + "boolean", + "Boolean", + "Double", + "Int", + "Long", + "Float", + "Object", + "List", + "Map") + ); + instantiationTypes.put("array", "ListBuffer"); + instantiationTypes.put("map", "HashMap"); + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + apiPackage().replaceAll("\\.", "/"); + } + + public String modelFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + modelPackage().replaceAll("\\.", "/"); + } + + @Override + public String getTypeDeclaration(Property p) { + if(p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + Property inner = ap.getItems(); + return getSwaggerType(p) + "[" + getTypeDeclaration(inner) + "]"; + } + else if (p instanceof MapProperty) { + MapProperty mp = (MapProperty) p; + Property inner = mp.getAdditionalProperties(); + + return getSwaggerType(p) + "[String, " + getTypeDeclaration(inner) + "]"; + } + return super.getTypeDeclaration(p); + } + + @Override + public String getSwaggerType(Property p) { + String swaggerType = super.getSwaggerType(p); + String type = null; + if(typeMapping.containsKey(swaggerType)) { + type = typeMapping.get(swaggerType); + if(languageSpecificPrimitives.contains(type)) + return toModelName(type); + } + else + type = swaggerType; + return toModelName(type); + } + + @Override + public String toInstantiationType(Property p) { + if (p instanceof MapProperty) { + MapProperty ap = (MapProperty) p; + String inner = getSwaggerType(ap.getAdditionalProperties()); + return instantiationTypes.get("map") + "[String, " + inner + "]"; + } + else if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + String inner = getSwaggerType(ap.getItems()); + return instantiationTypes.get("array") + "[" + inner + "]"; + } + else + return null; + } + + public String toDefaultValue(Property p) { + if(p instanceof StringProperty) + return "null"; + else if (p instanceof BooleanProperty) + return "null"; + else if(p instanceof DateProperty) + return "null"; + else if(p instanceof DateTimeProperty) + return "null"; + else if (p instanceof DoubleProperty) + return "null"; + else if (p instanceof FloatProperty) + return "null"; + else if (p instanceof IntegerProperty) + return "null"; + else if (p instanceof LongProperty) + return "null"; + else if (p instanceof MapProperty) { + MapProperty ap = (MapProperty) p; + String inner = getSwaggerType(ap.getAdditionalProperties()); + return "new HashMap[String, " + inner + "]() "; + } + else if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + String inner = getSwaggerType(ap.getItems()); + return "new ListBuffer[" + inner + "]() "; + } + else + return "null"; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ScalatraServerCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ScalatraServerCodegen.java new file mode 100644 index 000000000000..e87609b720d2 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ScalatraServerCodegen.java @@ -0,0 +1,174 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; +import com.wordnik.swagger.util.Json; + +import java.util.*; +import java.io.File; + +public class ScalatraServerCodegen extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage = "com.wordnik.client"; + protected String groupId = "com.wordnik"; + protected String artifactId = "swagger-client"; + protected String artifactVersion = "1.0.0"; + protected String sourceFolder = "src/main/scala"; + + public String getName() { + return "scalatra"; + } + + public String getHelp() { + return "Generates a Scala server application with Scalatra."; + } + + public ScalatraServerCodegen() { + super(); + outputFolder = "generated-code/scalatra"; + modelTemplateFiles.put("model.mustache", ".scala"); + apiTemplateFiles.put("api.mustache", ".scala"); + templateDir = "scalatra"; + apiPackage = "com.wordnik.client.api"; + modelPackage = "com.wordnik.client.model"; + + reservedWords = new HashSet ( + Arrays.asList( + "abstract", "continue", "for", "new", "switch", "assert", + "default", "if", "package", "synchronized", "boolean", "do", "goto", "private", + "this", "break", "double", "implements", "protected", "throw", "byte", "else", + "import", "public", "throws", "case", "enum", "instanceof", "return", "transient", + "catch", "extends", "int", "short", "try", "char", "final", "interface", "static", + "void", "class", "finally", "long", "strictfp", "volatile", "const", "float", + "native", "super", "while") + ); + + defaultIncludes = new HashSet( + Arrays.asList("double", + "Int", + "Long", + "Float", + "Double", + "char", + "float", + "String", + "boolean", + "Boolean", + "Double", + "Integer", + "Long", + "Float", + "List", + "Set", + "Map") + ); + + typeMapping.put("integer", "Int"); + typeMapping.put("long", "Long"); + + additionalProperties.put("appName", "Swagger Sample"); + additionalProperties.put("appName", "Swagger Sample"); + additionalProperties.put("appDescription", "A sample swagger server"); + additionalProperties.put("infoUrl", "http://developers.helloreverb.com"); + additionalProperties.put("infoEmail", "hello@helloreverb.com"); + additionalProperties.put("licenseInfo", "All rights reserved"); + additionalProperties.put("licenseUrl", "http://apache.org/licenses/LICENSE-2.0.html"); + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + + supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); + supportingFiles.add(new SupportingFile("build.sbt", "", "build.sbt")); + supportingFiles.add(new SupportingFile("web.xml", "/src/main/webapp/WEB-INF", "web.xml")); + supportingFiles.add(new SupportingFile("JettyMain.scala", sourceFolder, "JettyMain.scala")); + supportingFiles.add(new SupportingFile("Bootstrap.mustache", sourceFolder, "ScalatraBootstrap.scala")); + supportingFiles.add(new SupportingFile("ServletApp.mustache", sourceFolder, "ServletApp.scala")); + supportingFiles.add(new SupportingFile("project/build.properties", "project", "build.properties")); + supportingFiles.add(new SupportingFile("project/plugins.sbt", "project", "plugins.sbt")); + supportingFiles.add(new SupportingFile("sbt", "", "sbt")); + + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "String", + "boolean", + "Boolean", + "Double", + "Integer", + "Long", + "Float", + "Object") + ); + instantiationTypes.put("array", "ArrayList"); + instantiationTypes.put("map", "HashMap"); + + importMapping = new HashMap (); + importMapping.put("BigDecimal", "java.math.BigDecimal"); + importMapping.put("UUID", "java.util.UUID"); + importMapping.put("File", "java.io.File"); + importMapping.put("Date", "java.util.Date"); + importMapping.put("Timestamp", "java.sql.Timestamp"); + importMapping.put("Map", "java.util.Map"); + importMapping.put("HashMap", "java.util.HashMap"); + importMapping.put("Array", "java.util.List"); + importMapping.put("ArrayList", "java.util.ArrayList"); + importMapping.put("DateTime", "org.joda.time.DateTime"); + importMapping.put("LocalDateTime", "org.joda.time.LocalDateTime"); + importMapping.put("LocalDate", "org.joda.time.LocalDate"); + importMapping.put("LocalTime", "org.joda.time.LocalTime"); + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + apiPackage().replaceAll("\\.", "/"); + } + + public String modelFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + modelPackage().replaceAll("\\.", "/"); + } + + @Override + public Map postProcessOperations(Map objs) { + Map operations = (Map) objs.get("operations"); + List operationList = (List) operations.get("operation"); + for(CodegenOperation op: operationList) { + op.httpMethod = op.httpMethod.toLowerCase(); + } + return objs; + } + + + @Override + public String getTypeDeclaration(Property p) { + if(p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + Property inner = ap.getItems(); + return getSwaggerType(p) + "[" + getTypeDeclaration(inner) + "]"; + } + else if (p instanceof MapProperty) { + MapProperty mp = (MapProperty) p; + Property inner = mp.getAdditionalProperties(); + + return getSwaggerType(p) + "[String, " + getTypeDeclaration(inner) + "]"; + } + return super.getTypeDeclaration(p); + } + + @Override + public String getSwaggerType(Property p) { + String swaggerType = super.getSwaggerType(p); + String type = null; + if(typeMapping.containsKey(swaggerType)) { + type = typeMapping.get(swaggerType); + if(languageSpecificPrimitives.contains(type)) + return toModelName(type); + } + else + type = swaggerType; + return toModelName(type); + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/StaticDocCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/StaticDocCodegen.java new file mode 100644 index 000000000000..3386a5f9facd --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/StaticDocCodegen.java @@ -0,0 +1,72 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class StaticDocCodegen extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage = "com.wordnik.client"; + protected String groupId = "com.wordnik"; + protected String artifactId = "swagger-client"; + protected String artifactVersion = "1.0.0"; + protected String sourceFolder = "docs"; + + public String getName() { + return "dynamic-html"; + } + + public String getHelp() { + return "Generates a dynamic HTML site."; + } + + public StaticDocCodegen() { + super(); + outputFolder = "docs"; + modelTemplateFiles.put("model.mustache", ".html"); + apiTemplateFiles.put("operation.mustache", ".html"); + templateDir = "swagger-static"; + + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + + supportingFiles.add(new SupportingFile("package.mustache", "", "package.json")); + supportingFiles.add(new SupportingFile("main.mustache", "", "main.js")); + supportingFiles.add(new SupportingFile("assets/css/bootstrap-responsive.css", + outputFolder + "/assets/css", "bootstrap-responsive.css")); + supportingFiles.add(new SupportingFile("assets/css/bootstrap.css", + outputFolder + "/assets/css", "bootstrap.css")); + supportingFiles.add(new SupportingFile("assets/css/style.css", + outputFolder + "/assets/css", "style.css")); + supportingFiles.add(new SupportingFile("assets/images/logo.png", + outputFolder + "/assets/images", "logo.png")); + supportingFiles.add(new SupportingFile("assets/js/bootstrap.js", + outputFolder + "/assets/js", "bootstrap.js")); + supportingFiles.add(new SupportingFile("assets/js/jquery-1.8.3.min.js", + outputFolder + "/assets/js", "jquery-1.8.3.min.js")); + supportingFiles.add(new SupportingFile("assets/js/main.js", + outputFolder + "/assets/js", "main.js")); + supportingFiles.add(new SupportingFile("index.mustache", + outputFolder, "index.html")); + + instantiationTypes.put("array", "ArrayList"); + instantiationTypes.put("map", "HashMap"); + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + File.separator + sourceFolder + File.separator + "operations"; + } + + public String modelFileFolder() { + return outputFolder + File.separator + sourceFolder + File.separator + "models"; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/StaticHtmlGenerator.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/StaticHtmlGenerator.java new file mode 100644 index 000000000000..42ce9fe3604e --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/StaticHtmlGenerator.java @@ -0,0 +1,81 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; +import com.wordnik.swagger.util.Json; + +import java.util.*; +import java.io.File; + +public class StaticHtmlGenerator extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage = "com.wordnik.client"; + protected String groupId = "com.wordnik"; + protected String artifactId = "swagger-client"; + protected String artifactVersion = "1.0.0"; + protected String sourceFolder = "src/main/scala"; + + public String getName() { + return "html"; + } + + public String getHelp() { + return "Generates a static HTML file."; + } + + public StaticHtmlGenerator() { + super(); + outputFolder = "docs"; + templateDir = "htmlDocs"; + + defaultIncludes = new HashSet(); + + String partner = "our Partner"; + + if(System.getProperty("partner") != null) + partner = System.getProperty("partner"); + + additionalProperties.put("partner", partner); + additionalProperties.put("appName", "Swagger Sample"); + additionalProperties.put("appDescription", "A sample swagger server"); + additionalProperties.put("infoUrl", "https://helloreverb.com"); + additionalProperties.put("infoEmail", "hello@helloreverb.com"); + additionalProperties.put("licenseInfo", "All rights reserved"); + additionalProperties.put("licenseUrl", "http://apache.org/licenses/LICENSE-2.0.html"); + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + + supportingFiles.add(new SupportingFile("index.mustache", "", "index.html")); + reservedWords = new HashSet(); + + languageSpecificPrimitives = new HashSet(); + importMapping = new HashMap (); + } + + @Override + public String getTypeDeclaration(Property p) { + if(p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + Property inner = ap.getItems(); + return getSwaggerType(p) + "[" + getTypeDeclaration(inner) + "]"; + } + else if (p instanceof MapProperty) { + MapProperty mp = (MapProperty) p; + Property inner = mp.getAdditionalProperties(); + + return getSwaggerType(p) + "[String, " + getTypeDeclaration(inner) + "]"; + } + return super.getTypeDeclaration(p); + } + + @Override + public Map postProcessOperations(Map objs) { + Map operations = (Map) objs.get("operations"); + List operationList = (List) operations.get("operation"); + for(CodegenOperation op: operationList) { + op.httpMethod = op.httpMethod.toLowerCase(); + } + return objs; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/SwaggerGenerator.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/SwaggerGenerator.java new file mode 100644 index 000000000000..49f5dc6bab41 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/SwaggerGenerator.java @@ -0,0 +1,38 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.util.*; +import com.wordnik.swagger.models.Swagger; + +import org.apache.commons.io.FileUtils; + +import java.io.File; + +public class SwaggerGenerator extends DefaultCodegen implements CodegenConfig { + public String getName() { + return "swagger"; + } + + public String getHelp() { + return "Creates a static swagger.json file."; + } + + public SwaggerGenerator() { + super(); + outputFolder = "generated-code/swagger"; + } + + @Override + public void processSwagger(Swagger swagger) { + String swaggerString = Json.pretty(swagger); + + try{ + String outputFile = outputFolder + File.separator + "swagger.json"; + FileUtils.writeStringToFile(new File(outputFile), swaggerString); + System.out.println("wrote file to " + outputFile); + } + catch(Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/TizenClientCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/TizenClientCodegen.java new file mode 100644 index 000000000000..d91267758ee2 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/TizenClientCodegen.java @@ -0,0 +1,243 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.util.Json; +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class TizenClientCodegen extends DefaultCodegen implements CodegenConfig { + protected Set foundationClasses = new HashSet(); + protected String sourceFolder = "client"; + protected static String PREFIX = "Sami"; + protected Map namespaces = new HashMap(); + + public String getName() { + return "tizen"; + } + + public String getHelp() { + return "Generates a Samsung Tizen C++ client library."; + } + + public TizenClientCodegen() { + super(); + outputFolder = "generated-code/tizen"; + modelTemplateFiles.put("model-header.mustache", ".h"); + modelTemplateFiles.put("model-body.mustache", ".cpp"); + apiTemplateFiles.put("api-header.mustache", ".h"); + apiTemplateFiles.put("api-body.mustache", ".cpp"); + templateDir = "tizen"; + modelPackage = ""; + + defaultIncludes = new HashSet( + Arrays.asList( + "bool", + "int", + "long") + ); + languageSpecificPrimitives = new HashSet(); + + additionalProperties().put("prefix", PREFIX); + + reservedWords = new HashSet( + // VERIFY + Arrays.asList( + "void", "char", "short", "int", "void", "char", "short", "int", + "long", "float", "double", "signed", "unsigned", "id", "const", + "volatile", "in", "out", "inout", "bycopy", "byref", "oneway", + "self", "super" + )); + + super.typeMapping = new HashMap(); + + typeMapping.put("Date", "DateTime"); + typeMapping.put("DateTime", "DateTime"); + typeMapping.put("string", "String"); + typeMapping.put("integer", "Integer"); + typeMapping.put("float", "Float"); + typeMapping.put("long", "Long"); + typeMapping.put("boolean", "Boolean"); + typeMapping.put("double", "Double"); + typeMapping.put("array", "IList"); + typeMapping.put("map", "HashMap"); + typeMapping.put("number", "Long"); + typeMapping.put("object", PREFIX + "Object"); + + importMapping = new HashMap(); + + namespaces = new HashMap (); + namespaces.put("DateTime", "Tizen::Base::DateTime"); + namespaces.put("Integer", "Tizen::Base::Integer"); + namespaces.put("Long", "Tizen::Base::Long"); + namespaces.put("Boolean", "Tizen::Base::Boolean"); + namespaces.put("Float", "Tizen::Base::Float"); + namespaces.put("String", "Tizen::Base::String"); + namespaces.put("Double", "Tizen::Base::Double"); + namespaces.put("IList", "Tizen::Base::Collection::IList"); + namespaces.put("HashMap", "Tizen::Base::Collection::HashMap"); + namespaces.put("ArrayList", "Tizen::Base::Collection::ArrayList"); + namespaces.put("JsonNumber", "Tizen::Web::Json"); + namespaces.put("JsonString", "Tizen::Web::Json"); + + foundationClasses = new HashSet ( + Arrays.asList( + "String", + "Integer", + "Float") + ); + supportingFiles.clear(); + supportingFiles.add(new SupportingFile("modelFactory.mustache", sourceFolder, PREFIX + "ModelFactory.h")); + supportingFiles.add(new SupportingFile("helpers-header.mustache", sourceFolder, PREFIX + "Helpers.h")); + supportingFiles.add(new SupportingFile("helpers-body.mustache", sourceFolder, PREFIX + "Helpers.cpp")); + supportingFiles.add(new SupportingFile("apiclient-header.mustache", sourceFolder, PREFIX + "ApiClient.h")); + supportingFiles.add(new SupportingFile("apiclient-body.mustache", sourceFolder, PREFIX + "ApiClient.cpp")); + supportingFiles.add(new SupportingFile("object.mustache", sourceFolder, PREFIX + "Object.h")); + supportingFiles.add(new SupportingFile("error-header.mustache", sourceFolder, PREFIX + "Error.h")); + supportingFiles.add(new SupportingFile("error-body.mustache", sourceFolder, PREFIX + "Error.cpp")); + } + + @Override + public String toInstantiationType(Property p) { + if (p instanceof MapProperty) { + MapProperty ap = (MapProperty) p; + String inner = getSwaggerType(ap.getAdditionalProperties()); + return instantiationTypes.get("map"); + } + else if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + String inner = getSwaggerType(ap.getItems()); + return instantiationTypes.get("array"); + } + else + return null; + } + + @Override + public String getTypeDeclaration(String name) { + if(languageSpecificPrimitives.contains(name) && !foundationClasses.contains(name)) + return name; + else + return name + "*"; + } + + @Override + public String getSwaggerType(Property p) { + String swaggerType = super.getSwaggerType(p); + String type = null; + if(typeMapping.containsKey(swaggerType)) { + type = typeMapping.get(swaggerType); + if(languageSpecificPrimitives.contains(type) && !foundationClasses.contains(type)) + return toModelName(type); + } + else + type = swaggerType; + return toModelName(type); + } + + @Override + public String getTypeDeclaration(Property p) { + String swaggerType = getSwaggerType(p); + if(languageSpecificPrimitives.contains(swaggerType) && !foundationClasses.contains(swaggerType)) + return toModelName(swaggerType); + else + return swaggerType + "*"; + } + + @Override + public String toModelName(String type) { + if(typeMapping.keySet().contains(type) || + typeMapping.values().contains(type) || + foundationClasses.contains(type) || + importMapping.values().contains(type) || + defaultIncludes.contains(type) || + languageSpecificPrimitives.contains(type)) { + return type; + } + else { + return PREFIX + Character.toUpperCase(type.charAt(0)) + type.substring(1); + } + } + + @Override + public String toModelImport(String name) { + if(namespaces.containsKey(name)) { + return "using " + namespaces.get(name) + ";"; + } + return "#include \"" + name + ".h\""; + } + + @Override + public String toDefaultValue(Property p) { + if(p instanceof StringProperty) + return "new String()"; + else if (p instanceof BooleanProperty) + return "new Boolean(false)"; + else if(p instanceof DateProperty) + return "new DateTime()"; + else if(p instanceof DateTimeProperty) + return "new DateTime()"; + else if (p instanceof DoubleProperty) + return "new Double()"; + else if (p instanceof FloatProperty) + return "new Float()"; + else if (p instanceof IntegerProperty) + return "new Integer()"; + else if (p instanceof LongProperty) + return "new Long()"; + else if (p instanceof DecimalProperty) + return "new Long()"; + else if (p instanceof MapProperty) { + MapProperty ap = (MapProperty) p; + String inner = getSwaggerType(ap.getAdditionalProperties()); + return "new HashMap()"; + } + else if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + String inner = getSwaggerType(ap.getItems()); + return "new ArrayList()"; + } + // else + if(p instanceof RefProperty) { + RefProperty rp = (RefProperty) p; + return "new " + toModelName(rp.getSimpleRef()) + "()"; + } + return "null"; + } + + @Override + public String apiFileFolder() { + return outputFolder + File.separator + sourceFolder; + } + + @Override + public String modelFileFolder() { + return outputFolder + File.separator + sourceFolder; + } + + @Override + public String toModelFilename(String name) { + return PREFIX + initialCaps(name); + } + + @Override + public String toApiName(String name) { + return PREFIX + initialCaps(name) + "Api"; + } + + public String toApiFilename(String name) { + return PREFIX + initialCaps(name) + "Api"; + } + + @Override + public String toVarName(String name) { + String paramName = name.replaceAll("[^a-zA-Z0-9_]",""); + paramName = Character.toUpperCase(paramName.charAt(0)) + paramName.substring(1); + return "p" + paramName; + } + + public String escapeReservedWord(String name) { + return "_" + name; + } +} diff --git a/modules/swagger-codegen/src/main/resources/Groovy/ApiUtils.mustache b/modules/swagger-codegen/src/main/resources/Groovy/ApiUtils.mustache new file mode 100644 index 000000000000..956b834c88c3 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Groovy/ApiUtils.mustache @@ -0,0 +1,50 @@ +package {{invokerPackage}}; + +import groovyx.net.http.HTTPBuilder +import groovyx.net.http.Method + +import static groovyx.net.http.ContentType.JSON +import static java.net.URI.create; + +class ApiUtils { + + def invokeApi(onSuccess, onFailure, basePath, versionPath, resourcePath, queryParams, headerParams, method, container, type) { + def (url, uriPath) = buildUrlAndUriPath(basePath, versionPath, resourcePath) + println "url=$url uriPath=$uriPath" + def http = new HTTPBuilder(url) + http.request( Method.valueOf(method), JSON ) { + uri.path = uriPath + uri.query = queryParams + response.success = { resp, json -> + if (type != null) { + onSuccess(parse(json, container, type)) + } + } + response.failure = { resp -> + onFailure(resp.status, resp.statusLine.reasonPhrase) + } + } + } + + + def buildUrlAndUriPath(basePath, versionPath, resourcePath) { + // HTTPBuilder expects to get as its constructor parameter an URL, + // without any other additions like path, therefore we need to cut the path + // from the basePath as it is represented by swagger APIs + // we use java.net.URI to manipulate the basePath + // then the uriPath will hold the rest of the path + URI baseUri = create(basePath) + def pathOnly = baseUri.getPath() + [basePath-pathOnly, pathOnly+versionPath+resourcePath] + } + + + def parse(object, container, clazz) { + if (container == "List") { + return object.collect {parse(it, "", clazz)} + } else { + return clazz.newInstance(object) + } + } + +} diff --git a/modules/swagger-codegen/src/main/resources/Groovy/api.mustache b/modules/swagger-codegen/src/main/resources/Groovy/api.mustache new file mode 100644 index 000000000000..6ff66a847209 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Groovy/api.mustache @@ -0,0 +1,56 @@ +package {{package}}; + + + + + +import groovyx.net.http.* +import static groovyx.net.http.ContentType.* +import static groovyx.net.http.Method.* +import {{invokerPackage}}.ApiUtils +//------------- + +{{#imports}}import {{import}} +{{/imports}} + +import java.util.*; + +@Mixin(ApiUtils) +{{#operations}} +class {{classname}} { + String basePath = "{{basePath}}" + String versionPath = "/api/v1" + + + {{#operation}} + def {{nickname}} ({{#allParams}} {{{dataType}}} {{paramName}},{{/allParams}} Closure onSuccess, Closure onFailure) { + // create path and map variables + String resourcePath = "{{path}}" + + + // query params + def queryParams = [:] + def headerParams = [:] + + {{#requiredParamCount}} + // verify required params are set + if({{/requiredParamCount}}{{#requiredParams}} {{paramName}} == null {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { + throw new RuntimeException("missing required params") + } + {{/requiredParamCount}} + + {{#queryParams}}if(!"null".equals(String.valueOf({{paramName}}))) + queryParams.put("{{paramName}}", String.valueOf({{paramName}})) + {{/queryParams}} + + {{#headerParams}}headerParams.put("{{paramName}}", {{paramName}}) + {{/headerParams}} + + invokeApi(onSuccess, onFailure, basePath, versionPath, resourcePath, queryParams, headerParams, + "{{httpMethod}}", "{{returnContainer}}", + {{#returnBaseType}}{{{returnBaseType}}}.class {{/returnBaseType}}{{^returnBaseType}}null {{/returnBaseType}}) + + } + {{/operation}} +} +{{/operations}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Groovy/build.gradle.mustache b/modules/swagger-codegen/src/main/resources/Groovy/build.gradle.mustache new file mode 100644 index 000000000000..d98f375c61d6 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Groovy/build.gradle.mustache @@ -0,0 +1,32 @@ +apply plugin: 'groovy' +apply plugin: 'idea' +def artifactory = 'buildserver.supportspace.com' +group = 'com.supportspace' +archivesBaseName = 'swagger-gen-groovy' +version = '0.1' + +buildscript { + repositories { + maven { url 'http://repo.jfrog.org/artifactory/gradle-plugins' } + } + dependencies { + classpath(group: 'org.jfrog.buildinfo', name: 'build-info-extractor-gradle', version: '2.0.16') + } +} + +repositories { + mavenCentral() + mavenLocal() + mavenCentral(artifactUrls: ['http://maven.springframework.org/milestone']) + maven { url "http://$artifactory:8080/artifactory/repo" } +} + +dependencies { + groovy "org.codehaus.groovy:groovy-all:2.0.5" + compile 'org.codehaus.groovy.modules.http-builder:http-builder:0.6' + + +} + +task wrapper(type: Wrapper) { gradleVersion = '1.6' } + diff --git a/modules/swagger-codegen/src/main/resources/Groovy/model.mustache b/modules/swagger-codegen/src/main/resources/Groovy/model.mustache new file mode 100644 index 000000000000..bc3ca28aaecf --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Groovy/model.mustache @@ -0,0 +1,21 @@ +package {{package}}; + +import groovy.transform.Canonical +{{#imports}}import {{import}}; +{{/imports}} +{{#models}} +{{#model}} +@Canonical +class {{classname}} { + {{#vars}} + + {{#description}}/* {{{description}}} */ + {{/description}} + {{{datatype}}} {{name}} = {{{defaultValue}}} + {{/vars}} + + +} + +{{/model}} +{{/models}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Java/JsonUtil.mustache b/modules/swagger-codegen/src/main/resources/Java/JsonUtil.mustache new file mode 100644 index 000000000000..29d5f55eceea --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/JsonUtil.mustache @@ -0,0 +1,23 @@ +package {{invokerPackage}}; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.core.JsonGenerator.Feature; + +import com.fasterxml.jackson.datatype.joda.*; + +public class JsonUtil { + public static ObjectMapper mapper; + + static { + mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + mapper.registerModule(new JodaModule()); + } + + public static ObjectMapper getJsonMapper() { + return mapper; + } +} diff --git a/modules/swagger-codegen/src/main/resources/Java/api.mustache b/modules/swagger-codegen/src/main/resources/Java/api.mustache new file mode 100644 index 000000000000..c0a697e40b42 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/api.mustache @@ -0,0 +1,109 @@ +package {{package}}; + +import {{invokerPackage}}.ApiException; +import {{invokerPackage}}.ApiInvoker; + +import {{modelPackage}}.*; + +import java.util.*; + +{{#imports}}import {{import}}; +{{/imports}} + +import com.sun.jersey.multipart.FormDataMultiPart; + +import javax.ws.rs.core.MediaType; + +import java.io.File; +import java.util.Map; +import java.util.HashMap; + +{{#operations}} +public class {{classname}} { + String basePath = "{{basePath}}"; + ApiInvoker apiInvoker = ApiInvoker.getInstance(); + + public ApiInvoker getInvoker() { + return apiInvoker; + } + + public void setBasePath(String basePath) { + this.basePath = basePath; + } + + public String getBasePath() { + return basePath; + } + + {{#operation}} + {{#errorList}} //error info- code: {{code}} reason: "{{reason}}" model: {{#responseModel}}{{responseModel}} + {{/responseModel}}{{^responseModel}} + {{/responseModel}} + {{/errorList}} + public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}} ({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { + Object postBody = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; + {{#requiredParamCount}} + // verify required params are set + if({{/requiredParamCount}}{{#requiredParams}} {{paramName}} == null {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { + throw new ApiException(400, "missing required params"); + } + {{/requiredParamCount}} + + // create path and map variables + String path = "{{path}}".replaceAll("\\{format\\}","json"){{#pathParams}} + .replaceAll("\\{" + "{{paramName}}" + "\\}", apiInvoker.escapeString({{{paramName}}}.toString())){{/pathParams}}; + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + {{#queryParams}}if(!"null".equals(String.valueOf({{paramName}}))) + queryParams.put("{{baseName}}", String.valueOf({{paramName}})); + {{/queryParams}} + {{#headerParams}}headerParams.put("{{baseName}}", {{paramName}}); + {{/headerParams}} + String[] contentTypes = { + {{#consumes}}"{{mediaType}}"{{#hasMore}},{{/hasMore}}{{/consumes}} + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + {{#formParams}}{{#notFile}} + hasFields = true; + mp.field("{{baseName}}", {{paramName}}, MediaType.MULTIPART_FORM_DATA_TYPE); + {{/notFile}}{{#isFile}} + hasFields = true; + mp.field("{{baseName}}", {{paramName}}, MediaType.MULTIPART_FORM_DATA_TYPE); + {{/isFile}}{{/formParams}} + if(hasFields) + postBody = mp; + } + else { + {{#formParams}}{{#notFile}}formParams.put("{{baseName}}", {{paramName}});{{/notFile}} + {{/formParams}} + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "{{httpMethod}}", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return {{#returnType}}({{{returnType}}}) ApiInvoker.deserialize(response, "{{returnContainer}}", {{returnBaseType}}.class){{/returnType}}; + } + else { + return {{#returnType}}null{{/returnType}}; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return {{#returnType}} null{{/returnType}}; + } + else { + throw ex; + } + } + } + {{/operation}} +} +{{/operations}} diff --git a/modules/swagger-codegen/src/main/resources/Java/apiException.mustache b/modules/swagger-codegen/src/main/resources/Java/apiException.mustache new file mode 100644 index 000000000000..a6bcba75b7c1 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/apiException.mustache @@ -0,0 +1,29 @@ +package {{invokerPackage}}; + +public class ApiException extends Exception { + int code = 0; + String message = null; + + public ApiException() {} + + public ApiException(int code, String message) { + this.code = code; + this.message = message; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Java/apiInvoker.mustache b/modules/swagger-codegen/src/main/resources/Java/apiInvoker.mustache new file mode 100644 index 000000000000..881cab13e123 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/apiInvoker.mustache @@ -0,0 +1,187 @@ +package {{invokerPackage}}; + +import com.fasterxml.jackson.core.JsonGenerator.Feature; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.config.ClientConfig; +import com.sun.jersey.api.client.config.DefaultClientConfig; +import com.sun.jersey.api.client.filter.LoggingFilter; +import com.sun.jersey.api.client.WebResource.Builder; +import com.sun.jersey.multipart.FormDataMultiPart; + +import javax.ws.rs.core.Response.Status.Family; +import javax.ws.rs.core.MediaType; + +import java.util.Map; +import java.util.HashMap; +import java.util.List; +import java.io.IOException; +import java.net.URLEncoder; +import java.io.UnsupportedEncodingException; + +public class ApiInvoker { + private static ApiInvoker INSTANCE = new ApiInvoker(); + private Map hostMap = new HashMap(); + private Map defaultHeaderMap = new HashMap(); + private boolean isDebug = false; + + public void enableDebug() { + isDebug = true; + } + + public static ApiInvoker getInstance() { + return INSTANCE; + } + + public void addDefaultHeader(String key, String value) { + defaultHeaderMap.put(key, value); + } + + public String escapeString(String str) { + try{ + return URLEncoder.encode(str, "utf8").replaceAll("\\+", "%20"); + } + catch(UnsupportedEncodingException e) { + return str; + } + } + + public static Object deserialize(String json, String containerType, Class cls) throws ApiException { + try{ + if("List".equals(containerType)) { + JavaType typeInfo = JsonUtil.getJsonMapper().getTypeFactory().constructCollectionType(List.class, cls); + List response = (List) JsonUtil.getJsonMapper().readValue(json, typeInfo); + return response; + } + else if(String.class.equals(cls)) { + if(json != null && json.startsWith("\"") && json.endsWith("\"") && json.length() > 1) + return json.substring(1, json.length() - 2); + else + return json; + } + else { + return JsonUtil.getJsonMapper().readValue(json, cls); + } + } + catch (IOException e) { + throw new ApiException(500, e.getMessage()); + } + } + + public static String serialize(Object obj) throws ApiException { + try { + if (obj != null) + return JsonUtil.getJsonMapper().writeValueAsString(obj); + else + return null; + } + catch (Exception e) { + throw new ApiException(500, e.getMessage()); + } + } + + public String invokeAPI(String host, String path, String method, Map queryParams, Object body, Map headerParams, Map formParams, String contentType) throws ApiException { + Client client = getClient(host); + + StringBuilder b = new StringBuilder(); + + for(String key : queryParams.keySet()) { + String value = queryParams.get(key); + if (value != null){ + if(b.toString().length() == 0) + b.append("?"); + else + b.append("&"); + b.append(escapeString(key)).append("=").append(escapeString(value)); + } + } + String querystring = b.toString(); + + Builder builder = client.resource(host + path + querystring).accept("application/json"); + for(String key : headerParams.keySet()) { + builder.header(key, headerParams.get(key)); + } + + for(String key : defaultHeaderMap.keySet()) { + if(!headerParams.containsKey(key)) { + builder.header(key, defaultHeaderMap.get(key)); + } + } + ClientResponse response = null; + + if("GET".equals(method)) { + response = (ClientResponse) builder.get(ClientResponse.class); + } + else if ("POST".equals(method)) { + if(body == null) + response = builder.post(ClientResponse.class, null); + else if(body instanceof FormDataMultiPart) { + response = builder.type(contentType).post(ClientResponse.class, body); + } + else + response = builder.type(contentType).post(ClientResponse.class, serialize(body)); + } + else if ("PUT".equals(method)) { + if(body == null) + response = builder.put(ClientResponse.class, serialize(body)); + else { + if("application/x-www-form-urlencoded".equals(contentType)) { + StringBuilder formParamBuilder = new StringBuilder(); + + // encode the form params + for(String key : formParams.keySet()) { + String value = formParams.get(key); + if(value != null && !"".equals(value.trim())) { + if(formParamBuilder.length() > 0) { + formParamBuilder.append("&"); + } + try { + formParamBuilder.append(URLEncoder.encode(key, "utf8")).append("=").append(URLEncoder.encode(value, "utf8")); + } + catch (Exception e) { + // move on to next + } + } + } + response = builder.type(contentType).put(ClientResponse.class, formParamBuilder.toString()); + } + else + response = builder.type(contentType).put(ClientResponse.class, serialize(body)); + } + } + else if ("DELETE".equals(method)) { + if(body == null) + response = builder.delete(ClientResponse.class, serialize(body)); + else + response = builder.type(contentType).delete(ClientResponse.class, serialize(body)); + } + else { + throw new ApiException(500, "unknown method type " + method); + } + if(response.getClientResponseStatus() == ClientResponse.Status.NO_CONTENT) { + return null; + } + else if(response.getClientResponseStatus().getFamily() == Family.SUCCESSFUL) { + return (String) response.getEntity(String.class); + } + else { + throw new ApiException( + response.getClientResponseStatus().getStatusCode(), + response.getEntity(String.class)); + } + } + + private Client getClient(String host) { + if(!hostMap.containsKey(host)) { + Client client = Client.create(); + if(isDebug) + client.addFilter(new LoggingFilter()); + hostMap.put(host, client); + } + return hostMap.get(host); + } +} diff --git a/modules/swagger-codegen/src/main/resources/Java/model.mustache b/modules/swagger-codegen/src/main/resources/Java/model.mustache new file mode 100644 index 000000000000..60aa5d72a358 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/model.mustache @@ -0,0 +1,49 @@ +package {{package}}; + +{{#imports}}import {{import}}; +{{/imports}} + +import com.wordnik.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; +{{#models}} + +{{#model}}{{#description}} +/** + * {{description}} + **/{{/description}} +@ApiModel(description = "{{{description}}}") +public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} { {{#vars}} + private {{{datatype}}} {{name}} = {{{defaultValue}}};{{#allowableValues}} + + //{{^min}}public enum {{name}}Enum { {{#values}} {{.}}, {{/values}} }; + {{/min}}{{/allowableValues}}{{/vars}} + + {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + @ApiModelProperty(required = {{required}}, value = "{{{description}}}") + @JsonProperty("{{name}}") + public {{{datatype}}} {{getter}}() { + return {{name}}; + } + public void {{setter}}({{{datatype}}} {{name}}) { + this.{{name}} = {{name}}; + } + + {{/vars}} + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class {{classname}} {\n"); + {{#parent}}sb.append(" " + super.toString()).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append({{name}}).append("\n"); + {{/vars}}sb.append("}\n"); + return sb.toString(); + } +} +{{/model}} +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/Java/pom.mustache b/modules/swagger-codegen/src/main/resources/Java/pom.mustache new file mode 100644 index 000000000000..73d62103e22c --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/pom.mustache @@ -0,0 +1,168 @@ + + 4.0.0 + {{groupId}} + {{artifactId}} + jar + {{artifactId}} + {{artifactVersion}} + + scm:git:git@github.com:wordnik/swagger-mustache.git + scm:git:git@github.com:wordnik/swagger-codegen.git + https://github.com/wordnik/swagger-codegen + + + 2.2.0 + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12 + + + + loggerPath + conf/log4j.properties + + + -Xms512m -Xmx1500m + methods + pertest + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + + jar + test-jar + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add_sources + generate-sources + + add-source + + + + src/main/java + + + + + add_test_sources + generate-test-sources + + add-test-source + + + + src/test/java + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + + + + com.wordnik + swagger-annotations + ${swagger-annotations-version} + + + com.sun.jersey + jersey-client + ${jersey-version} + + + com.sun.jersey.contribs + jersey-multipart + ${jersey-version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + 2.1.5 + + + joda-time + joda-time + ${jodatime-version} + + + + + junit + junit + ${junit-version} + test + + + + 1.5.0-M1 + 1.7 + 2.1.4 + 2.3 + 4.8.1 + 1.0.0 + 4.8.1 + + diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiException.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiException.mustache new file mode 100644 index 000000000000..ffab3b1088e7 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiException.mustache @@ -0,0 +1,9 @@ +package {{apiPackage}}; + +public class ApiException extends Exception{ + private int code; + public ApiException (int code, String msg) { + super(msg); + this.code = code; + } +} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiOriginFilter.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiOriginFilter.mustache new file mode 100644 index 000000000000..68675432c648 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiOriginFilter.mustache @@ -0,0 +1,26 @@ +package {{apiPackage}}; + +import java.io.IOException; + +import javax.servlet.*; +import javax.servlet.http.HttpServletResponse; + +public class ApiOriginFilter implements javax.servlet.Filter { + @Override + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + HttpServletResponse res = (HttpServletResponse) response; + res.addHeader("Access-Control-Allow-Origin", "*"); + res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); + res.addHeader("Access-Control-Allow-Headers", "Content-Type"); + chain.doFilter(request, response); + } + + @Override + public void destroy() { + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiResponseMessage.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiResponseMessage.mustache new file mode 100644 index 000000000000..94711b26efb2 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiResponseMessage.mustache @@ -0,0 +1,68 @@ +package {{apiPackage}}; + +import javax.xml.bind.annotation.XmlTransient; + +@javax.xml.bind.annotation.XmlRootElement +public class ApiResponseMessage { + public static final int ERROR = 1; + public static final int WARNING = 2; + public static final int INFO = 3; + public static final int OK = 4; + public static final int TOO_BUSY = 5; + + int code; + String type; + String message; + + public ApiResponseMessage(){} + + public ApiResponseMessage(int code, String message){ + this.code = code; + switch(code){ + case ERROR: + setType("error"); + break; + case WARNING: + setType("warning"); + break; + case INFO: + setType("info"); + break; + case OK: + setType("ok"); + break; + case TOO_BUSY: + setType("too busy"); + break; + default: + setType("unknown"); + break; + } + this.message = message; + } + + @XmlTransient + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/NotFoundException.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/NotFoundException.mustache new file mode 100644 index 000000000000..8ab2c99e4f84 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/NotFoundException.mustache @@ -0,0 +1,9 @@ +package {{apiPackage}}; + +public class NotFoundException extends ApiException { + private int code; + public NotFoundException (int code, String msg) { + super(code, msg); + this.code = code; + } +} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache new file mode 100644 index 000000000000..f8a560b776f5 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache @@ -0,0 +1,10 @@ +# Swagger generated server + +## Overview +This server was generated by the [swagger-codegen](https://github.com/wordnik/swagger-codegen) project. By using the +[swagger-spec](https://github.com/wordnik/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +is an example of building a swagger-enabled scalatra server. + +This example uses the [scalatra](http://scalatra.org/) framework. To see how to make this your own, look here: + +[README](https://github.com/wordnik/swagger-codegen/tree/master/samples/server-generator/scalatra) \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache new file mode 100644 index 000000000000..fe287c9ddfe9 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache @@ -0,0 +1,40 @@ +package {{package}}; + +import {{modelPackage}}.*; + +import com.wordnik.swagger.annotations.*; +import com.sun.jersey.multipart.FormDataParam; + +{{#imports}}import {{import}}; +{{/imports}} + +import java.util.List; +import {{package}}.NotFoundException; + +import javax.ws.rs.core.Response; +import javax.ws.rs.*; + +@Path("/{{baseName}}") +@Api(value = "/{{baseName}}", description = "the {{baseName}} API") +{{#operations}} +public class {{classname}} { + {{#operation}} + @{{httpMethod}} + {{#subresourceOperation}}@Path("{{path}}"){{/subresourceOperation}} + {{#hasConsumes}}@Consumes({ {{#consumes}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/consumes}} }){{/hasConsumes}} + {{#hasProduces}}@Produces({ {{#produces}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/produces}} }){{/hasProduces}} + @ApiOperation(value = "{{{summary}}}", notes = "{{{notes}}}", response = {{{returnType}}}.class{{#returnContainer}}, responseContainer = "{{{returnContainer}}}"{{/returnContainer}}) + @ApiResponses(value = { {{#responses}} + @ApiResponse(code = {{{code}}}, message = "{{{message}}}"){{#hasMore}}, + {{/hasMore}}{{/responses}} }) + + public Response {{nickname}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}}, + {{/hasMore}}{{/allParams}}) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + {{/operation}} +} +{{/operations}} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/bodyParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/bodyParams.mustache new file mode 100644 index 000000000000..86546afb9ca4 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/bodyParams.mustache @@ -0,0 +1 @@ +{{#isBodyParam}}@ApiParam(value = "{{{description}}}" {{#required}},required=true{{/required}} {{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}) {{{dataType}}} {{paramName}}{{/isBodyParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/formParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/formParams.mustache new file mode 100644 index 000000000000..46076485aa98 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/formParams.mustache @@ -0,0 +1 @@ +{{#isFormParam}}{{#notFile}}@ApiParam(value = "{{{description}}}"{{#required}}, required=true{{/required}} {{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}})@FormParam("{{paramName}}") {{{dataType}}} {{paramName}}{{/notFile}}{{#isFile}}@ApiParam(value = "{{{description}}}"{{#required}}, required=true{{/required}} {{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}})@FormDataParam("{{paramName}}") {{{dataType}}} {{paramName}}{{/isFile}}{{/isFormParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/headerParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/headerParams.mustache new file mode 100644 index 000000000000..0f88692ad1d4 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/headerParams.mustache @@ -0,0 +1 @@ +{{#isHeaderParam}}@ApiParam(value = "{{{description}}}" {{#required}},required=true{{/required}} {{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}})@HeaderParam("{{paramName}}") {{{dataType}}} {{paramName}}{{/isHeaderParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/model.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/model.mustache new file mode 100644 index 000000000000..f6cb2b01cdf9 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/model.mustache @@ -0,0 +1,47 @@ +package {{package}}; + +{{#imports}}import {{import}}; +{{/imports}} + +import com.wordnik.swagger.annotations.*; +{{#models}} + +{{#model}}{{#description}} +/** + * {{description}} + **/{{/description}} +@ApiModel(description = "{{{description}}}") +public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} { {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + private {{{datatype}}} {{name}} = {{{defaultValue}}};{{#isEnum}} + + public enum {{datatype}} { {{#_enum}}{{.}}{{^-last}}, {{/-last}}{{/_enum}} }; + {{/isEnum}}{{/vars}} + + {{#vars}} + @ApiModelProperty(required = {{required}}, value = "{{{description}}}") + public {{{datatype}}} {{getter}}() { + return {{name}}; + } + public void {{setter}}({{{datatype}}} {{name}}) { + this.{{name}} = {{name}}; + } + + {{/vars}} + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class {{classname}} {\n"); + {{#parent}}sb.append(" " + super.toString()).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append({{name}}).append("\n"); + {{/vars}}sb.append("}\n"); + return sb.toString(); + } +} +{{/model}} +{{/models}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/pathParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/pathParams.mustache new file mode 100644 index 000000000000..1f1b30887a40 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/pathParams.mustache @@ -0,0 +1 @@ +{{#isPathParam}}@ApiParam(value = "{{{description}}}"{{#required}},required=true{{/required}}{{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}} {{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}) @PathParam("{{paramName}}") {{{dataType}}} {{paramName}}{{/isPathParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache new file mode 100644 index 000000000000..e0782610efdb --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache @@ -0,0 +1,141 @@ + + 4.0.0 + {{groupId}} + {{artifactId}} + jar + {{artifactId}} + {{artifactVersion}} + + src/main/java + + + org.apache.maven.plugins + maven-war-plugin + 2.1.1 + + + maven-failsafe-plugin + 2.6 + + + + integration-test + verify + + + + + + org.mortbay.jetty + jetty-maven-plugin + ${jetty-version} + + + {{^basePath}}/{{/basePath}}{{#basePath}}{{basePath}}{{/basePath}} + + target/${project.artifactId}-${project.version} + ${project.basedir}/conf/jetty/webdefault.xml + 8079 + stopit + + + 8002 + 60000 + 8443 + + + + + + start-jetty + pre-integration-test + + run + + + 0 + true + + + + stop-jetty + post-integration-test + + stop + + + + + + + + + com.wordnik + swagger-jersey-jaxrs + ${swagger-core-version} + + + org.slf4j + slf4j-log4j12 + ${slf4j-version} + + + com.sun.jersey + jersey-core + ${jersey-version} + + + com.sun.jersey + jersey-json + ${jersey-version} + + + com.sun.jersey + jersey-servlet + ${jersey-version} + + + com.sun.jersey.contribs + jersey-multipart + ${jersey-version} + + + com.sun.jersey + jersey-server + ${jersey-version} + + + + org.scalatest + scalatest_2.9.1 + ${scala-test-version} + test + + + junit + junit + ${junit-version} + test + + + javax.servlet + servlet-api + ${servlet-api-version} + + + + + sonatype-snapshots + https://oss.sonatype.org/content/repositories/snapshots + + + + 1.5.0-SNAPSHOT + 8.1.11.v20130520 + 1.13 + 1.6.3 + 1.6.1 + 4.8.1 + 2.5 + + \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/project/build.properties b/modules/swagger-codegen/src/main/resources/JavaJaxRS/project/build.properties new file mode 100644 index 000000000000..a8c2f849be3c --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.12.0 diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/project/plugins.sbt b/modules/swagger-codegen/src/main/resources/JavaJaxRS/project/plugins.sbt new file mode 100644 index 000000000000..713b7f3e9935 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/project/plugins.sbt @@ -0,0 +1,9 @@ +addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.8.4") + +libraryDependencies <+= sbtVersion(v => v match { + case "0.11.0" => "com.github.siasia" %% "xsbt-web-plugin" % "0.11.0-0.2.8" + case "0.11.1" => "com.github.siasia" %% "xsbt-web-plugin" % "0.11.1-0.2.10" + case "0.11.2" => "com.github.siasia" %% "xsbt-web-plugin" % "0.11.2-0.2.11" + case "0.11.3" => "com.github.siasia" %% "xsbt-web-plugin" % "0.11.3-0.2.11.1" + case x if (x.startsWith("0.12")) => "com.github.siasia" %% "xsbt-web-plugin" % "0.12.0-0.2.11.1" +}) \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/queryParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/queryParams.mustache new file mode 100644 index 000000000000..b9e80e5a7e75 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/queryParams.mustache @@ -0,0 +1 @@ +{{#isQueryParam}}@ApiParam(value = "{{{description}}}"{{#required}},required=true{{/required}}{{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}) @QueryParam("{{paramName}}") {{{dataType}}} {{paramName}}{{/isQueryParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/web.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/web.mustache new file mode 100644 index 000000000000..b9cd00b71ce1 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/web.mustache @@ -0,0 +1,54 @@ + + + + + jersey + com.sun.jersey.spi.container.servlet.ServletContainer + + com.sun.jersey.config.property.packages + com.wordnik.swagger.jaxrs.json;com.wordnik.swagger.jaxrs.listing;{{apiPackage}} + + + com.sun.jersey.spi.container.ContainerRequestFilters + com.sun.jersey.api.container.filter.PostReplaceFilter + + + com.sun.jersey.api.json.POJOMappingFeature + true + + 1 + + + + DefaultJaxrsConfig + com.wordnik.swagger.jaxrs.config.DefaultJaxrsConfig + + api.version + 1.0.0 + + + swagger.api.title + {{{title}}} + + + swagger.api.basepath + http://localhost:8002 + + 2 + + + + jersey + /* + + + ApiOriginFilter + com.wordnik.api.ApiOriginFilter + + + ApiOriginFilter + /* + + diff --git a/modules/swagger-codegen/src/main/resources/META-INF/services/com.wordnik.swagger.codegen.CodegenConfig b/modules/swagger-codegen/src/main/resources/META-INF/services/com.wordnik.swagger.codegen.CodegenConfig new file mode 100644 index 000000000000..3f8102a750d7 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/META-INF/services/com.wordnik.swagger.codegen.CodegenConfig @@ -0,0 +1,13 @@ +com.wordnik.swagger.codegen.languages.AndroidClientCodegen +com.wordnik.swagger.codegen.languages.JavaClientCodegen +com.wordnik.swagger.codegen.languages.JaxRSServerCodegen +com.wordnik.swagger.codegen.languages.NodeJSServerCodegen +com.wordnik.swagger.codegen.languages.ObjcClientCodegen +com.wordnik.swagger.codegen.languages.ScalatraServerCodegen +com.wordnik.swagger.codegen.languages.ScalaClientCodegen +com.wordnik.swagger.codegen.languages.StaticDocCodegen +com.wordnik.swagger.codegen.languages.StaticHtmlGenerator +com.wordnik.swagger.codegen.languages.SwaggerGenerator +com.wordnik.swagger.codegen.languages.TizenClientCodegen +com.wordnik.swagger.codegen.languages.PhpClientCodegen +com.wordnik.swagger.codegen.languages.PythonClientCodegen \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/android-java/api.mustache b/modules/swagger-codegen/src/main/resources/android-java/api.mustache new file mode 100644 index 000000000000..1eab419d31ad --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/android-java/api.mustache @@ -0,0 +1,88 @@ +package {{package}}; + +import {{invokerPackage}}.ApiException; +import {{invokerPackage}}.ApiInvoker; + +import {{modelPackage}}.*; + +import java.util.*; + +{{#imports}}import {{import}}; +{{/imports}} + +import java.util.Map; +import java.util.HashMap; +import java.io.File; + +{{#operations}} +public class {{classname}} { + String basePath = "{{basePath}}"; + ApiInvoker apiInvoker = ApiInvoker.getInstance(); + + public void addHeader(String key, String value) { + getInvoker().addDefaultHeader(key, value); + } + + public ApiInvoker getInvoker() { + return apiInvoker; + } + + public void setBasePath(String basePath) { + this.basePath = basePath; + } + + public String getBasePath() { + return basePath; + } + + {{#operation}} + {{#errorList}} //error info- code: {{code}} reason: "{{reason}}" model: {{#responseModel}}{{responseModel}} + {{/responseModel}}{{^responseModel}} + {{/responseModel}} + {{/errorList}} + public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}} {{nickname}} ({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { + Object postBody = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; + + {{#requiredParamCount}} + // verify required params are set + if({{/requiredParamCount}}{{#requiredParams}} {{paramName}} == null {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { + throw new ApiException(400, "missing required params"); + } + {{/requiredParamCount}} + + // create path and map variables + String path = "{{path}}".replaceAll("\\{format\\}","json"){{#pathParams}}.replaceAll("\\{" + "{{paramName}}" + "\\}", apiInvoker.escapeString({{{paramName}}}.toString())){{/pathParams}}; + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + + {{#queryParams}}if(!"null".equals(String.valueOf({{paramName}}))) + queryParams.put("{{baseName}}", String.valueOf({{paramName}})); + {{/queryParams}} + + {{#headerParams}}headerParams.put("{{baseName}}", {{paramName}}); + {{/headerParams}} + + String contentType = "application/json"; + + try { + String response = apiInvoker.invokeAPI(basePath, path, "{{httpMethod}}", queryParams, postBody, headerParams, contentType); + if(response != null){ + return {{#returnType}}({{{returnType}}}) ApiInvoker.deserialize(response, "{{returnContainer}}", {{returnBaseType}}.class){{/returnType}}; + } + else { + return {{#returnType}}null{{/returnType}}; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return {{#returnType}} null{{/returnType}}; + } + else { + throw ex; + } + } + } + {{/operation}} +} +{{/operations}} diff --git a/modules/swagger-codegen/src/main/resources/android-java/apiException.mustache b/modules/swagger-codegen/src/main/resources/android-java/apiException.mustache new file mode 100644 index 000000000000..a6bcba75b7c1 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/android-java/apiException.mustache @@ -0,0 +1,29 @@ +package {{invokerPackage}}; + +public class ApiException extends Exception { + int code = 0; + String message = null; + + public ApiException() {} + + public ApiException(int code, String message) { + this.code = code; + this.message = message; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/android-java/apiInvoker.mustache b/modules/swagger-codegen/src/main/resources/android-java/apiInvoker.mustache new file mode 100644 index 000000000000..425c2e7e004c --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/android-java/apiInvoker.mustache @@ -0,0 +1,283 @@ +package {{invokerPackage}}; + + +import com.fasterxml.jackson.core.JsonGenerator.Feature; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import org.apache.http.*; +import org.apache.http.client.*; +import org.apache.http.client.methods.*; +import org.apache.http.conn.*; +import org.apache.http.conn.scheme.*; +import org.apache.http.conn.ssl.*; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.*; +import org.apache.http.impl.conn.*; +import org.apache.http.params.*; +import org.apache.http.util.EntityUtils; + +import java.io.File; +import java.net.Socket; +import java.net.UnknownHostException; +import java.net.URLEncoder; + +import java.util.Map; +import java.util.HashMap; +import java.util.List; +import java.io.IOException; +import java.io.UnsupportedEncodingException; + +import java.security.GeneralSecurityException; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.cert.*; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +import java.util.Date; +import java.util.Random; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +public class ApiInvoker { + private static ApiInvoker INSTANCE = new ApiInvoker(); + private Map defaultHeaderMap = new HashMap(); + + private HttpClient client = null; + + private boolean ignoreSSLCertificates = false; + + private ClientConnectionManager ignoreSSLConnectionManager; + + public ApiInvoker() { + initConnectionManager(); + } + + public static ApiInvoker getInstance() { + return INSTANCE; + } + + public void ignoreSSLCertificates(boolean ignoreSSLCertificates) { + this.ignoreSSLCertificates = ignoreSSLCertificates; + } + + public void addDefaultHeader(String key, String value) { + defaultHeaderMap.put(key, value); + } + + public String escapeString(String str) { + return str; + } + + public static Object deserialize(String json, String containerType, Class cls) throws ApiException { + try{ + if("List".equals(containerType)) { + JavaType typeInfo = JsonUtil.getJsonMapper().getTypeFactory().constructCollectionType(List.class, cls); + List response = (List) JsonUtil.getJsonMapper().readValue(json, typeInfo); + return response; + } + else if(String.class.equals(cls)) { + if(json != null && json.startsWith("\"") && json.endsWith("\"") && json.length() > 1) + return json.substring(1, json.length() - 2); + else + return json; + } + else { + return JsonUtil.getJsonMapper().readValue(json, cls); + } + } + catch (IOException e) { + throw new ApiException(500, e.getMessage()); + } + } + + public static String serialize(Object obj) throws ApiException { + try { + if (obj != null) + return JsonUtil.getJsonMapper().writeValueAsString(obj); + else + return null; + } + catch (Exception e) { + throw new ApiException(500, e.getMessage()); + } + } + + public String invokeAPI(String host, String path, String method, Map queryParams, Object body, Map headerParams, String contentType) throws ApiException { + HttpClient client = getClient(host); + + StringBuilder b = new StringBuilder(); + for(String key : queryParams.keySet()) { + String value = queryParams.get(key); + if (value != null){ + if(b.toString().length() == 0) + b.append("?"); + else + b.append("&"); + b.append(escapeString(key)).append("=").append(escapeString(value)); + } + } + String url = host + path + b.toString(); + + HashMap headers = new HashMap(); + + for(String key : headerParams.keySet()) { + headers.put(key, headerParams.get(key)); + } + + for(String key : defaultHeaderMap.keySet()) { + if(!headerParams.containsKey(key)) { + headers.put(key, defaultHeaderMap.get(key)); + } + } + headers.put("Accept", "application/json"); + + HttpResponse response = null; + try{ + if("GET".equals(method)) { + HttpGet get = new HttpGet(url); + get.addHeader("Accept", "application/json"); + for(String key : headers.keySet()) { + get.setHeader(key, headers.get(key)); + } + response = client.execute(get); + } + else if ("POST".equals(method)) { + HttpPost post = new HttpPost(url); + + if (body != null) { + post.setHeader("Content-Type", contentType); + post.setEntity(new StringEntity(serialize(body), "UTF-8")); + } + for(String key : headers.keySet()) { + post.setHeader(key, headers.get(key)); + } + response = client.execute(post); + } + else if ("PUT".equals(method)) { + HttpPut put = new HttpPut(url); + if(body != null) { + put.setHeader("Content-Type", contentType); + put.setEntity(new StringEntity(serialize(body), "UTF-8")); + } + for(String key : headers.keySet()) { + put.setHeader(key, headers.get(key)); + } + response = client.execute(put); + } + else if ("DELETE".equals(method)) { + HttpDelete delete = new HttpDelete(url); + for(String key : headers.keySet()) { + delete.setHeader(key, headers.get(key)); + } + response = client.execute(delete); + } + else if ("PATCH".equals(method)) { + HttpPatch patch = new HttpPatch(url); + + if (body != null) { + patch.setHeader("Content-Type", contentType); + patch.setEntity(new StringEntity(serialize(body), "UTF-8")); + } + for(String key : headers.keySet()) { + patch.setHeader(key, headers.get(key)); + } + response = client.execute(patch); + } + + int code = response.getStatusLine().getStatusCode(); + String responseString = null; + if(code == 204) + responseString = ""; + else if(code >= 200 && code < 300) { + if(response.getEntity() != null) { + HttpEntity resEntity = response.getEntity(); + responseString = EntityUtils.toString(resEntity); + } + } + else { + if(response.getEntity() != null) { + HttpEntity resEntity = response.getEntity(); + responseString = EntityUtils.toString(resEntity); + } + else + responseString = "no data"; + throw new ApiException(code, responseString); + } + return responseString; + } + catch(IOException e) { + throw new ApiException(500, e.getMessage()); + } + } + + private HttpClient getClient(String host) { + if (client == null) { + if (ignoreSSLCertificates && ignoreSSLConnectionManager != null) { + // Trust self signed certificates + client = new DefaultHttpClient(ignoreSSLConnectionManager, new BasicHttpParams()); + } else { + client = new DefaultHttpClient(); + } + } + return client; + } + + private void initConnectionManager() { + try { + final SSLContext sslContext = SSLContext.getInstance("SSL"); + + // set up a TrustManager that trusts everything + TrustManager[] trustManagers = new TrustManager[] { + new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { + return null; + } + public void checkClientTrusted(X509Certificate[] certs, String authType) {} + public void checkServerTrusted(X509Certificate[] certs, String authType) {} + }}; + + sslContext.init(null, trustManagers, new SecureRandom()); + + SSLSocketFactory sf = new SSLSocketFactory((KeyStore)null) { + private javax.net.ssl.SSLSocketFactory sslFactory = sslContext.getSocketFactory(); + + public Socket createSocket(Socket socket, String host, int port, boolean autoClose) + throws IOException, UnknownHostException { + return sslFactory.createSocket(socket, host, port, autoClose); + } + + public Socket createSocket() throws IOException { + return sslFactory.createSocket(); + } + }; + + sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + Scheme httpsScheme = new Scheme("https", sf, 443); + SchemeRegistry schemeRegistry = new SchemeRegistry(); + schemeRegistry.register(httpsScheme); + schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); + + ignoreSSLConnectionManager = new SingleClientConnManager(new BasicHttpParams(), schemeRegistry); + } catch (NoSuchAlgorithmException e) { + // This will only be thrown if SSL isn't available for some reason. + } catch (KeyManagementException e) { + // This might be thrown when passing a key into init(), but no key is being passed. + } catch (GeneralSecurityException e) { + // This catches anything else that might go wrong. + // If anything goes wrong we default to the standard connection manager. + } + } +} diff --git a/modules/swagger-codegen/src/main/resources/android-java/httpPatch.mustache b/modules/swagger-codegen/src/main/resources/android-java/httpPatch.mustache new file mode 100644 index 000000000000..55cec2f12790 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/android-java/httpPatch.mustache @@ -0,0 +1,16 @@ +package {{invokerPackage}}; + +import org.apache.http.client.methods.*; + +public class HttpPatch extends HttpPost { + public static final String METHOD_PATCH = "PATCH"; + + public HttpPatch(final String url) { + super(url); + } + + @Override + public String getMethod() { + return METHOD_PATCH; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/android-java/jsonUtil.mustache b/modules/swagger-codegen/src/main/resources/android-java/jsonUtil.mustache new file mode 100644 index 000000000000..ef00838c17ff --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/android-java/jsonUtil.mustache @@ -0,0 +1,20 @@ +package {{invokerPackage}}; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.core.JsonGenerator.Feature; + +public class JsonUtil { + public static ObjectMapper mapper; + + static { + mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + } + + public static ObjectMapper getJsonMapper() { + return mapper; + } +} diff --git a/modules/swagger-codegen/src/main/resources/android-java/model.mustache b/modules/swagger-codegen/src/main/resources/android-java/model.mustache new file mode 100644 index 000000000000..0d60aedd0683 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/android-java/model.mustache @@ -0,0 +1,47 @@ +package {{package}}; + +{{#imports}}import {{import}}; +{{/imports}} + +import com.wordnik.swagger.annotations.*; +{{#models}} + +{{#model}}{{#description}} +/** + * {{description}} + **/{{/description}} +@ApiModel(description = "{{{description}}}") +public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} { {{#vars}} + private {{{datatype}}} {{name}} = {{{defaultValue}}};{{#allowableValues}} + + //{{^min}}public enum {{name}}Enum { {{#values}} {{.}}, {{/values}} }; + {{/min}}{{/allowableValues}}{{/vars}} + + {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + @ApiModelProperty(required = {{required}}, value = "{{{description}}}") + public {{{datatype}}} {{getter}}() { + return {{name}}; + } + public void {{setter}}({{{datatype}}} {{name}}) { + this.{{name}} = {{name}}; + } + + {{/vars}} + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class {{classname}} {\n"); + {{#parent}}sb.append(" " + super.toString()).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append({{name}}).append("\n"); + {{/vars}}sb.append("}\n"); + return sb.toString(); + } +} +{{/model}} +{{/models}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/android-java/pom.mustache b/modules/swagger-codegen/src/main/resources/android-java/pom.mustache new file mode 100644 index 000000000000..11641082eeef --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/android-java/pom.mustache @@ -0,0 +1,162 @@ + + 4.0.0 + {{groupId}} + {{artifactId}} + jar + {{artifactId}} + {{artifactVersion}} + + scm:git:git@github.com:wordnik/swagger-mustache.git + scm:git:git@github.com:wordnik/swagger-codegen.git + https://github.com/wordnik/swagger-codegen + + + 2.2.0 + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12 + + + + loggerPath + conf/log4j.properties + + + -Xms512m -Xmx1500m + methods + pertest + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + + jar + test-jar + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add_sources + generate-sources + + add-source + + + + src/main/java + + + + + add_test_sources + generate-test-sources + + add-test-source + + + + src/test/java + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + + + + com.wordnik + swagger-annotations + ${swagger-annotations-version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson-version} + compile + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson-version} + compile + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-version} + compile + + + org.apache.httpcomponents + httpclient + ${httpclient-version} + compile + + + + + junit + junit + ${junit-version} + test + + + + + sonatype-snapshots + https://oss.sonatype.org/content/repositories/snapshots + + + + 1.5.0-SNAPSHOT + 2.1.4 + 4.8.1 + 1.0.0 + 4.8.1 + 4.0 + + diff --git a/modules/swagger-codegen/src/main/resources/asyncscala/api.mustache b/modules/swagger-codegen/src/main/resources/asyncscala/api.mustache new file mode 100644 index 000000000000..2a8664450d53 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/asyncscala/api.mustache @@ -0,0 +1,59 @@ +package {{package}} + +{{#imports}}import {{import}} +{{/imports}} +import com.wordnik.swagger.client._ +import scala.concurrent.{ Future, Await } +import scala.concurrent.duration._ +import collection.mutable + +{{#operations}} +class {{className}}(client: TransportClient, config: SwaggerConfig) extends ApiClient(client, config) { + + {{#operation}} + + def {{nickname}}({{#allParams}} + {{#optional}} + {{paramName}}: Option[{{dataType}}] = {{#defaultValue}}Some({{defaultValue}}){{/defaultValue}}{{^defaultValue}}None{{/defaultValue}}{{#hasMore}}, {{/hasMore}} + {{/optional}} + {{^optional}} + {{paramName}}: {{dataType}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}}{{#hasMore}}, {{/hasMore}} + {{/optional}}{{/allParams}})(implicit reader: ClientResponseReader[{{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}Unit{{/returnType}}]{{#bodyParams}}, writer: RequestWriter[{{dataType}}]{{/bodyParams}}){{#returnType}}: Future[{{returnType}}]{{/returnType}}{{^returnType}}: Future[Unit]{{/returnType}} = { + // create path and map variables + val path = + (addFmt("{{path}}"){{#pathParams}} + replaceAll ("\\{" + "{{baseName}}" + "\\}",{{paramName}}.toString) + {{/pathParams}}) + + // query params + val queryParams = new mutable.HashMap[String, String] + val headerParams = new mutable.HashMap[String, String] + + {{#requiredParamCount}} + // verify required params are set + val paramCount = (Set[Any]({{/requiredParamCount}}{{#requiredParams}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) - null).size + if (paramCount != {{requiredParamCount}}) sys.error("missing required params") + {{/requiredParamCount}} + + {{#queryParams}} + {{#optional}} + if({{paramName}} != null) {{paramName}}.foreach { v => queryParams += "{{baseName}}" -> v.toString } + {{/optional}} + {{^optional}} + if({{paramName}} != null) queryParams += "{{baseName}}" -> {{paramName}}.toString + {{/optional}} + {{/queryParams}} + + {{#headerParams}}headerParams += "{{baseName}}" -> {{paramName}}.toString + {{/headerParams}} + + val resFuture = client.submit("{{httpMethod}}", path, queryParams.toMap, headerParams.toMap, {{#bodyParam}}writer.write({{bodyParam}}){{/bodyParam}}{{^bodyParam}}"{{emptyBodyParam}}"{{/bodyParam}}) + resFuture flatMap { resp => + process(reader.read(resp)) + } + } + + {{/operation}} + +} +{{/operations}} diff --git a/modules/swagger-codegen/src/main/resources/asyncscala/client.mustache b/modules/swagger-codegen/src/main/resources/asyncscala/client.mustache new file mode 100644 index 000000000000..d652ab07a940 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/asyncscala/client.mustache @@ -0,0 +1,26 @@ +package {{package}} + +{{#imports}}import {{import}} +{{/imports}} +import com.wordnik.swagger.client._ +import apis._ +import java.io.Closeable + +class {{clientName}}(config: SwaggerConfig) extends Closeable { + val locator = config.locator + val name = config.name + + private[this] val client = transportClient + + protected def transportClient: TransportClient = new RestClient(config) + + {{#apiInfo}} + {{#apis}} + val {{name}} = new {{className}}(client, config) + {{/apis}} + {{/apiInfo}} + + def close() { + client.close() + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/asyncscala/model.mustache b/modules/swagger-codegen/src/main/resources/asyncscala/model.mustache new file mode 100644 index 000000000000..3892f28302ec --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/asyncscala/model.mustache @@ -0,0 +1,15 @@ +package {{package}} + +import org.joda.time.DateTime + +{{#models}} + +{{#model}} +case class {{classname}} ( + {{#vars}} + + {{name}}: {{#isNotRequired}}Option[{{/isNotRequired}}{{datatype}}{{#isNotRequired}}]{{/isNotRequired}} {{#hasMore}},{{/hasMore}}{{#description}} // {{description}}{{/description}}{{newline}} + {{/vars}} +) +{{/model}} +{{/models}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/asyncscala/sbt.mustache b/modules/swagger-codegen/src/main/resources/asyncscala/sbt.mustache new file mode 100644 index 000000000000..86d4779456a4 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/asyncscala/sbt.mustache @@ -0,0 +1,11 @@ +organization := "{{package}}" + +name := "{{projectName}}-client" + +libraryDependencies += "com.wordnik.swagger" %% "swagger-async-httpclient" % "0.3.0-WN5" + +libraryDependencies += "joda-time" % "joda-time" % "2.3" + +libraryDependencies += "org.joda" % "joda-convert" % "1.3.1" + +libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.0.13" % "provided" diff --git a/modules/swagger-codegen/src/main/resources/csharp/Newtonsoft.Json.dll b/modules/swagger-codegen/src/main/resources/csharp/Newtonsoft.Json.dll new file mode 100644 index 0000000000000000000000000000000000000000..26fdaffec145b1795af118d07ef764406d78f6f8 GIT binary patch literal 426496 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

BWZ_eV|^M^miQ6%*;qfy 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ΝZNt?r4^ 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 We5D(VilUEh|3}=%-*#gGP_xT_I literal 0 HcmV?d00001 diff --git a/modules/swagger-codegen/src/main/resources/csharp/api.mustache b/modules/swagger-codegen/src/main/resources/csharp/api.mustache new file mode 100644 index 000000000000..3d556fa72f85 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/csharp/api.mustache @@ -0,0 +1,101 @@ + using System; + using System.Collections.Generic; + using {{invokerPackage}}; + using {{modelPackage}}; + {{#imports}} + {{/imports}} + + namespace {{package}} { + {{#operations}} + public class {{classname}} { + string basePath; + private readonly ApiInvoker apiInvoker = ApiInvoker.GetInstance(); + + public {{classname}}(String basePath = "{{basePath}}") + { + this.basePath = basePath; + } + + public ApiInvoker getInvoker() { + return apiInvoker; + } + + // Sets the endpoint base url for the services being accessed + public void setBasePath(string basePath) { + this.basePath = basePath; + } + + // Gets the endpoint base url for the services being accessed + public String getBasePath() { + return basePath; + } + + {{#operation}} + + ///

+ /// {{summary}} {{notes}} + /// + {{#allParams}}/// {{description}} + {{#hasMore}} {{/hasMore}}{{/allParams}} + /// + public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}} {{nickname}} ({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { + // create path and map variables + var path = "{{path}}".Replace("{format}","json"){{#pathParams}}.Replace("{" + "{{paramName}}" + "}", apiInvoker.escapeString({{{paramName}}}.ToString())){{/pathParams}}; + + // query params + var queryParams = new Dictionary(); + var headerParams = new Dictionary(); + var formParams = new Dictionary(); + + {{#requiredParamCount}} + // verify required params are set + if ({{/requiredParamCount}}{{#requiredParams}} {{paramName}} == null {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { + throw new ApiException(400, "missing required params"); + } + {{/requiredParamCount}} + + {{#queryParams}}if ({{paramName}} != null){ + string paramStr = ({{paramName}} is DateTime) ? ((DateTime)(object){{paramName}}).ToString("u") : Convert.ToString({{paramName}}); + queryParams.Add("{{paramName}}", paramStr); + } + {{/queryParams}} + + {{#headerParams}}headerParams.Add("{{paramName}}", {{paramName}}); + {{/headerParams}} + + {{#formParams}}if ({{paramName}} != null){ + if({{paramName}} is byte[]) { + formParams.Add("{{paramName}}", {{paramName}}); + } else { + string paramStr = ({{paramName}} is DateTime) ? ((DateTime)(object){{paramName}}).ToString("u") : Convert.ToString({{paramName}}); + formParams.Add("{{paramName}}", paramStr); + } + } + {{/formParams}} + + try { + if (typeof({{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}) == typeof(byte[])) { + var response = apiInvoker.invokeBinaryAPI(basePath, path, "GET", queryParams, null, headerParams, formParams); + return {{#returnType}}((object)response) as {{{returnType}}}{{/returnType}}; + } else { + var response = apiInvoker.invokeAPI(basePath, path, "{{httpMethod}}", queryParams, {{#bodyParam}}{{bodyParam}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}, headerParams, formParams); + if(response != null){ + return {{#returnType}}({{{returnType}}}) ApiInvoker.deserialize(response, typeof({{{returnType}}})){{/returnType}}; + } + else { + return {{#returnType}}null{{/returnType}}; + } + } + } catch (ApiException ex) { + if(ex.ErrorCode == 404) { + return {{#returnType}}null{{/returnType}}; + } + else { + throw ex; + } + } + } + {{/operation}} + } + {{/operations}} + } \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/csharp/apiException.mustache b/modules/swagger-codegen/src/main/resources/csharp/apiException.mustache new file mode 100644 index 000000000000..3b371aea9a8c --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/csharp/apiException.mustache @@ -0,0 +1,21 @@ +using System; + +namespace {{invokerPackage}} { + public class ApiException : Exception { + + private int errorCode = 0; + + public ApiException() {} + + public int ErrorCode { + get + { + return errorCode; + } + } + + public ApiException(int errorCode, string message) : base(message) { + this.errorCode = errorCode; + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/csharp/apiInvoker.mustache b/modules/swagger-codegen/src/main/resources/csharp/apiInvoker.mustache new file mode 100644 index 000000000000..f7c76ee2c569 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/csharp/apiInvoker.mustache @@ -0,0 +1,207 @@ + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using System.Net; + using System.Text; + using Newtonsoft.Json; + + namespace {{invokerPackage}} { + public class ApiInvoker { + private static readonly ApiInvoker _instance = new ApiInvoker(); + private Dictionary defaultHeaderMap = new Dictionary(); + + public static ApiInvoker GetInstance() { + return _instance; + } + + public void addDefaultHeader(string key, string value) { + defaultHeaderMap.Add(key, value); + } + + public string escapeString(string str) { + return str; + } + + public static object deserialize(string json, Type type) { + try + { + return JsonConvert.DeserializeObject(json, type); + } + catch (IOException e) { + throw new ApiException(500, e.Message); + } + + } + + public static string serialize(object obj) { + try + { + return obj != null ? JsonConvert.SerializeObject(obj) : null; + } + catch (Exception e) { + throw new ApiException(500, e.Message); + } + } + + public string invokeAPI(string host, string path, string method, Dictionary queryParams, object body, Dictionary headerParams, Dictionary formParams) + { + return invokeAPIInternal(host, path, method, false, queryParams, body, headerParams, formParams) as string; + } + + public byte[] invokeBinaryAPI(string host, string path, string method, Dictionary queryParams, object body, Dictionary headerParams, Dictionary formParams) + { + return invokeAPIInternal(host, path, method, true, queryParams, body, headerParams, formParams) as byte[]; + } + + private object invokeAPIInternal(string host, string path, string method, bool binaryResponse, Dictionary queryParams, object body, Dictionary headerParams, Dictionary formParams) { + var b = new StringBuilder(); + + foreach (var queryParamItem in queryParams) + { + var value = queryParamItem.Value; + if (value == null) continue; + b.Append(b.ToString().Length == 0 ? "?" : "&"); + b.Append(escapeString(queryParamItem.Key)).Append("=").Append(escapeString(value)); + } + + var querystring = b.ToString(); + + host = host.EndsWith("/") ? host.Substring(0, host.Length - 1) : host; + + var client = WebRequest.Create(host + path + querystring); + client.Method = method; + + byte[] formData = null; + if (formParams.Count > 0) + { + string formDataBoundary = String.Format("----------{0:N}", Guid.NewGuid()); + client.ContentType = "multipart/form-data; boundary=" + formDataBoundary; + formData = GetMultipartFormData(formParams, formDataBoundary); + client.ContentLength = formData.Length; + } + else + { + client.ContentType = "application/json"; + } + + foreach (var headerParamsItem in headerParams) + { + client.Headers.Add(headerParamsItem.Key, headerParamsItem.Value); + } + foreach (var defaultHeaderMapItem in defaultHeaderMap.Where(defaultHeaderMapItem => !headerParams.ContainsKey(defaultHeaderMapItem.Key))) + { + client.Headers.Add(defaultHeaderMapItem.Key, defaultHeaderMapItem.Value); + } + + switch (method) + { + case "GET": + break; + case "POST": + case "PUT": + case "DELETE": + using (Stream requestStream = client.GetRequestStream()) + { + if (formData != null) + { + requestStream.Write(formData, 0, formData.Length); + } + + var swRequestWriter = new StreamWriter(requestStream); + swRequestWriter.Write(serialize(body)); + swRequestWriter.Close(); + } + break; + default: + throw new ApiException(500, "unknown method type " + method); + } + + try + { + var webResponse = (HttpWebResponse)client.GetResponse(); + if (webResponse.StatusCode != HttpStatusCode.OK) + { + webResponse.Close(); + throw new ApiException((int)webResponse.StatusCode, webResponse.StatusDescription); + } + + if (binaryResponse) + { + using (var memoryStream = new MemoryStream()) + { + webResponse.GetResponseStream().CopyTo(memoryStream); + return memoryStream.ToArray(); + } + } + else + { + using (var responseReader = new StreamReader(webResponse.GetResponseStream())) + { + var responseData = responseReader.ReadToEnd(); + return responseData; + } + } + } + catch(WebException ex) + { + var response = ex.Response as HttpWebResponse; + int statusCode = 0; + if (response != null) + { + statusCode = (int)response.StatusCode; + response.Close(); + } + throw new ApiException(statusCode, ex.Message); + } + } + + private static byte[] GetMultipartFormData(Dictionary postParameters, string boundary) + { + Stream formDataStream = new System.IO.MemoryStream(); + bool needsCLRF = false; + + foreach (var param in postParameters) + { + // Thanks to feedback from commenters, add a CRLF to allow multiple parameters to be added. + // Skip it on the first parameter, add it to subsequent parameters. + if (needsCLRF) + formDataStream.Write(Encoding.UTF8.GetBytes("\r\n"), 0, Encoding.UTF8.GetByteCount("\r\n")); + + needsCLRF = true; + + if (param.Value is byte[]) + { + string postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n", + boundary, + param.Key, + "application/octet-stream"); + formDataStream.Write(Encoding.UTF8.GetBytes(postData), 0, Encoding.UTF8.GetByteCount(postData)); + + // Write the file data directly to the Stream, rather than serializing it to a string. + formDataStream.Write((param.Value as byte[]), 0, (param.Value as byte[]).Length); + } + else + { + string postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}", + boundary, + param.Key, + param.Value); + formDataStream.Write(Encoding.UTF8.GetBytes(postData), 0, Encoding.UTF8.GetByteCount(postData)); + } + } + + // Add the end of the request. Start with a newline + string footer = "\r\n--" + boundary + "--\r\n"; + formDataStream.Write(Encoding.UTF8.GetBytes(footer), 0, Encoding.UTF8.GetByteCount(footer)); + + // Dump the Stream into a byte[] + formDataStream.Position = 0; + byte[] formData = new byte[formDataStream.Length]; + formDataStream.Read(formData, 0, formData.Length); + formDataStream.Close(); + + return formData; + } + } + } diff --git a/modules/swagger-codegen/src/main/resources/csharp/compile.mustache b/modules/swagger-codegen/src/main/resources/csharp/compile.mustache new file mode 100644 index 000000000000..be16fb1636e8 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/csharp/compile.mustache @@ -0,0 +1,2 @@ +SET CSCPATH=%SYSTEMROOT%\Microsoft.NET\Framework\v4.0.30319 +%CSCPATH%\csc /reference:bin/Newtonsoft.Json.dll /target:library /out:bin/{{invokerPackage}}.dll /recurse:src\*.cs /doc:bin/{{invokerPackage}}.xml \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/csharp/model.mustache b/modules/swagger-codegen/src/main/resources/csharp/model.mustache new file mode 100644 index 000000000000..d9ef4ffbedd0 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/csharp/model.mustache @@ -0,0 +1,30 @@ +using System; +using System.Text; +using System.Collections; +using System.Collections.Generic; + +{{#models}} +{{#model}} +namespace {{package}} { + public class {{classname}} { + {{#vars}} + + {{#description}}/* {{{description}}} */ + {{/description}} + public {{{datatype}}} {{name}} { get; set; } + + {{/vars}} + + public override string ToString() { + var sb = new StringBuilder(); + sb.Append("class {{classname}} {\n"); + {{#vars}} + sb.Append(" {{name}}: ").Append({{name}}).Append("\n"); + {{/vars}} + sb.Append("}\n"); + return sb.ToString(); + } + } + {{/model}} + {{/models}} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/ASAXB-0.1.1.swc b/modules/swagger-codegen/src/main/resources/flash/ASAXB-0.1.1.swc new file mode 100644 index 0000000000000000000000000000000000000000..c93590267846ce45564dfeff8275a0030e39b2fc GIT binary patch literal 46948 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 + + + + + + AirExecutorApp + + + AirExecutorApp + + + AirExecutorApp + + + v1 + + + + + + + + + + + + + + + AirExecutorApp.swf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/swagger-codegen/src/main/resources/flash/ApiClientEvent.as b/modules/swagger-codegen/src/main/resources/flash/ApiClientEvent.as new file mode 100644 index 000000000000..313da09ea782 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/ApiClientEvent.as @@ -0,0 +1,36 @@ +package com.wordnik.swagger.event { +import com.wordnik.swagger.event.Response; + +import flash.events.Event; + +/** + * Event dispatched by the SDK to communicate success events and failure events. + * If a custom dispatcher has been assigned by the consumer on the generated client then the dispatcher dispatches + * the ApiClientEvent to indicate success or failure of the invocation using the Response + */ +public class ApiClientEvent extends Event{ + + /** + * Event type to indicate a unsuccessful invocation + */ + public static const FAILURE_EVENT:String = "unsuccesfulInvocation"; + + /** + * Event type to indicate a successful invocation + */ + public static const SUCCESS_EVENT:String = "successfulInvocation"; + + /** + * The Response object which contains response info + */ + public var response: Response; + /** + * Any additional info + */ + public var message:String; + + public function ApiClientEvent(type:String,bubbles:Boolean = false,cancelable:Boolean = false) { + super(type, bubbles, cancelable); + } +} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/ApiError.as b/modules/swagger-codegen/src/main/resources/flash/ApiError.as new file mode 100644 index 000000000000..13d094158291 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/ApiError.as @@ -0,0 +1,10 @@ +package com.wordnik.swagger.exception +{ + public class ApiError extends Error + { + public function ApiError(id:*=0, message:*="") + { + super(message,id); + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/ApiErrorCodes.as b/modules/swagger-codegen/src/main/resources/flash/ApiErrorCodes.as new file mode 100644 index 000000000000..abe12178361e --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/ApiErrorCodes.as @@ -0,0 +1,34 @@ +package com.wordnik.swagger.exception +{ + public class ApiErrorCodes + { + /** + * System exception. + */ + public static const SYSTEM_EXCEPTION: Number = 0; + + /** + * With Arguments as current key. + */ + public static const API_KEY_NOT_VALID: Number = 1000; + /** + * With arguments as current token value + */ + public static const AUTH_TOKEN_NOT_VALID: Number = 1001; + /** + * With arguments as input JSON and output class anme + */ + public static const ERROR_CONVERTING_JSON_TO_JAVA: Number = 1002; + /** + * With arguments as JAVA class name + */ + public static const ERROR_CONVERTING_JAVA_TO_JSON: Number = 1003; + + public static const ERROR_FROM_WEBSERVICE_CALL: Number = 1004; + /** + * With arguments as current API server name + */ + public static const API_SERVER_NOT_VALID: Number = 1005; + + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/ApiInvoker.as b/modules/swagger-codegen/src/main/resources/flash/ApiInvoker.as new file mode 100644 index 000000000000..40ad41af65f4 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/ApiInvoker.as @@ -0,0 +1,289 @@ +package com.wordnik.swagger.common +{ +import asaxb.xml.bind.ASAXBContext; +import asaxb.xml.bind.Unmarshaller; + +import com.wordnik.swagger.event.ApiClientEvent; +import com.wordnik.swagger.event.Response; +import com.wordnik.swagger.common.ApiUserCredentials; + +import flash.events.EventDispatcher; +import flash.utils.Dictionary; +import flash.utils.describeType; +import flash.xml.XMLDocument; +import flash.xml.XMLNode; + +import mx.messaging.ChannelSet; +import mx.messaging.channels.HTTPChannel; +import mx.messaging.messages.HTTPRequestMessage; +import mx.rpc.AsyncToken; +import mx.rpc.events.FaultEvent; +import mx.rpc.events.ResultEvent; +import mx.rpc.http.HTTPService; +import mx.rpc.xml.SimpleXMLEncoder; +import mx.utils.ObjectUtil; + + +public class ApiInvoker extends EventDispatcher +{ + + private var _apiUsageCredentials:ApiUserCredentials; + internal var _apiProxyServerUrl:String = ""; + private var _baseUrl: String = ""; + internal var _useProxyServer: Boolean = true; + private var _proxyHostName:String = ""; + private var _apiPath: String = ""; + private var _proxyPath: String = ""; + + public var _apiEventNotifier:EventDispatcher; + + private static const DELETE_DATA_DUMMY:String = "dummyDataRequiredForDeleteOverride"; + private static const X_HTTP_OVERRIDE_KEY:String = "X-HTTP-Method-Override"; + private static const CONTENT_TYPE_HEADER_KEY:String = "Content-Type"; + + public function ApiInvoker(apiUsageCredentials: ApiUserCredentials, eventNotifier: EventDispatcher, useProxy: Boolean = true) { + _apiUsageCredentials = apiUsageCredentials; + _useProxyServer = useProxy; + if(_apiUsageCredentials.hostName != null){ + _proxyHostName = _apiUsageCredentials.hostName; + } + _apiPath = _apiUsageCredentials.apiPath; + _proxyPath = _apiUsageCredentials.proxyPath; + _apiProxyServerUrl = _apiUsageCredentials.apiProxyServerUrl; + _apiEventNotifier = eventNotifier; + } + + public function invokeAPI(resourceURL: String, method: String, queryParams: Dictionary, postObject: Object, headerParams: Dictionary): AsyncToken { + //make the communication + if(_useProxyServer) { + resourceURL = _apiProxyServerUrl + resourceURL; + } + else{ + resourceURL = "http://"+ _proxyHostName + _apiPath + resourceURL; + } + + var counter: int = 0; + var symbol: String = "&"; + var paramValue: Object; + for (var paramName:String in queryParams) { + paramValue = queryParams[paramName]; + //var key:String = paramName; + // do stuff + symbol = "&"; + if(counter == 0){ + symbol = "?"; + } + resourceURL = resourceURL + symbol + paramName + "=" + paramValue.toString(); + counter++; + + } +// trace(resourceURL); + //create a httpservice and invoke the rest url waiting for response + var requestHeader:Object = new Object(); + if(headerParams != null) { + for(var key: String in headerParams) { + requestHeader[key] = headerParams[key]; + } + } + + resourceURL = ApiUrlHelper.appendTokenInfo(resourceURL, requestHeader, _apiUsageCredentials); + + var bodyData:String = marshal(postObject).toString();//restRequest.postData; + + return doRestCall(resourceURL, onApiRequestResult, onApiRequestFault, method, bodyData, requestHeader, "application/xml"); + + + } + + private function doRestCall( url : String, resultFunction : Function, faultFunction : Function = null, + restMethod : String = "GET", + bodyData : Object = null, headers: Object = null, contentType:String = "application/xml" ) : AsyncToken + { + var httpService : HTTPService = new HTTPService( ); + + if(headers == null){ + headers = new Object(); + } + httpService.method = restMethod; + + if ( restMethod.toUpperCase() != HTTPRequestMessage.GET_METHOD ) + { + //httpService.method = HTTPRequestMessage.POST_METHOD; - not required as we're using the proxy + if( bodyData == null ) + { + bodyData = new Object(); + } + + if(restMethod == HTTPRequestMessage.DELETE_METHOD){ + headers[X_HTTP_OVERRIDE_KEY]= HTTPRequestMessage.DELETE_METHOD; + bodyData = DELETE_DATA_DUMMY; + } + else if(restMethod == HTTPRequestMessage.PUT_METHOD){ + headers[X_HTTP_OVERRIDE_KEY]= HTTPRequestMessage.PUT_METHOD; + } + else{ + headers[CONTENT_TYPE_HEADER_KEY]= contentType; + } + } + else + { + //if the request type is GET and content type is xml then the Flex HTTPService converts it to a POST ... yeah + contentType = null; + } + + httpService.url = url; + httpService.contentType = contentType; + httpService.resultFormat = "e4x"; + httpService.headers = headers; + httpService.addEventListener( ResultEvent.RESULT, resultFunction ); + if( faultFunction != null ) + { + httpService.addEventListener( FaultEvent.FAULT, faultFunction ); + } + if(_useProxyServer){ + httpService.useProxy = true; + + var channelSet: ChannelSet = new ChannelSet(); + var httpChannel: HTTPChannel = new HTTPChannel(); + httpChannel.uri = ApiUrlHelper.getProxyUrl(_proxyHostName, _proxyPath); + channelSet.addChannel(httpChannel); + httpService.channelSet = channelSet; + } + + return httpService.send( bodyData ); + } + + private function onApiRequestResult(event:ResultEvent):void + { + var completionListener: Function = event.token.completionListener; + var result: Object = event.result; + var resultType: Class = event.token.returnType; + var resultObject:Object; + if(resultType != null) { + var context:ASAXBContext = ASAXBContext.newInstance(resultType); + var unmarshaller:Unmarshaller = context.createUnmarshaller(); + var resultXML: XML = new XML(event.result); + try{ + resultObject = unmarshaller.unmarshal(resultXML); + } + catch(error: TypeError){ + var errorResponse: Response = new Response(false, null, "Could not unmarshall response"); + if (_apiEventNotifier != null) { //dispatch event via assigned dispatcher + var failureEvent: ApiClientEvent = new ApiClientEvent(event.token.completionEventType); + failureEvent.response = errorResponse; + _apiEventNotifier.dispatchEvent(failureEvent); + } + } + + if(resultObject is ListWrapper){ + resultObject = ListWrapper(resultObject).getList(); + } + } + + var response : Response = new Response(true, resultObject); + response.requestId = event.token.requestId; + var successEventType: String = event.token.completionEventType != null ? event.token.completionEventType : ApiClientEvent.SUCCESS_EVENT; + + if (_apiEventNotifier != null) { //dispatch event via assigned dispatcher + var successEvent: ApiClientEvent = new ApiClientEvent(successEventType); + successEvent.response = response; + _apiEventNotifier.dispatchEvent(successEvent); + } + } + + private function onApiRequestFault(event:FaultEvent):void + { + var completionListener: Function = event.token.completionListener; + if(completionListener != null){ + completionListener.call( null, new Response( false, null, event.fault.faultString) ); + } + + var failureEventType: String = event.token.completionEventType != null ? event.token.completionEventType : ApiClientEvent.FAILURE_EVENT; + + if (_apiEventNotifier != null) { //dispatch event via assigned dispatcher + var failureEvent: ApiClientEvent = new ApiClientEvent(failureEventType); + failureEvent.response = new Response( false, null, event.fault.faultString); + _apiEventNotifier.dispatchEvent(failureEvent); + } + } + + + public function marshal(source:Object):Object { +// trace("marshal got - " + source) + if(source is String) { + return source; + } else if(source is Array && source.length > 0) { + var writer:XMLWriter=new XMLWriter(); + var sourceArray: Array = source as Array; + var arrayEnclosure: String = getArrayEnclosure(sourceArray); + writer.xml.setName(arrayEnclosure); + + for (var i:int = 0; i < sourceArray.length; i++) { + var o: Object = sourceArray[i]; + writer.xml.appendChild(marshal(o)); + } + return writer.xml; + } else + return marshalObject(source); + } + + public function marshalObject(source:Object):XML + { + var writer:XMLWriter=new XMLWriter(); + var objDescriptor:XML=describeType(source); + var property:XML; + var propertyType:String; + var propertyValue:Object; + + var qualifiedClassName:String=objDescriptor.@name; + qualifiedClassName=qualifiedClassName.replace("::","."); + var className: String = qualifiedClassName.substring(qualifiedClassName.lastIndexOf(".") + 1); + className = className().toLowerCase() + className.substring(1); + writer.xml.setName(className); + + for each(property in objDescriptor.elements("variable")){ + propertyValue=source[property.@name]; + if (propertyValue!=null){ + if (ObjectUtil.isSimple(propertyValue)){ + writer.addProperty(property.@name, propertyValue.toString()); + } + else { + writer.addProperty(property.@name, marshal(propertyValue).toXMLString()); + } + } + } + for each(property in objDescriptor.elements("accessor")){ + if (property.@access=="readonly"){ + continue; + } + propertyValue=source[property.@name]; + if (source[property.@name]!=null){ + if (ObjectUtil.isSimple(propertyValue)){ + writer.addProperty(property.@name, propertyValue.toString()); + } + else { + writer.addProperty(property.@name, marshal(propertyValue).toXMLString()); + } + } + } + return writer.xml; + } + + public function escapeString(str: String): String { + return str; + } + + private function getArrayEnclosure(arr: Array) : String { + if(arr != null && arr.length > 0) { + var className: String = flash.utils.getQualifiedClassName(arr[0]) + if(className.indexOf("::") > 0) + className = className.substr(className.indexOf("::") + 2, className.length) + + return className.substring(0, 1).toLowerCase() + className.substring(1, className.length) + "s"; + } else + return ""; + } + + +} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/ApiUrlHelper.as b/modules/swagger-codegen/src/main/resources/flash/ApiUrlHelper.as new file mode 100644 index 000000000000..affa1eb0ff94 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/ApiUrlHelper.as @@ -0,0 +1,41 @@ +package com.wordnik.swagger.common { +import com.wordnik.swagger.common.ApiUserCredentials; + +/** + * @private + * Internal class for the Rest client + */ +internal class ApiUrlHelper { + + private static const API_URL_KEY:String = "api_key"; + private static const AUTH_TOKEN_URL_KEY:String = "auth_token"; + + private static const HTTP_URL_PREFIX:String = "http://"; + + internal static function appendTokenInfo(restUrl:String, requestHeader: Object, credentials: ApiUserCredentials): String { + //checks for the presence api credentials on client initialization and not repeated here + if(restUrl.indexOf("?") == -1){ + restUrl += ( "?" + API_URL_KEY + "=" + credentials.apiToken ); + } + else{ + restUrl += ( "&" + API_URL_KEY + "=" + credentials.apiToken ); + } + requestHeader.api_key = credentials.apiToken; + + if(credentials.authToken != null && credentials.authToken != ""){ + restUrl += ( "&" + AUTH_TOKEN_URL_KEY + "=" + credentials.authToken ); + requestHeader.auth_token = credentials.authToken; + } + + return restUrl; + } + + internal static function getProxyUrl(hostName: String, proxyPath: String): String{ + if (hostName(hostName.length - 1) == "/") //remove trailing slash + { + hostName = hostName.substring(0, hostName.length - 1); + } + return HTTP_URL_PREFIX + hostName + proxyPath; + } +} +} diff --git a/modules/swagger-codegen/src/main/resources/flash/ApiUserCredentials.as b/modules/swagger-codegen/src/main/resources/flash/ApiUserCredentials.as new file mode 100644 index 000000000000..a7536c213e26 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/ApiUserCredentials.as @@ -0,0 +1,63 @@ +package com.wordnik.swagger.common { + +/** + * Api account credentials. + * + */ +public class ApiUserCredentials { + /** + * An apitoken that is passed along with the requests + */ + public var apiToken:String; + /** + * A valid auth_token which could be necessary for certain operations + */ + public var authToken:String; + /** + * The userId which could be required for certain operations + */ + public var userId:Number; + /** + * The host name for the Rest API eg. api.companyName.com + */ + public var hostName:String; + + /** + * The base path to the api resources - used along with the hostname + * eg. /v4 + */ + public var apiPath: String; + + /** + * The base path to the blazeds proxy + * eg. /v4/messagebroker/restproxy + */ + public var proxyPath: String; + + /** + * If a proxy server has been set up for the services specify the URL here. This value is used when the Api is invoked with + * the value useProxy as true + */ + public var apiProxyServerUrl: String; + + /** + * Constructor of ApiUserCredentials + * @param apiToken An apitoken that is passed along with the requests + * @param authToken A valid auth_token which could necessary for certain operations + * @param hostName The host name for the Rest API eg. api.companyName.com + * @param userId The userId which is required for certain operations - currently, get user lists + */ + public function ApiUserCredentials(hostName: String, apiPath: String, apiToken: String, + authToken: String = null, userId: Number = -1, apiProxyServerUrl: String="", + proxyPath: String = null) { + this.hostName = hostName; + this.apiToken = apiToken; + this.authToken = authToken; + this.userId = userId; + this.apiPath = apiPath; + this.apiProxyServerUrl = apiProxyServerUrl; + this.proxyPath = proxyPath; + } + +} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/ListWrapper.as b/modules/swagger-codegen/src/main/resources/flash/ListWrapper.as new file mode 100644 index 000000000000..1ea2ebead00b --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/ListWrapper.as @@ -0,0 +1,9 @@ +package com.wordnik.swagger.common +{ + public interface ListWrapper + { + + function getList(): Array; + + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/Response.as b/modules/swagger-codegen/src/main/resources/flash/Response.as new file mode 100644 index 000000000000..56cceb619595 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/Response.as @@ -0,0 +1,56 @@ +package com.wordnik.swagger.event { + +/** + * Response contains info on the result of an API invocation. + * A completion listener will expect this Response object. + */ +public class Response { + + /** + * Indicates whether the invoked operation failed or succeeded + */ + public var isSuccess:Boolean; + + /** + * The payload of the succesful operation eg. a Word in a WordRequest + */ + public var payload:Object; + + /** + * Error message in case of failure + */ + public var errorMessage:String; + + /** + * A request Id that was passed in by the user as a param when invoking the operation + */ + public var requestId:String; + private static const API_ERROR_MSG:String = "Api error response: "; + + public function Response(isSuccessful: Boolean, payload: Object = null, errorMessage: String = null, requestId: String = null) { + this.isSuccess = isSuccessful; + this.payload = payload; + this.errorMessage = getFriendlyMessage(errorMessage); + } + + private static function getFriendlyMessage(errorMessage: String): String{ + var result: String = errorMessage; + if(errorMessage == null) + return null; + var errorCode: String; + var errorCodeArray: Array = errorMessage.match(/(?<=HTTP\/1.1 )[0-9][0-9][0-9]/); + if(errorCodeArray != null && errorCodeArray.length == 1){ + errorCode = String(errorCodeArray[0]); + } + var msgArray: Array = errorMessage.match(/(?<=HTTP\/1.1 [0-9][0-9][0-9] )[^]*/); + if(msgArray != null && msgArray.length == 1){ + result = API_ERROR_MSG + String(msgArray[0]); + } + return result; + } + + public function toString(): String { + return "Response (requestId:" + requestId + "; isSuccess:" + isSuccess + "; errorMessage:" + errorMessage + "; payload:" + payload + ")"; + } +} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/SwaggerApi.as b/modules/swagger-codegen/src/main/resources/flash/SwaggerApi.as new file mode 100644 index 000000000000..a78f3105cb16 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/SwaggerApi.as @@ -0,0 +1,75 @@ +package com.wordnik.swagger.common +{ + import com.wordnik.swagger.common.ApiUserCredentials; + + import flash.events.EventDispatcher; + import flash.events.IEventDispatcher; + + import mx.utils.UIDUtil; + + public class SwaggerApi extends EventDispatcher + { + + protected var _apiUsageCredentials:ApiUserCredentials; + protected var _apiEventNotifier:EventDispatcher; + protected var _apiInvoker: ApiInvoker; + + protected var _useProxyServer: Boolean = false; + + + /** + * Constructor for the api client + * @param apiCredentials Wrapper object for tokens and hostName required towards authentication + * @param eventDispatcher Optional event dispatcher that when provided is used by the SDK to dispatch any Response + */ + public function SwaggerApi(apiCredentials: ApiUserCredentials, eventDispatcher: EventDispatcher = null) { + super(); + _apiUsageCredentials = apiCredentials; + _apiEventNotifier = eventDispatcher; + } + + public function useProxyServer(value:Boolean, proxyServerUrl: String = null):void { + _useProxyServer = value; + } + + protected function getApiInvoker():ApiInvoker { + if(_apiInvoker == null){ + if(_apiEventNotifier == null){ + _apiEventNotifier = this; + } + _apiInvoker = new ApiInvoker(_apiUsageCredentials, _apiEventNotifier, _useProxyServer); + } + return _apiInvoker; + } + + protected function getUniqueId():String { + return UIDUtil.createUID(); + } + + /** + * Method for returning the path value + * For a string value an empty value is returned if the value is null + * @param value + * @return + */ + protected static function toPathValue(value: Object): String { + if(value is Array){ + return arrayToPathValue(value as Array); + } + return value == null ? "" : value.toString(); + } + + /** + * Method for returning a path value + * For a list of objects a comma separated string is returned + * @param objects + * @return + */ + protected static function arrayToPathValue(objects: Array): String { + var out: String = ""; + + return objects.join(","); + } + + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/XMLWriter.as b/modules/swagger-codegen/src/main/resources/flash/XMLWriter.as new file mode 100644 index 000000000000..067f49e6301c --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/XMLWriter.as @@ -0,0 +1,28 @@ +package com.wordnik.swagger.common +{ + public class XMLWriter + { + public var xml:XML; + + public function XMLWriter() + { + xml=; + } + + public function reset():void { + xml=new XML(); + } + + public function addProperty(propertyName:String, propertyValue:String):XML { + var xmlProperty:XML= + xmlProperty.setName(propertyName); + xmlProperty.appendChild(propertyValue); + xml.appendChild(xmlProperty); + return xmlProperty; + } + + public function addAttribute(propertyName:String, attribute:String, attributeValue:String):void { + xml.elements(propertyName)[0].@[attribute]=attributeValue; + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/api.mustache b/modules/swagger-codegen/src/main/resources/flash/api.mustache new file mode 100644 index 000000000000..647ec763a24c --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/api.mustache @@ -0,0 +1,73 @@ +package {{package}} { + +import com.wordnik.swagger.common.ApiInvoker; +import com.wordnik.swagger.exception.ApiErrorCodes; +import com.wordnik.swagger.exception.ApiError; +import com.wordnik.swagger.common.ApiUserCredentials; +import com.wordnik.swagger.event.Response; +import com.wordnik.swagger.common.SwaggerApi; +{{#imports}}import {{import}}; +{{/imports}} + +import mx.rpc.AsyncToken; +import mx.utils.UIDUtil; +import flash.utils.Dictionary; +import flash.events.EventDispatcher; + +{{#operations}} +public class {{classname}} extends SwaggerApi { + /** + * Constructor for the {{classname}} api client + * @param apiCredentials Wrapper object for tokens and hostName required towards authentication + * @param eventDispatcher Optional event dispatcher that when provided is used by the SDK to dispatch any Response + */ + public function {{classname}}(apiCredentials: ApiUserCredentials, eventDispatcher: EventDispatcher = null) { + super(apiCredentials, eventDispatcher); + } + +{{#operation}} + public static const event_{{nickname}}: String = "{{nickname}}"; +{{/operation}} + +{{#operation}} + + /* + * Returns {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}} + */ + public function {{nickname}} ({{#allParams}}{{paramName}}: {{{dataType}}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}}{{#hasMore}}, {{/hasMore}}{{/allParams}}): String { + // create path and map variables + var path: String = "{{path}}".replace(/{format}/g,"xml"){{#pathParams}}.replace("{" + "{{paramName}}" + "}", getApiInvoker().escapeString({{{paramName}}})){{/pathParams}}; + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + {{#requiredParamCount}} + // verify required params are set + if({{/requiredParamCount}}{{#requiredParams}} {{paramName}} == null {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { + throw new ApiError(400, "missing required params"); + } + {{/requiredParamCount}} + + {{#queryParams}}if("null" != String({{paramName}})) + queryParams["{{paramName}}"] = toPathValue({{paramName}}); + {{/queryParams}} + + {{#headerParams}}headerParams["{{paramName}}"] = toPathValue({{paramName}}); + {{/headerParams}} + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "{{httpMethod}}", queryParams, {{#bodyParam}}{{bodyParam}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "{{nickname}}"; + + token.returnType = {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}null {{/returnType}}; + return requestId; + + } + {{/operation}} +} + {{/operations}} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/as3corelib.swc b/modules/swagger-codegen/src/main/resources/flash/as3corelib.swc new file mode 100644 index 0000000000000000000000000000000000000000..12dd6b3b0a6c661e6b4a3954856fada65493c2e5 GIT binary patch literal 255357 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 B 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®@5dE~Z5k#<;(zR1rKh?7gYZz`w6Oek7LVGO(-tz-3vzwYWj zo>Pb^FqwJ`31rG)sJ=jYEe*;G7w(Vvi6vNBBLn(&aE?$r|D<6!>fZyTP5U0}=0Jn| z{q-4%^=e?;=0hQuIo8IM8c>13OJr!*xeH+iK6ewTQcvyE_c-&U4&l-AEL?m9JvA5x zc%=Xjk6h3){yIj&e+Byq)jt~4xi5!pmOE8F`eC&BEbk^#R&P4a*7LrAfK@!!Y_XPT zfw^@pP&T_U4rqffLa$j3L+Q$Z2r}Lh`4RE%>gf;34DbiiGJ_Q*jhUz-V6>xNg%t|sSufuxZ_}12r z)XpSH#?hsL?g#o+X`e1F<&>7D8twbNlB8S$+x^ul+fI-k7_i~(QB`wGs1&@rVIBN+ zx086Purkfa+ICR;O_D!qolF3M#!#v~1uD$0{1Q=u?XUesxy!@go|>CA=v}FeJ3)-t zB*y|5V4PEK=*P)$ZmGPe?aSr~%w20BcBh>(Dc*3Q9aNU`SKy%~$HF!Ci7u_o<1m|c z6aRRqP#XPl{NW6s8Jn}l3w&>8IomwFd0`HG?zM|C8LS_TdEmkGATGA29O%p@GqkDN zpN_1DPX5k$oQEPGR6SmW^k7vWhLUe0H8vMY^a;#51Nh<%aLJlX(pk1^-pAuJIf#Y$$eiHcX%Q zr$^LhO41@Cab&c8)ho$qiYE(j`~)oDJiP~*^kR@0P>H6ez4&OQj1LRno&IfHH~{91IHmq* zh_Lsc`rK4QBs14=EZk*wu5EXF`WxJpVMxypDhU+CCZHO`*%2sJ8&JO(r-G9GoI4Mq~~5J$}iag3wgwZ+4(w0CeK|DIUY#Wglthn_tsd9(Wv zni=PKURd}W_yByO*-gTNl@4y9g>spbWA(V@@3^jnZN1bLkOqvmAo~#avLkKF-JjD6 zZU)M}odnJe4ih_E)kl%-K#mXTp&?|$3`58U*Hq+KJ&L3KIBh$T-}g&GCbeO%X^QWC znFQjmv;+8x1iok8CrAd-tnv{dE?$uC#ztiEKsf|R1f%vMw+hhp{c-TRNgX$fg=9PsAAH6^vZm8;whR+c6=aV#!i=%%HzW)V!)-`I4`Ug&Q1+I zNToAbRteCY5F^5k7_kF-ehZXOCQ?f#Xa`CSB8oLraDLr57O-ZP=I07}fwguUy0yo! zkh?3>3r$d%OyQW^Qj`LBl0&{>uE;Ve$l1`~qV@5v)fE`V*^i?|f2%}g0t3O{3r{^- zu5(^4w|Yxo>cWdw)m7Q+jWlD1u;g)A>2EjjOFe)H3n8%d%~&mokfqzw`#9$hiLaET zVlL}*(w5KKD5Uts9DBNcz*j-^l26+=qRp01SOaxbK>$2t4{QhQP|O!{mAHEAH-}fz zU*vJUE~#|+{WgY zg=Y)|vi7$l(L&BvQ2(ZO*FFaKwwl}{=G(DqcKz3*X4VHLIrZU&l>)LH$c=ezrIqDn zkI(xt9Z1F4i)Vfd3`$EG*iTX_{wrT2mHQW!clp0s2pe-2*qOfUYGKq2BI4&xfz7vJ zydm*WoG?4E#IbgX5o{etF3@Vph6bw^XW}!;zQRSd8aW+Ore_%B?!uF=f};p4@?I{8 zP-`H$v&P37q*010*Ar`V3=9ZiY@`Ns=k2+kD-c#(mze-Ka6;E%xxHF}n-g6AA$oS& z2iMW89~#gXf7m*I#aB=xzVB#m&H4UF_Lxo#s3Ia-B*v$|2UzRoYqW{1wxBP0^Twph zuQy;+AwA0o8WqOUM94^D3~h(On>z~uOh^=T*vm7U+(3-* z_Q-}jY`wr+%W>(1;`c9E%2SiYl`VHOpt#J@uSOnF_a~72?-lj90_2X+iyf zINmRcd^Bi}w>k8M`z6nGU)co)V^??~DoD}`c-oReh@%e4VGYII-laO$AyK^MrTy(P z9A$;b|AOFLb-cbBb(#Z2Hod?^ z4X+V+=9P}G14WVfXc_qy1n1-fMWo1@3N7<@lP=k29_P>sJj+muga#RySlLW-=CoVN zb+u}SriYH~K5~*ga!@DQU$7T!`XGHZX|9-D3TFVC4g(yAE1%2Zw~-f<7_RsDHkPnC zQ%l$2FxNHuZaN=h8E;tCQV0+b58-I#2Vgp#&G5{(8Zcmq{?ZsaIWqfRm^xDS@dI&B zZ_pU`EGZl29bmBvPV*T{flVI;BBA1#TP!S$Kt08i5U#aMSh8I ztQsWo{k0WY78CuJc;p~D2dmO6E~=Uyl4Aic9le0Lw%dztXLr>O2G^V@U36#O#oKc-M~*gd-Qo|m0X(mEQdJp% z$}t3$AH(L-8*TI#MYE&iN3%6a+Z18^ayV=~SN3=1B>5)!&9gBBN&rjj=QiiEmTMVr z^|pB+vvd?2vkzZV+<2z^DKPt->l^rOr94w!H`Bgt%gvCWb2v}YU$2}(VWqb9e5)T< z)FT+jz(dNei>SLjtFYJiN5Ju{buO=Sqa+SoJ(38|wcvS>QBXZ%L3kD@iSE=zkgqcI){ zu1zLHtB9%u(j%11m3A_p{j(qr3Uq}NRwCD1I6{*%pTcEwwJgT~E16+dF=cgWfqK?^ zqwC5gAkk1JR31;HgLkbhK`67A;JElGYqdAlGgJeft^;(9RWLGhiU-ks4DWJXkPE zdmAjlF5aWxgVEE(35+$79P5E=cqB9toZ4$=yF)2yRlM#|e7zdDuMP2ljRqz7SwebiMB3rHRYPL1U+hmWtlWUDY56NzLorMW z@_tuiE9+6UnoJEVbruo z{#ADQGkICTeCbSK3^!xfS0Kfe=k-x6ACU25wjv=?xH2poS|w)-9bzcSJWC4D<1&v) zf4jZyMr;CsX8%lAm>qUa*txKMwJSkVssrOo@bjkAF4#)YyL#NF3E-2DsrU21G0*`! zMyn8K??<{8|6CSG5QjF?hhh5gU4rqg2)shPav+#tuZ$i(*N6a+_2BAwCzBef_Gnv6 zdD!Tx!ptvut4Jr=9rnsKQ9}1uRYCw9-=*jn$$sI$jEL?1t)XQSRXhMO{Y4cWri*%( zA%;@C>Ja9$ipwuFEZ`pQjeD-{=}4~7oCNQLHy=J0Egyly$cuZ_Ol+^bSpPl`T# zg&94Q!ZsxSf{hRtBK`>Kt%6n7706w%X4tQ|kw*l^70bn) zHWylFs6}HVhD+i>35EKOL^(h3?2*_bxi5qeUJ1g5hXNl;N3?k=hZHK0{&jB6^GbIV zXVus`!fEcrKNbioSt=NFH5o`w@aeD(g|IxI057kFVjehr4JY8SRtM7gjq?0w&>UCb zx%6x=qnpYTLEBsf;sgwE+S7#jv-;7PP9I8fsA-$$s8|`4MfQ8~#BSL=Mkwo$z(<$7 zFYlM~dEuTgDkbC7!%iSnO3R6l`;s2lkV{k!x?DANu9+vawuy)MtwVsEXeJMq6JKg$ zhz>t2q$dZzq_4;3072toLmu0p;2(ZNJ4l=r6=q!4_wQB0pXuLYvaD~Xbs-s$X2hLj z?QYHiJctJj`Z`k??g=o2-|%q;lmZ>3!cu5C>0MQMLs7_!)%Zv(BM~l!Uy%P1RPv#4^nG@1%7#b#GZ1Nu_`5e>dgA zZ`*eg3A^-`L@xyFP^Kr%APG)_eMkQ}eT}$35(6=NgV}Jqgf{?f{cyTdY;?|&zc*AF zJk9M4%`(xxcFScHiw*<>GqjftR(5|;IvD$Mpmi4!#%cY`f=aJv~3<%I@Ghf{D}6-F?Y-cWv9W&!x@`K)k%~23yE#eJ+n-Zx7;a*w-4J};6xqGJ~K7= zip5&zMwNPaR#qzyK%^?q(J2bW{&xPsDraqKZM(-W;RxExdy- z)OmpDhku7(I9c5onE$F0OYXLD;WF?hgCT*)@X{k5Gti10c|Irm@H~{VR|YNJ`+++M8o?j%BXAsZvUbhi6Z^V@rn4%29w9_m#X% z8f?pu*9&l0B*8 z4%N~vZ?uikC=aMxm4RYyC>varM^y-oDDNWwmH2rGw1UjKM901)0;-v;$3z4PgO*pr zewv4mU!Sd@I_EzQZ~ZzFbSbvzqCTBs+R$v0%Old-`biTpWR6^-H|8$NO>^Fp+P?c z1HukUhH6OhLQ<`#w`?A%^{NG=nv8rM_!55$H7xKWH0O(T)%T z$y7D{jZ7lzM@ObJeA4!P0quT+UQma>g-HJZPsHky@7J9albuzy5DH$tz&-&BbDfa4*0|3V#!iG$hrDCJ7rf^&(N#cXcXL?P);!&()0T%vm}wE|+ri z#?TdBkZ||KKL~3|an${pAmlJW*uWp)fvBb4n5_Xi_59w&o1?<74Dw)e1qY}*u%bKh zpiEItcp$tcsUm!kOFP&KODm1ASoki{_OPqw?%{Vu&ok^!DcaS&5Le@g)x&1%XqZBB zjJg6BtH9>ZT|`En-BXcR*0& zJ(3G1sEf>1wrO-_q$PM1lCv;GN?wNOwmEz^7?k>X?q%PdOVPwKu#(dRMyb-*q7s#o{c zAWI&t>b$h6MbB@%8%&j2X02TSdbYN`x{qsY=oXv!)tY$q5A-b@9hupX<#FjI5K*?0VH@8*eY+ibYk>T&>Ie_~zWY0wSBpHz?#)0$6z28_a+N*U@2v$?5jd zASq6kHP*5A^af+N*CYP8<>6tA$L2hNo1DXtHsJ&+HP%+wsM6-kmZBLCL298&l=fN|%2@;T-qY(WJmW&x>2(ouQB}zBVYWF6sZ%SQ&=1c}_etQA37y zm~0)cOL?OEQQvhWa;Cvvxk!$k)V*i6%07y0HHRW+cwR|=pL{uvWt$)tM8KvVKNR7> zo2{;EDB^WZsKfnDhd3TU=?;sh9DJe4dFgyPj+kuR#*MdNKbanhSL*k-eFVaA^f;}g zqWZvIRsn);(p{N$uc0VDCxOS34dK#h%yyQ%9FvxX3@h0hv98*@|3SZkC%L-RT3iWA zmksvM7}g9_h95XOu+Vt@8>EJ&x&8dyel+vTBbr!Hn%;HlbrMS-=JDvY3zA={KAjM% zR*Y>%H4`82pqiq1Q8!@d<7p3!dJbC_!IMmJ;qU=O37a?gnpf%ASS93Mv3oAhxOQxF zCC0%DdF>Wv*ph7v{+$B=lR+Gwut&$6VBrzI3qAK^W!ajTX3^9snGy8<*EQaM&VqPg zcVgE+!#FYM|MdR;cXuJyf1d?Md!zr^SEy!Vhs6f{gWLZbz|Y$bq*!;;2?L%AXmOYi z`T)9Rp$7elzcHQYZ$^F&K7Zh|SRGYcFw-ybu&5Y;J=sR+6F{rM(D|^G-tPF~e1-5gP?A6Q`9< z(A>UnjMRY^I!#qSK>&irF?b)fzFjD3h_amN@iC5xIB%knzCBGx|MM72B*4`SH{3r zHVI{)fy^i`37kOUEa|!+IZ1H=mfkWQDMC!|rI{H@^>&1&5iva(|FoyYbK($x)sa0> z#1}Sb=!Pc;=KbIfr+{&kluiL@TiS#cVbEW#MBAYsqW!NDNdS1t5u!A2>TS>>!xo33BQ^Arl3tMi(@Va;7gIK+$`Ok%%Mq8P>hU10)JQ~#)DwWYRF<$iOdbtJMDKT zG{v*eWL9x=gNOThlk;^ zEQ2?dW*}SZQ^lV+PgYG~{icQmBCu#hhXR-Dd_o!3-dDASenuSTaQL z2i~vIY2KlLAokYAo6R@1@9Go(4*+yPi@%oHsa0*8a_GOPpA8zA3B~Uz)&UE)Dm+H~ zC{_;vEbPb%05mwp8s&s@2hm{e*BQg zA_i$%X{X@1Y-FC!D$U#G<`SXu*I{yC5%;YIh9jCRJE1ZW*9;Ru8k1O$6V?mKvDEsf!=8R@p#3eeC3<88)i|lWLFS^4_Jdhq zw4n2C(u`aGFKxEa3kP)pI4;XDVPrDe#PPPq^LDz*9dJAbXfzX7fF?Empsw&gy`|ud9NHE_U6v8gJ-U; zVtiiAAb#=_V?^(IZ;YYwW99IOhHzyVUZF$z`eC>?X}*;r^@9dl)b5z*`^P#gH__|X z7!M2K`QRDivhJ)W^a0OcKT32vudnr{{eJaLk+wOwDS2P-q0-T)S9Cb9}kR)5LKEAhgrwcKU*d0e$ znH#k2dcA)ZmsS6uru%c}vCS+~zec>(3x7QhXKSgsdmF({o3W_9gxMuNZ^2;YFM>0~mGM6;Pm zSgO^CB3A2Osk^u@xNEglYpqMIT3aR&XsuRjH@nHR`)_Ue=iK*ZgNWe&koWF==bn4+ zx#ymH?!E7wduN*wPX<=#S z;9&o}%F3-7|P}fu+${WT2~m zu&b}vL(k#%zM;W|rKJ|tj!2Sd|Ik1;C)p9HjCMzRqP>H$N?(N!33Wu~>3st|;lV}W z{{HT+NSMe~ZkrqH?2DYeHM}J{SMLtTIu}%?5Gl`K*I;*aQA0;xd(;!`j&Ae#Jq@Y+ z9NR=8?l9UT>Yr20<58 z9wBWDf(^JxnBpFqP~t0D+F5e)ik4GOK5fnF?cG}|POj_e40ko3d`^Y1FZ+t`KK$`l z|8f4=`tpAbKJaqs%BAj)qy<8wc*!mIoneeXfhaeEJ zXIo`YG!_eQ?&{rKxr)c4>!Y#$zTS@LfZ!G?D4Sl~v#lbDHt#63=B9a@I-*-P`768? z+cxO~;hyN$zJar2n^5>?MN#;h2KpnLVgr%+J=-=V>C8WpPDMDT;B)UFGjXCU(i!gU zjdo`bL}PtJ1Ci*ea4&)fve#!mJCVHvO3bl2I@sJB8w~eGqAEg%x(8K!8XStLZJfH+ zW|7s}ta99K1JQGaqOrjZT|Lo`HA90H$E@#Ba&o4lJFV0PDytwp#fn8^TC;`28cj}0 zk6j*TyAtbFc5FPWUdMrHaYC5NmT>n_^f>Wj(Ls4jUss1KO<-slveE@OpzyncckYUz z!LII@okNMT zgv}k3$JB{=37yD_^bH`>+}JgDOl<7#LQzz3QWcr?v*}^vu(7WrK^*C2AEC)MY~hx{ z0Zb`Q?Dv;`Q0l7Vqn56|g#2H zb&ZcL>FYygdgZEmf3;i}sP)N#s_MGDF?ya{UFFB@-s&nj;IFBZtLuIBa($rIF9!m3 z^`6hu3Ar{btQ(`GZRoGFz|Qkc!lq$(x_n7x)s z^-P-2v>GNYVNxTLR3^zxTE(PwOgoKU09lTS!$pu)P&! zwhj=gc`ORE=h!p>@=BHn5(sRu;1mF6ED=Ny)y0Bc0Livkm??lfwLx%zqAeC20;r|y z1QnQTv5+l*RRIE2^wUNYY^<<9^W81 zAqN%gXkRyE$K8Vg$4XeTokwrV4tnz5+WR@!MZPC~jOfTCt0 z-QIm(qd%nT>T;Z$5zvLe3lMlAgqY3{Dibstp;rTfuZ57NYY0|EQBfx#_y!=>ii8`$ zxCvUdI2Lp>U=gZ}2ul&+VUAENJPgL8(CP|h$7g)R?ks^7*5cnm@=-4$}{ZapWI ztLFyu#4_V?4h-fCWyTXki&0?dylv5V8;pZ#G~P+0@os{~&mlBE9vqJ}J|G%4s?+I6wB7I_bl3_r++#fDBK0z4hP+nbLWBeI{lg029<1b0r zJmaq%<}v;Tag?eZM6(GFTTC9NVja{38bWu9Tq~RjtSdzm>q-%!SyaI}2)&s@7YjFw z#;szjZ6>z)ZK747+r`k-;8cw4p)4*53Hve2y_m(gU*uAshN%yTN3_axY?TMaR+k5x zY%gWaMir8$?(<^il2CbQu0GcrnxoI*x6_2;;?CKa;#@}a`+q=kevk8sXl3)N(^joC zO<-bHpD#3h?wFB;C1&qLY33J8P-ITVI01_%B-!o|fiXaI8{^ugW*C zVQ8=u+tONXAGOq5{Kb}fsY1qH;YrmVtvn%iDvzD~e_of_5e=ClB-XqVBhdk= zC$?FN^mMoy`+9nCdT8Zvh0{3c-8_5DcM-Vuui@_@uuD|p;v_oI8}7FC^+yLd``Ihk zENfofwq|Y9`i2e7YgS8GBI}ARjkXVMc4NG&*Ap9x;Osr74|OXY1kOz{IL~6xjcc?t zu|zv^5RMb9w7g9xCgjhUgY$lyvBt^EkgB=F%dyG|(%ON~fZgZ%zT(kw4Kair*mJJ; zE81Y6+3i1PWu$N!sAhF0c7|hXqrDx7X-y=9Nj?<5P*HImMys$$8UvFOHP5WFxxA9M zh6j4n7eWqmqRP3p4fOR5Him~{(X5WHSbumh(#hdpSe6+pjLc=`G0oTFFE-Inu}PLo z3Do)OsxsHZN}#r?szwRa)YSxBnYEgH>{=Z)0ng7^+*q^r@tL@JeEK;uzYZ-b6@dTCe8Dztvgd_CLR z683!FShn4-T5~-4IUeQD;`tN0KI1cUCNL3>`T~tVq=$G#`;e?T+?t9_;je zuFf4f<`*<~cSkpeyVoS<7JPt9ynCg1Y^p^E=LPK%gvX*WPtQKW|w3`7Tq26{b&+0V_1Cz0%7F>V4YrhcZaAT*Ni z+|R8a+MjNEu}0Y0ZJ95hOFu)C({U)@apBPm?lv5I#y0MlK$Jc^G4|Ps-N(w=O*zN4 z@uAS_x3QL?{{FrJY|Ol9Z@9fX+LE4FHa4MHCf3nk0zMOyIu>dr!;4-~YWPguIHq>R zntS!WDWy13EA>PYI%B1J!l=%6oY2W#h-5caV6ZD1n`%vfQYblLLv2m6WnQOgCof{*w(h+lIn*Ds!%FVSV4jels4-O1Pk4%Y?1hU+fLsl%{TM*)Yz;>x1r=>&@1;3#X67rjN!CM zaUg44vwC$?-$$IB)4R_I$J0*$c4p&>>*525un6PXpJkXJy=)P9vve&Mswatdp+ZvZQ ztX|eskfKI;tdb@jYshC^G%;JFt1Xb>eU2&Y?OU3HxAaFNU3yov<9NTyjBD=230YT1 z8Vzp9k637Ndp_;R9?I879!s}*CuN<{FtQrUZfHl_9F7cHy+6BY_0qL#npbaVTi(>L zv}t`FvUlW^etc@Kn)%{>!kFTr;%RX|fR=)iy`i~bWee%;`j)1In5KV5%?HzX92=*nzpIHGAU?gQ z{oLU%rH<*eSx;;;wU7TerU$(pjon!J=z!ID`LWKS!4B-MjcKOBnLcf2IHM-TD$dj^ ztIO~OJW5vK%BKxP&*GU1%vDmu;9#_;e=umx+_c0LuKaVB4Hoerr|oQs4qzT+NblO5 zsqqmG(-O1wEImror4AD{t0(P6PYlj-q^+JDy;0Ob6K`T>#kyji+~Z@s z#eBtL<3iaG-G&A;`Pw5p&92g?$il=D+md*NS?jC}83c~6+)P`2M8#5e4lCyU9D*ri zt1h0;B9_pA95i3i!3}+DlWXP5<1WLjq-ISUwyUP``@BkzIc$vcjA689l~q)I4zV$E zReVmCBZf8KaiXWjBX`dcCC)ic5;Pn!>=Q8@2;4_b;oM0Ir$lRvnR7 zT|Ly(9vvtMu53E3t#M^DTEMpErIz8#UA=MT$~H<$rqq7^3xV{R!kWZ8B!;u*#=idT z3SSSfjq6u##3_n~)c90|-s-HiRtnCQeKdNRomav+vmFzIL*3n&sh~3)+t^D3Y4;Yg zs~h^xj`qf~2BQ7l;fVF5C6*l77C1o|=1t91@`PRC!wN2PaOkW!=GynD_Y8&Wo7Qb? zYT3|6Q!1KTSOe=A-^!10rKvtt4K9*5-rmw3NnmrH9$rMA_%s|5;3L(+$ zEqU0IZw6X2b74z(qT4#dG}?4{5`}pBxO*Ee7Z`ok5}fLiD!ckKUen2S{y??j^Va%n6`wCqPkt5tD#hpbBEVlC z@M5B`wkn|bY6Dd@a(#6*B?fAIc(1CjQT(+&%3oFE^U5`~RrPXhZEdw&SMT>@QeAzm zD|7y$RMpn|tL&)>i&9nZt*u95KCf5t`vd;k@t@VV6@Oiw*QfZa>%BfXQ17jlF;;_& zRoDCF8ZYta^VQcCjy=1C#ht(I8-E52$kuS9h<5~`^U)Z`xhvJ9nD=S3E4 zs_Oh$Q>?0jM7;HKb#1j@rn!)Uu$o%A&KK~h=0skps;&xn<@);CI>m?5Lh4mqXtmy& zfIT&0DOLV}*DKe0Nvzd%D7AnOC5SbttMba#HC5iMjFqC|t3x5XGRIWK??aJb3HAQE z+@oLCA+f4j@6o<4wb*J{D{r7W=cr*?L9M9r$#sDMR=m2_hZXl$)nJ=?>*|ox8h^Df z{R63t*tK$vzrH^A=(!^Bs6iNDw94maNhx`KHTBqbTvz?o zfx7&$-ijiR{s76*@2yn=Ro=Q=&ZfGSkwua@g;Yis0ctV#9}ugPpXAX z8m#&e?mi07DEEeYqVnMO{%CRXWq8FHFT*`!e9o${8j2z^R3?_D`Zt>8V!$j7s| zGT#cw*w5;wDo|)IbQWe8idum-sc@P$b37;umBoe2$1g5CbDX_sanXfPv{Bmu+C@;f z3$#5@_#6~|2ekcAcn}Kz3Wc|dh2ItnzathtAgMOR>2l}f=H(YSL`8L&59448h~Rh* z5+AFxnCN1%n<)yD@|dDBHJ>SkOc}@I@l2V(*hHolGsVNCsZ5*BY%`c5Go_3vv&rR2 z@iN87lqzNqF#9~_Sj5DWn9{(Ujm#NjS<9Hx%$zHjOJmAP=32#^tC_NtIoB}fTBbBH zWj#|iGUZg}JdG)5u`g6oSn>d7ISqoS1)t+Gv^?4Ze`9dGx0p; z8it9$lna=0F|fi*fH|+g>uS8NNAPaEZp7;*ylw%;ZUfuxAlfblktuhBZHCCihk%WH z43i%Rragh-lXyLa*EjKc8n0*Y`W9Yo%=v9#A7gk3VFq5GV0?g0`U?hsLl*vy;s4?7gY|`x*?!oI0yza#7E)o!4_u%yaUJv567q3T< z=HnPXEwahainixPi79X6^8uv&4$}M(uV3Ty@9;W=*PrqFCtim!{X)dOSYlb1NX+$B zj9)D=^*W62#`sMbzYXJeNo>M>lFcRC7AeegzjPA0ugQWa$%<`QM!f{LG-Wsk@BZN& zN)v^-bJtxeI`QAqCed9ncf)YYQlat`LGYa}fZG=y4hhu}j8#W5Hn$7mXXDj_S07&I z5KatJDu*yuxrK1HVQlVpjQP%`)SW=U%K@>!hPUb~fv8=@q1RA+?zKFA9glyV;=XTC z+;;=U!M$QH4BrgkUi=yiKTP2d%~1R?49lWhlzxt(BDv>^bAJtHO@={!9|YfTIK|(> z@GzoJ{v8Z|gkkQVVYpRr|A*4rE)s`ZiAC{Ju-gw&>ZKe~bvXv&WKp_8MB0M;N|E@v zDv37v8gck)5!_e7_2Tfg7?ExihY|07!khdMB?`WWML}>sNszXuL@M)}1b9Z|E`{N0 zv8JxJp5N#5`vQLdmdJzW%-{tx_^uheD1J|b)|bqOm(Ac6GkDbuzHbJvnZXat;B_;2 z!wlXugCCl~TW0VhGx)I?>@$P78H||0s2S`xgM()96Epa!8T`x)-Zg{w%;4u{@V*&* zUV$H-mqe z!T*@Szs%s@X7H&Q{KpLbYX-v-4|bTrMP{(m40f5prDkxM8C-4#Uo(R%%-~8hxXKK! zF@tN(;Ok~^y%~JN3~n%k8_nQmGq}YJZZ(73&0voi++hZHn!(*>aE}?>YX%QWdnFJ? z;2}wTSb9WyNqkhYqRL~5So!0L*b~x|iRe=pjh zQGNz&F1QnvmM=F53qhH+Sg002?N}`M>~>(AmI#`t+2)y#_626>Si3~9gR^XjkPlh4 z4MHurE`%k5Thy|zz|aHkwT*%UavGNiIGX34Wai2nY7l&oe;YIkc~EdAGH?}u1cfDw zg-QX&1+ZjMg7IfJ2!5Dw7c>Z^P;@tvn*|fg8ifLw6mAgaLh(JAQUjAWHwa#sVnfmb zcuILN^$H|C6{dw23#|f7pKlghaxZ2mgBiDDFdt^#hZHA3X|zG8f?3z&!(=GC9|IT6 zE?*){f;kI0JLOv%ggTfzgG;I60n9rSD!nE}?}PX_1AG@@HYZfwh{1U9--bah1eSAF zs`tV=p#*AXFBawsPl9Snx0g<*;xO&#>qb zB$f>)O}*CQ8G;N&OqsTx+!;f${8X%GUi`YB|0I;^=2lNP|*>;_>RtotSwkOk|5 zX1lZuW7<5}uoIySHa?9{m2gTOXYAAl9-Jl!vN$CObC+PddV=B|;Bds)6keh{1PdKf5^Iu*^}0+%)?P!_Ji|E$J;S*XnRtAS^Z2^Mc-;|V#AT2H@%Uzvd?k{9%Oqcd zk$5mqFn*Ncdv7iig!0lIZV7`~JAy8$%!nr|IFiQ7+m2Aap6}Vad&}%C#B>=w@*)dh zOYQ_L<^abC<-~(Iz!M6^GWRM$I0SRVcaYI?>1Ph(9fyg4wJ_dwkpC_PR7&~W@(SbU zj!}JFaJ)hlG~Rc#%cJ25#s?gsT@Dr@A0LuPWDy&?h}x+^_|V=urF==}lta)6zq7Y` zJe?lIP$WrF2T*2P32Uja^$;|{R^!*uIyE#+pB9`hbWSxsh1QZ&gw7IU`@UwuIJb2M zNv-_k;7sV8VVu`mTH0A^e5G|($>Gjf#`*i=on^)at+PiuXB)%NI;XUAj&ULE8|f@J zc7o}?ehGIj7qR5YSn}oEPr6089FPIH9E>XvJ6vX5$=${iuIm?)d-FwNs6;PWE(lrz z{B;8F7DHa$i(s3AG{XqKMI;TVI&cU=!Yv~CP9s7*Z!t-^750e69x+sYLq#K8ig$_e-MMybw7bPnw%NemIdJyVYm{@&r3MEzaW`{dO!Nt)BI8}6 zQJA3d5z+X)6go*i32BT|6h(cGjM|?pad?IoA1o2bc!Y#MNyZ^5PN;d;nqv7xIs{)4 z|AF`OrGHAsCzgmVAe@AV{w%eg6z@FA_$x1DcP{brH>tJ3)7fDBQz{W+5!sDWwi*AD zLW@bO+hu)8a4}%P#=oV}P@~=$YS0^k*UlT|MPDH$w5O0@DQ2<2=xjaFz zr{qvj4V~nQ=h26#gefX>x+n2Sn*ZIaIEfBc&+`4nDFdeIy&dms`u@Xife=`8=d@ zlMvxQl<%+{TCOiA%d3**ZPuH&Ad#sFB0Ck6$WF!BrL-=OcP=+BRglOu8HdD+Xymv< zq4r;a?SJyYLvS+)cPPeP3Lhj^3b}b?2$awaeMb4M5GvEl;=xro5ZtT8_0_>O!j{}; zNk8rYxF6TgcY^q+V%$$@C4#;Li5d?mBjtAiHZ$S6k=TPu>skx6PUu`~>_voo5(xQ- z@Q~6v&jPIz%I}4}o%4)`5$V2kq(_w2`4-4Rnr}RcNcSTI>tQ^mj3RD{;F?Iotuk8v zfQ9-XHe#V z@v>67<$&>uVk&0rpz*3=>UJsV_G?N)v*Y;dcLDA4QI62+w@|Bpq_obN zi6h33m66@KOAss0NyLLKsOY0gXhUeDzEM9VuAds*fIZ{w1mv{1emaNjCkPIg`WbQk zOb+>}656D1%Jq;jP~wDb(%4s8N(nfM22aK5#`iJ(Jtb7Cm+q!^G~QQQOK0N1_MsA5 ztFJ}r)gbU!N^2<8N&ssERIAt-GJdUuLV76Frnl)|3WfDBFZMSa7;Hxk|AP`*udm0k zR4?=7ZzLW09>{-Ej6WsdBxU1crCre@yK{@N90TJs!x7^zN^8f=&JN?RN+=qP3T19m z!T-TTvN*aP+N^J;!rU~19JX+b9V)hC30e5RkWITa zzIUjhvyzQd8axX-#+?ZewT=n8i$ICyF+umLynV(Y#rxG%`<%9~G&o)go{sJQuxe^Z ziI6`Du^v^;S;b>!MymVcYUu3X*;x0dsO~dVtov@N`|~R4Fgrlg+~-x}1)c-VgF@y3 zP3#V`6^tIx*3v^xK0VlU+Yu?b^QhT!;6>GV5$Cuom_YN#@2Mkve%Kwh8!xG$o=|ao zWFOgw6~%I}2RVOPH8*d)s+yMn`^4T%8Hbx!iM_Xpy`417$imwy&BE!v55$jDT5}&^hh$igQ3R-d9I3 zSGd>sP)*Ep3z60@Rc^w5!cEu+&UE>7_BUAGKq#ii^g)7$mlz+Zp`rLla7Y}Ue9-uv z8rm`%+=6xbJyvv-*X|Egn^F}G#tt%`|1pJ424fh6|6omIp!@qEQt$ythgIXSx=(M2 zKeT%bvU(vSNt2*)W>D5HZ^?Bcdpj78UB3Vtt&EEqwbGFoI|<`M6Jr9*AVuDi+sb7oU(SrnnAsqgGpiA?<9&@`f8x`8Y{o0_As*gpT**c~d1RxnLV&)F zr*9ucsa(ydok!Z0jE26Jp(ti02BRAo4n{XInuC!}@xchEX*3v>B?hDW8Ffn()cwqO z(5%E>A~Ks0h{)3%;Uf^9X2!R$&^RyX+k`Vm60Hf#8yu-sc!L=~WT7tyzl?q0EfzYr zG|#zwBOx=!_gu52f%;XA^0bVhnewTh7+%ypznk@pLyw*0CHd)rVIzk z(Ata(wUJSMNojZ&Ab9k}*ul{e9H)MbPQ;zM%Xsz-`(gI1J(*&A3%F&E{=d!fXtS#_bxJjRVFW zjjZy%((((%@{eJJFD(xmcW9xn!f5cT#KB#}L4_(>mi2Ls6z>oSk88%0T0-HznNi=T z&H7#}ChPkxEk2gIJ*%1O_MDbfH`1K%YGwn!WJ!r4=FnigteLWk2gjT1-B*acO6nIq zG#}N>Zt+9S_>o2A$4MsRT6(V-F`2wXO!kVmE!up(cR&kW2EogaCF7tLFC|6(sg_XW zcc@S=Eunj{&<`~}VLCtsf2bM1(&GB%Q2r9+pKK2K@Egte4FbOgq|Lh!)A+46qDM;e zXJbLX(?-$;^|O$V-)kc@2l$g_&H+BwtnvL5D%D4&&ZLF0&3ubVjVKVdVTuq7u!sBcf&;?`($ zHH>)j&_a&vpf)EQ{TkSThW06b>oui2?bwC*>qw1;NRKA_Kf z@!-g4c$OwOL+2Vwf8oU2lo&k`|YhE4=z9sQkF$@ zBE-pjJAWkfEeKWU72eP@pg#jva2gaBcgnO5c7(odr9TV$vzR_vpUiKx?Z3FQm`*RS z^S$5il#H?W+j1v}Rj%#p?nXeyUhr>?vo?c&0wtMVwpOlrnYqRQaP0rO5j4B4-y~@{FFCAToK(;WY|+l*-f`p| z(=`z7a3_d1Q}UK@x7s%NMK)R_HyIE&N9`8zA5T*p(Vo_()BLvnuFadbw}&HVr>egC zxab}2a=P|tQt8`C%?+dfpTrYKj5U8zni(z5H!+&cH`Lopd%DTH&%$wXcTDTy|EWA= zf8}ve8q2?bZKh%o^OhqncS=+`qTS)`iL(<@yG)9XP{`GNy=(hoU4va)qQ|?_B&%Uy zGvBDpeg6OdYJlQcc*4Zecl)scv)vj_m`Zx9b4ujtR^szzoC-0av9C9V6;B);ka8*; z`-q4mj(spsv&bg-uNfL7qeGi+io0SKLmOk!j$q$F%TRmrgvS{7Ky;DuOl>$y9Rfjz zKBONzVV(cL562jDTYc%+`+kU}#O5E``(sa@vhbNFM`Z4LBFSb}HtA(oaFn4g@%if& zt~wAc7_+5vBbK0363#f0BYF0QEor>ysExAYYIg3^$!%-q_K5{2*rzixAKz&fsU2WP zoq|BegygksT+-6GzIjPgs<8_;t{wwAkzC!8v6k(+G2am-ROxEm&`5Z=5E{*-=Usu)pxGh zXdQ)P4~u+X?zjYQmo+-f?dd{5Y}{uI9$G(bAH=8eM`g6O1m~wubP_B~JjU#zkh>wz z4U-@8+?1Q~*hf7yo}lh?$8Re&;s3qj#JlHb8G*5OWj3EU`OmN;uJlGI@s?$3wY5iu z6dNN$(T>E>604Y%iAmdn35|{l;A4EQ+(A`b@g(fo^ODt z#bMu9=dJM~-J04eIS{Dw$$oE5mF%za*U2?rFVd>7^&-$;UoG=J3jQizAi1GKuC4VW ze^tmb-@_7+YwK&PU77YA+3{CZ$<@C4F?L1x>udb3OxYxk@A8c~Pnma&nN9k6WUEd% zcjd7tTazsF?4EH}@>+8vGObl<-&-u>I4xIyX05E<+n;kvR?g}*IH}-^b8FYxu}|;L zOKzE%mxS@1&kl<;tw@jPd7JwNGv=0Q`-2!pY4PjmA3(j@zIK2PVNTyP!K?$I(ht|l zJW?ySAws9DBeBgBkXUCw!-lEW-74xStk4)FiY`)XfEQ zYD05kFP?d#LGy_>@@E`}#;jA4)3*E;B&b@2n8%EnTc%UziKUKl9%pW|;pnUT29pPX z{GXW2JjuAKs>WZPbp))YzNY?&v%sqS{%SvB*ZOLXXSdCf`)sPvmIP#9Rlw`vhwDmO z)_9-;cD1>Mfx?=?lg2O6f=ctam4&AiuGIR9plC@^f6+PGpf;pD2imJJ{y8YZzt^DX z2T=GYP@Qxtt1FxDS1GiEq-0ZM+;~lL6;7BqsdzHvfa}W)#MFts;9#VRWQlNY}IsDuUyZhd30Q_ zw17zqX&;NUm^mBhNMC6w%W7iIWz4mlNh_FiGRt1Yvg?>_HOnqz_BAYfEz4fVoEwMye4}nem4PGCC?b{$T=^V!X0Jh}{oAO7POg}#$3fbA?%^eJiD&$NQAU9|7aIui% zp;!sV3TI%fu##Y2LCC2R#N0~X`WQl^s!X*@l^DQ zRP@PI^qZ;Z)2ZmUQqf9zF&TW+$HyrIHK~Pd&}12ry+0odXT5K^PCB z%{)hXZCG%C>F>i@rgGn13gls5YO6OKj78eVrU=?Q9*d_`^@)?VTGX?O( z!onn&Iv5rv!nD&l!gK*32&+K?VS)g~;_RgYh$S;lrL(L{W=b}jXq*?4bSWqcouYBlzW7M9Xf(7cGdmSyNvm4g zsTxZ|EXYi!>*iLCyskSnV@0biWG4^i5?EmuJ8j0v6L z)#Rsdo|}6vy#S$tV1ZC(yl6T_Ba0qn<#l55O@6kuCm*wv2t#f~5U8Xf#wS2$oR`lopF`(oPauDT zzd)#HWJM83#^3nK-ifA3xOtmRVyJOp*Zy&|!9uV~zlXr)_vBswyCvOYOg zC)6v7J24)GZZTA>7e9&3wwOK^id=rw;16T=nV6k>$UKe@p-K8ARDLShcmkih<$b{^ zz=iXqg=;)baEZg75kpzQENqi+i~A4=R8*4(b^SRL=VHWpk;oRWC>E$1#`h>eA$Ihs z;c3RpVraTPJy>FX4ShxAA1)h1GxeE-7AzHlv!pWP2V$r!G}}WU({pLI94vz};|ODi49g$~y=k$Q_mS`%m@gp%Rc7s%`p{9w;;AZhj@mX`} z^a)jhlq2{BrI=jcRW=wjM~evzQ|p|~&J6u?4%$(`X9MP)CL691dK>lc$F zT%GW5Y?pOF_tV7xh{k_J&v4B_xK-7^71y@&kI z?~_6cX7AS*ym%l!5?-K*8W{I;|9kAhq!H7uYAn=BISKavJ~!RO3NYkCt}*D#r~*7-t`OP!G*~70q)l?VfHf+p26d1fa%(WO%!D-w!DY}HpsS)@Bo8Vl*3HllhJYtn_%S^EKSL zy-v7BCe6P_Hm;LBw6#IP^kPiE(MrFOr{5?WH_JGxHmwj5sZf=f^G33Kcgtk?4j|@E zfV(Z5Cvuxd{qSzIjWV}yxv!F|t(<5@;_w04bb^9pGd?Vneb1#6WfJM>LC-3~o1XV@VzVTYcT6Lv_K72=ZPbGUaLiXsOX^vi$Ep7gu zY?&j;P5#{9&}W{JB}m3UoVhO<%}OJPpA=oiFd;bZ|;I-TQ4p_ie|_R+3^5&n}K zxju5P$RN1iBzReh;6b@nor%i(Q#rIMxC$A1m+!rx?&U;s9}>A=$upN*+bqltcSW?} zZaMXO#caoW6lzDhKMx`W-vQ|!#dua}J>7UtNz9#2H||rcJ$Uykt!K2$oo5&ikc<9A z*{-rXWhD3}chTQ;&@=3d$e!U)MDYx_M${4^!mtG4O(gv?z^97wmJ&LZoL_>cLTPxi z@na=!8q=SV1Dq1qzr-6cthdk1mk~6oEHm~aIO56sCUv_vKs<=F%A}tt#zBIUkKryX z*!YQpg=wQZA~yF|aJ+7}wQJLf8RH!#p$sR}%tHyCp`THX6B_csnTh7N!_ z!G6RcpP=3J)Xot8jRf4diJY@1sjA9eCA)ej-vzKvxKrgiakomc5bwp{J&^9h;O8LU zuNrr&85O+;8KHi6uNn`v>aDwmTMrudsiPj+S~aS7@8tU-rJdw=e!m*3)~k&N)REHi z_o4g)poUR~tFZ|mRLQ6M9AmFKg6&96^$60~o18z7>I3D!1Z)2Mm^v~uxE{8J6V>ArL-rtell+f0P*`gSjEv*R~% zfui3vk&UYq?%(t`$@Fic?_K=MSMns`SY=07WUz7-y`^dy90(6aH*Zh;)=BY9#JAjh zlK2&bKQ9x1dF94fbRb5)Q=OHufk?wKRs_k#PtIW3qB}PykKgn8y@1~f z`F$L}kLUMEz%-jI;Oc#`AYpG%8u=2t5f{v&LcgXZsY?VbN94(9@(`2J7IT#e0FrEN zE2qO#Xltux`Xg)Pp{f}++A?h47w-hav2UbPDoBZAF15d(_Pup)zjY{J#E#>rO`-V+Ao%_rbBxXsREJa9fh>) zMEn#fid5zwNrhC2od2w!7|rldslueaz_FZ-iTU9crZ*9on5h(WR0{)XIFQ}K(yB$9z<5#hX$iDTQX|rsgx;Z zew*X9q@?>1*O z_7Q{IOy!($EDN=^mrYeh! ztYRy)kF#rz@lXUsYT?wv>cW#`8#iGp8bcKg9|j+1l`*B!=9N@3*#Izp7>%yeGduwVR|$QFm=54vIy{q-m1F+A;wmTv8xth4xPc6J z)?&dWfFy{M*2y9W)gPK6I z(3*C+yfB|mY^a?{j1*z44q@XstiF_BC~IT>D8*=Xdy>f{RkCpe#}3p1Nv0hvFY>p+ z6NDFW`CJ4q;eDd`G8ivGT(|8!V7v??<;6ie#10y-z-YV(kzPwHE?K!(L5wfaY7P!y1K<*FFv2{; z&WMIjHiSm(baNbnnZlQ-VcHKtsTer~v!pIun8|k`d$X0h!HAS@IcP-V9=?v#JzL8L3%yUUlk06CXB3@z=gS$SHb;nzVWVxZ9fFH+J(qvooxr+ z>+L(i*xoL;Gd-7TX`I)t=|!BCiL@KYIN$wkS};LqQo9zM1SkY!2ZW08p%_RS#!eV% zw_#=!ig5|FJ3M*k)2lm-(Rd!bz|Z{V6wC&%E!5>&8~ z!?cAJ=X}O};695^4S*3(KKYo_xE|JXvDL8_cSBW{GiMX7sIxSu@g1(uN@{L3J~W-a-FWFn zbF0GS??vttGJh{J%@;8-r&7P@&qb!uLQ^j!e=so(egc~@q(Vtk1d)LZWMheKocm%_ zqX>u$YYJAaTFaBQ;=^yHIVO{{4m+i3eM|G2)hECm zBjMoxaUG_c-3DtS*t9LuJ%m#X9QR`}lu*X625C6OYU~^89dtLYY-nj|YhE2()7IF~ zxV-6${6r_O#r#w)Q05SZcBLcQKiHY}n;bnj^N8A)cJb*#cwl?_&XtK{NQ0JGl!YAK ztm&?~`$KIX(si7gnloYBlI??0J~eS{9q1ag=5<;>-;mJPYp365Fk$1zE~I}uKbuuv zii<6CMyB?fb6<0!$=c1yp4!KAO&W_zV)~cdro!jY)5b#WC8zYRh$Rnenw=d9ljmtH z+G}p3$e}4UPQ#+fiS_5t+q1fP4vX;AvC1|plqlNN6tOof_O>&e_|fj6DPv`$pJB5y zWzj4>)*p^U=@@SoHPy_WXyt_ZjVYwWA|>}o>=Lg^)BD~*85J`o_YQS;Cs#B%8H!cn z_j!|(TbP!Z(5I&ON+bQW6wE5X`m7rYck`b=;V{0AD5D83e zKv%lQGhdS6+^sjdwY#e~3TKKTkK|eCN$fm;ldLt7geBV|39_s!#??sd>X3;ToF$>) z%f}K)>YVjVi9j!OfgL>4kCn+{OIb%%b4G>+2FP!UdYuz{KKY392S(bxMsKjfCFu(V zr>WCz{q$g4ooHKErjll5=#7Tua>8m*@#YMhO9P(nNK+T3nY{UqSSdKV5oRH{ z+Y`Mvp_O6&qfBZ$5BN_t5L*fdD;zrKcqD0&bEUU;i8t|cQ{>|=_3>4ZX(yR=UcB2< zi46l`?24q4gVAk+Fq^M{($;f1OZmH`cE0#(3`aVn&W6n1&dJg3tizHuY-nj}Uft5Px}|wT^C?Yi^~P0A>zf;8WNgs- z-6OHTD=TpfngN(R7G5f3)Ct8YJU|SN6+gd zSJl;dm4LU3eAer|HPwzZ^;G-;f4v{?bu|I{S%VtPTwfiik@-x-UsqK{KQ~ZYhlIT~ zby9V;-=5-9s`u7qE1*e*IfZs@j|$Ud zPGA)}WF2e_vYF&&avqcOnKYis6PR4Y!mg zrY&dM=}aqT@|PHkGNvwy46a=Ou1gUk2)4^GdO1d~KrFZluWJ$OImIzW2HRew ze+^y_VbR(ncs+{O5YryR;32%M6Wz5Z@p=lcYw)5|-Je5Vz5~p)p1EGc=*xJG;&l+O z`AmKnYx@hZ{Q@LhlGz1`X&TGL%1X{G7iij~;R49kN`?zWmXlLD?97r_etz~`dL!h_ zDic{&RuuvBHJ7W#bcHSO2b6q`sV>(Um&u~!iq#RKcBT-3ZiuSnF{w3aYR_6| z&mfY*TrQ;hJeY(V zivBPaeJd6HQ7Zc5RCHe|8c#(>Qqi|l(fz6DfmHM-spwBr(RWhOpQWPjrJ_GiMc+?F zKS)JC1lR$Z%_igtLg81|DG~_cV$p@G&BAqd4aAA-vK%1Qt;=>GPS>3gvPq&`YP1 zRBPGIUNS(Ptg`h%Sexiu@^ASHx_yt1v5EMe>5R4ObBNDQ$unEJq14hS4JZOh9 zBZ}F>4nrRaI)!2Fps{(BzhpxadjV;jXVN(D5ER4t#`*E);I8Ez(_+CfUw|y% z2Bw^D0}|A2VC;dAJ05gH($CR7LQh25xC2Ur<;GnW1_#{@C9vGM7fdt`x(`YYFE<{5 z_=r>GZ;a^iA$)Yv z$zi9Hd#;uorV}Lj={W=j7aa!m4$>yfcM-%t@gdvS65EF?whwW(>0T-R3-4a(-{g8a z7TbU3Z2vXE_TM<$|46X?PtNwgklg}d=%Dd$WEUe?^nYNqUFHJ)FGm>`@tI5XLXjw3 zByx!|6_s%*a(10$D&uw7L;OJZfOwr`d_x-b@Ym5dO7t>)*mcmjMKXJmajO(6jF$+W zkJAM~Z@HXOBuwURsYvfvd-6KG~yC+T)1A)Ezy} zC|0y5E9LhZh0z|&+Afn%Y`fB<5PSC^V|76HdXesaiS7aU9?5tJk;y03V;+D#ZzsJx zC&2YPclI#%t0H!+CnN#{#|g`A<%^7G5>I=|7wy3g_dI{*eU85&ej$l%yl5tk*Tb-D2Y&*{lK36VccA(MyK6v0IOrIaXuz~RZp zucVMPJHmA7#fa9<+O;qa(;72=Yc+*wuzDQE?@WMLBJPRxh{hi!YV24~mirH6?mni9 zke8jxo$ov%m37F>f{N0erB6ovFbpc$!C#htlHhM8=j+ebBVJBwPJ;c##HOD4*97(| zN^$dJq!OUj9Ql8&$55g1uS6p`^~uDJRb$!sx5QnP3l*N@Ka%PC*RFD3WM(@5T_sy& z*AY@Nih`=zo%LcY3Uf%gyXms&(+e2d)@$X2RPG?DTqpB}uo*YWDJ@-M+)hu7E0UZ1 zs~;wcEW*&bKPt5|%lxlH&GQ(KB>>=F%*TUoCIF(lk`DmSCIAwhu2tS*+#p*3IW;6G zd`M6%|SK0W-$PY(|sK8zrEQu(#=M`h}?tP(+XIh`}G?+Y^pNp(6) z1xL0pOHdG6CfGG$wt#kWj*!KKazVr)e69eRP$Ae{LZzVQ3toZc3pTQkr=#82%biD0 z7xv1B;7p+VIPqb;Z;~F9jfds<&V$Ay@@RQz4@Mr7&BJ^7;fGHkwAF+r4(c5#_zjBq zDS4E;+~-O1<2Eee8JW&+jMz#e_R@$0Em6ctw=D8XbfHCxWYf)!C^=-OpOMK<(>*NG zy1f7} z<#x55<=-I*?l}?)YQG$+v5xc48Nqw7MkKTYvir-F{4-3BhjR3sT_gN%CBG}X&!psE z$f4ReefYv;x(91{@`ti}fkdCq&eDF1!Z_RZ3EsQyf0m8k%JgaOQ972M2FE-2*}Uy? zEEcgDpUCY>T%WupVmJPb(GiL|jK9k5_Jj=E9lK2#{*4Rm?{d2%nPj(;{=o(KPb-NZ zsA@M;{)Y?x-&D#>G*zEc85H?1@pO1^a_a<+i;tQ|JMK`hdf4qo@G`6B{yhlB#fmla zvZgpA<`X}q`4S~m$5VH4=q@DIt_158%KHfBy;Mog;jFy;DVL77zDx<#^VD4&x+_@E zi`GRUE@h4v7l}cznPu<0#R+000k@GR{)tJ|&+tTv#Ctl>WN@xL3-Nm81 zf(v+&GG_a_VxAOfp46WI2kye|*o~v^pz|AeAIiE9?^|4SUijAR2k^eh{h&h5ixcC) zi9lmk#A)1YQTbomz63t5qJDhlUGv^v*=+8lNz*31w@r38*(5!a9@`|n(}SyY}b(=RrYsFkK_ejjJTgkjxjp^lte@DFq9vjU& zIZtY)_Z*zqcc}oM3CkHwPxEedDCWVXtv$oMM;*4Fz2?1YRE=fCy!bhrV^%rlZwSl| zu1P%RikAUaz#hv40+AWZ#E_ipk00mX*dJ7JgneK2_Cv1Ty|@L0nbYnAB0HkQd=`D)EA>%fR*xW6hL zT#g$o1oMcuOx$_-I9OIEox3Mn?8|a^NG`qv_T+K&`D3Iql%XkLb|%zrVBG{8~p zavOLh2lg(+Sq5RKvzdplrtvk{F6Na2GBX|lGJyGf)(%+9103d6c0eNp_^+Txv6NS1 zc5=Mwd>@|9KCfZhwPRT3SBfJJN$mW`pWiw~OY(7hmPMFK^gt?f9 zHQoz8^E%ALeV9v>eFYnCgDn7t^^R>sPx9}i;6K;!uINvH>FGIu*c)v}&H)2=9>(|8V=P=q0@3)KhtKmJmk@x;aI=@}T zVU866h&$}8GR!;q_VRq+dSpisT_^!j*aKS&P3%WiSoneH+>3x2R@KyaNjU{X2-BmA zjU2WR{*;`jVUKa2z-9QS!$9zw_w$DG4I%deiZ}4Naj;$UUJ1D2Bm+%c0+Y^sz|JKL zbI9sNc}xuQ`ZnUW0b6nt#zr>L{d=;_A81i8yk_IE8Ryu;e0WC#eg^_I2P7Qkd~f>* zkKwQwgbG`KG7&HoFQ}=R-O%xxu9`m=)$rOpH&Jgiljje+1TQ^&J`RE>G+xo{qqeGW zo`8!i{9GdDQzH7K*~s29B=F&c#5NvIwDA^f<7cc`(ZZ2pf=%*ldXr!^pG%b7e+?$c zI%1c8c)||31&HY~D9ZEcxxXM@<@jbKa^~+7g;DWX_{X%uAgwfC5Qn{R5?e9ViN%rpPNn=R5n=9zD6 zULQZHDEy?N@{>xju6l0(T<=;9k?*}2d*y$klCTQ&f_$V46=flvC=Wvzwm=ClF;aOijVb<5AW&OqU ztiP0!wUnCm?9>EtMp89#fc5Ya!oE*F(vIDSxmDwYy1sm{d zcHTIsd6V%M*qHEl&I8 zboiUhrou=cfqLD~IOUbU>iWLxN3Iz&Z*f23{+WBm%o{!5_x#8+V`l!DBs-IwMVN=2 zO*}d|hrl^|C&}@UD9Oqua|lqDStN5gX(bXI?RF7OCm$lR?sByeBb&sC%J8VSoV1g? z0O=sP*>LE~XK>PUE+d^pVI+iPP&PnP0l6m4B}FBS=j|UoF8-h02h%T zGuUlXbZ@5;dLNU~{kVeeHuV?a-bl5_nfVI_dr!Xm#S0WT{X7n<9V`ZXTgc2OSafTQ z4UfQt}D-XJP@IfhYA@#f+XZti--W-Y@Km~133G4ubJfRoI>uyS%tEINw!3Cb58Wuy!X zV7|r#9rQOv&ZC@=Ddu0Tuy_v^%ltbZe?T|OiRVh7Nu&5Km1g6$m&vTvR5IUWi8cHm z%o=`*HQL^0*1D(Sy0@6x>mHVYng0^`v1A!^^WRojd=J*&{Ev;?!HpucV+O`SIH|OV zHB^r=#N{;qC(=3ncT*dg+dR&vNNLtAq*b~FkYmSt%!4>99M)xw2hWBqsI$ylVIjoZ zt552Q+a$4xahaE43Rh{?7H$~VXtsj-79r#Bb#A2I%#6J_*LsOdC;Nz!O+HLAJfx2}my>?NmXiTuEQ7f#FDJW*q?7%`olVXs z>N0WxPV$9#iL;2%W#mHQ$tD?+Q&v7D;T^AzHz@<{DzX5>kHJqLrQfCGHXRQK=zd&6 z_iifRuA8@8mI#pZ`3`-Uw9D&43ph_vkTA z2x{M}!<5&KAfBUoOuZUX;_X3M&ZD>&(??3P+7a`ERQtAWep|=eo{@v?4(|%w4m)B- z$sv?D&0!Dd=64Yl!%{Cv1RVZHFL z3s36!bwT6yC4QyjCk4&>O|0A9R2$aK5v-d&gz~H{mOQH^r(vF zAh34B=!}@Z);ZC{Q?h3M78=$%e?Je8jr=(LdmV38MsyTXy;TUQnlJP0hB3R6wCw(b z$RWGK{MzNuI-aCo=1G5TCH)&BCL|NN_wU2+AaC-)gCy8R-sBC1Zl3g(ZoY-ha?E_& zZWX*n_?O)(*dOm;s~q#<4(dPHD95~K^N}PE!u~}c;$Pg3>*CAXpdl^^D{yT-Xhg$9 zk&lpJ_~FIYG4m2*1geh0n}>`cydO{?g?)ht0XaX1A$5g;SBO3hR;gcN*{?Eq*?A{l zWnkISZIjTA$>`Q8=;o=PH_Xo)qLZ%y{2v{Tf0TFfVe5r=@|TQcCtqubPUbd%c4{{m z<_$bO^RB`Q++;vk-eh2FUqpwwYaTK9tw*vyZ#H;;Vx?}ud{A`v1~>;orC5wXK+gS8 zsjnNnN3u{LEdwfbHB<_`tf!j@O8X<RDvlsdM$(xR*?fdr@2e4pj4JK`ovbs$z1G#c>Qhp{Do$ zADP(Fspot!xcBt#@9&I^sl~Pr2KPW)ECp%H2Zofh>LE&GuHN{;poM1T5k_}E_d7c_ zeK3eS`r0nwF?CbGH*xUH$y2&g$H+;!&9MB*i>MGrC zRwYzd6#$4pl_NPSlu)oXtlJ%`gsN*RGslfbC0JV%cBZsI?!=`~0+rR(N-ovCxicjy zyBJkaz?eFjl*yz#CKaGin^eN2QYM!fWz@kb5tRv*s5YqLS%XlZfigr$E)4Yy!d@$b z3r*-gDJv&Cm%I7gE#z(ycZ<0@ox3x*TMp<|qB8}BjfvWTmVPy~qAe*aQ8NG`1 z!DH1xA!H3Rrw-&#VGE zOiQz7Fb3*0U29%$R%S631e)WGTSsmCdSt8 zy}Nrl2YUC~5;G-fl^$oqA=UE9+>^CWMGBz*q<~}Iv&OtPL1UeCYHmFBshKFu&hZV# zCuN|vvQ`Pyg@cyB1hQnpJglxBYZk^5Qc(g`p%CLtnvPsoF5}YrF3y3eG1*{>6P1Kg zmC2b*&1Z5EQ>Ph4R3QX*S29i(I9|ZBnlfSXxLc4iZHlSkFfj;+OL)V-c->x1}3Z|LU6rz_3P$aiv>pR`(9rKoIf z#j6d!8-+Dx*mjva5TKE(+EY|7q>8~5)6EW)T{)-QCU&V+hgZfllYj?c25i%<4^NY;?r-55W9b-Fv~_%vCLG(i3~Rg5i{u z?p51cwr*96Z~HzJk8nar!>(104I9_4aUfSPs@mP%sjflOMrtP( z+R2}HZQTZG9Xw>~0Hk!RIkRb-2sJt{>>l8ON@LUNHA+`^N2k)Xdi@%uyQ8Pm-Lw$^ z?ZUZmsw4`=qc*o}THCT_>sB7MxvzIO%!GaiMm068Z#sL8gU_zEp6-uyvZjqYAZ#`3 z-V3|3?hdwoQ^V?}jcZv?ZyQ?waBpr|lT7H|*Vma$>w!1~hq|oZw2?<*s?NUEu;^$l zYc_1!u}16b+|zqLzHNp^g|~gsk`D2hh6q`+x5H%xLIbpHbBf@ts90Iq+PLWq zrN6890`In#hK*Yzn_4zl4V*E6vJR;CTC{S8=#WI)c=qqJMOJu+Z*N&|rCjaU-`67& zb*Q`rR9=4@{KAgM(!SXAL4Uja4$&=Zq((1(jzRkKL)FJzoQ+=W)H69 z#S_eh$B`8VCgg)kQN&Sr8ha@)&733LgQVG}iz$>m%L^js#-XR=TNUCHDildG5JOQttV>o%<4$lXoc z-OSxB+->3RR_<=&?so3(;O-gRJ(IgLU#mAkvR`yuYOaW}@@cJ6j? zx0AbZ?(XJp7k9h4doFi-xVx8@mK&&sU{)KfGR34=ion*BQc@5pD5-{Z&K+@=6vIN7 z9my_PfZ7ToN{JJeBS*whl1HfuXY&#_>=|<+IVB4zWtox8l3A4Md6B%50HsDoB%@>o zr4A!vl;lwAEQ%DB)KTh!-YlsA^stbYz(VSAMw}%DlxFA=y#$W#-mFMg$vjFkwTM=d zL8;Fd@s-S>G|Lh>3R zxkqV<`(>%s_b zxz*>N)8!kbbA6A=ty%tgU0I`ae%1?eYqozuSN16NXa7TP&G9en${D4Laz3TB=K3qT zaz|-p?#)VTol^ zydtGGj?NBl|0PkL(mB$cMXAS=;t6ruu|?x!6Hg~y1y`N=Dv0^)Ol?JL4Xh5h(^~}A zyBb`|bi49OC{PtpLgDI~C)}S!UAmzX1qBG|B^`#jAymvnsD|eg2MU_VP84r}IYnKlOkCA8eoQG4BrhvT z@|Ltp+ew?mwb3ZD5`Kf3%?PBE=21BHgX54km>cj^G8C5wm1E|{k;BLVX>Q_S!)>y; zStu5hl^jTYwn%-pxzkF66IbSZ`ONGVk==lmo@bty!1|ooGkloq2H6{B{w%Y1=!if2 zNHe3d`QhRD$NV{Qd8C2ph)cnPkq2;{3xt5#cf1MR7|fg>b*EkNx*$vth1;~`4R3G9 ze%J$6G;QDyC<|*-hLxo8ecb8_d`nXB!4M4N-H?b`oDx$paqwa;WQ(REQ_(f!@9Y9D_CUeNDJ66)+JIU3+Rs`I&~_(w<^%Q26%1`$z|k zw|^g|t3I`KaH8RzXQ@|6Iq|OU-P6{+*VEq#C)MtO1L8G!>dj!CCHfBlG24^bFfN0w zX&F?XYI8x4_jgvEVx{+D!I;(ar=Q?BBPz@Gu;w#4g@qYUKKbGRVw(bghQbkX0@&Y=dfyFH%P2HI9-)sI9$c7#!zai z>OxAWuCh)E)`aS07*$Gj7>;IqSSr=QK%FKU9Zp`MN=LHl&eW>&=HhBL_?b5+aXwun zfOtGAf#8=D3LO4wST4R_Xp{G^p<6jP>_GIcgnZCPe@ z5mPIfTFBHYriPhX%d{oN5-DTMHMR^ZodQdT>?T}SCf>=ZUV>`SvxP*fFN;X|u$UA; z5~XOckdSHoj@vgwnps{pi@S5UJCC~yxVwEFby=Dz*_Hi8E6TFIPfBzIva>VC07G+P}z-_;)(|^%hikq;-Z=tugsYT zFVywSl|-k8ZzW;Wk<~z))Cm>v&}>+SHJ96y;mwrz?wE3|^ocw4NHhoU(6gf5u& zEmfl9Qt!`EY0}#?KV|f%!JNi^mNdWrB`~cFI5l7hqjs3Y-U@XY2%xO7u;syU%7~s^ zHIKDY&OA{QR3x%WogEg5w)75V1587Ie{Xwt+dyZBwMZ>I8OCwYCt2;X(^9YP>5aAZ z^n0xjMu{fLOoPJP_!Ac(ML|U({p=G$r@ft&7B;_sS~#xDfg1AL`~d272v&z{lwdF% zbf>}1nxOL+k81~q$OCm?)J!Qs#ki2%iMp&j;7AULNfuUd)S6iHQL3^nvEYnf`Q5@= zr`6*2VyUJWk(1kd`jhHiv<{w(Tb!kP7Ei6(6IJr0c4H^82b*jiuF$Ar%B2v2N_ACT zl~Pqz8-isqT%ERFk2OSBa$?+=zp@J`$h?!oRHUqZJ>7d^y-ur@F{EmewBtIA@8fpy zo|!vI+Hrg4`I96_-6Zc4n}x~hmfQksyZ8{BtWb%queOVC8zzHKYHuhd*|!yZ`<1u>%9fMG?ZcQyeu$R((EZEtDXc9sC=+s(2mj3s_Hq;Y2?IYrV9cREux ziOG)~+V+k3y=n5n*N=VEK9Hi4(Au)jo-`@nCA-_f>l3|DUYRAnVWqVLNs`ScnZiCbz*9bnZzGlF5i(N>LU~+COPCV>0kD^NnkjTQC)xZ6$Cdr_+L| zP*r=Z1%h?3z9A7*>S}^P``A}oQxk@`>dJspi|4!A%IYemHdIrKc9lalN)2p=?4zC< zsH&@jpa9xd4hKSY@K_r%67xq51Zry0EOQ_bRO$kukWw42t<4zI&1k&2y2_P0U?3#AyN!NIS8RpF}O^od#| zg=#FAB)%f$8O>PNpxQ1};RSp6n(9eN72kIFQU;mT^r0yvs~GdH?!tq%e<~^MOE_`+ zHuWUXfD5MroY*i_Oa(e+x3Fj`@X4*hlnRsBC`<`Du}xSo6=-YGpAxJ!BOHD95bl^e z)!HtYT0J=hoj;{=a|*wFO2xL;lJSF74Tge&fEujk2Hb-+RdwKoLP2or_?P$qOf;^w zE*Pv1hVTP=s2YMpp(@mjR~c6Edpv}MfT93QRV5$@)FCqbPysNN0YFxX*4;z3;jj{} zfw8C9R8`A<^Kpq4^@hb}7)SB5v!hYy*)?EC_%Qh7iBq59N)J=^u&ljI>1E13mi1w#^f9HMWeqT8KU2V)@Q!b+{`wH+s4ZqL8^Jl^T9Q>|<-xuMB>hQiK)Zxir zfZuiSd?RI9N5H=Yez(EzZuor*e&2=PgYaWqP2IE_Htm<-Jq5qtQX@lQ%AcrFrWpCE zF;_J{q8dxpAR#KjPauPgGCgZBljsG6kV1mtgv=%oT6ZuLAeId>4olQE@RZp|$ed0p2~UWK7o zV?f>Y^xzjLZCvpcI*5MV4Z?4`$$GyTeNn8RQzFXZ{S_UoA^OvZKp&=qLzK)Jfk^fY zICGvw=Q(taVZvYYe18M^V)34*$@0B`rFape*Zt1UWm%Clt)zH5cT2fDgS#`iyPUf# zxLeQNuTt*aD!i`=?{?vRU3hm0?@r+z72aLKyGMBU3hx`j`=;>j6W;y8`?m1DBfJNM z_dVf#Uw97*?+3zrSa?4a-Xp?$RCqrU-cN-0nDBloyk7|Kap657yx$A&55oJS@Lm$$ z%fkCV;k_cfKMU_K!h2PCuL{w}=Ng*PfZQ+RI(?@i(TLwIjd)uS6aQHXP< zkwG-s)j)KrWYiO#P}PmR$eMSikxv{Y+t5%mi>)M?RBvBNJk&T7jW#<9RuUI=&aNkO z91iNrTS?s1y}W@GQ%|^_)DW7{ffl2^v+79`p_xk>ND=jw*OLu|W_6;;=V zuOt~XcdkH_7jGbiG=FykDWC=OL|9=%1DQsP)}n#wX=l_EKb2{5*Gl4}B{?gJlTL4G zAk%4SSv?Nx8Qm+1m(H9ol9p{k>(S*+x=}=C$O}Z;S$Xw@5js1ETalhKW2R9|_m+8~ zYIEsasM;br52`ks&hO!ku>fi|hx(y1e!8%C6`4gBL6PUt3MkM*T6tarsic8(>xq}p zAe3qW4fU=h<+N&#C_*(9Xg&=?K`LksQD}s!3Z=xwzZ6UOZCG;i@5CxGNGX{~Xh5B@ z8USmZs|lrb-ql2+i#^CLv!rP?k?GPP|A6dCcrzBa)dqXo9VGJXS%*v<~k;qU) zrj6ETVT@ji(V1kaxx$LpsNm?3m3a^ydAibUl})* z_$Y0PBCUg7A=8>EWLkYF)5_&iGs!j7JdC;-vbc(kEP7~0g zWExR3Nik8pqy#_FOh<78U6xgC6ExGesOZ;kK?~H-`>A<9#o7+VORZWxXMTqcALbf| z9zflQ&0dOu4+^m1wo>yU8l5rRJOlgNNOqJ%l2mOv{ z273{~exCw1KR!PRmWhR}0I*jP?5`6Q)@c=XLBEje??+)j#GV1k(Acy29=BPI(sHt@ zYOhP!v|L+a1-U{VrDsrd&y)^>dzSoV+5C)*RYIj0=9ThV^D4P@?(D9)=GAg*d1+U< z`2}v1*nf6pAxs2r`sNydIxI&QalWlZba2rz^UHFyqPc<$Rti9BvDkH_5|76B!yMLbW{c5O=FA+eb$L4lQ8D zD*^bca%(tR(_BNk!se|qTAqy8nzzZ(x_DiDadb(1No1)s&-|JlbGwLH7F`}+&SSoA z$J`-DSHxGu>!S_v1|D;#9dlHUu8gmYuZpgYujVm#*)ey^(KYck@kk=(ULG?NQzC2O z?Hg!tIU6_DKSB!hZEkQ`e-=$fL!Tvk61w$#-&&NKJV3rDo8Obm$#WQZ@R+v<=FrG+ z38wmi+&XJ0+7xfPtZSC}u*}Wid`}L_Qs(n8;bmPiAGP}ECjvjBL~V}Pov5+sXL7VT zx(?Oo#Md{kqmgDh&-?{6Unw-*pqrnNTj$T|nr}WSx6Yf>HP8H|+&X(s*KG4C ztV)gy18Y0fhe$e3k3pd=`f2C6v4>n}6kvdcJQusu;1F{(Rp- z)Fonfgqhmmo1y97uw&j#?Qo3whaK})YKLRY+jh)9Q#%}E{$y@8e1l1LQsh ztyXiIrEr_oYt09g6jG9fp$|gn_aUEXQ*#r6ydL5yhT8JXA1HzhJq)?dhFpILxz2`M zAF*=%QL^OQ?UMgE8CGwH{UjN-!w!24OI#qq0$2hCejFR;NhJy+Fn$I%7=H#g`uQ2Y$bto(CI^vuYa1dUmvF=@sMNzbO;yPB0a*bRG8XKt*O~Lwue24~5tFEUsGh zZ0?@ZyiUeE&9}H=@p96((|p^0Twwl_Kl;B++oI;bpvCyc1e@v|=%D{9X@eZe-f^C- zIjD+h63+o@eo#%6kfxOIkSaRxGIe~1U9PT`0&CXi7mUz9)7N1LORa>~p<;)1WSU}a zP_E?s#n4Jus-yHeO0QDQt5m4v=Tyrm<6c(gaE!&XfZ_mRXKW^i*NgRf!+C73}gZaC}= zZWkFGRn0rp*4eXR@E*mC?h+ZDm6p-n>M-w{d$_;AycetSA?THFByzbAbD56wtr2p0 zz|Q3X)qF@5bL3$)F@8i5A5pET|08w$Z1^$aD@__LoPk@oOx(92qxOp`?$~~ZFf)^T zyD|;3{|rv|Yq|038geac#54rGL3?_r>s<3DZAkPrS_z+1PG(1zs`JbvR%m@%=*?E> zjV6T+uNXDK$*-Zv}jMfrxDd0LRkwTc!(Euh>{`A9MM{P zhPrypXE5PxOo%mp5flDii=G=lH(r3(DR#uG81YvTkp~fT?TEKA;$I@79U|u05f?Lv zxP1d|M_h>!SBZ#jh*)4pT#FIci-<0W@MF1)aUd~4QEzAF9Xxs{(gFQ;CxfCd z#LdQ~NMr8hdV&21vhR=2I+% zKtpNGr`ZUHiou{CN<1$xhXLUTNAnCDH)gpWn%|1H80I^#7qBrF;r1C1n}5Wne3@66 z*Y{7NzHzAUD^TA#P~X2`f(l$9KLH8;jtNEu6t22&@W5#?p!wInoQIn7Ju4FxwX!DKN1pSYq4|UTG;GcITO|*Yl1|Am&q33 zs|nR=Tv|fS&EVpDjEnCXOz|=~)9_Lz`($w)Ea~EsT5?EEx68xbELdv{m9vi02$k^O z3MIYqE(*=+;ssEew6(Z}Qng$dg5}~ap&TA(KRwh$%{g2)!IB%&%$%qi)#6$uN?mh@ z%MHm8Bls?tN)zZVNXqB)?>zQ+%{)Cd0%Nd3yKhJn;U5!Uak9w8cFfBC`1z@yf57BM zrTizwIp%%Z$$&G)d55&8lGf!Z|13K?Sn(}Z^9a5#uMH?&+gUUMQVv&5L} zF+5bU`I5!A2}mn8!BhYZ5Zvk?tO#NNJQWuN@OGT~z)P>_&Iv1Olf;DiOeFwsnd8ds8=ra%ZLAC1w9&_DqhZlT znOVleZ{R#K$_RYs&xOxU|1#gvpuDCQhN zG3UVJJWes^3yP^~J_xFTjZa-v;&wA6nks{-nfXyBHUgZWg2QR4nxLisuxKfcPCia6 zu!B%tK-)ln#rf@ReH|4I9UaK*V^4(QG61#)bqeqz4!qa~UQ@BXAGLGA;OnY@PONC_ z4dNW@K{L z$K7o1=5RNcyZPLmhMWd4kTqH_<^=apYY|XknZL*i_Y}rGl~ZjUCxE7qRDSev(q&^bew>=z-R9FNsbD@zFRLegD!Q^qM2a-%vE+v?^zFE~aL2_6LoyKhoPLOnk3At&ZTsGIBa7VETxH^lv>)G%FMB zpRC=6)5JMu7}&s=$!YZotYl+`*csgeU3SQt(=4@EdK~-OkRrkktN(NnikaU0fnedZ z@^lL%?ABZ6>sOv8vZlRUK4aBsqS+2Ol>OkG?tHKa>gv-(BXm}9mkAQp?@ZFD{?i)2 zTt{FJH**dfpfN+af6>WNj}0h3DY$Putv~6OaMK5Ks7}|yS6f#Ta3s4%UkURU`Teza zp*bxWstyDax-!&Yb!D*DktA)%q#g>EoSYJ?fy!{8Hgg=+Q3IjMV91%WH$VaDkS0d1 z8VtbB6*8y_29$7ZILxe}h^(~XaOSwROsNZp1D^Ehh)nL`y1Ww*Q8f?@R)@1EDm|1r z5Dps&nxh7)tHL!#0=o(u>Y6~w$%hLxSFkdeJ<+PJ)P(|-B`2qrXev7xG!j%n4b;`u zRF2a&sZ<3*K`oc&x^pvg^Ykhix4Gq(@V4YZyVO*uB*|h*KBIFPozJMB(F(&unOcpu zrqvZpZD8surmkV?TGWE28cf~5)J;s?!qlxy-OkiAn0gjd&tYnmsk@lk#*}uW9R;>i z#k>{HIqbSzb~=$;6D?&+lA>l`PMuEOppu?Dm;(Vy(O^L#98aeW77(cz)iU8JcKTp} zq$^4(#GyZPuyBS<6h$e!oVr|vGYa5Qp~@`52wFI!yg;T9GTVxk4S1Pjzc}D!p8ev4 zmj(8V3NH)o7ZdwvaG!U7Rj0Tb= zQOVnY+O6eGlulQC$UdoZnR6{0@2*%*1M&>%xyWQ`WTSYxBd>w@B0Bo*;29hCB zcOijI0@=Mh)k(((c7bG34^ z1dq9RaH`}_no!<~Qz>P|_@EQ0Z_p$A_woz&#Ma+BwVdqs^Q22h%Lk~x)v6?}9%?XL z9SEZeK@@NZhfq~uI1maKoUmPd;~T-cPY6ujmSc`-6N@Pd8MnM-_w7pUv2miCCl`ZG zNNg6S;2R^NCd2?!GfW*XO{ZL~iW7tj5k7ZcYOFgAb`rt96zSfi7+<>N=ay41ZMqQ5 zxCZAZ{cRrz+A-~(5W4+f3Y{k27px7|1i%f~)T+Un+CXjI2{4^hu)XwTI+?MQr=xPN zdn$^bZJ~TyBip#WgCRCw8`}0|q|=)Is!8!q5a!yIvYD%#6vIhwo2-kWQ^V2UIWYbv zX`&+n-Anh-Zmp+t@9u#v>zad}dvbjVC*8}Z+>to@Q^8gi=M)W*BIof-BdiQco_j&1eO-VHuvE=)h`zX5DmfN3PUyISd zKh`hwV~slu&~hiv@O_DnYXHUe@_ROR>s|QX}i@j zrFJn(McGT|c;;|zhN8E*Dnn0t5tuc4ox75~IsTZ@JZT@L41klLCv8nMf(+T3K~A90 zO5=L4I}>Ug$19t`3sr}8bJf$f02M&$zuW#gSH7LwD<~c4<LNqNDTVRh{Tmz2bePN;$9# zjodziYu%DsNqD)J_F z(7dU@@?|csfB(LHy?p~4d-q1{gBYyd{gYe}O-|$Njc#(d(Dve_5rGaExMT86x!g zsalVfU{zI>5~!=HQL3tH!b(**7#ef$IPM-bP*+`7r-W+if=Z|s($reFi}r0|ZCz#U z1Q)_;AW$6)E1_!C;t{S3)J%HS8b;mxf$DHgwQqb))L>PxGMIX+Sz8qf0eBGHV6d*T zDslN*Sr@27H3oGxDYw7Ds&G}xePpn*sN0j>+B zx~499n;WPK)TCTNqoRZ0#FwV1GNmRsk@Xs=SY1sZU2Sth{iQE;U%yD`bP7}lP>n)u zWndcTVbF73YHmJN3v!F}>A5xe1!|qXB+r#!S6ElrQkbuA&E1iEw%(y1&_9~{X{sNl zx%X1lkPH{9bo6C8Bt;dExu|ye3d)%wROE+{4JJ8|9|E-_4j+Ui4`-0+k9d( zm^72IGN#XA(p)CZW72#kEnt$LNeh`&!K47H)pXP{_hRN+#*`JzRnJ@v%(aS1YnZf_ zNt=o&%ihkUGcwL(Ip?t4c2s{L#hG+2lg?vO50myV<--|$8U0KeVAAaJx(Wa^mh(CApx##liZ4)BxS17hW6GBS z7L+v(M&yF|Wo2g#HZ`wDgLceG&E!goTI@l)d2#2qugPXTOT=*;aKnub*fKLjJP{{QbN@!X5RtP}IJLurH z+o(*!;qYA)Z@b}bvjT5r;cr@c6(Hnpx>+uR!0#kLsX*Y77^cf;!slCLfB z`bhG15xhQ{e1&3!f5OWFW&9-+uYf#F2c6hh3q4Xsrq{>aEbeA=H;20+?pATPn!7`k zdn3YoMtIK(?>YKwO381;%WsAEyzpKS-iyNfz3~1hyqARcvhe;SyjO(x7va4oyuS+X zZ^C(>~Ea zW=gK&LE1n{Bv;AIdQwK{^m5diP8L-|1nDwSNbE&+dr zX3LxfZ0;etnn?1z`3s6rxq*L98b_F- zsI_m%<{%gUQOKZ%YVpz4q(RNRluIpr5~Y@?d71X~aF=9Wu01`{C7V~EaFCRgdXiD< zDF&z>w@^Kto86Wc6^31dO^MC@+}?4C62Z`#=Z zVPk(Qf%I*S>tz6>K|uN+3+aD2(swoUJ;28?7B-`zgXhfuB~l*8lniO~psh29 zx@MX;(P(+3oXj(i;3qJb>QuEiDS$o$plC=M%?yKYjM66Z3>~G-6y0?ay6fc^z}=v{ z2<}Gp57c~t4xjJS2^o&hvIY3jjPHwdga?nL2CL>DC^yIJ-OnveZ`NJ{G+Wr8sQD5d zj%o4PhtQlchta+D9A=yTXKMbLj>L3~HOyBjT2UFC8=W`5-60<1^I{J3H98byF{44A zr#k>eOn(G$#Ppb&^T6@rkZ(+b04=7)l$=W-;O|&u^=f^Bkz6jMsGJZSwKp8VZMxYcZCeoiVKT-2_cS4(J=xPtm}(4M&zT{L7~BSA)OMjQlze_-2UYEwvuVdz@1f329#^ipk`Gzzy47BS_ zj%ozS1=oP^PiUrL-YV~4k-V~`X)CZGhj3(GCP(XqgnxWxbX9y+WVJNUyqpI{)<89` zl%tV&B)T@fHrg0(j5I;)XHgkJrlx87udrzzlTcQ>U4;SuDXKgsp|G|hRK*mbs+iKj z<~;^_>K+G|;O?ZuD9b&9%4K589%YnXL>`mSraZb$61taD`7z0STte~e_&Tm#W<5o; z<}V@4{FM|fLVYmJMHDkJM|C zb;65o{wE3hF7Ii~9<_w%mI@k%V9mPRHru=u>JV)%C(X?it7#sB_j)f@6_8&AFFgi$ zqIu!PVSY~L$TtA;t9f)}Bee1t@KI|dj!i^YNh47Q35gH~DSe3|HBF}fZe7KTKhYYXfYD+F6*UF=GExi_~vkX(@8j8J->P-}}M&8W9 z+Q`i^QlndBq(-;O<}LD2d>f3#TfyIc=oqR5DUFv7$7df#jW4Je1YfrksP-Lp)W{IL z-O06hz;RDo2H5ZA*f*1V5idpeS}J`@HowKw48>;;8pq80GOxJfwJ06!|h` zIL6{T??**2=H(FE2-(LJSZx((;+&7cV*6>O6slPS$53rO?o_x!jcw!$3a=M>njB_$dig4T-4gF9fY{4!uUj5`VQS|!>VZ*4TMhmiO#F&?KWOw~RHIB&6V-Xd_K zcQ=*L+bpBorrZv0M7>Kfzs@s=DIy2eyhDkpq8aama+-H3(J(XxW)KO(`mCAvD6p47 zg+KQy(GSHx6w^i`Z4yR&6WRp|QLGxO_7L{pgH|aX6s35O*X%)Fvmapg%8$VP7FB-& z-g@n);BI6;Q_P3ctNcS=Wh~GmSfC%-^@Tx&+CQLlP%!^}G!mnOWl)TtLNTD*p>uww zh^br0kXw~5vQHN)E9iHKJ zIL7Pnf@1zUy}-Xo^wDpXXh*!G(R?Ab%)e8jolxdZ6vmp4*+e0mSFCJa5!t-Lvw4MQ z^D58gbp_Riq-OJ1o(&GOzd=14&DT>iF_mZ>GKpg*rFJIoSed*dGI@t*@($1BzdVyc z)qFQSllKyt{EufcsHS9cP>t?}Om<@?Gcc2O$mCP1$mCNh&jh{A61r_ND)@*fpI6P# zs%e>ArP@9GIdx8>`T5j5u2HQXj&u?K59v|JY9?m26SDe>mDN{7R$t*+eT8Rr6VK{a z)jX1()y;{lzN*4tx-~Vcuc|6(TcyS53PmQAff^*>=P?qC_zX#{V_f)aH{xKkXjMATj z*DO5&?mGEN)bfGa1Nh$e2kKh$VYT(V*{S+)q^0FBac3IR9Dm zr|OXZ7ZmoQhk4SULG;g|Iv8mFLbZ3K&zVoC!|}a?Wyj1X;h`61jAH&ujqWp_Qio8@ z)jk;xwQB1*BVFg1!>AQxmJHG*}mcOv`)&)&iz$fD>1S z`>d7Wk64n~cvRoP&wqjFC#jI#niikN9j^1>5Ek=oHF_BxC)o8vEqeLbB&b252;yE- zh0*Qtg1=4c#lyC?zTKS()7vx2y7w)OyCfauqPG4ONg33|>5&yDj9DD#;;H>(d2UV% zmo3$`?EN6=={&!)$2KQ%8W^Au8Ul3oy)Ptf9Ubd=YDW@=HHo15_k&P;2@we9o)|&; zYrzQtjYI)Y%I&%C{R=^l8(+e*StuNGrPf8Ms;LaAyv>zRO(4juQJ@5?YHA>)HULkR zm7a8Ta&=uuK|XaoQ=*bH#k`n@v!~luoTXBulp5o$hfzs(460O8T!T(A4CBEB^X$zz#rMi%ttb0@`q;hvtPIe@8w z+mz7N(b+%Hy_fUfHKe|*bXvXA)Y0FN^1RZEUs~-~S(#={kdwtG?iO5dR_X<0M(Uy!{$YtQj4WDOp<(U z;2e4V<9epN(vbvmBqx(@J@#|vFTHbb$G%?ZM5Ap0sutTn(3#MN;Aro+X`G`Y@kqNl zrw~2Y-JTfGI1D@bxA%4TYwg^VyF22U1rykM&p+}qP( zJ@y+Smkn+E9LZ3q-Uaqh$$;RLZtTazcAN*`QsSJ+Ec#cSQmahd5*caau)I=mO&f`6 zkZnzG3jmqNnmV$qiE9OlNt?!6z4E|VxgzGA6QE<7YTB)iG1>9*{45c;{sDjg3O*nUAf}sXN+{jR%vKnm#)gZ2LI2cr_ z;K1fiTYQz;x)7A7E*K0cRduzsN+?tvR6^l8k=8(kMIoO`bLHF&y(D)=?wmY7H*~a6U6Sk9m+Gr>*W_N5 z`x&ZgR6Eum zzCw*70C6*fxo;8NdeZ&El9BWS@E?O8a^?MkGS`#Tc#KYyt90{6_-hVPf;W?{gaDn7% z^zHu?b-CgjXqN91dhkLBab80QFQtbl^*Fyo2ZO}(WlE^icLN1X1y0{>5EdZhYj`x5 z$+X+4^mTeCy@MX5iO0K=k9Q{@?@2!1n|%Cc^6^{A$NQ3x-%dV$C;9k5^6|ms1KTkeBo_u_Q{*qEspLqWjrTcao zI>{oWP^*^>LdnW4UJs>GMDl4AjmWqhsC!G>NvP7jg{f3+*y46lO|54T#LnHKYg8|4 zQ6y@dx5eY4j{GgzKI&Y$#pk82oGlq{>Rw#01E{BG3(UieC0jBxsJCdVD$`6yz2YR) zC)cYGpG70or%;-mwq)Xw1u2ej2AW)QgqmLk*dYMAm5LIYw^30(^J`R; z&b%FqrpT(SoDFHe$I}*&??Gh?DY`{4FGuM#`C)4QfJWUz5jP$595Ww==VAVgU&*++ z7QDgtO64RAKQcc;qnZBl=1eM^k75phUsgU(A&aMwwP`Tx*eIPxo&wbKDY^@!VQM~u zwqR;e*F7DIs&Vyxv`Aw9n&R_NJiF0+fktzNA~_V2n=gvsk+y8}cXXuDTLqvmLpmj{ zh;)CV_{`J2nv(7{5sc~n3h4;ZWLY%zyHx1HeizCUr2nJl|7bLCD3V79ozI!aX*7R$ zD3UKh3a07`dkib{X~|Z;Uqe65**OZ4U!(L8GHh@S`~mW5$-EN6_$TS2c+pwYEOl!+7#_tmNQDRtplo-)v%*nh; z;@b2}NICH!1IyL?JwCnB{37y$l*UW__5KF)Fb2~dG%`bml9^wUqBGI7Q1eVG6S)j# z38a?_$t)uKh^`n4dr5}M-Oej_3@X|vt*I(kmz zV?mGFttvCofWIRv#tiT@sETZcAWx)Xi(;rhF`A<9`)*hPPzb#&6!h_ z`23tFj~_R`i*04+i}f)duybSP_bv1e?=6V_2cj!g?8^9pxF0%Gvpch0@h-yN)M9E` zJBzXT?YiBY8gjJ6vybAZS?E$V#;{X$odq>D^9krwO@}d{E7*SK!=i$EIf-XuOPW8F zELIvLz7PXZ>0o3LjZ_d`H!Nb0L)6WIkC-9UZ4=b(M|Rs{lQ7<>M;pz@q&bbmQArdJ z2@t)I1c@5LG2kOr#1SIZ#Bh=@VIERLWDlt&nupXO$F+e(W&w?fq~!Gatu!o*B`q0_EP+1Y z>{!oB(WQ~4&<)5%DeJQG2F|&cB_tr8=gP@3oKx`F&cErwj{zYeFH7btR*|4YneIf1 zmSLIB_k9id#aiiKpcuQPSHW$OUz5zgNJH`EfYp3e8jjEJ2Rb1M#*KZPapObE-;m2t z{X4kZwAUr`Z&I{iIHtt2BLy_R0?T0jU5crYv|Te_=V_U@3`dM9MeDJ{0kodR8~6v{ zH*iS5F2&d*{Wwr!TF$f3SFcG)W{oT0{cY?e;!@lSJE}s>-%Cu$PU$^KOfy+{ikN$< z@H7#~gr|!@L%gL;$T)cq+zs?S$vkdN$fXi7FUG+lm1dP8Z;8y?lG`Bpq};j~R*l8T z^#*|mG#lvXr;)P@m!#b*DHaLMKCQIOjmeRf(mdqrg8Aa_#sGhJJR1^yo-^rSz*(#C z+wFGB&7bkFw@@GR8ktWt#wXe;m}YunnrYtoIL-7JD{D7m#{71NJq)5Dmt{WXG;7K+^Li{E&RXTHY51x5i^4h^ zV8G((<_)5F2F|KDl5|I+c)BQ_BW9GfJ7doI?Jm1`x?MayX2hIWJeTeaIt*SsC}|AJ zh&^TADEQrY@$hT@&HTNboSQw*yhXP8>LROQ@?S6Gr|UNH>Dr4sgs=0)#-ek8&vQPf zoBt=iX5TF;D#sV#a53*eWU5#|RzliuU{`X|X0?RF{3e1p#AL$hjc+``QEpVrywA=~ z<=OpQUP~Nn2yDJ0L@Oj~32h`zggHqwQ47gBVic0~Kxka94aDIj8;R~Dn~3ZrZYZ7c zOYH(>^Hujk^1N*RUQVvM7ODPV)?L~B zgUp9Ewn8>C^1dV|R@(#S%W}$UE1CZ%N4MZiY2HGSdrdUI)w+uL7ZISKI$1%|p=Rc* zR_IuA5A`))ldUS7f5%)~c+0oY=;rw5%diQ|*F|F8Hu$$v;?Se^xKScoDH^r%E*@j_ z$NWdK8iUk)i;s;&J>E{K2O8h`7suB~k4ivFrES~w9YpoP(g8g`3s;ge&_>{yL@p#} z5tc>HCi-S_4(>HPvRhVujXnJyH)6K)82pfs??iSxC$iglEY^2;GthC2(n~2p-Z?m^ zq4!BD9hc4HI7yvD2islV{Xjlqu9&j~(2df|{vT~`0v}a%JpjM^mbtTMX0kv6m_S0< zhGa6CY~aF>WDF4jS=?vhOvsQZ5KIC}`)@mcEsB} zGE7~rM!IJt&)AKv1AM1|)tz+jUgNtRsb5Yk*8=s0^ahn}GEn)2?actgg!v2-iA$JV z58f!p8+I7{B6MLl=vT;&=OfUS#JW{wTUFlCUPT7B`!|y9@V%OB$6mMH#b2^(*N zH>uIt&{bKX>a-+VE&^BVgm1{YZw9l2yAK@j9D__=Lu|LIsKVU9Q7npjE|l**{L)uYx(D)L6CwAi_;%qwe(CFe%ogEyow zBj#=uZ*h8XIkOsiWgPAFpHzRaH8^JMl;tILS9retAjErYjyCV z%3fCge_9>Yb#E-6bTz8L7h#eh$R3D+eu zqysgKL6h7+3EJp-Y@LNT(F#iMLPk~*{I>Gzf>V|E;d>KNzgF3YYPuxvIEd$CRiDG{ zXa7_Ol2b*8iT6K0RoSPi-rL+v*r3`kx*BM4OpQ)RSa5m5K36BLfg+fSxAWEL%ru`J z?q~mo+EScMCYOn!%OXjJUQWPfUqk!8g+w}u|2DEcp>D^UwckQrK_T4_@f+ITs|aIl zYJp{mWgWjzSP1#qS}0@s*!h}3z==A$01Q-miO;nhkR$IwjtG(7d4@=D7psV#9X&mH zdH_Fo^J^8jiK`vQcrsTz_-RPxk~vLy#%^5YINM_!w$IRg{y&Iz@`UFuXbHD9wuBe9 zHO_BpUgTQcwX~^=A5+A8*4j-l`+!E8{lDKT;{j*t9OEuDM5J+PKBSABsiIsLJAU*> z>ijfBJwD#oY3YftT-v=tOD^y3?#WyPfCM%<5!VmJ-CPJ-cul;E%SY3Y za4$(%QT*3z@H*lkA{Y_+@YLHf5NR(s2(_yhAmg5a#%=l`kK9=$cLq@yKu@@jOvfkn zO)G%XUYL#4WeUBITPT@B~6%!IlUcy*>+QkNlwX{fIFyJ02tD+PRqY zQ3qw2$R?$;<6LoyA0}}!n>3OpvXnHF2uY4VC`k616&B6tgD`aSu%|+^|M$ChJd)G1 zS|L9Rs%ofl4XJu+s3BCZ)>Z{;)nG$?jU%g8sCB`HDm)Xau18rF7Lj_jK2%esR@K$k zQk}S36$;e5x&9Grfo)ViKQ1Y-78V?3Jz8rl$X6`{g|}Mqqy$Zy(?wiI;W-J>D6ycD z64gspAL=Pl^TrUWj-s~F)Ha6N#!?%XXP_2STM4y|r)n8hCsK7XRi;vPI#nyEEr_Qj zY7JFusoFr*8Pt9xbvRI-fqfRWhp9T-Rwh%mz}6(&#>lo~W$J37@*G<$I38!4E2E?W z^?0hz<6>!NQf&d%Dyh~))kRcYO4UxPE~l<;Tekx9IQa8Skcg*XN~)BM^7vB@QsAkB zuc!Qkbu&qwCz@I)NihjA?QQZIiFiBzcJObKf0yxZ7yq8gzi0993jSTmzpKd1a+^hh zvD~K2QdAfw>QS>g8O^n zBrj3amLY1^ao4&gCYJ@us>*_8)n%cwnzGumy0ZGRhO%(k?6StPrn2U;$cY}@)wamt zm=aaXTUD5%;hwd{rl?z$&+P2PJpp~g1@B*16ltJQ>Pa7m|<@7<4qjnDxk9H0_ zIjWVFwQ3}#?PaIH{AnMH!FNC38DnRp`=>tHyASs~a8ZMs-S~@8smyar#7dI3xXnsg zY~ab>{R3sz{Fh)_)y{*Tj=?+3;APX}HnvR6&jRSzrTfA3_RyrQY?(1Wze5PcT#YHUZ@ep)yOh#hPug?_9%m1aBez z1FNTQ?AwpiTg-5)h22Qfk$jx>v#r^_m_Z3`A|rQ|sdr+=ux%M{y*feRfSUr#YA8Ic+^gz?D=S6_dr?rzBPPL@fipRJoRtv+t*)Kmfr;_ex8)K zuonsLBB}~i)Ymbc`*4NA<-gO z`4$m~mc2^`pa9w5z>Npt&KCA}(hr5H-kz}BJ@Ej!D>4R_TW@gG0VoH)IrIM zNglqUI=~lDE$lqLI~pxc7Vq{g!FPCgWKhf>+ZK}~4|V}RdlCC&4zW)rL!H5GvSQpj z#Sr5o<0ZtsNX`UCw0Mc1 z!$*BpcGMf?Okh3gcZkHU712QZ*v$_mH)re@wXmCnr7T&-`O;&+7o`MZ@B;eH`jHGQ zC2gtl6@={&L13}E+xHS6>_is$!Zk9EU@@?JMGz%23D{EEeHcLXH}5nyQn)p;lSjwy z=Z89x$x;j3WrUj|VF|Ja`N0l~YS_J*r}kltYHD(7WST&D#5fSrB7WnrMDsh6w&?Wa z^t>Vn@u(mPjy#v9?vLAG35}Wcc*ZAb13R{L|6KMoPuxR3JfnDq!^w&kzk@xO<^Fr& zUfIH4Kz?8?$?ZsmztvtYZ}#Da>&w|?^JiJ#vyJ+58t30kPS*4$%gxIugIR_ zVY;!|YkGM=jsac7dW*-|BL7DFz4k{fP_;+?RQnQ4EhuS6NYxT4mqL;nZmlCN9+=s%_vQ3H|6)90DT1zRqU3oDvU3UhNVgLY^sW9A**|r=?AZqPN$eBd zu6Qm7`$=q2x2v9?fqfcdx?S_E0Q<@8bKP$7M8SRv`$D%<+)4AF%D&X?R?ksjpU1w^ z?KaPJu%E{MqucE`ru$E4|JCgdR1G`{d)XWs)!0O^vq{k-qvgr+0Df>2VJ5hVO@wEghbzQe z+0j?IWZ@jXi=fF0dS0e@O&x6DKLh+-@LRFEx39UkJ-(_#l1nCf!6gC9eiVe{PZ;^ro;v1QKOCaw8|CE>Z21>uFw^A_9qW1Zz| zI(n*qwEjZKvY8MatO;Rx+`-FbX-+b3)CAoA=v4q=+(A{QvctqM)S2l7d`ml^ggO8z zv*Is4IJ^;`ppf7xB<FB(c`4tOopYeVVbqR@j|jjD6R!N`V}`Rpj0`r!gB>*%waTQqoG z9x`HedmkX>9~=yRR!D9yRvb$kzdug9dQU`i^5JvIB#Uiec^osDwuyeg-j-?Iwl?en z@and$4LgE!x_g#tZP>!$i+hf3y!dQwM!WR1>FqGy)85(D9$$Xg(lS#j6n#!P9C9a6 zU4&Set3MKxXJ>CX0lB-nufqX3+?8A#UcRa`Zp$E%(=ELn$Sz*D$8lH`1GGd51(W+<3^yZSGlnx z`51XWqNkDFD%PcOBVjak^>lDK>LnxjW>>TkA`sOXD}hab&@I?kqW)AaXZO${pn{Fi z{bpJPQgmi)K=iQ4Kx~8-Z?r3<TswdQ!?5mr({@0rj$ViN<|}hL%T*Q6ak>% z$m+Qdg?Fw+P7lW0wAI!ySsCSO*{_62oLKqCO>oZbBz)5%0L-Ek{40zaRy8ZF#vG*JKHI^*GtkI-=fH|_c&#MW_cA5NoS zB^696O zWw6MAz5p^AR%4E=)~HleRE{*ni&gyMZm=BcD6{%UYoFJ*Fbsuop@y282DP@jzFw`V zuB+EVb@jE?;2Nq4sda(cdNov29n`9WfreVOran-s)>Xl$HW&=yW43y&x*-?>pN0@V zNUH-%wKYJgDg7GU_B(cx~5(WR#n&4sCBh%e8Jja~;Lt*WI-pnuIS0h519f#;Ree1$4XgJ08nvM&5CjsOw-CM& ztgEYmT&P9W09Bz{D63EaQd|vX3>gdM0eE##nnB13WUiqBzd?v06llO44mQ+RJF}~s zR#(l-uco#NUm)UZ$A(ZK%?tWc|ssH^p7 zfHI}B4aM}!E-L3xg`aaPc~r@#N&!_yaq%>TTtdwlE~I80mwI1}68x3%ROZLs@+1`B zuL+U;K`K|H;C{J*YDZIf7L^;RrHRUOsM<>DT>d<7K0f@DPoVVRSAVBadMc%-QF=O+ zSZKoQS>aVS&S~ouG)7DV=r(9&ed=32YJ>G5byB&Ua=o0o(y8Z)X416Di-)=%R ze5v;v@mh~Q0p_#tdk%iT=d$$q%RLR{=kFm@NrSl;ey;!woc|NNP+UGfp85iQ|AJqT zY8OBTu9vBHA^a|aeB1!$wcxf1%p1YnCUYeP&w=qG{9c9M+wl84{Qe8S@8Nf`Vw)(> z#s_+&sHi+u3g4-z$#PMVtu9qM4Q%z?ZANOcQd(40dJKxfpLyg_q_8lO3X}3lEvaLr zNykZ~yl5WEn-7!HqJ^ojR2~JV(zaAgDm_DzN|#CCehvmGJU4|nKTEBZN`DSMzkpu~ z#pbWW&-w5vx_}_Li%4ock%~5O%OxarF<36;mdi=%GO%31Emx7$m0;P(E!UFN)nM7g zE!UCMX0Tk(EjN(V7O>pNEn9_U8@Jp{Qa6ERJGb0IQagyHyomq13pu!$TunBUE#xKw zT;EMnw-U&WT_m-W$bj}s1nwtN%WpAw%i|<m&%vPq_prVIdz3Bmll?8mNCE;G7nL7GuU1u#B-gDWr51EOmL?O-fM#Qnc)2<_<#xSGQkH;@RugI+XNpn!C#r+!zTEM z3I5sye`A8bHNoGR;G-t^mlP36-2|jIt&zRt|Cir_3eBK0KFu^~V;7ca> zvI+jt1pj1$e>TBACYUzCeiIxp!M~W`UK8ABg8NPI6%%~T1YbA7H%#zN6MV}A|7wEo znBco6_%{=L&jkNrg72H)2PXKT34UaPADiGmP4E*F{L};oO^})3XD0Z$34URM|1!ZZ zP4Fud{I?1I#{|DN!Ea3PTNC`w1P_>CO38rdnczATJl_N_Fv0aEc%cbiWP%$^@DdZe zR3U{eHY(Y}?TykTQrtXSDj_A!jna5BetB4$NhVa!l8O}Q5f{#urjoLTM#)7ct_Vw& zr2LeyR8J-~HA-X1=~N2V{CEgeBBI>VBmR7M)5 zi6n4rqcnw7g=b3>NbtC@R7I*+hNYuP=!~#*B&nG`ODeV7Np0h7X*8*;5ggQahoxgk zLqOPOENPUA$;?_|J91T6swPKG4ND$!^x{To966>8wP?($LzNlfhS`#v%&ru;jqS6g za?%u;EtQexkZ_AMHcEx$*a~55IWsKPkU6J^r3TV^>}+W=IWF8Nm6Ewlv!x<({0XQ; zW8Q+W6e9B%&z8oL1!sq)S>%ME2)*!BRMxSm9#v;7?g>k^WXZxtX&N~(8J3PBC;3rh z$I0=q6eOn{9hP#)scm6t205)tgg$*ySej0v(?kx$dc#r$X_Jc2TIjG5$rH)3NrYG< zRxsp~@vfV4)*`!=sQHn+7*U9(M${sSSjOY^IO>cz0MA+w$&bkjvE@YEV6~G7DN+e> z%*P9JPFKVUjxHslKsdKI;sIL@jnE5idCA z+aoqG3g+QOyHQ$110ti{5f``>$`KiCMW^AL^D&l)1uSFpBDpa|A>(o*zL=_zBS@GO z;+?!RP&%NZJ|~Myd5g_Uc_+nWeDveDY!~mzPmL+uZr$Fg3=*5t7UPeC{Pyjgc;`-C z8q>JlxxG^xBrdHhX5n`C_D;(n$+0YtQNO2?4iYczjaj2Myb;xEBc0Ykl4m_9W{+Bv z)=v8%$+!J9=HM2`AStl_BIe{4=O7v7IG@B^+~yi2qn#I#m>cLQNd@V+2T7spQWDDn zCpD>}Q_dhMa$iYe9&pl<8ajCf$(Wo?B<96ur=8wGGS;(&#C(8YNm>xWH%P{Lw~<(G znbes(NRIH`L}Gbmq%&`j6zASdV)CX{yU1pDd*zXG+Ol%J$Ldm~>=U|v zKl_XdeH!>)lzliYBx*zL_W|obs!LM{tz?(uA5UE+Z(P z-5+9KQ~qW__1Ca(b&!1rK%_)MFl8M;M~u=?rIAh+=U;@E1FZx6t`{V~3evORCh};% z4Y((-+SseMG$i{q8)lZsF%RSzIK6JeoX{}era-_Cc)-ch2R6*Kk8JEC9`IvZbbNng zJZ9ZLc>oLEo|_2)u6AO8nbOrzjgBPvJxadX$u>C$Cgu4cxz{<rv8=WHPHC?^q?9)-ZO$>UD;xO2~JDOI?SJ>l$6N6N?)_LMU^DmkizKZ$&n z!~Kzoq=micL}sk`IJpog^>a$cO8rju7iVl#IzEc+#Y+@6)ZCK;2>Sqmy}}9b7s|4# z)q(RPL~!s3L2!=5enZkFd3YV_wz@d{8_?& zPoh)Pk*P$8;(ngQrcLUc#{NK}{)k_~H@&EPW+jB#gW?_fb^iepn?9*?I@?QP6(|y- zvx4m-u}Z(vS;_X3SO5TEo5ZRBsA8{@SP+09dyT}Z0jOrLlUN9V5PO5fY5=HVZ;@Cn z0JZFGu4Dx{{V!JZ_c*ID={;2FlJ=bgOnzjbenL-Ar`GpRtpCn>I;!Z9_mYg%K`2J_-iA9-xvw})=1!YMgqS# z5}1-jbnE29vv|I2Mz&t&k+F+}!V<{$Jjj3z&>yo)fyo1ZWVIDtZ$uml5c>#vA!{3eJQ9yzuc`P5e-hN6Ap>&Qto!qyd0|+p~nJk?M|@q;+r6W?QVrL6*&rfyPe2P znGAUT-n=95LZYI#mIuKHGo?)4!Flxr@d_gN_JilImDsfC(UGI2sqNOzY52N(5`Rbk z8%59LM-|Z{c<>tH(-1$6QNT0a5#D!TnREs1e5G7M1%3k-;?_`3>)tnnYy3-4f8Y)U#R{ABI<{D-d9BH z!&`>zV|3JWtdji`V;;bA6P zG>{A!#r!P~Ivp#S601TV#6&Y$963gY-r)d}1iL|!zs+5zioOGr%`Q~+9_1q4m0hlK z_VhRa6hQ00u279Qu2N$`gB#J2VH`oWQ59So3FdKZQuTblLHEV_QpvWdBbW6}s$SOH zRipR!Vn5sm4fRe{j2L&S>~3{WI$05~z&Eq$WM#aP?L;6D53qX?sESvy`w$4mgY13; zs^it{0R%$v5Zi@7O}vIZh(K+;mhDDhT6`LN2!ZMG>FihdHrIzL>rTMoR^^?_ z$Nq%iyVx%I39bWUR&tjA|7MfatbO?IRgBzEtLc7`anEAL@eb}ewY-HruTC-^N4jxH zQ*lUB_avu*Yo56AIDx&6u5W_t^v$Te#z1}_oj*ipa4k^4H3+W%Mb~dsV+i31qvMmXl2y+oYw%G-a~}odN{w=d&d{%$A^mUWY>aiwxpBkoc{FI93Nve2fZZ zd=&WJ&WT@4q}w%im!{|CJsMOUzy~1BcJiP}C(^ED4`_SJ;|**VMlsfi;wg;c84(54 zc@f1pjG_X3pW{(nMx^I7_PhqoA~U;lAk6@KQP6w|X&zzF>_?h^5j3lkRf1+Q(hT7g ziPOB2Nc%MQiUv&(xqSt=eN{6lSFtw)sX^fjYNg0$6Zmf98UZ&GX`6-JY}sQb z-3<&v3)x}WBgRsGo&Pq=9=`&O>@G{Jp}ez!-Hkc|%Z!-zU`+iYrcg2@Vw#9CO#gxG6HtlX%He?wyLS&$G=nS@Qg2=m6E^1g+A2vpJ#@FNU3 z+2Gv06dOm-Hd2T6Q_zGYJag3JMhcGF7!RAWZ~tyOP7o2*c(X>9ow$k{rawcTdLcP%Zb zA_UiPgJdU>ZiB_|y@cFh~O{ga7 ze(OLw4;8EIvi1)oTXEg>pf#bk06vOr+ABmhv4^eEBEQmFgc)0@K-U@uPF@h4?B^`J zz#}Cua8BeGt?XqZ?)@wck@Uw~*?={A+(6_wSW*1N3TY204pnUL7vhefB7F#yA0p%R$S`(u2~^It3Kv|`^_ z`~ANb!Elvow5dE0D!@vqkh zF1lbn=Gnc_S=ca_$jvs)C3(Az*9$bD_U-`VcSO4dj7N#(RvYlN!-j0!ZbO+Q>2>Wk z&qmA?h!544-D&HG`f`^o-7l)iJ&+{+cnAXSw4uu`TXg2pZ2@P@h()UrYKv{9I29Kk72+MZCU(jatc0hLE zqrvBFu~0&T-sSf;s8T`f60kXa0hz+SwCyR$vv3Z-vbC`P*rE$2MHXNku0}jB;9X(| zyvyv-1?9pcgq3@P3O<|c*dU)K(k461UC4FteTK-_+kx11_VxR~xZVyay}=$mA##E= zDeoAZ1ljx3xD?)#Y+UDo(HsZib*RkoW;@L65!jx=SST={zd{U;A7-_8*u?@V4_}eo zYu6WJQtkwtiQ5gz>kZ25A^HdG{R2Q5N&nKGS)B4^fgM*^i~P@%$Rfhu^Rb73i(W+i zwOvdxf%Yl5>^EpH7PP?+Y5xvrBlcr<95^$aJYirj5!m2|*iT{-2RJ9s0Js`~=MB^* zfeQQ~>I*vIm+aBzWHTp>VqsoJ3h2U#q>Zp)5f;Wo4BM}VebtUbPKK%14eW@(20z4p z14ynCOucPKm6e$Q?-&7&6#-xf!T|3=0J{kAo*j2vYOtns*bYb9|0fbT5$CJ7IB=qm z`#85d(#E20FT39nJ*hl$60YxdIr{wypJqPjz*m%x=*j)*Ns*HcX(_*Qz&!U62hMZr zWKGp};ehi3=RjX(4?s^3asP#o7ahou{1S4ayzF2vI-;jUPQkh4pLi_zp6$;L95x~_ zY_K#q3Pzzv*yrHO*sPbblKuj2zZv3H2W}`Hh26;;jQ{zUWuZ$hGpz7iauS2V;)tsgYA9PVF-@`Y#+<^liwpNrC{=C<2m9C5(U2|4J(_1pW-LGlhEXuM10 zkHGjFQ9cIa??l}K81E771~C3XEW5yXpU?-v_<&fS0pmkrL*pZ2e-@07i35!a=W{Oh zkrQWRdm^WiRN;R1u~STx(FQs9iE{vYM6;rxg+Dy}isL17p<4%(6U45PE}BYMedl2@ znV!CkXF10$!gr_Na{uz7{umhJNV$wS*1HChjWB#Q=A!$B8TSp~z7X6Oa`%ff?w1KD zzlB{hB;>UjjLqQQ1ny1T{kn|%7I1IIVeSSO_%`F9xXlIQppu7pH@OBPr%UL4vkL}L z(aN?1CU>>4TU|Iza+0@YNZ#R!o;;8Y1G#WNv~`}eJ2MRKf(XN?X!${m5Fjht?MhHs zaAtDdDlEQHm}3v2r;_cd=-Ks1hUW8}fS4`W*b6SCAZ&K_qAOub7ANeAPUo zW#`LWoL4y6A6*G2pC%y5{!AkF170Kw@xSiE0|=MrXx#C66Nn{T7|_AqLP{<{#l_BNuZE$VZ2;f_uqwQUW?~m+!4xf=tK@bz&LCf4jt@6SHh9u z@Y4+4F945o`0s2E|C`0(*I68Xdk}};WhnjI6tf00{9m86-9Rn?xv zdEgCheyXF-{=(7?Zr)nafY!Rz&0Fg>Fc?wq0^>8H?FQp>V%hCxTiw}>aGQHbBfQx? z5UG>+q{1rNh;GA8T(;e9wmQl9stdNm!V@5(Y7)ucB3n_k3N4*<5!yGWZgXG^t zdK)tEKZKz1Un0K)#@9r7*NuIkdT9>!ff^bg5X)sb*auQHz9H7j!T6Tg(D;tnuK?qF z;y~j7ab5{VN_JfZMumGLe9x0}uJ^Ea-D#Xm|J~j1!^zTnZev3MUEjw%6C?XaZWzP= z>BceD*dQH`0uI*6p3mLvb2rRiV8Y1f+g|oBcXUd^8<_$F!dE;9j;*V3u<)NRvv1t` zsaz^2T8J{kc;#4^gS8=3{O9NB#m}W=UYHXt8{mgn7v%sSm*-4c({6*Gon3*T1Ab0+ zC4w$?O%9H*xT~GRyC4hOoFk_HZhn>q7NgssT-oQAoao%vxf0shjX4QR26Zb~3{)#e zy(xogW!rNS6j2{A&K(jI*K54r!o}GwIpx3^yA{wP2}sfH+4vrg&mFM+X9C@cfo$w9 z41|q-XHLR8G!pBONbW;?C%YfecqF^B@p&Xx?l2^hUt%CT+l_%Rl818=PG1Sm*mL#_ z@JZ!k2(-uB+2aV{B=kwl_osF0I}NcO1IY-didE+Y1N9Gx`ch89mNh==Dd(E&|70Yt z--u+9&1gT0)ay&+2at(=4#nsgot+Wjl{hB;e@ zJcYfJgWwJb%ihJby7*%I?}+{-$yF;GE5HhU$(qKgSR< z()3Km1$>S;R6z96DA&@H75`P9O#Ih+Fn&l%A_w|j_+nP%R~$HiD?QKpb`QJBldxm8 z=SM59HCQq`JkcbObHLb?R1oJj&z^(_%H<9Zo>d*CSXAv{oQwY2gWJ$3rREY@`n6|} zTq+YZE|X<6HWTHyU{t8T^FVaJ^kuGwgrf^}x#FeNVKowUD1`f8fziwg2hqkH(?*g^pMp z8-9YA%o8o^=l-AbEIWpJRqbmHBE8Zp=AtToup_4M!!Fn+=A*#Qm0mu?p>d@wZ}ehM zt6b~Fo>oO;qpWT6;-u5E*^84-ipF`e6^+frcAXb@LhRRjaUajI#fuZt8{m7j?7Gp5 zW#iro#x-)z_g=QqtEXr`yV^S-QnblybTSrpotJlJc6L1g?Ks+R@#5kV+Wd`PXaq3C zqLIUH@{0P1Ik3YE4e&PafMLJW3pujW8(ox6Ho~fXQbw{jyBCNxrISstwC9))BId8W zeC2{vf9K7NpO1MHcB3;?+2da5C=9E{p7a{k!04vbOgDv1{weV1{nInqh`fJN#ePdcI~9vb_X zgnjSDmVCe~W^wr#`FTE=EqEf!AbSsZGm|q2mH!Sjvi0bziq6o&Hu#`VuuMwi@Gil| zF7ff%qlCv~II3RZL)UA3(N4dD|4~ME!WrqbK!x&Q6PQJz*Vuwh;Bg;c!Qw<@ka(oW zeS_pWnV@mKEI$cGSb5#Yp7y0VeN4-uSU|s`YyzRp^5I>+mHs8_Nd>7gLhc8+NsMw<3_eIZ)oCzKu zKu&lX2ux=(0fmezH@1e4xuf2l{Q|oZbZ9balxQ-aawJ$3Lv<>|al(w|b0eBBAR6{% zCh$(PRq&%X+?5!MV+a%$C#D$xd2xLW+@wsZVb$gN>c2@g(JmBd@=!EBsXJfRQ+07}CRLZ@>Z!Uk7gDt` zH(J;a1q7vNl*qNYX119L)w7LLyUwI`y+LgYQrng*3hbs_+#CuUl3XURmS`V}Neaz7DR}6~=b&3kr(GGCzTGP=OU%tH85jJ6q2v|OHmJQEi+9q;h;vvxS4dFtL zfe#h+_s4l{_-snRy_kV00k+~06h=VhZ>n`sA0+X=1TtJipB+QX4LmR27s`B^$E4W1URY8OoEl|yjk zGJWFk$c)H zOwVwB0zV=RA`-#JaMiXv8HUzVPSLueSCogwbIZ=Z+<_k7yl7GQ*k&g$OFc~f5PEvL zdR^_^J;n>&IZJIqZDaS+j{L^uT|lWKyt=OwOkEVN7D0c9cp54MD08@}qc7gI+}6|G z-Pagj-P>W0WO%9k5$WbM^kjQ=c1;QuKY{|ZmU$h0D=-b#F797eZHJbi6Vr7Ncg$IO z#E7{tV~&nU<4c!fb8*Ho=N5LHy}F~f&z7m2t|2Al%;wu7qIC%FIO8KJCw3oiIOw8= zGs240bK*TKeP-`AV~*&=6i9m!w9S=}x7{mOLR(+lovr0{>Hn@x*(sQeK$&$c&Eb`# zNw2OQJwgVu+!4$_xce@vs`_DBOk=aVf*Cv~OzJkC4U0R@?XwzrKIKQ0ugF~gkHE|{ zWHr&fbZzbkJ!C$Aycu846_Pg^dSkQYn>$2^1wGy8uFXgs5B#Xev-%EKTXrQ9ZBe)U zm<}yFFpdUFPsiE+b2w-M{~tw2XDJp%@ZdVZMMzf%8mb*xjZm$tstH-dh@w{4g#v0r zb#+i}sIRZpC1o_! zb%z!DyN+euJ!|Q)9V*=wT}?=BXu!9?!Mae+uzbiFR?QF6A6i}CFq#X)wiRdv zt^!{{d4a#6pI#gav z)g{z=B6Xfj)l;Z?Ds`Pk)i&xrgIe0Tkn9fIsf2otq@FJ72~zu+)Kf_vE2z4X7If25 zXH(KgEvr#QsG1^Fy#Rg}5vp7a=H-NHR}m^Np_c8C=p9@Ws8^C;(T*A-9k85qjh2Yp zH6~R=yuK2Ah&v9flkhQUDRGaQmYPi5CH457Iwv(*@*OA1-mv#9ROlJ3B;JzcsmZb{ z?CnhjE2Wk-K&s{3)HxVI(OUT@|M%0M@$WDA_dLRlb;3Ab80&>`p)fWG;}T(9DvZm> z6@*AChp!Y)8-;PTFs>2CwZhmWjLpKhj$BXVE#yXW1KBEEwh7}VVcbk^0pd{(-%7{{ z3vE7$O+CtHRZC(&~%c>WAM$4Nh9zetOhBPoJU zoYIjT(!$npIO37GB1i~P4I!>1;@QlVgl!}-dr7AqrDywaL;V^O&5h>ayQ|hb63K<- z;I)`!ijh@9&|8UkICCpuw{tnxQ`j9~7D$`1bg(0&7(7KK2OdFTtH%_G@x1K1V4^C&%y!lWWH+<%HD!4d39r$0bNRAO~DK6ma~Q z7`pc6${(X-=+s10cC@KLFDQM?OY398KH)NXOY#c%8<`Fg^`ZpcRxf163YjZrV;qCa z<(-C`Exhh=vA}+=rf0f5h5d)WzTv`?EAhS&-XdzPlp{g#`!A#bulr=EjFowEz9F8! zqXggqloZ^q3K78Has8+rGN9E;kvhDNgG|Xu*&p@CSV}x;sXviK8Wa@3j1sP+6a5K2 z1d3ngS-e8Q=QcA?^fhL$E=yUDUpbMK*;{8QQ^r|Uc7concR3p*!^VYjhK-{H8y96o zlpNDKQRZ=M_;GPus*5rH$^GP4Bvb>&qw>rn)uSb4qI8U;`lMMB2}{uBd7Vxtw&w{@ zme>=3fPqJWcGv}&H_Ad`)r~S1Dt=eU+hn#)PA3~vj{W$SrzzQ# zk-e^0Wd3BQc_7kE`~|u|>>YB<9*qpNMo6cfKSR1590s5xxr@Kmam!HmCP9Sv<5Qzu zGTy){;a5?9DaVfGmoqz$We;(8{xk_vQV8h3<@}u^{Z?j=0%97F9>aG{9_TdH@p}S* z;*TyuMP7mE!sJ5!IawMvuJZ)&5psloH+jhJ6VClBTNW=~fV$GV+B=Nxr$^*b`f{7E z4ze)3V&ADPGJoOm;l*vup_3)0BXsVlq0W)H;YBSch8Hff@mctqcu#NMP>lJrTbmmf zTe|tgJa?#Hc;UkEDOwz-mA;`qiuG=PKu}Sng?@KW}mKJit3;K{Gn$ zpmHC5ty>8Q-XRDWc>EBI>F1nt&h%t=&x+}*dzN>gG~$k>qnnx|VT`M(dC}rI^TLbg z%%9hWIpWZ_H4rX56w)GR7S+0I))!xGw|MPrz)CL!Mk#oFB{|X-W_Giw$jUWy53}?T4J*4D>Kk>a zxk@j#@V9}+sOKM>(!m3dt+J0zx#kiEaHEN$=2 z<*KlT_B}sL1VxELOM;?2;!wE4Ti=z>+T0dfnL~Gpv$iemx(ALDi@H{|NZwsAJ_)vCVwYPOY+{cbNkvDFciW$tc%p zwzLCPuGt_05u+oydS$x+m*!?%7k2cm?pZl+_44J}JJQ3q^A6gG9zC2uw;pF^Cz6Vh ztj7YFkUHpAx^Rqu7D~Fb6L7Ok$5^WLb+2*=nD3qFG7*1xkI<1-T!%QhI_x&$xFMc% zhWR>RkcK>OM80(y@QyxArbwT6=?4%zKyP!5*XO1Z*9=!@ak z2=fd)2Z%54EkAUe*=TM&eCq31qEpqa3v}9fy(sz^}|sOk3KKSiQ_HY8_XK2ha-R zJkgomsXMxst?cgUIH|J>)iYwYLqfz>yq#M)h+Tq6U2X<4y8)Zfwg3V1^bJitC&Who z|F-Y#5X3~Mmh9^3?c>c!SxwqEEhhbH!A> z4XL;3j&?l05@7WYMLxoSd)T9b#{c!G0AoIVXjjY63PLrZpjulW44}Nv8nvdr2CP9Y zTeZGH4b=x4)Y?$6TCEKPYt_17RYuXhknoyOBy`>fm)>YMN)uFoTIy^O~RT~-tby`(bZB-Dy4P5JGsJ0=a z2~`VL)zmd;Rds=20|X8R>R~8^seq6pT=jzsMgOqHrrJ;)ssVC!C&Jzj$G|vDuGfX@|e5d2aLK zX8+QTAqzSZ@?Qn48K^M$t`65!7)-u<}d_QN_Ks0Hh)QL=4)jaFR~451*`P<_?V zQ+5lAFtuQML1jTr!I9SE3*rUs1s&FPWYqbDpYmKliq?~& znDs)UT|x@ZCk0m%>pjGJA1Qc@6#R)4yh{r1msJ~)^%Ec`kyW>V3r3MqmywZW$;w_T z=TbQz4};`FDvzOLJXI#3%vgCMmCLC*iE2}*JdIlXlp2RYatR7oCDqg#!owiBfyy(e z?I>N4tlUh=vD7}7%KQL`ETZH@DxXZrsZ>6l$}y_7QSA)sNKofe>Pk|18I@O3S2vYc zQTc2t_fc&%Ro77YTq^&J$|-`9WZma+NwF8fZv(MiOk`@g0^lo&?J6SM&Xwutjf9K5 zMQO8}2z74;^E&ul55Fz&yMa*kMliR*?-n72)_FIfh2U3oFZ>=L)Ur#+qE&w>AgSG@&^wXbuq0nL|fE z1IAf2=UFhGgWvDr_dNVwfZreBcP1VCN8t9)@Y@T&SAqQNV7>vrw}I9;I_@2C`a7Z4 z|AKiQ%A=L3dWTGvyJb3Rr%bhbW!p|!p-0>&7oiYSSt>5B-yl2TUvY^vex^hwj6WuI zv{W1hsCYI&WlaE;MbNDU-R2{70zwNBT8z*VfTo=U(6rM4nh=#pWyMy4$7Y?f{!!1HZ zI_e)pexH0uJ|G{F4EV7L{?i0MF~LtwaL@#q34UgRpPS$pCipKC{L%!!GQoeF;D1c; zYw`_|za`(3@5lkuH6>@jbtZVe30@%U!Sb>~tvCHI1b^_&^1R6O++c#2nBb)*co~FN zF6Z>GkbPN1t~7D3GQo`|`Ze;^au)uzCekJo+-!o^8R@t_JJ=Qz;RX}D(FC`e;5HMy z$pmjU!R;n@J7jBCEVr0Ax0>K>CV0CE-f4n&nczM012U0XcggZ=pNWRLd(f|4?Q%TQ`%Zb_r0ki4SV zk}BsH_yoqN(%F(l9$h$bmQ-vdq^N$Dw4Q+bn5na*X?8mqI~~Ptj;jH0ACZqJ9)qW+ zB_*>ZnT($cj#tY>o={rUC~2guv{9mD;%Jm2T0UmB7!>$PT5m2h1)8lvn8t>s9J)OJ%h_p7H9Qhl&KlIki?~YQqwwHvXff( zEa@UhWu4?E5mJmNvW|$Ocr+m-MP|9jOGLIrEX8g@6l=r^d=piRXvI!KG&v#{TL`h( zBDUf@LMV;UVh4d-EiWN4#cve?EjN;w>bDDFmYYdT^E-tg%dI44 z@w}9$ZW6fo#qd1 z_v@5O*{ev&ij;C7zJX*R~@tlCq3$9f>f8#2K z=a4N5+oD9>Nw>e%e;m6}N#msg6hz9lDqL|kNfNeA!P7=O$J6T?;8H*}am}9MJWUHlmC$E}eBi*F=hv3^ww} z26SDdC>`x;1*0C&wUK7Dg<80_P>WR=Q+MEirSiamVSnJtb||rl>CTDl7F4@#mm#Yr zLzessv+5BgIypI62%`Lr5}PdQTIXc;JMPiKMNnF3A>coyh_ZM}K_POJ(}46W5_B4Q z{}&{a{m1Lv##qGIz3bAc+_ zMG1e8wm}tM{rnN|#oSf`Rr@j&W9C7|3V?%8QB)Y?o{{O&6!sbVdM&vY`o0ysQIc3m zs$ySBs&aoxDu8dMs*K00746oNR1lx^SGU_sQlWN7nbht?cNc!# z5s6)>rBSxY?#;&YvvjmBS%=D}oAKBRVrVGocwL?CctCpoMMH5>~;Y4`aG6E2is>n9gBajF@gXD5e{S$F%j}n6_a| zJG5wR!WyY1ks~E2B+nI?>b2H8AUA(vyA!@YweN)Q|2gi}*d1ClSkf9KSYqr>En3}L zEn&g2om#?{jviIw|9R_Caz$q3SPIt3oLuJ z1m)veYqAx6BFD+`(Vm?sP=<%v>^mK0jAT`fw~VTBEn#mPb>pvCHylZaSvTGpUN_!7 zxNiIn>&8Dc(M|YyUy}2I#y-&WKBV2lKGYH(z30GZSs!U=NqC@p_yjoz4&$R4L$HR6 zMf?oGxyiYak<$IO+cKe+K&aa>RKBKB=R4T* z?XnmbnC>F-E(_jZst|hb1E}{NZ5Do?i3&F>8Yix>37cIQj_kWmbEI7m^_gUsh5gbZ z^ou7?0x}AF$Pyi!9P8gnA}2$O`jxQVFEo&!B2QtDSnx`Z&`)0@bh|5AcW2OwcYnBc z`FyO4rzTI07IQ7{#UyeX$-JxljU{$EI(MGVerqXjVUJoeVSNpX#2&Xqqsb@^-KJ<@ zbb#@mJMc$xPY5I!@qy|hSz=EE715tS4zXt}QM_TLMyg49JjQ-+T1}SPAek>%P@LJY zTURe4sQ}(jX%1VS%cCbi(*raxPT@S0&>F#1y% z9R@7X_GEiW?pfGEF{XCTSv$ePWcx5PEG2n!!1opO747jiguQCP_PBzw*G%@vaw?d! zve!-Ktizb|r0``rhB`5tpUiJPkzgHR?~3xbMQb?&(19-%Jp4V2hkuwn{Eo2q4IVxi zfd@PL(B#2BJcB;biQ@a-LC7rjxdoXqUOh%T&^yvW{IQ*)_xcw`kwn+lBIHxs-D9Fk{R+6Q`5l8?DRKpVm48HFzVF$}5lu zS0mSph+!I>1jhj{F4j=Jyn<3cq~&0*$WiZ(U1T*vnk* z|0vaNp<8j~u}8@L=Q0(IxAcP~O{6`*M?WF`6a{?A17JK)l)r%Sf9hV!`YCo)C=CV{ z8UwW7{}&SZDM^L)v%gRr`(e1-ONFe0+xaSHAJO(x6uD)2g|hv0AfXBI9p%FAe%MRpr;lTGAp|3-TqpfdJ_BxIJECD>isPl6<@-u=Dy5FD)D+;^%De=EW zBER5nZ*n}KLAFPJPB@~Cy+sqYp@=s2HchArYr+O|hrQGgkT3v~poJ(CnsQMGqZL>p zoB(GWeLr zQY0Nu5%!557NzgvJ@3jr0U*5~dI`Vv8i-y>l9!S|^kR~{*f8+=;<(NYxN;X47_ZU9 z1x8bgAV2A>`lg=_)HL4jqelH_FLJdb(GL7dv>( zi^Q!fJI)byRIKYem>+)pI`z=B#a)#pE4$8K-O<>+YOU6b%#}n?th7KLmBY`L90fVDh2S-1>ZQ;k6&qFTRB=$njb|<%s`yaR zpg1B@im6ggmC00@O09mYB*~}|MYX0>O|~kk7fhlkqf@!?ElR1VEoEG446MhGkPz2W zB9AYfP{zL#`F9fkPT}8a{5zd^RGTJQBuR6kh8)R;3U!DJHSfr7)X}5lpf(+qP~vGK z649&@YTr=y1aLDBb$*QfOkv01)K-;_!EM81SUBAuAq2(vqYf8EQ`8dyXTHFhk2vsg z$|npGm$HbRkWOlS``My_)$OXM1Xp%T(g`(b=`X_Z?W8nHA&gL%eJ)C<*8mPm8XWZs z^lYaB2Z~}*)Sm;3*l}X)96oS-B+g;ya*o}^xr{_?vRUWa-E8hvJK226ZsO?w zURBSD5W@KT|33KXO?B0)s#n!j)vsQ?dJk>PXjp)8&A>20!;BUgg+9hxx$(+(V2l;k zz=@=K`vhNKx%rt%f?pu$D}|N=6(1y`ksl<+on$Iz!|Nz2cEFn<@gbhLNP39Oki`U{ zU4EQkCp<}vM+gu#omROwh!X^uqsNIL^GQ-KWxM9nMDz`UDnxx6QJ*A9dOPo$Q|12x zRDFSZoM!BnR0kXU&( z8Z7OtyIb2@dpmkJo)?*gZM6)TPvh48+2DB=n9Y~f(-mKd*Idkjb0~@QEO>ofz}q(0 zOeN^^EB>fY3HgFc&Ox}Npnw8R0CDu6`9AuCK3Isns#o@wdn+o5OsI{?lmUN9EPSc7 z^Q)F#rdC?Kgef==WEgr(g7I#h)Fsuy*FWl%T^@G{hou~raac{5ZqX#7XqzRONXjNj zg*8n>2VYPOE_LYeOTkF0W)?c4YGp7(Y$tt&<0S3}(sCy;oG9VPOC6ZTZAj^o+bB6X zl~9b*E#`GMJEWCEzKWA+h2M6Aa+mWtsKqUKy5K_r6h1Qy@OvK2Abc*CDcM^drn*~` zxUJsQDKwimn`$#$2`w`TD^}*zP~gZG`K!F(o#!@-=r z0e?6c@|;0?*DlkHB2i$f2GUKqU=J`Y;)AdBA}mHFLKg{U}5WSW0<)RVh9igUvIie{|B z6ei&nsWm63V8*QFGX}~nfv70ViVbm@Un`XfKNQQ}f2xf0+2BJV5C?o-sM-5ZOK5gx z_CXGal5c{8JVVQo006UX!39&8qF;7h%wgT-E%DakJl34%JSJBB{81-* zCRaCJ04m2#7#*6e37tb7l~h! zVpet}HPO_$XBSsx96pjW)8&yaS}-RHWo*nZ14qW;v7w7|91vh^$j4|pdlH%!!hoXy zMFEUe^OTqWP$12A zU$tR}NhcNL*zifV$~K4H$)Ov@8;&ly6_6xugFwL{$2l`a!BK|a2pM>-S7f6#PV26~ z5h6A&S1WT%lyFM`El!LTh?N%C7E2(C@HU;NY^g9i^o=>C$pA?xSEsHu&8sYItz0=j zakvU!mb!L4|Biq)ha$vUtIu5qmuieRo&&M)(UQ$K@37i*o&uROx=#$PP;-!(jivsU zmT=)ob@wRT4?Z-Gi*-@<|zZv+1?ZZDXE)zA zC?#@fd6}2PN)8th*m-CYj4oM4k%**mAqn3pz+jfu0+EQO&|cu>gD8+7r)P*N1!ssx z!l*{oY=q;Kj|Uq|HFfffC|yJ2S#iKdsr|KZLu09pxw2p=2sULbwILVVbY|3s zk;4c1!&qu0bKg|uSLD_&EI+@a0S^u_tMGo_aN=4=yZ9BeS>>`~-}x2TI^kbf2GcAc zJ_pY`N9)7_$-;|sA_KoB6FR?KZP()MB$Js8o?l*mO9utjJg~sb6 zuG_phz6V*e9hlX;5-Q&Ffz;?hl}9gdob;Pg^^AbOW{zyRV9A-Ow!D!#?;_g%T3Fe! z)V_k*BNo!;=8!FKu+UI69CjAIQyTF_eU5?=MZ=*;*irEMXmfK*(3%_CG!zI1%I4~2 z8jbjZj>6X$4FrPLya5=F`T}~UFd7W|!+NHBX^YR-!pz>Y=9+};c8lgEUgoXTYrIj| zPL?ym*LdP)q>PaYrc^Pqh@0E0XLKc_tI^69ZD4dgqdwEb7L72q#nM8Yd=*1Z7nayb zRfhekbyBs!6aP36`y_;k1EJ!YbOQU~0W4S{ODEM5U~0XS<*>F_<0oV>=V5O0lEO zC+a{pU3H>;Db0meq?jA6Na-Hjv|CEh>=SJ8iG!3PCuPfVQjQ!a6^WN2Csk_l&3{;^ z2sk@r#pTyRQE>R2vdlTNUw)w?;kimZr)b#I-Vy8U?iA)eI$GO1c3t+G$e+7UT)D}; zdGs(^CoPKTd~KB#m68=E)5AlrTbbvQEMI=1lI63!FCk$L`jk*OtoWnRb4i%X=Pc;| zAxSeAF%uzg{(nx=d>=hS(%dzAAUC10-3_IA*RC_E7a%HAx_Y)q3KZD!nuW<5Gi1Pk z5xXAR*&XXq+dJC!Y*D#o9eR1|u5LBfy1TVYY3=HAWO8)Dm>ABp_`>#dU)J4odH1q8 z8i|vD;|s3GWPbQ8%Sh$aVNBOEITp`VN+y7uY1Lc^{llXpsX2!1yc4kFwM(Y+dM_*7 z^20x8VSA}R917F0FA`Kag)|%vg=jbs@n7+%Ltgfn?WDTZ{w}QJw zfh1NdFIif*jKk#|uHbMbhpRbU!{It&cf%x<73U_&1+%Rr0h5I~Hc3_qHc$$Q5i1I} zk&CXsiJKHxq zJ1{$Y)$Ht{*;$BfC^7cp-jgb-=7%=E9oy)Y-abPr$lKxhT_;h;EiJEF)u|ZQk&{z{ z4&x{}IX&n!uIJJkG$L6Eh|l2tmoE|_utRmiZFYHUo-j{0D$wjaSA4OTSGpS%H0gydPE z7wgpPQD)|IzwN@x>gN{6ItMt7V#dE-C8DM83oEL~Ox5dH8qn5xVWpWC&ycRysU)E3 zvI{FIYfzob2w$(VE}X83A&8qu96ZEFS@+?C$<)~ERwR(ub>U_09_<=B!W}%keuV*L z7dX>1$HJ@5QA{Rq4(mGHV9~t%#J2OXCvxV(xi4?wCFvwv9Xi_D& zOXWfa*r`|vVO$wT-;8FeVb@{-76^ARs%5ieCz`cQf-bSONvPV0mZmLwo8%x?OPgdP zHhZh&B6jO$Nhc25W=Z4X6%TPBJLSp=A3QnXLrL6;!Uu=>oxfb3_dDNvFflw_^s#qK zJs0}1&o34R?&W8hMEPh<3&26?WB&6w2A_W+)fPN0UqB955fSq%ie2dJFX~CL1Ox+N zM?s1b3A89)sxy8=8itlixB$;-af(AioJq*(^CLowY_;1Q9O4<-MPJ^ zXHO=F8*}6v?R0Ey?cLwqaRs*;yv5Si)BXk?a^@OjT|~WfoFXO#`&=y8M44D7>HqnI0#gEBKp-! zjU7o1>=+&AAH}&p*5~4{Q7FinY%A6xX010*Ph&$TszP@nQCT)PpO?)rxjB|O#|7tc z$`%{|oceqv5J!4!^k6oHTxDJ~THs7Yf;+AeLRxE%%siv3S*Ch{D^LbqgYN^BbdQFk~Jk~7Pmk(Av!)fCJyoQ zY?)fEb#-s^z2oAy`QKsXhA)REpvX(kw~c6q5{WXkMh6q)-KlFPaMrkSoa`AHA389S z;_HwziHlL|k;Kq2+IVa^->S0HabC`J=LK@6XMVnghpgsc7>|@guyqW!0Dw@iCE84b z!AOJ#qrm{6MEwwo0$#)i+tU^w;Q7O_<7^24awHmr9ck1D*@B@gFHb{QNOK5EZ;l24 z_yT@={tQ$7zEChoo5Q{+ZI1X`XgKPR(uhCWLZhJ;0KRAtO+UhZv^fCPhW*V!8Uaq4 zhC?lA2{X{F`XfHSpSFaXn`t=E;-}$o#7Dys$Q^-@qhRo>{$L2oj`*6P>}VwDEPTUI zRwxV=23o>V+S2Tcx{5jsxcG3;$!#dEuOt<%)ug&cZ_{JmZv9Gq$lIzg*uAP6gNa3f7h`8j<#BVIhMCzXs;Gr0!M9TL8~CiRT0WMmB^4NPfdauXwdG=nII z8EIzpVkTdL7v?rIxt&=$n7oC_Te;Q1ZA`w5$z9C4oyk4u63g1ll-=mBN`3>gy^-1W zF>4>QrWifI?1RjH6;p=MD5B-f%rb`71)2OlDEI-w=qCtsJVGpw5V-=4=tpO6o~<;XQ0Ud!QIIeZ(3Z|CqG9KMsocX2pL_|J9X z=cxF(Ui`dU{M;aZZWKSq#Lvy*=N9qv9`W;D@$-K1bF28dP5j(0em)?6J}7?f5I=W{ zpS#4*-Qwp%;^!XmbFcXMu=u%8{Cq_Gd{q40FMf`Tp9jUy$HdRa#m^_j&qLzpVe#`Q zA#EiVN-iNao=sATMBG)Iq;iRP)}R5mlGSaJPD(FDgK%YwH%Sc=DPM#3*t{#z{9DDU zHc2CuYuh9{sjAr|)mju%UDqm=lSQl13f$s))QqlKg+}6P%Xqm<)}pPrx@NTSwsakO z_F7htHtLppdFk~l+ayX>RB}>QZbI{Mt12L)LdfbRqJlN8JEbzR){j>1)~!R^bPbYQ zkLk-{XDcZ&rCcY3IAhM`vO;86%!ToaBj#AHz|L2TY2{8rRBOz-oGRQX+;UYR%oejP z*A$}D7%jIFVo_sixt$QJJLbl88;Ox}N{F4s*m9;2ha8j3HK@iOvoF^b;v!zshP&#< z3TUuGpEm8oMRG@A7v;>uwdJhCZOs{n>&e-MyCP>AF44zUOcFE==Vr-1y`G?DIFH`n zXQ`LbFkFdcpwC)Q(Jox6HPvUU*U>ConJwLCuXm$WxN`e}K1Y2W8in&Z2K$`#n+BaT zq{2DW=YqmqGo;dWRi7IQbBptIs#d&GWxVC2&$yYGHsP*CQ*dt;O6gQ}K{EOZGj1nn z6h^3}Q?&}B@8->}mF_0SJ&<_{^4@EjWE1&5h54Q!cyJ{QvQc#@M1R)I_gP|mp7fPX z4VD>SAbsAtL9g))*<#+!#QfjF{Ld4#1tyHKiF#i!^S?lhDbiOlHCSOxb5CQ~oO(d` zCFc7T_X}2sj@OM}lfFu5Tcz<^9*G8tGKCptVFoe&2v}2q^d}Qzj^S%FO?iY@8#)J>1FZd>E*|uIO7j8FVUEhPt{9hzd?WN za+0DN#l!VdDOwWwquf_N6GxtT zSK5WSmT`l7eO{icA>D8c#`djB-%1=eXmTpnNT7)yz#Q(hJCoxMrEhUA2MiaWo99@Z zUW_@`7#~vVW$fsWK+dH4Nyv9G+Nao|-me(jm17!M$V_Q`sJWn+(jOu>@Z zAeMGJpe40>t^CE=S$M^#Zl5@PYC65Xyy_pb#>0w`KU1|7M$8jv67MMmowS{d`MDV= zg;Mq7Dx`gx+ta&T`Z6qSmy)jnyh8qlVtiGBvG9`d4Q_w$hSSDBDcImTZgSOYHeIA<6Q(;13>SE)&O1wT@FU((kPnpI6^$3*x10}vPz0x$Uq@#5l ztlxry&|f6Gs0~*c#-~FG4g7B8)!GDb6nyDKks`5#Ygy zLcAYy3xVdS`&WpEk%aL-QR3^;>&*C{LOhHhjQ_dl0A8-gk}dZxQSdJSk);_T{<|_Y z9Sf2*#xF$|{z_!z<^3AaU~D1UZ$+2!=-)v!3?PjDFJ&6)#?@{nQ_d@9_n~>tKPprB z5DP*4f1j=Y5b@7|2&o+LFJ=c~{9hp+9(er!nmvf|e}i~<;PJ1XtqT$HAAks{9C4DG zeTWIyQEpL@CtOd>PPB7diBtH*6KduT9dfIpl3hvjZ zkM>*KrFezGlGJOVHsf)6DoJBewD(5?7Txpjv$MKI*NrF95FJeYPYZ(FUEEI3)#}qw zcdhnWYCKKjXgG*AcVZhAB=FNTYwiKo zjuWtyJVU2og(#O*svg6B_!c$4H~5wL7QjQ~d4L<`?@;4;y7I_N#&<-M+#4nFf%yS7 zen6*U7hxvjg=~AKC@hpPOK>qmD@W6q*^L$`en?kAG2f%pnGrXYzPMg`;s}}uG)~h~ zK#wo+C(RYh?*`F!_<%IEW_LWN%x!eyjsj{ecH zvD7e^uyqbJox52DJz@&qo%;()2`!+M!fJDpbRowtDM;ob-SaOrBj6{a=&%a5?1%d& zM#oBvdZXU&Z<$-5d2TV&!VbOc1*0PWq2ro~zyg|8bWE9*q|70~EfAzEP@KDvqtb;4 zch4=?om)10#!P&gPx&67~^c{>gHn|(AK1rThGM$k-DnCr6? zOW17Y5iE*^)x_`+%v#i)o};7I=aZ;3hXW-jms7poii!%olG~c9s-gn62or-ivTGTX(Ln8Mh_D4L@?EY*rd_|9O= zCVXe;7Rln2h|N+m>6ToJAygfhtR=Q38zw`<#x9w>2s1b?l{dAuZsxF^!wwF&aJZGj zP7W{Qu#3a(9CmZqvy<%V<)PigQEy>nDbbfDBt{f>LQ)A8zSGs^c+Eyzlt4%96a_gt zMVXJqx=Hd%#40IrOfEAeGi5Sf1dS03MV(=tE4j!vyM-$a*9(cs%ACYxeV<%UP-3FV zO?|M<8B~P+u&Q133NzY;R)6~pv5-Q}y=dG-rqWzlSJ>?)ap%cxPO{awg?rdm6{c#B%aHRnGRKa)R=N#ZyoB5Vuui^{ z7#|=fr#jr+&wAW574s0}`|c!s>-}TS8PzLy1M&*`A!6K3VC&75f%(?^Lqu%7?qkf*MKA5RD>?@Kbw8#nX(hAke1P;>c{;Gv$DrvC0zQgdaJv+% zB#`41MC>{rB?Y@qpZXXv9wT|X&c{j7uJcLLKRjR+?mF)z=B~4$n^Sfv%&$_ z`Nokfc-EWU^YN^kM-LuMj11&+tqzG$t18=cX1T2!XuXZp&;6k(%v%aPZ13h>ooyZa zdvnrw=z zt7l7RckbB@&!}mWjqnJC7A(%ZZ&T9VyFJsay};nY2XLuL?he6PckgZO>TGY_okx7t z_B~y@JNM7gtg`mb-pxJT-5s0rYc;RLH?d{m#zGqi!TUUpP;%V>QVKR2@ zhsW@=v9!CRqrG=O5FhK@Vq!Vkd%IJqfpOsr+SA(JzCXWjdiD0+)`0=orIev!6jV~2 z3Lj!fEy-?edOLQsLJ#!pQuc4$@8(0`^488gm8~74!^4*+h9*4SJce0Ut#)jHGVv^qQrC7Rxf zE6g&uwjAvod#sEelzsaDUX3 z83C>1d3Vq(*?|#UP(g){p2A1q4HE)UD4;nKL_@(L8VrXcs^1qur>9}Sjt03e z(q$Es?P-E%mxM5T?)l?bwek(H>H zaS`nLn0zUdTbbO(?Cs1RV-BI8aT$}>GiMiSW;k~-xtF>2qGpDhyQ}or@@pLO8p|FKYvbGBM zsMV-MAdyA>1Z-OuH{yP_CV>0d+8|zZT_RP({~>NL z5W6jAt3^Em7Gt%#LY!JmL)`|K9@A^B3UQalN^2Gq;<3amHFiQuJTXsAB_XA*n5(9Y zkTOTiQEO93xjW{r@e<Ls{r2m0*wcGOF7+lTucD{kvX z#RQMz&3(>>5>!kmb-ty~)li0t3FWSL^tl_ngYFqp;l7^qc^WDQJu{@rb2I5HX{a77 znIVfx-cR~U8x{|i&XAhYJ4jzyL+xN0Y^BTYA${cyb%W(IWNA62E8+6x%Xkx zSJ6;ESOI(IiYG~5B{aQqhODgo66vd|OH>J;d8&4!{K_ih!@RRrOCN^LSwlW08y_(b z{l5&my8Gq6sy$Mo$~ev=(eyyW+C;VSfOv!rWrH6c9~6(Uk!%RSB@{)f7A=Lt!^Cl?7xejsBxYY?kYNb*ePXntM!4tP8zb1UVF z#uCs6KjOnRF8v5vu$#Or8$ZV8HbQe>mbnz0};0q@^4 z2q?Dr4|$5eh9*3JmQ6u~y6U74s;Y`d(2=1Jow)hXs}u*qX+;Rqg*c)_p39zO`?Vv9 zgG2p$c6D`);#pJHretlQWyUk`Hl3Hr$>Qw52Q|%K!5Nel8kuw#CtC!c2uYS~oVh`p z*Om9{WCw7rzRa4h^0fqou@+WIyt3CO6XaAhrsx)pFxA2|t0JtkP;Qfj*ky;y=_W+h zDSu}KUN$PUA^!m14b$8T&O_%biV=Wm7{ZkxEDRKjaiJK#xFXEt!;0p^HIM@_E=bl8 zUS-Xk#)x}I$FkOto+PD(=3qBq>IE22akh59VSi_Ld&d>~xA(MnNJ?VlT6e5-SMTn; zST#K~Ha_9%YAuMR@a`r$F33#rMx-8Ij%%#YC%mi3N4yJ zH0I~A3&PHvx3c}b4g5mL8JR><&RVjw5Xpi_F~m_hCK+0sKchAjO*eBE))e4$79sI_ z01Lc0VD3O217>bslzOJcB!_6n=E20sfz-f!ErniT`ww$pD08BTBLjlUK!f_L0;z6Xwtt zrYbRs_l}rxc;m!Am>7>`9?Aw213Si2M}|fZ=OW$WrN&0b%(4_H#dZkL%xCN2Lx)Uq zoS9x99g9JYmVu!$(N&A*9xdXf>Y1xCny6~dnU}$7O{Z~1;wvW50H2do$;hba$@bKE zzp$pgXs#kmbdn%R4KK^o2Q)Fntb4jUQ3~I)Yd60|V;LD85w3i!=Gs;tZegQb5ID}W z_Ka9X)?KLye_49yn$$qivXn~?=$NB*?7;Y(%Nr)<->S-J1Y{+LbM{@T9e)9dCh zs9-_%6cthL^T0$(K;az+4^3Rl)9fRoA~i8FIyP_NMTNcIcCzyA!keQ)+!<;Kg}AY- zPym6irCAO7!qF%VheBZth5|NNn+`!HOKK!F#;^Xg0CtN%9Kw4%J{k^& zTU5W_?`u{Ap{PGvI>*pg1HquruLfFLA_2hiH3y)kXdt3z=9KCWwFChn+8k_#8qn%R zOG_w1TLOWo-UdiWi-ix8-PayU6^+dG*|$wwq5-@j`$}pUAwToA~!)y)8&7viyp)i-XwxX5`sg_kQ*X#9F-gWv$@5SnncZ}*p;j$^4 zjh~NmRRuRu`%If+ijFqLh=ZHL7nh3ojUt8LC{n7?_@`3C)Fq1uQ&up$aHF+`Io2|= zo+&=&+`wEHF{PO)moVj0rfgzlGgI1`vYaU$Oo=fq$h56Y>txzCrd-CfE~ac}S~t^r zn6`syJDJwZv=Gz6Oxwk@rA+H(+HR&rn6`&$dzp4Q)2?9J8<_S+ro>TbrtD|rO-xBK zCC%&yEOFU#mCWo{Gi{h@ai$$)+6dD|ndi++8E5h}Oup8#QfB1sO!hKz9bsCMY5h!l z8&eK2ctozMtGm z$Zh2IT+9b@!4KwwcjSV1=7M+Sf_LYF_vC{2=7Jy21@FrRKbi~Pp9>z(1s})-A0!_m zL~6K|$hVP?1IeGrC4Dj%d?*)uI2U}Bd9P=8_;lU$&yydNlGht$z>Pg^`~;3m*~B?O`=LgWz{0of2rP{kQ`)@x=DJYL>5a_ zj>#~Kh(uy!EhSu@xYh>yEG4F_wGg5Z54jRHT1rjrk`k^6(^TLd1{GmOh4s7{qRSI~ zN`nO@bXMisKH6X#q!}xijjz~^8wu>f?8cp>Pc`l$C`XDhX%ND4pT1Wb)Qy|C_~vGk zQG!_x*ndNr&8q~JLC|3+3X~>os7i~%qe&a8#-P5!DnPxSOBgDp>t*8xxz9Q^Xf z`z%5U;;uo9aZDDseN@c_=ntc`=202d-nkA8Rkd3Q#6KycNp|;3_0nl9?Md1AwA|;M z8g%0I7D4FKJlBzuZ74CRBcFrDFO@$p8=sf!rSa45)hIT3Mvl7?>r~nka}y}fcveQ~ z*mSxiR!Y_Y?y2X-PoF}RbXocLXJ?Hs%klEKx1nL1m&D3ZcSIJKiv+nZBDtsK+~p!w ztAgmCn2r94Z2U|Xmy3SR#UYxm*&cNQ#{CL9o$l8FEuh}7pc82ucQZZd;(n%YKsVF% z68e>fuscOo9rW;s5)78|U>OF>dC<#YMa~IzikvzKr6wtQvQDZ8)fp0$?uS7TA_&7W z!ia*fnclA$k0|IT_pTCj7JCB1T)r4>XfYmBVpTFwV|+@9SEJwKZPi3Ep5W-|vU;fu z-3UL0kF_F6(rZ_%=iJ8Qd$Bp(m07h&s`;J z_@$3*ceEO(cujjrtV+R7`C)#i{0P&~`>`9x68CEO6H&a!&81^Jy^aqwY|?PabHFyQ z!&f?7BD$e`2@JVkaXj9+_&R=*tG~_oZRU0SF2Cki6z;efItj-05-9#pin}D!SdwWh zw2`}a{=4WQmA{Nh$|&moc8d{?-x<*NXa5}{!G!2 z^nm&HoS4w6jN|-2R(Tw2T!A&-Dax>!l-)($S7G!$l#d>(`)x8jeMCH2jE_?H z_b}oCGZ)f%0uw%#Urd?tagm|i{dF9259LTNGf98Afb>VsPWq#BknS~3i0s~a32HAl z9z&#Ze!HhaIC?M7bNXH;s4PJd^5dD7JRwTJv~oW6q@#T5k)y}4x1Yii%f7}(Sefw& znkkZrA}x0nm;dAuPZ^B9&rtUX0!{vWu7e!BgPzHD&~fabXA3&$%V&1bR|-1lt7q?^ z=jQ033gc@cdxhCSUq5FDIm{0FW~PJw>8u^}0Cv!~cn3XacF-5k*+GuSMF%}k-M4TN zJk8F_Eynk$IWK=ebMw-jM91P-u+q zB&%>svcQ!uIyO72gkGKPcy%`Yk6Cyyrl|WGBsx9Kt5!K zay|r@kbTk&1rCG!ks7b?>!&z0v5E1E(-%V%p}$scHU0?QJN}Y8%1?^w-9N{k7|3Z1*>F35@nnrZ^GJF}j`hV#v_&QmUw~7NX zH>h}m^`dc1MVuog&B*yIm2Oszn^maxMf~7djQ6O(^FaC(=Xqk6N^2l_>bdb3r_7Rn z3?;u`?b{UJl-_jL;3nf%6<8G;RWz+;h9spEz&rGl6Dm~rDK)-mir-0$EkgU}c2&{z z$0(%Sry@V|60kD^;g11pQqoRp8CVq6zwjhIYpK5$m<%|gSh&h`0 zN9XY)B@`!&y2bdI%K6T>JAvg4C+O*1Ls+^Ui{POS42gz4 z5{qGxI$uBj)kKE?GULX}YJTf=Ae7t5QJ}$ z-w$x9a;s*%U#r7=kGE+sGy17}2~Ldk8oZbV~U8UZu8TV+Jf{`-gUM;D{dH_{3K8$Cx zvt>BVKcdxbH6GATrQ4G#>_B!v?GM6JM^fYAyNfBg7btm1!~2LXMOU>Ku?L zW<1L?sKytyQ(SfZRJv@OpY-$X(Ks~5?dR=&r}h=i_=+a>R?rl&xq{ElSG6RA;&);3 z#&ggI&tZ9Af_C9&-TWpb)ui^RBc9Jft4|KK8eD@GD(ydG`^&$ zMf)6V@e91gFYp$>pczwIyf@u@S4kg!(X_taxOZ}gb6t2W89n=vY(fZ3xteejKP_t-<;6h$Ypz{2Zv%2I=ErrWT)lLTJf3{5 z%^g^Bc>a<({(epa8t=-=T*pw!IdSOF@U^b|_SZ-K=RPM4oL4XKx+4pxvOh6AoFP*i z9Uj=57-j>h;nYM5E#l!XKe-}9=5eJqerR~8KNVeg4Wg7x9hsBI^XSOI#CRsRI8O^K zJTIQb<@rj(bGzpA&z*IZb{_e-e@4?E3LXfbM}x=nMh@4hF6_d2Pgpu%o1(9vXJ7u{ z6sIiFNI=hY0}Zu=e75{?9cT{vYnP|(8V-c~w)`eW{6U{R ze;m?aprzT8?L-=mL;{v9Y55A+DxZ{RYU(a2($p2rTc0gMX$eG~+(o5cVdv)`j%ro) zcYHE5NdMTZt|$nnYLw&|+OO zSxcj>AyD5jL(0j!W?(2x!VaTCISR0nUQdj7q= z<$A(-AMR|1ss?1y<%g1elyzC!)Vk zWQUD)jLE=Yl2gKxm8w+$rS}m*>V3rcD49Y^p5}Urkh}4~f}@M^76sl2g-Fy~sXRDnBO1k3`aRf*L<2f*o!l68G(0Liw^9&pEGjuLksql=7 zH|CWCYw)6Zs#H0uc@bvE;OIz7?Kqei8fL8n1Hf;L=WHCbCB{>cPbRadR^UUx$ z)OcWA9UdA#kLGSzQnQAq2WY-%7!g4X(tU<{%U#gmTXYz+c%&=7pGDa%D#Ogw0{WrtnrD& zM9K;rzyxZI45Tb(*{N|y-;S+4yL&dawf1&ILi*6b#DNraAGw-b>?s_)_5J{`l6=r< z;#W-%!@E~`p2h{vrlv#q6I>{EURdQh=jWCdtQkA+5|O32fFg(+?bcQz!-~p6%GsI0BW{5{^oFOIJ`WaHn ze8!rro9?w!{3b+s8;R*;Qa){Pg@4^$#o%KUIF;1X7Boy1OtOY5{$UTt$u=Tk1Koen zB%>J;s`&|LOOn=cyJ#DylQd=}Yuw+5^h=VASFpIDv`vPORsC$~1bzf-^-VKmiKTUh z)LGk%O-WWylPqnIIb`T6qcv%1Sk4LRw;FBmb*)QUkM=L+C)CNM$-3pxjYc~crPyLF zlC}%!xDkU7ryHW6cB3t@w9fOw?5w_2uXDEnDcej^R^>=pilnTzbs1eifR-h|ZfsA| zq&?wrTOnVMnQu)|zP0w9#!kqmWb-+UU69X_C~;4#lCj&&w=S3OQUduJ99PVcM&}!5 z$a)uWbxrOojlJ>GZKV#@`-p_8@4SRD^ZHOGl=8U7{iifVm*U=+hhjBz8KarJhxwxS| ztnr$pGpQ!L#mtcgI8Labn*f9b}AX~FncwcYi1gIwZ(HCuw5HUkbT`)dOg64 z%HEAkY^G;{h0S#BbtF!=Q3+=oa;DkNEi>Ltc<+{B?|wbkyXD4>Bw1eEy$=AnH$i-+ zfBk4151ygN%JVxI_}uag7W8nr*_)+q6ffRtX2^E&2S~P$?;zO8Co;z-@Nn@7-eJaF z1TVQ5A0lS2SGTDWu3yHZ+=5D_ z`(sbSHo@~Sq-Bbd-Y4iy_87q zkKqvq#&(F-!)nveVLV3w+kFhuzK&^Ia%o#&2Z3ok?^KA~D;mzYYD>z36#j zd|RaP{#s-_FNWVD9Dd7l!*8+iU6Nef5auRczYjsA@dw0>bM1NleovY2cN#h(Sq;5) z5RLX_n%e`bJ9b6R!b-9tU4s@@(0}Jkm`5P)H2Wn{W1PlVcsnp+)0RXnY*@@^8K0LJ z|B`uD@VO3+)>PgO?>AYQ^rr3Q)&H1&@a=P7i94rXkz~!OWNq4V98-To zc(~yWv1M3}56ii-_IJei9f@n(GzmYK#_vgTNwOxk9KIHRK$AL4V)asDh4EhmRYS0X zT4+&ivi1}-=swtU`I0(B=t&(Te)`v0<4*)P-`s$+6+Zo|Px@eUZ~A`Xwh$F#MM^>o zmp%k&3vm_1)$v_e7hRZxbFQ6V;MIKj+H-l;&dbwvfv(JRMV-@sx$t!yUN~`iZKIq$ z-j6VN9t9wNp~vyetpq*e|0Z%C#hF>KL~~1Y-ozY8O}v&G&*kB~>jFKT7raK(&vH}= z`Xh?JIjV%B5N-)80blrBF3zpFlIHbm?$7u&ukkM7zL=fGe$5Hjn?`rcI-|8rt+Uh; z_k99D8z#bGsvi#S}&;WA>iq4RT1M@NB@1sw=x zoS$3JCcdJhb}7|1VRb4xTP9ZSbD7QM58Zy!XE<~I&|Ufd&^^L(n#U;R{?N;|n8wdA z&5LOc$!k?f69MU|yS?oxS-{YX9KS@Id$L zQ(3W>7YdZr&~AQ)-!&RviajYKpr^%AesTcVf3qJoYsh{_#G zTG4=s;<9)MQ_DhL@`Y*m%Wu0RUB4xxR}FQ4(o^& zRt-(13|BUZq5D*#bH}L`G$EG$vwI6R5a~D*N=Om+`r_4#3bGdd7V`J;jS$u)lzLn?h zl;P2l)EwV*rx5$?HgEn}dD@P_#CU4WIm^sk7qsQ|`22j%YdgLbb?+-05qxTg{QhPd zM5DQZfImXR(NHAkmN^pfM^xT$8VLsR?p!38;bEHnKAn4-vU#0)xwjIz7^TegDh2!t z%xUW4CW}gOTBFdCTPM=0m@GU=LF7s%ueR6;I%(!MXBE!WSg1r9Q%i1AtX8}LrMo>4 z`f-!zqrb^tE3Fq$0Y!_~JkQc%WC)KYoW53{c_M@fP z{YK*C)T&j}ZFn*!Q&rU(0OJ~gam@^I6966=09CFr-ga_o`cx;LKPKs*X1r7Em+<(K z86U!HGxzdKHg#N-bRQ3=^{vK7g`E=>FzW#GF~oeF#1&L^#Je)c4I%C}1*uSB>E(uJ zKZkf8(60IiId#7onqKGehGfb&&K)&{7mopWJq?Z3KU zZ44}*XL4kaZLOQpxMf#IJ1mj5L_c1;9!?D$NcFrP3uC4hoC#32Eze}Ts|aPTRj_FR z4ai?f=UyR8T63)`w$dk#+s<4$gA1v-=-FJRGs|e^d$VC7MJ3K45m(Fwuf*X6byTqt z{xu8AwXik0(6d0^3f-`fN;0eA{|%qqg$r~3h~y?!A^~6ir-54}r=e)LrR2bo1KirvhJRBA4xW#MJE4!(LJ; zht;N1k{ng=yF{$+b@I~X%j!8?$>Ayv*KoL&!v+r5bLb~>8LsZCx=EtIF1q<5@4-zh zEy1N;Ek)H84OZ|N(O^}VT)5T~!idb*cAc9lbBeXSMXc?(plb>)sH$-prfAY-Gmzsl zWBW56?)^x~F3mKlo44)=(CoKQohMERvg9|M@qOikmyNm~p9rhI6&&oZNLjvbk*A^YNI8 zkX_3c$Xgc>k^dkM4Xi&m)#70uZn+SBVJovGTkN^`=7Q1}v?N~`uUs?+%=I`5%WpUk zE?AVqp=jPZ+Y<7HX>-IEFjwIgUrT^SBfcPQZVmy6Mx!(u@Hc0c-$;my0u|U8d-4}w zWTN>ZOU25Ywe@M|mOXXOK9}Qe8JFOddZa!i&eEX6KZim6zNZFx)aig}mf#=Hf&i9;WU0Ro$QSb7;>i514# zZCc8C?=oDdHR~ox!$p|?=obECfds*UXE|~YuGv|B+*-hox8(To%X9p=u2FS8@Tp^h z+a5!H9Dr2@U{e6t>6metv*)MKVqP2LJi4xGeUR%;BC_2H#g>sfx#Ai^i-OQf5!zIQ zcI{5|KWXyrA127WGt|t3WnMQv0>9dz1(@`cNj7LT?kD+N{daKz{yxFO9kI5*z{6?V zR%1$V^*RxIhMyrOsHU-SC^0_k-A2>4U`B&?iq1%Erb%<KX6RdLS1`EX`)z$c`hwQ2aXvf>HZKX&b*iP5I*?O{IiIuwrasKCrkKHQ2bnDCa*pGeqho5x);gMfIN^h9H^#$u+zx9=0x&GybFMUzF z<(@}=qksL6zn*nn_lIwNQGf93fBwDpUgM4#*EfIow@+9fx&LoJr9Z#x51(}zfBnaw zZU6l0AHFI7?+fpK(Rsr!zVwjehG&o0KXd%l4;;Vz%zu5(`Pcus`Bn1E$DaCx{hQzX z_yexHXHVQiANtnGm#xn{_k;g%ed9BKcvSnqJ)ilj{_3y4I_sMH;_Z*=FZ}(1SGAvi z|1+<+?zr)W4_P1h*l~j%ef9g#x<30Kzx$2ti=X(}OY-dxefVVH(?1I5*gXQRI)0n=ga4V74A&kqP~fX?CB%1M23wa#_VCjfv5%scV*;omk#laxHo5+zrYY z8cWZgd|>|M!TFPiX!`I-KbcS_4jxj*Mu%6qqxoGtOL^wy%{E#73jWl$YV6Ezq#xVziM-JRg>?(Xgm2`=~IuEE_2 z79`lk-3buj;_fc{yx(r^kKL-S?sKNAr_cPDs+pRqIikz}JTYi6+YO_rLTYAhvYTU) zhn1@Ir3k7ltr(~$vZy>$t?rdf`_r_Q5ZM7ka#_g;)ao+4>>9CAV`(NfYlCTk43Xws z!_kUG-l~CUaR1JUymr%{KJU~m9!LL5N@9n}sAWsJ_B8#WzHO`2h5ZLVZE`M4=BdP?VkMNT^;$C1~!ai`{Wv z#DuiEH^w04lnqc-5-=1?Olg?&R1vTgOH62(b5-$cNx}UG@U^--V~|7?BPG>1bfh8y zijfPY7TqyOju}Xq^21V?xNXe1F5<&GRE%f(jKX1Y)Y4k~&01+$THR$aNVXYq8mV!P zag}b?RrJ_e-7GFlKdEllm%uk!s8xP}8#>>l%llYBCQ@G*x1b1~wX6(IoNBiT7X57h zm$JD^=h2}8+e3_{wJP-)t6_0dOJh(RGk^}Mz*9L)(t2jncqPGv6eOF!Y_c>IX!C z3$QjxBvCt*0u&&-pw7++L|*~=8_z(guds}uAgZQ>IHl3NT)G!NoYu$;I8{=(pf4ZF zDJvCM^RVRrBrpR&VJW}k7?PXQYWWyCe`jF<6y;Op$D-pH=9<%L-_Xda4I-1j9l@%_S%B7|?u&~lLRCf~u`Zx?M`47G+B*4i0C#AlfR|W%y z-v5jGfx&_iXzD+W=+OVuc&)cZAf2`V9*JXUvSqNxObhD%U(+%8)D+eKdi|$%u5>ST zI4y}8fRCs^##k;jqv6r?b8p8&!AM_$m4m^*Gz*JGajc9Mkcg+bJF3wvujWylh4tT> zwAF6(H~?+T0B2f2A>;qFHLsQKU0WzH>np6o0aR0tOMOTfgW~cOnjsjs_KTb=iIxvD z+qkF`?zPNN*_#;6bm#Jh{+p(=s*Z)JEsls4*8*Xjv&UJ;AlI8K2C@%mbUKDmKN;c5 zw;lZtH8#KoI8$yT^+9Pw;pvj$NhASkG##;uVE1ug=M!oBrgvI;z~uN8_WhQ^h$%Fm z;2(wN0=nvE@X3yB#FF}tx9-?CVcC!ZYB5#dWm1(Ux@uupF0~^k1slv>D(#JYLQo2I zAq^NO?d_;a_L>I4@3- zqRf#FMgYA;L!8#ciXnj|u}ec!IxiuxjfS*E&Dr+_Rs!y z$I$0xAlF}-HT9jx_U?b(FFl<9Iox|~i*AK!@UJG;4=h7~pTF(4_w`B%Vc#}s#$pPy z4sC+vSNj~sxpTE$*I0j;7enTF3a?lMMVbhgIJFGSfb@S@5Z@tTZ?cvc4X89+KX&H{ zio8Y)6}Jd%k{wuC{(j8=2XdfD>1EgFh0PX-KXpZ3c_;k;tQ8v;p=MrN6GM;_;a?+0 zZ$IY$*TjK*n3OpZIl$Q}daQR!C}4ZcfeHlA?ik*K>5sxS?|0&|ztW3hZqardj0P!0 z4Fv76miFZ}iMuo`0n^xT-!Cwf?_o~Wo**iiCe|9u`*hnp2LcOi9B$Q#WzO<1G#w6N zFHf3?#CyZDTt<}re#4nFg?ysl5x_0aBV21DC04?zr(|5p6NJXESt{gwvS;owPd{TU zD5U+89NO1y#(&`0?tQClV(jJbrSBPy|FZuLPa?~I^tpE<@@Bhfx_o(hrvOs*Amw_g zc7U{|8)rk6;9WnJ_?JHy+03neVxpUtgQlc6nG$uUpuc``d$&q@PgnZvI3>EXv?H6< zvs;8qk$h=^LekmdrF8Aj>*C|o^$$7 zGM#F&{21lEX7m)1J(Py^!;6Q=Qt?QCV`La$9=gYi?%EnE8y(9Iz9;H8D8zBUp7|q? z7^?U@BzR>z*p{l%{M-?dEd$TwI8_hU$;VZRMpe4V&{KP$noqhktyHp3dk(Vs4>N-C z*mb5FzTZzeUnWEPdOG2qtJvOLqO!VKVVBmXXP&ZOn2%bbl5sIv-L7}BuT z8#kx@pHHKXcH9J_nfQ%{cTQ-3i1n0qBe1DxHA$=Oq_+MlW+j-X!a*gN^QhpTBc{n<)QpHtc&?wHuo zkU^tuE$eo|G{9;$;u`NA5}V%M)Z!Oh7WonU!jNG*qQO5c_OX@*=M@@bY}19hRg8qa z94=C54)Kp-;+4)>TwmHYIyYj<0j-DL#=+ z5N1>A7%iDd!QVVkfZLo}B*L>>~Y0WAR@`c5iBJ(xBXJ zIQ@Tr^|5Bbvz9rY2e)IrGLHTVEb#Du9^KO5RNd@39Iao5Iscnut2q*8)0=LTMJ;w6 z2^eG*guW=KNcvkUx%r4lh^<4tT{Bm{nIZ{g?Z9k-*qC+dF-jmuM?4vwG9p}_4*Ii-vFK7KP-oB#&zd} zCrG+Vo!Q%S$!jJf=B!7=*7QpPS>pj!&xNdEA5xa7hZwv`^X_UixY26L1 zk#N^&zo0B4+6ZKqKhT>z@cX)mxtSf})w}`c#cpp>i%6ZiuP2P&aRE(hbtBj!c}y&U z*m4|3!;7nI0!*uIwa6eJx-PT_^m~$X)oU$9)(wCBQzKaX_e!dkp1kIlc`F1*G}yWt zx=$)v^f4kUAWW@VDZ>Nu|qLS zSfUGJs)IVW1mjW$RvjA2gxTc5xN(MIn}=Fod;*^ew_UTenu0Z*E)m_JP8f!N`aWia z%*VMx%`ndvEqOE)nq;ZWvKCaI8)Ab>ghMJvMhcM@glZhl!RX8B4|@R$v*zR+^OIsn z&_OL4j-@l0f%r7_uGYUHC2a~hL)jhCN6br@mhxXXeSgNi&RAa8znc2c$Mw3$Vz}FvwNjaVPjFeI`p#=+ zma(1DBrc&5I8})K8Q0RjVoL)ja&{16*+f<8urcu3Jjaotg*9AHwV?w5gBR-cVlkK^ zX)eF`b}8YHhr+#W;c1j<-CQ%9M zBaByefQNP|Jzug@lw7NxWdE#2Z|WjqzBk(Mc@vGcYV#xjv`uO(YL_sOwry*8vZ|K* zpi+`c<8V10L$L%+LE4Dj9oX_bJzq55i8S(wRL9lA#(rAFU0hB(t=YL`H*x~9X!)SF zIg4l~GH<4L&ob(Kx9JbRYzeq6?!gJ6f0_|>;(=HUk{u~M$aHv*FGPN~Qz(Z0Ja_0h z8!cMS|Ju%&TG{PH5w?Y5f3)3<~i zN7^FZmK?-pnKR~Rbz58C>f34`CbjTA8_d+2=#Hu8sqzffIKHK3cS;Y%O;ZSNbOS$$ z*xSY6%TB`JeKa~BiHZADesqIK_sLcHpfd4RQ>%4$h5LEezV|5~8CjfRz*~m$0MhNj z!`9Z~oRn*zuLb+u*zrIqx@IDqeztmR=EBWk&!0z6af>GX22b1SzM$X7lU@j++5mxw zjLq4bW5$EVS+mikkRpXW-}d#D1=o0Hv{;X5&Bx6wJ_+(+>*%+5igrWD(j%d*OYm<^^A^YLf5FU2OqMDzn&-&H4)1xxS5 zFYH>^S_hBr{p~485XO7I4PB-O_nUElgGoO4NnIFa&yA75c<>}K_`@wmA3`wB2d8J# zjTG6Gk=$q+mZQXJF9-9H)Si{gZgpYd+i75`Kb>iYdcwGLxkX1_jFjv~3eUuu&2-5^ zbz`vCMQ1cpQ0hUZB}9!j5k$#i?LoNCn#P!|HLU*wkJFxmc`mCvjbS3mJe|3LQc1u6 zj469QMh1mclol=v$HF6vLEXmHX5K(%nWH&&j77;oQYh-7Zn8IZ&6k6&dUt_Hnzkog zUY^#w2v?#iSAJvtC-*=pwvs3uve{X;4<4%{=3>z>BxDe`q(O7EL{GnzLB}om2-=GP{8%Y-N+ic)$mhpAYLI>gV zwd+2~$79BT#AFA^%kASmiXRxk`jk#bO$eQ?ld1G)3Z0vcWI!D(WNNdEpv zySo51*G_8I)v?h)u{@$Z?apo1RZC~Ya4Ob#c7!Q7f^840ix!~8iFjQ+@#Mm4K2{n5 ztj2m5gJuYoQ-iWPX8KiPedwT?8$dxPmwzQ`(JcW^$P|sPuFOa#FRC`X9{D0NF9um! z*6SkiAp8U}{z>zb?%EB|Q*Qtd3T0^F!B9bLX)eIh&4$d<`Qx7o;9cu1cKL<$CQhuH zFzX93Y%xuR-r$e!aV@wd>;B?U=C&^uA^uUs-TWLDy(F zGf&36)8XmH%AfHBpVGTL$2s6~nTG2?EJONYmrg`1)3h{SW{Fn^IcUZunt(!t{Hsj) z{O<>RYJ{{tL#8p;x@R%2S)|wSmoa?)vcNbyr%T#7Kk5b25~}9h?9HN_%_3UD%Y@V6 zu!|1yyhYMqvq$Q44V+t~)#Je2S|)0-3pAG>ce4WW0;raB8dY`y-dKi=_3SSAsWAS+QuN_%C5ME0kmCKj$YcE2ErL-t&qsm)x%=;B!&QAw;YRN&mew7zf*M-khNl1<_#JF8k z!!9}nGcuoEV%?TW?EfcLb2Z_aojj6|Q%4QBoU{+6|%A)<~D!EUc1w&TE6+0WQuFCrdC zSBwu$DFg8i^*50}=ku_CNEiQnq?lrZ{>4uu7IL9rdZ$i+9jO?JwTwoZhC^{?Xw$s_ z^OL8uKf&$8Iv7fKw%u?z9ogA^G53FgeIB2ll_>7a#_i460#GSR){=JZ*ocs1%E^Z) zgj|!=Z}m8HGRVGeB(78mD?_Cod}(=F(-OYMUpILecaB>$Q)mK&+D>%F1Y7@6Y%oHd zC;bILRP1XrYW$@(gVcC)LKq^)raKIqV;mB%Ll9$6a3L@nK}&0-HQ!4w(sx0YO)_DG zq*=-Bz?x@B_T_}tmg|PAbqGc7vpAxO0_K)5@LL&K>QxyD4p}sj|0s6Kbw>o7>yb4C zF*f%w&P-O6!F~U+&WcttAaltqr}sDnEu^$q6LdaNUl|&-J~Y66RxOnTu-kr*qJcJRZy1$|6lzHpk`h zt}tt1kDu&FJj@m>A{jJbMvl-%qo3g~v_J+yosMva3eI?EL%{ zT+w@=_H6=-l#JlNOCcKuACIW4C}`H~55CXdqwrbS+mu1ZgBdz5lH=NnyyVn}jg2=s z=qX&B;O;iW`Ajc2A9 zsANO#*g*Fj((j&Hw zlMGV7&pQ6=gIwGqLf2mesDULr*k9eVqf|W@!6X8>mNmP8N{dNr&_m=L1#KM9d=5CGEwID043AdGw7TquPbtVHJZu$$*En{8p}a7iDP=Fp zw}f!MMw%{7B=+=QXOd>^22fC}vr1yDi!9@{rNC~{78&*h3ya1b(_i5y-z?g7&mLko zLz;vre7<&;{zIHkO@^Ui;8Zf-;LlK3X6K((>}VwKWDG3J^p##=502F*Y&|13@wkpS zZjb33M{C*NQfe>$WAJdo?s1)mAJpHba*Eq}fUG|Q8!4}i|5FGy^zVes=`AOqE*EBs zd*cj!wvi8(VwR++|0kOi^_&@n=}_I;;gpdA{98g0(x1-3c)ql$1mFp;Z)Deyv95kU z`l!TcO2nbLlu2Ak=O~~FpoxgFB14%`%*nTFV}V-zrjA$Q%+!_^JCRknf5YZ@X(kYcendql99=U!0HJU*#}XsicKO%;OfQhNEI6Ry~XK)^5%{ zyLX=)7Y8bVqMGNGqpr?X7j{O*S8W*{s{7l1zJ2BV|2|j@?uep2dio^|N=g|P+e4$w z8fYW0S7SK&B}t86%gK2`I8teLps)dcS~P4!l2q21TcGA)Kdn+M;<=<#@s`8*ES_se z4aPZ0gSuti*l;JF^yISYw?ilP<&iNxAO<(9Ibs%Q-V;nKY($XAAQ23Vl~L@y1kM>8 zIWyh0;rn$yAkn|mr1cUjvSIsJ9tSqv1%pk}sL12j{GMMu_AlA!KfjqHenswyM(W8_ zVKq%Li+-W;X!7Y9nzCj;3umo`s}{#fECyBdA~t_VQ%Z91ACk*W=M>tvYtsOw%thzU zf4CdVt%9I#-HLyh7PD&A^VX9k3Sj)^KzMcKsiW1Ol%FQ>n61XOF2m~4k3uTk<(u(&64*YBFvWa}+c^v~MP&Rg$RmC- z_6ysp^XUR{o}$M#toElJp;H+U9#4nC&Y&oH^NZWB0P1h$!C?d|9_qcme3)tO4!dni zvSSW&IJyogYI>JFR?Nl`HvxP}9hH}xl*QwLOC8CEee*`a8_a)*{<3^;9t&Y=#u9Ro zRB=8$|MD*F`|}yHi;e-o^S~>Eas@yn^U)x@Ve_FX5FZ!U+R=`1n)IS+3kVEJ-NZfC z<M2ZgbE7@N5#fwW$>#E@OI{ zyNr(JFgx)lk^(UX(H&(Aq`` zDgwD^^doqJBWUvVZe^93(SkY5`e{XEQhc0tW#yY;4d0+D#k#%mar)Yep-f&<_nhVv zZs1gtuS;R}kqcy=q3JT&{NVSI<2r)+TW0ChFoO{JQcA(rsN7c04ITGWw_v(vFuN0& zPJZ6TWFQpD2(oc+?*=7abnEXmzVS@x#kldT@8$vhA$(l9+kvG`pRbl)udx0!2f^=% zu6U-RIe><3miqdg!gM=tA8H3K=p434SL!I$gaRCIrNrjT-{~LO0#Pk^S4$CnUgX7* zo+W+~-(R78I;IH@$h}5IFubJSS;k{$C@0}d4P{D2Nc5DBZIf*J*B@!5PdyQtK9oq`Vy($z9~b5f!&(GAzEWZGk4)An}VY*%Zs_;E5-M zao+Vyo16dlrJKu`YsDw%v#YKT5b(P9iKl7uDvv89oct?ihi`EZ)S+7@=$|{0j**FQ z;4`}4NF1w}`GD84Uaf)Lxax`acEkG-b)pzt#FLQUTwa}VKgZ8q!*A5sNuV32G}~Js z)~G~_J_=bP^SLU8V&HW)P2{W?#owyUCv3jK3eHG!0}Y5UNA&CMs*FcIf-_FT*Hx+> z-66|eVkw9qhoiw!z?{Q^0HlYo{GGTKdljRdkiK9)=!G_d)?Mda4;6!>O>tW1CJNf; zy+N|Y1#gBbUi7O@3Akm@wfX z{BoH?X=oQHBWplud6d&`(Uq6xdMT_gi9FW>@T|09$o|{xKX}F{Sk>b?OlhE%6_g-c z9C$cJEm-FH5xR>Nxu0r2;U2rrWmK$K;SqblFJ(G$74xB$r*cZsH`R_)B=Jp!8u!gm zO}El2p~6^*;rv3t0dsG38JB9X{)|}gB=FRNZfSLWH0KO|SQkgeCQIMxSBB-Fhr55? zknYsaER>Q8L2BoK--ngTiTJ^O4yIWS`?=KC3yZCl?EXK-=^4)MbBIdDJHhn0_mV|E z-BjHL_?rfBwH!=U*5bNkk!3v#tp>WxT?&fh{I$@~iyc1%L)yX*)gq|eJ!-t+mhF@I zGjq-o6hYQTQ>oLDSQIWIL(fVwuir`>U{(5@V6TyWwxRf+OIm`A7`K&5-Y2sc*nZFc zbg-(OgL0u3wAtFQLFi_#-|lJPD=cwQ=bQ4_V*8Eo!Xp)Mu@b6&RJ9Uq~kFuaJe@e{d~l zztxEn#iW$b^`v9<8JfrN~xsIOy5t830DpX2Ng5CQ$uM!yaf;UGQXJRJ0j z;lcOa9r5cc_A2Yms#L!iuu2*H*9Y3J8r&2$}tV~nu6^tblTywmwk!yVC#9c;$a0L%Wvt~wr#E3~qCfj)?T&BOk zsB87_gXZNZNXkCk{DP8WsawSUj&vvwqSoYzj2X3)wIgj_ z#T*vY-+OW5q1z#H*#v48|3J_f9s(#;S&uW8^E*n>x|p>oOV=e;D`S6gS^mSK>B3<1 z+j>lAYjo%xXi{!WTXjIe%uW!|FG*wGPY+1JA*-WJX>;M0pn07>AS#AJMDzjV2t;|D#CYXEG>qh!YRi8u`lf1V;*H%>8?3C7O75cRJOt&AKt zu^;pPie|NFS=7N_NdCf6uR<9br^O!8%J|h-bD-Z#v<(z@psozP>7m|)kSSO9O-;V> zTJrHNeFz`2tm0Q}_*w!}oWUO)d5i^Yb>Uf(?vbx9KnB=nU9g1`|9Mz;b<^D)?+RvG zFu~w$%b{Yj>_Hrd%X4$nhLQ%9{IaB55DNP7WbqbeyL%zSRu+k5Lc`%)Oi`E--bNT@ z^H}LFTAIqnvYrFUJ`oN#<0o0>nJ#toNGI_6AEE|}k%+j%=q#*0eS%Vw^n5I0b5?-^ z4yb6Mfq)J?KaIIcT*%oDe#BfQG8F;?a8wFC-wAxjSCU&miZkEVPh(FB!2eL7yb0Wp z-AVhu|D`k|gx?T1`pvQJf-uXm{XX;y3PuzGiVUSAvxA6ZI|QL}H(j&f* zlig-R6+4o{K7oF7LZ#HeK||XyEus9Zr$s<0cGlwh=ED;89fL@k2L=bfHZv14amQ}8 zeao(0#~>71Ao6tZe7Gh2xz9KAxjl6&7JB>U=vsh3Q^+RyBYD!_F-4~vGIguAKa<*G zOO$)XttXRQTC-i3E31zglBPX~Ys-w+C%+8{P5)LHf{pGu?T*F^`Mbw_m#G#Zb!U83 zMDO#0KC1sD16}}JW#{b>f=vko`Ot>cuQzWGiE}}w7RioHa?(v>Co@U&AK2sFUi(aH z7XdegG|~>T=fOB+6|YuzX%7qxoXgR)29cjMVAxVS9M#8IF!>)`HpOHUEGFtCCC(27 z${vj_lHPo9%FXLfo6oO2qS5kdaelBT`BX*;9jd(3k`}-pg?X&~oS;+bD>W;DzyiZc z5tc54IWkuG`0iiBd1DE-I89?}AR!jlJSy6!M&iFSLjqK1umyXc2yqOiws8!hmO&)0j1Qw56xV@Rg^>N^8eg&jzz?*amyK$>^P?!XxYa`TKZ~E)`nj!Gy`}aalVD zOb7ZGxJ};ZS#^#Z4#LyO{0kkZCN0h1e)<#<@mffLDAJLT;q_`r(9X7P;p7-!^E|7GukmQRwQ_tz)S!#ytZDLg9vEb6T5!fqtAschsH1aPcvajryu|@oV#TF!O{>$`|uu^!%2IA#ulL;*A}( ze4hQryTKosIrR z)A5-cSof4{C7V5R#=rpy3xPxHJ)f*OXmJkeGGLlLGGd7$!99Cd-W)El-ogvD#6;#D z7?njZM`fWNRigf_$X{MdHv60NcCm`vn6w>Vr_~}rZXY_QyO6GQ^fkK#d)5I1$YTz`0hT8hJ4TRm7`ByGFV>kzS;T&C_t z0aLOkRW4m!!~xrh;M=U=USmc#xs>p1WGANxi3>JMmdh)}(I+}jAWx%?e3RT&UY}GwSCnXdXW}5J`z29};-QUiuPAeYHD1MOVXNClsU}dRs zCa*qJ_4Kar1>2gfY?6OY74nK0&kH379i!(i2k%?5-5vG)y(?P}4LYm}Zg7bc<9ccd zS50tU_cLXDpUpOPb#RFbJ;Pu5uv?g_yL?(w^oHc7)KBDy-PV~py*ymAi5YF)q34o} z^gVR4JcdG;K7T(`ijes|GeLho-YN%pM2kLb76$FF#_GQG-Obzf-iV~M&vFnq@-{#b z+jJjs-PTX+M>Z&tD5R2cG8^|^ei89Q_(sK%mI41&C5tZ9OV^^~FHh&wq`Y63ubG)z z=i8T%!12F<3B4ljX{5qKJy=0#%$q!UXCfY*4x;E}NJgck0&v&t&1b~&cj%tNl0gdK zVc1jhp$N(KS+|vBbKt`43_dg(0aL==U2gww8_XV~N7?eSB`LLh5?FiIVG}>-v_w5u zK!Z#f^$vI4c3SM`AlJmKQVyJb0tls|4OF@i9Qy$?X0m@XbuQaRN}r9T9*KH(B0MiN zzp{`R_9|POp{o+R4I&Q{J*=#*dz!xJ{~@oBuY_%Fqr>Vt+}%Ap6p5s)WN7Eu_8&r4 zR?@8uEssb##r1pdfuYj~zakNU_x!agM(<7Q;c>{k#sz#HN-tTcpqQ&2Q_^Gl6*yw=o1`4Mk8H*#@DYhFTZWH ze%~EDz`PkQH{a*^*BCrr+>g@*bVdD6ztEbQyU_Rg_aVaJ3IS@mZuy$w#kNmTU4MwY zmOV^;9iBS(`U{0-@VAU5aJ|*Imwn6V&td!XHs%pcS0`P*P1Of0TZ(?$-=V3mznF2W zBnM;r&0}<5zfMhVA1R`kq!Z<-&-{@$Wyw9f1BUWMOXN`<7;=@ug%49oKolfF@a9jEME7DHNp$C)>tEp)gv;v zf`c2fSf(j9v?~t@eIG`e6tE^^aCYe<3Hh&-eq^@6dQ5(*+m%I;*5RP8I-3t%d*Zl; zrfL4;FEV68ZF88>vU$kVE4kYoY)h$$$2iKo_bA&v8bw-GbYRwUhFo%9Q~B?3I1ros zUV2cJ2owRsO_bnf{IxL;RZ3Ew$nHVf4o5ld>HWhj%Ksn!y^I7m*4tK&CE{k_7USkb@SuVt-IB;1f5%xubuto&u12;5p2cg*2ewL_&OXqH7vNl_Nl0u z2=vEB8D)qF^+5{Qa@f=+GC{y6LPU0pbq)QI(EwUj>s=2kS~_Q7D_3)NG66Op*EIq) zq6|DCp@mge>s{3mQdBndSwHXy!AC4Q! ztIe-{uRD)lB0}=mAB_F*(yy5Sxtk(!NJ(;oM_~^AczCdX;Ss!@2saVj4Q2VDHh8-b zHM=dnUeWq9q?*VB9a>uy8_Ou~)t|hPZx|)EKgZ?@NOet?nAW;|UX`ux7KQ#vM`-&d zaY{BNx5BQ{By zg$UP(=@;G}EM|}&rJO^DtkFM49Bg|4K1t2CxLpt#*|-O*U>l0B$;rA-zj&(!nYrg} zbg+HAS-bpDkw=54WsRCd+?yZ1zR^^;k@-eLdhK?>JmUvF(_x|qm>idK_n)}D@rqO(%C*kB>WapG@A|r9 zA`=SFl9|tgngitb@lTfiFfJU#cpfuItEd?%%9VyL*7_gzEO$9?p3gjEt1(7T4cyy+ zs5tz5V)Y#v$x1muYp@`LY#5o% z@93l?Q9L``ZwAERsonW)oU%5bBT37YV4#M_xbBH!Wj%9lw?YRc{FDEXM62q}vU{{I zBR;ngvH4qv4|KWC7oOcf+EEEafC8R+8ofTVsVeYsd%u!noN$Z5pkvHIpu6A*HhWw3 zI*L_&OA+{ZLvgVFL%HY2PdNCTjNJrMG^i7QLG17OC)`_^x3uX}mAuI~XUS|;0PcU=?jE-{^`jg&Rej0(NbL{F$%$hV25CHxl> zfl$};UiOm!AAI6}RHW7zIt8pFOzJ31T)oPI8yGs-^-}H#D4xXsC`pkiY6Xo!T}13o zKdz01U5YCq&kLguQ8w6KJ0vD7g^?d|Dem8=cG02g(@ki>`ezB5Aot?A5J{R;|&Gpp6e9tjrFla4R2gIX{4yC zZ$N_l5Hxi}Hy6JtowUcd>fKzc_H3H;p)`R++-V)DyvKtxg7NtcxH762z+v?XBb@ou zAknivy6GX5$`P z*#F8xgUmO7RlTC+LJ$(rWLd@fEjd)GH@;f2D7`|xD2^&l%LEqGoy?@QMzcXr#24=_ zQkOU^{CyiwY3P?V#CY3Tr}(cF1dXHDNlCZxyMgdnd>1xMbMJ5V!fGw`XB0+o_g7Bd zJjbI_)O-)giuu_wBEh97mAayZ0BU|2YQ8mU{yu6x z?$!Bkx>27UGOZ;Ej9%q#{B0G)9o9IvcA#5gm>Zj9hpMz+Y?NEyx#So0RZKE33gJB| zKl{1hFKkRQex1lWe-$xI)Z?z)2nYNGBszCPzLQ>{$AhCgujI?FDMGu9;cWvjM^e(e zzGy|O!q0HAbBl2U?vj&La}S0um{yVY!ui_mw~c=jdpMoHV$ikUjK0&(1>57 z6`Us5FN>i6aU1Z+&~+&^;u$#gD6EkR!hk7{0Zj^C*gz~&f#}yT$Oq25!}s2fpqg%zX>n)M2~BZw_e$UAtO$oXfo!qLYFWojJRc@Xf__y1aOQ9+i#~MGK3KN{ z+rh-Vn?8p$tyZq9k=6897xcScW`q7_0kdj`#oLPXt#uJOq>mvCe>mzYoooK6=Yj~w{%>i+@i>9hWA3+_y14Cn8yKiFH~J*z@VvhooqzN*SHdH|aN@yE zjB$uo=*`*a*T)r#>$B}Gok%O8oK7p%nKWvwZ|c=FSR%5LU4y!@dSkO^qqOQHTyfH_ z>i(mk*g4U(^czDPg&FFhcTc$&)y}OK6BEpTBSwuMQ%t*oaMImrx7RM zyU_w3egX{;CRH^3wvp(~FN$S@%KjQ-^{T?{&Ht?&z4Wdn?G`8)3R zQX6sQ^;blme`RIrUne<3VG~CvHb#IeWqyOJYkJ`bzd5F!TC6TOGc7Vdq~jXoJOOSU zsuAks6u`95jOM_hj5yEP_R#%fjL#=($^16p*YagP8XQtKHpz2;jUd3uLikDx*7BeU z0#O-3+M3#*ys%t;AWwaG)@0O==-XN1%3k}*g^OnQ9gCdSK7`&vc-G7bDNpbR9 zD*%fPx;K`U>&iHg31hYODZQKl%uR`rcEWb`4Y{g%(;LuX%sZN(c!JPHIhd5Ys+iKk zWHNuziFu?pCrj4@-t&s~oSZMdlUSo4C0^tGvO>P%g3(2?`~-U%T@3=$ok!(TG1Bps zsoxJE`Yl!Zdnba8;pi1X#eASW39VMo(^ytMMe{3rC-6Gari(!{nd?n##4FUqbzl0n z<7@2;al0k%`Gp4kzW7<1vb7!eHg%_pe^xQOUz1bC&7+&)3+z-@IN9`HY^5a40qj}L zOB#fK0IF`C0Icob$C`_NDLF!K6_sOWAA*+~kE5!Z5PJuO--Y|)B~t$IoW`=NEms`{ zl{5X29;sJ;o`NDvJ6(5@48A5A%zH~=MMzDGl5e(Qjy7zj+Dx{&11pM5Fj)p_BVpms z>!sr*`E}UVSG!b}Dv^Nlv4U2S05F$=+tQUhk!h+4%rzR&_vVQTIFil*;w#Igs7HXr z`R7fkCTBP=LigMs~3O!o4?kYf&r{(=cDs;GXrV`;|^DNIhkg^R`VnSu59U16o#18(-*JdYb;AN5 zfq8It{i(@j1>dRTJ?N!el4Ub)Zi8|pcB?r&$z@INZ$BrQP3@@~7uk~DzaneltD>X? zEW5Zhf|N(Py-!lcV^)p}D$+9HB82ne?(-|EB5B^ukkL6~hYe*xM*jdzEcvTwQYvu? z!h%J{eS<&R_T7bET1A`~*x6s207=!09ns$=f&-YgSr;CU5%USjX=a~liZtH}PGb&T zpf$tmi5{_z!gyyYVh*LDH$7u*fq%B`f?~e)!QPdM9(5L6Rd<435$;@ZyTcuh1_O=` z;UOW=4VC~eUpaJ1eA#;&2o$u)TD|LX`w>TQO|SAlm!Pa8p}Y4NsP~^Ca(!BTN_`uC zNk@J*Yh@K?lA&6c%Ync|jCX}#Ir3%MJID*-dua&h8e>k?e@oG<2_m2@d`VqE9D7K+ z+nG&(jy=ONbQ`k!{N;K>Qka~kATah&a>$dMV;W=TedzYfwXlM4BIb;2?4kRvf0&=B z3{W=aP=41x&aZ&BKoxuDcIcLH_nG-RD1jj9=|AE-bPKopOm!WU?$;|LY)V()iUE@p zl28T0xr%P&MixB+X1O$|77tGN5j zxBHBH{g&ewA}QPlDENmt(}xYicuREs_QUT(PB@gR;FGpsCH62h=5S`{iQxJz((faa zBp}U8mryk|!Q-Q=3_2x8O79!OKA5YtWS2@x+gw;tu)0MG;31Ln4!(Lj+5q1X)i^p9saxpJ5ORm3O%_l0E)WL79?`0j7amB`+SPz`R3=X6;CM=|T z*^l(Hej}X=L^>XSf}U%D>gp;`qGEx><9RCsSRji3cerFZ$x$!>i|H-$q_+au4F6AP z_`ex`Qfqk`6GWP(?l|_O#$QU?GAPlDIWBbxDZwxvc$u0IN%&6!@~ANqH<<-5gty)# z2r+aPmJwRE3UUM{&L@-u8^-*Sds|6qgA{tDK@Ia9#%{YJe^$&+$oZ^krearX9_fdcw~#xun{Ayz0n}!M^en zOGe2XI3};U_FOL-2^R{JXm{yWsJk6CRXdHi(ZyLFV>BiC%mGU_Vc@(I6QPd`Y(KGp zWWn=uO9rW0v5(Mk-Vtr;kf zSNHuw`(o-4)#a2T^h}jcWytABih@Q$U8W8}!@?7M-rr|wxo&=AAg!Mzu@(JsC_7TQ zclR?vVrJRItQLz*KGz3OoxR2qr&joOSFouy&xh1beVBzk@H6>FECP@l7ES2A$IG7^V`8S3avH>Lttq9XLBFaTg9e_9`^sWug*6D7my}6v%wPaIye& zK#RZh?cx0SC+tL1%Y%h(D9(3|c#uaP>IsXd%Vmqu6t}DV0?TU)G)K$4)XNKlJs04U zt7dnqE{Cw9Z{Vxgh_2L4|By2lq>Wq5vA9S>cw(o`nZP0P)vji%+$cI|ere(y@GrTOCFx}2hF^Mf3q zJ>3ZzJC&Gyb+tV7hIhiGt*)^yssTBbV^V;W6sdAI&B{1AL>vbhuuJ_vjF}-?rkcuW z0?V>6m&Fo<+Z!~_W#x`%ZA?u+<=Yx;DQq1g5dDCWVHD?&noh)pEZ9K3G#}>xdne=$ z)FI|rDRcT<{D3h>sVQc9==I5TXokN)Z#MN|Zp&o#*d}%tF2E~^eKh_IK!9D_!cIS( zphUCujbDT}yViw+wUIY(Aws>$DrJ1_S1NYfbkZpD7+#QbhzMqt?gHq*5l9nfg?SsG?>So2k&p)ULu|xhWZlZ(2efou)z`Vkz{= z*&CK5y1}%En&l2JUGl{FnBc|wJQsiy4*w{OmnT=@*ll}{r=IG9?8SfI0)auK4z)LQg6 z<$KnS^yH73CVTZ;B+tm;l@ugH;K&b=AniOYc26UXG?+SUHOd@deZDY&W-qgfro8A# z$WPrw)!Zc_3}2S|anXjxGE0e^Q!P#uR2Qpqi5kf+I*Odd9J)9x0~(Ow^+_lQBS`J| zZu!7x3X^hbl89yY(2{Pch|4J5Lao7NeDZ7EYYDNL@<+P|hI`UIxxuAq28)9Wyy@u? zLqA2bFJ<~97pl|6rP6pmXF9#|0x0G=WQX^FiC2v zXf5g_{<>jyvpMWeAOjhdbmVKG%ZV+Cxfi=VPVvQNW{ttBNiR0mn>xAKlsz#=tjs(8 z0-5_uEkL*(EnB7&ohfMQ#_UU-Qf||Qqt*@%3~;&ELRlGSL847_Lp?MMOBci~??=}h zD~M8hQ^uqD;K~eEEpx+hEHQ|x8lgt+f{1og;xIKh$GV}Ka>P2H?9jBhs zVyr+$26&#Bpf2m?hT$ZC-R7h}XB2ZU{u(TP&UvBSITF@TXQDTC85TZ21oN!H<@2q< z<@2aP-@wSwy!wD6;7w?o>v%Yv$mlJYFAC^~IS!qP-ecVftirtV&%Jyuzcr8Y&HQtx z158m=B`@q0pS5JRp zIJN&6>;^W>87p?y=DD^j(UlrREtY%?*qQatv7fqoh7Y8MhAkb=1Ia7f=7op9IC7F) zqYZT@j-_I~iKF}GIJa`uoju7Ol#I1@o;@i(x|EqCUqOn>*6Gv#jY|i5-#OPk<&;vg z8l`5x{z@f=Mg~(|+p-h**7+g2G_w*}JJ$u_ajq4JWko*8dSX9lB*s}oWRS6iyx*`Ul=#Dc3A&!j#4gozF;1%1)BY8W_^o#UcJtO@r(xj z%>k}hM`{jRY5=G|;)@m)62{KCR&P2|rM~7!K+8^xG!PC4Y`LibMVO;fb8|p3H%QbM z4Mj}%<<#%>HaiPwjrzmkaODL)GaB**LblwZga!i9kh5ToNBzysK4-zKL4&?<*wThT z{n3D*1|nXcVxA;WpU)fBvLiYg=nA_gugz${7mm=NH{f*^kRVEKH_LprPyL~AGY$E@ zVQ4`#=*S=UXs|gPpaE|Hub%vV?64pzX$mOjhKu@r{;=u3991*X=c{c zK!c&M4+;u|wCtP@RRG-hnLz=Oh%Gk{&|t*dO!0t8iUh;Xf&rZdqyAht=%s++or zd$s#*?#tB6-Jc_r5F!&6=BkAmzcp|$QiQh3#0n;^WYQWY`j`}E(s~per#rPnM7vaE z%G;Up4yGiT(#4cCQ@WXQ6;t|{a*Qd1Oc`d%ai*MP$|oZWv&lBzQL~72dj8X)y zte8snQJWy6b1hyD{OE9Ds zLzbee4qeO8rK8J(u6itCIhN1>E_DUC)K%cp8o{MCfy?Fvm(33@DS$N$g3BHPmpy{% zqL{9EbS-f>){SlexDlX6HjTCbY#nV8oNWS8$mY>4lERo0yNTFrTeoc&igrN8qFq># zJy6xXf=C(LH@bBjJ`apuvR@Dm@{`=i72@HJ_z?~h9CmV;;_xWKo-4V#m&1Mz2ROW% z!y%q#gu730cnyc|(PA@gyc`FOy5JZL^XVm=-=%X`H1J!U>0HyUN=o*lOB@Ah9oO6MV$6s9jh} zoQvCpg`{XntFV$3*R~1O#8ufYcu2|8HbEw(b*(}pDO=ViEGFeu?ZOIDp|=WQ;`X!) zm85cEyWl5P6>UNlSy109cuDo*c3}~zSO(-L^ zwe3O;S-PTKV5DwktFW3Z^Rx+WqOWQfmJ?57s}LgftJ{P%WceDr2x@3*6`IJ3W$nTe zva+OI(8#J4ZGu7?z3qaXtoF4FPO@fIn@~@h{O!Ur;`O!(HsbTO2@c}-w+VG5P}(k3 zkYE6{sfB=oqa=v;4&mIrLo{>mu-jN158=H-(7Jc{dC8P}!uEl_V*~wpCX?O7-^ir!tl}^Nw}HGsn_3&^gj)ow#Q-nDIM+x!}m0{fB0r z*HmNJm47lmhul!``dQ>Ud91gmvu8NBik^Gsf5B4((0!r>5S-Df^EhlhmA$K_xcKJYP?LXYWW?YJ30A z#5DsWyyxeU8_J%=XVNpYci`ATe$G0FT(j%!zI@US&nn+sNIJ8*C?M&1mtleA(ItW}a=}M89dI=K^=Lvqm*Et1$p}iJkDwwRp~Xhw=|RW}0`J zvy$0mon32(t{ECm_3cXZ!!C?>x*b_FP47_A_Wk+Mb4FWmhxC?thfkzZ{XP9h3yU>I0QA=(^PI}rRd8N2t1ob}?J> z3q}#z9P&k7lb7KXRRvP)T-oP~ghRF*u|j~)7gRGd9gX-x&1z;SMm^h+>I;(^WDZ2U zuE{Gv8uUhjB~#XwG!XHHp@Pj(Ejvfhs4p0heO|9OsAiVzXnQ_DLy_ii%|!?l$_{zM zrBlCKz!nLGodt_C8uB;$N~X-KG!hJlU6WUkG#F|21D0^auVq&bG#vFq<$Y0K@uYPR z4f~=YTaNglV&Q<#S@2;)m><{t=mSac*#;rit zN_4FP7i$C;YXX<*1()gv7oKQIN@z3)+jGDXL4J4Ij7L-~N~pGObgdw4;HOZHZDRYD z%`pzQak!nsw{f_O!#y1C?4{&&h!^=2)JBNok?BMVn940yJ;xNVGQ4YH~ypqGK zIPBwafWxaf9O7_s3FeER-u6uRkaBkDPDl*P_7a@ktwOhGo#XCJWDF8 z!4sBpJD&bjENm545ceWHOR8LqXEaqy@XTmIZJS^x)r;_ys%9ykWG!^znbD#;JfB*; z49}sK=&izXQo9&WaF#B?v!OZ91Ih zCqAg-el=;pQ=V0L$|K8o%CkDhUAiE?0#A7wtW%y_#7U<-Z6m|O1O1r;o`pi|T+eq* zL@+z$re-s!X_9|!s_$5LVhHAmg3}Q5G-fuLGp8_0Uuw8}po=C3j}EPPtNfjb-rk*w z;nZNxnhamoRZh-mJqt#^%o?D0Qes=KRu`9UnCtwX?Of9yY;#nC5ns!;MT&-e%t|DM zq9MGdC{|q}5p5QWItDb5y*z3JgO!LPCoR|Qn9R}+|6Mn zhYL8YAu4=pGL;n0z^-rxc7_T^ISmqZGq*X2W(XCo`YlI~WpNGZQMKr?L(S5oDbR7* zuAP&4*IRMPWlEal#j-#H^sFW_B;Hk zJ^e$&sE~dxr(+SjUyl z&XGZ!{ts|o4RQDyX*e-xsjcry!N#=LezLFkQu7vgNI~LArQX`m0XxBS6o|~(&@eqv zZes8nTR*P_E;Ea^XDfx?Vkph@b@F@M%538b)0y9>$#%Usw@8FEv4O#S1iCl-O_ulP zg=YdcOxt^XCy!*_@7jxDCnu-x{XDk>EkfZE`6SwoDKANBI zj@nTf6(|=8J0?gm0pJn=lt=(dDS$F%r?E4sq?I%qRXdrnE6HlhHlbAZ0=CE4qYIr{ zl3m|vLj$2&(w5W~BSK?eTuZ7kjf|ZgN6mRLo4mr<-MvFVC@t!1&xdf=Y zjHXoOxHIj1{@zk(sBt}sm&8iUsP__V4MyG=D@DQV!N#2=shq6`BzF<6 ztyH1%d!T*y5wn3ZHt;@zEkw9nd;nmB^dP`8dWIMekW2&584r?ivwhU~2sFZKAB7Sh zB3q3|AShGGGB*T1W(8m=#z#^A@0DdMjE`Y8SWZ+@MJdM;s1e$2HNHylReTN8XejLH zg*5~-7RRe52|F_5vn0MC7f2R$OAu(TF@BkoxgR{%Y09SO_@y$djFoN}c_Du7ZqQ9#*HRwuob#XtM2~YI{N^Ul!e)^_O?utoEV(XGs=0(z>;elgigDK?DDJ&sz z>{#zLZ@td&UZ4&cvmsO3!q*KKo$lIZBU_Kosc*)d>LLL@GAJR}P;&%8IHH)fEuNIa zT8cTgoaDzfT#{Z2M}w-2rrexvQLT1+(8#D#&R5+kH|LfSq9?_Sx)?2Cw2aYmMk^St zWVDLO3m9F}@2?U#0lXS+qCu0x8`@g0hS)epf|s_YOeil#}b1>DQ>MYIMZh2cY?Jt_suvjtOt2%GOxV@yt^|sT03JTnXf+E z7%kfaBw<;fLlcU*jyZt7OSW&_cHl_cC9Umm+j4*&8yV_;>w!mZ-?M91Yt5FE$It*{ z|Iylb?Z9AdV{LL|xHgSkk+o(QZW$aL7+g2&7Vx~h!el_YDs_!DMA&mx-J&bL%~YkL zR#h^-5m_QBM8fR{5$m{C6~&qs2%i=R*R3L!FsY15<;XWGxp7*M7BEReJuA`@Ce<=& zDU<4I2qO(>x=32Zq(&yK#)EdLiAi2$Fcmjxn?%*r$)ea%T?H)uG?yUQ779XXJ^XxJ zeTC*11EFA;!w82_4x2e#%i%f>H*mO-!xmCoswo0dX$wCZs>GcKk#XlCN_g@knQB}p zYY{Yo$V+hYQL4~T3|h5jq!xD_s#-ATz_j3p(K~9+IZ<$I$L$4)i(@-P0@KacbTBG6d zCU^+-$X<>GmI{ZB!*SaVn=op7*?5OlQYX$rX*+6mNjuANF`F9O#tqIJy<@x%u_9Qd z4_L{so|1fMY@0Eh7g}8IfY9S+dKanBDc!N!ZXKjAi>$OJz1|B?12fKe7# zfAd}QeY>08%?X4nKp=nt_Dps`kr1*ZT)}X7)Fs^{yCfPCnoY2_zyBZczNH?uY8AZi zyJ~IgRd1`3M4*Q~Y_;}MhPGOJng6|+Z?6y_U|?syZ@xD(Z{Ezjd2_vYaL)Hb&g?;w zLjjzHJZ!~r7s1P;gwtR~77cj#6C%8PWcX7ed}cPyt|PPZrvTBOAxJeHEBAJ!8lO1) zm?KcebADMwuHdPKkS1@C=(xx@sorF7k?8oyczk+SpzN+k`y4#N+-xjfgoIwRO0|c* zPI$>C43xqoex~HU09C(65++TyRcSKl`2$S7W2-_{fCW5SpwdBelix&Pq<`#Gl-%?ML7 zqSJDOsj{@*nBB@qVG5+`-tN}!&g6o&j@I4ZuRn75-!pOb4W_@jaGYr)=>+6;`)U9hc7TiZA zhb@_Yw>M{=YmX^|O#Ji)h>(}QbaF7b9d@YQIOd^t>@6j=rQr=#D*<0v@%#K!k5G=H z(bCDC9rGYd5L3K<4}~#VE0IfzOUB{kOtn*4r3&A(R_r(m<0@bY)yCrzpfZ6gHiK>= zp~9tpgWrmP5Y;KW^4$g8E#z(ycS{L1aA;Ius-@xJi$~Q7-xLw*%qZUuL2YKLmQn~s zG`$G=njLsm-fpgGOl}~|DfF0$Z*Cl=49U$3b`Qi9R*2IeREUQ9h>IcKxZMfG(o3e! z;JsOono(QA=0Wv}_)hTw)snSSMtHBTx2M-aI=eS>?Sm;LabjPAcU>&~8EC!Sf?1dg z^Ch-kq?Jd%<6IH6Ij){~vb(RRHEtbUa5d$=qt>VtNHTjJ+i12f1(CT*b4MH9 z(6DSnZ%1c(_r(-e;vsnUA&D@8ZZi)Jc+kCZYtu&9u-Cj%(4bZtj#datHgo|l9c_4V zOw0o(XVYw9!w8BNSnv^!GoLZ#XV97-$ABc|MQKbNd1{u2IIQiAwZ`#`j-wgViTBjP z#HQCFmYPHX%~)I8n8}>tie-le%~4IJH+KTt=$vtAaQ+=*pe6Dn!a@GJD2M@dz*&*9 zs&Tmu!Va}cH#wVoEgX5H^DsH0W<8!2Z4mxwD|E9C9bZ6;sOhs(a!1=?$eh{qY7;Ai z(+@)stNa?LjFEb+JamlI>@P#C!wyL+kAB0;%J}qyxCtMJfSt zr&a|50kyi?A5_Dks%kS`7i!2~?XzdmNe%lw)plS$ICsV^(Tv^lWkj$#r6Ra-4eY6r2hDz7CQa*W|XiPFDmy{YaN@f}rM!00PY7kXe+a(T?U&%Mo zC?7s;{ER^!)tr2hvyiIAFkf{{q3TqcH=R1mscRO_UDdf%J&vmLsLBoQsy^xnQniYb zYU&PA$0F)Jo~je6T1(Ys=1SRIrBJnrs_UtGB2`bLYLu$YREbl^W^=O)12YWPQa%Xv z1rjMTEBlM2Vh}yYdEsrGzrTnSOH)z#AbEQmmqSN(Y&X ztG@+>d3@*3DR%zy#m=9QOjNDvfR1am;MQ%DS%fdvs#3emHg3`?9UIZUzyh4AdpB82 zzEZo+e3^;4&dvt;#~r~Eaw*Jw$H|w0J6^dQH>T7p2)lyt$nLASu@5rPq9yDwk=?9x9g}K_oy# znlm&ASdd-!U%!o~bWh@5+3~Pf@kwAenn)VK4F?8SO>hBeVPDP5K}-x%=fz z0Up38Hr&n4hbT|+C^gbkGW$M$up>$4z=v0?53k7VHF+R0H99ph)rH%uuglT0fk+vo z^ae(7q~^#vD~lc%osyX1K?mo^b0JJ@INU#B6m8xh({y#kVeYf6qX+nX{rdH5Yei6M zTKod3$k9HXim~vZ7mxe5cZ1bWr**?7?WS^!0Qcvn*|iu_?*b zOlRxp>fX@QP}AAjeO7$T0%oBlU|RTb39~SVSVG1$1YsK5j$#gye^BwmW2}aQtJ0Dk zgJVsgwHrKKIL|)vs3Puxu_lq445!qYjVV(0=_r`fbmA^6pNMeLZTZpU&Cy?I6$JOC zyZdssYICOGSsT|H)N5C7X(mxi8#&bc)^3<7^o$>^S(bbKA#+31Dxm<#6lr(Gd+UxK zWhm~*EFIaYxDWbj1=JwoqwB6W8Y~#6MUZuUT-8TWHuORZmztx;IaO)3B6Vl#eOglUR@tuLMgku@}&B5^Gd>+9?_`+7PBd2Kvg)K*6FaurA&TjHLJM%s1z{x?11?>rWLBMagUkD|NA0W7IaT zUc0JpeI07;-r5=Oji;IxDgr4Um4G(D-zuyfd(vt_iN(iGZKST4qPsJMtdAp!91yTE z*27OUCaoDcwQ|*gp8-9Ajdr3ome`i08(Kv#p49}wydeqm2ine4NfsaiR>CQ*{8_N> z+Qv2O>(;DqUVrM^x@L%1oD;CFv1ToX^5P1-lFpuNG?Ti>h_p}2nNyCKQjWG_aQI2+ z7&luTK!Y@y)RykHv&mMYx7(U&i!(3wwT!R;z8X-WVRZ zwD)#{Yw4>$F}1QlW-U7w1~{^d*dd?|N(ucVN%?X}ytg#g*V~R^;@IYzZs^%tw|4hH zGjU`ON>yV;0JZC7vf*>Q!%k_}9hO+AnY2!pVWZY<1ZYA(c8sCQ6{J>a{D&GW79M(lQGiEMi$H6RA^w8HBpqu#lZw;VNgV{D-o9i(P3xIm-Dh>i z+cw8n=LkjdhPElAn;l7wCV9{)d*YqE={28;bkN;h3Qdp zVLHqn%V6W+E!T=w1Ovmic+Y$uHs9(ICLb7TyW8S!?CMr12eI={q9@Y%WzdTjmW>|? zG~XhH0A9vlOjO-e8|zEPmmCZ2vqz$mRJ7DkBe2iQ8CQyP-qIMg0gkBK5GY%JEO?AI zcIlSh#A8Ws#5gzV(Yn^o?qs}7uq}(sRB}kR&T&q_#r6H<>sj`qNizq#wDko67m?|ey zWeKGWkn9T}#8toDM+)=1`W=ehbeqYGWe5CqPv45^sFFK>wewq~fBMyA z2dO6Z^1Dg@Wbhsk-b3I?_Q!;|g>ilIwy&RcHg~_t-E+A6zufI7+}kd^^M!Yz@GchK zrNX;RcvlGTap657yzdF`N#Q*uyzdL|8S*0{Jxhp`$6uclq0bX}^%~O&C0!PiY=qRs zBm){4Uy)NHEs{*ss*wECDtiQW*CbV664DI{ZMOwx#1ge!hFvP4=1Y2>-g36g`( zsF9q+QMyFJQ|oJaTFzNDl8d+|*GPH99gj(FlHbVV6iCEaLTV*~M?UlA)ysfZg+;}A z%OoNfl@xHRN~T!&`zK%X({!Eo9Z*>qm*@7OaqRGZqLVOd+(g(~eh^cU+6h~Em*-lxlSTfY94Km-b+rv(tRnIp$b!vx@=x$GCDQm9h>t6!s3;^n^;7eb! zPMr|aiv^i1^|G_@JiDgov>ZaW^OdjZ(slwUlI^&_7|k0P+#PkUa7ruk@VpSkG>ZWC zN?bgew#B$7={)B-jgydB`;+PRjc8w#eueZc*Z7U<;)0ldd7` zI`|gN!Jc2OnMhq!}5IIpCDIyqw-Avr`Bx$#2&~utJci&vkaa#zxg>abhak-Nu zCRp$jWIT+P#Hr}3|BdJblE;J?SI7!Zv zOx3N^4^*JhgZ%P9WvfxvKd;p+yP(xp)<3`1Ue>>$)d6pLPzBP1K&aK^VQ|;TkAT~# zJPPhw^)YZy(w+pjNq>gmDIw25#6$W$d)Xr-TDYQ6>Mz{K9wmbbFRr*gMj%0rJwb*B z6TX;_Jw=8RzNjbRN%+yibG}Q0DttN}7`T7iwpN`z1JQ$k4P`$dEp%H!2e#Z(=#L=R zQ;lcAJ8{I`dP4VU3$FOi`ZBNk$>k{12?f-^A7ui9RR%wqO8z-@87N$?!e z{1x*hq!xPvkPIWq*qb7M2j)K^lYbuj32Cvn=e0`4$MNfpF$cZGfM1m-2F6~!XC1H4}g_qxv7A>`&-=bA2xQ>1tgnx*a zUDV1mBQ>Oa7;S4-ZrScuz&msMPORSF^UE;&@sEIx8uPM06Etvb!y}Z7p{;$wJ9fA9 z36O9)L3gW+u0vsjF=BC|udxFJSrMf3R}x*?qOMqqXW#7^dvXrE5_S?KxKkFKVyDba zZKAh>$mmroJ7xBmys42rE~j{4BfDJ&COFifush`4EoyryyHnn@b|^vH*Rs2C;W$r& zgujEV<5^j-re`6oYY2IfXCS`@-nB$|TV~J8(UZy|Cqct`QI0mPXp;Jy_Oc(#gVD8# zwXt>VC3q@M6erflHn5lF!NkUBQ=%zx@~qe?>=hZ;%lYTXsnBm{rMVdbW zY3@PN{5f5gdkOoCMVgP(f%g&i38zk?IaSF0qL6GvArD|7T?&jutx(3#tTKKk%J@&2 zeJ)48S{C^#6z-py!u=~PLfz03$y=@DBTyBm0N+K@ExS*`3mNB z4Uw)?*o6x2rigI@&CEwy0RAEo$VZ8E;Kd@4j}g%sFhXG9B_fcI5YbsMK49RbJTTG< zJoa)WRYO-QRw4GVtCRt&5Ld%fst`Mrf$SRkmV#v%NSEPS{vK_Mv`J|aUZ9wV@Ld~+P3$Ytgj0W{b^w= z(Hrks6-)MJ?;F$|TUssgM0Za-($OPQTY8MCba$V*CDy}@OgVGmoC0L21yOTs8Ccic zvlMkMKDLCm!6T;PYN$;^;Afp5ze=8PY^f$Xy4q^G&OY(jWAhqVeC+YDIjDF;{rF=` zqoXSs?-6IDju8u7slZD=OOHMJ+Mf8fj_$tXF_uBBmKdqVsCOq4$#}1^wI`m4_qMh# zJhoJm@%Wi|#%tDLqGvsiMfd)wiBPMJ8%v=&ajD$V%ELEoZHx6D{=UmGsk~1kae6LO z;_JfxfUnv})hH^J3i(y+I;a3Y=*X@s&Fic7_;f*g&Fc?@y+*o0hEZ2Q7K>4RK3~vG z^DosK@>Ef)^Qgg)H>~B5oXj-w?yC z3_cMcq`(VR@ET1M5`{7h0MRp(Qc zA4pOIcpwSyW`?P{h^i-uyEX2#qA9fW$rY!A;H%p4N{h2U4_p^_-Qa3UL4UqPiU1ZQ zW~D?@G+Eb6FP8CA{kZWHP}L45=blES=`-Z=Su-oRJBPc+ad#ef7jW0hT|ak&+^yzr zh`S59dpvg+FOh4OPOs(9%OG=&P-mWjr-vkB;;|yxh6j!mJDwm?9W|1JXnA;!NO$7V zA&I({N<@|nH(u>A^Os7BEZGY1B$B-lR~j6Ab%N`OC&hS_$mz!`%AI_k)qJ7S~`NX(l&qVME_eTnnOdUFCBo7M~+wby92`k~bL<%arP^zf=d`8Oly zR2;St3nC3o>((E66osT#oipq3Nv*08DFJNlIdcvVTf3pDscsDix6UCqbFcCU(Q;m` zf%ym}@!qVt%SV+6$z<&gTau-YX|v= z-#Y4nM?l0 zifjlkfse;ClIk?7&Yh4M>fT}E*z6NN4 zE(Xvgcmz>^)@;&tSGoaIV@s`ri7Flnn*^XM#C^aO@VE-kHLl*I547uS&2sCAT^@Xh zL2|9uxjP*L?GTuRz`pX~>^oH^8y9uqsYnkxcwS6_FiYFjsiQJM-0#U1Q8^=2rD6DU zeSwZ7{aEoI42K&%)&7MCe@JuGbzhFNjhdz48(c_mpwkpbTSDDk;ts=6aOE|}P@)Bg z{$z2b5&X2^;0VZM+}u`W@`~eTRzA7KO;Xn>2 z(yG1Qs=)X|6|MBpMH?{;O&h_&5001`l~Y5l+6f@Xe5}wF&lRm*hZD5}M?`LvR--jw zSoW<43bO}5rhVR#lgmEcpQYc-#?4r9%3J3mi$=}@FtN%bXCPwpQMwrkId=?EI>f}@ z-rd<&A4@jC3^8d(Q)Sk(D+AAoX{IIT{MyDYa44xAt{%2k1M6OW(@5hHv*C?t@VZ^igUkO2pxT@ zNvt*KJY%Uf1mm*XI(Q&SJHC&d5VQ<;VJZyTu&T zI&thjaw1ThID@T8M=fgS4Q6e;s||XD2uu2ooRH9Eok?dDre#fB$51kUWI}*vPag3k z5~_4Q+kig8H94SBKmK4x3W}WD#=-zH(CNcaO@e*QIdW`^(WKWaQm3cwS@G=MeZ7qd zVa{!=$ER&g*l@(Xyeu_R3)l8^fBoz!BUw={Qlp&-G_4j@(|g>J3zdd7v48SLNP)~4 zW+sm!oir?7sS;0PAgKkbVvlg<_Q&JK9J{8MblAAcERMbbZJ0l}`E;PUVa>9-Q<_&d zF013~9vH)gQ--V$3NY^ZW2Tju^1z^hEnypmkTVt^IdP4QCG*?HVpBLb{AF{|{%dv)L_t+C!QC>`zX=8?uwuNI_DG{~H5y6J&__L}Gc6n5Fss>~arZXwpu?^h`du7)d4xJ z(X3vk*W#jTvN)GM%irdF`>}F{hIichS+s zMDw((u>FCCz zfNlsoIUYL`_&#(&5L$g>Vl+82QE;psEmxA_BG-a3jm{Za%MBHolgt?K9T~-bR!3*& z`koHFlRAcBG7DP6Av5U|;}se-MIa-EpbZEkxLDH8Z_--d`Ep%jSKL{%=F}`UTQnN$ z)BCzQzSbA#R|sM~@f7>d@95&kYFm42+S>TEtS}c#acnfVFxEXIJ&D#6;{5b`;RyM8 zB@6*d&9Y_cnebqAS{R4M&c3ZdC%L{mYg26PShM%=(IuUgVtN}!ZrS2aJ*O~Ue9Xym^qgCBPxdg5DAr2r3X;5n39BB|B0g?L>jbcHn4t*cwFH`T3f+*n7O>ejA8g>4(w zE~{Bzw`lBDdGK^;l+1MNZWQ-8dX7FJLW*`TUh2Afdw}`Gw`^5fdx7upKs1DFZ;SI| z)vKYz*2!aC^d@dMw=gB!)+7?Rpn&rUXNo$44k{$*O=ZI;Yhy3rp-Cuj?aNPct;`!T zDK9?ilymBtUjPvr2GtHId;SO+yWCT-wR>w{C%~>sPr2P#QY#(ar>WI=^6*3EL^8CY z^b1sZ1e!p-(z|7=!xGDR0m5T1zzE#jSp?=4>r7qb7aT&xriPRBRY%Vu}3_Z zT9%+F+TICcPid4cXINr>5@%EVAurV!ITemSn$$;j-h$K+(S)l9JU#!>@f5!7fa~`o zPXdgl+d=aO{Gn>i=M8&&sy`46X#sCI7}R{eU@)M01J%K5wJPNIYQA7N6jnn%f53O> z70;N!u(hXSYp;+r7H~xxB8m_AL9$wKz*b@$`flyVo7VuPg1FAn1_Ndh!Z?)$2g{nem=*S9S-k*dPsDo3{D25EYL zn%Qe~!BE&|Pv#^Xg4*+igI+X>UPY~O1-H2UKFuEllBl5|s^ai^fC!;LAn3?mRR9!# zI8YpaD4I{C^5q}2IHHEbkh~XY37t*fCh6r9h`y+^SCEs!W!S{G?- zs%y@gow{ox>+71DGqcjtLq#t4XwA5KU(%W@)>s3W!`d6=#X(b4wc>rnQDeE_P#i`3ibn($ApM74c<`|;q9@;wb z=u^l!LS|YgFv>k9$_L_RmjL9?dS@#}4Ih0rR>Jo5fey$bnaX0(v8Bh;v89fflzSE) zTQV3qFD>(;U>!R8goH$HqFlzi#4+HKI%Ko>*rKM6;TU2BF88F$)WqMZHJ@ z(nN;Aj31rL0TbjCy|rH=k5Lmg(}$7rfPU*5o0`R(;!6}J!-KUzAm9sw8}#{7XR5Ry zAGrg;YF`z&;b2wjpjMR^MtUt!<$*!JDjf1zr>v?1FkD-wth8X2zq&f-6q*(YRf9ZG zRpk%+z^w`dA=Qv4>!?^T4hLU-FrY&=A>7e~A$r7p!O_lo0Tn!<;DpSV5wmpF7xYz4)`(%0$R&1d!g!)h zDw$p~Yy2d`TM{ykHxlFQrISkAOKnDnafWdTDY=4_Tun-zCnY;%<0e`Aojm?`vTj$X z&7LQ&7ur!V4Yl#>g+wJ2h_;7NnX7h|DPAp99eBn=cH*T%trXQ+$&)E9qsBC<%%HR! zZxSL&D4q41t$_}Ka<+mQhPU5zDAWKUKq5)!`XOkQ28dcZzoiNpZ$FB zFC?`1VtBrk(2~pH{Yqk9Nn|?iDtNw@nAhRuNW40T_XcmU?hc+wU6i_7sOuU+T{l6% z&G74{E|nHvN$?t^vWQ<8R2~D$K$g!Cyf8?WAHwfPgpPj>@_Ye)FB0nbF@(JYzn9_n z3jCe`*muBJDFwRHz3|%yzn{YIXAt~z`27NY@4@ev5dGKS{{en~Bxa**{t2-?jVgZz z=)Vy2A$WB?3D5t4Og{&xe-f(x3;ch>?>~ThBX#``b^RBfwo%s?NEL{G9{j#SmD8zw zxoln~E9Pv)yjoUi>CNx~NLG3)_;v&rLTkkCWO5O z{s8>;!SgS`|0PiNw=$jh0sKCMUm2bF5qN)q-yh-kCz)y*o%k1-s#n45ClEuUg&wLf zcsc;TzryctG86`W|Agljs!^)FMyU2Lc>6CzzgVFfgkGXhY=DpH}I)ZZu-t(T;tjgoZSDUw>G!r!Kg6$k%oJnbu|OBG+0WL4KYFD68x zFkKufmY`=!c zMUr$YKB%NZ+Jz59*KY%OQmo&Oo}}NwJ?SoT{xw7^DxOiHS3E#2R%|u`zq`pjnD#K~e+c~IM@j$P=s%9WqA%7fUIjqA{R#3t@+1VP#T7r{F<&FE zlQ#%4_1$DU6vOr|=^r4ZsPtDnp`yk6N&jz%RPh zbK$)wyk80L*TVaa@ZJ~R&5Ec1;oT~{oxb0jGMRrp z!K>>Frq)Q+#Pe-+c7kg=E89 z@V1O>d>gzPa`J-^c!Jz`$~)j6FE^gL8-kaR(+1#mk=*!|`v^DSbUNOPw?|0v6hhRH zypu$TE-R#N7m3Kag6DBpC?+1hjm}*r$;zhYuWB&DDw|?0D|7UYYnr~~fWmg>3!57| z^YL6Ry1I-mRd(jHJM(uBG!S-I{_eqc!tT!BJ=89$Ud!Rj^-NCKMq8$}9Q1B>EV~&J3$mfzr345GG3nPWn z9QFh^YKOOc!vOa(UhIFBYsC~M^j_!BiE;JpO|Fhpguca}6XWaI04bM*W&llhK>{CQ z0w0m+gv100Hgphh-bTDXhVY8L75k8a9}~8pLktu?hmoaih zxil*>MVrIUl`{$KW9Q3*c;#C`EvDNF@M`u2a&&5BDv;+wIa(H-R#~%R8sVBQFXn1C zQ>DFGhSJ_5N2e#I^BdPtV{;Dhd(J@Zh;)a{?vgi6A84P>?iT4RPo;AYSFxE&=ZBci zvohWtg>)RLbY9}=tdd@m*(>s<@`3hp_Nqu{bt;|L_yuaze?Ji-?Bx*}rM)uysT`d( z5Sc~Fhwr~0(satu5~cvi`>(0}CU+}$hYVq4EgYoGoD zc-dB0@`sJ!}qvI0e9@&P*efE6#gz@%g;-Mv?zwuX#T7p2IrU+CG zrT+{|KMpJZ3bd^AZzz4agzB5iB~;%mTEM@70^7)c6*jC01h-=`&yvptDt%qKKxOBu z7|z>TbY@~^A`}TLkkfW`sC>8x%Eiu8%ZKaP1tY)~A{Y?mLUky)*F6a}JzuO^xDIer zLzk$7_3(M{`Q+Zg7PaJ;!^7-yOv>E^AFot79SS3e&Ht!ZtL$o3P$CJfVh5m~O7)uD zRIkNUcUY-v#hB{1If6H-oHRfuXgcFzqOJcN+r%yvwV$YhAn?sB zk|@uUkaR!MzOS+;vx@b7ELN-TF2{2HfPZMw6P^~8bG09;EqXcGSr1?>`ttzSqC)}S zg#tdR4!w}vH&iZ-{~vh!vC4f@7xaW7b2A<7{L0q0YHBejsjo70YrmQ;9^b0#-4hq7OhFt@D!GkdUmD88T4Gv zqUS_KN-9azZYyvD^i^6qC{hbeYKInGwmY&6DKuGAb^8Zci??biRYu<;2NJ3|dIYnTfg{X?NRMG8(QgD~7Oty9dLH`A^ zua80!mAxTIqNYjmW{M;#CyBz|(%kt-k|88Xt7_3iWdoS6V$ozMhbHf4(?nx?1Whzf zlb>nPlaMBy=qCXm|An@koPI623237=p>~Val2$COk`z5fAa$)YRfUG~IuhuEbVJ!m z$Ooy0l4>F!XzceR=qY`a)y^ayrTorSSbq>-&{DyIPN~Rmc}Ku7f^;DJ=h z9@M!#^z|?kct~H4_TxZ;oDZozo=WX;k=o-Twa0b#6ps&)BO8=C>}iZOOSa1KBOdD^ zBK=5b&j~mX&H>Ac6vWG^bYIrls}{sYgqWRzcq;|*md@U>AWlYzIjTd`-%_!W>Bz8K zDf|o^SS-C^rLFe;a$P-*q<%H)daZz|LPw@3ft%>I{O%*DEmamano?mBsc;$ z8cb(QA80Z70A#WQx{#@Gpc4{Si^&J$4^W8Gh1i4A)~9;(lopeVFQ?9moT6abpTRK8 zS^DRC3q_RvsaF6>ZZwAQg&sW(k~)nb;BX4?Tq*#!Qv_reQp{j`TD*go#8>!hiS-Iu z;z&ZY5k{fVb(PFJ^CqAgLHnxjK z%UbMw!gvR5!Hc|eaUOOdvaUyHN&NRQC{AB1N4y z3HzR)4oFl;9hFn(X)1&(5ZF*)eufSeP|g`RgBVWMvmes5*b3b#j8~A4(^8!DRhr_Y zZxQk;MZJM4S08vmnxj(bRmxtc$RaIK%Hm_hnl&Krf0L$p|J#K9gl6%6=xl&4GEa{1 z5JIlx40k2L%-A04E*+_J@TVzMkgfilMon;#b+TX3-RwOYjVI#lmpqphrdm&WFCMxGKd`r2>rREiC6>s5Mm`Aktre+=GOC2EB?7M9qZxIG+f)Q8V9u$Z8;B z;%X62P|Ag%c!074sd^Y9?615Y_OZV~xrTV5KC`0rn|s;kbTAqoAr4lzGf-`#;eG;x?=_-l zLU80vv>#)*cVgIshGoCRy#uhi9y(~tUUq{a`q7|erxfjv-Ymj82Q53LXn%C42-`Af z*(pW)qj!j~u0hLADcT>sM}&0`T6Rj)_D3~te^fK%iDwNDYk9-N<-^0l;o()o!>z-^ z5X2raV2qisJ2kyu2hu)iaKU+Bdg25xtvZeeW&K;N0imMR1_5^XIdELa+fRN&q$iF2 z61`vzyfY0hlTeb>s+w0=wE=K%h9M0p;(ZR!i)en7PCz~et8`gtaM z&cI<~AA8Y2{;#>KIsgAXp)VOY47?2PN5p)^z`2&~rv`h;KvP2=M3KD;TrlyqZ3R&i+u=~?Oq__uMPg}K#~7_5eeyssZ=(y4~-VH@=v72R{0QVF*YcC?(};D zmz|(ZvQLZ_mF)*7(YxKE7GnkyZ2NYr_pk$qXy5htJ`Lah%83iF1qIen6D>vv6y~;( z?Xg~$AOPt?B7Q8EO<-eZ!mI} zGRKXoD2I(f4B%*gmd*gF@HkLmyNMaVz<8dCIZ*dHK5zb**v~iF`8>>lYF15lfjNkS z;!ukNsau3(yU=XW#rxNJ^5>f^4oKe7;=ttJfaK3JTPTi&Ex=mF72g3N7eO2>(WT}f zjs(syvaL^u;|h~qY32@IdF(2)B~Nq`7`(2Amq8e^c9<|^;|3fP3(p55^(;%L=^y*h~$$pAqt76GyqlIN+8`IN*Y-ih)lBlB} z*&LOX`~y3<8U04&8_*-(G~ND@qv=~F>h6u61NpygEz-V>2yZv;7dg4C4OPjK=5gOT?dVRZ&B0+)$x#f3w=)-!XSm;KvCXJhFe} z_Kz((`y3&3-VXl{ddNSaXJ7#D8~-+E)sxd&&-mv5=x0l$Lh2`yrb_1$oTzRmlDt?t zk4UO6olhjaRPw8art?}q*T&}(=@mHaMHH9e&b49P67>3I`CJ=2-zExl3C;t~m6c0v zI4)df!+C{vgNh*nCloo*=O#y8IpvOc~ zt!`ZHe9~624aRFIEwYLq*nlNcUhU7>pbrOdDa?oaL^d>WXA>I|I1avM+f-t$oVAy5 zUBf?t5Rkb_*xML0sMs|9BV?vO7wtet@xhu{mbRLFKKXMSpHKdrHwYQM3uWa!8#V&< zmp1mE?T{16U)uOY@>dqbS$zFa`;CqL#wHe9Pv;D`QU5KZ_P_LZHuhWF0Is?s66|-j z=qxDaESTXL>;qei0c1jpg1;Ay!mt{}M?gRT!#eu|0AYr|v85Jik%!&{ZR#(!gC|mF zh=yZ)Vq^P9G#ryL8_Wz-b#cHZris_57@U}_-7nbkU$IT|YWf>?0cZw)2Y5c;`V?!* zrMRs<+eE`?ARd#`$5BD0o&~ACzG)XJ|Dt^tZi|O?n3et-XKNqXQ-kF1W%7~T8Ur=yBRjj%vFSF#ZgQkH z<>BRzcHEW!vwaiSJWtwhC+siw=g24V|MO_#xo z?jng@B-wr^VV~Hecap@NFw_;*W85c@Cta&is1hdfNaxdK<8piB#KS9%f@`fdlXm3tl0dr0IS0t5Md4p9ck ze^CnN8HD*^2Ig5u^gfcf4`Gf+_H+g=Z6VA%8JOLU==~%C{~sW@@?vd;L?0xH2MOmV zXpuef5UFPaj_AWA@i0jTJ_3R7I-;6LAfgdLl*qLNb36fa3_*^+!W@5-$?<)MfD?4! zSvoPxY&0PL;#B-UWBiXZ@jpq$=k;;O_$T6e@Qc`9cI2hn%RgkYBQGUQ@mBL1k#^*< zYx2^mUkl%}iqx-xjB`VtFk!$~HTdFKFQtq4ADO&#P!V6sW3Ob2`06M{d~;+GLsk*r8l{K>qZM%|yNG+Ti@5g?Mf~ZA zB0fb%DPv8#jGw2=I4qOT4=Us5dF)@AGX8s%G7gU{<3g*9=QbM!J^?i@oIm*PUyLs-V^oO~OQuSGRV*EwJZiHHapZ@! z{*%J-d>0!|VT3rI>jE6lcUf5H19EBdkzG01?m}!Ya1E3X7a^J#xdaP?z>8hEXkP9* z6q;AMQfOY~5=bDLb=b>Dw;e%86KUW#6%4q`5RlnIFtxHvwq6 zelJqk%`U88i1b|-He_61<#l{3!ilPdR=(2(&vW;}+w*A8_)fwN8t-yh95!7mxJYz6 zVlFBM(Z3_B$T1YOM-+KPM|i-66ZGAl0qkRYMIU>}l^Oro!>+8zd;u6YvmbF`AB4^) zv&UUIUD^WSYs62uuY&u*Cj`49>p8OR@y!kZ!F zAEOY8@?1YhSeRxy0=U7SsX+Fh?ACLo!u~5-kIufZT8}PT&$({*LafCWm2dTGq8`t4 z=f*zYZNKZMWdsDpt~W+=6Rsf(kdfmy_R-XXTgW=nskhBR*Gu z7Fv={l;@CX6Xkh6qkjQflnq;#UMwv~22%^o>NYp-A?#syxT7zU#EZl_E+yUNW_P*M z)VUTUIZmBD>>eb}fS~JrZs4c&3NV33aC!LwcWS7+ULg;-tw9ci>j&KKO)^aBA9ZsH zwN*5zJZvA2b5ihk{;e%BZYP%Udv5nWjPi6&6vrgo4mvo>E+pe+c-STfyy)w=^yMDG z7EmiJd(nN^e*co&J$dBV`ieV8?sX$GeJiJ?+1u_+;~a3ii?Ian3Y0Fivfw*fd)+B% zy%jM(8Hb2mFb5Lnz0pg`eswS%e{%>r{?6^biU1bBcaO@1uP+EeL*3T}c{;v<8ZokU^ErCrv9{FbiP>r^ zM?|tApwQM*k^{CZ)*EZUY>qnuZrM56GST$zzFzS1&g$vtjiA3DqW0eIhj`QEe(! z%FF^nl_IK4q^g&yKGO>k7f{U)Q!Nc|aT$24l1fS*$iRxL-$``a`2KvN=S}G^MG)IG zd3yPbncSVl-3so`o|ns$7fqF5NYfO5}XJ z`J~88CA?pbm&YQ+sS=dFNdemMq=rc)T-9;rXx8WVdSsnWJfO2x;tbj3Cy9~b8%&VaEJLSUp!$n~tVjO)~g0FR%Ij2S~_>Xh5f#;Jb< zlROYHrKplnE&^09;x~P;I7=b5D|l+9(iJe<8 zu?iS=bas5S2)!wXh7?}+f(FA79HEOTr+dgeHi5T}nI1h_w~Wih-01<5FC-T{Lx1MU&Q&RWk+_lm%i zA@EeoR0pQ6xgqd4=ye90hg@hra)^|H41-OKnnH#H2MuHx5GHz`hmO+wEZx{3!(~j_ zTlUOTz3_zG)|iU1@ZcEvbxlo;P0jTUYt}c{*VQbmYm)5C)(NBT(EZjQv03$OZ9TYW zr7~P}aE8#Z7L66TQA$X1*xn?wK%ZHsxM_pm@}*j;xS*`XNwEp54`I zM|P8TjcB|F3#M~N2&O5N<{ylb67q%%G*Y5ywi5d|yWtp5N=a#6sk77= z?=&VFlZ>*Ga$}BaCtSP(Va{f^5f}yVAhw41SOYH2S~HyC(5Wo z$TgM9)2KXyx@S_kg67Yr?&GLjY5Ei@2dP?Zx)iF0&@dhFMDX-{i8x);`wNM)U~c~` z4A1aS-6Nl9Z%E}laeA-ufk>17|N!_T!8_XNej753Su@6ASkG2 ziKG=7krd6VI}d2g2ZKWZM}Z)hLSf`P4nmg*L3Jrxy1QTA!)gZ-3JwSSp4zggwi`st zdRE7UPnqiUDFSg;;@(a#9`otNb3VOz)vi!lxgT(C+)s+-wQTk7fjSDZUt`oj5fje~ zuLZz;?lbvOfeA_zNR#S1)-*Vjutn_&`$do(TgMY*C*w7WyUL})5H37U(N1NjwrG%v zyA0QUz5-wMyUNKu0Dy-yqXQ9#GzUQR9ldx+qg=;RaBS_+j^2GkgNeN2E8wk#4}6MF z=K%VfvB9Zb0=+$b2vB92kt`!`l`v{aP}s#!92(a9H)AgXGz!=n1_=4Fi=madm3)pmBo zyL#ty@cGN)ogLfaJ!dy`E$i-U=`C)mTil=WPye1^M`_t zIPmPQws;$I?DTBi6Y`lo-QB&lvA!hm#Za~1bYjdgUY zKA6rrvT+$@$Pkj<9ZxKX`)&NV@nwxeNBxsb}m$Tj8h zR4%3RBq~pVSw2;!nPo81pH7t-s$h?XFy9H!wmjMCcI9)ofV)N99mm}X+?~kX$=sb< zPG-*HPZh+GXM#|zYg|W%EX?OA2KQ8x2WmFtoVuOA!1P^?$f}MEG=erWQLZKqWTXZp zgj4hhf{{+oNaAxg$(4G$C52PNd4K{x^{^`BsnyH57)}ivgmysanSx~k^PLAAgtC&T zQy8P;HnI7FYF;9bJDiP7Zg&8b;3Lmkb6*q?xu}S`ihH|TyE~H$+B#Z$7hoG|i6zr) zWb!lswI;J^(D?|uFb!I}U_%mTj!>EH3!qgmh$a1~XSuVZ1z#5(DzinY6wsU|8sV_F z#f2VaT+?jE5Jz)X(A*=Ul1AU^rDKSJxujPz#|jT!$9rVZEYvZFql^K09G1x(f$9s6 zSj84+kwYHE7YZqXfLHNXg<(?cQM{h;_(Nf9q-iWzjU4o0XO+d=7v{Ud@TF{08TzZr zJ1%t7i7@x2sPape6vgOQLAX$C{i>umpdTrD{V=a}a*bq%p9_x@Gh%B#Oby;Q$r1^T zSZcM{QS@3AX0)Xs*eE)hyhL?P3ODGB_A60=j!w~_ubNVr1F~BA0fiZ21H`}%X)qJ} zo^AI)J7MECN`kfORtW?tvI#xc$Lr#SZvZ2z|78cY>tMPa^zygx93; ztQ6p7HZf&(65(ND&Zh3>GiyCHgI1UVGiW1Wc+kNaG=(t2`*5go6j{Jxoi&@$)~zrt zNrr`4$$R7p*+bgGY|zr04eJ}5Ya7=@8kTQps$0fw!>y@XwXSacQ7mRnT3xedL(QsH zr#9EDTi39BO-?#e-7$#(i?Y##rh3d~29@THHoBogJ)|sq2G>+M-^MNzfWM`CZ?9kra3K(|9JJ-c?R|9jC%K&k0-PwS)+Vr>LRF?3Z z33X*j-i|JA>tfEKV`o9}bz`wsk}{2FrehVww`}b_dszmW z8|NCMg}iZ=_Uf$YT)NC%)fL8n>{%EotGYMa0H(8hGeYPcNi@l#HpBajif?+(sVMuV z@0>Cyc3D=Wvfl2pif?+)shBT!KrO_un7C`kO_~&BQd`&nsRMFjBo5|sXvhv;frkg+ zwljO;U+aTZ*LQ4*cZ;peLqy00#MIG%uJc&qL*}8ewc*^(&)G+FR~&etSZEK9EtRYo zm_%OId%0I`O&&usP=wKEg5#{{YvVnM?w&0;#Ng19)MKq@u1;=Nwj?)C%`}%-X2w+3 zov@mU)zIS&ZAVyjq#em+@s_^LPD_2Z#dB<1wszEUgBfiU9&tpoZ|#Zq_MW{Kx<{|p zhH+?n95*bI1!GwupOj7&{Q+}9^pN7?eD?uBAYUdoQG}Dgwyu1t=oYjPc zPJ2gl$L20H9)VwTrs|_F(d1iSIlQnCoL&?twpM(yMgrhOMZmv0x@yqC#IiJ+_8zo% z(%#+E@s0S@Lzjyu?Z^z7U2O}-GO%PN?y(5qJ*Vs}7#txICxK`zeLaE$Bd3La$WK5N zWg?`9xA~6jp=!Yq<%`@_X{$Rz~@?Sz(+8 zX>;0#=@VIYd30z%FeDsiuo3`yOJPb`6{zcKg|^sZ^d+&;a66pIBup3D5Pg*2R21oG zT!4{}oMhV_x=kW+-iGj53_b@8gT^~5^54kK9Rii8smt~g6}oPXFP4yxC~ zj5=rrO7Jau++#IhG7qgGRau9_^%nY)NK8G}xe;AS*?xfBJ%VOCKg zyI5Ctp4icQ+dCjBJ_8Jng>@V>2P#O5=4s(tOSX3;#$dp9;aD;pU4C~Vvw|8;ec-kw zN3N8XG}WE7p>Ey!=JgG$>l!ztSo8$6Q@FmaxfW*Qb!*l))T~-(eVI1OmsIN)5YF1} zEg+DzSveH0sjFMI&YIm@AS!YoC-%?G{3Sn2@?6v13n62g0Aw?Ev_6?h&^NZ|**F|_ zsjKeT*3(C|v6YRzBmN9%FEDql6E6ZC{NUo{#U^9HNEUJXsT1)aIluI8<-3i|9>0)*xbR|Tpx zugB*LX}oJ`J|947-l|Z*kA}*^0TnH^s3D&>s8&~ns?fSx733HU`GVjE1Aa9a^jE9l zs;W`Uw^dhH11{CUDoiYZ`1(C)0nO+2`ZZsu+UFa8s3Ax51p{HoqBnWTcPwbfd? zY0K4Gt8Fd+bMAXHZzc(g{{H{ZKcCEf=iT+(eR=18k6K$-U!~SnSJ!FPRhVb3y0W1G zeOK32*Qi+THEL~j19DwcTV3THeh9=MwKcWb!^~@1Rb3_Nzr!*>E^6zsJnGO&t*fCT zt-*q{g=*`okj=)*+DcDibMhpvd(#Ikdk3ks(JUo3G@A*9!-b9_n_ zj7524z27rd7eGOK!Rf{sMu)e{yU}y3Ox?uNe#qF5 zn0gNLoQql73@mL6F!elOUd*a`K1Q+~?JvOJMfkf6?XN)lD}i~g1_syQZwJ0#kG~u6 zSHrwJ@o_p+Zvm#=isU``+l{|_@wW$k-;dA7@c9I=yq^F|FK2nrpw&q%9r=D1sh{HS zXZU*#S$Q6xKgZuM@YlrH3;1{$TyKNSQU;K--{Jd*`1=Deh2!&ImX00ufB4%hlM)@K zUW&hKWM*6^vk^DQuIpr_gv4hhDP5A>nUb9D&KT8~>y@&KBuLMi(3gv*uP;~1n2PTi zl}Nd(k#g6OT?5%2N7V5|oq*KjB}h$PO4Krp@nrIQ%H~`-z21Lj-)XC)^s_LHs);Z2B> zZ#iVtA^RQjm+%fi-af}-zeB$3kiT-sUpwS`4*460eBU8|>yRHf$skbiT?zdPgshy2VTKX=G~IOG=&`A>)Z(jmWc$gdspKMwg{ zhy2DN4?1L@94F6p$Sn?eoar1cW0r_PpKvZnXUmQrMmMMzDEF$#US-Qb!zN6H3wfb?{v zl+Kn?WzEw=8c0$%%$71CZ6hfjNzZPQbja95noBa<=SUflRUkBlWUmzI_-;6nl&mzi%_6iUn3gHD#!Q!F@B`&YlKt{zSpk3v zST%Dc$vEcN88c@!&7M;t5q`)>OXy%51ff_WsRI=*fuLLrme>Iac##PGb)*mDQwWj< z4C{`76ju2AN>C>m1HU1Kb$)|T;&CHbf(fJ%Lg$-FZ^C&pfkBdVf~IP^iPjg&gocu` z{{ZAl7s>~~i!GmDEWAatXOa+Bo_wjyFO^ABYp*X~IQTs(2H}^yCBv0El2p#|cKfu@(B^@BpoM6UFp%paBm*-?Ks zhI~X0=8)i3IEOzU<1fm=Oww=ivK@%--@Yna@Hm9O^_m<5=-(?;667mo{0%$O5g6&) znEQT_`zW!=VtM_D^7^q%_$;Kjgt%Xc)}JRZ|GCV+5FVo0br$nq%KS^4$#UUfGx;w$ zSP%^t@UP^+NdHKwjDHJsj|3KA>AaTK!j4=fYw(lPO4Wce24H5&0b-p zdY!_rQ>;{LgoB;x^-6G5G(3vmpu`fpQ3(`A?Cn;|eN*8tD}fv{hm_;&iKF)-uL4z$s`pie zUaj`=ni3pc6dujrv2^FO{kzx75;bOA(}nKsvxd#Zu2x> zIM@~R8Fu?9cKFZZ74!uqmL5y&e3c;W)xack5+;@rOYBnBN$gUglmR`&6T4F7SE^QG zCkY2Tv8&YJq-b~&zgmqYwu6B9Gvl3`65Fj(absdxG3#HD^^0o2XZnO{6-`fli0b}z zHFiII1-vdG0ka6VK-?0~m0nl*n<5Nd%g)wNj~LNUA^z%->N1 zx&B%OAQzSV{no76lbEqNjmoYP3lxR7&;?pFq9)MNARsOjeYaetc z`yZ-k9|39~{bohHdHmDzRVfW_p0TT8)U&E=3(`Emzf>(dvwD5jSgNxY`75FKpgg*$ z9FPnCwMc8gUn2=T!T+gIvo26?)|(AxqlH*_(6Ktbv5cRq1*VzP=!P5Lq6MdwhNtoK zw7_(8del57aIAUkHvbHaXR8*RSsI?n&({L8%vl!B-8L=IL~s5k^l*U|oK+N_#V^(Z zv(4E>ImL7*S&Jf>ZL3I_gD?I$P$n?suF&k!>}oBL8klR&jrRNJ$)agpqhZs^rAco& z7VnLun&BobFyEZNBkNcUd5adDUlN|rcWJTSE$}C9)dJZ?RCgKqLTiFE4cx9d)4-h+ zw^vLjRCf;x4EnRBhc&9Vhc*7FCTe7X)vq7ZM7{MvV#O`QihEoOE-DQ#;!oHG_LN3N zdYpNjd3>ytpLVRMl%Gu~mY+Gr^4y?e`FX5ZUZi3C?T}3;tDJg}W?7W_3u*MS-^?WfkY_*(oY?O_5gmSs`6|JD?WbbOqdB@5 zOX)*VN~@#~HU5!ibu<14EpSrQe-eiInEdAB%1OVN`u5+2=RE1}8s}J3rC3w{&;m2f znHEC37V8&Yp+rEG?{r;5qTyK?1W54TB>&%7{x41T|359Tw8Xy@SviP> z78Rv+E@A4AAf^Je($OuRF2qSv7ZEPEBD_Qw5nkm)NPzs8>Vc)DBErk{zzTCkQ8oc^ zUa1FHmV{UGtMynS*H9t_IwsPMiQH@_a8@t>@f@!R#N z`91U09a*E%>tZ-1zi zKTY0*ij&Fc?FF519d!#t^krR4-~xa472TQz0~qtG6r_+e4(+45d{2+5n+lS$q1!-u z57W3EfF5^%{GQI=*R4sLpoq%)krXrQ@9cCw(1UqJ;k=9%8mjIDg%kp z-LR{F7a_iXtOtUNf)b^||ELcHf@aWMEwDcSq!Y-k|NGcI2-fK@)@z7>QZb2U&EHHo zl%HTS1K~XWcafE%Y+~Vnpp(~boU%7s#_au!viHr9?0sWp?;9(7-{}0{knH6O4FSOw zJ}tb0Z)U-kqHs$*f9Erizio`4&l2*tjXC+-&Jy!?0ZYo?MJ%4bi!lu=e=GPUn9M-9 zglnX*mEuHOWa)v>`EKFz5J&BXYaU50BF zFJ1U}iv><1XTK>0{HA}K7;D}TA!uos_a4s9zl^`8(Qv(Qm>@!b!uu@PRupdI9}o}Y z>H5zj3eDUx*!*b{$BKIzfHVFTi<)b!Iwu`|{qa>UvA4(4CiriQ@f?~2|BG?2kiu=^ zI`w9Q9HRa(^18*C&$k&ASq|-swi{83BD98IXaw5LcI27H-iy%3>47uMGt3UM4K?yh zjKE5BWftv4E{i*M(s+Q5m&a|^23pJ(w7J3vt}LZt$*|h~CILSmI28w#_*_8qByOkn zSRMXa!`Z=HFG888#wQgVsAEvIv@F1y&m(j$k!+XQWpObjJ-5Ui4S8-%KFt?yq1ey`ylN9b;Q zjKKH-vAVyX0PKrtK);K+?&Crrc$)M$0nv-8K8G;Ao-%@BMSvT}r;R{1tzw8Fe=mrA za1 z=}m6ab%#&+P{|A@rkEt4Hr%J~nBbQq@LhRSsUKbpEJ6H!;t|FRM{Y1CrH+-BO=32! zc4@^f4AROZ`<;&WxZH{d6r1)+`*$$eqw`3?3B(mS4(83 z{_qJ7CpagXb^2;s%G#bbV#3#>onq+i5dv_%T}AQXb*d$8eS|KRDBWrYOcEh+i&4Rn zvPdX(8aODyc%Y(Q@;6lz-V=c$G?F4)>WX{J2(`9~=m?>UAiXpZ+4Q4jbC@wJiLtKk z?%^2ACeg|DZOJJU97pf8qfdG80w5=;gV-$~C)Vf_TSU5vExoOEd2FRL<4B3NugAsM zv_rM5_&uG(Ya)%`K2AHj!^*fV{BAOC!>pt&kfWN)TD7{evF=c^YieC}O`}><-%zhM zR1#KPV^yu%P*GE%R@K&43Nb;gvbv$RUaM@ZudmQ5E2`1Ds;;3*t*WZ6(<Ke7G zirUI5wXvGyzA7q6&aJYhvPP|`CNZtNRRb@pZ(hc?14Qh2G zGFn$tSEp9jW8C!>6^&|bO;yEE*|n)@CmGA~mKQ)ldBMpAdBzH3rMKB=_pbMz>0Pe4LD5pv(n&B0@|QEPuCy`+ zF1nGfrZOdyDOm(D2e}0E1O-eP#k4{OMNFT-lu`y0nNr5sRHjrgqmn7rOsQc;9W&~g ztC1PUFy&aL&0xw*rp;pRIZT<$lzB|?Gxq|fEM#yTgX0-HfiUire3o(|^DG?+OgWV) ztC$jGDXW?CeU=kqN(*DHOfeZ-!*at+S0!COB#V@{i77v1+K-rW z7E{h<%DEWVX8di(-v#&^&6G(@xgM#zfXNR5%YOuakAmwFkeT-}$fs+%;(ER2mcXTD z_oYcGUZhe+AeA~2snjtVM zFI{pik|ft+^jUCv-#8V0Xj=DnIVHvIZkTdL2e_Knk*9Oe(-z#fj@pKX_d*a?g~wh5 z^2Kl|TmqLtoV*;a07$>mvAD`1uXf059CC+4Uh9z8Iphrvd80$_bjX_=@@9v;#UXb& zgs@hhr@% z2LifL_}S>GPsl|GAqPcgi%D%T&;h5uk8l&u2fkf+u)lYv!-c>v1p2DF*Owt2{7gm9 z{2~ad(Xh%dhJeveV2S)vu!I?OmQG6NNfP6Bfm%+&46(#^CnUBT_#WXQp4k1s@3#}n z7Y=q}4?xfz4ZHb+@x&e$*om>k-lD|z3I(K?7^B2OXuU5Xv3;CL!+=yv7_dAv)GRC<5+}$qzKcfvk}z70jloL==NTn1 z*_>RIeFC+xCGb;)|5PEBSY*4oMaw9~21}n*MsMB6pHrfyuirlfc4X06{qy3LJocMY zLsKzem8NFCeej^687hC#NtxLxW3h?vJg3O7kZg%nK(8o)QHw@N$TELb8Ss5CRL);h z2JA+D8h>5EMjoo*Z^Z2a{7qq3$=^~2qGna7n#4**4n#{!{3F$}4Ejnspag2n8h@=N zJ@89~G#C2X=#zb*!EC@l{zerW3YKNmUxxL)pUN>)!E*e7I_3c(P%?_XX*Ea(6l#QI zo*|Rjp&U^77eX>7_Fb!4#jH^m_@^?T|4TVS!(WRYzg9$-%pvgfZ>*}ez8QH$8>=Q8 za~gWC76qoBtMY?(ft{-cru(N$#2(+QlHSr|LdWne>fUCpf8Mcj87VB`+f?d@vA4@( zZ~RJ}OT1bUG&daG)+{aaOjhe|_Q@j;6XQmDl5R0A{28D#y?`Yie!akpwW=6h6& zm)&aMSiueP>!$?nRp;~jRZ;pgCGoBA0acWKBv$(VSxOmyNTvMK$b%!%!F*;Q*N?V>`Ow!%d;dc^D{L`w2Dd@i;+I+{M^c+l<;v5 z(-&Ik=+ny!NnF2ZalJ8#>(|v_R$z89ESe4BEdGX-hbFVhoI?T_{&~pKo5IrX$3l8b z4bCW*!ZUc3*vug|Tae5B#O1G4Ye*)A7VpIqros9*R>C+DC#L+{!D-FMw0>u$wE)xl z068l{o_RKEixB{7V+&GMU)pqi&J=cU@3`CRRorq%PImVnI{RuLW?^Q-K}ptf7XWi z#xwZa&h(^{+i7vYBzHmF|@t@?@pDx~{>9g&lHYG5C-o=^QZWI76+hudmD2AYbz`uk6h*3cX|U z#tO{QaRpkz_<~|%f>Gif>upd{KqZV(51ms$=196Wg$qU1#bh^wR012-GMSpoR4-k9 zQgfI(lIf!u8_m=ry1rCu-;{EdvdmhRS?8*inOe-U>RBdf+o0_}&NF(N1a3XAFH3f3 zWlyAAFCz-bQMXX=g;^oY$|}gN7F3Ner$MgQ<&r?nA*fL)ML^Px|m)JZX*yj1kuiJrR% z^4{90F=GW2Y{lhb z7_jeK#>ViViGwW^`EUbnbW zs~hVp)tZ{hO0}}Fs@{_rCTVsyzWwwuWad#TE30a9?ep){JYCEr=>-`DnFUz|*+!0$ z>m6x~$i7ca-<`u=q6mk5m)H5ZU$l^Qa+_cGk_?9M@_qnEs$)-}Ss;RCOW}Pq_gxM&}X~LWh1tVQJiD-FZx=9x( z*ZHJ-MTS|@2uT26%b*HK$O19t5F{is;)jBUD-Q?Q$vBH#1VK2NjsxR*4rEm~T$j^! z>X?{tr%W4RLptUFxBv~eJcG}$@vcqH)YtFlvuLPiIMmM>*panFT!m2P9e{k*&*w!= zgG4y}0daEGteU!C28xr#rlcFCT@TFL~P);BSN<}kVUC7r; znu*3sD~X+zbW^1nQ&L*^_lSvfWa2c!i6!AfzG^;i?l&{H?&mF5@&mEdRo>dHuFoP} zou+W0#Md;79Tn+g5#ny`7W}p08jHzxQ?f3po345E@SZ3}yN^dGY`?gUqABQcB6|Fx z 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

~0h}jbwSe;hs;-5@3l#Tag}8J4!)GZ< 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

hJ&y@SE++|eXywknW1YNUHNmX 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 literal 0 HcmV?d00001 diff --git a/modules/swagger-codegen/src/main/resources/flash/build.properties b/modules/swagger-codegen/src/main/resources/flash/build.properties new file mode 100644 index 000000000000..8e77d88c9610 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/build.properties @@ -0,0 +1,29 @@ +# Window and document title for the documentation +title=Sample app AS3 SDK API Documentation + +#Path to the source folder where the .as files are located +sourcepath = ./src/main/flex + +# Class-folders you want to search for classes to be included in the docs, seperated by spaces (for example ../com/ ../net/ ) +# to include every .as and .mxml file within your project, just state ../ +domainextensions = ./src/main/flex + +# The Location of deployment library on your Computer (PC/Mac) for compiled SWC file +liboutputfolder = bin +liboutputfile = as3-sample-sdk.swc +libpath = lib + +# The Location of the output folder for your generated documents +docsoutputfolder = asdoc + +# The location of the test sources +testsourcepath = ./src/test/flex + +# Home directory for flex sdk, change this to build for Mac or PC using # as comment +FLEX4_SDK_HOME = /usr/local/flex_sdk_4.1.0/ +#FLEX4_SDK_HOME = /Applications/Adobe Flash Builder 4/sdks/4.1.0/ + +# The location of your asdoc.exe, change this to build for Mac or PC using # as comment +#asdoc.exe = C:/Program Files/Adobe/Flash Builder 4/sdks/3.5.0/bin/asdoc.exe +#asdoc.exe = /Applications/Adobe Flash Builder 4/sdks/3.5.0/bin/asdoc + diff --git a/modules/swagger-codegen/src/main/resources/flash/build.xml b/modules/swagger-codegen/src/main/resources/flash/build.xml new file mode 100644 index 000000000000..6861dd464ece --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/build.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + docs created + + + + + + + + + + + + + + + + + + + + + + + + SWC created + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/facetValue.as b/modules/swagger-codegen/src/main/resources/flash/facetValue.as new file mode 100644 index 000000000000..c6bfa1f27d19 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/facetValue.as @@ -0,0 +1,8 @@ +package com.wordnik.client.model { + + public class FacetValue { + public var value: String = null; + public var count: Number = 0; + } + +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc b/modules/swagger-codegen/src/main/resources/flash/flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc new file mode 100644 index 0000000000000000000000000000000000000000..e41bc68abd969ffbbcc736ff8543b6740cb94ee1 GIT binary patch literal 194680 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

h-lptIpe;z<>mXEWr^6cO2Du~P4-yR#jS!6z zjS-C#O%UxQx{>G&L^l!L!s_aw$~ATeIUSNJQP-Z;c1boSSD-GMVna~~YTR3yrfq?B zCbKB0gT_6mw`LXlPg^-kK~N>#!Rp9=qjRn{8R~rrb3p-@B%69)+aWNCt2d$dl~*U* zO)yGYMniQnMOHPxP$xr``osE>94_iIv0~);)9+1bYcFQBZw;t3{c4|PRjrDC8YLTLR^ci#St$uOkyd1TD``pzzHes8 z_z|W*!irfx#!TL4*aFPo!iYOUEWDK&>`AT7CabEp75G2RL{mJ?^!Kn_!R=(#*;8c= zknAk7y^zsJkxU~+viGu7b&e!3q^D-bH;2aw<L4A7STBu<~=HLRTLAnYhG) zWDpj(BYme`+r-t-3?lGdyBW1>$tGKbe;2Lo9byeiA(6{xQk2S7bl)`@yDA=ClcnNU z*T@J3jHgY@%gg6fl$Ms>c69J?#m!SlM2b~z^LO{@J@7Mr<%~o^0j(3Yup2&m~uM>1$lkEi?@toi_~{W;KDR z7VrlGQ8nfd#neb75?AAiC@kj^iKvQGK!abYYECUV0Xd}N$ z1C~MtCR-g=l!0xkX42|{VWVnCZyk8{L=rHqk}FkQtL9oQS}7eW%}why&4nHpOS5j-YPEZ_?h5!-1FJTx zy)IiJxf@Uo#FvH8(#Gs6X16v&Ot;nEmUXvC_H|Nz1-D+_;O__!4H69z4HJzJjS`I! zjT21}?IgO9=oYrpXR}JMmULM5qsO4i{VoS%UW5~st8U>MQ>qd6Q>`IL(OLuowbUW_ zC$C4CPHV$0RtvMOxW%F}J9Dv>XtnNe7mE*IA*Zz!oDFS2(VpR5C@D)>vHvlY)Z- zIcWG47a)((TBbsJ3>_7U2u=fvQ`JzO@pg!S&IaL8(j}Qz1?JiXlRm@HT{R^wVPsEW zM0k!OtdgEXAJrm)2P4?b2-C(wYMSXYMuakqV8{BQ63r_{gjZlC*TP;w07#>b2rBsZ zv{J%?mO|W1SWsPfwXOgrPE-H>lCj46cVQt=kbI`4)T+!Xf6ABf5usB}v>p(6SXue< zlrIqGd5-2q$-3oa^Tmmdzh-I|MY+K261##z71wGx6$eLA+^dnvzaC1F3+NuqZX7Z7 z#uFrLguQ4r^U5gH6O*FN!nkHrX!ep+VKrr!9WEytZKIPSiC}jbZrlhqrZDo2Uf2P> zGl1Pt0PYsa-xc8{NY2Pas28&QBL9}MMO_8q+OEh@8UEhN8WupVFN*i3*WdF`A$Nqd zAffgcsc7d7ob6kM@;tnEcfR;!ifJQ_V?3ub3;=AVE$##wo+9gs)+K9P)JRrRIf8Dd z4UR!qT(xvMU@t`T^P^c08jS3NV~96DJUW$bTbkQ|5e@Qn>=S2kB$>>g%b6@WSd)}R2&*`4=`$8x{4+{ z6~lzK32w5C;=kyg zal|gUOf!p!X1eBOr!XqLt7vj)@;goz<{x8Uu#j0cH=-@%aH(hpt2j0?HZa%4$81j^ z+_3QvT<);W7gig<;=75Olfy*SB5Ycgd%ebVxn`M;EGExoCbPbIp4ygN#JuVC_XsoV zvrCJckUtVov6sW{(H|%PH^f3=znX~p0|-W@2E(BU>^5TwH57&2W;~n-+6!YzjRu1; zHRzAV-LtzQY*k?&nuvx&u34i&jYbkNN73g`4FXFw5|4z`L?{+h!;wf>jraq8H5Lg3 z)I=m21QLY1Xx#588YC+Gj;N7vJm#4@DX39@DC(X)1*wr}G^&P!ekfHq9<&$QBM

c+=2zb8*`tZoifDYR)0wel8Dk`8bzH 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

=VKvD_j_= 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 z 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�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

8a+^k&lv zJI>ziUkcJ1dxiXgPfuNOoUNF|9^Bt<2zB?aN}R9~fR8&ay`}zJI$1k2a?l@x_2u>? z<3;6=T3a%U?z~?|Rx!NShvIWZSrfc&8Ch&qEll`QpK zU8D`UJ~cWK8aqwKW$)0CJ~(>u>ln^}H9YR9t7V#8R z`oZ2TW=hd@*!wd5w173@mhRSp1t&wOc-U0wsXVs@*j?A^GP7P($J(2qo*&;QOkFgp z&*L>J&uZtO{0LwD^0`mxZRkW+;$Gw>u@2Ea literal 0 HcmV?d00001 diff --git a/modules/swagger-codegen/src/main/resources/flash/flexunit-cilistener-4.1.0_RC2-28-3.5.0.12683.swc b/modules/swagger-codegen/src/main/resources/flash/flexunit-cilistener-4.1.0_RC2-28-3.5.0.12683.swc new file mode 100644 index 0000000000000000000000000000000000000000..b69064ac765f0f18a653b41d75eeced098798172 GIT binary patch literal 11827 zcmaKyQ*b6g)9>@dc6MWJY}>Xs_7mGrY}>YNI~zM2+t`h5eEU|Ns`Gy5;&j*4bWc_H zT+RRDH?1TK0f`9)`_Gs1)A+&u%Mkv>HkQUtMou0K&LA^@3{}gDsD>(BmjM`<`}&qQ zj62?F%60b^6g07BKeS3Qyp(bwl`t7Rf{-fP0C+@XL4xx~3#@Q{xqMb4C$xwVKn zcTyhI+KkWd+5A#o$DNa5a{~z;@U5+F_-redyVX3d%qao5p}H0mvz0B>mmOnO_-fd&A}xuSBvn8as= zywF#fhNa!Ymsf0&GoNqBpqeNqrq*}2M3XS~G$YLz8#$7Dk~?*v@lgXB8EWNPNW>n_ zPdXnu((&U+%g=~W99;(Z@YyoYm_{ESUixyM-oNT9)NLFr4;il3reduxGq3t@nFRTm z$p@7gxp$H@y^R22kj>VWbaGwJW-3+)u^owQDelPo5I(A$&89<721otWUY`Fx=6pQ% zVRcF6IqZ1l_I3yjDHx4NvhnYdyk8|;aS?1ZBz0@v00U4VVXe7KGcwdjR|2tS#;LiJ zY$GTZw73@<#jbqtMbC>f&>E960%k;SGBi1IcwBTmNxi~b7OBuJw`Pb9oHq)J{!Zbnet)9`B zL@6aXAED{cQmxPKjGQ zp?&SXIAhQ%n7@mR)X&p!@*h5@LKk9FjxQIg(6ph4jsOW7>Me?4(`iCh)#S(b$)ehm zg2M`fS0@F+8Vf@A^VCrNQaE1#A349fbPkjmOuUmo|Nb-7uYr_SUwW2sMqH)AkR>Nk zbP9SaJ{mubb@I*Kba(y&M2!y8yZh}3ce!d@q(T2$!Up`=XrWTZ)Dy3Bd3^3j#z)>` zN0HF=dCH9oynJVH`O5%;`f*%qEnv*Bh3H9vkabZOp-EDt{DpfBMC4H2w~EsLXW&4FL~DkP&6$C4?-0a#}e88Nq+@| z#RkVwMciHH*boPp&FHaDEJVi;7*b@x1i!`H+Qk{r%4cV zqWF;o1G?N0WHVHdE1k#bFflavdj6by9_zmzbFaT*H`Q~ZX*Iw}XzD1)P-F6JFY(e! zE%@z2KH1ppqJbO-877f>Y#2<_+1MdP(Uy&w(QQ_`$MfU6TerxM<=xcMg^X;Ru5~p0 z;m***YU=cHu~=1kq&3-xIaw6ZCPEWOJ<5}6&dV*Ate3qal z6+Z_ui@_8nlkbfR6F6RE-wxJp3$xs#A1`*=?DOr5sb-oUN>r)w8AF2JU^MS;=~4$i z4!Xw?Jd)1tCqj?@$WbKl+L_Q168^y>z{T&7p0qpNX!3LSKSo!*{mjU=gdB{PPjaM4 zlQKi#lAz^gX$KivblZPz<2@oqBVrC8TCgN0c(MK+beb62$dq9JU2Ma^Z@Vui%yGoB zn(hMc8Y?R@8uF8RnoNcJ&VeCGO1_hUmm)Qq0z;$3BT)9Y<4fW~#t@pWryE03u8zSS zSFHtbv`sG;dUl0{`ozMXCnxzwMWH6Rmkk5%Nn|DLekf_?tWW&j(bTc22`el0vb^eF zU6J2N0*_jBKfBEx+)WILPCYD$SN)Q{CTNpWoL7UKS=UG?a%{(0b}|P6t7*B?N7>&| z3!NRtU%NggUW^_jZ(YP~x^EHY7<6T_NMj!;R7txS8|zTtuqpeMH1hAVbJ@+dIa%3B z%r`aEAunc_&N4KSN1x?b%qI&kaQ6+Dorl>(xEl8DsLYmS?D`r5c}@bm(dRRa)z45f zjkrfn?SLQ97gN1s$#f0hbfUD`ox)iDR*=J2pBsx6wIewg?@XJiYFbJ5P)ALotf^cr z79LY`e^(r3ni;u|eGT+9PX$F0JgD?Em2|yKh|OxWA51jDG_7S&Gnhza0khN2F4bl= zQFW?o!@H~tdN-C+__NbWQiSO6ScB9`)_yI*;;nJEG$`?@reZDL}L;^7H;*Y zr?ifM%35cS5pshy0lzRZJFx5 zX4_)Y{;~S)s8Na5gZxNN5isk`u^sj3)U%q_&!_z7oXu!Q?r=()n>{0HBW=1CNq=^| zgjI`@)BB?nOILSZ8aqbR+2W`AQQ?O{_Jo4=0}eD^I?^F6%ky7+#<>oY!#d+aO^%by z_P>l;Z1Xmz>~oCcqv#z!(`QOln}&@a;cdGPe{^}>;CzC$ zt;|UdTGgTBk2?RW_X}#P;z6Bum)`hwZQgbG=vEpnBW$v|(TiF(VI-~z0&4;V$(}*g zr6cU-bLZ|>Tzu(C=Fy8%n1SCv@6^jZVCkHRzxfku!$)0|m>wx%mIVqyB?Lx*ml&29 z7Ac7p1dC9ISkcrLD2a;0U{#f?$qu_>E~_p;Th$irOTZ(kZHi52Rjf)GA+U2QJJN>O zE}j?eyU}o{S`;kGPwUgXQZ=hI#6(`Go#z+kMFMEtRBm{zg!g&NOClq;)Xt0M6o*l< zKq_YpG?%4NUKQ>TElA3a!M~`mQ09MSRa~I9#3*BzLA9x*=Nm^y!qaCK?i13?%~P4dtl~KUVBi^{Q?<16Xsv*Bj!PB-;ikvA_qP| zp_V^u4Sm1~Fz(;6d-n#s^hWJH-MpYF{Y4BF1Zcmq<{#(%ct=%3SBdTVb3wnd!?+8L zga324_A2LsWE&u|Sw}LrwF`#^%hY9#z4?h}{^aj9O5emuf^Sy;#qoG4$fx7) zkUIDTkm&rl0{dp|foMhq?V!Pr+{BOFodt7rHR#{IGwU{WWHPBr>JDS zzQbUBR{jQ@{b`8TSMXCL-nWhd7nW-WDDal5Jk|FIS2|f0=TBJl3s!npLDJ9)?(FxdO7bt1C zRTRhw$dVaC70G-$Y_ee`Un(gZB{XDoTD4dxX*4d})v&C}8)E9<(_e(fKk7$<}k20$PP3tdN|A<9O^O+3LI zKVqbFm%}X`-=IZ~x5~CSlWLSLtGqTa%iBWQCPdJaZ3}AVnrBEW#&fRouG_EmjbxK{ zNvnmk;LeZ(snVy;lv=2lv-!zNN(Ze6f7b3^(!kb)P`GCLpqca(!m^s4Y@N!j7P-5j zkw%1XhK~Wm`2>#F@Sn=t!hH5B9jfLln;UKg==@+(IRPxx!_^=b3a_!8Q#}M3-gzd3 z!tu>GI7%T|?tl*qYz2Q$lx)xQvE?5n-$XKh1*jH);ZxI+it)n%bCAfkEk_|Arm?xP zuGEN3cE~Jq$3=N+!i0Q+$u%M6G~?jnZi2JMfcXM|z1n*5hTu-6AyA|4viA+>YNW2NDQZp*$5dUyJ^c@b05E)$p89b;z3smv)WSluaRTPNylhxvYzCaR(L)@SrB$_ zSA+^yQ{e-Z#Z_F9y2qKp<1%@k^CUAH0YsDIT>Gr6sW!x|VH}Ha&vsxviEvN%z1*J< z;Z#yfq<}bMidpVCo#F4Ok|j0Uy*UZJH~gX^Hl3dG!-4}^sM#>zNoKBdkHQDyR0qqc zxzXhz?dgf~$bxP-Ba^;(;IN7M+T2?s!*CjRQ{6rhz_Bkw&f6|WTRvhSX8OB!ax z$|uq(b$XW2b8W|hbFJ3m&{lq~M6%_KD>(4U{}ou9o2JaKY(=zZ;^)TPNHIJ#zKw7? zJ6raK5OgW61nP{@ zH3h0))IgT-D}Omna2E)KQF`oLzCgJ0fw~US)T*)Q7q~F74NX-$AbiK@aOwh~{3!ld z)fcpYlz%R|?}k_U4s#7z`g>)K@f5RreumHCqK zSVvNV{zIGtJWz^bzHA1*%pp0g9T1OA%KAZb!o_dixdWp(K~848vQvxwaH*sw5iy;IA zH5=Xu1XmN_5D4NLu8(API9Ft{K` zGp&fl)#6vF3xz5S3q+W)&ef<&M7XhN%Kg3CacLGK*9!_Wh^SO(8H{bk-}Qd&n7-?c z?;wBH9$&Q>(l*PqV`F$Zn9_nXTau)E!IBeedO9Fu-SokX2dd?lWY(|18v@THn%eKx z66r~*W+E!#B*kyAgG08!BOr9j*IEw7-*Jk=A&Qi!U7Ei01~t>?3JcKax=G!OH_A#v z^8VRziP&x>d)u?-B}7zMwbZVYD#pTUWbnmW@meN_8TfY&oBA^>1~71S&_l@UGTQhV zJGe(m(CyA$kn+)m`PLQ!vSY=9_c&oFFvfASbG%9ZMHO zLsN&v*;;OD4E05~f*1^s4R625zrJ|b83_a{eFX4Qomm%(I>c^qdGhr@Mll?U1X(hV zwUubv>M~o2DbDZJErzF>cVeVigTmT8?hfJ%ZxhBU3IeG`=ZIU}>GP7pd(GJq6BU~S zVszgb=YMn^4w>+o$Bkf&r#nW+*WeSJ%PPv3sh+DIl4cenD%;5Ts+g=}WW*NNCSPzT{dd<%m-}WH<0Fl z$OhQ7nF(bj%}Z0^_!usJd4In%sE<8^pSJ7Cr=${GHkMyuajk~ZfOVq4lGeT>pgq&1 z+xEiOI!34d%mKk^=gJi$Q#joO{gp$+V(*m-%Bi@CHPgdfpXm`@0~s%RsmzRD-rPi0 z1pJ&}?QQJ$s73v#I`jN4k>zM3KhY7jx*`9aq1h*~=La|Uh(hmXnjkyfO6&+}cMdv6 zgb69ATXS&OWnJ7;jrVKXE94q$mgPHI5B4Kwt#uFfi~;uSH;V>oZvK)t8@cfYv7u|; z-?EAaCSwZJ--|3c0A{Hk4S${K5;Y0Nd^t&QAqDN25ly=Q%t-EjFhSllr z+H2O?w>tMzCuZq6w#HMt-Jd8!FYDm0sQ|xgqQh)$@oFyOwspCb`&?f^vNt(N$E3_G zCnwE8x=ZHFtJiBi9zVtL0pIzS{{r5=W%s8-o$RvkCiir^{-FJ$i+;(q=2aq=Y-qz$ zg7$@aifwrFM_|f@{`0$Sj`U4jtW&iaUsmq8*wLI^Bm!%2qp1oE={SzZov9${^~b7d zlZOXKWnGVb2hXtH@0r76YZ0&ARTl~!p39q;cYtF5$&KaN$InZgW)YhfQ=VVV*3y(f z-RUFFKN~Fq_-08g_IWDX;kSR-y22)yHAa!VwAb3pT9!_3x_oReUMYUmdunS&M);`(4cw7hu}JR2*8ZP2&0HCjl9Z5&!Yx$E3q zAT`TeB?wY(HAr?ArW8 zQ89n|@TTMA^G=ug15l@UDwH~zLjpl)04CcEf{YjDrD2>~SLW-f<|JKf1yj`ut9u~5 zEDYday#05rvH1E1j<}-rKY##g>rCqigI?ESZEi?)YV*RaHJQucv;9P#b)r=9%UTJF z#*TVa7lgmCAC?e0mobwlgH>fDlyb*3wd0ckz7x9sZR z@Ude50U}@$u&bn{aun0$UelAnC)Rh=|Ht9#-_;{*mvgu7k%rNRm4?}d9mk-9mROR} zdSEfGRlZsCvC#BDCZ4rjWk<(xYNjarUS>n4Yij#}sNoANS1!!x%D_$8?lVd}2djpv zbwEvhd3*3nmbw~GW#!7^Vy#}AZ%|XMFL1DQIz}h6H4v8m3KAYXB+8>O^=@#OT}@N6 zgvZJ%zf|Jb6n=VfQ)ECM3I&R>L_lVP%C@XINXC~2Qii8uPCSHQ(aDEi$te4qm<$D# zn5AvBT~@JiAbgwho!s~VR?$cpNo0=#{G3P|~l z4!skvgdeczi}LG<)Ej;84b}I@FME;aY1o~(SqN-Dgt>JXv?ujw!Qh)Vqh~ko?SR=I z&wP=yz-PYLS&Zj=ieM0+Wm9<12ey|e4+YHC2XznyV(XJGln845ojLzZFkr9j`UNrZ zgRayEd63cYHSPKZBcGnp=owL92gd4+MCmCGHFwk;kf$2{h85};Fl(@PxAOeXFYx8h z_K7BnHMnE^JS$Z71vTggar&Z&=ohDmfn`-uAERvsW#s{2-Tt98iw8y14VQK8i)dYa zg$8-%1(g7=2)x(w76_O}IO@DxSewWIBBtmF@Huav_y@MAJL@U2n_4W;& zorSXc4A~_u4)m{?W7ZLkqzV6or8NwQw*xQkHGWh#o`g5766DDmd~$r;zOmzSgjsdt zhid}GLpTeCUsw`5OctCNKH`9F6vSEYtx_62LVf#cj{U0qHemp?Yi||ZStt@T|9vCs zS0R4(1#RXRv=`eadW)TXBzz*sY}V>0F3@`LHM8rfj)ZyLXGpE-(MF8A0hiqOsUKjp zLpPO+DfI!tcl(V{80wh_Gq?@j9)l2ln}IIyim5*g=^72fdlBp(y%;H#3JRo$L`c3P8?E+HEB1>nU5qjnN z&eka0V)@6@{n?S$<^?dkg8l2i37zuu!In*fOdzVSkP=<%_k5>R0W)6reBz_&=FVFX z;jThH8u8U(F$IK;NkXD9$3n`SEf0wlM$W%WiPs=w*!hdY`%~KtKWQxBVWjD8^adR_ zC<2S2b!&V~5URJPb<5iX!#gSq)&|J!)+YH%x9r6?&93<%r|>p(hLgOp_$(ft;=ux1 z8wpk9@_Sm+*x<8P(D9Iddv1Mo=s)?@u6*R3xqhAecbf5a*TX~yt_kl64-cnF0x6J< zhG2+iWAX`3z(6Xbe1kTP_j+X%!Fw<0zlZV>XUHX%2Q~OZ8)}gJ6(3vR_ZM`i>V03( z9@Ym@eusEoh|?JYI;a>eGSc>h=47jZj7|)m4F#%e>$K9fhF^mlz6%zOTnw{gIj_nl zyn};nNCN7(Pls$(woXvP!{KbwZpD*+;0W=17e}aUGWyD~a|-{j^7<}pu8G=JJsn+n zeEQhPZ~@}zNU4!z^VXl{X1%Dao*rhUDO0VE%^uXO2v{=b0y)v@-D=cFFJwjTgyP)r zQ7jGBW>gH^Q}=A@BhD$bM|^1^Cy{9t(?G1fiLDee{esqLZnimQbyxqPs*%bYJ^og+ zo0I(E_9gDv5)f-42q+0t=~=6zYu5aFA4R6+$MH8;RMpAaQNc$#RpFlfqbiU(2#36te@`)G0S zm)e|&7`9&AK}NfQd?;dPW^GV_yDY# zYFKbJVc4#;nAZEiTXwF>&CWq3_-Y-yb;Ln9DkTlmo+*1K8@6lwJ!)TZ(9N4KyJy^gq)R2x9J;_m2mx8GK)J!+ z#CHnftB6c3Y2hGVsk_~sf#b=^pCTa=c_LY=NdEHDMPa?#qHtyFP7CltbUuJO)C(;s z#kn%~m#fNvIy%;y`ue6S!(=LId`Al~D)#tpRx!2E zjdx!N3i4#UyK)LQc9e!!y*$tWADO*gd=v6v4YvPjr{_dT{A*t(cnj{ji5HLu(@wPb zM#9&Cnh8c%Apo{le-`B+6EV}#i|AaIyqbMRo4*6&j&|J6^&TjSl~jh=AyC}4F9>L#I_mwn9_3p9zJV)?GrB$IDpcBkDoU9 zF0CX832bAal6hBuu%t*R{G;s-jjB#McBvH{nt|{tiJERQ^Eq2k&+JCO`$E0~zW=V> zKT49VgpS=4V}Rf;93{g?Q<1k=3+0^&{GL2mK$c8E98A6Id_tSO18WG+g>-ttzVkr@ z;k@mK<7h7Q5qRAF1wY~oe)^pq%SXBki>X-onY1Kd$M z|C8WKvJY?z%Kx-C~$ z-=w9}&WW~jef}B93AblMCA*pfWzv|d6(TxzNFO+INZ)>|3fQJ8x5xUHygAN#x`CbM z>>vZYxlW9Nii6$Dm_xK|)G$6&{xAj{+_>kC^5VoHfoqR?9^R03$zS^hP*b@;s^+2p zlGN)9no}-*1EemD->ZahyBb0MgeB5}B^Y!`)ujw4C*SBe@=8TIHizN}%XRl4@$PbZ zb2c?2bNHnI2e-l)e7ZLj!CF0jx)xX}HR%)PG%9lVAZ1x3{MSR`uSbAcS)U9mJ|Qpb2xh=gmfP7Q$0WbEgdp??uaPt*3|IDqb8f7vVn(D zQ!U~=@`xzmJtVPJkxS#M=;^8QWu{zLN`3vsU&iE0l@c7Xd*C`Xxu99vCL8*W;b?k- zIVE!d=hu??o&cay>(=IXhAM*f@~%lIYDUP*^;Z7w`(7q@3n~u){ftMdiCVEK^>=sJ z@6F6It*V9UBQ|TTTb0ZwY_>T1q7M1~3r*wg=}cXUJ<^gf0$)5TdkE0;MSeFy5Xk=) z8IchB$Ow@TaD;|P2z8{4NC zH={*+m9g_mlhZpU?!CaU|LLB)W4luYob73E@3P-sYPE^?x!=l)ohCEgs!&&>Xax1j z2-MZOOMkjcDQfO#WrJ{aZl*tfo`!t+P8{_}eHq;QE#Ch5bPr*DzdsL^3N`giu^o%E zp??uonQqZ~TGm_qRLFRd&%OeV<=`=Td}4Vo(T~(IyEa45fHYRRX~^R?@H8)%s)$^w z`8c$Wcf3-}sY-hyfDvkY{S6jQ6co-YvJEXoHJgyg<0M>kv7|{oGWE%~cX5rGx0#Wd z6S$J{DZnaVmnLLk1_Pn9e?{O&eyBwuX-Q&ACcO1PC-f?cMR<#vuIw<6b&=38y&9x; zXH05`g(WM!Z9$10MwdQ#p-C=%e-2;5>YB9hG#xLU5p}7j(LrhG^!wJ~Kn`t~x5b|t zbt=q!s>;o8LMBJTk+0kAT+tm1GSRoGIsGinnp_+uSdWeejB7t{!uvBCWe z&_QY4d zDottKF~6b`e^lKr^q7LKKQFfJVp}|!HRIM+_i7v%35YuhELF|3uML6Hv*YC#KoQ@t z6xq;HMvApknYxTA%)q2qqciLipiO0dqx{*p^NmGA*%B$ms$9)_-flf&3UNzTY@_FW zWGiu}nBG9vy&ZY(urbP&;&Y+dZ2FP8O7iz9TwwduA9_}YKw?b<7mRjP^mZTgw7udK z4g^kRyT^b9f>vsdHaDH*I=>F)!Ii@4Le1;fTb(iX7A=0M*FL~B1FpQ1EDY>!-?6+NNF@}FkvBwZ zM0!lu-Z&gbOCoq<7@Q;pFCw;rZV-YdYSfsBpAZH2 zt6fE5lJZlRiifE@GEl7#USyT8Z$Uz0FE%Y{?u7Q|!t!Ygu%f^fAI#VT+6!;#4r>@k zdMyQon!jG92T=<4A7d*p#z$uq#qn5fe>0{n4zHm!eqbw94A88ha#PpFFvc7ZlWR;- zJEx3;OA-;m8QL_33xf-h%Ph5&;!^QOXu8Ey4o}=-Fx~i#H0XvXi%F$5T%yy&zDvXw zM^RY9)o62;$^h>*x!H;mAoMr${Z>eC0%7EYI5>|e+AtIFR~$wmNV)VY+^(Z^ z42h~PJp8PDAVAiE5Px13;IYs?eGFRqdV5~YEUfCZyO!g}AsTi;TvEgONr+DTG&e6B z;4c}D<0^Ewg68iY_FMLkzpr#uj}DKOKoelu`zq4qjOM7&=E5%T2m zzWKo$y6H%`gPO^);aKI+CTp5@B2NbNSpU21A^HHI(m4zs@LA(}VFFgML6hT zY~5==B*d9jER3{3i(^!{rFlRKAJe{$IWtP#w&H4DVl}R-b0o_wZz?+YNth-la6f&y|+n30%w!?6G>!H-Q zT?R#%wm>UDcaP7B=!2ht)`@GXL#SgI-=C=Q-5(^JhY9V^fRUbUpI)3FThi73=5|6{ zrQHs-ZGP9#_h!+LsKYR;^_I}(aZ09tbyADt8!l{O_OaeY(0!;$E+>HoF|toqidV6R zk3ULIvaOLTt+to9USYq~60dfJZgmOT@L#uCYD}LEa-mMEV>o2d?-U4&>Qzg*F~U?n z2D{6Rc@f3|p^Vams5!GRVkbG-v>*OQ?l4T~gfCL3b+Sh$g`e z=hV5CR%4F+D)JkgIbcS2V?4K@`w1Q>n z^G{~dpOCegWE6d$_cxm4qAJ}ytzS`Sm4)eai|09uh4MsGlkYHd1`2Uee05~St z{~gx;Z~6Ssu=fA9{~F!?e+&P+>HjVa|EI+NrL{`3P|*MB3jWWX{_R!t|H=Lb-#F8X literal 0 HcmV?d00001 diff --git a/modules/swagger-codegen/src/main/resources/flash/flexunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc b/modules/swagger-codegen/src/main/resources/flash/flexunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc new file mode 100644 index 0000000000000000000000000000000000000000..a90af750bb5d351e5f4b937975b86b9c0e69dd25 GIT binary patch literal 165338 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

;oB7G##fs?TY%1uw5tp` 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�~c8v?UGd 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 M!Xh9Y)XD@T0fItD@c;k- literal 0 HcmV?d00001 diff --git a/modules/swagger-codegen/src/main/resources/flash/model.mustache b/modules/swagger-codegen/src/main/resources/flash/model.mustache new file mode 100644 index 000000000000..c3369514e80e --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/model.mustache @@ -0,0 +1,40 @@ +package {{package}} { + +{{#imports}}import {{import}}; +{{/imports}} + +{{#models}} +{{#model}} + [XmlRootNode(name="{{classname}}")] + public class {{classname}} { + {{#vars}} + + {{#description}}/* {{description}} */ + {{/description}} + + {{#isList}} + // This declaration below of _{{name}}_obj_class is to force flash compiler to include this class + private var _{{name}}_obj_class: {{baseType}} = null; + [XmlElementWrapper(name="{{name}}")] + [XmlElements(name="{{nameSingular}}", type="{{baseType}}")] + {{/isList}} + {{#isNotContainer}}[XmlElement(name="{{name}}")] + {{/isNotContainer}} + public var {{name}}: {{{datatype}}} = {{{defaultValue}}}; + + {{/vars}} + + public function toString(): String { + var str: String = "{{classname}}: "; + {{#vars}} + str += " ({{name}}: " + {{name}} + ")"; + {{/vars}} + return str; + } + + +} +{{/model}} + {{/models}} + +} diff --git a/modules/swagger-codegen/src/main/resources/flash/modelList.mustache b/modules/swagger-codegen/src/main/resources/flash/modelList.mustache new file mode 100644 index 000000000000..b0c3bd73f836 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/modelList.mustache @@ -0,0 +1,23 @@ +package {{package}} { + +import com.wordnik.swagger.common.ListWrapper; +{{#imports}}import {{import}}; +{{/imports}} + +{{#models}} +{{#model}} + public class {{classname}}List implements ListWrapper { + // This declaration below of _{{name}}_obj_class is to force flash compiler to include this class + private var _{{classVarName}}_obj_class: {{package}}.{{classname}} = null; + [XmlElements(name="{{classVarName}}", type="{{package}}.{{classname}}")] + public var {{classVarName}}: Array = new Array(); + + public function getList(): Array{ + return {{classVarName}}; + } + +} +{{/model}} + {{/models}} + +} diff --git a/modules/swagger-codegen/src/main/resources/htmlDocs/bodyParam.mustache b/modules/swagger-codegen/src/main/resources/htmlDocs/bodyParam.mustache new file mode 100644 index 000000000000..2fd81183a5ba --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/htmlDocs/bodyParam.mustache @@ -0,0 +1,3 @@ +{{#isBodyParam}}

+ +
Body Parameter — {{description}} {{#defaultValue}}default: {{{defaultValue}}}{{/defaultValue}}
{{/isBodyParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/htmlDocs/formParam.mustache b/modules/swagger-codegen/src/main/resources/htmlDocs/formParam.mustache new file mode 100644 index 000000000000..97f342e60d70 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/htmlDocs/formParam.mustache @@ -0,0 +1,3 @@ +{{#isFormParam}}
{{paramName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}
+ +
Form Parameter — {{description}} {{#defaultValue}}default: {{{defaultValue}}}{{/defaultValue}}
{{/isFormParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/htmlDocs/headerParam.mustache b/modules/swagger-codegen/src/main/resources/htmlDocs/headerParam.mustache new file mode 100644 index 000000000000..903713493be5 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/htmlDocs/headerParam.mustache @@ -0,0 +1,3 @@ +{{#isHeaderParam}}
{{paramName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}
+ +
Header Parameter — {{description}} {{#defaultValue}}default: {{{defaultValue}}}{{/defaultValue}}
{{/isHeaderParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/htmlDocs/index.mustache b/modules/swagger-codegen/src/main/resources/htmlDocs/index.mustache new file mode 100644 index 000000000000..ccd35c8723dc --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/htmlDocs/index.mustache @@ -0,0 +1,60 @@ + + + + API Reference + + + +

{{{appName}}}

+
{{{appDescription}}} for {{partner}}
+ {{#infoUrl}}
{{/infoUrl}} + {{#infoEmail}}
Contact Info: {{{infoEmail}}}
{{/infoEmail}} +
{{{licenseInfo}}}
+
{{{licenseUrl}}}
+

Access

+
Access to the API requires an api key to be provided by {{partner}} for all requests. The api key is passed as a header with the name `api_key` and the value provided by Reverb Technologies, Inc. Unless otherwise agreed upon, access to the Reverb API is intended solely for usage by {{partner}} and not third parties.
+

Methods

+ {{#apiInfo}} + {{#apis}} + {{#operations}}{{#operation}} +
+
{{httpMethod}}: {{path}}
+
{{nickname}} {{summary}}
+
{{notes}}
+ +

Parameters

+
+ {{#allParams}}{{>queryParam}}{{>pathParam}}{{>bodyParam}}{{>headerParam}}{{>formParam}} + {{/allParams}} +
+

Return type

+ + + + {{#examples}} +

Example data

+
Content-Type: {{{contentType}}}
+
{{{example}}}
+ {{/examples}} +
+
+ {{/operation}}{{/operations}} + {{/apis}}{{/apiInfo}} + +

Models

+ {{#models}} + {{#model}} +
+

{{classname}}

+
+ {{#vars}}
{{name}} {{#isNotRequired}}(optional){{/isNotRequired}}
{{datatype}} {{description}}
+ {{/vars}} +
+
+ {{/model}} + {{/models}} + + + \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/htmlDocs/pathParam.mustache b/modules/swagger-codegen/src/main/resources/htmlDocs/pathParam.mustache new file mode 100644 index 000000000000..b47805a4f04a --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/htmlDocs/pathParam.mustache @@ -0,0 +1,3 @@ +{{#isPathParam}}
{{paramName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}
+ +
Path Parameter — {{description}} {{#defaultValue}}default: {{{defaultValue}}}{{/defaultValue}}
{{/isPathParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/htmlDocs/queryParam.mustache b/modules/swagger-codegen/src/main/resources/htmlDocs/queryParam.mustache new file mode 100644 index 000000000000..52147fbd7188 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/htmlDocs/queryParam.mustache @@ -0,0 +1,3 @@ +{{#isQueryParam}}
{{paramName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}
+ +
Query Parameter — {{description}} {{#defaultValue}}default: {{{defaultValue}}}{{/defaultValue}}
{{/isQueryParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/htmlDocs/style.css.mustache b/modules/swagger-codegen/src/main/resources/htmlDocs/style.css.mustache new file mode 100644 index 000000000000..0421bcc8c3cb --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/htmlDocs/style.css.mustache @@ -0,0 +1,136 @@ +body { + font-family: Trebuchet MS, sans-serif; + font-size: 15px; + color: #444; + margin-right: 24px; +} + +h1 { + font-size: 25px; +} +h2 { + font-size: 20px; +} +h3 { + font-size: 16px; + font-weight: bold; +} +hr { + height: 1px; + border: 0; + color: #ddd; + background-color: #ddd; + display: none; +} + +.app-desc { + clear: both; + margin-left: 20px; +} +.param-name { + width: 100%; +} +.license-info { + margin-left: 20px; +} + +.license-url { + margin-left: 20px; +} + +.model { + margin: 0 0 0px 20px; +} + +.method { + margin-left: 20px; +} + +.method-notes { + margin: 10px 0 20px 0; + font-size: 90%; + color: #555; +} + +pre { + padding: 10px; +} + +pre.get { + background-color: #0f6ab4; +} + +pre.post { + background-color: #10a54a; +} + +pre.put { + background-color: #c5862b; +} + +pre.delete { + background-color: #a41e22; +} + +.huge { + color: #fff; +} + +pre.example { + background-color: #f3f3f3; + padding: 10px; + border: 1px solid #ddd; +} + +code { + white-space: pre; +} + +.nickname { + font-weight: bold; +} + +.method-path { + font-size: 1.5em; + background-color: #0f6ab4; +} + +.parameter { + width: 500px; +} + +.param { + width: 500px; + padding: 10px 0 0 20px; + font-weight: bold; +} + +.param-desc { + width: 700px; + padding: 0 0 0 20px; + color: #777; +} + +.param-type { + font-style: italic; +} + +.field-label { + padding: 0; + margin: 0; + clear: both; +} + +.field-items { + padding: 0 0 15px 0; + margin-bottom: 15px; +} + +.return-type { + clear: both; + padding-bottom: 10px; +} + +.param-header { + font-weight: bold; +} diff --git a/modules/swagger-codegen/src/main/resources/logback.xml b/modules/swagger-codegen/src/main/resources/logback.xml new file mode 100644 index 000000000000..c7d0db9d3a23 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/logback.xml @@ -0,0 +1,12 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + diff --git a/modules/swagger-codegen/src/main/resources/nodejs/README.mustache b/modules/swagger-codegen/src/main/resources/nodejs/README.mustache new file mode 100644 index 000000000000..881e7dd92c57 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/nodejs/README.mustache @@ -0,0 +1,10 @@ +# Swagger generated server + +## Overview +This server was generated by the [swagger-codegen](https://github.com/wordnik/swagger-codegen) project. By using the +[swagger-spec](https://github.com/wordnik/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +is an example of building a node.js server. + +This example uses the [expressjs](http://expressjs.com/) framework. To see how to make this your own, look here: + +[README](https://github.com/wordnik/swagger-codegen/tree/master/samples/server-generator/node) \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/nodejs/api.mustache b/modules/swagger-codegen/src/main/resources/nodejs/api.mustache new file mode 100644 index 000000000000..82f0145ce8e3 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/nodejs/api.mustache @@ -0,0 +1,62 @@ +var swagger = require("swagger-node-express"); +var url = require("url"); +var errors = swagger.errors; +var params = swagger.params; + +/* add model includes */ + +function writeResponse (response, data) { + response.header('Access-Control-Allow-Origin', "*"); + response.header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); + response.header("Access-Control-Allow-Headers", "Content-Type"); + response.header("Content-Type", "application/json; charset=utf-8"); + response.send(JSON.stringify(data)); +} + +exports.models = models = require("../models.js"); + +{{#operations}} +{{#operation}} +exports.{{nickname}} = { + 'spec': { + "description" : "Operations about pets", + "path" : "{{path}}", + "notes" : "{{{notes}}}", + "summary" : "{{{summary}}}", + "method": "{{httpMethod}}", + "params" : [{{#queryParams}} + params.query("{{paramName}}", "{{description}}", "{{swaggerDataType}}", {{#required}}true{{/required}}{{^required}}false{{/required}}, {{#allowMultiple}}true{{/allowMultiple}}{{^allowMultiple}}false{{/allowMultiple}}, "{{{allowableValues}}}"{{#defaultValue}}, {{{defaultValue}}}{{/defaultValue}}){{#hasMore}},{{/hasMore}} + {{/queryParams}}].concat([{{#pathParams}} + params.path("{{paramName}}", "{{description}}"){{#hasMore}},{{/hasMore}} + {{/pathParams}}]).concat([{{#headerParams}} + params.header("{{paramName}}", "{{description}}"){{#hasMore}},{{/hasMore}} + {{/headerParams}}]).concat([{{#bodyParams}} + params.body("body", "{{swaggerDataType}}", "{{description}}", {{#required}}{{required}}{{/required}}{{^required}}false{{/required}}) + {{/bodyParams}}]), + {{#returnContainer}} + "type": "{{returnType}}", + "items": { + {{#returnTypeIsPrimitive}}"type": "{{returnContainer}}"{{/returnTypeIsPrimitive}} + {{^returnTypeIsPrimitive}}"$ref": "{{returnContainer}}"{{/returnTypeIsPrimitive}} + }, + // container + {{/returnContainer}} + {{^returnContainer}} + "type" : "{{returnType}}", + {{/returnContainer}} + "responseMessages" : [errors.invalid('id'), errors.notFound('{{returnType}}')], + "nickname" : "{{nickname}}" + }, + 'action': function (req,res) { + {{#requiredParamCount}} + {{#requiredParams}} + if (!req.params.{{baseName}}) { + throw errors.invalid('{{baseName}}'); + } + {{/requiredParams}} + {{/requiredParamCount}} + writeResponse(res, {message: "how about implementing {{nickname}} as a {{httpMethod}} method?"}); + } +}; +{{/operation}} +{{/operations}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/nodejs/main.mustache b/modules/swagger-codegen/src/main/resources/nodejs/main.mustache new file mode 100644 index 000000000000..6c8be317be6b --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/nodejs/main.mustache @@ -0,0 +1,52 @@ +var express = require("express") + , url = require("url") + , cors = require("cors") + , swagger = require("swagger-node-express") + , db = false + +var app = express(); +app.use(express.bodyParser()); + +var corsOptions = { + credentials: true, + origin: function(origin,callback) { + if(origin===undefined) { + callback(null,false); + } else { + callback(null,true); + } + } +}; + +app.use(cors(corsOptions)); + +{{#basePath}} +var subpath = express(); + +app.use("{{{basePath}}}", subpath); + +swagger.setAppHandler(subpath); +{{/basePath}} +{{^basePath}} +swagger.setAppHandler(app); +{{/basePath}} + +swagger.configureSwaggerPaths("", "api-docs", "") + +var models = require("./app/models.js"); + +{{#apiInfo}} +{{#apis}} +var {{classname}} = require("./{{apiFolder}}/{{classname}}.js"); +{{/apis}} +{{/apiInfo}} + +swagger.addModels(models) + {{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}.add{{httpMethod}}({{classname}}.{{nickname}}){{/operation}}{{/operations}} + {{/apis}}{{/apiInfo}}; + +// configures the app +swagger.configure("http://localhost:8002{{basePath}}", "0.1"); + +// start the server +app.listen(8002); diff --git a/modules/swagger-codegen/src/main/resources/nodejs/models.mustache b/modules/swagger-codegen/src/main/resources/nodejs/models.mustache new file mode 100644 index 000000000000..133fe7c15159 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/nodejs/models.mustache @@ -0,0 +1,3 @@ +exports.models = { + {{#models}}{{#model}}"{{classVarName}}": {{{modelJson}}}{{#hasMoreModels}},{{/hasMoreModels}}{{/model}}{{/models}} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/nodejs/package.mustache b/modules/swagger-codegen/src/main/resources/nodejs/package.mustache new file mode 100755 index 000000000000..322dc8199669 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/nodejs/package.mustache @@ -0,0 +1,16 @@ +{ + "name": "{{{artifactId}}}", + "description": "Wordnik node.js server generator", + "version": "{{{artifactVersion}}}", + "homepage": "{{{homepage}}}", + "main": "./{{codeDir}}/main.js", + "engines": { + "node": ">= 0.8.x" + }, + "dependencies": { + "swagger-node-express": ">= 2.0.x", + "connect": ">= 1.8.x", + "cors": "2.1.1", + "express": "3.x" + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/objc/Podfile.mustache b/modules/swagger-codegen/src/main/resources/objc/Podfile.mustache new file mode 100644 index 000000000000..ee3f0856b6f1 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/Podfile.mustache @@ -0,0 +1,3 @@ +platform :ios, '6.0' +xcodeproj '{{projectName}}/{{projectName}}.xcodeproj' +pod 'AFNetworking', '~> 1.0' diff --git a/modules/swagger-codegen/src/main/resources/objc/SWGApiClient.h b/modules/swagger-codegen/src/main/resources/objc/SWGApiClient.h new file mode 100644 index 000000000000..aab60cd05958 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/SWGApiClient.h @@ -0,0 +1,64 @@ +#import +#import "AFHTTPClient.h" + +@interface SWGApiClient : AFHTTPClient + +@property(nonatomic, assign) NSURLRequestCachePolicy cachePolicy; +@property(nonatomic, assign) NSTimeInterval timeoutInterval; +@property(nonatomic, assign) BOOL logRequests; +@property(nonatomic, assign) BOOL logCacheHits; +@property(nonatomic, assign) BOOL logServerResponses; +@property(nonatomic, assign) BOOL logJSON; +@property(nonatomic, assign) BOOL logHTTP; +@property(nonatomic, readonly) NSOperationQueue* queue; + ++(SWGApiClient *)sharedClientFromPool:(NSString *)baseUrl; + ++(NSOperationQueue*) sharedQueue; + ++(void)setLoggingEnabled:(bool) state; + ++(void)clearCache; + ++(void)setCacheEnabled:(BOOL) enabled; + ++(unsigned long)requestQueueSize; + ++(void) setOfflineState:(BOOL) state; + ++(AFNetworkReachabilityStatus) getReachabilityStatus; + ++(NSNumber*) nextRequestId; + ++(NSNumber*) queueRequest; + ++(void) cancelRequest:(NSNumber*)requestId; + ++(NSString*) escape:(id)unescaped; + ++(void) setReachabilityChangeBlock:(void(^)(int))changeBlock; + ++(void) configureCacheReachibilityForHost:(NSString*)host; + +-(void)setHeaderValue:(NSString*) value + forKey:(NSString*) forKey; + +-(NSNumber*) dictionary:(NSString*) path + method:(NSString*) method + queryParams:(NSDictionary*) queryParams + body:(id) body + headerParams:(NSDictionary*) headerParams + requestContentType:(NSString*) requestContentType + responseContentType:(NSString*) responseContentType + completionBlock:(void (^)(NSDictionary*, NSError *))completionBlock; + +-(NSNumber*) stringWithCompletionBlock:(NSString*) path + method:(NSString*) method + queryParams:(NSDictionary*) queryParams + body:(id) body + headerParams:(NSDictionary*) headerParams + requestContentType:(NSString*) requestContentType + responseContentType:(NSString*) responseContentType + completionBlock:(void (^)(NSString*, NSError *))completionBlock; +@end + diff --git a/modules/swagger-codegen/src/main/resources/objc/SWGApiClient.m b/modules/swagger-codegen/src/main/resources/objc/SWGApiClient.m new file mode 100644 index 000000000000..0b8be93ab5db --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/SWGApiClient.m @@ -0,0 +1,419 @@ +#import "SWGApiClient.h" +#import "SWGFile.h" + +#import "AFJSONRequestOperation.h" + +@implementation SWGApiClient + +static long requestId = 0; +static bool offlineState = false; +static NSMutableSet * queuedRequests = nil; +static bool cacheEnabled = false; +static AFNetworkReachabilityStatus reachabilityStatus = AFNetworkReachabilityStatusNotReachable; +static NSOperationQueue* sharedQueue; +static void (^reachabilityChangeBlock)(int); +static bool loggingEnabled = false; + ++(void)setLoggingEnabled:(bool) state { + loggingEnabled = state; +} + ++(void)clearCache { + [[NSURLCache sharedURLCache] removeAllCachedResponses]; +} + ++(void)setCacheEnabled:(BOOL)enabled { + cacheEnabled = enabled; +} + ++(void)configureCacheWithMemoryAndDiskCapacity:(unsigned long) memorySize + diskSize:(unsigned long) diskSize { + NSAssert(memorySize > 0, @"invalid in-memory cache size"); + NSAssert(diskSize >= 0, @"invalid disk cache size"); + + NSURLCache *cache = + [[NSURLCache alloc] + initWithMemoryCapacity:memorySize + diskCapacity:diskSize + diskPath:@"swagger_url_cache"]; + + [NSURLCache setSharedURLCache:cache]; +} + ++(NSOperationQueue*) sharedQueue { + return sharedQueue; +} + ++(SWGApiClient *)sharedClientFromPool:(NSString *)baseUrl { + static NSMutableDictionary *_pool = nil; + if (queuedRequests == nil) { + queuedRequests = [[NSMutableSet alloc]init]; + } + if(_pool == nil) { + // setup static vars + // create queue + sharedQueue = [[NSOperationQueue alloc] init]; + + // create pool + _pool = [[NSMutableDictionary alloc] init]; + + // initialize URL cache + [SWGApiClient configureCacheWithMemoryAndDiskCapacity:4*1024*1024 diskSize:32*1024*1024]; + + // configure reachability + [SWGApiClient configureCacheReachibilityForHost:baseUrl]; + } + + @synchronized(self) { + SWGApiClient * client = [_pool objectForKey:baseUrl]; + if (client == nil) { + client = [[SWGApiClient alloc] initWithBaseURL:[NSURL URLWithString:baseUrl]]; + [client registerHTTPOperationClass:[AFJSONRequestOperation class]]; + client.parameterEncoding = AFJSONParameterEncoding; + [_pool setValue:client forKey:baseUrl ]; + if(loggingEnabled) + NSLog(@"new client for path %@", baseUrl); + } + if(loggingEnabled) + NSLog(@"returning client for path %@", baseUrl); + return client; + } +} + +-(void)setHeaderValue:(NSString*) value + forKey:(NSString*) forKey { + [self setDefaultHeader:forKey value:value]; +} + ++(unsigned long)requestQueueSize { + return [queuedRequests count]; +} + ++(NSNumber*) nextRequestId { + long nextId = ++requestId; + if(loggingEnabled) + NSLog(@"got id %ld", nextId); + return [NSNumber numberWithLong:nextId]; +} + ++(NSNumber*) queueRequest { + NSNumber* requestId = [SWGApiClient nextRequestId]; + if(loggingEnabled) + NSLog(@"added %@ to request queue", requestId); + [queuedRequests addObject:requestId]; + return requestId; +} + ++(void) cancelRequest:(NSNumber*)requestId { + [queuedRequests removeObject:requestId]; +} + ++(NSString*) escape:(id)unescaped { + if([unescaped isKindOfClass:[NSString class]]){ + return (NSString *)CFBridgingRelease + (CFURLCreateStringByAddingPercentEscapes( + NULL, + (__bridge CFStringRef) unescaped, + NULL, + (CFStringRef)@"!*'();:@&=+$,/?%#[]", + kCFStringEncodingUTF8)); + } + else { + return [NSString stringWithFormat:@"%@", unescaped]; + } +} + +-(Boolean) executeRequestWithId:(NSNumber*) requestId { + NSSet* matchingItems = [queuedRequests objectsPassingTest:^BOOL(id obj, BOOL *stop) { + if([obj intValue] == [requestId intValue]) + return TRUE; + else return FALSE; + }]; + + if(matchingItems.count == 1) { + if(loggingEnabled) + NSLog(@"removing request id %@", requestId); + [queuedRequests removeObject:requestId]; + return true; + } + else + return false; +} + +-(id)initWithBaseURL:(NSURL *)url { + self = [super initWithBaseURL:url]; + if (!self) + return nil; + return self; +} + ++(AFNetworkReachabilityStatus) getReachabilityStatus { + return reachabilityStatus; +} + ++(void) setReachabilityChangeBlock:(void(^)(int))changeBlock { + reachabilityChangeBlock = changeBlock; +} + ++(void) setOfflineState:(BOOL) state { + offlineState = state; +} + ++(void) configureCacheReachibilityForHost:(NSString*)host { + [[SWGApiClient sharedClientFromPool:host ] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { + reachabilityStatus = status; + switch (status) { + case AFNetworkReachabilityStatusUnknown: + if(loggingEnabled) + NSLog(@"reachability changed to AFNetworkReachabilityStatusUnknown"); + [SWGApiClient setOfflineState:true]; + break; + + case AFNetworkReachabilityStatusNotReachable: + if(loggingEnabled) + NSLog(@"reachability changed to AFNetworkReachabilityStatusNotReachable"); + [SWGApiClient setOfflineState:true]; + break; + + case AFNetworkReachabilityStatusReachableViaWWAN: + if(loggingEnabled) + NSLog(@"reachability changed to AFNetworkReachabilityStatusReachableViaWWAN"); + [SWGApiClient setOfflineState:false]; + break; + + case AFNetworkReachabilityStatusReachableViaWiFi: + if(loggingEnabled) + NSLog(@"reachability changed to AFNetworkReachabilityStatusReachableViaWiFi"); + [SWGApiClient setOfflineState:false]; + break; + default: + break; + } + // call the reachability block, if configured + if(reachabilityChangeBlock != nil) { + reachabilityChangeBlock(status); + } + }]; +} + +-(NSString*) pathWithQueryParamsToString:(NSString*) path + queryParams:(NSDictionary*) queryParams { + NSString * separator = nil; + int counter = 0; + + NSMutableString * requestUrl = [NSMutableString stringWithFormat:@"%@", path]; + if(queryParams != nil){ + for(NSString * key in [queryParams keyEnumerator]){ + if(counter == 0) separator = @"?"; + else separator = @"&"; + NSString * value; + if([[queryParams valueForKey:key] isKindOfClass:[NSString class]]){ + value = [SWGApiClient escape:[queryParams valueForKey:key]]; + } + else { + value = [NSString stringWithFormat:@"%@", [queryParams valueForKey:key]]; + } + [requestUrl appendString:[NSString stringWithFormat:@"%@%@=%@", separator, + [SWGApiClient escape:key], value]]; + counter += 1; + } + } + return requestUrl; +} + +- (NSString*)descriptionForRequest:(NSURLRequest*)request { + return [[request URL] absoluteString]; +} + +- (void)logRequest:(NSURLRequest*)request { + NSLog(@"request: %@", [self descriptionForRequest:request]); +} + +- (void)logResponse:(id)data forRequest:(NSURLRequest*)request error:(NSError*)error { + NSLog(@"request: %@ response: %@ ", [self descriptionForRequest:request], data ); +} + + +-(NSNumber*) dictionary:(NSString*) path + method:(NSString*) method + queryParams:(NSDictionary*) queryParams + body:(id) body + headerParams:(NSDictionary*) headerParams + requestContentType:(NSString*) requestContentType + responseContentType:(NSString*) responseContentType + completionBlock:(void (^)(NSDictionary*, NSError *))completionBlock { + + NSMutableURLRequest * request = nil; + + if ([body isKindOfClass:[SWGFile class]]){ + SWGFile * file = (SWGFile*) body; + + request = [self multipartFormRequestWithMethod:@"POST" + path:path + parameters:nil + constructingBodyWithBlock: ^(id formData) { + [formData appendPartWithFileData:[file data] + name:@"image" + fileName:[file name] + mimeType:[file mimeType]]; + }]; + } + else { + request = [self requestWithMethod:method + path:[self pathWithQueryParamsToString:path queryParams:queryParams] + parameters:body]; + } + BOOL hasHeaderParams = false; + if(headerParams != nil && [headerParams count] > 0) + hasHeaderParams = true; + if(offlineState) { + NSLog(@"%@ cache forced", path); + [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad]; + } + else if(!hasHeaderParams && [method isEqualToString:@"GET"] && cacheEnabled) { + NSLog(@"%@ cache enabled", path); + [request setCachePolicy:NSURLRequestUseProtocolCachePolicy]; + } + else { + NSLog(@"%@ cache disabled", path); + [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; + } + + if(body != nil) { + if([body isKindOfClass:[NSDictionary class]] || [body isKindOfClass:[NSArray class]]){ + [request setValue:requestContentType forHTTPHeaderField:@"Content-Type"]; + } + else if ([body isKindOfClass:[SWGFile class]]) {} + else { + NSAssert(false, @"unsupported post type!"); + } + } + if(headerParams != nil){ + for(NSString * key in [headerParams keyEnumerator]){ + [request setValue:[headerParams valueForKey:key] forHTTPHeaderField:key]; + } + } + [request setValue:[headerParams valueForKey:responseContentType] forHTTPHeaderField:@"Accept"]; + + // Always disable cookies! + [request setHTTPShouldHandleCookies:NO]; + + + if (self.logRequests) { + [self logRequest:request]; + } + + NSNumber* requestId = [SWGApiClient queueRequest]; + AFJSONRequestOperation *op = + [AFJSONRequestOperation + JSONRequestOperationWithRequest:request + success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { + if([self executeRequestWithId:requestId]) { + if(self.logServerResponses) + [self logResponse:JSON forRequest:request error:nil]; + completionBlock(JSON, nil); + } + } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id data) { + if([self executeRequestWithId:requestId]) { + if(self.logServerResponses) + [self logResponse:nil forRequest:request error:error]; + completionBlock(nil, error); + } + } + ]; + + [self enqueueHTTPRequestOperation:op]; + return requestId; +} + +-(NSNumber*) stringWithCompletionBlock:(NSString*) path + method:(NSString*) method + queryParams:(NSDictionary*) queryParams + body:(id) body + headerParams:(NSDictionary*) headerParams + requestContentType:(NSString*) requestContentType + responseContentType:(NSString*) responseContentType + completionBlock:(void (^)(NSString*, NSError *))completionBlock { + AFHTTPClient *client = self; + client.parameterEncoding = AFJSONParameterEncoding; + + NSMutableURLRequest * request = nil; + + if ([body isKindOfClass:[SWGFile class]]){ + SWGFile * file = (SWGFile*) body; + + request = [self multipartFormRequestWithMethod:@"POST" + path:path + parameters:nil + constructingBodyWithBlock: ^(id formData) { + [formData appendPartWithFileData:[file data] + name:@"image" + fileName:[file name] + mimeType:[file mimeType]]; + }]; + } + else { + request = [self requestWithMethod:method + path:[self pathWithQueryParamsToString:path queryParams:queryParams] + parameters:body]; + } + + BOOL hasHeaderParams = false; + if(headerParams != nil && [headerParams count] > 0) + hasHeaderParams = true; + if(offlineState) { + NSLog(@"%@ cache forced", path); + [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad]; + } + else if(!hasHeaderParams && [method isEqualToString:@"GET"] && cacheEnabled) { + NSLog(@"%@ cache enabled", path); + [request setCachePolicy:NSURLRequestUseProtocolCachePolicy]; + } + else { + NSLog(@"%@ cache disabled", path); + [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; + } + + if(body != nil) { + if([body isKindOfClass:[NSDictionary class]]){ + [request setValue:requestContentType forHTTPHeaderField:@"Content-Type"]; + } + else if ([body isKindOfClass:[SWGFile class]]){} + else { + NSAssert(false, @"unsupported post type!"); + } + } + if(headerParams != nil){ + for(NSString * key in [headerParams keyEnumerator]){ + [request setValue:[headerParams valueForKey:key] forHTTPHeaderField:key]; + } + } + [request setValue:[headerParams valueForKey:responseContentType] forHTTPHeaderField:@"Accept"]; + + // Always disable cookies! + [request setHTTPShouldHandleCookies:NO]; + + NSNumber* requestId = [SWGApiClient queueRequest]; + AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request]; + [op setCompletionBlockWithSuccess: + ^(AFHTTPRequestOperation *resp, + id responseObject) { + NSString *response = [resp responseString]; + if([self executeRequestWithId:requestId]) { + if(self.logServerResponses) + [self logResponse:responseObject forRequest:request error:nil]; + completionBlock(response, nil); + } + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + if([self executeRequestWithId:requestId]) { + if(self.logServerResponses) + [self logResponse:nil forRequest:request error:error]; + completionBlock(nil, error); + } + }]; + + [self enqueueHTTPRequestOperation:op]; + return requestId; +} + +@end diff --git a/modules/swagger-codegen/src/main/resources/objc/SWGDate.h b/modules/swagger-codegen/src/main/resources/objc/SWGDate.h new file mode 100644 index 000000000000..2c6c7cfe01b0 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/SWGDate.h @@ -0,0 +1,12 @@ +#import +#import "SWGObject.h" + +@interface SWGDate : SWGObject { +@private + NSDate *_date; +} +@property(nonatomic, readonly) NSDate* date; + +- (id) initWithValues: (NSString*)input; +-(NSString*) toString; +@end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/objc/SWGDate.m b/modules/swagger-codegen/src/main/resources/objc/SWGDate.m new file mode 100644 index 000000000000..07a1405626b7 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/SWGDate.m @@ -0,0 +1,34 @@ +#import "SWGDate.h" + +@implementation SWGDate + +@synthesize date = _date; + +- (id) initWithValues:(NSString*)input { + if([input isKindOfClass:[NSString class]]){ + NSDateFormatter* df = [NSDateFormatter new]; + NSLocale *locale = [[NSLocale new] + initWithLocaleIdentifier:@"en_US_POSIX"]; + [df setLocale:locale]; + [df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"]; + + _date = [df dateFromString:input]; + } + else if([input isKindOfClass:[NSNumber class]]) { + NSTimeInterval interval = [input doubleValue]; + _date = [[NSDate alloc] initWithTimeIntervalSince1970:interval]; + } + return self; +} + +-(NSString*) toString { + NSDateFormatter* df = [NSDateFormatter new]; + NSLocale *locale = [[NSLocale new] + initWithLocaleIdentifier:@"en_US_POSIX"]; + [df setLocale:locale]; + [df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"]; + + return [df stringFromDate:_date]; +} + +@end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/objc/SWGFile.h b/modules/swagger-codegen/src/main/resources/objc/SWGFile.h new file mode 100644 index 000000000000..fe6e81c289d2 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/SWGFile.h @@ -0,0 +1,13 @@ +#import + +@interface SWGFile : NSObject + +@property(nonatomic, readonly) NSString* name; +@property(nonatomic, readonly) NSString* mimeType; +@property(nonatomic, readonly) NSData* data; + +- (id) initWithNameData: (NSString*) filename + mimeType: (NSString*) mimeType + data: (NSData*) data; + + @end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/objc/SWGFile.m b/modules/swagger-codegen/src/main/resources/objc/SWGFile.m new file mode 100644 index 000000000000..42552767af4d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/SWGFile.m @@ -0,0 +1,26 @@ +#import "SWGFile.h" + +@implementation SWGFile + +@synthesize name = _name; +@synthesize mimeType = _mimeType; +@synthesize data = _data; + +- (id) init { + self = [super init]; + return self; +} + +- (id) initWithNameData: (NSString*) filename + mimeType: (NSString*) fileMimeType + data: (NSData*) data { + self = [super init]; + if(self) { + _name = filename; + _mimeType = fileMimeType; + _data = data; + } + return self; +} + +@end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/objc/SWGObject.h b/modules/swagger-codegen/src/main/resources/objc/SWGObject.h new file mode 100644 index 000000000000..031bae692798 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/SWGObject.h @@ -0,0 +1,6 @@ +#import + +@interface SWGObject : NSObject +- (id) initWithValues:(NSDictionary*)dict; +- (NSDictionary*) asDictionary; +@end diff --git a/modules/swagger-codegen/src/main/resources/objc/SWGObject.m b/modules/swagger-codegen/src/main/resources/objc/SWGObject.m new file mode 100644 index 000000000000..9b37b3592b1f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/SWGObject.m @@ -0,0 +1,17 @@ +#import "SWGObject.h" + +@implementation SWGObject + +- (id) initWithValues:(NSDictionary*)dict { + return self; +} + +- (NSDictionary*) asDictionary{ + return [NSDictionary init]; +} + +- (NSString*)description { + return [NSString stringWithFormat:@"%@ %@", [super description], [self asDictionary]]; +} + +@end diff --git a/modules/swagger-codegen/src/main/resources/objc/api-body.mustache b/modules/swagger-codegen/src/main/resources/objc/api-body.mustache new file mode 100644 index 000000000000..22e2262668b3 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/api-body.mustache @@ -0,0 +1,234 @@ +{{#operations}} +#import "{{classname}}.h" +#import "SWGFile.h" +#import "SWGApiClient.h" +{{#imports}}#import "{{import}}.h" +{{/imports}} +{{newline}} + + +@implementation {{classname}} +static NSString * basePath = @"{{basePath}}"; + ++({{classname}}*) apiWithHeader:(NSString*)headerValue key:(NSString*)key { + static {{classname}}* singletonAPI = nil; + + if (singletonAPI == nil) { + singletonAPI = [[{{classname}} alloc] init]; + [singletonAPI addHeader:headerValue forKey:key]; + } + return singletonAPI; +} + ++(void) setBasePath:(NSString*)path { + basePath = path; +} + ++(NSString*) getBasePath { + return basePath; +} + +-(SWGApiClient*) apiClient { + return [SWGApiClient sharedClientFromPool:basePath]; +} + +-(void) addHeader:(NSString*)value forKey:(NSString*)key { + [[self apiClient] setHeaderValue:value forKey:key]; +} + +-(id) init { + self = [super init]; + [self apiClient]; + return self; +} + +-(void) setHeaderValue:(NSString*) value + forKey:(NSString*)key { + [[self apiClient] setHeaderValue:value forKey:key]; +} + +-(unsigned long) requestQueueSize { + return [SWGApiClient requestQueueSize]; +} + + +{{#operation}} +-(NSNumber*) {{nickname}}WithCompletionBlock{{^allParams}}: {{/allParams}}{{#allParams}}{{#secondaryParam}} + {{paramName}}{{/secondaryParam}}:({{{dataType}}}) {{paramName}}{{newline}} {{/allParams}} + {{#returnBaseType}}{{#hasParams}}completionHandler: {{/hasParams}}(void (^)({{returnType}} output, NSError* error))completionBlock{{/returnBaseType}} + {{^returnBaseType}}{{#hasParams}}completionHandler: {{/hasParams}}(void (^)(NSError* error))completionBlock{{/returnBaseType}} { + + id m_body = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}nil{{/bodyParam}}; + NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@{{path}}", basePath]; + + // remove format in URL if needed + if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) + [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; + + {{#pathParams}}[requestUrl replaceCharactersInRange: [requestUrl rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"{{baseName}}", @"}"]] withString: [SWGApiClient escape:{{paramName}}]]; + {{/pathParams}} + + NSString* requestContentType = @"application/json"; + NSString* responseContentType = @"application/json"; + + NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; + {{#queryParams}}if({{paramName}} != nil) + queryParams[@"{{baseName}}"] = {{paramName}};{{/queryParams}} + NSMutableDictionary* headerParams = [[NSMutableDictionary alloc] init]; + {{#headerParams}}if({{paramName}} != nil) + headerParams[@"{{baseName}}"] = {{paramName}};{{/headerParams}} + + id bodyDictionary = nil; + {{#bodyParam}} + if(m_body != nil && [m_body isKindOfClass:[NSArray class]]){ + NSMutableArray * objs = [[NSMutableArray alloc] init]; + for (id dict in (NSArray*)m_body) { + if([dict respondsToSelector:@selector(asDictionary)]) { + [objs addObject:[(SWGObject*)dict asDictionary]]; + } + else{ + [objs addObject:dict]; + } + } + bodyDictionary = objs; + } + else if([m_body respondsToSelector:@selector(asDictionary)]) { + bodyDictionary = [(SWGObject*)m_body asDictionary]; + } + else if([m_body isKindOfClass:[NSString class]]) { + // convert it to a dictionary + NSError * error; + NSString * str = (NSString*)m_body; + NSDictionary *JSON = + [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] + options:NSJSONReadingMutableContainers + error:&error]; + bodyDictionary = JSON; + } + else if([m_body isKindOfClass: [SWGFile class]]) { + requestContentType = @"form-data"; + bodyDictionary = m_body; + } + else{ + NSLog(@"don't know what to do with %@", m_body); + } + + {{/bodyParam}} + + {{#requiredParamCount}} + {{#requiredParams}} + if({{paramName}} == nil) { + // error + } + {{/requiredParams}} + {{/requiredParamCount}} + + SWGApiClient* client = [SWGApiClient sharedClientFromPool:basePath]; + + {{#returnContainer}} + return [client dictionary: requestUrl + method: @"{{httpMethod}}" + queryParams: queryParams + body: bodyDictionary + headerParams: headerParams + requestContentType: requestContentType + responseContentType: responseContentType + completionBlock: ^(NSDictionary *data, NSError *error) { + if (error) { + {{#returnBaseType}}completionBlock(nil, error);{{/returnBaseType}} + {{^returnBaseType}}completionBlock(error);{{/returnBaseType}} + return; + } + + {{#returnBaseType}} + if([data isKindOfClass:[NSArray class]]){ + NSMutableArray * objs = [[NSMutableArray alloc] initWithCapacity:[data count]]; + for (NSDictionary* dict in (NSArray*)data) { + {{#returnTypeIsPrimitive}} + // {{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}"){{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}}{{/instantiationType}}{{newline}} + {{returnBaseType}}* d = [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithString: data]; + {{/returnTypeIsPrimitive}} + {{^returnTypeIsPrimitive}} + {{{returnBaseType}}}* d = [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithValues: dict]; + {{/returnTypeIsPrimitive}} + [objs addObject:d]; + } + completionBlock(objs, nil); + } + {{#returnSimpleType}} + {{#returnTypeIsPrimitive}}{{#returnBaseType}}completionBlock( [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithString: data], nil;{{/returnBaseType}} + {{/returnTypeIsPrimitive}} + {{^returnTypeIsPrimitive}} + {{#returnBaseType}}completionBlock( [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithValues: data], nil);{{/returnBaseType}} + {{/returnTypeIsPrimitive}} + {{/returnSimpleType}} + + {{/returnBaseType}} + }]; + {{/returnContainer}} + + {{#returnSimpleType}} + {{#returnTypeIsPrimitive}} + {{#returnBaseType}} + return [client stringWithCompletionBlock: requestUrl + method: @"{{httpMethod}}" + queryParams: queryParams + body: bodyDictionary + headerParams: headerParams + requestContentType: requestContentType + responseContentType: responseContentType + completionBlock: ^(NSString *data, NSError *error) { + if (error) { + completionBlock(nil, error); + return; + } + {{returnBaseType}} *result = data ? [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithString: data] : nil; + completionBlock(result, nil); + }];{{/returnBaseType}} + {{^returnBaseType}} + return [client stringWithCompletionBlock:requestUrl + method:@"{{httpMethod}}" + queryParams:queryParams + body:bodyDictionary + headerParams:headerParams + requestContentType: requestContentType + responseContentType: responseContentType + completionBlock:^(NSString *data, NSError *error) { + if (error) { + completionBlock(error); + return; + } + completionBlock(nil); + }]; + {{/returnBaseType}}{{/returnTypeIsPrimitive}} + {{#returnBaseType}}{{^returnTypeIsPrimitive}} + return [client dictionary:requestUrl + method:@"{{httpMethod}}" + queryParams:queryParams + body:bodyDictionary + headerParams:headerParams + requestContentType:requestContentType + responseContentType:responseContentType + completionBlock:^(NSDictionary *data, NSError *error) { + if (error) { + {{#returnBaseType}}completionBlock(nil, error);{{/returnBaseType}} + {{^returnBaseType}}completionBlock(error);{{/returnBaseType}} + return; + } + {{#returnBaseType}} + {{returnBaseType}} *result = nil; + if (data) { + result = [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithValues: data]; + } + {{#returnBaseType}}completionBlock(result , nil);{{/returnBaseType}} + {{/returnBaseType}} + }]; + {{/returnTypeIsPrimitive}}{{/returnBaseType}}{{/returnSimpleType}} +{{newline}} +} + +{{/operation}} + +{{newline}} +{{/operations}} +@end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/objc/api-header.mustache b/modules/swagger-codegen/src/main/resources/objc/api-header.mustache new file mode 100644 index 000000000000..7bc55a0fade7 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/api-header.mustache @@ -0,0 +1,29 @@ +#import +{{#imports}}#import "{{import}}.h" +{{/imports}} +{{newline}} + +{{#operations}} +@interface {{classname}}: NSObject + +-(void) addHeader:(NSString*)value forKey:(NSString*)key; +-(unsigned long) requestQueueSize; ++({{classname}}*) apiWithHeader:(NSString*)headerValue key:(NSString*)key; ++(void) setBasePath:(NSString*)basePath; ++(NSString*) getBasePath; +{{#operation}} +/** + + {{#summary}}{{{summary}}}{{/summary}} + {{#notes}}{{{notes}}}{{/notes}} + + {{#allParams}}@param {{paramName}} {{description}} + {{/allParams}} + */ +-(NSNumber*) {{nickname}}WithCompletionBlock {{^allParams}}:{{/allParams}}{{#allParams}}{{#secondaryParam}} + {{paramName}}{{/secondaryParam}}: ({{{dataType}}}) {{paramName}}{{/allParams}} +{{#returnBaseType}}{{#hasParams}} completionHandler: {{/hasParams}}(void (^)({{returnType}} output, NSError* error))completionBlock;{{/returnBaseType}} +{{^returnBaseType}}{{#hasParams}} completionHandler: {{/hasParams}}(void (^)(NSError* error))completionBlock;{{/returnBaseType}} +{{/operation}} +{{/operations}} +@end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/objc/model-body.mustache b/modules/swagger-codegen/src/main/resources/objc/model-body.mustache new file mode 100644 index 000000000000..43555d48a19e --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/model-body.mustache @@ -0,0 +1,94 @@ +{{#models}} +{{#model}} +#import "SWGDate.h" +#import "{{classname}}.h" + +@implementation {{classname}}{{#parent}}: {{parent}}{{/parent}} + +{{#hasVars}} +-(id){{#vars}}{{name}}: ({{datatype}}) {{name}}{{^hasMore}} { {{/hasMore}} + {{/vars}} + {{#vars}}_{{name}} = {{name}}; + {{/vars}} + return self; +} +{{/hasVars}} +-(id) initWithValues:(NSDictionary*)dict +{ + self = [super init]; + if(self) { + {{#vars}}{{#isPrimitiveType}}_{{name}} = dict[@"{{baseName}}"];{{/isPrimitiveType}} + {{#complexType}}id {{name}}_dict = dict[@"{{baseName}}"];{{#isContainer}} + if([{{name}}_dict isKindOfClass:[NSArray class]]) { + NSMutableArray * objs = [[NSMutableArray alloc] initWithCapacity:[(NSArray*){{name}}_dict count]]; + if([(NSArray*){{name}}_dict count] > 0) { + for (NSDictionary* dict in (NSArray*){{name}}_dict) { + {{{complexType}}}* d = [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{complexType}}} {{/instantiationType}} alloc] initWithValues:dict]; + [objs addObject:d]; + } + _{{{name}}} = [[NSArray alloc] initWithArray:objs]; + } + else { + _{{name}} = [[NSArray alloc] init]; + } + } + else { + _{{name}} = [[NSArray alloc] init]; + }{{/isContainer}} + {{#isNotContainer}}if({{name}}_dict != nil) + _{{name}} = [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{complexType}}} {{/instantiationType}} alloc]initWithValues:{{name}}_dict]; + {{/isNotContainer}} + {{/complexType}}{{/vars}} + } + return self; +} + +-(NSDictionary*) asDictionary { + NSMutableDictionary* dict = [[NSMutableDictionary alloc] init]; + {{#vars}}{{#complexType}} + if(_{{name}} != nil){ + {{#isContainer}} + if([_{{name}} isKindOfClass:[NSArray class]]){ + NSMutableArray * array = [[NSMutableArray alloc] init]; + for( {{complexType}} *{{name}} in _{{name}}) { + [array addObject:[(SWGObject*){{name}} asDictionary]]; + } + dict[@"{{name}}"] = array; + } + {{/isContainer}} + {{^isContainer}} + if(_{{name}} && [_{{name}} isKindOfClass:[SWGDate class]]) { + NSString * dateString = [(SWGDate*)_{{name}} toString]; + if(dateString){ + dict[@"{{name}}"] = dateString; + } + } + else { + if(_{{name}} != nil) + dict[@"{{baseName}}"] = [(SWGObject*)_{{name}} asDictionary]; + } + {{/isContainer}} + } + {{/complexType}} + {{#isPrimitiveType}}{{#isNotContainer}} + if(_{{name}} != nil) + dict[@"{{baseName}}"] = _{{name}}; + {{/isNotContainer}} + {{#isContainer}} + if(_{{name}} != nil) { + if([_{{name}} isKindOfClass:[NSArray class]]) { + dict[@"_{{name}}"] = [[NSArray alloc] initWithArray: (NSArray*) _{{name}} copyItems:true]; + } + else if([_{{name}} isKindOfClass:[NSDictionary class]]) { + dict[@"{{name}}"] = [[NSDictionary alloc] initWithDictionary:(NSDictionary*)_{{name}} copyItems:true]; + } + } + {{/isContainer}} + {{/isPrimitiveType}}{{/vars}} + NSDictionary* output = [dict copy]; + return output; +} + +{{/model}} +@end +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/objc/model-header.mustache b/modules/swagger-codegen/src/main/resources/objc/model-header.mustache new file mode 100644 index 000000000000..e8dc61316e05 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/model-header.mustache @@ -0,0 +1,24 @@ +#import +#import "SWGObject.h" +{{#imports}}#import "{{import}}.h" +{{/imports}} +{{newline}} +{{#models}} +{{#model}} + +@interface {{classname}} : {{^parent}}SWGObject{{/parent}}{{#parent}}{{parent}}{{/parent}} + +{{#vars}} +@property(nonatomic) {{datatype}} {{name}}; {{#description}}/* {{{description}}} {{#isNotRequired}}[optional]{{/isNotRequired}} */{{/description}}{{newline}} +{{/vars}} +{{#hasVars}} +- (id) {{#vars}}{{name}}: ({{datatype}}) {{name}}{{#hasMore}} + {{/hasMore}}{{^hasMore}};{{/hasMore}} + {{/vars}} +{{/hasVars}} +- (id) initWithValues: (NSDictionary*)dict; +- (NSDictionary*) asDictionary; +{{newline}} +@end +{{/model}} +{{/models}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/php/Swagger.mustache b/modules/swagger-codegen/src/main/resources/php/Swagger.mustache new file mode 100644 index 000000000000..7e1f24f49b69 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/php/Swagger.mustache @@ -0,0 +1,231 @@ +apiKey = $apiKey; + $this->apiServer = $apiServer; + } + + + /** + * @param string $resourcePath path to method endpoint + * @param string $method method to call + * @param array $queryParams parameters to be place in query URL + * @param array $postData parameters to be placed in POST body + * @param array $headerParams parameters to be place in request header + * @return mixed + */ + public function callAPI($resourcePath, $method, $queryParams, $postData, + $headerParams) { + + $headers = array(); + + # Allow API key from $headerParams to override default + $added_api_key = False; + if ($headerParams != null) { + foreach ($headerParams as $key => $val) { + $headers[] = "$key: $val"; + if ($key == 'api_key') { + $added_api_key = True; + } + } + } + if (! $added_api_key) { + $headers[] = "api_key: " . $this->apiKey; + } + + if (is_object($postData) or is_array($postData)) { + $postData = json_encode($this->sanitizeForSerialization($postData)); + } + + $url = $this->apiServer . $resourcePath; + + $curl = curl_init(); + curl_setopt($curl, CURLOPT_TIMEOUT, 5); + // return the result on success, rather than just TRUE + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); + + if (! empty($queryParams)) { + $url = ($url . '?' . http_build_query($queryParams)); + } + + if ($method == self::$POST) { + curl_setopt($curl, CURLOPT_POST, true); + curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); + } else if ($method == self::$PUT) { + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT"); + curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); + } else if ($method == self::$DELETE) { + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE"); + curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); + } else if ($method != self::$GET) { + throw new Exception('Method ' . $method . ' is not recognized.'); + } + curl_setopt($curl, CURLOPT_URL, $url); + + // Make the request + $response = curl_exec($curl); + $response_info = curl_getinfo($curl); + + // Handle the response + if ($response_info['http_code'] == 0) { + throw new Exception("TIMEOUT: api call to " . $url . + " took more than 5s to return" ); + } else if ($response_info['http_code'] == 200) { + $data = json_decode($response); + } else if ($response_info['http_code'] == 401) { + throw new Exception("Unauthorized API request to " . $url . + ": ".json_decode($response)->message ); + } else if ($response_info['http_code'] == 404) { + $data = null; + } else { + throw new Exception("Can't connect to the api: " . $url . + " response code: " . + $response_info['http_code']); + } + return $data; + } + + /** + * Build a JSON POST object + */ + protected function sanitizeForSerialization($data) + { + if (is_scalar($data) || null === $data) { + $sanitized = $data; + } else if ($data instanceof \DateTime) { + $sanitized = $data->format(\DateTime::ISO8601); + } else if (is_array($data)) { + foreach ($data as $property => $value) { + $data[$property] = $this->sanitizeForSerialization($value); + } + $sanitized = $data; + } else if (is_object($data)) { + $values = array(); + foreach (array_keys($data::$swaggerTypes) as $property) { + $values[$property] = $this->sanitizeForSerialization($data->$property); + } + $sanitized = $values; + } else { + $sanitized = (string)$data; + } + + return $sanitized; + } + + /** + * Take value and turn it into a string suitable for inclusion in + * the path, by url-encoding. + * @param string $value a string which will be part of the path + * @return string the serialized object + */ + public static function toPathValue($value) { + return rawurlencode($value); + } + + /** + * Take value and turn it into a string suitable for inclusion in + * the query, by imploding comma-separated if it's an object. + * If it's a string, pass through unchanged. It will be url-encoded + * later. + * @param object $object an object to be serialized to a string + * @return string the serialized object + */ + public static function toQueryValue($object) { + if (is_array($object)) { + return implode(',', $object); + } else { + return $object; + } + } + + /** + * Just pass through the header value for now. Placeholder in case we + * find out we need to do something with header values. + * @param string $value a string which will be part of the header + * @return string the header string + */ + public static function toHeaderValue($value) { + return $value; + } + + /** + * Deserialize a JSON string into an object + * + * @param object $object object or primitive to be deserialized + * @param string $class class name is passed as a string + * @return object an instance of $class + */ + + public static function deserialize($data, $class) + { + if (null === $data) { + $deserialized = null; + } elseif (substr($class, 0, 4) == 'map[') { + $inner = substr($class, 4, -1); + $values = array(); + if(strrpos($inner, ",") !== false) { + $subClass = explode(',', $inner, 2)[1]; + foreach ($data as $key => $value) { + $values[] = array($key => self::deserialize($value, $subClass)); + } + } + $deserialized = $values; + } elseif (substr($class, 0, 6) == 'array[') { + $subClass = substr($class, 6, -1); + foreach ($data as $key => $value) { + $values[] = self::deserialize($value, $subClass); + } + $deserialized = $values; + } elseif ($class == 'DateTime') { + $deserialized = new \DateTime($data); + } elseif (in_array($class, array('string', 'int', 'float', 'bool'))) { + settype($data, $class); + $deserialized = $data; + } else { + $instance = new $class(); + foreach ($instance::$swaggerTypes as $property => $type) { + if (isset($data->$property)) { + $instance->$property = self::deserialize($data->$property, $type); + } + } + $deserialized = $instance; + } + + return $deserialized; + } + +} + diff --git a/modules/swagger-codegen/src/main/resources/php/api.mustache b/modules/swagger-codegen/src/main/resources/php/api.mustache new file mode 100644 index 000000000000..82ea71740321 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/php/api.mustache @@ -0,0 +1,86 @@ +apiClient = $apiClient; + } + + {{#operation}} + /** + * {{{nickname}}} + * + * {{{summary}}} + {{#allParams}}* {{paramName}}, {{dataType}}: {{description}} {{^optional}}(required){{/optional}}{{#optional}}(optional){{/optional}} + * {{/allParams}} + * @return {{{returnType}}} + */ + + public function {{nickname}}({{#allParams}}${{paramName}}{{#optional}}=null{{/optional}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { + + // parse inputs + $resourcePath = "{{path}}"; + $resourcePath = str_replace("{format}", "json", $resourcePath); + $method = "{{httpMethod}}"; + $queryParams = array(); + $headerParams = array(); + $headerParams['Accept'] = '{{#produces}}{{mediaType}}{{#hasMore}},{{/hasMore}}{{/produces}}'; + $headerParams['Content-Type'] = '{{#consumes}}{{mediaType}}{{#hasMore}},{{/hasMore}}{{/consumes}}'; + + {{#queryParams}}// query params + if(${{paramName}} != null) { + $queryParams['{{paramName}}'] = $this->apiClient->toQueryValue(${{paramName}}); + }{{/queryParams}} + {{#headerParams}}// header params + if(${{paramName}} != null) { + $headerParams['{{paramName}}'] = $this->apiClient->toHeaderValue(${{paramName}}); + }{{/headerParams}} + {{#pathParams}}// path params + if(${{paramName}} != null) { + $resourcePath = str_replace("{" . "{{paramName}}" . "}", + $this->apiClient->toPathValue(${{paramName}}), $resourcePath); + }{{/pathParams}} + {{#bodyParams}}// body params + $body = null; + if (isset(${{paramName}})) { + $body = ${{paramName}}; + } + {{/bodyParams}} + + // make the API Call + $response = $this->apiClient->callAPI($resourcePath, $method, + $queryParams, $body, + $headerParams); + + {{#returnType}}if(! $response) { + return null; + } + + $responseObject = $this->apiClient->deserialize($response, + '{{returnType}}'); + return $responseObject;{{/returnType}} + } + {{/operation}} +{{newline}} +{{/operations}} +} diff --git a/modules/swagger-codegen/src/main/resources/php/model.mustache b/modules/swagger-codegen/src/main/resources/php/model.mustache new file mode 100644 index 000000000000..cc98fa352f37 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/php/model.mustache @@ -0,0 +1,40 @@ + '{{{datatype}}}'{{#hasMore}}, + {{/hasMore}}{{/vars}} + ); + + {{#vars}}{{#description}} + /** + * {{{description}}} + */{{/description}} + public ${{name}}; /* {{{datatype}}} */{{/vars}} +} +{{/model}} +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/python/__init__.mustache b/modules/swagger-codegen/src/main/resources/python/__init__.mustache new file mode 100644 index 000000000000..4b41ee706c70 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/python/__init__.mustache @@ -0,0 +1,9 @@ +#!/usr/bin/env python +"""Add all of the modules in the current directory to __all__""" +import os + +__all__ = [] + +for module in os.listdir(os.path.dirname(__file__)): + if module != '__init__.py' and module[-3:] == '.py': + __all__.append(module[:-3]) diff --git a/modules/swagger-codegen/src/main/resources/python/api.mustache b/modules/swagger-codegen/src/main/resources/python/api.mustache new file mode 100644 index 000000000000..1650effd9915 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/python/api.mustache @@ -0,0 +1,98 @@ +#!/usr/bin/env python +""" +WordAPI.py +Copyright 2014 Wordnik, Inc. + + Licensed 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. + +NOTE: This class is auto generated by the swagger code generator program. Do not edit the class manually. +""" +import sys +import os + +from models import * + + +{{#operations}} +class {{classname}}(object): + + def __init__(self, apiClient): + self.apiClient = apiClient + + {{newline}} + {{#operation}} + def {{nickname}}(self, {{#requiredParams}}{{paramName}}{{#defaultValue}} = None{{/defaultValue}}, {{/requiredParams}}**kwargs): + """{{summary}} + + Args: + {{#allParams}} + {{paramName}}, {{dataType}}: {{description}} {{^optional}}(required){{/optional}}{{#optional}}(optional){{/optional}} + {{newline}} + {{/allParams}} + {{newline}} + Returns: {{returnType}} + """ + + allParams = [{{#allParams}}'{{paramName}}'{{#hasMore}}, {{/hasMore}}{{/allParams}}] + + params = locals() + for (key, val) in params['kwargs'].iteritems(): + if key not in allParams: + raise TypeError("Got an unexpected keyword argument '%s' to method {{nickname}}" % key) + params[key] = val + del params['kwargs'] + + resourcePath = '{{path}}' + resourcePath = resourcePath.replace('{format}', 'json') + method = '{{httpMethod}}' + + queryParams = {} + headerParams = {} + $headerParams['Accept'] = '{{#produces}}{{mediaType}}{{#hasMore}},{{/hasMore}}{{/produces}}'; + $headerParams['Content-Type'] = '{{#consumes}}{{mediaType}}{{#hasMore}},{{/hasMore}}{{/consumes}}'; + + {{#queryParams}} + if ('{{paramName}}' in params): + queryParams['{{paramName}}'] = self.apiClient.toPathValue(params['{{paramName}}']) + {{/queryParams}} + + {{#headerParams}} + if ('{{paramName}}' in params): + headerParams['{{paramName}}'] = params['{{paramName}}'] + {{/headerParams}} + + {{#pathParams}} + if ('{{paramName}}' in params): + replacement = str(self.apiClient.toPathValue(params['{{paramName}}'])) + resourcePath = resourcePath.replace('{' + '{{baseName}}' + '}', + replacement) + {{/pathParams}} + + postData = (params['body'] if 'body' in params else None) + + response = self.apiClient.callAPI(resourcePath, method, queryParams, + postData, headerParams) + + {{#returnType}} + if not response: + return None + + responseObject = self.apiClient.deserialize(response, '{{returnType}}') + return responseObject + {{/returnType}} + {{newline}} + {{newline}} + {{/operation}} +{{newline}} +{{/operations}} +{{newline}} diff --git a/modules/swagger-codegen/src/main/resources/python/model.mustache b/modules/swagger-codegen/src/main/resources/python/model.mustache new file mode 100644 index 000000000000..39547c900505 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/python/model.mustache @@ -0,0 +1,40 @@ +#!/usr/bin/env python +""" +Copyright 2014 Wordnik, Inc. + + Licensed 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. +""" +{{#models}} +{{#model}} + +class {{classname}}: + """NOTE: This class is auto generated by the swagger code generator program. + Do not edit the class manually.""" + + + def __init__(self): + self.swaggerTypes = { + {{#vars}} + '{{name}}': '{{{datatype}}}'{{#hasMore}}, + {{/hasMore}} + {{/vars}}{{newline}} + } + + + {{#vars}} + {{#description}}#{{description}} + {{/description}} + self.{{name}} = None # {{{datatype}}} + {{/vars}} +{{/model}} +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/python/swagger.mustache b/modules/swagger-codegen/src/main/resources/python/swagger.mustache new file mode 100644 index 000000000000..e62f854c7bf8 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/python/swagger.mustache @@ -0,0 +1,208 @@ +#!/usr/bin/env python +"""Wordnik.com's Swagger generic API client. This client handles the client- +server communication, and is invariant across implementations. Specifics of +the methods and models for each application are generated from the Swagger +templates.""" + +import sys +import os +import re +import urllib +import urllib2 +import httplib +import json +import datetime + +from models import * + + +class ApiClient: + """Generic API client for Swagger client library builds""" + + def __init__(self, apiKey=None, apiServer=None): + if apiKey == None: + raise Exception('You must pass an apiKey when instantiating the ' + 'APIClient') + self.apiKey = apiKey + self.apiServer = apiServer + self.cookie = None + + def callAPI(self, resourcePath, method, queryParams, postData, + headerParams=None): + + url = self.apiServer + resourcePath + headers = {} + if headerParams: + for param, value in headerParams.iteritems(): + headers[param] = value + + #headers['Content-type'] = 'application/json' + headers['api_key'] = self.apiKey + + if self.cookie: + headers['Cookie'] = self.cookie + + data = None + + if queryParams: + # Need to remove None values, these should not be sent + sentQueryParams = {} + for param, value in queryParams.items(): + if value != None: + sentQueryParams[param] = value + url = url + '?' + urllib.urlencode(sentQueryParams) + + if method in ['GET']: + + #Options to add statements later on and for compatibility + pass + + elif method in ['POST', 'PUT', 'DELETE']: + + if postData: + headers['Content-type'] = 'application/json' + data = self.sanitizeForSerialization(postData) + data = json.dumps(data) + + else: + raise Exception('Method ' + method + ' is not recognized.') + + request = MethodRequest(method=method, url=url, headers=headers, + data=data) + + # Make the request + response = urllib2.urlopen(request) + if 'Set-Cookie' in response.headers: + self.cookie = response.headers['Set-Cookie'] + string = response.read() + + try: + data = json.loads(string) + except ValueError: # PUT requests don't return anything + data = None + + return data + + def toPathValue(self, obj): + """Convert a string or object to a path-friendly value + Args: + obj -- object or string value + Returns: + string -- quoted value + """ + if type(obj) == list: + return urllib.quote(','.join(obj)) + else: + return urllib.quote(str(obj)) + + def sanitizeForSerialization(self, obj): + """Dump an object into JSON for POSTing.""" + + if type(obj) == type(None): + return None + elif type(obj) in [str, int, long, float, bool]: + return obj + elif type(obj) == list: + return [self.sanitizeForSerialization(subObj) for subObj in obj] + elif type(obj) == datetime.datetime: + return obj.isoformat() + else: + if type(obj) == dict: + objDict = obj + else: + objDict = obj.__dict__ + return {key: self.sanitizeForSerialization(val) + for (key, val) in objDict.iteritems() + if key != 'swaggerTypes'} + + if type(postData) == list: + # Could be a list of objects + if type(postData[0]) in safeToDump: + data = json.dumps(postData) + else: + data = json.dumps([datum.__dict__ for datum in postData]) + elif type(postData) not in safeToDump: + data = json.dumps(postData.__dict__) + + def deserialize(self, obj, objClass): + """Derialize a JSON string into an object. + + Args: + obj -- string or object to be deserialized + objClass -- class literal for deserialzied object, or string + of class name + Returns: + object -- deserialized object""" + + # Have to accept objClass as string or actual type. Type could be a + # native Python type, or one of the model classes. + if type(objClass) == str: + if 'list[' in objClass: + match = re.match('list\[(.*)\]', objClass) + subClass = match.group(1) + return [self.deserialize(subObj, subClass) for subObj in obj] + + if (objClass in ['int', 'float', 'long', 'dict', 'list', 'str', 'bool', 'datetime']): + objClass = eval(objClass) + else: # not a native type, must be model class + objClass = eval(objClass + '.' + objClass) + + if objClass in [int, long, float, dict, list, str, bool]: + return objClass(obj) + elif objClass == datetime: + # Server will always return a time stamp in UTC, but with + # trailing +0000 indicating no offset from UTC. So don't process + # last 5 characters. + return datetime.datetime.strptime(obj[:-5], + "%Y-%m-%dT%H:%M:%S.%f") + + instance = objClass() + + for attr, attrType in instance.swaggerTypes.iteritems(): + if obj is not None and attr in obj and type(obj) in [list, dict]: + value = obj[attr] + if attrType in ['str', 'int', 'long', 'float', 'bool']: + attrType = eval(attrType) + try: + value = attrType(value) + except UnicodeEncodeError: + value = unicode(value) + except TypeError: + value = value + setattr(instance, attr, value) + elif (attrType == 'datetime'): + setattr(instance, attr, datetime.datetime.strptime(value[:-5], + "%Y-%m-%dT%H:%M:%S.%f")) + elif 'list[' in attrType: + match = re.match('list\[(.*)\]', attrType) + subClass = match.group(1) + subValues = [] + if not value: + setattr(instance, attr, None) + else: + for subValue in value: + subValues.append(self.deserialize(subValue, + subClass)) + setattr(instance, attr, subValues) + else: + setattr(instance, attr, self.deserialize(value, + objClass)) + + return instance + + +class MethodRequest(urllib2.Request): + + def __init__(self, *args, **kwargs): + """Construct a MethodRequest. Usage is the same as for + `urllib2.Request` except it also takes an optional `method` + keyword argument. If supplied, `method` will be used instead of + the default.""" + + if 'method' in kwargs: + self.method = kwargs.pop('method') + return urllib2.Request.__init__(self, *args, **kwargs) + + def get_method(self): + return getattr(self, 'method', urllib2.Request.get_method(self)) + diff --git a/modules/swagger-codegen/src/main/resources/python3/__init__.mustache b/modules/swagger-codegen/src/main/resources/python3/__init__.mustache new file mode 100644 index 000000000000..4b41ee706c70 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/python3/__init__.mustache @@ -0,0 +1,9 @@ +#!/usr/bin/env python +"""Add all of the modules in the current directory to __all__""" +import os + +__all__ = [] + +for module in os.listdir(os.path.dirname(__file__)): + if module != '__init__.py' and module[-3:] == '.py': + __all__.append(module[:-3]) diff --git a/modules/swagger-codegen/src/main/resources/python3/api.mustache b/modules/swagger-codegen/src/main/resources/python3/api.mustache new file mode 100644 index 000000000000..2d8fbdc29ca4 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/python3/api.mustache @@ -0,0 +1,96 @@ +#!/usr/bin/env python +""" +WordAPI.py +Copyright 2014 Wordnik, Inc. + + Licensed 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. + +NOTE: This class is auto generated by the swagger code generator program. Do not edit the class manually. +""" +import sys +import os + +from .models import * + + +{{#operations}} +class {{classname}}(object): + + def __init__(self, apiClient): + self.apiClient = apiClient + + {{newline}} + {{#operation}} + def {{nickname}}(self, {{#requiredParams}}{{paramName}}{{#defaultValue}} = None{{/defaultValue}}, {{/requiredParams}}**kwargs): + """{{summary}} + + Args: + {{#allParams}} + {{paramName}}, {{dataType}}: {{description}} {{^optional}}(required){{/optional}}{{#optional}}(optional){{/optional}} + {{newline}} + {{/allParams}} + {{newline}} + Returns: {{returnType}} + """ + + allParams = [{{#allParams}}'{{paramName}}'{{#hasMore}}, {{/hasMore}}{{/allParams}}] + + params = locals() + for (key, val) in params['kwargs'].items(): + if key not in allParams: + raise TypeError("Got an unexpected keyword argument '%s' to method {{nickname}}" % key) + params[key] = val + del params['kwargs'] + + resourcePath = '{{path}}' + resourcePath = resourcePath.replace('{format}', 'json') + method = '{{httpMethod}}' + + queryParams = {} + headerParams = {} + + {{#queryParams}} + if ('{{paramName}}' in params): + queryParams['{{paramName}}'] = self.apiClient.toPathValue(params['{{paramName}}']) + {{/queryParams}} + + {{#headerParams}} + if ('{{paramName}}' in params): + headerParams['{{paramName}}'] = params['{{paramName}}'] + {{/headerParams}} + + {{#pathParams}} + if ('{{paramName}}' in params): + replacement = str(self.apiClient.toPathValue(params['{{paramName}}'])) + resourcePath = resourcePath.replace('{' + '{{baseName}}' + '}', + replacement) + {{/pathParams}} + + postData = (params['body'] if 'body' in params else None) + + response = self.apiClient.callAPI(resourcePath, method, queryParams, + postData, headerParams) + + {{#returnType}} + if not response: + return None + + responseObject = self.apiClient.deserialize(response, '{{returnType}}') + return responseObject + {{/returnType}} + {{newline}} + {{newline}} + {{/operation}} +{{newline}} +{{/operations}} +{{newline}} diff --git a/modules/swagger-codegen/src/main/resources/python3/model.mustache b/modules/swagger-codegen/src/main/resources/python3/model.mustache new file mode 100644 index 000000000000..39547c900505 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/python3/model.mustache @@ -0,0 +1,40 @@ +#!/usr/bin/env python +""" +Copyright 2014 Wordnik, Inc. + + Licensed 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. +""" +{{#models}} +{{#model}} + +class {{classname}}: + """NOTE: This class is auto generated by the swagger code generator program. + Do not edit the class manually.""" + + + def __init__(self): + self.swaggerTypes = { + {{#vars}} + '{{name}}': '{{{datatype}}}'{{#hasMore}}, + {{/hasMore}} + {{/vars}}{{newline}} + } + + + {{#vars}} + {{#description}}#{{description}} + {{/description}} + self.{{name}} = None # {{{datatype}}} + {{/vars}} +{{/model}} +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/python3/swagger.mustache b/modules/swagger-codegen/src/main/resources/python3/swagger.mustache new file mode 100644 index 000000000000..a01b69794eea --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/python3/swagger.mustache @@ -0,0 +1,203 @@ +#!/usr/bin/env python +"""Wordnik.com's Swagger generic API client. This client handles the client- +server communication, and is invariant across implementations. Specifics of +the methods and models for each application are generated from the Swagger +templates.""" + +import sys +import os +import re +import urllib.request, urllib.error, urllib.parse +import http.client +import json +import datetime + +from .models import * + + +class ApiClient: + """Generic API client for Swagger client library builds""" + + def __init__(self, apiKey=None, apiServer=None): + if apiKey == None: + raise Exception('You must pass an apiKey when instantiating the ' + 'APIClient') + self.apiKey = apiKey + self.apiServer = apiServer + self.cookie = None + + def callAPI(self, resourcePath, method, queryParams, postData, + headerParams=None): + + url = self.apiServer + resourcePath + headers = {} + if headerParams: + for param, value in headerParams.items(): + headers[param] = value + + #headers['Content-type'] = 'application/json' + headers['api_key'] = self.apiKey + + if self.cookie: + headers['Cookie'] = self.cookie + + data = None + + + if queryParams: + # Need to remove None values, these should not be sent + sentQueryParams = {} + for param, value in queryParams.items(): + if value != None: + sentQueryParams[param] = value + url = url + '?' + urllib.parse.urlencode(sentQueryParams) + + if method in ['GET']: + + #Options to add statements later on and for compatibility + pass + + elif method in ['POST', 'PUT', 'DELETE']: + + if postData: + headers['Content-type'] = 'application/json' + data = self.sanitizeForSerialization(postData) + data = json.dumps(data) + + else: + raise Exception('Method ' + method + ' is not recognized.') + + if data: + data = data.encode('utf-8') + + requestParams = MethodRequest(method=method, url=url, + headers=headers, data=data) + + # Make the request + request = urllib.request.urlopen(requestParams) + encoding = request.headers.get_content_charset() + if not encoding: + encoding = 'iso-8859-1' + response = request.read().decode(encoding) + + try: + data = json.loads(response) + except ValueError: # PUT requests don't return anything + data = None + + return data + + def toPathValue(self, obj): + """Convert a string or object to a path-friendly value + Args: + obj -- object or string value + Returns: + string -- quoted value + """ + if type(obj) == list: + return urllib.parse.quote(','.join(obj)) + else: + return urllib.parse.quote(str(obj)) + + def sanitizeForSerialization(self, obj): + """Dump an object into JSON for POSTing.""" + + if type(obj) == type(None): + return None + elif type(obj) in [str, int, float, bool]: + return obj + elif type(obj) == list: + return [self.sanitizeForSerialization(subObj) for subObj in obj] + elif type(obj) == datetime.datetime: + return obj.isoformat() + else: + if type(obj) == dict: + objDict = obj + else: + objDict = obj.__dict__ + return {key: self.sanitizeForSerialization(val) + for (key, val) in objDict.items() + if key != 'swaggerTypes'} + + def deserialize(self, obj, objClass): + """Derialize a JSON string into an object. + + Args: + obj -- string or object to be deserialized + objClass -- class literal for deserialzied object, or string + of class name + Returns: + object -- deserialized object""" + + # Have to accept objClass as string or actual type. Type could be a + # native Python type, or one of the model classes. + if type(objClass) == str: + if 'list[' in objClass: + match = re.match('list\[(.*)\]', objClass) + subClass = match.group(1) + return [self.deserialize(subObj, subClass) for subObj in obj] + + if (objClass in ['int', 'float', 'dict', 'list', 'str', 'bool', 'datetime']): + objClass = eval(objClass) + else: # not a native type, must be model class + objClass = eval(objClass + '.' + objClass) + + if objClass in [int, float, dict, list, str, bool]: + return objClass(obj) + elif objClass == datetime: + # Server will always return a time stamp in UTC, but with + # trailing +0000 indicating no offset from UTC. So don't process + # last 5 characters. + return datetime.datetime.strptime(obj[:-5], + "%Y-%m-%dT%H:%M:%S.%f") + + instance = objClass() + + for attr, attrType in instance.swaggerTypes.items(): + + if attr in obj: + value = obj[attr] + if attrType in ['str', 'int', 'float', 'bool']: + attrType = eval(attrType) + try: + value = attrType(value) + except UnicodeEncodeError: + value = unicode(value) + except TypeError: + value = value + setattr(instance, attr, value) + elif (attrType == 'datetime'): + setattr(instance, attr, datetime.datetime.strptime(value[:-5], + "%Y-%m-%dT%H:%M:%S.%f")) + elif 'list[' in attrType: + match = re.match('list\[(.*)\]', attrType) + subClass = match.group(1) + subValues = [] + if not value: + setattr(instance, attr, None) + else: + for subValue in value: + subValues.append(self.deserialize(subValue, + subClass)) + setattr(instance, attr, subValues) + else: + setattr(instance, attr, self.deserialize(value, + objClass)) + + return instance + + +class MethodRequest(urllib.request.Request): + + def __init__(self, *args, **kwargs): + """Construct a MethodRequest. Usage is the same as for + `urllib.Request` except it also takes an optional `method` + keyword argument. If supplied, `method` will be used instead of + the default.""" + + if 'method' in kwargs: + self.method = kwargs.pop('method') + return urllib.request.Request.__init__(self, *args, **kwargs) + + def get_method(self): + return getattr(self, 'method', urllib.request.Request.get_method(self)) diff --git a/modules/swagger-codegen/src/main/resources/ruby/api.mustache b/modules/swagger-codegen/src/main/resources/ruby/api.mustache new file mode 100644 index 000000000000..b2c546b011e1 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/ruby/api.mustache @@ -0,0 +1,85 @@ +require "uri" + +{{#operations}} +class {{classname}} + basePath = "{{basePath}}" + # apiInvoker = APIInvoker + + def self.escapeString(string) + URI.encode(string.to_s) + end + + {{#operation}} + def self.{{nickname}} ({{#allParams}}{{paramName}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}},{{/allParams}} opts={}) + query_param_keys = [{{#queryParams}}:{{paramName}}{{#hasMore}},{{/hasMore}}{{/queryParams}}] + + {{#requiredParamCount}} + + # verify existence of params + {{#requiredParams}} + raise "{{{paramName}}} is required" if {{{paramName}}}.nil? + {{/requiredParams}} + {{/requiredParamCount}} + + # set default values and merge with input + options = { + {{#allParams}} + :{{paramName}} => {{paramName}}{{#hasMore}}, + {{/hasMore}} + {{/allParams}} + }.merge(opts) + + #resource path + path = "{{path}}".sub('{format}','json'){{#pathParams}}.sub('{' + '{{baseName}}' + '}', escapeString({{paramName}})) + {{/pathParams}}{{newline}} + + # pull querystring keys from options + queryopts = options.select do |key,value| + query_param_keys.include? key + end + + {{#headerParams}}headers = { + {{{paramName}}}: {{{paramName}}}, + } + {{/headerParams}} + {{^headerParams}}headers = nil + {{/headerParams}} + + post_body = nil + {{#bodyParam}} + if body != nil + if body.is_a?(Array) + array = Array.new + body.each do |item| + if item.respond_to?("to_body".to_sym) + array.push item.to_body + else + array.push item + end + end + post_body = array + + else + if body.respond_to?("to_body".to_sym) + post_body = body.to_body + else + post_body = body + end + end + end + {{/bodyParam}} + + {{#returnType}} + response = Swagger::Request.new(:{{httpMethod}}, path, {:params=>queryopts,:headers=>headers, :body=>post_body }).make.body + {{#returnContainer}} + response.map {|response|{{/returnContainer}} {{returnBaseType}}.new(response){{#returnContainer}} }{{/returnContainer}} + {{/returnType}} + {{^returnType}} + Swagger::Request.new(:{{httpMethod}}, path, {:params=>queryopts,:headers=>headers, :body=>post_body}).make + {{/returnType}} + {{newline}} + end + +{{/operation}} +end +{{/operations}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/ruby/model.mustache b/modules/swagger-codegen/src/main/resources/ruby/model.mustache new file mode 100644 index 000000000000..c587f12cb494 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/ruby/model.mustache @@ -0,0 +1,41 @@ +{{#models}} + +{{#model}} +class {{classname}} + attr_accessor {{#vars}}:{{{name}}}{{#hasMore}}, {{/hasMore}}{{/vars}}{{newline}} + # :internal => :external + def self.attribute_map + { + {{#vars}} + :{{{name}}} => :{{{baseName}}}{{#hasMore}}, + {{/hasMore}} + {{/vars}}{{newline}} + } + end + + def initialize(attributes = {}) + return if attributes.empty? + # Morph attribute keys into undescored rubyish style + {{#vars}} + if self.class.attribute_map[:"{{{name}}}"] + {{#isContainer}} + if (value = attributes["{{{baseName}}}"]).is_a?(Array) + @{{{name}}} = value{{#complexType}}.map{ |v| {{complexType}}.new(v) }{{/complexType}}{{newline}} + end + {{/isContainer}}{{^isContainer}} + @{{{name}}} = attributes["{{{baseName}}}"] + {{/isContainer}} + end + {{/vars}}{{newline}} + end + + def to_body + body = {} + self.class.attribute_map.each_pair do |key, value| + body[value] = self.send(key) unless self.send(key).nil? + end + body + end +end +{{/model}} +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/ruby/monkey.mustache b/modules/swagger-codegen/src/main/resources/ruby/monkey.mustache new file mode 100644 index 000000000000..28932890af95 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/ruby/monkey.mustache @@ -0,0 +1,90 @@ +# module Swagger + class Object + + unless Object.method_defined? :blank? + def blank? + respond_to?(:empty?) ? empty? : !self + end + end + + unless Object.method_defined? :present? + def present? + !blank? + end + end + + end + + class String + + unless String.method_defined? :underscore + def underscore + self.gsub(/::/, '/'). + gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). + gsub(/([a-z\d])([A-Z])/,'\1_\2'). + tr("-", "_"). + downcase + end + end + + unless String.method_defined? :camelize + def camelize(first_letter_in_uppercase = true) + if first_letter_in_uppercase != :lower + self.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase } + else + self.to_s[0].chr.downcase + camelize(self)[1..-1] + end + end + end + + end + + class Hash + + unless Hash.method_defined? :stringify_keys + def stringify_keys + inject({}) do |options, (key, value)| + options[key.to_s] = value + options + end + end + end + + unless Hash.method_defined? :stringify_keys! + def stringify_keys! + self.replace(self.stringify_keys) + end + end + + unless Hash.method_defined? :symbolize_keys + def symbolize_keys + inject({}) do |options, (key, value)| + options[(key.to_sym rescue key) || key] = value + options + end + end + end + + unless Hash.method_defined? :symbolize_keys! + def symbolize_keys! + self.replace(self.symbolize_keys) + end + end + + unless Hash.method_defined? :symbolize_and_underscore_keys + def symbolize_and_underscore_keys + inject({}) do |options, (key, value)| + options[(key.to_s.underscore.to_sym rescue key) || key] = value + options + end + end + end + + unless Hash.method_defined? :symbolize_and_underscore_keys! + def symbolize_and_underscore_keys! + self.replace(self.symbolize_and_underscore_keys) + end + end + + end +# end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/ruby/swagger.mustache b/modules/swagger-codegen/src/main/resources/ruby/swagger.mustache new file mode 100644 index 000000000000..1cc3ea456c20 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/ruby/swagger.mustache @@ -0,0 +1,84 @@ +require 'monkey' +require 'swagger/configuration' +require 'swagger/request' +require 'swagger/response' +require 'swagger/version' +require 'logger' + +module Swagger + + class << self + attr_accessor :logger + + # A Swagger configuration object. Must act like a hash and return sensible + # values for all Swagger configuration options. See Swagger::Configuration. + attr_accessor :configuration + + attr_accessor :resources + + # Call this method to modify defaults in your initializers. + # + # @example + # Swagger.configure do |config| + # config.api_key = '1234567890abcdef' # required + # config.username = 'wordlover' # optional, but needed for user-related functions + # config.password = 'i<3words' # optional, but needed for user-related functions + # config.format = 'json' # optional, defaults to 'json' + # end + # + def configure + self.configuration ||= Configuration.new + yield(configuration) if block_given? + + # Configure logger. Default to use Rails + self.logger ||= configuration.logger || (defined?(Rails) ? Rails.logger : Logger.new(STDOUT)) + + # remove :// from scheme + configuration.scheme.sub!(/:\/\//, '') + + # remove http(s):// and anything after a slash + configuration.host.sub!(/https?:\/\//, '') + configuration.host = configuration.host.split('/').first + + # Add leading and trailing slashes to base_path + configuration.base_path = "/#{configuration.base_path}".gsub(/\/+/, '/') + configuration.base_path = "" if configuration.base_path == "/" + end + + def authenticated? + Swagger.configuration.auth_token.present? + end + + def de_authenticate + Swagger.configuration.auth_token = nil + end + + def authenticate + return if Swagger.authenticated? + + if Swagger.configuration.username.blank? || Swagger.configuration.password.blank? + raise ClientError, "Username and password are required to authenticate." + end + + request = Swagger::Request.new( + :get, + "account/authenticate/{username}", + :params => { + :username => Swagger.configuration.username, + :password => Swagger.configuration.password + } + ) + + response_body = request.response.body + Swagger.configuration.auth_token = response_body['token'] + end + + end + +end + +class ServerError < StandardError +end + +class ClientError < StandardError +end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/ruby/swagger/configuration.mustache b/modules/swagger-codegen/src/main/resources/ruby/swagger/configuration.mustache new file mode 100644 index 000000000000..c0b3c46268c3 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/ruby/swagger/configuration.mustache @@ -0,0 +1,22 @@ +module Swagger + + class Configuration + require 'swagger/version' + + attr_accessor :format, :api_key, :username, :password, :auth_token, :scheme, :host, :base_path, :user_agent, :logger, :inject_format, :force_ending_format, :camelize_params + + # Defaults go in here.. + def initialize + @format = 'json' + @scheme = 'http' + @host = 'api.wordnik.com' + @base_path = '/v4' + @user_agent = "ruby-#{Swagger::VERSION}" + @inject_format = true + @force_ending_format = false + @camelize_params = true + end + + end + +end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/ruby/swagger/request.mustache b/modules/swagger-codegen/src/main/resources/ruby/swagger/request.mustache new file mode 100644 index 000000000000..7836cb0bf039 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/ruby/swagger/request.mustache @@ -0,0 +1,199 @@ +module Swagger + + class Request + require 'uri' + require 'addressable/uri' + require 'typhoeus' + require "swagger/version" + + attr_accessor :host, :path, :format, :params, :body, :http_method, :headers + + + # All requests must have an HTTP method and a path + # Optionals parameters are :params, :headers, :body, :format, :host + # + def initialize(http_method, path, attributes={}) + attributes[:format] ||= Swagger.configuration.format + attributes[:params] ||= {} + + # Set default headers + default_headers = { + 'Content-Type' => "application/#{attributes[:format].downcase}", + :api_key => Swagger.configuration.api_key + } + + # api_key from headers hash trumps the default, even if its value is blank + if attributes[:headers].present? && attributes[:headers].has_key?(:api_key) + default_headers.delete(:api_key) + end + + # api_key from params hash trumps all others (headers and default_headers) + if attributes[:params].present? && attributes[:params].has_key?(:api_key) + default_headers.delete(:api_key) + attributes[:headers].delete(:api_key) if attributes[:headers].present? + end + + # Merge argument headers into defaults + attributes[:headers] = default_headers.merge(attributes[:headers] || {}) + + # Stick in the auth token if there is one + if Swagger.authenticated? + attributes[:headers].merge!({:auth_token => Swagger.configuration.auth_token}) + end + + self.http_method = http_method.to_sym + self.path = path + attributes.each do |name, value| + send("#{name.to_s.underscore.to_sym}=", value) + end + end + + # Construct a base URL + # + def url(options = {}) + u = Addressable::URI.new( + :scheme => Swagger.configuration.scheme, + :host => Swagger.configuration.host, + :path => self.interpreted_path, + :query => self.query_string.sub(/\?/, '') + ).to_s + + # Drop trailing question mark, if present + u.sub! /\?$/, '' + + # Obfuscate API key? + u.sub! /api\_key=\w+/, 'api_key=YOUR_API_KEY' if options[:obfuscated] + + u + end + + # Iterate over the params hash, injecting any path values into the path string + # + # e.g. /word.{format}/{word}/entries => /word.json/cat/entries + def interpreted_path + p = self.path.dup + + # Fill in the path params + self.params.each_pair do |key, value| + p = p.gsub("{#{key}}", value.to_s) + end + + # Stick a .{format} placeholder into the path if there isn't + # one already or an actual format like json or xml + # e.g. /words/blah => /words.{format}/blah + if Swagger.configuration.inject_format + unless ['.json', '.xml', '{format}'].any? {|s| p.downcase.include? s } + p = p.sub(/^(\/?\w+)/, "\\1.#{format}") + end + end + + # Stick a .{format} placeholder on the end of the path if there isn't + # one already or an actual format like json or xml + # e.g. /words/blah => /words/blah.{format} + if Swagger.configuration.force_ending_format + unless ['.json', '.xml', '{format}'].any? {|s| p.downcase.include? s } + p = "#{p}.#{format}" + end + end + + p = p.sub("{format}", self.format.to_s) + + URI.encode [Swagger.configuration.base_path, p].join("/").gsub(/\/+/, '/') + end + + # Massage the request body into a state of readiness + # If body is a hash, camelize all keys then convert to a json string + # + def body=(value) + if value.is_a?(Hash) + value = value.inject({}) do |memo, (k,v)| + memo[k.to_s.camelize(:lower).to_sym] = v + memo + end + end + @body = value + end + + # If body is an object, JSONify it before making the actual request. + # + def outgoing_body + body.is_a?(String) ? body : body.to_json + end + + # Construct a query string from the query-string-type params + def query_string + + # Iterate over all params, + # .. removing the ones that are part of the path itself. + # .. stringifying values so Addressable doesn't blow up. + query_values = {} + self.params.each_pair do |key, value| + next if self.path.include? "{#{key}}" # skip path params + next if value.blank? && value.class != FalseClass # skip empties + if Swagger.configuration.camelize_params + key = key.to_s.camelize(:lower).to_sym unless key.to_sym == :api_key # api_key is not a camelCased param + end + query_values[key] = value.to_s + end + + # We don't want to end up with '?' as our query string + # if there aren't really any params + return "" if query_values.blank? + + # Addressable requires query_values to be set after initialization.. + qs = Addressable::URI.new + qs.query_values = query_values + qs.to_s + end + + def make + logger = Logger.new STDOUT + logger.debug self.url + response = case self.http_method.to_sym + when :get,:GET + Typhoeus::Request.get( + self.url, + :headers => self.headers.stringify_keys, + ) + + when :post,:POST + Typhoeus::Request.post( + self.url, + :body => self.outgoing_body, + :headers => self.headers.stringify_keys, + ) + + when :put,:PUT + Typhoeus::Request.put( + self.url, + :body => self.outgoing_body, + :headers => self.headers.stringify_keys, + ) + + when :delete,:DELETE + Typhoeus::Request.delete( + self.url, + :body => self.outgoing_body, + :headers => self.headers.stringify_keys, + ) + end + Response.new(response) + end + + def response + self.make + end + + def response_code_pretty + return unless @response.present? + @response.code.to_s + end + + def response_headers_pretty + return unless @response.present? + # JSON.pretty_generate(@response.headers).gsub(/\n/, '
') # <- This was for RestClient + @response.headers.gsub(/\n/, '
') # <- This is for Typhoeus + end + + end +end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/ruby/swagger/response.mustache b/modules/swagger-codegen/src/main/resources/ruby/swagger/response.mustache new file mode 100644 index 000000000000..02a1a458eb4c --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/ruby/swagger/response.mustache @@ -0,0 +1,70 @@ +module Swagger + + class Response + require 'json' + + attr_accessor :raw + + def initialize(raw) + self.raw = raw + + case self.code + when 500..510 then raise(ServerError, self.error_message) + when 299..426 then raise(ClientError, self.error_message) + end + end + + def code + raw.code + end + + # Account for error messages that take different forms... + def error_message + body['message'] + rescue + body + end + + # If body is JSON, parse it + # Otherwise return raw string + def body + JSON.parse raw.body + rescue + raw.body + end + + # `headers_hash` is a Typhoeus-specific extension of Hash, + # so simplify it back into a regular old Hash. + def headers + h = {} + raw.headers_hash.each {|k,v| h[k] = v } + h + end + + # Extract the response format from the header hash + # e.g. {'Content-Type' => 'application/json'} + def format + headers['Content-Type'].split("/").last.downcase + end + + def json? + format == 'json' + end + + def xml? + format == 'xml' + end + + def pretty_body + return unless body.present? + case format + when 'json' then JSON.pretty_generate(body).gsub(/\n/, '
') + end + end + + def pretty_headers + JSON.pretty_generate(headers).gsub(/\n/, '
') + end + + end +end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/ruby/swagger/version.mustache b/modules/swagger-codegen/src/main/resources/ruby/swagger/version.mustache new file mode 100644 index 000000000000..39357c0ed6db --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/ruby/swagger/version.mustache @@ -0,0 +1,4 @@ +module Swagger + VERSION = "4.06.08" +end + diff --git a/modules/swagger-codegen/src/main/resources/scala/api.mustache b/modules/swagger-codegen/src/main/resources/scala/api.mustache new file mode 100644 index 000000000000..7c05406a5a89 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scala/api.mustache @@ -0,0 +1,68 @@ +package {{package}} + +{{#imports}}import {{import}} +{{/imports}} +import {{invokerPackage}}.ApiInvoker +import {{invokerPackage}}.ApiException + +import java.io.File +import java.util.Date + +import scala.collection.mutable.HashMap + +{{#operations}} +class {{classname}} { + var basePath: String = "{{basePath}}" + var apiInvoker = ApiInvoker + + def addHeader(key: String, value: String) = apiInvoker.defaultHeaders += key -> value + + {{#operation}} + def {{nickname}} ({{#allParams}}{{paramName}}: {{dataType}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) {{#returnType}}: Option[{{returnType}}]{{/returnType}} = { + // create path and map variables + val path = "{{path}}".replaceAll("\\{format\\}","json"){{#pathParams}}.replaceAll("\\{" + "{{baseName}}" + "\\}",apiInvoker.escape({{paramName}})) + + {{/pathParams}} + + {{newline}} + val contentType = { + {{#bodyParam}}if({{paramName}} != null && {{paramName}}.isInstanceOf[File] ) + "multipart/form-data" + else "application/json" + {{/bodyParam}} + {{^bodyParam}}"application/json"{{/bodyParam}} + } + + // query params + val queryParams = new HashMap[String, String] + val headerParams = new HashMap[String, String] + + {{#requiredParamCount}} + // verify required params are set + (List({{/requiredParamCount}}{{#requiredParams}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}).filter(_ != null)).size match { + case {{requiredParamCount}} => // all required values set + case _ => throw new Exception("missing required params") + } + {{/requiredParamCount}} + + {{#queryParams}}if(String.valueOf({{paramName}}) != "null") queryParams += "{{baseName}}" -> {{paramName}}.toString + {{/queryParams}} + + {{#headerParams}}headerParams += "{{baseName}}" -> {{paramName}} + {{/headerParams}} + + try { + apiInvoker.invokeApi(basePath, path, "{{httpMethod}}", queryParams.toMap, {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}None{{/bodyParam}}, headerParams.toMap, contentType) match { + case s: String => + {{#returnType}} Some(ApiInvoker.deserialize(s, "{{returnContainer}}", classOf[{{returnBaseType}}]).asInstanceOf[{{returnType}}]) + {{/returnType}} + case _ => None + } + } catch { + case ex: ApiException if ex.code == 404 => None + case ex: ApiException => throw ex + } + } + {{/operation}} +} +{{/operations}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/scala/apiInvoker.mustache b/modules/swagger-codegen/src/main/resources/scala/apiInvoker.mustache new file mode 100644 index 000000000000..5c6d60d37b58 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scala/apiInvoker.mustache @@ -0,0 +1,164 @@ +package {{invokerPackage}} + +import com.sun.jersey.api.client.Client +import com.sun.jersey.api.client.ClientResponse +import com.sun.jersey.api.client.config.ClientConfig +import com.sun.jersey.api.client.config.DefaultClientConfig +import com.sun.jersey.api.client.filter.LoggingFilter + +import com.sun.jersey.multipart.FormDataMultiPart +import com.sun.jersey.multipart.file.FileDataBodyPart + +import java.io.File +import java.net.URLEncoder +import javax.ws.rs.core.MediaType + +import scala.collection.JavaConverters._ +import scala.collection.mutable.HashMap + +import com.fasterxml.jackson.module.scala.DefaultScalaModule +import com.fasterxml.jackson.core.JsonGenerator.Feature +import com.fasterxml.jackson.databind._ +import com.fasterxml.jackson.annotation._ +import com.fasterxml.jackson.databind.annotation.JsonSerialize + +object ScalaJsonUtil { + def getJsonMapper = { + val mapper = new ObjectMapper() + mapper.registerModule(new DefaultScalaModule()) + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + mapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT) + mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY) + mapper + } +} + +object ApiInvoker { + val mapper = ScalaJsonUtil.getJsonMapper + val defaultHeaders: HashMap[String, String] = HashMap() + val hostMap: HashMap[String, Client] = HashMap() + + def escape(value: String): String = { + URLEncoder.encode(value, "utf-8").replaceAll("\\+", "%20") + } + + def escape(value: Long): String = value.toString + def escape(value: Double): String = value.toString + def escape(value: Float): String = value.toString + + def deserialize(json: String, containerType: String, cls: Class[_]) = { + if (cls == classOf[String]) { + json match { + case s: String => { + if (s.startsWith("\"") && s.endsWith("\"") && s.length > 1) s.substring(1, s.length - 2) + else s + } + case _ => null + } + } else { + containerType.toLowerCase match { + case "array" => { + val typeInfo = mapper.getTypeFactory().constructCollectionType(classOf[java.util.List[_]], cls) + val response = mapper.readValue(json, typeInfo).asInstanceOf[java.util.List[_]] + response.asScala.toList + } + case "list" => { + val typeInfo = mapper.getTypeFactory().constructCollectionType(classOf[java.util.List[_]], cls) + val response = mapper.readValue(json, typeInfo).asInstanceOf[java.util.List[_]] + response.asScala.toList + } + case _ => { + json match { + case e: String if ("\"\"" == e) => null + case _ => mapper.readValue(json, cls) + } + } + } + } + } + + def serialize(obj: AnyRef): String = { + if (obj != null) { + obj match { + case e: List[_] => mapper.writeValueAsString(obj.asInstanceOf[List[_]].asJava) + case _ => mapper.writeValueAsString(obj) + } + } else null + } + + def invokeApi(host: String, path: String, method: String, queryParams: Map[String, String], body: AnyRef, headerParams: Map[String, String], contentType: String): String = { + val client = getClient(host) + + val querystring = queryParams.filter(k => k._2 != null).map(k => (escape(k._1) + "=" + escape(k._2))).mkString("?", "&", "") + val builder = client.resource(host + path + querystring).accept(contentType) + headerParams.map(p => builder.header(p._1, p._2)) + defaultHeaders.map(p => { + headerParams.contains(p._1) match { + case true => // override default with supplied header + case false => if (p._2 != null) builder.header(p._1, p._2) + } + }) + + val response: ClientResponse = method match { + case "GET" => { + builder.get(classOf[ClientResponse]).asInstanceOf[ClientResponse] + } + case "POST" => { + if(body != null && body.isInstanceOf[File]) { + val file = body.asInstanceOf[File] + val form = new FormDataMultiPart() + form.field("filename", file.getName()) + form.bodyPart(new FileDataBodyPart("file", file, MediaType.MULTIPART_FORM_DATA_TYPE)) + builder.post(classOf[ClientResponse], form) + } + else { + if(body == null) builder.post(classOf[ClientResponse], serialize(body)) + else builder.`type`(contentType).post(classOf[ClientResponse], serialize(body)) + } + } + case "PUT" => { + if(body == null) builder.put(classOf[ClientResponse], null) + else builder.`type`(contentType).put(classOf[ClientResponse], serialize(body)) + } + case "DELETE" => { + builder.delete(classOf[ClientResponse]) + } + case _ => null + } + response.getClientResponseStatus().getStatusCode() match { + case 204 => "" + case code: Int if (Range(200, 299).contains(code)) => { + response.hasEntity() match { + case true => response.getEntity(classOf[String]) + case false => "" + } + } + case _ => { + val entity = response.hasEntity() match { + case true => response.getEntity(classOf[String]) + case false => "no data" + } + throw new ApiException( + response.getClientResponseStatus().getStatusCode(), + entity) + } + } + } + + def getClient(host: String): Client = { + hostMap.contains(host) match { + case true => hostMap(host) + case false => { + val client = Client.create() + // client.addFilter(new LoggingFilter()) + hostMap += host -> client + client + } + } + } +} + +class ApiException(val code: Int, msg: String) extends RuntimeException(msg) + diff --git a/modules/swagger-codegen/src/main/resources/scala/model.mustache b/modules/swagger-codegen/src/main/resources/scala/model.mustache new file mode 100644 index 000000000000..a45b71a8f8e9 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scala/model.mustache @@ -0,0 +1,15 @@ +package {{package}} + +{{#imports}}import {{import}} +{{/imports}} + +{{#models}} + +{{#model}} + +case class {{classname}} ( + {{#vars}}{{#description}}/* {{{description}}} */ + {{/description}}{{name}}: {{{datatype}}}{{#hasMore}},{{/hasMore}}{{^hasMore}}){{/hasMore}} + {{/vars}} +{{/model}} +{{/models}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/scala/pom.mustache b/modules/swagger-codegen/src/main/resources/scala/pom.mustache new file mode 100644 index 000000000000..ac6a81caa460 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scala/pom.mustache @@ -0,0 +1,232 @@ + + 4.0.0 + {{groupId}} + {{artifactId}} + jar + {{artifactId}} + {{artifactVersion}} + + 2.2.0 + + + + + maven-mongodb-plugin-repo + maven mongodb plugin repository + http://maven-mongodb-plugin.googlecode.com/svn/maven/repo + default + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12 + + + + loggerPath + conf/log4j.properties + + + -Xms512m -Xmx1500m + methods + pertest + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + + jar + test-jar + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add_sources + generate-sources + + add-source + + + + src/main/java + + + + + add_test_sources + generate-test-sources + + add-test-source + + + + src/test/java + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + net.alchim31.maven + scala-maven-plugin + ${scala-maven-plugin-version} + + + scala-compile-first + process-resources + + add-source + compile + + + + scala-test-compile + process-test-resources + + testCompile + + + + + + -Xms128m + -Xmx1500m + + + + + + + + + org.scala-tools + maven-scala-plugin + + ${scala-version} + + + + + + + com.sun.jersey + jersey-client + ${jersey-version} + compile + + + com.sun.jersey.contribs + jersey-multipart + ${jersey-version} + compile + + + org.scala-lang + scala-library + ${scala-version} + compile + + + com.wordnik + swagger-core_${scala-short-version} + ${swagger-core-version} + compile + + + org.scalatest + scalatest_${scala-short-version} + ${scala-test-version} + test + + + junit + junit + ${junit-version} + test + + + joda-time + joda-time + ${joda-time-version} + + + org.joda + joda-convert + ${joda-version} + + + + + scala_2.10 + + 2.10.3 + 2.10 + 1.3.2 + 2.1.2 + + + + scala_2.9.1 + + true + + + 2.9.1-1 + 2.9.1 + 1.1.0 + 1.6.1 + + + + + 1.2 + 2.2 + 1.7 + 4.8.1 + 1.0.0 + 4.8.1 + 3.1.5 + + diff --git a/modules/swagger-codegen/src/main/resources/scalatra/Bootstrap.mustache b/modules/swagger-codegen/src/main/resources/scalatra/Bootstrap.mustache new file mode 100644 index 000000000000..64c0b07eb283 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/Bootstrap.mustache @@ -0,0 +1,20 @@ +import {{apiPackage}}._ +import akka.actor.ActorSystem +import com.wordnik.swagger.app.{ResourcesApp, SwaggerApp} +import javax.servlet.ServletContext +import org.scalatra.LifeCycle + +class ScalatraBootstrap extends LifeCycle { + implicit val swagger = new SwaggerApp + + override def init(context: ServletContext) { + implicit val system = ActorSystem("appActorSystem") + try { + {{#apiInfo}}{{#apis}}context mount (new {{classname}}, "/{{baseName}}/*") + {{/apis}}{{/apiInfo}} + context mount (new ResourcesApp, "/api-docs/*") + } catch { + case e: Throwable => e.printStackTrace() + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/scalatra/JettyMain.scala b/modules/swagger-codegen/src/main/resources/scalatra/JettyMain.scala new file mode 100644 index 000000000000..e25f16ba3929 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/JettyMain.scala @@ -0,0 +1,43 @@ +import org.eclipse.jetty.server._ +import org.eclipse.jetty.webapp.WebAppContext +import org.scalatra.servlet.ScalatraListener + +object JettyMain { + + object conf { + val port = sys.env.get("PORT") map (_.toInt) getOrElse (8080) + val stopTimeout = sys.env.get("STOP_TIMEOUT") map (_.toInt) getOrElse (5000) + val connectorIdleTimeout = sys.env.get("CONNECTOR_IDLE_TIMEOUT") map (_.toInt) getOrElse (90000) + val webapp = sys.env.get("PUBLIC") getOrElse "webapp" + val contextPath = sys.env.get("CONTEXT_PATH") getOrElse "/" + } + + def main(args: Array[String]) = { + val server: Server = new Server + println("starting jetty") + + server setStopTimeout conf.stopTimeout + //server setDumpAfterStart true + server setStopAtShutdown true + + val httpConfig = new HttpConfiguration() + httpConfig setSendDateHeader true + httpConfig setSendServerVersion false + + val connector = new NetworkTrafficServerConnector(server, new HttpConnectionFactory(httpConfig)) + connector setPort conf.port + connector setSoLingerTime 0 + connector setIdleTimeout conf.connectorIdleTimeout + server addConnector connector + + val webapp = conf.webapp + val webApp = new WebAppContext + webApp setContextPath conf.contextPath + webApp setResourceBase conf.webapp + webApp setEventListeners Array(new ScalatraListener) + + server setHandler webApp + + server.start() + } +} diff --git a/modules/swagger-codegen/src/main/resources/scalatra/JsonUtil.scala b/modules/swagger-codegen/src/main/resources/scalatra/JsonUtil.scala new file mode 100644 index 000000000000..691a82f563b7 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/JsonUtil.scala @@ -0,0 +1,12 @@ +package json + +import com.fasterxml.jackson.module.scala.DefaultScalaModule +import com.fasterxml.jackson.core.JsonGenerator.Feature +import com.fasterxml.jackson.databind._ + +object JsonUtil { + val mapper = new ObjectMapper() + mapper.registerModule(new DefaultScalaModule()) + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/scalatra/README.mustache b/modules/swagger-codegen/src/main/resources/scalatra/README.mustache new file mode 100644 index 000000000000..f8a560b776f5 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/README.mustache @@ -0,0 +1,10 @@ +# Swagger generated server + +## Overview +This server was generated by the [swagger-codegen](https://github.com/wordnik/swagger-codegen) project. By using the +[swagger-spec](https://github.com/wordnik/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +is an example of building a swagger-enabled scalatra server. + +This example uses the [scalatra](http://scalatra.org/) framework. To see how to make this your own, look here: + +[README](https://github.com/wordnik/swagger-codegen/tree/master/samples/server-generator/scalatra) \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/scalatra/ServletApp.mustache b/modules/swagger-codegen/src/main/resources/scalatra/ServletApp.mustache new file mode 100644 index 000000000000..f6e53468ec9d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/ServletApp.mustache @@ -0,0 +1,39 @@ +package com.wordnik.swagger.app + +import _root_.akka.actor.ActorSystem + +import org.scalatra.swagger.{ ApiInfo, SwaggerWithAuth, Swagger } +import org.scalatra.swagger.{JacksonSwaggerBase, Swagger} +import org.scalatra.ScalatraServlet +import org.json4s.{DefaultFormats, Formats} + +class ResourcesApp(implicit protected val system: ActorSystem, val swagger: SwaggerApp) + extends ScalatraServlet with JacksonSwaggerBase { + before() { + response.headers += ("Access-Control-Allow-Origin" -> "*") + } + + protected def buildFullUrl(path: String) = if (path.startsWith("http")) path else { + val port = request.getServerPort + val h = request.getServerName + val prot = if (port == 443) "https" else "http" + val (proto, host) = if (port != 80 && port != 443) ("http", h+":"+port.toString) else (prot, h) + "%s://%s%s%s".format( + proto, + host, + request.getContextPath, + path) + } +} + +class SwaggerApp extends Swagger(apiInfo = ApiSwagger.apiInfo, apiVersion = "1.0", swaggerVersion = "1.2") + +object ApiSwagger { + val apiInfo = ApiInfo( + """{{{appName}}}""", + """{{{appDescription}}}""", + """{{{infoUrl}}}""", + """{{{infoEmail}}}""", + """{{{licenseInfo}}}""", + """{{{licenseUrl}}}""") +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/scalatra/api.mustache b/modules/swagger-codegen/src/main/resources/scalatra/api.mustache new file mode 100644 index 000000000000..54710361fe9a --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/api.mustache @@ -0,0 +1,94 @@ +package {{package}} + +{{#imports}}import {{import}} +{{/imports}} + +import java.io.File + +import org.scalatra.{ TypedParamSupport, ScalatraServlet } +import org.scalatra.swagger._ +import org.json4s._ +import org.json4s.JsonDSL._ +import org.scalatra.json.{ JValueResult, JacksonJsonSupport } +import org.scalatra.servlet.{FileUploadSupport, MultipartConfig, SizeConstraintExceededException} + +import scala.collection.JavaConverters._ + +class {{classname}} (implicit val swagger: Swagger) extends ScalatraServlet + with FileUploadSupport + with JacksonJsonSupport + with SwaggerSupport { + protected implicit val jsonFormats: Formats = DefaultFormats + + protected val applicationDescription: String = "{{classname}}" + override protected val applicationName: Option[String] = Some("{{baseName}}") + + before() { + contentType = formats("json") + response.headers += ("Access-Control-Allow-Origin" -> "*") + } +{{#operations}} +{{#operation}} + {{newline}} + + val {{nickname}}Operation = (apiOperation[{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Unit{{/returnType}}]("{{nickname}}") + summary "{{{summary}}}" + parameters( + {{#allParams}}{{#isQueryParam}}queryParam[{{dataType}}]("{{paramName}}").description(""){{^required}}.optional{{/required}}{{#defaultValue}}.defaultValue({{{defaultValue}}}){{/defaultValue}} + {{/isQueryParam}} + {{#isPathParam}}pathParam[{{dataType}}]("{{paramName}}").description(""){{#defaultValue}}.defaultValue({{{defaultValue}}}){{/defaultValue}} + {{/isPathParam}} + {{#isHeaderParam}}headerParam[{{dataType}}]("{{paramName}}").description(""){{^required}}.optional{{/required}}{{#defaultValue}}.defaultValue({{{defaultValue}}}){{/defaultValue}} + {{/isHeaderParam}} + {{#isBodyParam}}bodyParam[{{dataType}}]("{{paramName}}").description(""){{^required}}.optional{{/required}}{{#defaultValue}}.defaultValue({{{defaultValue}}}){{/defaultValue}} + {{/isBodyParam}} + {{#isFormParam}}formParam[{{dataType}}]("{{paramName}}").description(""){{^required}}.optional{{/required}}{{#defaultValue}}.defaultValue({{{defaultValue}}}){{/defaultValue}} + {{/isFormParam}} + {{#hasMore}},{{/hasMore}} + {{/allParams}}) + ) + + {{httpMethod}}("{{path}}",operation({{nickname}}Operation)) { + {{#allParams}} + {{#isFile}} + val {{paramName}} = fileParams("{{paramName}}") + {{/isFile}} + {{^isFile}} + {{#isPathParam}} + val {{paramName}} = params.getOrElse("{{paramName}}", halt(400)) + {{/isPathParam}} + + {{#isQueryParam}} + {{#collectionFormat}}val {{paramName}}String = params.getAs[String]("{{paramName}}") + val {{paramName}} = if("{{collectionFormat}}".equals("default")) { + {{paramName}}String match { + case Some(str) => str.split(",") + case None => List() + } + } + else + List() + {{/collectionFormat}} + {{^collectionFormat}}val {{paramName}} = params.getAs[{{dataType}}]("{{paramName}}"){{/collectionFormat}} + + {{/isQueryParam}} + + {{#isHeaderParam}} + val {{paramName}} = request.getHeader("{{paramName}}") + {{/isHeaderParam}} + + {{#isFormParam}} + val {{paramName}} = params.getAs[{{dataType}}]("{{paramName}}") + {{/isFormParam}} + + {{#isBodyParam}} + val {{paramName}} = parsedBody.extract[{{dataType}}] + {{/isBodyParam}} + {{/isFile}} + println("{{paramName}}: " + {{paramName}}) + {{/allParams}} + } + +{{/operation}} +{{/operations}} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/scalatra/build.sbt b/modules/swagger-codegen/src/main/resources/scalatra/build.sbt new file mode 100644 index 000000000000..afe84c2c7f09 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/build.sbt @@ -0,0 +1,64 @@ +import AssemblyKeys._ // put this at the top of the file + +import NativePackagerKeys._ + +packageArchetype.java_server + +assemblySettings + +scalariformSettings + +organization := "com.wordnik" + +seq(webSettings :_*) + +mainClass in assembly := Some("JettyMain") + +name := "scalatra-sample" + +version := "0.1.0-SNAPSHOT" + +scalaVersion := "2.11.2" + +scalacOptions += "-language:postfixOps" + +libraryDependencies ++= Seq( + "org.scalatest" %% "scalatest" % "2.2.1" % "test", + "org.scalatra" %% "scalatra" % "2.3.0.RC3", + "org.scalatra" %% "scalatra-scalate" % "2.3.0.RC3", + "org.scalatra" %% "scalatra-json" % "2.3.0.RC3", + "org.scalatra" %% "scalatra-swagger" % "2.3.0.RC3", + "org.scalatra" %% "scalatra-swagger-ext" % "2.3.0.RC3", + "org.scalatra" %% "scalatra-slf4j" % "2.3.0.RC3", + "org.json4s" %% "json4s-jackson" % "3.2.10", + "org.json4s" %% "json4s-ext" % "3.2.10", + "commons-codec" % "commons-codec" % "1.7", + "net.databinder.dispatch" %% "dispatch-core" % "0.11.2", + //"net.databinder.dispatch" %% "json4s-jackson" % "0.11.2", + "net.databinder.dispatch" %% "dispatch-json4s-jackson" % "0.11.2", + "com.typesafe.akka" %% "akka-actor" % "2.3.6", + "org.eclipse.jetty" % "jetty-server" % "9.2.3.v20140905" % "container;compile;test", + "org.eclipse.jetty" % "jetty-webapp" % "9.2.3.v20140905" % "container;compile;test", + "org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "container;compile;provided;test" artifacts (Artifact("javax.servlet", "jar", "jar")) +) + +resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository" + +resolvers += "Sonatype OSS Snapshots" at "http://oss.sonatype.org/content/repositories/snapshots/" + +resolvers += "Sonatype OSS Releases" at "http://oss.sonatype.org/content/repositories/releases/" + +ivyXML := + + + + + +mergeStrategy in assembly <<= (mergeStrategy in assembly) { + (old) => { + case "about.html" => MergeStrategy.discard + case x => old(x) + } +} + +net.virtualvoid.sbt.graph.Plugin.graphSettings diff --git a/modules/swagger-codegen/src/main/resources/scalatra/model.mustache b/modules/swagger-codegen/src/main/resources/scalatra/model.mustache new file mode 100644 index 000000000000..8c5d19546622 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/model.mustache @@ -0,0 +1,15 @@ +package {{package}} + +{{#imports}}import {{import}} +{{/imports}} + +{{#models}} + +{{#model}} +case class {{classname}} ( + {{#vars}}{{name}}: {{#isNotRequired}}Option[{{/isNotRequired}}{{datatype}}{{#isNotRequired}}] {{#description}} // {{description}}{{/description}} + {{/isNotRequired}}{{#hasMore}}, + {{/hasMore}}{{/vars}} +) +{{/model}} +{{/models}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/scalatra/project/build.properties b/modules/swagger-codegen/src/main/resources/scalatra/project/build.properties new file mode 100644 index 000000000000..be6c454fbaca --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.13.5 diff --git a/modules/swagger-codegen/src/main/resources/scalatra/project/plugins.sbt b/modules/swagger-codegen/src/main/resources/scalatra/project/plugins.sbt new file mode 100644 index 000000000000..7358abbbbc6a --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/project/plugins.sbt @@ -0,0 +1,9 @@ +addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.10.1") + +addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "0.7.5") + +addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "0.9.0") + +addSbtPlugin("com.typesafe.sbt" % "sbt-scalariform" % "1.3.0") + +addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.4") diff --git a/modules/swagger-codegen/src/main/resources/scalatra/sbt b/modules/swagger-codegen/src/main/resources/scalatra/sbt new file mode 100755 index 000000000000..08e58821219c --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/sbt @@ -0,0 +1,525 @@ +#!/usr/bin/env bash +# +# A more capable sbt runner, coincidentally also called sbt. +# Author: Paul Phillips + +# todo - make this dynamic +declare -r sbt_release_version="0.13.6" +declare -r sbt_unreleased_version="0.13.6" +declare -r buildProps="project/build.properties" + +declare sbt_jar sbt_dir sbt_create sbt_version +declare scala_version sbt_explicit_version +declare verbose noshare batch trace_level log_level +declare sbt_saved_stty debugUs + +echoerr () { echo >&2 "$@"; } +vlog () { [[ -n "$verbose" ]] && echoerr "$@"; } + +# spaces are possible, e.g. sbt.version = 0.13.0 +build_props_sbt () { + [[ -r "$buildProps" ]] && \ + grep '^sbt\.version' "$buildProps" | tr '=' ' ' | awk '{ print $2; }' +} + +update_build_props_sbt () { + local ver="$1" + local old="$(build_props_sbt)" + + [[ -r "$buildProps" ]] && [[ "$ver" != "$old" ]] && { + perl -pi -e "s/^sbt\.version\b.*\$/sbt.version=${ver}/" "$buildProps" + grep -q '^sbt.version[ =]' "$buildProps" || printf "\nsbt.version=%s\n" "$ver" >> "$buildProps" + + vlog "!!!" + vlog "!!! Updated file $buildProps setting sbt.version to: $ver" + vlog "!!! Previous value was: $old" + vlog "!!!" + } +} + +set_sbt_version () { + sbt_version="${sbt_explicit_version:-$(build_props_sbt)}" + [[ -n "$sbt_version" ]] || sbt_version=$sbt_release_version + export sbt_version +} + +# restore stty settings (echo in particular) +onSbtRunnerExit() { + [[ -n "$sbt_saved_stty" ]] || return + vlog "" + vlog "restoring stty: $sbt_saved_stty" + stty "$sbt_saved_stty" + unset sbt_saved_stty +} + +# save stty and trap exit, to ensure echo is reenabled if we are interrupted. +trap onSbtRunnerExit EXIT +sbt_saved_stty="$(stty -g 2>/dev/null)" +vlog "Saved stty: $sbt_saved_stty" + +# this seems to cover the bases on OSX, and someone will +# have to tell me about the others. +get_script_path () { + local path="$1" + [[ -L "$path" ]] || { echo "$path" ; return; } + + local target="$(readlink "$path")" + if [[ "${target:0:1}" == "/" ]]; then + echo "$target" + else + echo "${path%/*}/$target" + fi +} + +die() { + echo "Aborting: $@" + exit 1 +} + +make_url () { + version="$1" + + case "$version" in + 0.7.*) echo "http://simple-build-tool.googlecode.com/files/sbt-launch-0.7.7.jar" ;; + 0.10.* ) echo "$sbt_launch_repo/org.scala-tools.sbt/sbt-launch/$version/sbt-launch.jar" ;; + 0.11.[12]) echo "$sbt_launch_repo/org.scala-tools.sbt/sbt-launch/$version/sbt-launch.jar" ;; + *) echo "$sbt_launch_repo/org.scala-sbt/sbt-launch/$version/sbt-launch.jar" ;; + esac +} + +init_default_option_file () { + local overriding_var="${!1}" + local default_file="$2" + if [[ ! -r "$default_file" && "$overriding_var" =~ ^@(.*)$ ]]; then + local envvar_file="${BASH_REMATCH[1]}" + if [[ -r "$envvar_file" ]]; then + default_file="$envvar_file" + fi + fi + echo "$default_file" +} + +declare -r cms_opts="-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC" +declare -r jit_opts="-XX:ReservedCodeCacheSize=256m -XX:+TieredCompilation" +declare -r default_jvm_opts_common="-Xms512m -Xmx1536m -Xss2m $jit_opts $cms_opts" +declare -r noshare_opts="-Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy" +declare -r latest_28="2.8.2" +declare -r latest_29="2.9.3" +declare -r latest_210="2.10.4" +declare -r latest_211="2.11.2" + +declare -r script_path="$(get_script_path "$BASH_SOURCE")" +declare -r script_name="${script_path##*/}" + +# some non-read-onlies set with defaults +declare java_cmd="java" +declare sbt_opts_file="$(init_default_option_file SBT_OPTS .sbtopts)" +declare jvm_opts_file="$(init_default_option_file JVM_OPTS .jvmopts)" +declare sbt_launch_repo="http://typesafe.artifactoryonline.com/typesafe/ivy-releases" + +# pull -J and -D options to give to java. +declare -a residual_args +declare -a java_args +declare -a scalac_args +declare -a sbt_commands + +# args to jvm/sbt via files or environment variables +declare -a extra_jvm_opts extra_sbt_opts + +# if set, use JAVA_HOME over java found in path +[[ -e "$JAVA_HOME/bin/java" ]] && java_cmd="$JAVA_HOME/bin/java" + +# directory to store sbt launchers +declare sbt_launch_dir="$HOME/.sbt/launchers" +[[ -d "$sbt_launch_dir" ]] || mkdir -p "$sbt_launch_dir" +[[ -w "$sbt_launch_dir" ]] || sbt_launch_dir="$(mktemp -d -t sbt_extras_launchers.XXXXXX)" + +java_version () { + local version=$("$java_cmd" -version 2>&1 | grep -e 'java version' | awk '{ print $3 }' | tr -d \") + vlog "Detected Java version: $version" + echo "${version:2:1}" +} + +# MaxPermSize critical on pre-8 jvms but incurs noisy warning on 8+ +default_jvm_opts () { + local v="$(java_version)" + if [[ $v -ge 8 ]]; then + echo "$default_jvm_opts_common" + else + echo "-XX:MaxPermSize=384m $default_jvm_opts_common" + fi +} + +build_props_scala () { + if [[ -r "$buildProps" ]]; then + versionLine="$(grep '^build.scala.versions' "$buildProps")" + versionString="${versionLine##build.scala.versions=}" + echo "${versionString%% .*}" + fi +} + +execRunner () { + # print the arguments one to a line, quoting any containing spaces + vlog "# Executing command line:" && { + for arg; do + if [[ -n "$arg" ]]; then + if printf "%s\n" "$arg" | grep -q ' '; then + printf >&2 "\"%s\"\n" "$arg" + else + printf >&2 "%s\n" "$arg" + fi + fi + done + vlog "" + } + + [[ -n "$batch" ]] && exec /dev/null; then + curl --fail --silent "$url" --output "$jar" + elif which wget >/dev/null; then + wget --quiet -O "$jar" "$url" + fi + } && [[ -r "$jar" ]] +} + +acquire_sbt_jar () { + sbt_url="$(jar_url "$sbt_version")" + sbt_jar="$(jar_file "$sbt_version")" + + [[ -r "$sbt_jar" ]] || download_url "$sbt_url" "$sbt_jar" +} + +usage () { + cat < display stack traces with a max of frames (default: -1, traces suppressed) + -debug-inc enable debugging log for the incremental compiler + -no-colors disable ANSI color codes + -sbt-create start sbt even if current directory contains no sbt project + -sbt-dir path to global settings/plugins directory (default: ~/.sbt/) + -sbt-boot path to shared boot directory (default: ~/.sbt/boot in 0.11+) + -ivy path to local Ivy repository (default: ~/.ivy2) + -no-share use all local caches; no sharing + -offline put sbt in offline mode + -jvm-debug Turn on JVM debugging, open at the given port. + -batch Disable interactive mode + -prompt Set the sbt prompt; in expr, 's' is the State and 'e' is Extracted + + # sbt version (default: sbt.version from $buildProps if present, otherwise $sbt_release_version) + -sbt-force-latest force the use of the latest release of sbt: $sbt_release_version + -sbt-version use the specified version of sbt (default: $sbt_release_version) + -sbt-dev use the latest pre-release version of sbt: $sbt_unreleased_version + -sbt-jar use the specified jar as the sbt launcher + -sbt-launch-dir directory to hold sbt launchers (default: ~/.sbt/launchers) + -sbt-launch-repo repo url for downloading sbt launcher jar (default: $sbt_launch_repo) + + # scala version (default: as chosen by sbt) + -28 use $latest_28 + -29 use $latest_29 + -210 use $latest_210 + -211 use $latest_211 + -scala-home use the scala build at the specified directory + -scala-version use the specified version of scala + -binary-version use the specified scala version when searching for dependencies + + # java version (default: java from PATH, currently $(java -version 2>&1 | grep version)) + -java-home alternate JAVA_HOME + + # passing options to the jvm - note it does NOT use JAVA_OPTS due to pollution + # The default set is used if JVM_OPTS is unset and no -jvm-opts file is found + $(default_jvm_opts) + JVM_OPTS environment variable holding either the jvm args directly, or + the reference to a file containing jvm args if given path is prepended by '@' (e.g. '@/etc/jvmopts') + Note: "@"-file is overridden by local '.jvmopts' or '-jvm-opts' argument. + -jvm-opts file containing jvm args (if not given, .jvmopts in project root is used if present) + -Dkey=val pass -Dkey=val directly to the jvm + -J-X pass option -X directly to the jvm (-J is stripped) + + # passing options to sbt, OR to this runner + SBT_OPTS environment variable holding either the sbt args directly, or + the reference to a file containing sbt args if given path is prepended by '@' (e.g. '@/etc/sbtopts') + Note: "@"-file is overridden by local '.sbtopts' or '-sbt-opts' argument. + -sbt-opts file containing sbt args (if not given, .sbtopts in project root is used if present) + -S-X add -X to sbt's scalacOptions (-S is stripped) +EOM +} + +addJava () { + vlog "[addJava] arg = '$1'" + java_args=( "${java_args[@]}" "$1" ) +} +addSbt () { + vlog "[addSbt] arg = '$1'" + sbt_commands=( "${sbt_commands[@]}" "$1" ) +} +setThisBuild () { + vlog "[addBuild] args = '$@'" + local key="$1" && shift + addSbt "set $key in ThisBuild := $@" +} + +addScalac () { + vlog "[addScalac] arg = '$1'" + scalac_args=( "${scalac_args[@]}" "$1" ) +} +addResidual () { + vlog "[residual] arg = '$1'" + residual_args=( "${residual_args[@]}" "$1" ) +} +addResolver () { + addSbt "set resolvers += $1" +} +addDebugger () { + addJava "-Xdebug" + addJava "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$1" +} +setScalaVersion () { + [[ "$1" == *"-SNAPSHOT" ]] && addResolver 'Resolver.sonatypeRepo("snapshots")' + addSbt "++ $1" +} + +process_args () +{ + require_arg () { + local type="$1" + local opt="$2" + local arg="$3" + + if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then + die "$opt requires <$type> argument" + fi + } + while [[ $# -gt 0 ]]; do + case "$1" in + -h|-help) usage; exit 1 ;; + -v) verbose=true && shift ;; + -d) addSbt "--debug" && shift ;; + -w) addSbt "--warn" && shift ;; + -q) addSbt "--error" && shift ;; + -x) debugUs=true && shift ;; + -trace) require_arg integer "$1" "$2" && trace_level="$2" && shift 2 ;; + -ivy) require_arg path "$1" "$2" && addJava "-Dsbt.ivy.home=$2" && shift 2 ;; + -no-colors) addJava "-Dsbt.log.noformat=true" && shift ;; + -no-share) noshare=true && shift ;; + -sbt-boot) require_arg path "$1" "$2" && addJava "-Dsbt.boot.directory=$2" && shift 2 ;; + -sbt-dir) require_arg path "$1" "$2" && sbt_dir="$2" && shift 2 ;; + -debug-inc) addJava "-Dxsbt.inc.debug=true" && shift ;; + -offline) addSbt "set offline := true" && shift ;; + -jvm-debug) require_arg port "$1" "$2" && addDebugger "$2" && shift 2 ;; + -batch) batch=true && shift ;; + -prompt) require_arg "expr" "$1" "$2" && setThisBuild shellPrompt "(s => { val e = Project.extract(s) ; $2 })" && shift 2 ;; + + -sbt-create) sbt_create=true && shift ;; + -sbt-jar) require_arg path "$1" "$2" && sbt_jar="$2" && shift 2 ;; + -sbt-version) require_arg version "$1" "$2" && sbt_explicit_version="$2" && shift 2 ;; + -sbt-force-latest) sbt_explicit_version="$sbt_release_version" && shift ;; + -sbt-dev) sbt_explicit_version="$sbt_unreleased_version" && shift ;; + -sbt-launch-dir) require_arg path "$1" "$2" && sbt_launch_dir="$2" && shift 2 ;; + -sbt-launch-repo) require_arg path "$1" "$2" && sbt_launch_repo="$2" && shift 2 ;; + -scala-version) require_arg version "$1" "$2" && setScalaVersion "$2" && shift 2 ;; + -binary-version) require_arg version "$1" "$2" && setThisBuild scalaBinaryVersion "\"$2\"" && shift 2 ;; + -scala-home) require_arg path "$1" "$2" && setThisBuild scalaHome "Some(file(\"$2\"))" && shift 2 ;; + -java-home) require_arg path "$1" "$2" && java_cmd="$2/bin/java" && shift 2 ;; + -sbt-opts) require_arg path "$1" "$2" && sbt_opts_file="$2" && shift 2 ;; + -jvm-opts) require_arg path "$1" "$2" && jvm_opts_file="$2" && shift 2 ;; + + -D*) addJava "$1" && shift ;; + -J*) addJava "${1:2}" && shift ;; + -S*) addScalac "${1:2}" && shift ;; + -28) setScalaVersion "$latest_28" && shift ;; + -29) setScalaVersion "$latest_29" && shift ;; + -210) setScalaVersion "$latest_210" && shift ;; + -211) setScalaVersion "$latest_211" && shift ;; + + *) addResidual "$1" && shift ;; + esac + done +} + +# process the direct command line arguments +process_args "$@" + +# skip #-styled comments and blank lines +readConfigFile() { + while read line; do + [[ $line =~ ^# ]] || [[ -z $line ]] || echo "$line" + done < "$1" +} + +# if there are file/environment sbt_opts, process again so we +# can supply args to this runner +if [[ -r "$sbt_opts_file" ]]; then + vlog "Using sbt options defined in file $sbt_opts_file" + while read opt; do extra_sbt_opts+=("$opt"); done < <(readConfigFile "$sbt_opts_file") +elif [[ -n "$SBT_OPTS" && ! ("$SBT_OPTS" =~ ^@.*) ]]; then + vlog "Using sbt options defined in variable \$SBT_OPTS" + extra_sbt_opts=( $SBT_OPTS ) +else + vlog "No extra sbt options have been defined" +fi + +[[ -n "${extra_sbt_opts[*]}" ]] && process_args "${extra_sbt_opts[@]}" + +# reset "$@" to the residual args +set -- "${residual_args[@]}" +argumentCount=$# + +# set sbt version +set_sbt_version + +# only exists in 0.12+ +setTraceLevel() { + case "$sbt_version" in + "0.7."* | "0.10."* | "0.11."* ) echoerr "Cannot set trace level in sbt version $sbt_version" ;; + *) setThisBuild traceLevel $trace_level ;; + esac +} + +# set scalacOptions if we were given any -S opts +[[ ${#scalac_args[@]} -eq 0 ]] || addSbt "set scalacOptions in ThisBuild += \"${scalac_args[@]}\"" + +# Update build.properties on disk to set explicit version - sbt gives us no choice +[[ -n "$sbt_explicit_version" ]] && update_build_props_sbt "$sbt_explicit_version" +vlog "Detected sbt version $sbt_version" + +[[ -n "$scala_version" ]] && vlog "Overriding scala version to $scala_version" + +# no args - alert them there's stuff in here +(( argumentCount > 0 )) || { + vlog "Starting $script_name: invoke with -help for other options" + residual_args=( shell ) +} + +# verify this is an sbt dir or -create was given +[[ -r ./build.sbt || -d ./project || -n "$sbt_create" ]] || { + cat < + + + org.scalatra.servlet.ScalatraListener + + + + default + /*.html + /css/* + /js/*.js + /images/* + + diff --git a/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/bootstrap-responsive.css b/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/bootstrap-responsive.css new file mode 100644 index 000000000000..a3352d774ce8 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/bootstrap-responsive.css @@ -0,0 +1,1092 @@ +/*! + * Bootstrap Responsive v2.2.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +@-ms-viewport { + width: device-width; +} + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} + +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 30px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.564102564102564%; + *margin-left: 2.5109110747408616%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.564102564102564%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145299145%; + *width: 91.39979996362975%; + } + .row-fluid .span10 { + width: 82.90598290598291%; + *width: 82.8527914166212%; + } + .row-fluid .span9 { + width: 74.35897435897436%; + *width: 74.30578286961266%; + } + .row-fluid .span8 { + width: 65.81196581196582%; + *width: 65.75877432260411%; + } + .row-fluid .span7 { + width: 57.26495726495726%; + *width: 57.21176577559556%; + } + .row-fluid .span6 { + width: 48.717948717948715%; + *width: 48.664757228587014%; + } + .row-fluid .span5 { + width: 40.17094017094017%; + *width: 40.11774868157847%; + } + .row-fluid .span4 { + width: 31.623931623931625%; + *width: 31.570740134569924%; + } + .row-fluid .span3 { + width: 23.076923076923077%; + *width: 23.023731587561375%; + } + .row-fluid .span2 { + width: 14.52991452991453%; + *width: 14.476723040552828%; + } + .row-fluid .span1 { + width: 5.982905982905983%; + *width: 5.929714493544281%; + } + .row-fluid .offset12 { + margin-left: 105.12820512820512%; + *margin-left: 105.02182214948171%; + } + .row-fluid .offset12:first-child { + margin-left: 102.56410256410257%; + *margin-left: 102.45771958537915%; + } + .row-fluid .offset11 { + margin-left: 96.58119658119658%; + *margin-left: 96.47481360247316%; + } + .row-fluid .offset11:first-child { + margin-left: 94.01709401709402%; + *margin-left: 93.91071103837061%; + } + .row-fluid .offset10 { + margin-left: 88.03418803418803%; + *margin-left: 87.92780505546462%; + } + .row-fluid .offset10:first-child { + margin-left: 85.47008547008548%; + *margin-left: 85.36370249136206%; + } + .row-fluid .offset9 { + margin-left: 79.48717948717949%; + *margin-left: 79.38079650845607%; + } + .row-fluid .offset9:first-child { + margin-left: 76.92307692307693%; + *margin-left: 76.81669394435352%; + } + .row-fluid .offset8 { + margin-left: 70.94017094017094%; + *margin-left: 70.83378796144753%; + } + .row-fluid .offset8:first-child { + margin-left: 68.37606837606839%; + *margin-left: 68.26968539734497%; + } + .row-fluid .offset7 { + margin-left: 62.393162393162385%; + *margin-left: 62.28677941443899%; + } + .row-fluid .offset7:first-child { + margin-left: 59.82905982905982%; + *margin-left: 59.72267685033642%; + } + .row-fluid .offset6 { + margin-left: 53.84615384615384%; + *margin-left: 53.739770867430444%; + } + .row-fluid .offset6:first-child { + margin-left: 51.28205128205128%; + *margin-left: 51.175668303327875%; + } + .row-fluid .offset5 { + margin-left: 45.299145299145295%; + *margin-left: 45.1927623204219%; + } + .row-fluid .offset5:first-child { + margin-left: 42.73504273504273%; + *margin-left: 42.62865975631933%; + } + .row-fluid .offset4 { + margin-left: 36.75213675213675%; + *margin-left: 36.645753773413354%; + } + .row-fluid .offset4:first-child { + margin-left: 34.18803418803419%; + *margin-left: 34.081651209310785%; + } + .row-fluid .offset3 { + margin-left: 28.205128205128204%; + *margin-left: 28.0987452264048%; + } + .row-fluid .offset3:first-child { + margin-left: 25.641025641025642%; + *margin-left: 25.53464266230224%; + } + .row-fluid .offset2 { + margin-left: 19.65811965811966%; + *margin-left: 19.551736679396257%; + } + .row-fluid .offset2:first-child { + margin-left: 17.094017094017094%; + *margin-left: 16.98763411529369%; + } + .row-fluid .offset1 { + margin-left: 11.11111111111111%; + *margin-left: 11.004728132387708%; + } + .row-fluid .offset1:first-child { + margin-left: 8.547008547008547%; + *margin-left: 8.440625568285142%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 30px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1156px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1056px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 956px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 856px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 756px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 656px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 556px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 456px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 356px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 256px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 156px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 56px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + .modal.fade { + top: -100px; + } + .modal.fade.in { + top: 20px; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + .media-object { + margin-right: 0; + margin-left: 0; + } + .modal { + top: 10px; + right: 10px; + left: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .dropdown-menu a:hover { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:hover { + background-color: #111111; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/bootstrap.css b/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/bootstrap.css new file mode 100644 index 000000000000..db3b3bfd6a0c --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/bootstrap.css @@ -0,0 +1,6057 @@ +/*! + * Bootstrap v2.2.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + width: auto\9; + height: auto; + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, +.google-maps img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover { + color: #005580; + text-decoration: underline; +} + +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + line-height: 0; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} + +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} + +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} + +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} + +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} + +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} + +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} + +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} + +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} + +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} + +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} + +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} + +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} + +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} + +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} + +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} + +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} + +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} + +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} + +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} + +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} + +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} + +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} + +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} + +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} + +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} + +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} + +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} + +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} + +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} + +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} + +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} + +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} + +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} + +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} + +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} + +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} + +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} + +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + line-height: 0; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px; +} + +small { + font-size: 85%; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +cite { + font-style: normal; +} + +.muted { + color: #999999; +} + +a.muted:hover { + color: #808080; +} + +.text-warning { + color: #c09853; +} + +a.text-warning:hover { + color: #a47e3c; +} + +.text-error { + color: #b94a48; +} + +a.text-error:hover { + color: #953b39; +} + +.text-info { + color: #3a87ad; +} + +a.text-info:hover { + color: #2d6987; +} + +.text-success { + color: #468847; +} + +a.text-success:hover { + color: #356635; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 20px; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + line-height: 40px; +} + +h1 { + font-size: 38.5px; +} + +h2 { + font-size: 31.5px; +} + +h3 { + font-size: 24.5px; +} + +h4 { + font-size: 17.5px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 11.9px; +} + +h1 small { + font-size: 24.5px; +} + +h2 small { + font-size: 17.5px; +} + +h3 small { + font-size: 14px; +} + +h4 small { + font-size: 14px; +} + +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +li { + line-height: 20px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; +} + +ul.inline > li, +ol.inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} + +dl { + margin-bottom: 20px; +} + +dt, +dd { + line-height: 20px; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 10px; +} + +.dl-horizontal { + *zoom: 1; +} + +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + line-height: 0; + content: ""; +} + +.dl-horizontal:after { + clear: both; +} + +.dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 180px; +} + +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 25px; +} + +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +blockquote.pull-right small:before { + content: ''; +} + +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + white-space: nowrap; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 20px; +} + +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 20px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 15px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555555; + vertical-align: middle; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +input, +textarea, +.uneditable-input { + width: 206px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + *margin-top: 0; + line-height: normal; +} + +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} + +select { + width: 220px; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.uneditable-input, +.uneditable-textarea { + color: #999999; + cursor: not-allowed; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} + +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} + +.controls-row { + *zoom: 1; +} + +.controls-row:before, +.controls-row:after { + display: table; + line-height: 0; + content: ""; +} + +.controls-row:after { + clear: both; +} + +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} + +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; +} + +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; +} + +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; +} + +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} + +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad; +} + +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} + +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} + +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + line-height: 0; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.help-block, +.help-inline { + color: #595959; +} + +.help-block { + display: block; + margin-bottom: 10px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-append, +.input-prepend { + margin-bottom: 5px; + font-size: 0; + white-space: nowrap; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu { + font-size: 14px; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} + +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group > .dropdown-toggle, +.input-prepend .btn-group > .dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input + .btn-group .btn:last-child, +.input-append select + .btn-group .btn:last-child, +.input-append .uneditable-input + .btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child > .dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +/* Allow for input prepend/append in search forms */ + +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + vertical-align: middle; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 10px; +} + +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + line-height: 0; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 180px; +} + +.form-horizontal .help-block { + margin-bottom: 0; +} + +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block, +.form-horizontal .uneditable-input + .help-block, +.form-horizontal .input-prepend + .help-block, +.form-horizontal .input-append + .help-block { + margin-top: 10px; +} + +.form-horizontal .form-actions { + padding-left: 180px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table, table { + width: 100%; + margin-bottom: 20px; +} + +.table th, +table th, +.table td, +table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th, +table th { + font-weight: bold; +} + +.table thead th, +table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td, +table caption + thead tr:first-child th, +table caption + thead tr:first-child td, +table colgroup + thead tr:first-child th, +table colgroup + thead tr:first-child td, +table thead:first-child tr:first-child th, +table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody, +table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table .table, +table table { + background-color: #ffffff; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child > th:first-child, +.table-bordered tbody:first-child tr:first-child > td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child > th:last-child, +.table-bordered tbody:first-child tr:first-child > td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:first-child, +.table-bordered tbody:last-child tr:last-child > td:first-child, +.table-bordered tfoot:last-child tr:last-child > td:first-child { + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:last-child, +.table-bordered tbody:last-child tr:last-child > td:last-child, +.table-bordered tfoot:last-child tr:last-child > td:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; +} + +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-striped tbody > tr:nth-child(odd) > td, +.table-striped tbody > tr:nth-child(odd) > th, +table tbody > tr:nth-child(odd) > td, +table tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover tbody tr:hover td, +.table-hover tbody tr:hover th { + background-color: #f5f5f5; +} + +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} + +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} + +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} + +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} + +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} + +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} + +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} + +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} + +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} + +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} + +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} + +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} + +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} + +.table tbody tr.success td, +table tbody tr.success td { + background-color: #dff0d8; +} + +.table tbody tr.error td, +table tbody tr.error td { + background-color: #f2dede; +} + +.table tbody tr.warning td, +table tbody tr.warning td { + background-color: #fcf8e3; +} + +.table tbody tr.info td, +table tbody tr.info td { + background-color: #d9edf7; +} + +.table-hover tbody tr.success:hover td { + background-color: #d0e9c6; +} + +.table-hover tbody tr.error:hover td { + background-color: #ebcccc; +} + +.table-hover tbody tr.warning:hover td { + background-color: #faf2cc; +} + +.table-hover tbody tr.info:hover td { + background-color: #c4e3f3; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +/* White icons with optional class, or on hover/active states of certain elements */ + +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"] { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + width: 16px; + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + background-position: -384px -120px; +} + +.icon-folder-open { + width: 16px; + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu li > a:hover, +.dropdown-menu li > a:focus, +.dropdown-submenu:hover > a { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu .active > a, +.dropdown-menu .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + outline: 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu .disabled > a, +.dropdown-menu .disabled > a:hover { + color: #999999; +} + +.dropdown-menu .disabled > a:hover { + text-decoration: none; + cursor: default; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} + +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} + +.dropdown-submenu > a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + border-left-color: #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " "; +} + +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px; +} + +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 12px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 14px; + line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #bbbbbb; + *border: 0; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-bottom-color: #a2a2a2; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} + +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} + +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 0 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn { + border-color: #c5c5c5; + border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); +} + +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + *background-color: #0044cc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} + +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + *background-color: #f89406; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + *background-color: #bd362f; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + *background-color: #51a351; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + *background-color: #222222; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-link { + color: #0088cc; + cursor: pointer; + border-color: transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-link:hover { + color: #005580; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover { + color: #333333; + text-decoration: none; +} + +.btn-group { + position: relative; + display: inline-block; + *display: inline; + *margin-left: .3em; + font-size: 0; + white-space: nowrap; + vertical-align: middle; + *zoom: 1; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 10px; + margin-bottom: 10px; + font-size: 0; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn + .btn { + margin-left: -1px; +} + +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: 14px; +} + +.btn-group > .btn-mini { + font-size: 10.5px; +} + +.btn-group > .btn-small { + font-size: 11.9px; +} + +.btn-group > .btn-large { + font-size: 17.5px; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + *padding-top: 5px; + padding-right: 8px; + *padding-bottom: 5px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini + .dropdown-toggle { + *padding-top: 2px; + padding-right: 5px; + *padding-bottom: 2px; + padding-left: 5px; +} + +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large + .dropdown-toggle { + *padding-top: 7px; + padding-right: 12px; + *padding-bottom: 7px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 8px; + margin-left: 0; +} + +.btn-mini .caret, +.btn-small .caret, +.btn-large .caret { + margin-top: 6px; +} + +.btn-large .caret { + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.dropup .btn-large .caret { + border-bottom-width: 5px; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group-vertical > .btn + .btn { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.btn-group-vertical > .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.btn-group-vertical > .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} + +.btn-group-vertical > .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert, +.alert h4 { + color: #c09853; +} + +.alert h4 { + margin: 0; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success h4 { + color: #468847; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-danger h4, +.alert-error h4 { + color: #b94a48; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info h4 { + color: #3a87ad; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 20px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > li > a > img { + max-width: none; +} + +.nav > .pull-right { + float: right; +} + +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + line-height: 0; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.nav-tabs.nav-stacked > li > a:hover { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.nav .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav .dropdown-toggle:hover .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +/* move down carets for tabs */ + +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} + +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.nav > .dropdown.active > a:hover { + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + line-height: 0; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.nav > .disabled > a { + color: #999999; +} + +.nav > .disabled > a:hover { + text-decoration: none; + cursor: default; + background-color: transparent; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 20px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.navbar-inner:before, +.navbar-inner:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-inner:after { + clear: both; +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; + overflow: visible; +} + +.navbar .brand { + display: block; + float: left; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .brand:hover { + text-decoration: none; +} + +.navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #777777; +} + +.navbar-link { + color: #777777; +} + +.navbar-link:hover { + color: #333333; +} + +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-right: 1px solid #ffffff; + border-left: 1px solid #f2f2f2; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn { + margin-top: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 14px; + margin-bottom: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.navbar-static-top { + position: static; + margin-bottom: 0; +} + +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} + +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} + +.navbar .nav > li { + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + color: #333333; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + *background-color: #e5e5e5; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .nav > li > .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .nav > li > .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown > a:hover .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #555555; + background-color: #e5e5e5; +} + +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + border-color: #252525; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); +} + +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; +} + +.navbar-inverse .brand { + color: #999999; +} + +.navbar-inverse .navbar-text { + color: #999999; +} + +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} + +.navbar-inverse .divider-vertical { + border-right-color: #222222; + border-left-color: #111111; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .nav li.dropdown > a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + *background-color: #040404; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} + +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb > li > .divider { + padding: 0 5px; + color: #ccc; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + margin: 20px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination ul > li { + display: inline; +} + +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} + +.pagination ul > li > a:hover, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} + +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} + +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pagination-large ul > li > a, +.pagination-large ul > li > span { + padding: 11px 19px; + font-size: 17.5px; +} + +.pagination-large ul > li:first-child > a, +.pagination-large ul > li:first-child > span { + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.pagination-large ul > li:last-child > a, +.pagination-large ul > li:last-child > span { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.pagination-mini ul > li:first-child > a, +.pagination-small ul > li:first-child > a, +.pagination-mini ul > li:first-child > span, +.pagination-small ul > li:first-child > span { + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; +} + +.pagination-mini ul > li:last-child > a, +.pagination-small ul > li:last-child > a, +.pagination-mini ul > li:last-child > span, +.pagination-small ul > li:last-child > span { + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; +} + +.pagination-small ul > li > a, +.pagination-small ul > li > span { + padding: 2px 10px; + font-size: 11.9px; +} + +.pagination-mini ul > li > a, +.pagination-mini ul > li > span { + padding: 0 6px; + font-size: 10.5px; +} + +.pager { + margin: 20px 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + line-height: 0; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager li > a:hover { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next > a, +.pager .next > span { + float: right; +} + +.pager .previous > a, +.pager .previous > span { + float: left; +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > span { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 10%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-header h3 { + margin: 0; + line-height: 30px; +} + +.modal-body { + position: relative; + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + line-height: 0; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + padding: 5px; + font-size: 11px; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + margin-top: -3px; +} + +.tooltip.right { + margin-left: 3px; +} + +.tooltip.bottom { + margin-top: 3px; +} + +.tooltip.left { + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + width: 236px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.popover-content { + padding: 9px 14px; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow { + border-width: 11px; +} + +.popover .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + line-height: 0; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +a.thumbnail:hover { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; + color: #555555; +} + +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media .pull-left { + margin-right: 10px; +} + +.media .pull-right { + margin-left: 10px; +} + +.media-list { + margin-left: 0; + list-style: none; +} + +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding-right: 9px; + padding-left: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +.label:empty, +.badge:empty { + display: none; +} + +a.label:hover, +a.badge:hover { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} + +.btn-mini .label, +.btn-mini .badge { + top: 0; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} + +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} + +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.accordion { + margin-bottom: 20px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img { + display: block; + line-height: 1; +} + +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} + +.carousel-inner > .active { + left: 0; +} + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel-inner > .next { + left: 100%; +} + +.carousel-inner > .prev { + left: -100%; +} + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} + +.carousel-inner > .active.left { + left: -100%; +} + +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + line-height: 20px; + color: #ffffff; +} + +.carousel-caption h4 { + margin: 0 0 5px; +} + +.carousel-caption p { + margin-bottom: 0; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit li { + line-height: 30px; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} + +.affix { + position: fixed; +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/site.css b/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/site.css new file mode 100644 index 000000000000..2c4cd52d35f4 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/site.css @@ -0,0 +1 @@ +site.css \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/style.css b/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/style.css new file mode 100644 index 000000000000..b26d2ef13ca8 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/style.css @@ -0,0 +1,292 @@ +.line-numbers { + margin-right: 1.0em; +} + +.content { + padding-bottom: 100px; +} + +.column_header_name { + width: 150px; +} + +.column_header_path { + width: 350px; +} + +.column_header_name .column_header_param_type .column_header_data_type .column_header_return_type { + width: 200px; +} + +.expandable { + display: none; +} + +.main_content { + margin-top: 80px; + margin-left: 25px; + margin-right: 25px; +} + +.model { + float: left; +} + +.model-container { + float: left; + width: 500px; + padding: 0px; +} + +.model-detail-container { + clear: left; + float: left; + width: 500px; + margin-left: 40px; +} + +.model-detail-popup { + box-shadow: rgba(0, 0, 0, 0.2) 0 2px 8px 5px; + border-style: solid; + border-width: 1px; + border-color: black; + padding-left: 10px; + padding-right: 10px; + padding-top: 10px; + padding-bottom: 10px; + background-color: white; + opacity: 0.99; + z-index: 1; + overflow: scroll; + width: 400px; +} + +.model-detail-popup .code { + background-color: #E4F5FF; + font-family: monospace; + white-space: pre; + margin: 10px; + overflow: auto; +} + +.model-detail-popup h2 { + margin-top: 0px; + padding-top: 0px; +} + +.model-detail-popup li { + padding-bottom: 5px; +} + +.model-detail-popup .param-reqiured-true { + font-family: monospace; + font-weight: bold; + clear: left; + display: block; + float: left; + width: 100%; +} + +.model-detail-popup .param-required-false { + font-family: monospace; + clear: left; + display: block; + float: left; + width: 100%; +} + +.model-detail-popup .param-description { + margin-left: 50px; + float: left; +} + +.section-header { + border-bottom: 2px; + font-weight: bold; + font-size: 15px; + padding: 6px 0; + color: rgb(57,57,57); +} + +.content { + padding-top: 100px; +} + +.content h1 { + font-size: 43px; + text-align: center; + margin-top: 40px; + margin-bottom: 40px; +} + +.sidebar { + box-sizing: border-box; + float: left; + display: block; + width: 240px; + overflow: scroll; + position: fixed; +} + +.section-box { + border-bottom-style: solid; + border-bottom: 10px; +} + +.section-box ul li { + list-style: none; + margin-left: 0px; +} + +.non-sidebar { + box-sizing: border-box; + display: block; + margin-left: 240px; + margin-right: 0px; + width: 638px; +} + +.non-sidebar h2 { + clear: left; + padding-top: 20px; +} + +.param { + display: block; + float: left; + width: 220px; + clear: left; +} + +.param-description { + float: left; + font-family: 'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif; +} + +.param-optional-flag { + font-style: italic; +} + +.section { + font-weight: normal; + clear: left; +} + +.section a { + text-decoration: underline; +} + +.code { + background-color: #E4F5FF; + font-family: monospace; + white-space: pre; + margin: 10px; + overflow: auto; + width: 600px; +} + +.header { + position: fixed; + text-align: left; + background-color: black; + float: left; + top: 0; + width: 100%; + height: 70px auto; + padding-bottom: 20px; + box-shadow: rgba(0, 0, 0, 0.2) 0 2px 8px 5px; +} + +.top-bar h1 a { + width: auto; +} + +.top-bar h1#logo a { + width: auto; + display: block; + clear: none; + float: left; + background-position: left;; + color: white; + text-decoration: none; +} + +.top-bar ul li { + list-style: none; +} + +.top-bar h1#logo span { + display: block; + clear: none; + float: left; + padding-top: 10px; + padding-left: 10px; + margin: 0px; +} + +.top-bar h1#logo a span.light { + color: #ffc97a; + color: #666666; + padding-left: 0px; +} + +.top-bar ul#nav { + float: none; + clear: both; + overflow: hidden; + margin: 0; + padding: 0; + display: block; + float: right; + clear: none; +} + +.top-bar ul#nav li { + float: left; + clear: none; + margin: 0; + padding: 2px 10px; + border-right: 1px solid #dddddd; +} + +.top-bar ul#nav li:first-child, .top-bar ul#nav li.first { + padding-left: 0; +} + +.top-bar ul#nav li:last-child, .top-bar ul#nav li.last { + padding-right: 0; + border-right: none; +} + +.top-bar ul#nav li { + border: none; + padding: 0 5px; +} + +.top-bar ul#nav li a { + display: block; + padding: 8px 10px 8px 10px; + color: #999999; + text-decoration: none; +} + +.top-bar ul#nav li a.strong { + color: white; +} + +.top-bar ul#nav li a:active, .top-bar ul#nav li a.active, .top-bar ul#nav li a:hover { + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -o-border-radius: 4px; + -ms-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + background-image: -webkit-gradient(linear, 0% 100%, 0% 0%, color-stop(0%, #ff5401), color-stop(100%, #ffa014)); + background-image: -moz-linear-gradient(bottom, #ff5401 0%, #ffa014 100%); + background-image: linear-gradient(bottom, #ff5401 0%, #ffa014 100%); + color: white; +} + +.top-bar ul#nav:hover li { + border-color: #222222; +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/swagger-static/assets/images/logo.png b/modules/swagger-codegen/src/main/resources/swagger-static/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..209e5a473fc0fcb6dcda9eb4cb660f72008929fd GIT binary patch literal 14577 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 (children.length - 1) || pos < 0) return + + if (this.sliding) { + return this.$element.one('slid', function () { + that.to(pos) + }) + } + + if (activePos == pos) { + return this.pause().cycle() + } + + return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) + } + + , pause: function (e) { + if (!e) this.paused = true + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle() + } + clearInterval(this.interval) + this.interval = null + return this + } + + , next: function () { + if (this.sliding) return + return this.slide('next') + } + + , prev: function () { + if (this.sliding) return + return this.slide('prev') + } + + , slide: function (type, next) { + var $active = this.$element.find('.item.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + , e + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + e = $.Event('slide', { + relatedTarget: $next[0] + }) + + if ($next.hasClass('active')) return + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + } + + + /* CAROUSEL PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('carousel') + , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) + , action = typeof option == 'string' ? option : options.slide + if (!data) $this.data('carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.cycle() + }) + } + + $.fn.carousel.defaults = { + interval: 5000 + , pause: 'hover' + } + + $.fn.carousel.Constructor = Carousel + + + /* CAROUSEL NO CONFLICT + * ==================== */ + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + /* CAROUSEL DATA-API + * ================= */ + + $(document).on('click.carousel.data-api', '[data-slide]', function (e) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , options = $.extend({}, $target.data(), $this.data()) + $target.carousel(options) + e.preventDefault() + }) + +}(window.jQuery);/* ============================================================= + * bootstrap-collapse.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#collapse + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed 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. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* COLLAPSE PUBLIC CLASS DEFINITION + * ================================ */ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.collapse.defaults, options) + + if (this.options.parent) { + this.$parent = $(this.options.parent) + } + + this.options.toggle && this.toggle() + } + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension + , scroll + , actives + , hasData + + if (this.transitioning) return + + dimension = this.dimension() + scroll = $.camelCase(['scroll', dimension].join('-')) + actives = this.$parent && this.$parent.find('> .accordion-group > .in') + + if (actives && actives.length) { + hasData = actives.data('collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('collapse', null) + } + + this.$element[dimension](0) + this.transition('addClass', $.Event('show'), 'shown') + $.support.transition && this.$element[dimension](this.$element[0][scroll]) + } + + , hide: function () { + var dimension + if (this.transitioning) return + dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', $.Event('hide'), 'hidden') + this.$element[dimension](0) + } + + , reset: function (size) { + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') + + return this + } + + , transition: function (method, startEvent, completeEvent) { + var that = this + , complete = function () { + if (startEvent.type == 'show') that.reset() + that.transitioning = 0 + that.$element.trigger(completeEvent) + } + + this.$element.trigger(startEvent) + + if (startEvent.isDefaultPrevented()) return + + this.transitioning = 1 + + this.$element[method]('in') + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + } + + + /* COLLAPSE PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = typeof option == 'object' && option + if (!data) $this.data('collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.defaults = { + toggle: true + } + + $.fn.collapse.Constructor = Collapse + + + /* COLLAPSE NO CONFLICT + * ==================== */ + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + /* COLLAPSE DATA-API + * ================= */ + + $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data() + $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + $(target).collapse(option) + }) + +}(window.jQuery);/* ============================================================ + * bootstrap-dropdown.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#dropdowns + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed 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. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle=dropdown]' + , Dropdown = function (element) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function (e) { + var $this = $(this) + , $parent + , isActive + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + $parent.toggleClass('open') + } + + $this.focus() + + return false + } + + , keydown: function (e) { + var $this + , $items + , $active + , $parent + , isActive + , index + + if (!/(38|40|27)/.test(e.keyCode)) return + + $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + if (!isActive || (isActive && e.keyCode == 27)) return $this.click() + + $items = $('[role=menu] li:not(.divider):visible a', $parent) + + if (!$items.length) return + + index = $items.index($items.filter(':focus')) + + if (e.keyCode == 38 && index > 0) index-- // up + if (e.keyCode == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items + .eq(index) + .focus() + } + + } + + function clearMenus() { + $(toggle).each(function () { + getParent($(this)).removeClass('open') + }) + } + + function getParent($this) { + var selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + $parent.length || ($parent = $this.parent()) + + return $parent + } + + + /* DROPDOWN PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.dropdown + + $.fn.dropdown = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('dropdown') + if (!data) $this.data('dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.dropdown.Constructor = Dropdown + + + /* DROPDOWN NO CONFLICT + * ==================== */ + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + /* APPLY TO STANDARD DROPDOWN ELEMENTS + * =================================== */ + + $(document) + .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus) + .on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('touchstart.dropdown.data-api', '.dropdown-menu', function (e) { e.stopPropagation() }) + .on('click.dropdown.data-api touchstart.dropdown.data-api' , toggle, Dropdown.prototype.toggle) + .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) + +}(window.jQuery);/* ========================================================= + * bootstrap-modal.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#modals + * ========================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed 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. + * ========================================================= */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* MODAL CLASS DEFINITION + * ====================== */ + + var Modal = function (element, options) { + this.options = options + this.$element = $(element) + .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) + this.options.remote && this.$element.find('.modal-body').load(this.options.remote) + } + + Modal.prototype = { + + constructor: Modal + + , toggle: function () { + return this[!this.isShown ? 'show' : 'hide']() + } + + , show: function () { + var that = this + , e = $.Event('show') + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.escape() + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(document.body) //don't move modals dom position + } + + that.$element + .show() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element + .addClass('in') + .attr('aria-hidden', false) + + that.enforceFocus() + + transition ? + that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) : + that.$element.focus().trigger('shown') + + }) + } + + , hide: function (e) { + e && e.preventDefault() + + var that = this + + e = $.Event('hide') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + + $(document).off('focusin.modal') + + this.$element + .removeClass('in') + .attr('aria-hidden', true) + + $.support.transition && this.$element.hasClass('fade') ? + this.hideWithTransition() : + this.hideModal() + } + + , enforceFocus: function () { + var that = this + $(document).on('focusin.modal', function (e) { + if (that.$element[0] !== e.target && !that.$element.has(e.target).length) { + that.$element.focus() + } + }) + } + + , escape: function () { + var that = this + if (this.isShown && this.options.keyboard) { + this.$element.on('keyup.dismiss.modal', function ( e ) { + e.which == 27 && that.hide() + }) + } else if (!this.isShown) { + this.$element.off('keyup.dismiss.modal') + } + } + + , hideWithTransition: function () { + var that = this + , timeout = setTimeout(function () { + that.$element.off($.support.transition.end) + that.hideModal() + }, 500) + + this.$element.one($.support.transition.end, function () { + clearTimeout(timeout) + that.hideModal() + }) + } + + , hideModal: function (that) { + this.$element + .hide() + .trigger('hidden') + + this.backdrop() + } + + , removeBackdrop: function () { + this.$backdrop.remove() + this.$backdrop = null + } + + , backdrop: function (callback) { + var that = this + , animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $(' + + + \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/api-docs b/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/api-docs new file mode 100644 index 000000000000..370eca562a78 --- /dev/null +++ b/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/api-docs @@ -0,0 +1,60 @@ +{ + "apiVersion": "1.0.0", + "swaggerVersion": "1.2", + "apis": [ + { + "path": "/pet", + "description": "Operations about pets" + }, + { + "path": "/user", + "description": "Operations about user" + }, + { + "path": "/store", + "description": "Operations about store" + } + ], + "authorizations": { + "oauth2": { + "type": "oauth2", + "scopes": [ + { + "scope": "email", + "description": "Access to your email address" + }, + { + "scope": "pets", + "description": "Access to your pets" + } + ], + "grantTypes": { + "implicit": { + "loginEndpoint": { + "url": "http://petstore.swagger.wordnik.com/oauth/dialog" + }, + "tokenName": "access_token" + }, + "authorization_code": { + "tokenRequestEndpoint": { + "url": "http://petstore.swagger.wordnik.com/oauth/requestToken", + "clientIdName": "client_id", + "clientSecretName": "client_secret" + }, + "tokenEndpoint": { + "url": "http://petstore.swagger.wordnik.com/oauth/token", + "tokenName": "access_code" + } + } + } + } + }, + "info": { + "title": "Swagger Sample App", + "description": "This is a sample server Petstore server. You can find out more about Swagger \n at http://swagger.wordnik.com or on irc.freenode.net, #swagger. For this sample,\n you can use the api key \"special-key\" to test the authorization filters", + "termsOfServiceUrl": "http://helloreverb.com/terms/", + "contact": "apiteam@wordnik.com", + "license": "Apache 2.0", + "licenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.html" + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/pet b/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/pet new file mode 100644 index 000000000000..4a8439a44247 --- /dev/null +++ b/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/pet @@ -0,0 +1,425 @@ +{ + "apiVersion": "1.0.0", + "swaggerVersion": "1.2", + "basePath": "http://petstore.swagger.wordnik.com/api", + "resourcePath": "/pet", + "produces": [ + "application/json", + "application/xml", + "text/plain", + "text/html" + ], + "apis": [ + { + "path": "/pet/{petId}", + "operations": [ + { + "method": "GET", + "summary": "Find pet by ID", + "notes": "Returns a pet based on ID", + "type": "Pet", + "nickname": "getPetById", + "authorizations": {}, + "parameters": [ + { + "name": "petId", + "description": "ID of pet that needs to be fetched", + "required": true, + "type": "integer", + "format": "int64", + "paramType": "path", + "minimum": "1.0", + "maximum": "100000.0" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid ID supplied" + }, + { + "code": 404, + "message": "Pet not found" + } + ] + }, + { + "method": "PATCH", + "summary": "partial updates to a pet", + "notes": "", + "type": "array", + "items": { + "$ref": "Pet" + }, + "nickname": "partialUpdate", + "produces": [ + "application/json", + "application/xml" + ], + "consumes": [ + "application/json", + "application/xml" + ], + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "petId", + "description": "ID of pet that needs to be fetched", + "required": true, + "type": "string", + "paramType": "path" + }, + { + "name": "body", + "description": "Pet object that needs to be added to the store", + "required": true, + "type": "Pet", + "paramType": "body" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid tag value" + } + ] + }, + { + "method": "POST", + "summary": "Updates a pet in the store with form data", + "notes": "", + "type": "void", + "nickname": "updatePetWithForm", + "consumes": [ + "application/x-www-form-urlencoded" + ], + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "petId", + "description": "ID of pet that needs to be updated", + "required": true, + "type": "string", + "paramType": "path" + }, + { + "name": "name", + "description": "Updated name of the pet", + "required": false, + "type": "string", + "paramType": "form" + }, + { + "name": "status", + "description": "Updated status of the pet", + "required": false, + "type": "string", + "paramType": "form" + } + ], + "responseMessages": [ + { + "code": 405, + "message": "Invalid input" + } + ] + }, + { + "method": "DELETE", + "summary": "Deletes a pet", + "notes": "", + "type": "void", + "nickname": "deletePet", + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "petId", + "description": "Pet id to delete", + "required": true, + "type": "string", + "paramType": "path" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid pet value" + } + ] + } + ] + }, + { + "path": "/pet", + "operations": [ + { + "method": "PUT", + "summary": "Update an existing pet", + "notes": "", + "type": "void", + "nickname": "updatePet", + "authorizations": {}, + "parameters": [ + { + "name": "body", + "description": "Pet object that needs to be updated in the store", + "required": true, + "type": "Pet", + "paramType": "body" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid ID supplied" + }, + { + "code": 404, + "message": "Pet not found" + }, + { + "code": 405, + "message": "Validation exception" + } + ] + }, + { + "method": "POST", + "summary": "Add a new pet to the store", + "notes": "", + "type": "void", + "nickname": "addPet", + "consumes": [ + "application/json", + "application/xml" + ], + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "body", + "description": "Pet object that needs to be added to the store", + "required": true, + "type": "Pet", + "paramType": "body" + } + ], + "responseMessages": [ + { + "code": 405, + "message": "Invalid input" + } + ] + } + ] + }, + { + "path": "/pet/findByStatus", + "operations": [ + { + "method": "GET", + "summary": "Finds Pets by status", + "notes": "Multiple status values can be provided with comma seperated strings", + "type": "array", + "items": { + "$ref": "Pet" + }, + "nickname": "findPetsByStatus", + "authorizations": {}, + "parameters": [ + { + "name": "status", + "description": "Status values that need to be considered for filter", + "defaultValue": "available", + "required": true, + "type": "string", + "paramType": "query", + "enum": [ + "available", + "pending", + "sold" + ] + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid status value" + } + ] + } + ] + }, + { + "path": "/pet/findByTags", + "operations": [ + { + "method": "GET", + "summary": "Finds Pets by tags", + "notes": "Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing.", + "type": "array", + "items": { + "$ref": "Pet" + }, + "nickname": "findPetsByTags", + "authorizations": {}, + "parameters": [ + { + "name": "tags", + "description": "Tags to filter by", + "required": true, + "type": "string", + "paramType": "query" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid tag value" + } + ], + "deprecated": "true" + } + ] + }, + { + "path": "/pet/uploadImage", + "operations": [ + { + "method": "POST", + "summary": "uploads an image", + "notes": "", + "type": "void", + "nickname": "uploadFile", + "consumes": [ + "multipart/form-data" + ], + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + }, + { + "scope": "test:nothing", + "description": "nothing" + } + ] + }, + "parameters": [ + { + "name": "additionalMetadata", + "description": "Additional data to pass to server", + "required": false, + "type": "string", + "paramType": "form" + }, + { + "name": "file", + "description": "file to upload", + "required": false, + "type": "File", + "paramType": "body" + } + ] + } + ] + } + ], + "models": { + "Tag": { + "id": "Tag", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + } + }, + "Pet": { + "id": "Pet", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64", + "description": "unique identifier for the pet", + "minimum": "0.0", + "maximum": "100.0" + }, + "category": { + "$ref": "Category" + }, + "name": { + "type": "string" + }, + "photoUrls": { + "type": "array", + "items": { + "type": "string" + } + }, + "tags": { + "type": "array", + "items": { + "$ref": "Tag" + } + }, + "status": { + "type": "string", + "description": "pet status in the store", + "enum": [ + "available", + "pending", + "sold" + ] + } + } + }, + "Category": { + "id": "Category", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + } + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/store b/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/store new file mode 100644 index 000000000000..e59994447cda --- /dev/null +++ b/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/store @@ -0,0 +1,145 @@ +{ + "apiVersion": "1.0.0", + "swaggerVersion": "1.2", + "basePath": "http://petstore.swagger.wordnik.com/api", + "resourcePath": "/store", + "produces": [ + "application/json" + ], + "apis": [ + { + "path": "/store/order/{orderId}", + "operations": [ + { + "method": "GET", + "summary": "Find purchase order by ID", + "notes": "For valid response try integer IDs with value <= 5. Anything above 5 or nonintegers will generate API errors", + "type": "Order", + "nickname": "getOrderById", + "authorizations": {}, + "parameters": [ + { + "name": "orderId", + "description": "ID of pet that needs to be fetched", + "required": true, + "type": "string", + "paramType": "path" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid ID supplied" + }, + { + "code": 404, + "message": "Order not found" + } + ] + }, + { + "method": "DELETE", + "summary": "Delete purchase order by ID", + "notes": "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", + "type": "void", + "nickname": "deleteOrder", + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "orderId", + "description": "ID of the order that needs to be deleted", + "required": true, + "type": "string", + "paramType": "path" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid ID supplied" + }, + { + "code": 404, + "message": "Order not found" + } + ] + } + ] + }, + { + "path": "/store/order", + "operations": [ + { + "method": "POST", + "summary": "Place an order for a pet", + "notes": "", + "type": "void", + "nickname": "placeOrder", + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "body", + "description": "order placed for purchasing the pet", + "required": true, + "type": "Order", + "paramType": "body" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid order" + } + ] + } + ] + } + ], + "models": { + "Order": { + "id": "Order", + "description": "an order in the system", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "petId": { + "type": "integer", + "format": "int64" + }, + "quantity": { + "type": "integer", + "format": "int32" + }, + "status": { + "type": "string", + "description": "Order Status", + "enum": [ + "placed", + " approved", + " delivered" + ] + }, + "shipDate": { + "type": "string", + "format": "date-time" + } + } + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/user b/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/user new file mode 100644 index 000000000000..c9eb3f6ff783 --- /dev/null +++ b/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/user @@ -0,0 +1,299 @@ +{ + "apiVersion": "1.0.0", + "swaggerVersion": "1.2", + "basePath": "http://petstore.swagger.wordnik.com/api", + "resourcePath": "/user", + "produces": [ + "application/json" + ], + "apis": [ + { + "path": "/user", + "operations": [ + { + "method": "POST", + "summary": "Create user", + "notes": "This can only be done by the logged in user.", + "type": "void", + "nickname": "createUser", + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "body", + "description": "Created user object", + "required": true, + "type": "User", + "paramType": "body" + } + ] + } + ] + }, + { + "path": "/user/logout", + "operations": [ + { + "method": "GET", + "summary": "Logs out current logged in user session", + "notes": "", + "type": "void", + "nickname": "logoutUser", + "authorizations": {}, + "parameters": [] + } + ] + }, + { + "path": "/user/createWithArray", + "operations": [ + { + "method": "POST", + "summary": "Creates list of users with given input array", + "notes": "", + "type": "void", + "nickname": "createUsersWithArrayInput", + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "body", + "description": "List of user object", + "required": true, + "type": "array", + "items": { + "$ref": "User" + }, + "paramType": "body" + } + ] + } + ] + }, + { + "path": "/user/createWithList", + "operations": [ + { + "method": "POST", + "summary": "Creates list of users with given list input", + "notes": "", + "type": "void", + "nickname": "createUsersWithListInput", + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "body", + "description": "List of user object", + "required": true, + "type": "array", + "items": { + "$ref": "User" + }, + "paramType": "body" + } + ] + } + ] + }, + { + "path": "/user/{username}", + "operations": [ + { + "method": "PUT", + "summary": "Updated user", + "notes": "This can only be done by the logged in user.", + "type": "void", + "nickname": "updateUser", + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "username", + "description": "name that need to be deleted", + "required": true, + "type": "string", + "paramType": "path" + }, + { + "name": "body", + "description": "Updated user object", + "required": true, + "type": "User", + "paramType": "body" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid username supplied" + }, + { + "code": 404, + "message": "User not found" + } + ] + }, + { + "method": "DELETE", + "summary": "Delete user", + "notes": "This can only be done by the logged in user.", + "type": "void", + "nickname": "deleteUser", + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "username", + "description": "The name that needs to be deleted", + "required": true, + "type": "string", + "paramType": "path" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid username supplied" + }, + { + "code": 404, + "message": "User not found" + } + ] + }, + { + "method": "GET", + "summary": "Get user by user name", + "notes": "", + "type": "User", + "nickname": "getUserByName", + "authorizations": {}, + "parameters": [ + { + "name": "username", + "description": "The name that needs to be fetched. Use user1 for testing.", + "required": true, + "type": "string", + "paramType": "path" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid username supplied" + }, + { + "code": 404, + "message": "User not found" + } + ] + } + ] + }, + { + "path": "/user/login", + "operations": [ + { + "method": "GET", + "summary": "Logs user into the system", + "notes": "", + "type": "string", + "nickname": "loginUser", + "authorizations": {}, + "parameters": [ + { + "name": "username", + "description": "The user name for login", + "required": true, + "type": "string", + "paramType": "query" + }, + { + "name": "password", + "description": "The password for login in clear text", + "required": true, + "type": "string", + "paramType": "query" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid username and password combination" + } + ] + } + ] + } + ], + "models": { + "User": { + "id": "User", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "firstName": { + "type": "string" + }, + "username": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "password": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "userStatus": { + "type": "integer", + "format": "int32", + "description": "User Status", + "enum": [ + "1-registered", + "2-active", + "3-closed" + ] + } + } + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/resources/2_0/petstore.json b/modules/swagger-codegen/src/test/resources/2_0/petstore.json new file mode 100644 index 000000000000..daa8ef91b156 --- /dev/null +++ b/modules/swagger-codegen/src/test/resources/2_0/petstore.json @@ -0,0 +1,951 @@ +{ + "swagger": "2.0", + "info": { + "description": "This is a sample server Petstore server. You can find out more about Swagger at http://swagger.wordnik.com or on irc.freenode.net, #swagger. For this sample, you can use the api key \"special-key\" to test the authorization filters", + "version": "1.0.0", + "title": "Swagger Petstore", + "termsOfService": "http://helloreverb.com/terms/", + "contact": { + "name": "apiteam@wordnik.com" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "host": "petstore.swagger.wordnik.com", + "basePath": "/v2", + "schemes": [ + "http" + ], + "paths": { + "/pet": { + "post": { + "tags": [ + "pet" + ], + "summary": "Add a new pet to the store", + "description": "", + "operationId": "addPet", + "consumes": [ + "application/json", + "application/xml" + ], + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "pet", + "description": "Pet object that needs to be added to the store", + "required": false, + "schema": { + "$ref": "#/definitions/Pet" + } + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "put": { + "tags": [ + "pet" + ], + "summary": "Update an existing pet", + "description": "", + "operationId": "updatePet", + "consumes": [ + "application/json", + "application/xml" + ], + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Pet object that needs to be added to the store", + "required": false, + "schema": { + "$ref": "#/definitions/Pet" + } + } + ], + "responses": { + "405": { + "description": "Validation exception" + }, + "404": { + "description": "Pet not found" + }, + "400": { + "description": "Invalid ID supplied" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/findByStatus": { + "get": { + "tags": [ + "pet" + ], + "summary": "Finds Pets by status", + "description": "Multiple status values can be provided with comma seperated strings", + "operationId": "findPetsByStatus", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "query", + "name": "status", + "description": "Status values that need to be considered for filter", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Pet" + } + } + }, + "400": { + "description": "Invalid status value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/findByTags": { + "get": { + "tags": [ + "pet" + ], + "summary": "Finds Pets by tags", + "description": "Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing.", + "operationId": "findPetsByTags", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "query", + "name": "tags", + "description": "Tags to filter by", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Pet" + } + } + }, + "400": { + "description": "Invalid tag value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/{petId}/upload": { + "post": { + "tags": [ "pet" ], + "summary": "Upload an image for a pet", + "operationId": "uploadImage", + "consumes": [ + "multipart/form-data" + ], + "parameters": [ + { + "in": "formData", + "name": "petImage", + "description": "image to upload", + "type": "file" + } + ], + "responses": { + "default": { + "description": "it worked" + } + } + } + }, + "/pet/{petId}": { + "get": { + "tags": [ + "pet" + ], + "summary": "Find pet by ID", + "description": "Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions", + "operationId": "getPetById", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "path", + "name": "petId", + "description": "ID of pet that needs to be fetched", + "required": true, + "type": "integer", + "format": "int64" + } + ], + "responses": { + "404": { + "description": "Pet not found" + }, + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Pet" + } + }, + "400": { + "description": "Invalid ID supplied" + } + }, + "security": [ + { + "api_key": [] + }, + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "post": { + "tags": [ + "pet" + ], + "summary": "Updates a pet in the store with form data", + "description": "", + "operationId": "updatePetWithForm", + "consumes": [ + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "path", + "name": "petId", + "description": "ID of pet that needs to be updated", + "required": true, + "type": "string" + }, + { + "in": "formData", + "name": "name", + "description": "Updated name of the pet", + "required": true, + "type": "string" + }, + { + "in": "formData", + "name": "status", + "description": "Updated status of the pet", + "required": true, + "type": "string" + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "delete": { + "tags": [ + "pet" + ], + "summary": "Deletes a pet", + "description": "", + "operationId": "deletePet", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "header", + "name": "api_key", + "description": "", + "required": true, + "type": "string" + }, + { + "in": "path", + "name": "petId", + "description": "Pet id to delete", + "required": true, + "type": "integer", + "format": "int64" + } + ], + "responses": { + "400": { + "description": "Invalid pet value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/store/order": { + "post": { + "tags": [ + "store" + ], + "summary": "Place an order for a pet", + "description": "", + "operationId": "placeOrder", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "order placed for purchasing the pet", + "required": false, + "schema": { + "$ref": "#/definitions/Order" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Order" + } + }, + "400": { + "description": "Invalid Order" + } + } + } + }, + "/store/order/{orderId}": { + "get": { + "tags": [ + "store" + ], + "summary": "Find purchase order by ID", + "description": "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", + "operationId": "getOrderById", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "path", + "name": "orderId", + "description": "ID of pet that needs to be fetched", + "required": true, + "type": "string" + } + ], + "responses": { + "404": { + "description": "Order not found" + }, + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Order" + } + }, + "400": { + "description": "Invalid ID supplied" + } + } + }, + "delete": { + "tags": [ + "store" + ], + "summary": "Delete purchase order by ID", + "description": "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", + "operationId": "deleteOrder", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "path", + "name": "orderId", + "description": "ID of the order that needs to be deleted", + "required": true, + "type": "string" + } + ], + "responses": { + "404": { + "description": "Order not found" + }, + "400": { + "description": "Invalid ID supplied" + } + } + } + }, + "/user": { + "post": { + "tags": [ + "user" + ], + "summary": "Create user", + "description": "This can only be done by the logged in user.", + "operationId": "createUser", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Created user object", + "required": false, + "schema": { + "$ref": "#/definitions/User" + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/createWithArray": { + "post": { + "tags": [ + "user" + ], + "summary": "Creates list of users with given input array", + "description": "", + "operationId": "createUsersWithArrayInput", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "List of user object", + "required": false, + "schema": { + "type": "array", + "items": { + "$ref": "User" + } + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/createWithList": { + "post": { + "tags": [ + "user" + ], + "summary": "Creates list of users with given input array", + "description": "", + "operationId": "createUsersWithListInput", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "List of user object", + "required": false, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + } + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/login": { + "get": { + "tags": [ + "user" + ], + "summary": "Logs user into the system", + "description": "", + "operationId": "loginUser", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "query", + "name": "username", + "description": "The user name for login", + "required": false, + "type": "string" + }, + { + "in": "query", + "name": "password", + "description": "The password for login in clear text", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Invalid username/password supplied" + } + } + } + }, + "/user/logout": { + "get": { + "tags": [ + "user" + ], + "summary": "Logs out current logged in user session", + "description": "", + "operationId": "logoutUser", + "produces": [ + "application/json", + "application/xml" + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/{username}": { + "get": { + "tags": [ + "user" + ], + "summary": "Get user by user name", + "description": "", + "operationId": "getUserByName", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "path", + "name": "username", + "description": "The name that needs to be fetched. Use user1 for testing. ", + "required": true, + "type": "string" + } + ], + "responses": { + "404": { + "description": "User not found" + }, + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/User" + } + }, + "400": { + "description": "Invalid username supplied" + } + } + }, + "put": { + "tags": [ + "user" + ], + "summary": "Updated user", + "description": "This can only be done by the logged in user.", + "operationId": "updateUser", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "path", + "name": "username", + "description": "name that need to be deleted", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "Updated user object", + "required": false, + "schema": { + "$ref": "#/definitions/User" + } + } + ], + "responses": { + "404": { + "description": "User not found" + }, + "400": { + "description": "Invalid user supplied" + } + } + }, + "delete": { + "tags": [ + "user" + ], + "summary": "Delete user", + "description": "This can only be done by the logged in user.", + "operationId": "deleteUser", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "path", + "name": "username", + "description": "The name that needs to be deleted", + "required": true, + "type": "string" + } + ], + "responses": { + "404": { + "description": "User not found" + }, + "400": { + "description": "Invalid username supplied" + } + } + } + } + }, + "securityDefinitions": { + "api_key": { + "type": "apiKey", + "name": "api_key", + "in": "header" + }, + "petstore_auth": { + "type": "oauth2", + "authorizationUrl": "http://petstore.swagger.wordnik.com/api/oauth/dialog", + "flow": "implicit" + } + }, + "definitions": { + "User": { + "properties": { + "id": { + "type": "integer", + "format": "int64", + "xml": { + "name": "id" + } + }, + "username": { + "type": "string", + "xml": { + "name": "username" + } + }, + "firstName": { + "type": "string", + "xml": { + "name": "firstName" + } + }, + "lastName": { + "type": "string", + "xml": { + "name": "lastName" + } + }, + "email": { + "type": "string", + "xml": { + "name": "email" + } + }, + "password": { + "type": "string", + "xml": { + "name": "password" + } + }, + "phone": { + "type": "string", + "xml": { + "name": "phone" + } + }, + "userStatus": { + "type": "integer", + "format": "int32", + "xml": { + "name": "userStatus" + }, + "description": "User Status" + } + }, + "xml": { + "name": "User" + } + }, + "Category": { + "properties": { + "id": { + "type": "integer", + "format": "int64", + "xml": { + "name": "id" + } + }, + "name": { + "type": "string", + "xml": { + "name": "name" + } + } + }, + "xml": { + "name": "Category" + } + }, + "Pet": { + "required": [ + "name", + "photoUrls" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64", + "xml": { + "name": "id" + } + }, + "category": { + "xml": { + "name": "category" + }, + "$ref": "Category" + }, + "name": { + "type": "string", + "example": "doggie", + "xml": { + "name": "name" + } + }, + "photoUrls": { + "type": "array", + "xml": { + "name": "photoUrl", + "wrapped": true + }, + "items": { + "type": "string" + } + }, + "tags": { + "type": "array", + "xml": { + "name": "tag", + "wrapped": true + }, + "items": { + "$ref": "Tag" + } + }, + "status": { + "type": "string", + "xml": { + "name": "status" + }, + "description": "pet status in the store" + } + }, + "xml": { + "name": "Pet" + } + }, + "Tag": { + "properties": { + "id": { + "type": "integer", + "format": "int64", + "xml": { + "name": "id" + } + }, + "name": { + "type": "string", + "xml": { + "name": "name" + } + } + }, + "xml": { + "name": "Tag" + } + }, + "Order": { + "properties": { + "id": { + "type": "integer", + "format": "int64", + "xml": { + "name": "id" + } + }, + "petId": { + "type": "integer", + "format": "int64", + "xml": { + "name": "petId" + } + }, + "quantity": { + "type": "integer", + "format": "int32", + "xml": { + "name": "quantity" + } + }, + "shipDate": { + "type": "string", + "format": "date-time", + "xml": { + "name": "shipDate" + } + }, + "status": { + "type": "string", + "xml": { + "name": "status" + }, + "description": "Order Status" + }, + "complete": { + "type": "boolean" + } + }, + "xml": { + "name": "Order" + } + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/resources/2_0/postBodyTest.json b/modules/swagger-codegen/src/test/resources/2_0/postBodyTest.json new file mode 100644 index 000000000000..ed13a5820ebe --- /dev/null +++ b/modules/swagger-codegen/src/test/resources/2_0/postBodyTest.json @@ -0,0 +1,102 @@ +{ + "swagger": "2.0", + "info": { + "description": "This is a sample server Petstore server. You can find out more about Swagger at http://swagger.wordnik.com or on irc.freenode.net, #swagger. For this sample, you can use the api key \"special-key\" to test the authorization filters", + "version": "1.0.0", + "title": "Swagger Petstore", + "termsOfService": "http://helloreverb.com/terms/", + "contact": { + "name": "apiteam@wordnik.com" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "host": "petstore.swagger.wordnik.com", + "basePath": "/v2", + "schemes": [ + "http" + ], + "paths": { + "/animals": { + "post": { + "tags": [ + "pet" + ], + "summary": "Add a new animal to the store", + "description": "", + "consumes": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "pet", + "description": "Animals", + "required": false, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Animal" + } + } + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + } + } + }, + "/insects": { + "post": { + "tags": [ + "pet" + ], + "summary": "Add a new insect to the store", + "description": "", + "consumes": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "pet", + "description": "Insects", + "required": false, + "schema": { + "$ref": "#/definitions/Insect" + } + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + } + } + } + }, + "definitions": { + "Animal": { + "properties": { + "id": { + "type": "integer", + "format": "int64" + } + } + }, + "Insect": { + "properties": { + "id": { + "type": "integer", + "format": "int64" + } + } + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/scala/CodegenTest.scala b/modules/swagger-codegen/src/test/scala/CodegenTest.scala new file mode 100644 index 000000000000..ecd586a6a897 --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/CodegenTest.scala @@ -0,0 +1,98 @@ +import com.wordnik.swagger.models._ +import com.wordnik.swagger.util.Json +import io.swagger.parser._ + +import com.wordnik.swagger.codegen.DefaultCodegen + +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import org.scalatest.FlatSpec +import org.scalatest.Matchers + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class CodegenTest extends FlatSpec with Matchers { + behavior of "Codegen" + + it should "read a file upload param from a 2.0 spec" in { + val model = new SwaggerParser() + .read("src/test/resources/2_0/petstore.json") + + val codegen = new DefaultCodegen() + val path = "/pet/{petId}/upload" + val p = model.getPaths().get(path).getPost() + val op = codegen.fromOperation(path, "post", p) + + op.operationId should be ("uploadImage") + op.httpMethod should be ("POST") + op.hasConsumes should equal (true) + op.consumes.size should be(1) + op.consumes.get(0).get("mediaType") should be ("multipart/form-data") + + op.hasProduces should be (null) + + val allParams = op.allParams + allParams.size should be (1) + + val formParams = op.formParams + formParams.size should be (1) + + val file = formParams.get(0) + file.isFormParam should equal (true) + file.dataType should be ("file") + file.required should equal (false) + file.isFile should equal (true) + file.hasMore should be (null) + } + + it should "read formParam values from a 2.0 spec" in { + val model = new SwaggerParser() + .read("src/test/resources/2_0/petstore.json") + + val codegen = new DefaultCodegen() + val path = "/pet/{petId}" + val p = model.getPaths().get(path).getPost() + val op = codegen.fromOperation(path, "post", p) + + op.operationId should be ("updatePetWithForm") + op.httpMethod should be ("POST") + op.hasConsumes should equal (true) + op.consumes.size should be(1) + op.consumes.get(0).get("mediaType") should be ("application/x-www-form-urlencoded") + + op.hasProduces should equal (true) + op.produces.size should be(2) + op.produces.get(0).get("mediaType") should be ("application/json") + op.produces.get(0).get("hasMore") should be ("true") + op.produces.get(1).get("mediaType") should be ("application/xml") + + val pathParams = op.pathParams + pathParams.size should be (1) + + val idParam = pathParams.get(0) + idParam.isPathParam should equal (true) + idParam.dataType should be ("String") + idParam.required should equal (true) + idParam.hasMore should be (null) + + val allParams = op.allParams + allParams.size should be (3) + + val formParams = op.formParams + formParams.size should be (2) + val nameParam = formParams.get(0) + nameParam.isFormParam should equal (true) + nameParam.notFile should equal (true) + nameParam.dataType should be ("String") + nameParam.required should equal (true) + nameParam.hasMore should equal (true) + + val statusParam = formParams.get(1) + statusParam.isFormParam should equal (true) + statusParam.notFile should equal (true) + statusParam.dataType should be ("String") + statusParam.required should equal (true) + statusParam.hasMore should be (null) + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/scala/Java/JavaModelEnumTest.scala b/modules/swagger-codegen/src/test/scala/Java/JavaModelEnumTest.scala new file mode 100644 index 000000000000..25232b699075 --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/Java/JavaModelEnumTest.scala @@ -0,0 +1,33 @@ +package Java + +import com.wordnik.swagger.codegen.languages.JavaClientCodegen +import com.wordnik.swagger.models._ +import com.wordnik.swagger.models.properties._ +import org.junit.runner.RunWith +import org.scalatest.{FlatSpec, Matchers} +import org.scalatest.junit.JUnitRunner + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class JavaModelEnumTest extends FlatSpec with Matchers { + + it should "convert a java model with an enum" in { + val enumProperty = new StringProperty() + enumProperty.setEnum(List("VALUE1", "VALUE2", "VALUE3").asJava) + val model = new ModelImpl() + .property("name", enumProperty) + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.vars.size should be(1) + val enumVar = cm.vars.get(0) + enumVar.baseName should be("name") + enumVar.datatype should be("NameEnum") + enumVar.name should be("name") + enumVar.defaultValue should be("null") + enumVar.baseType should be("String") + enumVar.isEnum should equal(true) + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/scala/Java/JavaModelTest.scala b/modules/swagger-codegen/src/test/scala/Java/JavaModelTest.scala new file mode 100644 index 000000000000..513786e4609b --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/Java/JavaModelTest.scala @@ -0,0 +1,268 @@ +package Java + +import com.wordnik.swagger.codegen.languages.JavaClientCodegen +import com.wordnik.swagger.util.Json +import com.wordnik.swagger.models._ +import com.wordnik.swagger.models.properties._ + +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import org.scalatest.FlatSpec +import org.scalatest.Matchers + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class JavaModelTest extends FlatSpec with Matchers { + + it should "convert a simple java model" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("name", new StringProperty()) + .property("createdAt", new DateTimeProperty()) + .required("id") + .required("name") + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (3) + + val vars = cm.vars + vars.get(0).baseName should be ("id") + vars.get(0).getter should be ("getId") + vars.get(0).setter should be ("setId") + vars.get(0).datatype should be ("Long") + vars.get(0).name should be ("id") + vars.get(0).defaultValue should be ("null") + vars.get(0).baseType should be ("Long") + vars.get(0).hasMore should equal (true) + vars.get(0).required should equal (true) + vars.get(0).isNotContainer should equal (true) + + vars.get(1).baseName should be ("name") + vars.get(1).getter should be ("getName") + vars.get(1).setter should be ("setName") + vars.get(1).datatype should be ("String") + vars.get(1).name should be ("name") + vars.get(1).defaultValue should be ("null") + vars.get(1).baseType should be ("String") + vars.get(1).hasMore should equal (true) + vars.get(1).required should equal (true) + vars.get(1).isNotContainer should equal (true) + + vars.get(2).baseName should be ("createdAt") + vars.get(2).getter should be ("getCreatedAt") + vars.get(2).setter should be ("setCreatedAt") + vars.get(2).datatype should be ("Date") + vars.get(2).name should be ("createdAt") + vars.get(2).defaultValue should be ("null") + vars.get(2).baseType should be ("Date") + vars.get(2).hasMore should equal (null) + vars.get(2).required should equal (false) + vars.get(2).isNotContainer should equal (true) + } + + it should "convert a model with list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("urls", new ArrayProperty() + .items(new StringProperty())) + .required("id") + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (2) + + val vars = cm.vars + vars.get(1).baseName should be ("urls") + vars.get(1).getter should be ("getUrls") + vars.get(1).setter should be ("setUrls") + vars.get(1).datatype should be ("List") + vars.get(1).name should be ("urls") + vars.get(1).defaultValue should be ("new ArrayList() ") + vars.get(1).baseType should be ("List") + vars.get(1).containerType should be ("array") + vars.get(1).required should equal (false) + vars.get(1).isContainer should equal (true) + } + + it should "convert a model with a map property" in { + val model = new ModelImpl() + .description("a sample model") + .property("translations", new MapProperty() + .additionalProperties(new StringProperty())) + .required("id") + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("translations") + vars.get(0).getter should be ("getTranslations") + vars.get(0).setter should be ("setTranslations") + vars.get(0).datatype should be ("Map") + vars.get(0).name should be ("translations") + vars.get(0).defaultValue should be ("new HashMap() ") + vars.get(0).baseType should be ("Map") + vars.get(0).containerType should be ("map") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + } + + it should "convert a model with complex properties" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new RefProperty("#/definitions/Children")) + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).getter should be ("getChildren") + vars.get(0).setter should be ("setChildren") + vars.get(0).datatype should be ("Children") + vars.get(0).name should be ("children") + vars.get(0).defaultValue should be ("null") + vars.get(0).baseType should be ("Children") + vars.get(0).required should equal (false) + vars.get(0).isNotContainer should equal (true) + } + + it should "convert a model with complex list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new ArrayProperty() + .items(new RefProperty("#/definitions/Children"))) + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).complexType should be ("Children") + vars.get(0).getter should be ("getChildren") + vars.get(0).setter should be ("setChildren") + vars.get(0).datatype should be ("List") + vars.get(0).name should be ("children") + vars.get(0).defaultValue should be ("new ArrayList() ") + vars.get(0).baseType should be ("List") + vars.get(0).containerType should be ("array") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + } + + it should "convert a model with complex map property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new MapProperty() + .additionalProperties(new RefProperty("#/definitions/Children"))) + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + (cm.imports.asScala.toSet & Set("Map", "List", "Children")).size should be (3) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).complexType should be ("Children") + vars.get(0).getter should be ("getChildren") + vars.get(0).setter should be ("setChildren") + vars.get(0).datatype should be ("Map") + vars.get(0).name should be ("children") + vars.get(0).defaultValue should be ("new HashMap() ") + vars.get(0).baseType should be ("Map") + vars.get(0).containerType should be ("map") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + vars.get(0).isNotContainer should be (null) + } + + it should "convert an array model" in { + val model = new ArrayModel() + .description("an array model") + .items(new RefProperty("#/definitions/Children")) + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("an array model") + cm.vars.size should be (0) + cm.parent should be ("ArrayList") + cm.imports.size should be (3) + (cm.imports.asScala.toSet & Set("List", "ArrayList", "Children")).size should be (3) + } + + it should "convert an map model" in { + val model = new ModelImpl() + .description("an map model") + .additionalProperties(new RefProperty("#/definitions/Children")) + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("an map model") + cm.vars.size should be (0) + cm.parent should be ("HashMap") + cm.imports.size should be (3) + (cm.imports.asScala.toSet & Set("Map", "HashMap", "Children")).size should be (3) + } + + it should "convert a model with upper-case property names" in { + val model = new ModelImpl() + .description("a model with upper-case property names") + .property("NAME", new StringProperty()) + .required("NAME") + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("NAME") + vars.get(0).getter should be ("getNAME") + vars.get(0).setter should be ("setNAME") + vars.get(0).datatype should be ("String") + vars.get(0).name should be ("NAME") + vars.get(0).defaultValue should be ("null") + vars.get(0).baseType should be ("String") + vars.get(0).hasMore should equal (null) + vars.get(0).required should equal (true) + vars.get(0).isNotContainer should equal (true) + } +} diff --git a/modules/swagger-codegen/src/test/scala/Objc/ObjcModelTest.scala b/modules/swagger-codegen/src/test/scala/Objc/ObjcModelTest.scala new file mode 100644 index 000000000000..2c8db5a12235 --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/Objc/ObjcModelTest.scala @@ -0,0 +1,260 @@ +package objc + +import com.wordnik.swagger.codegen.languages.ObjcClientCodegen +import com.wordnik.swagger.util.{ Json, SwaggerLoader } +import com.wordnik.swagger.models._ +import com.wordnik.swagger.models.properties._ + +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import org.scalatest.FlatSpec +import org.scalatest.Matchers + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class ObjcModelTest extends FlatSpec with Matchers { + + it should "convert a simple java model" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("name", new StringProperty()) + .property("createdAt", new DateTimeProperty()) + .required("id") + .required("name") + + val codegen = new ObjcClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("SWGSample") + cm.description should be ("a sample model") + cm.vars.size should be (3) + + val vars = cm.vars + vars.get(0).baseName should be ("id") + vars.get(0).datatype should be ("NSNumber*") + vars.get(0).name should be ("_id") + vars.get(0).defaultValue should be (null) + vars.get(0).baseType should be ("NSNumber") + vars.get(0).hasMore should equal (true) + vars.get(0).required should equal (true) + vars.get(0).isPrimitiveType should equal (true) + vars.get(0).isNotContainer should equal (true) + + vars.get(1).baseName should be ("name") + vars.get(1).datatype should be ("NSString*") + vars.get(1).name should be ("name") + vars.get(1).defaultValue should be (null) + vars.get(1).baseType should be ("NSString") + vars.get(1).hasMore should equal (true) + vars.get(1).required should equal (true) + vars.get(0).isPrimitiveType should equal (true) + vars.get(1).isNotContainer should equal (true) + + vars.get(2).baseName should be ("createdAt") + vars.get(2).complexType should be ("SWGDate") + vars.get(2).datatype should be ("SWGDate*") + vars.get(2).name should be ("createdAt") + vars.get(2).defaultValue should be (null) + vars.get(2).baseType should be ("SWGDate") + vars.get(2).hasMore should equal (null) + vars.get(2).required should equal (false) + vars.get(2).isNotContainer should equal (true) + + (cm.imports.asScala.toSet & + Set("SWGDate")).size should be (1) + } + + it should "convert a model with list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("urls", new ArrayProperty() + .items(new StringProperty())) + .required("id") + + val codegen = new ObjcClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("SWGSample") + cm.description should be ("a sample model") + cm.vars.size should be (2) + + val vars = cm.vars + vars.get(0).baseName should be ("id") + vars.get(0).datatype should be ("NSNumber*") + vars.get(0).name should be ("_id") + vars.get(0).defaultValue should be (null) + vars.get(0).baseType should be ("NSNumber") + vars.get(0).hasMore should equal (true) + vars.get(0).required should equal (true) + vars.get(0).isPrimitiveType should equal (true) + vars.get(0).isNotContainer should equal (true) + + vars.get(1).baseName should be ("urls") + vars.get(1).datatype should be ("NSArray*") + vars.get(1).name should be ("urls") + // vars.get(1).defaultValue should be ("null") + vars.get(1).baseType should be ("NSArray") + vars.get(1).hasMore should be (null) + vars.get(1).containerType should equal ("array") + vars.get(1).required should equal (false) + vars.get(1).isPrimitiveType should equal (true) + vars.get(1).isContainer should equal (true) + } + + it should "convert a model with a map property" in { + val model = new ModelImpl() + .description("a sample model") + .property("translations", new MapProperty() + .additionalProperties(new StringProperty())) + .required("id") + + val codegen = new ObjcClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("SWGSample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("translations") + vars.get(0).datatype should be ("NSDictionary*") + vars.get(0).name should be ("translations") + vars.get(0).baseType should be ("NSDictionary") + vars.get(0).containerType should be ("map") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + vars.get(0).isPrimitiveType should equal (true) + } + + it should "convert a model with complex property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new RefProperty("#/definitions/Children")) + + val codegen = new ObjcClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("SWGSample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).datatype should be ("SWGChildren*") + vars.get(0).name should be ("children") + vars.get(0).baseType should be ("SWGChildren") + vars.get(0).required should equal (false) + vars.get(0).isNotContainer should equal (true) + } + + it should "convert a model with complex list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new ArrayProperty() + .items(new RefProperty("#/definitions/Children"))) + + val codegen = new ObjcClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("SWGSample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).complexType should be ("SWGChildren") + vars.get(0).datatype should be ("NSArray*") + vars.get(0).name should be ("children") + vars.get(0).baseType should be ("NSArray") + vars.get(0).containerType should be ("array") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + } + + it should "convert a model with complex map property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new MapProperty() + .additionalProperties(new RefProperty("#/definitions/Children"))) + + val codegen = new ObjcClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("SWGSample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + (cm.imports.asScala.toSet & Set("SWGChildren")).size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).complexType should be ("SWGChildren") + vars.get(0).datatype should be ("NSDictionary*") + vars.get(0).name should be ("children") + vars.get(0).baseType should be ("NSDictionary") + vars.get(0).containerType should be ("map") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + vars.get(0).isNotContainer should be (null) + } + + it should "convert an array model" in { + val model = new ArrayModel() + .description("an array model") + .items(new RefProperty("#/definitions/Children")) + val codegen = new ObjcClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("SWGSample") + cm.description should be ("an array model") + cm.vars.size should be (0) + cm.parent should be ("NSMutableArray") + cm.imports.size should be (3) + (cm.imports.asScala.toSet & Set("SWGChildren", "NSArray", "NSMutableArray")).size should be (3) + } + + it should "convert an map model" in { + val model = new ModelImpl() + .description("an map model") + .additionalProperties(new RefProperty("#/definitions/Children")) + + val codegen = new ObjcClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("SWGSample") + cm.description should be ("an map model") + cm.vars.size should be (0) + cm.parent should be ("NSMutableDictionary") + cm.imports.size should be (3) + (cm.imports.asScala.toSet & Set("SWGChildren", "NSDictionary", "NSMutableDictionary")).size should be (3) + } + + it should "create proper imports per #316" in { + val model = new SwaggerLoader().read("src/test/resources/2_0/postBodyTest.json") + val codegen = new ObjcClientCodegen() + + val animalPaths = model.getPaths() + val animalOps = animalPaths.get("/animals") + animalOps.getPost() should not be (null) + val animalCo = codegen.fromOperation("/animals", "POST", animalOps.getPost()) + animalCo.imports.size should be (1) + animalCo.imports.contains("SWGAnimal") should equal (true) + + val insectPaths = model.getPaths() + val insectOps = insectPaths.get("/insects") + insectOps.getPost() should not be (null) + val insectCo = codegen.fromOperation("/insects", "POST", insectOps.getPost()) + insectCo.imports.size should be (1) + insectCo.imports.contains("SWGInsect") should equal (true) + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/scala/SwaggerMigratorTest.scala b/modules/swagger-codegen/src/test/scala/SwaggerMigratorTest.scala new file mode 100644 index 000000000000..8051e84e660a --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/SwaggerMigratorTest.scala @@ -0,0 +1,19 @@ +import com.wordnik.swagger.models._ +import io.swagger.parser._ + +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import org.scalatest.FlatSpec +import org.scalatest.Matchers + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class SwaggerMigratorTest extends FlatSpec with Matchers { + behavior of "SwaggerMigrator" + + it should "read a 1.2 spec" in { + val loader = new SwaggerParser() + loader.read("src/test/resources/1_2/petstore-1.2/api-docs") + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/scala/php/PhpModelTest.scala b/modules/swagger-codegen/src/test/scala/php/PhpModelTest.scala new file mode 100644 index 000000000000..5e5034e5efc4 --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/php/PhpModelTest.scala @@ -0,0 +1,259 @@ +package php + +import com.wordnik.swagger.codegen.languages.PhpClientCodegen +import com.wordnik.swagger.util.Json +import com.wordnik.swagger.models._ +import com.wordnik.swagger.models.properties._ + +import io.swagger.parser.SwaggerParser + +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import org.scalatest.FlatSpec +import org.scalatest.Matchers + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class PhpModelTest extends FlatSpec with Matchers { + + it should "convert a simple php model" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("name", new StringProperty()) + .property("createdAt", new DateTimeProperty()) + .required("id") + .required("name") + + val codegen = new PhpClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (3) + + val vars = cm.vars + vars.get(0).baseName should be ("id") + vars.get(0).datatype should be ("int") + vars.get(0).name should be ("id") + vars.get(0).defaultValue should be ("null") + vars.get(0).baseType should be ("int") + vars.get(0).hasMore should equal (true) + vars.get(0).required should equal (true) + vars.get(0).isPrimitiveType should equal (true) + vars.get(0).isNotContainer should equal (true) + + vars.get(1).baseName should be ("name") + vars.get(1).datatype should be ("string") + vars.get(1).name should be ("name") + vars.get(1).defaultValue should be ("null") + vars.get(1).baseType should be ("string") + vars.get(1).hasMore should equal (true) + vars.get(1).required should equal (true) + vars.get(0).isPrimitiveType should equal (true) + vars.get(1).isNotContainer should equal (true) + + vars.get(2).baseName should be ("createdAt") + vars.get(2).complexType should be (null) + vars.get(2).datatype should be ("DateTime") + vars.get(2).name should be ("createdAt") + vars.get(2).defaultValue should be ("null") + vars.get(2).baseType should be ("DateTime") + vars.get(2).hasMore should equal (null) + vars.get(2).required should equal (false) + vars.get(2).isNotContainer should equal (true) + + cm.imports.size() should be (0) + } + + it should "convert a model with list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("urls", new ArrayProperty() + .items(new StringProperty())) + .required("id") + + val codegen = new PhpClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (2) + + val vars = cm.vars + vars.get(0).baseName should be ("id") + vars.get(0).datatype should be ("int") + vars.get(0).name should be ("id") + vars.get(0).defaultValue should be ("null") + vars.get(0).baseType should be ("int") + vars.get(0).hasMore should equal (true) + vars.get(0).required should equal (true) + vars.get(0).isPrimitiveType should equal (true) + vars.get(0).isNotContainer should equal (true) + + vars.get(1).baseName should be ("urls") + vars.get(1).datatype should be ("array[string]") + vars.get(1).name should be ("urls") + vars.get(1).baseType should be ("array") + vars.get(1).hasMore should be (null) + vars.get(1).containerType should equal ("array") + vars.get(1).required should equal (false) + vars.get(1).isPrimitiveType should equal (true) + vars.get(1).isContainer should equal (true) + } + + it should "convert a model with a map property" in { + val model = new ModelImpl() + .description("a sample model") + .property("translations", new MapProperty() + .additionalProperties(new StringProperty())) + .required("id") + + val codegen = new PhpClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("translations") + vars.get(0).datatype should be ("map[string,string]") + vars.get(0).name should be ("translations") + vars.get(0).baseType should be ("map") + vars.get(0).containerType should be ("map") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + vars.get(0).isPrimitiveType should equal (true) + } + + it should "convert a model with complex property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new RefProperty("#/definitions/Children")) + + val codegen = new PhpClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).datatype should be ("Children") + vars.get(0).name should be ("children") + vars.get(0).baseType should be ("Children") + vars.get(0).required should equal (false) + vars.get(0).isNotContainer should equal (true) + } + + it should "convert a model with complex list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new ArrayProperty() + .items(new RefProperty("#/definitions/Children"))) + + val codegen = new PhpClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).complexType should be ("Children") + vars.get(0).datatype should be ("array[Children]") + vars.get(0).name should be ("children") + vars.get(0).baseType should be ("array") + vars.get(0).containerType should be ("array") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + } + + it should "convert a model with complex map property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new MapProperty() + .additionalProperties(new RefProperty("#/definitions/Children"))) + + val codegen = new PhpClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + (cm.imports.asScala.toSet & Set("Children")).size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).complexType should be ("Children") + vars.get(0).datatype should be ("map[string,Children]") + vars.get(0).name should be ("children") + vars.get(0).baseType should be ("map") + vars.get(0).containerType should be ("map") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + vars.get(0).isNotContainer should be (null) + } + + it should "convert an array model" in { + val model = new ArrayModel() + .description("an array model") + .items(new RefProperty("#/definitions/Children")) + val codegen = new PhpClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("an array model") + cm.vars.size should be (0) + cm.imports.size should be (1) + (cm.imports.asScala.toSet & Set("Children")).size should be (1) + } + + it should "convert an map model" in { + val model = new ModelImpl() + .description("an map model") + .additionalProperties(new RefProperty("#/definitions/Children")) + + val codegen = new PhpClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("an map model") + cm.vars.size should be (0) + cm.imports.size should be (2) + (cm.imports.asScala.toSet & Set("Children")).size should be (1) + } + + it should "create proper imports per #316" in { + val model = new SwaggerParser() + .read("src/test/resources/2_0/postBodyTest.json") + val codegen = new PhpClientCodegen() + + val animalPaths = model.getPaths() + val animalOps = animalPaths.get("/animals") + animalOps.getPost() should not be (null) + val animalCo = codegen.fromOperation("/animals", "POST", animalOps.getPost()) + animalCo.imports.size should be (1) + animalCo.imports.contains("Animal") should equal (true) + + val insectPaths = model.getPaths() + val insectOps = insectPaths.get("/insects") + insectOps.getPost() should not be (null) + val insectCo = codegen.fromOperation("/insects", "POST", insectOps.getPost()) + insectCo.imports.size should be (1) + insectCo.imports.contains("Insect") should equal (true) + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/scala/scala/ScalaModelTest.scala b/modules/swagger-codegen/src/test/scala/scala/ScalaModelTest.scala new file mode 100644 index 000000000000..0c71983b1d5b --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/scala/ScalaModelTest.scala @@ -0,0 +1,241 @@ +package Java + +import com.wordnik.swagger.codegen.languages.ScalaClientCodegen +import com.wordnik.swagger.util.Json +import com.wordnik.swagger.models._ +import com.wordnik.swagger.models.properties._ + +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import org.scalatest.FlatSpec +import org.scalatest.Matchers + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class ScalaModelTest extends FlatSpec with Matchers { + + it should "convert a simple scala model" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("name", new StringProperty()) + .property("createdAt", new DateTimeProperty()) + .required("id") + .required("name") + + val codegen = new ScalaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (3) + + val vars = cm.vars + vars.get(0).baseName should be ("id") + vars.get(0).getter should be ("getId") + vars.get(0).setter should be ("setId") + vars.get(0).datatype should be ("Long") + vars.get(0).name should be ("id") + vars.get(0).defaultValue should be ("null") + vars.get(0).baseType should be ("Long") + vars.get(0).hasMore should equal (true) + vars.get(0).required should equal (true) + vars.get(0).isNotContainer should equal (true) + + vars.get(1).baseName should be ("name") + vars.get(1).getter should be ("getName") + vars.get(1).setter should be ("setName") + vars.get(1).datatype should be ("String") + vars.get(1).name should be ("name") + vars.get(1).defaultValue should be ("null") + vars.get(1).baseType should be ("String") + vars.get(1).hasMore should equal (true) + vars.get(1).required should equal (true) + vars.get(1).isNotContainer should equal (true) + + vars.get(2).baseName should be ("createdAt") + vars.get(2).getter should be ("getCreatedAt") + vars.get(2).setter should be ("setCreatedAt") + vars.get(2).datatype should be ("DateTime") + vars.get(2).name should be ("createdAt") + vars.get(2).defaultValue should be ("null") + vars.get(2).baseType should be ("DateTime") + vars.get(2).hasMore should equal (null) + vars.get(2).required should equal (false) + vars.get(2).isNotContainer should equal (true) + } + + it should "convert a model with list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("urls", new ArrayProperty() + .items(new StringProperty())) + .required("id") + + val codegen = new ScalaClientCodegen() + val cm = codegen.fromModel("sample", model) + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (2) + + val vars = cm.vars + vars.get(1).baseName should be ("urls") + vars.get(1).getter should be ("getUrls") + vars.get(1).setter should be ("setUrls") + vars.get(1).datatype should be ("List[String]") + vars.get(1).name should be ("urls") + vars.get(1).defaultValue should be ("new ListBuffer[String]() ") + vars.get(1).baseType should be ("List") + vars.get(1).containerType should be ("array") + vars.get(1).required should equal (false) + vars.get(1).isContainer should equal (true) + } + + it should "convert a model with a map property" in { + val model = new ModelImpl() + .description("a sample model") + .property("translations", new MapProperty() + .additionalProperties(new StringProperty())) + .required("id") + + val codegen = new ScalaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("translations") + vars.get(0).getter should be ("getTranslations") + vars.get(0).setter should be ("setTranslations") + vars.get(0).datatype should be ("Map[String, String]") + vars.get(0).name should be ("translations") + vars.get(0).defaultValue should be ("new HashMap[String, String]() ") + vars.get(0).baseType should be ("Map") + vars.get(0).containerType should be ("map") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + } + + it should "convert a model with complex properties" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new RefProperty("#/definitions/Children")) + + val codegen = new ScalaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).getter should be ("getChildren") + vars.get(0).setter should be ("setChildren") + vars.get(0).datatype should be ("Children") + vars.get(0).name should be ("children") + vars.get(0).defaultValue should be ("null") + vars.get(0).baseType should be ("Children") + vars.get(0).required should equal (false) + vars.get(0).isNotContainer should equal (true) + } + + it should "convert a model with complex list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new ArrayProperty() + .items(new RefProperty("#/definitions/Children"))) + + val codegen = new ScalaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).complexType should be ("Children") + vars.get(0).getter should be ("getChildren") + vars.get(0).setter should be ("setChildren") + vars.get(0).datatype should be ("List[Children]") + vars.get(0).name should be ("children") + vars.get(0).defaultValue should be ("new ListBuffer[Children]() ") + vars.get(0).baseType should be ("List") + vars.get(0).containerType should be ("array") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + } + + it should "convert a model with complex map property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new MapProperty() + .additionalProperties(new RefProperty("#/definitions/Children"))) + + val codegen = new ScalaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + (cm.imports.asScala.toSet & Set("Children")).size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).complexType should be ("Children") + vars.get(0).getter should be ("getChildren") + vars.get(0).setter should be ("setChildren") + vars.get(0).datatype should be ("Map[String, Children]") + vars.get(0).name should be ("children") + vars.get(0).defaultValue should be ("new HashMap[String, Children]() ") + vars.get(0).baseType should be ("Map") + vars.get(0).containerType should be ("map") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + vars.get(0).isNotContainer should be (null) + } + + it should "convert an array model" in { + val model = new ArrayModel() + .description("an array model") + .items(new RefProperty("#/definitions/Children")) + val codegen = new ScalaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("an array model") + cm.vars.size should be (0) + cm.parent should be ("ListBuffer[Children]") + cm.imports.size should be (3) + (cm.imports.asScala.toSet & Set("List", "ListBuffer", "Children")).size should be (3) + } + + it should "convert an map model" in { + val model = new ModelImpl() + .description("an map model") + .additionalProperties(new RefProperty("#/definitions/Children")) + + val codegen = new ScalaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("an map model") + cm.vars.size should be (0) + cm.parent should be ("HashMap[String, Children]") + cm.imports.size should be (2) + (cm.imports.asScala.toSet & Set("HashMap", "Children")).size should be (2) + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/scala/staticDocs/StaticOperationTest.scala b/modules/swagger-codegen/src/test/scala/staticDocs/StaticOperationTest.scala new file mode 100644 index 000000000000..f46201faa5b2 --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/staticDocs/StaticOperationTest.scala @@ -0,0 +1,65 @@ +package staticDocs + +import com.wordnik.swagger.codegen.languages.StaticDocCodegen +import com.wordnik.swagger.util.Json +import com.wordnik.swagger.models._ +import com.wordnik.swagger.models.properties._ + +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import org.scalatest.FlatSpec +import org.scalatest.Matchers + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class StaticOperationTest extends FlatSpec with Matchers { + it should "convert a string parameter" in { + val property = new StringProperty() + + val codegen = new StaticDocCodegen() + val cp = codegen.fromProperty("property", property) + + cp.baseName should be ("property") + cp.datatype should be ("String") + cp.name should be ("property") + cp.baseType should be ("string") + cp.isNotContainer should equal (true) + } + + it should "convert a complex parameter" in { + val property = new RefProperty("Children") + + val codegen = new StaticDocCodegen() + val cp = codegen.fromProperty("property", property) + + cp.baseName should be ("property") + cp.complexType should be ("Children") + cp.getter should be ("getProperty") + cp.setter should be ("setProperty") + cp.datatype should be ("Children") + cp.name should be ("property") + cp.defaultValue should be ("null") + cp.baseType should be ("Children") + cp.isNotContainer should equal (true) + } + + it should "convert a complex list parameter" in { + val property = new ArrayProperty(). + items(new RefProperty("Children")) + + val codegen = new StaticDocCodegen() + val cp = codegen.fromProperty("property", property) + + cp.baseName should be ("property") + cp.complexType should be ("Children") + cp.getter should be ("getProperty") + cp.setter should be ("setProperty") + cp.datatype should be ("List") + cp.name should be ("property") + cp.baseType should be ("array") + cp.containerType should be ("array") + cp.isContainer should equal (true) + + } +} \ No newline at end of file