diff --git a/.gradle/6.7/executionHistory/executionHistory.bin b/.gradle/6.7/executionHistory/executionHistory.bin
new file mode 100644
index 000000000..59d7fb7fe
Binary files /dev/null and b/.gradle/6.7/executionHistory/executionHistory.bin differ
diff --git a/.gradle/6.7/executionHistory/executionHistory.lock b/.gradle/6.7/executionHistory/executionHistory.lock
new file mode 100644
index 000000000..5905bfa79
Binary files /dev/null and b/.gradle/6.7/executionHistory/executionHistory.lock differ
diff --git a/.gradle/6.7/fileChanges/last-build.bin b/.gradle/6.7/fileChanges/last-build.bin
new file mode 100644
index 000000000..f76dd238a
Binary files /dev/null and b/.gradle/6.7/fileChanges/last-build.bin differ
diff --git a/.gradle/6.7/fileHashes/fileHashes.bin b/.gradle/6.7/fileHashes/fileHashes.bin
new file mode 100644
index 000000000..8db17dfff
Binary files /dev/null and b/.gradle/6.7/fileHashes/fileHashes.bin differ
diff --git a/.gradle/6.7/fileHashes/fileHashes.lock b/.gradle/6.7/fileHashes/fileHashes.lock
new file mode 100644
index 000000000..99afb84eb
Binary files /dev/null and b/.gradle/6.7/fileHashes/fileHashes.lock differ
diff --git a/.gradle/6.7/fileHashes/resourceHashesCache.bin b/.gradle/6.7/fileHashes/resourceHashesCache.bin
new file mode 100644
index 000000000..22c7c1761
Binary files /dev/null and b/.gradle/6.7/fileHashes/resourceHashesCache.bin differ
diff --git a/.gradle/6.7/gc.properties b/.gradle/6.7/gc.properties
new file mode 100644
index 000000000..e69de29bb
diff --git a/.gradle/6.7/javaCompile/classAnalysis.bin b/.gradle/6.7/javaCompile/classAnalysis.bin
new file mode 100644
index 000000000..6cc6820f8
Binary files /dev/null and b/.gradle/6.7/javaCompile/classAnalysis.bin differ
diff --git a/.gradle/6.7/javaCompile/jarAnalysis.bin b/.gradle/6.7/javaCompile/jarAnalysis.bin
new file mode 100644
index 000000000..b4d2f86b7
Binary files /dev/null and b/.gradle/6.7/javaCompile/jarAnalysis.bin differ
diff --git a/.gradle/6.7/javaCompile/javaCompile.lock b/.gradle/6.7/javaCompile/javaCompile.lock
new file mode 100644
index 000000000..ebe0e11af
Binary files /dev/null and b/.gradle/6.7/javaCompile/javaCompile.lock differ
diff --git a/.gradle/6.7/javaCompile/taskHistory.bin b/.gradle/6.7/javaCompile/taskHistory.bin
new file mode 100644
index 000000000..7e46eaa7e
Binary files /dev/null and b/.gradle/6.7/javaCompile/taskHistory.bin differ
diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock
new file mode 100644
index 000000000..7a55a2022
Binary files /dev/null and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ
diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties
new file mode 100644
index 000000000..7a3384613
--- /dev/null
+++ b/.gradle/buildOutputCleanup/cache.properties
@@ -0,0 +1,2 @@
+#Sat Oct 17 20:51:58 ART 2020
+gradle.version=6.7
diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin
new file mode 100644
index 000000000..c9120b88d
Binary files /dev/null and b/.gradle/buildOutputCleanup/outputFiles.bin differ
diff --git a/.gradle/checksums/checksums.lock b/.gradle/checksums/checksums.lock
new file mode 100644
index 000000000..dd66dbe72
Binary files /dev/null and b/.gradle/checksums/checksums.lock differ
diff --git a/.gradle/checksums/md5-checksums.bin b/.gradle/checksums/md5-checksums.bin
new file mode 100644
index 000000000..51c7854d8
Binary files /dev/null and b/.gradle/checksums/md5-checksums.bin differ
diff --git a/.gradle/checksums/sha1-checksums.bin b/.gradle/checksums/sha1-checksums.bin
new file mode 100644
index 000000000..fc84a1eb3
Binary files /dev/null and b/.gradle/checksums/sha1-checksums.bin differ
diff --git a/.gradle/configuration-cache/gc.properties b/.gradle/configuration-cache/gc.properties
new file mode 100644
index 000000000..e69de29bb
diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties
new file mode 100644
index 000000000..e69de29bb
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 000000000..56093255d
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,62 @@
+/*
+ * This file was generated by the Gradle 'init' task.
+ */
+
+plugins {
+ id 'java'
+ id 'maven-publish'
+ id 'org.springframework.boot' version '2.1.9.RELEASE'
+}
+
+repositories {
+ mavenLocal()
+ maven {
+ url = uri('https://repo.spring.io/snapshot')
+ }
+
+ maven {
+ url = uri('https://repo.spring.io/milestone')
+ }
+
+ maven {
+ url = uri('https://repo.maven.apache.org/maven2/')
+ }
+}
+
+dependencies {
+ implementation 'org.springframework.boot:spring-boot-starter-actuator:2.3.3.RELEASE'
+ implementation 'org.springframework.boot:spring-boot-starter-cache:2.3.3.RELEASE'
+ implementation 'org.springframework.boot:spring-boot-starter-data-jpa:2.3.3.RELEASE'
+ implementation 'org.springframework.boot:spring-boot-starter-web:2.3.3.RELEASE'
+ implementation 'org.springframework.boot:spring-boot-starter-validation:2.3.3.RELEASE'
+ implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:2.3.3.RELEASE'
+ implementation 'javax.cache:cache-api:1.1.1'
+ implementation 'org.ehcache:ehcache:3.8.1'
+ implementation 'org.webjars:webjars-locator-core:0.45'
+ implementation 'org.webjars:jquery:2.2.4'
+ implementation 'org.webjars:jquery-ui:1.11.4'
+ implementation 'org.webjars:bootstrap:3.3.6'
+ implementation 'org.springframework.boot:spring-boot-devtools:2.3.3.RELEASE'
+ runtimeOnly 'com.h2database:h2:1.4.200'
+ runtimeOnly 'mysql:mysql-connector-java:8.0.21'
+ testImplementation 'org.springframework.boot:spring-boot-starter-test:2.3.3.RELEASE'
+ testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.6.2'
+ testImplementation 'org.mockito:mockito-junit-jupiter:3.3.3'
+}
+
+group = 'org.springframework.samples'
+version = '2.3.0.BUILD-SNAPSHOT'
+description = 'petclinic'
+java.sourceCompatibility = JavaVersion.VERSION_1_8
+
+publishing {
+ publications {
+ maven(MavenPublication) {
+ from(components.java)
+ }
+ }
+}
+
+tasks.withType(JavaCompile) {
+ options.encoding = 'UTF-8'
+}
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/PetClinicApplication.class b/build/classes/java/main/org/springframework/samples/petclinic/PetClinicApplication.class
new file mode 100644
index 000000000..bf0301c0c
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/PetClinicApplication.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/model/BaseEntity.class b/build/classes/java/main/org/springframework/samples/petclinic/model/BaseEntity.class
new file mode 100644
index 000000000..e905fef84
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/model/BaseEntity.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/model/NamedEntity.class b/build/classes/java/main/org/springframework/samples/petclinic/model/NamedEntity.class
new file mode 100644
index 000000000..319239e45
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/model/NamedEntity.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/model/Person.class b/build/classes/java/main/org/springframework/samples/petclinic/model/Person.class
new file mode 100644
index 000000000..fdb983040
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/model/Person.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/owner/Owner.class b/build/classes/java/main/org/springframework/samples/petclinic/owner/Owner.class
new file mode 100644
index 000000000..030ad6be9
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/owner/Owner.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/owner/OwnerController.class b/build/classes/java/main/org/springframework/samples/petclinic/owner/OwnerController.class
new file mode 100644
index 000000000..b6b3b149a
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/owner/OwnerController.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/owner/OwnerRepository.class b/build/classes/java/main/org/springframework/samples/petclinic/owner/OwnerRepository.class
new file mode 100644
index 000000000..8543fc0f6
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/owner/OwnerRepository.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/owner/Pet.class b/build/classes/java/main/org/springframework/samples/petclinic/owner/Pet.class
new file mode 100644
index 000000000..e6d9e1974
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/owner/Pet.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/owner/PetController.class b/build/classes/java/main/org/springframework/samples/petclinic/owner/PetController.class
new file mode 100644
index 000000000..e4f8b1924
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/owner/PetController.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/owner/PetRepository.class b/build/classes/java/main/org/springframework/samples/petclinic/owner/PetRepository.class
new file mode 100644
index 000000000..17bd0eb60
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/owner/PetRepository.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/owner/PetType.class b/build/classes/java/main/org/springframework/samples/petclinic/owner/PetType.class
new file mode 100644
index 000000000..407f7ef5b
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/owner/PetType.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/owner/PetTypeFormatter.class b/build/classes/java/main/org/springframework/samples/petclinic/owner/PetTypeFormatter.class
new file mode 100644
index 000000000..00cb9429c
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/owner/PetTypeFormatter.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/owner/PetValidator.class b/build/classes/java/main/org/springframework/samples/petclinic/owner/PetValidator.class
new file mode 100644
index 000000000..7a12a9621
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/owner/PetValidator.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/owner/VisitController.class b/build/classes/java/main/org/springframework/samples/petclinic/owner/VisitController.class
new file mode 100644
index 000000000..3c47d2be6
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/owner/VisitController.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/system/CacheConfiguration.class b/build/classes/java/main/org/springframework/samples/petclinic/system/CacheConfiguration.class
new file mode 100644
index 000000000..2108cb902
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/system/CacheConfiguration.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/system/CrashController.class b/build/classes/java/main/org/springframework/samples/petclinic/system/CrashController.class
new file mode 100644
index 000000000..2e907c652
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/system/CrashController.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/system/WelcomeController.class b/build/classes/java/main/org/springframework/samples/petclinic/system/WelcomeController.class
new file mode 100644
index 000000000..46dac0d49
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/system/WelcomeController.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/vet/Specialty.class b/build/classes/java/main/org/springframework/samples/petclinic/vet/Specialty.class
new file mode 100644
index 000000000..bdccad8f8
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/vet/Specialty.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/vet/Vet.class b/build/classes/java/main/org/springframework/samples/petclinic/vet/Vet.class
new file mode 100644
index 000000000..d994255e8
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/vet/Vet.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/vet/VetController.class b/build/classes/java/main/org/springframework/samples/petclinic/vet/VetController.class
new file mode 100644
index 000000000..3d8dad52e
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/vet/VetController.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/vet/VetRepository.class b/build/classes/java/main/org/springframework/samples/petclinic/vet/VetRepository.class
new file mode 100644
index 000000000..5de407492
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/vet/VetRepository.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/vet/Vets.class b/build/classes/java/main/org/springframework/samples/petclinic/vet/Vets.class
new file mode 100644
index 000000000..4f4b59bfb
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/vet/Vets.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/visit/Visit.class b/build/classes/java/main/org/springframework/samples/petclinic/visit/Visit.class
new file mode 100644
index 000000000..c3029ceda
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/visit/Visit.class differ
diff --git a/build/classes/java/main/org/springframework/samples/petclinic/visit/VisitRepository.class b/build/classes/java/main/org/springframework/samples/petclinic/visit/VisitRepository.class
new file mode 100644
index 000000000..5d8fc149a
Binary files /dev/null and b/build/classes/java/main/org/springframework/samples/petclinic/visit/VisitRepository.class differ
diff --git a/build/classes/java/test/org/springframework/samples/petclinic/PetclinicIntegrationTests.class b/build/classes/java/test/org/springframework/samples/petclinic/PetclinicIntegrationTests.class
new file mode 100644
index 000000000..2dfad448d
Binary files /dev/null and b/build/classes/java/test/org/springframework/samples/petclinic/PetclinicIntegrationTests.class differ
diff --git a/build/classes/java/test/org/springframework/samples/petclinic/model/ValidatorTests.class b/build/classes/java/test/org/springframework/samples/petclinic/model/ValidatorTests.class
new file mode 100644
index 000000000..78e6d2f8c
Binary files /dev/null and b/build/classes/java/test/org/springframework/samples/petclinic/model/ValidatorTests.class differ
diff --git a/build/classes/java/test/org/springframework/samples/petclinic/owner/OwnerControllerTests$1.class b/build/classes/java/test/org/springframework/samples/petclinic/owner/OwnerControllerTests$1.class
new file mode 100644
index 000000000..115b176be
Binary files /dev/null and b/build/classes/java/test/org/springframework/samples/petclinic/owner/OwnerControllerTests$1.class differ
diff --git a/build/classes/java/test/org/springframework/samples/petclinic/owner/OwnerControllerTests.class b/build/classes/java/test/org/springframework/samples/petclinic/owner/OwnerControllerTests.class
new file mode 100644
index 000000000..d727bdc8e
Binary files /dev/null and b/build/classes/java/test/org/springframework/samples/petclinic/owner/OwnerControllerTests.class differ
diff --git a/build/classes/java/test/org/springframework/samples/petclinic/owner/PetControllerTests.class b/build/classes/java/test/org/springframework/samples/petclinic/owner/PetControllerTests.class
new file mode 100644
index 000000000..a2a163f0d
Binary files /dev/null and b/build/classes/java/test/org/springframework/samples/petclinic/owner/PetControllerTests.class differ
diff --git a/build/classes/java/test/org/springframework/samples/petclinic/owner/PetTypeFormatterTests$1.class b/build/classes/java/test/org/springframework/samples/petclinic/owner/PetTypeFormatterTests$1.class
new file mode 100644
index 000000000..444ee6483
Binary files /dev/null and b/build/classes/java/test/org/springframework/samples/petclinic/owner/PetTypeFormatterTests$1.class differ
diff --git a/build/classes/java/test/org/springframework/samples/petclinic/owner/PetTypeFormatterTests$2.class b/build/classes/java/test/org/springframework/samples/petclinic/owner/PetTypeFormatterTests$2.class
new file mode 100644
index 000000000..e51cfe44f
Binary files /dev/null and b/build/classes/java/test/org/springframework/samples/petclinic/owner/PetTypeFormatterTests$2.class differ
diff --git a/build/classes/java/test/org/springframework/samples/petclinic/owner/PetTypeFormatterTests.class b/build/classes/java/test/org/springframework/samples/petclinic/owner/PetTypeFormatterTests.class
new file mode 100644
index 000000000..10fa05e39
Binary files /dev/null and b/build/classes/java/test/org/springframework/samples/petclinic/owner/PetTypeFormatterTests.class differ
diff --git a/build/classes/java/test/org/springframework/samples/petclinic/owner/VisitControllerTests.class b/build/classes/java/test/org/springframework/samples/petclinic/owner/VisitControllerTests.class
new file mode 100644
index 000000000..507030124
Binary files /dev/null and b/build/classes/java/test/org/springframework/samples/petclinic/owner/VisitControllerTests.class differ
diff --git a/build/classes/java/test/org/springframework/samples/petclinic/service/ClinicServiceTests.class b/build/classes/java/test/org/springframework/samples/petclinic/service/ClinicServiceTests.class
new file mode 100644
index 000000000..de0cdf7ea
Binary files /dev/null and b/build/classes/java/test/org/springframework/samples/petclinic/service/ClinicServiceTests.class differ
diff --git a/build/classes/java/test/org/springframework/samples/petclinic/service/EntityUtils.class b/build/classes/java/test/org/springframework/samples/petclinic/service/EntityUtils.class
new file mode 100644
index 000000000..f05ee9abc
Binary files /dev/null and b/build/classes/java/test/org/springframework/samples/petclinic/service/EntityUtils.class differ
diff --git a/build/classes/java/test/org/springframework/samples/petclinic/system/CrashControllerTests.class b/build/classes/java/test/org/springframework/samples/petclinic/system/CrashControllerTests.class
new file mode 100644
index 000000000..8d96c8063
Binary files /dev/null and b/build/classes/java/test/org/springframework/samples/petclinic/system/CrashControllerTests.class differ
diff --git a/build/classes/java/test/org/springframework/samples/petclinic/vet/VetControllerTests.class b/build/classes/java/test/org/springframework/samples/petclinic/vet/VetControllerTests.class
new file mode 100644
index 000000000..ab4f22717
Binary files /dev/null and b/build/classes/java/test/org/springframework/samples/petclinic/vet/VetControllerTests.class differ
diff --git a/build/classes/java/test/org/springframework/samples/petclinic/vet/VetTests.class b/build/classes/java/test/org/springframework/samples/petclinic/vet/VetTests.class
new file mode 100644
index 000000000..d00fea3c2
Binary files /dev/null and b/build/classes/java/test/org/springframework/samples/petclinic/vet/VetTests.class differ
diff --git a/build/libs/spring-petclinic-2.3.0.BUILD-SNAPSHOT.jar b/build/libs/spring-petclinic-2.3.0.BUILD-SNAPSHOT.jar
new file mode 100644
index 000000000..79ffc114e
Binary files /dev/null and b/build/libs/spring-petclinic-2.3.0.BUILD-SNAPSHOT.jar differ
diff --git a/build/reports/tests/test/css/base-style.css b/build/reports/tests/test/css/base-style.css
new file mode 100644
index 000000000..4afa73e3d
--- /dev/null
+++ b/build/reports/tests/test/css/base-style.css
@@ -0,0 +1,179 @@
+
+body {
+ margin: 0;
+ padding: 0;
+ font-family: sans-serif;
+ font-size: 12pt;
+}
+
+body, a, a:visited {
+ color: #303030;
+}
+
+#content {
+ padding-left: 50px;
+ padding-right: 50px;
+ padding-top: 30px;
+ padding-bottom: 30px;
+}
+
+#content h1 {
+ font-size: 160%;
+ margin-bottom: 10px;
+}
+
+#footer {
+ margin-top: 100px;
+ font-size: 80%;
+ white-space: nowrap;
+}
+
+#footer, #footer a {
+ color: #a0a0a0;
+}
+
+#line-wrapping-toggle {
+ vertical-align: middle;
+}
+
+#label-for-line-wrapping-toggle {
+ vertical-align: middle;
+}
+
+ul {
+ margin-left: 0;
+}
+
+h1, h2, h3 {
+ white-space: nowrap;
+}
+
+h2 {
+ font-size: 120%;
+}
+
+ul.tabLinks {
+ padding-left: 0;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ overflow: auto;
+ min-width: 800px;
+ width: auto !important;
+ width: 800px;
+}
+
+ul.tabLinks li {
+ float: left;
+ height: 100%;
+ list-style: none;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-top: 5px;
+ padding-bottom: 5px;
+ margin-bottom: 0;
+ -moz-border-radius: 7px;
+ border-radius: 7px;
+ margin-right: 25px;
+ border: solid 1px #d4d4d4;
+ background-color: #f0f0f0;
+}
+
+ul.tabLinks li:hover {
+ background-color: #fafafa;
+}
+
+ul.tabLinks li.selected {
+ background-color: #c5f0f5;
+ border-color: #c5f0f5;
+}
+
+ul.tabLinks a {
+ font-size: 120%;
+ display: block;
+ outline: none;
+ text-decoration: none;
+ margin: 0;
+ padding: 0;
+}
+
+ul.tabLinks li h2 {
+ margin: 0;
+ padding: 0;
+}
+
+div.tab {
+}
+
+div.selected {
+ display: block;
+}
+
+div.deselected {
+ display: none;
+}
+
+div.tab table {
+ min-width: 350px;
+ width: auto !important;
+ width: 350px;
+ border-collapse: collapse;
+}
+
+div.tab th, div.tab table {
+ border-bottom: solid #d0d0d0 1px;
+}
+
+div.tab th {
+ text-align: left;
+ white-space: nowrap;
+ padding-left: 6em;
+}
+
+div.tab th:first-child {
+ padding-left: 0;
+}
+
+div.tab td {
+ white-space: nowrap;
+ padding-left: 6em;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+
+div.tab td:first-child {
+ padding-left: 0;
+}
+
+div.tab td.numeric, div.tab th.numeric {
+ text-align: right;
+}
+
+span.code {
+ display: inline-block;
+ margin-top: 0em;
+ margin-bottom: 1em;
+}
+
+span.code pre {
+ font-size: 11pt;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ padding-left: 10px;
+ padding-right: 10px;
+ margin: 0;
+ background-color: #f7f7f7;
+ border: solid 1px #d0d0d0;
+ min-width: 700px;
+ width: auto !important;
+ width: 700px;
+}
+
+span.wrapped pre {
+ word-wrap: break-word;
+ white-space: pre-wrap;
+ word-break: break-all;
+}
+
+label.hidden {
+ display: none;
+}
\ No newline at end of file
diff --git a/build/reports/tests/test/css/style.css b/build/reports/tests/test/css/style.css
new file mode 100644
index 000000000..3dc4913e7
--- /dev/null
+++ b/build/reports/tests/test/css/style.css
@@ -0,0 +1,84 @@
+
+#summary {
+ margin-top: 30px;
+ margin-bottom: 40px;
+}
+
+#summary table {
+ border-collapse: collapse;
+}
+
+#summary td {
+ vertical-align: top;
+}
+
+.breadcrumbs, .breadcrumbs a {
+ color: #606060;
+}
+
+.infoBox {
+ width: 110px;
+ padding-top: 15px;
+ padding-bottom: 15px;
+ text-align: center;
+}
+
+.infoBox p {
+ margin: 0;
+}
+
+.counter, .percent {
+ font-size: 120%;
+ font-weight: bold;
+ margin-bottom: 8px;
+}
+
+#duration {
+ width: 125px;
+}
+
+#successRate, .summaryGroup {
+ border: solid 2px #d0d0d0;
+ -moz-border-radius: 10px;
+ border-radius: 10px;
+}
+
+#successRate {
+ width: 140px;
+ margin-left: 35px;
+}
+
+#successRate .percent {
+ font-size: 180%;
+}
+
+.success, .success a {
+ color: #008000;
+}
+
+div.success, #successRate.success {
+ background-color: #bbd9bb;
+ border-color: #008000;
+}
+
+.failures, .failures a {
+ color: #b60808;
+}
+
+.skipped, .skipped a {
+ color: #c09853;
+}
+
+div.failures, #successRate.failures {
+ background-color: #ecdada;
+ border-color: #b60808;
+}
+
+ul.linkList {
+ padding-left: 0;
+}
+
+ul.linkList li {
+ list-style: none;
+ margin-bottom: 5px;
+}
diff --git a/build/reports/tests/test/index.html b/build/reports/tests/test/index.html
new file mode 100644
index 000000000..6e3410905
--- /dev/null
+++ b/build/reports/tests/test/index.html
@@ -0,0 +1,92 @@
+
+
+
+
+
+Test results - Test Summary
+
+
+
+
+
+
+
Test Summary
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Classes
+
+
+
+Class
+Tests
+Failures
+Ignored
+Duration
+Success rate
+
+
+
+
+
+
+
+
+
+
diff --git a/build/reports/tests/test/js/report.js b/build/reports/tests/test/js/report.js
new file mode 100644
index 000000000..83bab4a19
--- /dev/null
+++ b/build/reports/tests/test/js/report.js
@@ -0,0 +1,194 @@
+(function (window, document) {
+ "use strict";
+
+ var tabs = {};
+
+ function changeElementClass(element, classValue) {
+ if (element.getAttribute("className")) {
+ element.setAttribute("className", classValue);
+ } else {
+ element.setAttribute("class", classValue);
+ }
+ }
+
+ function getClassAttribute(element) {
+ if (element.getAttribute("className")) {
+ return element.getAttribute("className");
+ } else {
+ return element.getAttribute("class");
+ }
+ }
+
+ function addClass(element, classValue) {
+ changeElementClass(element, getClassAttribute(element) + " " + classValue);
+ }
+
+ function removeClass(element, classValue) {
+ changeElementClass(element, getClassAttribute(element).replace(classValue, ""));
+ }
+
+ function initTabs() {
+ var container = document.getElementById("tabs");
+
+ tabs.tabs = findTabs(container);
+ tabs.titles = findTitles(tabs.tabs);
+ tabs.headers = findHeaders(container);
+ tabs.select = select;
+ tabs.deselectAll = deselectAll;
+ tabs.select(0);
+
+ return true;
+ }
+
+ function getCheckBox() {
+ return document.getElementById("line-wrapping-toggle");
+ }
+
+ function getLabelForCheckBox() {
+ return document.getElementById("label-for-line-wrapping-toggle");
+ }
+
+ function findCodeBlocks() {
+ var spans = document.getElementById("tabs").getElementsByTagName("span");
+ var codeBlocks = [];
+ for (var i = 0; i < spans.length; ++i) {
+ if (spans[i].className.indexOf("code") >= 0) {
+ codeBlocks.push(spans[i]);
+ }
+ }
+ return codeBlocks;
+ }
+
+ function forAllCodeBlocks(operation) {
+ var codeBlocks = findCodeBlocks();
+
+ for (var i = 0; i < codeBlocks.length; ++i) {
+ operation(codeBlocks[i], "wrapped");
+ }
+ }
+
+ function toggleLineWrapping() {
+ var checkBox = getCheckBox();
+
+ if (checkBox.checked) {
+ forAllCodeBlocks(addClass);
+ } else {
+ forAllCodeBlocks(removeClass);
+ }
+ }
+
+ function initControls() {
+ if (findCodeBlocks().length > 0) {
+ var checkBox = getCheckBox();
+ var label = getLabelForCheckBox();
+
+ checkBox.onclick = toggleLineWrapping;
+ checkBox.checked = false;
+
+ removeClass(label, "hidden");
+ }
+ }
+
+ function switchTab() {
+ var id = this.id.substr(1);
+
+ for (var i = 0; i < tabs.tabs.length; i++) {
+ if (tabs.tabs[i].id === id) {
+ tabs.select(i);
+ break;
+ }
+ }
+
+ return false;
+ }
+
+ function select(i) {
+ this.deselectAll();
+
+ changeElementClass(this.tabs[i], "tab selected");
+ changeElementClass(this.headers[i], "selected");
+
+ while (this.headers[i].firstChild) {
+ this.headers[i].removeChild(this.headers[i].firstChild);
+ }
+
+ var h2 = document.createElement("H2");
+
+ h2.appendChild(document.createTextNode(this.titles[i]));
+ this.headers[i].appendChild(h2);
+ }
+
+ function deselectAll() {
+ for (var i = 0; i < this.tabs.length; i++) {
+ changeElementClass(this.tabs[i], "tab deselected");
+ changeElementClass(this.headers[i], "deselected");
+
+ while (this.headers[i].firstChild) {
+ this.headers[i].removeChild(this.headers[i].firstChild);
+ }
+
+ var a = document.createElement("A");
+
+ a.setAttribute("id", "ltab" + i);
+ a.setAttribute("href", "#tab" + i);
+ a.onclick = switchTab;
+ a.appendChild(document.createTextNode(this.titles[i]));
+
+ this.headers[i].appendChild(a);
+ }
+ }
+
+ function findTabs(container) {
+ return findChildElements(container, "DIV", "tab");
+ }
+
+ function findHeaders(container) {
+ var owner = findChildElements(container, "UL", "tabLinks");
+ return findChildElements(owner[0], "LI", null);
+ }
+
+ function findTitles(tabs) {
+ var titles = [];
+
+ for (var i = 0; i < tabs.length; i++) {
+ var tab = tabs[i];
+ var header = findChildElements(tab, "H2", null)[0];
+
+ header.parentNode.removeChild(header);
+
+ if (header.innerText) {
+ titles.push(header.innerText);
+ } else {
+ titles.push(header.textContent);
+ }
+ }
+
+ return titles;
+ }
+
+ function findChildElements(container, name, targetClass) {
+ var elements = [];
+ var children = container.childNodes;
+
+ for (var i = 0; i < children.length; i++) {
+ var child = children.item(i);
+
+ if (child.nodeType === 1 && child.nodeName === name) {
+ if (targetClass && child.className.indexOf(targetClass) < 0) {
+ continue;
+ }
+
+ elements.push(child);
+ }
+ }
+
+ return elements;
+ }
+
+ // Entry point.
+
+ window.onload = function() {
+ initTabs();
+ initControls();
+ };
+} (window, window.document));
\ No newline at end of file
diff --git a/build/resources/main/application-mysql.properties b/build/resources/main/application-mysql.properties
new file mode 100644
index 000000000..d388c9e6d
--- /dev/null
+++ b/build/resources/main/application-mysql.properties
@@ -0,0 +1,7 @@
+# database init, supports mysql too
+database=mysql
+spring.datasource.url=${MYSQL_URL:jdbc:mysql://localhost/petclinic}
+spring.datasource.username=${MYSQL_USER:petclinic}
+spring.datasource.password=${MYSQL_PASS:petclinic}
+# SQL is written to be idempotent so this is safe
+spring.datasource.initialization-mode=always
diff --git a/build/resources/main/application.properties b/build/resources/main/application.properties
new file mode 100644
index 000000000..4d4784e36
--- /dev/null
+++ b/build/resources/main/application.properties
@@ -0,0 +1,25 @@
+# database init, supports mysql too
+database=h2
+spring.datasource.schema=classpath*:db/${database}/schema.sql
+spring.datasource.data=classpath*:db/${database}/data.sql
+
+# Web
+spring.thymeleaf.mode=HTML
+
+# JPA
+spring.jpa.hibernate.ddl-auto=none
+spring.jpa.open-in-view=false
+
+# Internationalization
+spring.messages.basename=messages/messages
+
+# Actuator
+management.endpoints.web.exposure.include=*
+
+# Logging
+logging.level.org.springframework=INFO
+# logging.level.org.springframework.web=DEBUG
+# logging.level.org.springframework.context.annotation=TRACE
+
+# Maximum time static resources should be cached
+spring.resources.cache.cachecontrol.max-age=12h
diff --git a/build/resources/main/banner.txt b/build/resources/main/banner.txt
new file mode 100644
index 000000000..6225d1208
--- /dev/null
+++ b/build/resources/main/banner.txt
@@ -0,0 +1,15 @@
+
+
+ |\ _,,,--,,_
+ /,`.-'`' ._ \-;;,_
+ _______ __|,4- ) )_ .;.(__`'-'__ ___ __ _ ___ _______
+ | | '---''(_/._)-'(_\_) | | | | | | | | |
+ | _ | ___|_ _| | | | | |_| | | | __ _ _
+ | |_| | |___ | | | | | | | | | | \ \ \ \
+ | ___| ___| | | | _| |___| | _ | | _| \ \ \ \
+ | | | |___ | | | |_| | | | | | | |_ ) ) ) )
+ |___| |_______| |___| |_______|_______|___|_| |__|___|_______| / / / /
+ ==================================================================/_/_/_/
+
+:: Built with Spring Boot :: ${spring-boot.version}
+
diff --git a/build/resources/main/db/h2/data.sql b/build/resources/main/db/h2/data.sql
new file mode 100644
index 000000000..16dda3e84
--- /dev/null
+++ b/build/resources/main/db/h2/data.sql
@@ -0,0 +1,53 @@
+INSERT INTO vets VALUES (1, 'James', 'Carter');
+INSERT INTO vets VALUES (2, 'Helen', 'Leary');
+INSERT INTO vets VALUES (3, 'Linda', 'Douglas');
+INSERT INTO vets VALUES (4, 'Rafael', 'Ortega');
+INSERT INTO vets VALUES (5, 'Henry', 'Stevens');
+INSERT INTO vets VALUES (6, 'Sharon', 'Jenkins');
+
+INSERT INTO specialties VALUES (1, 'radiology');
+INSERT INTO specialties VALUES (2, 'surgery');
+INSERT INTO specialties VALUES (3, 'dentistry');
+
+INSERT INTO vet_specialties VALUES (2, 1);
+INSERT INTO vet_specialties VALUES (3, 2);
+INSERT INTO vet_specialties VALUES (3, 3);
+INSERT INTO vet_specialties VALUES (4, 2);
+INSERT INTO vet_specialties VALUES (5, 1);
+
+INSERT INTO types VALUES (1, 'cat');
+INSERT INTO types VALUES (2, 'dog');
+INSERT INTO types VALUES (3, 'lizard');
+INSERT INTO types VALUES (4, 'snake');
+INSERT INTO types VALUES (5, 'bird');
+INSERT INTO types VALUES (6, 'hamster');
+
+INSERT INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023');
+INSERT INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749');
+INSERT INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763');
+INSERT INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198');
+INSERT INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765');
+INSERT INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654');
+INSERT INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387');
+INSERT INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683');
+INSERT INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435');
+INSERT INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487');
+
+INSERT INTO pets VALUES (1, 'Leo', '2010-09-07', 1, 1);
+INSERT INTO pets VALUES (2, 'Basil', '2012-08-06', 6, 2);
+INSERT INTO pets VALUES (3, 'Rosy', '2011-04-17', 2, 3);
+INSERT INTO pets VALUES (4, 'Jewel', '2010-03-07', 2, 3);
+INSERT INTO pets VALUES (5, 'Iggy', '2010-11-30', 3, 4);
+INSERT INTO pets VALUES (6, 'George', '2010-01-20', 4, 5);
+INSERT INTO pets VALUES (7, 'Samantha', '2012-09-04', 1, 6);
+INSERT INTO pets VALUES (8, 'Max', '2012-09-04', 1, 6);
+INSERT INTO pets VALUES (9, 'Lucky', '2011-08-06', 5, 7);
+INSERT INTO pets VALUES (10, 'Mulligan', '2007-02-24', 2, 8);
+INSERT INTO pets VALUES (11, 'Freddy', '2010-03-09', 5, 9);
+INSERT INTO pets VALUES (12, 'Lucky', '2010-06-24', 2, 10);
+INSERT INTO pets VALUES (13, 'Sly', '2012-06-08', 1, 10);
+
+INSERT INTO visits VALUES (1, 7, '2013-01-01', 'rabies shot');
+INSERT INTO visits VALUES (2, 8, '2013-01-02', 'rabies shot');
+INSERT INTO visits VALUES (3, 8, '2013-01-03', 'neutered');
+INSERT INTO visits VALUES (4, 7, '2013-01-04', 'spayed');
diff --git a/build/resources/main/db/h2/schema.sql b/build/resources/main/db/h2/schema.sql
new file mode 100644
index 000000000..f3c6947b7
--- /dev/null
+++ b/build/resources/main/db/h2/schema.sql
@@ -0,0 +1,64 @@
+DROP TABLE vet_specialties IF EXISTS;
+DROP TABLE vets IF EXISTS;
+DROP TABLE specialties IF EXISTS;
+DROP TABLE visits IF EXISTS;
+DROP TABLE pets IF EXISTS;
+DROP TABLE types IF EXISTS;
+DROP TABLE owners IF EXISTS;
+
+
+CREATE TABLE vets (
+ id INTEGER IDENTITY PRIMARY KEY,
+ first_name VARCHAR(30),
+ last_name VARCHAR(30)
+);
+CREATE INDEX vets_last_name ON vets (last_name);
+
+CREATE TABLE specialties (
+ id INTEGER IDENTITY PRIMARY KEY,
+ name VARCHAR(80)
+);
+CREATE INDEX specialties_name ON specialties (name);
+
+CREATE TABLE vet_specialties (
+ vet_id INTEGER NOT NULL,
+ specialty_id INTEGER NOT NULL
+);
+ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_vets FOREIGN KEY (vet_id) REFERENCES vets (id);
+ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_specialties FOREIGN KEY (specialty_id) REFERENCES specialties (id);
+
+CREATE TABLE types (
+ id INTEGER IDENTITY PRIMARY KEY,
+ name VARCHAR(80)
+);
+CREATE INDEX types_name ON types (name);
+
+CREATE TABLE owners (
+ id INTEGER IDENTITY PRIMARY KEY,
+ first_name VARCHAR(30),
+ last_name VARCHAR_IGNORECASE(30),
+ address VARCHAR(255),
+ city VARCHAR(80),
+ telephone VARCHAR(20)
+);
+CREATE INDEX owners_last_name ON owners (last_name);
+
+CREATE TABLE pets (
+ id INTEGER IDENTITY PRIMARY KEY,
+ name VARCHAR(30),
+ birth_date DATE,
+ type_id INTEGER NOT NULL,
+ owner_id INTEGER NOT NULL
+);
+ALTER TABLE pets ADD CONSTRAINT fk_pets_owners FOREIGN KEY (owner_id) REFERENCES owners (id);
+ALTER TABLE pets ADD CONSTRAINT fk_pets_types FOREIGN KEY (type_id) REFERENCES types (id);
+CREATE INDEX pets_name ON pets (name);
+
+CREATE TABLE visits (
+ id INTEGER IDENTITY PRIMARY KEY,
+ pet_id INTEGER NOT NULL,
+ visit_date DATE,
+ description VARCHAR(255)
+);
+ALTER TABLE visits ADD CONSTRAINT fk_visits_pets FOREIGN KEY (pet_id) REFERENCES pets (id);
+CREATE INDEX visits_pet_id ON visits (pet_id);
diff --git a/build/resources/main/db/hsqldb/data.sql b/build/resources/main/db/hsqldb/data.sql
new file mode 100644
index 000000000..16dda3e84
--- /dev/null
+++ b/build/resources/main/db/hsqldb/data.sql
@@ -0,0 +1,53 @@
+INSERT INTO vets VALUES (1, 'James', 'Carter');
+INSERT INTO vets VALUES (2, 'Helen', 'Leary');
+INSERT INTO vets VALUES (3, 'Linda', 'Douglas');
+INSERT INTO vets VALUES (4, 'Rafael', 'Ortega');
+INSERT INTO vets VALUES (5, 'Henry', 'Stevens');
+INSERT INTO vets VALUES (6, 'Sharon', 'Jenkins');
+
+INSERT INTO specialties VALUES (1, 'radiology');
+INSERT INTO specialties VALUES (2, 'surgery');
+INSERT INTO specialties VALUES (3, 'dentistry');
+
+INSERT INTO vet_specialties VALUES (2, 1);
+INSERT INTO vet_specialties VALUES (3, 2);
+INSERT INTO vet_specialties VALUES (3, 3);
+INSERT INTO vet_specialties VALUES (4, 2);
+INSERT INTO vet_specialties VALUES (5, 1);
+
+INSERT INTO types VALUES (1, 'cat');
+INSERT INTO types VALUES (2, 'dog');
+INSERT INTO types VALUES (3, 'lizard');
+INSERT INTO types VALUES (4, 'snake');
+INSERT INTO types VALUES (5, 'bird');
+INSERT INTO types VALUES (6, 'hamster');
+
+INSERT INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023');
+INSERT INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749');
+INSERT INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763');
+INSERT INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198');
+INSERT INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765');
+INSERT INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654');
+INSERT INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387');
+INSERT INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683');
+INSERT INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435');
+INSERT INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487');
+
+INSERT INTO pets VALUES (1, 'Leo', '2010-09-07', 1, 1);
+INSERT INTO pets VALUES (2, 'Basil', '2012-08-06', 6, 2);
+INSERT INTO pets VALUES (3, 'Rosy', '2011-04-17', 2, 3);
+INSERT INTO pets VALUES (4, 'Jewel', '2010-03-07', 2, 3);
+INSERT INTO pets VALUES (5, 'Iggy', '2010-11-30', 3, 4);
+INSERT INTO pets VALUES (6, 'George', '2010-01-20', 4, 5);
+INSERT INTO pets VALUES (7, 'Samantha', '2012-09-04', 1, 6);
+INSERT INTO pets VALUES (8, 'Max', '2012-09-04', 1, 6);
+INSERT INTO pets VALUES (9, 'Lucky', '2011-08-06', 5, 7);
+INSERT INTO pets VALUES (10, 'Mulligan', '2007-02-24', 2, 8);
+INSERT INTO pets VALUES (11, 'Freddy', '2010-03-09', 5, 9);
+INSERT INTO pets VALUES (12, 'Lucky', '2010-06-24', 2, 10);
+INSERT INTO pets VALUES (13, 'Sly', '2012-06-08', 1, 10);
+
+INSERT INTO visits VALUES (1, 7, '2013-01-01', 'rabies shot');
+INSERT INTO visits VALUES (2, 8, '2013-01-02', 'rabies shot');
+INSERT INTO visits VALUES (3, 8, '2013-01-03', 'neutered');
+INSERT INTO visits VALUES (4, 7, '2013-01-04', 'spayed');
diff --git a/build/resources/main/db/hsqldb/schema.sql b/build/resources/main/db/hsqldb/schema.sql
new file mode 100644
index 000000000..f3c6947b7
--- /dev/null
+++ b/build/resources/main/db/hsqldb/schema.sql
@@ -0,0 +1,64 @@
+DROP TABLE vet_specialties IF EXISTS;
+DROP TABLE vets IF EXISTS;
+DROP TABLE specialties IF EXISTS;
+DROP TABLE visits IF EXISTS;
+DROP TABLE pets IF EXISTS;
+DROP TABLE types IF EXISTS;
+DROP TABLE owners IF EXISTS;
+
+
+CREATE TABLE vets (
+ id INTEGER IDENTITY PRIMARY KEY,
+ first_name VARCHAR(30),
+ last_name VARCHAR(30)
+);
+CREATE INDEX vets_last_name ON vets (last_name);
+
+CREATE TABLE specialties (
+ id INTEGER IDENTITY PRIMARY KEY,
+ name VARCHAR(80)
+);
+CREATE INDEX specialties_name ON specialties (name);
+
+CREATE TABLE vet_specialties (
+ vet_id INTEGER NOT NULL,
+ specialty_id INTEGER NOT NULL
+);
+ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_vets FOREIGN KEY (vet_id) REFERENCES vets (id);
+ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_specialties FOREIGN KEY (specialty_id) REFERENCES specialties (id);
+
+CREATE TABLE types (
+ id INTEGER IDENTITY PRIMARY KEY,
+ name VARCHAR(80)
+);
+CREATE INDEX types_name ON types (name);
+
+CREATE TABLE owners (
+ id INTEGER IDENTITY PRIMARY KEY,
+ first_name VARCHAR(30),
+ last_name VARCHAR_IGNORECASE(30),
+ address VARCHAR(255),
+ city VARCHAR(80),
+ telephone VARCHAR(20)
+);
+CREATE INDEX owners_last_name ON owners (last_name);
+
+CREATE TABLE pets (
+ id INTEGER IDENTITY PRIMARY KEY,
+ name VARCHAR(30),
+ birth_date DATE,
+ type_id INTEGER NOT NULL,
+ owner_id INTEGER NOT NULL
+);
+ALTER TABLE pets ADD CONSTRAINT fk_pets_owners FOREIGN KEY (owner_id) REFERENCES owners (id);
+ALTER TABLE pets ADD CONSTRAINT fk_pets_types FOREIGN KEY (type_id) REFERENCES types (id);
+CREATE INDEX pets_name ON pets (name);
+
+CREATE TABLE visits (
+ id INTEGER IDENTITY PRIMARY KEY,
+ pet_id INTEGER NOT NULL,
+ visit_date DATE,
+ description VARCHAR(255)
+);
+ALTER TABLE visits ADD CONSTRAINT fk_visits_pets FOREIGN KEY (pet_id) REFERENCES pets (id);
+CREATE INDEX visits_pet_id ON visits (pet_id);
diff --git a/build/resources/main/db/mysql/data.sql b/build/resources/main/db/mysql/data.sql
new file mode 100644
index 000000000..3f1dcf8ea
--- /dev/null
+++ b/build/resources/main/db/mysql/data.sql
@@ -0,0 +1,53 @@
+INSERT IGNORE INTO vets VALUES (1, 'James', 'Carter');
+INSERT IGNORE INTO vets VALUES (2, 'Helen', 'Leary');
+INSERT IGNORE INTO vets VALUES (3, 'Linda', 'Douglas');
+INSERT IGNORE INTO vets VALUES (4, 'Rafael', 'Ortega');
+INSERT IGNORE INTO vets VALUES (5, 'Henry', 'Stevens');
+INSERT IGNORE INTO vets VALUES (6, 'Sharon', 'Jenkins');
+
+INSERT IGNORE INTO specialties VALUES (1, 'radiology');
+INSERT IGNORE INTO specialties VALUES (2, 'surgery');
+INSERT IGNORE INTO specialties VALUES (3, 'dentistry');
+
+INSERT IGNORE INTO vet_specialties VALUES (2, 1);
+INSERT IGNORE INTO vet_specialties VALUES (3, 2);
+INSERT IGNORE INTO vet_specialties VALUES (3, 3);
+INSERT IGNORE INTO vet_specialties VALUES (4, 2);
+INSERT IGNORE INTO vet_specialties VALUES (5, 1);
+
+INSERT IGNORE INTO types VALUES (1, 'cat');
+INSERT IGNORE INTO types VALUES (2, 'dog');
+INSERT IGNORE INTO types VALUES (3, 'lizard');
+INSERT IGNORE INTO types VALUES (4, 'snake');
+INSERT IGNORE INTO types VALUES (5, 'bird');
+INSERT IGNORE INTO types VALUES (6, 'hamster');
+
+INSERT IGNORE INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023');
+INSERT IGNORE INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749');
+INSERT IGNORE INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763');
+INSERT IGNORE INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198');
+INSERT IGNORE INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765');
+INSERT IGNORE INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654');
+INSERT IGNORE INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387');
+INSERT IGNORE INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683');
+INSERT IGNORE INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435');
+INSERT IGNORE INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487');
+
+INSERT IGNORE INTO pets VALUES (1, 'Leo', '2000-09-07', 1, 1);
+INSERT IGNORE INTO pets VALUES (2, 'Basil', '2002-08-06', 6, 2);
+INSERT IGNORE INTO pets VALUES (3, 'Rosy', '2001-04-17', 2, 3);
+INSERT IGNORE INTO pets VALUES (4, 'Jewel', '2000-03-07', 2, 3);
+INSERT IGNORE INTO pets VALUES (5, 'Iggy', '2000-11-30', 3, 4);
+INSERT IGNORE INTO pets VALUES (6, 'George', '2000-01-20', 4, 5);
+INSERT IGNORE INTO pets VALUES (7, 'Samantha', '1995-09-04', 1, 6);
+INSERT IGNORE INTO pets VALUES (8, 'Max', '1995-09-04', 1, 6);
+INSERT IGNORE INTO pets VALUES (9, 'Lucky', '1999-08-06', 5, 7);
+INSERT IGNORE INTO pets VALUES (10, 'Mulligan', '1997-02-24', 2, 8);
+INSERT IGNORE INTO pets VALUES (11, 'Freddy', '2000-03-09', 5, 9);
+INSERT IGNORE INTO pets VALUES (12, 'Lucky', '2000-06-24', 2, 10);
+INSERT IGNORE INTO pets VALUES (13, 'Sly', '2002-06-08', 1, 10);
+
+INSERT IGNORE INTO visits VALUES (1, 7, '2010-03-04', 'rabies shot');
+INSERT IGNORE INTO visits VALUES (2, 8, '2011-03-04', 'rabies shot');
+INSERT IGNORE INTO visits VALUES (3, 8, '2009-06-04', 'neutered');
+INSERT IGNORE INTO visits VALUES (4, 7, '2008-09-04', 'spayed');
diff --git a/build/resources/main/db/mysql/petclinic_db_setup_mysql.txt b/build/resources/main/db/mysql/petclinic_db_setup_mysql.txt
new file mode 100644
index 000000000..29bb601fe
--- /dev/null
+++ b/build/resources/main/db/mysql/petclinic_db_setup_mysql.txt
@@ -0,0 +1,32 @@
+================================================================================
+=== Spring PetClinic sample application - MySQL Configuration ===
+================================================================================
+
+@author Sam Brannen
+@author Costin Leau
+@author Dave Syer
+
+--------------------------------------------------------------------------------
+
+1) Download and install the MySQL database (e.g., MySQL Community Server 5.1.x),
+ which can be found here: https://dev.mysql.com/downloads/. Or run the
+ "docker-compose.yml" from the root of the project (if you have docker installed
+ locally):
+
+ $ docker-compose up
+ ...
+ mysql_1_eedb4818d817 | MySQL init process done. Ready for start up.
+ ...
+
+2) (Once only) create the PetClinic database and user by executing the "db/mysql/user.sql"
+ scripts. You can connect to the database running in the docker container using
+ `mysql -u root -h localhost --protocol tcp`, but you don't need to run the script there
+ because the petclinic user is already set up if you use the provided `docker-compose.yaml`.
+
+3) Run the app with `spring.profiles.active=mysql` (e.g. as a System property via the command
+ line, but any way that sets that property in a Spring Boot app should work).
+
+N.B. the "petclinic" database has to exist for the app to work with the JDBC URL value
+as it is configured by default. This condition is taken care of automatically by the
+docker-compose configuration provided, or by the `user.sql` script if you run that as
+root.
diff --git a/build/resources/main/db/mysql/schema.sql b/build/resources/main/db/mysql/schema.sql
new file mode 100644
index 000000000..eb5d7d5d0
--- /dev/null
+++ b/build/resources/main/db/mysql/schema.sql
@@ -0,0 +1,55 @@
+CREATE TABLE IF NOT EXISTS vets (
+ id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ first_name VARCHAR(30),
+ last_name VARCHAR(30),
+ INDEX(last_name)
+) engine=InnoDB;
+
+CREATE TABLE IF NOT EXISTS specialties (
+ id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ name VARCHAR(80),
+ INDEX(name)
+) engine=InnoDB;
+
+CREATE TABLE IF NOT EXISTS vet_specialties (
+ vet_id INT(4) UNSIGNED NOT NULL,
+ specialty_id INT(4) UNSIGNED NOT NULL,
+ FOREIGN KEY (vet_id) REFERENCES vets(id),
+ FOREIGN KEY (specialty_id) REFERENCES specialties(id),
+ UNIQUE (vet_id,specialty_id)
+) engine=InnoDB;
+
+CREATE TABLE IF NOT EXISTS types (
+ id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ name VARCHAR(80),
+ INDEX(name)
+) engine=InnoDB;
+
+CREATE TABLE IF NOT EXISTS owners (
+ id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ first_name VARCHAR(30),
+ last_name VARCHAR(30),
+ address VARCHAR(255),
+ city VARCHAR(80),
+ telephone VARCHAR(20),
+ INDEX(last_name)
+) engine=InnoDB;
+
+CREATE TABLE IF NOT EXISTS pets (
+ id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ name VARCHAR(30),
+ birth_date DATE,
+ type_id INT(4) UNSIGNED NOT NULL,
+ owner_id INT(4) UNSIGNED NOT NULL,
+ INDEX(name),
+ FOREIGN KEY (owner_id) REFERENCES owners(id),
+ FOREIGN KEY (type_id) REFERENCES types(id)
+) engine=InnoDB;
+
+CREATE TABLE IF NOT EXISTS visits (
+ id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ pet_id INT(4) UNSIGNED NOT NULL,
+ visit_date DATE,
+ description VARCHAR(255),
+ FOREIGN KEY (pet_id) REFERENCES pets(id)
+) engine=InnoDB;
diff --git a/build/resources/main/db/mysql/user.sql b/build/resources/main/db/mysql/user.sql
new file mode 100644
index 000000000..60abcee72
--- /dev/null
+++ b/build/resources/main/db/mysql/user.sql
@@ -0,0 +1,7 @@
+CREATE DATABASE IF NOT EXISTS petclinic;
+
+ALTER DATABASE petclinic
+ DEFAULT CHARACTER SET utf8
+ DEFAULT COLLATE utf8_general_ci;
+
+GRANT ALL PRIVILEGES ON petclinic.* TO 'petclinic@%' IDENTIFIED BY 'petclinic';
diff --git a/build/resources/main/messages/messages.properties b/build/resources/main/messages/messages.properties
new file mode 100644
index 000000000..173417a10
--- /dev/null
+++ b/build/resources/main/messages/messages.properties
@@ -0,0 +1,8 @@
+welcome=Welcome
+required=is required
+notFound=has not been found
+duplicate=is already in use
+nonNumeric=must be all numeric
+duplicateFormSubmission=Duplicate form submission is not allowed
+typeMismatch.date=invalid date
+typeMismatch.birthDate=invalid date
diff --git a/build/resources/main/messages/messages_de.properties b/build/resources/main/messages/messages_de.properties
new file mode 100644
index 000000000..124bee48b
--- /dev/null
+++ b/build/resources/main/messages/messages_de.properties
@@ -0,0 +1,8 @@
+welcome=Willkommen
+required=muss angegeben werden
+notFound=wurde nicht gefunden
+duplicate=ist bereits vergeben
+nonNumeric=darf nur numerisch sein
+duplicateFormSubmission=Wiederholtes Absenden des Formulars ist nicht erlaubt
+typeMismatch.date=ungültiges Datum
+typeMismatch.birthDate=ungültiges Datum
diff --git a/build/resources/main/messages/messages_en.properties b/build/resources/main/messages/messages_en.properties
new file mode 100644
index 000000000..05d519bb8
--- /dev/null
+++ b/build/resources/main/messages/messages_en.properties
@@ -0,0 +1 @@
+# This file is intentionally empty. Message look-ups will fall back to the default "messages.properties" file.
\ No newline at end of file
diff --git a/build/resources/main/messages/messages_es.properties b/build/resources/main/messages/messages_es.properties
new file mode 100644
index 000000000..33ee867b5
--- /dev/null
+++ b/build/resources/main/messages/messages_es.properties
@@ -0,0 +1,8 @@
+welcome=Bienvenido
+required=Es requerido
+notFound=No ha sido encontrado
+duplicate=Ya se encuentra en uso
+nonNumeric=Sólo debe contener numeros
+duplicateFormSubmission=No se permite el envÃo de formularios duplicados
+typeMismatch.date=Fecha invalida
+typeMismatch.birthDate=Fecha invalida
diff --git a/build/resources/main/static/resources/fonts/montserrat-webfont.eot b/build/resources/main/static/resources/fonts/montserrat-webfont.eot
new file mode 100644
index 000000000..0caea9169
Binary files /dev/null and b/build/resources/main/static/resources/fonts/montserrat-webfont.eot differ
diff --git a/build/resources/main/static/resources/fonts/montserrat-webfont.svg b/build/resources/main/static/resources/fonts/montserrat-webfont.svg
new file mode 100644
index 000000000..7bd96bdfd
--- /dev/null
+++ b/build/resources/main/static/resources/fonts/montserrat-webfont.svg
@@ -0,0 +1,1283 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build/resources/main/static/resources/fonts/montserrat-webfont.ttf b/build/resources/main/static/resources/fonts/montserrat-webfont.ttf
new file mode 100644
index 000000000..9953fe62e
Binary files /dev/null and b/build/resources/main/static/resources/fonts/montserrat-webfont.ttf differ
diff --git a/build/resources/main/static/resources/fonts/montserrat-webfont.woff b/build/resources/main/static/resources/fonts/montserrat-webfont.woff
new file mode 100644
index 000000000..eb49333f7
Binary files /dev/null and b/build/resources/main/static/resources/fonts/montserrat-webfont.woff differ
diff --git a/build/resources/main/static/resources/fonts/varela_round-webfont.eot b/build/resources/main/static/resources/fonts/varela_round-webfont.eot
new file mode 100644
index 000000000..dfee0c26e
Binary files /dev/null and b/build/resources/main/static/resources/fonts/varela_round-webfont.eot differ
diff --git a/build/resources/main/static/resources/fonts/varela_round-webfont.svg b/build/resources/main/static/resources/fonts/varela_round-webfont.svg
new file mode 100644
index 000000000..3280e2c43
--- /dev/null
+++ b/build/resources/main/static/resources/fonts/varela_round-webfont.svg
@@ -0,0 +1,7875 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build/resources/main/static/resources/fonts/varela_round-webfont.ttf b/build/resources/main/static/resources/fonts/varela_round-webfont.ttf
new file mode 100644
index 000000000..3ca066693
Binary files /dev/null and b/build/resources/main/static/resources/fonts/varela_round-webfont.ttf differ
diff --git a/build/resources/main/static/resources/fonts/varela_round-webfont.woff b/build/resources/main/static/resources/fonts/varela_round-webfont.woff
new file mode 100644
index 000000000..77ba16614
Binary files /dev/null and b/build/resources/main/static/resources/fonts/varela_round-webfont.woff differ
diff --git a/build/resources/main/static/resources/images/favicon.png b/build/resources/main/static/resources/images/favicon.png
new file mode 100644
index 000000000..1c649a3cd
Binary files /dev/null and b/build/resources/main/static/resources/images/favicon.png differ
diff --git a/build/resources/main/static/resources/images/pets.png b/build/resources/main/static/resources/images/pets.png
new file mode 100644
index 000000000..bb5cf3a34
Binary files /dev/null and b/build/resources/main/static/resources/images/pets.png differ
diff --git a/build/resources/main/static/resources/images/platform-bg.png b/build/resources/main/static/resources/images/platform-bg.png
new file mode 100644
index 000000000..512185839
Binary files /dev/null and b/build/resources/main/static/resources/images/platform-bg.png differ
diff --git a/build/resources/main/static/resources/images/spring-logo-dataflow-mobile.png b/build/resources/main/static/resources/images/spring-logo-dataflow-mobile.png
new file mode 100644
index 000000000..45d24a6f3
Binary files /dev/null and b/build/resources/main/static/resources/images/spring-logo-dataflow-mobile.png differ
diff --git a/build/resources/main/static/resources/images/spring-logo-dataflow.png b/build/resources/main/static/resources/images/spring-logo-dataflow.png
new file mode 100644
index 000000000..ff7cdbb40
Binary files /dev/null and b/build/resources/main/static/resources/images/spring-logo-dataflow.png differ
diff --git a/build/resources/main/static/resources/images/spring-pivotal-logo.png b/build/resources/main/static/resources/images/spring-pivotal-logo.png
new file mode 100644
index 000000000..1840af274
Binary files /dev/null and b/build/resources/main/static/resources/images/spring-pivotal-logo.png differ
diff --git a/build/resources/main/templates/error.html b/build/resources/main/templates/error.html
new file mode 100644
index 000000000..b9026690e
--- /dev/null
+++ b/build/resources/main/templates/error.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+ Something happened...
+ Exception message
+
+
+
\ No newline at end of file
diff --git a/build/resources/main/templates/fragments/inputField.html b/build/resources/main/templates/fragments/inputField.html
new file mode 100644
index 000000000..c3373bea0
--- /dev/null
+++ b/build/resources/main/templates/fragments/inputField.html
@@ -0,0 +1,30 @@
+
+
+
+
+
diff --git a/build/resources/main/templates/fragments/layout.html b/build/resources/main/templates/fragments/layout.html
new file mode 100644
index 000000000..f3b207483
--- /dev/null
+++ b/build/resources/main/templates/fragments/layout.html
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ PetClinic :: a Spring Framework demonstration
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Home
+
+
+
+
+ Find owners
+
+
+
+
+ Veterinarians
+
+
+
+
+ Error
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/resources/main/templates/fragments/selectField.html b/build/resources/main/templates/fragments/selectField.html
new file mode 100644
index 000000000..438474463
--- /dev/null
+++ b/build/resources/main/templates/fragments/selectField.html
@@ -0,0 +1,29 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/build/resources/main/templates/owners/createOrUpdateOwnerForm.html b/build/resources/main/templates/owners/createOrUpdateOwnerForm.html
new file mode 100644
index 000000000..c835f8ccb
--- /dev/null
+++ b/build/resources/main/templates/owners/createOrUpdateOwnerForm.html
@@ -0,0 +1,30 @@
+
+
+
+
+ Owner
+
+
+
diff --git a/build/resources/main/templates/owners/findOwners.html b/build/resources/main/templates/owners/findOwners.html
new file mode 100644
index 000000000..134e687fd
--- /dev/null
+++ b/build/resources/main/templates/owners/findOwners.html
@@ -0,0 +1,35 @@
+
+
+
+
+ Find Owners
+
+
+
+
+ Add Owner
+
+
+
diff --git a/build/resources/main/templates/owners/ownerDetails.html b/build/resources/main/templates/owners/ownerDetails.html
new file mode 100644
index 000000000..383fa929f
--- /dev/null
+++ b/build/resources/main/templates/owners/ownerDetails.html
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+ Owner Information
+
+
+
+
+ Name
+
+
+
+ Address
+
+
+
+ City
+
+
+
+ Telephone
+
+
+
+
+ Edit
+ Owner
+ Add
+ New Pet
+
+
+
+
+ Pets and Visits
+
+
+
+
+
+
+ Name
+
+ Birth Date
+
+ Type
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/resources/main/templates/owners/ownersList.html b/build/resources/main/templates/owners/ownersList.html
new file mode 100644
index 000000000..cf489b59b
--- /dev/null
+++ b/build/resources/main/templates/owners/ownersList.html
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+ Owners
+
+
+
+
+ Name
+ Address
+ City
+ Telephone
+ Pets
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/resources/main/templates/pets/createOrUpdatePetForm.html b/build/resources/main/templates/pets/createOrUpdatePetForm.html
new file mode 100644
index 000000000..af87f3876
--- /dev/null
+++ b/build/resources/main/templates/pets/createOrUpdatePetForm.html
@@ -0,0 +1,38 @@
+
+
+
+
+
+ New
+ Pet
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build/resources/main/templates/pets/createOrUpdateVisitForm.html b/build/resources/main/templates/pets/createOrUpdateVisitForm.html
new file mode 100644
index 000000000..ddcbb9d59
--- /dev/null
+++ b/build/resources/main/templates/pets/createOrUpdateVisitForm.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+ New
+ Visit
+
+
+ Pet
+
+
+
+ Name
+ Birth Date
+ Type
+ Owner
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Previous Visits
+
+
+ Date
+ Description
+
+
+
+
+
+
+
+
+
diff --git a/build/resources/main/templates/vets/vetList.html b/build/resources/main/templates/vets/vetList.html
new file mode 100644
index 000000000..4fc961793
--- /dev/null
+++ b/build/resources/main/templates/vets/vetList.html
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+ Veterinarians
+
+
+
+
+ Name
+ Specialties
+
+
+
+
+
+ none
+
+
+
+
+
diff --git a/build/resources/main/templates/welcome.html b/build/resources/main/templates/welcome.html
new file mode 100644
index 000000000..4fa1cd328
--- /dev/null
+++ b/build/resources/main/templates/welcome.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ Welcome
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build/test-results/test/binary/output.bin b/build/test-results/test/binary/output.bin
new file mode 100644
index 000000000..e69de29bb
diff --git a/build/test-results/test/binary/output.bin.idx b/build/test-results/test/binary/output.bin.idx
new file mode 100644
index 000000000..f76dd238a
Binary files /dev/null and b/build/test-results/test/binary/output.bin.idx differ
diff --git a/build/test-results/test/binary/results.bin b/build/test-results/test/binary/results.bin
new file mode 100644
index 000000000..e69de29bb
diff --git a/build/tmp/bootJar/MANIFEST.MF b/build/tmp/bootJar/MANIFEST.MF
new file mode 100644
index 000000000..e249b9912
--- /dev/null
+++ b/build/tmp/bootJar/MANIFEST.MF
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Main-Class: org.springframework.boot.loader.JarLauncher
+Start-Class: org.springframework.samples.petclinic.PetClinicApplication
+Spring-Boot-Version: 2.1.9.RELEASE
+Spring-Boot-Classes: BOOT-INF/classes/
+Spring-Boot-Lib: BOOT-INF/lib/
+
diff --git a/build/tmp/compileJava/source-classes-mapping.txt b/build/tmp/compileJava/source-classes-mapping.txt
new file mode 100644
index 000000000..d3d7904bd
--- /dev/null
+++ b/build/tmp/compileJava/source-classes-mapping.txt
@@ -0,0 +1,50 @@
+org/springframework/samples/petclinic/vet/Vet.java
+ org.springframework.samples.petclinic.vet.Vet
+org/springframework/samples/petclinic/owner/PetController.java
+ org.springframework.samples.petclinic.owner.PetController
+org/springframework/samples/petclinic/owner/Owner.java
+ org.springframework.samples.petclinic.owner.Owner
+org/springframework/samples/petclinic/owner/PetRepository.java
+ org.springframework.samples.petclinic.owner.PetRepository
+org/springframework/samples/petclinic/model/package-info.java
+ org.springframework.samples.petclinic.model.package-info
+org/springframework/samples/petclinic/owner/OwnerController.java
+ org.springframework.samples.petclinic.owner.OwnerController
+org/springframework/samples/petclinic/vet/VetController.java
+ org.springframework.samples.petclinic.vet.VetController
+org/springframework/samples/petclinic/owner/PetTypeFormatter.java
+ org.springframework.samples.petclinic.owner.PetTypeFormatter
+org/springframework/samples/petclinic/owner/PetType.java
+ org.springframework.samples.petclinic.owner.PetType
+org/springframework/samples/petclinic/system/WelcomeController.java
+ org.springframework.samples.petclinic.system.WelcomeController
+org/springframework/samples/petclinic/owner/PetValidator.java
+ org.springframework.samples.petclinic.owner.PetValidator
+org/springframework/samples/petclinic/model/BaseEntity.java
+ org.springframework.samples.petclinic.model.BaseEntity
+org/springframework/samples/petclinic/vet/Vets.java
+ org.springframework.samples.petclinic.vet.Vets
+org/springframework/samples/petclinic/owner/Pet.java
+ org.springframework.samples.petclinic.owner.Pet
+org/springframework/samples/petclinic/PetClinicApplication.java
+ org.springframework.samples.petclinic.PetClinicApplication
+org/springframework/samples/petclinic/visit/Visit.java
+ org.springframework.samples.petclinic.visit.Visit
+org/springframework/samples/petclinic/vet/Specialty.java
+ org.springframework.samples.petclinic.vet.Specialty
+org/springframework/samples/petclinic/system/CrashController.java
+ org.springframework.samples.petclinic.system.CrashController
+org/springframework/samples/petclinic/model/NamedEntity.java
+ org.springframework.samples.petclinic.model.NamedEntity
+org/springframework/samples/petclinic/visit/VisitRepository.java
+ org.springframework.samples.petclinic.visit.VisitRepository
+org/springframework/samples/petclinic/owner/VisitController.java
+ org.springframework.samples.petclinic.owner.VisitController
+org/springframework/samples/petclinic/vet/VetRepository.java
+ org.springframework.samples.petclinic.vet.VetRepository
+org/springframework/samples/petclinic/system/CacheConfiguration.java
+ org.springframework.samples.petclinic.system.CacheConfiguration
+org/springframework/samples/petclinic/owner/OwnerRepository.java
+ org.springframework.samples.petclinic.owner.OwnerRepository
+org/springframework/samples/petclinic/model/Person.java
+ org.springframework.samples.petclinic.model.Person
diff --git a/build/tmp/compileTestJava/source-classes-mapping.txt b/build/tmp/compileTestJava/source-classes-mapping.txt
new file mode 100644
index 000000000..a774d0276
--- /dev/null
+++ b/build/tmp/compileTestJava/source-classes-mapping.txt
@@ -0,0 +1,25 @@
+org/springframework/samples/petclinic/owner/PetTypeFormatterTests.java
+ org.springframework.samples.petclinic.owner.PetTypeFormatterTests
+ org.springframework.samples.petclinic.owner.PetTypeFormatterTests$1
+ org.springframework.samples.petclinic.owner.PetTypeFormatterTests$2
+org/springframework/samples/petclinic/PetclinicIntegrationTests.java
+ org.springframework.samples.petclinic.PetclinicIntegrationTests
+org/springframework/samples/petclinic/vet/VetControllerTests.java
+ org.springframework.samples.petclinic.vet.VetControllerTests
+org/springframework/samples/petclinic/vet/VetTests.java
+ org.springframework.samples.petclinic.vet.VetTests
+org/springframework/samples/petclinic/owner/OwnerControllerTests.java
+ org.springframework.samples.petclinic.owner.OwnerControllerTests
+ org.springframework.samples.petclinic.owner.OwnerControllerTests$1
+org/springframework/samples/petclinic/model/ValidatorTests.java
+ org.springframework.samples.petclinic.model.ValidatorTests
+org/springframework/samples/petclinic/owner/VisitControllerTests.java
+ org.springframework.samples.petclinic.owner.VisitControllerTests
+org/springframework/samples/petclinic/service/ClinicServiceTests.java
+ org.springframework.samples.petclinic.service.ClinicServiceTests
+org/springframework/samples/petclinic/system/CrashControllerTests.java
+ org.springframework.samples.petclinic.system.CrashControllerTests
+org/springframework/samples/petclinic/owner/PetControllerTests.java
+ org.springframework.samples.petclinic.owner.PetControllerTests
+org/springframework/samples/petclinic/service/EntityUtils.java
+ org.springframework.samples.petclinic.service.EntityUtils
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 000000000..e708b1c02
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 000000000..be52383ef
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100644
index 000000000..4f906e0c8
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# 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
+#
+# https://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.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 000000000..107acd32c
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/pom.xml b/pom.xml
index e4e74747a..d792015b1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -304,6 +304,15 @@
false
+
+ central
+ Central Repository
+ https://repo.maven.apache.org/maven2
+ default
+
+ false
+
+
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 000000000..5b68bbdfe
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,5 @@
+/*
+ * This file was generated by the Gradle 'init' task.
+ */
+
+rootProject.name = 'spring-petclinic'