local t={}local E=0 local n={}function filteringWorkspace()if explorerFilter.Text~=""and explorerFilter.Text~="\070\105\108\116\101\114 \119\111\114\107\115\112\097\099\101\046\046\046"then return true end return false end function lookForAName(t,E)for t,n in pairs(t:GetChildren())do if string.find(string.lower(n.Name),string.lower(E))then nameScanned=true end lookForAName(n,E)end end function scanName(t)nameScanned=false if string.find(string.lower(t.Name),string.lower(explorerFilter.Text))then nameScanned=true else lookForAName(t,explorerFilter.Text)end return nameScanned end function updateActions()for t,E in pairs(n)do if E.Cond()then E.Toggle(true)else E.Toggle(false)end end end local e,S,W,g do local function n(t)for e,S in ipairs(t)do if not filteringWorkspace()or scanName(S.Object)then if t.Object==game then if childrenGame[S.Object]then table.insert(TreeList,S)local t=((((S.Depth*((2+ENTRY_PADDING)+GUI_SIZE)+2)+ENTRY_SIZE)+4)+getTextWidth(S.Object.Name))+4 if t>E then E=t end if S.Expanded or filteringWorkspace()then n(S)end end else table.insert(TreeList,S)local t=((((S.Depth*((2+ENTRY_PADDING)+GUI_SIZE)+2)+ENTRY_SIZE)+4)+getTextWidth(S.Object.Name))+4 if t>E then E=t end if S.Expanded or filteringWorkspace()then n(S)end end end end end function g()scrollBarH.TotalSpace=E scrollBarH.VisibleSpace=listFrame.AbsoluteSize.x scrollBarH:Update()local t=scrollBarH:CanScrollDown()or scrollBarH:CanScrollUp()scrollBarH.GUI.Visible=t listFrame.Size=UDim2_new(1,-GUI_SIZE,1,-GUI_SIZE*(t and 1 or 0)-HEADER_SIZE)scrollBar.VisibleSpace=math.ceil(listFrame.AbsoluteSize.y/ENTRY_BOUND)scrollBar.GUI.Size=UDim2_new(0,GUI_SIZE,1,-GUI_SIZE*(t and 1 or 0)-HEADER_SIZE)scrollBar.TotalSpace=#TreeList+1 scrollBar:Update()end function S()table.clear(TreeList)E=0 n(t[game])n(t[DexOutput])n(t[HiddenEntries])n(t[HiddenGame])g()updateActions()end local M=false function e()if M then return end M=true wait(.25)M=false S()end local R=false function W()if R then return end R=true wait(.25)R=false scrollBar:Update()end end local M do local E=explorerPanel:FindFirstChild("\071\101\116\083\101\108\101\099\116\105\111\110")if not E then E=Create("\066\105\110\100\097\098\108\101\070\117\110\099\116\105\111\110",{Name="\071\101\116\083\101\108\101\099\116\105\111\110"})E.Parent=explorerPanel end local n=explorerPanel:FindFirstChild("\083\101\116\083\101\108\101\099\116\105\111\110")if not n then n=Create("\066\105\110\100\097\098\108\101\070\117\110\099\116\105\111\110",{Name="\083\101\116\083\101\108\101\099\116\105\111\110"})n.Parent=explorerPanel end local e=explorerPanel:FindFirstChild("\083\101\108\101\099\116\105\111\110\067\104\097\110\103\101\100")if not e then e=Create("\066\105\110\100\097\098\108\101\069\118\101\110\116",{Name="\083\101\108\101\099\116\105\111\110\067\104\097\110\103\101\100"})e.Parent=explorerPanel end local W={}local g={}local R=true M={Selected=g;List=W}local function j(E)local n=false local e=false if not g[E]then local S=t[E]if S then table.insert(W,E)g[E]=true S.Selected=true S=S.Parent while S do if not S.Expanded then S.Expanded=true n=true end S=S.Parent end e=true end end return n,e end M.Finding=false M.Found={}function M.Set(n,E)if M.Finding then M.Found=E end local R=false local I=false if#W>0 then for E=1,#W,1 do local n=W[E]local e=t[n]if e then e.Selected=false g[n]=nil end end W={}M.List=W I=true end for t=1,#E,1 do local n,e=j(E[t])R=n or R I=e or I end if R then S()I=true elseif I then scrollBar:Update()end if I then e:Fire()updateActions()end end function M.Add(E,t)local n,W=j(t)if n then S()if R then e:Fire()updateActions()end elseif W then scrollBar:Update()if R then e:Fire()updateActions()end end end function M.StopUpdates(t)R=false end function M.ResumeUpdates(t)R=true e:Fire()updateActions()end function M.Remove(S,E,n)if g[E]then local S=t[E]if S then S.Selected=false g[E]=nil for t=1,#W,1 do if W[t]==E then table.remove(W,t)break end end if not n then scrollBar:Update()end e:Fire()updateActions()end end end function M.Get(t)local E={}for t=1,#W,1 do if W[t]~=HiddenEntriesMain and W[t]~=DexOutputMain then table.insert(E,W[t])end end return E end n.OnInvoke=function(...)M:Set(...)end E.OnInvoke=function()return M:Get()end end function CreateCaution(t,E)local n=CautionWindow n.Visible=true n.Title.Text=t n.MainWindow.Desc.Text=E n.MainWindow.Ok.MouseButton1Up:connect(function()n.Visible=false end)end function CreateTableCaution(t,E)if type(E)~="\116\097\098\108\101"then return CreateCaution(t,tostring(E))end local n=TableCautionWindow:Clone()n.Title.Text=t local e=n.MainWindow.TableResults local S=n.MainWindow.TableTemplate for t,E in pairs(E)do local n=S:Clone()n.Type.Text=type(E)n.Value.Text=tostring(E)n.Position=UDim2_new(0,0,0,#e:GetChildren()*20)n.Parent=e e.CanvasSize=UDim2_new(0,0,0,#e:GetChildren()*20)n.Visible=true end n.Parent=explorerPanel.Parent n.Visible=true n.MainWindow.Ok.MouseButton1Up:connect(function()n:Destroy()end)end local function R(t,E)local n=1 local e={}while true do local S=string.find(t,E,n,true)if not S then break end table.insert(e,string.sub(t,n,S-1))n=S+string.len(E)end table.insert(e,string.sub(t,n))return e end local function j(t,E)if E=="\086\101\099\116\111\114\050"then local E=R(t,"\044")if#E<2 then return nil end local n=tonumber(E[1])or 0 local e=tonumber(E[2])or 0 return Vector2_new(n,e)elseif E=="\086\101\099\116\111\114\051"then local E=R(t,"\044")if#E<3 then return nil end local n=tonumber(E[1])or 0 local e=tonumber(E[2])or 0 local S=tonumber(E[3])or 0 return Vector3_new(n,e,S)elseif E=="\067\111\108\111\114\051"then local E=R(t,"\044")if#E<3 then return nil end local n=tonumber(E[1])or 0 local e=tonumber(E[2])or 0 local S=tonumber(E[3])or 0 return Color3_new(n/255,e/255,S/255)elseif E=="\085\068\105\109\050"then local E=R(string.gsub(string.gsub(t,"\123",""),"\125",""),"\044")if#E<4 then return nil end local n=tonumber(E[1])or 0 local e=tonumber(E[2])or 0 local S=tonumber(E[3])or 0 local W=tonumber(E[4])or 0 return UDim2_new(n,e,S,W)elseif E=="\078\117\109\098\101\114"then return tonumber(t)elseif E=="\083\116\114\105\110\103"then return t elseif E=="\078\117\109\098\101\114\082\097\110\103\101"then local E=R(t,"\044")if#E==1 then if tonumber(E[1])==nil then return nil end local t=tonumber(E[1])or 0 return NumberRange.new(t)end if#E<2 then return nil end local n=tonumber(E[1])or 0 local e=tonumber(E[2])or 0 return NumberRange.new(n,e)elseif E=="\083\099\114\105\112\116"then local t,E=pcall(function() end)if E then return nil end else return nil end end local function I(t,E)if E=="\086\101\099\116\111\114\050"then local E=R(t,"\044")if#E<2 then return nil end local n=tonumber(E[1])or 0 local e=tonumber(E[2])or 0 return Vector2_new(n,e)elseif E=="\086\101\099\116\111\114\051"then local E=R(t,"\044")if#E<3 then return nil end local n=tonumber(E[1])or 0 local e=tonumber(E[2])or 0 local S=tonumber(E[3])or 0 return Vector3_new(n,e,S)elseif E=="\067\111\108\111\114\051"then local E=R(t,"\044")if#E<3 then return nil end local n=tonumber(E[1])or 0 local e=tonumber(E[2])or 0 local S=tonumber(E[3])or 0 return Color3_new(n/255,e/255,S/255)elseif E=="\085\068\105\109\050"then local E=R(string.gsub(string.gsub(t,"\123",""),"\125",""),"\044")if#E<4 then return nil end local n=tonumber(E[1])or 0 local e=tonumber(E[2])or 0 local S=tonumber(E[3])or 0 local W=tonumber(E[4])or 0 return UDim2_new(n,e,S,W)elseif E=="\067\111\110\116\101\110\116"then return t elseif E=="\102\108\111\097\116"or E=="\105\110\116"or E=="\100\111\117\098\108\101"then return tonumber(t)elseif E=="\115\116\114\105\110\103"then return t elseif E=="\078\117\109\098\101\114\082\097\110\103\101"then local E=R(t,"\044")if#E==1 then if tonumber(E[1])==nil then return nil end local t=tonumber(E[1])or 0 return NumberRange.new(t)end if#E<2 then return nil end local n=tonumber(E[1])or 0 local e=tonumber(E[2])or 0 return NumberRange.new(n,e)elseif string.sub(t,1,4)=="\069\110\117\109"then local E=t while true do local t,n=string.find(E,"\046")if n then E=string.sub(E,n+1)else break end end print(E)return E else return nil end end function PromptCaller(t)if CurrentRemoteWindow then CurrentRemoteWindow:Destroy()CurrentRemoteWindow=nil end CurrentRemoteWindow=RemoteWindow:Clone()CurrentRemoteWindow.Parent=explorerPanel.Parent CurrentRemoteWindow.Visible=true local E=false local n=CurrentRemoteWindow.MainWindow.Arguments local e=CurrentRemoteWindow.MainWindow.ArgumentTemplate if t:IsA("\082\101\109\111\116\101\069\118\101\110\116")or t:IsA("\066\105\110\100\097\098\108\101\069\118\101\110\116")then CurrentRemoteWindow.Title.Text="\070\105\114\101 \069\118\101\110\116"CurrentRemoteWindow.MainWindow.Ok.Text="\070\105\114\101"CurrentRemoteWindow.MainWindow.DisplayReturned.Visible=false CurrentRemoteWindow.MainWindow.Desc2.Visible=false end if t:IsA("\082\101\109\111\116\101\069\118\101\110\116")or t:IsA("\082\101\109\111\116\101\070\117\110\099\116\105\111\110")then local t=e:Clone()t.Parent=n t.Visible=true t.Type.Text="\085\115\101\114\078\097\109\101\084\111\070\105\114\101"end local S=e:Clone()if t:IsA("\082\101\109\111\116\101\069\118\101\110\116")or t:IsA("\082\101\109\111\116\101\070\117\110\099\116\105\111\110")then S.Position=UDim2_new(0,0,0,20)n.CanvasSize=UDim2_new(0,0,0,40)end S.Parent=n S.Visible=true S.Type.MouseButton1Down:connect(function()createDDown(S.Type,function(t)S.Type.Text=t end,"\083\099\114\105\112\116","\078\117\109\098\101\114","\083\116\114\105\110\103","\067\111\108\111\114\051","\086\101\099\116\111\114\051","\086\101\099\116\111\114\050","\085\068\105\109\050","\078\117\109\098\101\114\082\097\110\103\101")end)CurrentRemoteWindow.MainWindow.Ok.MouseButton1Up:connect(function()if CurrentRemoteWindow and t.Parent~=nil then local e={}for E,n in pairs(n:GetChildren())do if t:IsA("\082\101\109\111\116\101\070\117\110\099\116\105\111\110")or t:IsA("\082\101\109\111\116\101\069\118\101\110\116")and E==1 then local t=game:GetService("\080\108\097\121\101\114\115")if t:FindFirstChild(n.Value.Text)then table.insert(e,t[n.Value.Text])else CreateCaution("\082\101\109\111\116\101 \067\097\108\108\101\114","\084\104\101 \117\115\101\114\110\097\109\101 \100\101\102\105\110\101\100 \105\115 \110\111\116 \105\110-\103\097\109\101\046")return end end table.insert(e,j(n.Value.Text,n.Type.Text))end if t:IsA("\082\101\109\111\116\101\070\117\110\099\116\105\111\110")or t:IsA("\082\101\109\111\116\101\069\118\101\110\116")then if E then spawn(function()local E=RemoteEvent:InvokeServer("\067\097\108\108\082\101\109\111\116\101",t,e)if E then CreateTableCaution("\082\101\109\111\116\101 \067\097\108\108\101\114",E)else CreateCaution("\082\101\109\111\116\101 \067\097\108\108\101\114","\084\104\105\115 \114\101\109\111\116\101 \100\105\100 \110\111\116 \114\101\116\117\114\110 \097\110\121\116\104\105\110\103\046")end end)else spawn(function()RemoteEvent:InvokeServer("\067\097\108\108\082\101\109\111\116\101",t,e)end)end else RemoteEvent:InvokeServer("\067\097\108\108\082\101\109\111\116\101",t,e)end CurrentRemoteWindow:Destroy()CurrentRemoteWindow=nil end end)CurrentRemoteWindow.MainWindow.Add.MouseButton1Up:connect(function()if CurrentRemoteWindow then local t=e:Clone()t.Position=UDim2_new(0,0,0,#n:GetChildren()*20)t.Parent=n n.CanvasSize=UDim2_new(0,0,0,#n:GetChildren()*20)t.Visible=true t.Type.MouseButton1Down:connect(function()createDDown(t.Type,function(E)t.Type.Text=E end,"\083\099\114\105\112\116","\078\117\109\098\101\114","\083\116\114\105\110\103","\067\111\108\111\114\051","\086\101\099\116\111\114\051","\086\101\099\116\111\114\050","\085\068\105\109\050","\078\117\109\098\101\114\082\097\110\103\101")end)end end)CurrentRemoteWindow.MainWindow.Subtract.MouseButton1Up:connect(function()if CurrentRemoteWindow then if(t:IsA("\082\101\109\111\116\101\070\117\110\099\116\105\111\110")or t:IsA("\082\101\109\111\116\101\069\118\101\110\116"))and#n:GetChildren()>2 then(n:GetChildren())[#n:GetChildren()]:Destroy()n.CanvasSize=UDim2_new(0,0,0,#n:GetChildren()*20)elseif t:IsA("\082\101\109\111\116\101\070\117\110\099\116\105\111\110")==false and(t:IsA("\082\101\109\111\116\101\069\118\101\110\116")==false and#n:GetChildren()>1)then(n:GetChildren())[#n:GetChildren()]:Destroy()n.CanvasSize=UDim2_new(0,0,0,#n:GetChildren()*20)end end end)CurrentRemoteWindow.MainWindow.Cancel.MouseButton1Up:connect(function()if CurrentRemoteWindow then CurrentRemoteWindow:Destroy()CurrentRemoteWindow=nil end end)CurrentRemoteWindow.MainWindow.DisplayReturned.MouseButton1Up:connect(function()if E then E=false CurrentRemoteWindow.MainWindow.DisplayReturned.enabled.Visible=false else E=true CurrentRemoteWindow.MainWindow.DisplayReturned.enabled.Visible=true end end)end function DestroyRightClick()if currentRightClickMenu then currentRightClickMenu:Destroy()currentRightClickMenu=nil end if CurrentInsertObjectWindow and CurrentInsertObjectWindow.Visible then CurrentInsertObjectWindow.Visible=false end end function rightClickMenu(t)local E=(game:GetService("\080\108\097\121\101\114\115")).LocalPlayer:GetMouse()currentRightClickMenu=CreateRightClickMenu({"\067\117\116";"\067\111\112\121";"\080\097\115\116\101 \073\110\116\111","\068\117\112\108\105\099\097\116\101","\068\101\108\101\116\101",false;"\071\114\111\117\112","\085\110\103\114\111\117\112";"\083\101\108\101\099\116 \067\104\105\108\100\114\101\110";false,"\084\101\108\101\112\111\114\116 \084\111";"\067\097\108\108 \070\117\110\099\116\105\111\110","\067\097\108\108 \082\101\109\111\116\101\047\066\105\110\100\097\098\108\101",false;"\073\110\115\101\114\116 \080\097\114\116","\073\110\115\101\114\116 \079\098\106\101\099\116";false},"",false,function(t)if t=="\067\117\116"then if not Option.Modifiable then return end clipboard={}RemoteEvent:InvokeServer("\067\108\101\097\114\067\108\105\112\098\111\097\114\100")local t=M.List local E={}for n=1,#t,1 do local e,S=pcall(function()return t[n]:Clone()end)if S then table.insert(clipboard,S)table.insert(E,t[n])RemoteEvent:InvokeServer("\067\111\112\121",t[n])end end for t=1,#E,1 do pcall(delete,E[t])end updateActions()elseif t=="\067\111\112\121"then if not Option.Modifiable then return end clipboard={}RemoteEvent:InvokeServer("\067\108\101\097\114\067\108\105\112\098\111\097\114\100")local t=M.List for E=1,#t,1 do local n,e=pcall(function()return t[E]:Clone()end)if e then table.insert(clipboard,e)end RemoteEvent:InvokeServer("\067\111\112\121",t[E])end updateActions()elseif t=="\080\097\115\116\101 \073\110\116\111"then if not Option.Modifiable then return end local t=M.List[1]or workspace if not RemoteEvent:InvokeServer("\080\097\115\116\101",t)then for E=1,#clipboard,1 do if clipboard[E]then pcall(function()(clipboard[E]:Clone()).Parent=t end)end end end elseif t=="\068\117\112\108\105\099\097\116\101"then if not Option.Modifiable then return end local t=M:Get()local E=M.List[1].Parent or workspace for n=1,#t,1 do if not RemoteEvent:InvokeServer("\068\117\112\108\105\099\097\116\101",t[n],E)then local e,S=pcall(function()return t[n]:Clone()end)if S then S.Parent=E end end end elseif t=="\068\101\108\101\116\101"then if not Option.Modifiable then return end local t=M:Get()for E=1,#t,1 do pcall(delete,t[E])end M:Set({})elseif t=="\071\114\111\117\112"then if not Option.Modifiable then return end local t=M.List[1].Parent or workspace local E=RemoteEvent:InvokeServer("\073\110\115\116\097\110\099\101\078\101\119","\077\111\100\101\108",{Parent=t})or Instance_new("\077\111\100\101\108")local n=M:Get()E.Parent=t for t=1,#n,1 do n[t].Parent=E RemoteEvent:InvokeServer("\083\101\116\080\114\111\112\101\114\116\121",n[t],"\080\097\114\101\110\116",E)end M:Set({})elseif t=="\085\110\103\114\111\117\112"then if not Option.Modifiable then return end local t={}local E=M:Get()for n=1,#E,1 do if E[n]:IsA("\077\111\100\101\108")then for e,S in pairs(E[n]:GetChildren())do S.Parent=E[n].Parent or workspace table.insert(t,S)RemoteEvent:InvokeServer("\083\101\116\080\114\111\112\101\114\116\121",S,"\080\097\114\101\110\116",E[n].Parent or workspace)end pcall(delete,E[n])end end M:Set({})if SettingsRemote:Invoke("\083\101\108\101\099\116\085\110\103\114\111\117\112\101\100")then for t,E in pairs(t)do M:Add(E)end end elseif t=="\083\101\108\101\099\116 \067\104\105\108\100\114\101\110"then if not Option.Modifiable then return end local t=M:Get()M:Set({})M:StopUpdates()for E=1,#t,1 do for t,E in pairs(t[E]:GetChildren())do M:Add(E)end end M:ResumeUpdates()elseif t=="\084\101\108\101\112\111\114\116 \084\111"then if not Option.Modifiable then return end local t=M:Get()for E=1,#t,1 do if t[E]:IsA("\066\097\115\101\080\097\114\116")then pcall(function()(game:GetService("\080\108\097\121\101\114\115")).LocalPlayer.Character.HumanoidRootPart.CFrame=t[E].CFrame end)break end end elseif t=="\073\110\115\101\114\116 \080\097\114\116"then if not Option.Modifiable then return end local t={}local E=M:Get()for n=1,#E,1 do pcall(function()local e={}e.Parent=E[n]e.CFrame=CFrame_new((game:GetService("\080\108\097\121\101\114\115")).LocalPlayer.Character.Head.Position)+Vector3_new(0,3,0)local S=RemoteEvent:InvokeServer("\073\110\115\116\097\110\099\101\078\101\119","\080\097\114\116",e)or Instance_new("\080\097\114\116")S.Parent=e.Parent S.CFrame=e.CFrame table.insert(t,S)end)end elseif t=="\067\097\108\108 \082\101\109\111\116\101\047\066\105\110\100\097\098\108\101"then if not Option.Modifiable then return end local t=M:Get()for E=1,#t,1 do if t[E]:IsA("\082\101\109\111\116\101\070\117\110\099\116\105\111\110")or t[E]:IsA("\082\101\109\111\116\101\069\118\101\110\116")or t[E]:IsA("\066\105\110\100\097\098\108\101\070\117\110\099\116\105\111\110")or t[E]:IsA("\066\105\110\100\097\098\108\101\069\118\101\110\116")then PromptCaller(t[E])break end end end end)currentRightClickMenu.Parent=explorerPanel.Parent currentRightClickMenu.Position=UDim2_new(0,E.X,0,E.Y)if currentRightClickMenu.AbsolutePosition.X+currentRightClickMenu.AbsoluteSize.X>explorerPanel.AbsolutePosition.X+explorerPanel.AbsoluteSize.X then currentRightClickMenu.Position=UDim2_new(0,(explorerPanel.AbsolutePosition.X+explorerPanel.AbsoluteSize.X)-currentRightClickMenu.AbsoluteSize.X,0,E.Y)end end local function C() end local function z() end do local n={}local e={}local W=Create("\073\109\097\103\101\066\117\116\116\111\110",{Name="\077\111\117\115\101\068\114\097\103";Position=UDim2_new(-0.25,0,-0.25,0),Size=UDim2_new(1.5,0,1.5,0),Transparency=1,AutoButtonColor=false;Active=true,ZIndex=10})local function R(t,E,n)local e local S conDrag=W.MouseMoved:connect(function(n,e)local S=Vector2_new(n,e)-listFrame.AbsolutePosition local W=listFrame.AbsoluteSize if S.x<0 or S.x>W.x or S.y<0 or S.y>W.y then return end local g=math.ceil(S.y/ENTRY_BOUND)+scrollBar.ScrollIndex for t=g<t and g or t,g>t and g or t,1 do local n=TreeList[t]if n then if E then M:Add(n.Object)else M:Remove(n.Object)end end end t=g end)function z()W.Parent=nil conDrag:disconnect()S:disconnect()function z() end end S=W[n]:connect(z)W.Parent=GetScreen(listFrame)end local function j(t,E,e,S)local g local R local j local I=nil local z=false local q=Create("\070\114\097\109\101",{Transparency=1,Visible=false;Create("\070\114\097\109\101",{BorderSizePixel=0,BackgroundColor3=Color3_new(0,0,0),BackgroundTransparency=.1;Position=UDim2_new(0,0,0,0),Size=UDim2_new(1,0,0,1)});Create("\070\114\097\109\101",{BorderSizePixel=0;BackgroundColor3=Color3_new(0,0,0);BackgroundTransparency=.1;Position=UDim2_new(1,0,0,0);Size=UDim2_new(0,1,1,0)});Create("\070\114\097\109\101",{BorderSizePixel=0;BackgroundColor3=Color3_new(0,0,0);BackgroundTransparency=.1;Position=UDim2_new(0,0,1,0);Size=UDim2_new(1,0,0,1)}),Create("\070\114\097\109\101",{BorderSizePixel=0,BackgroundColor3=Color3_new(0,0,0);BackgroundTransparency=.1,Position=UDim2_new(0,0,0,0),Size=UDim2_new(0,1,1,0)})})SetZIndex(q,9)conDrag=W.MouseMoved:connect(function(W,g)local M=Vector2_new(W,g)if z then local e=M-listFrame.AbsolutePosition local W=listFrame.AbsoluteSize I=nil q.Visible=false if e.x>=0 and(e.x<=W.x and(e.y>=0 and e.y<=W.y+ENTRY_SIZE*2))then local E=math.ceil(e.y/ENTRY_BOUND-2)local S=TreeList[E+scrollBar.ScrollIndex]if S and(S.Object~=t and not t:IsAncestorOf(S.Object))then I=E local t=n[E]if t then q.Visible=true q.Position=UDim2_new(0,1,0,t.AbsolutePosition.y-listFrame.AbsolutePosition.y)q.Size=UDim2_new(0,W.x-4,0,t.AbsoluteSize.y)end end end E.Position=UDim2_new(0,M.x+S.x,0,M.y+S.y)elseif(e-M).magnitude>8 then z=true SetZIndex(E,9)E.IndentFrame.Transparency=.25 E.IndentFrame.EntryText.TextColor3=GuiColor.TextSelected E.Position=UDim2_new(0,M.x+S.x,0,M.y+S.y)E.Parent=GetScreen(listFrame)q.Parent=listFrame end end)function C()W.Parent=nil conDrag:disconnect()R:disconnect()j:disconnect()E:Destroy()q:Destroy()function C() end end local d=M.Selected[t]if not d and Option.Selectable then M:Set({t})end R=W.MouseButton1Up:connect(function()C()if z then if I then local E=TreeList[I+scrollBar.ScrollIndex]if E then E.Expanded=true local n=E.Object local function e(t,E)t.Parent=E end if Option.Selectable then local t=M.List for E=1,#t,1 do pcall(e,t[E],n)end else pcall(e,t,n)end end end else if d and Option.Selectable then M:Set({})end end end)j=W.MouseButton2Down:connect(function()C()end)W.Parent=GetScreen(listFrame)end local I=Create("\073\109\097\103\101\066\117\116\116\111\110",{Name="\069\110\116\114\121",Transparency=1,AutoButtonColor=false;Position=UDim2_new(0,0,0,0),Size=UDim2_new(1,0,0,ENTRY_SIZE);Create("\070\114\097\109\101",{Name="\073\110\100\101\110\116\070\114\097\109\101",BackgroundTransparency=1,BackgroundColor3=GuiColor.Selected;BorderColor3=GuiColor.BorderSelected,Position=UDim2_new(0,0,0,0),Size=UDim2_new(1,0,1,0);Create(Icon("\073\109\097\103\101\066\117\116\116\111\110",0),{Name="\069\120\112\097\110\100";AutoButtonColor=false;Position=UDim2_new(0,-GUI_SIZE,.5,-GUI_SIZE/2),Size=UDim2_new(0,GUI_SIZE,0,GUI_SIZE)}),Create(ClassIcon(nil,0),{Name="\069\120\112\108\111\114\101\114\073\099\111\110",Position=UDim2_new(0,2+ENTRY_PADDING,.5,-GUI_SIZE/2),Size=UDim2_new(0,GUI_SIZE,0,GUI_SIZE)}),Create("\084\101\120\116\076\097\098\101\108",{Name="\069\110\116\114\121\084\101\120\116";BackgroundTransparency=1;TextColor3=GuiColor.Text,TextXAlignment="\076\101\102\116",TextYAlignment="\067\101\110\116\101\114";Font=FONT,FontSize=FONT_SIZE,Text="";Position=UDim2_new(0,(2+ENTRY_SIZE)+4,0,0);Size=UDim2_new(1,-2,1,0)})})})function scrollBar.UpdateCallback(W)for g=1,W.VisibleSpace,1 do local C=TreeList[g+W.ScrollIndex]if C then local z=n[g]if not z then z=Create(I:Clone(),{Position=UDim2_new(0,2,0,ENTRY_BOUND*(g-1)+2),Size=UDim2_new(0,E,0,ENTRY_SIZE),ZIndex=listFrame.ZIndex})n[g]=z local e=z.IndentFrame.Expand e.MouseEnter:connect(function()local t=TreeList[g+W.ScrollIndex]if#t>0 then if t.Object~=HiddenEntriesMain then if t.Expanded then Icon(e,NODE_EXPANDED_OVER)else Icon(e,NODE_COLLAPSED_OVER)end else if t.HiddenExpanded then Icon(e,NODE_EXPANDED_OVER)else Icon(e,NODE_COLLAPSED_OVER)end end end end)e.MouseLeave:connect(function()pcall(function()local t=TreeList[g+W.ScrollIndex]if t.Object==HiddenEntriesMain then if t.HiddenExpanded then Icon(e,NODE_EXPANDED)else Icon(e,NODE_COLLAPSED)end return end if#t>0 then if t.Expanded then Icon(e,NODE_EXPANDED)else Icon(e,NODE_COLLAPSED)end end end)end)local function C(t,E,n)addObject(t,E,n)local e,S=pcall(function()return t:GetChildren()end,t)if e then for n=1,#S,1 do C(S[n],E,t)end end end e.MouseButton1Down:connect(function()local E=TreeList[g+W.ScrollIndex]if#E>0 then if E.Object~=HiddenEntriesMain then E.Expanded=not E.Expanded else if not MuteHiddenItems then t[HiddenGame]={Object=HiddenGame;Parent=nil;Index=0;Expanded=true}else for t,E in pairs(game:GetChildren())do if not childrenGame[E]then C(E,true,HiddenGame)end end end MuteHiddenItems=not MuteHiddenItems E.HiddenExpanded=not E.HiddenExpanded end if E.Object==explorerPanel.Parent and E.Expanded then CreateCaution("\087\097\114\110\105\110\103","\077\111\100\105\102\121\105\110\103 \116\104\101 \099\111\110\116\101\110\116\115 \111\102 \116\104\105\115 \073\110\115\116\097\110\099\101 \099\111\117\108\100 \099\097\117\115\101 \101\114\114\097\116\105\099 \111\114 \117\110\115\116\097\098\108\101 \098\101\104\097\118\105\111\114\046 \080\114\111\099\101\101\100 \119\105\116\104 \099\097\117\116\105\111\110\046")end S()end end)z.MouseButton1Down:connect(function(t,E)local n=TreeList[g+W.ScrollIndex]DestroyRightClick()if GetAwaitRemote:Invoke()then bindSetAwaiting:Fire(n.Object)return end if n.Object==HiddenEntriesMain then return end if not HoldingShift then lastSelectedNode=g+W.ScrollIndex end if HoldingShift and not filteringWorkspace()then if lastSelectedNode then if(g+W.ScrollIndex)-lastSelectedNode>0 then M:StopUpdates()for t=1,(g+W.ScrollIndex)-lastSelectedNode,1 do local E=TreeList[lastSelectedNode+t]if E then M:Add(E.Object)end end M:ResumeUpdates()else M:StopUpdates()for t=(g+W.ScrollIndex)-lastSelectedNode,1,1 do local E=TreeList[lastSelectedNode+t]if E then M:Add(E.Object)end end M:ResumeUpdates()end end return end if HoldingCtrl then if M.Selected[n.Object]then M:Remove(n.Object)else M:Add(n.Object)end return end if Option.Modifiable then local e=Vector2_new(t,E)j(n.Object,z:Clone(),e,z.AbsolutePosition-e)elseif Option.Selectable then if M.Selected[n.Object]then M:Set({})else M:Set({n.Object})end R(g+W.ScrollIndex,true,"\077\111\117\115\101\066\117\116\116\111\110\049\085\112")end end)local q z.MouseButton2Down:connect(function()if not Option.Selectable then return end DestroyRightClick()q=z local t=TreeList[g+W.ScrollIndex]if t.Object==HiddenEntriesMain then return end if GetAwaitRemote:Invoke()then bindSetAwaiting:Fire(t.Object)return end if not M.Selected[t.Object]then M:Set({t.Object})end end)z.MouseButton2Up:connect(function()if not Option.Selectable then return end local t=TreeList[g+W.ScrollIndex]if t.Object==HiddenEntriesMain then return end if checkMouseInGui(q)then rightClickMenu(t.Object)end end)z.Parent=listFrame end z.Visible=true local q=C.Object if C.Object~=HiddenEntriesMain then if#C==0 then z.IndentFrame.Expand.Visible=false elseif C.Expanded then Icon(z.IndentFrame.Expand,NODE_EXPANDED)z.IndentFrame.Expand.Visible=true else Icon(z.IndentFrame.Expand,NODE_COLLAPSED)z.IndentFrame.Expand.Visible=true end else if C.HiddenExpanded then Icon(z.IndentFrame.Expand,NODE_EXPANDED)z.IndentFrame.Expand.Visible=true else Icon(z.IndentFrame.Expand,NODE_COLLAPSED)z.IndentFrame.Expand.Visible=true end end if q~=HiddenEntriesMain then z.IndentFrame.EntryText.Position=UDim2_new(0,(2+ENTRY_SIZE)+4,0,0)z.IndentFrame.ExplorerIcon.Visible=true ClassIcon(z.IndentFrame.ExplorerIcon,ClassIndex[q.ClassName]or 0)else z.IndentFrame.EntryText.Position=UDim2_new(0,0,0,0)z.IndentFrame.ExplorerIcon.Visible=false end local d=C.Depth*((2+ENTRY_PADDING)+GUI_SIZE)z.IndentFrame.Position=UDim2_new(0,d,0,0)z.IndentFrame.Size=UDim2_new(1,-d,1,0)NameHiddenEntries()if e[z]then e[z]:disconnect()end local H=z.IndentFrame.EntryText H.Text=q.Name e[z]=C.Object.Changed:connect(function(t)if t=="\078\097\109\101"then H.Text=q.Name end end)z.IndentFrame.Transparency=C.Selected and 0 or 1 H.TextColor3=GuiColor[C.Selected and"\084\101\120\116\083\101\108\101\099\116\101\100"or"\084\101\120\116"]z.Size=UDim2_new(0,E,0,ENTRY_SIZE)elseif n[g]then n[g].Visible=false end end for t=W.VisibleSpace+1,W.TotalSpace,1 do local E=n[t]if E then n[t]=nil E:Destroy()end end end function scrollBarH.UpdateCallback(t)for t=1,scrollBar.VisibleSpace,1 do local E=TreeList[t+scrollBar.ScrollIndex]if E then local E=n[t]if E then E.Position=UDim2_new(0,2-scrollBarH.ScrollIndex,0,ENTRY_BOUND*(t-1)+2)end end end end Connect(listFrame.Changed,function(t)if t=="\065\098\115\111\108\117\116\101\083\105\122\101"then g()end end)local q=6 explorerPanel.MouseWheelForward:connect(function()if scrollBar.VisibleSpace-1>q then scrollBar:ScrollTo(scrollBar.ScrollIndex-q)else scrollBar:ScrollTo(scrollBar.ScrollIndex-scrollBar.VisibleSpace)end end)explorerPanel.MouseWheelBackward:connect(function()if scrollBar.VisibleSpace-1>q then scrollBar:ScrollTo(scrollBar.ScrollIndex+q)else scrollBar:ScrollTo(scrollBar.ScrollIndex+scrollBar.VisibleSpace)end end)end

