From b7122fd4919010bf259150c6730b700213919be3 Mon Sep 17 00:00:00 2001 From: "g.sartori" Date: Tue, 17 Dec 2024 18:08:24 +0100 Subject: [PATCH 1/2] chore: fix Grails install link --- INSTALL | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL b/INSTALL index e245e795147..2f5555122e4 100644 --- a/INSTALL +++ b/INSTALL @@ -1 +1 @@ -For installation instructions see the manual in the docs subdirectory or online at . +For installation instructions see . From 7ca107599a47943187e4e19194284a5904a60059 Mon Sep 17 00:00:00 2001 From: "g.sartori" Date: Tue, 17 Dec 2024 18:08:45 +0100 Subject: [PATCH 2/2] New banner, 78 fixed cols, displays by default --- .../src/main/resources/grails-banner.txt | 25 ++--- .../main/groovy/grails/boot/GrailsApp.groovy | 93 ++++++++----------- .../groovy/grails/core/GrailsApplication.java | 4 +- 3 files changed, 52 insertions(+), 70 deletions(-) diff --git a/grails-bootstrap/src/main/resources/grails-banner.txt b/grails-bootstrap/src/main/resources/grails-banner.txt index 8bf0aba7b80..f755405f5c4 100644 --- a/grails-bootstrap/src/main/resources/grails-banner.txt +++ b/grails-bootstrap/src/main/resources/grails-banner.txt @@ -1,16 +1,9 @@ -${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} -${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} -${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} -${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} -${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}#${AnsiColor.BLACK} ${AnsiColor.GREEN}8${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} -${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}o${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}#${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} -${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} -${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} -${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}:${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} -${AnsiColor.BLACK}.${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}&${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@ -${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@ -${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} -${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}8${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} -${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} -${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.GREEN}@${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} ${AnsiColor.BLACK} -${AnsiColor.DEFAULT} \ No newline at end of file + +> < +> ____ _ _ < +> / ___|_ __ __ _(_) |___ < +> | | _| '__/ _` | | / __| < +> | |_| | | | (_| | | \__ \ < +> \____|_| \__,_|_|_|___/ < +> https://grails.org < +> < diff --git a/grails-core/src/main/groovy/grails/boot/GrailsApp.groovy b/grails-core/src/main/groovy/grails/boot/GrailsApp.groovy index 09a918a8b02..b4a5df9fbb6 100644 --- a/grails-core/src/main/groovy/grails/boot/GrailsApp.groovy +++ b/grails-core/src/main/groovy/grails/boot/GrailsApp.groovy @@ -21,10 +21,8 @@ import org.grails.io.watch.DirectoryWatcher import org.grails.io.watch.FileExtensionFileChangeListener import org.grails.plugins.BinaryGrailsPlugin import org.grails.plugins.support.WatchPattern -import org.springframework.boot.Banner import org.springframework.boot.ResourceBanner import org.springframework.boot.SpringApplication -import org.springframework.boot.context.event.ApplicationPreparedEvent import org.springframework.boot.web.context.WebServerApplicationContext import org.springframework.context.ConfigurableApplicationContext import org.springframework.core.env.ConfigurableEnvironment @@ -36,12 +34,11 @@ import java.util.concurrent.ConcurrentLinkedQueue /** * Extends the {@link SpringApplication} with reloading behavior and other Grails features * - * * @author Graeme Rocher * @since 3.0 */ -@CompileStatic @Slf4j +@CompileStatic class GrailsApp extends SpringApplication { private static final String GRAILS_BANNER = 'grails-banner.txt' @@ -64,7 +61,6 @@ class GrailsApp extends SpringApplication { */ GrailsApp(Class... sources) { super(sources) - bannerMode = Banner.Mode.OFF } /** @@ -79,7 +75,6 @@ class GrailsApp extends SpringApplication { */ GrailsApp(ResourceLoader resourceLoader, Class... sources) { super(resourceLoader, sources) - bannerMode = Banner.Mode.OFF } @Override @@ -91,11 +86,12 @@ class GrailsApp extends SpringApplication { log.debug("Application directory discovered as: {}", IOUtils.findApplicationDirectory()) log.debug("Current base directory is [{}]. Reloading base directory is [{}]", new File("."), BuildSettings.BASE_DIR) - if(environment.isReloadEnabled()) { + if (environment.isReloadEnabled()) { log.debug("Reloading status: {}", environment.isReloadEnabled()) enableDevelopmentModeWatch(environment, applicationContext) environment.isDevtoolsRestart() } + printRunStatus(applicationContext) return applicationContext } @@ -106,7 +102,7 @@ class GrailsApp extends SpringApplication { setAllowCircularReferences(true) ConfigurableApplicationContext applicationContext = super.createApplicationContext() - if(enableBeanCreationProfiler) { + if (enableBeanCreationProfiler) { def processor = new BeanCreationProfilingPostProcessor() applicationContext.getBeanFactory().addBeanPostProcessor(processor) applicationContext.addApplicationListener(processor) @@ -132,7 +128,7 @@ class GrailsApp extends SpringApplication { protected void enableDevelopmentModeWatch(Environment environment, ConfigurableApplicationContext applicationContext, String... args) { def location = environment.getReloadLocation() - if(location) { + if (location) { directoryWatcher = new DirectoryWatcher() Queue changedFiles = new ConcurrentLinkedQueue<>() @@ -147,9 +143,9 @@ class GrailsApp extends SpringApplication { @Override void onNew(File file, List extensions) { changedFiles << file.canonicalFile - // For some bizarro reason Windows fires onNew events even for files that have + // For some bizarre reason Windows fires onNew events even for files that have // just been modified and not created - if(System.getProperty("os.name").toLowerCase().indexOf("windows") != -1) { + if (System.getProperty("os.name").toLowerCase().indexOf("windows") != -1) { return } newFiles << file.canonicalFile @@ -163,35 +159,34 @@ class GrailsApp extends SpringApplication { File baseDir = new File(location).canonicalFile String baseDirPath = baseDir.canonicalPath List watchBaseDirectories = [baseDir] - for(GrailsPlugin plugin in pluginManager.allPlugins) { - if(plugin instanceof BinaryGrailsPlugin) { - BinaryGrailsPlugin binaryGrailsPlugin = (BinaryGrailsPlugin)plugin + for (GrailsPlugin plugin in pluginManager.allPlugins) { + if (plugin instanceof BinaryGrailsPlugin) { + BinaryGrailsPlugin binaryGrailsPlugin = (BinaryGrailsPlugin) plugin def pluginDirectory = binaryGrailsPlugin.projectDirectory - if(pluginDirectory != null) { + if (pluginDirectory != null) { watchBaseDirectories << pluginDirectory } } } - for(dir in watchBaseDirectories) { + for (dir in watchBaseDirectories) { configureDirectoryWatcher(directoryWatcher, dir.absolutePath) } - for(GrailsPlugin plugin in pluginManager.allPlugins) { + for (GrailsPlugin plugin in pluginManager.allPlugins) { def watchedResourcePatterns = plugin.getWatchedResourcePatterns() - if(watchedResourcePatterns != null) { + if (watchedResourcePatterns != null) { - for(WatchPattern wp in new ArrayList(watchedResourcePatterns)) { + for (WatchPattern wp in new ArrayList(watchedResourcePatterns)) { boolean first = true - for(watchBase in watchBaseDirectories) { - if(!first) { - if(wp.file != null) { + for (watchBase in watchBaseDirectories) { + if (!first) { + if (wp.file != null) { String relativePath = wp.file.canonicalPath - baseDirPath File watchFile = new File(watchBase, relativePath) // the base project will already been in the list of watch patterns, but we add any subprojects here plugin.watchedResourcePatterns.add(new WatchPattern(file: watchFile, extension: wp.extension)) - } - else if(wp.directory != null) { + } else if (wp.directory != null) { String relativePath = wp.directory.canonicalPath - baseDirPath File watchDir = new File(watchBase, relativePath) // the base project will already been in the list of watch patterns, but we add any subprojects here @@ -199,12 +194,11 @@ class GrailsApp extends SpringApplication { } } first = false - if(wp.file) { + if (wp.file) { String relativePath = wp.file.canonicalPath - baseDirPath def resolvedPath = new File(watchBase, relativePath) directoryWatcher.addWatchFile(resolvedPath) - } - else if(wp.directory && wp.extension) { + } else if (wp.directory && wp.extension) { String relativePath = wp.directory.canonicalPath - baseDirPath def resolvedPath = new File(watchBase, relativePath) directoryWatcher.addWatchDirectory(resolvedPath, wp.extension) @@ -220,36 +214,34 @@ class GrailsApp extends SpringApplication { CompilerConfiguration compilerConfig = new CompilerConfiguration() compilerConfig.setTargetDirectory(new File(location, BuildSettings.BUILD_CLASSES_PATH)) - while(isDevelopmentModeActive()) { + while (isDevelopmentModeActive()) { // Workaround for some IDE / OS combos - 2 events (new + update) for the same file def uniqueChangedFiles = changedFiles as Set def i = uniqueChangedFiles.size() try { - if(i > 1) { + if (i > 1) { changedFiles.clear() - for(f in uniqueChangedFiles) { + for (f in uniqueChangedFiles) { recompile(f, compilerConfig, location) - if(newFiles.contains(f)) { + if (newFiles.contains(f)) { newFiles.remove(f) } pluginManager.informOfFileChange(f) sleep 1000 } - } - else if(i == 1) { + } else if (i == 1) { changedFiles.clear() def changedFile = uniqueChangedFiles[0] changedFile = changedFile.canonicalFile // Groovy files within the 'conf' directory are not compiled String confPath = "${File.separator}grails-app${File.separator}conf${File.separator}" - if(changedFile.path.contains(confPath)) { + if (changedFile.path.contains(confPath)) { pluginManager.informOfFileChange(changedFile) - } - else { + } else { recompile(changedFile, compilerConfig, location) - if(newFiles.contains(changedFile)) { + if (newFiles.contains(changedFile)) { newFiles.remove(changedFile) } pluginManager.informOfFileChange(changedFile) @@ -261,7 +253,7 @@ class GrailsApp extends SpringApplication { log.error("Compilation Error: $cfe.message", cfe) } - sleep 1000 + sleep(1000) } } @@ -275,7 +267,7 @@ class GrailsApp extends SpringApplication { static void setDevelopmentModeActive(boolean active) { developmentModeActive = active - if(directoryWatcher != null) { + if (directoryWatcher != null) { directoryWatcher.active = active } } @@ -289,22 +281,19 @@ class GrailsApp extends SpringApplication { if (changedPath.contains(grailsAppDir)) { appDir = new File(changedPath.substring(0, changedPath.indexOf(grailsAppDir))) - } - else if(changedPath.contains(sourceMainGroovy)) { + } else if (changedPath.contains(sourceMainGroovy)) { appDir = new File(changedPath.substring(0, changedPath.indexOf(sourceMainGroovy))) } def baseFileLocation = appDir?.absolutePath ?: location compilerConfig.setTargetDirectory(new File(baseFileLocation, BuildSettings.BUILD_CLASSES_PATH)) println "File $changedFile changed, recompiling..." - if(changedFile.name.endsWith('.java')) { - if(JavaCompiler.isAvailable()) { + if (changedFile.name.endsWith('.java')) { + if (JavaCompiler.isAvailable()) { JavaCompiler.recompile(compilerConfig, changedFile) - } - else { + } else { log.error("Cannot recompile [$changedFile.name], the current JVM is not a JDK (recompilation will not work on a JRE missing the compiler APIs).") } - } - else { + } else { compileGroovyFile(compilerConfig, changedFile) } } @@ -332,14 +321,14 @@ class GrailsApp extends SpringApplication { return new DirectoryWatcher.FileChangeListener() { @Override void onChange(File file) { - if(!file.name.endsWith('.groovy') && !file.name.endsWith('.java')) { + if (!file.name.endsWith('.groovy') && !file.name.endsWith('.java')) { pluginManager.informOfFileChange(file) } } @Override void onNew(File file) { - if(!file.name.endsWith('.groovy') && !file.name.endsWith('.java')) { + if (!file.name.endsWith('.groovy') && !file.name.endsWith('.java')) { pluginManager.informOfFileChange(file) } } @@ -363,8 +352,8 @@ class GrailsApp extends SpringApplication { port = applicationContext.webServer.port } println("Grails application running at ${protocol}://${hostName}:${port}${contextPath} in environment: ${Environment.current.name}") - } catch (e) { - // ignore + + } catch (ignore) { } } @@ -376,7 +365,7 @@ class GrailsApp extends SpringApplication { * @return the running {@link org.springframework.context.ApplicationContext} */ static ConfigurableApplicationContext run(Class source, String... args) { - return run([ source ] as Class[], args) + return run([source] as Class[], args) } /** diff --git a/grails-core/src/main/groovy/grails/core/GrailsApplication.java b/grails-core/src/main/groovy/grails/core/GrailsApplication.java index 5c690e0c8d0..2d615f93d11 100644 --- a/grails-core/src/main/groovy/grails/core/GrailsApplication.java +++ b/grails-core/src/main/groovy/grails/core/GrailsApplication.java @@ -30,11 +30,11 @@ * main purpose is to provide a mechanism for analysing the conventions within a Grails * application as well as providing metadata and information about the execution environment. * - *

The GrailsApplication interface interfacts with {@link ArtefactHandler} instances + *

The GrailsApplication interface interacts with {@link ArtefactHandler} instances * which are capable of analysing different artefact types (controllers, domain classes etc.) and introspecting * the artefact conventions * - *

Implementors of this inteface should be aware that a GrailsApplication is only initialised when the initialise() method + *

Implementors of this interface should be aware that a GrailsApplication is only initialised when the initialise() method * is called. In other words GrailsApplication instances are lazily initialised by the Grails runtime. * * @see #initialise()