From c45ff4dd4f07ffcf266eca8abfe3a62384f37402 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Mon, 12 Jun 2017 12:10:22 -0400 Subject: [PATCH 01/10] Add multiple cursor support This commit creates new keybindings and actions to handle multiple cursors. Here are the defaults: "Alt-n": "SpawnMultiCursor", "Alt-p": "RemoveMultiCursor", "Alt-c": "RemoveAllMultiCursors", "Alt-x": "SkipMultiCursor", --- cmd/micro/actions.go | 109 +++++++++++++++++++++++++- cmd/micro/bindings.go | 173 ++++++++++++++++++++++------------------- cmd/micro/buffer.go | 5 +- cmd/micro/messenger.go | 6 +- cmd/micro/view.go | 128 +++++++++++++++++++----------- 5 files changed, 289 insertions(+), 132 deletions(-) diff --git a/cmd/micro/actions.go b/cmd/micro/actions.go index d8e7991c..3a7050db 100644 --- a/cmd/micro/actions.go +++ b/cmd/micro/actions.go @@ -1829,7 +1829,112 @@ func (v *View) PlayMacro(usePlugin bool) bool { return true } -// None is no action -func None() bool { +func (v *View) SpawnMultiCursor(usePlugin bool) bool { + spawner := v.Buf.cursors[len(v.Buf.cursors)-1] + // You can only spawn a cursor from the main cursor + if v.Cursor == spawner { + if usePlugin && !PreActionCall("SpawnMultiCursor", v) { + return false + } + + if !spawner.HasSelection() { + spawner.SelectWord() + } else { + c := &Cursor{ + buf: v.Buf, + } + + sel := spawner.GetSelection() + + searchStart = ToCharPos(spawner.CurSelection[1], v.Buf) + v.Cursor = c + Search(sel, v, true) + messenger.Message(v.Cursor.Loc) + + for _, cur := range v.Buf.cursors { + if c.Loc == cur.Loc { + return false + } + } + v.Buf.cursors = append(v.Buf.cursors, c) + v.Relocate() + v.Cursor = spawner + } + + if usePlugin { + PostActionCall("SpawnMultiCursor", v) + } + } + + return false +} + +func (v *View) SkipMultiCursor(usePlugin bool) bool { + cursor := v.Buf.cursors[len(v.Buf.cursors)-1] + + if v.Cursor == cursor { + messenger.Message("SKIP") + if usePlugin && !PreActionCall("SkipMultiCursor", v) { + return false + } + sel := cursor.GetSelection() + + searchStart = ToCharPos(cursor.CurSelection[1], v.Buf) + v.Cursor = cursor + Search(sel, v, true) + v.Relocate() + v.Cursor = cursor + + if usePlugin { + PostActionCall("SkipMultiCursor", v) + } + } + return false +} + +func (v *View) RemoveMultiCursor(usePlugin bool) bool { + end := len(v.Buf.cursors) + if end > 1 { + nextOne := v.Buf.cursors[len(v.Buf.cursors)-2] + if v.Cursor == nextOne { + if usePlugin && !PreActionCall("RemoveMultiCursor", v) { + return false + } + + if end > 1 { + v.Buf.cursors[end-1] = nil + v.Buf.cursors = v.Buf.cursors[:end-1] + } + v.Relocate() + + if usePlugin { + return PostActionCall("RemoveMultiCursor", v) + } + return true + } + } else { + v.RemoveAllMultiCursors(usePlugin) + } + return false +} + +func (v *View) RemoveAllMultiCursors(usePlugin bool) bool { + if v.Cursor == &v.Buf.Cursor { + if usePlugin && !PreActionCall("RemoveAllMultiCursors", v) { + return false + } + + for i := 1; i < len(v.Buf.cursors); i++ { + v.Buf.cursors[i] = nil + } + v.Buf.cursors = v.Buf.cursors[:1] + v.Cursor.ResetSelection() + v.Relocate() + + if usePlugin { + return PostActionCall("RemoveAllMultiCursors", v) + } + return true + } return false } diff --git a/cmd/micro/bindings.go b/cmd/micro/bindings.go index f18b2301..cb289d98 100644 --- a/cmd/micro/bindings.go +++ b/cmd/micro/bindings.go @@ -18,86 +18,90 @@ var mouseBindingActions = map[string]func(*View, bool, *tcell.EventMouse) bool{ } var bindingActions = map[string]func(*View, bool) bool{ - "CursorUp": (*View).CursorUp, - "CursorDown": (*View).CursorDown, - "CursorPageUp": (*View).CursorPageUp, - "CursorPageDown": (*View).CursorPageDown, - "CursorLeft": (*View).CursorLeft, - "CursorRight": (*View).CursorRight, - "CursorStart": (*View).CursorStart, - "CursorEnd": (*View).CursorEnd, - "SelectToStart": (*View).SelectToStart, - "SelectToEnd": (*View).SelectToEnd, - "SelectUp": (*View).SelectUp, - "SelectDown": (*View).SelectDown, - "SelectLeft": (*View).SelectLeft, - "SelectRight": (*View).SelectRight, - "WordRight": (*View).WordRight, - "WordLeft": (*View).WordLeft, - "SelectWordRight": (*View).SelectWordRight, - "SelectWordLeft": (*View).SelectWordLeft, - "DeleteWordRight": (*View).DeleteWordRight, - "DeleteWordLeft": (*View).DeleteWordLeft, - "SelectToStartOfLine": (*View).SelectToStartOfLine, - "SelectToEndOfLine": (*View).SelectToEndOfLine, - "InsertNewline": (*View).InsertNewline, - "InsertSpace": (*View).InsertSpace, - "Backspace": (*View).Backspace, - "Delete": (*View).Delete, - "InsertTab": (*View).InsertTab, - "Save": (*View).Save, - "SaveAll": (*View).SaveAll, - "SaveAs": (*View).SaveAs, - "Find": (*View).Find, - "FindNext": (*View).FindNext, - "FindPrevious": (*View).FindPrevious, - "Center": (*View).Center, - "Undo": (*View).Undo, - "Redo": (*View).Redo, - "Copy": (*View).Copy, - "Cut": (*View).Cut, - "CutLine": (*View).CutLine, - "DuplicateLine": (*View).DuplicateLine, - "DeleteLine": (*View).DeleteLine, - "MoveLinesUp": (*View).MoveLinesUp, - "MoveLinesDown": (*View).MoveLinesDown, - "IndentSelection": (*View).IndentSelection, - "OutdentSelection": (*View).OutdentSelection, - "OutdentLine": (*View).OutdentLine, - "Paste": (*View).Paste, - "PastePrimary": (*View).PastePrimary, - "SelectAll": (*View).SelectAll, - "OpenFile": (*View).OpenFile, - "Start": (*View).Start, - "End": (*View).End, - "PageUp": (*View).PageUp, - "PageDown": (*View).PageDown, - "HalfPageUp": (*View).HalfPageUp, - "HalfPageDown": (*View).HalfPageDown, - "StartOfLine": (*View).StartOfLine, - "EndOfLine": (*View).EndOfLine, - "ToggleHelp": (*View).ToggleHelp, - "ToggleRuler": (*View).ToggleRuler, - "JumpLine": (*View).JumpLine, - "ClearStatus": (*View).ClearStatus, - "ShellMode": (*View).ShellMode, - "CommandMode": (*View).CommandMode, - "Escape": (*View).Escape, - "Quit": (*View).Quit, - "QuitAll": (*View).QuitAll, - "AddTab": (*View).AddTab, - "PreviousTab": (*View).PreviousTab, - "NextTab": (*View).NextTab, - "NextSplit": (*View).NextSplit, - "PreviousSplit": (*View).PreviousSplit, - "Unsplit": (*View).Unsplit, - "VSplit": (*View).VSplitBinding, - "HSplit": (*View).HSplitBinding, - "ToggleMacro": (*View).ToggleMacro, - "PlayMacro": (*View).PlayMacro, - "Suspend": (*View).Suspend, - "ScrollUp": (*View).ScrollUpAction, - "ScrollDown": (*View).ScrollDownAction, + "CursorUp": (*View).CursorUp, + "CursorDown": (*View).CursorDown, + "CursorPageUp": (*View).CursorPageUp, + "CursorPageDown": (*View).CursorPageDown, + "CursorLeft": (*View).CursorLeft, + "CursorRight": (*View).CursorRight, + "CursorStart": (*View).CursorStart, + "CursorEnd": (*View).CursorEnd, + "SelectToStart": (*View).SelectToStart, + "SelectToEnd": (*View).SelectToEnd, + "SelectUp": (*View).SelectUp, + "SelectDown": (*View).SelectDown, + "SelectLeft": (*View).SelectLeft, + "SelectRight": (*View).SelectRight, + "WordRight": (*View).WordRight, + "WordLeft": (*View).WordLeft, + "SelectWordRight": (*View).SelectWordRight, + "SelectWordLeft": (*View).SelectWordLeft, + "DeleteWordRight": (*View).DeleteWordRight, + "DeleteWordLeft": (*View).DeleteWordLeft, + "SelectToStartOfLine": (*View).SelectToStartOfLine, + "SelectToEndOfLine": (*View).SelectToEndOfLine, + "InsertNewline": (*View).InsertNewline, + "InsertSpace": (*View).InsertSpace, + "Backspace": (*View).Backspace, + "Delete": (*View).Delete, + "InsertTab": (*View).InsertTab, + "Save": (*View).Save, + "SaveAll": (*View).SaveAll, + "SaveAs": (*View).SaveAs, + "Find": (*View).Find, + "FindNext": (*View).FindNext, + "FindPrevious": (*View).FindPrevious, + "Center": (*View).Center, + "Undo": (*View).Undo, + "Redo": (*View).Redo, + "Copy": (*View).Copy, + "Cut": (*View).Cut, + "CutLine": (*View).CutLine, + "DuplicateLine": (*View).DuplicateLine, + "DeleteLine": (*View).DeleteLine, + "MoveLinesUp": (*View).MoveLinesUp, + "MoveLinesDown": (*View).MoveLinesDown, + "IndentSelection": (*View).IndentSelection, + "OutdentSelection": (*View).OutdentSelection, + "OutdentLine": (*View).OutdentLine, + "Paste": (*View).Paste, + "PastePrimary": (*View).PastePrimary, + "SelectAll": (*View).SelectAll, + "OpenFile": (*View).OpenFile, + "Start": (*View).Start, + "End": (*View).End, + "PageUp": (*View).PageUp, + "PageDown": (*View).PageDown, + "HalfPageUp": (*View).HalfPageUp, + "HalfPageDown": (*View).HalfPageDown, + "StartOfLine": (*View).StartOfLine, + "EndOfLine": (*View).EndOfLine, + "ToggleHelp": (*View).ToggleHelp, + "ToggleRuler": (*View).ToggleRuler, + "JumpLine": (*View).JumpLine, + "ClearStatus": (*View).ClearStatus, + "ShellMode": (*View).ShellMode, + "CommandMode": (*View).CommandMode, + "Escape": (*View).Escape, + "Quit": (*View).Quit, + "QuitAll": (*View).QuitAll, + "AddTab": (*View).AddTab, + "PreviousTab": (*View).PreviousTab, + "NextTab": (*View).NextTab, + "NextSplit": (*View).NextSplit, + "PreviousSplit": (*View).PreviousSplit, + "Unsplit": (*View).Unsplit, + "VSplit": (*View).VSplitBinding, + "HSplit": (*View).HSplitBinding, + "ToggleMacro": (*View).ToggleMacro, + "PlayMacro": (*View).PlayMacro, + "Suspend": (*View).Suspend, + "ScrollUp": (*View).ScrollUpAction, + "ScrollDown": (*View).ScrollDownAction, + "SpawnMultiCursor": (*View).SpawnMultiCursor, + "RemoveMultiCursor": (*View).RemoveMultiCursor, + "RemoveAllMultiCursors": (*View).RemoveAllMultiCursors, + "SkipMultiCursor": (*View).SkipMultiCursor, // This was changed to InsertNewline but I don't want to break backwards compatibility "InsertEnter": (*View).InsertNewline, @@ -496,8 +500,8 @@ func DefaultBindings() map[string]string { "Alt-b": "WordLeft", "Alt-a": "StartOfLine", "Alt-e": "EndOfLine", - "Alt-p": "CursorUp", - "Alt-n": "CursorDown", + // "Alt-p": "CursorUp", + // "Alt-n": "CursorDown", // Integration with file managers "F1": "ToggleHelp", @@ -513,5 +517,10 @@ func DefaultBindings() map[string]string { "MouseWheelDown": "ScrollDown", "MouseLeft": "MousePress", "MouseMiddle": "PastePrimary", + + "Alt-n": "SpawnMultiCursor", + "Alt-p": "RemoveMultiCursor", + "Alt-c": "RemoveAllMultiCursors", + "Alt-x": "SkipMultiCursor", } } diff --git a/cmd/micro/buffer.go b/cmd/micro/buffer.go index bfbcbec4..ab3b18e4 100644 --- a/cmd/micro/buffer.go +++ b/cmd/micro/buffer.go @@ -28,7 +28,8 @@ type Buffer struct { // This stores all the text in the buffer as an array of lines *LineArray - Cursor Cursor + Cursor Cursor + cursors []*Cursor // for multiple cursors // Path to the file on disk Path string @@ -169,6 +170,8 @@ func NewBuffer(reader io.Reader, size int64, path string) *Buffer { file.Close() } + b.cursors = []*Cursor{&b.Cursor} + return b } diff --git a/cmd/micro/messenger.go b/cmd/micro/messenger.go index 3fda5368..6c212910 100644 --- a/cmd/micro/messenger.go +++ b/cmd/micro/messenger.go @@ -153,7 +153,7 @@ func (m *Messenger) YesNoPrompt(prompt string) (bool, bool) { for { m.Clear() m.Display() - screen.ShowCursor(Count(m.message), h-1) + ShowCursor(Count(m.message), h-1) screen.Show() event := <-events @@ -190,7 +190,7 @@ func (m *Messenger) LetterPrompt(prompt string, responses ...rune) (rune, bool) for { m.Clear() m.Display() - screen.ShowCursor(Count(m.message), h-1) + ShowCursor(Count(m.message), h-1) screen.Show() event := <-events @@ -470,7 +470,7 @@ func (m *Messenger) Display() { } if m.hasPrompt { - screen.ShowCursor(Count(m.message)+m.cursorx, h-1) + ShowCursor(Count(m.message)+m.cursorx, h-1) screen.Show() } } diff --git a/cmd/micro/view.go b/cmd/micro/view.go index e3675345..3813f8d9 100644 --- a/cmd/micro/view.go +++ b/cmd/micro/view.go @@ -499,9 +499,13 @@ func (v *View) HandleEvent(event tcell.Event) { } } if e.Modifiers() == key.modifiers { - relocate = false - isBinding = true - relocate = v.ExecuteActions(actions) + for _, c := range v.Buf.cursors { + v.Cursor = c + relocate = false + isBinding = true + relocate = v.ExecuteActions(actions) || relocate + } + v.Cursor = &v.Buf.Cursor break } } @@ -509,24 +513,29 @@ func (v *View) HandleEvent(event tcell.Event) { if !isBinding && e.Key() == tcell.KeyRune { // Check viewtype if readonly don't insert a rune (readonly help and log view etc.) if v.Type.readonly == false { - // Insert a character - if v.Cursor.HasSelection() { - v.Cursor.DeleteSelection() - v.Cursor.ResetSelection() - } - v.Buf.Insert(v.Cursor.Loc, string(e.Rune())) - v.Cursor.Right() + for _, c := range v.Buf.cursors { + v.Cursor = c - for pl := range loadedPlugins { - _, err := Call(pl+".onRune", string(e.Rune()), v) - if err != nil && !strings.HasPrefix(err.Error(), "function does not exist") { - TermMessage(err) + // Insert a character + if v.Cursor.HasSelection() { + v.Cursor.DeleteSelection() + v.Cursor.ResetSelection() + } + v.Buf.Insert(v.Cursor.Loc, string(e.Rune())) + v.Cursor.Right() + + for pl := range loadedPlugins { + _, err := Call(pl+".onRune", string(e.Rune()), v) + if err != nil && !strings.HasPrefix(err.Error(), "function does not exist") { + TermMessage(err) + } + } + + if recordingMacro { + curMacro = append(curMacro, e.Rune()) } } - - if recordingMacro { - curMacro = append(curMacro, e.Rune()) - } + v.Cursor = &v.Buf.Cursor } } case *tcell.EventPaste: @@ -536,14 +545,16 @@ func (v *View) HandleEvent(event tcell.Event) { break } - v.paste(e.Text()) + for _, c := range v.Buf.cursors { + v.Cursor = c + v.paste(e.Text()) + + } + v.Cursor = &v.Buf.Cursor PostActionCall("Paste", v) } case *tcell.EventMouse: - x, y := e.Position() - x -= v.lineNumOffset - v.leftCol + v.x - y += v.Topline - v.y // Don't relocate for mouse events relocate = false @@ -551,7 +562,11 @@ func (v *View) HandleEvent(event tcell.Event) { for key, actions := range bindings { if button == key.buttons { - relocate = v.ExecuteActions(actions) + for _, c := range v.Buf.cursors { + v.Cursor = c + relocate = v.ExecuteActions(actions) || relocate + } + v.Cursor = &v.Buf.Cursor } } @@ -569,6 +584,10 @@ func (v *View) HandleEvent(event tcell.Event) { if !v.mouseReleased { // Mouse was just released + x, y := e.Position() + x -= v.lineNumOffset - v.leftCol + v.x + y += v.Topline - v.y + // Relocating here isn't really necessary because the cursor will // be in the right place from the last mouse event // However, if we are running in a terminal that doesn't support mouse motion @@ -822,22 +841,20 @@ func (v *View) DisplayView() { } charLoc := char.realLoc - if v.Cursor.HasSelection() && - (charLoc.GreaterEqual(v.Cursor.CurSelection[0]) && charLoc.LessThan(v.Cursor.CurSelection[1]) || - charLoc.LessThan(v.Cursor.CurSelection[0]) && charLoc.GreaterEqual(v.Cursor.CurSelection[1])) { - // The current character is selected - lineStyle = defStyle.Reverse(true) + for _, c := range v.Buf.cursors { + v.Cursor = c + if v.Cursor.HasSelection() && + (charLoc.GreaterEqual(v.Cursor.CurSelection[0]) && charLoc.LessThan(v.Cursor.CurSelection[1]) || + charLoc.LessThan(v.Cursor.CurSelection[0]) && charLoc.GreaterEqual(v.Cursor.CurSelection[1])) { + // The current character is selected + lineStyle = defStyle.Reverse(true) - if style, ok := colorscheme["selection"]; ok { - lineStyle = style + if style, ok := colorscheme["selection"]; ok { + lineStyle = style + } } } - - if tabs[curTab].CurView == v.Num && !v.Cursor.HasSelection() && - v.Cursor.Y == char.realLoc.Y && v.Cursor.X == char.realLoc.X && !cursorSet { - screen.ShowCursor(xOffset+char.visualLoc.X, yOffset+char.visualLoc.Y) - cursorSet = true - } + v.Cursor = &v.Buf.Cursor if v.Buf.Settings["cursorline"].(bool) && tabs[curTab].CurView == v.Num && !v.Cursor.HasSelection() && v.Cursor.Y == realLineN { @@ -848,6 +865,16 @@ func (v *View) DisplayView() { screen.SetContent(xOffset+char.visualLoc.X, yOffset+char.visualLoc.Y, char.drawChar, nil, lineStyle) + for _, c := range v.Buf.cursors { + v.Cursor = c + if tabs[curTab].CurView == v.Num && !v.Cursor.HasSelection() && + v.Cursor.Y == char.realLoc.Y && v.Cursor.X == char.realLoc.X && !cursorSet { + ShowCursor(xOffset+char.visualLoc.X, yOffset+char.visualLoc.Y) + // cursorSet = true + } + } + v.Cursor = &v.Buf.Cursor + lastChar = char } } @@ -858,19 +885,27 @@ func (v *View) DisplayView() { var cx, cy int if lastChar != nil { lastX = xOffset + lastChar.visualLoc.X + lastChar.width - if tabs[curTab].CurView == v.Num && !v.Cursor.HasSelection() && - v.Cursor.Y == lastChar.realLoc.Y && v.Cursor.X == lastChar.realLoc.X+1 { - screen.ShowCursor(lastX, yOffset+lastChar.visualLoc.Y) - cx, cy = lastX, yOffset+lastChar.visualLoc.Y + for _, c := range v.Buf.cursors { + v.Cursor = c + if tabs[curTab].CurView == v.Num && !v.Cursor.HasSelection() && + v.Cursor.Y == lastChar.realLoc.Y && v.Cursor.X == lastChar.realLoc.X+1 { + ShowCursor(lastX, yOffset+lastChar.visualLoc.Y) + cx, cy = lastX, yOffset+lastChar.visualLoc.Y + } } + v.Cursor = &v.Buf.Cursor realLoc = Loc{lastChar.realLoc.X + 1, realLineN} visualLoc = Loc{lastX - xOffset, lastChar.visualLoc.Y} } else if len(line) == 0 { - if tabs[curTab].CurView == v.Num && !v.Cursor.HasSelection() && - v.Cursor.Y == realLineN { - screen.ShowCursor(xOffset, yOffset+visualLineN) - cx, cy = xOffset, yOffset+visualLineN + for _, c := range v.Buf.cursors { + v.Cursor = c + if tabs[curTab].CurView == v.Num && !v.Cursor.HasSelection() && + v.Cursor.Y == realLineN { + ShowCursor(xOffset, yOffset+visualLineN) + cx, cy = xOffset, yOffset+visualLineN + } } + v.Cursor = &v.Buf.Cursor lastX = xOffset realLoc = Loc{0, realLineN} visualLoc = Loc{0, visualLineN} @@ -912,6 +947,11 @@ func (v *View) DisplayView() { } } +func ShowCursor(x, y int) { + r, _, _, _ := screen.GetContent(x, y) + screen.SetContent(x, y, r, nil, defStyle.Reverse(true)) +} + // Display renders the view, the cursor, and statusline func (v *View) Display() { if globalSettings["termtitle"].(bool) { From 8d268ef0212ce293d462d8d42009ddaa62ee0e78 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Mon, 12 Jun 2017 12:12:26 -0400 Subject: [PATCH 02/10] Remove debug messages --- cmd/micro/actions.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmd/micro/actions.go b/cmd/micro/actions.go index 3a7050db..8a7308db 100644 --- a/cmd/micro/actions.go +++ b/cmd/micro/actions.go @@ -1849,7 +1849,6 @@ func (v *View) SpawnMultiCursor(usePlugin bool) bool { searchStart = ToCharPos(spawner.CurSelection[1], v.Buf) v.Cursor = c Search(sel, v, true) - messenger.Message(v.Cursor.Loc) for _, cur := range v.Buf.cursors { if c.Loc == cur.Loc { @@ -1873,7 +1872,6 @@ func (v *View) SkipMultiCursor(usePlugin bool) bool { cursor := v.Buf.cursors[len(v.Buf.cursors)-1] if v.Cursor == cursor { - messenger.Message("SKIP") if usePlugin && !PreActionCall("SkipMultiCursor", v) { return false } From bc3c8eaf74d07ef010270c883198e530d23c2e5a Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Mon, 12 Jun 2017 15:59:00 -0400 Subject: [PATCH 03/10] Use terminal cursor for the base cursor If all cursors fake then that breaks support for things like inserting japanese characters nicely, so fake cursors are now only used as extra cursors. --- cmd/micro/messenger.go | 6 +++--- cmd/micro/view.go | 26 +++++++++++++++----------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/cmd/micro/messenger.go b/cmd/micro/messenger.go index 6c212910..3fda5368 100644 --- a/cmd/micro/messenger.go +++ b/cmd/micro/messenger.go @@ -153,7 +153,7 @@ func (m *Messenger) YesNoPrompt(prompt string) (bool, bool) { for { m.Clear() m.Display() - ShowCursor(Count(m.message), h-1) + screen.ShowCursor(Count(m.message), h-1) screen.Show() event := <-events @@ -190,7 +190,7 @@ func (m *Messenger) LetterPrompt(prompt string, responses ...rune) (rune, bool) for { m.Clear() m.Display() - ShowCursor(Count(m.message), h-1) + screen.ShowCursor(Count(m.message), h-1) screen.Show() event := <-events @@ -470,7 +470,7 @@ func (m *Messenger) Display() { } if m.hasPrompt { - ShowCursor(Count(m.message)+m.cursorx, h-1) + screen.ShowCursor(Count(m.message)+m.cursorx, h-1) screen.Show() } } diff --git a/cmd/micro/view.go b/cmd/micro/view.go index 3813f8d9..1162b461 100644 --- a/cmd/micro/view.go +++ b/cmd/micro/view.go @@ -865,12 +865,12 @@ func (v *View) DisplayView() { screen.SetContent(xOffset+char.visualLoc.X, yOffset+char.visualLoc.Y, char.drawChar, nil, lineStyle) - for _, c := range v.Buf.cursors { + for i, c := range v.Buf.cursors { v.Cursor = c if tabs[curTab].CurView == v.Num && !v.Cursor.HasSelection() && - v.Cursor.Y == char.realLoc.Y && v.Cursor.X == char.realLoc.X && !cursorSet { - ShowCursor(xOffset+char.visualLoc.X, yOffset+char.visualLoc.Y) - // cursorSet = true + v.Cursor.Y == char.realLoc.Y && v.Cursor.X == char.realLoc.X && (!cursorSet || i != 0) { + ShowMultiCursor(xOffset+char.visualLoc.X, yOffset+char.visualLoc.Y, i) + cursorSet = true } } v.Cursor = &v.Buf.Cursor @@ -885,11 +885,11 @@ func (v *View) DisplayView() { var cx, cy int if lastChar != nil { lastX = xOffset + lastChar.visualLoc.X + lastChar.width - for _, c := range v.Buf.cursors { + for i, c := range v.Buf.cursors { v.Cursor = c if tabs[curTab].CurView == v.Num && !v.Cursor.HasSelection() && v.Cursor.Y == lastChar.realLoc.Y && v.Cursor.X == lastChar.realLoc.X+1 { - ShowCursor(lastX, yOffset+lastChar.visualLoc.Y) + ShowMultiCursor(lastX, yOffset+lastChar.visualLoc.Y, i) cx, cy = lastX, yOffset+lastChar.visualLoc.Y } } @@ -897,11 +897,11 @@ func (v *View) DisplayView() { realLoc = Loc{lastChar.realLoc.X + 1, realLineN} visualLoc = Loc{lastX - xOffset, lastChar.visualLoc.Y} } else if len(line) == 0 { - for _, c := range v.Buf.cursors { + for i, c := range v.Buf.cursors { v.Cursor = c if tabs[curTab].CurView == v.Num && !v.Cursor.HasSelection() && v.Cursor.Y == realLineN { - ShowCursor(xOffset, yOffset+visualLineN) + ShowMultiCursor(xOffset, yOffset+visualLineN, i) cx, cy = xOffset, yOffset+visualLineN } } @@ -947,9 +947,13 @@ func (v *View) DisplayView() { } } -func ShowCursor(x, y int) { - r, _, _, _ := screen.GetContent(x, y) - screen.SetContent(x, y, r, nil, defStyle.Reverse(true)) +func ShowMultiCursor(x, y, i int) { + if i == 0 { + screen.ShowCursor(x, y) + } else { + r, _, _, _ := screen.GetContent(x, y) + screen.SetContent(x, y, r, nil, defStyle.Reverse(true)) + } } // Display renders the view, the cursor, and statusline From c3a73d63b8abe023798e44533e7da0b6c6ef9858 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Mon, 12 Jun 2017 16:19:17 -0400 Subject: [PATCH 04/10] Add comments --- cmd/micro/actions.go | 4 ++++ cmd/micro/view.go | 3 +++ 2 files changed, 7 insertions(+) diff --git a/cmd/micro/actions.go b/cmd/micro/actions.go index 8a7308db..dd33621a 100644 --- a/cmd/micro/actions.go +++ b/cmd/micro/actions.go @@ -1829,6 +1829,7 @@ func (v *View) PlayMacro(usePlugin bool) bool { return true } +// SpawnMultiCursor creates a new multiple cursor at the next occurence of the current selection or current word func (v *View) SpawnMultiCursor(usePlugin bool) bool { spawner := v.Buf.cursors[len(v.Buf.cursors)-1] // You can only spawn a cursor from the main cursor @@ -1868,6 +1869,7 @@ func (v *View) SpawnMultiCursor(usePlugin bool) bool { return false } +// SkipMultiCursor moves the current multiple cursor to the next available position func (v *View) SkipMultiCursor(usePlugin bool) bool { cursor := v.Buf.cursors[len(v.Buf.cursors)-1] @@ -1890,6 +1892,7 @@ func (v *View) SkipMultiCursor(usePlugin bool) bool { return false } +// RemoveMultiCursor removes the latest multiple cursor func (v *View) RemoveMultiCursor(usePlugin bool) bool { end := len(v.Buf.cursors) if end > 1 { @@ -1916,6 +1919,7 @@ func (v *View) RemoveMultiCursor(usePlugin bool) bool { return false } +// RemoveAllMultiCursors removes all cursors except the base cursor func (v *View) RemoveAllMultiCursors(usePlugin bool) bool { if v.Cursor == &v.Buf.Cursor { if usePlugin && !PreActionCall("RemoveAllMultiCursors", v) { diff --git a/cmd/micro/view.go b/cmd/micro/view.go index 1162b461..b9c901bc 100644 --- a/cmd/micro/view.go +++ b/cmd/micro/view.go @@ -947,6 +947,9 @@ func (v *View) DisplayView() { } } +// ShowMultiCursor will display a cursor at a location +// If i == 0 then the terminal cursor will be used +// Otherwise a fake cursor will be drawn at the position func ShowMultiCursor(x, y, i int) { if i == 0 { screen.ShowCursor(x, y) From 00718f99cf3c916aa6d01ad43c49e40b71f3c96e Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Mon, 12 Jun 2017 16:58:39 -0400 Subject: [PATCH 05/10] Add ability to add cursors with Ctrl-MouseLeft With the new code that allows binding mouse buttons this was remarkably easy to add. The new binding is: "Ctrl-MouseLeft": "MouseMultiCursor" Note: A number of terminals don't support Ctrl-MouseLeft (macOS especially) so you might want to rebind to MouseRight or MouseMiddle. --- cmd/micro/actions.go | 27 +++++++++++++++++++++++++++ cmd/micro/bindings.go | 4 +++- cmd/micro/view.go | 4 ++-- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/cmd/micro/actions.go b/cmd/micro/actions.go index dd33621a..60d95268 100644 --- a/cmd/micro/actions.go +++ b/cmd/micro/actions.go @@ -1869,6 +1869,33 @@ func (v *View) SpawnMultiCursor(usePlugin bool) bool { return false } +// MouseMultiCursor is a mouse action which puts a new cursor at the mouse position +func (v *View) MouseMultiCursor(usePlugin bool, e *tcell.EventMouse) bool { + if v.Cursor == &v.Buf.Cursor { + if usePlugin && !PreActionCall("SpawnMultiCursorAtMouse", v, e) { + return false + } + x, y := e.Position() + x -= v.lineNumOffset - v.leftCol + v.x + y += v.Topline - v.y + + c := &Cursor{ + buf: v.Buf, + } + v.Cursor = c + v.MoveToMouseClick(x, y) + v.Relocate() + v.Cursor = &v.Buf.Cursor + + v.Buf.cursors = append(v.Buf.cursors, c) + + if usePlugin { + PostActionCall("SpawnMultiCursorAtMouse", v) + } + } + return false +} + // SkipMultiCursor moves the current multiple cursor to the next available position func (v *View) SkipMultiCursor(usePlugin bool) bool { cursor := v.Buf.cursors[len(v.Buf.cursors)-1] diff --git a/cmd/micro/bindings.go b/cmd/micro/bindings.go index cb289d98..1c232da8 100644 --- a/cmd/micro/bindings.go +++ b/cmd/micro/bindings.go @@ -14,7 +14,8 @@ var mouseBindings map[Key][]func(*View, bool, *tcell.EventMouse) bool var helpBinding string var mouseBindingActions = map[string]func(*View, bool, *tcell.EventMouse) bool{ - "MousePress": (*View).MousePress, + "MousePress": (*View).MousePress, + "MouseMultiCursor": (*View).MouseMultiCursor, } var bindingActions = map[string]func(*View, bool) bool{ @@ -517,6 +518,7 @@ func DefaultBindings() map[string]string { "MouseWheelDown": "ScrollDown", "MouseLeft": "MousePress", "MouseMiddle": "PastePrimary", + "Ctrl-MouseLeft": "MouseMultiCursor", "Alt-n": "SpawnMultiCursor", "Alt-p": "RemoveMultiCursor", diff --git a/cmd/micro/view.go b/cmd/micro/view.go index b9c901bc..18b6d468 100644 --- a/cmd/micro/view.go +++ b/cmd/micro/view.go @@ -561,7 +561,7 @@ func (v *View) HandleEvent(event tcell.Event) { button := e.Buttons() for key, actions := range bindings { - if button == key.buttons { + if button == key.buttons && e.Modifiers() == key.modifiers { for _, c := range v.Buf.cursors { v.Cursor = c relocate = v.ExecuteActions(actions) || relocate @@ -571,7 +571,7 @@ func (v *View) HandleEvent(event tcell.Event) { } for key, actions := range mouseBindings { - if button == key.buttons { + if button == key.buttons && e.Modifiers() == key.modifiers { for _, action := range actions { action(v, true, e) } From 21840d3ffeee2ef4f3e3888c9ee72caac298f56e Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Thu, 15 Jun 2017 18:52:51 -0400 Subject: [PATCH 06/10] Make cursor movement automatic on insert + remove This changes the behavior of cursor movement so that all cursors are adjusted when a change is made to the buffer. Cursors don't have to be manually moved after calling Insert or Remove, those functions will move the cursor properly on their own. This should fix issues 1-3 mentioned in the multiple cursors discussion. Ref #5 --- cmd/micro/actions.go | 31 +++++++++---------------- cmd/micro/eventhandler.go | 21 +++++++++++++++++ cmd/micro/loc.go | 22 ++++++++++++++++++ cmd/micro/runtime.go | 2 +- cmd/micro/view.go | 3 +-- runtime/plugins/autoclose/autoclose.lua | 2 ++ 6 files changed, 58 insertions(+), 23 deletions(-) diff --git a/cmd/micro/actions.go b/cmd/micro/actions.go index 60d95268..7a961229 100644 --- a/cmd/micro/actions.go +++ b/cmd/micro/actions.go @@ -554,7 +554,7 @@ func (v *View) InsertSpace(usePlugin bool) bool { v.Cursor.ResetSelection() } v.Buf.Insert(v.Cursor.Loc, " ") - v.Cursor.Right() + // v.Cursor.Right() if usePlugin { return PostActionCall("InsertSpace", v) @@ -574,15 +574,15 @@ func (v *View) InsertNewline(usePlugin bool) bool { v.Cursor.ResetSelection() } - v.Buf.Insert(v.Cursor.Loc, "\n") ws := GetLeadingWhitespace(v.Buf.Line(v.Cursor.Y)) - v.Cursor.Right() + v.Buf.Insert(v.Cursor.Loc, "\n") + // v.Cursor.Right() if v.Buf.Settings["autoindent"].(bool) { v.Buf.Insert(v.Cursor.Loc, ws) - for i := 0; i < len(ws); i++ { - v.Cursor.Right() - } + // for i := 0; i < len(ws); i++ { + // v.Cursor.Right() + // } // Remove the whitespaces if keepautoindent setting is off if IsSpacesOrTabs(v.Buf.Line(v.Cursor.Y-1)) && !v.Buf.Settings["keepautoindent"].(bool) { @@ -622,18 +622,10 @@ func (v *View) Backspace(usePlugin bool) bool { tabSize := int(v.Buf.Settings["tabsize"].(float64)) if v.Buf.Settings["tabstospaces"].(bool) && IsSpaces(lineStart) && len(lineStart) != 0 && len(lineStart)%tabSize == 0 { loc := v.Cursor.Loc - v.Cursor.Loc = loc.Move(-tabSize, v.Buf) - cx, cy := v.Cursor.X, v.Cursor.Y - v.Cursor.Loc = loc v.Buf.Remove(loc.Move(-tabSize, v.Buf), loc) - v.Cursor.X, v.Cursor.Y = cx, cy } else { - v.Cursor.Left() - cx, cy := v.Cursor.X, v.Cursor.Y - v.Cursor.Right() loc := v.Cursor.Loc v.Buf.Remove(loc.Move(-1, v.Buf), loc) - v.Cursor.X, v.Cursor.Y = cx, cy } } v.Cursor.LastVisualX = v.Cursor.GetVisualX() @@ -753,7 +745,6 @@ func (v *View) OutdentLine(usePlugin bool) bool { break } v.Buf.Remove(Loc{0, v.Cursor.Y}, Loc{1, v.Cursor.Y}) - v.Cursor.X -= 1 } v.Cursor.Relocate() @@ -816,9 +807,9 @@ func (v *View) InsertTab(usePlugin bool) bool { tabBytes := len(v.Buf.IndentString()) bytesUntilIndent := tabBytes - (v.Cursor.GetVisualX() % tabBytes) v.Buf.Insert(v.Cursor.Loc, v.Buf.IndentString()[:bytesUntilIndent]) - for i := 0; i < bytesUntilIndent; i++ { - v.Cursor.Right() - } + // for i := 0; i < bytesUntilIndent; i++ { + // v.Cursor.Right() + // } if usePlugin { return PostActionCall("InsertTab", v) @@ -1088,7 +1079,7 @@ func (v *View) DuplicateLine(usePlugin bool) bool { } else { v.Cursor.End() v.Buf.Insert(v.Cursor.Loc, "\n"+v.Buf.Line(v.Cursor.Y)) - v.Cursor.Right() + // v.Cursor.Right() } messenger.Message("Duplicated line") @@ -1810,7 +1801,7 @@ func (v *View) PlayMacro(usePlugin bool) bool { v.Cursor.ResetSelection() } v.Buf.Insert(v.Cursor.Loc, string(t)) - v.Cursor.Right() + // v.Cursor.Right() for pl := range loadedPlugins { _, err := Call(pl+".onRune", string(t), v) diff --git a/cmd/micro/eventhandler.go b/cmd/micro/eventhandler.go index 29afabb2..85809284 100644 --- a/cmd/micro/eventhandler.go +++ b/cmd/micro/eventhandler.go @@ -104,6 +104,16 @@ func (eh *EventHandler) Insert(start Loc, text string) { } eh.Execute(e) e.Deltas[0].End = start.Move(Count(text), eh.buf) + end := e.Deltas[0].End + + for _, c := range eh.buf.cursors { + if start.Y != end.Y && c.GreaterThan(start) { + c.Loc.Y += end.Y - start.Y + } else if c.Y == start.Y && c.GreaterEqual(start) { + c.Loc = c.Move(Count(text), eh.buf) + } + c.LastVisualX = c.GetVisualX() + } } // Remove creates a remove text event and executes it @@ -115,6 +125,17 @@ func (eh *EventHandler) Remove(start, end Loc) { Time: time.Now(), } eh.Execute(e) + + for _, c := range eh.buf.cursors { + if start.Y != end.Y && c.GreaterThan(end) { + c.Loc.Y -= end.Y - start.Y + } else if c.Y == end.Y && c.GreaterEqual(end) { + // TermMessage(start, end) + c.Loc = c.Move(-Diff(start, end, eh.buf), eh.buf) + // c.Loc = c.Move(ToCharPos(start, eh.buf)-ToCharPos(end, eh.buf), eh.buf) + } + c.LastVisualX = c.GetVisualX() + } } // MultipleReplace creates an multiple insertions executes them diff --git a/cmd/micro/loc.go b/cmd/micro/loc.go index 263e0fb3..b984c02c 100644 --- a/cmd/micro/loc.go +++ b/cmd/micro/loc.go @@ -54,6 +54,28 @@ type Loc struct { X, Y int } +func Diff(a, b Loc, buf *Buffer) int { + if a.Y == b.Y { + if a.X > b.X { + return a.X - b.X + } + return b.X - a.X + } + + // Make sure a is guaranteed to be less than b + if b.LessThan(a) { + a, b = b, a + } + + loc := 0 + for i := a.Y + 1; i < b.Y; i++ { + // + 1 for the newline + loc += Count(buf.Line(i)) + 1 + } + loc += Count(buf.Line(a.Y)) - a.X + b.X + 1 + return loc +} + // LessThan returns true if b is smaller func (l Loc) LessThan(b Loc) bool { if l.Y < b.Y { diff --git a/cmd/micro/runtime.go b/cmd/micro/runtime.go index fd9dafad..be2d8ed5 100644 --- a/cmd/micro/runtime.go +++ b/cmd/micro/runtime.go @@ -1047,7 +1047,7 @@ func runtimeHelpTutorialMd() (*asset, error) { return a, nil } -var _runtimePluginsAutocloseAutocloseLua = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x7b\x77\xda\x3a\xf6\xe8\xff\x7c\x8a\x7d\xd2\xe9\x02\x4e\x6c\x8a\x0d\xa7\x25\x39\xa5\x77\x11\x42\x5a\xd6\x4d\x43\x2e\x90\xd3\xe9\x64\x72\x3a\xc6\x16\xc1\xad\xb1\x19\x5b\xe4\x71\xbb\x3a\x9f\xfd\x2e\xbd\x6c\xc9\x96\x81\xb4\x69\x57\xef\xfc\x4e\xfe\x20\xb6\x2c\x6d\xed\x97\xb6\xb6\xb6\xb6\x65\xd3\x84\xbf\x0d\xbd\x43\x58\xe3\x79\xa7\x11\xac\x1d\xb0\x5e\x1c\x80\xdd\x6c\x1e\x98\xcd\xb6\xd9\x6c\x81\xd5\x39\xb4\x9a\x87\xcd\xd6\x3f\x60\xe5\x24\xd8\x81\xbf\x55\x4c\xb3\x62\x9a\x70\x1e\x47\x37\xbe\x87\x12\xb8\x98\x9e\x98\x1d\x70\x6e\x9d\x18\x41\x82\x63\x3f\xbc\x86\xf9\x3a\x74\xb1\x1f\x85\x09\xf8\xcb\x55\x80\x96\x28\xc4\xc8\x03\x3f\x84\xd5\x3a\x46\x10\xac\x9d\x43\x02\xe1\x57\xda\x67\x80\xc2\x5a\x52\xcf\xee\x93\xf5\xac\x96\x18\xe0\x1b\xf0\x51\x2a\x8d\xd1\x0d\x8a\x13\xa4\xd4\x74\x17\x4e\x5c\x5b\x87\xbe\x1b\x79\x48\x2a\xe6\x25\x1a\x20\xd7\x28\xe4\xd0\x93\xf5\xec\x43\x80\x42\xe9\xd9\xdc\x0f\xbd\x5a\x82\x63\x03\x62\x74\x8d\xee\x0c\xf0\x43\x1f\x1b\xb0\x0a\x1c\x5f\xae\xb6\x74\xb0\xbb\x28\xd4\x93\xfb\x28\xd6\x70\x82\x40\xae\x40\x51\x90\x1e\xc7\x68\x15\x18\x10\xf8\x4b\x06\x87\xd4\x1c\xce\x69\x55\xcf\xc1\x0e\x15\x49\xcd\x8d\x42\xec\xf8\x21\xe1\x2d\x5e\x20\x08\xa2\x5b\x14\xbf\x34\x5f\xad\x57\x2b\x14\x83\xeb\x24\x08\x96\xce\x6a\xe5\x87\xd7\x49\x1d\xfc\x04\x82\xc8\xf1\x90\x67\x90\xba\x09\x22\x00\x1d\xcf\xf3\x89\x40\x9c\x40\x92\x0d\x11\x98\x73\xe3\xf8\x81\x33\x0b\x90\x24\x11\x0a\x55\xe1\x34\xed\x8f\x95\x90\xc2\x5e\x20\x83\x99\xa1\x85\x73\x83\xc0\x49\x48\x77\x7e\x0c\x61\x14\x2a\x3a\xe1\x46\xeb\x10\xa3\x78\xe5\xc4\x38\x81\x5b\x1f\x2f\x28\x09\xe8\xce\x45\x2b\x02\x80\x00\xc4\x0b\x07\xf3\x36\x44\xa8\x8e\x8b\x51\xcc\xf0\x5b\x27\x54\x71\x12\x8c\x1c\x0f\xa2\x39\xcc\xee\x31\x4a\x60\x1e\xc5\x84\xab\xb0\x0e\x7d\x9c\x34\x2a\x15\xd3\xbc\xbc\xac\xf4\xa3\xd5\x7d\xec\x5f\x2f\x30\xd4\xdc\x3a\xd1\xe0\xe7\xa6\xdd\x6c\xbe\x30\xe0\x7f\xdf\x07\x08\x26\x4b\x1f\x2f\x2a\x04\x73\x5a\x27\x81\x18\x25\x28\xbe\x41\x5e\xa3\x52\xe9\x47\x21\x8e\xfd\xd9\x1a\x47\x71\x72\x58\x01\x00\xe8\x05\xfe\x32\xba\x81\x09\x46\x2b\x27\xac\x54\xc6\xc8\xf3\x13\x56\xc5\x8f\x42\x70\x42\x8f\x20\x46\x14\x3a\x89\xd6\xb1\x8b\x68\xc9\xcc\x0f\x9d\xf8\x9e\xe0\xb6\x4c\x0c\x46\x68\x14\xd3\xff\xd1\x1a\x57\x96\x91\xe7\xcf\x7d\xd7\x21\x00\x0c\x4a\xda\x0a\xc5\x4b\x1f\x93\x81\xb1\x62\x43\xc9\x63\x7c\x20\xdc\x99\x47\x41\x10\xdd\x12\x71\xbb\x51\xc8\x44\xc7\xf8\xb1\x44\xf8\xb0\x42\x51\xfc\x15\x54\xac\x12\xc2\x1e\x8e\x0e\xd1\x7f\x58\xae\x13\x0c\x31\x22\x7a\x43\x61\x3a\xb3\xe8\x86\x3c\x12\x5c\x0a\x23\xec\xbb\xc8\xa0\xc0\x00\xf0\x82\xe8\x8d\x9f\x60\x02\x46\xee\x34\xf4\x72\x18\x79\x7e\xe2\x06\x8e\xbf\x44\x71\xa3\x04\x11\x3f\x94\x99\x21\x10\x59\xc5\x91\xb7\x76\x91\x0e\x17\x8e\x03\xc7\xe8\xab\x70\x01\x46\x25\x87\xe4\x45\xee\x9a\x58\x1d\x47\xc8\xeb\x59\x14\x43\x84\x17\x28\x86\xa5\x83\x51\xec\x3b\x41\x92\xb1\x3d\x55\x4a\x99\x0c\x41\xdc\x19\xf2\x69\x3b\xf2\x3c\x74\x96\x88\xe0\x44\x49\x58\xe3\x45\x44\xb4\x3d\x7b\x44\x45\xe0\xe3\x84\xe0\x9c\x2a\x14\x2c\x9d\x7b\x98\x09\xc4\xa8\x3e\xe3\x08\x50\xe8\x45\x71\x82\x88\x86\xac\xe2\x68\x19\x61\x04\x8c\x3f\x38\x01\x0f\xc5\xfe\x0d\xf2\x60\x1e\x47\x4b\xc6\x8b\x24\x9a\x63\x3a\x96\x84\x36\x31\x60\xc9\x0a\xb9\x44\xa9\x60\x15\xfb\x44\xd5\x62\xa2\x4e\x21\x53\xac\x24\xa1\x34\x54\xa6\x6f\x86\x13\x98\x8c\x4e\xa6\xef\x7a\xe3\x01\x0c\x27\x70\x3e\x1e\xfd\x31\x3c\x1e\x1c\xc3\xd1\x7b\x98\xbe\x19\x40\x7f\x74\xfe\x7e\x3c\x7c\xfd\x66\x0a\x6f\x46\xa7\xc7\x83\xf1\x04\x7a\x67\xc7\xd0\x1f\x9d\x4d\xc7\xc3\xa3\x8b\xe9\x68\x3c\x81\xbd\xde\x04\x86\x93\xbd\x0a\x79\xd0\x3b\x7b\x0f\x83\xbf\x9f\x8f\x07\x93\x09\x8c\xc6\x30\x7c\x7b\x7e\x3a\x1c\x1c\xc3\xbb\xde\x78\xdc\x3b\x9b\x0e\x07\x13\x03\x86\x67\xfd\xd3\x8b\xe3\xe1\xd9\x6b\x03\x8e\x2e\xa6\x70\x36\x9a\xc2\xe9\xf0\xed\x70\x3a\x38\x86\xe9\xc8\x20\x9d\x56\x8a\xcd\x60\x74\x02\x6f\x07\xe3\xfe\x9b\xde\xd9\xb4\x77\x34\x3c\x1d\x4e\xdf\x53\x44\x4e\x86\xd3\x33\xd2\xd7\xc9\x68\x0c\x3d\x38\xef\x8d\xa7\xc3\xfe\xc5\x69\x6f\x0c\xe7\x17\xe3\xf3\xd1\x64\x00\xbd\xf1\xa0\x72\x3c\x9c\xf4\x4f\x7b\xc3\xb7\x83\xe3\x06\x0c\xcf\xe0\x6c\x04\x83\x3f\x06\x67\x53\x98\xbc\xe9\x9d\x9e\xe6\xa8\x1c\xbd\x3b\x1b\x8c\x09\xea\x0a\x89\x47\x03\x38\x1d\xf6\x8e\x4e\x07\x15\xda\xd1\xd9\x7b\x38\x1e\x8e\x07\xfd\x29\xa1\x26\xbb\xea\x0f\x8f\x07\x67\xd3\xde\xa9\x01\x93\xf3\x41\x7f\x48\x2e\x06\x7f\x1f\xbc\x3d\x3f\xed\x8d\xdf\x1b\x1c\xe6\x64\xf0\x7f\x2e\x06\x67\xd3\x61\xef\xb4\x72\xdc\x7b\xdb\x7b\x3d\x98\x40\x6d\x0b\x47\xce\xc7\xa3\xfe\xc5\x78\xf0\x96\xa0\x3c\x3a\x81\xc9\xc5\xd1\x64\x3a\x9c\x5e\x4c\x07\xf0\x7a\x34\x3a\x26\x7c\xae\x4c\x06\xe3\x3f\x86\xfd\xc1\xe4\x77\x38\x1d\x4d\x28\xb3\x2e\x26\x03\x03\x8e\x7b\xd3\x1e\xed\xf8\x7c\x3c\x3a\x19\x4e\x27\xbf\x93\xeb\xa3\x8b\xc9\x90\xf2\x6c\x78\x36\x1d\x8c\xc7\x17\xe7\xd3\xe1\xe8\xac\x0e\x6f\x46\xef\x06\x7f\x0c\xc6\x95\x7e\xef\x62\x32\x38\xa6\xcc\x1d\x9d\x51\x52\xa7\x6f\x06\xa3\xf1\x7b\x02\x94\xf0\x80\xf2\xde\x80\x77\x6f\x06\xd3\x37\x83\x31\xe1\x27\xe5\x54\x8f\xb0\x60\x32\x1d\x0f\xfb\x53\xa9\x5a\x65\x34\x86\xe9\x68\x3c\x95\x68\x84\xb3\xc1\xeb\xd3\xe1\xeb\xc1\x59\x7f\x40\xb0\x19\x11\x28\xef\x86\x93\x41\x1d\x7a\xe3\xe1\x84\x54\x18\xb2\x6e\xdf\xf5\xde\xc3\xe8\x82\x92\x4c\x44\x74\x31\x19\x54\xe8\xa5\xa4\xb0\x06\x15\x24\x0c\x4f\xa0\x77\xfc\xc7\x90\xa0\xcd\x2b\x9f\x8f\x26\x93\x21\x57\x13\xca\xb2\xfe\x1b\x60\xec\x6e\x54\x4c\xf3\xea\xaa\x42\xe7\xa9\xa3\xb3\x13\x36\x8a\xc6\x27\x7d\x68\x3d\xb7\x0f\xf8\x04\x76\x31\x3d\xe9\x98\x91\x8b\x11\x4e\xa0\x0b\xbf\xd6\x58\x01\x99\x7a\xa0\x9e\x3e\xa7\xb7\x00\x5d\x76\x67\xc1\x33\x76\x61\x8b\x8b\x96\xb8\x68\xa7\x4d\x2c\x36\x2e\xbb\xf0\xf4\xae\xd9\x34\x5f\x9c\xa4\x0f\xec\xec\x41\xdf\x36\x8f\x4f\x58\x29\x76\xfc\x20\xad\xd2\xca\xaa\x0c\x9a\xf0\xf4\xae\xd7\x34\x8f\xa4\x7a\xf0\x8c\x3c\xb0\xcc\x41\x1f\xec\x9a\x54\x5c\x87\x67\x04\x84\xfa\xf7\xf4\x6e\x70\x0c\x4f\xef\x3a\x4d\xf3\xa0\x00\x62\x60\x0e\x4e\x72\x20\x52\x1c\xda\x19\x0e\x27\x04\x87\x03\x8a\x43\xbe\x3f\xf2\xd4\x32\x4f\x5a\xd0\xda\x01\x91\x93\x36\x43\xa4\x53\xda\x29\xbd\x65\x9d\x76\x48\x7f\x44\x46\x95\x20\x72\x9d\x80\xce\xf6\x0c\x21\xe6\x58\x36\x48\x01\x7f\xc6\xc5\x93\x3d\x23\x05\xfc\x99\xb7\x5e\xae\x94\x67\xa4\x80\x3f\x23\x8e\x9e\xf2\x8c\x14\x88\x67\x51\xbc\x74\xb0\xfc\x8c\x16\xf0\xa7\x01\x0a\x41\x69\x19\xa0\x50\x3c\x22\x0e\x92\xf2\x88\x14\xf0\x87\x31\x5a\xa9\xed\x62\x24\x90\x49\xd6\x33\xf5\x51\xb2\x9e\xf1\x47\xcc\xb7\x93\x1e\xd1\x02\xaa\xd7\x31\xc2\xeb\x38\x4c\xd8\xbc\xb3\x5e\xce\x50\x9c\xb9\x46\x74\x82\x99\xdd\xd3\x67\x39\x8f\x0a\x1c\xcc\x38\xea\x53\xcf\x85\xfa\x85\x41\x12\x81\x17\xad\x67\x01\x4a\x88\x07\xe7\x14\xda\xdc\x38\x81\xef\x39\x38\x12\xc4\x08\xbf\x2f\xf5\xc0\x59\xb7\xd4\xdb\xae\xd3\x79\x89\x80\x8d\xaf\xe9\xf4\x0b\x1e\x9a\x3b\xeb\x00\x27\xf4\x81\x0f\x5d\xf0\xc9\x8c\x67\x55\x0a\x15\xdd\x05\x72\x3f\xf9\xe1\x35\xab\x38\x07\x7c\xbf\x22\xce\x3e\xfc\xa7\x0b\x7b\x8c\xfe\x3d\x42\x52\x58\x11\x9a\x85\xe2\x38\x8a\x6b\x7b\x33\xc7\xcb\x80\x3c\xb1\xc8\xd4\x5a\x55\x30\xab\x42\x8d\x2f\x4a\xd0\xdd\x0a\xb9\x98\xb8\xc5\xd7\x11\x86\xbd\x46\x43\x74\xd2\x68\xc0\x5e\x7d\x8f\x21\x8f\x42\x4f\x41\xc1\x67\x28\x30\x2e\xef\x82\x82\xad\x45\x81\x4b\xa9\x04\x05\xbf\x80\x02\xbd\xe0\x7a\x0e\x5d\x2a\x35\xce\x61\xc1\x39\x0f\x61\x32\xcd\x87\x88\xcb\x3d\x44\x88\xb8\x32\xc4\x33\x4e\x85\x67\xc0\xcc\x21\xea\x10\x85\x99\x01\xe4\xcd\xb9\x58\x59\x6b\xb0\x04\xcd\x2e\xbc\x82\x26\xf5\xb3\x5c\x78\xd9\x05\xcb\x7e\xa1\x92\x9c\x1a\xba\xb4\x84\xe9\xa2\x10\x29\x0a\x12\xc4\xc0\x74\xc1\x3a\x68\x67\x90\x6c\xbb\xa5\x87\x64\xa7\x25\x9c\x5c\x5b\xa6\x17\xf6\xc1\xe2\x34\x73\x0c\xc3\x08\x93\x3a\x0a\x2c\x49\x18\x4c\x7d\xb9\xc4\x19\x87\x1c\xe2\x62\x23\x27\x0e\xee\x39\x83\x15\x26\x6b\xf9\x61\xcb\x3d\xba\x36\xbc\x04\xcb\xee\x10\xcd\x75\x6d\x78\x05\xd6\x81\x55\xda\xff\x30\xa4\x90\xf2\xc3\xa8\xac\x67\xce\x3d\xbb\xc8\x3d\xdb\x96\xb9\xd7\x3a\xd0\x73\xaf\xb5\x03\xf7\x72\x35\x5a\xb9\x1a\xb6\x96\xbf\xd4\xb3\xc5\xa4\xf6\x8f\xe4\x34\x74\x33\xc2\x6b\x8c\xef\xcf\x9b\x32\xdf\xeb\xdf\xc2\x78\xc1\x5d\xd2\x49\xeb\x85\xdc\x89\x2c\xdc\xdf\x0e\x1e\xa3\x93\xef\xa8\x33\x05\x1e\xb6\x14\x1e\xb6\xa4\x9e\x5b\xdf\x45\x5b\x5b\x1a\x6d\x6d\x4b\x56\xc3\x6e\xb7\xf5\xda\xda\x7e\x14\x6d\xcd\xd5\x68\xe7\x6a\xb4\xb6\xe8\xb3\xb8\x6a\xff\x78\xcd\xe6\x4c\xe2\x4a\xd7\x6e\x7f\x17\xcd\x6e\xb7\xcb\x34\xbb\xdd\xfa\x4b\xb3\x77\xed\xb9\xad\xf4\xdc\x96\x7a\x6e\x7f\x97\x31\xd5\xce\xc6\x54\xde\xbf\xd8\x0c\x90\x00\xa3\x00\x4b\xfd\x42\x29\xa2\xe6\x87\xa9\x87\xc7\xd4\x5b\xe7\xd4\x11\x37\xb7\x96\x14\x7d\xb9\x07\xbb\x68\xc4\x17\xf9\x64\xdc\xd0\xb8\xaf\xe3\xc7\x09\xa9\xec\x45\xb0\x8a\xfd\x10\xd7\xaa\x7b\x55\x03\x47\xac\x5d\xed\x53\xdd\x50\xee\x6f\xe8\x7d\x3d\xf5\xc6\x60\xbb\xc3\x17\xa0\xf0\x2b\x5c\x3d\xc9\xcf\x5a\x45\x64\x2d\x68\x49\x25\xcc\xb1\xea\x02\x8f\x50\x67\x0f\x02\x14\x5e\xe3\x05\x74\xa1\xc9\x00\xdc\x2e\xfc\x00\x51\x00\x2f\xbb\xbc\x95\x17\x65\x76\x4a\xd4\xe6\x17\xfb\x90\x79\x4f\xac\x53\xf2\xbb\xaf\x3a\xd4\xc4\x9a\xad\xa2\x24\x87\x29\x57\x16\x06\x28\x15\xbb\x14\x6d\xf7\x50\x88\x7d\xd7\x09\x82\x7b\xc2\x98\x6c\x4d\xc1\xc3\xad\x2c\xc0\xe8\x53\x03\xf1\x91\xc6\x13\xf3\x41\x57\x02\x2f\x1f\x6e\xd5\x29\x09\x81\x99\x45\xd8\xf3\xaa\xa2\xb8\xfd\x1f\xa1\x0b\x1f\xc9\xd0\x31\xad\x47\xe2\xb7\x69\x42\x14\x06\xf7\x90\x20\x0c\x01\x51\x45\xba\xaa\xf8\x08\x3e\x71\x83\xaf\x1d\xec\xdf\x20\xb9\x35\x74\xa1\xe6\x93\x59\xaa\xc9\x09\x27\x97\x75\xd2\x44\xda\x7f\xc8\xea\x27\xd8\x89\x71\x9f\xac\x2e\xd3\x76\x75\xda\x90\xf6\x12\xc0\x3e\x9b\xaa\xa4\x16\x28\xf4\xfa\x22\x58\x50\xfb\x28\xb5\xf8\x28\x5a\x7c\xa4\x2d\x04\xf2\xae\x13\x56\x31\xd0\xa8\x39\xed\x0c\x66\x68\x1e\xc5\x88\xc0\xf9\x45\x8c\xae\x0c\x8b\x57\x29\x7c\x65\x74\x71\x5d\xd8\xdb\x53\x55\xc4\x34\x99\x01\x8b\xe6\xf3\x04\xe1\x84\xa8\xc1\xca\x49\x12\x55\x1d\xf2\xd4\x1e\xdd\x63\x64\xa0\xd0\x23\xff\x89\x50\x0c\x26\xf7\xaf\x54\x6e\xd9\x74\x8a\xe7\x5d\x89\xa0\x82\xe5\x4c\x71\x60\x63\x41\x6f\x28\xb7\x0f\x15\x7d\xbf\x5a\xe6\x71\xe8\x59\x9f\x60\x4a\xa3\x92\xfc\xcd\x62\xe4\x7c\x52\x30\x51\x30\xca\x49\x88\x77\x47\xfa\x50\xa8\xa1\x08\xee\x5b\xea\xc2\x32\x53\x97\x97\xc0\x23\x46\xb4\xa1\x40\x88\xa8\x51\x13\x0a\x4c\xe0\x02\x17\x3b\x58\xa9\xdc\x44\xbb\xba\x30\x08\x97\x97\x6c\x32\x58\x05\x8e\x5b\x1c\xe1\xd9\x9a\xd0\x11\x9b\x46\x80\x9d\x59\x80\x74\xc3\x5c\x00\x21\x3d\xf2\xca\x8f\x30\x31\x6c\x31\xe5\xbc\xd3\x6f\x5c\xb9\x0b\x74\x29\x1a\x94\xc0\x87\x2d\xdf\x33\x2c\x68\xe3\x32\x24\x44\x37\x8f\x33\xb3\xa4\x4a\x2d\x95\x85\xe8\x36\xc1\xc4\x18\xed\xed\xed\x32\x22\xb3\x98\x4c\x77\xc3\x94\x02\x4a\x7c\x81\xeb\xd4\x2a\x62\x3f\xb0\x2f\x41\x31\x95\x15\x78\x8a\x0c\xbf\x68\x34\x40\xb0\xe0\xd2\xbd\xa2\x0e\x52\x5d\x3f\x66\x55\xd2\xf2\x5a\xcd\xc0\x31\x0d\xa6\x73\x90\x98\xc9\x24\xc3\xc5\x22\x62\x7c\x26\xf3\x31\x7c\x0a\xa3\xdb\x04\x9c\x59\xb4\xc6\xc0\x37\x7d\x21\xa1\x1b\xce\x6c\x4b\xd4\x8d\xc2\x1b\x14\x27\x64\x66\xd4\xe9\x36\x03\x27\xf8\xcf\xf1\x90\x24\x4f\x38\x42\x6e\x3f\x04\xee\x87\xb5\x9b\x8e\x2e\x2d\x6a\x2c\xfe\xf7\x68\xa8\x31\x70\x3b\xa0\xb6\x76\x3f\x04\x1c\x35\x1e\xf3\xd6\x61\xc7\x37\xcf\x55\x27\x00\x43\xb2\x5e\xad\xa2\x18\xf3\x1d\x7c\xfd\xf0\x67\x0d\x1f\xc5\x1d\xdc\x3a\xea\x69\x5f\xdf\xe6\xc4\x95\x0e\x2c\xa6\x89\xf9\xa1\xf5\xc0\xe1\xf6\x0a\x9a\xca\xdc\x57\x88\xcf\x29\xc3\x8b\xb5\x63\xa1\x30\xbb\x23\x05\xd5\x0e\x2c\x19\x8a\x3a\x4e\xf2\xd3\x50\x29\x74\x65\x6e\xdc\x3e\xe6\x37\x0d\xe0\xdd\x47\x7f\x11\xcf\x4d\xe3\xd8\x34\x61\x81\xf1\xea\xf0\xd9\x33\x14\x36\x6e\xfd\x4f\xfe\x0a\x79\xbe\xd3\x88\xe2\xeb\x67\xe4\xee\xd9\x05\x9e\x77\xa4\x4a\x1e\xba\x41\x41\xb4\x42\x71\xc3\x8d\xe2\x28\x74\x02\x67\x96\x34\xdc\x68\xf9\x8c\x8c\x9e\x67\x6b\x3c\x37\x3b\x66\x36\x6e\xcc\x35\xf6\x03\x1f\xdf\x97\x85\xa5\xb3\xc4\x10\xae\x9f\x62\x18\xbe\xec\x42\xf3\xee\xc5\x09\x9b\x72\x39\xd6\x4a\x03\x65\x92\xaf\xe5\x9a\x9d\xe4\x96\xd0\xac\x77\x32\xfd\x36\xc9\xac\x7d\xd7\x6f\xc2\x3e\x2c\x1d\xbc\x68\xcc\x83\x28\x4a\x81\xc2\x33\x68\xde\xb5\x9b\xf5\xdf\x35\x0d\x2d\xda\xb0\x43\x1a\xa6\xd5\x9f\xe6\xab\xcb\x88\xd2\xde\x0c\xd6\x96\x57\x41\xa1\xf7\x7b\x09\xce\x27\x27\x5b\x91\x1e\x90\xbe\xcb\xb0\xb6\x9a\xcd\xed\x78\x97\x53\x5c\x24\x25\x83\x60\x7f\x0b\xe5\xec\x9f\xbd\x9d\x01\x56\xb3\x94\x05\xb4\x52\x57\xa8\x86\x06\xc3\x56\x86\xa0\x1e\x3b\x5a\xca\xfe\xba\x32\x07\x65\x16\xe8\x28\xff\x4e\x70\xad\xef\x04\xb7\x49\x35\x89\xc0\x25\x15\x7f\x2f\x84\x2f\xca\xa4\xc3\xfe\xb5\x0a\x42\xa2\x73\x01\x54\x2f\xb8\x9c\x5c\x27\x0c\x23\xb2\x0c\x82\xeb\x18\x39\x98\x66\x5b\x38\x21\x5c\xec\x33\xd9\xfd\x52\x65\x06\x85\xaf\x58\x16\xfe\x1c\x7f\x78\x4e\x08\xb0\xff\x7c\xae\x14\x5a\x36\x2d\xb4\x6c\xb5\xb4\xc3\x4a\x3b\x02\x82\x94\x25\x56\x91\xae\xa1\x9b\x9a\x11\x96\xa0\x45\x16\xb7\x06\x35\xbf\x1f\x52\xdb\x2b\x6d\x62\x81\xbc\xb8\xf5\x53\xed\xf3\xe1\x15\x7c\x54\xcc\x4b\x7e\x47\x67\x21\xaf\xaf\xfc\x79\xda\x83\xaa\xa2\x25\x06\x1d\xc7\x86\x8a\x11\x9b\x00\x40\xb8\x71\xd2\xf3\xf4\xc2\xb4\xf6\x69\xeb\x7a\x31\xc8\xc4\x91\xf9\xc0\x4c\x7b\x9a\x80\x87\x63\xc3\x37\xfc\xba\x01\xcd\x1c\x3e\x42\x77\x9e\xb8\x0b\xdd\x04\x2c\xd8\x2a\x93\x96\x90\x65\x18\x0b\x98\x41\xc6\x6a\x3a\xab\xb9\x8b\xba\xec\xb8\xa7\xb5\x6d\xdd\x68\x9d\x51\xfd\x9a\x71\xd3\xc3\xdb\x1b\x96\x51\x8c\x09\x47\x1e\x6a\x1a\xe4\x57\x54\x6c\x9a\xc4\x34\xb3\xb6\x26\x19\x21\x69\x8b\x0c\x21\xda\xea\x57\xa1\x5d\x4c\xd3\xad\xfc\xd2\x22\xc5\xb0\xb5\x05\x43\xfa\x6b\x2b\x78\xb6\x36\xe0\x49\x7f\x6d\x09\xdb\x81\x8c\x2d\x03\xb6\x0b\xe2\x96\x2d\x30\xcf\x51\x62\x97\x52\xd2\xde\x89\x12\xfa\xdb\x52\xe8\x69\x6f\xa5\x87\xfe\xb6\x24\xaa\x4e\x4a\xa8\x62\xd0\x77\x22\xb0\x93\x23\x30\xa5\xd8\xce\x51\xdc\xd2\x3a\x28\x1c\xaa\xa1\x64\x8a\xd2\xc1\xbe\x6f\x29\xc3\x5d\x8c\x18\xe1\xca\x8c\x79\x70\xd5\x09\xc1\xc7\x28\x76\x70\x14\x13\x17\xcf\x5d\xa8\x61\x57\x74\x47\x1c\xeb\x19\xf7\x61\x69\xd8\x08\x27\x7c\xdb\x3d\xc4\x28\xbe\x71\x02\x9d\xcb\x22\x52\x53\x09\x26\x69\x72\x2a\x41\x9b\xdf\x40\x3a\xf0\x44\x41\x6a\x82\x32\x81\x7d\x28\xae\x34\x79\x60\x82\x8e\x58\xe2\x98\x49\x9c\xc8\x6c\xdd\x27\x7f\x55\x97\x83\x27\xa4\x80\x0d\x57\x09\x6a\x7a\xb9\xcf\x9e\xcb\xb1\xd9\xcc\x9b\xfe\x40\xb3\x3d\x69\xa8\x4e\x7d\xc8\x02\x5d\x9c\x06\x01\x4b\x9a\x46\x56\xc8\xc1\x8a\xe7\x2b\xdb\x45\x35\xc0\x22\x59\x55\xb9\x81\xd4\x3d\xd1\x99\xec\x6e\x3f\xe7\x53\xab\x4b\x85\x5d\xcc\xab\x30\x7f\x14\x19\x85\x82\x7d\xc9\x92\x33\xa5\xc5\xbe\xca\x89\x54\x62\x95\x1c\x47\x02\x27\xc1\x32\x28\x69\x53\x9d\xb3\x2c\xf0\x5d\x24\x99\x75\xca\x42\x83\x34\xab\xe7\xe7\x5f\x5a\x95\x07\x85\x0c\x0a\x39\x55\x7e\x69\xe6\x4c\x35\x6e\xe6\x87\x09\x72\x62\x77\x51\x4b\xa2\x18\x23\x6f\xea\xcc\x02\x64\x10\xbd\x5e\x1a\xe0\x46\xcb\x95\xbc\x74\x5a\x20\xc7\x33\x80\x66\xe9\x74\xc1\x32\xe0\x89\xd4\x46\xaa\xb6\xf4\x3d\xd5\xa5\xa8\x91\x86\xb0\x4f\x5b\xd6\x9f\xd9\xa9\x23\x4e\x77\xdf\xa2\xe5\x4a\x35\x3b\x6c\xb5\x54\xa3\xdd\x98\xb4\xcf\x3a\xbc\x82\xc2\x4a\x89\x68\x67\xd6\xfd\x25\x8e\xd8\x3e\x47\x6d\xe9\x7b\xf5\x2b\x78\x45\x49\x28\x86\xfa\xc8\x1f\x27\x60\xe9\xab\x5a\xa3\x4c\x86\xe2\x8f\x62\xae\xa9\x9b\xd3\xb8\xdd\x48\x86\x5c\xfc\x70\x13\x19\x94\xee\x2b\xa2\x34\x45\x42\xb8\xa8\x71\xbc\x46\x06\xa8\x2d\xd2\x69\xbd\x0c\x2e\x45\xe8\x41\x70\x69\x8b\xa2\xbb\x20\x6c\x87\x23\x0a\x85\x8a\xe5\x34\xcc\x0d\x9c\x24\x79\xeb\x60\x77\xf1\x1a\x85\xcc\x5a\xd6\x68\x59\x9a\x52\x0f\xca\xb4\x41\x46\xe2\xe7\x2f\x52\x61\xec\x84\xd7\xc5\x52\xff\x3a\x8c\x62\xea\xa8\xa5\x08\x48\xd5\x35\xe5\x73\x3f\x4e\x70\x80\x30\xf1\x29\xbb\x94\x46\xc5\x59\xa1\xc9\xfa\x69\x33\xb9\x23\xcc\x4d\x03\x37\xcc\x14\xf7\xba\x5c\x83\x18\x41\x7a\x4b\x53\x6e\x0c\xf8\x60\x10\xff\xd5\x27\xb3\x83\xac\xb4\xd4\x56\x76\xb3\x04\xe0\x74\x08\x70\x52\xc8\x0c\x41\x6e\x29\x57\x8a\x9a\x2b\xb6\x75\xf7\x9e\xee\xe9\xd5\x3a\xe5\x48\x4a\x9b\xac\xd9\x69\x73\xb3\xa4\x39\x8d\x6d\x36\x88\x39\x88\x31\x5d\x04\xf0\xc8\x92\x98\x1a\xdd\x7a\xbd\xd0\x46\xf0\x7a\x73\x8f\x7f\x96\x21\xcc\xc8\x97\x05\xa3\xad\x07\x69\xc8\xa8\xfa\xcb\x2f\xbf\x54\x8b\x68\x68\x47\x2e\x50\x1b\x2c\xc4\x5a\xc0\x10\x34\xa3\x58\xc6\xba\x7a\x55\xd5\x63\xa3\x6e\x07\x94\x76\xcf\x89\x63\x1c\x2a\x25\xeb\x6b\x98\x5e\x4a\x2d\x03\x16\xa3\x65\x74\x83\x18\xb0\x3a\xd0\xf0\xff\x32\xba\x21\x2e\x48\xd5\xac\x6e\x47\x82\x8d\x36\x03\x3e\x6b\xa0\xe5\x71\xfb\x52\x44\x0e\x24\xad\xc8\x46\xa0\x82\x7e\x9e\xe9\xf2\xce\x2e\x13\xc0\xc3\x06\x44\xd5\x61\x92\x22\xb4\x3e\x75\x0e\xe9\xfb\x05\x28\x41\x21\x4e\xe8\x9b\x21\x4c\xb3\x92\x06\xd4\x46\x67\xa7\xef\xa1\x37\xe9\x0f\x87\x45\xbc\xf5\x3c\x78\xfe\x9b\x01\x07\xcd\x2f\x94\x8d\x3d\x30\xe1\x1f\x3b\xb6\x3b\x78\x61\x80\x65\xdb\xac\xa1\x03\x26\xfc\xdf\x72\x3d\x73\x25\xec\xdd\x02\xf6\xf4\xfd\x81\x28\x90\x76\x6d\x1a\x3b\xe2\xd0\x34\xa0\x65\x69\x24\xa4\x53\x39\xcb\x7e\x51\x2f\xc7\xd0\x93\x30\xf4\x0a\x18\x7a\xfe\x35\x7d\xf5\x66\x37\xac\xda\x1d\x03\x7e\x7b\xc1\x18\xd3\x04\x13\x0e\xca\xbb\xbd\x96\xba\xbd\x2e\x74\x4b\x73\x07\xe8\x76\x8c\xb4\xa1\xc5\xc3\xda\xc9\xca\x71\xd1\xae\x18\x59\x06\x74\xb6\xb1\x29\xab\xdc\xde\x85\xab\x69\xf5\x56\xcb\x00\xab\x65\xef\x0e\xbe\xd5\x36\xc0\xfa\xed\x60\xf7\x06\xcf\x2d\xc2\xcf\x07\xb4\xf8\xed\x05\x69\xd2\xb1\x0e\x76\xa7\xa2\x63\x37\x5b\x06\x74\xec\x07\x10\xde\xb1\x09\x25\x1d\xbb\xb5\x3b\x6b\x3b\x76\xbb\x49\x9a\x74\x9e\x3f\xa0\x49\xa7\x43\x07\x5a\xe7\xc5\x97\x0d\xfa\x1b\x48\x8a\x14\x14\xed\x43\x74\x8b\x62\xba\x15\xf3\x2d\x96\xe2\x21\x23\x7e\x25\xe1\xb3\x2a\x2a\x36\x71\x9c\xd6\xec\x75\x25\x69\xd4\x7f\x0d\x52\x44\xfd\xda\x79\xd6\x6c\x50\x8d\x8e\x01\xcf\xdb\x3b\x57\x3f\xb0\x0c\x38\xd8\x5d\x58\x96\x4d\x06\x83\x9d\x6f\xa0\x70\x26\x91\x38\x93\x14\x38\x43\x87\xf5\x57\x58\xc2\x03\x32\x08\x77\xb4\x84\x2d\x7b\x47\x8b\xd9\x6a\xed\x58\xf1\x79\x73\xb7\x8a\xbf\xbd\xd8\x5a\x33\x53\x7c\xeb\xc0\x26\x63\xa5\xb9\xd5\xb4\x70\xe0\x1d\x7b\x57\xc2\x3a\xf6\xae\x94\x75\xec\xd6\xc1\xae\x35\x3b\x2f\x76\x9d\x88\xec\x4e\x67\x83\x82\xac\x25\x05\x59\x17\x14\x84\xee\xe3\x7e\xf3\x50\xde\x3c\xe9\x2b\xe8\xdc\x4a\xe8\xdc\x16\xd0\x71\x82\xd5\xc2\x09\xd7\x4b\x14\xfb\xee\xb7\x0e\xe5\xcd\xf3\xe6\xd7\x12\x53\xde\xee\x21\xf6\xec\x4e\xe2\xc2\x5d\x81\x0b\x0b\x74\xe7\x78\xc8\xf5\x97\xce\xe3\xfa\x0a\x9b\x69\x7e\x21\xd1\x7c\xf2\x10\x9a\x9b\x12\xcd\xf3\xbf\xdc\xfc\xef\xe2\xe6\x83\xbc\x5a\x55\x9b\x17\xa8\xde\xce\xe0\x87\x32\x57\xcb\xd8\xaf\x61\xea\x63\x32\xb4\x9c\x99\xbb\x32\x4e\xce\x02\x50\x63\x1d\x6a\x88\xa6\x92\xa1\x9e\x44\x82\x63\x4a\x3c\x23\x0d\xdd\xf8\xe1\x98\x52\x55\x23\xc6\xab\x9f\x6e\xa1\x03\x0f\x75\x7c\x30\xe8\xbb\xd6\x3e\x4b\xe9\x65\x0c\xa8\x6b\xc2\x74\xf1\xa5\x75\x05\x2f\x59\x20\x96\x40\x61\x09\x10\xe2\xe6\x65\x17\xe2\x4b\xfb\x4a\x2f\x5b\x29\x22\x55\xbe\x68\x94\xae\xb5\x41\x29\xc8\xd4\x48\x04\x04\x74\x61\xaf\x34\x0a\x5e\xa4\x56\xaa\x95\x05\x4c\xb9\xaa\xa5\xb5\xe9\xde\x5f\x39\xc7\x50\xe8\x19\x59\xa8\x48\x1b\x4a\xdb\x09\x81\x94\x71\xff\xe9\x82\x69\xa5\x8b\xe4\xda\x43\x11\x2b\xc5\x2c\x4b\x23\x67\xe9\x83\x22\xc9\x97\xbe\x1b\x8f\xee\x70\xec\xa4\x59\x3b\x06\xed\x9e\x95\xc5\x28\x59\x07\x18\x6e\x9c\x60\xad\x4d\x20\x4c\xd6\xb3\x77\x3e\x5e\x1c\x65\x2f\x09\xd2\x4d\x96\x64\xf6\x2d\x49\xc3\xc9\x4c\xb7\xfb\xf1\x57\xea\x30\xfc\x95\x3a\x2c\x9b\x87\xf4\xe6\xaf\xd4\xe1\x6d\xa9\xc3\xe9\x15\x95\x82\x48\x27\xe4\xe1\x79\xc7\x5d\xd0\x6d\x28\x84\x97\x08\x3b\x74\x12\xa9\x7d\xfe\x62\x7c\xa6\xa0\x3f\x7c\x58\xb2\x4d\xda\xea\xa7\x9b\x6a\xe5\x4b\x5d\x6e\x74\x4e\x43\x78\x0f\x6c\x99\x9a\x0f\x6a\xb3\x51\x9c\xed\x1f\xf0\xf3\x72\x0a\xfb\x07\xbc\x22\x74\xe1\x73\x36\x53\xa5\xef\x44\x74\xe1\xf3\x17\x23\x2d\x77\x9d\x15\x5e\xc7\xf2\xc6\xc2\x17\x79\xa6\xd0\x04\x1d\x29\x25\x97\xb4\xef\x2b\xe8\x82\xe8\xad\x68\xcf\x33\x92\xb3\xda\x4a\x65\x2e\xc6\x1c\x99\x2c\x2d\xb4\x46\xee\x0b\xdb\x7a\xd9\xdc\xd0\xaf\xe7\xe7\x57\xf2\x8c\x94\xeb\xa7\x50\xde\xf1\x61\x88\xee\xf0\x09\xa9\x59\x74\x3e\xe4\x2a\x13\x1c\xd7\x76\xf0\x97\x44\x13\xe2\xe9\xe3\x7c\x03\xcd\xe4\x5c\x46\x32\x76\xe2\xef\x45\xf0\x7c\x1d\x04\x63\x82\xde\x28\x3c\xfb\x2e\xb4\x97\x70\xf4\x01\xe4\x2f\xfd\x70\x9d\xfc\x20\xfa\x35\xc4\xe5\x37\x31\xcb\xe9\xda\x42\xc7\xbf\xd7\x28\xa1\xc8\xfe\xcc\xa2\xfc\x3a\x6a\x75\xe4\x72\xd3\x51\xf3\xbd\x72\x5a\x3f\xa8\xbd\x67\x5e\x04\xef\xb7\x21\xec\xcf\xa5\xef\x5d\x11\xff\xd7\xd4\x3f\xb1\xae\x34\x70\x78\x0d\x4f\xca\xd3\x12\x8d\xd9\xfc\x6c\x94\x01\x2b\x79\x60\x5f\xe9\xd0\xa5\x89\xdd\x3b\xf4\x41\x73\x55\xa4\x1b\xd8\x87\xa0\x20\xe9\x0c\xe7\x2e\x07\xac\x15\x39\x5d\x58\x90\xb9\xcb\x80\x20\xbf\x96\xd8\x4d\xd0\x3a\x61\x6f\x11\x38\x7c\x67\x33\xc7\x69\x9f\x90\xe9\xf6\x21\x5a\x53\x22\x44\x49\x8b\x44\x26\xcf\x0e\x44\xee\x8a\x63\xb4\xfa\x66\x14\xed\x1c\x8a\x05\xc7\xe8\x1b\x06\xdf\xcc\x09\x9c\xd0\x45\x71\x2d\xc1\x71\x3e\xed\x2c\x59\x2f\x35\x09\x47\x33\xd7\x00\xe4\xe6\x72\x1a\xc1\x32\xc0\xe2\x2b\xf3\xb4\xcc\x36\x8a\xaf\x95\xf3\x6d\x7b\xe2\xe1\xcf\xdc\x3a\x51\x6d\x14\xd6\x90\x64\xe5\x14\xf0\x62\x91\x3f\x73\x73\xab\x7e\xf4\x30\xbb\xe8\xf6\xa9\xdb\xe9\xd2\x15\x00\x21\xeb\x15\x34\xf5\x03\x86\xd1\x4c\x7e\xf3\x4c\xe6\xa0\x68\x85\x6e\x59\xf3\x2d\xd2\xc8\x4b\xa5\xac\x99\x7e\xea\x4c\x09\x99\xb9\xdb\x90\xcf\xa7\x66\xed\xd6\xc1\x46\x7a\xa3\x98\xf7\x6e\x6a\xde\xd1\x56\x31\x68\x6e\xe4\x8b\x6e\xf4\x97\x62\xb0\x1d\x71\xd8\xb6\x0b\x5e\x58\x8f\x57\x24\xa0\x8d\xd4\xa1\x65\x96\x40\x37\x30\x77\x72\x01\xd2\xf1\x89\xfe\x4d\x0d\x53\x89\x55\xd9\xa0\x1c\xfe\x1c\xe4\x39\x01\x5e\x49\x00\x9c\x98\x74\x47\xd5\x37\x45\x3c\x8e\x96\xb4\x27\xba\x6c\x56\x1a\x2a\x5d\xfb\xe1\xf5\x29\xd2\x6c\xf8\x67\x55\xa2\x95\x2e\xa5\x43\x43\x50\xe8\x07\xdb\x0c\x4b\xe0\x24\x94\x2e\xa9\xa8\x34\xb7\x88\xdb\x02\x01\x55\x4a\x10\xaa\xa5\x62\xc8\xdb\x8f\x6b\x14\xaa\x09\x44\x74\x49\x50\x6e\x0c\xb4\x41\x9f\x6b\x94\x4f\xce\x94\xa8\xa9\xd7\x94\x1c\x2a\x69\x45\xc3\x13\x92\x66\xc9\xc6\x8c\x24\x99\x49\xfe\xbc\x2c\xdd\x42\x89\x76\x16\x74\xd1\x10\xab\x17\x6d\xba\x97\x58\xaa\xc9\x41\x27\x4d\xa0\x97\xf3\xbd\x2c\x59\x88\x1e\xcc\x5a\xb5\xec\x56\xfb\xb7\xe7\x2f\x3a\x07\x55\x83\xd0\x66\x19\x54\x11\x4a\x1c\x48\xde\x52\xc8\xb8\xbc\xd2\x03\x28\x14\xc0\x34\x31\xfb\x54\xf2\xa2\x3f\x95\xb9\xf2\x9f\xce\xa0\xee\x82\x84\xf0\x3d\xd3\xf4\x3c\xb7\x5e\xb2\x79\x90\xee\xcf\xcc\x4a\x32\x99\xfe\xff\x63\x0e\x9f\xcf\xb5\xcf\x66\x46\x9a\x61\x97\x7a\x08\x62\xb4\x51\xf5\xdf\x27\xba\x42\xff\x1f\x94\x60\xb7\x8d\xc6\xd9\x03\xa6\x00\x89\x4a\xdd\x90\xa8\x3e\xad\x42\xa3\x01\xee\x6e\x33\x6d\x49\xcc\xbf\x14\x81\x54\xf4\xbf\xfe\x10\xd1\x93\x45\xfc\x23\x09\xbe\x8c\x9d\x90\xe5\x00\xfa\xfc\x14\x14\x2a\x59\x70\xe6\x18\xc5\x50\x15\x6f\x2f\x72\x71\x13\x49\x27\x25\xa8\xe8\x18\xac\x8c\x97\xfd\x9f\x6b\xbc\xfc\x4f\x63\xbf\xf9\x23\xd8\xcf\x22\x2f\xff\x45\x5c\xfb\x5f\x3f\x82\x6b\x69\x9c\xe7\xbf\x88\x71\x7f\x6e\x66\xdc\x4c\x7a\x67\xad\x14\xd7\x82\x87\x5b\x96\x71\xfc\xd3\x50\xfd\xb7\x2d\x54\x23\x52\x8b\xac\x74\x99\xb7\xba\x1b\xf9\x38\x1a\x84\xde\x4f\x4f\xfa\xe5\xcf\x63\xde\x4b\xfd\x1c\xde\x2c\x75\x69\x74\x2e\x44\xc1\xbb\xd9\xe6\x07\xd6\x7e\x1e\xc2\xe1\x3b\x38\xc9\x22\x02\x65\xc0\xe7\x92\x8c\x15\x35\x53\x24\x31\xe0\x49\xbe\xed\xd7\xf9\x85\x4a\x78\xcf\x4d\x2e\x9f\xb8\xc9\x55\x09\xe1\x34\x3e\xa1\xf7\x4a\xad\x3a\x95\x52\x9d\x67\x53\x15\x02\x6b\x05\x64\xaf\x1a\x68\xb9\xc2\xf7\x7c\xc0\x6d\x57\xfc\xfa\x7f\x8d\xfc\xd3\x28\x38\xa1\x5d\xc9\xb7\x29\x91\xa0\x78\xd9\xcc\x59\x6d\xa6\x2e\x67\x83\x38\xa7\x0f\x61\xaf\xb6\x07\xf4\x24\xfd\xf0\x5a\xf3\xfe\xc9\x26\x54\x77\xd6\x9d\x68\x55\x73\x9d\xd5\xb6\x31\xdc\xf8\x79\x64\xb8\xcd\x78\xc9\xb1\x29\xb7\x5f\x4f\xf3\x57\xfa\x3c\x73\x65\xab\xbe\x3e\xdd\x44\x6b\xe9\xcb\x4e\xb0\x69\x9e\xf9\xf9\x58\xa4\x8d\x97\x3c\x38\x5e\x58\x01\x35\x3b\xe0\x89\x9b\x14\x23\xc6\xa5\xca\x5d\xcf\x2b\xb7\x04\x49\xcf\xae\xaf\x63\x4f\x2e\xfd\xac\xbc\xb9\x26\x18\xe6\xcf\x73\x6e\x86\x1c\x59\x4c\x70\x4c\x94\x6a\xf7\x18\x62\x21\xa4\x5b\xd0\x98\x4d\xc1\x46\x39\xf6\xa6\xc6\x66\x45\x90\x54\x39\x40\x02\x05\xf3\xac\x23\x72\x47\x49\xa5\xd9\x10\xe2\x7a\x1f\xd4\xf3\x05\x64\x78\x13\x7a\x48\xcf\x26\x70\xec\x18\x9f\xf4\xb2\x0c\x58\x82\x63\x1a\x0c\x2e\x87\xc6\xec\x6a\x14\x78\xa2\x1e\x85\x49\x79\x95\xab\xa3\x76\xa9\xa2\x13\x17\x3a\x51\xf5\x39\x11\x08\xe7\xf6\xae\x92\xb4\xa5\xc0\xa0\x54\xc5\x33\x9d\x29\x6c\x0c\x3f\x06\x75\x45\xf9\x14\xde\xc8\xfe\x26\xfa\xe7\x19\x9e\x3f\x88\x33\x1b\x95\xe8\x6b\xc5\xae\x6c\xda\xe8\x39\xf7\x93\x70\x46\x61\xcd\x2a\x8e\x5c\x94\x24\x79\x7e\x18\xc0\xce\x5c\xa0\x3b\x14\x15\xed\x80\xcd\xa8\x4d\xf8\x2a\x8f\xfd\x4f\x73\x10\x21\x1b\x92\x7c\x03\xa4\x0b\x35\x56\x27\x4b\xe8\x4b\xdb\xa4\x99\x83\x38\xae\xc3\x3e\x2f\xdf\x2f\x80\xca\xb6\x33\x14\xd0\x1b\x6c\x40\x49\x05\x6e\x14\xbb\xf9\x8e\x0b\xb8\xd3\x13\x2b\x54\x66\xf3\x27\xd4\x18\x4a\xef\x48\x3f\x5c\xb4\x96\x22\xa0\xf4\xc6\x34\xa5\xfd\x98\x73\x96\xdc\x99\x1f\x5d\x4a\x9d\xa3\x7b\x9c\x3f\xa7\x89\x1f\x44\x03\x69\xc2\x21\xf1\xf9\x32\xc4\x35\x07\x08\x08\xce\xbd\xcc\xf3\x48\xeb\x1c\x98\xe6\xe5\xa5\x98\x13\x09\x8a\x59\xab\x72\x67\x82\x9f\x71\x4c\x8f\x78\x98\xdd\x63\x54\x35\x52\xec\xf5\x3e\x83\xbb\xc8\x6a\x64\x7b\xd6\x69\xea\x6c\xba\x79\x9d\x76\x6d\xa6\xf8\x98\xa4\xfc\x71\xa0\x6f\x05\x24\x01\x49\x2f\x75\x1b\xd0\xa5\xae\xd8\x4e\x98\x08\x22\xb3\xab\xdd\x02\xe6\x45\x25\x82\xab\xab\x42\x2d\xfa\x66\xb8\x92\x00\x90\xf6\x57\xde\x9d\x69\x72\x91\xba\x0b\x27\xae\x1a\x94\x0e\x25\xbd\x7f\xa1\x71\x06\x53\x23\xc2\x36\x6e\xd3\xdb\xab\xda\xc6\xa6\x5a\xe6\x95\xc3\x32\xad\xcd\x19\x2a\xb2\x33\xa5\x9a\x96\x82\xfa\x2a\x79\x46\xd2\x8e\xa2\xf8\x63\xf9\xff\x2b\xc7\x8f\xa5\x43\xbd\x09\xc8\x74\x25\xad\x4b\xde\xf1\xe7\xb4\x2a\x5f\xb7\xee\xf8\xba\x4c\xba\xac\x27\x4d\x2f\xad\xab\x07\xbf\x2a\x53\x00\xa4\x88\x9c\x43\xe5\x17\xb6\x6e\xe1\xbe\xed\x5d\x16\x91\x54\x2b\xb3\x54\x19\xa0\x96\x01\xeb\x70\xe5\xb8\x9f\x6a\xc5\x40\x43\x61\x9a\xe2\xd0\x44\xc2\xa8\x38\x75\x48\xf3\x8d\x22\x39\xbd\x7e\xf3\x57\x2b\x41\x93\x22\xab\xa4\xb3\x66\x1b\xf2\x9b\xb2\x6c\x55\xd4\x0e\xf9\x44\xca\x4f\x4d\xa2\x5f\xbf\xcc\x61\x4b\x6b\xea\xd0\x2d\xfb\x7a\x26\xd5\x92\x90\x6e\xa9\xd3\x7f\xb9\xec\xfe\x79\xb4\xa6\x11\xc6\xcf\xa5\x24\xd7\xd3\x2c\x5e\x5a\xf7\xd2\xca\xbd\x59\x92\x3e\x68\x69\x5e\x39\x49\x4f\x86\xa2\xb2\xa2\xf5\x0c\x68\x15\x65\x05\xea\x59\xac\xa9\x2e\x89\x2e\xc5\x95\x48\xab\x93\xde\xa9\x10\x9c\xb9\x2e\x65\x4d\xd9\x77\x43\x59\xa7\xd7\xe8\x8e\xf8\x14\xa2\x5b\x56\xc1\x32\x2c\x7a\xdc\x6a\xf5\xcf\x2a\x73\x31\x58\xbd\x28\x06\xbe\xcf\x48\xef\x25\x3e\x12\xfb\xc8\xdf\x4e\xb0\x64\xc9\x96\x66\x31\x6c\x66\xbc\x00\x57\xff\x52\xe4\x73\x5e\x00\xc0\xcd\x33\xef\x5e\x30\xaa\x90\x00\x94\x02\xa0\xaf\x52\x86\x1e\x58\x84\x1e\x9d\xd4\x4a\x25\xa7\xb6\xdc\x9c\x0e\xfa\x10\x71\xe6\x87\xad\xee\x60\x25\x71\x3e\x2f\xfb\xa6\xab\x13\x5f\x2b\xaf\x87\xc4\xd4\x57\xaa\x56\x85\xae\xd2\xf3\x6c\x49\x55\x16\x03\x64\x3a\x52\xd5\x1d\xc7\x56\xb2\x15\xcc\x4f\xac\x5d\x2f\xd3\x12\x9a\xfb\x41\x8c\xb3\x92\x7a\x42\x7a\x28\xfa\x41\xd2\x29\x34\x65\xc9\x17\xdf\x2d\x24\xc3\x58\x41\x7e\x1b\x0d\x70\xb7\xdb\x5e\x1d\x9c\x90\x26\x71\x49\x29\x11\x3a\x0a\x48\xa5\x52\xe4\x15\x2c\x88\xb4\x2e\xc3\xf5\xb2\xe8\x31\x3c\x16\x15\xb0\x65\x53\x5f\x17\xdd\x61\xa1\xb1\x9c\xa6\xd0\x19\xae\x5a\x78\xa9\x87\xe2\xb2\x0a\x2e\x29\x25\x16\x35\xef\xf4\xb2\x79\x45\xaf\xb9\xe2\xe9\x41\x0a\x15\xae\x16\x0c\xe7\x13\x02\x43\x9f\x89\x98\xf5\x59\xe3\x63\x90\xd4\x35\xc0\xaa\xd7\xa5\x0e\xb5\x2c\x94\x9a\x72\x1c\x0b\x4d\x72\x6b\x5c\x3e\x56\x63\x84\xe9\xd0\x93\x8c\x6a\xf6\xd1\x3c\xd5\xa4\x6e\xfc\xd2\x32\x01\x49\x2f\x89\x2f\x4b\xff\xb3\xb7\xcd\x40\x3f\x5c\xf9\xfb\x67\x31\xba\x61\xbb\x5d\x72\xc5\xec\xb0\xa8\xa2\x11\xa7\x69\x4a\xba\xb9\xcc\xc7\xb5\xba\x7c\xb4\x55\x98\x26\x24\xb2\x55\xcc\x13\x56\x53\x7c\x8f\x8d\xa1\xf8\x9f\x2e\x84\xc5\x23\xa8\xa9\x80\xba\xf0\xf9\xb2\x79\x95\x77\x6d\x35\xc6\xcc\x28\xcc\x74\x5f\x0a\x4a\x44\x15\x5a\x75\x98\x18\xe5\x19\x44\x76\x34\xb4\x68\x48\x67\x1b\xbd\xed\x03\xba\x1e\x12\x7c\xd3\x5a\x7e\x42\x7b\xa8\x94\x68\xd8\x54\xd4\x83\x32\x24\xeb\x06\x84\xb2\x79\x26\x75\x98\x33\xcb\x3e\x72\x2e\xaf\x86\x59\x51\xb2\x9e\x65\x9c\x63\x45\xe2\xec\xf3\xae\x7c\x12\x3a\x7b\xe4\xb2\x49\x4c\xbc\x4a\xc6\x0a\xb3\xe3\x2a\xf3\xc7\xcb\x36\x98\x1d\x56\xf2\x01\xd9\x83\x59\xb6\x0a\x52\x1a\x64\xdf\xa8\x14\x13\x2f\x2b\x67\xaf\xb1\x8a\x72\xe6\x4b\xb0\x1e\xf8\x13\x59\x0d\xf9\x13\xfe\x89\xc9\x6e\x3a\x24\x58\x79\xf6\x89\x4c\xfa\x6d\x4c\xd6\x2d\xfb\xfc\x65\x97\x7f\x07\x93\x73\x8b\x9e\x45\xdf\x65\x27\xa6\x70\x52\xe9\xc9\xf9\x5d\x76\xf2\x82\xe0\x96\xf8\xc6\x65\x8c\x56\x95\x4a\x96\x5f\xbe\x70\xe2\x1e\xe6\xbe\x62\x5d\x4c\x7c\x3e\xbc\xec\x82\x90\x05\x8b\x47\xe8\x5e\x50\x14\xa2\x49\x4f\xe3\xe5\x10\x74\xaf\xd1\x4a\x2f\x33\x52\xc9\xfb\x73\x78\x8d\xf0\x88\x7e\x62\xbc\xb6\xe7\xac\x71\xe4\x06\x51\x82\xf6\xa8\xb5\x0b\xfd\x20\xeb\xb0\xe7\x79\xc5\x6a\x62\xe0\x4a\x5a\x94\x3e\x3c\x27\xeb\x1e\xa2\x4f\x7b\xff\xdc\xfb\xe7\xde\x9e\x01\x7b\xd5\x2a\xf9\xfd\xd7\xbf\xc8\x6f\xad\x4e\x7e\x3f\x7f\x21\xbf\x97\x57\x7b\x5f\xa4\xd6\x67\xe8\x36\xf0\x43\xa9\x7d\xa1\x6e\xc6\xb8\x28\x1c\xaf\x43\x54\x8b\x0d\xb8\x49\xd9\x46\x26\xec\x12\xa2\x34\xec\x53\xd7\x17\xc4\x31\xf0\xf9\x01\x8e\x39\x4a\x24\x7b\xe2\xcf\x21\x66\xaf\x6a\x50\xb1\xa9\x15\x2f\xfd\x2b\x03\x6c\x4d\x56\x00\x5f\x36\xae\xe3\x53\x3f\x24\xfa\x7c\xd3\x38\x5a\xcf\x0f\xc9\x4d\xed\xa6\xd1\x5f\xc7\x49\x14\x37\xde\x4b\xc1\x35\xde\x13\xef\x84\xb7\x33\x20\xad\xfb\xf7\x7d\xb6\x2b\xfa\x30\x2c\xc8\xdf\xcd\xe1\x91\xe3\x7e\xa2\x47\xc6\xd4\xe8\x04\x5b\xf4\x09\x6e\x0e\x59\x2f\x63\xff\x7a\x81\xcb\x2a\x69\x8e\x7b\x93\x57\xd2\x9c\x80\x0c\x61\x7a\x54\x25\xfd\xec\xda\x30\x79\x17\xc5\xf4\x25\xcd\x5a\x39\x7d\x26\x9f\x20\x37\xd6\xd8\xcc\x01\x02\x61\xd7\x93\xea\x4a\x5e\x9b\xdf\x2e\x6c\xdd\x57\xe9\xbe\x52\xd8\x12\xaf\xba\xd2\xd8\xe7\x70\xea\xe2\xb3\x7c\x3b\xb1\x6f\xbf\x94\x78\xd3\xa4\xa7\xf0\x56\xcd\x2a\x2c\x50\x8c\xc0\xa7\x6f\x2f\x7b\x28\x46\x73\x14\xf2\x6f\xcf\xaf\x22\x7a\x10\x2f\x79\x90\x82\x3c\x8d\x5c\x7e\x98\xaf\x9f\xd0\xa1\xba\x74\xc4\x77\xb4\x96\x8e\x57\x74\xfe\x4c\x13\x6e\x17\x28\xe4\xdf\xf1\xc0\x7e\x78\x0d\xd7\xf4\x2d\x69\xfa\x01\x77\x1c\x41\xb0\x76\x74\x8d\x86\x98\x7e\xa8\x95\x56\x99\x21\x8e\x58\x4c\x50\xf3\x60\x86\x5c\x67\x9d\x30\x1c\x53\x33\xc0\x3e\x82\x91\x80\x03\x61\x14\xa6\xa8\xb3\x8e\x8a\xaa\x4d\x45\x31\x64\x81\x0f\x53\x26\xce\xd8\x38\x96\x76\xd5\xff\xfc\x75\x6a\x6c\x53\x74\x57\x31\x62\xdd\x73\x53\x57\x7b\x1c\xe3\xb5\xa3\xce\x29\x55\x89\xf9\x84\xee\x86\x21\x26\xd7\x0f\xd1\x1d\xde\xda\x60\xdf\x92\x9b\xdc\x12\x13\xfe\x1a\xe1\x53\xe4\x78\x7e\x78\xfd\x6e\xe1\x63\xc4\x0c\x8f\xd0\x69\xbd\xe1\x55\x26\x01\xd5\xf4\xa6\x58\x2b\x63\x52\x6e\x50\x3a\x2a\x09\x83\x53\x1a\x36\x37\x2f\xb7\x9d\xaa\xe8\x4a\xed\x27\xab\x36\x75\x66\xa5\x55\x36\xe8\xe1\xde\x3f\xc3\x3d\xe2\xb7\xdd\x6a\x72\x36\x0a\xe7\x78\x6c\x53\x3e\xd9\x1f\xa4\xeb\xcf\x82\x36\x66\xd3\xc1\x8f\x9c\x46\x1f\xa0\xaf\xf0\x18\x73\xa1\x38\x5a\xa5\x44\xd1\x1f\x6e\xe4\x6f\x0e\x8f\x51\x80\x70\x41\x09\xb6\x32\xff\xff\x05\x00\x00\xff\xff\x56\x47\xd4\x29\x4e\x88\x00\x00") +var _runtimePluginsAutocloseAutocloseLua = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x7b\x77\xda\x3a\xf6\xe8\xff\x7c\x8a\x7d\xd2\xe9\x02\x4e\x6c\x8a\x0d\xa7\x25\x39\xa5\x77\x11\x42\x5a\xd6\x4d\x43\x2e\x90\xd3\xe9\x64\x72\x3a\xc6\x16\xc1\xad\xb1\x19\x5b\xe4\x71\xbb\x3a\x9f\xfd\x2e\xbd\x6c\xc9\x96\x81\xb4\x69\x57\xef\xfc\x4e\xfe\x20\xb6\x2c\x6d\xed\x97\xb6\xb6\xb6\xb6\x65\xd3\x84\xbf\x0d\xbd\x43\x58\xe3\x79\xa7\x11\xac\x1d\xb0\x5e\x1c\x80\xdd\x6c\x1e\x98\xcd\xb6\xd9\x6c\x81\xd5\x39\xb4\x9a\x87\xcd\xd6\x3f\x60\xe5\x24\xd8\x81\xbf\x55\x4c\xb3\x62\x9a\x70\x1e\x47\x37\xbe\x87\x12\xb8\x98\x9e\x98\x1d\x70\x6e\x9d\x18\x41\x82\x63\x3f\xbc\x86\xf9\x3a\x74\xb1\x1f\x85\x09\xf8\xcb\x55\x80\x96\x28\xc4\xc8\x03\x3f\x84\xd5\x3a\x46\x10\xac\x9d\x43\x02\xe1\x57\xda\x67\x80\xc2\x5a\x52\xcf\xee\x93\xf5\xac\x96\x18\xe0\x1b\xf0\x51\x2a\x8d\xd1\x0d\x8a\x13\xa4\xd4\x74\x17\x4e\x5c\x5b\x87\xbe\x1b\x79\x48\x2a\xe6\x25\x1a\x20\xd7\x28\xe4\xd0\x93\xf5\xec\x43\x80\x42\xe9\xd9\xdc\x0f\xbd\x5a\x82\x63\x03\x62\x74\x8d\xee\x0c\xf0\x43\x1f\x1b\xb0\x0a\x1c\x5f\xae\xb6\x74\xb0\xbb\x28\xd4\x93\xfb\x28\xd6\x70\x82\x40\xae\x40\x51\x90\x1e\xc7\x68\x15\x18\x10\xf8\x4b\x06\x87\xd4\x1c\xce\x69\x55\xcf\xc1\x0e\x15\x49\xcd\x8d\x42\xec\xf8\x21\xe1\x2d\x5e\x20\x08\xa2\x5b\x14\xbf\x34\x5f\xad\x57\x2b\x14\x83\xeb\x24\x08\x96\xce\x6a\xe5\x87\xd7\x49\x1d\xfc\x04\x82\xc8\xf1\x90\x67\x90\xba\x09\x22\x00\x1d\xcf\xf3\x89\x40\x9c\x40\x92\x0d\x11\x98\x73\xe3\xf8\x81\x33\x0b\x90\x24\x11\x0a\x55\xe1\x34\xed\x8f\x95\x90\xc2\x5e\x20\x83\x99\xa1\x85\x73\x83\xc0\x49\x48\x77\x7e\x0c\x61\x14\x2a\x3a\xe1\x46\xeb\x10\xa3\x78\xe5\xc4\x38\x81\x5b\x1f\x2f\x28\x09\xe8\xce\x45\x2b\x02\x80\x00\xc4\x0b\x07\xf3\x36\x44\xa8\x8e\x8b\x51\xcc\xf0\x5b\x27\x54\x71\x12\x8c\x1c\x0f\xa2\x39\xcc\xee\x31\x4a\x60\x1e\xc5\x84\xab\xb0\x0e\x7d\x9c\x34\x2a\x15\xd3\xbc\xbc\xac\xf4\xa3\xd5\x7d\xec\x5f\x2f\x30\xd4\xdc\x3a\xd1\xe0\xe7\xa6\xdd\x6c\xbe\x30\xe0\x7f\xdf\x07\x08\x26\x4b\x1f\x2f\x2a\x04\x73\x5a\x27\x81\x18\x25\x28\xbe\x41\x5e\xa3\x52\xe9\x47\x21\x8e\xfd\xd9\x1a\x47\x71\x72\x58\x01\x00\xe8\x05\xfe\x32\xba\x81\x09\x46\x2b\x27\xac\x54\xc6\xc8\xf3\x13\x56\xc5\x8f\x42\x70\x42\x8f\x20\x46\x14\x3a\x89\xd6\xb1\x8b\x68\xc9\xcc\x0f\x9d\xf8\x9e\xe0\xb6\x4c\x0c\x46\x68\x14\xd3\xff\xd1\x1a\x57\x96\x91\xe7\xcf\x7d\xd7\x21\x00\x0c\x4a\xda\x0a\xc5\x4b\x1f\x93\x81\xb1\x62\x43\xc9\x63\x7c\x20\xdc\x99\x47\x41\x10\xdd\x12\x71\xbb\x51\xc8\x44\xc7\xf8\xb1\x44\xf8\xb0\x42\x51\xfc\x15\x54\xac\x12\xc2\x1e\x8e\x0e\xd1\x7f\x58\xae\x13\x0c\x31\x22\x7a\x43\x61\x3a\xb3\xe8\x86\x3c\x12\x5c\x0a\x23\xec\xbb\xc8\xa0\xc0\x00\xf0\x82\xe8\x8d\x9f\x60\x02\x46\xee\x34\xf4\x72\x18\x79\x7e\xe2\x06\x8e\xbf\x44\x71\xa3\x04\x11\x3f\x94\x99\x21\x10\x59\xc5\x91\xb7\x76\x91\x0e\x17\x8e\x03\xc7\xe8\xab\x70\x01\x46\x25\x87\xe4\x45\xee\x9a\x58\x1d\x47\xc8\xeb\x59\x14\x43\x84\x17\x28\x86\xa5\x83\x51\xec\x3b\x41\x92\xb1\x3d\x55\x4a\x99\x0c\x41\xdc\x19\xf2\x69\x3b\xf2\x3c\x74\x96\x88\xe0\x44\x49\x58\xe3\x45\x44\xb4\x3d\x7b\x44\x45\xe0\xe3\x84\xe0\x9c\x2a\x14\x2c\x9d\x7b\x98\x09\xc4\xa8\x3e\xe3\x08\x50\xe8\x45\x71\x82\x88\x86\xac\xe2\x68\x19\x61\x04\x8c\x3f\x38\x01\x0f\xc5\xfe\x0d\xf2\x60\x1e\x47\x4b\xc6\x8b\x24\x9a\x63\x3a\x96\x84\x36\x31\x60\xc9\x0a\xb9\x44\xa9\x60\x15\xfb\x44\xd5\x62\xa2\x4e\x21\x53\xac\x24\xa1\x34\x54\xa6\x6f\x86\x13\x98\x8c\x4e\xa6\xef\x7a\xe3\x01\x0c\x27\x70\x3e\x1e\xfd\x31\x3c\x1e\x1c\xc3\xd1\x7b\x98\xbe\x19\x40\x7f\x74\xfe\x7e\x3c\x7c\xfd\x66\x0a\x6f\x46\xa7\xc7\x83\xf1\x04\x7a\x67\xc7\xd0\x1f\x9d\x4d\xc7\xc3\xa3\x8b\xe9\x68\x3c\x81\xbd\xde\x04\x86\x93\xbd\x0a\x79\xd0\x3b\x7b\x0f\x83\xbf\x9f\x8f\x07\x93\x09\x8c\xc6\x30\x7c\x7b\x7e\x3a\x1c\x1c\xc3\xbb\xde\x78\xdc\x3b\x9b\x0e\x07\x13\x03\x86\x67\xfd\xd3\x8b\xe3\xe1\xd9\x6b\x03\x8e\x2e\xa6\x70\x36\x9a\xc2\xe9\xf0\xed\x70\x3a\x38\x86\xe9\xc8\x20\x9d\x56\x8a\xcd\x60\x74\x02\x6f\x07\xe3\xfe\x9b\xde\xd9\xb4\x77\x34\x3c\x1d\x4e\xdf\x53\x44\x4e\x86\xd3\x33\xd2\xd7\xc9\x68\x0c\x3d\x38\xef\x8d\xa7\xc3\xfe\xc5\x69\x6f\x0c\xe7\x17\xe3\xf3\xd1\x64\x00\xbd\xf1\xa0\x72\x3c\x9c\xf4\x4f\x7b\xc3\xb7\x83\xe3\x06\x0c\xcf\xe0\x6c\x04\x83\x3f\x06\x67\x53\x98\xbc\xe9\x9d\x9e\xe6\xa8\x1c\xbd\x3b\x1b\x8c\x09\xea\x0a\x89\x47\x03\x38\x1d\xf6\x8e\x4e\x07\x15\xda\xd1\xd9\x7b\x38\x1e\x8e\x07\xfd\x29\xa1\x26\xbb\xea\x0f\x8f\x07\x67\xd3\xde\xa9\x01\x93\xf3\x41\x7f\x48\x2e\x06\x7f\x1f\xbc\x3d\x3f\xed\x8d\xdf\x1b\x1c\xe6\x64\xf0\x7f\x2e\x06\x67\xd3\x61\xef\xb4\x72\xdc\x7b\xdb\x7b\x3d\x98\x40\x6d\x0b\x47\xce\xc7\xa3\xfe\xc5\x78\xf0\x96\xa0\x3c\x3a\x81\xc9\xc5\xd1\x64\x3a\x9c\x5e\x4c\x07\xf0\x7a\x34\x3a\x26\x7c\xae\x4c\x06\xe3\x3f\x86\xfd\xc1\xe4\x77\x38\x1d\x4d\x28\xb3\x2e\x26\x03\x03\x8e\x7b\xd3\x1e\xed\xf8\x7c\x3c\x3a\x19\x4e\x27\xbf\x93\xeb\xa3\x8b\xc9\x90\xf2\x6c\x78\x36\x1d\x8c\xc7\x17\xe7\xd3\xe1\xe8\xac\x0e\x6f\x46\xef\x06\x7f\x0c\xc6\x95\x7e\xef\x62\x32\x38\xa6\xcc\x1d\x9d\x51\x52\xa7\x6f\x06\xa3\xf1\x7b\x02\x94\xf0\x80\xf2\xde\x80\x77\x6f\x06\xd3\x37\x83\x31\xe1\x27\xe5\x54\x8f\xb0\x60\x32\x1d\x0f\xfb\x53\xa9\x5a\x65\x34\x86\xe9\x68\x3c\x95\x68\x84\xb3\xc1\xeb\xd3\xe1\xeb\xc1\x59\x7f\x40\xb0\x19\x11\x28\xef\x86\x93\x41\x1d\x7a\xe3\xe1\x84\x54\x18\xb2\x6e\xdf\xf5\xde\xc3\xe8\x82\x92\x4c\x44\x74\x31\x19\x54\xe8\xa5\xa4\xb0\x06\x15\x24\x0c\x4f\xa0\x77\xfc\xc7\x90\xa0\xcd\x2b\x9f\x8f\x26\x93\x21\x57\x13\xca\xb2\xfe\x1b\x60\xec\x6e\x54\x4c\xf3\xea\xaa\x42\xe7\xa9\xa3\xb3\x13\x36\x8a\xc6\x27\x7d\x68\x3d\xb7\x0f\xf8\x04\x76\x31\x3d\xe9\x98\x91\x8b\x11\x4e\xa0\x0b\xbf\xd6\x58\x01\x99\x7a\xa0\x9e\x3e\xa7\xb7\x00\x5d\x76\x67\xc1\x33\x76\x61\x8b\x8b\x96\xb8\x68\xa7\x4d\x2c\x36\x2e\xbb\xf0\xf4\xae\xd9\x34\x5f\x9c\xa4\x0f\xec\xec\x41\xdf\x36\x8f\x4f\x58\x29\x76\xfc\x20\xad\xd2\xca\xaa\x0c\x9a\xf0\xf4\xae\xd7\x34\x8f\xa4\x7a\xf0\x8c\x3c\xb0\xcc\x41\x1f\xec\x9a\x54\x5c\x87\x67\x04\x84\xfa\xf7\xf4\x6e\x70\x0c\x4f\xef\x3a\x4d\xf3\xa0\x00\x62\x60\x0e\x4e\x72\x20\x52\x1c\xda\x19\x0e\x27\x04\x87\x03\x8a\x43\xbe\x3f\xf2\xd4\x32\x4f\x5a\xd0\xda\x01\x91\x93\x36\x43\xa4\x53\xda\x29\xbd\x65\x9d\x76\x48\x7f\x44\x46\x95\x20\x72\x9d\x80\xce\xf6\x0c\x21\xe6\x58\x36\x48\x01\x7f\xc6\xc5\x93\x3d\x23\x05\xfc\x99\xb7\x5e\xae\x94\x67\xa4\x80\x3f\x23\x8e\x9e\xf2\x8c\x14\x88\x67\x51\xbc\x74\xb0\xfc\x8c\x16\xf0\xa7\x01\x0a\x41\x69\x19\xa0\x50\x3c\x22\x0e\x92\xf2\x88\x14\xf0\x87\x31\x5a\xa9\xed\x62\x24\x90\x49\xd6\x33\xf5\x51\xb2\x9e\xf1\x47\xcc\xb7\x93\x1e\xd1\x02\xaa\xd7\x31\xc2\xeb\x38\x4c\xd8\xbc\xb3\x5e\xce\x50\x9c\xb9\x46\x74\x82\x99\xdd\xd3\x67\x39\x8f\x0a\x1c\xcc\x38\xea\x53\xcf\x85\xfa\x85\x41\x12\x81\x17\xad\x67\x01\x4a\x88\x07\xe7\x14\xda\xdc\x38\x81\xef\x39\x38\x12\xc4\x08\xbf\x2f\xf5\xc0\x59\xb7\xd4\xdb\xae\xd3\x79\x89\x80\x8d\xaf\xe9\xf4\x0b\x1e\x9a\x3b\xeb\x00\x27\xf4\x81\x0f\x5d\xf0\xc9\x8c\x67\x55\x0a\x15\xdd\x05\x72\x3f\xf9\xe1\x35\xab\x38\x07\x7c\xbf\x22\xce\x3e\xfc\xa7\x0b\x7b\x8c\xfe\x3d\x42\x52\x58\x11\x9a\x85\xe2\x38\x8a\x6b\x7b\x33\xc7\xcb\x80\x3c\xb1\xc8\xd4\x5a\x55\x30\xab\x42\x8d\x2f\x4a\xd0\xdd\x0a\xb9\x98\xb8\xc5\xd7\x11\x86\xbd\x46\x43\x74\xd2\x68\xc0\x5e\x7d\x8f\x21\x8f\x42\x4f\x41\xc1\x67\x28\x30\x2e\xef\x82\x82\xad\x45\x81\x4b\xa9\x04\x05\xbf\x80\x02\xbd\xe0\x7a\x0e\x5d\x2a\x35\xce\x61\xc1\x39\x0f\x61\x32\xcd\x87\x88\xcb\x3d\x44\x88\xb8\x32\xc4\x33\x4e\x85\x67\xc0\xcc\x21\xea\x10\x85\x99\x01\xe4\xcd\xb9\x58\x59\x6b\xb0\x04\xcd\x2e\xbc\x82\x26\xf5\xb3\x5c\x78\xd9\x05\xcb\x7e\xa1\x92\x9c\x1a\xba\xb4\x84\xe9\xa2\x10\x29\x0a\x12\xc4\xc0\x74\xc1\x3a\x68\x67\x90\x6c\xbb\xa5\x87\x64\xa7\x25\x9c\x5c\x5b\xa6\x17\xf6\xc1\xe2\x34\x73\x0c\xc3\x08\x93\x3a\x0a\x2c\x49\x18\x4c\x7d\xb9\xc4\x19\x87\x1c\xe2\x62\x23\x27\x0e\xee\x39\x83\x15\x26\x6b\xf9\x61\xcb\x3d\xba\x36\xbc\x04\xcb\xee\x10\xcd\x75\x6d\x78\x05\xd6\x81\x55\xda\xff\x30\xa4\x90\xf2\xc3\xa8\xac\x67\xce\x3d\xbb\xc8\x3d\xdb\x96\xb9\xd7\x3a\xd0\x73\xaf\xb5\x03\xf7\x72\x35\x5a\xb9\x1a\xb6\x96\xbf\xd4\xb3\xc5\xa4\xf6\x8f\xe4\x34\x74\x33\xc2\x6b\x8c\xef\xcf\x9b\x32\xdf\xeb\xdf\xc2\x78\xc1\x5d\xd2\x49\xeb\x85\xdc\x89\x2c\xdc\xdf\x0e\x1e\xa3\x93\xef\xa8\x33\x05\x1e\xb6\x14\x1e\xb6\xa4\x9e\x5b\xdf\x45\x5b\x5b\x1a\x6d\x6d\x4b\x56\xc3\x6e\xb7\xf5\xda\xda\x7e\x14\x6d\xcd\xd5\x68\xe7\x6a\xb4\xb6\xe8\xb3\xb8\x6a\xff\x78\xcd\xe6\x4c\xe2\x4a\xd7\x6e\x7f\x17\xcd\x6e\xb7\xcb\x34\xbb\xdd\xfa\x4b\xb3\x77\xed\xb9\xad\xf4\xdc\x96\x7a\x6e\x7f\x97\x31\xd5\xce\xc6\x54\xde\xbf\xd8\x0c\x90\x00\xa3\x00\x4b\xfd\x42\x29\xa2\xe6\x87\xa9\x87\xc7\xd4\x5b\xe7\xd4\x11\x37\xb7\x96\x14\x7d\xb9\x07\xbb\x68\xc4\x17\xf9\x64\xdc\xd0\xb8\xaf\xe3\xc7\x09\xa9\xec\x45\xb0\x8a\xfd\x10\xd7\xaa\x7b\x55\x03\x47\xac\x5d\xed\x53\xdd\x50\xee\x6f\xe8\x7d\x3d\xf5\xc6\x60\xbb\xc3\x17\xa0\xf0\x2b\x5c\x3d\xc9\xcf\x5a\x45\x64\x2d\x68\x49\x25\xcc\xb1\xea\x02\x8f\x50\x67\x0f\x02\x14\x5e\xe3\x05\x74\xa1\xc9\x00\xdc\x2e\xfc\x00\x51\x00\x2f\xbb\xbc\x95\x17\x65\x76\x4a\xd4\xe6\x17\xfb\x90\x79\x4f\xac\x53\xf2\xbb\xaf\x3a\xd4\xc4\x9a\xad\xa2\x24\x87\x29\x57\x16\x06\x28\x15\xbb\x14\x6d\xf7\x50\x88\x7d\xd7\x09\x82\x7b\xc2\x98\x6c\x4d\xc1\xc3\xad\x2c\xc0\xe8\x53\x03\xf1\x91\xc6\x13\xf3\x41\x57\x02\x2f\x1f\x6e\xd5\x29\x09\x81\x99\x45\xd8\xf3\xaa\xa2\xb8\xfd\x1f\xa1\x0b\x1f\xc9\xd0\x31\xad\x47\xe2\xb7\x69\x42\x14\x06\xf7\x90\x20\x0c\x01\x51\x45\xba\xaa\xf8\x08\x3e\x71\x83\xaf\x1d\xec\xdf\x20\xb9\x35\x74\xa1\xe6\x93\x59\xaa\xc9\x09\x27\x97\x75\xd2\x44\xda\x7f\xc8\xea\x27\xd8\x89\x71\x9f\xac\x2e\xd3\x76\x75\xda\x90\xf6\x12\xc0\x3e\x9b\xaa\xa4\x16\x28\xf4\xfa\x22\x58\x50\xfb\x28\xb5\xf8\x28\x5a\x7c\xa4\x2d\x04\xf2\xae\x13\x56\x31\xd0\xa8\x39\xed\x0c\x66\x68\x1e\xc5\x88\xc0\xf9\x45\x8c\xae\x0c\x8b\x57\x29\x7c\x65\x74\x71\x5d\xd8\xdb\x53\x55\xc4\x34\x99\x01\x8b\xe6\xf3\x04\xe1\x84\xa8\xc1\xca\x49\x12\x55\x1d\xf2\xd4\x1e\xdd\x63\x64\xa0\xd0\x23\xff\x89\x50\x0c\x26\xf7\xaf\x54\x6e\xd9\x74\x8a\xe7\x5d\x89\xa0\x82\xe5\x4c\x71\x60\x63\x41\x6f\x28\xb7\x0f\x15\x7d\xbf\x5a\xe6\x71\xe8\x59\x9f\x60\x4a\xa3\x92\xfc\xcd\x62\xe4\x7c\x52\x30\x51\x30\xca\x49\x88\x77\x47\xfa\x50\xa8\xa1\x08\xee\x5b\xea\xc2\x32\x53\x97\x97\xc0\x23\x46\xb4\xa1\x40\x88\xa8\x51\x13\x0a\x4c\xe0\x02\x17\x3b\x58\xa9\xdc\x44\xbb\xba\x30\x08\x97\x97\x6c\x32\x58\x05\x8e\x5b\x1c\xe1\xd9\x9a\xd0\x11\x9b\x46\x80\x9d\x59\x80\x74\xc3\x5c\x00\x21\x3d\xf2\xca\x8f\x30\x31\x6c\x31\xe5\xbc\xd3\x6f\x5c\xb9\x0b\x74\x29\x1a\x94\xc0\x87\x2d\xdf\x33\x2c\x68\xe3\x32\x24\x44\x37\x8f\x33\xb3\xa4\x4a\x2d\x95\x85\xe8\x36\xc1\xc4\x18\xed\xed\xed\x32\x22\xb3\x98\x4c\x77\xc3\x94\x02\x4a\x7c\x81\xeb\xd4\x2a\x62\x3f\xb0\x2f\x41\x31\x95\x15\x78\x8a\x0c\xbf\x68\x34\x40\xb0\xe0\xd2\xbd\xa2\x0e\x52\x5d\x3f\x66\x55\xd2\xf2\x5a\xcd\xc0\x31\x0d\xa6\x73\x90\x98\xc9\x24\xc3\xc5\x22\x62\x7c\x26\xf3\x31\x7c\x0a\xa3\xdb\x04\x9c\x59\xb4\xc6\xc0\x37\x7d\x21\xa1\x1b\xce\x6c\x4b\xd4\x8d\xc2\x1b\x14\x27\x64\x66\xd4\xe9\x36\x03\x27\xf8\xcf\xf1\x90\x24\x4f\x38\x42\x6e\x3f\x04\xee\x87\xb5\x9b\x8e\x2e\x2d\x6a\x2c\xfe\xf7\x68\xa8\x31\x70\x3b\xa0\xb6\x76\x3f\x04\x1c\x35\x1e\xf3\xd6\x61\xc7\x37\xcf\x55\x27\x00\x43\xb2\x5e\xad\xa2\x18\xf3\x1d\x7c\xfd\xf0\x67\x0d\x1f\xc5\x1d\xdc\x3a\xea\x69\x5f\xdf\xe6\xc4\x95\x0e\x2c\xa6\x89\xf9\xa1\xf5\xc0\xe1\xf6\x0a\x9a\xca\xdc\x57\x88\xcf\x29\xc3\x8b\xb5\x63\xa1\x30\xbb\x23\x05\xd5\x0e\x2c\x19\x8a\x3a\x4e\xf2\xd3\x50\x29\x74\x65\x6e\xdc\x3e\xe6\x37\x0d\xe0\xdd\x47\x7f\x11\xcf\x4d\xe3\xd8\x34\x61\x81\xf1\xea\xf0\xd9\x33\x14\x36\x6e\xfd\x4f\xfe\x0a\x79\xbe\xd3\x88\xe2\xeb\x67\xe4\xee\xd9\x05\x9e\x77\xa4\x4a\x1e\xba\x41\x41\xb4\x42\x71\xc3\x8d\xe2\x28\x74\x02\x67\x96\x34\xdc\x68\xf9\x8c\x8c\x9e\x67\x6b\x3c\x37\x3b\x66\x36\x6e\xcc\x35\xf6\x03\x1f\xdf\x97\x85\xa5\xb3\xc4\x10\xae\x9f\x62\x18\xbe\xec\x42\xf3\xee\xc5\x09\x9b\x72\x39\xd6\x4a\x03\x65\x92\xaf\xe5\x9a\x9d\xe4\x96\xd0\xac\x77\x32\xfd\x36\xc9\xac\x7d\xd7\x6f\xc2\x3e\x2c\x1d\xbc\x68\xcc\x83\x28\x4a\x81\xc2\x33\x68\xde\xb5\x9b\xf5\xdf\x35\x0d\x2d\xda\xb0\x43\x1a\xa6\xd5\x9f\xe6\xab\xcb\x88\xd2\xde\x0c\xd6\x96\x57\x41\xa1\xf7\x7b\x09\xce\x27\x27\x5b\x91\x1e\x90\xbe\xcb\xb0\xb6\x9a\xcd\xed\x78\x97\x53\x5c\x24\x25\x83\x60\x7f\x0b\xe5\xec\x9f\xbd\x9d\x01\x56\xb3\x94\x05\xb4\x52\x57\xa8\x86\x06\xc3\x56\x86\xa0\x1e\x3b\x5a\xca\xfe\xba\x32\x07\x65\x16\xe8\x28\xff\x4e\x70\xad\xef\x04\xb7\x49\x35\x89\xc0\x25\x15\x7f\x2f\x84\x2f\xca\xa4\xc3\xfe\xb5\x0a\x42\xa2\x73\x01\x54\x2f\xb8\x9c\x5c\x27\x0c\x23\xb2\x0c\x82\xeb\x18\x39\x98\x66\x5b\x38\x21\x5c\xec\x33\xd9\xfd\x52\x65\x06\x85\xaf\x58\x16\xfe\x1c\x7f\x78\x4e\x08\xb0\xff\x7c\xae\x14\x5a\x36\x2d\xb4\x6c\xb5\xb4\xc3\x4a\x3b\x02\x82\x94\x25\x56\x91\xae\xa1\x9b\x9a\x11\x96\xa0\x45\x16\xb7\x06\x35\xbf\x1f\x52\xdb\x2b\x6d\x62\x81\xbc\xb8\xf5\x53\xed\xf3\xe1\x15\x7c\x54\xcc\x4b\x7e\x47\x67\x21\xaf\xaf\xfc\x79\xda\x83\xaa\xa2\x25\x06\x1d\xc7\x86\x8a\x11\x9b\x00\x40\xb8\x71\xd2\xf3\xf4\xc2\xb4\xf6\x69\xeb\x7a\x31\xc8\xc4\x91\xf9\xc0\x4c\x7b\x9a\x80\x87\x63\xc3\x37\xfc\xba\x01\xcd\x1c\x3e\x42\x77\x9e\xb8\x0b\xdd\x04\x2c\xd8\x2a\x93\x96\x90\x65\x18\x0b\x98\x41\xc6\x6a\x3a\xab\xb9\x8b\xba\xec\xb8\xa7\xb5\x6d\xdd\x68\x9d\x51\xfd\x9a\x71\xd3\xc3\xdb\x1b\x96\x51\x8c\x09\x47\x1e\x6a\x1a\xe4\x57\x54\x6c\x9a\xc4\x34\xb3\xb6\x26\x19\x21\x69\x8b\x0c\x21\xda\xea\x57\xa1\x5d\x4c\xd3\xad\xfc\xd2\x22\xc5\xb0\xb5\x05\x43\xfa\x6b\x2b\x78\xb6\x36\xe0\x49\x7f\x6d\x09\xdb\x81\x8c\x2d\x03\xb6\x0b\xe2\x96\x2d\x30\xcf\x51\x62\x97\x52\xd2\xde\x89\x12\xfa\xdb\x52\xe8\x69\x6f\xa5\x87\xfe\xb6\x24\xaa\x4e\x4a\xa8\x62\xd0\x77\x22\xb0\x93\x23\x30\xa5\xd8\xce\x51\xdc\xd2\x3a\x28\x1c\xaa\xa1\x64\x8a\xd2\xc1\xbe\x6f\x29\xc3\x5d\x8c\x18\xe1\xca\x8c\x79\x70\xd5\x09\xc1\xc7\x28\x76\x70\x14\x13\x17\xcf\x5d\xa8\x61\x57\x74\x47\x1c\xeb\x19\xf7\x61\x69\xd8\x08\x27\x7c\xdb\x3d\xc4\x28\xbe\x71\x02\x9d\xcb\x22\x52\x53\x09\x26\x69\x72\x2a\x41\x9b\xdf\x40\x3a\xf0\x44\x41\x6a\x82\x32\x81\x7d\x28\xae\x34\x79\x60\x82\x8e\x58\xe2\x98\x49\x9c\xc8\x6c\xdd\x27\x7f\x55\x97\x83\x27\xa4\x80\x0d\x57\x09\x6a\x7a\xb9\xcf\x9e\xcb\xb1\xd9\xcc\x9b\xfe\x40\xb3\x3d\x69\xa8\x4e\x7d\xc8\x02\x5d\x9c\x06\x01\x4b\x9a\x46\x56\xc8\xc1\x8a\xe7\x2b\xdb\x45\x35\xc0\x22\x59\x55\xb9\x81\xd4\x3d\xd1\x99\xec\x6e\x3f\xe7\x53\xab\x4b\x85\x5d\xcc\xab\x30\x7f\x14\x19\x85\x82\x7d\xc9\x92\x33\xa5\xc5\xbe\xca\x89\x54\x62\x95\x1c\x47\x02\x27\xc1\x32\x28\x69\x53\x9d\xb3\x2c\xf0\x5d\x24\x99\x75\xca\x42\x83\x34\xab\xe7\xe7\x5f\x5a\x95\x07\x85\x0c\x0a\x39\x55\x7e\x69\xe6\x4c\x35\x6e\xe6\x87\x09\x72\x62\x77\x51\x4b\xa2\x18\x23\x6f\xea\xcc\x02\x64\x10\xbd\x5e\x1a\xe0\x46\xcb\x95\xbc\x74\x5a\x20\xc7\x33\x80\x66\xe9\x74\xc1\x32\xe0\x89\xd4\x46\xaa\xb6\xf4\x3d\xd5\xa5\xa8\x91\x86\xb0\x4f\x5b\xd6\x9f\xd9\xa9\x23\x4e\x77\xdf\xa2\xe5\x4a\x35\x3b\x6c\xb5\x54\xa3\xdd\x98\xb4\xcf\x3a\xbc\x82\xc2\x4a\x89\x68\x67\xd6\xfd\x25\x8e\xd8\x3e\x47\x6d\xe9\x7b\xf5\x2b\x78\x45\x49\x28\x86\xfa\xc8\x1f\x27\x60\xe9\xab\x5a\xa3\x4c\x86\xe2\x8f\x62\xae\xa9\x9b\xd3\xb8\xdd\x48\x86\x5c\xfc\x70\x13\x19\x94\xee\x2b\xa2\x34\x45\x42\xb8\xa8\x71\xbc\x46\x06\xa8\x2d\xd2\x69\xbd\x0c\x2e\x45\xe8\x41\x70\x69\x8b\xa2\xbb\x20\x6c\x87\x23\x0a\x85\x8a\xe5\x34\xcc\x0d\x9c\x24\x79\xeb\x60\x77\xf1\x1a\x85\xcc\x5a\xd6\x68\x59\x9a\x52\x0f\xca\xb4\x41\x46\xe2\xe7\x2f\x52\x61\xec\x84\xd7\xc5\x52\xff\x3a\x8c\x62\xea\xa8\xa5\x08\x48\xd5\x35\xe5\x73\x3f\x4e\x70\x80\x30\xf1\x29\xbb\x94\x46\xc5\x59\xa1\xc9\xfa\x69\x33\xb9\x23\xcc\x4d\x03\x37\xcc\x14\xf7\xba\x5c\x83\x18\x41\x7a\x4b\x53\x6e\x0c\xf8\x60\x10\xff\xd5\x27\xb3\x83\xac\xb4\xd4\x56\x76\xb3\x04\xe0\x74\x08\x70\x52\xc8\x0c\x41\x6e\x29\x57\x8a\x9a\x2b\xb6\x75\xf7\x9e\xee\xe9\xd5\x3a\xe5\x48\x4a\x9b\xac\xd9\x69\x73\xb3\xa4\x39\x8d\x6d\x36\x88\x39\x88\x31\x5d\x04\xf0\xc8\x92\x98\x1a\xdd\x7a\xbd\xd0\x46\xf0\x7a\x73\x8f\x7f\x96\x21\xcc\xc8\x97\x05\xa3\xad\x07\x69\xc8\xa8\xfa\xcb\x2f\xbf\x54\x8b\x68\x68\x47\x2e\x50\x1b\x2c\xc4\x5a\xc0\x10\x34\xa3\x58\xc6\xba\x7a\x55\xd5\x63\xa3\x6e\x07\x94\x76\xcf\x89\x63\x1c\x2a\x25\xeb\x6b\x98\x5e\x4a\x2d\x03\x16\xa3\x65\x74\x83\x18\xb0\x3a\xd0\xf0\xff\x32\xba\x21\x2e\x48\xd5\xac\x6e\x47\x82\x8d\x36\x03\x3e\x6b\xa0\xe5\x71\xfb\x52\x44\x0e\x24\xad\xc8\x46\xa0\x82\x7e\x9e\xe9\xf2\xce\x2e\x13\xc0\xc3\x06\x44\xd5\x61\x92\x22\xb4\x3e\x75\x0e\xe9\xfb\x05\x28\x41\x21\x4e\xe8\x9b\x21\x4c\xb3\x92\x06\xd4\x46\x67\xa7\xef\xa1\x37\xe9\x0f\x87\x45\xbc\xf5\x3c\x78\xfe\x9b\x01\x07\xcd\x2f\x94\x8d\x3d\x30\xe1\x1f\x3b\xb6\x3b\x78\x61\x80\x65\xdb\xac\xa1\x03\x26\xfc\xdf\x72\x3d\x73\x25\xec\xdd\x02\xf6\xf4\xfd\x81\x28\x90\x76\x6d\x1a\x3b\xe2\xd0\x34\xa0\x65\x69\x24\xa4\x53\x39\xcb\x7e\x51\x2f\xc7\xd0\x93\x30\xf4\x0a\x18\x7a\xfe\x35\x7d\xf5\x66\x37\xac\xda\x1d\x03\x7e\x7b\xc1\x18\xd3\x04\x13\x0e\xca\xbb\xbd\x96\xba\xbd\x2e\x74\x4b\x73\x07\xe8\x76\x8c\xb4\xa1\xc5\xc3\xda\xc9\xca\x71\xd1\xae\x18\x59\x06\x74\xb6\xb1\x29\xab\xdc\xde\x85\xab\x69\xf5\x56\xcb\x00\xab\x65\xef\x0e\xbe\xd5\x36\xc0\xfa\xed\x60\xf7\x06\xcf\x2d\xc2\xcf\x07\xb4\xf8\xed\x05\x69\xd2\xb1\x0e\x76\xa7\xa2\x63\x37\x5b\x06\x74\xec\x07\x10\xde\xb1\x09\x25\x1d\xbb\xb5\x3b\x6b\x3b\x76\xbb\x49\x9a\x74\x9e\x3f\xa0\x49\xa7\x43\x07\x5a\xe7\xc5\x97\x0d\xfa\x1b\x48\x8a\x14\x14\xed\x43\x74\x8b\x62\xba\x15\xf3\x2d\x96\xe2\x21\x23\x7e\x25\xe1\xb3\x2a\x2a\x36\x71\x9c\xd6\xec\x75\x25\x69\xd4\x7f\x0d\x52\x44\xfd\xda\x79\xd6\x6c\x50\x8d\x8e\x01\xcf\xdb\x3b\x57\x3f\xb0\x0c\x38\xd8\x5d\x58\x96\x4d\x06\x83\x9d\x6f\xa0\x70\x26\x91\x38\x93\x14\x38\x43\x87\xf5\x57\x58\xc2\x03\x32\x08\x77\xb4\x84\x2d\x7b\x47\x8b\xd9\x6a\xed\x58\xf1\x79\x73\xb7\x8a\xbf\xbd\xd8\x5a\x33\x53\x7c\xeb\xc0\x26\x63\xa5\xb9\xd5\xb4\x70\xe0\x1d\x7b\x57\xc2\x3a\xf6\xae\x94\x75\xec\xd6\xc1\xae\x35\x3b\x2f\x76\x9d\x88\xec\x4e\x67\x83\x82\xac\x25\x05\x59\x17\x14\x84\xee\xe3\x7e\xf3\x50\xde\x3c\xe9\x2b\xe8\xdc\x4a\xe8\xdc\x16\xd0\x71\x82\xd5\xc2\x09\xd7\x4b\x14\xfb\xee\xb7\x0e\xe5\xcd\xf3\xe6\xd7\x12\x53\xde\xee\x21\xf6\xec\x4e\xe2\xc2\x5d\x81\x0b\x0b\x74\xe7\x78\xc8\xf5\x97\xce\xe3\xfa\x0a\x9b\x69\x7e\x21\xd1\x7c\xf2\x10\x9a\x9b\x12\xcd\xf3\xbf\xdc\xfc\xef\xe2\xe6\x83\xbc\x5a\x55\x9b\x17\xa8\xde\xce\xe0\x87\x32\x57\xcb\xd8\xaf\x61\xea\x63\x32\xb4\x9c\x99\xbb\x32\x4e\xce\x02\x50\x63\x1d\x6a\x88\xa6\x92\xa1\x9e\x44\x82\x63\x4a\x3c\x23\x0d\xdd\xf8\xe1\x98\x52\x55\x23\xc6\xab\x9f\x6e\xa1\x03\x0f\x75\x7c\x30\xe8\xbb\xd6\x3e\x4b\xe9\x65\x0c\xa8\x6b\xc2\x74\xf1\xa5\x75\x05\x2f\x59\x20\x96\x40\x61\x09\x10\xe2\xe6\x65\x17\xe2\x4b\xfb\x4a\x2f\x5b\x29\x22\x55\xbe\x68\x94\xae\xb5\x41\x29\xc8\xd4\x48\x04\x04\x74\x61\xaf\x34\x0a\x5e\xa4\x56\xaa\x95\x05\x4c\xb9\xaa\xa5\xb5\xe9\xde\x5f\x39\xc7\x50\xe8\x19\x59\xa8\x48\x1b\x4a\xdb\x09\x81\x94\x71\xff\xe9\x82\x69\xa5\x8b\xe4\xda\x43\x11\x2b\xc5\x2c\x4b\x23\x67\xe9\x83\x22\xc9\x97\xbe\x1b\x8f\xee\x70\xec\xa4\x59\x3b\x06\xed\x9e\x95\xc5\x28\x59\x07\x18\x6e\x9c\x60\xad\x4d\x20\x4c\xd6\xb3\x77\x3e\x5e\x1c\x65\x2f\x09\xd2\x4d\x96\x64\xf6\x2d\x49\xc3\xc9\x4c\xb7\xfb\xf1\x57\xea\x30\xfc\x95\x3a\x2c\x9b\x87\xf4\xe6\xaf\xd4\xe1\x6d\xa9\xc3\xe9\x15\x95\x82\x48\x27\xe4\xe1\x79\xc7\x5d\xd0\x6d\x28\x84\x97\x08\x3b\x74\x12\xa9\x7d\xfe\x62\x7c\xa6\xa0\x3f\x7c\x58\xb2\x4d\xda\xea\xa7\x9b\x6a\xe5\x4b\x5d\x6e\x74\x4e\x43\x78\x0f\x6c\x99\x9a\x0f\x6a\xb3\x51\x9c\xed\x1f\xf0\xf3\x72\x0a\xfb\x07\xbc\x22\x74\xe1\x73\x36\x53\xa5\xef\x44\x74\xe1\xf3\x17\x23\x2d\x77\x9d\x15\x5e\xc7\xf2\xc6\xc2\x17\x79\xa6\xd0\x04\x1d\x29\x25\x97\xb4\xef\x2b\xe8\x82\xe8\xad\x68\xcf\x33\x92\xb3\xda\x4a\x65\x2e\xc6\x1c\x99\x2c\x2d\xb4\x46\xee\x0b\xdb\x7a\xd9\xdc\xd0\xaf\xe7\xe7\x57\xf2\x8c\x94\xeb\xa7\x50\xde\xf1\x61\x88\xee\xf0\x09\xa9\x59\x74\x3e\xe4\x2a\x13\x1c\xd7\x76\xf0\x97\x44\x13\xe2\xe9\xe3\x7c\x03\xcd\xe4\x5c\x46\x32\x76\xe2\xef\x45\xf0\x7c\x1d\x04\x63\x82\xde\x28\x3c\xfb\x2e\xb4\x97\x70\xf4\x01\xe4\x2f\xfd\x70\x9d\xfc\x20\xfa\x35\xc4\xe5\x37\x31\xcb\xe9\xda\x42\xc7\xbf\xd7\x28\xa1\xc8\xfe\xcc\xa2\xfc\x3a\x6a\x75\xe4\x72\xd3\x51\xf3\xbd\x72\x5a\x3f\xa8\xbd\x67\x5e\x04\xef\xb7\x21\xec\xcf\xa5\xef\x5d\x11\xff\xd7\xd4\x3f\xb1\xae\x34\x70\x78\x0d\x4f\xca\xd3\x12\x8d\xd9\xfc\x6c\x94\x01\x2b\x79\x60\x5f\xe9\xd0\xa5\x89\xdd\x3b\xf4\x41\x73\x55\xa4\x1b\xd8\x87\xa0\x20\xe9\x0c\xe7\x2e\x07\xac\x15\x39\x5d\x58\x90\xb9\xcb\x80\x20\xbf\x96\xd8\x4d\xd0\x3a\x61\x6f\x11\x38\x7c\x67\x33\xc7\x69\x9f\x90\xe9\xf6\x21\x5a\x53\x22\x44\x49\x8b\x44\x26\xcf\x0e\x44\xee\x8a\x63\xb4\xfa\x66\x14\xed\x1c\x8a\x05\xc7\xe8\x1b\x06\xdf\xcc\x09\x9c\xd0\x45\x71\x2d\xc1\x71\x3e\xed\x2c\x59\x2f\x35\x09\x47\x33\xd7\x00\xe4\xe6\x72\x1a\xc1\x32\xc0\xe2\x2b\xf3\xb4\xcc\x36\x8a\xaf\x95\xf3\x6d\x7b\xe2\xe1\xcf\xdc\x3a\x51\x6d\x14\xd6\x90\x64\xe5\x14\xf0\x62\x91\x3f\x73\x73\xab\x7e\xf4\x30\xbb\xe8\xf6\xa9\xdb\xe9\xd2\x15\x00\x21\xeb\x15\x34\xf5\x03\x86\xd1\x4c\x7e\xf3\x4c\xe6\xa0\x68\x85\x6e\x59\xf3\x2d\xd2\xc8\x4b\xa5\xac\x99\x7e\xea\x4c\x09\x99\xb9\xdb\x90\xcf\xa7\x66\xed\xd6\xc1\x46\x7a\xa3\x98\xf7\x6e\x6a\xde\xd1\x56\x31\x68\x6e\xe4\x8b\x6e\xf4\x97\x62\xb0\x1d\x71\xd8\xb6\x0b\x5e\x58\x8f\x57\x24\xa0\x8d\xd4\xa1\x65\x96\x40\x37\x30\x77\x72\x01\xd2\xf1\x89\xfe\x4d\x0d\x53\x89\x55\xd9\xa0\x1c\xfe\x1c\xe4\x39\x01\x5e\x49\x00\x9c\x98\x74\x47\xd5\x37\x45\x3c\x8e\x96\xb4\x27\xba\x6c\x56\x1a\x2a\x5d\xfb\xe1\xf5\x29\xd2\x6c\xf8\x67\x55\xa2\x95\x2e\xa5\x43\x43\x50\xe8\x07\xdb\x0c\x4b\xe0\x24\x94\x2e\xa9\xa8\x34\xb7\x88\xdb\x02\x01\x55\x4a\x10\xaa\xa5\x62\xc8\xdb\x8f\x6b\x14\xaa\x09\x44\x74\x49\x50\x6e\x0c\xb4\x41\x9f\x6b\x94\x4f\xce\x94\xa8\xa9\xd7\x94\x1c\x2a\x69\x45\xc3\x13\x92\x66\xc9\xc6\x8c\x24\x99\x49\xfe\xbc\x2c\xdd\x42\x89\x76\x16\x74\xd1\x10\xab\x17\x6d\xba\x97\x58\xaa\xc9\x41\x27\x4d\xa0\x97\xf3\xbd\x2c\x59\x88\x1e\xcc\x5a\xb5\xec\x56\xfb\xb7\xe7\x2f\x3a\x07\x55\x83\xd0\x66\x19\x54\x11\x4a\x1c\x48\xde\x52\xc8\xb8\xbc\xd2\x03\x28\x14\xc0\x34\x31\xfb\x54\xf2\xa2\x3f\x95\xb9\xf2\x9f\xce\xa0\xee\x82\x84\xf0\x3d\xd3\xf4\x3c\xb7\x5e\xb2\x79\x90\xee\xcf\xcc\x4a\x32\x99\xfe\xff\x63\x0e\x9f\xcf\xb5\xcf\x66\x46\x9a\x61\x97\x7a\x08\x62\xb4\x51\xf5\xdf\x27\xba\x42\xff\x1f\x94\x60\xb7\x8d\xc6\xd9\x03\xa6\x00\x89\x4a\xdd\x90\xa8\x3e\xad\x42\xa3\x01\xee\x6e\x33\x6d\x49\xcc\xbf\x14\x81\x54\xf4\xbf\xfe\x10\xd1\x93\x45\xfc\x23\x09\xbe\x8c\x9d\x90\xe5\x00\xfa\xfc\x14\x14\x2a\x59\x70\xe6\x18\xc5\x50\x15\x6f\x2f\x72\x71\x13\x49\x27\x25\xa8\xe8\x18\xac\x8c\x97\xfd\x9f\x6b\xbc\xfc\x4f\x63\xbf\xf9\x23\xd8\xcf\x22\x2f\xff\x45\x5c\xfb\x5f\x3f\x82\x6b\x69\x9c\xe7\xbf\x88\x71\x7f\x6e\x66\xdc\x4c\x7a\x67\xad\x14\xd7\x82\x87\x5b\x96\x71\xfc\xd3\x50\xfd\xb7\x2d\x54\x23\x52\x8b\xac\x74\x99\xb7\xba\x1b\xf9\x38\x1a\x84\xde\x4f\x4f\xfa\xe5\xcf\x63\xde\x4b\xfd\x1c\xde\x2c\x75\x69\x74\x2e\x44\xc1\xbb\xd9\xe6\x07\xd6\x7e\x1e\xc2\xe1\x3b\x38\xc9\x22\x02\x65\xc0\xe7\x92\x8c\x15\x35\x53\x24\x31\xe0\x49\xbe\xed\xd7\xf9\x85\x4a\x78\xcf\x4d\x2e\x9f\xb8\xc9\x55\x09\xe1\x34\x3e\xa1\xf7\x4a\xad\x3a\x95\x52\x9d\x67\x53\x15\x02\x6b\x05\x64\xaf\x1a\x68\xb9\xc2\xf7\x7c\xc0\x6d\x57\xfc\xfa\x7f\x8d\xfc\xd3\x28\x38\xa1\x5d\xc9\xb7\x29\x91\xa0\x78\xd9\xcc\x59\x6d\xa6\x2e\x67\x83\x38\xa7\x0f\x61\xaf\xb6\x07\xf4\x24\xfd\xf0\x5a\xf3\xfe\xc9\x26\x54\x77\xd6\x9d\x68\x55\x73\x9d\xd5\xb6\x31\xdc\xf8\x79\x64\xb8\xcd\x78\xc9\xb1\x29\xb7\x5f\x4f\xf3\x57\xfa\x3c\x73\x65\xab\xbe\x3e\xdd\x44\x6b\xe9\xcb\x4e\xb0\x69\x9e\xf9\xf9\x58\xa4\x8d\x97\x3c\x38\x5e\x58\x01\x35\x3b\xe0\x89\x9b\x14\x23\xc6\xa5\xca\x5d\xcf\x2b\xb7\x04\x49\xcf\xae\xaf\x63\x4f\x2e\xfd\xac\xbc\xb9\x26\x18\xe6\xcf\x73\x6e\x86\x1c\x59\x4c\x70\x4c\x94\x6a\xf7\x18\x62\x21\xa4\x5b\xd0\x98\x4d\xc1\x46\x39\xf6\xa6\xc6\x66\x45\x90\x54\x39\x40\x02\x05\xf3\xac\x23\x72\x47\x49\xa5\xd9\x10\xe2\x7a\x1f\xd4\xf3\x05\x64\x78\x13\x7a\x48\xcf\x26\x70\xec\x18\x9f\xf4\xb2\x0c\x58\x82\x63\x1a\x0c\x2e\x87\xc6\xec\x6a\x14\x78\xa2\x1e\x85\x49\x79\x95\xab\xa3\x76\xa9\xa2\x13\x17\x3a\x51\xf5\x39\x11\x08\xe7\xf6\xae\x92\xb4\xa5\xc0\xa0\x54\xc5\x33\x9d\x29\x6c\x0c\x3f\x06\x75\x45\xf9\x14\xde\xc8\xfe\x26\xfa\xe7\x19\x9e\x3f\x88\x33\x1b\x95\xe8\x6b\xc5\xae\x6c\xda\xe8\x39\xf7\x93\x70\x46\x61\xcd\x2a\x8e\x5c\x94\x24\x79\x7e\x18\xc0\xce\x5c\xa0\x3b\x14\x15\xed\x80\xcd\xa8\x4d\xf8\x2a\x8f\xfd\x4f\x73\x10\x21\x1b\x92\x7c\x03\xa4\x0b\x35\x56\x27\x4b\xe8\x4b\xdb\xa4\x99\x83\x38\xae\xc3\x3e\x2f\xdf\x2f\x80\xca\xb6\x33\x14\xd0\x1b\x6c\x40\x49\x05\x6e\x14\xbb\xf9\x8e\x0b\xb8\xd3\x13\x2b\x54\x66\xf3\x27\xd4\x18\x4a\xef\x48\x3f\x5c\xb4\x96\x22\xa0\xf4\xc6\x34\xa5\xfd\x98\x73\x96\xdc\x99\x1f\x5d\x4a\x9d\xa3\x7b\x9c\x3f\xa7\x89\x1f\x44\x03\x69\xc2\x21\xf1\xf9\x32\xc4\x35\x07\x08\x08\xce\xbd\xcc\xf3\x48\xeb\x1c\x98\xe6\xe5\xa5\x98\x13\x09\x8a\x59\xab\x72\x67\x82\x9f\x71\x4c\x8f\x78\x98\xdd\x63\x54\x35\x52\xec\xf5\x3e\x83\xbb\xc8\x6a\x64\x7b\xd6\x69\xea\x6c\xba\x79\x9d\x76\x6d\xa6\xf8\x98\xa4\xfc\x71\xa0\x6f\x05\x24\x01\x49\x2f\x75\x1b\xd0\xa5\xae\xd8\x4e\x98\x08\x22\xb3\xab\xdd\x02\xe6\x45\x25\x82\xab\xab\x42\x2d\xfa\x66\xb8\x92\x00\x90\xf6\x57\xde\x9d\x69\x72\x91\xba\x0b\x27\xae\x1a\x94\x0e\x25\xbd\x7f\xa1\x71\x06\x53\x23\xc2\x36\x6e\xd3\xdb\xab\xda\xc6\xa6\x5a\xe6\x95\xc3\x32\xad\xcd\x19\x2a\xb2\x33\xa5\x9a\x96\x82\xfa\x2a\x79\x46\xd2\x8e\xa2\xf8\x63\xf9\xff\x2b\xc7\x8f\xa5\x43\xbd\x09\xc8\x74\x25\xad\x4b\xde\xf1\xe7\xb4\x2a\x5f\xb7\xee\xf8\xba\x4c\xba\xac\x27\x4d\x2f\xad\xab\x07\xbf\x2a\x53\x00\xa4\x88\x9c\x43\xe5\x17\xb6\x6e\xe1\xbe\xed\x5d\x16\x91\x54\x2b\xb3\x54\x19\xa0\x96\x01\xeb\x70\xe5\xb8\x9f\x6a\xc5\x40\x43\x61\x9a\xe2\xd0\x44\xc2\xa8\x38\x75\x48\xf3\x8d\x22\x39\xbd\x7e\xf3\x57\x2b\x41\x93\x22\xab\xa4\xb3\x66\x1b\xf2\x9b\xb2\x6c\x55\xd4\x0e\xf9\x44\xca\x4f\x4d\xa2\x5f\xbf\xcc\x61\x4b\x6b\xea\xd0\x2d\xfb\x7a\x26\xd5\x92\x90\x6e\xa9\xd3\x7f\xb9\xec\xfe\x79\xb4\xa6\x11\xc6\xcf\xa5\x24\xd7\xd3\x2c\x5e\x5a\xf7\xd2\xca\xbd\x59\x92\x3e\x68\x69\x5e\x39\x49\x4f\x86\xa2\xb2\xa2\xf5\x0c\x68\x15\x65\x05\xea\x59\xac\xa9\x2e\x89\x2e\xc5\x95\x48\xab\x93\xde\xa9\x10\x9c\xb9\x2e\x65\x4d\xd9\x77\x43\x59\xa7\xd7\xe8\x8e\xf8\x14\xa2\x5b\x56\xc1\x32\x2c\x7a\xdc\x6a\xf5\xcf\x2a\x73\x31\x58\xbd\x28\x06\xbe\xcf\x48\xef\x25\x3e\x12\xfb\xc8\xdf\x4e\xb0\x64\xc9\x96\x66\x31\x6c\x66\xbc\x00\x57\xff\x52\xe4\x73\x5e\x00\xc0\xcd\x33\xef\x5e\x30\xaa\x90\x00\x94\x02\xa0\xaf\x52\x86\x1e\x58\x84\x1e\x9d\xd4\x4a\x25\xa7\xb6\xdc\x9c\x0e\xfa\x10\x71\xe6\x87\xad\xee\x60\x25\x71\x3e\x2f\xfb\xa6\xab\x13\x5f\x2b\xaf\x87\xc4\xd4\x57\xaa\x56\x85\xae\xd2\xf3\x6c\x49\x55\x16\x03\x64\x3a\x52\xd5\x1d\xc7\x56\xb2\x15\xcc\x4f\xac\x5d\x2f\xd3\x12\x9a\xfb\x41\x8c\xb3\x92\x7a\x42\x7a\x28\xfa\x41\xd2\x29\x34\x65\xc9\x17\xdf\x2d\x24\xc3\x58\x41\x7e\x1b\x0d\x70\xb7\xdb\x5e\x1d\x9c\x90\x26\x71\x49\x29\x11\x3a\x0a\x48\xa5\x52\xe4\x15\x2c\x88\xb4\x2e\xc3\xf5\xb2\xe8\x31\x3c\x16\x15\xb0\x65\x53\x5f\x17\xdd\x61\xa1\xb1\x9c\xa6\xd0\x19\xae\x5a\x78\xa9\x87\xe2\xb2\x0a\x2e\x29\x25\x16\x35\xef\xf4\xb2\x79\x45\xaf\xb9\xe2\xe9\x41\x0a\x15\xae\x16\x0c\xe7\x13\x02\x43\x9f\x89\x98\xf5\x59\xe3\x63\x90\xd4\x35\xc0\xaa\xd7\xa5\x0e\xb5\x2c\x94\x9a\x72\x1c\x0b\x4d\x72\x6b\x5c\x3e\x56\x63\x84\xe9\xd0\x93\x8c\x6a\xf6\xd1\x3c\xd5\xa4\x6e\xfc\xd2\x32\x01\x49\x2f\x89\x2f\x4b\xff\xb3\xb7\xcd\x40\x3f\x5c\xf9\xfb\x67\x31\xba\x61\xbb\x5d\x72\xc5\xec\xb0\xa8\xa2\x11\xa7\x69\x4a\xba\xb9\xcc\xc7\xb5\xba\x7c\xb4\x55\x98\x26\x24\xb2\x55\xcc\x13\x56\x53\x7c\x8f\x8d\xa1\xf8\x9f\x2e\x84\xc5\x23\xa8\xa9\x80\xba\xf0\xf9\xb2\x79\x95\x77\x6d\x35\xc6\xcc\x28\xcc\x74\x5f\x0a\x4a\x44\x15\x5a\x75\x98\x18\xe5\x19\x44\x76\x34\xb4\x68\x48\x67\x1b\xbd\xed\x03\xba\x1e\x12\x7c\xd3\x5a\x7e\x42\x7b\xa8\x94\x68\xd8\x54\xd4\x83\x32\x24\xeb\x06\x84\xb2\x79\x26\x75\x98\x33\xcb\x3e\x72\x2e\xaf\x86\x59\x51\xb2\x9e\x65\x9c\x63\x45\xe2\xec\xf3\xae\x7c\x12\x3a\x7b\xe4\xb2\x49\x4c\xbc\x4a\xc6\x0a\xb3\xe3\x2a\xf3\xc7\xcb\x36\x98\x1d\x56\xf2\x01\xd9\x83\x59\xb6\x0a\x52\x1a\x64\xdf\xa8\x14\x13\x2f\x2b\x67\xaf\xb1\x8a\x72\xe6\x4b\xb0\x1e\xf8\x13\x59\x0d\xf9\x13\xfe\x89\xc9\x6e\x3a\x24\x58\x79\xf6\x89\x4c\xfa\x6d\x4c\xd6\x2d\xfb\xfc\x65\x97\x7f\x07\x93\x73\x8b\x9e\x45\xdf\x65\x27\xa6\x70\x52\xe9\xc9\xf9\x5d\x76\xf2\x82\xe0\x96\xf8\xc6\x65\x8c\x56\x95\x4a\x96\x5f\xbe\x70\xe2\x1e\xe6\xbe\x62\x5d\x4c\x7c\x3e\xbc\xec\x82\x90\x05\x8b\x47\xe8\x5e\x50\x14\xa2\x49\x4f\xe3\xe5\x10\x74\xaf\xd1\x4a\x2f\x33\x52\xc9\xfb\x73\x78\x8d\xf0\x88\x7e\x62\xbc\xb6\xe7\xac\x71\xe4\x06\x51\x82\xf6\xa8\xb5\x0b\xfd\x20\xeb\xb0\xe7\x79\xc5\x6a\x62\xe0\x4a\x5a\x94\x3e\x3c\x27\xeb\x1e\xa2\x4f\x7b\xff\xdc\xfb\xe7\xde\x9e\x01\x7b\xd5\x2a\xf9\xfd\xd7\xbf\xc8\x6f\xad\x4e\x7e\x3f\x7f\x21\xbf\x97\x57\x7b\x5f\xa4\xd6\x67\xe8\x36\xf0\x43\xa9\x7d\xa1\x6e\xc6\xb8\x28\x1c\xaf\x43\x54\x8b\x0d\xb8\x49\xd9\x46\x26\xec\x12\xa2\x34\xec\x53\xd7\x17\xc4\x31\xf0\xf9\x01\x8e\x39\x4a\x24\x7b\xe2\xcf\x21\x66\xaf\x6a\x50\xb1\xa9\x15\x2f\xfd\x2b\x03\x6c\x4d\x56\x00\x5f\x36\xae\xe3\x53\x3f\x24\xfa\x7c\xd3\x38\x5a\xcf\x0f\xc9\x4d\xed\xa6\xd1\x5f\xc7\x49\x14\x37\xde\x4b\xc1\x35\xde\x13\xef\x84\xb7\x33\x20\xad\xfb\xf7\x7d\xb6\x2b\xfa\x30\x2c\xc8\xdf\xcd\xe1\x91\xe3\x7e\xa2\x47\xc6\xd4\xe8\x04\x5b\xf4\x09\x6e\x0e\x59\x2f\x63\xff\x7a\x81\xcb\x2a\x69\x8e\x7b\x93\x57\xd2\x9c\x80\x0c\x61\x7a\x54\x25\xfd\xec\xda\x30\x79\x17\xc5\xf4\x25\xcd\x5a\x39\x7d\x26\x9f\x20\x37\xd6\xd8\xcc\x01\x02\x61\xd7\x93\xea\x4a\x5e\x9b\xdf\x2e\x6c\xdd\x57\xe9\xbe\x52\xd8\x12\xaf\xba\xd2\xd8\xe7\x70\xea\xe2\xb3\x7c\x3b\xb1\x6f\xbf\x94\x78\xd3\xa4\xa7\xf0\x56\xcd\x2a\x2c\x50\x8c\xc0\xa7\x6f\x2f\x7b\x28\x46\x73\x14\xf2\x6f\xcf\xaf\x22\x7a\x10\x2f\x79\x90\x82\x3c\x8d\x5c\x7e\x98\xaf\x9f\xd0\xa1\xba\x74\xc4\x77\xb4\x96\x8e\x57\x74\xfe\x4c\x13\x6e\x17\x28\xe4\xdf\xf1\xc0\x7e\x78\x0d\xd7\xf4\x2d\x69\xfa\x01\x77\x1c\x41\xb0\x76\x74\x8d\x86\x98\x7e\xa8\x95\x56\x99\x21\x8e\x58\x4c\x50\xf3\x60\x86\x5c\x67\x9d\x30\x1c\x53\x33\xc0\x3e\x82\x91\x80\x03\x61\x14\xa6\xa8\xb3\x8e\x8a\xaa\x4d\x45\x31\x64\x81\x0f\x53\x26\xce\xd8\x38\x96\xca\x07\xc9\x29\x9a\x3f\x70\x8c\xe4\xaf\x53\x83\x9c\x92\xb4\x8a\x11\x43\x91\x9b\xc3\xda\xe3\x18\xb8\x1d\xf5\x52\xa9\x4a\x4c\x2c\x74\x37\x0c\x43\xb9\x7e\x88\xee\xf0\xd6\x06\xfb\x96\xdc\xe4\x96\x98\xf9\xd7\x08\x9f\x22\xc7\xf3\xc3\xeb\x77\x0b\x1f\x23\x66\x9c\x84\xde\xeb\x8d\xb3\x32\x51\xa8\xe6\x39\xc5\x5a\x19\xb7\x72\x83\xd2\x91\x4b\x18\x9c\xd2\xb0\xb9\x79\xb9\x7d\x55\x45\x57\x6a\x63\x59\xb5\xa9\x33\x2b\xad\xb2\x41\x57\xf7\xfe\x19\xee\x11\xdf\xee\x56\x93\xd7\xb1\x8b\x66\x16\xce\x03\xd9\xa6\xa0\xb2\x5f\x49\xd7\xb1\x05\x8d\xcd\xa6\x95\x1f\x39\x1d\x3f\x40\xa7\xe1\x31\xe6\x54\x71\x44\x4b\xc9\x60\x78\xf8\x64\x71\x73\x78\x8c\x02\x84\x0b\x8a\xb2\x95\xf9\xff\x2f\x00\x00\xff\xff\x9d\xff\x6b\xbc\x96\x88\x00\x00") func runtimePluginsAutocloseAutocloseLuaBytes() ([]byte, error) { return bindataRead( diff --git a/cmd/micro/view.go b/cmd/micro/view.go index 18b6d468..8a009b65 100644 --- a/cmd/micro/view.go +++ b/cmd/micro/view.go @@ -169,7 +169,7 @@ func (v *View) paste(clip string) { } clip = strings.Replace(clip, "\n", "\n"+leadingWS, -1) v.Buf.Insert(v.Cursor.Loc, clip) - v.Cursor.Loc = v.Cursor.Loc.Move(Count(clip), v.Buf) + // v.Cursor.Loc = v.Cursor.Loc.Move(Count(clip), v.Buf) v.freshClip = false messenger.Message("Pasted clipboard") } @@ -522,7 +522,6 @@ func (v *View) HandleEvent(event tcell.Event) { v.Cursor.ResetSelection() } v.Buf.Insert(v.Cursor.Loc, string(e.Rune())) - v.Cursor.Right() for pl := range loadedPlugins { _, err := Call(pl+".onRune", string(e.Rune()), v) diff --git a/runtime/plugins/autoclose/autoclose.lua b/runtime/plugins/autoclose/autoclose.lua index 56a7c63c..e6aa115a 100644 --- a/runtime/plugins/autoclose/autoclose.lua +++ b/runtime/plugins/autoclose/autoclose.lua @@ -1085,6 +1085,7 @@ function onRune(r, v) -- when converting go structs to lua -- It needs to be dereferenced because the function expects a non pointer struct v.Buf:Insert(-v.Cursor.Loc, charAt(autoclosePairs[i], 2)) + v:CursorLeft(false) break end end @@ -1107,6 +1108,7 @@ function preInsertNewline(v) v:InsertNewline(false) v:InsertTab(false) v.Buf:Insert(-v.Cursor.Loc, "\n" .. ws) + v:CursorLeft(false) return false end end From f933b90c66071b1d8e8af94c123eb42ea68856d8 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Fri, 16 Jun 2017 22:19:33 -0400 Subject: [PATCH 07/10] Get undo working properly with multiple cursors --- cmd/micro/actions.go | 4 ++++ cmd/micro/buffer.go | 11 +++++++++-- cmd/micro/cursor.go | 3 +++ cmd/micro/eventhandler.go | 22 +++++++++++++++------- cmd/micro/view.go | 37 +++++++++++++++++++++---------------- 5 files changed, 52 insertions(+), 25 deletions(-) diff --git a/cmd/micro/actions.go b/cmd/micro/actions.go index 7a961229..c09f2a4e 100644 --- a/cmd/micro/actions.go +++ b/cmd/micro/actions.go @@ -1848,6 +1848,7 @@ func (v *View) SpawnMultiCursor(usePlugin bool) bool { } } v.Buf.cursors = append(v.Buf.cursors, c) + v.Buf.UpdateCursors() v.Relocate() v.Cursor = spawner } @@ -1879,6 +1880,7 @@ func (v *View) MouseMultiCursor(usePlugin bool, e *tcell.EventMouse) bool { v.Cursor = &v.Buf.Cursor v.Buf.cursors = append(v.Buf.cursors, c) + v.Buf.UpdateCursors() if usePlugin { PostActionCall("SpawnMultiCursorAtMouse", v) @@ -1923,6 +1925,7 @@ func (v *View) RemoveMultiCursor(usePlugin bool) bool { if end > 1 { v.Buf.cursors[end-1] = nil v.Buf.cursors = v.Buf.cursors[:end-1] + v.Buf.UpdateCursors() } v.Relocate() @@ -1948,6 +1951,7 @@ func (v *View) RemoveAllMultiCursors(usePlugin bool) bool { v.Buf.cursors[i] = nil } v.Buf.cursors = v.Buf.cursors[:1] + v.Buf.UpdateCursors() v.Cursor.ResetSelection() v.Relocate() diff --git a/cmd/micro/buffer.go b/cmd/micro/buffer.go index ab3b18e4..7f08acd5 100644 --- a/cmd/micro/buffer.go +++ b/cmd/micro/buffer.go @@ -28,8 +28,9 @@ type Buffer struct { // This stores all the text in the buffer as an array of lines *LineArray - Cursor Cursor - cursors []*Cursor // for multiple cursors + Cursor Cursor + cursors []*Cursor // for multiple cursors + curCursor int // the current cursor // Path to the file on disk Path string @@ -308,6 +309,12 @@ func (b *Buffer) Update() { b.NumLines = len(b.lines) } +func (b *Buffer) UpdateCursors() { + for i, c := range b.cursors { + c.Num = i + } +} + // Save saves the buffer to its default path func (b *Buffer) Save() error { return b.SaveAs(b.Path) diff --git a/cmd/micro/cursor.go b/cmd/micro/cursor.go index b864974a..2682dee4 100644 --- a/cmd/micro/cursor.go +++ b/cmd/micro/cursor.go @@ -21,6 +21,9 @@ type Cursor struct { // This is used for line and word selection where it is necessary // to know what the original selection was OrigSelection [2]Loc + + // Which cursor index is this (for multiple cursors) + Num int } // Goto puts the cursor at the given cursor's location and gives the current cursor its selection too diff --git a/cmd/micro/eventhandler.go b/cmd/micro/eventhandler.go index 85809284..24bc593e 100644 --- a/cmd/micro/eventhandler.go +++ b/cmd/micro/eventhandler.go @@ -97,7 +97,7 @@ func (eh *EventHandler) ApplyDiff(new string) { // Insert creates an insert text event and executes it func (eh *EventHandler) Insert(start Loc, text string) { e := &TextEvent{ - C: eh.buf.Cursor, + C: *eh.buf.cursors[eh.buf.curCursor], EventType: TextEventInsert, Deltas: []Delta{Delta{text, start, Loc{0, 0}}}, Time: time.Now(), @@ -119,7 +119,7 @@ func (eh *EventHandler) Insert(start Loc, text string) { // Remove creates a remove text event and executes it func (eh *EventHandler) Remove(start, end Loc) { e := &TextEvent{ - C: eh.buf.Cursor, + C: *eh.buf.cursors[eh.buf.curCursor], EventType: TextEventRemove, Deltas: []Delta{Delta{"", start, end}}, Time: time.Now(), @@ -141,7 +141,7 @@ func (eh *EventHandler) Remove(start, end Loc) { // MultipleReplace creates an multiple insertions executes them func (eh *EventHandler) MultipleReplace(deltas []Delta) { e := &TextEvent{ - C: eh.buf.Cursor, + C: *eh.buf.cursors[eh.buf.curCursor], EventType: TextEventReplace, Deltas: deltas, Time: time.Now(), @@ -216,8 +216,12 @@ func (eh *EventHandler) UndoOneEvent() { // Set the cursor in the right place teCursor := t.C - t.C = eh.buf.Cursor - eh.buf.Cursor.Goto(teCursor) + if teCursor.Num >= 0 && teCursor.Num < len(eh.buf.cursors) { + t.C = *eh.buf.cursors[teCursor.Num] + eh.buf.cursors[teCursor.Num].Goto(teCursor) + } else { + teCursor.Num = -1 + } // Push it to the redo stack eh.RedoStack.Push(t) @@ -259,8 +263,12 @@ func (eh *EventHandler) RedoOneEvent() { UndoTextEvent(t, eh.buf) teCursor := t.C - t.C = eh.buf.Cursor - eh.buf.Cursor.Goto(teCursor) + if teCursor.Num >= 0 && teCursor.Num < len(eh.buf.cursors) { + t.C = *eh.buf.cursors[teCursor.Num] + eh.buf.cursors[teCursor.Num].Goto(teCursor) + } else { + teCursor.Num = -1 + } eh.UndoStack.Push(t) } diff --git a/cmd/micro/view.go b/cmd/micro/view.go index 8a009b65..72380093 100644 --- a/cmd/micro/view.go +++ b/cmd/micro/view.go @@ -479,6 +479,11 @@ func (v *View) ExecuteActions(actions []func(*View, bool) bool) bool { return relocate } +func (v *View) SetCursor(c *Cursor) { + v.Cursor = c + v.Buf.curCursor = c.Num +} + // HandleEvent handles an event passed by the main loop func (v *View) HandleEvent(event tcell.Event) { // This bool determines whether the view is relocated at the end of the function @@ -500,12 +505,12 @@ func (v *View) HandleEvent(event tcell.Event) { } if e.Modifiers() == key.modifiers { for _, c := range v.Buf.cursors { - v.Cursor = c + v.SetCursor(c) relocate = false isBinding = true relocate = v.ExecuteActions(actions) || relocate } - v.Cursor = &v.Buf.Cursor + v.SetCursor(&v.Buf.Cursor) break } } @@ -514,7 +519,7 @@ func (v *View) HandleEvent(event tcell.Event) { // Check viewtype if readonly don't insert a rune (readonly help and log view etc.) if v.Type.readonly == false { for _, c := range v.Buf.cursors { - v.Cursor = c + v.SetCursor(c) // Insert a character if v.Cursor.HasSelection() { @@ -534,7 +539,7 @@ func (v *View) HandleEvent(event tcell.Event) { curMacro = append(curMacro, e.Rune()) } } - v.Cursor = &v.Buf.Cursor + v.SetCursor(&v.Buf.Cursor) } } case *tcell.EventPaste: @@ -545,11 +550,11 @@ func (v *View) HandleEvent(event tcell.Event) { } for _, c := range v.Buf.cursors { - v.Cursor = c + v.SetCursor(c) v.paste(e.Text()) } - v.Cursor = &v.Buf.Cursor + v.SetCursor(&v.Buf.Cursor) PostActionCall("Paste", v) } @@ -562,10 +567,10 @@ func (v *View) HandleEvent(event tcell.Event) { for key, actions := range bindings { if button == key.buttons && e.Modifiers() == key.modifiers { for _, c := range v.Buf.cursors { - v.Cursor = c + v.SetCursor(c) relocate = v.ExecuteActions(actions) || relocate } - v.Cursor = &v.Buf.Cursor + v.SetCursor(&v.Buf.Cursor) } } @@ -841,7 +846,7 @@ func (v *View) DisplayView() { charLoc := char.realLoc for _, c := range v.Buf.cursors { - v.Cursor = c + v.SetCursor(c) if v.Cursor.HasSelection() && (charLoc.GreaterEqual(v.Cursor.CurSelection[0]) && charLoc.LessThan(v.Cursor.CurSelection[1]) || charLoc.LessThan(v.Cursor.CurSelection[0]) && charLoc.GreaterEqual(v.Cursor.CurSelection[1])) { @@ -853,7 +858,7 @@ func (v *View) DisplayView() { } } } - v.Cursor = &v.Buf.Cursor + v.SetCursor(&v.Buf.Cursor) if v.Buf.Settings["cursorline"].(bool) && tabs[curTab].CurView == v.Num && !v.Cursor.HasSelection() && v.Cursor.Y == realLineN { @@ -865,14 +870,14 @@ func (v *View) DisplayView() { screen.SetContent(xOffset+char.visualLoc.X, yOffset+char.visualLoc.Y, char.drawChar, nil, lineStyle) for i, c := range v.Buf.cursors { - v.Cursor = c + v.SetCursor(c) if tabs[curTab].CurView == v.Num && !v.Cursor.HasSelection() && v.Cursor.Y == char.realLoc.Y && v.Cursor.X == char.realLoc.X && (!cursorSet || i != 0) { ShowMultiCursor(xOffset+char.visualLoc.X, yOffset+char.visualLoc.Y, i) cursorSet = true } } - v.Cursor = &v.Buf.Cursor + v.SetCursor(&v.Buf.Cursor) lastChar = char } @@ -885,26 +890,26 @@ func (v *View) DisplayView() { if lastChar != nil { lastX = xOffset + lastChar.visualLoc.X + lastChar.width for i, c := range v.Buf.cursors { - v.Cursor = c + v.SetCursor(c) if tabs[curTab].CurView == v.Num && !v.Cursor.HasSelection() && v.Cursor.Y == lastChar.realLoc.Y && v.Cursor.X == lastChar.realLoc.X+1 { ShowMultiCursor(lastX, yOffset+lastChar.visualLoc.Y, i) cx, cy = lastX, yOffset+lastChar.visualLoc.Y } } - v.Cursor = &v.Buf.Cursor + v.SetCursor(&v.Buf.Cursor) realLoc = Loc{lastChar.realLoc.X + 1, realLineN} visualLoc = Loc{lastX - xOffset, lastChar.visualLoc.Y} } else if len(line) == 0 { for i, c := range v.Buf.cursors { - v.Cursor = c + v.SetCursor(c) if tabs[curTab].CurView == v.Num && !v.Cursor.HasSelection() && v.Cursor.Y == realLineN { ShowMultiCursor(xOffset, yOffset+visualLineN, i) cx, cy = xOffset, yOffset+visualLineN } } - v.Cursor = &v.Buf.Cursor + v.SetCursor(&v.Buf.Cursor) lastX = xOffset realLoc = Loc{0, realLineN} visualLoc = Loc{0, visualLineN} From 118e6b18048c2482bf7cd63f34c5797c62c68b5e Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Sat, 17 Jun 2017 10:43:14 -0400 Subject: [PATCH 08/10] Merge cursors properly Cursors will merge together if they are on top of each other. --- cmd/micro/actions.go | 14 ++++++-------- cmd/micro/buffer.go | 18 ++++++++++++++++++ cmd/micro/view.go | 2 ++ 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/cmd/micro/actions.go b/cmd/micro/actions.go index c09f2a4e..5b29e1e9 100644 --- a/cmd/micro/actions.go +++ b/cmd/micro/actions.go @@ -1916,17 +1916,15 @@ func (v *View) SkipMultiCursor(usePlugin bool) bool { func (v *View) RemoveMultiCursor(usePlugin bool) bool { end := len(v.Buf.cursors) if end > 1 { - nextOne := v.Buf.cursors[len(v.Buf.cursors)-2] - if v.Cursor == nextOne { + lastOne := v.Buf.cursors[end-1] + if v.Cursor == lastOne { if usePlugin && !PreActionCall("RemoveMultiCursor", v) { return false } - if end > 1 { - v.Buf.cursors[end-1] = nil - v.Buf.cursors = v.Buf.cursors[:end-1] - v.Buf.UpdateCursors() - } + v.Buf.cursors[end-1] = nil + v.Buf.cursors = v.Buf.cursors[:end-1] + v.Buf.UpdateCursors() v.Relocate() if usePlugin { @@ -1942,7 +1940,7 @@ func (v *View) RemoveMultiCursor(usePlugin bool) bool { // RemoveAllMultiCursors removes all cursors except the base cursor func (v *View) RemoveAllMultiCursors(usePlugin bool) bool { - if v.Cursor == &v.Buf.Cursor { + if v.Cursor == v.Buf.cursors[len(v.Buf.cursors)-1] { if usePlugin && !PreActionCall("RemoveAllMultiCursors", v) { return false } diff --git a/cmd/micro/buffer.go b/cmd/micro/buffer.go index 7f08acd5..6471baf0 100644 --- a/cmd/micro/buffer.go +++ b/cmd/micro/buffer.go @@ -309,6 +309,24 @@ func (b *Buffer) Update() { b.NumLines = len(b.lines) } +func (b *Buffer) MergeCursors() { + var cursors []*Cursor + for i := 0; i < len(b.cursors); i++ { + c1 := b.cursors[i] + if c1 != nil { + for j := 0; j < len(b.cursors); j++ { + c2 := b.cursors[j] + if i != j && c1.Loc == c2.Loc { + b.cursors[j] = nil + } + } + cursors = append(cursors, c1) + } + } + + b.cursors = cursors +} + func (b *Buffer) UpdateCursors() { for i, c := range b.cursors { c.Num = i diff --git a/cmd/micro/view.go b/cmd/micro/view.go index 72380093..fc27539c 100644 --- a/cmd/micro/view.go +++ b/cmd/micro/view.go @@ -511,6 +511,7 @@ func (v *View) HandleEvent(event tcell.Event) { relocate = v.ExecuteActions(actions) || relocate } v.SetCursor(&v.Buf.Cursor) + v.Buf.MergeCursors() break } } @@ -571,6 +572,7 @@ func (v *View) HandleEvent(event tcell.Event) { relocate = v.ExecuteActions(actions) || relocate } v.SetCursor(&v.Buf.Cursor) + v.Buf.MergeCursors() } } From 681da2e90ca8132753c47949187b5f38fece5956 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Sat, 17 Jun 2017 11:05:23 -0400 Subject: [PATCH 09/10] Deselect with mouse This commit also makes non editing actions (save, quit...) only execute once even if there are multiple cursors. --- cmd/micro/actions.go | 772 ++++++++++++++++++++++++------------------- cmd/micro/view.go | 4 + 2 files changed, 428 insertions(+), 348 deletions(-) diff --git a/cmd/micro/actions.go b/cmd/micro/actions.go index 5b29e1e9..24b16d6c 100644 --- a/cmd/micro/actions.go +++ b/cmd/micro/actions.go @@ -64,8 +64,17 @@ func (v *View) MousePress(usePlugin bool, e *tcell.EventMouse) bool { y += v.Topline - v.y // This is usually bound to left click + v.MoveToMouseClick(x, y) if v.mouseReleased { - v.MoveToMouseClick(x, y) + if len(v.Buf.cursors) > 1 { + for i := 1; i < len(v.Buf.cursors); i++ { + v.Buf.cursors[i] = nil + } + v.Buf.cursors = v.Buf.cursors[:1] + v.Buf.UpdateCursors() + v.Cursor.ResetSelection() + v.Relocate() + } if time.Since(v.lastClickTime)/time.Millisecond < doubleClickThreshold { if v.doubleClick { // Triple click @@ -97,7 +106,6 @@ func (v *View) MousePress(usePlugin bool, e *tcell.EventMouse) bool { } v.mouseReleased = false } else if !v.mouseReleased { - v.MoveToMouseClick(x, y) if v.tripleClick { v.Cursor.AddLineToSelection() } else if v.doubleClick { @@ -116,30 +124,34 @@ func (v *View) MousePress(usePlugin bool, e *tcell.EventMouse) bool { // ScrollUpAction scrolls the view up func (v *View) ScrollUpAction(usePlugin bool) bool { - if usePlugin && !PreActionCall("ScrollUp", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("ScrollUp", v) { + return false + } - scrollspeed := int(v.Buf.Settings["scrollspeed"].(float64)) - v.ScrollUp(scrollspeed) + scrollspeed := int(v.Buf.Settings["scrollspeed"].(float64)) + v.ScrollUp(scrollspeed) - if usePlugin { - PostActionCall("ScrollUp", v) + if usePlugin { + PostActionCall("ScrollUp", v) + } } return false } // ScrollDownAction scrolls the view up func (v *View) ScrollDownAction(usePlugin bool) bool { - if usePlugin && !PreActionCall("ScrollDown", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("ScrollDown", v) { + return false + } - scrollspeed := int(v.Buf.Settings["scrollspeed"].(float64)) - v.ScrollDown(scrollspeed) + scrollspeed := int(v.Buf.Settings["scrollspeed"].(float64)) + v.ScrollDown(scrollspeed) - if usePlugin { - PostActionCall("ScrollDown", v) + if usePlugin { + PostActionCall("ScrollDown", v) + } } return false } @@ -819,41 +831,45 @@ func (v *View) InsertTab(usePlugin bool) bool { // SaveAll saves all open buffers func (v *View) SaveAll(usePlugin bool) bool { - if usePlugin && !PreActionCall("SaveAll", v) { - return false - } - - for _, t := range tabs { - for _, v := range t.views { - v.Save(false) + if v.mainCursor() { + if usePlugin && !PreActionCall("SaveAll", v) { + return false } - } - if usePlugin { - return PostActionCall("SaveAll", v) + for _, t := range tabs { + for _, v := range t.views { + v.Save(false) + } + } + + if usePlugin { + return PostActionCall("SaveAll", v) + } } return false } // Save the buffer to disk func (v *View) Save(usePlugin bool) bool { - if usePlugin && !PreActionCall("Save", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("Save", v) { + return false + } - if v.Type.scratch == true { - // We can't save any view type with scratch set. eg help and log text - return false - } - // If this is an empty buffer, ask for a filename - if v.Buf.Path == "" { - v.SaveAs(false) - } else { - v.saveToFile(v.Buf.Path) - } + if v.Type.scratch == true { + // We can't save any view type with scratch set. eg help and log text + return false + } + // If this is an empty buffer, ask for a filename + if v.Buf.Path == "" { + v.SaveAs(false) + } else { + v.saveToFile(v.Buf.Path) + } - if usePlugin { - return PostActionCall("Save", v) + if usePlugin { + return PostActionCall("Save", v) + } } return false } @@ -889,34 +905,45 @@ func (v *View) saveToFile(filename string) { // SaveAs saves the buffer to disk with the given name func (v *View) SaveAs(usePlugin bool) bool { - filename, canceled := messenger.Prompt("Filename: ", "", "Save", NoCompletion) - if !canceled { - // the filename might or might not be quoted, so unquote first then join the strings. - filename = strings.Join(SplitCommandArgs(filename), " ") - v.saveToFile(filename) - } + if v.mainCursor() { + if usePlugin && !PreActionCall("Find", v) { + return false + } + filename, canceled := messenger.Prompt("Filename: ", "", "Save", NoCompletion) + if !canceled { + // the filename might or might not be quoted, so unquote first then join the strings. + filename = strings.Join(SplitCommandArgs(filename), " ") + v.saveToFile(filename) + } + + if usePlugin { + PostActionCall("Find", v) + } + } return false } // Find opens a prompt and searches forward for the input func (v *View) Find(usePlugin bool) bool { - if usePlugin && !PreActionCall("Find", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("Find", v) { + return false + } - searchStr := "" - if v.Cursor.HasSelection() { - searchStart = ToCharPos(v.Cursor.CurSelection[1], v.Buf) - searchStart = ToCharPos(v.Cursor.CurSelection[1], v.Buf) - searchStr = v.Cursor.GetSelection() - } else { - searchStart = ToCharPos(v.Cursor.Loc, v.Buf) - } - BeginSearch(searchStr) + searchStr := "" + if v.Cursor.HasSelection() { + searchStart = ToCharPos(v.Cursor.CurSelection[1], v.Buf) + searchStart = ToCharPos(v.Cursor.CurSelection[1], v.Buf) + searchStr = v.Cursor.GetSelection() + } else { + searchStart = ToCharPos(v.Cursor.Loc, v.Buf) + } + BeginSearch(searchStr) - if usePlugin { - return PostActionCall("Find", v) + if usePlugin { + return PostActionCall("Find", v) + } } return true } @@ -997,18 +1024,20 @@ func (v *View) Redo(usePlugin bool) bool { // Copy the selection to the system clipboard func (v *View) Copy(usePlugin bool) bool { - if usePlugin && !PreActionCall("Copy", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("Copy", v) { + return false + } - if v.Cursor.HasSelection() { - v.Cursor.CopySelection("clipboard") - v.freshClip = true - messenger.Message("Copied selection") - } + if v.Cursor.HasSelection() { + v.Cursor.CopySelection("clipboard") + v.freshClip = true + messenger.Message("Copied selection") + } - if usePlugin { - return PostActionCall("Copy", v) + if usePlugin { + return PostActionCall("Copy", v) + } } return true } @@ -1239,16 +1268,18 @@ func (v *View) SelectAll(usePlugin bool) bool { // OpenFile opens a new file in the buffer func (v *View) OpenFile(usePlugin bool) bool { - if usePlugin && !PreActionCall("OpenFile", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("OpenFile", v) { + return false + } - if v.CanClose() { - input, canceled := messenger.Prompt("> ", "open ", "Open", CommandCompletion) - if !canceled { - HandleCommand(input) - if usePlugin { - return PostActionCall("OpenFile", v) + if v.CanClose() { + input, canceled := messenger.Prompt("> ", "open ", "Open", CommandCompletion) + if !canceled { + HandleCommand(input) + if usePlugin { + return PostActionCall("OpenFile", v) + } } } } @@ -1257,68 +1288,76 @@ func (v *View) OpenFile(usePlugin bool) bool { // Start moves the viewport to the start of the buffer func (v *View) Start(usePlugin bool) bool { - if usePlugin && !PreActionCall("Start", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("Start", v) { + return false + } - v.Topline = 0 + v.Topline = 0 - if usePlugin { - return PostActionCall("Start", v) + if usePlugin { + return PostActionCall("Start", v) + } } return false } // End moves the viewport to the end of the buffer func (v *View) End(usePlugin bool) bool { - if usePlugin && !PreActionCall("End", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("End", v) { + return false + } - if v.Height > v.Buf.NumLines { - v.Topline = 0 - } else { - v.Topline = v.Buf.NumLines - v.Height - } + if v.Height > v.Buf.NumLines { + v.Topline = 0 + } else { + v.Topline = v.Buf.NumLines - v.Height + } - if usePlugin { - return PostActionCall("End", v) + if usePlugin { + return PostActionCall("End", v) + } } return false } // PageUp scrolls the view up a page func (v *View) PageUp(usePlugin bool) bool { - if usePlugin && !PreActionCall("PageUp", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("PageUp", v) { + return false + } - if v.Topline > v.Height { - v.ScrollUp(v.Height) - } else { - v.Topline = 0 - } + if v.Topline > v.Height { + v.ScrollUp(v.Height) + } else { + v.Topline = 0 + } - if usePlugin { - return PostActionCall("PageUp", v) + if usePlugin { + return PostActionCall("PageUp", v) + } } return false } // PageDown scrolls the view down a page func (v *View) PageDown(usePlugin bool) bool { - if usePlugin && !PreActionCall("PageDown", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("PageDown", v) { + return false + } - if v.Buf.NumLines-(v.Topline+v.Height) > v.Height { - v.ScrollDown(v.Height) - } else if v.Buf.NumLines >= v.Height { - v.Topline = v.Buf.NumLines - v.Height - } + if v.Buf.NumLines-(v.Topline+v.Height) > v.Height { + v.ScrollDown(v.Height) + } else if v.Buf.NumLines >= v.Height { + v.Topline = v.Buf.NumLines - v.Height + } - if usePlugin { - return PostActionCall("PageDown", v) + if usePlugin { + return PostActionCall("PageDown", v) + } } return false } @@ -1365,58 +1404,64 @@ func (v *View) CursorPageDown(usePlugin bool) bool { // HalfPageUp scrolls the view up half a page func (v *View) HalfPageUp(usePlugin bool) bool { - if usePlugin && !PreActionCall("HalfPageUp", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("HalfPageUp", v) { + return false + } - if v.Topline > v.Height/2 { - v.ScrollUp(v.Height / 2) - } else { - v.Topline = 0 - } + if v.Topline > v.Height/2 { + v.ScrollUp(v.Height / 2) + } else { + v.Topline = 0 + } - if usePlugin { - return PostActionCall("HalfPageUp", v) + if usePlugin { + return PostActionCall("HalfPageUp", v) + } } return false } // HalfPageDown scrolls the view down half a page func (v *View) HalfPageDown(usePlugin bool) bool { - if usePlugin && !PreActionCall("HalfPageDown", v) { - return false - } - - if v.Buf.NumLines-(v.Topline+v.Height) > v.Height/2 { - v.ScrollDown(v.Height / 2) - } else { - if v.Buf.NumLines >= v.Height { - v.Topline = v.Buf.NumLines - v.Height + if v.mainCursor() { + if usePlugin && !PreActionCall("HalfPageDown", v) { + return false } - } - if usePlugin { - return PostActionCall("HalfPageDown", v) + if v.Buf.NumLines-(v.Topline+v.Height) > v.Height/2 { + v.ScrollDown(v.Height / 2) + } else { + if v.Buf.NumLines >= v.Height { + v.Topline = v.Buf.NumLines - v.Height + } + } + + if usePlugin { + return PostActionCall("HalfPageDown", v) + } } return false } // ToggleRuler turns line numbers off and on func (v *View) ToggleRuler(usePlugin bool) bool { - if usePlugin && !PreActionCall("ToggleRuler", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("ToggleRuler", v) { + return false + } - if v.Buf.Settings["ruler"] == false { - v.Buf.Settings["ruler"] = true - messenger.Message("Enabled ruler") - } else { - v.Buf.Settings["ruler"] = false - messenger.Message("Disabled ruler") - } + if v.Buf.Settings["ruler"] == false { + v.Buf.Settings["ruler"] = true + messenger.Message("Enabled ruler") + } else { + v.Buf.Settings["ruler"] = false + messenger.Message("Disabled ruler") + } - if usePlugin { - return PostActionCall("ToggleRuler", v) + if usePlugin { + return PostActionCall("ToggleRuler", v) + } } return false } @@ -1454,49 +1499,55 @@ func (v *View) JumpLine(usePlugin bool) bool { // ClearStatus clears the messenger bar func (v *View) ClearStatus(usePlugin bool) bool { - if usePlugin && !PreActionCall("ClearStatus", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("ClearStatus", v) { + return false + } - messenger.Message("") + messenger.Message("") - if usePlugin { - return PostActionCall("ClearStatus", v) + if usePlugin { + return PostActionCall("ClearStatus", v) + } } return false } // ToggleHelp toggles the help screen func (v *View) ToggleHelp(usePlugin bool) bool { - if usePlugin && !PreActionCall("ToggleHelp", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("ToggleHelp", v) { + return false + } - if v.Type != vtHelp { - // Open the default help - v.openHelp("help") - } else { - v.Quit(true) - } + if v.Type != vtHelp { + // Open the default help + v.openHelp("help") + } else { + v.Quit(true) + } - if usePlugin { - return PostActionCall("ToggleHelp", v) + if usePlugin { + return PostActionCall("ToggleHelp", v) + } } return true } // ShellMode opens a terminal to run a shell command func (v *View) ShellMode(usePlugin bool) bool { - if usePlugin && !PreActionCall("ShellMode", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("ShellMode", v) { + return false + } - input, canceled := messenger.Prompt("$ ", "", "Shell", NoCompletion) - if !canceled { - // The true here is for openTerm to make the command interactive - HandleShellCommand(input, true, true) - if usePlugin { - return PostActionCall("ShellMode", v) + input, canceled := messenger.Prompt("$ ", "", "Shell", NoCompletion) + if !canceled { + // The true here is for openTerm to make the command interactive + HandleShellCommand(input, true, true) + if usePlugin { + return PostActionCall("ShellMode", v) + } } } return false @@ -1504,15 +1555,17 @@ func (v *View) ShellMode(usePlugin bool) bool { // CommandMode lets the user enter a command func (v *View) CommandMode(usePlugin bool) bool { - if usePlugin && !PreActionCall("CommandMode", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("CommandMode", v) { + return false + } - input, canceled := messenger.Prompt("> ", "", "Command", CommandCompletion) - if !canceled { - HandleCommand(input) - if usePlugin { - return PostActionCall("CommandMode", v) + input, canceled := messenger.Prompt("> ", "", "Command", CommandCompletion) + if !canceled { + HandleCommand(input) + if usePlugin { + return PostActionCall("CommandMode", v) + } } } @@ -1521,15 +1574,17 @@ func (v *View) CommandMode(usePlugin bool) bool { // Escape leaves current mode func (v *View) Escape(usePlugin bool) bool { - // check if user is searching, or the last search is still active - if searching || lastSearch != "" { - ExitSearch(v) - return true - } - // check if a prompt is shown, hide it and don't quit - if messenger.hasPrompt { - messenger.Reset() // FIXME - return true + if v.mainCursor() { + // check if user is searching, or the last search is still active + if searching || lastSearch != "" { + ExitSearch(v) + return true + } + // check if a prompt is shown, hide it and don't quit + if messenger.hasPrompt { + messenger.Reset() // FIXME + return true + } } return false @@ -1537,78 +1592,82 @@ func (v *View) Escape(usePlugin bool) bool { // Quit this will close the current tab or view that is open func (v *View) Quit(usePlugin bool) bool { - if usePlugin && !PreActionCall("Quit", v) { - return false - } - - // Make sure not to quit if there are unsaved changes - if v.CanClose() { - v.CloseBuffer() - if len(tabs[curTab].views) > 1 { - v.splitNode.Delete() - tabs[v.TabNum].Cleanup() - tabs[v.TabNum].Resize() - } else if len(tabs) > 1 { - if len(tabs[v.TabNum].views) == 1 { - tabs = tabs[:v.TabNum+copy(tabs[v.TabNum:], tabs[v.TabNum+1:])] - for i, t := range tabs { - t.SetNum(i) - } - if curTab >= len(tabs) { - curTab-- - } - if curTab == 0 { - CurView().ToggleTabbar() - } - } - } else { - if usePlugin { - PostActionCall("Quit", v) - } - - screen.Fini() - os.Exit(0) + if v.mainCursor() { + if usePlugin && !PreActionCall("Quit", v) { + return false } - } - if usePlugin { - return PostActionCall("Quit", v) + // Make sure not to quit if there are unsaved changes + if v.CanClose() { + v.CloseBuffer() + if len(tabs[curTab].views) > 1 { + v.splitNode.Delete() + tabs[v.TabNum].Cleanup() + tabs[v.TabNum].Resize() + } else if len(tabs) > 1 { + if len(tabs[v.TabNum].views) == 1 { + tabs = tabs[:v.TabNum+copy(tabs[v.TabNum:], tabs[v.TabNum+1:])] + for i, t := range tabs { + t.SetNum(i) + } + if curTab >= len(tabs) { + curTab-- + } + if curTab == 0 { + CurView().ToggleTabbar() + } + } + } else { + if usePlugin { + PostActionCall("Quit", v) + } + + screen.Fini() + os.Exit(0) + } + } + + if usePlugin { + return PostActionCall("Quit", v) + } } return false } // QuitAll quits the whole editor; all splits and tabs func (v *View) QuitAll(usePlugin bool) bool { - if usePlugin && !PreActionCall("QuitAll", v) { - return false - } - - closeAll := true - for _, tab := range tabs { - for _, v := range tab.views { - if !v.CanClose() { - closeAll = false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("QuitAll", v) { + return false } - } - if closeAll { - // only quit if all of the buffers can be closed and the user confirms that they actually want to quit everything - shouldQuit, _ := messenger.YesNoPrompt("Do you want to quit micro (all open files will be closed)?") - - if shouldQuit { - for _, tab := range tabs { - for _, v := range tab.views { - v.CloseBuffer() + closeAll := true + for _, tab := range tabs { + for _, v := range tab.views { + if !v.CanClose() { + closeAll = false } } + } - if usePlugin { - PostActionCall("QuitAll", v) + if closeAll { + // only quit if all of the buffers can be closed and the user confirms that they actually want to quit everything + shouldQuit, _ := messenger.YesNoPrompt("Do you want to quit micro (all open files will be closed)?") + + if shouldQuit { + for _, tab := range tabs { + for _, v := range tab.views { + v.CloseBuffer() + } + } + + if usePlugin { + PostActionCall("QuitAll", v) + } + + screen.Fini() + os.Exit(0) } - - screen.Fini() - os.Exit(0) } } @@ -1617,147 +1676,163 @@ func (v *View) QuitAll(usePlugin bool) bool { // AddTab adds a new tab with an empty buffer func (v *View) AddTab(usePlugin bool) bool { - if usePlugin && !PreActionCall("AddTab", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("AddTab", v) { + return false + } - tab := NewTabFromView(NewView(NewBufferFromString("", ""))) - tab.SetNum(len(tabs)) - tabs = append(tabs, tab) - curTab = len(tabs) - 1 - if len(tabs) == 2 { - for _, t := range tabs { - for _, v := range t.views { - v.ToggleTabbar() + tab := NewTabFromView(NewView(NewBufferFromString("", ""))) + tab.SetNum(len(tabs)) + tabs = append(tabs, tab) + curTab = len(tabs) - 1 + if len(tabs) == 2 { + for _, t := range tabs { + for _, v := range t.views { + v.ToggleTabbar() + } } } - } - if usePlugin { - return PostActionCall("AddTab", v) + if usePlugin { + return PostActionCall("AddTab", v) + } } return true } // PreviousTab switches to the previous tab in the tab list func (v *View) PreviousTab(usePlugin bool) bool { - if usePlugin && !PreActionCall("PreviousTab", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("PreviousTab", v) { + return false + } - if curTab > 0 { - curTab-- - } else if curTab == 0 { - curTab = len(tabs) - 1 - } + if curTab > 0 { + curTab-- + } else if curTab == 0 { + curTab = len(tabs) - 1 + } - if usePlugin { - return PostActionCall("PreviousTab", v) + if usePlugin { + return PostActionCall("PreviousTab", v) + } } return false } // NextTab switches to the next tab in the tab list func (v *View) NextTab(usePlugin bool) bool { - if usePlugin && !PreActionCall("NextTab", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("NextTab", v) { + return false + } - if curTab < len(tabs)-1 { - curTab++ - } else if curTab == len(tabs)-1 { - curTab = 0 - } + if curTab < len(tabs)-1 { + curTab++ + } else if curTab == len(tabs)-1 { + curTab = 0 + } - if usePlugin { - return PostActionCall("NextTab", v) + if usePlugin { + return PostActionCall("NextTab", v) + } } return false } // VSplitBinding opens an empty vertical split func (v *View) VSplitBinding(usePlugin bool) bool { - if usePlugin && !PreActionCall("VSplit", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("VSplit", v) { + return false + } - v.VSplit(NewBufferFromString("", "")) + v.VSplit(NewBufferFromString("", "")) - if usePlugin { - return PostActionCall("VSplit", v) + if usePlugin { + return PostActionCall("VSplit", v) + } } return false } // HSplitBinding opens an empty horizontal split func (v *View) HSplitBinding(usePlugin bool) bool { - if usePlugin && !PreActionCall("HSplit", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("HSplit", v) { + return false + } - v.HSplit(NewBufferFromString("", "")) + v.HSplit(NewBufferFromString("", "")) - if usePlugin { - return PostActionCall("HSplit", v) + if usePlugin { + return PostActionCall("HSplit", v) + } } return false } // Unsplit closes all splits in the current tab except the active one func (v *View) Unsplit(usePlugin bool) bool { - if usePlugin && !PreActionCall("Unsplit", v) { - return false - } - - curView := tabs[curTab].CurView - for i := len(tabs[curTab].views) - 1; i >= 0; i-- { - view := tabs[curTab].views[i] - if view != nil && view.Num != curView { - view.Quit(true) - // messenger.Message("Quit ", view.Buf.Path) + if v.mainCursor() { + if usePlugin && !PreActionCall("Unsplit", v) { + return false } - } - if usePlugin { - return PostActionCall("Unsplit", v) + curView := tabs[curTab].CurView + for i := len(tabs[curTab].views) - 1; i >= 0; i-- { + view := tabs[curTab].views[i] + if view != nil && view.Num != curView { + view.Quit(true) + // messenger.Message("Quit ", view.Buf.Path) + } + } + + if usePlugin { + return PostActionCall("Unsplit", v) + } } return false } // NextSplit changes the view to the next split func (v *View) NextSplit(usePlugin bool) bool { - if usePlugin && !PreActionCall("NextSplit", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("NextSplit", v) { + return false + } - tab := tabs[curTab] - if tab.CurView < len(tab.views)-1 { - tab.CurView++ - } else { - tab.CurView = 0 - } + tab := tabs[curTab] + if tab.CurView < len(tab.views)-1 { + tab.CurView++ + } else { + tab.CurView = 0 + } - if usePlugin { - return PostActionCall("NextSplit", v) + if usePlugin { + return PostActionCall("NextSplit", v) + } } return false } // PreviousSplit changes the view to the previous split func (v *View) PreviousSplit(usePlugin bool) bool { - if usePlugin && !PreActionCall("PreviousSplit", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("PreviousSplit", v) { + return false + } - tab := tabs[curTab] - if tab.CurView > 0 { - tab.CurView-- - } else { - tab.CurView = len(tab.views) - 1 - } + tab := tabs[curTab] + if tab.CurView > 0 { + tab.CurView-- + } else { + tab.CurView = len(tab.views) - 1 + } - if usePlugin { - return PostActionCall("PreviousSplit", v) + if usePlugin { + return PostActionCall("PreviousSplit", v) + } } return false } @@ -1767,21 +1842,23 @@ var recordingMacro bool // ToggleMacro toggles recording of a macro func (v *View) ToggleMacro(usePlugin bool) bool { - if usePlugin && !PreActionCall("ToggleMacro", v) { - return false - } + if v.mainCursor() { + if usePlugin && !PreActionCall("ToggleMacro", v) { + return false + } - recordingMacro = !recordingMacro + recordingMacro = !recordingMacro - if recordingMacro { - curMacro = []interface{}{} - messenger.Message("Recording") - } else { - messenger.Message("Stopped recording") - } + if recordingMacro { + curMacro = []interface{}{} + messenger.Message("Recording") + } else { + messenger.Message("Stopped recording") + } - if usePlugin { - return PostActionCall("ToggleMacro", v) + if usePlugin { + return PostActionCall("ToggleMacro", v) + } } return true } @@ -1893,7 +1970,7 @@ func (v *View) MouseMultiCursor(usePlugin bool, e *tcell.EventMouse) bool { func (v *View) SkipMultiCursor(usePlugin bool) bool { cursor := v.Buf.cursors[len(v.Buf.cursors)-1] - if v.Cursor == cursor { + if v.mainCursor() { if usePlugin && !PreActionCall("SkipMultiCursor", v) { return false } @@ -1916,8 +1993,7 @@ func (v *View) SkipMultiCursor(usePlugin bool) bool { func (v *View) RemoveMultiCursor(usePlugin bool) bool { end := len(v.Buf.cursors) if end > 1 { - lastOne := v.Buf.cursors[end-1] - if v.Cursor == lastOne { + if v.mainCursor() { if usePlugin && !PreActionCall("RemoveMultiCursor", v) { return false } @@ -1940,7 +2016,7 @@ func (v *View) RemoveMultiCursor(usePlugin bool) bool { // RemoveAllMultiCursors removes all cursors except the base cursor func (v *View) RemoveAllMultiCursors(usePlugin bool) bool { - if v.Cursor == v.Buf.cursors[len(v.Buf.cursors)-1] { + if v.mainCursor() { if usePlugin && !PreActionCall("RemoveAllMultiCursors", v) { return false } diff --git a/cmd/micro/view.go b/cmd/micro/view.go index fc27539c..fa628b18 100644 --- a/cmd/micro/view.go +++ b/cmd/micro/view.go @@ -621,6 +621,10 @@ func (v *View) HandleEvent(event tcell.Event) { } } +func (v *View) mainCursor() bool { + return v.Buf.curCursor == len(v.Buf.cursors)-1 +} + // GutterMessage creates a message in this view's gutter func (v *View) GutterMessage(section string, lineN int, msg string, kind int) { lineN-- From 397361f23dd0c8d59e86bf2a325f19ea9243d51c Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Sat, 17 Jun 2017 17:36:27 -0400 Subject: [PATCH 10/10] Add multiple cursor docs + improve docs in general --- cmd/micro/runtime.go | 6 +- runtime/help/defaultkeys.md | 312 +++++++++++++----------------------- runtime/help/keybindings.md | 49 +++++- runtime/help/plugins.md | 36 +++-- 4 files changed, 175 insertions(+), 228 deletions(-) diff --git a/cmd/micro/runtime.go b/cmd/micro/runtime.go index be2d8ed5..45bcc738 100644 --- a/cmd/micro/runtime.go +++ b/cmd/micro/runtime.go @@ -907,7 +907,7 @@ func runtimeHelpCommandsMd() (*asset, error) { return a, nil } -var _runtimeHelpDefaultkeysMd = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\xdf\x6f\xe3\xb8\x11\x7e\xd7\x5f\x31\x0b\x3f\x5c\x7c\xd9\x73\x7b\x6d\x81\xbe\x15\x48\xd6\x71\xef\x67\x92\xdd\x38\xdd\x5e\x9f\x96\x96\x46\x16\x61\x8a\x54\x49\x2a\x5e\x01\xfa\xe3\x0f\x43\x4a\x8a\x2d\xdb\x89\x13\xd3\xbb\x41\xb0\x7e\x32\x64\x89\xfa\xe6\x9b\x8f\xc3\x99\x21\x3d\x18\x63\xca\x4a\x61\xe1\x57\xac\x4c\x14\x9d\xa3\x50\x4b\x60\x1a\xc1\xf0\xbc\x10\x08\x71\xc6\xb4\x35\xa0\x52\xb0\x19\x42\xd2\xdc\x9c\x29\xbb\xc0\xca\x00\x93\x09\x5d\xe7\x1a\xd2\x52\xc6\x96\x2b\x69\x46\xd1\x44\x69\xc8\x95\x46\xe0\x32\x55\x3a\x67\x74\x19\xd8\x4c\x95\x16\x66\x5c\x26\x5c\xce\x21\x2e\x8d\x55\x79\x37\x8c\xd2\xf4\x1e\x39\xe7\x72\x1e\xb5\xaf\x68\x6e\x35\x6f\xa1\x10\xc8\x0c\x82\x2e\x25\x7c\xfa\x57\x86\xa2\x80\x05\x56\xed\xcf\x9f\xa2\xe8\xba\xf9\x1d\x73\xcc\x67\xa8\xc1\x66\xcc\xc2\xf7\x4c\x88\xef\xc1\x8d\x9e\xa1\x46\x67\x92\x46\x7a\x8a\xcd\x04\xbe\x89\x7e\x4e\xa1\x52\x25\x24\x4a\x7e\x67\x41\xf0\x05\x02\xb7\x6f\xdd\xa5\x98\x49\x8f\x86\x2e\xbd\x89\xa2\x93\x8f\xfe\x69\xa9\x2c\x68\x34\x85\x92\x86\xcf\x04\x42\xaa\xb4\xbb\x3f\x55\x7a\x8e\xd6\x92\x59\x4b\x7a\x33\x5d\xa3\xf7\xf8\x97\x5b\x35\x8a\x60\xac\xdc\xd3\xaa\x40\x09\x4c\x02\x37\xa6\x44\x98\x61\xcc\x4a\x83\xdd\x18\xca\x3d\xaa\x57\x8d\x1b\x0d\xa3\x68\x70\xad\x96\xa8\xa1\x34\xa8\xa3\xd3\x1f\x9a\x4f\xf7\xe5\xc9\x9f\xd3\xa8\x26\x57\x03\x00\xd4\x30\x46\x13\x6b\x5e\x38\x07\xa9\xb4\xf3\x21\x3c\xf6\xa9\x43\x21\x79\x67\xb5\x38\xbd\x80\x1a\x6e\x96\xdc\xc6\x19\x58\xe5\x64\x96\xf3\x58\x2b\x88\x55\x9e\x93\xc0\x0a\xad\xf2\xc2\xd2\x6f\x24\x01\xd6\x5e\x1f\x79\x24\x75\x07\x0a\x4e\x6e\x10\x5b\x89\x34\x37\x99\x4f\xce\x4f\x0c\x04\x37\x96\x6c\x6c\xaf\x8f\x60\x18\xde\x9c\x29\x9b\x79\x24\x3f\xcb\x3e\x7a\x6e\x61\xc9\x85\x00\x56\x5a\x67\x59\x21\xd0\x22\xf0\x14\x0a\x65\x9c\x9e\x46\xe1\x89\x3d\x87\x1a\x3e\x94\x12\x4c\x86\x42\x74\x96\x03\x97\x9e\xe0\xef\x0c\xc4\xa5\xd6\x28\x2d\x2c\x95\x5e\x90\x80\x13\xae\x31\xb6\x4a\x57\xa3\x40\x48\xa2\xc1\x25\xbb\xe3\x73\x17\x03\xa2\x3a\x8c\x6d\x67\x5a\xab\xa5\x81\x1a\x7e\x57\x77\xe8\xf4\x12\x97\xda\x90\x97\xb5\x2a\x65\xe2\x67\x51\x6b\x59\xa2\xe2\x32\x47\x69\x47\x6b\xf2\x5d\x15\xcd\x1f\x68\xc0\x66\xdc\x00\x37\x2b\x11\xa2\x95\xe2\x1d\xcf\xfd\x44\xe6\x3e\x60\x2c\x99\xb4\xa3\x61\x48\x57\xdd\x64\x3c\xb5\xa7\xad\x39\x24\x19\x83\x02\x63\x0b\x16\x3f\xaf\xc1\xde\x3d\x1b\x57\x38\x79\xee\x27\x98\x39\x3f\xa9\x1c\x1d\xb1\xcf\x47\x52\x03\xad\x08\x07\x0f\xe2\xe6\x00\x74\x3a\xf1\xfe\x9c\xe1\x9c\x4b\x49\x5a\x6f\x96\xb4\x56\x28\x82\x4b\x1c\xc1\xc9\x25\xb3\xa5\x66\x42\x54\xa3\xa1\x1b\xe4\x37\x4c\xed\xc1\x48\x9c\x77\x0e\x1b\x24\x90\x77\x2e\x64\x02\x2f\xd8\x3b\x28\x93\xed\x7e\xd9\x31\xc8\x07\x3e\xcf\xec\xeb\xf1\xce\x99\xb0\xa7\x07\x13\xdb\x29\xd6\x11\xdb\x84\x46\x25\xf1\x7e\xd5\x59\x2a\x9d\x80\xc0\x74\x47\x74\x79\x85\x9c\x74\x3a\x79\x98\x13\x4d\xb7\xed\x14\xdb\xcb\xe1\xe4\x9a\xcd\xf1\xb6\xe8\x99\x53\x16\x6e\xae\x18\xf8\x7f\xc9\xe3\x85\xa8\x1e\x5a\x3a\x82\x22\x19\xcb\x1e\x92\x44\x2d\xe5\xbe\x58\xc2\x66\x3c\x87\xea\x24\xec\xe2\xb5\xca\x89\x55\x60\x2c\xd3\xb6\xab\xa4\x9a\xbc\x64\xd7\x20\x41\xcc\xb9\x2d\xfc\xd7\x83\x06\x79\x39\xb2\x0f\xc2\x49\xd8\x15\xb0\xe7\xe2\x95\xf5\xeb\x21\x07\x07\x74\xf1\x98\xe6\xda\x2b\x73\xf1\x6f\x50\xc3\x2f\x65\x5e\x10\xa3\x14\x46\xa8\x62\x69\xd3\x81\x94\x53\xa9\x74\x02\xd7\xae\xac\x32\xae\xba\x73\xf7\x0c\x7c\x41\x17\x16\xc9\xc7\xd6\xc5\x33\xb4\x4b\x44\x09\xa6\x10\xdc\x1a\x5f\xc9\xaf\xa0\xb2\x6c\xb6\x11\xe2\x36\x4b\xd3\x3b\xf7\xb4\x4b\xf1\x33\xff\x95\xcb\x8d\x7a\x75\x78\x0c\x62\xa3\xc1\x94\xcd\x4c\x50\x6a\xa6\x50\xc3\x95\x6b\x68\x80\xc4\xe5\x56\x06\x8e\x2f\x17\x4a\x0e\xde\xf6\x93\xc8\x42\xe3\x1d\x57\xa5\x21\x4c\xc4\x30\x5d\xb3\x6c\x26\xb8\xd9\x5c\xdb\xd7\x9d\x34\xa5\x32\x90\x6a\x61\xe3\x5b\x42\xb9\xba\xa3\x4a\xa1\x75\x3e\x69\x0f\x66\x65\x9a\xa2\x76\x55\xb4\x64\x52\x05\x2d\x05\xc9\x9c\x51\xdf\x1c\x89\x9f\xed\x3e\xa6\x04\x95\xcb\x84\xcb\x84\xdc\xab\x5d\xe5\x1e\x56\x39\x13\xa8\xc1\x8d\x4f\x05\xee\x63\x73\xdb\xdd\x63\x15\xa4\x5c\x26\xae\x24\x0b\x89\xe4\xb2\x45\x22\x3d\x12\x63\x99\x8c\xd1\xb5\x89\x1a\x48\x06\x99\x8e\xb3\x4d\x90\xa1\x03\xcd\x75\x8b\x84\xc4\xfb\x75\x90\x90\xd3\x05\x1e\xcb\xe9\xef\xa1\x86\x77\x42\x19\xdc\xf0\xf6\xfb\x92\x22\xaa\x6f\xf9\xf1\x14\x04\x33\xfe\x37\x17\x64\x5d\x9b\x2e\x2c\xd5\x57\xf7\x81\xab\x2f\xb8\x4a\x95\xa4\x35\x2e\x8b\xd2\x63\x90\x2c\xc7\xa3\x74\x0a\x1d\x92\x1b\xa8\xe1\x86\xdd\xf5\x29\xf9\x92\x21\x34\x1a\x4c\x49\xfa\xea\x38\x4e\x3f\x23\x03\x7d\x33\x8b\x09\xb1\x63\xbe\x7f\x89\x35\xe2\xe0\x0c\xa9\x6b\xd2\x35\xe6\xec\x5b\x37\xae\x0d\xf2\xad\x5b\xb1\x69\xce\xc3\xc4\xee\x6e\x52\xac\x0d\xf2\xca\x9a\x74\x1d\x27\x87\x98\x13\xb6\x94\x6d\xbc\x93\x6a\x95\xaf\x75\xe7\x9a\xd2\xa7\x50\x86\xbb\x9d\xa3\x26\x67\x59\x1b\xa4\xab\x73\xd6\x0a\xe0\x47\xfb\x7b\xeb\x83\x04\xe1\xe4\x9b\x4e\x36\xcd\x09\x5b\x0f\x07\xd1\xc9\x53\xba\xc0\x7d\x24\x41\x38\x79\x65\x81\x3a\x48\xa3\xa1\x1f\xa8\x9f\xe5\xe2\xae\x21\xb5\xb5\x17\xb6\x47\xea\xf3\x8d\xd8\xed\xc4\x76\x6d\xa0\x2d\x1d\xa8\xbd\x32\xca\x17\x48\xec\x7f\xa9\x64\x28\x6d\xb3\x1d\x8a\xc9\xde\x1b\xa2\xc1\x91\xbc\x23\x24\xaa\xa8\x9e\x03\x25\x2c\x92\xff\x40\x0d\xd7\xcc\x58\x7c\x06\x94\xb0\x48\x7e\x6d\xbc\xd3\xdb\x3f\x85\x77\xcc\xb5\x29\x24\xcc\x10\x0a\x42\x9a\xc0\x92\xdb\xac\x81\x3f\x3c\x02\x92\x31\xd4\x30\x2e\x0b\xc1\x63\x66\x9f\xb8\x62\x04\x46\xf2\x3f\xa8\xe1\x56\x26\x0a\x58\x73\x16\x6a\x2f\x85\x1c\x03\xc9\x1f\x50\xc3\x07\xfc\xca\x48\x82\x14\x08\xdd\x92\xd1\xb6\xda\x3b\xef\x52\xd2\xd1\xcd\x02\xbf\xdd\x54\x16\x9b\x86\xbe\xac\xc8\x16\x84\x93\x2e\xda\xef\xc3\x49\xa2\x96\xb2\xcf\xca\x2b\xe4\xc4\xc9\xfe\xa7\x50\x79\xec\x18\x5d\x11\xfa\xac\x6a\x34\x88\x39\xe7\x2c\x5e\xfc\x70\xe8\x20\xa6\x60\x31\xbe\x00\x17\x47\x83\xdf\x59\xac\x55\xb0\xe6\x52\x8b\x0e\xa6\x6a\x3e\x17\x08\x57\x97\x7f\xb9\x9a\x4c\x20\xa7\x97\x80\xc6\x58\xe9\x84\xcb\xf9\x03\xae\xea\x04\x73\x4b\x79\x17\xcf\x0b\x51\x41\xa1\xd1\x98\xf6\xaa\x55\xfe\xa4\xd0\xfd\x68\xc0\x9a\xf1\x99\x2f\x98\x7a\x7b\x07\xfd\xa7\x8d\x55\xc5\xca\xc3\xee\xd1\x6d\x80\xc2\x86\xfd\x5f\x9a\x13\x7f\xee\x08\x9c\x7f\x3b\x26\xbb\x5f\x7e\x1c\x5f\x5f\xd9\x2c\xdc\x59\x55\x67\xd6\xbf\xdb\x96\x2d\xa5\xb5\x6e\xbb\x6c\xff\x4e\x69\x58\x82\x29\xc0\x9c\x09\x8b\x5a\x52\xae\x31\x63\xf1\xc2\xcd\xb1\xbd\x53\xec\x4e\x2f\x27\x37\x2a\x47\x50\x82\xf2\x37\x9d\x73\xc9\x84\x69\x0e\x23\x9b\xb2\x28\x94\xb6\xce\xd6\xf3\xf6\x05\xb0\xc0\x0a\x46\xc1\x7b\xe1\x1f\xee\xe7\x10\xbd\xce\xad\x20\xb2\x74\xa7\xa8\x75\x29\x50\x53\x42\x77\xe5\x69\xa7\xe0\x97\xb9\xd3\x89\x3c\xc1\x80\x48\xa2\xc1\x45\xce\x62\x03\xc6\x56\x02\xdb\x74\x25\xe4\xca\x32\x79\xe0\x90\x99\xdb\xf7\xa1\xd8\x3e\x82\x93\xe9\xca\x76\x9b\x77\x6a\x48\xba\x09\xc9\xf9\xa3\x87\x11\xbb\xad\x4b\x8f\xe9\x28\x3a\x26\x24\x67\xb0\xa6\x63\xd7\x2b\x5c\x60\x45\xee\x6e\xf1\xad\x61\xf3\xc9\xf4\xf0\x08\x48\x2e\xd6\x91\x5c\xf8\x73\xf3\xab\x40\x56\x5c\xe6\x60\x0c\x8f\xc4\xc9\x75\xff\x3c\x07\x25\x93\x27\x70\xc3\x72\x04\x46\xa9\xa5\x07\x36\x3c\x6e\x94\x21\x24\x97\x7d\x24\x3e\x85\xbb\xc7\xe2\x0e\x58\xed\x40\x13\x6e\x37\xb0\xfd\x37\xc0\x02\x2b\x33\x8a\x3e\x32\x4d\x6a\x78\x03\xd3\x0c\xef\xff\x29\xe0\x8e\x46\xe7\xac\x72\xff\x6f\x58\x2a\xbd\x00\x2e\x9b\xbd\x9e\x26\xaa\xbd\x81\x50\xd4\x4c\x7e\x6c\x62\xa7\x5b\x0a\x68\x19\x78\x4a\x55\x13\xd2\x49\x93\xbf\x35\x48\xbe\xf2\xee\x5d\x0d\x93\xbf\x37\x48\xdc\xe6\xf1\x96\xbd\xf4\x56\x32\xcd\xce\xfb\x86\x5e\xc2\x21\xf9\x47\x83\x64\xeb\x2e\xef\xfb\x92\x5b\xe0\x29\x28\x29\x2a\x7f\xed\x88\x48\xfe\xf9\x30\x27\xeb\x94\x6c\x99\xcf\xe1\x90\xfc\xf8\xd7\xdd\x9c\x7c\x41\x9d\x44\x7f\x06\x00\x00\xff\xff\x3f\xfa\xfb\x5b\xe6\x35\x00\x00") +var _runtimeHelpDefaultkeysMd = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x59\x49\x73\xe3\xb6\x12\xbe\xf3\x57\xb4\xcb\x87\x27\x8f\x3d\xae\x37\xef\xa5\x2a\xb7\x54\xc9\x5b\x66\xf5\x68\xbc\x64\x26\x39\x19\x22\x9b\x22\x4a\x20\xc0\x60\xb1\x46\x55\xfe\xf1\xa9\x06\xc1\x45\x12\x29\xd9\xb2\x14\xde\x44\x36\xbe\x0f\xbd\xa1\x1b\xad\x43\xb8\xc0\x94\x39\x61\xe1\x13\xce\x4d\x14\x9d\xa1\x50\x33\x60\x1a\xc1\xf0\xbc\x10\x08\x71\xc6\xb4\x35\xa0\x52\xb0\x19\x42\x12\x84\x33\x65\xa7\x38\x37\xc0\x64\x42\xef\xb9\x86\xd4\xc9\xd8\x72\x25\xcd\x69\x74\xa5\x34\xe4\x4a\x23\x70\x99\x2a\x9d\x33\x7a\x0d\x6c\xac\x9c\x85\x31\x97\x09\x97\x13\x88\x9d\xb1\x2a\xaf\x61\x94\x26\x1e\x39\xe1\x72\x12\x55\x14\x41\xd4\x9c\x40\x21\x90\x19\x04\xed\x24\x3c\xfc\x06\x19\x8a\x02\xa6\x38\xaf\xbe\x3f\x44\xd1\x28\x08\x60\x8e\xf9\x18\x35\xd8\x8c\x59\x78\xc3\x84\x78\x03\x1e\x3e\x43\x8d\x5e\x27\x8d\xb4\x8a\x8d\x05\x1e\x44\x1f\x52\x98\x2b\x07\x89\x92\xff\xb1\x20\xf8\x14\x81\xdb\x13\xff\x2a\x66\xb2\xdc\x0e\xbd\x3a\x88\xa2\x43\x18\xa9\x19\x6a\x70\x06\x75\x14\x3d\x91\xa5\xa0\x7c\x9e\xe0\x02\x4d\xac\x79\xe1\x55\x54\x69\x6d\x05\xd8\xdd\xf3\x14\x3d\xbd\x0d\x0f\xfd\x7a\xbb\xf7\x87\x18\xe1\xdc\x6a\x71\x7c\x59\xea\xf8\xb5\x40\x09\x0c\x62\x95\xe7\xe4\xef\x42\xab\xbc\xb0\x90\x2a\x4d\x2e\x91\xde\x9d\xe5\x27\x03\x03\x83\x58\x3b\xa9\x7a\xfb\xe0\x65\x19\x08\x6e\x2c\x19\xe9\x91\x09\x9e\xd4\x5f\x8f\x4e\xbd\x8e\x70\xc7\xc6\xb5\x55\x3f\xc8\x25\xb6\x13\xe0\x16\x66\x5c\x08\x60\xce\xaa\x58\x51\x68\x5a\x04\x9e\x42\xa1\x8c\xe1\x63\x81\xa7\x2f\xb6\x6a\xa9\xe3\x59\xc9\x78\xe3\x48\x45\x93\xa1\x10\x35\xf5\xc0\x66\xdc\x94\xac\xb1\x50\x06\x21\xe7\xb1\x56\x30\xcb\xb8\x40\x0a\x14\x5d\x4b\xe2\x4f\x8c\x9d\x45\xaf\x4b\x3f\x63\x74\x08\xd7\xec\x91\x4f\x7c\x42\x2c\x06\xd2\x8a\xf0\x1e\x03\xab\x15\x50\x5d\xce\xdf\x73\x60\x0d\xb5\x56\x33\xd3\xad\xf3\x17\xf5\x88\xfe\x98\x89\x9d\x36\x14\x32\x5a\x39\x99\xec\x40\x65\xcf\x7c\x9b\xf1\xd4\x1e\xb3\x0e\xfe\xc0\x4c\x9e\x34\x28\x30\xb6\x60\xf1\xa7\xdd\x05\x6f\xc9\xfc\x5e\xe5\x48\x67\x1c\x05\xdc\x67\x4c\xad\xb7\x41\x9b\xd9\x2a\xaf\xf6\x18\x27\xbc\x4c\xa8\x70\xdc\xc6\x4e\x6b\x94\x74\x3c\x49\xdc\x8a\xf9\x52\x26\x15\xf1\x0d\x9f\x64\xbd\xcc\x48\x72\x3b\xe0\x6c\x98\x87\xc2\x2e\xaa\xda\x7c\x2d\x99\x83\x8f\x95\x44\x98\x29\x9d\x80\xc0\xf4\xf5\x26\x0f\xcc\x4b\xba\x6e\x60\xd6\x24\xbd\x0b\xe6\x11\x9b\xe0\x7d\xd1\xf9\x75\x81\xd9\x15\x9e\xbc\x60\x93\x6d\x2d\xdc\xc5\x7c\xa1\x66\x1d\xc7\xc3\x22\x73\x42\x32\x3b\xe3\xae\x0e\xd1\x76\x7c\xdf\x17\x95\xdd\x17\x99\xad\x02\x63\x99\xf6\x05\x20\x51\xb1\xcb\x29\xc6\x5e\xcd\xdc\x8a\x6f\x52\x3f\x50\xaf\x30\x87\xf0\x7e\x3d\x6f\xab\x70\x7c\xee\xfc\x0a\x1f\x5d\x5e\x10\x25\x2b\x13\x88\x4b\x9f\x54\x29\x95\x8c\x41\x59\xcb\xa8\xa4\xd8\x0c\x0e\x8f\xb6\x65\xfe\xde\xcd\x7c\x3e\x8f\x05\x9d\x21\x76\x86\x28\xc1\x14\x82\x5b\x53\xf1\x57\x49\x6d\xd9\x18\x06\xce\xf8\x1a\xfd\xe8\x45\x1e\xc8\x7e\x54\xb1\xc3\x2f\xab\x20\xd6\xc8\x2c\x52\x39\xa4\x57\x47\xa1\x74\xdd\xb1\xb1\x69\x17\xad\x75\x25\xaa\xdd\xb3\xf4\x17\x94\x96\x4a\x77\xad\x3e\x43\xe2\xcc\xef\x73\x49\xf5\xa1\xb0\xc7\x27\x9e\x77\xa4\xf1\x91\x2b\x67\x96\xa5\x1a\xb9\x53\x2f\x77\x4d\x87\xf8\x8a\x0c\x54\xb5\xf8\x8a\xcb\x84\x38\xb5\xaf\xc7\x66\xfb\xce\x6e\xeb\x0e\xad\xd1\xff\xaa\xe4\xf4\x5b\x1a\xa8\x02\xa5\x09\x8d\x4f\x5f\x90\xd4\x2b\xaf\x5b\x2b\x25\x29\xcc\xa5\xb1\x4c\xc6\x48\x9b\xae\xdc\x6e\x90\xe9\x38\x5b\x5a\x39\x6a\xad\x2c\x2a\x93\xae\x5b\x1d\xac\x26\x70\x27\x56\xeb\x7b\x76\xdc\xef\xb6\x35\xfe\x16\x12\xc5\x37\x73\x95\x76\x65\x6a\xfe\xed\x28\x5b\xca\x06\x8f\x53\x21\xe4\x06\xb8\xf1\xb9\x23\x98\x09\x52\xe4\x98\xa3\x05\x1b\x7e\x85\x76\x87\xbc\x98\xe5\xd4\xf4\xd2\x1b\xc9\x72\xdc\x98\xeb\x35\xe2\x6d\x89\x78\xcb\x1e\x97\xb6\xf8\xd2\xa7\x4c\x5a\x8a\x08\xd5\xe3\xad\xde\x95\xdb\xc5\xfe\x1a\x17\xbc\x34\x27\x86\xc2\xfa\x6e\xad\xa7\x8e\x97\x16\x2a\x3b\xb5\x67\x54\xf0\x36\x62\x4f\x4f\xb2\x82\xb8\xbe\x1b\xa9\xdb\xc9\x76\xe5\x5b\xc1\xaf\x11\xdb\xb5\xaf\xa7\xbd\xaa\x11\x5b\x15\x6d\xd5\x04\x6d\xc4\x50\xd3\x7a\xdb\xb5\x2a\xa2\x3c\x4a\x53\x95\xfb\xb4\x6e\xef\xb1\x27\xde\x16\x10\x5b\xe5\xb6\x1f\x31\xec\xb1\x37\x7e\xeb\xa8\xff\xd1\x6f\x6b\x9f\xb1\xce\x86\xce\x1c\x93\xf5\xbd\x79\x8d\x78\xbe\x01\x51\x15\xf3\xe7\x41\xd6\x88\x7f\xac\x47\x1c\x31\x63\x9f\x97\xa5\x35\xe2\xa7\x0d\x7b\x74\xf6\x99\xdd\x78\x8d\x78\xb1\x1e\xf1\xc2\x15\x82\xc7\x54\xdc\x37\xe1\xd6\x88\x7f\xad\x47\xbc\x97\x89\x5a\x27\xd1\x81\xf8\xe7\x7a\xc4\x1b\x7c\x09\xe2\x50\xf4\xc7\x76\x85\x58\x35\x83\x8d\xc2\x4a\x37\xbe\xa7\x17\x86\x5a\xf2\x06\xb1\x37\xb6\xd7\x20\xa6\xcb\x88\xbe\xd5\xae\x10\xcf\x58\x3c\x35\x05\x8b\x3d\xf5\x50\x58\x6f\x88\xf7\x2d\xc4\x0b\xf4\x03\x8d\x67\x9e\x3d\x7e\xf9\x70\xad\x6d\xaa\x2c\x64\x42\x6c\xb6\x63\x74\x08\x5f\x58\xac\xd5\x1e\xca\x79\xc7\xf6\xdb\xa5\x79\xeb\xba\xbe\xbe\x80\x78\x03\xdd\x97\x3a\xdc\xa9\xc9\x44\x20\xe4\xa4\x20\x68\x8c\x95\xf6\x23\xc8\x41\xa1\xd1\x98\x4a\xb2\x3e\xfe\x1a\x81\x72\xfa\x44\x32\x6c\xc2\xa8\x8f\x26\x11\x55\x1c\xb5\x5c\xf0\x11\xea\xe1\x91\x60\x16\x4d\xb5\x1c\x93\x40\xb7\xbd\x95\xc8\x25\x4e\x58\xee\x67\xb0\xfe\x22\xd3\x53\xbd\xf7\x3d\x83\xec\xa8\xf0\xfb\x9f\x43\xd6\x9d\xfc\xf5\x92\xae\xe7\xe5\xdd\x84\xee\x08\xf9\xa2\x79\x20\xd5\x2a\x0f\x49\x48\xda\x0f\xfc\xe0\x2e\xcc\x73\xaa\x5c\xf5\xf9\xc5\x53\x90\xaa\xd5\xdd\x86\x15\x47\xcd\xfd\x61\xb4\xc4\x7a\x83\x39\x65\x7c\xf0\xf1\x32\xf1\x0e\x2c\xec\x59\xcf\xbb\x59\x29\x83\x97\x28\x0d\x0c\x62\xea\xd2\xc5\x4b\xef\x90\x1d\xac\x3f\x96\x58\x6f\xa7\xbc\x58\x51\xb1\x31\xeb\x2b\x9f\x2a\x75\xde\x7e\x51\xce\xe0\xe7\x70\xd2\x3d\xc1\x48\xd0\xe1\xc8\x56\x88\x99\x05\x26\xe7\x20\x54\xcc\x5e\x41\xef\xd3\xe9\xab\xcd\xfe\xad\xf9\xfd\xfe\x67\xf6\x6d\x5b\x1e\xff\x0e\xcd\x2d\xc4\x4f\xde\xb7\xba\x30\xf4\xeb\x02\x4d\xb9\x7a\x82\xa6\x94\x0d\x94\xa0\xd6\x49\xe7\x5c\x32\x41\x05\x0f\xa4\xb2\x60\x5c\x51\x28\x6d\xcb\x81\x66\x2d\x3b\xc5\xb9\x3f\x50\x9d\xc1\x0a\x8d\xae\x9a\xc8\x92\xa3\x45\x96\x1b\x68\x1f\xda\xfe\xfe\x45\xf5\x55\x3a\xff\xcf\x8e\x76\x02\x5f\x91\x70\x3e\x0e\x2e\x73\x16\x1b\x30\x76\x2e\x10\x58\xfc\xc2\x5b\x6c\xe3\x59\x58\xeb\xd9\x26\xbf\xae\x02\xa6\x9f\x46\xf8\xf3\xa7\xcb\xc2\x24\x79\x16\x24\xeb\xf9\xc6\x8a\x74\x25\x39\x0c\x92\xd5\x08\xb7\xee\xdc\xeb\x76\xae\x92\xbc\x5c\x92\x0c\x1d\x79\xab\xed\x2b\x6f\xf5\x95\x86\x53\x9c\x9b\xd3\x28\xfa\xce\xb4\xe4\x72\x72\x00\x77\x19\x36\xea\xfb\x3f\xd3\x72\x36\xf7\x7e\x9e\x29\x3d\x05\x2e\xfd\xf1\x54\x07\xc1\x01\x34\xa6\x7c\x8e\x19\x37\x9b\xf0\xea\x1d\x2c\x05\x77\x97\xf9\xae\xfe\x07\xcd\xb5\xb9\xc7\xf5\x4f\x70\xf5\x7f\x68\x46\x1e\xfd\x52\xbf\x94\x52\xdf\x1c\xef\x69\xc3\xbc\xd4\xaf\xcf\xc2\x7a\xf7\xdf\x8d\x58\xff\x04\x00\x00\xff\xff\xba\xa6\x09\x41\x83\x1d\x00\x00") func runtimeHelpDefaultkeysMdBytes() ([]byte, error) { return bindataRead( @@ -967,7 +967,7 @@ func runtimeHelpHelpMd() (*asset, error) { return a, nil } -var _runtimeHelpKeybindingsMd = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x58\xdd\x72\x1b\xb7\x92\xbe\xde\x7e\x8a\xae\xf1\xc5\x26\xb5\x34\x6d\xfe\x49\xb6\x2b\xe5\x2a\x5b\x16\x22\xc7\xb1\xad\x58\x52\x1c\xe7\x8a\x20\x07\x14\xb1\x02\x81\xc9\x00\x23\x9a\xd9\xda\xf3\xec\xa7\xba\x31\x33\x04\x48\xe9\xc4\x55\x6e\x61\xd0\x1f\x1a\x8d\x46\xff\x11\x4f\xf0\x83\xda\x2d\xb4\x2d\xb5\xbd\xf5\x00\x1f\xf5\xb2\x76\xb8\x96\x1e\x25\x56\x46\x85\xb5\xab\x25\xba\x15\xae\x5d\xb8\x53\x3b\x8f\x61\x2d\x03\x6e\xe4\x9d\x42\x1d\x50\x49\xbf\x43\x69\x4b\xac\xdc\x56\xd5\xab\xc6\x60\x70\xd8\x78\xc5\x73\xd2\x18\xe8\x56\xc9\x5a\xe1\xaa\x31\x66\x87\xcb\xc6\x07\xb7\xd1\x7f\xcb\x85\x51\x84\xde\xb9\xa6\x46\xa3\xef\xb4\xbd\x1d\xc2\x19\x33\xf1\x6e\xaf\x10\xaf\xf4\xc1\xd5\xaa\x44\x6d\x83\xaa\xad\x24\x29\xda\xe2\x86\x15\xd5\x2b\x5c\xae\xa5\xbd\x55\x25\x6e\x75\x58\x63\x58\x2b\x9c\xbf\xa6\xd5\x73\x5c\xba\xcd\x86\x14\x71\x35\xec\x5c\x83\x4b\x69\x51\x1a\xef\x70\xa1\x50\x96\x25\x0b\x64\xfc\x4a\x1b\x85\xf3\x7f\x3d\x1b\x2e\x9d\x5d\xe9\xdb\x67\x2c\xf9\x59\xa7\xc1\xf0\x7f\xbd\xb3\x73\x94\x1e\x4b\xed\x97\x8d\xf7\xaa\xc4\x85\x32\x6e\x3b\x04\xe1\x6a\x94\x68\xb4\x0f\x64\x21\x12\x55\xaa\x95\x6c\x4c\xc8\x4e\xd0\xee\x42\x62\x70\xe5\xea\x8d\x0c\x64\xa2\x12\x17\xbb\x78\x86\x01\xd9\x59\x7a\x85\x5e\x29\x20\xa4\x22\x9d\x49\x9e\xf6\xac\xdb\x10\xe3\x46\x1b\x57\x2b\x5a\x5a\x3f\x5d\xd5\x5a\xd9\xd2\xec\xe2\xde\x7c\x70\xf5\xbd\x32\xd2\xca\xa0\x9d\xf5\xb4\x7a\x4b\xf7\x94\xa8\x94\x5d\x05\x59\xa5\x03\xec\xb0\xcc\x54\xc0\xf9\xeb\xb5\x32\x55\xb7\x8e\xd6\xcc\x01\xde\xaf\xfe\xd1\x42\xa5\x53\x1e\xad\x0b\xa8\xbe\x6b\x1f\x06\xd8\xd9\xdc\xeb\x4d\x45\x17\x5f\x2b\x19\xc8\x6b\x86\xad\x8f\x6d\xb5\x31\x78\x67\xdd\xb6\x55\xc5\x61\xe9\xe2\x59\x08\x03\xdf\xda\xe5\xe4\x4e\x74\x0e\x19\xcd\xea\xf1\x7f\x50\xd6\xb5\xdb\x7a\x5a\xb1\x71\xf7\x0a\xb7\xae\x66\x6b\xd2\xdf\x21\x9c\x85\xda\xa0\x51\xab\xc0\xa7\xac\xf5\xed\x3a\x44\x18\x09\x59\x36\xb5\x77\x35\xad\xa4\x2f\x1f\x64\x1d\x61\xbd\xc9\x15\x1a\x6d\xd5\x80\x26\x61\x49\x92\x9a\x8a\x01\xa5\xdb\xda\x63\x31\x8f\xc9\x58\x34\xab\x95\xaa\x93\x43\xac\x9d\x29\xd1\xaf\xf5\xaa\xbd\x2d\x69\x4c\x8b\xf5\x8a\xc5\x6e\x94\x0d\x28\x97\xf1\xfa\x82\x43\xaf\x8c\x5a\x06\xdc\xae\xc9\x37\x37\xee\x9e\xc3\x03\x9e\xe0\x17\xd5\x5a\x9d\x6d\x01\x70\x4d\xbb\x75\x9e\xb6\x91\x3b\x72\xee\x5a\x2d\x5c\x63\x4b\x6c\x3c\xe1\x38\x22\xfe\xf3\xd5\x41\xf4\xb2\x73\xb9\x5c\x93\x58\xd4\x1e\xa3\x84\xe0\x90\x82\x86\xd5\x1a\x02\xfb\xbb\xfa\x2e\x37\x95\x51\x03\xe2\x91\x14\x9c\x93\xc1\x9f\xee\xe6\x1c\xfa\xb6\x74\x6c\x8b\x38\xf9\x37\x4f\xd6\x8a\x1c\x8c\xbd\xc1\x35\xa6\xc4\xaa\x61\xbf\x83\x95\x33\xc6\x6d\x49\xc5\x36\x42\xe6\x07\x0e\xc5\x5a\x01\xcc\xe7\x73\xfa\x86\xff\x83\xff\x2a\x48\xec\xb7\xe2\x15\x16\x37\xb6\x74\xc5\xa0\x9d\xf9\x93\x66\xbe\xa8\xd2\x15\xf0\xff\x04\x07\x78\x6f\x29\xc4\x35\xe9\x4d\x2a\x28\x1a\xda\xdb\x98\x6c\xfe\xc1\x18\x7b\xc7\xad\x1b\x0b\x31\x97\xe0\x4f\x77\x6a\xb7\x74\x9b\x85\x7b\x8d\x3f\x45\x73\xbc\x9e\x63\x1e\xfe\x84\xe3\xa4\xd6\xde\xe2\x80\x83\xa9\xcd\x14\xbd\x23\x70\x02\x5a\xae\xa5\xb6\x5d\x7a\xf2\xb8\x5d\x2b\x4b\x97\x16\xd5\x88\xd1\xde\x9b\x59\xaf\x58\x9f\xad\xb4\x01\xdf\x98\xf0\x34\x7a\x87\xbc\x57\x40\x76\xfe\xab\xd1\xa1\xd7\x97\x35\xd5\x81\xb2\xa9\x42\xef\x5e\xa5\xa6\x43\x44\x2c\x78\x3d\xd9\xea\x4a\xde\xab\xc1\x6f\x8d\x0e\xbd\xc1\x9e\xe0\x8d\xcd\x3d\xeb\x7d\x20\x3f\x60\x7d\x2b\xe7\xbd\x6e\xf3\x75\xa9\x7d\x3c\xa5\xdd\x3d\x90\xf4\xf6\xbe\xb8\xd8\x71\xe4\xb6\x10\x98\x47\xf1\x1f\xd4\x6e\xde\x1a\xa8\xbb\x75\x4a\x68\xff\xed\x1f\xbb\xfc\x27\xf8\xf6\xc0\xae\xec\x5f\xbd\xb1\xf7\x51\xd0\xdd\xc3\x43\x29\x78\xe9\x6c\x90\xda\x7a\xdc\xb8\x7d\xae\xee\x4f\x95\x0a\x66\x79\xdb\xb5\x5e\xae\x7b\xb3\x36\x5e\x0d\x70\xd1\x04\xce\x6d\xfb\xc0\xdd\x0c\xf1\x42\xd5\x8a\x8d\xc4\xb5\x6d\xef\x09\x2e\xac\x29\x5a\xd2\xb9\xc3\xcd\xe2\xe5\xc0\x19\x27\x92\x9b\xaa\x1d\xbc\x73\x5b\xdb\x0e\x2f\xe5\xad\xea\xe7\xe9\x23\xe1\xfd\xaa\x56\xa1\x1d\x7e\xa1\xfc\xd6\x8e\xaf\x28\x15\xb5\xe3\x73\x5b\xc2\x15\xe7\x90\x6b\x17\xe7\xbb\xaf\x3d\xe7\xa6\x6a\x07\x2c\x3a\x0e\x59\x74\x1c\x46\xd1\x5f\x5d\x5d\xee\x47\x09\x7b\xcf\xd8\x7f\x33\xfb\xa3\xbb\x57\xbf\x6a\xab\xfc\x4d\xb5\x1f\xf3\x16\xef\x94\x51\x41\xed\x17\xee\xbf\x13\xb9\xad\xbe\x9f\x57\xb4\x2e\xd5\xba\x9d\x79\x6f\xbd\xaa\xc3\x27\xb5\x35\xfb\xaf\xab\x4a\x2e\x15\xbc\x95\xcb\x3b\xcf\xa3\x28\x18\xce\x14\x75\x0c\x2d\xe6\x5a\x2e\x80\xfc\x9e\xc9\x1b\x63\xe2\x5f\x0f\x42\xdb\x92\xc9\x27\xf5\x3d\xf0\xe0\xb2\x56\xf7\xda\x35\x1e\x28\xc9\x00\xe5\x15\x38\x73\xd5\x0e\xce\x1a\xb2\x6e\x60\x2d\xde\x35\x95\xd1\x4b\x19\x54\xfc\xe2\xfd\x5a\xf5\x4a\x65\x43\x54\x5b\x3b\x0b\x9f\x9b\x90\x4f\x5c\x4a\x1f\xba\x73\x91\x1a\x9f\x2b\x65\x85\x36\x0a\xe2\x35\xd1\xf5\xb4\x77\xdf\xdf\xfa\x85\x34\xab\x76\xae\x1b\xc6\x2b\x4b\x0c\xb5\x37\xd0\xb5\xbb\xbd\x35\xea\x42\x99\xaa\x1d\x7e\x69\x8c\xaa\xe1\x97\x66\x53\x31\xff\xcc\x28\x49\xbe\x12\x1a\x0f\x57\x6b\x65\xcc\x47\x57\x2a\x38\x8b\xd9\x88\xc7\x94\x19\x98\x90\x7e\x6f\xca\x92\x4c\xd7\x19\x85\xc6\x64\xa9\xee\xef\x55\x65\x74\x80\x1b\xeb\xf9\xef\xef\xf1\xf3\x22\xfe\xe9\xd6\xc4\xaf\xa8\xcc\x47\xb9\xac\x1d\x5c\x1a\xb9\x8b\xa3\x3e\x2f\xc4\x3c\xd4\x85\x54\x48\x22\x9a\x62\xae\x8f\x1f\x6e\x01\xd2\x8c\xd7\x46\xd2\x4d\x05\x6c\x93\xe8\x59\xec\x4f\x37\x55\xfb\xa7\xf5\x36\xb7\xb5\x3c\x41\x83\x36\x6e\xa2\x83\x1c\xd9\xdb\x6d\xd8\xa0\xad\xe7\x74\xee\xc4\x26\x3d\xff\xae\x43\x34\x21\x9c\x49\xbb\x54\x06\x2e\x6b\x6d\x03\x5c\xca\xc6\x47\x17\x0c\x72\x01\x62\x04\x62\x0c\x62\x02\x62\x0a\x62\x06\xe2\x04\xc4\x29\x88\x17\x20\x5e\x82\x18\x3d\x07\x31\x1a\x81\x18\x8d\x41\x8c\x26\x20\x46\x53\x10\xa3\x19\x88\xd1\x09\x88\xd1\x29\x88\xd1\x0b\x10\xa3\x97\x20\xc6\xcf\x41\x8c\x49\xce\x18\xc4\x78\x02\x62\x3c\x05\x31\x9e\x81\x18\x9f\x80\x18\x9f\x82\x18\xbf\x00\x31\x7e\x09\x62\xf2\x1c\xc4\x64\x04\x62\x42\x1b\x4e\x40\x4c\xa6\x20\x26\x33\x10\x93\x13\x10\x93\x53\x10\x93\x17\x20\x26\x2f\x41\x4c\x9f\x83\x98\x8e\x40\x4c\xc7\x20\xa6\xa4\xd9\x14\xc4\x74\x06\x62\x7a\x02\x62\x7a\x0a\x62\xfa\x02\xc4\xf4\x25\x88\xd9\x73\x10\xb3\x11\x88\xd9\x18\xc4\x6c\x02\x62\x46\x47\x98\x81\x98\x9d\x80\x98\x9d\x82\x98\xbd\x00\x31\x7b\x09\xe2\xe4\x39\x88\x93\x11\x88\x93\x31\x88\x93\x09\x88\x93\x29\xf7\x5e\x31\x16\x69\xf4\x86\xe9\x5b\xa6\x67\x4c\xdf\x31\x3d\x67\x2a\x98\xfe\xcc\xf4\x82\xe9\x7b\xa6\xbf\x30\xfd\xc0\xf4\x57\xa6\x1f\x99\x7e\x62\xfa\x99\xe9\x25\xd3\xdf\x98\x7e\x89\xbb\x32\xbd\x66\x7a\xc3\xf4\x77\xa6\x5f\x99\xfe\xc1\xf4\x1b\xd3\x3f\xa3\x64\xb5\x0a\x57\x7f\x45\x05\x29\x6d\x18\xe9\xd7\x51\x1c\x39\x46\xcb\x39\x93\xb5\x0c\x51\xa4\x2d\x55\xed\x97\xae\x4e\xb3\x0c\x85\xc0\xb9\x5f\xd2\x7f\x59\x91\xc3\x90\x2f\xb5\xd5\xf4\xdd\x51\x15\xc2\xd8\x73\x34\xb5\x6c\xbb\xa9\x83\xe2\x7c\x53\x15\xaf\x30\xfd\x57\x74\xc5\xa1\x18\x44\x04\xf9\x66\x86\x29\xf6\x55\xa3\xc3\xb0\xfa\x29\xa8\x48\xea\x44\x07\xa2\xc3\x3f\x24\x88\xe7\x5b\xcc\x15\x35\xab\xa9\x4e\x45\x57\x34\x32\x44\xaa\x53\xb1\xaf\x26\x19\x26\xdd\xae\xd8\x97\x99\x0c\x93\xea\x5d\x24\xf5\xa7\x03\xbd\x31\x21\xd7\xba\xe8\xca\x46\x82\xc8\x0f\x5f\xf4\x85\x26\x81\xe4\x9b\x15\x07\xa5\xec\x10\xd8\x6f\x59\xe4\x35\x2e\xc1\xe5\xd7\x56\x24\xc5\x2f\x01\xe5\x37\x57\x64\x55\xb1\x83\x75\x5e\xb9\xd7\x3f\x49\xef\x29\x28\x3b\x65\xd1\xe7\xfd\x14\x92\x29\x5f\x3c\x50\x57\x33\xdb\x53\xba\x3b\xb8\x9f\x07\xc1\xbd\xe4\x4e\x83\xe2\xa8\x3a\x67\x72\xcf\x6d\x99\x1c\xe6\x31\x28\x87\x57\x6a\xc4\x22\xe9\x66\x52\x50\x66\xc4\xa2\x6f\x73\x8e\xb4\xeb\x84\xe5\x47\x39\x82\x75\xe2\x52\xcd\x3a\x10\x87\x72\x76\xaf\x59\xd7\xd1\x9f\x92\xd2\xc0\x03\xb0\x38\x9f\x6c\x78\x91\x81\xfa\x0c\xd2\x41\xf6\x13\xaf\x1e\x83\x50\xeb\x9e\x49\x2a\xf2\xe6\x29\xc5\x65\xe2\x1e\xc1\x5d\xcb\x45\x9e\x6e\x8a\x83\xc6\x65\xd0\x77\x4d\xa9\x96\x21\x5d\x56\x1c\xf6\x36\xe9\x91\x3f\x67\x47\xee\x9a\x9c\xec\x16\x32\x04\x75\x63\x29\x57\x64\x5c\x6a\xcb\x52\xee\xa7\x23\x2e\xf5\x22\x29\xe2\xf2\x08\xd1\x75\x23\x29\xea\xcf\x0c\xd5\xfe\xa8\xec\xb9\xdf\x32\x2e\xff\xc0\x4c\xb8\x67\x79\x9a\x75\xd5\x2e\xe5\xfe\x71\x90\x84\x33\xe5\x3e\x1c\x32\x0f\x03\xe2\x5d\x06\xc8\x9a\xcd\x14\xf6\x7b\x06\xe3\xce\x32\x65\xbf\xc9\x2d\xdc\xb5\x9c\x29\xe4\x3a\x83\xc4\x5e\x2f\xf1\xa5\x41\x5e\x26\x92\x26\x30\x01\x0d\x73\x50\xdb\x1d\x76\x80\x34\xbb\xb4\x8a\x1c\xa7\x96\x34\x55\x20\x3e\x9a\xd7\x32\x59\x8f\xe5\x89\x4c\xd6\x71\x9e\x88\xcd\xde\x71\xbe\x69\xe7\x13\xd4\x43\x09\xa7\x9f\x4f\x36\xfc\x39\xb3\xe1\xbe\xfd\xce\x92\xf6\x03\x18\xee\xcb\xb3\xf4\x9f\x81\xba\x86\xbd\x2f\xff\x1c\xc8\xa9\xe2\xed\x4c\x22\xe1\x6d\x7e\xe3\x5d\x77\x9f\x42\x7e\xcb\x20\xfc\x08\x90\x1a\xef\xc0\xa9\xfb\x1f\x05\x29\xe8\x6b\x06\xea\x7f\x05\x64\x19\xfd\x81\xf3\x72\xc3\x9f\x82\x7e\xc9\xdd\xb7\xfb\x4d\x50\x0c\x80\x31\xcf\x9e\xe1\xf9\x46\x2e\xfd\x53\x1f\x76\xb1\xf3\xef\x9f\xa9\xb1\xcb\x75\x2b\x2a\x43\x0f\xd5\xef\xa7\x8b\x8e\x73\x98\x1e\x25\x57\xae\x63\x1f\x24\x1e\x99\xf7\xd8\xf5\x88\x43\x1e\x73\xd4\x91\x11\xc3\xee\x19\xad\x63\x74\xca\xbf\xb7\x41\xdd\xc6\x76\x2f\xbe\xfa\xf1\x43\xf3\x46\x5a\x79\xab\xea\xf6\x0c\x62\xc4\x49\xfa\xd8\x69\xc4\x38\x16\xa7\x24\x2d\x8a\x09\x4f\xa5\xb9\x50\x4c\x79\x2a\xbd\x45\x71\x7a\x8c\x1a\x3d\x27\x25\x53\xd4\xb9\x5f\xf2\x51\xb9\x75\x2d\x06\xfd\x33\x90\xd0\x56\x1a\xb4\x2e\x28\x0f\x9f\x5c\x50\xaf\xf0\xb3\x45\xef\x36\x0a\x9d\x29\x31\xa8\x7a\xc3\x00\xb5\x69\x8c\x0c\xae\x8e\x8f\x26\xce\xe2\x57\x6d\x4b\xb7\xf5\xb8\x91\xcb\x35\x75\x36\x83\xf8\x04\x78\x31\x47\xbf\xe6\x57\xbf\x05\xbf\xf4\x94\xb0\x72\x35\x2e\xba\x02\x35\x04\xfa\x79\xc9\xcf\x74\xd2\x98\xdd\x60\xff\xc8\xcb\xbf\xee\x54\xfb\x0c\xc9\x6f\x49\xd4\x42\xcf\xc9\xe0\x77\x6a\x37\xcf\x1e\xc9\xe2\xb4\x9c\x83\xab\xe3\xf0\xa6\x9a\x0f\x31\x3e\x32\xfb\xa6\xaa\x5c\x1d\x48\x4f\x74\x55\xdc\x08\xe7\x4f\xe7\xb8\x50\x61\xab\x94\xc5\x8d\x2b\xf5\x4a\xab\xda\xc7\x67\x33\x5a\x3f\xdf\x3f\x61\xce\xc1\xbb\x4e\x7c\xfb\x7c\xc9\x0f\xac\xdb\x5a\x87\xa0\x2c\x4a\xcf\x5c\x39\xc7\x1f\x96\xd2\xd3\xe5\x86\x40\xb2\xe8\x94\x74\x96\xce\x61\x7f\x1c\xe2\xf5\x5a\x7b\xd4\x1e\xb6\xeb\x5d\xf7\xf4\xf5\xd0\x53\x55\xff\x6a\xae\xa2\x32\x7d\x2b\x37\x47\x6d\x7d\x50\x92\x1f\x99\x59\xa5\x84\x05\x3f\xf0\x4b\xbe\xac\x15\xaa\xbf\x1a\x7d\x2f\x8d\xb2\xe1\xc7\x21\xfc\x3b\x00\x00\xff\xff\xa0\x95\xdb\x80\xdd\x19\x00\x00") +var _runtimeHelpKeybindingsMd = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\x59\x6d\x73\x1b\x29\xf2\x7f\xfd\xef\x4f\x41\x4d\x5e\xfc\x37\x75\xb2\x62\x3d\xd9\x49\x6a\x2b\x55\x8e\x63\xd6\xd9\xc4\x89\xd7\x0f\x9b\xcd\xbe\x12\x9a\x41\x16\x67\x04\xb3\x03\x63\x59\x7b\x75\xf7\xd9\xaf\xba\x99\x07\x90\xec\x4b\xaa\x82\x19\xf8\xd1\x34\x4d\xf7\x8f\x06\xbd\x60\x9f\xe4\x76\xa1\x4c\xa1\xcc\x9d\x03\xb8\x50\x79\x65\xd9\x4a\x38\x26\x58\xa9\xa5\x5f\xd9\x4a\x30\xbb\x64\x2b\xeb\xef\xe5\xd6\x31\xbf\x12\x9e\xad\xc5\xbd\x64\xca\x33\x29\xdc\x96\x09\x53\xb0\xd2\x6e\x64\xb5\xac\x35\xf3\x96\xd5\x4e\x52\x9b\xd0\x1a\xda\x51\xa2\x92\x6c\x59\x6b\xbd\x65\x79\xed\xbc\x5d\xab\xbf\xc5\x42\x4b\x44\x6f\x6d\x5d\x31\xad\xee\x95\xb9\x1b\xc2\x29\x75\xb2\xfb\x5e\x21\x1a\xe9\xbc\xad\x64\xc1\x94\xf1\xb2\x32\x02\xa5\x28\xc3\xd6\xa4\xa8\x5a\xb2\x7c\x25\xcc\x9d\x2c\xd8\x46\xf9\x15\xf3\x2b\xc9\xe6\xef\x70\xf4\x9c\xe5\x76\xbd\x46\x45\x6c\x05\x5b\x5b\xb3\x5c\x18\x26\xb4\xb3\x6c\x21\x99\x28\x0a\x12\x48\xf8\xa5\xd2\x92\xcd\xff\xf3\x6a\x98\x5b\xb3\x54\x77\xaf\x48\xf2\xab\x56\x83\xe1\x3f\x9d\x35\x73\x26\x1c\x2b\x94\xcb\x6b\xe7\x64\xc1\x16\x52\xdb\xcd\x10\xb8\xad\x98\x60\x5a\x39\x8f\x16\x42\x51\x85\x5c\x8a\x5a\xfb\x64\x05\xcd\x2c\x28\x86\x2d\x6d\xb5\x16\x1e\x4d\x54\xb0\xc5\x36\xac\x61\x80\x76\x16\x4e\x32\x27\x25\x20\x52\xa2\xce\x28\x4f\x39\xd2\x6d\xc8\xc2\x44\x6b\x5b\x49\x1c\x5a\x1d\x2c\x2b\x25\x4d\xa1\xb7\x61\x6e\x5a\xb8\x7c\x2c\xb5\x30\xc2\x2b\x6b\x1c\x8e\xde\xe0\x3e\x45\x2a\x25\x5b\x81\x56\x69\x01\x5b\x56\x24\x2a\xb0\xf9\xbb\x95\xd4\x65\x3b\x0e\xc7\xcc\x01\x3e\x2e\x7f\x68\xa1\xc2\x4a\xc7\x8c\xf5\x4c\x3e\x2a\xe7\x07\xac\xb5\xb9\x53\xeb\x12\x37\xbe\x92\xc2\xa3\xd7\x0c\x1b\x1f\xdb\x28\xad\xd9\xbd\xb1\x9b\x46\x15\xcb\x0a\x1b\xd6\x82\x18\xf8\xde\x0c\x47\x77\xc2\x75\x88\x60\x56\xc7\xfe\xc1\x44\x55\xd9\x8d\xc3\x11\x6b\xfb\x20\xd9\xc6\x56\x64\x4d\xfc\x3b\x84\x53\x5f\x69\xa6\xe5\xd2\xd3\x2a\x2b\x75\xb7\xf2\x01\x86\x42\xf2\xba\x72\xb6\xc2\x91\xf8\xe5\xbc\xa8\x02\xac\x33\xb9\x64\x5a\x19\x39\xc0\x46\xc8\x51\x52\x5d\x12\xa0\xb0\x1b\xb3\x2f\xe6\x39\x19\x8b\x7a\xb9\x94\x55\xb4\x88\x95\xd5\x05\x73\x2b\xb5\x6c\x76\x4b\x68\xdd\x60\x9d\x24\xb1\x6b\x69\x3c\x13\x79\xd8\x3e\x6f\x99\x93\x5a\xe6\x9e\x6d\x56\xe8\x9b\x6b\xfb\x40\xe1\x01\x2f\xd8\x95\x6c\xac\x4e\xb6\x00\xb8\xc1\xd9\x5a\x4f\x5b\x8b\x2d\x3a\x77\x25\x17\xb6\x36\x05\xab\x1d\xe2\x28\x22\xfe\xf7\xd6\x41\xf0\xb2\x33\x91\xaf\x50\x2c\x53\x8e\x05\x09\xde\x32\x0c\x1a\x52\x6b\x08\xe4\xef\xf2\x51\xac\x4b\x2d\x07\xd8\x87\x52\xd8\x1c\x0d\x7e\xb0\x9d\x53\xe8\x9b\xc2\x92\x2d\x42\xe3\xdf\xd4\x58\x49\x74\x30\xf2\x06\x5b\xeb\x82\x95\x35\xf9\x1d\x2c\xad\xd6\x76\x83\x2a\x36\x11\x32\xdf\x71\x28\xd2\x0a\x60\x3e\x9f\xe3\x37\xfc\x0b\xfe\x2f\x43\xb1\xdf\xb3\xb7\x2c\xbb\x35\x85\xcd\x06\x4d\xcb\x9f\xd8\x72\x25\x0b\x9b\xc1\xbf\x11\x0e\xf0\xd1\x60\x88\x2b\xd4\x1b\x55\x90\x58\x35\x77\x81\x6c\x7e\x60\x8c\xde\x71\xab\xda\x40\xe0\x12\xf6\xf3\xbd\xdc\xe6\x76\xbd\xb0\xef\xd8\xcf\xc1\x1c\xef\xe6\x2c\x0d\x7f\xc4\x11\xa9\x35\xbb\x38\xa0\x60\x6a\x98\xa2\x73\x04\x22\xa0\x7c\x25\x94\x69\xe9\xc9\xb1\xcd\x4a\x1a\xdc\xb4\xa0\x46\x88\xf6\xce\xcc\x6a\x49\xfa\x6c\x84\xf1\xec\x44\xfb\x83\xe0\x1d\xe2\x41\x02\xda\xf9\xaf\x5a\xf9\x4e\x5f\xd2\x54\x79\x64\x53\xc9\x9c\x7d\x1b\x9b\x8e\x31\xc6\x32\x1a\x8f\xb6\xba\x16\x0f\x72\xf0\x5b\xad\x7c\x67\xb0\x17\xec\xd6\xa4\x9e\xf5\xd1\xa3\x1f\x90\xbe\xa5\x75\x4e\x35\x7c\x5d\x28\x17\x56\x69\xb6\x4f\x90\x5e\xef\x8b\x8b\x2d\x45\x6e\x03\x81\x79\x10\xff\x49\x6e\xe7\x8d\x81\xda\x5d\x47\x42\xfb\x7f\xf7\xdc\xe6\xbf\x60\xef\x77\xec\x4a\xfe\xd5\x19\xbb\x8f\x82\x76\x1f\x9e\xa2\xe0\xdc\x1a\x2f\x94\x71\x6c\x6d\x7b\xae\xee\x56\x15\x0b\x26\x79\x9b\x95\xca\x57\x9d\x59\x6b\x27\x07\x6c\x51\x7b\xe2\xb6\x3e\x70\xd7\x43\x76\x2e\x2b\x49\x46\xa2\xb3\xad\xf7\x04\xeb\x57\x18\x2d\x71\xdb\xee\x64\x61\x73\xe0\x94\x88\xe4\xb6\x6c\x2a\x1f\xec\xc6\x34\xd5\x4b\x71\x27\xbb\x76\xfc\x88\xfa\x3e\xcb\xa5\x6f\xaa\x57\xc8\x6f\x4d\xfd\x1a\xa9\xa8\xa9\x9f\x99\x02\xae\x89\x43\x6e\x6c\x68\x6f\xbf\xfa\x9e\xdb\xb2\xa9\x90\xe8\x50\x25\xd1\xa1\x1a\x44\x7f\xb3\x55\xd1\xd7\xa2\xee\xbe\xa3\xff\xa6\xee\x0b\xfb\x20\x3f\x2b\x23\xdd\x6d\xd9\xd7\x69\x8a\x0f\x52\x4b\x2f\xfb\x81\xfd\x77\x24\xb7\xd1\xf7\xeb\x12\xc7\xc5\x5a\x37\x2d\x1f\x8d\x93\x95\xff\x22\x37\xba\xff\xba\x2e\x45\x2e\xe1\xbd\xc8\xef\x1d\xd5\x82\x60\x38\x95\x98\x31\x34\x98\x1b\xb1\x00\xf4\x7b\x2a\x4e\xb4\x0e\x7f\x1d\x70\x65\x0a\x2a\xbe\xc8\x47\x4f\x95\xcb\x4a\x3e\x28\x5b\x3b\x40\x92\x01\xe4\x15\x38\xb5\xe5\x16\x4e\x6b\xb4\xae\x27\x2d\x3e\xd4\xa5\x56\xb9\xf0\x32\x7c\xd1\x7c\x8d\x7a\x85\x34\x3e\xa8\xad\xac\x81\xaf\xb5\x4f\x1b\x2e\x85\xf3\xed\xba\x50\x8d\xaf\xa5\x34\x5c\x69\x09\x61\x9b\x70\x7b\x9a\xbd\xef\x76\xfd\x5c\xe8\x65\xd3\xd6\x56\xc3\x96\x45\x86\xea\x0d\x74\x63\xef\xee\xb4\x3c\x97\xba\x6c\xaa\x57\xb5\x96\x15\xfc\x5a\xaf\x4b\xea\x3f\xd5\x52\xa0\xaf\xf8\xda\xc1\xf5\x4a\x6a\x7d\x61\x0b\x09\xa7\x81\x8d\xa8\x8e\xcc\x40\x05\xea\x77\x52\x14\x68\xba\xd6\x28\x58\x47\x4b\xb5\x7f\xaf\x4b\xad\x3c\xdc\x1a\x47\x7f\x7f\x0f\x9f\xe7\xe1\x4f\x3b\x26\x7c\x05\x65\x2e\x44\x5e\x59\xb8\xd4\x62\x1b\x6a\xd7\xb5\x2b\xf1\xe4\xfc\xe9\xb3\x32\xf5\x23\xb3\x46\x6f\x5f\xc2\x75\x5e\x59\xad\xd1\x3f\xa9\x12\x16\x5b\x8a\x8d\xb9\xa8\xb5\x57\xc1\xc3\xe1\x4a\xe2\xc1\xb9\xdf\x72\xa2\x75\xd4\xe8\xe0\xfa\x5e\x95\x31\xaa\x63\xa2\xc0\x7c\x09\x33\x13\x85\x3a\xbb\xc6\x33\x97\xf2\xd8\x86\x1a\x7e\x6a\x4e\xea\xda\x79\x3c\x61\xbb\xd3\x31\xa0\x16\xb5\xf7\xd6\xb8\x97\x24\xf0\x02\x9b\x2e\x2b\xe9\x5c\xa8\xc6\x53\xd3\x84\x2d\x6b\xf8\x88\xb4\x90\x56\x3a\x8a\xa0\x2c\x27\x26\xf5\x86\x2c\x6e\x4b\x20\x4b\x84\xe0\xa1\x90\xb9\x2d\x9b\x3f\x4d\x40\xd9\x8d\xa1\x06\xac\x34\xd4\x10\x62\x60\xcf\xa5\xec\x9a\x7c\xa6\x09\x8e\x36\x62\xc8\x6b\xce\x1e\x95\x0f\x5e\x02\xa7\xc2\xe4\x52\xc3\x65\xa5\x8c\x87\x4b\x51\xbb\x10\x65\x5e\x2c\x80\x8f\x80\x8f\x81\x4f\x80\x4f\x81\xcf\x80\x1f\x01\x3f\x06\xfe\x1a\xf8\x1b\xe0\xa3\x43\xe0\xa3\x11\xf0\xd1\x18\xf8\x68\x02\x7c\x34\x05\x3e\x9a\x01\x1f\x1d\x01\x1f\x1d\x03\x1f\xbd\x06\x3e\x7a\x03\x7c\x7c\x08\x7c\x8c\x72\xc6\xc0\xc7\x13\xe0\xe3\x29\xf0\xf1\x0c\xf8\xf8\x08\xf8\xf8\x18\xf8\xf8\x35\xf0\xf1\x1b\xe0\x93\x43\xe0\x93\x11\xf0\x09\x4e\x38\x01\x3e\x99\x02\x9f\xcc\x80\x4f\x8e\x80\x4f\x8e\x81\x4f\x5e\x03\x9f\xbc\x01\x3e\x3d\x04\x3e\x1d\x01\x9f\x8e\x81\x4f\x51\xb3\x29\xf0\xe9\x0c\xf8\xf4\x08\xf8\xf4\x18\xf8\xf4\x35\xf0\xe9\x1b\xe0\xb3\x43\xe0\xb3\x11\xf0\xd9\x18\xf8\x6c\x02\x7c\x86\x4b\x98\x01\x9f\x1d\x01\x9f\x1d\x03\x9f\xbd\x06\x3e\x7b\x03\xfc\xe8\x10\xf8\xd1\x08\xf8\xd1\x18\xf8\xd1\x04\xf8\xd1\x94\xd2\xcb\x40\x37\x58\x3b\xa1\xf2\x3d\x95\xa7\x54\x7e\xa0\xf2\x8c\x4a\x4e\xe5\x2f\x54\x9e\x53\xf9\x91\xca\x5f\xa9\xfc\x44\xe5\x67\x2a\x2f\xa8\xfc\x42\xe5\x57\x2a\x2f\xa9\xfc\x8d\xca\xab\x30\x2b\x95\x37\x54\xde\x52\xf9\x3b\x95\xdf\xa8\xfc\x83\xca\xef\x54\xfe\x19\x24\xcb\xa5\xbf\xfe\x2b\x28\x88\xcc\xa8\x85\x5b\x05\x71\xe8\x18\x4d\xcf\xa9\xa8\x84\x0f\x22\x4d\x21\x2b\x97\xdb\x2a\x26\x52\x8c\xf2\x33\x97\xe3\x7f\x51\xa2\xc3\xa0\x2f\xfd\x38\x6c\x9a\x80\xa0\xb0\xd9\xb6\x69\x69\x17\x34\x06\x2f\x41\xba\x8b\x2d\x5b\xa5\xc1\xf6\x12\xfa\x38\x6a\x0e\x14\x0c\x23\x55\x14\x5a\x86\x7a\xf0\x6c\xaa\x7e\x5b\x49\xa9\xe9\xa0\x69\x3f\xc8\xbd\xfb\xcf\x5e\x02\x7d\x86\xa1\x4d\xca\xf3\x61\x2f\x55\x60\x21\x31\xac\x2b\xd1\xa4\xbc\x3b\x19\xd4\x6d\x99\xbd\x65\xf1\xbf\xac\x3d\xc1\xb3\x41\x40\xe0\xf4\x09\x26\xeb\x8f\xf6\x16\x43\x4a\xc4\xa0\x2c\x3a\xcc\x5b\x10\x2a\xfe\x94\x20\x6a\x6f\x30\xd7\x78\xa3\x88\x75\xca\xda\x93\x3d\x41\xc4\x3a\x65\xfd\x91\x9f\x60\xe2\xe9\xb2\x3e\x17\x48\x30\xb1\xde\x59\x94\x24\xb4\xa0\x13\xed\x53\xad\xb3\xf6\x6c\x8f\x10\xe9\xe2\xb3\x2e\x1b\x88\x20\xa9\x95\xb3\x28\xa1\x88\x40\xa9\xa1\xb3\x24\xd3\x88\x60\xa9\xe2\xd9\x4e\xee\xb2\x0b\xec\xd4\xcf\xd2\xa4\xa6\xc5\xb5\x71\xd5\xeb\x1f\x9d\xc1\x31\x28\x59\x65\xd6\x1d\xce\x31\x24\x99\x30\x7b\x22\xf9\x49\x6c\x8f\x84\xbd\xb3\x3f\x4f\x82\x3b\xc9\xad\x06\xd9\x5e\x0a\x95\xc8\x3d\x33\x45\xb4\x98\xe7\xa0\x44\x10\xf1\xae\x64\x51\xca\x19\x83\x92\x5d\xc9\xba\x5c\x74\x4f\xbb\x56\x58\xba\x94\x3d\x58\x2b\x2e\xd6\xac\x05\x11\x19\x25\x8e\x92\xa4\x86\xb1\xac\xf3\x04\xd6\xd1\x5b\x0b\xe9\x1b\xde\x3e\x07\xc1\xab\x53\x22\x29\x4b\x93\xd7\x18\x97\x88\x7b\x06\x77\x23\x16\x29\x93\x64\x3b\x89\xe3\xa0\xcb\x5a\x63\x2d\x7d\x3c\x2c\xdb\xcd\x2d\x07\x4d\xc3\xee\xce\x7d\x4d\x96\xdf\x26\x9c\x89\xb1\x13\x04\x66\xc6\x71\x2f\x4f\x7a\x31\x45\x8e\x7b\xbf\xec\xf5\x62\x5e\x18\x23\x2e\xf7\x10\x6d\x66\x18\xa3\xfe\x4c\x50\xcd\x05\xbf\xeb\xfd\x9e\xf4\xd2\x65\x3f\xea\x3d\x4d\xd9\xd4\x96\xdb\xb8\xf7\x8f\x1d\xae\x4d\x94\xfb\xb4\xdb\xb9\x6b\xbd\x0f\x09\x20\x49\xfc\x63\xd8\xef\x09\x8c\xb2\xfc\xb8\xfb\x24\xb5\x70\x9b\xfe\xc7\x90\x9b\x04\x12\xf2\xee\xc8\xaf\x06\xe9\x69\x10\x25\xe4\x11\x68\x98\x82\x9a\x4c\xbd\x05\xc4\x24\xd2\x28\xb2\xcf\x20\x31\x23\x30\xf6\x2c\x7d\x25\xb2\x9e\xa3\x83\x44\xd6\x3e\x1d\x84\xac\x74\x9f\x56\x9a\xf6\x08\xf5\x14\xaf\x74\xed\xd1\x84\xbf\x24\x36\xec\xaf\x42\x09\x37\x3f\x81\xa1\x3b\x52\xc2\xf2\x09\xa8\xbd\x3c\x75\xa7\x3c\x05\x75\xac\x78\xd3\x12\x49\x78\x9f\xee\x78\x7b\xd3\x8a\x21\xbf\x25\x10\x7a\x90\x89\x8d\xb7\xe3\xd4\xdd\x05\x2d\x06\x7d\x4b\x40\xdd\x8d\x2c\x21\xee\x27\xd6\x4b\x97\xaf\x18\xf4\x6b\xea\xbe\xed\xfd\x2c\x1b\x00\x61\x5e\xbd\x62\x67\x6b\x91\xbb\x03\xe7\xb7\xe1\x8a\xd2\xfd\x64\xc0\x5a\xde\x5b\xe2\x69\xf3\xd4\xd1\x7a\xb0\x68\x7b\x76\xa9\x52\xd0\x01\xb5\xef\x83\xd8\x87\xe6\x4d\x5c\xaf\x55\xe4\xa3\xf1\xf2\x2e\x64\x68\xe1\x35\x95\x1e\xf0\xd7\xc2\x88\x3b\x59\x35\xfa\xf0\x11\x91\xef\xbe\x03\xf0\x71\x38\x4f\x22\x8a\xe3\x13\x6a\x8a\x79\x8d\x4f\xa9\x29\xde\x11\x7e\xbc\x8f\x1a\x1d\xa2\x8e\x31\xea\xcc\xe5\xa4\x36\xe5\xcb\x91\xce\x17\x21\x2f\x4e\x6c\x16\x27\xb0\x4d\xd2\xd1\xdc\x7b\x5b\x69\x69\x56\x4b\xb6\xea\x2e\xc4\x09\x26\xc9\xde\xfa\x1b\x68\x82\x09\x19\x74\x73\xec\x12\x3f\x5d\x56\x6a\x2d\xaa\x84\x2a\x0f\x62\x71\xd9\xee\x05\x36\x5e\x10\xb6\x96\xba\x7d\x0b\x77\x6c\xdf\x1f\x82\xc2\x3b\xd7\xf6\x78\x87\xcb\xf0\x6e\xbb\x73\x8d\x8f\x11\x79\x8f\xd8\xb9\xd6\xc7\xa8\x47\x9a\x28\xbd\xe6\x67\x83\xfe\x69\x93\x2b\x23\x34\x33\xd6\x4b\x07\x5f\xac\x97\x6f\xd9\x57\x13\xae\x2b\x56\x17\xcc\xcb\x6a\x4d\x00\xb9\xae\xb5\xf0\xb8\x16\xfa\xd5\xc8\xb0\x6f\xca\x14\x76\xe3\xd8\x5a\xe4\x2b\x4c\x2d\x07\xe1\x5d\xfb\x7c\xce\xdc\x8a\x9e\xb2\x17\xf4\x7c\x59\xc0\xd2\x56\x6c\xd1\x9e\xfa\x43\x80\x93\xe6\xed\x59\x68\xbd\x1d\xf4\xbf\x5c\xd0\x7d\xbe\xbd\x08\xd1\x03\x29\x5e\x39\xe6\xb8\x84\x7b\xb9\x9d\x27\x2f\xbf\xa1\x59\xcc\xc1\x56\xa1\x7a\x5b\xce\x87\x2c\xfc\x72\xe2\xea\xb2\xb4\x95\x47\x3d\x99\x2d\xc3\x44\x6c\x7e\x30\x67\x0b\xe9\x37\x52\x1a\xb6\xb6\x85\x5a\x2a\x59\xb9\xf0\x16\x8c\xe3\xe7\xfd\xbb\xfc\x1c\x9c\x6d\xc5\x37\x6f\xf2\xf4\xab\xc1\xa6\x52\xde\x4b\xc3\x84\xa3\x5e\x31\x67\x3f\xe5\xc2\x61\x64\x79\x8f\xb2\x70\x95\xb8\x96\x76\xa7\x5f\x0e\xd9\xcd\x4a\x39\xa6\x1c\x6c\x56\xdb\xf6\x3d\xf7\xa9\xf7\xd7\xee\xa7\x20\x19\x94\xe9\x52\xdf\x39\x53\xc6\x79\x29\xe8\x97\x13\x52\x29\xea\x82\x70\x7d\x14\x95\x64\xf2\xaf\x5a\x3d\x08\x2d\x8d\x7f\x39\x84\xff\x06\x00\x00\xff\xff\xf6\x46\xc8\x18\xb2\x1c\x00\x00") func runtimeHelpKeybindingsMdBytes() ([]byte, error) { return bindataRead( @@ -1007,7 +1007,7 @@ func runtimeHelpOptionsMd() (*asset, error) { return a, nil } -var _runtimeHelpPluginsMd = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x3a\x5d\x8f\xdc\x36\x92\xef\xfa\x15\x85\xd9\x07\x77\x07\x6d\x4d\x16\xf7\x36\x80\x17\xb0\x9d\xc4\xf1\x9e\x63\x07\x9e\x49\x82\x85\x61\x80\x6c\xa9\xd4\x62\x86\x22\xb5\x24\xd5\x3d\x7d\x46\xee\xb7\x1f\xaa\x8a\x94\xd4\xe3\xc9\x22\x2f\xb7\xc0\x66\xd4\x52\xb1\xbe\xbf\xe9\xbf\xc1\xcf\x76\x3a\x18\x17\xab\xea\x27\xd3\x04\x0f\x71\x1a\x47\x1f\x52\x84\x26\xa0\x4e\xc6\x1d\x60\x14\x00\x38\x99\xd4\x83\x86\x68\x86\xd1\x22\xbc\x9b\x34\xc4\x73\x4c\x38\xd4\xf0\xfd\x11\xc3\x39\xc3\x41\xaf\x23\xe8\x6a\xd0\xc6\x41\x6c\x82\x19\x13\x9c\x7a\xd3\xf4\x60\x22\x84\xc9\x81\x4e\x10\x93\x0e\x69\x1a\xf3\xfb\xd8\xfb\xc9\xb6\xb0\x47\x18\xad\x6e\xb0\x05\xe3\xa0\x52\xff\x7b\x5d\x37\xde\x75\xe6\x70\x3d\x10\x5b\xd7\x99\x89\xfc\xf7\xbd\x1e\x70\xf5\x58\xdb\x49\xab\xba\xaa\xee\x7a\x0c\x08\x9a\xfe\x0f\x6e\x1a\xf6\x18\xc0\x77\xd0\x68\x6b\xf7\xba\xb9\x87\x6e\x72\x4d\x32\x9e\x44\x61\xca\x67\x3f\x41\xa3\x9d\x48\x8a\x44\xf7\xec\xa7\x50\x65\x39\x92\x67\x7e\x1b\xdf\x22\x31\x9d\xcc\x80\x11\x7c\xea\x31\x40\xea\xb5\x2b\x52\xd4\x70\xd7\x23\x38\x3d\x90\xaa\x62\xd3\xe3\x80\x60\x62\xa5\xbc\x7b\xc9\xc4\x36\x47\x83\xa7\xad\xaa\xe1\x07\x1f\x00\x1f\x34\x2b\x4f\xcf\xbc\x5c\x2a\x07\x59\x91\x44\x0a\x52\x8f\x30\x45\x0c\x10\xf5\x11\x63\x45\x3f\xf7\x53\xd7\x61\x80\x53\xd6\xd7\x4d\x55\x29\xa5\xec\xa4\xab\x19\x99\x77\xb7\xfa\x88\x42\xb2\x02\x00\xa8\xeb\x9a\xff\x06\x4c\x53\x70\xd0\x69\x1b\xb1\x42\xd7\xd2\x49\xd6\x17\x28\x02\x56\x70\xd4\xc1\xe8\xbd\x25\xde\x41\x43\xc0\x0e\x03\xba\x06\x49\x0b\x44\x9a\x80\xf8\x41\x0b\x21\x13\x61\x8f\x24\x31\x3e\x60\x33\x25\x6c\xc1\xbb\xba\xba\xeb\x4d\x64\x04\x76\xf0\x31\x81\xb6\x27\x7d\x8e\x7c\xac\x99\x42\x40\x97\x18\xcf\xee\x91\xfa\x0f\x98\xc4\xb7\xd4\xeb\x29\xfc\x6a\xf0\xb4\xd9\x2a\xd0\x11\x4e\x68\x6d\x5d\x55\x2f\xad\x05\x7d\xd4\xc6\x32\x7b\x3a\x5b\x90\x8c\x6c\x4d\x4c\xe2\x2f\x44\xe2\x1e\xcf\x7b\xe3\x5a\xe3\x0e\x11\x22\x66\x7d\x74\xfc\xa9\x47\x3b\x8a\x7b\x44\x5c\x79\x41\xf6\x3c\x6d\xa3\x2f\x0a\xd2\xb0\xf7\xde\x22\x99\x77\xc4\xc6\x74\x67\x92\xf1\xd4\x63\x36\xbb\x28\xa2\x5a\x5c\x36\xa0\xf5\x8d\x26\x2e\xb2\xa2\x9a\x29\x44\x1f\xc0\x07\x70\x3e\x81\xee\x52\x3e\xb7\xe8\xad\xf1\xe4\x02\x09\xeb\xaa\x7a\xef\x13\x19\x9a\xbc\x8b\x59\x2b\x9e\x1a\xc1\x37\xcd\x14\xbe\x3e\x4e\xb1\xb5\x47\x74\x33\x92\xb6\x86\xb7\x1d\x69\xb2\x3a\x69\x97\x40\x2f\xce\xbe\xc7\xce\x07\x7c\x44\xbb\x58\x6b\x47\xae\x05\x6a\x0c\x98\x9d\x94\x1c\xf4\x2d\xe9\x91\x18\xd4\x11\xc5\xdf\xb2\x2a\x44\x37\xd8\x66\x9d\x18\x8c\xb3\x4a\xb2\x9c\x2b\x2a\x8b\x6e\x0a\xb1\x6a\x11\xc3\x4e\x5a\x02\xaa\xf0\x1f\xc9\xc0\x4e\xa2\x6a\x8a\xd8\x4d\x76\x91\x20\x79\xb8\x77\xfe\x04\x7a\xef\xa7\x55\x12\x61\xbd\x2e\x32\x51\xa4\x91\xd3\x7c\x18\xb1\xc4\xda\x02\x4b\xb8\xb0\x25\x6e\x1d\x85\x16\xa5\x05\x3c\x89\x33\x9b\x08\x7e\x44\x92\x4a\xbb\x96\x99\x73\x78\xaa\xca\xa7\x51\xc7\xc8\xae\x45\xe1\x2d\x4e\x9d\xd9\xeb\x7c\x80\x88\x89\x33\x23\xd9\xde\x82\x1f\xc5\x9d\xf6\x3a\x72\x1c\x30\xb2\xce\x58\x4c\xe7\x11\x77\x55\xb7\x8a\x7b\xd2\x23\x1d\xf4\x5d\x07\x2a\xe9\x7d\x4c\x3e\x8e\xba\xc1\xa8\xc0\x3b\x7b\x66\xe4\x6f\x3c\x1f\x66\x1d\x33\xae\x33\x3b\xbb\x30\x5b\x57\xd5\xf3\xe7\xcf\xff\x2c\xd3\x2d\xae\x4d\x32\x95\x90\x8e\xe2\x62\x0c\x3c\xc7\x51\xf2\x1c\x7f\xc6\x55\x3e\xb4\x64\x1d\x0f\xba\x69\x30\x4a\xb8\x1a\xe7\x38\xd1\x84\x7b\x0e\x27\xdf\x01\x67\xe1\x1a\x7e\x24\xb2\x9c\x22\x28\xf8\x60\x43\xc0\x24\x26\x44\x73\x70\x3a\x4d\x01\x23\x0b\xbc\xe2\x24\x20\x1c\xcc\x11\x1d\x4c\x91\x44\x7f\xe3\x9f\xc5\x7c\x84\xab\xc7\xf6\xa6\xaa\xbe\x01\xf5\xe1\x56\xdd\x2c\x49\x48\x0c\x48\xc7\x84\x9f\x0f\xb7\xc2\x00\xdb\x54\x52\x89\x3d\x53\xc6\x14\x6d\x3a\x62\x44\xac\x44\xd0\x51\x0f\x58\xe9\x28\xa4\xde\x7c\xf8\x70\x3b\x23\xde\x41\xf4\xa0\x5a\x1d\x4e\xc6\xa9\x1d\xa8\x93\x71\xad\x3f\x45\x7a\xb4\xc6\x4d\x0f\xf4\xd0\x05\xc4\x7d\x6c\x55\x5d\xd7\x5b\x66\x4d\xea\xd0\x77\x26\xa8\x1b\x68\xbc\x4b\x9a\x8a\x21\xd1\x19\x75\xea\x4b\xdc\x0b\x7b\x02\x3a\x05\xcd\xce\xc9\x66\x64\x14\x64\x6a\x75\x53\xb4\xe6\x3b\xd0\xd6\xf2\x31\xfa\xb0\x92\xc8\x90\x96\x50\xa8\x4e\xe1\x4e\xef\xd5\x4d\xb6\x47\x8b\x0f\x25\x9b\x95\x5c\xca\x67\x73\xf2\xe3\x67\x42\xce\x67\x07\x8c\x11\xdd\x01\x89\x63\x8b\x29\xb2\xa9\x23\xba\x16\xe8\x8b\x3e\x90\x56\xfd\x52\x61\x7c\x28\x25\x70\x0c\x7e\x18\x93\xf0\xfc\x1e\x4f\xaf\xb8\xe0\x6c\x12\x3e\xa4\x9d\x48\x1b\x53\x30\xee\xb0\x85\x6f\xe4\x13\x69\x84\x4f\xc6\x1c\x5a\xb9\x44\x75\xc1\x0f\xa0\xb3\xdd\x03\x6a\xf2\xb0\xdc\x3e\xc8\x3b\x42\xc6\x54\xde\x60\x7a\x87\x9a\xb2\xf6\x6f\xbd\x49\xc8\xd1\xb0\xd9\x72\xea\x51\x37\x39\xf3\x88\xb6\xad\x80\x91\x6f\x64\xb8\xa2\x10\x41\x29\xac\x31\xd2\xb7\xf1\x37\x1f\xda\xd7\xbd\x0e\x9b\x98\xc2\xcc\xf4\x23\xa4\x4f\xe4\x30\x81\x14\x07\x7f\x76\xf2\xa1\x85\xa6\xd7\x41\x37\x09\xc3\x33\xc6\xfc\x71\x72\x78\x9b\xc2\x26\x90\xf3\xe1\x36\x1f\x58\x21\xd5\x05\x47\xf6\x14\x7a\x5c\x78\xa4\x43\x8c\xe7\x9d\x6f\x36\x0f\x3b\x20\x8b\xa7\x2d\xbc\xf3\xcd\x05\x0a\xd2\x24\x81\x28\x42\x36\x35\x62\xd4\x7f\x7a\xe3\x7e\xd6\xa9\x8f\x9b\xd6\x84\xba\xae\x67\xb1\x32\x0f\x94\x53\xf7\xc6\x61\x84\x61\xb2\xc9\x50\xba\x69\x4d\xc0\x26\xf9\x60\xc4\xe0\xd4\x75\x58\xbb\xe8\xfe\xbb\xfc\xf9\x4c\x3d\xd4\x66\x6d\x5f\xb5\x30\x63\x2d\xec\x27\xd1\x8e\xd5\x31\x01\x5a\x1c\xc8\xfb\x7c\x27\x1e\xb1\x4b\xe7\xd1\x50\x9e\x3d\xcf\x31\xf1\x2c\xce\x94\xcf\xc5\xc8\x1f\x38\x49\x6e\x9c\x1e\x70\x26\x72\x69\xdf\xa3\xb6\xd3\x6c\xd2\x80\xff\x9e\x90\xab\xbb\x64\x57\x46\xf3\xb2\x6d\xbf\x46\xb3\xcb\x07\x8d\x4b\x18\x3a\xdd\xe0\x97\x3f\x08\x73\x24\xb7\x5f\x14\x2f\x58\xc4\x07\xe7\xb7\xd4\x19\xc9\xe1\x8d\x5a\x1d\x57\x30\xa0\xe6\x1c\x7a\x96\x44\x65\x1c\xbc\xf1\x92\x0b\x6e\x67\x49\x04\x63\xa1\xbe\x88\xf4\x34\xe1\xd2\x46\x11\x70\x2e\x29\x27\x63\x2d\x71\x10\x51\xb4\x9b\x21\x0f\xd6\xef\x49\x9b\x3b\x98\x9c\xa5\x7c\x6c\x52\x4e\xb8\x52\x6c\xa8\x4c\x08\x68\x5d\x38\x7a\x47\x5f\xfe\x03\x5b\x3b\xa9\x78\xdf\xfc\xca\xd5\xf1\xcf\x59\x24\x6e\x16\x4b\x30\x3d\xc9\x49\x0b\xac\xc4\x37\x13\x7e\x65\x5c\xfb\xdf\x78\xde\xdc\xe3\x79\x37\x17\xff\x59\x0d\xd4\x8a\x45\x50\xf7\x78\x56\x24\xbc\x12\x00\xc5\x27\x7f\xd2\xf7\xf8\xda\x0f\x83\x76\x2d\x5b\x72\xb7\x74\xc3\x85\xe1\xdc\x1f\x70\x05\xa9\xeb\xfa\xf5\xfc\x93\x70\x13\x9f\x4b\xda\x69\x04\x53\x6e\x21\x09\x5f\x69\x00\x48\xc3\xdc\x02\x80\x2a\x04\x94\x54\xd5\xd2\x9a\x70\x73\xfc\x4b\x44\xf8\x96\x4b\xef\x9a\x6a\xf2\xdc\x98\xbe\xf7\x0b\xed\x7a\xcd\x7d\x7e\xb7\x79\xc4\xfa\x56\xdd\x5c\xb2\xa7\x16\x58\xd6\x04\x35\x5e\xc2\xea\x4a\x0d\xa2\x97\xa5\xfd\xbd\x8c\x8c\x75\xf3\xcc\x80\x3f\x6a\xd7\xda\x59\x85\xcd\xd0\xae\x43\x6a\x72\x6b\xe3\x66\xed\xac\x8e\xdd\xf6\x68\x6d\x39\x1b\xf9\xc7\x8c\x60\x27\x61\x44\xc6\x3a\x4a\xff\xb7\x83\x93\x36\xe9\xce\xbf\xb6\x3e\xca\x9b\x27\x88\x30\x16\x16\x5b\xd0\xca\x4c\xa4\x56\xb8\x14\x1f\x7d\xa2\x81\x64\xf9\xb2\x05\x73\xeb\x48\x83\x50\x76\x3a\xea\x03\x0f\xc1\x4f\x19\x25\x91\x50\x2b\x7e\x32\x56\x8e\x09\x3d\x8e\x96\x10\x9b\xee\x11\x61\x6a\x0a\xc2\x84\xdc\x12\x49\x60\x73\x3b\x64\x52\xa1\x47\x08\x73\xbb\x5c\xcd\xa3\x12\xe7\x6d\x09\x5a\x6c\x4d\xf2\x41\x8c\x7f\xe7\xa9\xaa\xfc\xec\xe3\xc6\xfa\x86\xf2\xf6\x8e\x42\xa2\x94\xc3\x2d\xa9\xef\xb1\xf1\x4a\x01\x81\xd1\x47\x53\xa6\x92\x52\x07\xb9\x06\xf0\x08\x51\x92\xdc\x47\xb4\x5e\xb7\xea\x06\x36\x1f\x71\x4b\x8f\x32\x14\xa6\xbe\x14\xb7\x57\xe7\x84\x1f\xba\x2e\x62\xfa\x8f\x3c\xe0\x83\x6e\xa8\xa5\xb0\xe6\x1e\x57\x7c\x2b\xc0\x87\x06\x47\x96\xdf\x24\x68\xfc\xe4\x52\x84\xfd\x99\x9c\xd5\xb8\x98\x50\xb7\xc4\x1f\x15\xaa\x98\xcb\xce\xfe\x76\xd4\x27\x47\x6e\xf6\x7e\x9d\x76\x9b\xa1\x7d\x19\x0e\x11\x3e\x7d\x2e\x6f\xbc\xbb\x4d\xad\x9f\x52\x7e\xc2\x10\xe8\xe9\xfb\x07\x52\x75\x06\xa1\x7e\x43\xd3\xa9\xba\xae\x2f\x02\xe6\x96\xa6\xe9\x38\xb7\x74\x8b\x6f\x8d\xc1\x73\x5b\xfa\x84\x47\xa8\x42\x50\xe5\x47\x0c\x41\xb1\x9d\x95\x90\x55\x84\x99\x1a\xd0\x65\xb0\x4a\x9e\x87\x90\xc7\xab\x00\x4e\x15\x7b\x5c\x0f\x0c\x2b\x1e\xca\xd0\xd9\xeb\x71\x94\xb2\x91\x5d\x63\xe1\xa6\xf0\xc9\x19\x45\x15\x31\x15\x53\xe7\xe9\x28\x1c\x26\xaa\x9b\x17\x04\x29\xc1\xe4\x49\xa3\x8c\x8f\x5f\xed\x2a\x66\x23\x90\x82\x56\xb1\xfe\xff\xa4\x6e\x0e\xe5\x39\x22\x9f\x50\xfa\xc5\xcc\x3a\x03\xe6\x84\x4a\xa8\x4d\x84\xce\x84\x48\x92\x05\x92\x6c\x7f\xa6\xa6\x88\xd1\xb2\x5a\x65\x0c\x90\x49\xb3\xa4\x8b\xb7\x69\x3d\x9d\xe6\xfc\x18\x7b\x78\xde\xa8\x7a\x56\x00\xe6\x5c\xf7\x0d\xc1\xd5\xaf\x87\x76\x07\xad\x4e\xfa\xa2\xf6\xba\x76\xe9\xc0\x8c\xcb\x4a\x8d\xa9\x35\xf3\x2e\xe0\x77\xbf\x2f\xb6\x5a\x54\xeb\xc7\x4b\xcc\x84\xec\x9e\x2c\xa4\x09\xbe\x92\xc5\xc6\xa0\xcf\x10\x11\x07\x09\x29\x0d\x71\xa0\xd2\x32\x77\xf4\xf3\x68\xb5\xf8\x16\x35\x4e\xd1\x0f\x73\x57\xe3\xf7\xbf\x63\x93\x62\x35\x0f\xd4\x7b\x69\x9a\x96\x13\xbd\x3e\x22\x0c\xd4\x79\x0c\x98\x7a\xdf\xc6\xfa\x62\x2b\xb2\xb4\x88\x5c\xd1\x05\x5f\x25\x1e\xc5\x7b\xb7\x3c\x56\xe8\xa7\xf7\x5c\xda\xda\xcb\x3d\xd4\x82\xfb\x86\x17\x47\xbc\x1f\xda\xaa\xba\xfa\x57\x3e\x12\x11\x33\x87\x2b\x51\x47\x1f\xa3\x59\x2f\x63\x9e\xd8\xc0\xf4\x68\x47\x48\x7e\x34\x4d\xcd\x6b\xa6\xb2\x4b\xf0\xee\x2b\x26\xe9\x48\xc3\xd5\xf2\x89\x8e\x9c\x37\x06\x73\xf4\x4a\xc6\xae\xf6\x48\x9e\x5b\xc3\xdb\xbc\x0b\x0b\x48\x9e\x44\xc6\x3f\xa0\xc3\xc0\x6d\x4b\x4c\xa6\xb9\xcf\x59\x9c\xc5\x12\xef\x1b\x34\xbf\xd4\x30\x6f\xf9\x2a\x7d\xf4\x86\x71\x4c\x21\x52\xd9\x1b\x83\xdf\x5b\x1c\xe2\x0e\xd6\xa3\xbb\xe9\xb2\x1e\xa9\x9d\x78\xa4\x36\xaa\x2f\x5b\x45\x6a\x50\x79\x03\x47\x3a\xfc\xe7\x14\x93\xec\x59\x9e\xd6\x32\xcd\xa2\xa5\x14\x9d\xbc\x7b\x96\x32\xf2\x19\x05\xe8\x83\x36\xd4\x75\xfc\x12\x4b\x90\xae\xcc\xbe\x9b\xed\xca\x0b\xac\xd5\xf4\x9e\x87\x30\x1d\xa3\x6f\x8c\x9e\x03\x8a\x69\x71\x0f\xb1\x3f\xe7\x28\x5c\x38\xab\x5f\x4d\x9d\x2a\x9b\xb9\x79\x66\x5c\x21\x55\x3f\x18\x8b\x77\xe7\x11\x69\x46\xa6\x39\x84\xfe\x52\x41\xa0\x41\x59\x56\x89\xb3\x5f\x64\xdf\x7d\xc2\xfd\xe6\xe8\xc7\xf5\x94\xba\x0c\xfe\x3a\xe0\xcd\xe5\x08\x5b\xff\x24\x23\xeb\x66\x88\x07\x4a\x63\x17\x7d\xfe\x25\xe4\xf7\x21\xf8\xf0\x17\xe0\xfe\x85\xf1\xbd\xff\x99\x47\xdd\x8d\x4c\xbc\xf3\x2c\xb5\x91\x9e\x47\xfa\x9c\xcb\x53\x17\x07\x76\xd0\x9b\x48\xf3\xcd\x1d\x6f\x32\xbe\xea\x5a\xf9\xf5\xaa\x6b\x85\x4d\x81\xc9\xa8\x2b\x59\xdb\x41\x5e\xdb\xc5\xa4\x5d\xab\x43\x0b\x05\xfd\xef\xb3\xf3\xfc\x29\x07\x57\x57\x3b\xf8\x96\x50\xfd\x0d\x5e\xb6\x3c\x1a\x73\xd0\xf1\xd6\x61\x07\xf1\xec\x92\x7e\x28\xbf\xb8\xb9\xb5\x3e\xc8\x82\x3a\x96\x5d\x77\x8e\x82\x6a\x8e\x77\xa2\xc8\xc6\x79\xd9\xb6\x1f\x27\x97\xcc\x80\x64\xf7\xdc\xa6\xf3\x42\x0b\x2e\x07\xc5\xb9\xff\xa5\x01\xb3\x95\xad\x93\x9f\x22\xdc\xf3\x00\xe0\xbb\x4a\x96\x59\xb2\x6f\x2a\x04\x2f\xb2\xd0\x2e\xc7\xd6\xb3\x56\x32\x6b\x46\xa4\x57\x39\xe4\xd1\xf1\x2a\x97\x69\x95\x30\x26\x25\x81\x20\x99\x20\xef\x31\xb4\x7c\xaa\x87\x56\xb1\x06\x76\xdc\x15\x34\x25\xf3\x14\x9e\x97\x0d\xfa\x23\x71\xaf\xe8\xf4\xd5\x0e\xae\x88\x05\xfa\x9b\xb1\x5d\x6d\x65\x71\x4e\x23\xc3\x23\x15\xc5\x1f\x82\x1f\xe6\x89\xfa\x42\x61\xad\x09\xac\xb5\x84\xc1\x6d\xd5\x22\xdf\x6a\x71\xc7\x9b\xa2\x5c\xae\x82\x20\xad\xab\x3b\xcf\xbb\x93\x5c\x68\x5d\xca\x63\xb7\x2e\x10\x7c\x4c\x9c\xe4\x23\xea\x0b\x01\xba\x1c\xac\x3b\xb8\x98\xb8\x2b\x1f\x40\xbd\x33\x31\xad\x19\x9f\x81\x57\x46\xf5\x81\xd3\xf4\x9a\x50\xac\xd9\xd3\xa6\xe4\xcb\xf2\x76\xae\xfe\x73\x73\x53\x55\xb7\x5c\x30\xb8\x98\xe7\x95\xa7\x07\x8b\x3a\x38\xe8\xfd\xa9\xcc\x3f\x8f\x66\xa8\xdc\xb3\x5d\xce\x43\xd9\x30\x32\xf5\xce\x4e\x26\x7d\xcb\x6f\x26\xf5\x9b\x5b\x09\x28\x7e\xb3\xad\xa8\xa5\xe1\xaa\xff\x22\x3f\xdc\x4c\xe3\x88\x61\x23\x5f\x74\x48\xfc\x41\x87\x54\xde\xd3\x14\x99\x97\xfe\x22\x76\x1d\xa7\x7d\x41\xfa\xf7\x5d\x7e\x67\xd1\x6d\x84\xc2\xf6\xc5\x0b\x7e\xe0\xdb\x93\xe5\xc6\xa5\xe8\x62\x63\xdc\x38\x31\x1f\xc2\xb1\xe6\x19\x6b\x9e\x26\x5f\xc0\x97\xab\x1f\xd1\x5a\x4f\xce\xf4\x9b\x0f\xb6\xa5\x87\x1f\x3c\xff\x7e\xa5\xc3\xd5\x1f\xf3\xc9\x80\x71\xb2\xc4\xee\x17\x7a\x47\x6c\x92\x35\xcc\xee\x48\x41\x3b\x6a\x13\xe2\xe6\x12\xf9\x16\x5a\x1a\xdd\x4d\xb7\xd6\xce\x91\x46\x39\xe2\x88\xbc\x87\x5b\x56\xfa\x5f\xa2\x24\x5b\x1b\x17\x31\xa4\x8d\x10\xda\xc1\x51\xae\x8a\x80\x04\x5b\xfe\x64\xdd\x08\xd0\x23\xa1\x3b\xef\x37\x3a\x1c\xe8\xdc\x9c\x9d\x6e\x4a\x9e\xe6\x0f\x0c\xbf\x9e\xf3\xaf\x3a\x91\x35\xbb\x45\x2d\x3f\x1f\xcd\xd2\xf3\xd7\xa2\xd5\xab\x6d\x0e\xb8\xbf\xc1\x77\xd8\x69\xd2\xcb\x58\xae\x2b\x57\x19\x84\x37\xd4\xf9\xc3\x6e\xee\x59\xda\x7c\x42\x69\xf2\x59\x99\x17\xd9\xd1\x2c\xd7\x06\x35\xa3\xda\x50\x26\x5f\x2e\x92\x9c\x0f\x83\xb6\xf3\x46\x37\x20\x04\x1c\x3d\x4c\xae\xc5\x00\x2a\x87\x44\xb9\x90\x54\xdb\x72\x55\x05\x3a\x56\xd4\xb8\x95\xeb\xd2\x79\xe9\x7e\x89\xdd\x77\x9d\x69\x8c\xb6\x34\x18\x3a\x87\x16\x3e\xf5\x18\xf0\xf3\xa6\x4f\x69\x8c\x37\xd7\xd7\x07\x93\xfa\x69\x4f\x1a\x90\x9b\xcf\xe7\x32\x7e\x66\x7a\xcf\xf3\xa9\x2d\x07\xa3\x5c\xdd\xc2\x4f\xda\xe9\x03\x86\x72\x83\xcb\xed\x00\x77\x83\xb0\x9f\x8c\x4d\xec\x37\x02\x39\x08\xe4\xa3\xc2\x6c\xdc\xd1\xdf\xe3\xb2\x1c\x53\xff\x28\xf0\x75\x5d\xab\xb9\x4b\x17\x95\xe7\x05\x91\x69\xcb\xfb\x38\xe3\x99\x22\x2e\xda\x57\xf9\xb3\xba\x68\x05\xb9\x4f\x28\x5c\x74\x98\x9a\x1e\xe3\xac\x31\xde\x1a\xe7\x99\x99\x84\x8c\xb0\x99\x6f\x72\xf8\xd6\xf9\xbc\xda\xa0\x17\x89\x30\x69\x9a\x02\xb6\xb9\x0b\x36\x89\x2f\x8d\xa2\xdc\x1a\xd5\xf0\xea\x5c\xfc\x60\x97\x2d\xca\xdb\x82\x15\xcc\xd3\x56\x99\x09\xe7\xfb\xbd\x4a\x27\xf8\x6b\xa6\xe1\xae\x7f\x6e\xcd\xda\x56\x0a\x97\x3f\xf1\xed\x5a\x68\x9f\x8f\x3a\xa4\xf3\x22\x22\x37\x44\x7c\xdd\xa6\x04\x4f\xf9\xa2\xca\x62\x8e\x7c\xb6\xe0\x93\xbd\x2a\x8f\xf5\xee\xfe\x02\xe1\xec\x76\xe4\x00\xd6\x9f\x78\x9a\xd7\xd6\xca\x66\x21\xf5\xc1\x4f\x07\x31\xef\x63\x5f\x98\xcd\x2e\x1f\xc8\xd9\x67\xe2\x75\x69\x54\x56\xc5\x79\x9c\xf6\xd6\xc4\x7e\xe9\xa1\xe9\x33\x8f\x2d\x2d\x52\x30\x50\x97\x5f\xd4\x29\x10\x52\xa1\xf3\xba\x65\x1a\x79\xab\xb1\xbe\x6a\xf7\xce\x1a\x87\xb0\x49\x1e\xde\xb0\x8e\x61\xe4\x1b\x68\xbd\xb7\xe7\x2d\xcb\x2f\x05\x53\x11\x6f\xf5\xef\x91\x4a\x06\x95\xa4\xbc\x49\xe5\x32\x28\xcb\x3e\x59\xba\x93\x38\x55\xf1\x0c\x4e\x9f\x17\xbd\xc7\x7c\x89\xe5\x4a\x02\x91\x46\x80\x10\x57\x9f\xbe\x54\x00\x57\xd4\xd8\x5e\xdd\xc0\x95\x1c\xa1\x1a\x7a\xb5\xa3\xf7\xdf\xa1\xfc\x9b\x06\xe3\x1d\x7d\x5e\xae\xc3\x9c\x69\xb8\x48\x37\x26\x52\xe6\x99\xa1\xf8\xee\xac\x58\x47\x70\xdc\xe9\x43\xbc\xba\x81\x4f\x57\xe3\x39\xf5\xde\x51\x56\xa4\x8c\x64\xdc\xe1\xea\x33\x03\xfc\x8a\x21\x52\x62\x27\x20\x4e\xcd\x5f\x72\xfe\x2e\x5f\x88\xf4\xdf\xeb\x6f\xeb\x6f\x19\x21\x7f\xf9\x25\x58\x7a\xfb\x44\x16\x99\x22\x16\x17\xbd\xd6\xa1\xe9\xcd\x11\xaf\x8f\x7c\xba\xfe\x1f\x33\x2e\x18\x3e\xe2\xbf\x27\x13\x48\xea\x42\x0e\xe0\x8a\xfd\x9c\x10\xff\xe3\x05\x1d\xf9\xaf\xab\xfc\x89\x4b\x13\xff\xf7\x73\xf5\xc7\xe7\xf9\x5f\x13\x38\xbe\xa6\x24\xcf\xa0\x79\x31\x2f\xf1\xe1\xaf\x87\x8e\x96\x3e\x56\x67\xf7\xe6\x7e\xa8\x0a\xfa\x74\x61\x79\x99\x99\x1e\xf7\xb0\x9c\xa4\x23\x21\x3d\x73\xe7\x34\xe8\x7b\x84\x69\x6c\xe5\xdf\xb0\xac\xfc\xfe\xe4\xc3\xfd\x2e\xdf\xd1\x86\x98\x80\x5d\xcf\x77\x6b\x5c\x71\xb9\xa8\xce\x4e\xbb\x72\x2c\x38\x8a\x11\xca\x50\x5f\xbc\x6a\xf3\x8e\xe3\xa3\x37\xf1\x06\xd4\xaf\xdf\x7f\xbc\x7d\xfb\xe1\x3d\xbc\x28\x86\x52\xdb\xea\x67\x8b\x3a\xa2\x30\x16\xa7\x80\xa5\x1b\xfa\x14\x71\x38\x62\x90\x12\x70\x73\x7d\x2d\x3f\x6b\x1f\x0e\xd7\x5b\x76\xde\x4c\x90\xfa\x91\xea\xff\x02\x00\x00\xff\xff\x77\xe8\x60\xd9\xb0\x23\x00\x00") +var _runtimeHelpPluginsMd = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x3a\x5d\x8f\xdb\x46\x92\xef\xfc\x15\x05\xe5\xc1\x52\x20\x73\xb2\xb8\x37\x01\x5e\xc0\x76\x12\xc7\x7b\xfe\x82\x67\x92\x60\x61\x18\x60\x8b\x2c\x8a\x9d\x69\x76\x73\xbb\x9b\xd2\xe8\x0c\xdf\x6f\x3f\x54\x55\x37\x49\xc9\x93\x20\x2f\x17\x60\x77\x28\xb2\xba\xbe\xbf\xdb\xdf\xc1\x07\x33\x1e\xb4\x0d\x45\xf1\x56\xd7\xde\x41\x18\x87\xc1\xf9\x18\xa0\xf6\xa8\xa2\xb6\x07\x18\x04\x00\x4e\x3a\x76\xa0\x20\xe8\x7e\x30\x08\x6f\x46\x05\xe1\x1c\x22\xf6\x25\xfc\x74\x44\x7f\x4e\x70\xd0\xa9\x00\xaa\xe8\x95\xb6\x10\x6a\xaf\x87\x08\xa7\x4e\xd7\x1d\xe8\x00\x7e\xb4\xa0\x22\x84\xa8\x7c\x1c\x87\xf4\x3e\x74\x6e\x34\x0d\xec\x11\x06\xa3\x6a\x6c\x40\x5b\x28\xaa\xff\xbd\x29\x6b\x67\x5b\x7d\xb8\xe9\x89\xad\x9b\xc4\x44\xfa\xfb\x4e\xf5\xb8\x78\x2c\xcd\xa8\xaa\xb2\x28\xee\x3a\xf4\x08\x8a\xfe\x07\x76\xec\xf7\xe8\xc1\xb5\x50\x2b\x63\xf6\xaa\xbe\x87\x76\xb4\x75\xd4\x8e\x44\x61\xca\x67\x37\x42\xad\xac\x48\x8a\x44\xf7\xec\x46\x5f\x24\x39\xa2\x63\x7e\x6b\xd7\x20\x31\x1d\x75\x8f\x01\x5c\xec\xd0\x43\xec\x94\xcd\x52\x94\x70\xd7\x21\x58\xd5\x93\xaa\x42\xdd\x61\x8f\xa0\x43\x51\x39\xfb\x9c\x89\xad\x8f\x1a\x4f\x9b\xaa\x84\x9f\x9d\x07\x7c\x50\xac\x3c\x35\xf1\x72\xa9\x1c\x64\x45\x12\x29\x88\x1d\xc2\x18\xd0\x43\x50\x47\x0c\x05\xfd\xdc\x8f\x6d\x8b\x1e\x4e\x49\x5f\xbb\xa2\xa8\xaa\xca\x8c\xaa\x98\x90\x39\x7b\xab\x8e\x28\x24\x0b\x00\x80\xb2\x2c\xf9\xaf\xc7\x38\x7a\x0b\xad\x32\x01\x0b\xb4\x0d\x9d\x64\x7d\x41\x45\xc0\x15\x1c\x95\xd7\x6a\x6f\x88\x77\x50\xe0\xb1\x45\x8f\xb6\x46\xd2\x02\x91\x26\x20\x7e\x50\x42\x48\x07\xd8\x23\x49\x8c\x0f\x58\x8f\x11\x1b\x70\xb6\x2c\xee\x3a\x1d\x18\x81\xe9\x5d\x88\xa0\xcc\x49\x9d\x03\x1f\xab\x47\xef\xd1\x46\xc6\xb3\xbd\x52\xff\x01\xa3\xf8\x56\xf5\x72\xf4\xbf\x69\x3c\xad\x37\x15\xa8\x00\x27\x34\xa6\x2c\x8a\xe7\xc6\x80\x3a\x2a\x6d\x98\x3d\x95\x2c\x48\x46\x36\x3a\x44\xf1\x17\x22\x71\x8f\xe7\xbd\xb6\x8d\xb6\x87\x00\x01\x93\x3e\x5a\xfe\xd4\xa1\x19\xca\xa2\x20\x0b\x64\x67\x08\x24\x59\xef\xc6\x30\xa1\xdc\x32\x43\xec\x3c\x26\x38\x38\xe8\x23\x0a\x62\x3c\x12\xe7\xda\xb6\xee\x51\x8d\xbf\x25\x24\x1f\x3c\x86\xb0\x16\xe9\x18\x5e\xd4\x6f\x5c\xad\x0c\x3c\x6c\xe1\x0c\xcf\xe4\xfd\xee\x83\x0b\x9a\xfd\x62\x53\xfc\xb5\x65\x02\x2e\x1c\x36\x05\x09\x73\x96\x4e\x28\xd8\x3b\x67\x90\x3c\x71\xc0\x5a\xb7\x67\x32\xc7\xa9\xc3\xe4\xa1\x62\xb3\x62\x8e\x2e\x8f\xc4\x0d\x29\x2c\xd9\xb4\x1e\x7d\x70\x1e\x9c\x07\xeb\x22\xa8\x36\xa6\x73\xb3\x89\x6b\x47\xde\x1a\xb1\x2c\x8a\x77\x2e\x92\x4f\x52\x20\x30\x6b\xb3\x1e\x5d\x5d\x8f\xfe\xdb\xe3\x94\x06\xf6\x88\x76\x42\xd2\x94\xf0\xba\x25\x1d\x17\x27\x65\x23\xa8\x39\x2e\xf7\xd8\x3a\x8f\x57\xb4\xb3\x63\x6d\x29\x0a\xa0\x1a\x3c\xa6\x78\xa2\x58\x7a\x4d\x96\x21\x06\x55\x40\x09\x8d\xa4\x0a\xd1\x0d\x36\x49\x27\x1a\xc3\xa4\x92\x24\xe7\x82\xca\xac\x9b\x4c\xac\x98\xc5\x30\xa3\x92\xd8\xcf\xfc\x07\xf2\x45\x2b\x09\x60\x0c\xd8\x8e\x66\x96\x20\x3a\xb8\xb7\xee\x04\x6a\xef\xc6\x45\xbe\x63\xbd\xce\x32\x51\x52\x20\xff\x7e\x3f\x60\x4e\x0b\x33\x2c\xe1\xc2\x86\xb8\xb5\x94\x05\x28\x83\xe1\x49\xe2\x4e\x07\x70\x03\x92\x54\xca\x36\xcc\x9c\xc5\x53\x91\x3f\x0d\x2a\x04\x8e\x02\xca\x44\x12\x7f\x89\xbd\xd6\x79\x08\x18\x39\x89\x8b\x27\xba\x41\xdc\x69\xaf\x02\x87\x2c\x23\x6b\xb5\xc1\x78\x1e\x70\x5b\xb4\x8b\x14\x45\x7a\xa4\x83\xae\x6d\xa1\x8a\x6a\x1f\xa2\x0b\x83\xaa\x31\x54\xe0\xac\x39\x33\xf2\x57\x8e\x0f\xb3\x8e\x19\xd7\x99\xe3\x47\x98\x2d\x8b\xe2\xe9\xd3\xa7\x7f\x96\x94\x67\xd7\x26\x99\x72\xf6\x09\xe2\x62\x0c\x3c\x85\x7c\x74\x1c\x99\xda\x16\xce\x37\x64\x1d\x07\xaa\xae\x31\x48\x66\xd1\xd6\x72\x4e\xf4\xf7\x1c\xf9\xae\x05\x2e\x18\x25\xfc\x42\x64\x39\x9b\x51\x9e\x80\x35\x01\x93\x98\x10\xf4\xc1\xaa\x38\x7a\x0c\x2c\xf0\x82\x13\x8f\x29\xec\xc7\x40\xa2\xbf\x72\x4f\x42\x3a\xc2\x85\x6e\xb3\x2b\x8a\xef\xa1\x7a\x7f\x5b\xed\xe6\x7c\x29\x06\xa4\x63\xc2\xcf\xfb\x5b\x61\x80\x6d\x2a\x59\xcf\x9c\x29\xb9\x8b\x36\x2d\x31\x22\x56\x22\xe8\xa0\x7a\x2c\x54\x10\x52\xaf\xde\xbf\xbf\x9d\x10\x6f\x21\x38\xa8\x1a\xe5\x4f\xda\x56\x5b\xa8\x4e\xda\x36\xee\x14\xe8\xd1\x68\x3b\x3e\xd0\x43\xeb\x11\xf7\xa1\xa9\xca\xb2\xdc\x30\x6b\x52\x32\x7f\xd4\xbe\xda\x41\xed\x6c\x54\x54\xb7\x89\xce\xa0\x62\x97\xe3\x5e\xd8\x13\xd0\xd1\x2b\x76\x4e\x36\x23\xa3\x20\x53\x57\xbb\xac\x35\xd7\x82\x32\x86\x8f\xd1\x87\x85\x44\x9a\xb4\x84\x42\x75\xf4\x77\x6a\x5f\xed\x92\x3d\x1a\x7c\xc8\x89\x37\xa7\x7d\x3e\x9b\xf2\x34\x3f\x13\x72\x3e\xdb\x63\x08\x68\x0f\x48\x1c\x1b\x8c\x81\x4d\x1d\xd0\x36\x40\x5f\xd4\x01\x43\x66\x9b\x8b\x21\x65\x70\xa9\xd6\x83\x77\xfd\x10\x85\xe7\x77\x78\x7a\xc1\xb5\x71\x1d\xf1\x21\x6e\x45\xda\x10\xbd\xb6\x87\x0d\x7c\x2f\x9f\x48\x23\x7c\x32\xa4\xd0\x4a\xd5\xb4\xf5\xae\x07\x95\xec\xee\x51\x91\x87\xa5\x4e\x47\xde\x11\x32\xa6\xf2\x0a\xe3\x1b\x54\x54\x60\x7e\xef\x74\x44\x8e\x86\xf5\x86\x53\x4f\xb5\x4b\x99\x47\xb4\x6d\x04\x8c\x7c\x23\xc1\x65\x85\x08\x4a\x61\x8d\x91\xbe\x0e\xbf\x3b\xdf\xbc\xec\x94\x5f\x87\xe8\x27\xa6\xaf\x90\x3e\x92\xc3\x04\x52\x1c\xfc\xc9\xc9\xf9\x06\xea\x4e\x79\x55\x47\xf4\x4f\x18\xf3\xc7\xd1\xe2\x6d\xf4\x6b\x4f\xce\x87\x9b\x74\x60\x81\x54\x65\x1c\xc9\x53\xe8\x71\xe6\x91\x0e\x31\x9e\x37\xae\x5e\x73\x05\xd3\x36\x6e\xe0\x8d\xab\x2f\x50\x90\x26\x09\xa4\x22\x64\x63\x2d\x46\xfd\x97\xd3\xf6\x83\x8a\x5d\x58\x37\xda\x97\x65\x39\x89\x95\x78\xa0\x9c\xba\xd7\x16\x03\xf4\xa3\x89\x9a\xd2\x4d\xa3\x3d\xd6\xd1\x79\x2d\x06\xa7\x06\xc9\x98\x59\xf7\x3f\xa6\xcf\x67\x6a\xf7\xd6\x4b\xfb\x56\x33\x33\xc6\xc0\x7e\x14\xed\x18\x15\x22\xa0\xc1\x9e\xbc\xcf\xb5\xe2\x11\xdb\x78\x1e\x34\xe5\xd9\xf3\x14\x13\x4f\xc2\x44\xf9\x9c\x8d\xfc\x9e\x93\xe4\xda\xaa\x1e\x27\x22\x97\xf6\x3d\x2a\x33\x4e\x26\xf5\xf8\x9f\x11\xb9\x11\x91\xec\xca\x68\x9e\x37\xcd\xb7\x68\xb6\xe9\xa0\xb6\x11\x7d\xab\x6a\xfc\xf2\x95\x30\x07\x72\xfb\x59\xf1\x82\x45\x7c\x70\x7a\x4b\xad\x82\x1c\x5e\x57\x8b\xe3\x15\xf4\xa8\x38\x87\x9e\x25\x51\x69\x0b\xaf\x9c\xe4\x82\xdb\x49\x12\xc1\x98\xa9\xcf\x22\x3d\x4e\x38\x77\x7c\x04\x9c\x4a\xca\x49\x1b\x43\x1c\x04\x14\xed\x26\xc8\x83\x71\x7b\xd2\xe6\x16\x46\x6b\x28\x1f\xeb\x98\x12\xae\x14\x1b\x2a\x13\x02\x5a\x66\x8e\xde\xd0\x97\xbf\x60\x6b\x2b\x15\xef\xfb\xdf\xb8\x3a\xfe\x39\x8b\xc4\xcd\x6c\x09\xa6\x27\x39\x69\x86\x95\xf8\x66\xc2\x2f\xb4\x6d\xfe\x1b\xcf\xeb\x7b\x3c\x6f\xa7\xe2\x3f\xa9\x81\xba\xc6\x00\xd5\x3d\x9e\x2b\x12\xbe\x12\x80\x8a\x4f\xbe\x55\xf7\xf8\xd2\xf5\xbd\xb2\x0d\x5b\x72\x3b\x37\xee\x99\xe1\xd4\x1f\x70\x05\x29\xcb\xf2\xe5\xf4\x93\x70\x13\x9f\x73\xda\xa9\x05\x53\xea\x76\x09\x5f\x6e\x00\x48\xc3\xdc\x02\x40\x95\x09\x54\x52\x55\x73\x6b\xc2\x7d\xfc\xaf\x01\xe1\x07\x2e\xbd\x4b\xaa\xd1\x71\x0f\xfd\xce\xcd\xb4\xcb\x25\xf7\xe9\xdd\xfa\x8a\xf5\x4d\xb5\xbb\x64\xaf\x9a\x61\x59\x13\xd4\x78\x09\xab\x0b\x35\x88\x5e\xe6\x4e\xfd\x32\x32\x96\x7d\x3e\x03\xfe\xa2\x6c\x63\x26\x15\xd6\x7d\xb3\x0c\xa9\xd1\x2e\x8d\x9b\xb4\xb3\x38\x76\xdb\xa1\x31\xf9\x6c\xe0\x1f\x13\x82\xad\x84\x11\x19\xeb\x28\xfd\xdf\x16\x4e\x4a\xc7\x3b\xf7\xd2\xb8\x20\x6f\x1e\x21\xc2\x58\x58\x6c\x41\x2b\xe3\x5b\xb5\xc0\x55\xf1\xd1\x47\x1a\x48\x96\x2f\x59\x30\xb5\x8e\x34\xb3\x25\xa7\xa3\x3e\xf0\xe0\xdd\x98\x50\x12\x89\x6a\xc1\x4f\xc2\xca\x31\xa1\x86\xc1\x10\x62\xdd\x5e\x11\xa6\xa6\xc0\x8f\xc8\x2d\x91\x04\x36\xb7\x43\x3a\x66\x7a\x84\x30\xb5\xcb\xc5\x34\x3b\x70\xde\x96\xa0\xc5\x46\x47\xe7\xc5\xf8\x77\x8e\xaa\xca\x07\x17\xd6\xc6\xd5\x94\xb7\xb7\x14\x12\xb9\x1c\x6e\x48\x7d\xd7\xc6\xcb\x05\x04\x86\x34\xa4\x70\xfd\x4f\x9a\xe3\x1a\xc0\x23\x44\x4e\x72\x1f\xd1\x38\xd5\x54\x3b\x58\x7f\xc4\x0d\x3d\xca\xfc\x1a\xbb\x5c\xdc\x5e\x9c\x23\xbe\x6f\xdb\x80\xf1\x2f\x79\xc0\x07\x55\x53\x4b\x61\xf4\x3d\x2e\xf8\xae\x00\x1f\x6a\x1c\x58\x7e\x1d\xa1\x76\xa3\x8d\x01\xf6\x67\x72\x56\x6d\x43\x44\xd5\x10\x7f\x54\xa8\x42\x2a\x3b\xfb\xdb\x41\x9d\x2c\xb9\xd9\xbb\x65\xda\xad\xfb\xe6\xb9\x3f\x04\xf8\xf4\x39\xbf\x71\xf6\x36\x36\x6e\x8c\xe9\x09\xbd\xa7\xa7\x9f\x1e\x48\xd5\x09\x84\xfa\x0d\x45\xa7\xca\xb2\xbc\x08\x98\x5b\x1a\xfc\xc3\xd4\xd2\xcd\xbe\x35\x78\xc7\x6d\xe9\x23\x1e\x51\x65\x82\x55\x7a\x44\xef\x2b\xb6\x73\x25\x64\x2b\xc2\x4c\x0d\xe8\xc5\x80\x4a\x43\xc8\xf5\xd6\x82\x53\xc5\x1e\x97\x03\xc3\x82\x87\x3c\x1f\x77\x6a\x18\xa4\x6c\x24\xd7\x98\xb9\xc9\x7c\x72\x46\xa9\xb2\x98\x15\x53\xe7\xe9\xc8\x1f\x46\xaa\x9b\x17\x04\x29\xc1\xa4\x49\x23\x8f\x8f\xdf\xac\x55\x26\x23\x90\x82\x16\xb1\xfe\xff\xa4\x6e\x0e\xe5\x29\x22\x1f\x51\xfa\xc5\xcc\x3a\x01\xa6\x84\x4a\xa8\x75\x80\x56\xfb\x40\x92\x79\x92\x6c\x7f\xa6\xa6\x88\xd1\xb2\x5a\x65\x0c\x90\x49\x33\xa7\x8b\xd7\x71\x39\x9d\xa6\xfc\x18\x3a\x78\x5a\x57\xe5\xa4\x00\x4c\xb9\xee\x7b\x82\x2b\x5f\xf6\xcd\x16\x1a\x15\xd5\x45\xed\xb5\xcd\xdc\x81\x69\x9b\x94\x1a\x62\xa3\xa7\xb5\xc5\x1f\x6e\x9f\x6d\x35\xab\xd6\x0d\x97\x98\x09\xd9\x3d\x59\x48\x11\x7c\x21\x3b\x98\x5e\x9d\x21\x20\xf6\x12\x52\x0a\x42\x4f\xa5\x65\xea\xe8\xa7\xd1\x6a\xf6\x2d\x6a\x9c\x82\xeb\xa7\xae\xc6\xed\xff\xc0\x3a\x86\x62\x1a\xa8\xf7\xd2\x34\xcd\x27\x3a\x75\x44\xe8\xa9\xf3\xe8\x31\x76\xae\x09\xe5\xc5\x02\x67\x6e\x11\xb9\xa2\x0b\xbe\x42\x3c\x8a\x57\x84\x69\xac\x50\x8f\xaf\xe4\x94\x31\x97\x2b\xb3\x19\xf7\x8e\x77\x5c\xbc\x30\xd9\x54\x65\xf1\xef\x74\x24\x20\x26\x0e\x17\xa2\x0e\x2e\x04\xbd\xdc\x1b\x3d\xb2\x2c\xea\xd0\x0c\x10\xdd\xa0\xeb\x92\x37\x62\x79\x97\xe0\xec\x37\x4c\xd2\x91\x9a\xab\xe5\x23\x1d\x39\x6f\x0c\xa6\xe8\x95\x8c\x5d\xec\x91\x3c\xb7\x84\xd7\x69\x6d\xe7\x91\x3c\x89\x8c\x7f\x40\x8b\x9e\xdb\x96\x10\x75\x7d\x9f\xb2\x38\x8b\x25\xde\xd7\x2b\x7e\xa9\x60\x5a\x48\x16\xea\xe8\x34\xe3\x18\x7d\xa0\xb2\x37\x78\xb7\x37\xd8\x87\x2d\x2c\x47\x77\xdd\x26\x3d\x52\x3b\x71\xa5\x36\xaa\x2f\x9b\x8a\xd4\x50\xa5\x65\x21\xe9\xf0\x5f\x63\x88\xb2\x67\x79\x5c\xcb\x34\x8b\xe6\x52\x74\x72\xf6\x49\x4c\xc8\x27\x14\xa0\x0e\x4a\x53\xd7\xf1\x6b\xc8\x41\xba\x30\xfb\x76\xb2\x2b\x2f\xb0\x16\xd3\x7b\x1a\xc2\x54\x08\xae\xd6\x6a\x0a\x28\xa6\xc5\x3d\xc4\xfe\x9c\xa2\x70\xe6\xac\x7c\x31\xb6\x55\x5e\x22\x4e\x33\xe3\x02\x69\xf5\xb3\x36\x78\x77\x1e\x90\x66\x64\x9a\x43\xe8\x2f\x15\x04\x1a\x94\x65\xeb\x39\xf9\x45\xf2\xdd\x47\xdc\x6f\x8a\x7e\x5c\x4e\xa9\xf3\xe0\xaf\x3c\xee\x2e\x47\xd8\xf2\xad\x8c\xac\xeb\x3e\x1c\x28\x8d\x5d\xf4\xf9\x97\x90\x3f\x79\xef\xfc\xdf\x80\xfb\x37\x86\x77\xee\x03\x8f\xba\x6b\x99\x78\xa7\x59\x6a\x2d\x3d\x8f\xf4\x39\x97\xa7\x2e\x0e\x6c\xa1\xd3\x81\xe6\x9b\x3b\xde\x64\x7c\xd3\xb5\xf2\xeb\x45\xd7\x0a\xeb\x0c\x93\x50\x17\xb2\xb6\x83\xb4\xb6\x0b\x51\xd9\x46\xf9\x06\x32\xfa\x3f\x26\xe7\xf9\x53\x0e\x56\xab\x2d\xfc\x40\xa8\xbe\x83\xe7\x0d\x8f\xc6\x1c\x74\xbc\x75\xd8\x42\x38\xdb\xa8\x1e\xf2\x2f\x6e\x6e\x8d\xf3\xb2\x4b\x0f\x79\x2d\x9f\xa2\xa0\x98\xe2\x9d\x28\xb2\x71\x9e\x37\xcd\xc7\xd1\x46\xdd\x23\xd9\x3d\xb5\xe9\xbc\xd0\x82\xcb\x41\x71\xea\x7f\x69\xc0\x6c\x64\xeb\xe4\xc6\x00\xf7\x3c\x00\xb8\xb6\x90\x65\x96\xec\x9b\x32\xc1\x8b\x2c\xb4\x4d\xb1\xf5\xa4\x91\xcc\x9a\x10\xa9\x45\x0e\xb9\x3a\x5e\xa4\x32\x5d\x45\x0c\xb1\x92\x40\x90\x4c\x90\xf6\x18\x4a\x3e\x95\x7d\x53\xb1\x06\xb6\xdc\x15\xd4\x39\xf3\x64\x9e\xe7\xd5\xf3\x95\xb8\x2b\x3a\xbd\xda\xc2\x8a\x58\xa0\xbf\x09\xdb\x6a\x23\x9b\x64\x1a\x19\xae\x54\x14\x7e\xf6\xae\x9f\x26\xea\x0b\x85\x35\xda\xb3\xd6\x22\x7a\xbb\xa9\x66\xf9\x16\x8b\x3b\xde\x14\xa5\x72\xe5\x05\x69\x59\xdc\x39\xde\x9d\xa4\x42\x6b\x63\x1a\xbb\x55\x86\xe0\x63\xe2\x24\x1f\x51\x5d\x08\xd0\xa6\x60\xdd\xc2\xc5\xc4\x5d\x38\x0f\xd5\x1b\x1d\xe2\x92\xf1\x09\x78\x61\x54\xe7\x39\x4d\x2f\x09\x85\x92\x3d\x6d\x8c\x2e\x2f\x6f\xa7\xea\x3f\x35\x37\x45\x71\xcb\x05\x83\x8b\x79\x5a\x79\x3a\x30\xa8\xbc\x85\xce\x9d\xf2\xfc\x73\x35\x43\xa5\x9e\xed\x72\x1e\x4a\x86\x91\xa9\x77\x72\x32\xe9\x5b\x7e\xd7\xb1\x5b\xdf\x4a\x40\xf1\x1b\xb9\x18\x90\x37\xf0\x2c\x3d\xec\xc6\x61\x40\xbf\xce\xdf\x94\x8f\xfc\x49\xf9\x98\xbf\xc0\xf2\xb2\x40\x84\x2f\xc3\xb8\xcf\xa8\xff\xb1\x4d\xef\x0c\xda\xb5\xd0\xd9\x3c\x7b\xc6\x0f\x7c\xa9\x30\x5f\x58\x64\x8d\xac\xb5\x1d\xc6\x8b\x6b\x0a\xc5\xb3\xd6\x34\x55\x3e\x83\x2f\xab\x5f\xd0\x18\x47\x4e\xf5\xbb\xf3\xa6\xa1\x87\x9f\x1d\xff\x7e\xa1\xfc\xea\xeb\xe2\xac\xc7\x30\x1a\x62\xfa\xcb\x57\xb9\xd6\x20\xb3\xe8\xed\x91\xa2\x77\x50\xda\x87\xf5\x25\xf6\x0d\x34\x3c\xc3\xf3\x7f\xba\x5d\x2a\xeb\x48\x93\x1d\xb1\x46\xce\x64\x27\x20\xfa\x2f\x52\xe2\x2d\xb5\x0d\xe8\xe3\x5a\x48\x6e\xe1\xb8\x99\x60\x48\xd2\xe5\xdf\xa4\x2e\x81\xbc\xd2\x43\xeb\xdc\x5a\xf9\x83\x1c\x9e\x12\xd7\x2e\xa7\x70\xfe\xc4\x27\x96\x2b\x80\x55\x2b\xe2\x27\x8f\x29\xe5\xe7\xd5\x98\x3d\x7d\xcd\xaa\x5e\x6d\x52\x2c\x7e\x07\x3f\x62\xab\x48\x51\x43\xbe\x74\x5d\x24\x17\x5e\x5e\xa7\x0f\xdb\xa9\x9d\x69\xd2\x89\x4a\x91\x3b\xcb\x28\xc9\x3e\x68\xb8\x6c\x54\x13\xaa\x35\x25\xf9\xf9\x3a\xcc\x3a\xdf\x2b\x33\x2d\x7b\x3d\x82\xc7\xc1\xc1\x68\x1b\xf4\x50\xa5\x68\xc9\xd7\xaa\xd5\x26\x5f\xb8\x81\x0a\x05\xf5\x74\xf9\xd2\x77\xda\xc7\x5f\x62\x77\x6d\xab\x6b\xad\x0c\xcd\x8c\xd6\xa2\x81\x4f\x1d\x7a\xfc\xbc\xee\x62\x1c\xc2\xee\xe6\xe6\xa0\x63\x37\xee\x49\x03\x72\x7f\xfb\x54\x26\xd3\x44\xef\x69\x3a\xb5\xe1\x38\x95\x0b\x68\x78\xab\xac\x3a\xa0\xcf\xf7\xd0\xdc\x29\x70\xa3\x08\xfb\x51\x9b\xc8\x9e\x24\x90\xbd\x40\x5e\xd5\x6c\x6d\x8f\xee\x1e\xe7\xbd\x59\xf5\xcf\x0c\x5f\x96\x65\x35\x35\xf0\xa2\xf2\xb4\x3b\xd2\x4d\x7e\x1f\x26\x3c\x63\xc0\x59\xfb\x55\xfa\x5c\x5d\x74\x89\xdc\x42\x64\x2e\x5a\x8c\x75\x87\x61\xd2\x18\x2f\x94\xd3\x38\x4d\x42\x06\x58\x4f\x97\x3c\x7c\x77\x7e\x5e\x2c\xd7\xb3\x44\x18\x15\x0d\x08\x9b\xd4\x20\xeb\xc8\xf7\x49\x41\x2e\x94\x4a\x78\x71\xce\x7e\xb0\x4d\x16\xe5\x45\xc2\x02\xe6\x71\xab\x4c\x84\xd3\xd5\x5f\xa1\x22\xfc\x3d\xd3\xf0\x40\x30\x75\x6d\x4d\x23\x35\xcd\x9d\xf8\xe2\xcd\x37\x4f\x07\xe5\xe3\x79\x16\x91\x7b\x25\xbe\x89\xab\x04\x4f\xfe\x52\xe5\x9d\x1d\xf9\x6c\xc6\x27\x2b\x57\x9e\xf8\xed\xfd\x05\xc2\xc9\xed\xc8\x01\x8c\x3b\xf1\xa0\xaf\x8c\x91\xa5\x43\xec\xbc\x1b\x0f\x62\xde\x6b\x5f\x98\xcc\x2e\x1f\xc8\xd9\x27\xe2\x65\xee\x61\x16\x75\x7b\x18\xf7\x46\x87\x6e\x6e\xaf\xe9\x33\x4f\x34\x0d\x52\x30\xd0\x00\x90\xd5\x29\x10\x52\xbc\xd3\x26\x66\x1c\x78\xe1\xb1\xfc\x07\x03\xce\x1a\x6d\x11\xd6\xd1\xc1\x2b\xd6\x31\x0c\x7c\x8f\xae\xf6\xe6\xbc\x61\xf9\xa5\x96\x56\xc4\x5b\xf9\x47\xa0\x6a\x42\xd5\x2a\x2d\x59\xb9\x42\xca\x1e\x50\xf6\xf1\x24\x4e\x91\x3d\x83\x13\xea\x45\x5b\x32\xdd\x6f\xd9\x9c\x40\xa4\x47\x20\xc4\xc5\xa7\x2f\x05\xc0\x8a\x7a\xde\xd5\x0e\x56\x72\x84\xca\xeb\x6a\x4b\xef\x7f\x44\xf9\x97\x19\xda\x59\xfa\x3c\xdf\x94\x59\x5d\x73\xfd\xae\x75\xa0\xcc\x33\x41\xf1\xb5\x5a\xb6\x8e\xe0\xb8\x53\x87\xb0\xda\xc1\xa7\xd5\x70\x8e\x9d\xb3\x94\x15\x29\x23\x69\x7b\x58\x7d\x66\x80\xdf\xd0\x07\x4a\xf5\x04\xc4\x49\xf6\x4b\xca\xd3\xf9\x0b\x91\xfe\x47\xf9\x43\xf9\x03\x23\xe4\x2f\xbf\x7a\x43\x6f\x1f\xc9\x22\x63\xc0\xec\xa2\x37\xca\xd7\x9d\x3e\xe2\xcd\x91\x4f\x97\xff\xa3\x87\x19\xc3\x47\xfc\xcf\xa8\x3d\x49\xfd\x65\x2a\x0b\x2b\xf6\x73\x42\xfc\xcf\x67\x74\xe4\xbf\x56\xe9\x93\x54\x30\xfa\xff\xcf\xc5\xd7\xcf\xd3\xcd\xbb\xe5\x1b\x4c\xf2\x0c\x1a\x25\xd3\x7e\x1f\xfe\x7e\xe8\x28\x69\x71\x55\x72\x6f\x6e\x95\x0a\xaf\x4e\x17\x96\x97\x71\xea\xba\xbd\xe5\x24\x1d\x08\xe9\x99\x9b\xaa\x5e\xdd\x23\x8c\x43\x23\xff\x12\x67\xe1\xf7\x27\xe7\xef\xb7\xe9\xfa\xd6\x87\x08\xec\x7a\xae\x5d\xe2\x0a\xf3\x1d\x76\x72\xda\x85\x63\xc1\x51\x8c\x90\xe7\xfd\xec\x55\xeb\x37\x1c\x1f\x9d\x0e\x3b\xa8\x7e\xfb\xe9\xe3\xed\xeb\xf7\xef\xe0\x59\x36\x54\xb5\x29\x3e\x18\x54\x01\x85\xb1\x30\x7a\xcc\x8d\xd2\xa7\x80\xfd\x11\xbd\x94\x80\xdd\xcd\x8d\xfc\x2c\x9d\x3f\xdc\x6c\xd8\x79\x13\x41\x6a\x52\x8a\xff\x0b\x00\x00\xff\xff\x66\xdf\x82\x75\x76\x24\x00\x00") func runtimeHelpPluginsMdBytes() ([]byte, error) { return bindataRead( diff --git a/runtime/help/defaultkeys.md b/runtime/help/defaultkeys.md index fe669d50..177ea025 100644 --- a/runtime/help/defaultkeys.md +++ b/runtime/help/defaultkeys.md @@ -1,224 +1,126 @@ -#Default Keys +# Default Keys Below are simple charts of the default hotkeys and their functions. For more information about binding custom hotkeys or changing -default bindings, please run `>help keybindings` +default bindings, please run `> help keybindings` Please remember that *all* keys here are rebindable! If you don't like it, you can change it! -(We are not responsible for you forgetting what you bind keys to. - Do not open an issue because you forgot your keybindings.) +# Power user -#Power user -+--------+---------------------------------------------------------+ -| Key | Description of function | -+--------+---------------------------------------------------------+ -| Ctrl+E | Switch to the micro command prompt to run a command. | -| | (See `>help commands` for a list of commands. ) | -+--------+---------------------------------------------------------+ -| Tab | In command prompt it will auto complete if possible. | -+--------+---------------------------------------------------------+ -| Ctrl+B | Run shell commands in micro's current working directory.| -+--------+---------------------------------------------------------+ +| Key | Description of function | +|-------- |-------------------------------------------------------------------------------------------------- | +| Ctrl+E | Open a command prompt for running commands (see `> help commands` for a list of valid commands). | +| Tab | In command prompt, it will autocomplete if possible. | +| Ctrl+B | Run a shell command (this will close micro while your command executes). | -#Navigation -|--------+---------------------------------------------------------+ -| Arrows | Move the cursor around your current document. | -| | (Yes this is rebindable to the vim keys if you want.) | -+--------+---------------------------------------------------------+ -| Shift+ | Move and select text. | -| Arrows | | -+--------+---------------------------------------------------------+ -| Home | | -| or | | -| Ctrl+ | Move to the beginning of the current line. (Naturally.) | -| Left | | -| Arrow | | -+--------+---------------------------------------------------------+ -| End | | -| or | | -| Ctrl+ | Move to the end of the current line. | -| Right | | -| Arrow | | -+--------+---------------------------------------------------------+ -| Alt+ | | -| Left | Move cursor one complete word left. | -| Arrow | | -+--------+---------------------------------------------------------+ -| Alt+ | | -| Right | Move cursor one complete word right. | -| Arrow | | -+--------+---------------------------------------------------------+ -| PageUp | Move cursor up lines quickly. | -+--------+---------------------------------------------------------+ -| PageDn | Move cursor down lines quickly. | -+--------+---------------------------------------------------------+ -| Ctrl+ | | -| Home | | -| or | Move cursor to start of the document | -| Ctrl+ | | -| Up | | -| Arrow | | -+--------+---------------------------------------------------------+ -| Ctrl+ | | -| End | | -| or | Move cursor to end of the document | -| Ctrl+ | | -| Down | | -| Arrow | | -+--------+---------------------------------------------------------+ -| Ctrl+L | Jump to line in current file. ( Prompts for line # ) | -+--------+---------------------------------------------------------+ -| Ctrl+W | Move between splits open in current tab. | -| | (See vsplit and hsplit in `>help commands`) | -+--------+---------------------------------------------------------+ +# Navigation -#Tabs -+--------+---------------------------------------------------------+ -| Ctrl+T | Open a new tab. | -+--------+---------------------------------------------------------+ -| Alt+, | Move to the previous tab in the tablist. | -| | (This works like moving between file buffers in nano) | -+--------+---------------------------------------------------------+ -| Alt+. | Move to the next tab in the tablist. | -+--------+---------------------------------------------------------+ +| Key | Description of function | +|-------------------------- |------------------------------------------------------------------------------------------ | +| Arrows | Move the cursor around | +| Shift+arrows | Move and select text | +| Home or CtrlLeftArrow | Move to the beginning of the current line | +| End or CtrlRightArrow | Move to the end of the current line | +| AltLeftArrow | Move cursor one word left | +| AltRightArrow | Move cursor one word right | +| PageUp | Move cursor up one page | +| PageDown | Move cursor down one page | +| CtrlHome or CtrlUpArrow | Move cursor to start of document | +| CtrlEnd or CtrlDownArrow | Move cursor to end of document | +| Ctrl+L | Jump to a line in the file (prompts with #) | +| Ctrl+W | Cycle between splits in the current tab (use `> vsplit` or `> hsplit` to create a split) | -#Find Operations -+--------+---------------------------------------------------------+ -| Ctrl+F | Find text in current file. ( Prompts for text to find.) | -+--------+---------------------------------------------------------+ -| Ctrl+N | Find next instance of current search in current file. | -+--------+---------------------------------------------------------+ -| Ctrl+P | Find prev instance of current search in current file. | -+--------+---------------------------------------------------------+ +# Tabs -#File Operations -+--------+---------------------------------------------------------+ -| Ctrl+Q | Close current file. ( Quits micro if last file open. ) | -+--------+---------------------------------------------------------+ -| Ctrl+O | Open a file. ( Prompts you to input filename. ) | -+--------+---------------------------------------------------------+ -| Ctrl+S | Save current file. | -+--------+---------------------------------------------------------+ +| Key | Description of function | +|-------- |------------------------- | +| Ctrl+T | Open a new tab | +| Alt+, | Previous tab | +| Alt+. | Next tab | -#Text operations -+--------+---------------------------------------------------------+ -| Ctrl+A | Select all text in current file. | -+--------+---------------------------------------------------------+ -| Alt+ | | -| Shift+ | Select complete word right. | -| Right | | -| Arrow | | -+--------+---------------------------------------------------------+ -| Alt+ | | -| Shift+ | Select complete word left. | -| Left | | -| Arrow | | -+--------+---------------------------------------------------------+ -| Shift+ | | -| Home | | -| or | Select from the current cursor position to the | -| Ctrl+ | start of the current line. | -| Shift+ | | -| Left | | -| Arrow | | -+--------+---------------------------------------------------------+ -| Shift+ | | -| End | | -| or | Select from the current cursor position to the | -| Ctrl+ | end of the current line. | -| Shift+ | | -| Right | | -| Arrow | | -+--------+---------------------------------------------------------+ -| Ctrl+ | | -| Shift+ | Select from the current cursor position to the | -| Up | start of the document. | -| Arrow | | -+--------+---------------------------------------------------------+ -| Ctrl+ | | -| Shift+ | Select from the current cursor position to the | -| Down | end of the document. | -| Arrow | | -+--------+---------------------------------------------------------+ -| Ctrl+X | Cut selected text. | -+--------+---------------------------------------------------------+ -| Ctrl+C | Copy selected text. | -+--------+---------------------------------------------------------+ -| Ctrl+V | Paste selected text. | -+--------+---------------------------------------------------------+ -| Ctrl+K | Cut current line. ( Can then be pasted with Ctrl+V) | -+--------+---------------------------------------------------------+ -| Ctrl+D | Duplicate current line. | -+--------+---------------------------------------------------------+ -| Ctrl+Z | Undo actions. | -+--------+---------------------------------------------------------+ -| Ctrl+Y | Redo actions. | -+--------+---------------------------------------------------------+ -| Alt+ | | -| Up | Move current line or selected lines up. | -| Arrow | | -+--------+---------------------------------------------------------+ -| Alt+ | | -| Down | Move current line or selected lines down. | -| Arrow | | -+--------+---------------------------------------------------------+ -| Alt+ | | -| Ctrl+H | | -| or | Delete complete word left. | -| Alt+ | | -| Back- | | -| space | | -+--------+---------------------------------------------------------+ +# Find Operations -#Macros -+--------+---------------------------------------------------------+ -| | Toggle ON/OFF macro recording. | -| Ctrl+U | Simply press Ctrl+U to begin recording a macro and | -| | press Ctrl+U to stop recording macro. | -+--------+---------------------------------------------------------+ -| Ctrl+J | Run your recorded macro. | -+--------+---------------------------------------------------------+ +| Key | Description of function | +|-------- |------------------------------------------ | +| Ctrl+F | Find (opens prompt) | +| Ctrl+N | Find next instance of current search | +| Ctrl+P | Find previous instance of current search | -#Other -+--------+---------------------------------------------------------+ -| Ctrl+G | Open the help file. | -+--------+---------------------------------------------------------+ -| Ctrl+H | Alternate backspace. | -| | (Some old terminals don't support the Backspace key .) | -+--------+---------------------------------------------------------+ -| Ctrl+R | Toggle the line number ruler. ( On the lefthand side.) | -+--------+---------------------------------------------------------+ +# File Operations -#Emacs style actions -+--------+---------------------------------------------------------+ -| Alt+F | Move to the end of the next word. (To the next space.) | -+--------+---------------------------------------------------------+ -| Alt+B | Move to the beginning of the previous word. | -+--------+---------------------------------------------------------+ -| Alt+A | Alternate Home key. ( Move to beginning of line. ) | -+--------+---------------------------------------------------------+ -| Alt+E | Alternate End key. ( Move to the end of line.) | -+--------+---------------------------------------------------------+ -| Alt+P | Move cursor up. ( Same as up key. ) | -+--------+---------------------------------------------------------+ -| Alt+N | Move cursor down. ( Same as down key. ) | -+--------+---------------------------------------------------------+ +| Key | Description of function | +|-------- |---------------------------------------------------------------- | +| Ctrl+Q | Close current file (quits micro if this is the last file open) | +| Ctrl+O | Open a file (prompts for filename) | +| Ctrl+S | Save current file | + +# Text operations + +| Key | Description of function | +|--------------------------------- |------------------------------------------ | +| AltShiftRightArrow | Select word right | +| AltShiftLeftArrow | Select word left | +| ShiftHome or CtrlShiftLeftArrow | Select to start of current line | +| ShiftEnd or CtrlShiftRightArrow | Select to end of current line | +| CtrlShiftUpArrow | Select to start of file | +| CtrlShiftDownArrow | Select to end of file | +| Ctrl+X | Cut selected text | +| Ctrl+C | Copy selected text | +| Ctrl+V | Paste | +| Ctrl+K | Cut current line | +| Ctrl+D | Duplicate current line | +| Ctrl+Z | Undo | +| Ctrl+Y | Redo | +| AltUpArrow | Move current line or selected lines up | +| AltDownArrow | Move current line of selected lines down | +| AltBackspace or AltCtrl+H | Delete word left | +| Ctrl+A | Select all | + +# Macros + +| Key | Description of function | +|-------- |---------------------------------------------------------------------------------- | +| Ctrl+U | Toggle macro recording (press Ctrl+U to start recording and press again to stop) | +| Ctrl+J | Run latest recorded macro | + +# Multiple cursors + +| Key | Description of function | +|---------------- |---------------------------------------------------------------------------------------------- | +| Alt+N | Create new multiple cursor from selection (will select current word if no current selection) | +| Alt+P | Remove latest multiple cursor | +| Alt+C | Remove all multiple cursors (cancel) | +| Alt+X | Skip multiple cursor selection | +| Ctrl-MouseLeft | Place a multiple cursor at any location | + +# Other + +| Key | Description of function | +|-------- |----------------------------------------------------------------------------------- | +| Ctrl+G | Open help file | +| Ctrl+H | Backspace (old terminals do not support the backspace key and use Ctrl+H instead) | +| Ctrl+R | Toggle the line number ruler | + +# Emacs style actions + +| Key | Description of function | +|------- |------------------------- | +| Alt+F | Next word | +| Alt+B | Previous word | +| Alt+A | Move to start of line | +| Alt+E | Move to end of line | + +# Function keys. -#Function keys. Warning! The function keys may not work in all terminals! -+--------+---------------------------------------------------------+ -| F1 | Open help. | -+--------+---------------------------------------------------------+ -| F2 | Save current file. | -+--------+---------------------------------------------------------+ -| F3 | Find in current file. ( Same as Ctrl+F ) | -+--------+---------------------------------------------------------+ -| F4 | Close current file. (Quit if only file.) | -+--------+---------------------------------------------------------+ -| F7 | Find in current file. (Same as Ctrl+F) | -+--------+---------------------------------------------------------+ -| F10 | Close current file. | -+--------+---------------------------------------------------------+ +| Key | Description of function | +|----- |------------------------- | +| F1 | Open help | +| F2 | Save | +| F3 | Find | +| F4 | Quit | +| F7 | Find | +| F10 | Quit | diff --git a/runtime/help/keybindings.md b/runtime/help/keybindings.md index ffda1444..ddc81de9 100644 --- a/runtime/help/keybindings.md +++ b/runtime/help/keybindings.md @@ -131,9 +131,22 @@ HSplit PreviousSplit ToggleMacro PlayMacro +Suspend (Linux only) +ScrollUp +ScrollDown +SpawnMultiCursor +RemoveMultiCursor +RemoveAllMultiCursors +SkipMultiCursor UnbindKey ``` +You can also bind some mouse actions (these must be bound to mouse buttons) +``` +MousePress +MouseMultiCursor +``` + Here is the list of all possible keys you can bind: ``` @@ -262,6 +275,18 @@ Escape Enter ``` +You can also bind some mouse buttons (they may be bound to normal actions or mouse actions) + +``` +MouseLeft +MouseMiddle +MouseRight +MouseWheelUp +MouseWheelDown +MouseWheelLeft +MouseWheelRight +``` + # Default keybinding configuration. ```json @@ -276,10 +301,10 @@ Enter "ShiftRight": "SelectRight", "AltLeft": "WordLeft", "AltRight": "WordRight", - "AltShiftRight": "SelectWordRight", - "AltShiftLeft": "SelectWordLeft", "AltUp": "MoveLinesUp", "AltDown": "MoveLinesDown", + "AltShiftRight": "SelectWordRight", + "AltShiftLeft": "SelectWordLeft", "CtrlLeft": "StartOfLine", "CtrlRight": "EndOfLine", "CtrlShiftLeft": "SelectToStartOfLine", @@ -291,13 +316,12 @@ Enter "CtrlShiftUp": "SelectToStart", "CtrlShiftDown": "SelectToEnd", "Enter": "InsertNewline", - "Space": "InsertSpace", "CtrlH": "Backspace", "Backspace": "Backspace", "Alt-CtrlH": "DeleteWordLeft", "Alt-Backspace": "DeleteWordLeft", "Tab": "IndentSelection,InsertTab", - "Backtab": "OutdentSelection", + "Backtab": "OutdentSelection,OutdentLine", "CtrlO": "OpenFile", "CtrlS": "Save", "CtrlF": "Find", @@ -336,8 +360,6 @@ Enter "Alt-b": "WordLeft", "Alt-a": "StartOfLine", "Alt-e": "EndOfLine", - "Alt-p": "CursorUp", - "Alt-n": "CursorDown", // Integration with file managers "F1": "ToggleHelp", @@ -347,10 +369,23 @@ Enter "F7": "Find", "F10": "Quit", "Esc": "Escape", + + // Mouse bindings + "MouseWheelUp": "ScrollUp", + "MouseWheelDown": "ScrollDown", + "MouseLeft": "MousePress", + "MouseMiddle": "PastePrimary", + "Ctrl-MouseLeft": "MouseMultiCursor", + + // Multiple cursors bindings + "Alt-n": "SpawnMultiCursor", + "Alt-p": "RemoveMultiCursor", + "Alt-c": "RemoveAllMultiCursors", + "Alt-x": "SkipMultiCursor", } ``` -#Final notes +# Final notes Note: On some old terminal emulators and on Windows machines, `CtrlH` should be used for backspace. diff --git a/runtime/help/plugins.md b/runtime/help/plugins.md index d7fc5abf..e79c3cc7 100644 --- a/runtime/help/plugins.md +++ b/runtime/help/plugins.md @@ -21,6 +21,16 @@ This is almost always the current view, which you can get with `CurView()` as we All available actions are listed in the keybindings section of the help. +For callbacks to mouse actions, you are also given the event info: + +```lua +function onMousePress(view, event) + local x, y = event:Position() + + return false +end +``` + These functions should also return a boolean specifying whether the view should be relocated to the cursor or not after the action is complete. @@ -156,25 +166,25 @@ See this example to learn how to use `MakeCompletion` and `MakeCommand` ```lua local function StartsWith(String,Start) - String = String:upper() - Start = Start:upper() - return string.sub(String,1,string.len(Start))==Start + String = String:upper() + Start = Start:upper() + return string.sub(String,1,string.len(Start))==Start end function complete(input) - local allCompletions = {"Hello", "World", "Foo", "Bar"} - local result = {} - - for i,v in pairs(allCompletions) do - if StartsWith(v, input) then - table.insert(result, v) - end - end - return result + local allCompletions = {"Hello", "World", "Foo", "Bar"} + local result = {} + + for i,v in pairs(allCompletions) do + if StartsWith(v, input) then + table.insert(result, v) + end + end + return result end function foo(arg) - messenger:Message(arg) + messenger:Message(arg) end MakeCommand("foo", "example.foo", MakeCompletion("example.complete"))