Skip to content

Commit

Permalink
Merge van branch 'origin/Development'
Browse files Browse the repository at this point in the history
Klaar voor samenstellen van release van 4.2.0
  • Loading branch information
arjan authored and arjan committed Nov 6, 2024
2 parents 509a3ec + 522196b commit c9ab200
Show file tree
Hide file tree
Showing 123 changed files with 2,768 additions and 1,557 deletions.
90 changes: 90 additions & 0 deletions .github/workflows/build-package-development.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
name: Build and Package development branch

on:
workflow_dispatch:
push:
branches:
- Development
release:
types: [created]

jobs:
build:

runs-on: ubuntu-latest
permissions:
contents: read
packages: write

steps:
- uses: actions/checkout@v3
with:
ref: Development
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
settings-path: ${{ github.workspace }} # location for the settings.xml file

- name: Maven Clean
run: mvn clean

- name: Maven Install
run: mvn install

- name: Build with Maven
run: mvn -B package --file pom.xml

- name: Extract Maven project groupId
run: echo "maven_groupId=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.groupId}' --non-recursive exec:exec)" >> "$GITHUB_ENV"
- name: Extract Maven project artifactId
run: echo "maven_artifactId=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.artifactId}' --non-recursive exec:exec)" >> "$GITHUB_ENV"
- name: Extract Maven project version
run: echo "maven_version=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)" >> "$GITHUB_ENV"

- name: Show extracted Maven project groupId, artifactId, version
run: printf '%s\n' "$maven_groupId" "$maven_artifactId" "$maven_version"

- name: Delete package or package version
uses: actions/github-script@v7
id: delete-package-version
with:
script: |
const packageName = process.env.maven_groupId + '.' + process.env.maven_artifactId
const org = context.repo.owner
const versionInfo = await github.rest.packages.getAllPackageVersionsForPackageOwnedByOrg({
package_type: 'maven',
package_name: packageName,
org: org,
})
const versions = versionInfo.data
for (const version of versions) {
if (version.name == process.env.maven_version) {
/* This version is the maven version we want to delete: */
if (versions.length == 1) {
/* This version is the last version of the package so we have to delete the complete package: */
await github.rest.packages.deletePackageForOrg({
package_type: 'maven',
package_name: packageName,
org: context.repo.owner,
});
} else {
/* Remove this version from the package: */
await github.rest.packages.deletePackageVersionForOrg({
package_type: 'maven',
package_name: packageName,
org: context.repo.owner,
package_version_id: version.id,
});
}
break;
}
}
- name: Publish to GitHub Packages Apache Maven
run: mvn deploy -s $GITHUB_WORKSPACE/settings.xml
env:
GITHUB_TOKEN: ${{ github.token }}
5 changes: 3 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>nl.imvertor</groupId>
<artifactId>imvertor</artifactId>
<version>4.1.0</version>
<version>4.2.0</version>
<name>Imvertor</name>

<description>Imvertor under Maven</description>
Expand All @@ -15,6 +15,7 @@
<!-- MSL = mozilla license, https://www.mozilla.org/en-US/MPL/2.0/ -->
<!-- ESL = Eclipse software license, http://www.eclipse.org/legal/epl-v10.html -->


<repositories>
<repository>
<id>repos-armatiek</id>
Expand Down Expand Up @@ -232,7 +233,7 @@
<artifactId>json</artifactId>
<version>20231013</version>
</dependency>

