From 3ca541e065557e11bd464ef4e6aae2ca0f2de4ce Mon Sep 17 00:00:00 2001 From: Robert Chiquini Date: Sat, 8 Apr 2017 21:43:33 -0700 Subject: [PATCH 01/11] Centralize multiselection hotkey detection, add Ctrl hotkeys This change turns control of determining whether the tool is in multiselection mode over to SelectionModule, exposing the current state through `Selection.Multiselecting`. Signed-off-by: Robert Chiquini --- Core.lua | 37 +++++++++++++++++++++++++++++++++++++ SelectionModule.lua | 37 +++++++++++++++++++++++++++++++++++++ TargetingModule.lua | 21 +++++++++------------ tools/Move.lua | 6 +++--- tools/Paint.lua | 4 ++-- tools/Resize.lua | 8 ++++---- tools/Rotate.lua | 4 ++-- 7 files changed, 94 insertions(+), 23 deletions(-) diff --git a/Core.lua b/Core.lua index 6121b4b..6803be3 100644 --- a/Core.lua +++ b/Core.lua @@ -186,6 +186,7 @@ function Enable(Mouse) EnableHotkeys(); Targeting.EnableTargeting(); Selection.EnableOutlines(); + Selection.EnableMultiselectionHotkeys(); -- Equip current tool EquipTool(CurrentTool or require(Tool.Tools.MoveTool)); @@ -304,6 +305,14 @@ AssignHotkey({ 'RightShift', 'Z' }, History.Undo); AssignHotkey({ 'LeftShift', 'Y' }, History.Redo); AssignHotkey({ 'RightShift', 'Y' }, History.Redo); +-- If in-game, enable ctrl hotkeys for undoing and redoing +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'Z' }, History.Undo); + AssignHotkey({ 'RightControl', 'Z' }, History.Undo); + AssignHotkey({ 'LeftControl', 'Y' }, History.Redo); + AssignHotkey({ 'RightControl', 'Y' }, History.Redo); +end; + function CloneSelection() -- Clones selected parts @@ -414,6 +423,14 @@ AssignHotkey({ 'RightShift', 'C' }, CloneSelection); AssignHotkey({ 'LeftShift', 'X' }, DeleteSelection); AssignHotkey({ 'RightShift', 'X' }, DeleteSelection); +-- If in-game, enable ctrl hotkeys for cloning and deleting +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'C' }, CloneSelection); + AssignHotkey({ 'RightControl', 'C' }, CloneSelection); + AssignHotkey({ 'LeftControl', 'X' }, DeleteSelection); + AssignHotkey({ 'RightControl', 'X' }, DeleteSelection); +end; + function PrismSelect() -- Selects parts in the currently selected parts @@ -465,6 +482,12 @@ end; AssignHotkey({ 'LeftShift', 'K' }, PrismSelect); AssignHotkey({ 'RightShift', 'K' }, PrismSelect); +-- If in-game, enable ctrl hotkeys for prism selection +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'K' }, PrismSelect); + AssignHotkey({ 'RightControl', 'K' }, PrismSelect); +end; + function SelectSiblings(ReplaceSelection) -- Selects all parts under the same parent as the focused part @@ -494,6 +517,14 @@ AssignHotkey({ 'RightShift', 'LeftBracket' }, Support.Call(SelectSiblings, false AssignHotkey({ 'LeftShift', 'R' }, Support.Call(Selection.Clear, true)); AssignHotkey({ 'RightShift', 'R' }, Support.Call(Selection.Clear, true)); +-- If in-game, enable ctrl hotkeys for sibling selection & selection clearing +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'LeftBracket' }, Support.Call(SelectSiblings, false)); + AssignHotkey({ 'RightControl', 'LeftBracket' }, Support.Call(SelectSiblings, false)); + AssignHotkey({ 'LeftControl', 'R' }, Support.Call(Selection.Clear, true)); + AssignHotkey({ 'RightControl', 'R' }, Support.Call(Selection.Clear, true)); +end; + function IsSelectable(Object) -- Returns whether `Object` can be selected @@ -563,6 +594,12 @@ end; AssignHotkey({ 'LeftShift', 'P' }, ExportSelection); AssignHotkey({ 'RightShift', 'P' }, ExportSelection); +-- If in-game, enable ctrl hotkeys for exporting +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'P' }, ExportSelection); + AssignHotkey({ 'RightControl', 'P' }, ExportSelection); +end; + function IsVersionOutdated() -- Returns whether this version of Building Tools is out of date diff --git a/SelectionModule.lua b/SelectionModule.lua index c73043e..ed5596c 100644 --- a/SelectionModule.lua +++ b/SelectionModule.lua @@ -8,6 +8,7 @@ Selection = {}; Selection.Items = {}; Selection.Outlines = {}; Selection.Color = BrickColor.new 'Cyan'; +Selection.Multiselecting = false; -- Events to listen to selection changes Selection.ItemsAdded = RbxUtility.CreateSignal(); @@ -278,6 +279,42 @@ function Selection.EnableOutlines() end; +function Selection.EnableMultiselectionHotkeys() + -- Enables hotkeys for multiselecting + + -- Determine multiselection hotkeys + local Hotkeys = Support.FlipTable { 'LeftShift', 'RightShift', 'LeftControl', 'RightControl' }; + + -- Get core API + local Core = GetCore(); + + -- Listen for matching key presses + Core.Connections.MultiselectionHotkeys = Support.AddUserInputListener('Began', 'Keyboard', false, function (Input) + if Hotkeys[Input.KeyCode.Name] then + Selection.Multiselecting = true; + end; + end); + + -- Listen for matching key releases + Core.Connections.MultiselectingReleaseHotkeys = Support.AddUserInputListener('Ended', 'Keyboard', true, function (Input) + + -- Get currently pressed keys + local PressedKeys = Support.GetListMembers(Support.GetListMembers(Game:GetService('UserInputService'):GetKeysPressed(), 'KeyCode'), 'Name'); + + -- Continue multiselection if a hotkey is still pressed + for _, PressedKey in pairs(PressedKeys) do + if Hotkeys[PressedKey] then + return; + end; + end; + + -- Disable multiselection if matching key not found + Selection.Multiselecting = false; + + end); + +end; + function Selection.HideOutlines() -- Hides selection outlines diff --git a/TargetingModule.lua b/TargetingModule.lua index 860f935..ef0e8ec 100644 --- a/TargetingModule.lua +++ b/TargetingModule.lua @@ -66,9 +66,6 @@ end; function TargetingModule.SelectTarget() - -- Check if shift is held - local ShiftHeld = Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift); - -- Ensure target selection isn't cancelled if SelectionCancelled then SelectionCancelled = false; @@ -76,7 +73,7 @@ function TargetingModule.SelectTarget() end; -- Focus on clicked, selected item - if not ShiftHeld and Selection.Find(Target) then + if not Selection.Multiselecting and Selection.Find(Target) then Selection.SetFocus(Target); return; end; @@ -87,17 +84,17 @@ function TargetingModule.SelectTarget() return; end; - -- Unselect clicked, selected item if shift is held - if ShiftHeld and Selection.Find(Target) then + -- Unselect clicked, selected item if multiselection is enabled + if Selection.Multiselecting and Selection.Find(Target) then Selection.Remove({ Target }, true); return; end; - -- Add to selection if shift is held - if ShiftHeld then + -- Add to selection if multiselecting + if Selection.Multiselecting then Selection.Add({ Target }, true); - -- Replace selection if shift is not held + -- Replace selection if not multiselecting else Selection.Replace({ Target }, true); end; @@ -231,11 +228,11 @@ function TargetingModule.FinishRectangleSelecting() end; end; - -- Add to selection if shift is held - if Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift) then + -- Add to selection if multiselecting + if Selection.Multiselecting then Selection.Add(SelectableItems, true); - -- Replace selection if shift is not held + -- Replace selection if not multiselecting else Selection.Replace(SelectableItems, true); end; diff --git a/tools/Move.lua b/tools/Move.lua index f040a0a..4637496 100644 --- a/tools/Move.lua +++ b/tools/Move.lua @@ -461,8 +461,8 @@ function BindShortcutKeys() MoveTool.UI.IncrementOption.Increment.TextBox:CaptureFocus(); end; - -- Check if the R key was pressed down, and it wasn't Shift R - elseif InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Check if the R key was pressed down, and it's not the selection clearing hotkey + elseif InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then -- Start tracking snap points nearest to the mouse StartSnapping(); @@ -718,7 +718,7 @@ function EnableDragging() end; -- Make sure this click was not to select - if Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift) then + if Selection.Multiselecting then return; end; diff --git a/tools/Paint.lua b/tools/Paint.lua index 54c0b07..a032d56 100644 --- a/tools/Paint.lua +++ b/tools/Paint.lua @@ -235,8 +235,8 @@ function BindShortcutKeys() end; - -- Check if the R key was pressed - if InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Check if the R key was pressed, and it wasn't the selection clearing hotkey + if InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then -- Set the current color to that of the current mouse target (if any) if Core.Mouse.Target then diff --git a/tools/Resize.lua b/tools/Resize.lua index 04b876a..d8e8fca 100644 --- a/tools/Resize.lua +++ b/tools/Resize.lua @@ -487,8 +487,8 @@ function BindShortcutKeys() elseif InputInfo.KeyCode == Enum.KeyCode.KeypadSix then NudgeSelectionByFace(Enum.NormalId.Right); - -- Start snapping when the R key is pressed down (and it's not Shift R) - elseif InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Start snapping when the R key is pressed down, and it's not the selection clearing hotkey + elseif InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then StartSnapping(); end; @@ -513,8 +513,8 @@ function BindShortcutKeys() return; end; - -- Finish snapping when the R key is released (and it's not Shift R) - if InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Finish snapping when the R key is released, and it's not the selection clearing hotkey + if InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then FinishSnapping(); end; diff --git a/tools/Rotate.lua b/tools/Rotate.lua index 800cb4f..51a320f 100644 --- a/tools/Rotate.lua +++ b/tools/Rotate.lua @@ -495,8 +495,8 @@ function BindShortcutKeys() elseif InputInfo.KeyCode == Enum.KeyCode.KeypadSix then NudgeSelectionByAxis(Enum.Axis.Y, 1); - -- Start snapping when the R key is pressed down (and it's not Shift R) - elseif InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Start snapping when the R key is pressed down, and it's not the selection clearing hotkey + elseif InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then StartSnapping(); end; From 4f8f7d9be1cdf408786c48a0cebccf53ee8a46eb Mon Sep 17 00:00:00 2001 From: Robert Chiquini Date: Sat, 8 Apr 2017 22:05:37 -0700 Subject: [PATCH 02/11] Fix handle release bugs in Move, Resize, & Rotate tools When releasing handles from these tools outside of the viewport, they'd issue an error if you attempted to drag again (due to improper checks for redundant clean-up operations). This change properly ensures that clean-up operations are actually necessary. Signed-off-by: Robert Chiquini --- tools/Move.lua | 4 ++-- tools/Resize.lua | 10 ++++------ tools/Rotate.lua | 15 +++++---------- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/tools/Move.lua b/tools/Move.lua index 4637496..3f1d6cc 100644 --- a/tools/Move.lua +++ b/tools/Move.lua @@ -305,8 +305,8 @@ function AttachHandles(Part, Autofocus) Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - -- Make sure this was button 1 being released - if InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1 then + -- Make sure this was button 1 being released, and dragging is ongoing + if not HandleDragging or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then return; end; diff --git a/tools/Resize.lua b/tools/Resize.lua index d8e8fca..14967ab 100644 --- a/tools/Resize.lua +++ b/tools/Resize.lua @@ -292,8 +292,8 @@ function ShowHandles() Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - -- Make sure this was button 1 being released - if InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1 then + -- Make sure this was button 1 being released, and handle resizing is ongoing + if not HandleResizing or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then return; end; @@ -304,8 +304,7 @@ function ShowHandles() Core.Targeting.CancelSelecting(); -- Clear this connection to prevent it from firing again - Connections.HandleRelease:disconnect(); - Connections.HandleRelease = nil; + ClearConnection 'HandleRelease'; -- Make joints, restore original anchor and collision states for _, Part in pairs(Selection.Items) do @@ -373,8 +372,7 @@ function HideHandles() Handles.Parent = nil; -- Clear unnecessary resources - Connections.AutofocusHandle:disconnect(); - Connections.AutofocusHandle = nil; + ClearConnection 'AutofocusHandle'; end; diff --git a/tools/Rotate.lua b/tools/Rotate.lua index 51a320f..12f20cd 100644 --- a/tools/Rotate.lua +++ b/tools/Rotate.lua @@ -250,8 +250,7 @@ function AttachHandles(Part, Autofocus) -- Disable autofocus if not requested and on elseif not Autofocus and Connections.AutofocusHandle then - Connections.AutofocusHandle:disconnect(); - Connections.AutofocusHandle = nil; + ClearConnection 'AutofocusHandle'; end; -- Just attach and show the handles if they already exist @@ -312,8 +311,8 @@ function AttachHandles(Part, Autofocus) Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - -- Make sure this was button 1 being released - if InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1 then + -- Make sure this was button 1 being released, and rotating is ongoing + if not HandleRotating or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then return; end; @@ -324,8 +323,7 @@ function AttachHandles(Part, Autofocus) HandleRotating = false; -- Clear this connection to prevent it from firing again - Connections.HandleRelease:disconnect(); - Connections.HandleRelease = nil; + ClearConnection 'HandleRelease'; -- Make joints, restore original anchor and collision states for _, Part in pairs(Selection.Items) do @@ -390,10 +388,7 @@ function HideHandles() Handles.Parent = nil; -- Disable handle autofocus if enabled - if Connections.AutofocusHandle then - Connections.AutofocusHandle:disconnect(); - Connections.AutofocusHandle = nil; - end; + ClearConnection 'AutofocusHandle'; end; From 9a8d94e3609378c88d28ce161972fdfd8ad6a520 Mon Sep 17 00:00:00 2001 From: Robert Chiquini Date: Sat, 8 Apr 2017 22:43:46 -0700 Subject: [PATCH 03/11] Ensure dragging is desired on part creation in New Part tool This change makes sure that dragging is still desired by the user by the time their new part replicates to their client and is selected. Signed-off-by: Robert Chiquini --- tools/NewPart.lua | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tools/NewPart.lua b/tools/NewPart.lua index 6ffa2bb..1bb1bfe 100644 --- a/tools/NewPart.lua +++ b/tools/NewPart.lua @@ -121,11 +121,22 @@ function EnableClickCreation() return; end; + -- Enable new part dragging + DragNewParts = true; + -- Create the part CreatePart(NewPartTool.Type); end); + -- Listen for click releases + Connections.ClickReleaseListener = Support.AddUserInputListener('Ended', 'MouseButton1', true, function () + + -- Cancel dragging new parts if mouse button is released + DragNewParts = false; + + end); + end; function CreatePart(Type) @@ -171,7 +182,9 @@ function CreatePart(Type) Core.EquipTool(MoveTool); -- Enable dragging to allow easy positioning of the created part - MoveTool.SetUpDragging(Part); + if DragNewParts then + MoveTool.SetUpDragging(Part); + end; end; From 21008bc52b46943a32f0315b8810eca0fe203c8d Mon Sep 17 00:00:00 2001 From: Robert Chiquini Date: Sat, 8 Apr 2017 23:14:23 -0700 Subject: [PATCH 04/11] Prevent locked parts from being modified by SyncAPI Signed-off-by: Robert Chiquini --- SyncAPI.lua | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 127 insertions(+), 4 deletions(-) diff --git a/SyncAPI.lua b/SyncAPI.lua index a2c9cc7..21019fd 100644 --- a/SyncAPI.lua +++ b/SyncAPI.lua @@ -43,10 +43,8 @@ Actions = { -- Clones the given parts -- Make sure the given items are all parts - for _, Part in pairs(Parts) do - if not Part:IsA 'BasePart' then - return; - end; + if not ArePartsSelectable(Parts) then + return; end; -- Cache up permissions for all private areas @@ -126,6 +124,11 @@ Actions = { end; + -- Ensure relevant parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -173,6 +176,11 @@ Actions = { end; + -- Ensure relevant parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -209,6 +217,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -269,6 +282,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -331,6 +349,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -391,6 +414,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -433,6 +461,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -472,6 +505,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -527,6 +565,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -597,6 +640,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -652,6 +700,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -725,6 +778,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -772,6 +830,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -834,6 +897,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -890,6 +958,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -953,6 +1026,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -987,6 +1065,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -1021,6 +1104,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -1055,6 +1143,11 @@ Actions = { ['CreateWelds'] = function (Parts, TargetPart) -- Creates welds for the given parts to the target part + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -1113,6 +1206,11 @@ Actions = { end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + local WeldsRemoved = 0; -- Cache up permissions for all private areas @@ -1168,6 +1266,11 @@ Actions = { end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -1213,6 +1316,11 @@ Actions = { return; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -1312,6 +1420,21 @@ Actions = { }; +function ArePartsSelectable(Parts) + -- Returns whether the parts are selectable + + -- Check whether each part is selectable + for _, Part in pairs(Parts) do + if not Part:IsA 'BasePart' or Part.Locked then + return false; + end; + end; + + -- Return true if all parts are selectable + return true; + +end; + -- Provide an interface into the module return { From 97e9bc4163cf62adc458c46fbfe29c5e74498921 Mon Sep 17 00:00:00 2001 From: Robert Chiquini Date: Sat, 8 Apr 2017 23:48:20 -0700 Subject: [PATCH 05/11] Reject clients not operating a tool from calling its SyncAPI This change makes the SyncAPI reject requests from clients other than the one operating the tool, for security reasons. Signed-off-by: Robert Chiquini --- SyncAPI.lua | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/SyncAPI.lua b/SyncAPI.lua index 21019fd..1f785b9 100644 --- a/SyncAPI.lua +++ b/SyncAPI.lua @@ -1435,6 +1435,27 @@ function ArePartsSelectable(Parts) end; +-- Keep current player updated in tool mode +if ToolMode == 'Tool' then + + -- Set current player + Player = Players:GetPlayerFromCharacter(Tool.Parent); + + -- Stay updated with latest player operating the tool + Tool.AncestryChanged:Connect(function (Child, Parent) + + -- Ensure tool's parent changed + if Child ~= Tool then + return; + end; + + -- Update current player + Player = Players:GetPlayerFromCharacter(Parent); + + end); + +end; + -- Provide an interface into the module return { @@ -1450,8 +1471,10 @@ return { return; end; - -- Update the Player pointer - Player = Client; + -- Ensure client is current player in tool mode + if ToolMode == 'Tool' then + assert(Player and (Client == Player), 'Permission denied for client'); + end; -- Execute valid actions return Action(...); From a0e0d387fdead8a967632a19b8cff0d3c56a00c2 Mon Sep 17 00:00:00 2001 From: Robert Chiquini Date: Sat, 8 Apr 2017 23:59:23 -0700 Subject: [PATCH 06/11] Prevent rectangle selection while new parts load in New Part tool Signed-off-by: Robert Chiquini --- tools/NewPart.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/NewPart.lua b/tools/NewPart.lua index 1bb1bfe..98c986b 100644 --- a/tools/NewPart.lua +++ b/tools/NewPart.lua @@ -123,6 +123,7 @@ function EnableClickCreation() -- Enable new part dragging DragNewParts = true; + Core.Targeting.CancelSelecting(); -- Create the part CreatePart(NewPartTool.Type); From 93e8fe9974a830aba191b28484a26512f50ad2bd Mon Sep 17 00:00:00 2001 From: Robert Chiquini Date: Sun, 9 Apr 2017 00:10:17 -0700 Subject: [PATCH 07/11] Round displayed increment field numbers to 4 decimal places This change should let allow the user to see more accurately what they have set for their increment while still preventing floating point precision issues from being visible. Signed-off-by: Robert Chiquini --- tools/Move.lua | 2 +- tools/Resize.lua | 2 +- tools/Rotate.lua | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/Move.lua b/tools/Move.lua index 3f1d6cc..bfc7613 100644 --- a/tools/Move.lua +++ b/tools/Move.lua @@ -103,7 +103,7 @@ function ShowUI() local IncrementInput = MoveTool.UI.IncrementOption.Increment.TextBox; IncrementInput.FocusLost:connect(function (EnterPressed) MoveTool.Increment = tonumber(IncrementInput.Text) or MoveTool.Increment; - IncrementInput.Text = Support.Round(MoveTool.Increment, 3); + IncrementInput.Text = Support.Round(MoveTool.Increment, 4); end); -- Add functionality to the position inputs diff --git a/tools/Resize.lua b/tools/Resize.lua index 14967ab..c01b297 100644 --- a/tools/Resize.lua +++ b/tools/Resize.lua @@ -103,7 +103,7 @@ function ShowUI() local IncrementInput = ResizeTool.UI.IncrementOption.Increment.TextBox; IncrementInput.FocusLost:connect(function (EnterPressed) ResizeTool.Increment = tonumber(IncrementInput.Text) or ResizeTool.Increment; - IncrementInput.Text = Support.Round(ResizeTool.Increment, 3); + IncrementInput.Text = Support.Round(ResizeTool.Increment, 4); end); -- Add functionality to the size inputs diff --git a/tools/Rotate.lua b/tools/Rotate.lua index 12f20cd..5e80de1 100644 --- a/tools/Rotate.lua +++ b/tools/Rotate.lua @@ -110,7 +110,7 @@ function ShowUI() local IncrementInput = RotateTool.UI.IncrementOption.Increment.TextBox; IncrementInput.FocusLost:connect(function (EnterPressed) RotateTool.Increment = tonumber(IncrementInput.Text) or RotateTool.Increment; - IncrementInput.Text = Support.Round(RotateTool.Increment, 3); + IncrementInput.Text = Support.Round(RotateTool.Increment, 4); end); -- Add functionality to the rotation inputs From ac5b0256d6d8f3766a10291a468ef285558dc55b Mon Sep 17 00:00:00 2001 From: Robert Chiquini Date: Sun, 9 Apr 2017 00:56:52 -0700 Subject: [PATCH 08/11] Add T as alias hotkey to R for snapping in Rotate tool This change restores T as a hotkey for snapped pivot point selection as an alias for the new R hotkey, which should help not disrupt the workflows of users accustomed to using the T key. Signed-off-by: Robert Chiquini --- tools/Rotate.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/Rotate.lua b/tools/Rotate.lua index 5e80de1..f58b0e8 100644 --- a/tools/Rotate.lua +++ b/tools/Rotate.lua @@ -491,7 +491,11 @@ function BindShortcutKeys() NudgeSelectionByAxis(Enum.Axis.Y, 1); -- Start snapping when the R key is pressed down, and it's not the selection clearing hotkey - elseif InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then + elseif (InputInfo.KeyCode == Enum.KeyCode.R) and not Selection.Multiselecting then + StartSnapping(); + + -- Start snapping when T key is pressed down (alias) + elseif InputInfo.KeyCode == Enum.KeyCode.T then StartSnapping(); end; From abc03395bd45bc9192c01c4e0ac95ee244fefb8e Mon Sep 17 00:00:00 2001 From: Robert Chiquini Date: Sun, 9 Apr 2017 00:59:04 -0700 Subject: [PATCH 09/11] Clean up snapping options when SnapTracking.StopTracking() is called This should fix an issue where snapping does not work at first try when using the rotate tool after equipping the move tool (which sets a target blacklist and expects SnapTracking.StopTracking() to clean it up regardless of whether tracking is ongoing or not). Signed-off-by: Robert Chiquini --- SnapTracking.lua | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/SnapTracking.lua b/SnapTracking.lua index b79dcfd..c05d3dd 100644 --- a/SnapTracking.lua +++ b/SnapTracking.lua @@ -212,6 +212,17 @@ end; function SnapTracking.StopTracking() -- Stops tracking the current closest snapping point, cleans up + -- Clear the previous tracking target, and callback + SnapTracking.Target = nil; + SnapTracking.Callback = nil; + + -- Reset snapping point options + SnapTracking.TrackFaceCentroids = true; + SnapTracking.TrackEdgeMidpoints = true; + SnapTracking.TrackCorners = true; + SnapTracking.TargetFilter = nil; + SnapTracking.TargetBlacklist = {}; + -- Make sure we're currently tracking if not SnapTracking.Enabled then return; @@ -224,18 +235,6 @@ function SnapTracking.StopTracking() -- Clear the point marker UI from the screen SnapTracking.ClearUI(); - -- Clear the previous tracking target, and callback - SnapTracking.Target = nil; - SnapTracking.Callback = nil; - - -- Reset snapping point options - SnapTracking.TrackFaceCentroids = true; - SnapTracking.TrackEdgeMidpoints = true; - SnapTracking.TrackCorners = true; - - SnapTracking.TargetFilter = nil; - SnapTracking.TargetBlacklist = {}; - -- Indicate that tracking is no longer enabled SnapTracking.Enabled = false; From 740a037b2386e57355c891cc4ed6fd63dbaf6ee1 Mon Sep 17 00:00:00 2001 From: Robert Chiquini Date: Sun, 9 Apr 2017 06:54:22 -0700 Subject: [PATCH 10/11] Add visual guides for snapping in the Resize tool Signed-off-by: Robert Chiquini --- tools/Resize.lua | 151 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 121 insertions(+), 30 deletions(-) diff --git a/tools/Resize.lua b/tools/Resize.lua index c01b297..e29bd77 100644 --- a/tools/Resize.lua +++ b/tools/Resize.lua @@ -746,10 +746,13 @@ PointSnapped = Core.RbxUtility.CreateSignal(); function StartSnapping() -- Make sure snapping isn't already enabled - if SnapTracking.Enabled then + if SnappingStage or SnapTracking.Enabled then return; end; + -- Start first snapping stage + SnappingStage = 'Starting'; + -- Only enable corner snapping SnapTracking.TrackEdgeMidpoints = false; SnapTracking.TrackFaceCentroids = false; @@ -775,48 +778,89 @@ function StartSnapping() SnappingStartSelectionState = PreparePartsForResizing(); AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Selection.Items), Core.Player); + -- Pause snapping + SnapTracking.StopTracking(); + + -- Start a direction line + DirectionLine = Core.Tool.Interfaces.SnapLine:Clone(); + DirectionLine.Parent = Core.UI; + DirectionLine.Visible = false; + -- Track changes for history TrackChange(); -- Listen for when the user drags - Connections.SnapDrag = Support.AddUserInputListener('Changed', 'MouseMovement', false, function (Input) + Connections.SnapDrag = Support.AddUserInputListener('Changed', 'MouseMovement', true, function (Input) -- Update the latest aim SnappingEndAim = Vector2.new(Input.Position.X, Input.Position.Y); + ScreenSnappedPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappingStartPoint); + ScreenSnappedPoint = Vector2.new(ScreenSnappedPoint.X, ScreenSnappedPoint.Y); - -- Use the mouse position to figure out the resize direction (until after 20px) - if SnappingStage == 'Direction' then + -- Calculate direction setting length + local DirectionSettingLength = math.min(50, math.max(50, (SnappingStartAim - ScreenSnappedPoint).magnitude * 1.5)); - -- Check the length - local Length = (SnappingEndAim - SnappingStartAim).magnitude; - if Length < 20 then - return; - end; + -- Use the mouse position to figure out the resize direction (until after direction setting length) + if SnappingStage == 'Direction' then - local DragSlope = (SnappingEndAim.Y - SnappingStartAim.Y) / (SnappingEndAim.X - SnappingStartAim.X); + -- Get current angle from snap point + local DragAngle = math.deg(math.atan2(SnappingEndAim.Y - ScreenSnappedPoint.Y, SnappingEndAim.X - ScreenSnappedPoint.X)); + DragAngle = (DragAngle > 0) and (DragAngle - 360) or DragAngle; -- Go through corner offsets representing the possible directions local Directions = {}; for _, Direction in pairs(SnappingStartDirections) do -- Map the corner & corner offset to screen points - local ScreenSnappedPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappingStartPoint); local ScreenOffsetPoint = Workspace.CurrentCamera:WorldToScreenPoint(Direction.Offset); - -- Get the slope representing the direction (based on the mapped screen points) - local DirectionSlope = (ScreenOffsetPoint.Y - ScreenSnappedPoint.Y) / (ScreenOffsetPoint.X - ScreenSnappedPoint.X); + -- Get direction angle from snap point + local DirectionAngle = math.deg(math.atan2(ScreenOffsetPoint.Y - ScreenSnappedPoint.Y, ScreenOffsetPoint.X - ScreenSnappedPoint.X)); + DirectionAngle = (DirectionAngle > 0) and (DirectionAngle - 360) or DirectionAngle; + + -- Calculate delta between drag and direction angles + local AngleDelta = math.abs(DragAngle - DirectionAngle) % 180; + AngleDelta = (AngleDelta > 90) and (180 - AngleDelta) or AngleDelta; - -- Calculate the similarity between the drag & direction slopes - local SlopeDelta = math.abs(math.abs(DragSlope) - math.abs(DirectionSlope)); - table.insert(Directions, { Face = Direction.Face, SlopeDelta = SlopeDelta, Offset = Direction.Offset }); + -- Insert the potential direction + table.insert(Directions, { + Face = Direction.Face, + AngleDelta = AngleDelta, + DirectionAngle = DirectionAngle, + Offset = Direction.Offset + }); end; - -- Get the direction slope closest to the mouse's + -- Get the direction most similar to the dragging angle table.sort(Directions, function (A, B) - return A.SlopeDelta < B.SlopeDelta; + return A.AngleDelta < B.AngleDelta; end); + -- Center direction line at snap point + DirectionLine.Position = UDim2.new(0, ScreenSnappedPoint.X, 0, ScreenSnappedPoint.Y); + + -- Orient direction line towards drag direction + if math.abs(DragAngle - Directions[1].DirectionAngle) <= 90 then + DirectionLine.Rotation = Directions[1].DirectionAngle; + else + DirectionLine.Rotation = 180 + Directions[1].DirectionAngle; + end; + + -- Show the direction line + DirectionLine.PointMarker.Rotation = -DirectionLine.Rotation; + DirectionLine.SnapProgress.Size = UDim2.new(0, DirectionSettingLength, 2, 0); + DirectionLine.Visible = true; + + -- Check if drag has passed direction setting length + local Length = (SnappingEndAim - ScreenSnappedPoint).magnitude; + if Length < DirectionSettingLength then + return; + end; + + -- Clear the direction line + DirectionLine:Destroy() + -- Select the resizing direction that was closest to the mouse drag SnappingDirection = Directions[1].Face; SnappingDirectionOffset = Directions[1].Offset; @@ -824,11 +868,24 @@ function StartSnapping() -- Move to the destination-picking stage of snapping SnappingStage = 'Destination'; + -- Set destination-stage snapping options + SnapTracking.TrackEdgeMidpoints = true; + SnapTracking.TrackFaceCentroids = true; SnapTracking.TargetFilter = function (Target) return not Target.Locked; end; SnapTracking.TargetBlacklist = Selection.Items; - -- Resize in the selected direction up to the targeted destination - elseif SnappingStage == 'Destination' then + -- Re-enable snapping to select destination + SnapTracking.StartTracking(function (NewPoint) + if NewPoint and NewPoint.p ~= SnappedPoint then + SnappedPoint = NewPoint.p; + PointSnapped:fire(NewPoint.p); + end; + end); + + -- Start a distance alignment line + AlignmentLine = Core.Tool.Interfaces.SnapLineSegment:Clone(); + AlignmentLine.Visible = false; + AlignmentLine.Parent = Core.UI; end; @@ -837,7 +894,10 @@ function StartSnapping() -- Listen for when a new point is snapped Connections.Snap = PointSnapped:connect(function (SnappedPoint) + -- Resize to snap point if in the destination stage of snapping if SnappingStage == 'Destination' then + + -- Calculate direction and distance to resize towards local Direction = (SnappingDirectionOffset - SnappingStartPoint).unit; local Distance = (SnappedPoint - SnappingStartPoint):Dot(Direction); @@ -857,24 +917,41 @@ function StartSnapping() end; end; + -- Get snap point and destination point screen positions for UI alignment + local ScreenStartPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappingStartPoint + (Direction * Distance)); + ScreenStartPoint = Vector2.new(ScreenStartPoint.X, ScreenStartPoint.Y); + local ScreenDestinationPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappedPoint); + ScreenDestinationPoint = Vector2.new(ScreenDestinationPoint.X, ScreenDestinationPoint.Y) + + -- Update the distance alignment line + local AlignmentAngle = math.deg(math.atan2(ScreenDestinationPoint.Y - ScreenStartPoint.Y, ScreenDestinationPoint.X - ScreenStartPoint.X)); + local AlignmentCenter = ScreenStartPoint:Lerp(ScreenDestinationPoint, 0.5); + AlignmentLine.Position = UDim2.new(0, AlignmentCenter.X, 0, AlignmentCenter.Y); + AlignmentLine.Rotation = AlignmentAngle; + AlignmentLine.Size = UDim2.new(0, (ScreenDestinationPoint - ScreenStartPoint).magnitude, 0, 1); + AlignmentLine.PointMarkerA.Rotation = -AlignmentAngle; + AlignmentLine.Visible = true; + end; end); - -- Listen for the end of the snapping - Connections.SnapDragEnd = Support.AddUserInputListener('Ended', 'MouseButton1', false, function (Input) + end); + + -- Listen for the end of the snapping + Connections.SnapDragEnd = Support.AddUserInputListener('Ended', 'MouseButton1', true, function (Input) - -- Restore the selection's original state + -- If destination stage was reached, restore the selection's original state + if SnappingStage == 'Destination' then for Part, PartState in pairs(SnappingStartSelectionState) do Part:MakeJoints(); Part.CanCollide = PartState.CanCollide; Part.Anchored = PartState.Anchored; end; + end; - -- Finish snapping - FinishSnapping(); - - end); + -- Finish snapping + FinishSnapping(); end); @@ -882,14 +959,27 @@ end; function FinishSnapping() - -- Make sure snapping is enabled - if not SnapTracking.Enabled then + -- Ensure snapping is ongoing + if not SnappingStage then return; end; + -- Disable any snapping stage + SnappingStage = nil; + -- Stop snap point tracking SnapTracking.StopTracking(); + -- Clear any UI + if DirectionLine then + DirectionLine:Destroy(); + DirectionLine = nil; + end; + if AlignmentLine then + AlignmentLine:Destroy(); + AlignmentLine = nil; + end; + -- Register any change if HistoryRecord then RegisterChange(); @@ -914,7 +1004,8 @@ function GetFaceOffsetsFromCorner(Part, Point) for _, Face in pairs(Faces) do -- Calculate the offset from the corner in the direction of the face - local Offset = CFrame.new(Point) * CFrame.Angles(Part.CFrame:toEulerAnglesXYZ()) * Vector3.FromNormalId(Face); + local FaceOffset = (Vector3.FromNormalId(Face) * Part.Size) / 2; + local Offset = CFrame.new(Point) * CFrame.Angles(Part.CFrame:toEulerAnglesXYZ()) * FaceOffset; table.insert(Offsets, { Face = Face, Offset = Offset }); end; From 055e86de7ad8a0d67351ef3c6ef17a99b18bf518 Mon Sep 17 00:00:00 2001 From: Robert Chiquini Date: Sun, 9 Apr 2017 07:17:15 -0700 Subject: [PATCH 11/11] Update asset builds to 2.0.2 Signed-off-by: Robert Chiquini --- build/Building Tools by F3X (plugin).rbxmx | 4017 +++++++++------- build/Building Tools by F3X.rbxmx | 5061 +++++++++++--------- 2 files changed, 5224 insertions(+), 3854 deletions(-) diff --git a/build/Building Tools by F3X (plugin).rbxmx b/build/Building Tools by F3X (plugin).rbxmx index f1f478e..6d5142c 100644 --- a/build/Building Tools by F3X (plugin).rbxmx +++ b/build/Building Tools by F3X (plugin).rbxmx @@ -1,11 +1,11 @@ null nil - + Building Tools by F3X - + false -0.5 @@ -76,7 +76,7 @@ 0.800000012 - + 4294967295 5 @@ -85,7 +85,7 @@ 0 - + 4294967295 2 @@ -94,7 +94,7 @@ 0 - + 4294967295 3 @@ -103,7 +103,7 @@ 0 - + 4294967295 0 @@ -112,7 +112,7 @@ 0 - + 4294967295 1 @@ -121,7 +121,7 @@ 0 - + 4294967295 4 @@ -131,17 +131,17 @@ - + Version - 2.0.1 + 2.0.2 - + SupportLibrary - {AF627CE6-3567-4B19-9CF5-F9C8CC50C418} + {276F344C-469D-449C-A433-FBB18E3B8592} - + SecurityModule - {76D5254D-1B8B-4F38-BB29-0EC26AF3AA53} + {4E96BCE7-DB08-47A6-A42B-4833931B2534} - + Region by AxisAngle - {BEC01F60-B2C1-4440-9F13-256054C7BCB5} + {89D34A64-F5F0-4495-B701-DFE9DF5DF47F} - + false @@ -1818,11 +1818,11 @@ end; -- Expose GetLibraries function _G.GetLibraries = GetLibraries;]]> - + F3X/SupportLibrary@1.0.0 - {1BFC3C3C-D06F-4B5C-B79D-70FF6735DB05} + {3828CCBC-611C-4CF0-B73C-54AAC681E6BF} - + Metadata - {BF155B56-AE7D-4141-95CC-6A0406FB470B} + {AC4DF028-750A-4E46-8C20-211ABC74B847} - + F3X/Cheer@0.0.1 - {98A4ED7A-8D23-4CC2-B199-CBDFD6FF8F8E} + {16EFB4A5-2040-4B3A-80D3-241B3559EDD2} - + SupportLibrary - {0B356333-F133-4A5C-A3DB-ADE5E8F1CB44} + {F44136EB-B2E1-421E-9BD5-0D84C8A96319} - + Metadata - {07F16FB1-2B62-4ACA-B1FF-DE8D5DBF710C} + {6D285C58-D789-4B70-9DC4-5C0A69C25364} - + F3X/Try@1.0.0 - {1BBDA9BF-F632-4F2D-8989-662255D82D8E} + {7803A1CF-A0BD-44FB-8D3C-6197C12C636A} - + SupportLibrary @@ -5232,11 +5232,11 @@ end; return SupportLibrary;]]> - + Metadata - {52186982-44A5-4662-942E-26B8CCED7DA6} + {E3EA7C7A-3B45-486A-BDA8-BC9544AB6DD6} - + SerializationModule - {D163F155-7BCD-4459-B9C8-5BB9ACFEECBD} + {1ECE6BA9-B787-4C56-A8E8-628058296208} - + SyncAPI - + SyncModule - {49365CC0-6516-4C49-9260-E2110558F236} + {EC0655C1-19C5-46D5-80C5-022FCDCEA683} - + ServerEndpoint - + false ServerEndpointScript - {4B29E480-CBE5-4E88-A026-FCAAD6F2E57D} + {F6CFC9BD-5C68-4659-9451-4B5E8FAB5C2C} - + false @@ -7103,22 +7249,22 @@ end;]]> - + Loaded false - + ComponentCount 0 - + false ComponentCounter - {A6B5CC4F-EB25-4EEF-8CD5-9E2608E6B9D2} + {EDDC90CF-4D08-424E-A71E-DB82F6D5733E}