local NodeLookup = {}

local nodeWidth = 0

local QuickButtons = {}

function filteringWorkspace()
	if explorerFilter.Text ~= "" and explorerFilter.Text ~= "Filter workspace..." then
		return true
	end
	return false
end

function lookForAName(obj,name)
	for i,v in pairs(obj:GetChildren()) do
		if string.find(string.lower(v.Name),string.lower(name)) then nameScanned = true end
		lookForAName(v,name)
	end
end

function scanName(obj)
	nameScanned = false
	if string.find(string.lower(obj.Name),string.lower(explorerFilter.Text)) then
		nameScanned = true
	else
		lookForAName(obj,explorerFilter.Text)
	end
	return nameScanned
end

function updateActions()
	for i,v in pairs(QuickButtons) do
		if v.Cond() then
			v.Toggle(true)
		else
			v.Toggle(false)
		end
	end
end

local updateList,rawUpdateList,updateScroll,rawUpdateSize do
	local function r(t)
		for i, v in ipairs(t) do
			if not filteringWorkspace() or scanName(v.Object) then
				if t.Object == game then
					if childrenGame[v.Object] then
						table.insert(TreeList, v)

						local w = (v.Depth)*(2+ENTRY_PADDING+GUI_SIZE) + 2 + ENTRY_SIZE + 4 + getTextWidth(v.Object.Name) + 4
						if w > nodeWidth then
							nodeWidth = w
						end
						if v.Expanded or filteringWorkspace() then
							r(v)
						end
					end
				else
					table.insert(TreeList, v)

					local w = (v.Depth)*(2+ENTRY_PADDING+GUI_SIZE) + 2 + ENTRY_SIZE + 4 + getTextWidth(v.Object.Name) + 4
					if w > nodeWidth then
						nodeWidth = w
					end
					if v.Expanded or filteringWorkspace() then
						r(v)
					end
				end
			end
		end
	end

	function rawUpdateSize()
		scrollBarH.TotalSpace = nodeWidth
		scrollBarH.VisibleSpace = listFrame.AbsoluteSize.x
		scrollBarH:Update()
		local visible = scrollBarH:CanScrollDown() or scrollBarH:CanScrollUp()
		scrollBarH.GUI.Visible = visible

		listFrame.Size = UDim2_new(1,-GUI_SIZE,1,-GUI_SIZE*(visible and 1 or 0) - HEADER_SIZE)

		scrollBar.VisibleSpace = math.ceil(listFrame.AbsoluteSize.y/ENTRY_BOUND)
		scrollBar.GUI.Size = UDim2_new(0,GUI_SIZE,1,-GUI_SIZE*(visible and 1 or 0) - HEADER_SIZE)

		scrollBar.TotalSpace = #TreeList+1
		scrollBar:Update()
	end
	function rawUpdateList()
		-- Clear then repopulate the entire list. It appears to be fast enough.
		table.clear(TreeList)
		nodeWidth = 0
		r(NodeLookup[game])
		r(NodeLookup[DexOutput])
		r(NodeLookup[HiddenEntries])
		r(NodeLookup[HiddenGame])
		rawUpdateSize()
		updateActions()
	end

	-- Adding or removing large models will cause many updates to occur. We
	-- can reduce the number of updates by creating a delay, then dropping any
	-- updates that occur during the delay.
	local updatingList = false
	function updateList()
		if updatingList then return end
		updatingList = true
		wait(0.25)
		updatingList = false
		rawUpdateList()
	end

	local updatingScroll = false
	function updateScroll()
		if updatingScroll then return end
		updatingScroll = true
		wait(0.25)
		updatingScroll = false
		scrollBar:Update()
	end