<!-- https://mvnrepository.com/artifact/de.odysseus.staxon/staxon -->
<dependency>
<groupId>de.odysseus.staxon</groupId>
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/nl/imvertor/ChainTranslateAndReport.java
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ public static void main(String[] args) {
succeeds = (new ImvertCompiler()).run();

// generate the MIM format from Imvertor embellish format
if (succeeds && configurator.isTrue("cli","createmimformat",false))
if (succeeds && (configurator.isTrue("cli","createmimformat",false) || configurator.isTrue("cli","createjsonschema",false)))
succeeds = (new MIMCompiler()).run();

// generate the Stelselcatalogus CSV
Expand Down
33 changes: 33 additions & 0 deletions src/main/java/nl/imvertor/OfficeCompiler/OfficeCompiler.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import java.util.Iterator;
import java.util.Vector;

import org.apache.commons.exec.CommandLine;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.eclipse.jgit.transport.PushResult;
Expand All @@ -36,7 +37,10 @@
import nl.imvertor.common.file.AnyFile;
import nl.imvertor.common.file.AnyFolder;
import nl.imvertor.common.file.FtpFolder;
import nl.imvertor.common.file.ZipFile;
import nl.imvertor.common.git.ResourcePusher;
import nl.imvertor.common.helper.OsExecutor;
import nl.imvertor.common.helper.OsExecutor.OsExecutorResultHandler;

public class OfficeCompiler extends Step {

Expand Down Expand Up @@ -135,6 +139,29 @@ public void generateOfficeReport() throws Exception {
// process catalog only, save as XHTML
succeeds = succeeds ? transformer.transformStep("system/cur-imvertor-filepath","properties/WORK_RESPEC_FILE", "properties/IMVERTOR_MODELDOC_RESPEC_XSLPATH") : false;
if (succeeds) processDoc(fn,"respec.catalog.xhtml","appinfo/respec-documentation-filename","properties/WORK_RESPEC_FILE","none");

// De laatste output is de XHTML catalogus; die staat centraal in documentor.
/*
// als documentor info beschikbaar is, dan uitpakken en omzetten naar xhtml met Pandoc
AnyFile docFile = new AnyFile(configurator.getXParm("cli/modeldocfile",false));
if (docFile != null) {
boolean isFolder = docFile.isDirectory();
boolean isZip = docFile.getExtension().equals("zip");
if (isZip) {
// alles uitpakken naar de workfolder
AnyFolder docFolder = new AnyFolder(configurator.getWorkFolder("modeldoc"));
ZipFile zipFile = new ZipFile(docFile);
zipFile.decompress(docFolder);
// ga door deze files heen en zet ze om naar XHTML
Iterator<String> it = docFolder.listFilesToVector(false).iterator();
while (it.hasNext()) {
AnyFile f = new AnyFile(it.next());
if (f.getExtension().equals("docx"))
succeeds = succeeds ? transformDocx(f) : false ;
}
}
}
*/
}
} else {
runner.error(logger,"No (valid) office variant specified: " + vr.toString());
Expand Down Expand Up @@ -247,4 +274,10 @@ private void passGIThub(File officeFile) throws Exception {
runner.error(logger, "Error pushing files to remote repository https://github.com" + gitpath + ": " + e.getMessage(),e);
}
}

private boolean transformDocx(AnyFile mswordFile) throws Exception {
//TODO

return true;
}
}
3 changes: 2 additions & 1 deletion src/main/java/nl/imvertor/ReleaseComparer/XmlComparer.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package nl.imvertor.ReleaseComparer;

import java.io.FileWriter;
import java.nio.charset.StandardCharsets;

import org.w3c.dom.Element;
import org.xmlunit.builder.DiffBuilder;
Expand Down Expand Up @@ -60,7 +61,7 @@ public ComparisonResult evaluate(Comparison comparison, ComparisonResult outcome
// Get differences
Iterable<Difference> differences = myDiff.getDifferences();

FileWriter myWriter = new FileWriter(resultFile);
FileWriter myWriter = new FileWriter(resultFile,StandardCharsets.UTF_8);
myWriter.write("<cmps>");

Integer count = 0;
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/nl/imvertor/XmiCompiler/XmiCompiler.java
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ public boolean run() throws Exception{
}
}

runner.info(logger,"Metamodel name is " + configurator.getXParm("appinfo/metamodel-name-and-version"));
runner.info(logger,"Metamodel name is " + configurator.getXParm("appinfo/metamodel-name-and-version",false));

configurator.setStepDone(STEP_NAME);

