diff --git a/app/src/main/java/it/integry/integrywmsnative/core/di/Converters.java b/app/src/main/java/it/integry/integrywmsnative/core/di/Converters.java index 72b6f831..9b631b99 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/di/Converters.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/di/Converters.java @@ -115,7 +115,7 @@ public class Converters { view.addTextChangedListener(watcher); } BigDecimal newValue = observableBigDecimal.get(); - BigDecimal viewValue = view.getText().toString().trim().length() > 0 ? new BigDecimal(view.getText().toString()) : BigDecimal.ZERO; + BigDecimal viewValue = view.getText().toString().trim().length() > 0 ? new BigDecimal(view.getText().toString()) : null; if(!UtilityBigDecimal.equalsTo(viewValue, newValue)) { view.setText(UtilityNumber.decimalToString(newValue)); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/PermissionsHelper.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/PermissionsHelper.java index 0f66db4e..af9ff373 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/PermissionsHelper.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/PermissionsHelper.java @@ -23,6 +23,7 @@ public class PermissionsHelper { List permissionsToAsk = new ArrayList<>(); permissionsToAsk.add(Manifest.permission.READ_EXTERNAL_STORAGE); permissionsToAsk.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + permissionsToAsk.add(Manifest.permission.CAMERA); //permissionsToAsk.add(Manifest.permission.INTERNET); //permissionsToAsk.add(Manifest.permission.ACCESS_WIFI_STATE); @@ -49,12 +50,9 @@ public class PermissionsHelper { onPermissionsConfirmed.run(); } else { - boolean anyPermDeny = shouldShowRequestPermissionRationale( activity, permissions ); onPermissionsDenied.run(anyPermDeny); - - } return; } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityBigDecimal.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityBigDecimal.java index bc381f23..b3e995f1 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityBigDecimal.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityBigDecimal.java @@ -12,6 +12,7 @@ public class UtilityBigDecimal { } public static boolean equalsTo(BigDecimal input, BigDecimal toCompareWith) { + if(input == null && toCompareWith == null) return true; if(input == null) return false; if(toCompareWith == null) return false; @@ -32,4 +33,22 @@ public class UtilityBigDecimal { return lowerThan(input1, input2) ? input1 : input2; } + + public static BigDecimal divide(BigDecimal input1, BigDecimal divisor) { + if(divisor == null || equalsTo(divisor, BigDecimal.ZERO)) return null; + + return input1.divide(divisor, 3, BigDecimal.ROUND_HALF_EVEN); + } + + + public static BigDecimal divideToInteger(BigDecimal input1, BigDecimal divisor) { + if(divisor == null || equalsTo(divisor, BigDecimal.ZERO)) return null; + + return new BigDecimal(input1.divide(divisor,3, BigDecimal.ROUND_HALF_EVEN).intValue()); + } + + public static BigDecimal multiply(BigDecimal input1, BigDecimal multiplier) { + return input1.multiply(multiplier); + } + } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityDialog.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityDialog.java index 3fb333cb..dfa984d6 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityDialog.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityDialog.java @@ -20,6 +20,12 @@ public class UtilityDialog { dialog.getDialog().getWindow().setLayout(width, LinearLayout.LayoutParams.WRAP_CONTENT); } + public static void setTo95PercentWidth(Context context, DialogFragment dialog) { + int width = (int)(context.getResources().getDisplayMetrics().widthPixels*0.95); + + dialog.getDialog().getWindow().setLayout(width, LinearLayout.LayoutParams.WRAP_CONTENT); + } + // public static void setTo90PercentHeight(Context context, Dialog dialog) { // int height = (int)(context.getResources().getDisplayMetrics().heightPixels*0.90); // diff --git a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityLogger.java b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityLogger.java index aff17de4..d13ef3d4 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityLogger.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/utility/UtilityLogger.java @@ -9,6 +9,7 @@ import java.io.StringWriter; import java.net.SocketException; import java.net.SocketTimeoutException; +import it.integry.integrywmsnative.BuildConfig; import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.rest.consumers.SystemRESTConsumer; import it.integry.integrywmsnative.core.expansion.RunnableArgs; @@ -41,7 +42,7 @@ public class UtilityLogger { } public static void errorMe(Exception ex, String additionalText, Runnable onComplete, RunnableArgs onFailed) { - FirebaseCrashlytics.getInstance().recordException(ex); + if(!BuildConfig.DEBUG) FirebaseCrashlytics.getInstance().recordException(ex); // if ((!(ex instanceof SocketTimeoutException) && !(ex.getCause() instanceof SocketTimeoutException)) || // (!(ex instanceof SocketException) && !(ex.getCause() instanceof SocketException)) || diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione_new/SpedizioneViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione_new/SpedizioneViewModel.java index 55fea5e9..561a66d6 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione_new/SpedizioneViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione_new/SpedizioneViewModel.java @@ -1,5 +1,7 @@ package it.integry.integrywmsnative.gest.spedizione_new; +import android.os.Handler; + import androidx.databinding.ObservableArrayList; import androidx.lifecycle.MutableLiveData; @@ -113,18 +115,28 @@ public class SpedizioneViewModel { .toList(); ArticoloRESTConsumer.getByCodMart(codMarts, listMtbAarts -> { - onComplete.run(Stream.of(sitArtOrdList) + List pickingList = Stream.of(sitArtOrdList) .map(sitArtOrdDTO -> { + MtbAart mtbAart = null; - MtbAart mtbAart = Stream.of(listMtbAarts) - .filter(x -> x.getCodMart().equalsIgnoreCase(sitArtOrdDTO.getCodMart())) - .single(); + for (MtbAart mtbAartItem : listMtbAarts) { + if (mtbAartItem.getCodMart().equalsIgnoreCase(sitArtOrdDTO.getCodMart())) { + mtbAart = mtbAartItem; + break; + } + } return new PickingObjectDTO() .setSitArtOrdDTO(sitArtOrdDTO) .setMtbAart(mtbAart); }) - .toList()); + .toList(); + + new Handler() + .postDelayed(() -> { + onComplete.run(pickingList); + }, 1); +// onComplete.run(pickingList); }, this::sendError); } @@ -534,7 +546,7 @@ public class SpedizioneViewModel { }) .toList(); - for(PickingObjectDTO pickingObjectDTO : matchPickingObject) { + for (PickingObjectDTO pickingObjectDTO : matchPickingObject) { pickingObjectDTO.setTempPickData(pickData); } @@ -602,7 +614,7 @@ public class SpedizioneViewModel { if (mtbColrToDispatch != null) { - if(UtilityBigDecimal.lowerThan(mtbColrToDispatch.getQtaCol(), qtaDaEvadere)) { + if (UtilityBigDecimal.lowerThan(mtbColrToDispatch.getQtaCol(), qtaDaEvadere)) { numCnfDaPrelevare = mtbColrToDispatch.getNumCnf(); qtaColDaPrelevare = mtbColrToDispatch.getQtaCol(); qtaCnfDaPrelevare = mtbColrToDispatch.getQtaCnf(); @@ -624,7 +636,30 @@ public class SpedizioneViewModel { if (UtilityBigDecimal.lowerThan(qtaColDaPrelevare, BigDecimal.ZERO)) qtaColDaPrelevare = BigDecimal.ZERO; - } //Oppure le info del barcode scansionato + } else if (pickingObjectDTO.getTempPickData() != null && pickingObjectDTO.getTempPickData().getManualPickDTO() != null) { + //Oppure le info del barcode scansionato + PickDataDTO.ManualPickDTO manualPickDTO = pickingObjectDTO.getTempPickData().getManualPickDTO(); + MtbAart mtbAart = pickingObjectDTO.getMtbAart(); + + qtaColDaPrelevare = manualPickDTO.getQtaTot(); + numCnfDaPrelevare = manualPickDTO.getNumCnf(); + + if (mtbAart.isFlagQtaCnfFissaBoolean()) { + qtaCnfDaPrelevare = mtbAart.getQtaCnf(); + } else if (qtaColDaPrelevare != null && numCnfDaPrelevare != null) { + qtaCnfDaPrelevare = UtilityBigDecimal.divide(qtaColDaPrelevare, numCnfDaPrelevare); + } + + + if (qtaColDaPrelevare != null && numCnfDaPrelevare == null) { + numCnfDaPrelevare = UtilityBigDecimal.divideToInteger(qtaColDaPrelevare, mtbAart.getQtaCnf()); + qtaCnfDaPrelevare = UtilityBigDecimal.divide(qtaColDaPrelevare, numCnfDaPrelevare); + } else if (numCnfDaPrelevare != null && qtaColDaPrelevare == null) { + qtaCnfDaPrelevare = mtbAart.getQtaCnf(); + qtaColDaPrelevare = UtilityBigDecimal.multiply(numCnfDaPrelevare, qtaCnfDaPrelevare); + } + + } this.sendOnItemDispatched( pickingObjectDTO.getMtbAart(), diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione_new/model/PickDataDTO.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione_new/model/PickDataDTO.java index c75088df..80c359d4 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione_new/model/PickDataDTO.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione_new/model/PickDataDTO.java @@ -49,11 +49,17 @@ public class PickDataDTO { manualPickDTO.setMtbPartitaMag(mtbPartitaMag); } - if (ean128Model.Count != null && ean128Model.Count > 0) { - manualPickDTO.setNumCnf(new BigDecimal(ean128Model.Count)); + if (ean128Model.Count != null && ean128Model.Count > 0 && (ean128Model.NetWeightKg == null || ean128Model.NetWeightKg == 0)) { + manualPickDTO.setQtaTot(new BigDecimal(ean128Model.Count)); } - if (ean128Model.NetWeightKg != null && ean128Model.NetWeightKg > 0) { + if (ean128Model.NetWeightKg != null && ean128Model.NetWeightKg > 0 && (ean128Model.Count == null || ean128Model.Count == 0)) { + manualPickDTO.setQtaTot(new BigDecimal(ean128Model.NetWeightKg)); + manualPickDTO.setEanPeso(true); + } + + if(ean128Model.NetWeightKg != null && ean128Model.NetWeightKg > 0 && ean128Model.Count != null && ean128Model.Count > 0) { + manualPickDTO.setNumCnf(new BigDecimal(ean128Model.Count)); manualPickDTO.setQtaTot(new BigDecimal(ean128Model.NetWeightKg)); manualPickDTO.setEanPeso(true); } diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/camera_barcode_reader/DialogCameraBarcodeReader.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/camera_barcode_reader/DialogCameraBarcodeReader.java index eed64c59..09ffdd5a 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/camera_barcode_reader/DialogCameraBarcodeReader.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/camera_barcode_reader/DialogCameraBarcodeReader.java @@ -53,7 +53,7 @@ public class DialogCameraBarcodeReader extends DialogFragment implements Barcode public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { mBindings = DataBindingUtil.inflate(inflater, R.layout.dialog_camera_barcode_reader, container, false); - UtilityDialog.setTo90PercentWidth(mContext, this); + UtilityDialog.setTo95PercentWidth(mContext, this); getDialog().setCanceledOnTouchOutside(false); getDialog().setCancelable(false); @@ -68,6 +68,11 @@ public class DialogCameraBarcodeReader extends DialogFragment implements Barcode return mBindings.getRoot(); } + @Override + public void onStop() { + super.onStop(); + this.mBindings.bcode.unbind(); + } private void initBarcodeView() { List availableBarcodeFormats = new ArrayList<>(); @@ -98,21 +103,28 @@ public class DialogCameraBarcodeReader extends DialogFragment implements Barcode switch (result.getBarcodeFormat()) { case CODE_128: type = BarcodeType.CODE128; + break; case CODE_39: type = BarcodeType.CODE39; + break; case EAN_13: type = BarcodeType.EAN13; + break; case EAN_8: type = BarcodeType.EAN8; + break; case UPC_A: type = BarcodeType.UPCA; + break; case UPC_E: type = BarcodeType.UPCE; + break; default: - Logger.e("Barcode not recognized", "Barcode type " + result.getBarcodeFormat().toString() + " was not mapped in DialogCameraBarcodeReader.java"); + Logger.e("Barcode type " + result.getBarcodeFormat().toString() + " was not mapped in DialogCameraBarcodeReader.java"); type = null; + break; } barcodeScanDTO.setType(type); diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2.java index 2e8e717b..4feccfb3 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2.java @@ -9,19 +9,31 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.databinding.DataBindingUtil; +import androidx.databinding.ObservableField; import androidx.fragment.app.DialogFragment; import org.jetbrains.annotations.NotNull; +import java.math.BigDecimal; + import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.core.model.MtbUntMis; +import it.integry.integrywmsnative.core.utility.UtilityObservable; import it.integry.integrywmsnative.databinding.DialogInputQuantityV2Binding; -public class DialogInputQuantityV2 extends DialogFragment { +public class DialogInputQuantityV2 extends DialogFragment implements DialogInputQuantityV2ViewModel.Listener { private DialogInputQuantityV2ViewModel mViewModel; private DialogInputQuantityV2DTO mDialogInputQuantityV2DTO; + + + public ObservableField currentNumCnf = new ObservableField<>(); + public ObservableField currentQtaCnf = new ObservableField<>(); + public ObservableField currentQtaTot = new ObservableField<>(); + + private boolean mEnableDataCallback = true; + public static DialogInputQuantityV2 newInstance(@NotNull DialogInputQuantityV2DTO dialogInputQuantityV2DTO) { return new DialogInputQuantityV2(dialogInputQuantityV2DTO); } @@ -56,7 +68,7 @@ public class DialogInputQuantityV2 extends DialogFragment { .setCanOverflowOrderQuantity(mDialogInputQuantityV2DTO.isCanOverflowOrderQuantity()) .setQtaCnfAvailable(mDialogInputQuantityV2DTO.getQtaCnfAvailable()); - + bindings.setView(this); bindings.setViewmodel(this.mViewModel); MtbUntMis mtbUntMis = mDialogInputQuantityV2DTO.getMtbAart().getMtbUntMis() != null && mDialogInputQuantityV2DTO.getMtbAart().getMtbUntMis().size() > 0 ? mDialogInputQuantityV2DTO.getMtbAart().getMtbUntMis().get(0) : null; @@ -70,6 +82,40 @@ public class DialogInputQuantityV2 extends DialogFragment { @Override public void onStart() { super.onStart(); + this.init(); + + this.mViewModel.setListener(this); this.mViewModel.init(); } + + private void init() { + UtilityObservable.addPropertyChanged(this.currentNumCnf, (value) -> { + if(this.mEnableDataCallback) { + this.mViewModel.setNumCnf(value); + } + }); + + UtilityObservable.addPropertyChanged(this.currentQtaCnf, (value) -> { + if(this.mEnableDataCallback) { + this.mViewModel.setQtaCnf(value); + } + }); + + UtilityObservable.addPropertyChanged(this.currentQtaTot, (value) -> { + if(this.mEnableDataCallback) { + this.mViewModel.setQtaTot(value); + } + }); + } + + @Override + public void onDataChanged() { + this.mEnableDataCallback = false; + + this.currentNumCnf.set(this.mViewModel.getNumCnf()); + this.currentQtaCnf.set(this.mViewModel.getQtaCnf()); + this.currentQtaTot.set(this.mViewModel.getQtaTot()); + + this.mEnableDataCallback = true; + } } diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2ViewModel.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2ViewModel.java index e1307c2a..9d229305 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2ViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/input_quantity_v2/DialogInputQuantityV2ViewModel.java @@ -24,32 +24,46 @@ public class DialogInputQuantityV2ViewModel { public BigDecimal totalNumCnfAvailable; public BigDecimal qtaCnfAvailable; - public ObservableField currentNumCnf = new ObservableField<>(); - public ObservableField currentQtaCnf = new ObservableField<>(); - public ObservableField currentQtaTot = new ObservableField<>(); + private BigDecimal internalNumCnf; + private BigDecimal internalQtaCnf; + private BigDecimal internalQtaTot; private boolean canOverflowOrderQuantity; + private Listener mListener; public void init() { - //Quando ho un barcode peso devo calcolare numCnf dal peso medio + if (totalQtaToBeTaken != null) { + this.internalNumCnf = totalNumCnfToBeTaken; + this.internalQtaCnf = qtaCnfToBeTaken; + this.internalQtaTot = totalQtaToBeTaken; - this.currentNumCnf.set(totalNumCnfToBeTaken != null ? totalNumCnfToBeTaken : BigDecimal.ONE); - UtilityObservable.addPropertyChanged(this.currentNumCnf, this::onCurrentNumCnfChanged); - - - this.currentQtaCnf.set(qtaCnfToBeTaken != null ? qtaCnfToBeTaken : this.mtbAart.get().getQtaCnf()); - UtilityObservable.addPropertyChanged(this.currentQtaCnf, this::onCurrentQtaCnfChanged); - - - this.currentQtaTot.set(totalQtaToBeTaken != null ? totalQtaToBeTaken : this.mtbAart.get().getQtaCnf()); - UtilityObservable.addPropertyChanged(this.currentQtaTot, this::onCurrentQtaTotChanged); + } else if (UtilityBigDecimal.lowerThan(totalQtaAvailable, totalQtaOrd)) { + this.internalNumCnf = totalNumCnfAvailable; + this.internalQtaCnf = qtaCnfAvailable; + this.internalQtaTot = totalQtaAvailable; + } else { + this.internalNumCnf = totalNumCnfOrd; + this.internalQtaCnf = qtaCnfOrd; + this.internalQtaTot = totalQtaOrd; + } + this.mListener.onDataChanged(); } + public BigDecimal getNumCnf() { + return this.internalNumCnf; + } + public BigDecimal getQtaCnf() { + return this.internalQtaCnf; + } + + public BigDecimal getQtaTot() { + return this.internalQtaTot; + } public DialogInputQuantityV2ViewModel setMtbAart(MtbAart mtbAart) { this.mtbAart.set(mtbAart); @@ -107,50 +121,59 @@ public class DialogInputQuantityV2ViewModel { } + public void setNumCnf(BigDecimal newValue) { + this.internalNumCnf = newValue; + if (newValue == null) return; + if (UtilityBigDecimal.greaterThan(newValue, totalNumCnfAvailable)) + newValue = totalNumCnfAvailable; + this.internalQtaTot = UtilityBigDecimal.multiply(newValue, this.internalQtaCnf); - - private void onCurrentNumCnfChanged(BigDecimal newValue) { - if(newValue == null) return; - - if(UtilityBigDecimal.greaterThan(newValue, totalNumCnfAvailable)) newValue = totalNumCnfAvailable; - this.currentQtaTot.set(newValue.multiply(this.currentQtaCnf.get())); + this.mListener.onDataChanged(); } - private void onCurrentQtaCnfChanged(BigDecimal newValue) { + public void setQtaCnf(BigDecimal newValue) { + this.internalQtaCnf = newValue; String a = ""; + + this.mListener.onDataChanged(); } - private void onCurrentQtaTotChanged(BigDecimal newValue) { - if(newValue == null) return; + public void setQtaTot(BigDecimal newValue) { + this.internalQtaTot = newValue; + if (newValue == null) return; - newValue = UtilityBigDecimal.getLowerBetween(newValue, totalNumCnfAvailable); + newValue = UtilityBigDecimal.getLowerBetween(newValue, totalQtaAvailable); //Se รจ piu' grande della qta da prelevare e non posso aggiungere qta extra allora ricalcolo - if(UtilityBigDecimal.greaterThan(newValue, totalQtaOrd) && !canOverflowOrderQuantity) { + if (UtilityBigDecimal.greaterThan(newValue, totalQtaOrd) && !canOverflowOrderQuantity) { - if(mtbAart.get().isFlagQtaCnfFissaBoolean()) { + if (mtbAart.get().isFlagQtaCnfFissaBoolean()) { //Ricalcolo num cnf - + this.internalNumCnf = UtilityBigDecimal.divide(totalQtaOrd, internalQtaCnf); } else { //Ricalcolo qta cnf - + this.internalQtaCnf = UtilityBigDecimal.divide(totalQtaOrd, internalNumCnf); } } else { - if(mtbAart.get().isFlagQtaCnfFissaBoolean()) { + if (mtbAart.get().isFlagQtaCnfFissaBoolean()) { //Ricalcolo num cnf + this.internalNumCnf = UtilityBigDecimal.divide(newValue, internalQtaCnf); } else { //Ricalcolo qta cnf + this.internalQtaCnf = UtilityBigDecimal.divide(newValue, internalNumCnf); } } + + this.mListener.onDataChanged(); } + public void setListener(Listener listener) { + this.mListener = listener; + } - -// private BigDecimal retrieveCorrectQtaCnf() { -// if(UtilityBigDecimal.greaterThan(totalNumCnfAvailable, BigDecimal.ZERO) && UtilityBigDecimal.greaterThan(totalQtaAvailable, BigDecimal.ZERO)) { -// -// } -// } + public interface Listener { + void onDataChanged(); + } } diff --git a/app/src/main/res/layout/dialog_input_quantity_v2.xml b/app/src/main/res/layout/dialog_input_quantity_v2.xml index 2b33108a..875e3bf6 100644 --- a/app/src/main/res/layout/dialog_input_quantity_v2.xml +++ b/app/src/main/res/layout/dialog_input_quantity_v2.xml @@ -16,6 +16,9 @@ + + app:binding="@{view.currentQtaCnf}" /> @@ -421,7 +424,7 @@