# HG changeset patch # User Raimund Renkert # Date 1393515936 -3600 # Node ID 945d25675a322b19641a291c0976a84b6948f2d6 # Parent 03cb95071d21d337530ea3fb230ba500116c78c2# Parent 819528f6fabb4388897887a3c6a5e716118298c1 merged. diff -r 819528f6fabb -r 945d25675a32 artifacts/doc/conf/conf.xml --- a/artifacts/doc/conf/conf.xml Mon Feb 24 18:55:14 2014 +0100 +++ b/artifacts/doc/conf/conf.xml Thu Feb 27 16:45:36 2014 +0100 @@ -280,11 +280,87 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 819528f6fabb -r 945d25675a32 artifacts/src/main/java/org/dive4elements/river/artifacts/context/RiverContextFactory.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/context/RiverContextFactory.java Mon Feb 24 18:55:14 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/context/RiverContextFactory.java Thu Feb 27 16:45:36 2014 +0100 @@ -33,6 +33,7 @@ import org.dive4elements.artifacts.common.utils.XMLUtils; import org.dive4elements.river.artifacts.model.Module; +import org.dive4elements.river.artifacts.model.RiverFactory; import org.dive4elements.river.artifacts.model.ZoomScale; import org.dive4elements.river.artifacts.states.StateFactory; @@ -42,6 +43,7 @@ import org.dive4elements.river.exports.GeneratorLookup; import org.dive4elements.river.exports.OutGenerator; +import org.dive4elements.river.model.River; import org.dive4elements.river.themes.Theme; import org.dive4elements.river.themes.ThemeFactory; import org.dive4elements.river.themes.ThemeGroup; @@ -571,7 +573,28 @@ boolean selected = attrselected == null ? false : attrselected.equalsIgnoreCase("true"); logger.debug("Loaded module " + modulename); - modules.add(new Module(modulename, selected)); + NodeList children = e.getChildNodes(); + List rivers = new ArrayList(children.getLength()); + for (int j = 0; j < children.getLength(); j++) { + if (children.item(j).getNodeType() != Node.ELEMENT_NODE) { + continue; + } + Element ce = (Element)children.item(j); + if (ce.hasAttribute("uuid")) { + rivers.add(ce.getAttribute("uuid")); + } + else if (ce.hasAttribute("name")) { + List allRivers = RiverFactory.getRivers(); + String name = ce.getAttribute("name"); + for (River r: allRivers) { + if (name.equals(r.getName())) { + rivers.add(r.getModelUuid()); + break; + } + } + } + } + modules.add(new Module(modulename, selected, rivers)); } context.put(RiverContext.MODULES, modules); } diff -r 819528f6fabb -r 945d25675a32 artifacts/src/main/java/org/dive4elements/river/artifacts/model/Module.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/Module.java Mon Feb 24 18:55:14 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/Module.java Thu Feb 27 16:45:36 2014 +0100 @@ -8,16 +8,20 @@ package org.dive4elements.river.artifacts.model; +import java.util.List; + /** * Represents a Module as is is loaded from the config */ public class Module { private String name; + List rivers; private boolean selected; - public Module(String name, boolean selected) { + public Module(String name, boolean selected, List rivers) { this.name = name; + this.rivers = rivers; this.selected = selected; } @@ -28,6 +32,10 @@ public boolean isSelected() { return this.selected; } + + public List getRivers() { + return this.rivers; + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 tw=80: diff -r 819528f6fabb -r 945d25675a32 artifacts/src/main/java/org/dive4elements/river/artifacts/services/ModuleService.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/services/ModuleService.java Mon Feb 24 18:55:14 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/services/ModuleService.java Thu Feb 27 16:45:36 2014 +0100 @@ -54,6 +54,11 @@ MODULE + "." + module.getName(), module.getName()); ec.addAttr(m, "localname", localname, true); + for (String river : module.getRivers()) { + Element r = ec.create("river"); + r.setAttribute("uuid", river); + m.appendChild(r); + } if (module.isSelected()) { ec.addAttr(m, "selected", "true", true); } diff -r 819528f6fabb -r 945d25675a32 artifacts/src/main/java/org/dive4elements/river/artifacts/services/RiverInfoService.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/services/RiverInfoService.java Mon Feb 24 18:55:14 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/services/RiverInfoService.java Thu Feb 27 16:45:36 2014 +0100 @@ -75,6 +75,7 @@ ec.addAttr(r, "maxq", Double.toString(minmaxq[1]), true); ec.addAttr(r, "official", Long.toString(river.getOfficialNumber()), true); + ec.addAttr(r, "model-uuid", river.getModelUuid(), true); riverele.appendChild(r); result.appendChild(riverele); diff -r 819528f6fabb -r 945d25675a32 artifacts/src/main/java/org/dive4elements/river/artifacts/services/RiverService.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/services/RiverService.java Mon Feb 24 18:55:14 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/services/RiverService.java Thu Feb 27 16:45:36 2014 +0100 @@ -59,6 +59,7 @@ for (River river: allRivers) { Element r = ec.create("river"); ec.addAttr(r, "name", river.getName(), true); + ec.addAttr(r, "modeluuid", river.getModelUuid(), true); rivers.appendChild(r); } diff -r 819528f6fabb -r 945d25675a32 artifacts/src/main/java/org/dive4elements/river/artifacts/states/RiverSelect.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/states/RiverSelect.java Mon Feb 24 18:55:14 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/states/RiverSelect.java Thu Feb 27 16:45:36 2014 +0100 @@ -133,7 +133,8 @@ Element value = ProtocolUtils.createArtNode(cr, "value", null, null); label.setTextContent(river.getName()); - value.setTextContent(river.getName()); + logger.debug("model uuid: " + river.getModelUuid()); + value.setTextContent(river.getModelUuid()); item.appendChild(label); item.appendChild(value); diff -r 819528f6fabb -r 945d25675a32 backend/src/main/java/org/dive4elements/river/importer/ImportRiver.java --- a/backend/src/main/java/org/dive4elements/river/importer/ImportRiver.java Mon Feb 24 18:55:14 2014 +0100 +++ b/backend/src/main/java/org/dive4elements/river/importer/ImportRiver.java Thu Feb 27 16:45:36 2014 +0100 @@ -131,6 +131,8 @@ protected String name; + protected String modelUuid; + protected Long officialNumber; protected File wstFile; @@ -295,12 +297,14 @@ public ImportRiver( String name, + String modelUuid, File wstFile, File bbInfoFile, AnnotationClassifier annotationClassifier ) { this(); this.name = name; + this.modelUuid = modelUuid; this.wstFile = wstFile; this.bbInfoFile = bbInfoFile; this.annotationClassifier = annotationClassifier; @@ -314,6 +318,14 @@ this.name = name; } + public String getModelUuid() { + return modelUuid; + } + + public void setModelUuid(String modelUuid) { + this.modelUuid = modelUuid; + } + public Long getOfficialNumber() { return this.officialNumber; } @@ -1582,7 +1594,7 @@ List rivers = query.list(); if (rivers.isEmpty()) { log.info("Store new river '" + name + "'"); - peer = new River(name, u); + peer = new River(name, u, modelUuid); if (!Config.INSTANCE.skipBWASTR()) { peer.setOfficialNumber(officialNumber); } diff -r 819528f6fabb -r 945d25675a32 backend/src/main/java/org/dive4elements/river/importer/parsers/InfoGewParser.java --- a/backend/src/main/java/org/dive4elements/river/importer/parsers/InfoGewParser.java Mon Feb 24 18:55:14 2014 +0100 +++ b/backend/src/main/java/org/dive4elements/river/importer/parsers/InfoGewParser.java Thu Feb 27 16:45:36 2014 +0100 @@ -44,6 +44,9 @@ public static final Pattern BB_INFO = Pattern.compile("^\\s*B\\+B-Info\\s*:\\s*(.+)"); + public static final Pattern GEW_UUID = + Pattern.compile("^\\s*uuid\\s*:\\s*(.+)"); + protected ArrayList rivers; protected AnnotationClassifier annotationClassifier; @@ -81,6 +84,7 @@ String line = null; String riverName = null; + String modelUuid = null; File wstFile = null; File bbInfoFile = null; @@ -96,11 +100,13 @@ if (riverName != null) { rivers.add(new ImportRiver( riverName, + modelUuid, wstFile, bbInfoFile, annotationClassifier)); } riverName = river; + modelUuid = null; wstFile = null; bbInfoFile = null; } @@ -118,6 +124,11 @@ } wstFile = wst; } + else if ((m = GEW_UUID.matcher(line)).matches()) { + modelUuid = m.group(1); + log.debug("Found model uuid " + modelUuid + + " for river " + riverName); + } else if ((m = BB_INFO.matcher(line)).matches()) { //TODO: Make it relative to the wst file. String bbInfo = m.group(1); @@ -127,6 +138,7 @@ if (riverName != null) { rivers.add(new ImportRiver( riverName, + modelUuid, wstFile, bbInfoFile, annotationClassifier)); diff -r 819528f6fabb -r 945d25675a32 backend/src/main/java/org/dive4elements/river/model/River.java --- a/backend/src/main/java/org/dive4elements/river/model/River.java Mon Feb 24 18:55:14 2014 +0100 +++ b/backend/src/main/java/org/dive4elements/river/model/River.java Thu Feb 27 16:45:36 2014 +0100 @@ -61,6 +61,8 @@ private boolean kmUp; + private String modelUuid; + private List gauges; private List measurementstations; @@ -111,12 +113,22 @@ this.kmUp = kmUp; } + @Column(name = "model_uuid") + public String getModelUuid() { + return this.modelUuid; + } + + public void setModelUuid(String modelUuid) { + this.modelUuid = modelUuid; + } + public River() { } - public River(String name, Unit wstUnit) { - this.name = name; - this.wstUnit = wstUnit; + public River(String name, Unit wstUnit, String modelUuid) { + this.name = name; + this.modelUuid = modelUuid; + this.wstUnit = wstUnit; } @OneToMany diff -r 819528f6fabb -r 945d25675a32 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LinkSelection.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LinkSelection.java Mon Feb 24 18:55:14 2014 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LinkSelection.java Thu Feb 27 16:45:36 2014 +0100 @@ -192,7 +192,7 @@ LinkItem link = new LinkItem("river"); link.setHoverDelay(0); link.setLinkTitle(item.getLabel()); - link.setTarget(item.getStringValue()); + link.setValue(item.getStringValue()); link.setShowTitle(false); Img img = new Img(); img.setShowTitle(false); @@ -238,7 +238,8 @@ link.addItemHoverHandler(new ItemHoverHandler() { @Override public void onItemHover(ItemHoverEvent event) { - String river = ((LinkItem)event.getItem()).getLinkTitle(); + String river = + ((LinkItem)event.getItem()).getValue().toString(); Img item = riverHighlight.get(river); if (item != null) { item.setVisible(true); diff -r 819528f6fabb -r 945d25675a32 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ModuleSelection.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ModuleSelection.java Mon Feb 24 18:55:14 2014 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ModuleSelection.java Thu Feb 27 16:45:36 2014 +0100 @@ -73,26 +73,7 @@ rivers = null; //TODO: put all the rivers into a config file, or something. fixRivers = new ArrayList(); - fixRivers.add("Rhein"); - fixRivers.add("Elbe"); - fixRivers.add("Donau"); - fixRivers.add("Fulda (Sommer)"); - fixRivers.add("Havel"); - fixRivers.add("Lahn"); - fixRivers.add("Main"); - fixRivers.add("Mosel"); - fixRivers.add("Neckar"); - fixRivers.add("Oder"); - fixRivers.add("Saale"); - fixRivers.add("Saar"); - fixRivers.add("Saar (Wiltinger Bogen)"); - fixRivers.add("Werra (Sommer)"); - fixRivers.add("Weser"); - minfoRivers = new ArrayList(); - minfoRivers.add("Elbe"); - minfoRivers.add("Rhein"); - minfoRivers.add("Oder"); readModules(); } @@ -152,7 +133,16 @@ GWT.log("Module " + module.getName() + " is selected."); if (radio != null) { radio.setDefaultValue(module.getName()); - GWT.log("Setting " + module.getName() + " as selected."); + } + } + if (module.getName().equals("fixanalysis")) { + for (String river: module.getRivers()) { + fixRivers.add(river); + } + } + if (module.getName().equals("minfo")) { + for (String river: module.getRivers()) { + minfoRivers.add(river); } } } @@ -242,7 +232,6 @@ }-*/; private static String getSelectedModule() { - GWT.log("selected: " + radio.getValueAsString()); return radio.getValueAsString(); } } diff -r 819528f6fabb -r 945d25675a32 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterList.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterList.java Mon Feb 24 18:55:14 2014 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterList.java Thu Feb 27 16:45:36 2014 +0100 @@ -338,7 +338,8 @@ int i = 0; for (River river: rivers) { String name = river.getName(); - items[i++] = new DefaultDataItem(name, null, name); + String mUuid = river.getModelUuid(); + items[i++] = new DefaultDataItem(name, null, mUuid); } Data data = new DefaultData( diff -r 819528f6fabb -r 945d25675a32 gwt-client/src/main/java/org/dive4elements/river/client/server/ModuleServiceImpl.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/server/ModuleServiceImpl.java Mon Feb 24 18:55:14 2014 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/ModuleServiceImpl.java Thu Feb 27 16:45:36 2014 +0100 @@ -89,9 +89,15 @@ ArtifactNamespaceContext.NAMESPACE_URI, "selected"); boolean selected = strselected == null ? false : strselected.equalsIgnoreCase("true"); + NodeList rivers = em.getChildNodes(); + List riverUuids = new ArrayList(); + for (int j = 0; j < rivers.getLength(); j++) { + Element re = (Element)rivers.item(j); + riverUuids.add(re.getAttribute("uuid")); + } logger.debug("Found module " + name + " " + localname); if (user == null || user.canUseFeature("module:" + name)) { - modules.add(new DefaultModule(name, localname, selected)); + modules.add(new DefaultModule(name, localname, selected, riverUuids)); } } return modules.toArray(new Module[modules.size()]); diff -r 819528f6fabb -r 945d25675a32 gwt-client/src/main/java/org/dive4elements/river/client/server/RiverInfoServiceImpl.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/server/RiverInfoServiceImpl.java Mon Feb 24 18:55:14 2014 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/RiverInfoServiceImpl.java Thu Feb 27 16:45:36 2014 +0100 @@ -368,6 +368,8 @@ ArtifactNamespaceContext.NAMESPACE_URI, "maxq"); String rofficial = riverresp.getAttributeNS( ArtifactNamespaceContext.NAMESPACE_URI, "official"); + String rmuuid = riverresp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "model-uuid"); logger.debug("River is " + rname); @@ -380,7 +382,8 @@ rwstunit, parseDouble(rminq), parseDouble(rmaxq), - parseLong(rofficial) + parseLong(rofficial), + rmuuid ); return riverinfo; diff -r 819528f6fabb -r 945d25675a32 gwt-client/src/main/java/org/dive4elements/river/client/server/RiverServiceImpl.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/server/RiverServiceImpl.java Mon Feb 24 18:55:14 2014 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/RiverServiceImpl.java Thu Feb 27 16:45:36 2014 +0100 @@ -93,10 +93,12 @@ String name = tmp.getAttributeNS( ArtifactNamespaceContext.NAMESPACE_URI, "name"); + String mUuid = tmp.getAttributeNS( + ArtifactNamespaceContext.NAMESPACE_URI, "modeluuid"); if (name.length() > 0 && (user == null || user.canUseFeature("river:" + name))) { - theRivers.add(new DefaultRiver(name)); + theRivers.add(new DefaultRiver(name, mUuid)); } } diff -r 819528f6fabb -r 945d25675a32 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DefaultModule.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DefaultModule.java Mon Feb 24 18:55:14 2014 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DefaultModule.java Thu Feb 27 16:45:36 2014 +0100 @@ -8,19 +8,27 @@ package org.dive4elements.river.client.shared.model; +import java.util.List; + public class DefaultModule implements Module { private String name; private String localname; private boolean selected = false; + private List rivers; public DefaultModule() { } - public DefaultModule(String name, String localname, boolean selected) { + public DefaultModule( + String name, + String localname, + boolean selected, + List rivers) { this.name = name; this.localname = localname; this.selected = selected; + this.rivers = rivers; } /** @@ -43,5 +51,12 @@ public boolean isSelected() { return this.selected; } + + /** + * @return the rivers + */ + public List getRivers() { + return this.rivers; + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 tw=80 : diff -r 819528f6fabb -r 945d25675a32 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DefaultRiver.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DefaultRiver.java Mon Feb 24 18:55:14 2014 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DefaultRiver.java Thu Feb 27 16:45:36 2014 +0100 @@ -19,6 +19,9 @@ /** The name of the river.*/ protected String name; + /** The model uuid of the river */ + protected String modelUuid; + /** * The default constructor that creates empty river objects. */ @@ -31,8 +34,9 @@ * * @param name The name of the river. */ - public DefaultRiver(String name) { + public DefaultRiver(String name, String modelUuid) { this.name = name; + this.modelUuid = modelUuid; } @@ -54,5 +58,23 @@ public String getName() { return name; } + + + + /** + * @return the modelUuid + */ + public String getModelUuid() { + return modelUuid; + } + + + + /** + * @param modelUuid the modelUuid to set + */ + public void setModelUuid(String modelUuid) { + this.modelUuid = modelUuid; + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 819528f6fabb -r 945d25675a32 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DefaultRiverInfo.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DefaultRiverInfo.java Mon Feb 24 18:55:14 2014 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DefaultRiverInfo.java Thu Feb 27 16:45:36 2014 +0100 @@ -24,6 +24,7 @@ private Double minq; private Double maxq; private Long officialnumber; + private String muuid; private List gaugeinfo; private List mstations; @@ -39,7 +40,8 @@ String wstunit, Double minq, Double maxq, - Long official) + Long official, + String muuid) { this.name = name; this.kmup = kmup; @@ -49,6 +51,7 @@ this.minq = minq; this.maxq = maxq; this.officialnumber = official; + this.muuid = muuid; } public boolean isKmUp() { @@ -112,6 +115,14 @@ } /** + * Returns the model uuid of the river + * @return + */ + public String getModelUuid() { + return muuid; + } + + /** * Returns the MeasurementStations on this river or null if they aren't * available. */ diff -r 819528f6fabb -r 945d25675a32 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/Module.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/Module.java Mon Feb 24 18:55:14 2014 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/Module.java Thu Feb 27 16:45:36 2014 +0100 @@ -9,6 +9,7 @@ package org.dive4elements.river.client.shared.model; import java.io.Serializable; +import java.util.List; public interface Module extends Serializable { @@ -17,5 +18,7 @@ String getLocalizedName(); boolean isSelected(); + + List getRivers(); } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 tw=80 : diff -r 819528f6fabb -r 945d25675a32 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/River.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/River.java Mon Feb 24 18:55:14 2014 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/River.java Thu Feb 27 16:45:36 2014 +0100 @@ -16,5 +16,7 @@ public interface River extends Serializable { String getName(); + + String getModelUuid(); } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 819528f6fabb -r 945d25675a32 gwt-client/src/main/webapp/images/FLYS_Karte_interactive.html --- a/gwt-client/src/main/webapp/images/FLYS_Karte_interactive.html Mon Feb 24 18:55:14 2014 +0100 +++ b/gwt-client/src/main/webapp/images/FLYS_Karte_interactive.html Thu Feb 27 16:45:36 2014 +0100 @@ -5,10 +5,17 @@ function stripRiver(name) { var module = getModule(); if (module === 'fixanalysis') { - if (name.contains('Donau') || - name.contains('Main') || - name.contains('Neckar')) { - return name.split(' ')[0]; + if (name === '7ca152b6-8f28-11e3-b4fd-001e0bd54d0e' || + name === '7ca5330e-8f28-11e3-bd2f-001e0bd54d0e' || + name === '7ca935ee-8f28-11e3-9c35-001e0bd54d0e') { + return '7ca152b6-8f28-11e3-b4fd-001e0bd54d0e'; + } + else if (name === '7cb63c58-8f28-11e3-a8f0-001e0bd54d0e' || + name === '7cb7adfe-8f28-11e3-a9b1-001e0bd54d0e') { + return '7cb4cd3c-8f28-11e3-bab7-001e0bd54d0e'; + } + else if (name === '7cbc05d4-8f28-11e3-88e3-001e0bd54d0e') { + return '7cba90aa-8f28-11e3-bfd5-001e0bd54d0e'; } } return name; @@ -26,7 +33,7 @@ if (river) { highlighted = name; river.style.visibility="visible"; - } + } } function highlightList(name) { name = stripRiver(name); @@ -59,30 +66,30 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + @@ -104,29 +111,29 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + @@ -144,26 +151,26 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - + + + +