Merge pull request #5354 from larsbrubaker/main

Working on union validation
This commit is contained in:
Lars Brubaker 2022-07-08 10:15:20 -07:00 committed by GitHub
commit 738c6e20ea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 183 additions and 163 deletions

View file

@ -131,7 +131,7 @@ namespace MatterHackers.MatterControl.DesignTools
}
}
public static ITraceable CreateTraceData(FaceList faceList, List<Vector3Float> vertexList, BvhCreationOptions bvhCreationOptions = BvhCreationOptions.FavorFastTracing)
public static ITraceable CreateTraceData(FaceList faceList, List<Vector3Float> vertexList, BvhCreationOptions bvhCreationOptions = BvhCreationOptions.LegacySlowConstructionFastTracing)
{
var allPolys = new List<ITraceable>();

View file

@ -72,7 +72,45 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
private ProcessingResolution InputResolution { get; set; } = ProcessingResolution._64;
#endif
public bool IsBuilding => this.cancellationToken != null;
public static void CheckManifoldData(CombineObject3D_2 item, IObject3D result)
{
bool IsManifold(Mesh mesh)
{
var meshEdgeList = mesh.NewMeshEdges();
foreach (var meshEdge in meshEdgeList)
{
if (meshEdge.Faces.Count() != 2)
{
return false;
}
}
return true;
}
if (!IsManifold(result.Mesh))
{
// create a new combine of a and b and add it to the root
var combine = new CombineObject3D_2();
var participants = item.SourceContainer.VisibleMeshes().Where(m => m.WorldOutputType(item.SourceContainer) != PrintOutputTypes.Hole);
// all participants are manifold
foreach (var participant in participants)
{
combine.SourceContainer.Children.Add(new Object3D()
{
Mesh = participant.Mesh.Copy(new CancellationToken()),
Matrix = participant.Matrix
});
}
var scene = result.Parents().Last();
scene.Children.Add(combine);
}
}
public override Task Rebuild()
{
this.DebugDepth("Rebuild");
@ -91,6 +129,22 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
try
{
Combine(cancellationTokenSource.Token, reporter);
if (cancellationToken.IsCancellationRequested)
{
// the combine was canceled set our children to the source object children
SourceContainer.Visible = true;
RemoveAllButSource();
Children.Modify((list) =>
{
foreach (var child in SourceContainer.Children)
{
list.Add(child);
}
});
SourceContainer.Visible = false;
}
}
catch
{
@ -183,7 +237,12 @@ namespace MatterHackers.MatterControl.PartPreviewWindow.View3D
resultsItem.CopyProperties(participants.First(), Object3DPropertyFlags.All & (~Object3DPropertyFlags.Matrix));
this.Children.Add(resultsItem);
SourceContainer.Visible = false;
#if DEBUG
//resultsItem.Mesh.MergeVertices(.01);
//resultsItem.Mesh.CleanAndMerge();
//CheckManifoldData(this, resultsItem);
#endif
SourceContainer.Visible = false;
}
public void UpdateControls(PublicPropertyChange change)

View file

@ -1483,129 +1483,138 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
public override void OnMouseDown(MouseEventArgs mouseEvent)
{
var selectedItem = Scene.SelectedItem;
mouseDownPositon = mouseEvent.Position;
worldMatrixOnMouseDown = sceneContext.World.GetTransform4X4();
// Show transform override
if (activeButtonBeforeMouseOverride == null
&& (mouseEvent.Button == MouseButtons.Right || Keyboard.IsKeyDown(Keys.Control)))
using (new QuickTimer("View3DWidget_OnMouseDown", .3))
{
if (Keyboard.IsKeyDown(Keys.Shift))
var selectedItem = Scene.SelectedItem;
mouseDownPositon = mouseEvent.Position;
worldMatrixOnMouseDown = sceneContext.World.GetTransform4X4();
// Show transform override
if (activeButtonBeforeMouseOverride == null
&& (mouseEvent.Button == MouseButtons.Right || Keyboard.IsKeyDown(Keys.Control)))
{
if (Keyboard.IsKeyDown(Keys.Shift))
{
activeButtonBeforeMouseOverride = viewControls3D.ActiveButton;
viewControls3D.ActiveButton = ViewControls3DButtons.Translate;
}
else if (Keyboard.IsKeyDown(Keys.Alt))
{
activeButtonBeforeMouseOverride = viewControls3D.ActiveButton;
viewControls3D.ActiveButton = ViewControls3DButtons.Scale;
}
else
{
activeButtonBeforeMouseOverride = viewControls3D.ActiveButton;
viewControls3D.ActiveButton = ViewControls3DButtons.Rotate;
}
}
else if (activeButtonBeforeMouseOverride == null && mouseEvent.Button == MouseButtons.Middle)
{
activeButtonBeforeMouseOverride = viewControls3D.ActiveButton;
viewControls3D.ActiveButton = ViewControls3DButtons.Translate;
}
else if (Keyboard.IsKeyDown(Keys.Alt))
if (mouseEvent.Button == MouseButtons.Right ||
mouseEvent.Button == MouseButtons.Middle)
{
activeButtonBeforeMouseOverride = viewControls3D.ActiveButton;
viewControls3D.ActiveButton = ViewControls3DButtons.Scale;
this.Object3DControlLayer.SuppressObject3DControls = true;
}
else
base.OnMouseDown(mouseEvent);
if (TrackballTumbleWidget.UnderMouseState == UnderMouseState.FirstUnderMouse
&& sceneContext.ViewState.ModelView)
{
activeButtonBeforeMouseOverride = viewControls3D.ActiveButton;
viewControls3D.ActiveButton = ViewControls3DButtons.Rotate;
}
}
else if (activeButtonBeforeMouseOverride == null && mouseEvent.Button == MouseButtons.Middle)
{
activeButtonBeforeMouseOverride = viewControls3D.ActiveButton;
viewControls3D.ActiveButton = ViewControls3DButtons.Translate;
}
if (mouseEvent.Button == MouseButtons.Right ||
mouseEvent.Button == MouseButtons.Middle)
{
this.Object3DControlLayer.SuppressObject3DControls = true;
}
base.OnMouseDown(mouseEvent);
if (TrackballTumbleWidget.UnderMouseState == UnderMouseState.FirstUnderMouse
&& sceneContext.ViewState.ModelView)
{
if ((mouseEvent.Button == MouseButtons.Left
&& viewControls3D.ActiveButton == ViewControls3DButtons.PartSelect
&& ModifierKeys == Keys.Shift)
|| (TrackballTumbleWidget.TransformState == TrackBallTransformType.None
&& ModifierKeys != Keys.Control
&& ModifierKeys != Keys.Alt))
{
if (!this.Object3DControlLayer.MouseDownOnObject3DControlVolume)
if ((mouseEvent.Button == MouseButtons.Left
&& viewControls3D.ActiveButton == ViewControls3DButtons.PartSelect
&& ModifierKeys == Keys.Shift)
|| (TrackballTumbleWidget.TransformState == TrackBallTransformType.None
&& ModifierKeys != Keys.Control
&& ModifierKeys != Keys.Alt))
{
this.Object3DControlLayer.SuppressObject3DControls = true;
IObject3D hitObject = FindHitObject3D(mouseEvent.Position, out IntersectInfo info);
if (hitObject == null)
if (!this.Object3DControlLayer.MouseDownOnObject3DControlVolume)
{
if (selectedItem != null)
this.Object3DControlLayer.SuppressObject3DControls = true;
IObject3D hitObject = null;
IntersectInfo info = null;
using (new QuickTimer("View3DWidget_OnMouseDown_FindHitObject3D", .3))
{
Scene.ClearSelection();
hitObject = FindHitObject3D(mouseEvent.Position, out info);
}
// start a selection rect
DragSelectionStartPosition = mouseEvent.Position - OffsetToMeshViewerWidget();
DragSelectionEndPosition = DragSelectionStartPosition;
DragSelectionInProgress = true;
}
else
{
CurrentSelectInfo.HitPlane = new PlaneShape(Vector3.UnitZ, CurrentSelectInfo.PlaneDownHitPos.Z, null);
if (hitObject != selectedItem)
if (hitObject == null)
{
if (selectedItem == null)
if (selectedItem != null)
{
// No selection exists
Scene.SelectedItem = hitObject;
}
else if ((ModifierKeys == Keys.Shift || ModifierKeys == Keys.Control)
&& !selectedItem.Children.Contains(hitObject))
{
expandSelection = !(selectedItem is SelectionGroupObject3D);
Scene.AddToSelection(hitObject);
}
else if (selectedItem == hitObject || selectedItem.Children.Contains(hitObject))
{
// Selection should not be cleared and drag should occur
}
else if (ModifierKeys != Keys.Shift)
{
Scene.SelectedItem = hitObject;
Scene.ClearSelection();
}
// Selection may have changed, update local reference to current value
selectedItem = Scene.SelectedItem;
Invalidate();
}
TransformOnMouseDown = selectedItem.Matrix;
Invalidate();
CurrentSelectInfo.DownOnPart = true;
AxisAlignedBoundingBox selectedBounds = selectedItem.GetAxisAlignedBoundingBox();
if (info.HitPosition.X < selectedBounds.Center.X)
{
if (info.HitPosition.Y < selectedBounds.Center.Y)
{
CurrentSelectInfo.HitQuadrant = HitQuadrant.LB;
}
else
{
CurrentSelectInfo.HitQuadrant = HitQuadrant.LT;
}
// start a selection rect
DragSelectionStartPosition = mouseEvent.Position - OffsetToMeshViewerWidget();
DragSelectionEndPosition = DragSelectionStartPosition;
DragSelectionInProgress = true;
}
else
{
if (info.HitPosition.Y < selectedBounds.Center.Y)
CurrentSelectInfo.HitPlane = new PlaneShape(Vector3.UnitZ, CurrentSelectInfo.PlaneDownHitPos.Z, null);
if (hitObject != selectedItem)
{
CurrentSelectInfo.HitQuadrant = HitQuadrant.RB;
if (selectedItem == null)
{
// No selection exists
Scene.SelectedItem = hitObject;
}
else if ((ModifierKeys == Keys.Shift || ModifierKeys == Keys.Control)
&& !selectedItem.Children.Contains(hitObject))
{
expandSelection = !(selectedItem is SelectionGroupObject3D);
Scene.AddToSelection(hitObject);
}
else if (selectedItem == hitObject || selectedItem.Children.Contains(hitObject))
{
// Selection should not be cleared and drag should occur
}
else if (ModifierKeys != Keys.Shift)
{
Scene.SelectedItem = hitObject;
}
// Selection may have changed, update local reference to current value
selectedItem = Scene.SelectedItem;
Invalidate();
}
TransformOnMouseDown = selectedItem.Matrix;
Invalidate();
CurrentSelectInfo.DownOnPart = true;
AxisAlignedBoundingBox selectedBounds = selectedItem.GetAxisAlignedBoundingBox();
if (info.HitPosition.X < selectedBounds.Center.X)
{
if (info.HitPosition.Y < selectedBounds.Center.Y)
{
CurrentSelectInfo.HitQuadrant = HitQuadrant.LB;
}
else
{
CurrentSelectInfo.HitQuadrant = HitQuadrant.LT;
}
}
else
{
CurrentSelectInfo.HitQuadrant = HitQuadrant.RT;
if (info.HitPosition.Y < selectedBounds.Center.Y)
{
CurrentSelectInfo.HitQuadrant = HitQuadrant.RB;
}
else
{
CurrentSelectInfo.HitQuadrant = HitQuadrant.RT;
}
}
}
}

View file

@ -113,8 +113,8 @@ namespace MatterHackers.MatterControl
var make = printer.Settings.GetValue(SettingsKey.make);
var model = printer.Settings.GetValue(SettingsKey.model);
var message = $"The default settings for the {make} {model} have been updated.";
message += "\nBelow you can find a list of each setting that has changed.".Localize();
message += "\nUpdating a default setting will not change any override that you have applied.".Localize();
message += "\n" + "Below you can find a list of each setting that has changed.".Localize();
message += "\n" + "Updating a default setting will not change any override that you have applied.".Localize();
generalPanel.AddChild(new WrappedTextWidget(message, pointSize: 11)
{
Margin = new BorderDouble(5, 15),

View file

@ -34,12 +34,6 @@ Translated:(Press 'Skip' to setup connection later)
English:\"{0}\" already exists.\nDo you want to replace it?
Translated:\"{0}\" already exists.\nDo you want to replace it?
English:\nBelow you can find a list of each setting that has changed.
Translated:\nBelow you can find a list of each setting that has changed.
English:\nUpdating a default setting will not change any override that you have applied.
Translated:\nUpdating a default setting will not change any override that you have applied.
English:{0} (Update Available)
Translated:{0} (Update Available)
@ -400,9 +394,6 @@ Translated:Are you sure you want to delete printer '{0}'?
English:Are you sure you want to exit while a print is running from SD Card?\n\nNote: If you exit, it is recommended you wait until the print is completed before running MatterControl again.
Translated:Are you sure you want to exit while a print is running from SD Card?\n\nNote: If you exit, it is recommended you wait until the print is completed before running MatterControl again.
English:Are you sure you want to exit while a print is running from SD Card?\n\nNote: If you exit, it is recommended you wait until the print is completed before running MatterControl again.
Translated:Are you sure you want to exit while a print is running from SD Card?\n\nNote: If you exit, it is recommended you wait until the print is completed before running MatterControl again.
English:Are you sure you want to remove the currently selected items?
Translated:Are you sure you want to remove the currently selected items?
@ -1591,9 +1582,6 @@ Translated:Error: Could not create file for saving. Original error
English:Error: Could not read file from disk. Original error:
Translated:Error: Could not read file from disk. Original error:
English:Error: Could not read file from disk. Original error:
Translated:Error: Could not read file from disk. Original error:
English:Estimated Cost
Translated:Estimated Cost
@ -1969,9 +1957,6 @@ Translated:Forums
English:Found a line that is {0} characters long.\n{1}...
Translated:Found a line that is {0} characters long.\n{1}...
English:Found a line that is {0} characters long.\n{1}...
Translated:Found a line that is {0} characters long.\n{1}...
English:Furthest Back
Translated:Furthest Back
@ -2467,9 +2452,6 @@ Translated:IP Finder
English:It appears your last print failed to complete.\n\nWould your like to attempt to recover from the last know position?
Translated:It appears your last print failed to complete.\n\nWould your like to attempt to recover from the last know position?
English:It appears your last print failed to complete.\n\nWould your like to attempt to recover from the last know position?
Translated:It appears your last print failed to complete.\n\nWould your like to attempt to recover from the last know position?
English:It is currently set to {0}.
Translated:It is currently set to {0}.
@ -3232,6 +3214,9 @@ Translated:Number of Samples
English:Number Printed
Translated:Number Printed
English:Object Actions
Translated:Object Actions
English:of
Translated:of
@ -3811,6 +3796,9 @@ Translated:Printer Options
English:Printer Paused
Translated:Printer Paused
English:Printer Settings
Translated:Printer Settings
English:Printer Setup
Translated:Printer Setup
@ -4111,9 +4099,6 @@ Translated:Reset View
English:Resetting to default values will remove your current overrides and restore your original printer settings.\nAre you sure you want to continue?
Translated:Resetting to default values will remove your current overrides and restore your original printer settings.\nAre you sure you want to continue?
English:Resetting to default values will remove your current overrides and restore your original printer settings.\nAre you sure you want to continue?
Translated:Resetting to default values will remove your current overrides and restore your original printer settings.\nAre you sure you want to continue?
English:Reshape
Translated:Reshape
@ -4957,12 +4942,6 @@ Translated:Success!\n\nYour filament should now be loaded
English:Success!\n\nYour filament should now be unloaded
Translated:Success!\n\nYour filament should now be unloaded
English:Success!\n\nYour filament should now be loaded
Translated:Success!\n\nYour filament should now be loaded
English:Success!\n\nYour filament should now be unloaded
Translated:Success!\n\nYour filament should now be unloaded
English:Support
Translated:Support
@ -5188,9 +5167,6 @@ Translated:The extra distance the raft will extend around the edge of the part.
English:The extruder is currently heating and its target temperature cannot be changed until it reaches {0}°C.\n\nYou can set the starting extruder temperature in 'Slice Settings' -> 'Filament'.\n\n{1}
Translated:The extruder is currently heating and its target temperature cannot be changed until it reaches {0}°C.\n\nYou can set the starting extruder temperature in 'Slice Settings' -> 'Filament'.\n\n{1}
English:The extruder is currently heating and its target temperature cannot be changed until it reaches {0}°C.\n\nYou can set the starting extruder temperature in 'Slice Settings' -> 'Filament'.\n\n{1}
Translated:The extruder is currently heating and its target temperature cannot be changed until it reaches {0}°C.\n\nYou can set the starting extruder temperature in 'Slice Settings' -> 'Filament'.\n\n{1}
English:The extruder to use for support material. Default will use whichever extruder active at the time.
Translated:The extruder to use for support material. Default will use whichever extruder active at the time.
@ -5206,9 +5182,6 @@ Translated:The extruder to use to print the raft. Default will use extruder 1.
English:The file you are attempting to print is a GCode file.\n\nIt is recommended that you only print Gcode files known to match your printer's configuration.\n\nAre you sure you want to print this GCode file?
Translated:The file you are attempting to print is a GCode file.\n\nIt is recommended that you only print Gcode files known to match your printer's configuration.\n\nAre you sure you want to print this GCode file?
English:The file you are attempting to print is a GCode file.\n\nIt is recommended that you only print Gcode files known to match your printer's configuration.\n\nAre you sure you want to print this GCode file?
Translated:The file you are attempting to print is a GCode file.\n\nIt is recommended that you only print Gcode files known to match your printer's configuration.\n\nAre you sure you want to print this GCode file?
English:The firmware being used by the printer. Allows for improvements based on firmware such as optimized G-Code output.
Translated:The firmware being used by the printer. Allows for improvements based on firmware such as optimized G-Code output.
@ -5230,9 +5203,6 @@ Translated:The ideal resistance is when the paper first begins to bend, but can
English:The inset amount for each side of the bed.\n- As a % of the width or depth\n- Ordered: Left, Front, Right, Back\n- NOTE: The probe offset is added on top of this
Translated:The inset amount for each side of the bed.\n- As a % of the width or depth\n- Ordered: Left, Front, Right, Back\n- NOTE: The probe offset is added on top of this
English:The inset amount for each side of the bed.\n- As a % of the width or depth\n- Ordered: Left, Front, Right, Back\n- NOTE: The probe offset is added on top of this
Translated:The inset amount for each side of the bed.\n- As a % of the width or depth\n- Ordered: Left, Front, Right, Back\n- NOTE: The probe offset is added on top of this
English:The inset amount for nozzle 1 from the bed (Left, Front, Right, Back).
Translated:The inset amount for nozzle 1 from the bed (Left, Front, Right, Back).
@ -5482,9 +5452,6 @@ Translated:The serial port communication speed of the printers firmware.
English:The 'Serial Port' section lists all available serial\nports on your device. Changing which USB port the printer\nis connected to may change the associated serial port.\n\nTip: If you are uncertain, unplug/plug in your printer\nand hit refresh. The new port that appears should be\nyour printer.
Translated:The 'Serial Port' section lists all available serial\nports on your device. Changing which USB port the printer\nis connected to may change the associated serial port.\n\nTip: If you are uncertain, unplug/plug in your printer\nand hit refresh. The new port that appears should be\nyour printer.
English:The 'Serial Port' section lists all available serial\nports on your device. Changing which USB port the printer\nis connected to may change the associated serial port.\n\nTip: If you are uncertain, unplug/plug in your printer\nand hit refresh. The new port that appears should be\nyour printer.
Translated:The 'Serial Port' section lists all available serial\nports on your device. Changing which USB port the printer\nis connected to may change the associated serial port.\n\nTip: If you are uncertain, unplug/plug in your printer\nand hit refresh. The new port that appears should be\nyour printer.
English:The serial port to use while connecting to this printer.
Translated:The serial port to use while connecting to this printer.
@ -5644,9 +5611,6 @@ Translated:The temperature to which the nozzle will be heated before printing th
English:The term 'Baud Rate' roughly means the speed at which\ndata is transmitted. Baud rates may differ from printer to\nprinter. Refer to your printer manual for more info.\n\nTip: If you are uncertain - try 250000.
Translated:The term 'Baud Rate' roughly means the speed at which\ndata is transmitted. Baud rates may differ from printer to\nprinter. Refer to your printer manual for more info.\n\nTip: If you are uncertain - try 250000.
English:The term 'Baud Rate' roughly means the speed at which\ndata is transmitted. Baud rates may differ from printer to\nprinter. Refer to your printer manual for more info.\n\nTip: If you are uncertain - try 250000.
Translated:The term 'Baud Rate' roughly means the speed at which\ndata is transmitted. Baud rates may differ from printer to\nprinter. Refer to your printer manual for more info.\n\nTip: If you are uncertain - try 250000.
English:The thickness of each layer of the print, except the base layers. A smaller number will create more layers and more vertical accuracy but also a slower print.
Translated:The thickness of each layer of the print, except the base layers. A smaller number will create more layers and more vertical accuracy but also a slower print.
@ -6142,6 +6106,9 @@ Translated:Velocity Paint
English:Version
Translated:Version
English:View
Translated:View
English:View Icons
Translated:View Icons
@ -6247,12 +6214,6 @@ Translated:Warning, very short print
English:WARNING: Disconnecting will stop the current print.\n\nAre you sure you want to disconnect?
Translated:WARNING: Disconnecting will stop the current print.\n\nAre you sure you want to disconnect?
English:WARNING: Disconnecting will stop the current print.\n\nAre you sure you want to disconnect?
Translated:WARNING: Disconnecting will stop the current print.\n\nAre you sure you want to disconnect?
English:WARNING: In order to perform print recovery, your printer must move down to reach its home position.\nIf your print is too large, part of your printer may collide with it when moving down.\nMake sure it is safe to perform this operation before proceeding.
Translated:WARNING: In order to perform print recovery, your printer must move down to reach its home position.\nIf your print is too large, part of your printer may collide with it when moving down.\nMake sure it is safe to perform this operation before proceeding.
English:WARNING: In order to perform print recovery, your printer must move down to reach its home position.\nIf your print is too large, part of your printer may collide with it when moving down.\nMake sure it is safe to perform this operation before proceeding.
Translated:WARNING: In order to perform print recovery, your printer must move down to reach its home position.\nIf your print is too large, part of your printer may collide with it when moving down.\nMake sure it is safe to perform this operation before proceeding.
@ -6406,9 +6367,6 @@ Translated:You are connected to the Emulator not an actual printer.
English:You are switching to a different thumbnail rendering mode. If you want, your current thumbnails can be removed and recreated in the new style. You can switch back and forth at any time. There will be some processing overhead while the new thumbnails are created.\n\nDo you want to rebuild your existing thumbnails now?
Translated:You are switching to a different thumbnail rendering mode. If you want, your current thumbnails can be removed and recreated in the new style. You can switch back and forth at any time. There will be some processing overhead while the new thumbnails are created.\n\nDo you want to rebuild your existing thumbnails now?
English:You are switching to a different thumbnail rendering mode. If you want, your current thumbnails can be removed and recreated in the new style. You can switch back and forth at any time. There will be some processing overhead while the new thumbnails are created.\n\nDo you want to rebuild your existing thumbnails now?
Translated:You are switching to a different thumbnail rendering mode. If you want, your current thumbnails can be removed and recreated in the new style. You can switch back and forth at any time. There will be some processing overhead while the new thumbnails are created.\n\nDo you want to rebuild your existing thumbnails now?
English:You can also
Translated:You can also
@ -6460,12 +6418,6 @@ Translated:You should select the 'Material' your are printing with under the 'Ho
English:Your 3D print has been auto-paused.\n\nLayer {0} reached.
Translated:Your 3D print has been auto-paused.\n\nLayer {0} reached.
English:Your 3D print has been auto-paused.\n\nLayer {0} reached.
Translated:Your 3D print has been auto-paused.\n\nLayer {0} reached.
English:Your 3D print has been paused.\n\nOut of filament, or jam, detected. Please load more filament or clear the jam.
Translated:Your 3D print has been paused.\n\nOut of filament, or jam, detected. Please load more filament or clear the jam.
English:Your 3D print has been paused.\n\nOut of filament, or jam, detected. Please load more filament or clear the jam.
Translated:Your 3D print has been paused.\n\nOut of filament, or jam, detected. Please load more filament or clear the jam.

@ -1 +1 @@
Subproject commit d30433b04424d0af57fa22e0bf8cec077ac41b2a
Subproject commit aed14d8ae6c0d2576271b4f48178686863ea19cc

@ -1 +1 @@
Subproject commit 4af60a9822345f3bf6800ede7d5b6c6948ea0dc9
Subproject commit 0454a13bb0f6761f582350157ac9fed7f2934861