Expand Down Expand Up @@ -294,6 +294,7 @@ private void extractImages(XmlFile xmiFile) throws Exception {
AnyFile tempFile = new AnyFile(File.createTempFile("extractImages.", ".xmi"));
tempFile.deleteOnExit();
File imageFolder = new File(xmiFile.getParentFile(),"Images");
if (!imageFolder.exists()) imageFolder.mkdir(); // issue #553
try (FileInputStream xmiFis = new FileInputStream(xmiFile);
FileOutputStream xmiFos = new FileOutputStream(tempFile)) {
List<Image> images = exporter.export(xmiFis, xmiFos);
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/nl/imvertor/YamlCompiler/YamlCompiler.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ public boolean run() throws Exception {
generateKING();
} else if (jsonschemarules.equals("JSON-KennisnetBSM")) {
generateKING();
} else if (jsonschemarules.equals("JSON-Waarderingskamer")) {
} else if (jsonschemarules.equals("JSON-WaarderingskamerBSM")) {
generateKING();
} else if (jsonschemarules.equals("JSON-JustidBSM")) {
generateKING();
} else
runner.error(logger, "Schemarules not implemented: \"" + jsonschemarules + "\", cannot compile YAML");
Expand Down
9 changes: 8 additions & 1 deletion src/main/java/nl/imvertor/common/Configurator.java
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,8 @@ public class Configurator {
private XparmLogger xParmLogger; // keeps track of the sequence of parameters set by the chain. A debugging tool.
private XsltCallLogger xsltCallLogger; // keeps track of the XSLT calls. A debugging tool.

private Integer maxWarnings = 1000;

private Configurator() {

runner = new Runner();
Expand Down Expand Up @@ -208,7 +210,8 @@ private Configurator() {
String ee = getServerProperty("ea.enabled"); // true or false; false typically on server environment; see redmine #487932
eaEnabled = (ee == null || !ee.equals("false"));


String mw = getServerProperty("max.warnings", false);
maxWarnings = (mw != null) ? Integer.parseInt(mw) : 1000;

} catch (Exception e) {
System.err.println("Invalid configuration: " + e.getMessage());
Expand Down Expand Up @@ -1367,6 +1370,10 @@ public Integer getRunMode() {
public boolean isEaEnabled() {
return eaEnabled;
}

public Integer maxWarnings() {
return maxWarnings;
}
/**
* Merge parameters into a string, parameters taken by default from appinfo section of the parms.xml; otherwise use [group/name] syntax.
*
Expand Down
38 changes: 25 additions & 13 deletions src/main/java/nl/imvertor/common/Messenger.java
Original file line number Diff line number Diff line change
Expand Up @@ -146,23 +146,35 @@ public void write(Item item) {
*/
public void writeMsg(String src, String type, String name, String text, String id, String wiki) {
if (exists(src) && exists(type) && exists(text)) {
Integer mw = Configurator.getInstance().maxWarnings();
XMLConfiguration cfg = Configurator.getInstance().getXmlConfiguration();
if (cfg != null) {
int messageIndex = cfg.getMaxIndex("messages/message") + 2; // -1 when no messages.
cfg.addProperty("messages/message", "");
cfg.addProperty("messages/message[" + messageIndex + "]/src", src);
cfg.addProperty("messages/message[" + messageIndex + "]/type", type);
cfg.addProperty("messages/message[" + messageIndex + "]/name", name);
cfg.addProperty("messages/message[" + messageIndex + "]/text", text);
// split up the message
Matcher m = messagePattern.matcher(text);
if (m.matches()) {
cfg.addProperty("messages/message[" + messageIndex + "]/stepname", m.group(1));
cfg.addProperty("messages/message[" + messageIndex + "]/stepconstruct", m.group(2));
cfg.addProperty("messages/message[" + messageIndex + "]/steptext", m.group(3));
if (messageIndex == (mw + 1) && type.equals("WARNING")) {
cfg.addProperty("messages/message", "");
cfg.addProperty("messages/message[" + messageIndex + "]/src", "/system");
cfg.addProperty("messages/message[" + messageIndex + "]/type", "WARNING");
cfg.addProperty("messages/message[" + messageIndex + "]/name", name);
cfg.addProperty("messages/message[" + messageIndex + "]/text", "More than "+ mw +" warnings, skipping remainder");
return;
} else if (messageIndex > (mw + 1) && type.equals("WARNING"))
return;
else {
cfg.addProperty("messages/message", "");
cfg.addProperty("messages/message[" + messageIndex + "]/src", src);
cfg.addProperty("messages/message[" + messageIndex + "]/type", type);
cfg.addProperty("messages/message[" + messageIndex + "]/name", name);
cfg.addProperty("messages/message[" + messageIndex + "]/text", text);
// split up the message
Matcher m = messagePattern.matcher(text);
if (m.matches()) {
cfg.addProperty("messages/message[" + messageIndex + "]/stepname", m.group(1));
cfg.addProperty("messages/message[" + messageIndex + "]/stepconstruct", m.group(2));
cfg.addProperty("messages/message[" + messageIndex + "]/steptext", m.group(3));
}
if (id != null) cfg.addProperty("messages/message[" + messageIndex + "]/id", id);
cfg.addProperty("messages/message[" + messageIndex + "]/wiki", (wiki != null) ? wiki : "NOWIKI");
}
if (id != null) cfg.addProperty("messages/message[" + messageIndex + "]/id", id);
cfg.addProperty("messages/message[" + messageIndex + "]/wiki", (wiki != null) ? wiki : "NOWIKI");
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/nl/imvertor/common/Transformer.java
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ public boolean transform(File infile, File outfile, File xslfile, String alias)

String task = "Transforming";

configurator.getRunner().debug(logger,"CHAIN",task + " " + infile.getCanonicalPath() + " using " + xslfile.getName());
configurator.getRunner().debug(logger,"CHAIN",task + " " + (new AnyFile(infile)).getRelativePath(configurator.getWorkFolder()) + " using " + (new AnyFile(xslfile)).getRelativePath(configurator.getBaseFolder()));

stylesheetIdentifier = Configurator.getStylesheetIdentifier(xslfile);

Expand Down
23 changes: 17 additions & 6 deletions src/main/resources/cfg/OfficeCompiler/parms.xml
Original file line number Diff line number Diff line change
Expand Up @@ -153,11 +153,11 @@
<IMVERTOR_METAMODEL_KING-MIM-11-SIM_MODELDOC_MSWORD_XSLPATH alias="ITO">Imvert2modeldoc-KING-MIM-11-SIM-html-msword.xsl</IMVERTOR_METAMODEL_KING-MIM-11-SIM_MODELDOC_MSWORD_XSLPATH>
<IMVERTOR_METAMODEL_KING-MIM-11-SIM_MODELDOC_RESPEC_XSLPATH alias="ITO">Imvert2modeldoc-KING-MIM-11-SIM-html-respec.xsl</IMVERTOR_METAMODEL_KING-MIM-11-SIM_MODELDOC_RESPEC_XSLPATH>

<IMVERTOR_METAMODEL_KING-MUG-11-UGM_MODELDOC_XSLPATH alias="ITO">Imvert2modeldoc-KING-MUG-11-UGM.xsl</IMVERTOR_METAMODEL_KING-MUG-11-UGM_MODELDOC_XSLPATH>
<IMVERTOR_METAMODEL_KING-MUG-11-UGM_MODELDOC_MSWORD_XSLPATH alias="ITO">Imvert2modeldoc-KING-MUG-11-UGM-html-msword.xsl</IMVERTOR_METAMODEL_KING-MUG-11-UGM_MODELDOC_MSWORD_XSLPATH>
<IMVERTOR_METAMODEL_KING-MBG-11-UGM_MODELDOC_XSLPATH alias="ITO">Imvert2modeldoc-KING-MBG-11-UGM.xsl</IMVERTOR_METAMODEL_KING-MBG-11-UGM_MODELDOC_XSLPATH>
<IMVERTOR_METAMODEL_KING-MBG-11-UGM_MODELDOC_MSWORD_XSLPATH alias="ITO">Imvert2modeldoc-KING-MBG-11-UGM-html-msword.xsl</IMVERTOR_METAMODEL_KING-MBG-11-UGM_MODELDOC_MSWORD_XSLPATH>

<IMVERTOR_METAMODEL_KING-MUG-11-BSM_MODELDOC_XSLPATH alias="ITO">Imvert2modeldoc-KING-MUG-11-BSM.xsl</IMVERTOR_METAMODEL_KING-MUG-11-BSM_MODELDOC_XSLPATH>
<IMVERTOR_METAMODEL_KING-MUG-11-BSM_MODELDOC_MSWORD_XSLPATH alias="ITO">Imvert2modeldoc-KING-MUG-11-BSM-html-msword.xsl</IMVERTOR_METAMODEL_KING-MUG-11-BSM_MODELDOC_MSWORD_XSLPATH>
<IMVERTOR_METAMODEL_KING-MBG-11-BSM_MODELDOC_XSLPATH alias="ITO">Imvert2modeldoc-KING-MBG-11-BSM.xsl</IMVERTOR_METAMODEL_KING-MBG-11-BSM_MODELDOC_XSLPATH>
<IMVERTOR_METAMODEL_KING-MBG-11-BSM_MODELDOC_MSWORD_XSLPATH alias="ITO">Imvert2modeldoc-KING-MBG-11-BSM-html-msword.xsl</IMVERTOR_METAMODEL_KING-MBG-11-BSM_MODELDOC_MSWORD_XSLPATH>

<?X
<!-- VNGR MIM 1.1 variant -->
Expand All @@ -172,6 +172,17 @@
<IMVERTOR_METAMODEL_VNGRBSM_MODELDOC_MSWORD_XSLPATH alias="ITO">Imvert2modeldoc-KINGUGM-html-msword.xsl</IMVERTOR_METAMODEL_VNGRBSM_MODELDOC_MSWORD_XSLPATH>
X?>

<!-- Justid -->
<IMVERTOR_METAMODEL_Justid-MIM-11-SIM_MODELDOC_XSLPATH alias="ITO">Imvert2modeldoc-KING-MIM-11-SIM.xsl</IMVERTOR_METAMODEL_Justid-MIM-11-SIM_MODELDOC_XSLPATH>
<IMVERTOR_METAMODEL_Justid-MIM-11-SIM_MODELDOC_MSWORD_XSLPATH alias="ITO">Imvert2modeldoc-KING-MIM-11-SIM-html-msword.xsl</IMVERTOR_METAMODEL_Justid-MIM-11-SIM_MODELDOC_MSWORD_XSLPATH>
<IMVERTOR_METAMODEL_Justid-MIM-11-SIM_MODELDOC_RESPEC_XSLPATH alias="ITO">Imvert2modeldoc-KING-MIM-11-SIM-html-respec.xsl</IMVERTOR_METAMODEL_Justid-MIM-11-SIM_MODELDOC_RESPEC_XSLPATH>

<IMVERTOR_METAMODEL_Justid-MBG-11-UGM_MODELDOC_XSLPATH alias="ITO">Imvert2modeldoc-KING-MBG-11-UGM.xsl</IMVERTOR_METAMODEL_Justid-MBG-11-UGM_MODELDOC_XSLPATH>
<IMVERTOR_METAMODEL_Justid-MBG-11-UGM_MODELDOC_MSWORD_XSLPATH alias="ITO">Imvert2modeldoc-KING-MBG-11-UGM-html-msword.xsl</IMVERTOR_METAMODEL_Justid-MBG-11-UGM_MODELDOC_MSWORD_XSLPATH>

<IMVERTOR_METAMODEL_Justid-MBG-11-BSM_MODELDOC_XSLPATH alias="ITO">Imvert2modeldoc-KING-MBG-11-BSM.xsl</IMVERTOR_METAMODEL_Justid-MBG-11-BSM_MODELDOC_XSLPATH>
<IMVERTOR_METAMODEL_Justid-MBG-11-BSM_MODELDOC_MSWORD_XSLPATH alias="ITO">Imvert2modeldoc-KING-MBG-11-BSM-html-msword.xsl</IMVERTOR_METAMODEL_Justid-MBG-11-BSM_MODELDOC_MSWORD_XSLPATH>

<!-- IHW -->
<IMVERTOR_METAMODEL_IHW-MIM-11-CONCEPTUAL_MODELDOC_XSLPATH alias="ITO">Imvert2modeldoc-IHW-MIM-11-CONCEPTUAL.xsl</IMVERTOR_METAMODEL_IHW-MIM-11-CONCEPTUAL_MODELDOC_XSLPATH>
<IMVERTOR_METAMODEL_IHW-MIM-11-CONCEPTUAL_MODELDOC_XSLPATH_2 alias="ITO">Imvert2modeldoc-IHW-MIM-11-CONCEPTUAL-POSTPROC.xsl</IMVERTOR_METAMODEL_IHW-MIM-11-CONCEPTUAL_MODELDOC_XSLPATH_2>
Expand All @@ -198,8 +209,8 @@
<IMVERTOR_METAMODEL_Kennisnet-MIM-11-SIM_MODELDOC_XSLPATH alias="ITO">Imvert2modeldoc-Kennisnet-MIM-11-SIM.xsl</IMVERTOR_METAMODEL_Kennisnet-MIM-11-SIM_MODELDOC_XSLPATH>
<IMVERTOR_METAMODEL_Kennisnet-MIM-11-SIM_MODELDOC_RESPEC_XSLPATH alias="ITO">Imvert2modeldoc-Kennisnet-MIM-11-SIM-html-respec.xsl</IMVERTOR_METAMODEL_Kennisnet-MIM-11-SIM_MODELDOC_RESPEC_XSLPATH>

<IMVERTOR_METAMODEL_Kennisnet-MUG-10-UGM_MODELDOC_XSLPATH alias="ITO">Imvert2modeldoc-Kennisnet-MUG-10-UGM.xsl</IMVERTOR_METAMODEL_Kennisnet-MUG-10-UGM_MODELDOC_XSLPATH>
<IMVERTOR_METAMODEL_Kennisnet-MUG-10-UGM_MODELDOC_RESPEC_XSLPATH alias="ITO">Imvert2modeldoc-Kennisnet-MUG-10-UGM-html-respec.xsl</IMVERTOR_METAMODEL_Kennisnet-MUG-10-UGM_MODELDOC_RESPEC_XSLPATH>
<IMVERTOR_METAMODEL_Kennisnet-MBG-10-UGM_MODELDOC_XSLPATH alias="ITO">Imvert2modeldoc-Kennisnet-MBG-10-UGM.xsl</IMVERTOR_METAMODEL_Kennisnet-MBG-10-UGM_MODELDOC_XSLPATH>
<IMVERTOR_METAMODEL_Kennisnet-MBG-10-UGM_MODELDOC_RESPEC_XSLPATH alias="ITO">Imvert2modeldoc-Kennisnet-MBG-10-UGM-html-respec.xsl</IMVERTOR_METAMODEL_Kennisnet-MBG-10-UGM_MODELDOC_RESPEC_XSLPATH>

<IMVERTOR_METAMODEL_Kennisnet-MBG-10-BSM_MODELDOC_XSLPATH alias="ITO">Imvert2modeldoc-Kennisnet-MBG-10-BSM.xsl</IMVERTOR_METAMODEL_Kennisnet-MBG-10-BSM_MODELDOC_XSLPATH>
<IMVERTOR_METAMODEL_Kennisnet-MBG-10-BSM_MODELDOC_RESPEC_XSLPATH alias="ITO">Imvert2modeldoc-Kennisnet-MBG-10-BSM-html-respec.xsl</IMVERTOR_METAMODEL_Kennisnet-MBG-10-BSM_MODELDOC_RESPEC_XSLPATH>
Expand Down
Loading

0 comments on commit c9ab200

Please sign in to comment.