end

local Selection do
	local bindGetSelection = explorerPanel:FindFirstChild("GetSelection")
	if not bindGetSelection then
		bindGetSelection = Create('BindableFunction',{Name = "GetSelection"})
		bindGetSelection.Parent = explorerPanel
	end

	local bindSetSelection = explorerPanel:FindFirstChild("SetSelection")
	if not bindSetSelection then
		bindSetSelection = Create('BindableFunction',{Name = "SetSelection"})
		bindSetSelection.Parent = explorerPanel
	end

	local bindSelectionChanged = explorerPanel:FindFirstChild("SelectionChanged")
	if not bindSelectionChanged then
		bindSelectionChanged = Create('BindableEvent',{Name = "SelectionChanged"})
		bindSelectionChanged.Parent = explorerPanel
	end

	local SelectionList = {}
	local SelectionSet = {}
	local Updates = true
	Selection = {
		Selected = SelectionSet;
		List = SelectionList;
	}

	local function addObject(object)
		-- list update
		local lupdate = false
		-- scroll update
		local supdate = false

		if not SelectionSet[object] then
			local node = NodeLookup[object]
			if node then
				table.insert(SelectionList,object)
				SelectionSet[object] = true
				node.Selected = true

				-- expand all ancestors so that selected node becomes visible
				node = node.Parent
				while node do
					if not node.Expanded then
						node.Expanded = true
						lupdate = true
					end
					node = node.Parent
				end
				supdate = true
			end
		end
		return lupdate,supdate
	end

	Selection.Finding = false
	Selection.Found = {}

	function Selection:Set(objects)
		if Selection.Finding then
			Selection.Found = objects
		end

		local lupdate = false
		local supdate = false

		if #SelectionList > 0 then
			for i = 1,#SelectionList do
				local object = SelectionList[i]
				local node = NodeLookup[object]
				if node then
					node.Selected = false
					SelectionSet[object] = nil
				end
			end

			SelectionList = {}
			Selection.List = SelectionList
			supdate = true
		end

		for i = 1,#objects do
			local l,s = addObject(objects[i])
			lupdate = l or lupdate
			supdate = s or supdate
		end

		if lupdate then
			rawUpdateList()
			supdate = true
		elseif supdate then
			scrollBar:Update()
		end

		if supdate then
			bindSelectionChanged:Fire()
			updateActions()
		end
	end

	function Selection:Add(object)
		local l,s = addObject(object)
		if l then
			rawUpdateList()
			if Updates then
				bindSelectionChanged:Fire()
				updateActions()
			end
		elseif s then
			scrollBar:Update()
			if Updates then
				bindSelectionChanged:Fire()
				updateActions()
			end
		end
	end

	function Selection:StopUpdates()
		Updates = false
	end

	function Selection:ResumeUpdates()
		Updates = true
		bindSelectionChanged:Fire()
		updateActions()
	end

	function Selection:Remove(object,noupdate)
		if SelectionSet[object] then
			local node = NodeLookup[object]
			if node then
				node.Selected = false
				SelectionSet[object] = nil
				for i = 1,#SelectionList do
					if SelectionList[i] == object then
						table.remove(SelectionList,i)
						break
					end
				end

				if not noupdate then
					scrollBar:Update()
				end
				bindSelectionChanged:Fire()
				updateActions()
			end
		end
	end

	function Selection:Get()
		local list = {}
		for i = 1,#SelectionList do
			if SelectionList[i] ~= HiddenEntriesMain and SelectionList[i] ~= DexOutputMain then
				table.insert(list, SelectionList[i])
			end
		end
		return list
	end

	bindSetSelection.OnInvoke = function(...)
		Selection:Set(...)
	end

	bindGetSelection.OnInvoke = function()
		return Selection:Get()
	end