- + false @@ -7156,11 +7302,11 @@ Indicator.Value = true;]]> - + Assets - + {FA84AA5E-2C4A-4101-A9CA-8C71F770285B} return Assets;]]> - + Core - {958EE6C4-B502-4727-8B0E-C16FDB0960C0} + {6B760565-60C5-48B3-A318-D45F5FC82581} - + false @@ -7865,15 +8048,15 @@ local Core = require(Tool:WaitForChild 'Core'); require(Tool.Tools.CoreToolLoader);]]> - + Tools - + MoveTool - {BA9280AF-0194-4E51-BBFC-54865E1DDBF6} + {80377989-C9D8-4BF7-9CA7-D00D66BD7980} - + ResizeTool - {F0B36D21-330E-4356-BA8F-EFE7B3932638} + {EF60C14F-E6FD-43A5-8D4C-45E623CB66C0} 0) and (DragAngle - 360) or DragAngle; -- Go through corner offsets representing the possible directions local Directions = {}; for _, Direction in pairs(SnappingStartDirections) do -- Map the corner & corner offset to screen points - local ScreenSnappedPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappingStartPoint); local ScreenOffsetPoint = Workspace.CurrentCamera:WorldToScreenPoint(Direction.Offset); - -- Get the slope representing the direction (based on the mapped screen points) - local DirectionSlope = (ScreenOffsetPoint.Y - ScreenSnappedPoint.Y) / (ScreenOffsetPoint.X - ScreenSnappedPoint.X); + -- Get direction angle from snap point + local DirectionAngle = math.deg(math.atan2(ScreenOffsetPoint.Y - ScreenSnappedPoint.Y, ScreenOffsetPoint.X - ScreenSnappedPoint.X)); + DirectionAngle = (DirectionAngle > 0) and (DirectionAngle - 360) or DirectionAngle; - -- Calculate the similarity between the drag & direction slopes - local SlopeDelta = math.abs(math.abs(DragSlope) - math.abs(DirectionSlope)); - table.insert(Directions, { Face = Direction.Face, SlopeDelta = SlopeDelta, Offset = Direction.Offset }); + -- Calculate delta between drag and direction angles + local AngleDelta = math.abs(DragAngle - DirectionAngle) % 180; + AngleDelta = (AngleDelta > 90) and (180 - AngleDelta) or AngleDelta; + + -- Insert the potential direction + table.insert(Directions, { + Face = Direction.Face, + AngleDelta = AngleDelta, + DirectionAngle = DirectionAngle, + Offset = Direction.Offset + }); end; - -- Get the direction slope closest to the mouse's + -- Get the direction most similar to the dragging angle table.sort(Directions, function (A, B) - return A.SlopeDelta < B.SlopeDelta; + return A.AngleDelta < B.AngleDelta; end); + -- Center direction line at snap point + DirectionLine.Position = UDim2.new(0, ScreenSnappedPoint.X, 0, ScreenSnappedPoint.Y); + + -- Orient direction line towards drag direction + if math.abs(DragAngle - Directions[1].DirectionAngle) <= 90 then + DirectionLine.Rotation = Directions[1].DirectionAngle; + else + DirectionLine.Rotation = 180 + Directions[1].DirectionAngle; + end; + + -- Show the direction line + DirectionLine.PointMarker.Rotation = -DirectionLine.Rotation; + DirectionLine.SnapProgress.Size = UDim2.new(0, DirectionSettingLength, 2, 0); + DirectionLine.Visible = true; + + -- Check if drag has passed direction setting length + local Length = (SnappingEndAim - ScreenSnappedPoint).magnitude; + if Length < DirectionSettingLength then + return; + end; + + -- Clear the direction line + DirectionLine:Destroy() + -- Select the resizing direction that was closest to the mouse drag SnappingDirection = Directions[1].Face; SnappingDirectionOffset = Directions[1].Offset; @@ -9796,11 +10021,24 @@ function StartSnapping() -- Move to the destination-picking stage of snapping SnappingStage = 'Destination'; + -- Set destination-stage snapping options + SnapTracking.TrackEdgeMidpoints = true; + SnapTracking.TrackFaceCentroids = true; SnapTracking.TargetFilter = function (Target) return not Target.Locked; end; SnapTracking.TargetBlacklist = Selection.Items; - -- Resize in the selected direction up to the targeted destination - elseif SnappingStage == 'Destination' then + -- Re-enable snapping to select destination + SnapTracking.StartTracking(function (NewPoint) + if NewPoint and NewPoint.p ~= SnappedPoint then + SnappedPoint = NewPoint.p; + PointSnapped:fire(NewPoint.p); + end; + end); + + -- Start a distance alignment line + AlignmentLine = Core.Tool.Interfaces.SnapLineSegment:Clone(); + AlignmentLine.Visible = false; + AlignmentLine.Parent = Core.UI; end; @@ -9809,7 +10047,10 @@ function StartSnapping() -- Listen for when a new point is snapped Connections.Snap = PointSnapped:connect(function (SnappedPoint) + -- Resize to snap point if in the destination stage of snapping if SnappingStage == 'Destination' then + + -- Calculate direction and distance to resize towards local Direction = (SnappingDirectionOffset - SnappingStartPoint).unit; local Distance = (SnappedPoint - SnappingStartPoint):Dot(Direction); @@ -9829,24 +10070,39 @@ function StartSnapping() end; end; + -- Update the distance alignment line + local ScreenStartPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappingStartPoint + (Direction * Distance)); + ScreenStartPoint = Vector2.new(ScreenStartPoint.X, ScreenStartPoint.Y); + local ScreenDestinationPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappedPoint); + ScreenDestinationPoint = Vector2.new(ScreenDestinationPoint.X, ScreenDestinationPoint.Y) + local AlignmentAngle = math.deg(math.atan2(ScreenDestinationPoint.Y - ScreenStartPoint.Y, ScreenDestinationPoint.X - ScreenStartPoint.X)); + local AlignmentCenter = ScreenStartPoint:Lerp(ScreenDestinationPoint, 0.5); + AlignmentLine.Position = UDim2.new(0, AlignmentCenter.X, 0, AlignmentCenter.Y); + AlignmentLine.Rotation = AlignmentAngle; + AlignmentLine.Size = UDim2.new(0, (ScreenDestinationPoint - ScreenStartPoint).magnitude, 0, 1); + AlignmentLine.PointMarkerA.Rotation = -AlignmentAngle; + AlignmentLine.Visible = true; + end; end); - -- Listen for the end of the snapping - Connections.SnapDragEnd = Support.AddUserInputListener('Ended', 'MouseButton1', false, function (Input) + end); - -- Restore the selection's original state + -- Listen for the end of the snapping + Connections.SnapDragEnd = Support.AddUserInputListener('Ended', 'MouseButton1', true, function (Input) + + -- If destination stage was reached, restore the selection's original state + if SnappingStage == 'Destination' then for Part, PartState in pairs(SnappingStartSelectionState) do Part:MakeJoints(); Part.CanCollide = PartState.CanCollide; Part.Anchored = PartState.Anchored; end; + end; - -- Finish snapping - FinishSnapping(); - - end); + -- Finish snapping + FinishSnapping(); end); @@ -9854,14 +10110,27 @@ end; function FinishSnapping() - -- Make sure snapping is enabled - if not SnapTracking.Enabled then + -- Ensure snapping is ongoing + if not SnappingStage then return; end; + -- Disable any snapping stage + SnappingStage = nil; + -- Stop snap point tracking SnapTracking.StopTracking(); + -- Clear any UI + if DirectionLine then + DirectionLine:Destroy(); + DirectionLine = nil; + end; + if AlignmentLine then + AlignmentLine:Destroy(); + AlignmentLine = nil; + end; + -- Register any change if HistoryRecord then RegisterChange(); @@ -9886,7 +10155,8 @@ function GetFaceOffsetsFromCorner(Part, Point) for _, Face in pairs(Faces) do -- Calculate the offset from the corner in the direction of the face - local Offset = CFrame.new(Point) * CFrame.Angles(Part.CFrame:toEulerAnglesXYZ()) * Vector3.FromNormalId(Face); + local FaceOffset = (Vector3.FromNormalId(Face) * Part.Size) / 2; + local Offset = CFrame.new(Point) * CFrame.Angles(Part.CFrame:toEulerAnglesXYZ()) * FaceOffset; table.insert(Offsets, { Face = Face, Offset = Offset }); end; @@ -9924,11 +10194,11 @@ end; return ResizeTool;]]> - + RotateTool - {B983F910-4440-431B-A881-AB6B5FB4C766} + {A7AB7D91-49BD-444B-A952-74ED46D19074} - + PaintTool - {8323345E-2D2F-4929-A57E-49A834D16BC3} + {0EA1E586-EFB4-4214-B3B7-FBC01CDED54C} - + Colors - {9E8DF8AA-CC39-498D-BF13-FB3AE5100F5C} + {C6EABBA4-1EA9-4305-B756-B8D9A8DF182C} - + MaterialTool - {4A849024-D15B-435A-AE42-44C636732F6F} + {6A8679E1-D40E-457E-9D79-E984DAA8CA4B} - + SurfaceTool - {FD107264-0289-40DE-B5E3-D7EFCB3BF7DE} + {706E28B3-CB18-4AE7-AFDA-9CC3D16B6BD6} - + AnchorTool - {39BB8B98-872F-45F2-9F81-9938C2770B07} + {BE379B00-A4F5-419C-A212-DF9B5314B2C9} - + WeldTool - {D5D58A5D-A5AE-4B70-8DB9-0F8B3D6B4A00} + {ECBCA2B4-1E19-4F4E-83B6-669C1081F4A1} - + TextureTool - {2008ECA0-2452-425A-B69F-E1D08E5D7849} + {EAA36324-C317-42BF-9A80-969E28F10BE8} - + MeshTool - {17186AB6-E03A-4606-8427-577D2EDCC376} + {3B00474D-3D83-4FB0-A224-076485D183D1} - + NewPartTool - {CE305198-CA4A-41C8-AD59-C58037734E7D} + {7E9DE192-2A40-4C2F-B9A5-E817A45736BE} - + CollisionTool - {4033ADF8-239A-4F3E-9A9E-18DA37C56500} + {83B427DA-EA7D-4BAF-908B-40AA669E5579} - + LightingTool - {D43C35D7-DA24-4CFB-87FF-A6470FD5E1D9} + {79DBCE5A-9F71-45B2-A6EA-288D265B4E32} - + DecorateTool - {D7840BB9-C484-4B12-A9EC-78CC6505EF79} + {0E0B695C-8E66-4E0B-90B9-376FCDA2F2A5} - + CoreToolLoader - {3F5C1C64-696A-4DD0-89F3-DBDED924332B} + {4C9EDCE1-0C3D-4DE1-8B26-64D37BA31A4B} - + HistoryModule - {6288DC45-6776-438D-87AA-228EECDAB939} + {4A65DBBA-9B53-4359-9564-49FF0A1627C6} - + SelectionModule - {70A36175-8C37-4C3D-9EDA-1450A97973E6} + {A29F8FD0-608F-47BE-9EFB-44606ADDBD18} - + SnappingModule - {9BA2249E-0910-42E8-A33B-A7770A0C2C2F} + {C34FDBD9-582C-4ACB-BB31-6068DC4E3F11} - + FilterMode false - + false FilterModeEnabler - {C561BA6D-45E6-4047-B075-C46E5D92043C} + {40F29F65-F981-4A7D-A3FB-B378FC62989E} script.Parent.Value = Workspace.FilteringEnabled; - + BoundingBoxModule - {06F07FFE-D7C3-4494-BAB7-1FAAA5F5E2C6} + {4C69E677-F657-40FA-B390-DEEC5CDD71C6} - + TargetingModule - {497E9CBE-EE0F-4770-A034-181C9F0B84E5} + {5949CB4F-7ECD-4B96-8669-DE93F1807D76} - + Interfaces - + true @@ -17053,7 +17369,7 @@ return TargetingModule;]]> true 1 - + false @@ -17092,7 +17408,7 @@ return TargetingModule;]]> true 1 - + false @@ -17132,7 +17448,7 @@ return TargetingModule;]]> 1 - + false @@ -17183,7 +17499,7 @@ return TargetingModule;]]> 1 - + false @@ -17235,7 +17551,7 @@ return TargetingModule;]]> - + false @@ -17274,7 +17590,7 @@ return TargetingModule;]]> true 1 - + false @@ -17325,7 +17641,7 @@ return TargetingModule;]]> 1 - + false @@ -17364,7 +17680,7 @@ return TargetingModule;]]> true 1 - + false @@ -17404,7 +17720,7 @@ return TargetingModule;]]> 1 - + true @@ -17459,7 +17775,7 @@ return TargetingModule;]]> 2 - + false @@ -17520,7 +17836,7 @@ return TargetingModule;]]> 1 - + false @@ -17572,7 +17888,7 @@ return TargetingModule;]]> - + false @@ -17611,7 +17927,7 @@ return TargetingModule;]]> true 1 - + false @@ -17651,7 +17967,7 @@ return TargetingModule;]]> 1 - + true @@ -17706,7 +18022,7 @@ return TargetingModule;]]> 2 - + false @@ -17767,7 +18083,7 @@ return TargetingModule;]]> 1 - + false @@ -17820,7 +18136,7 @@ return TargetingModule;]]> - + false @@ -17859,7 +18175,7 @@ return TargetingModule;]]> true 1 - + false @@ -17899,7 +18215,7 @@ return TargetingModule;]]> 1 - + false @@ -17952,7 +18268,7 @@ return TargetingModule;]]> - + true @@ -17991,7 +18307,7 @@ return TargetingModule;]]> true 1 - + false @@ -18030,7 +18346,7 @@ return TargetingModule;]]> true 1 - + false @@ -18070,7 +18386,7 @@ return TargetingModule;]]> 1 - + false @@ -18121,7 +18437,7 @@ return TargetingModule;]]> 1 - + false @@ -18173,7 +18489,7 @@ return TargetingModule;]]> - + false @@ -18212,7 +18528,7 @@ return TargetingModule;]]> true 1 - + false @@ -18263,7 +18579,7 @@ return TargetingModule;]]> 1 - + false @@ -18302,7 +18618,7 @@ return TargetingModule;]]> true 1 - + false @@ -18342,7 +18658,7 @@ return TargetingModule;]]> 1 - + true @@ -18397,7 +18713,7 @@ return TargetingModule;]]> 2 - + false @@ -18458,7 +18774,7 @@ return TargetingModule;]]> 1 - + false @@ -18510,7 +18826,7 @@ return TargetingModule;]]> - + false @@ -18549,7 +18865,7 @@ return TargetingModule;]]> true 1 - + false @@ -18589,7 +18905,7 @@ return TargetingModule;]]> 1 - + true @@ -18644,7 +18960,7 @@ return TargetingModule;]]> 2 - + false @@ -18705,7 +19021,7 @@ return TargetingModule;]]> 1 - + false @@ -18758,7 +19074,7 @@ return TargetingModule;]]> - + false @@ -18797,7 +19113,7 @@ return TargetingModule;]]> true 1 - + false @@ -18837,7 +19153,7 @@ return TargetingModule;]]> 1 - + false @@ -18890,7 +19206,7 @@ return TargetingModule;]]> - + true @@ -18929,7 +19245,7 @@ return TargetingModule;]]> true 1 - + false @@ -18969,7 +19285,7 @@ return TargetingModule;]]> 1 - + false @@ -19008,7 +19324,7 @@ return TargetingModule;]]> true 1 - + false @@ -19048,7 +19364,7 @@ return TargetingModule;]]> 1 - + false @@ -19099,7 +19415,7 @@ return TargetingModule;]]> 1 - + false @@ -19151,7 +19467,7 @@ return TargetingModule;]]> - + false @@ -19190,7 +19506,7 @@ return TargetingModule;]]> true 1 - + false @@ -19241,7 +19557,7 @@ return TargetingModule;]]> 1 - + true @@ -19306,7 +19622,7 @@ return TargetingModule;]]> 1 - + false @@ -19346,7 +19662,7 @@ return TargetingModule;]]> 1 - + true @@ -19401,7 +19717,7 @@ return TargetingModule;]]> 1 - + true @@ -19456,7 +19772,7 @@ return TargetingModule;]]> 1 - + false @@ -19496,7 +19812,7 @@ return TargetingModule;]]> 1 - + false @@ -19535,7 +19851,7 @@ return TargetingModule;]]> true 1 - + false @@ -19574,7 +19890,7 @@ return TargetingModule;]]> true 1 - + false @@ -19625,7 +19941,7 @@ return TargetingModule;]]> 1 - + false @@ -19664,7 +19980,7 @@ return TargetingModule;]]> true 1 - + false @@ -19725,7 +20041,7 @@ return TargetingModule;]]> 1 - + false @@ -19765,7 +20081,7 @@ return TargetingModule;]]> 1 - + true @@ -19821,7 +20137,7 @@ return TargetingModule;]]> - + false @@ -19860,7 +20176,7 @@ return TargetingModule;]]> true 1 - + false @@ -19911,7 +20227,7 @@ return TargetingModule;]]> 1 - + false @@ -19950,7 +20266,7 @@ return TargetingModule;]]> true 1 - + false @@ -20011,7 +20327,7 @@ return TargetingModule;]]> 1 - + false @@ -20051,7 +20367,7 @@ return TargetingModule;]]> 1 - + true @@ -20107,7 +20423,7 @@ return TargetingModule;]]> - + false @@ -20146,7 +20462,7 @@ return TargetingModule;]]> true 1 - + false @@ -20197,7 +20513,7 @@ return TargetingModule;]]> 1 - + false @@ -20236,7 +20552,7 @@ return TargetingModule;]]> true 1 - + false @@ -20297,7 +20613,7 @@ return TargetingModule;]]> 1 - + false @@ -20337,7 +20653,7 @@ return TargetingModule;]]> 1 - + true @@ -20393,7 +20709,7 @@ return TargetingModule;]]> - + false @@ -20432,7 +20748,7 @@ return TargetingModule;]]> true 1 - + true @@ -20496,7 +20812,7 @@ return TargetingModule;]]> true 1 - + false @@ -20537,7 +20853,7 @@ return TargetingModule;]]> - + false @@ -20588,7 +20904,7 @@ return TargetingModule;]]> 1 - + false @@ -20627,7 +20943,7 @@ return TargetingModule;]]> true 1 - + false @@ -20667,7 +20983,7 @@ return TargetingModule;]]> 1 - + false @@ -20722,7 +21038,7 @@ return TargetingModule;]]> - + false @@ -20773,7 +21089,7 @@ return TargetingModule;]]> 1 - + false @@ -20812,7 +21128,7 @@ return TargetingModule;]]> true 1 - + false @@ -20863,7 +21179,7 @@ return TargetingModule;]]> 1 - + true @@ -20928,7 +21244,7 @@ return TargetingModule;]]> 1 - + false @@ -20968,7 +21284,7 @@ return TargetingModule;]]> 1 - + true @@ -21023,7 +21339,7 @@ return TargetingModule;]]> 1 - + true @@ -21078,7 +21394,7 @@ return TargetingModule;]]> 1 - + false @@ -21118,7 +21434,7 @@ return TargetingModule;]]> 1 - + false @@ -21157,7 +21473,7 @@ return TargetingModule;]]> true 1 - + false @@ -21196,7 +21512,7 @@ return TargetingModule;]]> true 1 - + false @@ -21247,7 +21563,7 @@ return TargetingModule;]]> 1 - + false @@ -21286,7 +21602,7 @@ return TargetingModule;]]> true 1 - + false @@ -21347,7 +21663,7 @@ return TargetingModule;]]> 1 - + false @@ -21387,7 +21703,7 @@ return TargetingModule;]]> 1 - + true @@ -21443,7 +21759,7 @@ return TargetingModule;]]> - + false @@ -21482,7 +21798,7 @@ return TargetingModule;]]> true 1 - + false @@ -21533,7 +21849,7 @@ return TargetingModule;]]> 1 - + false @@ -21572,7 +21888,7 @@ return TargetingModule;]]> true 1 - + false @@ -21633,7 +21949,7 @@ return TargetingModule;]]> 1 - + false @@ -21673,7 +21989,7 @@ return TargetingModule;]]> 1 - + true @@ -21729,7 +22045,7 @@ return TargetingModule;]]> - + false @@ -21768,7 +22084,7 @@ return TargetingModule;]]> true 1 - + true @@ -21832,7 +22148,7 @@ return TargetingModule;]]> true 1 - + false @@ -21873,7 +22189,7 @@ return TargetingModule;]]> - + false @@ -21924,7 +22240,7 @@ return TargetingModule;]]> 1 - + false @@ -21963,7 +22279,7 @@ return TargetingModule;]]> true 1 - + false @@ -22003,7 +22319,7 @@ return TargetingModule;]]> 1 - + false @@ -22056,7 +22372,7 @@ return TargetingModule;]]> - + false @@ -22095,7 +22411,7 @@ return TargetingModule;]]> true 1 - + true @@ -22159,7 +22475,7 @@ return TargetingModule;]]> true 1 - + false @@ -22200,7 +22516,7 @@ return TargetingModule;]]> - + false @@ -22251,7 +22567,7 @@ return TargetingModule;]]> 1 - + false @@ -22290,7 +22606,7 @@ return TargetingModule;]]> true 1 - + false @@ -22330,7 +22646,7 @@ return TargetingModule;]]> 1 - + false @@ -22385,7 +22701,7 @@ return TargetingModule;]]> - + false @@ -22424,7 +22740,7 @@ return TargetingModule;]]> true 1 - + false @@ -22475,7 +22791,7 @@ return TargetingModule;]]> 1 - + true @@ -22540,7 +22856,7 @@ return TargetingModule;]]> 1 - + false @@ -22580,7 +22896,7 @@ return TargetingModule;]]> 1 - + true @@ -22635,7 +22951,7 @@ return TargetingModule;]]> 2 - + true @@ -22690,7 +23006,7 @@ return TargetingModule;]]> 2 - + false @@ -22730,7 +23046,7 @@ return TargetingModule;]]> 1 - + false @@ -22769,7 +23085,7 @@ return TargetingModule;]]> true 1 - + false @@ -22808,7 +23124,7 @@ return TargetingModule;]]> true 1 - + true @@ -22872,7 +23188,7 @@ return TargetingModule;]]> true 1 - + false @@ -22913,7 +23229,7 @@ return TargetingModule;]]> - + false @@ -22964,7 +23280,7 @@ return TargetingModule;]]> 1 - + false @@ -23003,7 +23319,7 @@ return TargetingModule;]]> true 1 - + false @@ -23043,7 +23359,7 @@ return TargetingModule;]]> 1 - + false @@ -23099,7 +23415,7 @@ return TargetingModule;]]> - + true @@ -23138,7 +23454,7 @@ return TargetingModule;]]> true 1 - + false @@ -23177,7 +23493,7 @@ return TargetingModule;]]> false 1 - + false @@ -23216,7 +23532,7 @@ return TargetingModule;]]> true 1 - + true @@ -23280,7 +23596,7 @@ return TargetingModule;]]> true 1 - + false @@ -23319,7 +23635,7 @@ return TargetingModule;]]> false 2 - + false @@ -23359,7 +23675,7 @@ return TargetingModule;]]> 2 - + false @@ -23412,7 +23728,7 @@ return TargetingModule;]]> - + true @@ -23476,7 +23792,7 @@ return TargetingModule;]]> true 1 - + false @@ -23515,7 +23831,7 @@ return TargetingModule;]]> false 2 - + false @@ -23555,7 +23871,7 @@ return TargetingModule;]]> 2 - + false @@ -23608,7 +23924,7 @@ return TargetingModule;]]> - + true @@ -23672,7 +23988,7 @@ return TargetingModule;]]> true 1 - + false @@ -23711,7 +24027,7 @@ return TargetingModule;]]> false 3 - + false @@ -23751,7 +24067,7 @@ return TargetingModule;]]> 3 - + false @@ -23804,7 +24120,7 @@ return TargetingModule;]]> - + false @@ -23843,7 +24159,7 @@ return TargetingModule;]]> true 1 - + false @@ -23882,7 +24198,7 @@ return TargetingModule;]]> false 2 - + false @@ -23922,7 +24238,7 @@ return TargetingModule;]]> 2 - + false @@ -23975,7 +24291,7 @@ return TargetingModule;]]> - + true @@ -24030,7 +24346,7 @@ return TargetingModule;]]> 2 - + true @@ -24086,7 +24402,7 @@ return TargetingModule;]]> - + false @@ -24140,7 +24456,7 @@ return TargetingModule;]]> 1 - + false @@ -24191,7 +24507,7 @@ return TargetingModule;]]> 1 - + false @@ -24230,7 +24546,7 @@ return TargetingModule;]]> true 1 - + true @@ -24285,7 +24601,7 @@ return TargetingModule;]]> 1 - + false @@ -24325,7 +24641,7 @@ return TargetingModule;]]> 1 - + false @@ -24378,7 +24694,7 @@ return TargetingModule;]]> - + true @@ -24417,7 +24733,7 @@ return TargetingModule;]]> true 1 - + true @@ -24481,7 +24797,7 @@ return TargetingModule;]]> true 1 - + false @@ -24543,7 +24859,7 @@ return TargetingModule;]]> - + true @@ -24607,7 +24923,7 @@ return TargetingModule;]]> true 2 - + false @@ -24647,7 +24963,7 @@ return TargetingModule;]]> 1 - + false @@ -24709,7 +25025,7 @@ return TargetingModule;]]> - + false @@ -24748,7 +25064,7 @@ return TargetingModule;]]> true 1 - + false @@ -24799,7 +25115,7 @@ return TargetingModule;]]> 1 - + false @@ -24838,7 +25154,7 @@ return TargetingModule;]]> true 1 - + false @@ -24879,7 +25195,7 @@ return TargetingModule;]]> - + true @@ -24932,7 +25248,7 @@ return TargetingModule;]]> true 2 - + false @@ -24995,7 +25311,7 @@ return TargetingModule;]]> - + false @@ -25034,7 +25350,7 @@ return TargetingModule;]]> true 1 - + false @@ -25085,7 +25401,7 @@ return TargetingModule;]]> 1 - + false @@ -25124,7 +25440,7 @@ return TargetingModule;]]> true 1 - + false @@ -25165,7 +25481,7 @@ return TargetingModule;]]> - + true @@ -25218,7 +25534,7 @@ return TargetingModule;]]> true 2 - + false @@ -25281,7 +25597,7 @@ return TargetingModule;]]> - + false @@ -25320,7 +25636,7 @@ return TargetingModule;]]> true 1 - + false @@ -25371,7 +25687,7 @@ return TargetingModule;]]> 1 - + false @@ -25410,7 +25726,7 @@ return TargetingModule;]]> true 1 - + false @@ -25451,7 +25767,7 @@ return TargetingModule;]]> - + true @@ -25504,7 +25820,7 @@ return TargetingModule;]]> true 2 - + false @@ -25567,7 +25883,7 @@ return TargetingModule;]]> - + false @@ -25606,7 +25922,7 @@ return TargetingModule;]]> true 1 - + false @@ -25647,7 +25963,7 @@ return TargetingModule;]]> - + true @@ -25701,7 +26017,7 @@ return TargetingModule;]]> true 2 - + false @@ -25742,7 +26058,7 @@ return TargetingModule;]]> - + true @@ -25796,7 +26112,7 @@ return TargetingModule;]]> true 2 - + false @@ -25837,7 +26153,7 @@ return TargetingModule;]]> - + [Component] @@ -25965,7 +26281,7 @@ return Component;]]> - + true @@ -26004,7 +26320,7 @@ return Component;]]> true 1 - + false @@ -26043,7 +26359,7 @@ return Component;]]> true 1 - + false @@ -26083,7 +26399,7 @@ return Component;]]> 1 - + true @@ -26138,7 +26454,7 @@ return Component;]]> 1 - + true @@ -26193,7 +26509,7 @@ return Component;]]> 1 - + false @@ -26233,7 +26549,7 @@ return Component;]]> 1 - + true @@ -26298,7 +26614,7 @@ return Component;]]> 1 - + false @@ -26349,7 +26665,7 @@ return Component;]]> 1 - + false @@ -26388,7 +26704,7 @@ return Component;]]> true 1 - + false @@ -26427,7 +26743,7 @@ return Component;]]> true 1 - + false @@ -26478,7 +26794,7 @@ return Component;]]> 1 - + true @@ -26544,7 +26860,7 @@ return Component;]]> - + false @@ -26583,7 +26899,7 @@ return Component;]]> true 1 - + false @@ -26622,7 +26938,7 @@ return Component;]]> true 1 - + true @@ -26676,7 +26992,7 @@ return Component;]]> 2 - + false @@ -26737,7 +27053,7 @@ return Component;]]> 1 - + false @@ -26778,7 +27094,7 @@ return Component;]]> - + false @@ -26830,7 +27146,7 @@ return Component;]]> - + false @@ -26869,7 +27185,7 @@ return Component;]]> true 1 - + false @@ -26908,7 +27224,7 @@ return Component;]]> true 1 - + true @@ -26962,7 +27278,7 @@ return Component;]]> 2 - + false @@ -27023,7 +27339,7 @@ return Component;]]> 1 - + false @@ -27064,7 +27380,7 @@ return Component;]]> - + false @@ -27116,7 +27432,7 @@ return Component;]]> - + false @@ -27155,7 +27471,7 @@ return Component;]]> true 1 - + true @@ -27219,7 +27535,7 @@ return Component;]]> true 1 - + false @@ -27260,7 +27576,7 @@ return Component;]]> - + false @@ -27311,7 +27627,7 @@ return Component;]]> 1 - + false @@ -27350,7 +27666,7 @@ return Component;]]> true 1 - + false @@ -27390,7 +27706,7 @@ return Component;]]> 1 - + false @@ -27445,7 +27761,7 @@ return Component;]]> - + false @@ -27496,7 +27812,7 @@ return Component;]]> 1 - + false @@ -27535,7 +27851,7 @@ return Component;]]> true 1 - + false @@ -27574,7 +27890,7 @@ return Component;]]> true 1 - + false @@ -27613,7 +27929,7 @@ return Component;]]> true 1 - + false @@ -27664,7 +27980,7 @@ return Component;]]> 1 - + true @@ -27730,7 +28046,7 @@ return Component;]]> - + false @@ -27769,7 +28085,7 @@ return Component;]]> true 1 - + false @@ -27820,7 +28136,7 @@ return Component;]]> 1 - + true @@ -27874,7 +28190,7 @@ return Component;]]> true 1 - + false @@ -27935,7 +28251,7 @@ return Component;]]> 3 - + true @@ -27989,7 +28305,7 @@ return Component;]]> false 4 - + false @@ -28041,12 +28357,12 @@ return Component;]]> - + Options - + false @@ -28086,7 +28402,7 @@ return Component;]]> 1 - + false @@ -28137,7 +28453,7 @@ return Component;]]> 3 - + [Component] @@ -28223,7 +28539,7 @@ return Component;]]> - + false @@ -28262,7 +28578,7 @@ return Component;]]> true 1 - + false @@ -28301,7 +28617,7 @@ return Component;]]> true 1 - + true @@ -28355,7 +28671,7 @@ return Component;]]> 2 - + false @@ -28416,7 +28732,7 @@ return Component;]]> 1 - + false @@ -28457,7 +28773,7 @@ return Component;]]> - + false @@ -28509,7 +28825,7 @@ return Component;]]> - + false @@ -28548,7 +28864,7 @@ return Component;]]> true 1 - + false @@ -28587,7 +28903,7 @@ return Component;]]> true 1 - + true @@ -28641,7 +28957,7 @@ return Component;]]> 2 - + false @@ -28681,7 +28997,7 @@ return Component;]]> 1 - + false @@ -28743,7 +29059,7 @@ return Component;]]> - + false @@ -28795,7 +29111,7 @@ return Component;]]> - + false @@ -28834,7 +29150,7 @@ return Component;]]> true 1 - + false @@ -28873,7 +29189,7 @@ return Component;]]> true 1 - + true @@ -28927,7 +29243,7 @@ return Component;]]> 2 - + false @@ -28988,7 +29304,7 @@ return Component;]]> 1 - + false @@ -29029,7 +29345,7 @@ return Component;]]> - + false @@ -29081,7 +29397,7 @@ return Component;]]> - + false @@ -29120,7 +29436,7 @@ return Component;]]> true 1 - + true @@ -29184,7 +29500,7 @@ return Component;]]> true 1 - + false @@ -29225,7 +29541,7 @@ return Component;]]> - + false @@ -29276,7 +29592,7 @@ return Component;]]> 1 - + false @@ -29315,7 +29631,7 @@ return Component;]]> true 1 - + false @@ -29355,7 +29671,7 @@ return Component;]]> 1 - + false @@ -29409,7 +29725,7 @@ return Component;]]> - + false @@ -29449,7 +29765,7 @@ return Component;]]> 1 - + true @@ -29504,7 +29820,7 @@ return Component;]]> 1 - + true @@ -29559,7 +29875,7 @@ return Component;]]> 1 - + false @@ -29599,7 +29915,7 @@ return Component;]]> 1 - + true @@ -29664,7 +29980,7 @@ return Component;]]> 1 - + false @@ -29716,7 +30032,7 @@ return Component;]]> - + false @@ -29755,7 +30071,7 @@ return Component;]]> true 1 - + false @@ -29806,7 +30122,7 @@ return Component;]]> 1 - + false @@ -29857,7 +30173,7 @@ return Component;]]> 1 - + false @@ -29898,7 +30214,7 @@ return Component;]]> - + false @@ -29938,7 +30254,7 @@ return Component;]]> 1 - + false @@ -29977,7 +30293,7 @@ return Component;]]> true 1 - + false @@ -30017,7 +30333,7 @@ return Component;]]> 1 - + true @@ -30072,7 +30388,7 @@ return Component;]]> 1 - + true @@ -30127,7 +30443,7 @@ return Component;]]> 1 - + false @@ -30167,7 +30483,7 @@ return Component;]]> 1 - + true @@ -30232,7 +30548,7 @@ return Component;]]> 1 - + false @@ -30283,7 +30599,7 @@ return Component;]]> 1 - + false @@ -30322,7 +30638,7 @@ return Component;]]> true 1 - + false @@ -30361,7 +30677,7 @@ return Component;]]> true 1 - + false @@ -30412,7 +30728,7 @@ return Component;]]> 1 - + true @@ -30478,7 +30794,7 @@ return Component;]]> - + false @@ -30517,7 +30833,7 @@ return Component;]]> true 1 - + false @@ -30568,7 +30884,7 @@ return Component;]]> 1 - + true @@ -30622,7 +30938,7 @@ return Component;]]> true 1 - + false @@ -30683,7 +30999,7 @@ return Component;]]> 3 - + true @@ -30737,7 +31053,7 @@ return Component;]]> false 4 - + false @@ -30789,12 +31105,12 @@ return Component;]]> - + Options - + false @@ -30834,7 +31150,7 @@ return Component;]]> 1 - + false @@ -30885,7 +31201,7 @@ return Component;]]> 3 - + [Component] @@ -30971,7 +31287,7 @@ return Component;]]> - + false @@ -31010,7 +31326,7 @@ return Component;]]> true 1 - + false @@ -31049,7 +31365,7 @@ return Component;]]> true 1 - + true @@ -31103,7 +31419,7 @@ return Component;]]> 2 - + false @@ -31164,7 +31480,7 @@ return Component;]]> 1 - + false @@ -31205,7 +31521,7 @@ return Component;]]> - + false @@ -31257,7 +31573,7 @@ return Component;]]> - + false @@ -31296,7 +31612,7 @@ return Component;]]> true 1 - + false @@ -31335,7 +31651,7 @@ return Component;]]> true 1 - + true @@ -31389,7 +31705,7 @@ return Component;]]> 2 - + false @@ -31429,7 +31745,7 @@ return Component;]]> 1 - + false @@ -31491,7 +31807,7 @@ return Component;]]> - + false @@ -31543,7 +31859,7 @@ return Component;]]> - + false @@ -31582,7 +31898,7 @@ return Component;]]> true 1 - + false @@ -31621,7 +31937,7 @@ return Component;]]> true 1 - + true @@ -31675,7 +31991,7 @@ return Component;]]> 2 - + false @@ -31736,7 +32052,7 @@ return Component;]]> 1 - + false @@ -31777,7 +32093,7 @@ return Component;]]> - + false @@ -31829,7 +32145,7 @@ return Component;]]> - + false @@ -31868,7 +32184,7 @@ return Component;]]> true 1 - + true @@ -31932,7 +32248,7 @@ return Component;]]> true 1 - + false @@ -31973,7 +32289,7 @@ return Component;]]> - + false @@ -32024,7 +32340,7 @@ return Component;]]> 1 - + false @@ -32063,7 +32379,7 @@ return Component;]]> true 1 - + false @@ -32103,7 +32419,7 @@ return Component;]]> 1 - + false @@ -32159,7 +32475,7 @@ return Component;]]> - + true @@ -32198,7 +32514,7 @@ return Component;]]> true 1 - + false @@ -32237,7 +32553,7 @@ return Component;]]> true 1 - + false @@ -32277,7 +32593,7 @@ return Component;]]> 1 - + false @@ -32328,7 +32644,7 @@ return Component;]]> 1 - + false @@ -32380,7 +32696,7 @@ return Component;]]> - + false @@ -32419,7 +32735,7 @@ return Component;]]> true 1 - + false @@ -32470,7 +32786,7 @@ return Component;]]> 1 - + true @@ -32524,7 +32840,7 @@ return Component;]]> true 1 - + false @@ -32585,7 +32901,7 @@ return Component;]]> 3 - + true @@ -32639,7 +32955,7 @@ return Component;]]> false 4 - + false @@ -32691,12 +33007,12 @@ return Component;]]> - + Options - + false @@ -32736,7 +33052,7 @@ return Component;]]> 1 - + false @@ -32787,7 +33103,7 @@ return Component;]]> 3 - + [Component] @@ -32873,7 +33189,7 @@ return Component;]]> - + false @@ -32912,7 +33228,7 @@ return Component;]]> true 1 - + false @@ -32963,7 +33279,7 @@ return Component;]]> 1 - + false @@ -33002,7 +33318,7 @@ return Component;]]> true 1 - + false @@ -33063,7 +33379,7 @@ return Component;]]> 1 - + false @@ -33103,7 +33419,7 @@ return Component;]]> 1 - + true @@ -33159,7 +33475,7 @@ return Component;]]> - + false @@ -33198,7 +33514,7 @@ return Component;]]> true 1 - + false @@ -33249,7 +33565,7 @@ return Component;]]> 1 - + false @@ -33288,7 +33604,7 @@ return Component;]]> true 1 - + false @@ -33328,7 +33644,7 @@ return Component;]]> 1 - + false @@ -33389,7 +33705,7 @@ return Component;]]> 1 - + true @@ -33445,7 +33761,7 @@ return Component;]]> - + false @@ -33484,7 +33800,7 @@ return Component;]]> true 1 - + false @@ -33525,7 +33841,7 @@ return Component;]]> - + false @@ -33577,7 +33893,7 @@ return Component;]]> - + true @@ -33616,7 +33932,7 @@ return Component;]]> true 1 - + false @@ -33655,7 +33971,7 @@ return Component;]]> true 1 - + false @@ -33695,7 +34011,7 @@ return Component;]]> 1 - + false @@ -33746,7 +34062,7 @@ return Component;]]> 1 - + false @@ -33798,7 +34114,7 @@ return Component;]]> - + false @@ -33837,7 +34153,7 @@ return Component;]]> false 1 - + false @@ -33888,7 +34204,7 @@ return Component;]]> 1 - + true @@ -33942,7 +34258,7 @@ return Component;]]> true 1 - + false @@ -34003,7 +34319,7 @@ return Component;]]> 3 - + true @@ -34057,7 +34373,7 @@ return Component;]]> false 4 - + false @@ -34109,12 +34425,12 @@ return Component;]]> - + Options - + false @@ -34154,7 +34470,7 @@ return Component;]]> 1 - + false @@ -34205,7 +34521,7 @@ return Component;]]> 3 - + [Component] @@ -34291,7 +34607,7 @@ return Component;]]> - + false @@ -34330,7 +34646,7 @@ return Component;]]> false 1 - + false @@ -34381,7 +34697,7 @@ return Component;]]> 1 - + false @@ -34420,7 +34736,7 @@ return Component;]]> true 1 - + false @@ -34481,7 +34797,7 @@ return Component;]]> 1 - + false @@ -34521,7 +34837,7 @@ return Component;]]> 1 - + true @@ -34576,7 +34892,7 @@ return Component;]]> - + false @@ -34615,7 +34931,7 @@ return Component;]]> true 1 - + false @@ -34676,7 +34992,7 @@ return Component;]]> 1 - + false @@ -34716,7 +35032,7 @@ return Component;]]> 1 - + true @@ -34771,7 +35087,7 @@ return Component;]]> - + false @@ -34810,7 +35126,7 @@ return Component;]]> true 1 - + false @@ -34871,7 +35187,7 @@ return Component;]]> 1 - + false @@ -34911,7 +35227,7 @@ return Component;]]> 1 - + true @@ -34967,7 +35283,7 @@ return Component;]]> - + false @@ -35006,7 +35322,7 @@ return Component;]]> false 1 - + true @@ -35061,7 +35377,7 @@ return Component;]]> 1 - + false @@ -35102,7 +35418,7 @@ return Component;]]> - + false @@ -35141,7 +35457,7 @@ return Component;]]> false 1 - + false @@ -35192,7 +35508,7 @@ return Component;]]> 1 - + true @@ -35246,7 +35562,7 @@ return Component;]]> 1 - + false @@ -35285,7 +35601,7 @@ return Component;]]> true 1 - + false @@ -35325,7 +35641,7 @@ return Component;]]> 1 - + false @@ -35365,7 +35681,7 @@ return Component;]]> 1 - + false @@ -35406,7 +35722,7 @@ return Component;]]> - + false @@ -35447,7 +35763,7 @@ return Component;]]> - + false @@ -35487,7 +35803,7 @@ return Component;]]> 1 - + false @@ -35526,7 +35842,7 @@ return Component;]]> false 1 - + false @@ -35577,7 +35893,7 @@ return Component;]]> 1 - + true @@ -35631,7 +35947,7 @@ return Component;]]> 1 - + false @@ -35670,7 +35986,7 @@ return Component;]]> true 1 - + false @@ -35710,7 +36026,7 @@ return Component;]]> 1 - + false @@ -35750,7 +36066,7 @@ return Component;]]> 1 - + false @@ -35791,7 +36107,7 @@ return Component;]]> - + false @@ -35832,7 +36148,7 @@ return Component;]]> - + false @@ -35871,7 +36187,7 @@ return Component;]]> false 1 - + true @@ -35926,7 +36242,7 @@ return Component;]]> 1 - + false @@ -35967,7 +36283,7 @@ return Component;]]> - + false @@ -36006,7 +36322,7 @@ return Component;]]> false 1 - + false @@ -36057,7 +36373,7 @@ return Component;]]> 1 - + false @@ -36096,7 +36412,7 @@ return Component;]]> true 1 - + false @@ -36136,7 +36452,7 @@ return Component;]]> 1 - + false @@ -36188,7 +36504,7 @@ return Component;]]> - + true @@ -36252,7 +36568,7 @@ return Component;]]> true 1 - + false @@ -36294,7 +36610,7 @@ return Component;]]> - + false @@ -36345,7 +36661,7 @@ return Component;]]> 1 - + false @@ -36384,7 +36700,7 @@ return Component;]]> false 1 - + false @@ -36435,7 +36751,7 @@ return Component;]]> 1 - + false @@ -36474,7 +36790,7 @@ return Component;]]> true 1 - + false @@ -36535,7 +36851,7 @@ return Component;]]> 1 - + false @@ -36575,7 +36891,7 @@ return Component;]]> 1 - + true @@ -36630,7 +36946,7 @@ return Component;]]> - + false @@ -36669,7 +36985,7 @@ return Component;]]> true 1 - + false @@ -36730,7 +37046,7 @@ return Component;]]> 1 - + false @@ -36770,7 +37086,7 @@ return Component;]]> 1 - + true @@ -36825,7 +37141,7 @@ return Component;]]> - + false @@ -36864,7 +37180,7 @@ return Component;]]> true 1 - + false @@ -36925,7 +37241,7 @@ return Component;]]> 1 - + false @@ -36965,7 +37281,7 @@ return Component;]]> 1 - + true @@ -37022,7 +37338,7 @@ return Component;]]> - + true @@ -37061,7 +37377,7 @@ return Component;]]> true 1 - + false @@ -37100,7 +37416,7 @@ return Component;]]> true 1 - + false @@ -37151,7 +37467,7 @@ return Component;]]> 1 - + false @@ -37192,7 +37508,7 @@ return Component;]]> - + false @@ -37231,7 +37547,7 @@ return Component;]]> false 1 - + false @@ -37270,7 +37586,7 @@ return Component;]]> true 1 - + false @@ -37309,7 +37625,7 @@ return Component;]]> true 1 - + false @@ -37370,7 +37686,7 @@ return Component;]]> 1 - + true @@ -37425,7 +37741,7 @@ return Component;]]> - + false @@ -37464,7 +37780,7 @@ return Component;]]> true 1 - + true @@ -37518,7 +37834,7 @@ return Component;]]> 2 - + false @@ -37580,7 +37896,7 @@ return Component;]]> - + false @@ -37619,7 +37935,7 @@ return Component;]]> true 1 - + true @@ -37673,7 +37989,7 @@ return Component;]]> 2 - + false @@ -37735,7 +38051,7 @@ return Component;]]> - + false @@ -37787,7 +38103,7 @@ return Component;]]> - + false @@ -37838,7 +38154,7 @@ return Component;]]> 1 - + false @@ -37879,7 +38195,7 @@ return Component;]]> - + false @@ -37918,7 +38234,7 @@ return Component;]]> true 1 - + false @@ -37957,7 +38273,7 @@ return Component;]]> true 1 - + false @@ -38009,7 +38325,7 @@ return Component;]]> - + false @@ -38048,7 +38364,7 @@ return Component;]]> true 1 - + false @@ -38109,7 +38425,7 @@ return Component;]]> 1 - + true @@ -38163,7 +38479,7 @@ return Component;]]> 2 - + false @@ -38205,7 +38521,7 @@ return Component;]]> - + false @@ -38244,7 +38560,7 @@ return Component;]]> true 1 - + false @@ -38295,7 +38611,7 @@ return Component;]]> 1 - + false @@ -38346,7 +38662,7 @@ return Component;]]> 1 - + false @@ -38387,7 +38703,7 @@ return Component;]]> - + false @@ -38426,7 +38742,7 @@ return Component;]]> true 1 - + false @@ -38465,7 +38781,7 @@ return Component;]]> true 1 - + false @@ -38517,7 +38833,7 @@ return Component;]]> - + false @@ -38556,7 +38872,7 @@ return Component;]]> true 1 - + false @@ -38607,7 +38923,7 @@ return Component;]]> 2 - + false @@ -38668,7 +38984,7 @@ return Component;]]> 1 - + true @@ -38723,7 +39039,7 @@ return Component;]]> 2 - + false @@ -38764,7 +39080,7 @@ return Component;]]> - + false @@ -38803,7 +39119,7 @@ return Component;]]> true 1 - + false @@ -38854,7 +39170,7 @@ return Component;]]> 2 - + false @@ -38915,7 +39231,7 @@ return Component;]]> 1 - + true @@ -38970,7 +39286,7 @@ return Component;]]> 2 - + false @@ -39011,7 +39327,7 @@ return Component;]]> - + false @@ -39050,7 +39366,7 @@ return Component;]]> true 1 - + false @@ -39101,7 +39417,7 @@ return Component;]]> 2 - + false @@ -39162,7 +39478,7 @@ return Component;]]> 1 - + true @@ -39217,7 +39533,7 @@ return Component;]]> 2 - + false @@ -39260,7 +39576,7 @@ return Component;]]> - + true @@ -39299,7 +39615,7 @@ return Component;]]> true 1 - + false @@ -39338,7 +39654,7 @@ return Component;]]> true 1 - + false @@ -39378,7 +39694,7 @@ return Component;]]> 1 - + false @@ -39429,7 +39745,7 @@ return Component;]]> 1 - + false @@ -39481,7 +39797,7 @@ return Component;]]> - + false @@ -39520,7 +39836,7 @@ return Component;]]> true 1 - + false @@ -39571,7 +39887,7 @@ return Component;]]> 1 - + true @@ -39625,7 +39941,7 @@ return Component;]]> true 1 - + false @@ -39686,7 +40002,7 @@ return Component;]]> 3 - + true @@ -39740,7 +40056,7 @@ return Component;]]> false 4 - + false @@ -39792,12 +40108,12 @@ return Component;]]> - + Options - + false @@ -39837,7 +40153,7 @@ return Component;]]> 1 - + false @@ -39888,7 +40204,7 @@ return Component;]]> 3 - + [Component] @@ -39974,7 +40290,7 @@ return Component;]]> - + false @@ -40013,7 +40329,7 @@ return Component;]]> true 1 - + false @@ -40053,7 +40369,7 @@ return Component;]]> 1 - + false @@ -40106,7 +40422,7 @@ return Component;]]> - + true @@ -40145,7 +40461,7 @@ return Component;]]> true 1 - + false @@ -40184,7 +40500,7 @@ return Component;]]> true 1 - + false @@ -40224,7 +40540,7 @@ return Component;]]> 1 - + false @@ -40275,7 +40591,7 @@ return Component;]]> 1 - + false @@ -40327,7 +40643,7 @@ return Component;]]> - + false @@ -40367,7 +40683,7 @@ return Component;]]> 1 - + true @@ -40421,7 +40737,7 @@ return Component;]]> true 1 - + false @@ -40471,7 +40787,7 @@ return Component;]]> false 1 - + false @@ -40514,7 +40830,7 @@ return Component;]]> - + true @@ -40553,7 +40869,7 @@ return Component;]]> true 1 - + false @@ -40592,7 +40908,7 @@ return Component;]]> true 1 - + false @@ -40631,7 +40947,7 @@ return Component;]]> true 1 - + false @@ -40671,7 +40987,7 @@ return Component;]]> 1 - + true @@ -40726,7 +41042,7 @@ return Component;]]> 2 - + false @@ -40787,7 +41103,7 @@ return Component;]]> 1 - + false @@ -40839,7 +41155,7 @@ return Component;]]> - + false @@ -40878,7 +41194,7 @@ return Component;]]> true 1 - + false @@ -40918,7 +41234,7 @@ return Component;]]> 1 - + true @@ -40973,7 +41289,7 @@ return Component;]]> 2 - + false @@ -41034,7 +41350,7 @@ return Component;]]> 1 - + false @@ -41086,7 +41402,7 @@ return Component;]]> - + false @@ -41125,7 +41441,7 @@ return Component;]]> true 1 - + false @@ -41178,7 +41494,7 @@ return Component;]]> - + false @@ -41217,7 +41533,7 @@ return Component;]]> true 1 - + false @@ -41257,7 +41573,7 @@ return Component;]]> 1 - + false @@ -41308,7 +41624,7 @@ return Component;]]> 1 - + false @@ -41360,7 +41676,7 @@ return Component;]]> - + false @@ -41399,7 +41715,7 @@ return Component;]]> true 1 - + false @@ -41438,7 +41754,7 @@ return Component;]]> true 1 - + false @@ -41478,7 +41794,7 @@ return Component;]]> 1 - + true @@ -41532,7 +41848,7 @@ return Component;]]> 2 - + false @@ -41594,7 +41910,7 @@ return Component;]]> - + false @@ -41633,7 +41949,7 @@ return Component;]]> true 1 - + false @@ -41686,7 +42002,7 @@ return Component;]]> - + false @@ -41725,7 +42041,7 @@ return Component;]]> false 1 - + false @@ -41765,7 +42081,7 @@ return Component;]]> 1 - + false @@ -41816,7 +42132,7 @@ return Component;]]> 1 - + false @@ -41855,7 +42171,7 @@ return Component;]]> true 1 - + false @@ -41906,7 +42222,7 @@ return Component;]]> 1 - + false @@ -41945,7 +42261,7 @@ return Component;]]> true 1 - + true @@ -41999,7 +42315,7 @@ return Component;]]> 2 - + false @@ -42061,7 +42377,7 @@ return Component;]]> - + false @@ -42100,7 +42416,7 @@ return Component;]]> true 1 - + true @@ -42154,7 +42470,7 @@ return Component;]]> 2 - + false @@ -42216,7 +42532,7 @@ return Component;]]> - + false @@ -42255,7 +42571,7 @@ return Component;]]> true 1 - + true @@ -42309,7 +42625,7 @@ return Component;]]> 2 - + false @@ -42373,7 +42689,7 @@ return Component;]]> - + false @@ -42412,7 +42728,7 @@ return Component;]]> true 1 - + false @@ -42452,7 +42768,7 @@ return Component;]]> 1 - + false @@ -42505,7 +42821,7 @@ return Component;]]> - + true @@ -42544,7 +42860,7 @@ return Component;]]> true 1 - + false @@ -42583,7 +42899,7 @@ return Component;]]> true 1 - + false @@ -42622,7 +42938,7 @@ return Component;]]> true 1 - + false @@ -42662,7 +42978,7 @@ return Component;]]> 1 - + true @@ -42717,7 +43033,7 @@ return Component;]]> 2 - + false @@ -42778,7 +43094,7 @@ return Component;]]> 1 - + false @@ -42830,7 +43146,7 @@ return Component;]]> - + false @@ -42869,7 +43185,7 @@ return Component;]]> true 1 - + false @@ -42909,7 +43225,7 @@ return Component;]]> 1 - + true @@ -42964,7 +43280,7 @@ return Component;]]> 2 - + false @@ -43025,7 +43341,7 @@ return Component;]]> 1 - + false @@ -43077,7 +43393,7 @@ return Component;]]> - + false @@ -43116,7 +43432,7 @@ return Component;]]> true 1 - + false @@ -43156,7 +43472,7 @@ return Component;]]> 1 - + true @@ -43211,7 +43527,7 @@ return Component;]]> 2 - + false @@ -43272,7 +43588,7 @@ return Component;]]> 1 - + false @@ -43324,7 +43640,7 @@ return Component;]]> - + false @@ -43363,7 +43679,7 @@ return Component;]]> true 1 - + false @@ -43416,7 +43732,7 @@ return Component;]]> - + false @@ -43455,7 +43771,7 @@ return Component;]]> true 1 - + false @@ -43495,7 +43811,7 @@ return Component;]]> 1 - + false @@ -43546,7 +43862,7 @@ return Component;]]> 1 - + false @@ -43598,7 +43914,7 @@ return Component;]]> - + false @@ -43637,7 +43953,7 @@ return Component;]]> true 1 - + false @@ -43676,7 +43992,7 @@ return Component;]]> true 1 - + false @@ -43716,7 +44032,7 @@ return Component;]]> 1 - + true @@ -43770,7 +44086,7 @@ return Component;]]> 2 - + false @@ -43832,7 +44148,7 @@ return Component;]]> - + false @@ -43871,7 +44187,7 @@ return Component;]]> true 1 - + false @@ -43924,7 +44240,7 @@ return Component;]]> - + false @@ -43963,7 +44279,7 @@ return Component;]]> false 1 - + false @@ -44003,7 +44319,7 @@ return Component;]]> 1 - + false @@ -44054,7 +44370,7 @@ return Component;]]> 1 - + false @@ -44093,7 +44409,7 @@ return Component;]]> true 1 - + false @@ -44144,7 +44460,7 @@ return Component;]]> 1 - + false @@ -44183,7 +44499,7 @@ return Component;]]> true 1 - + true @@ -44237,7 +44553,7 @@ return Component;]]> 2 - + false @@ -44299,7 +44615,7 @@ return Component;]]> - + false @@ -44338,7 +44654,7 @@ return Component;]]> true 1 - + true @@ -44392,7 +44708,7 @@ return Component;]]> 2 - + false @@ -44454,7 +44770,7 @@ return Component;]]> - + false @@ -44493,7 +44809,7 @@ return Component;]]> true 1 - + true @@ -44547,7 +44863,7 @@ return Component;]]> 2 - + false @@ -44611,7 +44927,7 @@ return Component;]]> - + false @@ -44650,7 +44966,7 @@ return Component;]]> true 1 - + false @@ -44690,7 +45006,7 @@ return Component;]]> 1 - + false @@ -44743,7 +45059,7 @@ return Component;]]> - + true @@ -44782,7 +45098,7 @@ return Component;]]> true 1 - + false @@ -44821,7 +45137,7 @@ return Component;]]> true 1 - + false @@ -44861,7 +45177,7 @@ return Component;]]> 1 - + false @@ -44912,7 +45228,7 @@ return Component;]]> 1 - + false @@ -44964,7 +45280,7 @@ return Component;]]> - + false @@ -45003,7 +45319,7 @@ return Component;]]> true 1 - + false @@ -45054,7 +45370,7 @@ return Component;]]> 1 - + true @@ -45108,7 +45424,7 @@ return Component;]]> true 1 - + false @@ -45169,7 +45485,7 @@ return Component;]]> 3 - + true @@ -45223,7 +45539,7 @@ return Component;]]> false 4 - + false @@ -45275,12 +45591,12 @@ return Component;]]> - + Options - + false @@ -45320,7 +45636,7 @@ return Component;]]> 1 - + false @@ -45371,7 +45687,7 @@ return Component;]]> 3 - + [Component] @@ -45457,7 +45773,7 @@ return Component;]]> - + false @@ -45496,7 +45812,7 @@ return Component;]]> true 1 - + false @@ -45547,7 +45863,7 @@ return Component;]]> 1 - + true @@ -45601,7 +45917,7 @@ return Component;]]> true 1 - + false @@ -45662,7 +45978,7 @@ return Component;]]> 3 - + true @@ -45716,7 +46032,7 @@ return Component;]]> false 4 - + false @@ -45768,12 +46084,12 @@ return Component;]]> - + Options - + false @@ -45813,7 +46129,7 @@ return Component;]]> 1 - + false @@ -45864,7 +46180,7 @@ return Component;]]> 3 - + [Component] @@ -45950,7 +46266,7 @@ return Component;]]> - + false @@ -45989,7 +46305,7 @@ return Component;]]> true 1 - + false @@ -46029,7 +46345,7 @@ return Component;]]> 1 - + false @@ -46082,7 +46398,7 @@ return Component;]]> - + true @@ -46121,7 +46437,7 @@ return Component;]]> true 1 - + false @@ -46160,7 +46476,7 @@ return Component;]]> true 1 - + false @@ -46200,7 +46516,7 @@ return Component;]]> 1 - + false @@ -46251,7 +46567,7 @@ return Component;]]> 1 - + false @@ -46303,7 +46619,7 @@ return Component;]]> - + false @@ -46342,7 +46658,7 @@ return Component;]]> true 1 - + false @@ -46393,7 +46709,7 @@ return Component;]]> 1 - + true @@ -46447,7 +46763,7 @@ return Component;]]> true 1 - + false @@ -46508,7 +46824,7 @@ return Component;]]> 3 - + true @@ -46562,7 +46878,7 @@ return Component;]]> false 4 - + false @@ -46614,12 +46930,12 @@ return Component;]]> - + Options - + false @@ -46659,7 +46975,7 @@ return Component;]]> 1 - + false @@ -46710,7 +47026,7 @@ return Component;]]> 3 - + [Component] @@ -46796,7 +47112,7 @@ return Component;]]> - + false @@ -46835,7 +47151,7 @@ return Component;]]> false 1 - + false @@ -46886,7 +47202,7 @@ return Component;]]> 1 - + false @@ -46925,7 +47241,7 @@ return Component;]]> true 1 - + false @@ -46986,7 +47302,7 @@ return Component;]]> 1 - + false @@ -47026,7 +47342,7 @@ return Component;]]> 1 - + true @@ -47081,7 +47397,7 @@ return Component;]]> - + false @@ -47120,7 +47436,7 @@ return Component;]]> true 1 - + false @@ -47181,7 +47497,7 @@ return Component;]]> 1 - + false @@ -47221,7 +47537,7 @@ return Component;]]> 1 - + true @@ -47277,7 +47593,7 @@ return Component;]]> - + false @@ -47317,7 +47633,7 @@ return Component;]]> 1 - + false @@ -47356,7 +47672,7 @@ return Component;]]> true 1 - + false @@ -47407,7 +47723,7 @@ return Component;]]> 1 - + false @@ -47446,7 +47762,7 @@ return Component;]]> true 1 - + false @@ -47507,7 +47823,7 @@ return Component;]]> 1 - + false @@ -47547,7 +47863,7 @@ return Component;]]> 1 - + true @@ -47603,7 +47919,7 @@ return Component;]]> - + false @@ -47642,7 +47958,7 @@ return Component;]]> true 1 - + false @@ -47693,7 +48009,7 @@ return Component;]]> 1 - + false @@ -47732,7 +48048,7 @@ return Component;]]> true 1 - + false @@ -47772,7 +48088,7 @@ return Component;]]> 1 - + true @@ -47827,7 +48143,7 @@ return Component;]]> 2 - + false @@ -47888,7 +48204,7 @@ return Component;]]> 1 - + false @@ -47940,7 +48256,7 @@ return Component;]]> - + false @@ -47979,7 +48295,7 @@ return Component;]]> true 1 - + true @@ -48034,7 +48350,7 @@ return Component;]]> 2 - + false @@ -48095,7 +48411,7 @@ return Component;]]> 1 - + false @@ -48146,7 +48462,7 @@ return Component;]]> 1 - + false @@ -48188,7 +48504,7 @@ return Component;]]> - + false @@ -48227,7 +48543,7 @@ return Component;]]> true 1 - + false @@ -48278,7 +48594,7 @@ return Component;]]> 1 - + false @@ -48317,7 +48633,7 @@ return Component;]]> true 1 - + false @@ -48357,7 +48673,7 @@ return Component;]]> 1 - + false @@ -48397,7 +48713,7 @@ return Component;]]> 1 - + false @@ -48438,7 +48754,7 @@ return Component;]]> - + false @@ -48478,7 +48794,7 @@ return Component;]]> 1 - + true @@ -48533,7 +48849,7 @@ return Component;]]> - + false @@ -48572,7 +48888,7 @@ return Component;]]> false 1 - + true @@ -48627,7 +48943,7 @@ return Component;]]> 1 - + false @@ -48668,7 +48984,7 @@ return Component;]]> - + false @@ -48707,7 +49023,7 @@ return Component;]]> true 1 - + true @@ -48762,7 +49078,7 @@ return Component;]]> 1 - + false @@ -48803,7 +49119,7 @@ return Component;]]> - + false @@ -48855,7 +49171,7 @@ return Component;]]> - + true @@ -48894,7 +49210,7 @@ return Component;]]> true 1 - + false @@ -48933,7 +49249,7 @@ return Component;]]> true 1 - + false @@ -48973,7 +49289,7 @@ return Component;]]> 1 - + false @@ -49024,7 +49340,7 @@ return Component;]]> 1 - + false @@ -49076,7 +49392,7 @@ return Component;]]> - + false @@ -49115,7 +49431,7 @@ return Component;]]> true 1 - + true @@ -49169,7 +49485,7 @@ return Component;]]> true 1 - + false @@ -49210,7 +49526,7 @@ return Component;]]> - + true @@ -49264,7 +49580,7 @@ return Component;]]> true 1 - + false @@ -49306,7 +49622,7 @@ return Component;]]> - + false @@ -49345,7 +49661,7 @@ return Component;]]> true 1 - + false @@ -49385,7 +49701,7 @@ return Component;]]> 1 - + false @@ -49438,127 +49754,7 @@ return Component;]]> - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 0 - PointMarker - null - null - null - null - - 0 - 200 - 0 - 200 - - 0 - false - null - - 0.0125000002 - 0 - 0.0125000002 - 0 - - 1 - 0 - true - 1 - - - - false - - 0 - 0 - - 4294934254 - 0 - 4279970357 - 0 - false - false - 0 - CrossLine - null - null - null - null - - -0.5 - 0 - 0 - 0 - - 45 - false - null - - 1 - 0 - 0.0500000007 - 0 - - 1 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294934254 - 0 - 4279970357 - 0 - false - false - 0 - CrossLine - null - null - null - null - - -0.5 - 0 - 0 - 0 - - -45 - false - null - - 1 - 0 - 0.0500000007 - 0 - - 1 - 0 - true - 1 - - - - + true @@ -49597,7 +49793,7 @@ return Component;]]> false 1 - + false @@ -49636,7 +49832,7 @@ return Component;]]> false 1 - + false @@ -49687,7 +49883,7 @@ return Component;]]> 1 - + false @@ -49738,7 +49934,7 @@ return Component;]]> 1 - + false @@ -49777,7 +49973,7 @@ return Component;]]> true 1 - + false @@ -49817,7 +50013,7 @@ return Component;]]> 1 - + false @@ -49857,7 +50053,7 @@ return Component;]]> 1 - + false @@ -49897,7 +50093,7 @@ return Component;]]> 1 - + false @@ -49937,7 +50133,7 @@ return Component;]]> 1 - + false @@ -49979,7 +50175,7 @@ return Component;]]> - + false @@ -50018,7 +50214,7 @@ return Component;]]> false 1 - + false @@ -50069,7 +50265,7 @@ return Component;]]> 1 - + false @@ -50108,7 +50304,7 @@ return Component;]]> true 1 - + false @@ -50148,7 +50344,7 @@ return Component;]]> 1 - + false @@ -50188,7 +50384,7 @@ return Component;]]> 1 - + false @@ -50228,7 +50424,7 @@ return Component;]]> 1 - + false @@ -50268,7 +50464,7 @@ return Component;]]> 1 - + false @@ -50310,7 +50506,7 @@ return Component;]]> - + false @@ -50349,7 +50545,7 @@ return Component;]]> false 1 - + true @@ -50404,7 +50600,7 @@ return Component;]]> 1 - + false @@ -50445,7 +50641,7 @@ return Component;]]> - + false @@ -50484,7 +50680,7 @@ return Component;]]> true 1 - + false @@ -50523,7 +50719,7 @@ return Component;]]> true 1 - + false @@ -50563,7 +50759,7 @@ return Component;]]> 1 - + false @@ -50603,7 +50799,7 @@ return Component;]]> 1 - + false @@ -50643,7 +50839,7 @@ return Component;]]> 1 - + false @@ -50683,7 +50879,7 @@ return Component;]]> 1 - + false @@ -50724,7 +50920,7 @@ return Component;]]> - + false @@ -50775,7 +50971,7 @@ return Component;]]> 1 - + false @@ -50814,7 +51010,7 @@ return Component;]]> true 1 - + false @@ -50854,7 +51050,7 @@ return Component;]]> 1 - + false @@ -50894,7 +51090,7 @@ return Component;]]> 1 - + false @@ -50934,7 +51130,7 @@ return Component;]]> 1 - + false @@ -50974,7 +51170,7 @@ return Component;]]> 1 - + false @@ -51015,7 +51211,7 @@ return Component;]]> - + true @@ -51069,7 +51265,7 @@ return Component;]]> true 1 - + false @@ -51111,7 +51307,7 @@ return Component;]]> - + [Component] @@ -51188,7 +51384,7 @@ return Component;]]> - + false @@ -51227,7 +51423,7 @@ return Component;]]> false 1 - + false @@ -51266,7 +51462,7 @@ return Component;]]> false 1 - + false @@ -51306,7 +51502,7 @@ return Component;]]> 1 - + true @@ -51361,7 +51557,7 @@ return Component;]]> 1 - + true @@ -51416,7 +51612,7 @@ return Component;]]> 1 - + false @@ -51456,7 +51652,7 @@ return Component;]]> 1 - + false @@ -51495,7 +51691,7 @@ return Component;]]> true 1 - + false @@ -51546,14 +51742,14 @@ return Component;]]> 1 - + NotificationSize 65 - + false @@ -51592,7 +51788,7 @@ return Component;]]> false 1 - + false @@ -51643,13 +51839,13 @@ return Component;]]> 1 - + NotificationSize 80 - + false @@ -51701,7 +51897,7 @@ return Component;]]> - + [Component] @@ -51755,7 +51951,7 @@ return Component;]]> - + false @@ -51794,7 +51990,7 @@ return Component;]]> false 1 - + false @@ -51834,7 +52030,7 @@ return Component;]]> 1 - + true @@ -51889,7 +52085,7 @@ return Component;]]> 1 - + true @@ -51944,7 +52140,7 @@ return Component;]]> 1 - + false @@ -51984,7 +52180,7 @@ return Component;]]> 1 - + false @@ -52023,7 +52219,7 @@ return Component;]]> true 1 - + false @@ -52074,14 +52270,14 @@ return Component;]]> 1 - + NotificationSize 65 - + false @@ -52120,7 +52316,7 @@ return Component;]]> false 1 - + false @@ -52171,14 +52367,14 @@ return Component;]]> 1 - + NotificationSize 80 - + [Component] @@ -52232,7 +52428,7 @@ return Component;]]> - + false @@ -52271,7 +52467,7 @@ return Component;]]> false 1 - + false @@ -52311,7 +52507,7 @@ return Component;]]> 1 - + true @@ -52366,7 +52562,7 @@ return Component;]]> 1 - + true @@ -52421,7 +52617,7 @@ return Component;]]> 1 - + false @@ -52461,7 +52657,7 @@ return Component;]]> 1 - + false @@ -52500,7 +52696,7 @@ return Component;]]> true 1 - + false @@ -52551,14 +52747,14 @@ return Component;]]> 1 - + NotificationSize 80 - + false @@ -52597,7 +52793,7 @@ return Component;]]> false 1 - + false @@ -52648,7 +52844,7 @@ return Component;]]> 1 - + false @@ -52699,14 +52895,14 @@ return Component;]]> 1 - + NotificationSize 110 - + [Component] @@ -52760,7 +52956,7 @@ return Component;]]> - + 1 1 @@ -52773,7 +52969,7 @@ return Component;]]> 0 - + [Component] @@ -52833,7 +53029,487 @@ return Component;]]> - + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + SnapLineSegment + null + null + null + null + + 0 + 300 + 0 + 100 + + 0 + false + null + + 0 + 50 + 0 + 1 + + 0 + 0 + true + 1 + + + + false + + 0.5 + 0.5 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 0 + PointMarkerA + null + null + null + null + + 0 + 0 + 0.5 + 0 + + 0 + false + null + + 0 + 16 + 0 + 16 + + 2 + 0 + true + 3 + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 3 + + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + -45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 3 + + + + + + + false + + 0.5 + 0.5 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 0 + PointMarker + null + null + null + null + + 0 + 200 + 0 + 200 + + 0 + false + null + + 0.0149999997 + 0 + 0.0149999997 + 0 + + 1 + 0 + true + 1 + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 1 + + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + -45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 1 + + + + + + false + + 0.5 + 0 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + SnapLine + null + null + null + null + + 0 + 100 + 0 + 100 + + -45 + false + null + + 3 + 0 + 0 + 1 + + 0 + 0 + true + 1 + + + + false + + 0 + 0.5 + + 4280649727 + 0 + 4279970357 + 0 + false + false + 0 + SnapProgress + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 0 + false + null + + 0 + 100 + 2 + 0 + + 0 + 0 + true + 2 + + + + + false + + 0.5 + 0.5 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 0 + PointMarker + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 0 + false + null + + 0.00499999989 + 0 + 0.00499999989 + 0 + + 1 + 0 + true + 3 + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 3 + + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + -45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 3 + + + + + true @@ -52872,7 +53548,7 @@ return Component;]]> true 1 - + false @@ -52911,7 +53587,7 @@ return Component;]]> true 1 - + false @@ -52962,7 +53638,7 @@ return Component;]]> 1 - + true @@ -53026,7 +53702,7 @@ return Component;]]> true 1 - + false @@ -53076,7 +53752,7 @@ return Component;]]> false 10 - + [Component] @@ -53135,7 +53811,7 @@ return Component.Start();]]> - + false @@ -53176,7 +53852,7 @@ return Component.Start();]]> - + false @@ -53216,7 +53892,7 @@ return Component.Start();]]> 1 - + false @@ -53256,7 +53932,7 @@ return Component.Start();]]> 1 - + false @@ -53295,7 +53971,7 @@ return Component.Start();]]> false 1 - + false @@ -53334,7 +54010,7 @@ return Component.Start();]]> true 1 - + false @@ -53374,7 +54050,7 @@ return Component.Start();]]> 1 - + false @@ -53414,7 +54090,7 @@ return Component.Start();]]> 1 - + false @@ -53454,7 +54130,7 @@ return Component.Start();]]> 1 - + false @@ -53494,7 +54170,7 @@ return Component.Start();]]> 1 - + false @@ -53535,7 +54211,7 @@ return Component.Start();]]> - + false @@ -53588,7 +54264,7 @@ return Component.Start();]]> true 1 - + false @@ -53627,7 +54303,7 @@ return Component.Start();]]> true 1 - + false @@ -53667,7 +54343,7 @@ return Component.Start();]]> 1 - + false @@ -53707,7 +54383,7 @@ return Component.Start();]]> 1 - + false @@ -53747,7 +54423,7 @@ return Component.Start();]]> 1 - + false @@ -53787,7 +54463,7 @@ return Component.Start();]]> 1 - + false @@ -53828,7 +54504,7 @@ return Component.Start();]]> - + false @@ -53867,7 +54543,7 @@ return Component.Start();]]> true 1 - + false @@ -53922,7 +54598,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -53974,7 +54650,7 @@ roblox.com/library/142485815/import]]> - + false @@ -54013,7 +54689,7 @@ roblox.com/library/142485815/import]]> true 1 - + false @@ -54070,7 +54746,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -54122,7 +54798,7 @@ roblox.com/library/142485815/import]]> - + false @@ -54173,7 +54849,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -54226,7 +54902,7 @@ roblox.com/library/142485815/import]]> - + false @@ -54276,7 +54952,7 @@ roblox.com/library/142485815/import]]> false 10 - + [Component] @@ -54339,7 +55015,7 @@ return Component;]]> - + true @@ -54404,7 +55080,7 @@ return Component;]]> 1 - + true @@ -54468,7 +55144,7 @@ return Component;]]> false 1 - + false @@ -54520,7 +55196,7 @@ return Component;]]> - + false @@ -54559,7 +55235,7 @@ return Component;]]> true 1 - + false @@ -54598,7 +55274,7 @@ return Component;]]> false 1 - + false @@ -54637,7 +55313,7 @@ return Component;]]> true 1 - + false @@ -54677,7 +55353,7 @@ return Component;]]> 1 - + false @@ -54730,7 +55406,7 @@ TIP: Press R while hovering over a part to copy its color.]]> 1 - + false @@ -54783,7 +55459,7 @@ TIP: Press R while hovering over a part to copy its color.]]> - + false @@ -54822,7 +55498,7 @@ TIP: Press R while hovering over a part to copy its color.]]> false 1 - + false @@ -54861,7 +55537,7 @@ TIP: Press R while hovering over a part to copy its color.]]> true 1 - + false @@ -54901,7 +55577,7 @@ TIP: Press R while hovering over a part to copy its color.]]> 1 - + false @@ -54954,7 +55630,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55007,7 +55683,7 @@ TIP: Click a part's surface to select it quickly.]]> - + false @@ -55046,7 +55722,7 @@ TIP: Click a part's surface to select it quickly.]]> false 1 - + false @@ -55085,7 +55761,7 @@ TIP: Click a part's surface to select it quickly.]]> true 1 - + false @@ -55125,7 +55801,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55176,7 +55852,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55229,7 +55905,7 @@ TIP: Click a part's surface to select it quickly.]]> - + false @@ -55268,7 +55944,7 @@ TIP: Click a part's surface to select it quickly.]]> false 1 - + false @@ -55307,7 +55983,7 @@ TIP: Click a part's surface to select it quickly.]]> true 1 - + false @@ -55347,7 +56023,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55400,7 +56076,7 @@ TIP: Press Enter to toggle anchor quickly.]]> 1 - + false @@ -55453,7 +56129,7 @@ TIP: Press Enter to toggle anchor quickly.]]> - + false @@ -55492,7 +56168,7 @@ TIP: Press Enter to toggle anchor quickly.]]> false 1 - + false @@ -55531,7 +56207,7 @@ TIP: Press Enter to toggle anchor quickly.]]> true 1 - + false @@ -55571,7 +56247,7 @@ TIP: Press Enter to toggle anchor quickly.]]> 1 - + false @@ -55624,7 +56300,7 @@ TIP: Click and drag where you want your part to be.]]> 1 - + false @@ -55677,7 +56353,7 @@ TIP: Click and drag where you want your part to be.]]> - + false @@ -55716,7 +56392,7 @@ TIP: Click and drag where you want your part to be.]]> false 1 - + false @@ -55755,7 +56431,7 @@ TIP: Click and drag where you want your part to be.]]> true 1 - + false @@ -55795,7 +56471,7 @@ TIP: Click and drag where you want your part to be.]]> 1 - + false @@ -55850,7 +56526,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di 1 - + false @@ -55903,7 +56579,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di - + false @@ -55942,7 +56618,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di false 1 - + false @@ -55981,7 +56657,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di true 1 - + false @@ -56021,7 +56697,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di 1 - + false @@ -56078,7 +56754,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>1 - + false @@ -56131,7 +56807,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]> - + false @@ -56170,7 +56846,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>false 1 - + false @@ -56209,7 +56885,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>true 1 - + false @@ -56249,7 +56925,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>1 - + false @@ -56302,7 +56978,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -56355,7 +57031,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]> - + false @@ -56394,7 +57070,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>false 1 - + false @@ -56433,7 +57109,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>true 1 - + false @@ -56473,7 +57149,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -56524,7 +57200,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -56577,7 +57253,457 @@ TIP: Click on the surface of any part to change a light's side quickly.]]> - + + + false + + 0 + 0 + + 4282203453 + 0.200000003 + 4279970357 + 0 + false + false + 0 + WeldInfo + null + null + null + null + + 0 + 0 + 0 + 0 + + 0 + false + null + + 1 + 0 + 1 + 0 + + 0 + 0 + false + 1 + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 0 + Content + null + null + null + null + + 0 + 0 + 0 + 0 + + 0 + false + null + + 1 + 0 + 0 + 310 + + 0 + 0 + true + 1 + + + + false + + 0 + 0 + + 4279308561 + 0 + 4279970357 + 0 + false + false + 0 + ColorBar + null + null + null + null + + 0 + 0 + 0 + 0 + + 0 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 1 + 2 + 0 + ToolDescription + null + null + null + null + + 0 + 10 + 0 + 25 + + 0 + false + null + + 0 + 90 + 0 + 300 + + 0 + + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 2 + 2 + 0 + ToolName + null + null + null + null + + 0 + 10 + 0 + 0 + + 0 + false + null + + 0 + 50 + 0 + 25 + + 0 + WELD TOOL + 4294967295 + false + 10 + 4278190080 + 1 + 0 + false + 0 + 1 + true + 1 + + + + + + + false + + 0 + 0 + + 4282203453 + 0.200000003 + 4279970357 + 0 + false + false + 0 + CollisionInfo + null + null + null + null + + 0 + 0 + 0 + 0 + + 0 + false + null + + 1 + 0 + 1 + 0 + + 0 + 0 + false + 1 + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 0 + Content + null + null + null + null + + 0 + 0 + 0 + 0 + + 0 + false + null + + 1 + 0 + 0 + 150 + + 0 + 0 + true + 1 + + + + false + + 0 + 0 + + 4279308561 + 0 + 4279970357 + 0 + false + false + 0 + ColorBar + null + null + null + null + + 0 + 0 + 0 + 0 + + 0 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 1 + 2 + 0 + ToolDescription + null + null + null + null + + 0 + 10 + 0 + 25 + + 0 + false + null + + 0 + 80 + 0 + 120 + + 0 + + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 2 + 2 + 0 + ToolName + null + null + null + null + + 0 + 10 + 0 + 0 + + 0 + false + null + + 0 + 50 + 0 + 25 + + 0 + COLLISION TOOL + 4294967295 + false + 10 + 4278190080 + 1 + 0 + false + 0 + 1 + true + 1 + + + + + false @@ -56616,7 +57742,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>false 1 - + false @@ -56669,7 +57795,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>true 1 - + false @@ -56708,7 +57834,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>true 1 - + false @@ -56748,7 +57874,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -56803,7 +57929,7 @@ LAST - Relative to the last part selected]]> 1 - + false @@ -56854,7 +57980,7 @@ LAST - Relative to the last part selected]]> 1 - + false @@ -56905,7 +58031,7 @@ LAST - Relative to the last part selected]]> 1 - + false @@ -56957,7 +58083,7 @@ LAST - Relative to the last part selected]]> - + false @@ -56997,7 +58123,7 @@ LAST - Relative to the last part selected]]> 1 - + false @@ -57036,7 +58162,7 @@ LAST - Relative to the last part selected]]> true 1 - + false @@ -57068,14 +58194,18 @@ LAST - Relative to the last part selected]]> null 0 - 80 + 82 0 400 0 1 - + false @@ -57147,7 +58277,7 @@ TIP: Hit the - key to quickly type increments.]]> - + false @@ -57198,7 +58328,7 @@ TIP: Hit the - key to quickly type increments.]]> 1 - + false @@ -57251,7 +58381,7 @@ TIP: Hit the - key to quickly type increments.]]> - + false @@ -57290,7 +58420,7 @@ TIP: Hit the - key to quickly type increments.]]> false 1 - + false @@ -57310,7 +58440,7 @@ TIP: Hit the - key to quickly type increments.]]> 0 0 0 - 610 + 630 true false @@ -57343,7 +58473,7 @@ TIP: Hit the - key to quickly type increments.]]> true 1 - + false @@ -57383,7 +58513,7 @@ TIP: Hit the - key to quickly type increments.]]> 1 - + false @@ -57422,7 +58552,7 @@ TIP: Hit the - key to quickly type increments.]]> true 1 - + false @@ -57454,12 +58584,12 @@ TIP: Hit the - key to quickly type increments.]]> null 0 - 93 + 94 0 400 0 - + 4/6 = Y axis (green) + 1/9 = Z axis (blue) + 2/8 = X axis (red) +(Shift = reverses increment)]]> 4294967295 false 10 @@ -57484,7 +58615,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 1 - + false @@ -57536,7 +58667,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen - + false @@ -57575,7 +58706,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen true 1 - + false @@ -57615,7 +58746,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 1 - + false @@ -57670,7 +58801,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -57721,7 +58852,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -57772,7 +58903,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -57824,7 +58955,7 @@ LAST - Each part around the center of the last part selected]]> - + false @@ -57875,7 +59006,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -57928,7 +59059,7 @@ LAST - Each part around the center of the last part selected]]> - + false @@ -57967,7 +59098,7 @@ LAST - Each part around the center of the last part selected]]> false 1 - + false @@ -57987,7 +59118,7 @@ LAST - Each part around the center of the last part selected]]> 0 0 0 - 525 + 540 true false @@ -58020,7 +59151,7 @@ LAST - Each part around the center of the last part selected]]> true 1 - + false @@ -58060,7 +59191,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -58099,7 +59230,7 @@ LAST - Each part around the center of the last part selected]]> true 1 - + false @@ -58152,7 +59283,7 @@ TIP: Click on a part to focus the handles on it.]]> 1 - + false @@ -58204,7 +59335,7 @@ TIP: Click on a part to focus the handles on it.]]> - + false @@ -58243,7 +59374,7 @@ TIP: Click on a part to focus the handles on it.]]> true 1 - + false @@ -58294,7 +59425,7 @@ TIP: Click on a part to focus the handles on it.]]> 1 - + false @@ -58326,7 +59457,7 @@ TIP: Click on a part to focus the handles on it.]]> null 0 - 80 + 82 0 400 @@ -58337,7 +59468,11 @@ TIP: Hit the - key to quickly type increments. TIP: Hit Enter to switch between directions quickly. -TIP: Use your right-side number keypad to resize exactly by the current increment (8/2 = up/down, 1/9 = back/forth, 4/6 = left/right) +TIP: Use your right-side number keypad to resize exactly by the current increment + 8/2 = up/down + 1/9 = back/forth + 4/6 = left/right +(Shift = reverses increment) TIP: Hold the R key, and click and drag the snap point of a part (in the direction that you want to resize) towards the snap point of another part, to resize up to that point.]]> 4294967295 @@ -58354,7 +59489,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi - + false @@ -58405,7 +59540,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 1 - + false @@ -58458,457 +59593,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi - - - false - - 0 - 0 - - 4282203453 - 0.200000003 - 4279970357 - 0 - false - false - 0 - WeldInfo - null - null - null - null - - 0 - 0 - 0 - 0 - - 0 - false - null - - 1 - 0 - 1 - 0 - - 0 - 0 - false - 1 - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 0 - Content - null - null - null - null - - 0 - 0 - 0 - 0 - - 0 - false - null - - 1 - 0 - 0 - 310 - - 0 - 0 - true - 1 - - - - false - - 0 - 0 - - 4279308561 - 0 - 4279970357 - 0 - false - false - 0 - ColorBar - null - null - null - null - - 0 - 0 - 0 - 0 - - 0 - false - null - - 1 - 0 - 0 - 2 - - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 1 - 2 - 0 - ToolDescription - null - null - null - null - - 0 - 10 - 0 - 25 - - 0 - false - null - - 0 - 90 - 0 - 300 - - 0 - - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 2 - 2 - 0 - ToolName - null - null - null - null - - 0 - 10 - 0 - 0 - - 0 - false - null - - 0 - 50 - 0 - 25 - - 0 - WELD TOOL - 4294967295 - false - 10 - 4278190080 - 1 - 0 - false - 0 - 1 - true - 1 - - - - - - - false - - 0 - 0 - - 4282203453 - 0.200000003 - 4279970357 - 0 - false - false - 0 - CollisionInfo - null - null - null - null - - 0 - 0 - 0 - 0 - - 0 - false - null - - 1 - 0 - 1 - 0 - - 0 - 0 - false - 1 - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 0 - Content - null - null - null - null - - 0 - 0 - 0 - 0 - - 0 - false - null - - 1 - 0 - 0 - 150 - - 0 - 0 - true - 1 - - - - false - - 0 - 0 - - 4279308561 - 0 - 4279970357 - 0 - false - false - 0 - ColorBar - null - null - null - null - - 0 - 0 - 0 - 0 - - 0 - false - null - - 1 - 0 - 0 - 2 - - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 1 - 2 - 0 - ToolDescription - null - null - null - null - - 0 - 10 - 0 - 25 - - 0 - false - null - - 0 - 80 - 0 - 120 - - 0 - - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 2 - 2 - 0 - ToolName - null - null - null - null - - 0 - 10 - 0 - 0 - - 0 - false - null - - 0 - 50 - 0 - 25 - - 0 - COLLISION TOOL - 4294967295 - false - 10 - 4278190080 - 1 - 0 - false - 0 - 1 - true - 1 - - - - - + [Component] @@ -59069,7 +59754,7 @@ return Component;]]> - + [Component] @@ -59212,18 +59897,18 @@ return Component;]]> - + AutoUpdate true - + false AutomaticUpdating - {F93B4C0B-0241-4244-B8A2-66648002C401} + {7F22FE27-A0FA-41CC-A710-D94883923F4A} 0 then end;]]> - + -9.0008564 @@ -59317,7 +60002,7 @@ end;]]> 1 ThumbnailCamera - + true -0.5 @@ -59388,7 +60073,7 @@ end;]]> 0.200000003 - + true null @@ -59403,7 +60088,7 @@ end;]]> 0 0 - + false @@ -59465,12 +60150,12 @@ end;]]> - + false ThumbnailClearer - {B6F2498F-5598-4748-BE0E-FE105AC5FBB6} + {380A27C1-6A47-4A9A-B4A3-2A7844687D60} script.Parent:Destroy(); diff --git a/build/Building Tools by F3X.rbxmx b/build/Building Tools by F3X.rbxmx index 8b90bd6..0bbcf61 100644 --- a/build/Building Tools by F3X.rbxmx +++ b/build/Building Tools by F3X.rbxmx @@ -1,7 +1,7 @@ null nil - + true true @@ -25,7 +25,7 @@ Building Tools by F3X - + false -0.5 @@ -96,7 +96,7 @@ 0.800000012 - + 4294967295 5 @@ -105,7 +105,7 @@ 0 - + 4294967295 2 @@ -114,7 +114,7 @@ 0 - + 4294967295 3 @@ -123,7 +123,7 @@ 0 - + 4294967295 0 @@ -132,7 +132,7 @@ 0 - + 4294967295 1 @@ -141,7 +141,7 @@ 0 - + 4294967295 4 @@ -151,13 +151,13 @@ - + Version - 2.0.1 + 2.0.2 - + SupportLibrary @@ -934,7 +934,7 @@ end; return SupportLibrary;]]> - + SecurityModule @@ -1260,7 +1260,7 @@ end; return Security;]]> - + Region by AxisAngle @@ -1676,7 +1676,7 @@ end return Region]]> - + false @@ -1838,7 +1838,7 @@ end; -- Expose GetLibraries function _G.GetLibraries = GetLibraries;]]> - + F3X/SupportLibrary@1.0.0 @@ -2614,7 +2614,7 @@ end; return SupportLibrary;]]> - + Metadata @@ -2631,7 +2631,7 @@ return SupportLibrary;]]> - + F3X/Cheer@0.0.1 @@ -3485,7 +3485,7 @@ setmetatable(Cheer, { return Cheer;]]> - + SupportLibrary @@ -4262,7 +4262,7 @@ end; return SupportLibrary;]]> - + Metadata @@ -4279,7 +4279,7 @@ return SupportLibrary;]]> - + F3X/Try@1.0.0 @@ -4476,7 +4476,7 @@ end; return Try;]]> - + SupportLibrary @@ -5252,7 +5252,7 @@ end; return SupportLibrary;]]> - + Metadata @@ -5270,7 +5270,7 @@ return SupportLibrary;]]> - + SerializationModule @@ -5719,11 +5719,11 @@ end; return Serialization;]]> - + SyncAPI - + SyncModule @@ -5773,10 +5773,8 @@ Actions = { -- Clones the given parts -- Make sure the given items are all parts - for _, Part in pairs(Parts) do - if not Part:IsA 'BasePart' then - return; - end; + if not ArePartsSelectable(Parts) then + return; end; -- Cache up permissions for all private areas @@ -5856,6 +5854,11 @@ Actions = { end; + -- Ensure relevant parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -5903,6 +5906,11 @@ Actions = { end; + -- Ensure relevant parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -5939,6 +5947,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -5999,6 +6012,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6061,6 +6079,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6121,6 +6144,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6163,6 +6191,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6202,6 +6235,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6257,6 +6295,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6327,6 +6370,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6382,6 +6430,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6455,6 +6508,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6502,6 +6560,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6564,6 +6627,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6620,6 +6688,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6683,6 +6756,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6717,6 +6795,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6751,6 +6834,11 @@ Actions = { end; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6785,6 +6873,11 @@ Actions = { ['CreateWelds'] = function (Parts, TargetPart) -- Creates welds for the given parts to the target part + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6843,6 +6936,11 @@ Actions = { end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + local WeldsRemoved = 0; -- Cache up permissions for all private areas @@ -6898,6 +6996,11 @@ Actions = { end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -6943,6 +7046,11 @@ Actions = { return; end; + -- Ensure parts are selectable + if not ArePartsSelectable(Parts) then + return; + end; + -- Cache up permissions for all private areas local AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Parts), Player); @@ -7042,6 +7150,42 @@ Actions = { }; +function ArePartsSelectable(Parts) + -- Returns whether the parts are selectable + + -- Check whether each part is selectable + for _, Part in pairs(Parts) do + if not Part:IsA 'BasePart' or Part.Locked then + return false; + end; + end; + + -- Return true if all parts are selectable + return true; + +end; + +-- Keep current player updated in tool mode +if ToolMode == 'Tool' then + + -- Set current player + Player = Players:GetPlayerFromCharacter(Tool.Parent); + + -- Stay updated with latest player operating the tool + Tool.AncestryChanged:Connect(function (Child, Parent) + + -- Ensure tool's parent changed + if Child ~= Tool then + return; + end; + + -- Update current player + Player = Players:GetPlayerFromCharacter(Parent); + + end); + +end; + -- Provide an interface into the module return { @@ -7057,8 +7201,10 @@ return { return; end; - -- Update the Player pointer - Player = Client; + -- Ensure client is current player in tool mode + if ToolMode == 'Tool' then + assert(Player and (Client == Player), 'Permission denied for client'); + end; -- Execute valid actions return Action(...); @@ -7068,7 +7214,7 @@ return { };]]> - + false @@ -7098,11 +7244,11 @@ SyncAPI.OnInvoke = function (...) end;]]> - + ServerEndpoint - + false @@ -7123,17 +7269,17 @@ end;]]> - + Loaded false - + ComponentCount 0 - + false @@ -7151,7 +7297,7 @@ Count.Value = Support.GetDescendantCount(Tool) - ThumbnailDescendantCount;]]>

- + false @@ -7176,11 +7322,11 @@ Indicator.Value = true;]]> - + Assets - + {8B7D7D11-C7FF-4C9F-8574-03D34EE6ACE6} return Assets;]]> - + Core @@ -7416,6 +7562,7 @@ function Enable(Mouse) EnableHotkeys(); Targeting.EnableTargeting(); Selection.EnableOutlines(); + Selection.EnableMultiselectionHotkeys(); -- Equip current tool EquipTool(CurrentTool or require(Tool.Tools.MoveTool)); @@ -7534,6 +7681,14 @@ AssignHotkey({ 'RightShift', 'Z' }, History.Undo); AssignHotkey({ 'LeftShift', 'Y' }, History.Redo); AssignHotkey({ 'RightShift', 'Y' }, History.Redo); +-- If in-game, enable ctrl hotkeys for undoing and redoing +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'Z' }, History.Undo); + AssignHotkey({ 'RightControl', 'Z' }, History.Undo); + AssignHotkey({ 'LeftControl', 'Y' }, History.Redo); + AssignHotkey({ 'RightControl', 'Y' }, History.Redo); +end; + function CloneSelection() -- Clones selected parts @@ -7644,6 +7799,14 @@ AssignHotkey({ 'RightShift', 'C' }, CloneSelection); AssignHotkey({ 'LeftShift', 'X' }, DeleteSelection); AssignHotkey({ 'RightShift', 'X' }, DeleteSelection); +-- If in-game, enable ctrl hotkeys for cloning and deleting +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'C' }, CloneSelection); + AssignHotkey({ 'RightControl', 'C' }, CloneSelection); + AssignHotkey({ 'LeftControl', 'X' }, DeleteSelection); + AssignHotkey({ 'RightControl', 'X' }, DeleteSelection); +end; + function PrismSelect() -- Selects parts in the currently selected parts @@ -7695,6 +7858,12 @@ end; AssignHotkey({ 'LeftShift', 'K' }, PrismSelect); AssignHotkey({ 'RightShift', 'K' }, PrismSelect); +-- If in-game, enable ctrl hotkeys for prism selection +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'K' }, PrismSelect); + AssignHotkey({ 'RightControl', 'K' }, PrismSelect); +end; + function SelectSiblings(ReplaceSelection) -- Selects all parts under the same parent as the focused part @@ -7724,6 +7893,14 @@ AssignHotkey({ 'RightShift', 'LeftBracket' }, Support.Call(SelectSiblings, false AssignHotkey({ 'LeftShift', 'R' }, Support.Call(Selection.Clear, true)); AssignHotkey({ 'RightShift', 'R' }, Support.Call(Selection.Clear, true)); +-- If in-game, enable ctrl hotkeys for sibling selection & selection clearing +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'LeftBracket' }, Support.Call(SelectSiblings, false)); + AssignHotkey({ 'RightControl', 'LeftBracket' }, Support.Call(SelectSiblings, false)); + AssignHotkey({ 'LeftControl', 'R' }, Support.Call(Selection.Clear, true)); + AssignHotkey({ 'RightControl', 'R' }, Support.Call(Selection.Clear, true)); +end; + function IsSelectable(Object) -- Returns whether `Object` can be selected @@ -7793,6 +7970,12 @@ end; AssignHotkey({ 'LeftShift', 'P' }, ExportSelection); AssignHotkey({ 'RightShift', 'P' }, ExportSelection); +-- If in-game, enable ctrl hotkeys for exporting +if Mode == 'Tool' then + AssignHotkey({ 'LeftControl', 'P' }, ExportSelection); + AssignHotkey({ 'RightControl', 'P' }, ExportSelection); +end; + function IsVersionOutdated() -- Returns whether this version of Building Tools is out of date @@ -7860,7 +8043,7 @@ InitializeUI(); return getfenv(0);]]> - + false @@ -7885,11 +8068,11 @@ local Core = require(Tool:WaitForChild 'Core'); require(Tool.Tools.CoreToolLoader);]]> - + Tools - + MoveTool @@ -7999,7 +8182,7 @@ function ShowUI() local IncrementInput = MoveTool.UI.IncrementOption.Increment.TextBox; IncrementInput.FocusLost:connect(function (EnterPressed) MoveTool.Increment = tonumber(IncrementInput.Text) or MoveTool.Increment; - IncrementInput.Text = Support.Round(MoveTool.Increment, 3); + IncrementInput.Text = Support.Round(MoveTool.Increment, 4); end); -- Add functionality to the position inputs @@ -8201,8 +8384,8 @@ function AttachHandles(Part, Autofocus) Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - -- Make sure this was button 1 being released - if InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1 then + -- Make sure this was button 1 being released, and dragging is ongoing + if not HandleDragging or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then return; end; @@ -8357,8 +8540,8 @@ function BindShortcutKeys() MoveTool.UI.IncrementOption.Increment.TextBox:CaptureFocus(); end; - -- Check if the R key was pressed down, and it wasn't Shift R - elseif InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Check if the R key was pressed down, and it's not the selection clearing hotkey + elseif InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then -- Start tracking snap points nearest to the mouse StartSnapping(); @@ -8614,7 +8797,7 @@ function EnableDragging() end; -- Make sure this click was not to select - if Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift) then + if Selection.Multiselecting then return; end; @@ -8983,7 +9166,7 @@ end; return MoveTool;]]> - + ResizeTool @@ -9093,7 +9276,7 @@ function ShowUI() local IncrementInput = ResizeTool.UI.IncrementOption.Increment.TextBox; IncrementInput.FocusLost:connect(function (EnterPressed) ResizeTool.Increment = tonumber(IncrementInput.Text) or ResizeTool.Increment; - IncrementInput.Text = Support.Round(ResizeTool.Increment, 3); + IncrementInput.Text = Support.Round(ResizeTool.Increment, 4); end); -- Add functionality to the size inputs @@ -9282,8 +9465,8 @@ function ShowHandles() Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - -- Make sure this was button 1 being released - if InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1 then + -- Make sure this was button 1 being released, and handle resizing is ongoing + if not HandleResizing or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then return; end; @@ -9294,8 +9477,7 @@ function ShowHandles() Core.Targeting.CancelSelecting(); -- Clear this connection to prevent it from firing again - Connections.HandleRelease:disconnect(); - Connections.HandleRelease = nil; + ClearConnection 'HandleRelease'; -- Make joints, restore original anchor and collision states for _, Part in pairs(Selection.Items) do @@ -9363,8 +9545,7 @@ function HideHandles() Handles.Parent = nil; -- Clear unnecessary resources - Connections.AutofocusHandle:disconnect(); - Connections.AutofocusHandle = nil; + ClearConnection 'AutofocusHandle'; end; @@ -9477,8 +9658,8 @@ function BindShortcutKeys() elseif InputInfo.KeyCode == Enum.KeyCode.KeypadSix then NudgeSelectionByFace(Enum.NormalId.Right); - -- Start snapping when the R key is pressed down (and it's not Shift R) - elseif InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Start snapping when the R key is pressed down, and it's not the selection clearing hotkey + elseif InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then StartSnapping(); end; @@ -9503,8 +9684,8 @@ function BindShortcutKeys() return; end; - -- Finish snapping when the R key is released (and it's not Shift R) - if InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Finish snapping when the R key is released, and it's not the selection clearing hotkey + if InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then FinishSnapping(); end; @@ -9738,10 +9919,13 @@ PointSnapped = Core.RbxUtility.CreateSignal(); function StartSnapping() -- Make sure snapping isn't already enabled - if SnapTracking.Enabled then + if SnappingStage or SnapTracking.Enabled then return; end; + -- Start first snapping stage + SnappingStage = 'Starting'; + -- Only enable corner snapping SnapTracking.TrackEdgeMidpoints = false; SnapTracking.TrackFaceCentroids = false; @@ -9767,48 +9951,89 @@ function StartSnapping() SnappingStartSelectionState = PreparePartsForResizing(); AreaPermissions = Security.GetPermissions(Security.GetSelectionAreas(Selection.Items), Core.Player); + -- Pause snapping + SnapTracking.StopTracking(); + + -- Start a direction line + DirectionLine = Core.Tool.Interfaces.SnapLine:Clone(); + DirectionLine.Parent = Core.UI; + DirectionLine.Visible = false; + -- Track changes for history TrackChange(); -- Listen for when the user drags - Connections.SnapDrag = Support.AddUserInputListener('Changed', 'MouseMovement', false, function (Input) + Connections.SnapDrag = Support.AddUserInputListener('Changed', 'MouseMovement', true, function (Input) -- Update the latest aim SnappingEndAim = Vector2.new(Input.Position.X, Input.Position.Y); + ScreenSnappedPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappingStartPoint); + ScreenSnappedPoint = Vector2.new(ScreenSnappedPoint.X, ScreenSnappedPoint.Y); - -- Use the mouse position to figure out the resize direction (until after 20px) - if SnappingStage == 'Direction' then + -- Calculate direction setting length + local DirectionSettingLength = math.min(50, math.max(50, (SnappingStartAim - ScreenSnappedPoint).magnitude * 1.5)); - -- Check the length - local Length = (SnappingEndAim - SnappingStartAim).magnitude; - if Length < 20 then - return; - end; + -- Use the mouse position to figure out the resize direction (until after direction setting length) + if SnappingStage == 'Direction' then - local DragSlope = (SnappingEndAim.Y - SnappingStartAim.Y) / (SnappingEndAim.X - SnappingStartAim.X); + -- Get current angle from snap point + local DragAngle = math.deg(math.atan2(SnappingEndAim.Y - ScreenSnappedPoint.Y, SnappingEndAim.X - ScreenSnappedPoint.X)); + DragAngle = (DragAngle > 0) and (DragAngle - 360) or DragAngle; -- Go through corner offsets representing the possible directions local Directions = {}; for _, Direction in pairs(SnappingStartDirections) do -- Map the corner & corner offset to screen points - local ScreenSnappedPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappingStartPoint); local ScreenOffsetPoint = Workspace.CurrentCamera:WorldToScreenPoint(Direction.Offset); - -- Get the slope representing the direction (based on the mapped screen points) - local DirectionSlope = (ScreenOffsetPoint.Y - ScreenSnappedPoint.Y) / (ScreenOffsetPoint.X - ScreenSnappedPoint.X); + -- Get direction angle from snap point + local DirectionAngle = math.deg(math.atan2(ScreenOffsetPoint.Y - ScreenSnappedPoint.Y, ScreenOffsetPoint.X - ScreenSnappedPoint.X)); + DirectionAngle = (DirectionAngle > 0) and (DirectionAngle - 360) or DirectionAngle; + + -- Calculate delta between drag and direction angles + local AngleDelta = math.abs(DragAngle - DirectionAngle) % 180; + AngleDelta = (AngleDelta > 90) and (180 - AngleDelta) or AngleDelta; - -- Calculate the similarity between the drag & direction slopes - local SlopeDelta = math.abs(math.abs(DragSlope) - math.abs(DirectionSlope)); - table.insert(Directions, { Face = Direction.Face, SlopeDelta = SlopeDelta, Offset = Direction.Offset }); + -- Insert the potential direction + table.insert(Directions, { + Face = Direction.Face, + AngleDelta = AngleDelta, + DirectionAngle = DirectionAngle, + Offset = Direction.Offset + }); end; - -- Get the direction slope closest to the mouse's + -- Get the direction most similar to the dragging angle table.sort(Directions, function (A, B) - return A.SlopeDelta < B.SlopeDelta; + return A.AngleDelta < B.AngleDelta; end); + -- Center direction line at snap point + DirectionLine.Position = UDim2.new(0, ScreenSnappedPoint.X, 0, ScreenSnappedPoint.Y); + + -- Orient direction line towards drag direction + if math.abs(DragAngle - Directions[1].DirectionAngle) <= 90 then + DirectionLine.Rotation = Directions[1].DirectionAngle; + else + DirectionLine.Rotation = 180 + Directions[1].DirectionAngle; + end; + + -- Show the direction line + DirectionLine.PointMarker.Rotation = -DirectionLine.Rotation; + DirectionLine.SnapProgress.Size = UDim2.new(0, DirectionSettingLength, 2, 0); + DirectionLine.Visible = true; + + -- Check if drag has passed direction setting length + local Length = (SnappingEndAim - ScreenSnappedPoint).magnitude; + if Length < DirectionSettingLength then + return; + end; + + -- Clear the direction line + DirectionLine:Destroy() + -- Select the resizing direction that was closest to the mouse drag SnappingDirection = Directions[1].Face; SnappingDirectionOffset = Directions[1].Offset; @@ -9816,11 +10041,24 @@ function StartSnapping() -- Move to the destination-picking stage of snapping SnappingStage = 'Destination'; + -- Set destination-stage snapping options + SnapTracking.TrackEdgeMidpoints = true; + SnapTracking.TrackFaceCentroids = true; SnapTracking.TargetFilter = function (Target) return not Target.Locked; end; SnapTracking.TargetBlacklist = Selection.Items; - -- Resize in the selected direction up to the targeted destination - elseif SnappingStage == 'Destination' then + -- Re-enable snapping to select destination + SnapTracking.StartTracking(function (NewPoint) + if NewPoint and NewPoint.p ~= SnappedPoint then + SnappedPoint = NewPoint.p; + PointSnapped:fire(NewPoint.p); + end; + end); + + -- Start a distance alignment line + AlignmentLine = Core.Tool.Interfaces.SnapLineSegment:Clone(); + AlignmentLine.Visible = false; + AlignmentLine.Parent = Core.UI; end; @@ -9829,7 +10067,10 @@ function StartSnapping() -- Listen for when a new point is snapped Connections.Snap = PointSnapped:connect(function (SnappedPoint) + -- Resize to snap point if in the destination stage of snapping if SnappingStage == 'Destination' then + + -- Calculate direction and distance to resize towards local Direction = (SnappingDirectionOffset - SnappingStartPoint).unit; local Distance = (SnappedPoint - SnappingStartPoint):Dot(Direction); @@ -9849,24 +10090,39 @@ function StartSnapping() end; end; + -- Update the distance alignment line + local ScreenStartPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappingStartPoint + (Direction * Distance)); + ScreenStartPoint = Vector2.new(ScreenStartPoint.X, ScreenStartPoint.Y); + local ScreenDestinationPoint = Workspace.CurrentCamera:WorldToScreenPoint(SnappedPoint); + ScreenDestinationPoint = Vector2.new(ScreenDestinationPoint.X, ScreenDestinationPoint.Y) + local AlignmentAngle = math.deg(math.atan2(ScreenDestinationPoint.Y - ScreenStartPoint.Y, ScreenDestinationPoint.X - ScreenStartPoint.X)); + local AlignmentCenter = ScreenStartPoint:Lerp(ScreenDestinationPoint, 0.5); + AlignmentLine.Position = UDim2.new(0, AlignmentCenter.X, 0, AlignmentCenter.Y); + AlignmentLine.Rotation = AlignmentAngle; + AlignmentLine.Size = UDim2.new(0, (ScreenDestinationPoint - ScreenStartPoint).magnitude, 0, 1); + AlignmentLine.PointMarkerA.Rotation = -AlignmentAngle; + AlignmentLine.Visible = true; + end; end); - -- Listen for the end of the snapping - Connections.SnapDragEnd = Support.AddUserInputListener('Ended', 'MouseButton1', false, function (Input) + end); + + -- Listen for the end of the snapping + Connections.SnapDragEnd = Support.AddUserInputListener('Ended', 'MouseButton1', true, function (Input) - -- Restore the selection's original state + -- If destination stage was reached, restore the selection's original state + if SnappingStage == 'Destination' then for Part, PartState in pairs(SnappingStartSelectionState) do Part:MakeJoints(); Part.CanCollide = PartState.CanCollide; Part.Anchored = PartState.Anchored; end; + end; - -- Finish snapping - FinishSnapping(); - - end); + -- Finish snapping + FinishSnapping(); end); @@ -9874,14 +10130,27 @@ end; function FinishSnapping() - -- Make sure snapping is enabled - if not SnapTracking.Enabled then + -- Ensure snapping is ongoing + if not SnappingStage then return; end; + -- Disable any snapping stage + SnappingStage = nil; + -- Stop snap point tracking SnapTracking.StopTracking(); + -- Clear any UI + if DirectionLine then + DirectionLine:Destroy(); + DirectionLine = nil; + end; + if AlignmentLine then + AlignmentLine:Destroy(); + AlignmentLine = nil; + end; + -- Register any change if HistoryRecord then RegisterChange(); @@ -9906,7 +10175,8 @@ function GetFaceOffsetsFromCorner(Part, Point) for _, Face in pairs(Faces) do -- Calculate the offset from the corner in the direction of the face - local Offset = CFrame.new(Point) * CFrame.Angles(Part.CFrame:toEulerAnglesXYZ()) * Vector3.FromNormalId(Face); + local FaceOffset = (Vector3.FromNormalId(Face) * Part.Size) / 2; + local Offset = CFrame.new(Point) * CFrame.Angles(Part.CFrame:toEulerAnglesXYZ()) * FaceOffset; table.insert(Offsets, { Face = Face, Offset = Offset }); end; @@ -9944,7 +10214,7 @@ end; return ResizeTool;]]> - + RotateTool @@ -10061,7 +10331,7 @@ function ShowUI() local IncrementInput = RotateTool.UI.IncrementOption.Increment.TextBox; IncrementInput.FocusLost:connect(function (EnterPressed) RotateTool.Increment = tonumber(IncrementInput.Text) or RotateTool.Increment; - IncrementInput.Text = Support.Round(RotateTool.Increment, 3); + IncrementInput.Text = Support.Round(RotateTool.Increment, 4); end); -- Add functionality to the rotation inputs @@ -10201,8 +10471,7 @@ function AttachHandles(Part, Autofocus) -- Disable autofocus if not requested and on elseif not Autofocus and Connections.AutofocusHandle then - Connections.AutofocusHandle:disconnect(); - Connections.AutofocusHandle = nil; + ClearConnection 'AutofocusHandle'; end; -- Just attach and show the handles if they already exist @@ -10263,8 +10532,8 @@ function AttachHandles(Part, Autofocus) Connections.HandleRelease = UserInputService.InputEnded:connect(function (InputInfo, GameProcessedEvent) - -- Make sure this was button 1 being released - if InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1 then + -- Make sure this was button 1 being released, and rotating is ongoing + if not HandleRotating or (InputInfo.UserInputType ~= Enum.UserInputType.MouseButton1) then return; end; @@ -10275,8 +10544,7 @@ function AttachHandles(Part, Autofocus) HandleRotating = false; -- Clear this connection to prevent it from firing again - Connections.HandleRelease:disconnect(); - Connections.HandleRelease = nil; + ClearConnection 'HandleRelease'; -- Make joints, restore original anchor and collision states for _, Part in pairs(Selection.Items) do @@ -10341,10 +10609,7 @@ function HideHandles() Handles.Parent = nil; -- Disable handle autofocus if enabled - if Connections.AutofocusHandle then - Connections.AutofocusHandle:disconnect(); - Connections.AutofocusHandle = nil; - end; + ClearConnection 'AutofocusHandle'; end; @@ -10446,8 +10711,12 @@ function BindShortcutKeys() elseif InputInfo.KeyCode == Enum.KeyCode.KeypadSix then NudgeSelectionByAxis(Enum.Axis.Y, 1); - -- Start snapping when the R key is pressed down (and it's not Shift R) - elseif InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Start snapping when the R key is pressed down, and it's not the selection clearing hotkey + elseif (InputInfo.KeyCode == Enum.KeyCode.R) and not Selection.Multiselecting then + StartSnapping(); + + -- Start snapping when T key is pressed down (alias) + elseif InputInfo.KeyCode == Enum.KeyCode.T then StartSnapping(); end; @@ -10731,7 +11000,7 @@ end; return RotateTool;]]> - + PaintTool @@ -10973,8 +11242,8 @@ function BindShortcutKeys() end; - -- Check if the R key was pressed - if InputInfo.KeyCode == Enum.KeyCode.R and not (Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift)) then + -- Check if the R key was pressed, and it wasn't the selection clearing hotkey + if InputInfo.KeyCode == Enum.KeyCode.R and not Selection.Multiselecting then -- Set the current color to that of the current mouse target (if any) if Core.Mouse.Target then @@ -11086,7 +11355,7 @@ end; -- Return the tool return PaintTool;]]> - + Colors @@ -11226,7 +11495,7 @@ return BrickColors; ]]> - + MaterialTool @@ -11571,7 +11840,7 @@ end; return MaterialTool;]]> - + SurfaceTool @@ -11938,7 +12207,7 @@ end; return SurfaceTool;]]> - + AnchorTool @@ -12194,7 +12463,7 @@ end; return AnchorTool;]]> - + WeldTool @@ -12408,7 +12677,7 @@ end; return WeldTool;]]> - + TextureTool @@ -13026,7 +13295,7 @@ end; return TextureTool;]]> - + MeshTool @@ -13783,7 +14052,7 @@ end; return MeshTool;]]> - + NewPartTool @@ -13911,11 +14180,23 @@ function EnableClickCreation() return; end; + -- Enable new part dragging + DragNewParts = true; + Core.Targeting.CancelSelecting(); + -- Create the part CreatePart(NewPartTool.Type); end); + -- Listen for click releases + Connections.ClickReleaseListener = Support.AddUserInputListener('Ended', 'MouseButton1', true, function () + + -- Cancel dragging new parts if mouse button is released + DragNewParts = false; + + end); + end; function CreatePart(Type) @@ -13961,7 +14242,9 @@ function CreatePart(Type) Core.EquipTool(MoveTool); -- Enable dragging to allow easy positioning of the created part - MoveTool.SetUpDragging(Part); + if DragNewParts then + MoveTool.SetUpDragging(Part); + end; end; @@ -13969,7 +14252,7 @@ end; return NewPartTool;]]> - + CollisionTool @@ -14225,7 +14508,7 @@ end; return CollisionTool;]]> - + LightingTool @@ -14998,7 +15281,7 @@ end; return LightingTool;]]> - + DecorateTool @@ -15631,7 +15914,7 @@ end; return DecorateTool;]]> - + CoreToolLoader @@ -15715,7 +15998,7 @@ return true;]]> - + HistoryModule @@ -15798,7 +16081,7 @@ end; return History;]]> - + SelectionModule @@ -15813,6 +16096,7 @@ Selection = {}; Selection.Items = {}; Selection.Outlines = {}; Selection.Color = BrickColor.new 'Cyan'; +Selection.Multiselecting = false; -- Events to listen to selection changes Selection.ItemsAdded = RbxUtility.CreateSignal(); @@ -16083,6 +16367,42 @@ function Selection.EnableOutlines() end; +function Selection.EnableMultiselectionHotkeys() + -- Enables hotkeys for multiselecting + + -- Determine multiselection hotkeys + local Hotkeys = Support.FlipTable { 'LeftShift', 'RightShift', 'LeftControl', 'RightControl' }; + + -- Get core API + local Core = GetCore(); + + -- Listen for matching key presses + Core.Connections.MultiselectionHotkeys = Support.AddUserInputListener('Began', 'Keyboard', false, function (Input) + if Hotkeys[Input.KeyCode.Name] then + Selection.Multiselecting = true; + end; + end); + + -- Listen for matching key releases + Core.Connections.MultiselectingReleaseHotkeys = Support.AddUserInputListener('Ended', 'Keyboard', true, function (Input) + + -- Get currently pressed keys + local PressedKeys = Support.GetListMembers(Support.GetListMembers(Game:GetService('UserInputService'):GetKeysPressed(), 'KeyCode'), 'Name'); + + -- Continue multiselection if a hotkey is still pressed + for _, PressedKey in pairs(PressedKeys) do + if Hotkeys[PressedKey] then + return; + end; + end; + + -- Disable multiselection if matching key not found + Selection.Multiselecting = false; + + end); + +end; + function Selection.HideOutlines() -- Hides selection outlines @@ -16124,7 +16444,7 @@ end; return Selection;]]> - + SnappingModule @@ -16343,6 +16663,17 @@ end; function SnapTracking.StopTracking() -- Stops tracking the current closest snapping point, cleans up + -- Clear the previous tracking target, and callback + SnapTracking.Target = nil; + SnapTracking.Callback = nil; + + -- Reset snapping point options + SnapTracking.TrackFaceCentroids = true; + SnapTracking.TrackEdgeMidpoints = true; + SnapTracking.TrackCorners = true; + SnapTracking.TargetFilter = nil; + SnapTracking.TargetBlacklist = {}; + -- Make sure we're currently tracking if not SnapTracking.Enabled then return; @@ -16355,18 +16686,6 @@ function SnapTracking.StopTracking() -- Clear the point marker UI from the screen SnapTracking.ClearUI(); - -- Clear the previous tracking target, and callback - SnapTracking.Target = nil; - SnapTracking.Callback = nil; - - -- Reset snapping point options - SnapTracking.TrackFaceCentroids = true; - SnapTracking.TrackEdgeMidpoints = true; - SnapTracking.TrackCorners = true; - - SnapTracking.TargetFilter = nil; - SnapTracking.TargetBlacklist = {}; - -- Indicate that tracking is no longer enabled SnapTracking.Enabled = false; @@ -16375,12 +16694,12 @@ end; return SnapTracking;]]> - + FilterMode false - + false @@ -16390,7 +16709,7 @@ return SnapTracking;]]> - + BoundingBoxModule @@ -16761,7 +17080,7 @@ end; return BoundingBoxModule;]]> - + TargetingModule @@ -16834,9 +17153,6 @@ end; function TargetingModule.SelectTarget() - -- Check if shift is held - local ShiftHeld = Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift); - -- Ensure target selection isn't cancelled if SelectionCancelled then SelectionCancelled = false; @@ -16844,7 +17160,7 @@ function TargetingModule.SelectTarget() end; -- Focus on clicked, selected item - if not ShiftHeld and Selection.Find(Target) then + if not Selection.Multiselecting and Selection.Find(Target) then Selection.SetFocus(Target); return; end; @@ -16855,17 +17171,17 @@ function TargetingModule.SelectTarget() return; end; - -- Unselect clicked, selected item if shift is held - if ShiftHeld and Selection.Find(Target) then + -- Unselect clicked, selected item if multiselection is enabled + if Selection.Multiselecting and Selection.Find(Target) then Selection.Remove({ Target }, true); return; end; - -- Add to selection if shift is held - if ShiftHeld then + -- Add to selection if multiselecting + if Selection.Multiselecting then Selection.Add({ Target }, true); - -- Replace selection if shift is not held + -- Replace selection if not multiselecting else Selection.Replace({ Target }, true); end; @@ -16999,11 +17315,11 @@ function TargetingModule.FinishRectangleSelecting() end; end; - -- Add to selection if shift is held - if Support.AreKeysPressed(Enum.KeyCode.LeftShift) or Support.AreKeysPressed(Enum.KeyCode.RightShift) then + -- Add to selection if multiselecting + if Selection.Multiselecting then Selection.Add(SelectableItems, true); - -- Replace selection if shift is not held + -- Replace selection if not multiselecting else Selection.Replace(SelectableItems, true); end; @@ -17030,11 +17346,11 @@ end; return TargetingModule;]]> - + Interfaces - + true @@ -17073,7 +17389,7 @@ return TargetingModule;]]> true 1 - + false @@ -17112,7 +17428,7 @@ return TargetingModule;]]> true 1 - + false @@ -17152,7 +17468,7 @@ return TargetingModule;]]> 1 - + false @@ -17203,7 +17519,7 @@ return TargetingModule;]]> 1 - + false @@ -17255,7 +17571,7 @@ return TargetingModule;]]> - + false @@ -17294,7 +17610,7 @@ return TargetingModule;]]> true 1 - + false @@ -17345,7 +17661,7 @@ return TargetingModule;]]> 1 - + false @@ -17384,7 +17700,7 @@ return TargetingModule;]]> true 1 - + false @@ -17424,7 +17740,7 @@ return TargetingModule;]]> 1 - + true @@ -17479,7 +17795,7 @@ return TargetingModule;]]> 2 - + false @@ -17540,7 +17856,7 @@ return TargetingModule;]]> 1 - + false @@ -17592,7 +17908,7 @@ return TargetingModule;]]> - + false @@ -17631,7 +17947,7 @@ return TargetingModule;]]> true 1 - + false @@ -17671,7 +17987,7 @@ return TargetingModule;]]> 1 - + true @@ -17726,7 +18042,7 @@ return TargetingModule;]]> 2 - + false @@ -17787,7 +18103,7 @@ return TargetingModule;]]> 1 - + false @@ -17840,7 +18156,7 @@ return TargetingModule;]]> - + false @@ -17879,7 +18195,7 @@ return TargetingModule;]]> true 1 - + false @@ -17919,7 +18235,7 @@ return TargetingModule;]]> 1 - + false @@ -17972,7 +18288,7 @@ return TargetingModule;]]> - + true @@ -18011,7 +18327,7 @@ return TargetingModule;]]> true 1 - + false @@ -18050,7 +18366,7 @@ return TargetingModule;]]> true 1 - + false @@ -18090,7 +18406,7 @@ return TargetingModule;]]> 1 - + false @@ -18141,7 +18457,7 @@ return TargetingModule;]]> 1 - + false @@ -18193,7 +18509,7 @@ return TargetingModule;]]> - + false @@ -18232,7 +18548,7 @@ return TargetingModule;]]> true 1 - + false @@ -18283,7 +18599,7 @@ return TargetingModule;]]> 1 - + false @@ -18322,7 +18638,7 @@ return TargetingModule;]]> true 1 - + false @@ -18362,7 +18678,7 @@ return TargetingModule;]]> 1 - + true @@ -18417,7 +18733,7 @@ return TargetingModule;]]> 2 - + false @@ -18478,7 +18794,7 @@ return TargetingModule;]]> 1 - + false @@ -18530,7 +18846,7 @@ return TargetingModule;]]> - + false @@ -18569,7 +18885,7 @@ return TargetingModule;]]> true 1 - + false @@ -18609,7 +18925,7 @@ return TargetingModule;]]> 1 - + true @@ -18664,7 +18980,7 @@ return TargetingModule;]]> 2 - + false @@ -18725,7 +19041,7 @@ return TargetingModule;]]> 1 - + false @@ -18778,7 +19094,7 @@ return TargetingModule;]]> - + false @@ -18817,7 +19133,7 @@ return TargetingModule;]]> true 1 - + false @@ -18857,7 +19173,7 @@ return TargetingModule;]]> 1 - + false @@ -18910,7 +19226,7 @@ return TargetingModule;]]> - + true @@ -18949,7 +19265,7 @@ return TargetingModule;]]> true 1 - + false @@ -18989,7 +19305,7 @@ return TargetingModule;]]> 1 - + false @@ -19028,7 +19344,7 @@ return TargetingModule;]]> true 1 - + false @@ -19068,7 +19384,7 @@ return TargetingModule;]]> 1 - + false @@ -19119,7 +19435,7 @@ return TargetingModule;]]> 1 - + false @@ -19171,7 +19487,7 @@ return TargetingModule;]]> - + false @@ -19210,7 +19526,7 @@ return TargetingModule;]]> true 1 - + false @@ -19261,7 +19577,7 @@ return TargetingModule;]]> 1 - + true @@ -19326,7 +19642,7 @@ return TargetingModule;]]> 1 - + false @@ -19366,7 +19682,7 @@ return TargetingModule;]]> 1 - + true @@ -19421,7 +19737,7 @@ return TargetingModule;]]> 1 - + true @@ -19476,7 +19792,7 @@ return TargetingModule;]]> 1 - + false @@ -19516,7 +19832,7 @@ return TargetingModule;]]> 1 - + false @@ -19555,7 +19871,7 @@ return TargetingModule;]]> true 1 - + false @@ -19594,7 +19910,7 @@ return TargetingModule;]]> true 1 - + false @@ -19645,7 +19961,7 @@ return TargetingModule;]]> 1 - + false @@ -19684,7 +20000,7 @@ return TargetingModule;]]> true 1 - + false @@ -19745,7 +20061,7 @@ return TargetingModule;]]> 1 - + false @@ -19785,7 +20101,7 @@ return TargetingModule;]]> 1 - + true @@ -19841,7 +20157,7 @@ return TargetingModule;]]> - + false @@ -19880,7 +20196,7 @@ return TargetingModule;]]> true 1 - + false @@ -19931,7 +20247,7 @@ return TargetingModule;]]> 1 - + false @@ -19970,7 +20286,7 @@ return TargetingModule;]]> true 1 - + false @@ -20031,7 +20347,7 @@ return TargetingModule;]]> 1 - + false @@ -20071,7 +20387,7 @@ return TargetingModule;]]> 1 - + true @@ -20127,7 +20443,7 @@ return TargetingModule;]]> - + false @@ -20166,7 +20482,7 @@ return TargetingModule;]]> true 1 - + false @@ -20217,7 +20533,7 @@ return TargetingModule;]]> 1 - + false @@ -20256,7 +20572,7 @@ return TargetingModule;]]> true 1 - + false @@ -20317,7 +20633,7 @@ return TargetingModule;]]> 1 - + false @@ -20357,7 +20673,7 @@ return TargetingModule;]]> 1 - + true @@ -20413,7 +20729,7 @@ return TargetingModule;]]> - + false @@ -20452,7 +20768,7 @@ return TargetingModule;]]> true 1 - + true @@ -20516,7 +20832,7 @@ return TargetingModule;]]> true 1 - + false @@ -20557,7 +20873,7 @@ return TargetingModule;]]> - + false @@ -20608,7 +20924,7 @@ return TargetingModule;]]> 1 - + false @@ -20647,7 +20963,7 @@ return TargetingModule;]]> true 1 - + false @@ -20687,7 +21003,7 @@ return TargetingModule;]]> 1 - + false @@ -20742,7 +21058,7 @@ return TargetingModule;]]> - + false @@ -20793,7 +21109,7 @@ return TargetingModule;]]> 1 - + false @@ -20832,7 +21148,7 @@ return TargetingModule;]]> true 1 - + false @@ -20883,7 +21199,7 @@ return TargetingModule;]]> 1 - + true @@ -20948,7 +21264,7 @@ return TargetingModule;]]> 1 - + false @@ -20988,7 +21304,7 @@ return TargetingModule;]]> 1 - + true @@ -21043,7 +21359,7 @@ return TargetingModule;]]> 1 - + true @@ -21098,7 +21414,7 @@ return TargetingModule;]]> 1 - + false @@ -21138,7 +21454,7 @@ return TargetingModule;]]> 1 - + false @@ -21177,7 +21493,7 @@ return TargetingModule;]]> true 1 - + false @@ -21216,7 +21532,7 @@ return TargetingModule;]]> true 1 - + false @@ -21267,7 +21583,7 @@ return TargetingModule;]]> 1 - + false @@ -21306,7 +21622,7 @@ return TargetingModule;]]> true 1 - + false @@ -21367,7 +21683,7 @@ return TargetingModule;]]> 1 - + false @@ -21407,7 +21723,7 @@ return TargetingModule;]]> 1 - + true @@ -21463,7 +21779,7 @@ return TargetingModule;]]> - + false @@ -21502,7 +21818,7 @@ return TargetingModule;]]> true 1 - + false @@ -21553,7 +21869,7 @@ return TargetingModule;]]> 1 - + false @@ -21592,7 +21908,7 @@ return TargetingModule;]]> true 1 - + false @@ -21653,7 +21969,7 @@ return TargetingModule;]]> 1 - + false @@ -21693,7 +22009,7 @@ return TargetingModule;]]> 1 - + true @@ -21749,7 +22065,7 @@ return TargetingModule;]]> - + false @@ -21788,7 +22104,7 @@ return TargetingModule;]]> true 1 - + true @@ -21852,7 +22168,7 @@ return TargetingModule;]]> true 1 - + false @@ -21893,7 +22209,7 @@ return TargetingModule;]]> - + false @@ -21944,7 +22260,7 @@ return TargetingModule;]]> 1 - + false @@ -21983,7 +22299,7 @@ return TargetingModule;]]> true 1 - + false @@ -22023,7 +22339,7 @@ return TargetingModule;]]> 1 - + false @@ -22076,7 +22392,7 @@ return TargetingModule;]]> - + false @@ -22115,7 +22431,7 @@ return TargetingModule;]]> true 1 - + true @@ -22179,7 +22495,7 @@ return TargetingModule;]]> true 1 - + false @@ -22220,7 +22536,7 @@ return TargetingModule;]]> - + false @@ -22271,7 +22587,7 @@ return TargetingModule;]]> 1 - + false @@ -22310,7 +22626,7 @@ return TargetingModule;]]> true 1 - + false @@ -22350,7 +22666,7 @@ return TargetingModule;]]> 1 - + false @@ -22405,7 +22721,7 @@ return TargetingModule;]]> - + false @@ -22444,7 +22760,7 @@ return TargetingModule;]]> true 1 - + false @@ -22495,7 +22811,7 @@ return TargetingModule;]]> 1 - + true @@ -22560,7 +22876,7 @@ return TargetingModule;]]> 1 - + false @@ -22600,7 +22916,7 @@ return TargetingModule;]]> 1 - + true @@ -22655,7 +22971,7 @@ return TargetingModule;]]> 2 - + true @@ -22710,7 +23026,7 @@ return TargetingModule;]]> 2 - + false @@ -22750,7 +23066,7 @@ return TargetingModule;]]> 1 - + false @@ -22789,7 +23105,7 @@ return TargetingModule;]]> true 1 - + false @@ -22828,7 +23144,7 @@ return TargetingModule;]]> true 1 - + true @@ -22892,7 +23208,7 @@ return TargetingModule;]]> true 1 - + false @@ -22933,7 +23249,7 @@ return TargetingModule;]]> - + false @@ -22984,7 +23300,7 @@ return TargetingModule;]]> 1 - + false @@ -23023,7 +23339,7 @@ return TargetingModule;]]> true 1 - + false @@ -23063,7 +23379,7 @@ return TargetingModule;]]> 1 - + false @@ -23119,7 +23435,7 @@ return TargetingModule;]]> - + true @@ -23158,7 +23474,7 @@ return TargetingModule;]]> true 1 - + false @@ -23197,7 +23513,7 @@ return TargetingModule;]]> false 1 - + false @@ -23236,7 +23552,7 @@ return TargetingModule;]]> true 1 - + true @@ -23300,7 +23616,7 @@ return TargetingModule;]]> true 1 - + false @@ -23339,7 +23655,7 @@ return TargetingModule;]]> false 2 - + false @@ -23379,7 +23695,7 @@ return TargetingModule;]]> 2 - + false @@ -23432,7 +23748,7 @@ return TargetingModule;]]> - + true @@ -23496,7 +23812,7 @@ return TargetingModule;]]> true 1 - + false @@ -23535,7 +23851,7 @@ return TargetingModule;]]> false 2 - + false @@ -23575,7 +23891,7 @@ return TargetingModule;]]> 2 - + false @@ -23628,7 +23944,7 @@ return TargetingModule;]]> - + true @@ -23692,7 +24008,7 @@ return TargetingModule;]]> true 1 - + false @@ -23731,7 +24047,7 @@ return TargetingModule;]]> false 3 - + false @@ -23771,7 +24087,7 @@ return TargetingModule;]]> 3 - + false @@ -23824,7 +24140,7 @@ return TargetingModule;]]> - + false @@ -23863,7 +24179,7 @@ return TargetingModule;]]> true 1 - + false @@ -23902,7 +24218,7 @@ return TargetingModule;]]> false 2 - + false @@ -23942,7 +24258,7 @@ return TargetingModule;]]> 2 - + false @@ -23995,7 +24311,7 @@ return TargetingModule;]]> - + true @@ -24050,7 +24366,7 @@ return TargetingModule;]]> 2 - + true @@ -24106,7 +24422,7 @@ return TargetingModule;]]> - + false @@ -24160,7 +24476,7 @@ return TargetingModule;]]> 1 - + false @@ -24211,7 +24527,7 @@ return TargetingModule;]]> 1 - + false @@ -24250,7 +24566,7 @@ return TargetingModule;]]> true 1 - + true @@ -24305,7 +24621,7 @@ return TargetingModule;]]> 1 - + false @@ -24345,7 +24661,7 @@ return TargetingModule;]]> 1 - + false @@ -24398,7 +24714,7 @@ return TargetingModule;]]> - + true @@ -24437,7 +24753,7 @@ return TargetingModule;]]> true 1 - + true @@ -24501,7 +24817,7 @@ return TargetingModule;]]> true 1 - + false @@ -24563,7 +24879,7 @@ return TargetingModule;]]> - + true @@ -24627,7 +24943,7 @@ return TargetingModule;]]> true 2 - + false @@ -24667,7 +24983,7 @@ return TargetingModule;]]> 1 - + false @@ -24729,7 +25045,7 @@ return TargetingModule;]]> - + false @@ -24768,7 +25084,7 @@ return TargetingModule;]]> true 1 - + false @@ -24819,7 +25135,7 @@ return TargetingModule;]]> 1 - + false @@ -24858,7 +25174,7 @@ return TargetingModule;]]> true 1 - + false @@ -24899,7 +25215,7 @@ return TargetingModule;]]> - + true @@ -24952,7 +25268,7 @@ return TargetingModule;]]> true 2 - + false @@ -25015,7 +25331,7 @@ return TargetingModule;]]> - + false @@ -25054,7 +25370,7 @@ return TargetingModule;]]> true 1 - + false @@ -25105,7 +25421,7 @@ return TargetingModule;]]> 1 - + false @@ -25144,7 +25460,7 @@ return TargetingModule;]]> true 1 - + false @@ -25185,7 +25501,7 @@ return TargetingModule;]]> - + true @@ -25238,7 +25554,7 @@ return TargetingModule;]]> true 2 - + false @@ -25301,7 +25617,7 @@ return TargetingModule;]]> - + false @@ -25340,7 +25656,7 @@ return TargetingModule;]]> true 1 - + false @@ -25391,7 +25707,7 @@ return TargetingModule;]]> 1 - + false @@ -25430,7 +25746,7 @@ return TargetingModule;]]> true 1 - + false @@ -25471,7 +25787,7 @@ return TargetingModule;]]> - + true @@ -25524,7 +25840,7 @@ return TargetingModule;]]> true 2 - + false @@ -25587,7 +25903,7 @@ return TargetingModule;]]> - + false @@ -25626,7 +25942,7 @@ return TargetingModule;]]> true 1 - + false @@ -25667,7 +25983,7 @@ return TargetingModule;]]> - + true @@ -25721,7 +26037,7 @@ return TargetingModule;]]> true 2 - + false @@ -25762,7 +26078,7 @@ return TargetingModule;]]> - + true @@ -25816,7 +26132,7 @@ return TargetingModule;]]> true 2 - + false @@ -25857,7 +26173,7 @@ return TargetingModule;]]> - + false @@ -25986,7 +26302,7 @@ return Component;]]> - + true @@ -26025,7 +26341,7 @@ return Component;]]> true 1 - + false @@ -26064,7 +26380,7 @@ return Component;]]> true 1 - + false @@ -26104,7 +26420,7 @@ return Component;]]> 1 - + true @@ -26159,7 +26475,7 @@ return Component;]]> 1 - + true @@ -26214,7 +26530,7 @@ return Component;]]> 1 - + false @@ -26254,7 +26570,7 @@ return Component;]]> 1 - + true @@ -26319,7 +26635,7 @@ return Component;]]> 1 - + false @@ -26370,7 +26686,7 @@ return Component;]]> 1 - + false @@ -26409,7 +26725,7 @@ return Component;]]> true 1 - + false @@ -26448,7 +26764,7 @@ return Component;]]> true 1 - + false @@ -26499,7 +26815,7 @@ return Component;]]> 1 - + true @@ -26565,7 +26881,7 @@ return Component;]]> - + false @@ -26604,7 +26920,7 @@ return Component;]]> true 1 - + false @@ -26643,7 +26959,7 @@ return Component;]]> true 1 - + true @@ -26697,7 +27013,7 @@ return Component;]]> 2 - + false @@ -26758,7 +27074,7 @@ return Component;]]> 1 - + false @@ -26799,7 +27115,7 @@ return Component;]]> - + false @@ -26851,7 +27167,7 @@ return Component;]]> - + false @@ -26890,7 +27206,7 @@ return Component;]]> true 1 - + false @@ -26929,7 +27245,7 @@ return Component;]]> true 1 - + true @@ -26983,7 +27299,7 @@ return Component;]]> 2 - + false @@ -27044,7 +27360,7 @@ return Component;]]> 1 - + false @@ -27085,7 +27401,7 @@ return Component;]]> - + false @@ -27137,7 +27453,7 @@ return Component;]]> - + false @@ -27176,7 +27492,7 @@ return Component;]]> true 1 - + true @@ -27240,7 +27556,7 @@ return Component;]]> true 1 - + false @@ -27281,7 +27597,7 @@ return Component;]]> - + false @@ -27332,7 +27648,7 @@ return Component;]]> 1 - + false @@ -27371,7 +27687,7 @@ return Component;]]> true 1 - + false @@ -27411,7 +27727,7 @@ return Component;]]> 1 - + false @@ -27466,7 +27782,7 @@ return Component;]]> - + false @@ -27517,7 +27833,7 @@ return Component;]]> 1 - + false @@ -27556,7 +27872,7 @@ return Component;]]> true 1 - + false @@ -27595,7 +27911,7 @@ return Component;]]> true 1 - + false @@ -27634,7 +27950,7 @@ return Component;]]> true 1 - + false @@ -27685,7 +28001,7 @@ return Component;]]> 1 - + true @@ -27751,7 +28067,7 @@ return Component;]]> - + false @@ -27790,7 +28106,7 @@ return Component;]]> true 1 - + false @@ -27841,7 +28157,7 @@ return Component;]]> 1 - + true @@ -27895,7 +28211,7 @@ return Component;]]> true 1 - + false @@ -27956,7 +28272,7 @@ return Component;]]> 3 - + true @@ -28010,7 +28326,7 @@ return Component;]]> false 4 - + false @@ -28062,12 +28378,12 @@ return Component;]]> - + Options - + false @@ -28107,7 +28423,7 @@ return Component;]]> 1 - + false @@ -28158,7 +28474,7 @@ return Component;]]> 3 - + false @@ -28245,7 +28561,7 @@ return Component;]]> - + false @@ -28284,7 +28600,7 @@ return Component;]]> true 1 - + false @@ -28323,7 +28639,7 @@ return Component;]]> true 1 - + true @@ -28377,7 +28693,7 @@ return Component;]]> 2 - + false @@ -28438,7 +28754,7 @@ return Component;]]> 1 - + false @@ -28479,7 +28795,7 @@ return Component;]]> - + false @@ -28531,7 +28847,7 @@ return Component;]]> - + false @@ -28570,7 +28886,7 @@ return Component;]]> true 1 - + false @@ -28609,7 +28925,7 @@ return Component;]]> true 1 - + true @@ -28663,7 +28979,7 @@ return Component;]]> 2 - + false @@ -28703,7 +29019,7 @@ return Component;]]> 1 - + false @@ -28765,7 +29081,7 @@ return Component;]]> - + false @@ -28817,7 +29133,7 @@ return Component;]]> - + false @@ -28856,7 +29172,7 @@ return Component;]]> true 1 - + false @@ -28895,7 +29211,7 @@ return Component;]]> true 1 - + true @@ -28949,7 +29265,7 @@ return Component;]]> 2 - + false @@ -29010,7 +29326,7 @@ return Component;]]> 1 - + false @@ -29051,7 +29367,7 @@ return Component;]]> - + false @@ -29103,7 +29419,7 @@ return Component;]]> - + false @@ -29142,7 +29458,7 @@ return Component;]]> true 1 - + true @@ -29206,7 +29522,7 @@ return Component;]]> true 1 - + false @@ -29247,7 +29563,7 @@ return Component;]]> - + false @@ -29298,7 +29614,7 @@ return Component;]]> 1 - + false @@ -29337,7 +29653,7 @@ return Component;]]> true 1 - + false @@ -29377,7 +29693,7 @@ return Component;]]> 1 - + false @@ -29431,7 +29747,7 @@ return Component;]]> - + false @@ -29471,7 +29787,7 @@ return Component;]]> 1 - + true @@ -29526,7 +29842,7 @@ return Component;]]> 1 - + true @@ -29581,7 +29897,7 @@ return Component;]]> 1 - + false @@ -29621,7 +29937,7 @@ return Component;]]> 1 - + true @@ -29686,7 +30002,7 @@ return Component;]]> 1 - + false @@ -29738,7 +30054,7 @@ return Component;]]> - + false @@ -29777,7 +30093,7 @@ return Component;]]> true 1 - + false @@ -29828,7 +30144,7 @@ return Component;]]> 1 - + false @@ -29879,7 +30195,7 @@ return Component;]]> 1 - + false @@ -29920,7 +30236,7 @@ return Component;]]> - + false @@ -29960,7 +30276,7 @@ return Component;]]> 1 - + false @@ -29999,7 +30315,7 @@ return Component;]]> true 1 - + false @@ -30039,7 +30355,7 @@ return Component;]]> 1 - + true @@ -30094,7 +30410,7 @@ return Component;]]> 1 - + true @@ -30149,7 +30465,7 @@ return Component;]]> 1 - + false @@ -30189,7 +30505,7 @@ return Component;]]> 1 - + true @@ -30254,7 +30570,7 @@ return Component;]]> 1 - + false @@ -30305,7 +30621,7 @@ return Component;]]> 1 - + false @@ -30344,7 +30660,7 @@ return Component;]]> true 1 - + false @@ -30383,7 +30699,7 @@ return Component;]]> true 1 - + false @@ -30434,7 +30750,7 @@ return Component;]]> 1 - + true @@ -30500,7 +30816,7 @@ return Component;]]> - + false @@ -30539,7 +30855,7 @@ return Component;]]> true 1 - + false @@ -30590,7 +30906,7 @@ return Component;]]> 1 - + true @@ -30644,7 +30960,7 @@ return Component;]]> true 1 - + false @@ -30705,7 +31021,7 @@ return Component;]]> 3 - + true @@ -30759,7 +31075,7 @@ return Component;]]> false 4 - + false @@ -30811,12 +31127,12 @@ return Component;]]> - + Options - + false @@ -30856,7 +31172,7 @@ return Component;]]> 1 - + false @@ -30907,7 +31223,7 @@ return Component;]]> 3 - + false @@ -30994,7 +31310,7 @@ return Component;]]> - + false @@ -31033,7 +31349,7 @@ return Component;]]> true 1 - + false @@ -31072,7 +31388,7 @@ return Component;]]> true 1 - + true @@ -31126,7 +31442,7 @@ return Component;]]> 2 - + false @@ -31187,7 +31503,7 @@ return Component;]]> 1 - + false @@ -31228,7 +31544,7 @@ return Component;]]> - + false @@ -31280,7 +31596,7 @@ return Component;]]> - + false @@ -31319,7 +31635,7 @@ return Component;]]> true 1 - + false @@ -31358,7 +31674,7 @@ return Component;]]> true 1 - + true @@ -31412,7 +31728,7 @@ return Component;]]> 2 - + false @@ -31452,7 +31768,7 @@ return Component;]]> 1 - + false @@ -31514,7 +31830,7 @@ return Component;]]> - + false @@ -31566,7 +31882,7 @@ return Component;]]> - + false @@ -31605,7 +31921,7 @@ return Component;]]> true 1 - + false @@ -31644,7 +31960,7 @@ return Component;]]> true 1 - + true @@ -31698,7 +32014,7 @@ return Component;]]> 2 - + false @@ -31759,7 +32075,7 @@ return Component;]]> 1 - + false @@ -31800,7 +32116,7 @@ return Component;]]> - + false @@ -31852,7 +32168,7 @@ return Component;]]> - + false @@ -31891,7 +32207,7 @@ return Component;]]> true 1 - + true @@ -31955,7 +32271,7 @@ return Component;]]> true 1 - + false @@ -31996,7 +32312,7 @@ return Component;]]> - + false @@ -32047,7 +32363,7 @@ return Component;]]> 1 - + false @@ -32086,7 +32402,7 @@ return Component;]]> true 1 - + false @@ -32126,7 +32442,7 @@ return Component;]]> 1 - + false @@ -32182,7 +32498,7 @@ return Component;]]> - + true @@ -32221,7 +32537,7 @@ return Component;]]> true 1 - + false @@ -32260,7 +32576,7 @@ return Component;]]> true 1 - + false @@ -32300,7 +32616,7 @@ return Component;]]> 1 - + false @@ -32351,7 +32667,7 @@ return Component;]]> 1 - + false @@ -32403,7 +32719,7 @@ return Component;]]> - + false @@ -32442,7 +32758,7 @@ return Component;]]> true 1 - + false @@ -32493,7 +32809,7 @@ return Component;]]> 1 - + true @@ -32547,7 +32863,7 @@ return Component;]]> true 1 - + false @@ -32608,7 +32924,7 @@ return Component;]]> 3 - + true @@ -32662,7 +32978,7 @@ return Component;]]> false 4 - + false @@ -32714,12 +33030,12 @@ return Component;]]> - + Options - + false @@ -32759,7 +33075,7 @@ return Component;]]> 1 - + false @@ -32810,7 +33126,7 @@ return Component;]]> 3 - + false @@ -32897,7 +33213,7 @@ return Component;]]> - + false @@ -32936,7 +33252,7 @@ return Component;]]> true 1 - + false @@ -32987,7 +33303,7 @@ return Component;]]> 1 - + false @@ -33026,7 +33342,7 @@ return Component;]]> true 1 - + false @@ -33087,7 +33403,7 @@ return Component;]]> 1 - + false @@ -33127,7 +33443,7 @@ return Component;]]> 1 - + true @@ -33183,7 +33499,7 @@ return Component;]]> - + false @@ -33222,7 +33538,7 @@ return Component;]]> true 1 - + false @@ -33273,7 +33589,7 @@ return Component;]]> 1 - + false @@ -33312,7 +33628,7 @@ return Component;]]> true 1 - + false @@ -33352,7 +33668,7 @@ return Component;]]> 1 - + false @@ -33413,7 +33729,7 @@ return Component;]]> 1 - + true @@ -33469,7 +33785,7 @@ return Component;]]> - + false @@ -33508,7 +33824,7 @@ return Component;]]> true 1 - + false @@ -33549,7 +33865,7 @@ return Component;]]> - + false @@ -33601,7 +33917,7 @@ return Component;]]> - + true @@ -33640,7 +33956,7 @@ return Component;]]> true 1 - + false @@ -33679,7 +33995,7 @@ return Component;]]> true 1 - + false @@ -33719,7 +34035,7 @@ return Component;]]> 1 - + false @@ -33770,7 +34086,7 @@ return Component;]]> 1 - + false @@ -33822,7 +34138,7 @@ return Component;]]> - + false @@ -33861,7 +34177,7 @@ return Component;]]> false 1 - + false @@ -33912,7 +34228,7 @@ return Component;]]> 1 - + true @@ -33966,7 +34282,7 @@ return Component;]]> true 1 - + false @@ -34027,7 +34343,7 @@ return Component;]]> 3 - + true @@ -34081,7 +34397,7 @@ return Component;]]> false 4 - + false @@ -34133,12 +34449,12 @@ return Component;]]> - + Options - + false @@ -34178,7 +34494,7 @@ return Component;]]> 1 - + false @@ -34229,7 +34545,7 @@ return Component;]]> 3 - + false @@ -34316,7 +34632,7 @@ return Component;]]> - + false @@ -34355,7 +34671,7 @@ return Component;]]> false 1 - + false @@ -34406,7 +34722,7 @@ return Component;]]> 1 - + false @@ -34445,7 +34761,7 @@ return Component;]]> true 1 - + false @@ -34506,7 +34822,7 @@ return Component;]]> 1 - + false @@ -34546,7 +34862,7 @@ return Component;]]> 1 - + true @@ -34601,7 +34917,7 @@ return Component;]]> - + false @@ -34640,7 +34956,7 @@ return Component;]]> true 1 - + false @@ -34701,7 +35017,7 @@ return Component;]]> 1 - + false @@ -34741,7 +35057,7 @@ return Component;]]> 1 - + true @@ -34796,7 +35112,7 @@ return Component;]]> - + false @@ -34835,7 +35151,7 @@ return Component;]]> true 1 - + false @@ -34896,7 +35212,7 @@ return Component;]]> 1 - + false @@ -34936,7 +35252,7 @@ return Component;]]> 1 - + true @@ -34992,7 +35308,7 @@ return Component;]]> - + false @@ -35031,7 +35347,7 @@ return Component;]]> false 1 - + true @@ -35086,7 +35402,7 @@ return Component;]]> 1 - + false @@ -35127,7 +35443,7 @@ return Component;]]> - + false @@ -35166,7 +35482,7 @@ return Component;]]> false 1 - + false @@ -35217,7 +35533,7 @@ return Component;]]> 1 - + true @@ -35271,7 +35587,7 @@ return Component;]]> 1 - + false @@ -35310,7 +35626,7 @@ return Component;]]> true 1 - + false @@ -35350,7 +35666,7 @@ return Component;]]> 1 - + false @@ -35390,7 +35706,7 @@ return Component;]]> 1 - + false @@ -35431,7 +35747,7 @@ return Component;]]> - + false @@ -35472,7 +35788,7 @@ return Component;]]> - + false @@ -35512,7 +35828,7 @@ return Component;]]> 1 - + false @@ -35551,7 +35867,7 @@ return Component;]]> false 1 - + false @@ -35602,7 +35918,7 @@ return Component;]]> 1 - + true @@ -35656,7 +35972,7 @@ return Component;]]> 1 - + false @@ -35695,7 +36011,7 @@ return Component;]]> true 1 - + false @@ -35735,7 +36051,7 @@ return Component;]]> 1 - + false @@ -35775,7 +36091,7 @@ return Component;]]> 1 - + false @@ -35816,7 +36132,7 @@ return Component;]]> - + false @@ -35857,7 +36173,7 @@ return Component;]]> - + false @@ -35896,7 +36212,7 @@ return Component;]]> false 1 - + true @@ -35951,7 +36267,7 @@ return Component;]]> 1 - + false @@ -35992,7 +36308,7 @@ return Component;]]> - + false @@ -36031,7 +36347,7 @@ return Component;]]> false 1 - + false @@ -36082,7 +36398,7 @@ return Component;]]> 1 - + false @@ -36121,7 +36437,7 @@ return Component;]]> true 1 - + false @@ -36161,7 +36477,7 @@ return Component;]]> 1 - + false @@ -36213,7 +36529,7 @@ return Component;]]> - + true @@ -36277,7 +36593,7 @@ return Component;]]> true 1 - + false @@ -36319,7 +36635,7 @@ return Component;]]> - + false @@ -36370,7 +36686,7 @@ return Component;]]> 1 - + false @@ -36409,7 +36725,7 @@ return Component;]]> false 1 - + false @@ -36460,7 +36776,7 @@ return Component;]]> 1 - + false @@ -36499,7 +36815,7 @@ return Component;]]> true 1 - + false @@ -36560,7 +36876,7 @@ return Component;]]> 1 - + false @@ -36600,7 +36916,7 @@ return Component;]]> 1 - + true @@ -36655,7 +36971,7 @@ return Component;]]> - + false @@ -36694,7 +37010,7 @@ return Component;]]> true 1 - + false @@ -36755,7 +37071,7 @@ return Component;]]> 1 - + false @@ -36795,7 +37111,7 @@ return Component;]]> 1 - + true @@ -36850,7 +37166,7 @@ return Component;]]> - + false @@ -36889,7 +37205,7 @@ return Component;]]> true 1 - + false @@ -36950,7 +37266,7 @@ return Component;]]> 1 - + false @@ -36990,7 +37306,7 @@ return Component;]]> 1 - + true @@ -37047,7 +37363,7 @@ return Component;]]> - + true @@ -37086,7 +37402,7 @@ return Component;]]> true 1 - + false @@ -37125,7 +37441,7 @@ return Component;]]> true 1 - + false @@ -37176,7 +37492,7 @@ return Component;]]> 1 - + false @@ -37217,7 +37533,7 @@ return Component;]]> - + false @@ -37256,7 +37572,7 @@ return Component;]]> false 1 - + false @@ -37295,7 +37611,7 @@ return Component;]]> true 1 - + false @@ -37334,7 +37650,7 @@ return Component;]]> true 1 - + false @@ -37395,7 +37711,7 @@ return Component;]]> 1 - + true @@ -37450,7 +37766,7 @@ return Component;]]> - + false @@ -37489,7 +37805,7 @@ return Component;]]> true 1 - + true @@ -37543,7 +37859,7 @@ return Component;]]> 2 - + false @@ -37605,7 +37921,7 @@ return Component;]]> - + false @@ -37644,7 +37960,7 @@ return Component;]]> true 1 - + true @@ -37698,7 +38014,7 @@ return Component;]]> 2 - + false @@ -37760,7 +38076,7 @@ return Component;]]> - + false @@ -37812,7 +38128,7 @@ return Component;]]> - + false @@ -37863,7 +38179,7 @@ return Component;]]> 1 - + false @@ -37904,7 +38220,7 @@ return Component;]]> - + false @@ -37943,7 +38259,7 @@ return Component;]]> true 1 - + false @@ -37982,7 +38298,7 @@ return Component;]]> true 1 - + false @@ -38034,7 +38350,7 @@ return Component;]]> - + false @@ -38073,7 +38389,7 @@ return Component;]]> true 1 - + false @@ -38134,7 +38450,7 @@ return Component;]]> 1 - + true @@ -38188,7 +38504,7 @@ return Component;]]> 2 - + false @@ -38230,7 +38546,7 @@ return Component;]]> - + false @@ -38269,7 +38585,7 @@ return Component;]]> true 1 - + false @@ -38320,7 +38636,7 @@ return Component;]]> 1 - + false @@ -38371,7 +38687,7 @@ return Component;]]> 1 - + false @@ -38412,7 +38728,7 @@ return Component;]]> - + false @@ -38451,7 +38767,7 @@ return Component;]]> true 1 - + false @@ -38490,7 +38806,7 @@ return Component;]]> true 1 - + false @@ -38542,7 +38858,7 @@ return Component;]]> - + false @@ -38581,7 +38897,7 @@ return Component;]]> true 1 - + false @@ -38632,7 +38948,7 @@ return Component;]]> 2 - + false @@ -38693,7 +39009,7 @@ return Component;]]> 1 - + true @@ -38748,7 +39064,7 @@ return Component;]]> 2 - + false @@ -38789,7 +39105,7 @@ return Component;]]> - + false @@ -38828,7 +39144,7 @@ return Component;]]> true 1 - + false @@ -38879,7 +39195,7 @@ return Component;]]> 2 - + false @@ -38940,7 +39256,7 @@ return Component;]]> 1 - + true @@ -38995,7 +39311,7 @@ return Component;]]> 2 - + false @@ -39036,7 +39352,7 @@ return Component;]]> - + false @@ -39075,7 +39391,7 @@ return Component;]]> true 1 - + false @@ -39126,7 +39442,7 @@ return Component;]]> 2 - + false @@ -39187,7 +39503,7 @@ return Component;]]> 1 - + true @@ -39242,7 +39558,7 @@ return Component;]]> 2 - + false @@ -39285,7 +39601,7 @@ return Component;]]> - + true @@ -39324,7 +39640,7 @@ return Component;]]> true 1 - + false @@ -39363,7 +39679,7 @@ return Component;]]> true 1 - + false @@ -39403,7 +39719,7 @@ return Component;]]> 1 - + false @@ -39454,7 +39770,7 @@ return Component;]]> 1 - + false @@ -39506,7 +39822,7 @@ return Component;]]> - + false @@ -39545,7 +39861,7 @@ return Component;]]> true 1 - + false @@ -39596,7 +39912,7 @@ return Component;]]> 1 - + true @@ -39650,7 +39966,7 @@ return Component;]]> true 1 - + false @@ -39711,7 +40027,7 @@ return Component;]]> 3 - + true @@ -39765,7 +40081,7 @@ return Component;]]> false 4 - + false @@ -39817,12 +40133,12 @@ return Component;]]> - + Options - + false @@ -39862,7 +40178,7 @@ return Component;]]> 1 - + false @@ -39913,7 +40229,7 @@ return Component;]]> 3 - + false @@ -40000,7 +40316,7 @@ return Component;]]> - + false @@ -40039,7 +40355,7 @@ return Component;]]> true 1 - + false @@ -40079,7 +40395,7 @@ return Component;]]> 1 - + false @@ -40132,7 +40448,7 @@ return Component;]]> - + true @@ -40171,7 +40487,7 @@ return Component;]]> true 1 - + false @@ -40210,7 +40526,7 @@ return Component;]]> true 1 - + false @@ -40250,7 +40566,7 @@ return Component;]]> 1 - + false @@ -40301,7 +40617,7 @@ return Component;]]> 1 - + false @@ -40353,7 +40669,7 @@ return Component;]]> - + false @@ -40393,7 +40709,7 @@ return Component;]]> 1 - + true @@ -40447,7 +40763,7 @@ return Component;]]> true 1 - + false @@ -40497,7 +40813,7 @@ return Component;]]> false 1 - + false @@ -40540,7 +40856,7 @@ return Component;]]> - + true @@ -40579,7 +40895,7 @@ return Component;]]> true 1 - + false @@ -40618,7 +40934,7 @@ return Component;]]> true 1 - + false @@ -40657,7 +40973,7 @@ return Component;]]> true 1 - + false @@ -40697,7 +41013,7 @@ return Component;]]> 1 - + true @@ -40752,7 +41068,7 @@ return Component;]]> 2 - + false @@ -40813,7 +41129,7 @@ return Component;]]> 1 - + false @@ -40865,7 +41181,7 @@ return Component;]]> - + false @@ -40904,7 +41220,7 @@ return Component;]]> true 1 - + false @@ -40944,7 +41260,7 @@ return Component;]]> 1 - + true @@ -40999,7 +41315,7 @@ return Component;]]> 2 - + false @@ -41060,7 +41376,7 @@ return Component;]]> 1 - + false @@ -41112,7 +41428,7 @@ return Component;]]> - + false @@ -41151,7 +41467,7 @@ return Component;]]> true 1 - + false @@ -41204,7 +41520,7 @@ return Component;]]> - + false @@ -41243,7 +41559,7 @@ return Component;]]> true 1 - + false @@ -41283,7 +41599,7 @@ return Component;]]> 1 - + false @@ -41334,7 +41650,7 @@ return Component;]]> 1 - + false @@ -41386,7 +41702,7 @@ return Component;]]> - + false @@ -41425,7 +41741,7 @@ return Component;]]> true 1 - + false @@ -41464,7 +41780,7 @@ return Component;]]> true 1 - + false @@ -41504,7 +41820,7 @@ return Component;]]> 1 - + true @@ -41558,7 +41874,7 @@ return Component;]]> 2 - + false @@ -41620,7 +41936,7 @@ return Component;]]> - + false @@ -41659,7 +41975,7 @@ return Component;]]> true 1 - + false @@ -41712,7 +42028,7 @@ return Component;]]> - + false @@ -41751,7 +42067,7 @@ return Component;]]> false 1 - + false @@ -41791,7 +42107,7 @@ return Component;]]> 1 - + false @@ -41842,7 +42158,7 @@ return Component;]]> 1 - + false @@ -41881,7 +42197,7 @@ return Component;]]> true 1 - + false @@ -41932,7 +42248,7 @@ return Component;]]> 1 - + false @@ -41971,7 +42287,7 @@ return Component;]]> true 1 - + true @@ -42025,7 +42341,7 @@ return Component;]]> 2 - + false @@ -42087,7 +42403,7 @@ return Component;]]> - + false @@ -42126,7 +42442,7 @@ return Component;]]> true 1 - + true @@ -42180,7 +42496,7 @@ return Component;]]> 2 - + false @@ -42242,7 +42558,7 @@ return Component;]]> - + false @@ -42281,7 +42597,7 @@ return Component;]]> true 1 - + true @@ -42335,7 +42651,7 @@ return Component;]]> 2 - + false @@ -42399,7 +42715,7 @@ return Component;]]> - + false @@ -42438,7 +42754,7 @@ return Component;]]> true 1 - + false @@ -42478,7 +42794,7 @@ return Component;]]> 1 - + false @@ -42531,7 +42847,7 @@ return Component;]]> - + true @@ -42570,7 +42886,7 @@ return Component;]]> true 1 - + false @@ -42609,7 +42925,7 @@ return Component;]]> true 1 - + false @@ -42648,7 +42964,7 @@ return Component;]]> true 1 - + false @@ -42688,7 +43004,7 @@ return Component;]]> 1 - + true @@ -42743,7 +43059,7 @@ return Component;]]> 2 - + false @@ -42804,7 +43120,7 @@ return Component;]]> 1 - + false @@ -42856,7 +43172,7 @@ return Component;]]> - + false @@ -42895,7 +43211,7 @@ return Component;]]> true 1 - + false @@ -42935,7 +43251,7 @@ return Component;]]> 1 - + true @@ -42990,7 +43306,7 @@ return Component;]]> 2 - + false @@ -43051,7 +43367,7 @@ return Component;]]> 1 - + false @@ -43103,7 +43419,7 @@ return Component;]]> - + false @@ -43142,7 +43458,7 @@ return Component;]]> true 1 - + false @@ -43182,7 +43498,7 @@ return Component;]]> 1 - + true @@ -43237,7 +43553,7 @@ return Component;]]> 2 - + false @@ -43298,7 +43614,7 @@ return Component;]]> 1 - + false @@ -43350,7 +43666,7 @@ return Component;]]> - + false @@ -43389,7 +43705,7 @@ return Component;]]> true 1 - + false @@ -43442,7 +43758,7 @@ return Component;]]> - + false @@ -43481,7 +43797,7 @@ return Component;]]> true 1 - + false @@ -43521,7 +43837,7 @@ return Component;]]> 1 - + false @@ -43572,7 +43888,7 @@ return Component;]]> 1 - + false @@ -43624,7 +43940,7 @@ return Component;]]> - + false @@ -43663,7 +43979,7 @@ return Component;]]> true 1 - + false @@ -43702,7 +44018,7 @@ return Component;]]> true 1 - + false @@ -43742,7 +44058,7 @@ return Component;]]> 1 - + true @@ -43796,7 +44112,7 @@ return Component;]]> 2 - + false @@ -43858,7 +44174,7 @@ return Component;]]> - + false @@ -43897,7 +44213,7 @@ return Component;]]> true 1 - + false @@ -43950,7 +44266,7 @@ return Component;]]> - + false @@ -43989,7 +44305,7 @@ return Component;]]> false 1 - + false @@ -44029,7 +44345,7 @@ return Component;]]> 1 - + false @@ -44080,7 +44396,7 @@ return Component;]]> 1 - + false @@ -44119,7 +44435,7 @@ return Component;]]> true 1 - + false @@ -44170,7 +44486,7 @@ return Component;]]> 1 - + false @@ -44209,7 +44525,7 @@ return Component;]]> true 1 - + true @@ -44263,7 +44579,7 @@ return Component;]]> 2 - + false @@ -44325,7 +44641,7 @@ return Component;]]> - + false @@ -44364,7 +44680,7 @@ return Component;]]> true 1 - + true @@ -44418,7 +44734,7 @@ return Component;]]> 2 - + false @@ -44480,7 +44796,7 @@ return Component;]]> - + false @@ -44519,7 +44835,7 @@ return Component;]]> true 1 - + true @@ -44573,7 +44889,7 @@ return Component;]]> 2 - + false @@ -44637,7 +44953,7 @@ return Component;]]> - + false @@ -44676,7 +44992,7 @@ return Component;]]> true 1 - + false @@ -44716,7 +45032,7 @@ return Component;]]> 1 - + false @@ -44769,7 +45085,7 @@ return Component;]]> - + true @@ -44808,7 +45124,7 @@ return Component;]]> true 1 - + false @@ -44847,7 +45163,7 @@ return Component;]]> true 1 - + false @@ -44887,7 +45203,7 @@ return Component;]]> 1 - + false @@ -44938,7 +45254,7 @@ return Component;]]> 1 - + false @@ -44990,7 +45306,7 @@ return Component;]]> - + false @@ -45029,7 +45345,7 @@ return Component;]]> true 1 - + false @@ -45080,7 +45396,7 @@ return Component;]]> 1 - + true @@ -45134,7 +45450,7 @@ return Component;]]> true 1 - + false @@ -45195,7 +45511,7 @@ return Component;]]> 3 - + true @@ -45249,7 +45565,7 @@ return Component;]]> false 4 - + false @@ -45301,12 +45617,12 @@ return Component;]]> - + Options - + false @@ -45346,7 +45662,7 @@ return Component;]]> 1 - + false @@ -45397,7 +45713,7 @@ return Component;]]> 3 - + false @@ -45484,7 +45800,7 @@ return Component;]]> - + false @@ -45523,7 +45839,7 @@ return Component;]]> true 1 - + false @@ -45574,7 +45890,7 @@ return Component;]]> 1 - + true @@ -45628,7 +45944,7 @@ return Component;]]> true 1 - + false @@ -45689,7 +46005,7 @@ return Component;]]> 3 - + true @@ -45743,7 +46059,7 @@ return Component;]]> false 4 - + false @@ -45795,12 +46111,12 @@ return Component;]]> - + Options - + false @@ -45840,7 +46156,7 @@ return Component;]]> 1 - + false @@ -45891,7 +46207,7 @@ return Component;]]> 3 - + false @@ -45978,7 +46294,7 @@ return Component;]]> - + false @@ -46017,7 +46333,7 @@ return Component;]]> true 1 - + false @@ -46057,7 +46373,7 @@ return Component;]]> 1 - + false @@ -46110,7 +46426,7 @@ return Component;]]> - + true @@ -46149,7 +46465,7 @@ return Component;]]> true 1 - + false @@ -46188,7 +46504,7 @@ return Component;]]> true 1 - + false @@ -46228,7 +46544,7 @@ return Component;]]> 1 - + false @@ -46279,7 +46595,7 @@ return Component;]]> 1 - + false @@ -46331,7 +46647,7 @@ return Component;]]> - + false @@ -46370,7 +46686,7 @@ return Component;]]> true 1 - + false @@ -46421,7 +46737,7 @@ return Component;]]> 1 - + true @@ -46475,7 +46791,7 @@ return Component;]]> true 1 - + false @@ -46536,7 +46852,7 @@ return Component;]]> 3 - + true @@ -46590,7 +46906,7 @@ return Component;]]> false 4 - + false @@ -46642,12 +46958,12 @@ return Component;]]> - + Options - + false @@ -46687,7 +47003,7 @@ return Component;]]> 1 - + false @@ -46738,7 +47054,7 @@ return Component;]]> 3 - + false @@ -46825,7 +47141,7 @@ return Component;]]> - + false @@ -46864,7 +47180,7 @@ return Component;]]> false 1 - + false @@ -46915,7 +47231,7 @@ return Component;]]> 1 - + false @@ -46954,7 +47270,7 @@ return Component;]]> true 1 - + false @@ -47015,7 +47331,7 @@ return Component;]]> 1 - + false @@ -47055,7 +47371,7 @@ return Component;]]> 1 - + true @@ -47110,7 +47426,7 @@ return Component;]]> - + false @@ -47149,7 +47465,7 @@ return Component;]]> true 1 - + false @@ -47210,7 +47526,7 @@ return Component;]]> 1 - + false @@ -47250,7 +47566,7 @@ return Component;]]> 1 - + true @@ -47306,7 +47622,7 @@ return Component;]]> - + false @@ -47346,7 +47662,7 @@ return Component;]]> 1 - + false @@ -47385,7 +47701,7 @@ return Component;]]> true 1 - + false @@ -47436,7 +47752,7 @@ return Component;]]> 1 - + false @@ -47475,7 +47791,7 @@ return Component;]]> true 1 - + false @@ -47536,7 +47852,7 @@ return Component;]]> 1 - + false @@ -47576,7 +47892,7 @@ return Component;]]> 1 - + true @@ -47632,7 +47948,7 @@ return Component;]]> - + false @@ -47671,7 +47987,7 @@ return Component;]]> true 1 - + false @@ -47722,7 +48038,7 @@ return Component;]]> 1 - + false @@ -47761,7 +48077,7 @@ return Component;]]> true 1 - + false @@ -47801,7 +48117,7 @@ return Component;]]> 1 - + true @@ -47856,7 +48172,7 @@ return Component;]]> 2 - + false @@ -47917,7 +48233,7 @@ return Component;]]> 1 - + false @@ -47969,7 +48285,7 @@ return Component;]]> - + false @@ -48008,7 +48324,7 @@ return Component;]]> true 1 - + true @@ -48063,7 +48379,7 @@ return Component;]]> 2 - + false @@ -48124,7 +48440,7 @@ return Component;]]> 1 - + false @@ -48175,7 +48491,7 @@ return Component;]]> 1 - + false @@ -48217,7 +48533,7 @@ return Component;]]> - + false @@ -48256,7 +48572,7 @@ return Component;]]> true 1 - + false @@ -48307,7 +48623,7 @@ return Component;]]> 1 - + false @@ -48346,7 +48662,7 @@ return Component;]]> true 1 - + false @@ -48386,7 +48702,7 @@ return Component;]]> 1 - + false @@ -48426,7 +48742,7 @@ return Component;]]> 1 - + false @@ -48467,7 +48783,7 @@ return Component;]]> - + false @@ -48507,7 +48823,7 @@ return Component;]]> 1 - + true @@ -48562,7 +48878,7 @@ return Component;]]> - + false @@ -48601,7 +48917,7 @@ return Component;]]> false 1 - + true @@ -48656,7 +48972,7 @@ return Component;]]> 1 - + false @@ -48697,7 +49013,7 @@ return Component;]]> - + false @@ -48736,7 +49052,7 @@ return Component;]]> true 1 - + true @@ -48791,7 +49107,7 @@ return Component;]]> 1 - + false @@ -48832,7 +49148,7 @@ return Component;]]> - + false @@ -48884,7 +49200,7 @@ return Component;]]> - + true @@ -48923,7 +49239,7 @@ return Component;]]> true 1 - + false @@ -48962,7 +49278,7 @@ return Component;]]> true 1 - + false @@ -49002,7 +49318,7 @@ return Component;]]> 1 - + false @@ -49053,7 +49369,7 @@ return Component;]]> 1 - + false @@ -49105,7 +49421,7 @@ return Component;]]> - + false @@ -49144,7 +49460,7 @@ return Component;]]> true 1 - + true @@ -49198,7 +49514,7 @@ return Component;]]> true 1 - + false @@ -49239,7 +49555,7 @@ return Component;]]> - + true @@ -49293,7 +49609,7 @@ return Component;]]> true 1 - + false @@ -49335,7 +49651,7 @@ return Component;]]> - + false @@ -49374,7 +49690,7 @@ return Component;]]> true 1 - + false @@ -49414,7 +49730,7 @@ return Component;]]> 1 - + false @@ -49467,127 +49783,7 @@ return Component;]]> - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 0 - PointMarker - null - null - null - null - - 0 - 200 - 0 - 200 - - 0 - false - null - - 0.0125000002 - 0 - 0.0125000002 - 0 - - 1 - 0 - true - 1 - - - - false - - 0 - 0 - - 4294934254 - 0 - 4279970357 - 0 - false - false - 0 - CrossLine - null - null - null - null - - -0.5 - 0 - 0 - 0 - - 45 - false - null - - 1 - 0 - 0.0500000007 - 0 - - 1 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294934254 - 0 - 4279970357 - 0 - false - false - 0 - CrossLine - null - null - null - null - - -0.5 - 0 - 0 - 0 - - -45 - false - null - - 1 - 0 - 0.0500000007 - 0 - - 1 - 0 - true - 1 - - - - + true @@ -49626,7 +49822,7 @@ return Component;]]> false 1 - + false @@ -49665,7 +49861,7 @@ return Component;]]> false 1 - + false @@ -49716,7 +49912,7 @@ return Component;]]> 1 - + false @@ -49767,7 +49963,7 @@ return Component;]]> 1 - + false @@ -49806,7 +50002,7 @@ return Component;]]> true 1 - + false @@ -49846,7 +50042,7 @@ return Component;]]> 1 - + false @@ -49886,7 +50082,7 @@ return Component;]]> 1 - + false @@ -49926,7 +50122,7 @@ return Component;]]> 1 - + false @@ -49966,7 +50162,7 @@ return Component;]]> 1 - + false @@ -50008,7 +50204,7 @@ return Component;]]> - + false @@ -50047,7 +50243,7 @@ return Component;]]> false 1 - + false @@ -50098,7 +50294,7 @@ return Component;]]> 1 - + false @@ -50137,7 +50333,7 @@ return Component;]]> true 1 - + false @@ -50177,7 +50373,7 @@ return Component;]]> 1 - + false @@ -50217,7 +50413,7 @@ return Component;]]> 1 - + false @@ -50257,7 +50453,7 @@ return Component;]]> 1 - + false @@ -50297,7 +50493,7 @@ return Component;]]> 1 - + false @@ -50339,7 +50535,7 @@ return Component;]]> - + false @@ -50378,7 +50574,7 @@ return Component;]]> false 1 - + true @@ -50433,7 +50629,7 @@ return Component;]]> 1 - + false @@ -50474,7 +50670,7 @@ return Component;]]> - + false @@ -50513,7 +50709,7 @@ return Component;]]> true 1 - + false @@ -50552,7 +50748,7 @@ return Component;]]> true 1 - + false @@ -50592,7 +50788,7 @@ return Component;]]> 1 - + false @@ -50632,7 +50828,7 @@ return Component;]]> 1 - + false @@ -50672,7 +50868,7 @@ return Component;]]> 1 - + false @@ -50712,7 +50908,7 @@ return Component;]]> 1 - + false @@ -50753,7 +50949,7 @@ return Component;]]> - + false @@ -50804,7 +51000,7 @@ return Component;]]> 1 - + false @@ -50843,7 +51039,7 @@ return Component;]]> true 1 - + false @@ -50883,7 +51079,7 @@ return Component;]]> 1 - + false @@ -50923,7 +51119,7 @@ return Component;]]> 1 - + false @@ -50963,7 +51159,7 @@ return Component;]]> 1 - + false @@ -51003,7 +51199,7 @@ return Component;]]> 1 - + false @@ -51044,7 +51240,7 @@ return Component;]]> - + true @@ -51098,7 +51294,7 @@ return Component;]]> true 1 - + false @@ -51140,7 +51336,7 @@ return Component;]]> - + false @@ -51218,7 +51414,7 @@ return Component;]]> - + false @@ -51257,7 +51453,7 @@ return Component;]]> false 1 - + false @@ -51296,7 +51492,7 @@ return Component;]]> false 1 - + false @@ -51336,7 +51532,7 @@ return Component;]]> 1 - + true @@ -51391,7 +51587,7 @@ return Component;]]> 1 - + true @@ -51446,7 +51642,7 @@ return Component;]]> 1 - + false @@ -51486,7 +51682,7 @@ return Component;]]> 1 - + false @@ -51525,7 +51721,7 @@ return Component;]]> true 1 - + false @@ -51576,14 +51772,14 @@ return Component;]]> 1 - + NotificationSize 65 - + false @@ -51622,7 +51818,7 @@ return Component;]]> false 1 - + false @@ -51673,13 +51869,13 @@ return Component;]]> 1 - + NotificationSize 80 - + false @@ -51731,7 +51927,7 @@ return Component;]]> - + false @@ -51786,7 +51982,7 @@ return Component;]]> - + false @@ -51825,7 +52021,7 @@ return Component;]]> false 1 - + false @@ -51865,7 +52061,7 @@ return Component;]]> 1 - + true @@ -51920,7 +52116,7 @@ return Component;]]> 1 - + true @@ -51975,7 +52171,7 @@ return Component;]]> 1 - + false @@ -52015,7 +52211,7 @@ return Component;]]> 1 - + false @@ -52054,7 +52250,7 @@ return Component;]]> true 1 - + false @@ -52105,14 +52301,14 @@ return Component;]]> 1 - + NotificationSize 65 - + false @@ -52151,7 +52347,7 @@ return Component;]]> false 1 - + false @@ -52202,14 +52398,14 @@ return Component;]]> 1 - + NotificationSize 80 - + false @@ -52264,7 +52460,7 @@ return Component;]]> - + false @@ -52303,7 +52499,7 @@ return Component;]]> false 1 - + false @@ -52343,7 +52539,7 @@ return Component;]]> 1 - + true @@ -52398,7 +52594,7 @@ return Component;]]> 1 - + true @@ -52453,7 +52649,7 @@ return Component;]]> 1 - + false @@ -52493,7 +52689,7 @@ return Component;]]> 1 - + false @@ -52532,7 +52728,7 @@ return Component;]]> true 1 - + false @@ -52583,14 +52779,14 @@ return Component;]]> 1 - + NotificationSize 80 - + false @@ -52629,7 +52825,7 @@ return Component;]]> false 1 - + false @@ -52680,7 +52876,7 @@ return Component;]]> 1 - + false @@ -52731,14 +52927,14 @@ return Component;]]> 1 - + NotificationSize 110 - + false @@ -52793,7 +52989,7 @@ return Component;]]> - + 1 1 @@ -52806,7 +53002,7 @@ return Component;]]> 0 - + false @@ -52867,7 +53063,487 @@ return Component;]]> - + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + SnapLineSegment + null + null + null + null + + 0 + 300 + 0 + 100 + + 0 + false + null + + 0 + 50 + 0 + 1 + + 0 + 0 + true + 1 + + + + false + + 0.5 + 0.5 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 0 + PointMarkerA + null + null + null + null + + 0 + 0 + 0.5 + 0 + + 0 + false + null + + 0 + 16 + 0 + 16 + + 2 + 0 + true + 3 + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 3 + + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + -45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 3 + + + + + + + false + + 0.5 + 0.5 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 0 + PointMarker + null + null + null + null + + 0 + 200 + 0 + 200 + + 0 + false + null + + 0.0149999997 + 0 + 0.0149999997 + 0 + + 1 + 0 + true + 1 + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 1 + + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + -45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 1 + + + + + + false + + 0.5 + 0 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + SnapLine + null + null + null + null + + 0 + 100 + 0 + 100 + + -45 + false + null + + 3 + 0 + 0 + 1 + + 0 + 0 + true + 1 + + + + false + + 0 + 0.5 + + 4280649727 + 0 + 4279970357 + 0 + false + false + 0 + SnapProgress + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 0 + false + null + + 0 + 100 + 2 + 0 + + 0 + 0 + true + 2 + + + + + false + + 0.5 + 0.5 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 0 + PointMarker + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 0 + false + null + + 0.00499999989 + 0 + 0.00499999989 + 0 + + 1 + 0 + true + 3 + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + 45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 3 + + + + + false + + 0.5 + 0.5 + + 4294934254 + 0 + 4279970357 + 0 + false + false + 0 + CrossLine + null + null + null + null + + 0.5 + 0 + 0.5 + 0 + + -45 + false + null + + 1 + 0 + 0 + 2 + + 0 + 0 + true + 3 + + + + + true @@ -52906,7 +53582,7 @@ return Component;]]> true 1 - + false @@ -52945,7 +53621,7 @@ return Component;]]> true 1 - + false @@ -52996,7 +53672,7 @@ return Component;]]> 1 - + true @@ -53060,7 +53736,7 @@ return Component;]]> true 1 - + false @@ -53110,7 +53786,7 @@ return Component;]]> false 10 - + false @@ -53170,7 +53846,7 @@ return Component.Start();]]> - + false @@ -53211,7 +53887,7 @@ return Component.Start();]]> - + false @@ -53251,7 +53927,7 @@ return Component.Start();]]> 1 - + false @@ -53291,7 +53967,7 @@ return Component.Start();]]> 1 - + false @@ -53330,7 +54006,7 @@ return Component.Start();]]> false 1 - + false @@ -53369,7 +54045,7 @@ return Component.Start();]]> true 1 - + false @@ -53409,7 +54085,7 @@ return Component.Start();]]> 1 - + false @@ -53449,7 +54125,7 @@ return Component.Start();]]> 1 - + false @@ -53489,7 +54165,7 @@ return Component.Start();]]> 1 - + false @@ -53529,7 +54205,7 @@ return Component.Start();]]> 1 - + false @@ -53570,7 +54246,7 @@ return Component.Start();]]> - + false @@ -53623,7 +54299,7 @@ return Component.Start();]]> true 1 - + false @@ -53662,7 +54338,7 @@ return Component.Start();]]> true 1 - + false @@ -53702,7 +54378,7 @@ return Component.Start();]]> 1 - + false @@ -53742,7 +54418,7 @@ return Component.Start();]]> 1 - + false @@ -53782,7 +54458,7 @@ return Component.Start();]]> 1 - + false @@ -53822,7 +54498,7 @@ return Component.Start();]]> 1 - + false @@ -53863,7 +54539,7 @@ return Component.Start();]]> - + false @@ -53902,7 +54578,7 @@ return Component.Start();]]> true 1 - + false @@ -53957,7 +54633,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -54009,7 +54685,7 @@ roblox.com/library/142485815/import]]> - + false @@ -54048,7 +54724,7 @@ roblox.com/library/142485815/import]]> true 1 - + false @@ -54105,7 +54781,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -54157,7 +54833,7 @@ roblox.com/library/142485815/import]]> - + false @@ -54208,7 +54884,7 @@ roblox.com/library/142485815/import]]> 1 - + false @@ -54261,7 +54937,7 @@ roblox.com/library/142485815/import]]> - + false @@ -54311,7 +54987,7 @@ roblox.com/library/142485815/import]]> false 10 - + false @@ -54375,7 +55051,7 @@ return Component;]]> - + true @@ -54440,7 +55116,7 @@ return Component;]]> 1 - + true @@ -54504,7 +55180,7 @@ return Component;]]> false 1 - + false @@ -54556,7 +55232,7 @@ return Component;]]> - + false @@ -54698,7 +55374,7 @@ Component.Ready = true; return Component;]]> - + false @@ -54737,7 +55413,7 @@ return Component;]]> true 1 - + false @@ -54776,7 +55452,7 @@ return Component;]]> false 1 - + false @@ -54815,7 +55491,7 @@ return Component;]]> true 1 - + false @@ -54855,7 +55531,7 @@ return Component;]]> 1 - + false @@ -54908,7 +55584,7 @@ TIP: Press R while hovering over a part to copy its color.]]> 1 - + false @@ -54961,7 +55637,7 @@ TIP: Press R while hovering over a part to copy its color.]]> - + false @@ -55000,7 +55676,7 @@ TIP: Press R while hovering over a part to copy its color.]]> false 1 - + false @@ -55039,7 +55715,7 @@ TIP: Press R while hovering over a part to copy its color.]]> true 1 - + false @@ -55079,7 +55755,7 @@ TIP: Press R while hovering over a part to copy its color.]]> 1 - + false @@ -55132,7 +55808,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55185,7 +55861,7 @@ TIP: Click a part's surface to select it quickly.]]> - + false @@ -55224,7 +55900,7 @@ TIP: Click a part's surface to select it quickly.]]> false 1 - + false @@ -55263,7 +55939,7 @@ TIP: Click a part's surface to select it quickly.]]> true 1 - + false @@ -55303,7 +55979,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55354,7 +56030,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55407,7 +56083,7 @@ TIP: Click a part's surface to select it quickly.]]> - + false @@ -55446,7 +56122,7 @@ TIP: Click a part's surface to select it quickly.]]> false 1 - + false @@ -55485,7 +56161,7 @@ TIP: Click a part's surface to select it quickly.]]> true 1 - + false @@ -55525,7 +56201,7 @@ TIP: Click a part's surface to select it quickly.]]> 1 - + false @@ -55578,7 +56254,7 @@ TIP: Press Enter to toggle anchor quickly.]]> 1 - + false @@ -55631,7 +56307,7 @@ TIP: Press Enter to toggle anchor quickly.]]> - + false @@ -55670,7 +56346,7 @@ TIP: Press Enter to toggle anchor quickly.]]> false 1 - + false @@ -55709,7 +56385,7 @@ TIP: Press Enter to toggle anchor quickly.]]> true 1 - + false @@ -55749,7 +56425,7 @@ TIP: Press Enter to toggle anchor quickly.]]> 1 - + false @@ -55802,7 +56478,7 @@ TIP: Click and drag where you want your part to be.]]> 1 - + false @@ -55855,7 +56531,7 @@ TIP: Click and drag where you want your part to be.]]> - + false @@ -55894,7 +56570,7 @@ TIP: Click and drag where you want your part to be.]]> false 1 - + false @@ -55933,7 +56609,7 @@ TIP: Click and drag where you want your part to be.]]> true 1 - + false @@ -55973,7 +56649,7 @@ TIP: Click and drag where you want your part to be.]]> 1 - + false @@ -56028,7 +56704,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di 1 - + false @@ -56081,7 +56757,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di - + false @@ -56120,7 +56796,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di false 1 - + false @@ -56159,7 +56835,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di true 1 - + false @@ -56199,7 +56875,7 @@ NOTE: If HttpService is not enabled, you must type the mesh or image asset ID di 1 - + false @@ -56256,7 +56932,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>1 - + false @@ -56309,7 +56985,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]> - + false @@ -56348,7 +57024,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>false 1 - + false @@ -56387,7 +57063,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>true 1 - + false @@ -56427,7 +57103,7 @@ NOTE: If HttpService isn't enabled, you must manually type an image's ID.]]>1 - + false @@ -56480,7 +57156,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -56533,7 +57209,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]> - + false @@ -56572,7 +57248,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>false 1 - + false @@ -56611,7 +57287,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>true 1 - + false @@ -56651,7 +57327,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -56702,7 +57378,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 - + false @@ -56755,7 +57431,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]> - + false @@ -56769,7 +57445,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>false false 0 - MoveInfo + WeldInfo null null null @@ -56794,7 +57470,7 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>false 1 - + false @@ -56805,21 +57481,9 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>1 4279970357 0 - rbxasset://textures/ui/Scroll/scroll-bottom.png - - 0 - 0 - - - 0 - 0 - 0 - 660 - - true + false false 0 - rbxasset://textures/ui/Scroll/scroll-middle.png Content null null @@ -56832,317 +57496,27 @@ TIP: Click on the surface of any part to change a light's side quickly.]]>0 0 - 6 - true - true + false null 1 0 - 1 - 0 + 0 + 310 0 - rbxasset://textures/ui/Scroll/scroll-top.png + 0 true 1 - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 0 - AxesInfo - null - null - null - null - - 0 - 0 - 0 - 60 - - 0 - false - null - - 1 - 0 - 0 - 300 - - 0 - 0 - true - 1 - - - - false - - 0 - 0 - - 4294945280 - 0 - 4279970357 - 0 - false - false - 0 - Frame - null - null - null - null - - 0 - 10 - 0 - 68 - - 0 - false - null - - 0 - 2 - 0 - 103 - - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 1 - 2 - 0 - TextLabel - null - null - null - null - - 0 - 17 - 0 - 68 - - 0 - false - null - - 0 - 80 - 0 - 180 - - 0 - - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 1 - 2 - 0 - TextLabel - null - null - null - null - - 0 - 10 - 0 - 15 - - 0 - false - null - - 0 - 80 - 0 - 60 - - 0 - This option lets you choose in which direction to move each part. - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4282203453 - 1 - 4279970357 - 0 - false - false - 2 - 2 - 0 - TextLabel - null - null - null - null - - 0 - 10 - 0 - 0 - - 0 - false - null - - 0 - 80 - 0 - 12 - - 0 - Axes - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 1 - 2 - 0 - TextLabel - null - null - null - null - - 0 - 10 - 0 - 180 - - 0 - false - null - - 0 - 80 - 0 - 90 - - 0 - TIP: Click on any part to focus the handles on it. - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - + false 0 0 - 4294945280 + 4279308561 0 4279970357 0 @@ -57175,157 +57549,7 @@ LAST - Relative to the last part selected]]> 1 - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 0 - IncrementInfo - null - null - null - null - - 0 - 0 - 0 - 285 - - 0 - false - null - - 1 - 0 - 0 - 300 - - 0 - 0 - true - 1 - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 1 - 2 - 0 - TextLabel - null - null - null - null - - 0 - 10 - 0 - 15 - - 0 - false - null - - 0 - 80 - 0 - 400 - - 0 - - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4282203453 - 1 - 4279970357 - 0 - false - false - 2 - 2 - 0 - TextLabel - null - null - null - null - - 0 - 10 - 0 - 0 - - 0 - false - null - - 0 - 80 - 0 - 12 - - 0 - Increment - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - + false @@ -57357,12 +57581,16 @@ TIP: Hit the - key to quickly type increments.]]> null 0 - 80 + 90 0 - 50 + 300 0 - Allows you to move parts. + 4294967295 false 10 @@ -57376,7 +57604,7 @@ TIP: Hit the - key to quickly type increments.]]> 1 - + false @@ -57413,7 +57641,7 @@ TIP: Hit the - key to quickly type increments.]]> 25 0 - MOVE TOOL + WELD TOOL 4294967295 false 10 @@ -57429,7 +57657,7 @@ TIP: Hit the - key to quickly type increments.]]> - + false @@ -57443,7 +57671,7 @@ TIP: Hit the - key to quickly type increments.]]> false false 0 - RotateInfo + CollisionInfo null null null @@ -57468,7 +57696,7 @@ TIP: Hit the - key to quickly type increments.]]> false 1 - + false @@ -57479,21 +57707,9 @@ TIP: Hit the - key to quickly type increments.]]> 1 4279970357 0 - rbxasset://textures/ui/Scroll/scroll-bottom.png - - 0 - 0 - - - 0 - 0 - 0 - 610 - - true + false false 0 - rbxasset://textures/ui/Scroll/scroll-middle.png Content null null @@ -57506,29 +57722,27 @@ TIP: Hit the - key to quickly type increments.]]> 0 0 - 6 - true - true + false null 1 0 - 1 - 0 + 0 + 150 0 - rbxasset://textures/ui/Scroll/scroll-top.png + 0 true 1 - + false 0 0 - 4283144011 + 4279308561 0 4279970357 0 @@ -57561,7 +57775,7 @@ TIP: Hit the - key to quickly type increments.]]> 1 - + false @@ -57574,147 +57788,353 @@ TIP: Hit the - key to quickly type increments.]]> 0 false false + 1 + 2 0 - IncrementInfo + ToolDescription null null null null 0 - 0 + 10 0 - 310 + 25 0 false null - 1 - 0 + 0 + 80 0 - 130 + 120 0 - 0 - true - 1 + + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 1 - 2 - 0 - TextLabel - null - null - null - null - - 0 - 10 - 0 - 15 - - 0 - false - null - - 0 - 93 - 0 - 400 - - 0 - + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 2 + 2 + 0 + ToolName + null + null + null + null + + 0 + 10 + 0 + 0 + + 0 + false + null + + 0 + 50 + 0 + 25 + + 0 + COLLISION TOOL + 4294967295 + false + 10 + 4278190080 + 1 + 0 + false + 0 + 1 + true + 1 + + + + + + + false + + [Component] + {0D39C82F-7AFE-4159-8AA9-E071F3CDB35B} + - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - - false - - 0 - 0 - - 4282203453 - 1 - 4279970357 - 0 - false - false - 2 - 2 - 0 - TextLabel - null - null - null - null - - 0 - 10 - 0 - 0 - - 0 - false - null - - 0 - 80 - 0 - 12 - - 0 - Increment - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 - true - 1 - - - - +function Component.Start(Core) + + -- Save reference to core API + getfenv(1).Core = Core; + + -- Return component for chaining + return Component; + +end; + +function Component.RegisterSection(SectionName) + -- Registers triggers for the given section + + -- Get section + local Section = Component.GetSection(SectionName); + + -- Reset fade timer on hover + Cheer.Bind(Section.MouseEnter, function () + if Component.CurrentSection == Section then + Component.CurrentFadeTimer = false; + end; + end); + + -- Start fade time on unhover + Cheer.Bind(Section.MouseLeave, function () + Component.StartFadeTimer(true); + end); + +end; + +function Component.StartFadeTimer(Override) + -- Creates timer to disappear current section after 2 seconds unless overridden + + if Component.CurrentFadeTimer == false and not Override then + return; + end; + + -- Generate unique trigger ID + local TriggerId = HttpService:GenerateGUID(); + + -- Register timer + Component.CurrentFadeTimer = TriggerId; + + -- Start timer + Delay(2, function () + if Component.CurrentFadeTimer == TriggerId then + Component.HideCurrentSection(); + end; + end); + +end; + +function Component.ProcessHover(Tool, SectionName) + + -- Only override current section if also triggered by hover + if Component.LastTrigger == 'Click' then + return; + end; + + -- Hide any current section + Component.HideCurrentSection(); + + -- Get section + local Section = Component.GetSection(SectionName); + + -- Set new current section + Component.CurrentSection = Section; + Component.LastTrigger = 'Hover'; + + -- Show the new section + Section.Visible = true; + +end; + +function Component.ProcessUnhover(Tool, SectionName) + + -- Only override current section if triggered by a hover + if Component.LastTrigger == 'Click' then + return; + end; + + -- Get section + local Section = Component.GetSection(SectionName); + + -- Disappear after 2 seconds unless overridden + if Component.CurrentSection == Section then + Component.StartFadeTimer(); + end; + +end; + +function Component.ProcessClick(Tool, SectionName) + + -- Hide any current section + Component.HideCurrentSection(); + + -- Get section + local Section = Component.GetSection(SectionName); + + -- Set new current section + Component.CurrentSection = Section; + Component.LastTrigger = 'Click'; + + -- Show the new section + Section.Visible = true; + + -- Disappear after 2 seconds unless overridden + Component.StartFadeTimer(); + +end; + +function Component.HideCurrentSection() + + -- Ensure there is a current section + if not Component.CurrentSection then + return; + end; + + -- Hide section + Component.CurrentSection.Visible = false; + + -- Disable section fade timer if any + Component.CurrentFadeTimer = nil; + + -- Unregister current section + Component.CurrentSection = nil; + Component.LastTrigger = nil; + +end; + +function Component.GetSection(SectionName) + + -- Return the information section with the given name + return View:FindFirstChild(SectionName); + +end; + +return Component;]]> + + + + + false + + 0 + 0 + + 4282203453 + 0.200000003 + 4279970357 + 0 + false + false + 0 + MoveInfo + null + null + null + null + + 0 + 0 + 0 + 0 + + 0 + false + null + + 1 + 0 + 1 + 0 + + 0 + 0 + false + 1 + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + rbxasset://textures/ui/Scroll/scroll-bottom.png + + 0 + 0 + + + 0 + 0 + 0 + 660 + + true + false + 0 + rbxasset://textures/ui/Scroll/scroll-middle.png + Content + null + null + null + null + + 0 + 0 + 0 + 0 + + 0 + 6 + true + true + null + + 1 + 0 + 1 + 0 + + 0 + rbxasset://textures/ui/Scroll/scroll-top.png + true + 1 + + false @@ -57728,7 +58148,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen false false 0 - PivotInfo + AxesInfo null null null @@ -57753,14 +58173,14 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen true 1 - + false 0 0 - 4283144011 + 4294945280 0 4279970357 0 @@ -57776,7 +58196,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 0 10 0 - 67 + 68 0 false @@ -57785,7 +58205,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 0 2 0 - 132 + 103 0 0 @@ -57793,7 +58213,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 1 - + false @@ -57818,7 +58238,7 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 0 17 0 - 67 + 68 0 false @@ -57830,11 +58250,11 @@ TIP: Use your right-side number keypad to rotate exactly by the current incremen 180 0 - +LAST - Relative to the last part selected]]> 4294967295 false 10 @@ -57848,7 +58268,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -57885,7 +58305,7 @@ LAST - Each part around the center of the last part selected]]> 60 0 - This option lets you choose what to rotate the parts around. + This option lets you choose in which direction to move each part. 4294967295 false 10 @@ -57899,7 +58319,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -57936,7 +58356,7 @@ LAST - Each part around the center of the last part selected]]> 12 0 - Pivot + Axes 4294967295 false 10 @@ -57950,7 +58370,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -57975,7 +58395,7 @@ LAST - Each part around the center of the last part selected]]> 0 10 0 - 208 + 180 0 false @@ -58002,58 +58422,47 @@ LAST - Each part around the center of the last part selected]]> - + false 0 0 - 4294967295 - 1 + 4294945280 + 0 4279970357 0 false false - 1 - 2 0 - ToolDescription + ColorBar null null null null 0 - 10 + 0 0 - 25 + 0 0 false null - 0 - 80 + 1 + 0 0 - 50 + 2 0 - Allows you to rotate parts. - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 + 0 true 1 - + false @@ -58066,64 +58475,269 @@ LAST - Each part around the center of the last part selected]]> 0 false false - 2 - 2 0 - ToolName + IncrementInfo null null null null 0 - 10 + 0 0 - 0 + 285 0 false null - 0 - 50 + 1 + 0 0 - 25 + 300 0 - ROTATE TOOL - 4294967295 - false - 10 - 4278190080 - 1 - 0 - false - 0 - 1 + 0 true 1 - - - - - - false - - 0 - 0 - - 4282203453 - 0.200000003 - 4279970357 - 0 - false - false - 0 - ResizeInfo - null - null - null + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 1 + 2 + 0 + TextLabel + null + null + null + null + + 0 + 10 + 0 + 15 + + 0 + false + null + + 0 + 82 + 0 + 400 + + 0 + + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4282203453 + 1 + 4279970357 + 0 + false + false + 2 + 2 + 0 + TextLabel + null + null + null + null + + 0 + 10 + 0 + 0 + + 0 + false + null + + 0 + 80 + 0 + 12 + + 0 + Increment + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 1 + 2 + 0 + ToolDescription + null + null + null + null + + 0 + 10 + 0 + 25 + + 0 + false + null + + 0 + 80 + 0 + 50 + + 0 + Allows you to move parts. + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 2 + 2 + 0 + ToolName + null + null + null + null + + 0 + 10 + 0 + 0 + + 0 + false + null + + 0 + 50 + 0 + 25 + + 0 + MOVE TOOL + 4294967295 + false + 10 + 4278190080 + 1 + 0 + false + 0 + 1 + true + 1 + + + + + + + false + + 0 + 0 + + 4282203453 + 0.200000003 + 4279970357 + 0 + false + false + 0 + RotateInfo + null + null + null null 0 @@ -58145,7 +58759,7 @@ LAST - Each part around the center of the last part selected]]> false 1 - + false @@ -58165,7 +58779,7 @@ LAST - Each part around the center of the last part selected]]> 0 0 0 - 525 + 630 true false @@ -58198,14 +58812,14 @@ LAST - Each part around the center of the last part selected]]> true 1 - + false 0 0 - 4278497260 + 4283144011 0 4279970357 0 @@ -58238,7 +58852,7 @@ LAST - Each part around the center of the last part selected]]> 1 - + false @@ -58252,7 +58866,7 @@ LAST - Each part around the center of the last part selected]]> false false 0 - DirectionsInfo + IncrementInfo null null null @@ -58261,7 +58875,7 @@ LAST - Each part around the center of the last part selected]]> 0 0 0 - 60 + 310 0 false @@ -58270,14 +58884,14 @@ LAST - Each part around the center of the last part selected]]> 1 0 0 - 300 + 130 0 0 true 1 - + false @@ -58309,14 +58923,24 @@ LAST - Each part around the center of the last part selected]]> null 0 - 80 + 94 0 - 120 + 400 0 - +TIP: Hit the Enter key to switch between Pivot modes quickly. + +TIP: Hit the - key to quickly type increments. + +TIP: Hold R and click on a corner of a part to rotate around it. + +TIP: Use your right-side number keypad to rotate exactly by the current increment: + 4/6 = Y axis (green) + 1/9 = Z axis (blue) + 2/8 = X axis (red) +(Shift = reverses increment)]]> 4294967295 false 10 @@ -58330,7 +58954,7 @@ TIP: Click on a part to focus the handles on it.]]> 1 - + false @@ -58367,7 +58991,7 @@ TIP: Click on a part to focus the handles on it.]]> 12 0 - Directions + Increment 4294967295 false 10 @@ -58382,7 +59006,7 @@ TIP: Click on a part to focus the handles on it.]]> - + false @@ -58396,7 +59020,7 @@ TIP: Click on a part to focus the handles on it.]]> false false 0 - IncrementInfo + PivotInfo null null null @@ -58405,7 +59029,7 @@ TIP: Click on a part to focus the handles on it.]]> 0 0 0 - 165 + 60 0 false @@ -58414,14 +59038,160 @@ TIP: Click on a part to focus the handles on it.]]> 1 0 0 - 135 + 300 0 0 true 1 - + + + false + + 0 + 0 + + 4283144011 + 0 + 4279970357 + 0 + false + false + 0 + Frame + null + null + null + null + + 0 + 10 + 0 + 67 + + 0 + false + null + + 0 + 2 + 0 + 132 + + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 1 + 2 + 0 + TextLabel + null + null + null + null + + 0 + 17 + 0 + 67 + + 0 + false + null + + 0 + 80 + 0 + 180 + + 0 + + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 1 + 2 + 0 + TextLabel + null + null + null + null + + 0 + 10 + 0 + 15 + + 0 + false + null + + 0 + 80 + 0 + 60 + + 0 + This option lets you choose what to rotate the parts around. + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + false @@ -58458,7 +59228,7 @@ TIP: Click on a part to focus the handles on it.]]> 12 0 - Increment + Pivot 4294967295 false 10 @@ -58472,7 +59242,7 @@ TIP: Click on a part to focus the handles on it.]]> 1 - + false @@ -58497,7 +59267,7 @@ TIP: Click on a part to focus the handles on it.]]> 0 10 0 - 15 + 208 0 false @@ -58506,18 +59276,10 @@ TIP: Click on a part to focus the handles on it.]]> 0 80 0 - 400 + 90 0 - + TIP: Click on any part to focus the handles on it. 4294967295 false 10 @@ -58532,7 +59294,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi - + false @@ -58569,7 +59331,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 50 0 - Allows you to resize parts. + Allows you to rotate parts. 4294967295 false 10 @@ -58583,7 +59345,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 1 - + false @@ -58620,7 +59382,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 25 0 - RESIZE TOOL + ROTATE TOOL 4294967295 false 10 @@ -58636,7 +59398,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi - + false @@ -58650,7 +59412,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi false false 0 - WeldInfo + ResizeInfo null null null @@ -58675,7 +59437,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi false 1 - + false @@ -58686,9 +59448,21 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 1 4279970357 0 - false + rbxasset://textures/ui/Scroll/scroll-bottom.png + + 0 + 0 + + + 0 + 0 + 0 + 540 + + true false 0 + rbxasset://textures/ui/Scroll/scroll-middle.png Content null null @@ -58701,27 +59475,29 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 0 0 - false + 6 + true + true null 1 0 - 0 - 310 + 1 + 0 0 - 0 + rbxasset://textures/ui/Scroll/scroll-top.png true 1 - + false 0 0 - 4279308561 + 4278497260 0 4279970357 0 @@ -58754,7 +59530,7 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 1 - + false @@ -58767,49 +59543,138 @@ TIP: Hold the R key, and click and drag the snap point of a part (in the directi 0 false false - 1 - 2 0 - ToolDescription + DirectionsInfo null null null null 0 - 10 + 0 0 - 25 + 60 0 false null - 0 - 90 + 1 + 0 0 300 0 - - 4294967295 - false - 10 - 4278190080 - 1 - 0 - true - 0 - 0 + 0 true 1 + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 1 + 2 + 0 + TextLabel + null + null + null + null + + 0 + 10 + 0 + 15 + + 0 + false + null + + 0 + 80 + 0 + 120 + + 0 + + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4282203453 + 1 + 4279970357 + 0 + false + false + 2 + 2 + 0 + TextLabel + null + null + null + null + + 0 + 10 + 0 + 0 + + 0 + false + null + + 0 + 80 + 0 + 12 + + 0 + Directions + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + - + false @@ -58822,139 +59687,8 @@ NOTE: This tool does not work in Roblox Studio.]]> 0 false false - 2 - 2 0 - ToolName - null - null - null - null - - 0 - 10 - 0 - 0 - - 0 - false - null - - 0 - 50 - 0 - 25 - - 0 - WELD TOOL - 4294967295 - false - 10 - 4278190080 - 1 - 0 - false - 0 - 1 - true - 1 - - - - - - - false - - 0 - 0 - - 4282203453 - 0.200000003 - 4279970357 - 0 - false - false - 0 - CollisionInfo - null - null - null - null - - 0 - 0 - 0 - 0 - - 0 - false - null - - 1 - 0 - 1 - 0 - - 0 - 0 - false - 1 - - - - false - - 0 - 0 - - 4294967295 - 1 - 4279970357 - 0 - false - false - 0 - Content - null - null - null - null - - 0 - 0 - 0 - 0 - - 0 - false - null - - 1 - 0 - 0 - 150 - - 0 - 0 - true - 1 - - - - false - - 0 - 0 - - 4279308561 - 0 - 4279970357 - 0 - false - false - 0 - ColorBar + IncrementInfo null null null @@ -58963,7 +59697,7 @@ NOTE: This tool does not work in Roblox Studio.]]> 0 0 0 - 0 + 165 0 false @@ -58972,15 +59706,129 @@ NOTE: This tool does not work in Roblox Studio.]]> 1 0 0 - 2 + 135 0 0 true 1 + + + false + + 0 + 0 + + 4282203453 + 1 + 4279970357 + 0 + false + false + 2 + 2 + 0 + TextLabel + null + null + null + null + + 0 + 10 + 0 + 0 + + 0 + false + null + + 0 + 80 + 0 + 12 + + 0 + Increment + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + + + + false + + 0 + 0 + + 4294967295 + 1 + 4279970357 + 0 + false + false + 1 + 2 + 0 + TextLabel + null + null + null + null + + 0 + 10 + 0 + 15 + + 0 + false + null + + 0 + 82 + 0 + 400 + + 0 + + 4294967295 + false + 10 + 4278190080 + 1 + 0 + true + 0 + 0 + true + 1 + + - + false @@ -59014,12 +59862,10 @@ NOTE: This tool does not work in Roblox Studio.]]> 0 80 0 - 120 + 50 0 - + Allows you to resize parts. 4294967295 false 10 @@ -59033,7 +59879,7 @@ TIP: Press Enter to toggle collision quickly.]]> 1 - + false @@ -59070,7 +59916,7 @@ TIP: Press Enter to toggle collision quickly.]]> 25 0 - COLLISION TOOL + RESIZE TOOL 4294967295 false 10 @@ -59086,177 +59932,16 @@ TIP: Press Enter to toggle collision quickly.]]> - - - false - - [Component] - {0D39C82F-7AFE-4159-8AA9-E071F3CDB35B} - - - - + AutoUpdate true - + false @@ -59318,7 +60003,7 @@ if Model and #Model:GetChildren() > 0 then end;]]> - + -9.0008564 @@ -59355,7 +60040,7 @@ end;]]> 1 ThumbnailCamera - + true -0.5 @@ -59426,7 +60111,7 @@ end;]]> 0.200000003 - + true null @@ -59441,7 +60126,7 @@ end;]]> 0 0 - + false @@ -59503,7 +60188,7 @@ end;]]> - + false