end

function CreateCaution(title,msg)
	local newCaution = CautionWindow
	newCaution.Visible = true
	newCaution.Title.Text = title
	newCaution.MainWindow.Desc.Text = msg
	newCaution.MainWindow.Ok.MouseButton1Up:connect(function()
		newCaution.Visible = false
	end)
end

function CreateTableCaution(title,msg)
	if type(msg) ~= "table" then return CreateCaution(title,tostring(msg)) end
	local newCaution = TableCautionWindow:Clone()
	newCaution.Title.Text = title

	local TableList = newCaution.MainWindow.TableResults
	local TableTemplate = newCaution.MainWindow.TableTemplate

	for i,v in pairs(msg) do
		local newResult = TableTemplate:Clone()
		newResult.Type.Text = type(v)
		newResult.Value.Text = tostring(v)
		newResult.Position = UDim2_new(0,0,0,#TableList:GetChildren() * 20)
		newResult.Parent = TableList
		TableList.CanvasSize = UDim2_new(0,0,0,#TableList:GetChildren() * 20)
		newResult.Visible = true
	end
	newCaution.Parent = explorerPanel.Parent
	newCaution.Visible = true
	newCaution.MainWindow.Ok.MouseButton1Up:connect(function()
		newCaution:Destroy()
	end)
end

local function Split(str, delimiter)
	local start = 1
	local t = {}
	while true do
		local pos = string.find (str, delimiter, start, true)
		if not pos then
			break
		end
		table.insert (t, string.sub (str, start, pos - 1))
		start = pos + string.len (delimiter)
	end
	table.insert (t, string.sub (str, start))
	return t
end

local function ToValue(value,type)
	if type == "Vector2" then
		local list = Split(value,",")
		if #list < 2 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		return Vector2_new(x,y)
	elseif type == "Vector3" then
		local list = Split(value,",")
		if #list < 3 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		local z = tonumber(list[3]) or 0
		return Vector3_new(x,y,z)
	elseif type == "Color3" then
		local list = Split(value,",")
		if #list < 3 then return nil end
		local r = tonumber(list[1]) or 0
		local g = tonumber(list[2]) or 0
		local b = tonumber(list[3]) or 0
		return Color3_new(r/255,g/255, b/255)
	elseif type == "UDim2" then
		local list = Split(string.gsub(string.gsub(value, "{", ""),"}",""),",")
		if #list < 4 then return nil end
		local xScale = tonumber(list[1]) or 0
		local xOffset = tonumber(list[2]) or 0
		local yScale = tonumber(list[3]) or 0
		local yOffset = tonumber(list[4]) or 0
		return UDim2_new(xScale, xOffset, yScale, yOffset)
	elseif type == "Number" then
		return tonumber(value)
	elseif type == "String" then
		return value
	elseif type == "NumberRange" then
		local list = Split(value,",")
		if #list == 1 then
			if tonumber(list[1]) == nil then return nil end
			local newVal = tonumber(list[1]) or 0
			return NumberRange.new(newVal)
		end
		if #list < 2 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		return NumberRange.new(x,y)
	elseif type == "Script" then
		local success,err = pcall(function()
			--return loadstring("return "..tostring(value), "?")()
		end)
		if err then
			return nil
		end
	else
		return nil
	end
end

local function ToPropValue(value,type)
	if type == "Vector2" then
		local list = Split(value,",")
		if #list < 2 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		return Vector2_new(x,y)
	elseif type == "Vector3" then
		local list = Split(value,",")
		if #list < 3 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		local z = tonumber(list[3]) or 0
		return Vector3_new(x,y,z)
	elseif type == "Color3" then
		local list = Split(value,",")
		if #list < 3 then return nil end
		local r = tonumber(list[1]) or 0
		local g = tonumber(list[2]) or 0
		local b = tonumber(list[3]) or 0
		return Color3_new(r/255,g/255, b/255)
	elseif type == "UDim2" then
		local list = Split(string.gsub(string.gsub(value, "{", ""),"}",""),",")
		if #list < 4 then return nil end
		local xScale = tonumber(list[1]) or 0
		local xOffset = tonumber(list[2]) or 0
		local yScale = tonumber(list[3]) or 0
		local yOffset = tonumber(list[4]) or 0
		return UDim2_new(xScale, xOffset, yScale, yOffset)
	elseif type == "Content" then
		return value
	elseif type == "float" or type == "int" or type == "double" then
		return tonumber(value)
	elseif type == "string" then
		return value
	elseif type == "NumberRange" then
		local list = Split(value,",")
		if #list == 1 then
			if tonumber(list[1]) == nil then return nil end
			local newVal = tonumber(list[1]) or 0
			return NumberRange.new(newVal)
		end
		if #list < 2 then return nil end
		local x = tonumber(list[1]) or 0
		local y = tonumber(list[2]) or 0
		return NumberRange.new(x,y)
	elseif string.sub(value,1,4) == "Enum" then
		local getEnum = value
		while true do
			local x,y = string.find(getEnum,".")
			if y then
				getEnum = string.sub(getEnum,y+1)
			else
				break
			end
		end
		print(getEnum)
		return getEnum
	else
		return nil
	end
end

function PromptCaller(inst)
	if CurrentRemoteWindow then
		CurrentRemoteWindow:Destroy()
		CurrentRemoteWindow = nil
	end
	CurrentRemoteWindow = RemoteWindow:Clone()
	CurrentRemoteWindow.Parent = explorerPanel.Parent
	CurrentRemoteWindow.Visible = true

	local displayValues = false

	local ArgumentList = CurrentRemoteWindow.MainWindow.Arguments
	local ArgumentTemplate = CurrentRemoteWindow.MainWindow.ArgumentTemplate

	if inst:IsA("RemoteEvent") or inst:IsA("BindableEvent") then
		CurrentRemoteWindow.Title.Text = "Fire Event"
		CurrentRemoteWindow.MainWindow.Ok.Text = "Fire"
		CurrentRemoteWindow.MainWindow.DisplayReturned.Visible = false
		CurrentRemoteWindow.MainWindow.Desc2.Visible = false
	end

	if inst:IsA("RemoteEvent") or inst:IsA("RemoteFunction") then
		local newArgument = ArgumentTemplate:Clone()
		newArgument.Parent = ArgumentList
		newArgument.Visible = true
		newArgument.Type.Text = "UserNameToFire"
	end

	local newArgument = ArgumentTemplate:Clone()
	if inst:IsA("RemoteEvent") or inst:IsA("RemoteFunction") then
		newArgument.Position = UDim2_new(0,0,0,20)
		ArgumentList.CanvasSize = UDim2_new(0,0,0,40)
	end
	newArgument.Parent = ArgumentList
	newArgument.Visible = true
	newArgument.Type.MouseButton1Down:connect(function()
		createDDown(newArgument.Type,function(choice)
			newArgument.Type.Text = choice
		end,"Script","Number","String","Color3","Vector3","Vector2","UDim2","NumberRange")
	end)

	CurrentRemoteWindow.MainWindow.Ok.MouseButton1Up:connect(function()
		if CurrentRemoteWindow and inst.Parent ~= nil then
			local MyArguments = {}
			for i,v in pairs(ArgumentList:GetChildren()) do
				if inst:IsA("RemoteFunction") or inst:IsA("RemoteEvent") and i == 1 then
					local Players = game:GetService("Players")
					if Players:FindFirstChild(v.Value.Text) then
						table.insert(MyArguments,Players[v.Value.Text])
					else
						CreateCaution("Remote Caller","The username defined is not in-game.")
						return
					end
				end
				table.insert(MyArguments,ToValue(v.Value.Text,v.Type.Text))
			end
			if inst:IsA("RemoteFunction") or inst:IsA("RemoteEvent") then
				if displayValues then
					spawn(function()
						local myResults = RemoteEvent:InvokeServer("CallRemote",inst,MyArguments)
						if myResults then
							CreateTableCaution("Remote Caller",myResults)
						else
							CreateCaution("Remote Caller","This remote did not return anything.")
						end
					end)
				else
					spawn(function()
						RemoteEvent:InvokeServer("CallRemote",inst,MyArguments)
					end)
				end
			else
				RemoteEvent:InvokeServer("CallRemote",inst,MyArguments)
			end
			CurrentRemoteWindow:Destroy()
			CurrentRemoteWindow = nil
		end
	end)

	CurrentRemoteWindow.MainWindow.Add.MouseButton1Up:connect(function()
		if CurrentRemoteWindow then
			local newArgument = ArgumentTemplate:Clone()
			newArgument.Position = UDim2_new(0,0,0,#ArgumentList:GetChildren() * 20)
			newArgument.Parent = ArgumentList
			ArgumentList.CanvasSize = UDim2_new(0,0,0,#ArgumentList:GetChildren() * 20)
			newArgument.Visible = true
			newArgument.Type.MouseButton1Down:connect(function()
				createDDown(newArgument.Type,function(choice)
					newArgument.Type.Text = choice
				end,"Script","Number","String","Color3","Vector3","Vector2","UDim2","NumberRange")
			end)
		end
	end)

	CurrentRemoteWindow.MainWindow.Subtract.MouseButton1Up:connect(function()
		if CurrentRemoteWindow then
			if (inst:IsA("RemoteFunction") or inst:IsA("RemoteEvent")) and #ArgumentList:GetChildren() > 2 then
				ArgumentList:GetChildren()[#ArgumentList:GetChildren()]:Destroy()
				ArgumentList.CanvasSize = UDim2_new(0,0,0,#ArgumentList:GetChildren() * 20)
			elseif inst:IsA("RemoteFunction") == false and inst:IsA("RemoteEvent") == false and #ArgumentList:GetChildren() > 1 then
				ArgumentList:GetChildren()[#ArgumentList:GetChildren()]:Destroy()
				ArgumentList.CanvasSize = UDim2_new(0,0,0,#ArgumentList:GetChildren() * 20)
			end
		end
	end)

	CurrentRemoteWindow.MainWindow.Cancel.MouseButton1Up:connect(function()
		if CurrentRemoteWindow then
			CurrentRemoteWindow:Destroy()
			CurrentRemoteWindow = nil
		end
	end)

	CurrentRemoteWindow.MainWindow.DisplayReturned.MouseButton1Up:connect(function()
		if displayValues then
			displayValues = false
			CurrentRemoteWindow.MainWindow.DisplayReturned.enabled.Visible = false
		else
			displayValues = true
			CurrentRemoteWindow.MainWindow.DisplayReturned.enabled.Visible = true
		end
	end)
end

function DestroyRightClick()
	if currentRightClickMenu then
		currentRightClickMenu:Destroy()
		currentRightClickMenu = nil
	end
	if CurrentInsertObjectWindow and CurrentInsertObjectWindow.Visible then
		CurrentInsertObjectWindow.Visible = false
	end
end

function rightClickMenu(sObj)
	local mouse = game:GetService("Players").LocalPlayer:GetMouse()

	currentRightClickMenu = CreateRightClickMenu(
		{"Cut","Copy","Paste Into","Duplicate","Delete",false,"Group","Ungroup","Select Children",false,"Teleport To","Call Function","Call Remote/Bindable",false,"Insert Part","Insert Object",false},
		"",
		false,
		function(option)
			if option == "Cut" then
				if not Option.Modifiable then return end
				clipboard = {}
				RemoteEvent:InvokeServer("ClearClipboard")
				local list = Selection.List
				local cut = {}
				for i = 1,#list do
					local _, obj = pcall(function() return list[i]:Clone() end)
					if obj then
						table.insert(clipboard,obj)
						table.insert(cut,list[i])
						RemoteEvent:InvokeServer("Copy", list[i])
					end
				end
				for i = 1,#cut do
					pcall(delete,cut[i])
				end
				updateActions()
			elseif option == "Copy" then
				if not Option.Modifiable then return end
				clipboard = {}
				RemoteEvent:InvokeServer("ClearClipboard")
				local list = Selection.List
				for i = 1,#list do
					local _, obj = pcall(function() return list[i]:Clone() end)
					if obj then
						table.insert(clipboard,obj)
					end

					RemoteEvent:InvokeServer("Copy", list[i])
				end
				updateActions()
			elseif option == "Paste Into" then
				if not Option.Modifiable then return end
				local parent = Selection.List[1] or workspace
				if not RemoteEvent:InvokeServer("Paste", parent) then
					for i = 1,#clipboard do
						if (clipboard[i]) then
							pcall(function()
								clipboard[i]:Clone().Parent = parent
							end)
						end
					end
				end
			elseif option == "Duplicate" then
				if not Option.Modifiable then return end
				local list = Selection:Get()
				local parent = Selection.List[1].Parent or workspace;
				for i = 1,#list do
					if not RemoteEvent:InvokeServer("Duplicate", list[i], parent) then -- scel was here again hi
						local _, obj = pcall(function() return list[i]:Clone() end)

						if obj then
							obj.Parent = parent;
						end
					end
				end
			elseif option == "Delete" then
				if not Option.Modifiable then return end
				local list = Selection:Get()
				for i = 1,#list do
					pcall(delete,list[i])
				end
				Selection:Set({})
			elseif option == "Group" then
				if not Option.Modifiable then return end
				local parent = Selection.List[1].Parent or workspace
				local newModel = RemoteEvent:InvokeServer("InstanceNew", "Model", {Parent = parent}) or Instance_new("Model")
				local list = Selection:Get()
				newModel.Parent = parent
				for i = 1,#list do
					list[i].Parent = newModel
					RemoteEvent:InvokeServer("SetProperty", list[i], "Parent", newModel)
				end
				Selection:Set({})
			elseif option == "Ungroup" then
				if not Option.Modifiable then return end
				local ungrouped = {}
				local list = Selection:Get()
				for i = 1,#list do
					if list[i]:IsA("Model") then
						for i2,v2 in pairs(list[i]:GetChildren()) do
							v2.Parent = list[i].Parent or workspace
							table.insert(ungrouped,v2)
							RemoteEvent:InvokeServer("SetProperty", v2, "Parent", list[i].Parent or workspace)
						end
						pcall(delete,list[i])
					end
				end
				Selection:Set({})
				if SettingsRemote:Invoke("SelectUngrouped") then
					for i,v in pairs(ungrouped) do
						Selection:Add(v)
					end
				end
			elseif option == "Select Children" then
				if not Option.Modifiable then return end
				local list = Selection:Get()
				Selection:Set({})
				Selection:StopUpdates()
				for i = 1,#list do
					for i2,v2 in pairs(list[i]:GetChildren()) do
						Selection:Add(v2)
					end
				end
				Selection:ResumeUpdates()
			elseif option == "Teleport To" then
				if not Option.Modifiable then return end
				local list = Selection:Get()
				for i = 1,#list do
					if list[i]:IsA("BasePart") then
						pcall(function()
							game:GetService("Players").LocalPlayer.Character.HumanoidRootPart.CFrame = list[i].CFrame
						end)
						break
					end
				end
			elseif option == "Insert Part" then
				if not Option.Modifiable then return end
				local insertedParts = {}
				local list = Selection:Get()
				for i = 1,#list do
					pcall(function()
						local props = {}
						props.Parent = list[i]
						props.CFrame = CFrame_new(game:GetService("Players").LocalPlayer.Character.Head.Position) + Vector3_new(0,3,0)

						local newPart = RemoteEvent:InvokeServer("InstanceNew", "Part", props) or Instance_new("Part")
						newPart.Parent = props.Parent;
						newPart.CFrame = props.CFrame;
						table.insert(insertedParts,newPart)
					end)
				end
			elseif option == "Call Remote/Bindable" then
				if not Option.Modifiable then return end
				local list = Selection:Get()
				for i = 1,#list do
					if list[i]:IsA("RemoteFunction") or list[i]:IsA("RemoteEvent") or list[i]:IsA("BindableFunction") or list[i]:IsA("BindableEvent") then
						PromptCaller(list[i])
						break
					end
				end
			end
		end)
	currentRightClickMenu.Parent = explorerPanel.Parent
	currentRightClickMenu.Position = UDim2_new(0,mouse.X,0,mouse.Y)
	if currentRightClickMenu.AbsolutePosition.X + currentRightClickMenu.AbsoluteSize.X > explorerPanel.AbsolutePosition.X + explorerPanel.AbsoluteSize.X then
		currentRightClickMenu.Position = UDim2_new(0, explorerPanel.AbsolutePosition.X + explorerPanel.AbsoluteSize.X - currentRightClickMenu.AbsoluteSize.X, 0, mouse.Y)
	end
end

local function cancelReparentDrag()end
local function cancelSelectDrag()end
do
	local listEntries = {}
	local nameConnLookup = {}

	local mouseDrag = Create('ImageButton',{
		Name = "MouseDrag";
		Position = UDim2_new(-0.25,0,-0.25,0);
		Size = UDim2_new(1.5,0,1.5,0);
		Transparency = 1;
		AutoButtonColor = false;
		Active = true;
		ZIndex = 10;
	})
	local function dragSelect(last,add,button)
		local connDrag
		local conUp

		conDrag = mouseDrag.MouseMoved:connect(function(x,y)
			local pos = Vector2_new(x,y) - listFrame.AbsolutePosition
			local size = listFrame.AbsoluteSize
			if pos.x < 0 or pos.x > size.x or pos.y < 0 or pos.y > size.y then return end

			local i = math.ceil(pos.y/ENTRY_BOUND) + scrollBar.ScrollIndex
			-- Mouse may have made a large step, so interpolate between the
			-- last index and the current.
			for n = i<last and i or last, i>last and i or last do
				local node = TreeList[n]
				if node then
					if add then
						Selection:Add(node.Object)
					else
						Selection:Remove(node.Object)
					end
				end
			end
			last = i
		end)

		function cancelSelectDrag()
			mouseDrag.Parent = nil
			conDrag:disconnect()
			conUp:disconnect()
			function cancelSelectDrag()end
		end

		conUp = mouseDrag[button]:connect(cancelSelectDrag)

		mouseDrag.Parent = GetScreen(listFrame)
	end

	local function dragReparent(object,dragGhost,clickPos,ghostOffset)
		local connDrag
		local conUp
		local conUp2

		local parentIndex = nil
		local dragged = false

		local parentHighlight = Create('Frame',{
			Transparency = 1;
			Visible = false;
			Create('Frame',{
				BorderSizePixel = 0;
				BackgroundColor3 = Color3_new(0,0,0);
				BackgroundTransparency = 0.1;
				Position = UDim2_new(0,0,0,0);
				Size = UDim2_new(1,0,0,1);
			});
			Create('Frame',{
				BorderSizePixel = 0;
				BackgroundColor3 = Color3_new(0,0,0);
				BackgroundTransparency = 0.1;
				Position = UDim2_new(1,0,0,0);
				Size = UDim2_new(0,1,1,0);
			});
			Create('Frame',{
				BorderSizePixel = 0;
				BackgroundColor3 = Color3_new(0,0,0);
				BackgroundTransparency = 0.1;
				Position = UDim2_new(0,0,1,0);
				Size = UDim2_new(1,0,0,1);
			});
			Create('Frame',{
				BorderSizePixel = 0;
				BackgroundColor3 = Color3_new(0,0,0);
				BackgroundTransparency = 0.1;
				Position = UDim2_new(0,0,0,0);
				Size = UDim2_new(0,1,1,0);
			});
		})
		SetZIndex(parentHighlight,9)

		conDrag = mouseDrag.MouseMoved:connect(function(x,y)
			local dragPos = Vector2_new(x,y)
			if dragged then
				local pos = dragPos - listFrame.AbsolutePosition
				local size = listFrame.AbsoluteSize

				parentIndex = nil
				parentHighlight.Visible = false
				if pos.x >= 0 and pos.x <= size.x and pos.y >= 0 and pos.y <= size.y + ENTRY_SIZE*2 then
					local i = math.ceil(pos.y/ENTRY_BOUND-2)
					local node = TreeList[i + scrollBar.ScrollIndex]
					if node and node.Object ~= object and not object:IsAncestorOf(node.Object) then
						parentIndex = i
						local entry = listEntries[i]
						if entry then
							parentHighlight.Visible = true
							parentHighlight.Position = UDim2_new(0,1,0,entry.AbsolutePosition.y-listFrame.AbsolutePosition.y)
							parentHighlight.Size = UDim2_new(0,size.x-4,0,entry.AbsoluteSize.y)
						end
					end
				end

				dragGhost.Position = UDim2_new(0,dragPos.x+ghostOffset.x,0,dragPos.y+ghostOffset.y)
			elseif (clickPos-dragPos).magnitude > 8 then
				dragged = true
				SetZIndex(dragGhost,9)
				dragGhost.IndentFrame.Transparency = 0.25
				dragGhost.IndentFrame.EntryText.TextColor3 = GuiColor.TextSelected
				dragGhost.Position = UDim2_new(0,dragPos.x+ghostOffset.x,0,dragPos.y+ghostOffset.y)
				dragGhost.Parent = GetScreen(listFrame)
				parentHighlight.Parent = listFrame
			end
		end)

		function cancelReparentDrag()
			mouseDrag.Parent = nil
			conDrag:disconnect()
			conUp:disconnect()
			conUp2:disconnect()
			dragGhost:Destroy()
			parentHighlight:Destroy()
			function cancelReparentDrag()end
		end

		local wasSelected = Selection.Selected[object]
		if not wasSelected and Option.Selectable then
			Selection:Set({object})
		end

		conUp = mouseDrag.MouseButton1Up:connect(function()
			cancelReparentDrag()
			if dragged then
				if parentIndex then
					local parentNode = TreeList[parentIndex + scrollBar.ScrollIndex]
					if parentNode then
						parentNode.Expanded = true

						local parentObj = parentNode.Object
						local function parent(a,b)
							a.Parent = b
						end
						if Option.Selectable then
							local list = Selection.List
							for i = 1,#list do
								pcall(parent,list[i],parentObj)
							end
						else
							pcall(parent,object,parentObj)
						end
					end
				end
			else
				-- do selection click
				if wasSelected and Option.Selectable then
					Selection:Set({})
				end
			end
		end)
		conUp2 = mouseDrag.MouseButton2Down:connect(function()
			cancelReparentDrag()
		end)

		mouseDrag.Parent = GetScreen(listFrame)
	end

	local entryTemplate = Create('ImageButton',{
		Name = "Entry";
		Transparency = 1;
		AutoButtonColor = false;
		Position = UDim2_new(0,0,0,0);
		Size = UDim2_new(1,0,0,ENTRY_SIZE);
		Create('Frame',{
			Name = "IndentFrame";
			BackgroundTransparency = 1;
			BackgroundColor3 = GuiColor.Selected;
			BorderColor3 = GuiColor.BorderSelected;
			Position = UDim2_new(0,0,0,0);
			Size = UDim2_new(1,0,1,0);
			Create(Icon('ImageButton',0),{
				Name = "Expand";
				AutoButtonColor = false;
				Position = UDim2_new(0,-GUI_SIZE,0.5,-GUI_SIZE/2);
				Size = UDim2_new(0,GUI_SIZE,0,GUI_SIZE);
			});
			Create(ClassIcon(nil,0),{
				Name = "ExplorerIcon";
				Position = UDim2_new(0,2+ENTRY_PADDING,0.5,-GUI_SIZE/2);
				Size = UDim2_new(0,GUI_SIZE,0,GUI_SIZE);
			});
			Create('TextLabel',{
				Name = "EntryText";
				BackgroundTransparency = 1;
				TextColor3 = GuiColor.Text;
				TextXAlignment = 'Left';
				TextYAlignment = 'Center';
				Font = FONT;
				FontSize = FONT_SIZE;
				Text = "";
				Position = UDim2_new(0,2+ENTRY_SIZE+4,0,0);
				Size = UDim2_new(1,-2,1,0);
			});
		});
	})

	function scrollBar.UpdateCallback(self)
		for i = 1,self.VisibleSpace do
			local node = TreeList[i + self.ScrollIndex]
			if node then
				local entry = listEntries[i]
				if not entry then
					entry = Create(entryTemplate:Clone(),{
						Position = UDim2_new(0,2,0,ENTRY_BOUND*(i-1)+2);
						Size = UDim2_new(0,nodeWidth,0,ENTRY_SIZE);
						ZIndex = listFrame.ZIndex;
					})
					listEntries[i] = entry

					local expand = entry.IndentFrame.Expand
					expand.MouseEnter:connect(function()
						local node = TreeList[i + self.ScrollIndex]
						if #node > 0 then
							if node.Object ~= HiddenEntriesMain then
								if node.Expanded then
									Icon(expand,NODE_EXPANDED_OVER)
								else
									Icon(expand,NODE_COLLAPSED_OVER)
								end
							else
								if node.HiddenExpanded then
									Icon(expand,NODE_EXPANDED_OVER)
								else
									Icon(expand,NODE_COLLAPSED_OVER)
								end
							end
						end
					end)
					expand.MouseLeave:connect(function()
						pcall(function()
							local node = TreeList[i + self.ScrollIndex]
							if node.Object == HiddenEntriesMain then
								if node.HiddenExpanded then
									Icon(expand,NODE_EXPANDED)
								else
									Icon(expand,NODE_COLLAPSED)
								end
								return
							end
							if #node > 0 then
								if node.Expanded then
									Icon(expand,NODE_EXPANDED)
								else
									Icon(expand,NODE_COLLAPSED)
								end
							end
						end)
					end)

					local function radd(o,refresh,parent)
						addObject(o,refresh,parent)
						local s,children = pcall(function() return o:GetChildren() end, o)
						if s then
							for i = 1,#children do
								radd(children[i],refresh,o)
							end
						end
					end

					expand.MouseButton1Down:connect(function()
						local node = TreeList[i + self.ScrollIndex]
						if #node > 0 then
							if node.Object ~= HiddenEntriesMain then
								node.Expanded = not node.Expanded
							else
								if not MuteHiddenItems then
									NodeLookup[HiddenGame] = {
										Object = HiddenGame;
										Parent = nil;
										Index = 0;
										Expanded = true;
									}
								else
									for i,v in pairs(game:GetChildren()) do
										if not childrenGame[v] then
											radd(v, true, HiddenGame)
										end
									end
								end

								MuteHiddenItems = not MuteHiddenItems
								node.HiddenExpanded = not node.HiddenExpanded
							end
							if node.Object == explorerPanel.Parent and node.Expanded then
								CreateCaution("Warning", "Modifying the contents of this Instance could cause erratic or unstable behavior. Proceed with caution.")
							end
							-- use raw update so the list updates instantly
							rawUpdateList()
						end
					end)

					entry.MouseButton1Down:connect(function(x,y)
						local node = TreeList[i + self.ScrollIndex]
						DestroyRightClick()
						if GetAwaitRemote:Invoke() then
							bindSetAwaiting:Fire(node.Object)
							return
						end

						if node.Object == HiddenEntriesMain then
							return
						end

						if not HoldingShift then
							lastSelectedNode = i + self.ScrollIndex
						end

						if HoldingShift and not filteringWorkspace() then
							if lastSelectedNode then
								if i + self.ScrollIndex - lastSelectedNode > 0 then
									Selection:StopUpdates()
									for i2 = 1, i + self.ScrollIndex - lastSelectedNode do
										local newNode = TreeList[lastSelectedNode + i2]
										if newNode then
											Selection:Add(newNode.Object)
										end
									end
									Selection:ResumeUpdates()
								else
									Selection:StopUpdates()
									for i2 = i + self.ScrollIndex - lastSelectedNode, 1 do
										local newNode = TreeList[lastSelectedNode + i2]
										if newNode then
											Selection:Add(newNode.Object)
										end
									end
									Selection:ResumeUpdates()
								end
							end
							return
						end

						if HoldingCtrl then
							if Selection.Selected[node.Object] then
								Selection:Remove(node.Object)
							else
								Selection:Add(node.Object)
							end
							return
						end
						if Option.Modifiable then
							local pos = Vector2_new(x,y)
							dragReparent(node.Object,entry:Clone(),pos,entry.AbsolutePosition-pos)
						elseif Option.Selectable then
							if Selection.Selected[node.Object] then
								Selection:Set({})
							else
								Selection:Set({node.Object})
							end
							dragSelect(i+self.ScrollIndex,true,'MouseButton1Up')
						end
					end)

					local curSelect
					entry.MouseButton2Down:connect(function()
						if not Option.Selectable then return end

						DestroyRightClick()

						curSelect = entry

						local node = TreeList[i + self.ScrollIndex]

						if node.Object == HiddenEntriesMain then
							return
						end

						if GetAwaitRemote:Invoke() then
							bindSetAwaiting:Fire(node.Object)
							return
						end

						if not Selection.Selected[node.Object] then
							Selection:Set({node.Object})
						end
					end)


					entry.MouseButton2Up:connect(function()
						if not Option.Selectable then return end

						local node = TreeList[i + self.ScrollIndex]

						if node.Object == HiddenEntriesMain then
							return
						end

						if checkMouseInGui(curSelect) then
							rightClickMenu(node.Object)
						end
					end)

					entry.Parent = listFrame
				end

				entry.Visible = true

				local object = node.Object

				-- update expand icon
				if node.Object ~= HiddenEntriesMain then
					if #node == 0 then
						entry.IndentFrame.Expand.Visible = false
					elseif node.Expanded then
						Icon(entry.IndentFrame.Expand,NODE_EXPANDED)
						entry.IndentFrame.Expand.Visible = true
					else
						Icon(entry.IndentFrame.Expand,NODE_COLLAPSED)
						entry.IndentFrame.Expand.Visible = true
					end
				else
					if node.HiddenExpanded then
						Icon(entry.IndentFrame.Expand,NODE_EXPANDED)
						entry.IndentFrame.Expand.Visible = true
					else
						Icon(entry.IndentFrame.Expand,NODE_COLLAPSED)
						entry.IndentFrame.Expand.Visible = true
					end
				end

				-- update explorer icon
				if object ~= HiddenEntriesMain then
					entry.IndentFrame.EntryText.Position = UDim2_new(0,2+ENTRY_SIZE+4,0,0);
					entry.IndentFrame.ExplorerIcon.Visible = true
					ClassIcon(entry.IndentFrame.ExplorerIcon,ClassIndex[object.ClassName] or 0)
				else
					entry.IndentFrame.EntryText.Position = UDim2_new(0,0,0,0);
					entry.IndentFrame.ExplorerIcon.Visible = false
				end

				-- update indentation
				local w = (node.Depth)*(2+ENTRY_PADDING+GUI_SIZE)
				entry.IndentFrame.Position = UDim2_new(0,w,0,0)
				entry.IndentFrame.Size = UDim2_new(1,-w,1,0)

				-- update hidden entries name
				NameHiddenEntries()

				-- update name change detection
				if nameConnLookup[entry] then
					nameConnLookup[entry]:disconnect()
				end
				local text = entry.IndentFrame.EntryText
				text.Text = object.Name
				nameConnLookup[entry] = node.Object.Changed:connect(function(p)
					if p == 'Name' then
						text.Text = object.Name
					end
				end)

				-- update selection
				entry.IndentFrame.Transparency = node.Selected and 0 or 1
				text.TextColor3 = GuiColor[node.Selected and 'TextSelected' or 'Text']

				entry.Size = UDim2_new(0,nodeWidth,0,ENTRY_SIZE)
			elseif listEntries[i] then
				listEntries[i].Visible = false
			end
		end
		for i = self.VisibleSpace+1,self.TotalSpace do
			local entry = listEntries[i]
			if entry then
				listEntries[i] = nil
				entry:Destroy()
			end
		end
	end

	function scrollBarH.UpdateCallback(self)
		for i = 1,scrollBar.VisibleSpace do
			local node = TreeList[i + scrollBar.ScrollIndex]
			if node then
				local entry = listEntries[i]
				if entry then
					entry.Position = UDim2_new(0,2 - scrollBarH.ScrollIndex,0,ENTRY_BOUND*(i-1)+2)
				end
			end
		end
	end

	Connect(listFrame.Changed,function(p)
		if p == 'AbsoluteSize' then
			rawUpdateSize()
		end
	end)

	local wheelAmount = 6
	explorerPanel.MouseWheelForward:connect(function()
		if scrollBar.VisibleSpace - 1 > wheelAmount then
			scrollBar:ScrollTo(scrollBar.ScrollIndex - wheelAmount)
		else
			scrollBar:ScrollTo(scrollBar.ScrollIndex - scrollBar.VisibleSpace)
		end
	end)
	explorerPanel.MouseWheelBackward:connect(function()
		if scrollBar.VisibleSpace - 1 > wheelAmount then
			scrollBar:ScrollTo(scrollBar.ScrollIndex + wheelAmount)
		else
			scrollBar:ScrollTo(scrollBar.ScrollIndex + scrollBar.VisibleSpace)
		end
	end)
end
