From c16ea89679f2d1e13fd96393814338f596ce16a0 Mon Sep 17 00:00:00 2001 From: anoshenko Date: Thu, 9 Sep 2021 12:08:31 +0300 Subject: [PATCH] Added demo --- .gitignore | 1 - demo/absoluteLayoutDemo.go | 16 + demo/audioPlayerDemo.go | 142 +++++++++ demo/backgroundDemo.go | 81 +++++ demo/canvasDemo.go | 334 ++++++++++++++++++++ demo/checkboxDemo.go | 69 +++++ demo/clipDemo.go | 54 ++++ demo/columnLayoutDemo.go | 139 +++++++++ demo/controlsDemo.go | 148 +++++++++ demo/editDemo.go | 70 +++++ demo/filterDemo.go | 170 ++++++++++ demo/gridLayoutDemo.go | 103 ++++++ demo/imageViewDemo.go | 63 ++++ demo/keyEventsDemo.go | 57 ++++ demo/listLayoutDemo.go | 90 ++++++ demo/listViewDemo.go | 95 ++++++ demo/main.go | 163 ++++++++++ demo/mouseEventsDemo.go | 111 +++++++ demo/pointerEventsDemo.go | 129 ++++++++ demo/popupDemo.go | 86 ++++++ demo/resizableDemo.go | 79 +++++ demo/resources/images/A.png | Bin 0 -> 14656 bytes demo/resources/images/A@2x.png | Bin 0 -> 6556 bytes demo/resources/images/cat.jpg | Bin 0 -> 49922 bytes demo/resources/images/cat@2x.jpg | Bin 0 -> 49922 bytes demo/resources/images/gifsInEmail.gif | Bin 0 -> 143278 bytes demo/resources/images/icon.svg | 73 +++++ demo/resources/images/image_sample.png | Bin 0 -> 143 bytes demo/resources/images/image_sample@2x.png | Bin 0 -> 257 bytes demo/resources/images/image_sample@3x.png | Bin 0 -> 325 bytes demo/resources/images/menu_icon.svg | 64 ++++ demo/resources/images/mountain.svg | 94 ++++++ demo/resources/images/tile00.svg | 65 ++++ demo/resources/images/tile00_50.png | Bin 0 -> 1128 bytes demo/resources/images/tile00_50@2x.png | Bin 0 -> 2307 bytes demo/resources/images/tile00_50@3x.png | Bin 0 -> 3457 bytes demo/resources/images/tile01.svg | 65 ++++ demo/resources/images/tile01_50.png | Bin 0 -> 1154 bytes demo/resources/images/tile01_50@2x.png | Bin 0 -> 2327 bytes demo/resources/images/tile01_50@3x.png | Bin 0 -> 3549 bytes demo/resources/images/tile02.svg | 65 ++++ demo/resources/images/tile02_50.png | Bin 0 -> 1132 bytes demo/resources/images/tile02_50@2x.png | Bin 0 -> 2254 bytes demo/resources/images/tile02_50@3x.png | Bin 0 -> 3389 bytes demo/resources/images/tile03.svg | 65 ++++ demo/resources/images/tile03_50.png | Bin 0 -> 959 bytes demo/resources/images/tile03_50@2x.png | Bin 0 -> 1910 bytes demo/resources/images/tile03_50@3x.png | Bin 0 -> 2884 bytes demo/resources/images/winds.png | Bin 0 -> 18925 bytes demo/resources/strings/ru.rui | 34 ++ demo/resources/themes/default.rui | 88 ++++++ demo/splitViewDemo.go | 26 ++ demo/stackLayoutDemo.go | 95 ++++++ demo/tableDemo.go | 206 ++++++++++++ demo/tabsDemo.go | 48 +++ demo/textStyle.go | 143 +++++++++ demo/touchEventsDemo.go | 122 ++++++++ demo/transformDemo.go | 361 ++++++++++++++++++++++ demo/transitionDemo.go | 70 +++++ demo/videoPlayerDemo.go | 152 +++++++++ demo/viewDemo.go | 116 +++++++ 61 files changed, 4151 insertions(+), 1 deletion(-) create mode 100644 demo/absoluteLayoutDemo.go create mode 100644 demo/audioPlayerDemo.go create mode 100644 demo/backgroundDemo.go create mode 100644 demo/canvasDemo.go create mode 100644 demo/checkboxDemo.go create mode 100644 demo/clipDemo.go create mode 100644 demo/columnLayoutDemo.go create mode 100644 demo/controlsDemo.go create mode 100644 demo/editDemo.go create mode 100644 demo/filterDemo.go create mode 100644 demo/gridLayoutDemo.go create mode 100644 demo/imageViewDemo.go create mode 100644 demo/keyEventsDemo.go create mode 100644 demo/listLayoutDemo.go create mode 100644 demo/listViewDemo.go create mode 100644 demo/main.go create mode 100644 demo/mouseEventsDemo.go create mode 100644 demo/pointerEventsDemo.go create mode 100644 demo/popupDemo.go create mode 100644 demo/resizableDemo.go create mode 100644 demo/resources/images/A.png create mode 100644 demo/resources/images/A@2x.png create mode 100644 demo/resources/images/cat.jpg create mode 100644 demo/resources/images/cat@2x.jpg create mode 100644 demo/resources/images/gifsInEmail.gif create mode 100644 demo/resources/images/icon.svg create mode 100644 demo/resources/images/image_sample.png create mode 100644 demo/resources/images/image_sample@2x.png create mode 100644 demo/resources/images/image_sample@3x.png create mode 100644 demo/resources/images/menu_icon.svg create mode 100644 demo/resources/images/mountain.svg create mode 100644 demo/resources/images/tile00.svg create mode 100644 demo/resources/images/tile00_50.png create mode 100644 demo/resources/images/tile00_50@2x.png create mode 100644 demo/resources/images/tile00_50@3x.png create mode 100644 demo/resources/images/tile01.svg create mode 100644 demo/resources/images/tile01_50.png create mode 100644 demo/resources/images/tile01_50@2x.png create mode 100644 demo/resources/images/tile01_50@3x.png create mode 100644 demo/resources/images/tile02.svg create mode 100644 demo/resources/images/tile02_50.png create mode 100644 demo/resources/images/tile02_50@2x.png create mode 100644 demo/resources/images/tile02_50@3x.png create mode 100644 demo/resources/images/tile03.svg create mode 100644 demo/resources/images/tile03_50.png create mode 100644 demo/resources/images/tile03_50@2x.png create mode 100644 demo/resources/images/tile03_50@3x.png create mode 100644 demo/resources/images/winds.png create mode 100644 demo/resources/strings/ru.rui create mode 100644 demo/resources/themes/default.rui create mode 100644 demo/splitViewDemo.go create mode 100644 demo/stackLayoutDemo.go create mode 100644 demo/tableDemo.go create mode 100644 demo/tabsDemo.go create mode 100644 demo/textStyle.go create mode 100644 demo/touchEventsDemo.go create mode 100644 demo/transformDemo.go create mode 100644 demo/transitionDemo.go create mode 100644 demo/videoPlayerDemo.go create mode 100644 demo/viewDemo.go diff --git a/.gitignore b/.gitignore index fe31f76..97610c7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,6 @@ *.dll *.so *.dylib -demo # Test binary, build with `go test -c` *.test diff --git a/demo/absoluteLayoutDemo.go b/demo/absoluteLayoutDemo.go new file mode 100644 index 0000000..af17eac --- /dev/null +++ b/demo/absoluteLayoutDemo.go @@ -0,0 +1,16 @@ +package main + +import ( + "github.com/anoshenko/rui" +) + +const absoluteLayoutDemoText = ` +AbsoluteLayout { + width = 100%, height = 100%, + content = [ View { id = view1, width = 32px, height = 32px, left = 100px, top = 200px, background-color = #FF0000FF } ] +} +` + +func createAbsoluteLayoutDemo(session rui.Session) rui.View { + return rui.CreateViewFromText(session, absoluteLayoutDemoText) +} diff --git a/demo/audioPlayerDemo.go b/demo/audioPlayerDemo.go new file mode 100644 index 0000000..6b722d4 --- /dev/null +++ b/demo/audioPlayerDemo.go @@ -0,0 +1,142 @@ +package main + +import ( + "fmt" + + "github.com/anoshenko/rui" +) + +const audioPlayerDemoText = ` +GridLayout { + cell-height = "auto, auto, 1fr, auto", width = 100%, height = 100%, + content = [ + ListLayout { + row = 0, orientation = start-to-end, padding = 4px, + content = [ + Checkbox { + id = showAudioPlayerControls, content = "Controls" + }, + Checkbox { + id = showAudioPlayerLoop, content = "Loop" + }, + Checkbox { + id = showAudioPlayerMuted, content = "Muted" + }, + ], + }, + AudioPlayer { + row = 1, id = audioPlayer, src = "https://alxanosoft.com/jazzy-loop-1.mp3", + }, + ListLayout { + row = 2, orientation = start-to-end, vertical-align = top, padding = 8px, + content = [ + NumberPicker { + id = audioPlayerSlider, width = 200px, type = slider + } + Button { + id = audioPlayerPlay, content = "Play", margin-left = 16px + } + ] + }, + Resizable { + row = 3, side = top, background-color = lightgrey, height = 200px, + content = EditView { + id = audioPlayerEventsLog, type = multiline, read-only = true, wrap = true, + } + }, + ] +}` + +var audioPlayerPause = true + +func createAudioPlayerDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, audioPlayerDemoText) + if view == nil { + return nil + } + + createListener := func(event string) func() { + return func() { + rui.AppendEditText(view, "audioPlayerEventsLog", event+"\n") + rui.ScrollViewToEnd(view, "audioPlayerEventsLog") + } + } + createListener2 := func(event string) func(value float64) { + return func(value float64) { + rui.AppendEditText(view, "audioPlayerEventsLog", fmt.Sprintf("%s: %g\n", event, value)) + rui.ScrollViewToEnd(view, "audioPlayerEventsLog") + } + } + + rui.Set(view, "showAudioPlayerControls", rui.CheckboxChangedEvent, func(state bool) { + rui.Set(view, "audioPlayer", rui.Controls, state) + }) + + rui.Set(view, "showAudioPlayerLoop", rui.CheckboxChangedEvent, func(state bool) { + rui.Set(view, "audioPlayer", rui.Loop, state) + }) + + rui.Set(view, "showAudioPlayerMuted", rui.CheckboxChangedEvent, func(state bool) { + rui.Set(view, "audioPlayer", rui.Muted, state) + }) + + for _, event := range []string{rui.AbortEvent, rui.CanPlayEvent, rui.CanPlayThroughEvent, + rui.CompleteEvent, rui.EmptiedEvent, rui.EndedEvent, rui.LoadStartEvent, + rui.LoadedMetadataEvent, rui.PlayingEvent, rui.SeekedEvent, rui.SeekingEvent, + rui.StalledEvent, rui.SuspendEvent, rui.WaitingEvent} { + + rui.Set(view, "audioPlayer", event, createListener(event)) + } + + for _, event := range []string{rui.DurationChangedEvent, rui.RateChangedEvent, rui.VolumeChangedEvent} { + + rui.Set(view, "audioPlayer", event, createListener2(event)) + } + + rui.Set(view, "audioPlayer", rui.PlayEvent, func() { + rui.AppendEditText(view, "audioPlayerEventsLog", "play-event\n") + rui.ScrollViewToEnd(view, "audioPlayerEventsLog") + rui.Set(view, "audioPlayerPlay", rui.Content, "Pause") + audioPlayerPause = false + }) + + rui.Set(view, "audioPlayer", rui.PauseEvent, func() { + rui.AppendEditText(view, "audioPlayerEventsLog", "pause-event\n") + rui.ScrollViewToEnd(view, "audioPlayerEventsLog") + rui.Set(view, "audioPlayerPlay", rui.Content, "Play") + audioPlayerPause = true + }) + + rui.Set(view, "audioPlayer", rui.LoadedDataEvent, func() { + rui.AppendEditText(view, "audioPlayerEventsLog", "loaded-data-event\n") + rui.ScrollViewToEnd(view, "audioPlayerEventsLog") + rui.Set(view, "audioPlayerSlider", rui.Max, rui.MediaPlayerDuration(view, "audioPlayer")) + }) + + rui.Set(view, "audioPlayer", rui.TimeUpdateEvent, func(time float64) { + rui.AppendEditText(view, "audioPlayerEventsLog", fmt.Sprintf("time-update-event %gs\n", time)) + rui.ScrollViewToEnd(view, "audioPlayerEventsLog") + rui.Set(view, "audioPlayerSlider", rui.Value, time) + }) + + rui.Set(view, "audioPlayer", rui.PlayerErrorEvent, func(code int, message string) { + rui.AppendEditText(view, "audioPlayerEventsLog", fmt.Sprintf("player-error-event: code = %d, message = '%s'\n", code, message)) + rui.ScrollViewToEnd(view, "audioPlayerEventsLog") + }) + + rui.Set(view, "audioPlayerPlay", rui.ClickEvent, func() { + if audioPlayerPause { + rui.MediaPlayerPlay(view, "audioPlayer") + } else { + rui.MediaPlayerPause(view, "audioPlayer") + } + }) + + rui.Set(view, "audioPlayerSlider", rui.NumberChangedEvent, func(value float64) { + if audioPlayerPause { + rui.SetMediaPlayerCurrentTime(view, "audioPlayer", value) + } + }) + + return view +} diff --git a/demo/backgroundDemo.go b/demo/backgroundDemo.go new file mode 100644 index 0000000..6010b07 --- /dev/null +++ b/demo/backgroundDemo.go @@ -0,0 +1,81 @@ +package main + +import "github.com/anoshenko/rui" + +const backgroundDemoText = ` +GridLayout { + style = demoPage, + content = [ + ListLayout { + width = 100%, height = 100%, padding = 32px, + content = [ + TextView { + id = backgroundView, width = 100%, height = 150%, padding = 16px, + text = "Sample text", text-size = 4em, + border = _{ style = dotted, width = 8px, color = #FF008800 }, + background = image { src = cat.jpg } + } + ] + }, + ListLayout { + style = optionsPanel, + content = [ + GridLayout { + style = optionsTable, + content = [ + TextView { row = 0, text = "Image" }, + DropDownList { row = 0, column = 1, id = backgroundImage1, current = 0, items = ["cat.jpg", "winds.png", "gifsInEmail.gif", "mountain.svg"]}, + TextView { row = 1, text = "Fit" }, + DropDownList { row = 1, column = 1, id = backgroundFit1, current = 0, items = ["none", "contain", "cover"]}, + TextView { row = 2, text = "Horizontal align" }, + DropDownList { row = 2, column = 1, id = backgroundHAlign1, current = 0, items = ["left", "right", "center"]}, + TextView { row = 3, text = "Vertical align" }, + DropDownList { row = 3, column = 1, id = backgroundVAlign1, current = 0, items = ["top", "bottom", "center"]}, + TextView { row = 4, text = "Repeat" }, + DropDownList { row = 4, column = 1, id = backgroundRepeat1, current = 0, items = ["no-repeat", "repeat", "repeat-x", "repeat-y", "round", "space"]}, + TextView { row = 5, text = "Clip" }, + DropDownList { row = 5, column = 1, id = backgroundClip1, current = 0, items = ["padding-box", "border-box", "content-box", "text"]}, + TextView { row = 6, text = "Attachment" }, + DropDownList { row = 6, column = 1, id = backgroundAttachment1, current = 0, items = ["scroll", "fixed", "local"]}, + ] + } + ] + } + ] +} +` + +func createBackgroundDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, backgroundDemoText) + if view == nil { + return nil + } + + updateBackground1 := func(list rui.DropDownList, number int) { + images := []string{"cat.jpg", "winds.png", "gifsInEmail.gif", "mountain.svg"} + image := rui.NewBackgroundImage(rui.Params{ + rui.Source: images[rui.GetDropDownCurrent(view, "backgroundImage1")], + rui.Fit: rui.GetDropDownCurrent(view, "backgroundFit1"), + rui.HorizontalAlign: rui.GetDropDownCurrent(view, "backgroundHAlign1"), + rui.VerticalAlign: rui.GetDropDownCurrent(view, "backgroundVAlign1"), + rui.Repeat: rui.GetDropDownCurrent(view, "backgroundRepeat1"), + rui.BackgroundClip: rui.GetDropDownCurrent(view, "backgroundClip1"), + rui.Attachment: rui.GetDropDownCurrent(view, "backgroundAttachment1"), + }) + rui.Set(view, "backgroundView", rui.Background, image) + } + + for _, id := range []string{ + "backgroundImage1", + "backgroundFit1", + "backgroundHAlign1", + "backgroundVAlign1", + "backgroundRepeat1", + "backgroundClip1", + "backgroundAttachment1", + } { + rui.Set(view, id, rui.DropDownEvent, updateBackground1) + } + + return view +} diff --git a/demo/canvasDemo.go b/demo/canvasDemo.go new file mode 100644 index 0000000..e9ad43e --- /dev/null +++ b/demo/canvasDemo.go @@ -0,0 +1,334 @@ +package main + +import ( + "math" + "strconv" + + "github.com/anoshenko/rui" +) + +const canvasDemoText = ` +GridLayout { + width = 100%, height = 100%, cell-height = "auto, 1fr", + content = [ + DropDownList { + id = canvasType, current = 0, margin = 8px, + items = ["Image", "Rectangles & ellipse", "Text style", "Text align", "Line style", "Transformations"] + }, + CanvasView { + id = canvas, row = 1, width = 100%, height = 100%, + } + ] +} +` + +var sampleImage rui.Image + +func rectangleCanvasDemo(canvas rui.Canvas) { + width := canvas.Width() + height := canvas.Height() + + canvas.Save() + + canvas.SetSolidColorFillStyle(0xFF008000) + canvas.SetSolidColorStrokeStyle(0xFFFF0000) + w2 := width / 2 + h2 := height / 2 + canvas.FillRect(10, 10, w2-20, h2-20) + canvas.StrokeRect(9.5, 9.5, w2-19, h2-19) + + canvas.SetLinearGradientFillStyle(w2+10, 10, 0xFFFF0000, width-20, 10, 0xFF0000FF, []rui.GradientPoint{ + {Offset: 0.3, Color: 0xFFFFFF00}, + {Offset: 0.5, Color: 0xFF00FF00}, + {Offset: 0.7, Color: 0xFF00FFFF}, + }) + canvas.SetLinearGradientStrokeStyle(10, 10, 0xFFFF00FF, 10, h2-20, 0xFF00FFFF, []rui.GradientPoint{ + {Offset: 0.5, Color: 0xFF00FF00}, + }) + canvas.SetLineWidth(5) + canvas.FillAndStrokeRoundedRect(w2+7.5, 7.5, w2-15, h2-15, 20) + + canvas.SetRadialGradientFillStyle(w2/2-20, h2+h2/2-20, 10, 0xFFFF0000, w2/2+20, h2+h2/2+20, w2/2, 0xFF0000FF, []rui.GradientPoint{ + {Offset: 0.3, Color: 0xFFFFFF00}, + {Offset: 0.5, Color: 0xFF00FF00}, + {Offset: 0.7, Color: 0xFF00FFFF}, + }) + canvas.SetRadialGradientStrokeStyle(w2/2, h2+h2/2, h2/2, 0xFFFFFF00, w2/2, h2+h2/2, h2, 0xFF00FFFF, []rui.GradientPoint{ + {Offset: 0.5, Color: 0xFF00FF00}, + }) + canvas.SetLineWidth(7) + canvas.FillAndStrokeRect(10, h2+10, w2-20, h2-20) + + //canvas.SetSolidColorFillStyle(0xFF00FFFF) + canvas.SetImageFillStyle(sampleImage, rui.RepeatXY) + canvas.SetSolidColorStrokeStyle(0xFF0000FF) + canvas.SetLineWidth(4) + canvas.FillAndStrokeEllipse(w2+w2/2, h2+h2/2, w2/2-10, h2/2-10, 0) + + canvas.Restore() +} + +func textCanvasDemo(canvas rui.Canvas) { + + canvas.Save() + canvas.SetTextAlign(rui.LeftAlign) + canvas.SetTextBaseline(rui.TopBaseline) + + canvas.SetSolidColorFillStyle(0xFF000000) + canvas.FillText(10, 10, "Default font") + canvas.StrokeText(300, 10, "Default font") + + canvas.SetSolidColorFillStyle(0xFF800000) + canvas.SetSolidColorStrokeStyle(0xFF800080) + canvas.SetFont("courier", rui.Pt(12)) + canvas.FillText(10, 30, "courier, 12pt") + canvas.StrokeText(300, 30, "courier, 12pt") + + canvas.SetSolidColorFillStyle(0xFF008000) + canvas.SetSolidColorStrokeStyle(0xFF008080) + canvas.SetFontWithParams("Courier new, courier", rui.Pt(12), rui.FontParams{ + Italic: true, + }) + canvas.FillText(10, 50, `Courier new, 12pt, italic`) + canvas.StrokeText(300, 50, `Courier new, 12pt, italic`) + + canvas.SetSolidColorFillStyle(0xFF000080) + canvas.SetLinearGradientStrokeStyle(10, 70, 0xFF00FF00, 10, 90, 0xFFFF00FF, nil) + canvas.SetFontWithParams("sans-serif", rui.Pt(12), rui.FontParams{ + SmallCaps: true, + }) + canvas.FillText(10, 70, "sans-serif, 12pt, small-caps") + canvas.StrokeText(300, 70, "sans-serif, 12pt, small-caps") + + canvas.SetLinearGradientFillStyle(10, 90, 0xFFFF0000, 10, 110, 0xFF0000FF, nil) + canvas.SetSolidColorStrokeStyle(0xFF800080) + canvas.SetFontWithParams("serif", rui.Pt(12), rui.FontParams{ + Weight: 7, + }) + canvas.FillText(10, 90, "serif, 12pt, weight: 7(bold)") + canvas.StrokeText(300, 90, "serif, 12pt, weight: 7(bold)") + + widthSample := "Text width sample" + w := canvas.TextWidth(widthSample, "sans-serif", rui.Px(20)) + canvas.SetFont("sans-serif", rui.Px(20)) + canvas.SetSolidColorFillStyle(rui.Blue) + canvas.SetTextBaseline(rui.BottomBaseline) + canvas.FillText(10, 150, widthSample) + + canvas.SetSolidColorStrokeStyle(rui.Black) + canvas.SetLineWidth(1) + canvas.DrawLine(10, 150, 10, 170) + canvas.DrawLine(10+w, 150, 10+w, 170) + canvas.DrawLine(10, 168, 10+w, 168) + canvas.DrawLine(10, 168, 20, 165) + canvas.DrawLine(10, 168, 20, 171) + canvas.DrawLine(10+w, 168, w, 165) + canvas.DrawLine(10+w, 168, w, 171) + + canvas.SetSolidColorFillStyle(rui.Black) + canvas.SetFont("sans-serif", rui.Px(8)) + canvas.SetTextAlign(rui.CenterAlign) + canvas.FillText(10+w/2, 167, strconv.FormatFloat(w, 'g', -1, 64)) + + canvas.Restore() +} + +func textAlignCanvasDemo(canvas rui.Canvas) { + canvas.Save() + canvas.SetFont("sans-serif", rui.Pt(10)) + canvas.SetSolidColorFillStyle(0xFF000000) + canvas.SetSolidColorStrokeStyle(0xFF00FFFF) + + baseline := []string{"Alphabetic", "Top", "Middle", "Bottom", "Hanging", "Ideographic"} + align := []string{"Left", "Right", "Center", "Start", "End"} + center := []float64{20, 120, 70, 20, 120} + for b, bText := range baseline { + for a, aText := range align { + canvas.SetTextAlign(a) + canvas.SetTextBaseline(b) + x := float64(a * 140) + y := float64(b * 40) + + canvas.DrawLine(x+4, y+20, x+132, y+20) + canvas.DrawLine(x+center[a], y+2, x+center[a], y+38) + canvas.FillText(x+center[a], y+20, bText+","+aText) + } + } + canvas.Restore() +} + +func lineStyleCanvasDemo(canvas rui.Canvas) { + canvas.Save() + + canvas.SetSolidColorStrokeStyle(0xFF00FFFF) + canvas.SetLineWidth(1) + canvas.DrawLine(20, 30, 20, 90) + canvas.DrawLine(170, 30, 170, 90) + + canvas.SetSolidColorStrokeStyle(0xFF0000FF) + canvas.SetFont("courier", rui.Pt(12)) + canvas.SetTextBaseline(rui.MiddleBaseline) + canvas.FillText(80, 15, "SetLineCap(...)") + + canvas.SetFont("courier", rui.Pt(10)) + for i, cap := range []string{"ButtCap", "RoundCap", "SquareCap"} { + canvas.SetSolidColorStrokeStyle(0xFF00FFFF) + canvas.SetLineWidth(1) + y := float64(40 + 20*i) + canvas.DrawLine(10, y, 180, y) + canvas.SetSolidColorStrokeStyle(0xFF000000) + canvas.SetLineWidth(10) + canvas.SetLineCap(i) + canvas.DrawLine(20, y, 170, y) + canvas.FillText(200, y, cap) + } + + canvas.SetSolidColorStrokeStyle(0xFF0000FF) + canvas.SetFont("courier", rui.Pt(12)) + canvas.FillText(80, 115, "SetLineJoin(...)") + + canvas.SetSolidColorStrokeStyle(0xFF000000) + canvas.SetLineWidth(10) + canvas.SetLineCap(rui.ButtCap) + + canvas.SetFont("courier", rui.Pt(10)) + for i, join := range []string{"MiterJoin", "RoundJoin", "BevelJoin"} { + y := float64(140 + 40*i) + path := rui.NewPath() + path.MoveTo(20, y) + path.LineTo(50, y+40) + path.LineTo(80, y) + path.LineTo(110, y+40) + path.LineTo(140, y) + path.LineTo(170, y+40) + path.LineTo(200, y) + canvas.SetLineJoin(i) + canvas.StrokePath(path) + canvas.FillText(210, y+20, join) + } + + canvas.SetSolidColorStrokeStyle(0xFF0000FF) + canvas.SetFont("courier", rui.Pt(12)) + canvas.FillText(20, 300, "SetLineDash([]float64{16, 8, 4, 8}, ...)") + + canvas.SetFont("courier", rui.Pt(10)) + canvas.SetLineDash([]float64{16, 8, 4, 8}, 0) + canvas.SetSolidColorStrokeStyle(0xFF000000) + canvas.SetLineWidth(4) + + canvas.SetLineCap(rui.ButtCap) + canvas.DrawLine(20, 330, 200, 330) + canvas.FillText(220, 330, "SetLineCap(ButtCap)") + + canvas.SetLineDash([]float64{16, 8, 4, 8}, 4) + canvas.DrawLine(20, 360, 200, 360) + canvas.FillText(220, 360, "offset = 4") + + canvas.SetLineDash([]float64{16, 8, 4, 8}, 0) + canvas.SetLineCap(rui.RoundCap) + canvas.SetShadow(4, 4, 2, 0xFF808080) + canvas.DrawLine(20, 390, 200, 390) + canvas.ResetShadow() + canvas.FillText(220, 390, "SetLineCap(RoundCap)") + + canvas.Restore() +} + +func transformCanvasDemo(canvas rui.Canvas) { + drawFigure := func() { + w := int(canvas.Width() / 2) + h := int(canvas.Height() / 2) + nx := (w/2)/20 + 1 + ny := (h/2)/20 + 1 + x0 := float64((w - nx*20) / 2) + y0 := float64((h - ny*20) / 2) + x1 := x0 + float64((nx-1)*20) + y1 := y0 + float64((ny-1)*20) + + canvas.SetFont("serif", rui.Pt(10)) + canvas.SetSolidColorFillStyle(rui.Black) + + canvas.SetTextAlign(rui.CenterAlign) + canvas.SetTextBaseline(rui.BottomBaseline) + for i := 0; i < nx; i++ { + x := x0 + float64(i*20) + canvas.DrawLine(x, y0, x, y1) + canvas.FillText(x, y0-4, strconv.Itoa(i)) + } + + canvas.SetTextAlign(rui.RightAlign) + canvas.SetTextBaseline(rui.MiddleBaseline) + for i := 0; i < ny; i++ { + y := y0 + float64(i*20) + canvas.DrawLine(x0, y, x1, y) + canvas.FillText(x0-4, y, strconv.Itoa(i)) + } + } + + canvas.SetFont("courier", rui.Pt(14)) + canvas.SetSolidColorFillStyle(rui.Black) + canvas.SetTextAlign(rui.CenterAlign) + canvas.SetTextBaseline(rui.TopBaseline) + + canvas.FillText(canvas.Width()/4, 8, "Original") + canvas.FillText(canvas.Width()*3/4, 8, "SetScale(1.2, 0.8)") + canvas.FillText(canvas.Width()/4, canvas.Height()/2+8, "SetRotation(math.Pi / 6)") + canvas.FillText(canvas.Width()*3/4, canvas.Height()/2+8, "SetTransformation(0.8, 1.2, 0.2, 0.4, ...)") + + drawFigure() + + canvas.SetScale(1.2, 0.8) + canvas.SetTranslation(canvas.Width()/2.4, 0) + drawFigure() + + canvas.ResetTransformation() + canvas.SetTranslation(canvas.Width()/8, canvas.Height()/2-canvas.Height()/8) + canvas.SetRotation(math.Pi / 6) + drawFigure() + + canvas.ResetTransformation() + //canvas.SetTranslation(canvas.Width()/2, canvas.Height()/2) + canvas.SetTransformation(0.8, 1.2, 0.2, 0.4, canvas.Width()/(2*0.8)-canvas.Width()/8, canvas.Height()/(2*1.2)-canvas.Height()/16) + drawFigure() +} + +var image rui.Image + +func imageCanvasDemo(canvas rui.Canvas) { + if image != nil { + canvas.DrawImage(50, 20, image) + } else { + image = rui.LoadImage("tile00.svg", func(img rui.Image) { + if img.LoadingStatus() == rui.ImageReady { + canvas.View().Redraw() + } + }, canvas.View().Session()) + } +} + +func createCanvasDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, canvasDemoText) + if view == nil { + return nil + } + + rui.Set(view, "canvas", rui.DrawFunction, imageCanvasDemo) + + rui.Set(view, "canvasType", rui.DropDownEvent, func(list rui.DropDownList, number int) { + drawFuncs := []func(rui.Canvas){ + imageCanvasDemo, + rectangleCanvasDemo, + textCanvasDemo, + textAlignCanvasDemo, + lineStyleCanvasDemo, + transformCanvasDemo, + } + if number >= 0 && number < len(drawFuncs) { + rui.Set(view, "canvas", rui.DrawFunction, drawFuncs[number]) + } + }) + + sampleImage = rui.LoadImage("image_sample.png", nil, session) + + return view +} diff --git a/demo/checkboxDemo.go b/demo/checkboxDemo.go new file mode 100644 index 0000000..5f3fb60 --- /dev/null +++ b/demo/checkboxDemo.go @@ -0,0 +1,69 @@ +package main + +import "github.com/anoshenko/rui" + +const checkboxDemoText = ` +GridLayout { + style = demoPage, + content = [ + GridLayout { + width = 100%, height = 100%, cell-vertical-align = center, cell-horizontal-align = center, + content = [ + GridLayout { + width = 250px, height = 80px, + border = _{ style = solid, width = 1px, color = gray }, + content = [ + Checkbox { + id = checkbox, width = 100%, height = 100%, + content = "Checkbox content" + } + ] + } + ] + }, + ListLayout { + style = optionsPanel, + content = [ + GridLayout { + style = optionsTable, + content = [ + TextView { row = 0, text = "Vertical align" }, + DropDownList { row = 0, column = 1, id = checkboxVAlign, current = 0, items = ["top", "bottom", "center", "stretch"]}, + TextView { row = 1, text = "Horizontal align" }, + DropDownList { row = 1, column = 1, id = checkboxHAlign, current = 0, items = ["left", "right", "center", "stretch"]}, + TextView { row = 2, text = "Checkbox vertical align" }, + DropDownList { row = 2, column = 1, id = checkboxBoxVAlign, current = 0, items = ["top", "bottom", "center"]}, + TextView { row = 3, text = "Checkbox horizontal align" }, + DropDownList { row = 3, column = 1, id = checkboxBoxHAlign, current = 0, items = ["left", "right", "center"]}, + ] + } + ] + } + ] +} +` + +func createCheckboxDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, checkboxDemoText) + if view == nil { + return nil + } + + rui.Set(view, "checkboxVAlign", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "checkbox", rui.VerticalAlign, number) + }) + + rui.Set(view, "checkboxHAlign", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "checkbox", rui.HorizontalAlign, number) + }) + + rui.Set(view, "checkboxBoxVAlign", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "checkbox", rui.CheckboxVerticalAlign, number) + }) + + rui.Set(view, "checkboxBoxHAlign", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "checkbox", rui.CheckboxHorizontalAlign, number) + }) + + return view +} diff --git a/demo/clipDemo.go b/demo/clipDemo.go new file mode 100644 index 0000000..d12dc2f --- /dev/null +++ b/demo/clipDemo.go @@ -0,0 +1,54 @@ +package main + +import "github.com/anoshenko/rui" + +const clipDemoText = ` +GridLayout { + width = 100%, height = 100%, cell-height = "auto, 1fr", + cell-horizontal-align = center, cell-vertical-align = center, + content = [ + DropDownList { + id = clipType, current = 0, margin = 8px, max-width = 100%, + items = ["none", + "inset(20%, 10%, 20%, 10%, 16px / 32px)", + "circle(50%, 45%, 45%)", + "ellipse(50%, 50%, 35%, 50%)", + "polygon(50%, 2.4%, 34.5%, 33.8%, 0%, 38.8%, 25%, 63.1%, 19.1%, 97.6%, 50%, 81.3%, 80.9%, 97.6%, 75%, 63.1%, 100%, 38.8%, 65.5%, 33.8%)"], + }, + ImageView { + id = clipImage, row = 1, src = "cat.jpg", + } + ] +} +` + +func createClipDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, clipDemoText) + if view == nil { + return nil + } + + rui.Set(view, "clipType", rui.DropDownEvent, func(number int) { + switch number { + case 0: + rui.Set(view, "clipImage", rui.Clip, nil) + + case 1: + rui.Set(view, "clipImage", rui.Clip, rui.InsetClip(rui.Percent(20), rui.Percent(10), + rui.Percent(20), rui.Percent(10), rui.NewRadiusProperty(rui.Params{ + rui.X: rui.Px(16), + rui.Y: rui.Px(32), + }))) + case 2: + rui.Set(view, "clipImage", rui.Clip, rui.CircleClip(rui.Percent(50), rui.Percent(45), rui.Percent(45))) + + case 3: + rui.Set(view, "clipImage", rui.Clip, rui.EllipseClip(rui.Percent(50), rui.Percent(50), rui.Percent(35), rui.Percent(50))) + + case 4: + rui.Set(view, "clipImage", rui.Clip, rui.PolygonClip([]interface{}{"50%", "2.4%", "34.5%", "33.8%", "0%", "38.8%", "25%", "63.1%", "19.1%", "97.6%", "50%", "81.3%", "80.9%", "97.6%", "75%", "63.1%", "100%", "38.8%", "65.5%", "33.8%"})) + } + }) + + return view +} diff --git a/demo/columnLayoutDemo.go b/demo/columnLayoutDemo.go new file mode 100644 index 0000000..61572a2 --- /dev/null +++ b/demo/columnLayoutDemo.go @@ -0,0 +1,139 @@ +package main + +import "github.com/anoshenko/rui" + +const columnLayoutText = ` +GridLayout { + style = demoPage, + content = [ + ColumnLayout { + id = columnLayout, padding = 12px, + content = [ + TextView { text = "Alice’s Adventures in Wonderland", style = header1 }, + TextView { text = "by Lewis Carroll", semantics = blockquote, margin-bottom = 0.5em, text-size = 0.8em, text-align = center }, + TextView { text = "CHAPTER I. Down the Rabbit-Hole", style = header2 }, + TextView { text = "Alice was beginning to get very tired of sitting by her sister on the bank, and of having nothing to do: once or twice she had peeped into the book her sister was reading, but it had no pictures or conversations in it, “and what is the use of a book,” thought Alice “without pictures or conversations?”", style = paragraph }, + TextView { text = "So she was considering in her own mind (as well as she could, for the hot day made her feel very sleepy and stupid), whether the pleasure of making a daisy-chain would be worth the trouble of getting up and picking the daisies, when suddenly a White Rabbit with pink eyes ran close by her.", style = paragraph }, + TextView { text = "There was nothing so very remarkable in that; nor did Alice think it so very much out of the way to hear the Rabbit say to itself, “Oh dear! Oh dear! I shall be late!” (when she thought it over afterwards, it occurred to her that she ought to have wondered at this, but at the time it all seemed quite natural); but when the Rabbit actually took a watch out of its waistcoat-pocket, and looked at it, and then hurried on, Alice started to her feet, for it flashed across her mind that she had never before seen a rabbit with either a waistcoat-pocket, or a watch to take out of it, and burning with curiosity, she ran across the field after it, and fortunately was just in time to see it pop down a large rabbit-hole under the hedge.", style = paragraph }, + TextView { text = "In another moment down went Alice after it, never once considering how in the world she was to get out again.", style = paragraph }, + TextView { text = "The rabbit-hole went straight on like a tunnel for some way, and then dipped suddenly down, so suddenly that Alice had not a moment to think about stopping herself before she found herself falling down a very deep well.", style = paragraph }, + TextView { text = "Either the well was very deep, or she fell very slowly, for she had plenty of time as she went down to look about her and to wonder what was going to happen next. First, she tried to look down and make out what she was coming to, but it was too dark to see anything; then she looked at the sides of the well, and noticed that they were filled with cupboards and book-shelves; here and there she saw maps and pictures hung upon pegs. She took down a jar from one of the shelves as she passed; it was labelled “ORANGE MARMALADE”, but to her great disappointment it was empty: she did not like to drop the jar for fear of killing somebody underneath, so managed to put it into one of the cupboards as she fell past it.", style = paragraph }, + TextView { text = "“Well!” thought Alice to herself, “after such a fall as this, I shall think nothing of tumbling down stairs! How brave they’ll all think me at home! Why, I wouldn’t say anything about it, even if I fell off the top of the house!” (Which was very likely true.)", style = paragraph }, + TextView { text = "Down, down, down. Would the fall never come to an end? “I wonder how many miles I’ve fallen by this time?” she said aloud. “I must be getting somewhere near the centre of the earth. Let me see: that would be four thousand miles down, I think—” (for, you see, Alice had learnt several things of this sort in her lessons in the schoolroom, and though this was not a very good opportunity for showing off her knowledge, as there was no one to listen to her, still it was good practice to say it over) “—yes, that’s about the right distance—but then I wonder what Latitude or Longitude I’ve got to?” (Alice had no idea what Latitude was, or Longitude either, but thought they were nice grand words to say.)", style = paragraph }, + TextView { text = "Presently she began again. “I wonder if I shall fall right through the earth! How funny it’ll seem to come out among the people that walk with their heads downward! The Antipathies, I think—” (she was rather glad there was no one listening, this time, as it didn’t sound at all the right word) “—but I shall have to ask them what the name of the country is, you know. Please, Ma’am, is this New Zealand or Australia?” (and she tried to curtsey as she spoke—fancy curtseying as you’re falling through the air! Do you think you could manage it?) “And what an ignorant little girl she’ll think me for asking! No, it’ll never do to ask: perhaps I shall see it written up somewhere.”", style = paragraph }, + TextView { text = "Down, down, down. There was nothing else to do, so Alice soon began talking again. “Dinah’ll miss me very much to-night, I should think!” (Dinah was the cat.) “I hope they’ll remember her saucer of milk at tea-time. Dinah my dear! I wish you were down here with me! There are no mice in the air, I’m afraid, but you might catch a bat, and that’s very like a mouse, you know. But do cats eat bats, I wonder?” And here Alice began to get rather sleepy, and went on saying to herself, in a dreamy sort of way, “Do cats eat bats? Do cats eat bats?” and sometimes, “Do bats eat cats?” for, you see, as she couldn’t answer either question, it didn’t much matter which way she put it. She felt that she was dozing off, and had just begun to dream that she was walking hand in hand with Dinah, and saying to her very earnestly, “Now, Dinah, tell me the truth: did you ever eat a bat?” when suddenly, thump! thump! down she came upon a heap of sticks and dry leaves, and the fall was over.", style = paragraph }, + TextView { text = "Alice was not a bit hurt, and she jumped up on to her feet in a moment: she looked up, but it was all dark overhead; before her was another long passage, and the White Rabbit was still in sight, hurrying down it. There was not a moment to be lost: away went Alice like the wind, and was just in time to hear it say, as it turned a corner, “Oh my ears and whiskers, how late it’s getting!” She was close behind it when she turned the corner, but the Rabbit was no longer to be seen: she found herself in a long, low hall, which was lit up by a row of lamps hanging from the roof.", style = paragraph }, + TextView { text = "There were doors all round the hall, but they were all locked; and when Alice had been all the way down one side and up the other, trying every door, she walked sadly down the middle, wondering how she was ever to get out again.", style = paragraph }, + TextView { text = "Suddenly she came upon a little three-legged table, all made of solid glass; there was nothing on it except a tiny golden key, and Alice’s first thought was that it might belong to one of the doors of the hall; but, alas! either the locks were too large, or the key was too small, but at any rate it would not open any of them. However, on the second time round, she came upon a low curtain she had not noticed before, and behind it was a little door about fifteen inches high: she tried the little golden key in the lock, and to her great delight it fitted!", style = paragraph }, + TextView { text = "Alice opened the door and found that it led into a small passage, not much larger than a rat-hole: she knelt down and looked along the passage into the loveliest garden you ever saw. How she longed to get out of that dark hall, and wander about among those beds of bright flowers and those cool fountains, but she could not even get her head through the doorway; “and even if my head would go through,” thought poor Alice, “it would be of very little use without my shoulders. Oh, how I wish I could shut up like a telescope! I think I could, if I only knew how to begin.” For, you see, so many out-of-the-way things had happened lately, that Alice had begun to think that very few things indeed were really impossible.", style = paragraph }, + TextView { text = "There seemed to be no use in waiting by the little door, so she went back to the table, half hoping she might find another key on it, or at any rate a book of rules for shutting people up like telescopes: this time she found a little bottle on it, (“which certainly was not here before,” said Alice,) and round the neck of the bottle was a paper label, with the words “DRINK ME,” beautifully printed on it in large letters.", style = paragraph }, + TextView { text = "It was all very well to say “Drink me,” but the wise little Alice was not going to do that in a hurry. “No, I’ll look first,” she said, “and see whether it’s marked ‘poison’ or not”; for she had read several nice little histories about children who had got burnt, and eaten up by wild beasts and other unpleasant things, all because they would not remember the simple rules their friends had taught them: such as, that a red-hot poker will burn you if you hold it too long; and that if you cut your finger very deeply with a knife, it usually bleeds; and she had never forgotten that, if you drink much from a bottle marked “poison,” it is almost certain to disagree with you, sooner or later.", style = paragraph }, + TextView { text = "However, this bottle was not marked “poison,” so Alice ventured to taste it, and finding it very nice, (it had, in fact, a sort of mixed flavour of cherry-tart, custard, pine-apple, roast turkey, toffee, and hot buttered toast,) she very soon finished it off.", style = paragraph }, + ] + }, + ListLayout { + style = optionsPanel, + content = [ + GridLayout { + style = optionsTable, + content = [ + TextView { row = 0, text = "Column count" }, + DropDownList { row = 0, column = 1, id = columnCount, current = 0, + items = ["0", "1", "2", "3", "4", "5"], + }, + TextView { row = 1, text = "Column width" }, + DropDownList { row = 1, column = 1, id = columnWidth, current = 0, + items = ["auto", "100px", "200px", "40em"] + }, + TextView { row = 2, text = "Column gap" }, + DropDownList { row = 2, column = 1, id = columnGap, current = 0, + items = ["auto", "5%", "12px", "4em"] + }, + TextView { row = 3, text = "Column separator" }, + DropDownList { row = 3, column = 1, id = columnSeparator, current = 0, + items = ["none", "1px solid", "2px dotted red", "3px dashed blue", "4px double"]}, + Checkbox { row = 4, column = 0:1, id = columnAvoidBreak, content = "Avoid break" } + ] + }, + ] + } + ] +} +` + +func createColumnLayoutDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, columnLayoutText) + if view == nil { + return nil + } + + rui.Set(view, "columnCount", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "columnLayout", rui.ColumnCount, number) + }) + + rui.Set(view, "columnWidth", rui.DropDownEvent, func(list rui.DropDownList, number int) { + items := []rui.SizeUnit{rui.AutoSize(), rui.Px(100), rui.Px(200), rui.Em(40)} + if number >= 0 && number < len(items) { + rui.Set(view, "columnLayout", rui.ColumnWidth, items[number]) + } + }) + + rui.Set(view, "columnGap", rui.DropDownEvent, func(list rui.DropDownList, number int) { + items := []rui.SizeUnit{rui.AutoSize(), rui.Percent(5), rui.Px(8), rui.Em(4)} + if number >= 0 && number < len(items) { + rui.Set(view, "columnLayout", rui.ColumnGap, items[number]) + } + }) + + rui.Set(view, "columnSeparator", rui.DropDownEvent, func(list rui.DropDownList, number int) { + switch number { + case 0: + rui.Set(view, "columnLayout", rui.ColumnSeparator, nil) + + case 1: + rui.Set(view, "columnLayout", rui.ColumnSeparator, + rui.NewColumnSeparator(rui.Params{ + rui.Width: rui.Px(1), + rui.Style: rui.SolidLine, + })) + + case 2: + rui.Set(view, "columnLayout", rui.ColumnSeparator, + rui.NewColumnSeparator(rui.Params{ + rui.Width: rui.Px(2), + rui.Style: rui.DottedLine, + rui.ColorProperty: rui.Red, + })) + + case 3: + rui.Set(view, "columnLayout", rui.ColumnSeparator, + rui.NewColumnSeparator(rui.Params{ + rui.Width: rui.Px(3), + rui.Style: rui.DashedLine, + rui.ColorProperty: rui.Blue, + })) + + case 4: + rui.Set(view, "columnLayout", rui.ColumnSeparator, + rui.NewColumnSeparator(rui.Params{ + rui.Width: rui.Px(4), + rui.Style: rui.DoubleLine, + })) + } + }) + + rui.Set(view, "columnAvoidBreak", rui.CheckboxChangedEvent, func(checkbox rui.Checkbox, checked bool) { + if layout := rui.ColumnLayoutByID(view, "columnLayout"); layout != nil { + for _, v := range layout.Views() { + v.Set(rui.AvoidBreak, checked) + } + } + number := rui.GetColumnCount(view, "columnLayout") + if number > 0 { + rui.Set(view, "columnLayout", rui.ColumnCount, 0) + rui.Set(view, "columnLayout", rui.ColumnCount, number) + } + }) + + return view +} diff --git a/demo/controlsDemo.go b/demo/controlsDemo.go new file mode 100644 index 0000000..e510458 --- /dev/null +++ b/demo/controlsDemo.go @@ -0,0 +1,148 @@ +package main + +import ( + "fmt" + "math" + "time" + + "github.com/anoshenko/rui" +) + +const controlsDemoText = ` +ListLayout { + width = 100%, height = 100%, orientation = vertical, padding = 16px, + content = [ + DetailsView { + margin = 8px, + summary = "Details title", + content = "Details content" + } + ListLayout { orientation = horizontal, vertical-align = center, padding = 8px, + border = _{ width = 1px, style = solid, color = #FF000000 }, radius = 4px, + content = [ + Checkbox { id = controlsCheckbox, content = "Checkbox" }, + Button { id = controlsCheckboxButton, margin-left = 32px, content = "Check checkbox" }, + ] + }, + ListLayout { orientation = horizontal, margin-top = 16px, padding = 8px, vertical-align = center, + border = _{ width = 1px, style = solid, color = #FF000000 }, radius = 4px, + content = [ + Button { id = controlsProgressDec, content = "<<" }, + Button { id = controlsProgressInc, content = ">>", margin-left = 12px }, + ProgressBar { id = controlsProgress, max = 100, value = 50, margin-left = 12px }, + TextView { id = controlsProgressLabel, text = "50 / 100", margin-left = 12px }, + ] + }, + ListLayout { orientation = horizontal, margin-top = 16px, padding = 8px, vertical-align = center, + border = _{ width = 1px, style = solid, color = #FF000000 }, radius = 4px, + content = [ + "Enter number (-5...10)", + NumberPicker { id = controlsNumberEditor, type = editor, width = 80px, + margin-left = 12px, min = -5, max = 10, step = 0.1, value = 0 + }, + NumberPicker { id = controlsNumberSlider, type = slider, width = 150px, + margin-left = 12px, min = -5, max = 10, step = 0.1, value = 0 + } + ] + }, + ListLayout { orientation = horizontal, margin-top = 16px, padding = 8px, vertical-align = center, + border = _{ width = 1px, style = solid, color = #FF000000 }, radius = 4px, + content = [ + "Select color", + ColorPicker { id = controlsColorPicker, value = #0000FF, + margin = _{ left = 12px, right = 24px} + }, + "Result", + View { id = controlsColorResult, width = 24px, height = 24px, margin-left = 12px, background-color = #0000FF } + ] + }, + ListLayout { orientation = horizontal, margin-top = 16px, padding = 8px, vertical-align = center, + border = _{ width = 1px, style = solid, color = #FF000000 }, radius = 4px, + content = [ + "Select a time and date:", + TimePicker { id = controlsTimePicker, min = "00:00", margin-left = 12px }, + DatePicker { id = controlsDatePicker, min = "2001-01-01", margin-right = 24px }, + "Result:", + TextView { id = controlsDateResult, margin-left = 12px } + ] + }, + Button { + id = controlsMessage, margin-top = 16px, content = "Show message" + } + ] +} +` + +func createControlsDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, controlsDemoText) + if view == nil { + return nil + } + + rui.Set(view, "controlsCheckbox", rui.CheckboxChangedEvent, func(checkbox rui.Checkbox, checked bool) { + if checked { + rui.Set(view, "controlsCheckboxButton", rui.Content, "Uncheck checkbox") + } else { + rui.Set(view, "controlsCheckboxButton", rui.Content, "Check checkbox") + } + }) + + rui.Set(view, "controlsCheckboxButton", rui.ClickEvent, func(rui.View) { + checked := rui.IsCheckboxChecked(view, "controlsCheckbox") + rui.Set(view, "controlsCheckbox", rui.Checked, !checked) + }) + + setProgressBar := func(dx float64) { + if value := rui.GetProgressBarValue(view, "controlsProgress"); value >= 0 { + max := rui.GetProgressBarMax(view, "controlsProgress") + newValue := math.Min(math.Max(0, value+dx), max) + if newValue != value { + rui.Set(view, "controlsProgress", rui.Value, newValue) + rui.Set(view, "controlsProgressLabel", rui.Text, fmt.Sprintf("%g / %g", newValue, max)) + } + } + } + + rui.Set(view, "controlsProgressDec", rui.ClickEvent, func(rui.View) { + setProgressBar(-1) + }) + + rui.Set(view, "controlsProgressInc", rui.ClickEvent, func(rui.View) { + setProgressBar(+1) + }) + + rui.Set(view, "controlsNumberEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + rui.Set(view, "controlsNumberSlider", rui.Value, newValue) + }) + + rui.Set(view, "controlsNumberSlider", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + rui.Set(view, "controlsNumberEditor", rui.Value, newValue) + }) + + rui.Set(view, "controlsColorPicker", rui.ColorChangedEvent, func(v rui.ColorPicker, newColor rui.Color) { + rui.Set(view, "controlsColorResult", rui.BackgroundColor, newColor) + }) + + rui.Set(view, "controlsTimePicker", rui.Value, demoTime) + rui.Set(view, "controlsDatePicker", rui.Value, demoTime) + + rui.Set(view, "controlsTimePicker", rui.TimeChangedEvent, func(v rui.TimePicker, newDate time.Time) { + demoTime = time.Date(demoTime.Year(), demoTime.Month(), demoTime.Day(), newDate.Hour(), newDate.Minute(), + newDate.Second(), newDate.Nanosecond(), demoTime.Location()) + rui.Set(view, "controlsDateResult", rui.Text, demoTime.Format(time.RFC1123)) + }) + + rui.Set(view, "controlsDatePicker", rui.DateChangedEvent, func(v rui.DatePicker, newDate time.Time) { + demoTime = time.Date(newDate.Year(), newDate.Month(), newDate.Day(), demoTime.Hour(), demoTime.Minute(), + demoTime.Second(), demoTime.Nanosecond(), demoTime.Location()) + rui.Set(view, "controlsDateResult", rui.Text, demoTime.Format(time.RFC1123)) + }) + + rui.Set(view, "controlsMessage", rui.ClickEvent, func(rui.View) { + rui.ShowMessage("Hello", "Hello world!!!", session) + }) + + return view +} + +var demoTime = time.Now() diff --git a/demo/editDemo.go b/demo/editDemo.go new file mode 100644 index 0000000..b406e44 --- /dev/null +++ b/demo/editDemo.go @@ -0,0 +1,70 @@ +package main + +import ( + "github.com/anoshenko/rui" +) + +const editDemoText = ` +ListLayout { + width = 100%, height = 100%, orientation = vertical, padding = 16px, + content = [ + GridLayout { + row-gap = 12px, column-gap = 8px, cell-width = "auto, 1fr, auto", cell-vertical-align = center, + content = [ + TextView { row = 0, column = 0, text = "User name" }, + EditView { row = 0, column = 1, id = editUserName, min-width = 200px, hint = "Required", type = text }, + TextView { row = 1, column = 0, text = "Password" }, + EditView { row = 1, column = 1, id = editPassword, min-width = 200px, hint = "8 characters minimum", type = password }, + TextView { row = 2, column = 0, text = "Confirm password" }, + EditView { row = 2, column = 1, id = editConfirmPassword, min-width = 200px, hint = "Required", type = password }, + TextView { row = 2, column = 2, id = confirmLabel, text = "" }, + TextView { row = 3, column = 0, text = "Main e-mail" }, + EditView { row = 3, column = 1, id = editMainEmail, min-width = 200px, hint = "Required", type = email }, + TextView { row = 4, column = 0, text = "Additional e-mails" }, + EditView { row = 4, column = 1, id = editAdditionalEmails, min-width = 200px, hint = "Optional", type = emails }, + TextView { row = 5, column = 0, text = "Home page" }, + EditView { row = 5, column = 1, id = editHomePage, min-width = 200px, hint = "Optional", type = url }, + TextView { row = 6, column = 0, text = "Phone" }, + EditView { row = 6, column = 1, id = editPhone, min-width = 200px, hint = "Optional", type = phone }, + EditView { row = 7, column = 0:1, id = editMultiLine, height = 200px, type = multiline }, + Checkbox { row = 7, column = 2, id = editMultiLineWrap, content = "Wrap", margin-left = 12px } + ] + }, + ] +} +` + +func createEditDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, editDemoText) + if view == nil { + return nil + } + + setConfirmLabel := func(password, confirmPassword string) { + if password == confirmPassword { + rui.Set(view, "confirmLabel", rui.TextColor, rui.Green) + if password != "" { + rui.Set(view, "confirmLabel", rui.Text, "✓") + } else { + rui.Set(view, "confirmLabel", rui.Text, "") + } + } else { + rui.Set(view, "confirmLabel", rui.TextColor, rui.Red) + rui.Set(view, "confirmLabel", rui.Text, "✗") + } + } + + rui.Set(view, "editPassword", rui.EditTextChangedEvent, func(edit rui.EditView, newText string) { + setConfirmLabel(newText, rui.GetText(view, "editConfirmPassword")) + }) + + rui.Set(view, "editConfirmPassword", rui.EditTextChangedEvent, func(edit rui.EditView, newText string) { + setConfirmLabel(rui.GetText(view, "editPassword"), newText) + }) + + rui.Set(view, "editMultiLineWrap", rui.CheckboxChangedEvent, func(checkbox rui.Checkbox, checked bool) { + rui.Set(view, "editMultiLine", rui.Wrap, checked) + }) + + return view +} diff --git a/demo/filterDemo.go b/demo/filterDemo.go new file mode 100644 index 0000000..a8c2004 --- /dev/null +++ b/demo/filterDemo.go @@ -0,0 +1,170 @@ +package main + +import ( + "fmt" + "strings" + + "github.com/anoshenko/rui" +) + +const filterDemoText = ` +GridLayout { + style = demoPage, + content = [ + GridLayout { + width = 100%, height = 100%, cell-vertical-align = center, cell-horizontal-align = center, + content = [ + ImageView { id = filterImage, src = "mountain.svg" }, + ] + }, + ListLayout { + style = optionsPanel, + content = [ + GridLayout { + style = optionsTable, + content = [ + Checkbox { id = blurCheckbox, row = 0, content = "Blur" }, + NumberPicker { id = blurSlider, row = 1, type = slider, min = 0, max = 25, step = 0.1, disabled = true }, + TextView { id = blurValue, row = 1, column = 1, text = "0px", width = 40px }, + Checkbox { id = brightnessCheckbox, row = 2, content = "Brightness" }, + NumberPicker { id = brightnessSlider, row = 3, type = slider, min = 0, max = 200, step = 1, disabled = true }, + TextView { id = brightnessValue, row = 3, column = 1, text = "0%", width = 40px }, + Checkbox { id = contrastCheckbox, row = 4, content = "Contrast" }, + NumberPicker { id = contrastSlider, row = 5, type = slider, min = 0, max = 200, step = 1, disabled = true }, + TextView { id = contrastValue, row = 5, column = 1, text = "0%", width = 40px }, + Checkbox { id = grayscaleCheckbox, row = 6, content = "Grayscale" }, + NumberPicker { id = grayscaleSlider, row = 7, type = slider, min = 0, max = 100, step = 1, disabled = true }, + TextView { id = grayscaleValue, row = 7, column = 1, text = "0%", width = 40px }, + Checkbox { id = invertCheckbox, row = 8, content = "Invert" }, + NumberPicker { id = invertSlider, row = 9, type = slider, min = 0, max = 100, step = 1, disabled = true }, + TextView { id = invertValue, row = 9, column = 1, text = "0%", width = 40px }, + Checkbox { id = saturateCheckbox, row = 10, content = "Saturate" }, + NumberPicker { id = saturateSlider, row = 11, type = slider, min = 0, max = 200, step = 1, disabled = true }, + TextView { id = saturateValue, row = 11, column = 1, text = "0%", width = 40px }, + Checkbox { id = sepiaCheckbox, row = 12, content = "Sepia" }, + NumberPicker { id = sepiaSlider, row = 13, type = slider, min = 0, max = 100, step = 1, disabled = true }, + TextView { id = sepiaValue, row = 13, column = 1, text = "0%", width = 40px }, + Checkbox { id = opacityCheckbox, row = 14, content = "Opacity" }, + NumberPicker { id = opacitySlider, row = 15, type = slider, min = 0, max = 100, step = 1, disabled = true }, + TextView { id = opacityValue, row = 15, column = 1, text = "0%", width = 40px }, + Checkbox { id = huerotateCheckbox, row = 16, content = "hue-rotate" }, + NumberPicker { id = huerotateSlider, row = 17, type = slider, min = 0, max = 720, step = 1, disabled = true }, + TextView { id = huerotateValue, row = 17, column = 1, text = "0°", width = 40px }, + Checkbox { id = shadowCheckbox, row = 18, content = "drop-shadow" }, + ColorPicker { id = dropShadowColor, row = 18, column = 1, color = black, disabled = true }, + NumberPicker { id = shadowXSlider, row = 19, type = slider, min = -20, max = 20, step = 1, value = 0, disabled = true }, + TextView { id = shadowXValue, row = 19, column = 1, text = "x:0px", width = 40px }, + NumberPicker { id = shadowYSlider, row = 20, type = slider, min = -20, max = 20, step = 1, value = 0, disabled = true }, + TextView { id = shadowYValue, row = 20, column = 1, text = "y:0px", width = 40px }, + NumberPicker { id = shadowBlurSlider, row = 21, type = slider, min = 0, max = 40, step = 1, disabled = true }, + TextView { id = shadowBlurValue, row = 21, column = 1, text = "b:0px", width = 40px }, + ] + } + ] + } + ] +} +` + +var filterParams = rui.Params{} + +func createFilterDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, filterDemoText) + if view == nil { + return nil + } + + setEvents := func(tag string) { + rui.Set(view, tag+"Checkbox", rui.CheckboxChangedEvent, func(state bool) { + slider := tag + "Slider" + rui.Set(view, slider, rui.Disabled, !state) + if state { + filterParams[tag] = rui.GetNumberPickerValue(view, slider) + } else { + delete(filterParams, tag) + } + rui.Set(view, "filterImage", rui.Filter, rui.NewViewFilter(filterParams)) + }) + + rui.Set(view, tag+"Slider", rui.NumberChangedEvent, func(value float64) { + var text string + if tag == rui.Blur { + text = fmt.Sprintf("%.2gpx", value) + } else { + text = fmt.Sprintf("%g%%", value) + } + rui.Set(view, tag+"Value", rui.Text, text) + filterParams[tag] = value + rui.Set(view, "filterImage", rui.Filter, rui.NewViewFilter(filterParams)) + }) + } + + for _, tag := range []string{rui.Blur, rui.Brightness, rui.Contrast, rui.Grayscale, rui.Invert, rui.Saturate, rui.Sepia, rui.Opacity} { + setEvents(tag) + } + + rui.Set(view, "huerotateCheckbox", rui.CheckboxChangedEvent, func(state bool) { + rui.Set(view, "huerotateSlider", rui.Disabled, !state) + if state { + filterParams[rui.HueRotate] = rui.AngleUnit{ + Type: rui.Degree, + Value: rui.GetNumberPickerValue(view, "huerotateSlider"), + } + } else { + delete(filterParams, rui.HueRotate) + } + rui.Set(view, "filterImage", rui.Filter, rui.NewViewFilter(filterParams)) + }) + + rui.Set(view, "huerotateSlider", rui.NumberChangedEvent, func(value float64) { + rui.Set(view, "huerotateValue", rui.Text, fmt.Sprintf("%g°", value)) + filterParams[rui.HueRotate] = rui.AngleUnit{Type: rui.Degree, Value: value} + rui.Set(view, "filterImage", rui.Filter, rui.NewViewFilter(filterParams)) + }) + + updateShadow := func() { + xOff := rui.SizeUnit{ + Type: rui.SizeInPixel, + Value: rui.GetNumberPickerValue(view, "shadowXSlider"), + } + yOff := rui.SizeUnit{ + Type: rui.SizeInPixel, + Value: rui.GetNumberPickerValue(view, "shadowYSlider"), + } + blur := rui.SizeUnit{ + Type: rui.SizeInPixel, + Value: rui.GetNumberPickerValue(view, "shadowBlurSlider"), + } + color := rui.GetColorPickerValue(view, "dropShadowColor") + + filterParams[rui.DropShadow] = rui.NewTextShadow(xOff, yOff, blur, color) + rui.Set(view, "filterImage", rui.Filter, rui.NewViewFilter(filterParams)) + } + + rui.Set(view, "shadowCheckbox", rui.CheckboxChangedEvent, func(state bool) { + for _, tag := range []string{"shadowXSlider", "shadowYSlider", "shadowBlurSlider", "dropShadowColor"} { + rui.Set(view, tag, rui.Disabled, !state) + } + if state { + updateShadow() + } else { + delete(filterParams, rui.DropShadow) + rui.Set(view, "filterImage", rui.Filter, rui.NewViewFilter(filterParams)) + } + }) + + for _, tag := range []string{"shadowXSlider", "shadowYSlider", "shadowBlurSlider"} { + rui.Set(view, tag, rui.NumberChangedEvent, func(picker rui.NumberPicker, value float64) { + tag := strings.Replace(picker.ID(), "Slider", "Value", -1) + text := rui.GetText(view, tag) + rui.Set(view, tag, rui.Text, fmt.Sprintf("%s%gpx", text[:2], value)) + updateShadow() + }) + } + + rui.Set(view, "dropShadowColor", rui.ColorChangedEvent, func(value rui.Color) { + updateShadow() + }) + + return view +} diff --git a/demo/gridLayoutDemo.go b/demo/gridLayoutDemo.go new file mode 100644 index 0000000..d2d53f9 --- /dev/null +++ b/demo/gridLayoutDemo.go @@ -0,0 +1,103 @@ +package main + +import ( + "github.com/anoshenko/rui" +) + +const gridLayoutDemoText = ` +GridLayout { + style = demoPage, + content = [ + GridLayout { + id = gridLayout, width = 100%, height = 100%, + cell-width = "150px, 1fr, 30%", cell-height = "25%, 200px, 1fr", + content = [ + TextView { row = 0, column = 0:1, + text = "View 1", text-align = center, vertical-align = center, + background-color = #DDFF0000, radius = 8px, padding = 32px, + border = _{ style = solid, width = 1px, color = #FFA0A0A0 } + }, + TextView { row = 0:1, column = 2, + text = "View 2", text-align = center, vertical-align = center, + background-color = #DD00FF00, radius = 8px, padding = 32px, + border = _{ style = solid, width = 1px, color = #FFA0A0A0 } + }, + TextView { row = 1:2, column = 0, + text = "View 3", text-align = center, vertical-align = center, + background-color = #DD0000FF, radius = 8px, padding = 32px, + border = _{ style = solid, width = 1px, color = #FFA0A0A0 } + }, + TextView { row = 1, column = 1, + text = "View 4", text-align = center, vertical-align = center, + background-color = #DDFF00FF, radius = 8px, padding = 32px, + border = _{ style = solid, width = 1px, color = #FFA0A0A0 } + }, + TextView { row = 2, column = 1:2, + text = "View 5", text-align = center, vertical-align = center, + background-color = #DD00FFFF, radius = 8px, padding = 32px, + border = _{ style = solid, width = 1px, color = #FFA0A0A0 } + }, + ] + }, + ListLayout { + style = optionsPanel, + content = [ + GridLayout { + style = optionsTable, + content = [ + TextView { row = 0, text = "Vertical align" }, + DropDownList { row = 0, column = 1, id = gridVAlign, current = 3, + items = ["top", "bottom", "center", "stretch"] + }, + TextView { row = 1, text = "Horizontal align" }, + DropDownList { row = 1, column = 1, id = gridHAlign, current = 3, + items = ["left", "right", "center", "stretch"] + }, + TextView { row = 2, text = "Column gap" }, + DropDownList { row = 2, column = 1, id = gridColumnGap, current = 0, items = ["0", "8px"] }, + TextView { row = 3, text = "Row gap" }, + DropDownList { row = 3, column = 1, id = gridRowGap, current = 0, items = ["0", "8px"] }, + ] + } + ] + } + ] +} +` + +func createGridLayoutDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, gridLayoutDemoText) + if view == nil { + return nil + } + + rui.Set(view, "gridHAlign", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "gridLayout", rui.CellHorizontalAlign, number) + }) + + rui.Set(view, "gridVAlign", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "gridLayout", rui.CellVerticalAlign, number) + }) + + rui.Set(view, "gridColumnGap", rui.DropDownEvent, func(list rui.DropDownList, number int) { + switch number { + case 0: + rui.Set(view, "gridLayout", rui.GridColumnGap, rui.SizeUnit{Type: rui.Auto, Value: 0}) + + case 1: + rui.Set(view, "gridLayout", rui.GridColumnGap, rui.Px(8)) + } + }) + + rui.Set(view, "gridRowGap", rui.DropDownEvent, func(list rui.DropDownList, number int) { + switch number { + case 0: + rui.Set(view, "gridLayout", rui.GridRowGap, rui.SizeUnit{Type: rui.Auto, Value: 0}) + + case 1: + rui.Set(view, "gridLayout", rui.GridRowGap, rui.Px(8)) + } + }) + + return view +} diff --git a/demo/imageViewDemo.go b/demo/imageViewDemo.go new file mode 100644 index 0000000..4771b13 --- /dev/null +++ b/demo/imageViewDemo.go @@ -0,0 +1,63 @@ +package main + +import ( + "github.com/anoshenko/rui" +) + +const imageViewDemoText = ` +GridLayout { + style = demoPage, + content = [ + ImageView { + id = imageView1, width = 100%, height = 100%, src = "cat.jpg", + border = _{ style = solid, width = 1px, color = #FF008800 } + }, + ListLayout { + style = optionsPanel, + content = [ + GridLayout { + style = optionsTable, + content = [ + TextView { row = 0, text = "Image" }, + DropDownList { row = 0, column = 1, id = imageViewImage, current = 0, items = ["cat.jpg", "winds.png", "gifsInEmail.gif", "mountain.svg"]}, + TextView { row = 1, text = "Fit" }, + DropDownList { row = 1, column = 1, id = imageViewFit, current = 0, items = ["none", "fill", "contain", "cover", "scale-down"]}, + TextView { row = 2, text = "Horizontal align" }, + DropDownList { row = 2, column = 1, id = imageViewHAlign, current = 2, items = ["left", "right", "center"]}, + TextView { row = 3, text = "Vertical align" }, + DropDownList { row = 3, column = 1, id = imageViewVAlign, current = 2, items = ["top", "bottom", "center"]}, + ] + } + ] + } + ] +} +` + +func createImageViewDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, imageViewDemoText) + if view == nil { + return nil + } + + rui.Set(view, "imageViewImage", rui.DropDownEvent, func(list rui.DropDownList, number int) { + images := []string{"cat.jpg", "winds.png", "gifsInEmail.gif", "mountain.svg"} + if number < len(images) { + rui.Set(view, "imageView1", rui.Source, images[number]) + } + }) + + rui.Set(view, "imageViewFit", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "imageView1", rui.Fit, number) + }) + + rui.Set(view, "imageViewHAlign", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "imageView1", rui.ImageHorizontalAlign, number) + }) + + rui.Set(view, "imageViewVAlign", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "imageView1", rui.ImageVerticalAlign, number) + }) + + return view +} diff --git a/demo/keyEventsDemo.go b/demo/keyEventsDemo.go new file mode 100644 index 0000000..db46ae1 --- /dev/null +++ b/demo/keyEventsDemo.go @@ -0,0 +1,57 @@ +package main + +import ( + "strconv" + "strings" + + "github.com/anoshenko/rui" +) + +func keyEventHandle(view rui.View, event rui.KeyEvent, tag string) { + var buffer strings.Builder + + buffer.WriteString(tag) + buffer.WriteString(`: TimeStamp = `) + buffer.WriteString(strconv.FormatUint(event.TimeStamp, 10)) + buffer.WriteString(`, Key = "`) + buffer.WriteString(event.Key) + buffer.WriteString(`", Code = "`) + buffer.WriteString(event.Code) + buffer.WriteString(`"`) + + appendBool := func(name string, value bool) { + buffer.WriteString(`, `) + buffer.WriteString(name) + if value { + buffer.WriteString(` = true`) + } else { + buffer.WriteString(` = false`) + } + } + appendBool("Repeat", event.Repeat) + appendBool("CtrlKey", event.CtrlKey) + appendBool("ShiftKey", event.ShiftKey) + appendBool("AltKey", event.AltKey) + appendBool("MetaKey", event.MetaKey) + buffer.WriteString(";\n\n") + + rui.AppendEditText(view, "", buffer.String()) + rui.ScrollViewToEnd(view, "") +} + +func createKeyEventsDemo(session rui.Session) rui.View { + return rui.NewEditView(session, rui.Params{ + rui.Width: rui.Percent(100), + rui.Height: rui.Percent(100), + rui.ReadOnly: true, + rui.Wrap: true, + rui.Hint: "Set the focus and press a key", + rui.EditViewType: rui.MultiLineText, + rui.KeyDownEvent: func(view rui.View, event rui.KeyEvent) { + keyEventHandle(view, event, rui.KeyDownEvent) + }, + rui.KeyUpEvent: func(view rui.View, event rui.KeyEvent) { + keyEventHandle(view, event, rui.KeyUpEvent) + }, + }) +} diff --git a/demo/listLayoutDemo.go b/demo/listLayoutDemo.go new file mode 100644 index 0000000..bb115cf --- /dev/null +++ b/demo/listLayoutDemo.go @@ -0,0 +1,90 @@ +package main + +import ( + "github.com/anoshenko/rui" +) + +const listLayoutDemoText = ` +GridLayout { + style = demoPage, + content = [ + ListLayout { + id = listLayout, width = 100%, height = 100%, orientation = up-down, + content = [ + GridLayout { width = 200px, height = 100px, content = ["View 1"], horizontal-align = center, vertical-align = center, + background-color = #FFAAAAAA, radius = 8px, padding = 8px, margin = 4px, + border = _{ style = solid, width = 1px, color = black } + }, + GridLayout { width = 100px, height = 200px, content = ["View 2"], horizontal-align = center, vertical-align = center, + background-color = #FFB0B0B0, radius = 8px, padding = 8px, margin = 4px, + border = _{ style = solid, width = 1px, color = black } + }, + GridLayout { width = 150px, height = 150px, content = ["View 3"], horizontal-align = center, vertical-align = center, + background-color = #FFBBBBBB, radius = 8px, padding = 8px, margin = 4px, + border = _{ style = solid, width = 1px, color = black } + }, + GridLayout { width = 150px, height = 100px, content = ["View 4"], horizontal-align = center, vertical-align = center, + background-color = #FFC0C0C0, radius = 8px, padding = 8px, margin = 4px, + border = _{ style = solid, width = 1px, color = black } + }, + GridLayout { width = 200px, height = 150px, content = ["View 5"], horizontal-align = center, vertical-align = center, + background-color = #FFCCCCCC, radius = 8px, padding = 8px, margin = 4px, + border = _{ style = solid, width = 1px, color = black } + }, + GridLayout { width = 100px, height = 100px, content = ["View 6"], horizontal-align = center, vertical-align = center, + background-color = #FFDDDDDD, radius = 8px, padding = 8px, margin = 4px, + border = _{ style = solid, width = 1px, color = black } + }, + GridLayout { width = 150px, height = 200px, content = ["View 7"], horizontal-align = center, vertical-align = center, + background-color = #FFEEEEEE, radius = 8px, padding = 8px, margin = 4px, + border = _{ style = solid, width = 1px, color = black } + }, + ] + }, + ListLayout { + style = optionsPanel, + content = [ + GridLayout { + style = optionsTable, + content = [ + TextView { row = 0, text = "Orientation" }, + DropDownList { row = 0, column = 1, id = listOrientation, current = 0, + items = ["up-down", "start-to-end", "bottom-up", "end-to-start"] + }, + TextView { row = 1, text = "Wrap" }, + DropDownList { row = 1, column = 1, id = listWrap, current = 0, items = ["off", "on", "reverse"]}, + TextView { row = 2, text = "Vertical align" }, + DropDownList { row = 2, column = 1, id = listVAlign, current = 0, items = ["top", "bottom", "center", "stretch"]}, + TextView { row = 3, text = "Horizontal align" }, + DropDownList { row = 3, column = 1, id = listHAlign, current = 0, items = ["left", "right", "center", "stretch"]}, + ] + }, + ] + } + ] +}` + +func createListLayoutDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, listLayoutDemoText) + if view == nil { + return nil + } + + rui.Set(view, "listOrientation", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "listLayout", rui.Orientation, number) + }) + + rui.Set(view, "listWrap", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "listLayout", rui.Wrap, number) + }) + + rui.Set(view, "listHAlign", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "listLayout", rui.HorizontalAlign, number) + }) + + rui.Set(view, "listVAlign", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "listLayout", rui.VerticalAlign, number) + }) + + return view +} diff --git a/demo/listViewDemo.go b/demo/listViewDemo.go new file mode 100644 index 0000000..f2a36ac --- /dev/null +++ b/demo/listViewDemo.go @@ -0,0 +1,95 @@ +package main + +import ( + "github.com/anoshenko/rui" +) + +const listViewDemoText = ` +GridLayout { + style = demoPage, + content = [ + ListView { + id = listView, width = 100%, height = 100%, orientation = vertical, + items = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6", "Item 7", "Item 8", "Item 9", "Item 10", "Item 11", "Item 12", "Item 13", "Item 14", "Item 15", "Item 16", "Item 17", "Item 18"] + }, + ListLayout { + style = optionsPanel, + content = [ + GridLayout { + style = optionsTable, + content = [ + TextView { row = 0, text = "Orientation" }, + DropDownList { row = 0, column = 1, id = listViewOrientation, current = 0, items = ["vertical", "horizontal", "bottom up", "end to start"]}, + TextView { row = 1, text = "Wrap" }, + DropDownList { row = 1, column = 1, id = listWrap, current = 0, items = ["off", "on", "reverse"]}, + TextView { row = 2, text = "Item height" }, + DropDownList { row = 2, column = 1, id = listItemHeight, current = 0, items = ["auto", "25%", "50px"]}, + TextView { row = 3, text = "Item width" }, + DropDownList { row = 3, column = 1, id = listItemWidth, current = 0, items = ["auto", "25%", "200px"]}, + TextView { row = 4, text = "Item vertical align" }, + DropDownList { row = 4, column = 1, id = listItemVAlign, current = 0, items = ["top", "bottom", "center"]}, + TextView { row = 5, text = "Item horizontal align" }, + DropDownList { row = 5, column = 1, id = listItemHAlign, current = 0, items = ["left", "right", "center"]}, + TextView { row = 6, text = "Checkbox" }, + DropDownList { row = 6, column = 1, id = listCheckbox, current = 0, items = ["none", "single", "multiple"]}, + TextView { row = 7, text = "Checkbox vertical align" }, + DropDownList { row = 7, column = 1, id = listCheckboxVAlign, current = 0, items = ["top", "bottom", "center"]}, + TextView { row = 8, text = "Checkbox horizontal align" }, + DropDownList { row = 8, column = 1, id = listCheckboxHAlign, current = 0, items = ["left", "right", "center"]}, + ] + } + ] + } + ] +}` + +func createListViewDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, listViewDemoText) + if view == nil { + return nil + } + + rui.Set(view, "listViewOrientation", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "listView", rui.Orientation, number) + }) + + rui.Set(view, "listWrap", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "listView", rui.Wrap, number) + }) + + setItemSize := func(tag string, number int, values []rui.SizeUnit) { + if number >= 0 && number < len(values) { + rui.Set(view, "listView", tag, values[number]) + } + } + + rui.Set(view, "listItemWidth", rui.DropDownEvent, func(list rui.DropDownList, number int) { + setItemSize(rui.ItemWidth, number, []rui.SizeUnit{rui.AutoSize(), rui.Percent(25), rui.Px(200)}) + }) + + rui.Set(view, "listItemHeight", rui.DropDownEvent, func(list rui.DropDownList, number int) { + setItemSize(rui.ItemHeight, number, []rui.SizeUnit{rui.AutoSize(), rui.Percent(25), rui.Px(50)}) + }) + + rui.Set(view, "listItemVAlign", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "listView", rui.VerticalAlign, number) + }) + + rui.Set(view, "listItemHAlign", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "listView", rui.HorizontalAlign, number) + }) + + rui.Set(view, "listCheckbox", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "listView", rui.ItemCheckbox, number) + }) + + rui.Set(view, "listCheckboxVAlign", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "listView", rui.CheckboxVerticalAlign, number) + }) + + rui.Set(view, "listCheckboxHAlign", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "listView", rui.CheckboxHorizontalAlign, number) + }) + + return view +} diff --git a/demo/main.go b/demo/main.go new file mode 100644 index 0000000..1da38ea --- /dev/null +++ b/demo/main.go @@ -0,0 +1,163 @@ +package main + +import ( + "embed" + "fmt" + + "github.com/anoshenko/rui" +) + +//go:embed resources +var resources embed.FS + +const rootViewText = ` +GridLayout { + id = rootLayout, width = 100%, height = 100%, cell-height = "auto, 1fr", + content = [ + GridLayout { + id = rootTitle, width = 100%, cell-width = "auto, 1fr", + cell-vertical-align = center, background-color = #ffc0ded9, + content = [ + ImageView { + id = rootTitleButton, padding = 8px, src = menu_icon.svg, + }, + TextView { + id = rootTitleText, column = 1, padding-left = 8px, text = "Title", + } + ], + }, + StackLayout { + id = rootViews, row = 1, + } + ] +} +` + +type demoPage struct { + title string + creator func(session rui.Session) rui.View + view rui.View +} + +type demoSession struct { + rootView rui.View + pages []demoPage +} + +func (demo *demoSession) OnStart(session rui.Session) { + rui.DebugLog("Session start") +} + +func (demo *demoSession) OnFinish(session rui.Session) { + rui.DebugLog("Session finish") +} + +func (demo *demoSession) OnResume(session rui.Session) { + rui.DebugLog("Session resume") +} + +func (demo *demoSession) OnPause(session rui.Session) { + rui.DebugLog("Session pause") +} + +func (demo *demoSession) OnDisconnect(session rui.Session) { + rui.DebugLog("Session disconnect") +} + +func (demo *demoSession) OnReconnect(session rui.Session) { + rui.DebugLog("Session reconnect") +} + +func createDemo(session rui.Session) rui.SessionContent { + sessionContent := new(demoSession) + sessionContent.pages = []demoPage{ + {"Text style", createTextStyleDemo, nil}, + {"View border", viewDemo, nil}, + {"Background image", createBackgroundDemo, nil}, + {"ListLayout", createListLayoutDemo, nil}, + {"GridLayout", createGridLayoutDemo, nil}, + {"ColumnLayout", createColumnLayoutDemo, nil}, + {"StackLayout", createStackLayoutDemo, nil}, + {"AbsoluteLayout", createAbsoluteLayoutDemo, nil}, + {"Resizable", createResizableDemo, nil}, + {"ListView", createListViewDemo, nil}, + {"Checkbox", createCheckboxDemo, nil}, + {"Controls", createControlsDemo, nil}, + {"TableView", createTableViewDemo, nil}, + {"EditView", createEditDemo, nil}, + {"ImageView", createImageViewDemo, nil}, + {"Canvas", createCanvasDemo, nil}, + {"VideoPlayer", createVideoPlayerDemo, nil}, + {"AudioPlayer", createAudioPlayerDemo, nil}, + {"Popups", createPopupDemo, nil}, + {"Filter", createFilterDemo, nil}, + {"Clip", createClipDemo, nil}, + {"Transform", transformDemo, nil}, + {"Transition", createTransitionDemo, nil}, + {"Key events", createKeyEventsDemo, nil}, + {"Mouse events", createMouseEventsDemo, nil}, + {"Pointer events", createPointerEventsDemo, nil}, + {"Touch events", createTouchEventsDemo, nil}, + //{"Tabs", createTabsDemo, nil}, + } + + return sessionContent +} + +func (demo *demoSession) CreateRootView(session rui.Session) rui.View { + demo.rootView = rui.CreateViewFromText(session, rootViewText) + if demo.rootView == nil { + return nil + } + + rui.Set(demo.rootView, "rootTitleButton", rui.ClickEvent, demo.clickMenuButton) + demo.showPage(0) + + return demo.rootView +} + +func (demo *demoSession) clickMenuButton() { + items := make([]string, len(demo.pages)) + for i, page := range demo.pages { + items[i] = page.title + } + + rui.ShowMenu(demo.rootView.Session(), rui.Params{ + rui.Items: items, + rui.OutsideClose: true, + rui.VerticalAlign: rui.TopAlign, + rui.HorizontalAlign: rui.LeftAlign, + rui.PopupMenuResult: func(n int) { + demo.showPage(n) + }, + }) +} + +func (demo *demoSession) showPage(index int) { + if index < 0 || index >= len(demo.pages) { + return + } + + if stackLayout := rui.StackLayoutByID(demo.rootView, "rootViews"); stackLayout != nil { + if demo.pages[index].view == nil { + demo.pages[index].view = demo.pages[index].creator(demo.rootView.Session()) + stackLayout.Append(demo.pages[index].view) + } else { + stackLayout.MoveToFront(demo.pages[index].view) + } + rui.Set(demo.rootView, "rootTitleText", rui.Text, demo.pages[index].title) + } + // TODO +} + +func main() { + rui.ProtocolInDebugLog = true + rui.AddEmbedResources(&resources) + app := rui.NewApplication("RUI demo", "icon.svg", createDemo) + + //addr := rui.GetLocalIP() + ":8080" + addr := "localhost:8000" + fmt.Print(addr) + rui.OpenBrowser("http://" + addr) + app.Start(addr) +} diff --git a/demo/mouseEventsDemo.go b/demo/mouseEventsDemo.go new file mode 100644 index 0000000..43103b7 --- /dev/null +++ b/demo/mouseEventsDemo.go @@ -0,0 +1,111 @@ +package main + +import ( + "fmt" + "strconv" + "strings" + + "github.com/anoshenko/rui" +) + +const mouseEventsDemoText = ` +GridLayout { + width = 100%, height = 100%, cell-height = "1fr, auto", + content = [ + GridLayout { + padding = 12px, + content = [ + GridLayout { + id = mouseEventsTest, cell-horizontal-align = center, cell-vertical-align = center, + height = 150%, + border = _{ style = solid, width = 1px, color = gray}, + content = [ + TextView { + id = mouseEventsText, text = "Test box", + } + ] + } + ], + }, + Resizable { + row = 1, side = top, background-color = lightgrey, height = 200px, + content = EditView { + id = mouseEventsLog, type = multiline, read-only = true, wrap = true, + } + }, + ] +} +` + +func createMouseEventsDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, mouseEventsDemoText) + if view == nil { + return nil + } + + addToLog := func(tag string, event rui.MouseEvent) { + var buffer strings.Builder + + appendBool := func(name string, value bool) { + buffer.WriteString(`, `) + buffer.WriteString(name) + if value { + buffer.WriteString(` = true`) + } else { + buffer.WriteString(` = false`) + } + } + + appendInt := func(name string, value int) { + buffer.WriteString(`, `) + buffer.WriteString(name) + buffer.WriteString(` = `) + buffer.WriteString(strconv.Itoa(value)) + } + + appendPoint := func(name string, x, y float64) { + buffer.WriteString(fmt.Sprintf(`, %s = (%g:%g)`, name, x, y)) + } + + buffer.WriteString(tag) + buffer.WriteString(`: TimeStamp = `) + buffer.WriteString(strconv.FormatUint(event.TimeStamp, 10)) + + appendInt("Button", event.Button) + appendInt("Buttons", event.Buttons) + appendPoint("(X:Y)", event.X, event.Y) + appendPoint("Client (X:Y)", event.ClientX, event.ClientY) + appendPoint("Screen (X:Y)", event.ScreenX, event.ScreenY) + appendBool("CtrlKey", event.CtrlKey) + appendBool("ShiftKey", event.ShiftKey) + appendBool("AltKey", event.AltKey) + appendBool("MetaKey", event.MetaKey) + buffer.WriteString(";\n\n") + + rui.AppendEditText(view, "mouseEventsLog", buffer.String()) + rui.ScrollViewToEnd(view, "mouseEventsLog") + } + + rui.SetParams(view, "mouseEventsTest", rui.Params{ + rui.MouseDown: func(v rui.View, event rui.MouseEvent) { + addToLog("mouse-down", event) + }, + rui.MouseUp: func(v rui.View, event rui.MouseEvent) { + addToLog("mouse-up", event) + }, + rui.MouseOut: func(v rui.View, event rui.MouseEvent) { + addToLog("mouse-out", event) + rui.Set(view, "mouseEventsText", rui.Text, "Mouse out") + }, + rui.MouseOver: func(v rui.View, event rui.MouseEvent) { + addToLog("mouse-over", event) + }, + rui.MouseMove: func(v rui.View, event rui.MouseEvent) { + rui.Set(view, "mouseEventsText", rui.Text, + fmt.Sprintf("(X:Y): (%g : %g)
Client (X:Y): (%g : %g)
Screen (X:Y): (%g : %g)", + event.X, event.Y, event.ClientX, event.ClientY, event.ScreenX, event.ScreenY)) + }, + }) + + return view +} diff --git a/demo/pointerEventsDemo.go b/demo/pointerEventsDemo.go new file mode 100644 index 0000000..2d09cc5 --- /dev/null +++ b/demo/pointerEventsDemo.go @@ -0,0 +1,129 @@ +package main + +import ( + "fmt" + "strconv" + "strings" + + "github.com/anoshenko/rui" +) + +const pointerEventsDemoText = ` +GridLayout { + width = 100%, height = 100%, cell-height = "1fr, auto", + content = [ + GridLayout { + padding = 12px, + content = [ + GridLayout { + id = pointerEventsTest, cell-horizontal-align = center, cell-vertical-align = center, + border = _{ style = solid, width = 1px, color = gray}, + content = [ + TextView { + id = pointerEventsText, text = "Test box", + } + ] + } + ], + }, + Resizable { + row = 1, side = top, background-color = lightgrey, height = 200px, + content = EditView { + id = pointerEventsLog, type = multiline, read-only = true, wrap = true, + } + }, + ] +} +` + +func createPointerEventsDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, pointerEventsDemoText) + if view == nil { + return nil + } + + addToLog := func(tag string, event rui.PointerEvent) { + var buffer strings.Builder + + appendBool := func(name string, value bool) { + buffer.WriteString(`, `) + buffer.WriteString(name) + if value { + buffer.WriteString(` = true`) + } else { + buffer.WriteString(` = false`) + } + } + + appendInt := func(name string, value int) { + buffer.WriteString(`, `) + buffer.WriteString(name) + buffer.WriteString(` = `) + buffer.WriteString(strconv.Itoa(value)) + } + + appendFloat := func(name string, value float64) { + buffer.WriteString(fmt.Sprintf(`, %s = %g`, name, value)) + } + + appendPoint := func(name string, x, y float64) { + buffer.WriteString(fmt.Sprintf(`, %s = (%g:%g)`, name, x, y)) + } + + buffer.WriteString(tag) + buffer.WriteString(`: TimeStamp = `) + buffer.WriteString(strconv.FormatUint(event.TimeStamp, 10)) + + appendInt("Button", event.Button) + appendInt("Buttons", event.Buttons) + appendPoint("(X:Y)", event.X, event.Y) + appendPoint("Client (X:Y)", event.ClientX, event.ClientY) + appendPoint("Screen (X:Y)", event.ScreenX, event.ScreenY) + appendFloat("Width", event.Width) + appendFloat("Height", event.Height) + appendFloat("Pressure", event.Pressure) + appendFloat("TangentialPressure", event.TangentialPressure) + appendFloat("TiltX", event.TiltX) + appendFloat("TiltY", event.TiltY) + appendFloat("Twist", event.Twist) + + buffer.WriteString(`, PointerType = `) + buffer.WriteString(event.PointerType) + + appendBool("IsPrimary", event.IsPrimary) + appendBool("CtrlKey", event.CtrlKey) + appendBool("ShiftKey", event.ShiftKey) + appendBool("AltKey", event.AltKey) + appendBool("MetaKey", event.MetaKey) + buffer.WriteString(";\n\n") + + rui.AppendEditText(view, "pointerEventsLog", buffer.String()) + rui.ScrollViewToEnd(view, "pointerEventsLog") + } + + rui.SetParams(view, "pointerEventsTest", rui.Params{ + rui.PointerDown: func(v rui.View, event rui.PointerEvent) { + addToLog("pointer-down", event) + }, + rui.PointerUp: func(v rui.View, event rui.PointerEvent) { + addToLog("pointer-up", event) + }, + rui.PointerOut: func(v rui.View, event rui.PointerEvent) { + addToLog("pointer-out", event) + rui.Set(view, "pointerEventsText", rui.Text, "Pointer out") + }, + rui.PointerOver: func(v rui.View, event rui.PointerEvent) { + addToLog("pointer-over", event) + }, + rui.PointerCancel: func(v rui.View, event rui.PointerEvent) { + addToLog("pointer-cancel", event) + }, + rui.PointerMove: func(v rui.View, event rui.PointerEvent) { + rui.Set(view, "pointerEventsText", rui.Text, + fmt.Sprintf("(X:Y): (%g : %g)
Client (X:Y): (%g : %g)
Screen (X:Y): (%g : %g)", + event.X, event.Y, event.ClientX, event.ClientY, event.ScreenX, event.ScreenY)) + }, + }) + + return view +} diff --git a/demo/popupDemo.go b/demo/popupDemo.go new file mode 100644 index 0000000..9529caa --- /dev/null +++ b/demo/popupDemo.go @@ -0,0 +1,86 @@ +package main + +import ( + "fmt" + + "github.com/anoshenko/rui" +) + +const popupDemoText = ` +GridLayout { + width = 100%, height = 100%, cell-height = "auto, 1fr", + content = GridLayout { + width = 100%, cell-width = "auto, 1fr", + cell-vertical-align = center, gap = 8px, + content = [ + Button { + id = popupShowMessage, margin = 4px, content = "Show message", + }, + Button { + id = popupShowQuestion, row = 1, margin = 4px, content = "Show question", + }, + TextView { + id = popupShowQuestionResult, row = 1, column = 1, + }, + Button { + id = popupShowCancellableQuestion, row = 2, margin = 4px, content = "Show cancellable question", + }, + TextView { + id = popupShowCancellableQuestionResult, row = 2, column = 1, + }, + Button { + id = popupShowMenu, row = 3, margin = 4px, content = "Show menu", + }, + TextView { + id = popupShowMenuResult, row = 3, column = 1, + }, + ] + } +} +` + +func createPopupDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, popupDemoText) + if view == nil { + return nil + } + + rui.Set(view, "popupShowMessage", rui.ClickEvent, func() { + rui.ShowMessage("Hello", "Hello world!!!", session) + }) + + rui.Set(view, "popupShowQuestion", rui.ClickEvent, func() { + rui.ShowQuestion("Hello", "Are you alright?", session, + func() { + rui.Set(view, "popupShowQuestionResult", rui.Text, "Answer: Yes") + }, + func() { + rui.Set(view, "popupShowQuestionResult", rui.Text, "Answer: No") + }) + }) + + rui.Set(view, "popupShowCancellableQuestion", rui.ClickEvent, func() { + rui.ShowCancellableQuestion("Hello", "Are you alright?", session, + func() { + rui.Set(view, "popupShowCancellableQuestionResult", rui.Text, "Answer: Yes") + }, + func() { + rui.Set(view, "popupShowCancellableQuestionResult", rui.Text, "Answer: No") + }, + func() { + rui.Set(view, "popupShowCancellableQuestionResult", rui.Text, "Answer: Cancel") + }) + }) + + rui.Set(view, "popupShowMenu", rui.ClickEvent, func() { + rui.ShowMenu(session, rui.Params{ + rui.Items: []string{"Item 1", "Item 2", "Item 3", "Item 4"}, + rui.Title: "Menu", + rui.PopupMenuResult: func(n int) { + rui.Set(view, "popupShowMenuResult", rui.Text, fmt.Sprintf("Item %d selected", n+1)) + }, + }) + }) + + return view +} diff --git a/demo/resizableDemo.go b/demo/resizableDemo.go new file mode 100644 index 0000000..26051fe --- /dev/null +++ b/demo/resizableDemo.go @@ -0,0 +1,79 @@ +package main + +import "github.com/anoshenko/rui" + +const resizableDemoText = ` +GridLayout { + cell-width = "auto, 1fr, auto", cell-height = "auto, 1fr, auto", + content = [ + Resizable { + id = resizableTop, column = 0:2, row = 0, side = bottom, + background-color = lightgrey, + content = GridLayout { + cell-vertical-align = center, cell-horizontal-align = center, + background-color = yellow, padding = 8px, content = "Top", + } + }, + Resizable { + id = resizableBottom, column = 0:2, row = 2, side = top, + background-color = lightgrey, + content = GridLayout { + cell-vertical-align = center, cell-horizontal-align = center, + background-color = lightcoral, padding = 8px, content = "Bottom", + } + }, + Resizable { + id = resizableLeft, column = 0, row = 0:2, side = right, + background-color = lightgrey, + content = GridLayout { + cell-vertical-align = center, cell-horizontal-align = center, + background-color = lightskyblue, padding = 8px, content = "Left", + } + }, + Resizable { + id = resizableRight, column = 2, row = 0:2, side = left, + background-color = lightgrey, + content = GridLayout { + cell-vertical-align = center, cell-horizontal-align = center, + background-color = lightpink, padding = 8px, content = "Right", + } + } + GridLayout { + column = 1, row = 1, cell-vertical-align = center, cell-horizontal-align = center, + content = Resizable { + id = resizableRight, side = all, + background-color = lightgrey, + content = GridLayout { + cell-vertical-align = center, cell-horizontal-align = center, + background-color = lightseagreen, padding = 8px, content = "Center", + } + } + } + ] +} +` + +func createResizableDemo(session rui.Session) rui.View { + return rui.CreateViewFromText(session, resizableDemoText) + /* + return rui.NewGridLayout(session, rui.Params{ + rui.CellWidth: []rui.SizeUnit{rui.AutoSize(), rui.Fr(1), rui.AutoSize()}, + rui.CellHeight: []rui.SizeUnit{rui.AutoSize(), rui.Fr(1), rui.AutoSize()}, + rui.Content: []rui.View{ + rui.NewResizable(session, rui.Params{ + rui.ID: "resizableTop", + rui.Column: rui.Range{First: 0, Last: 2}, + rui.Row: 0, + rui.Side: rui.BottomSide, + rui.BackgroundColor: rui.LightGray, + rui.Content: rui.NewGridLayout(session, rui.Params{ + rui.BackgroundColor: rui.Yellow, + rui.CellHorizontalAlign: rui.CenterAlign, + rui.CellVerticalAlign: rui.CenterAlign, + rui.Content: "Top", + }), + }), + }, + }) + */ +} diff --git a/demo/resources/images/A.png b/demo/resources/images/A.png new file mode 100644 index 0000000000000000000000000000000000000000..03a4703dcef2b8acf702a5d73c76ea5c969840a3 GIT binary patch literal 14656 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 literal 0 HcmV?d00001 diff --git a/demo/resources/images/A@2x.png b/demo/resources/images/A@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0cab01ab7c5f7f9b8adff83072d9ff132fee333d GIT binary patch literal 6556 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 Tnnacf#4*w>b#Y?R;(!0y^zVRl literal 0 HcmV?d00001 diff --git a/demo/resources/images/cat@2x.jpg b/demo/resources/images/cat@2x.jpg new file mode 100644 index 0000000000000000000000000000000000000000..47dce7074e1871bb00b1a16d9763b09f0a7f0773 GIT binary patch literal 49922 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 Tnnacf#4*w>b#Y?R;(!0y^zVRl literal 0 HcmV?d00001 diff --git a/demo/resources/images/gifsInEmail.gif b/demo/resources/images/gifsInEmail.gif new file mode 100644 index 0000000000000000000000000000000000000000..2123df8060366e3e35d3ef08f5f1b4c4efbcfee6 GIT binary patch literal 143278 zcmcG#RZtua*rpwaK!7B;ySqCC_rcxWA-KD{ySoqW?(ROo;0}X3WPaZN+uDPz+QaRm zKD_Vl=eoM9pK37)Q4UUh)~}FH51)dABJvxO z%G=|C0|ku(^@9tO%Ug?^$9pG`oBOBxro>i^(1g5x&+#b@-B z-yG?WIf{@8ridxFgcY`w1DcczuADQXybrOgJ&C*{m69`!vKzCOC#$wQr@r?uS$|Ze zKrEF&EY(n4%`jAz5CmC2LKQz^%^)hBAPyZrQr%cegJ>SZ02ZS#N~3scvm`Q;R4U6% zE}LX-+cb8oH15C2)HeBKR=JE$RgA7c28R-Q=NfwVdPbL8X76@k^I%Eq2ocM0fPIv_ zeYB8Mrj&cOf>XSvN0PQzx{7ZQK&P%>x`BU&d2p6#V7gso zj*?%YdQh=uaG7>^g>qmSz_-vkBHtve&@v8a90zoYE%HtSx+IhuM%9?a)mp~a+N9Rn zCpS2zHF{(;cx1OZXSQ+#4{}A$`ey(`bE*R~YeRDy{0lpyirUhvI^&9)vunG8ih83e z`$J0mGJ(AbwL@9;{Ymws8I9vvEfWRplNDVPC9OlX-BX2~b7kFgRlSo9eN&bF^VLHu ztwVE-qe~rQ3-!aRjiaj_lWSeG8=bS;y%URlQ=oyljq!zzsTJ_>?DFjDX8*$WBxrXO zv_HSGw*uZ<+c{X=K3?BD-8_OU?;L`UuC@=(j?XXl&#sTpZ_cl7FK(Z%@9ys(AI>f> zKC^0nWzqb`sRP4h0Lx|kgU1k2&;m);=ckq)s7e9oqJPolz0g&| zFhoqTRD!Tn!?4BQC&3z9+5tz-8Ba3|UoV_M){RibpGY%^ zb18M+Z+8@>aRMO}9w4HmC?p^!!bHdL`QwKV9|)hmd|~^gqz)~WB% zzSH|3v^w4#rV$(g-5kL~?-;-H{EjiFO)^*H47Y&~x1m3;UGlpZ{#YfvyFkz>Q`jO{ z)G}PuHTT^M;+7$j?%7f{5z=1yGJXXByC`{wXa(;)MW;ALw`e8zH06MzcXy};m#GI9 zYj`AS1ea-grD=s#==f#o`=q_w#3&%cI4I8~y4ExnXdYH*o=|TQoMjP`Wf>2&OsKUA z&$mlycsGtiTBBoBiBnv$Q%0*>X0v-%+q;82Q~uMCZ*rA?dR0JXT|i-HU~z9)PF+~p zKzM2AyNM!-+9NCacRB7fec`0M$>p^O?Oty_`9bHIwlJ{XNy}0 zOM2%^yJySVhATVAs`?jzy;HSa6ZL(Q?;>j&T4)+wY8qQ@p9FP|FLq6Db$>$~gQyZ;g8yCvUU`QOC;KR95aA9`VN#A|YU17MM< zCa#MJ(L#QrOWq3Fg%6UW;RDu3;)sVLk@@Mqq{$hLgpwn~Cz{piN%>R%;+j=sI_Qm{ zSKgTjQ#cUI`0NI!m8N(kk*gNztTkqTD4WSbeZTO8LOEZ7$H?@ftg(2JUQ*wA62xpZ zQ)^I={T7}~rCM*fZ6H(5b`Gi%>ZW3$a)F4JD1U?zrBbWj?03a&!fjmvE;l=27MxKx z*zdN-cVZQ{J)Icmi*UD#NNYH3_r}RgqiBO}4rgNwO#wXEM8+A(t0w^56!ycengH%% zDLamHP=ao=idP$_Qq+_eJ^znP4*M*hqzWzTSFV*IeRgVSHCVIFvX4Y4Yr*eu5>RxISXl0d7;b;x(+F*>`3M+YnaB$0F^WATUs}(7QZA{ zp8(covkF_?z>Ny!Qs7KFvJC3{J;4|1mOI2@h)Wj8!n|ti`4nQyg(zL*(K2TV{M#1J zm78Oe~sV?Qu4;7iy4&G1Nb^&=n42Q*E zYurqIte+(r%g7x%%yTr^#}22No3$I7?S!DO_TvOM+Du>_cwF1`kL1d95sqt5N*m4v z&J2}Shm-U}+}#Mp6Mh~bl;9wIx~hUOJDuJ6XhZFXJ*C#s&3trr?WT%6&2_f}RP`sW zH8$dQ*P&Rks^=vhxZqZEwLu7H<0=H$YMbov*pgCuA;a93t`c*7DNyfS4qjT*dbuXw z&A^}Et3YF4e(g%Xx%dk+jq$J%l1g#b19{0=IPeJJgQ(u%T@HL;+xjSOaT7t zFxVO&C!HG5>i#kcW^SOMy0Fuw*8ZJeBhvZP(nnQy5pJ_U5P6^2?9z)A_O~wgM$eV* zrSNBvd0{?ojEmUqjBI!)3i#75MUy~&8Ap&=Aw|6|Rcvo^h+x!}>7K?TpJ z@G)OR2^LW*%Qy_|O=f;rjzZ%pCM{ut>jP79%emj~AZ{>i(eZ?Y=!nr%dm%L^W#t>L zh5ulr3CE#?jPaaYV!6>l->o^cdFB^$Fdybl)1RQmwRL7sb+saz3h@DZ&`jRPsxVGt z$9AI~#+2>XY#QeHk!Ugi022k14>fH({@JeZO1Mx*VHDt(f1INhm;crlHWO|?RLB%q zOeYVLbt_gh-yz8nU_Kt*rKk)6Na~44w8;Dd#g=fe5()FCb2|YXQ?mqcl;b4kLYy38 z=&kXUSh*IjqwW%aB@r{MwQ{PN%&Td?nxoucEal?OYyZ2ZKynIScKSCLq1!+yEwD;;+9Mb&RrddQ8Yh1~-_P7Q@BBbh4I?9ce zi)Vsv6(e!pOJz|(r{*pi(+4IGjem?S%-hR{zMYV@YO>m9n^kDL%8 zcWTY!r9(?AZ0hb~4{M65cHEW91t~Mpq2?LksNBU~txTTS|zA?`*rP zG5owPZf@aV_|1#N38u_YO?yRM7GU7gUm?be*4X>cUn-i$Vi?(=VRR@-Gqn~5fN^u7 zCNP*CD^)g`fe3`E5fa-U(+x^F`?s>3MU|&2XRZZ;;|8UMXe@R;O&-9j7Pg<5j1pf> zP{mv($oup)ce&&)@}KHxgAMIc#E)kz;z#A9k5Q1K*4Le9r-Wtd(+@dT{@J9AC1*30 zCz+`zIQ))QvB(MXV8R&`3@GK&qP_pOiYZq%nVQOQyowHK|H zuKHP7DStvckDQaQ7EKV@t4E)$$|bp0t$F^IkBk2G6?**}W1@A{p}ocgt^&`L-$zqx zZu-ii)%rr0s!?^1Poh0CXY=oG#ubCN3NJAcds_*z$d!IHSc$YMb5r0LPG6bj4 zo|+?cR6MI$DzfegM)U9n*zlKzk3p?NF~Bz9tQNsywmxvvQg^>e^F$G8spptnKiRZX zO_JU1gPqj{`f}&&EM8rsROWWY4ctlNg5&i;)d_Np!n%eh;)Ix)!&w*o{;%YVF6DOT z0o`xA{x%mYNu8E-UT3=@(B}qmL~UdU@0@)X#O==9wY8ZqI>P7XhiR7;NRt%OmD~~R zgX6^Ke*vM~a6XWF8xHi)xvfL@_+C4yzf#9CPqlgDjVt>o!`<*01Z_IkwFRHU zS3z$`fqK7!+Ha_rJMJ*YybAC= z672Q>7aPB?Zl%p8XT&}NCEooo^09)hBg@8!4VGbrO0Y_HLdqun$-ce;j;2bS>xVwr zqMoQjj*$-*J>-5*WJDV5*0uM4^&k8K!-?l7)a46uP%dyYTQ z4OovF@B` z-{HR=tr}D9deH-DOQHzBSgp30J(=nSHTv|L=ntAja_)zk)~mO{s^5o*cD3+Jn%Uh` zc#$f_G{A~1g*vPrL_e^Tq4XJ6)gjNTMRzU6h>7bRQ1GCZI2Jxwo;5{^s3<pR@Gi23=*}#%+)04ltA`lEb>;Vf9$~*!~VT#DL1C6 zLY!$dteLhjIH_h_b>HNQzsClR2AGA|4=yB0 zYc28WPBL&Y&a5vDDU%4CK(o~m&1`8k*clBRD#;K}5=wN-ZW+=&Ye_pg%32G_x^T-$ zz)aJVh)015(q>nzZO*)6kEt``fKeyRG0i=Aj1>K>|0E)`#~PUYJw-J(gYS_Aw3~`} zoR)(b>}bN1g6VHP5{|rToo1H86`qEU9&dT1XqFZorfzusT?<-f;>Vc{OBv#w>IF&5 z8hm1xb@Zrxj2kaWGgt`_xQ?YLPeefpIgc;k1{Ly2dU4E2U~v>&e%Et6&bV!eix*C3 z4=?cknl4zH62Yl$!Q~Rk86R%uk0a^L%9(PSmn6p_;WC_md`xTx1zB+wl^U_@$F`L; zhvl%06cRq0eozhZH7km+U=x*;PiQM{P|lOZ64(mN<|<3@A5GeBF7(mJU#6_kVJ&9h zibfwRkwVXLc6ZdLEU*wZoG^v;0jy;70YJLPgO-7>BX8{G9w!WQ1gIp)}%(_FxglYnNfKDU!(vevdjvn~>> z0vV5XA*yP$^)yZ#TKK@YlkxWT(>5ONXk@8A62;D2%kFPle=*yeakZS~w1P!P-0-cc zt0T(U&eC}s2fj*nHk8$WZ&#}nB8_a(@@$UM^r{9m+lpy{xSLg=nXTy3&BLj&vSayCQpCvaO@Wn>6F0*n z0}0HL-Hbf>s+65(kv+{^F7grS2GYaahOLT`l3^Vo-^-fnGW%lAh8sbN?#F~w zMC3|`}M)lPu z>7{yp4Uf%EjPzv&e0uC|iLBurs2hu{g?p-J|Ix3_6_WOv(K!}&<1sZ`(fdhjbn>jK zm$I>LY=}%cYggI~CAkB{3w3nR8{smh60_tfx-ddehIfo&~Kb%aQSO zZjSoQppD3Z;pOz~%-Ouk)bB8LYnB5y&|NNtHn!|Y<2ws_`IQ0Hh}JrfapkbS9O-Gi zF^d)Kt{ZL#Kdm|CW;?x=`mp=Sjj^`N)5$7U+tcR(0-8Zd-U+p=9A!%vQT2Iu%M$%b zzB9~%&(9rV2+gbQqeQq9Jn+*AE3JB3*1luZz+0(6>YE9ZlhYS|5&?U zUE!f&DUbnufKRfeU6!Ejno`;rfoe1ezX3OR*D6rgwKf*ZvT`MPz_^lN!%lGekFlq< zF(TH7kDFLb+Td*2$rSJvRiA_>foWH0*O&7%ddPv}t#I|VTC1I$%jBJ4HmP-v z$X;0KZ5Pbcp0a+$q)nd34ovXuHtnX}+Abkt%)Hfv`3RUJdzamNkM?_i3fsIvRGxr$ z*K*~~hpwHqvyD~iUVg1jf{pxyLd*O>C^nJaca? z6%}Jg8`G}m2hca;wzqXXXtrmV&D62A#dyS?2cAQ$W6#dPlnC8+p!a?!&8`Vd4kBVl z-^+~E>oIt3=f2}O5G&0pb+hNSB?%Cv1Sph|sgJ>m>nL4k&|Yvq*x^Rpfn>GSMlVH7 z9gP+5E#3RwX?9!;PGSG>y+zx;vdiZf+$F8@&7&Th;dAY`*}$h-^j|9@4NDguoQ*R2K&%&y`aHJgyx% zZtY6nZMgUjm{x?EUuL|u3P+_@KxT-dyJInraGj4YL5J)VW6rqO1J4H|8&|7*6G9z1 zkI~f#(kB+Y_?Dg%=l`xRvsV>tgE7Tt=cE%bs_j`lrM}QxtN7gE=w2*D-Evn>lX-!M zEFhH=({9cEx{<1sgYZv@$FWI)Wu7sHLyFv@Ga)->Hu)xo*N=k{Q&s39n43S zD7y*ZMCAkLuxa*2K%ZGRFEg{QN4%f9Qo^f{jBlqxt-5Z5b1ZX^ayhhT)>{`_k?!zu z&H%vkZYa`gAMSIe$-K~H5101AGeTe)evZWPGkE$^lYWF8C%qZzA<%aHiQ>>5?P<7G zwi4;5UKcEh+RThWx+`C*Qi-rRr&u~wZ}<~rFT>rm1&X%o#X^;IwvcIbxwBAys<&CI_u0V1)xx0E z=?Oy>vZh!*GsypoOU#y;!n8Xaf_(o&Gv02og!8LVwi@X6ur;u=PKLXU$$UYA83stL z4uKl4*p7RzN3GhUFJvo2|7B@VL6SS$iF9o;+#q|BenK&4TH$t}>H2K&loE^CX5XL# zU-X-k!+F+p!Ze&tt>wvP(R8uqn)~y5Wi{0Rzo*Y%=-w$k8zejf(6#st<&y1f=jJ=z zMP0jX7xj@tP4(43WQIOSAN+Yo{{(WVz}IuCnwnD%VY$Ig@s4Q0pPQOe1J@>wzl7k8 zrDN##RTeIXKTHQ8iC`c*R*QcBm=QaKVQFlOPUf_kYOlY8E)?5%q@|&2E5Ek-GY`H-E(#R^&f0no)%O2UVph(T!DA#;_`+EkF znRKQ{NLQw2QOZFiNe-5L@@`^91yx1aaB?0p$7x=rJTLQ5IifB&4v*TYo3xlD(>})K zJgQWWzz#CayIWk3bC*d`<2%=~nEb;orKCZu2;Zb^6qID8X`}wB8Du}}bg$*mXzkon zx>bZeFMrDVsDt+TD+i6rTSMKB-5M+Nj^7(UrX(_u4pzN+EsVN<)cl7ZXuDCK@z#KP3XJ zw4FGLyULV;=@h5RihH^`Z;P4~)m1vGeZME1rWku_-k!*6^=tdUe7D{U4YX^dji7bj zO%G|YX1-F=n&9g^K(=kKHEG}*eVT8!=P)(7JSx7KTs1eO&7M7}U^La3rY@lF*wd_E z(y$hG)Vt%mXO?vz_=%ekN>gm4{9=Y)7a zgdASKJq%!rE#IB+@2y^sxBmmV_eaEpxr2_28ytFw(QVyR_W!k*tdAmfKOAiwdJkOh z(^>7e&I&Cw^Q&oJkOc_oy*54YemFq<^V4&6Aoj3%uohnbW8zBM>oW9Dx^|39I<_VZ zKCHkY}nS`7ML&&#NZsYla8!E@;>=}9UvI84hnqVIMg(>eMGqMA#un@(i{;6nF~j1HE1Ig9W|oZ zSgX)e?S8pS=_Ru%blX!e_|Y5E#bYxN%&er4YEL0R3p#UBGfE&JcdlFeQx>g$R)9Z@ zPJA!IXrA6d(&Wk^&P`Pt8X*h_Cn)M1p@k0*MA--P6bt3|P74^4?2yPl33VAWCRSGN zo#Ta#DKQzvB;yb$jHvK)Nm?Wzc;aHOtq8G`T}Ktt$T6k~vj2c0%qNSZ6#vYitrDwl@+vESe zUpG45ewf7c&kehj)OBU}#cd&rlZ2dxf^-}f>&`d%RX#x9d=M&1-o(|rX)GvdRz2s@bI$bKtbI8(o<$|3zJhazc&3x`OX;Obxrtqp^Z}!ytdZChv#;$ zlc8*L(lRmpXZ{=&r{XQE7(g2aeX4(Nx(n@D-cp)Udk_n>V92Qav*Ad;$NgOnm-VTb z=GfH0zZ(g~4T|}#aN0VJyR>WzLNyt4&U*joa+d`nmR;DYK_)a`H^m}T{gTO6d)5@+ zN^R7afCbOu>iSd%^09^`t$vyNa@H&>Q9^Xp#xX^!s6G>w<@7E(;qnk0(i3>y_JQlJ zi>i23volzDt!=Q1ud$(?lz<6aZ}5D|2*Qa+<8kK}ont3Ehm$5eUF2F9}xh2;_o)LWhBXHQr#?R4p<443;G&sLT4@xVL4 zO~^f?Ws_~`Ot$)y)lVeU%^|19RreqhF?i4E7UzAN1a1|ENl zc7=87?jF4yvhCM4X>OmU{cJ!WN%w6zNJ-W%k20_#Yc~npW?TSp%-*dYE=pjhZ69Ax z(({^S80HpC2f8qYakY2yF(M33YQ`S2Z$1z4sFF!v(Q;vD8)LiXpm#k8W^F8n(mwQZ zvhD9yW}GQRRtmB6b0!!a*GZw5C5%H4orCL}Ip3J2O3M&!R|xq$C6^(G>MDjC(K^FL zfiF>2x{eLY+=oA7E;jjTUrwmj+?r$9HzutXYLWTRDS{IgKjt_k5pNE#8+w1QZYi3H z;QJ@;({*hcb7?u=wAf!bZ`mQijByFyPX1E+ufDb5noftgyR0I8*pNMMt~=Tzr)8e` zcl;j{?#}xH;2Sb4k|UqI8|(Ni!-`_h*>AqAg4R7u%iiEbVxi-Jtl6&#jy@%z|G$nk|Vsw{!bglzQ!d z3ko#wk~H*q$O~G|3oXE>QjxH$1^mH7W*H9au%Q~D=@^hv=y1GhVZCjK%@ZbA=zTTo zxkT>8K&Iz=6{axa6{O)_uM@iKgGXlR$6e?lr|FcOFLRS3`_myJMN>X5LAD~)>xxC< zD$q}ABoHtzqHRTf1A-4Q7)TvUw)nwmYSju^t8V)&ilrq?J-~ob*r_Zn;_|WAc&<_O zmdI+M!IY;6cA&`kNB>uBG26re*unx5OE$Z!0inb`g1~<4o09(iUbjLqj?Y6!$V`d_ zLk5mQfoG!8Lc=}8wVYpsp#A}WW=4lxv^pk;MOX1^xSz59 zT(2?WeIJfD5=1f*jZ~t8y%~+FgiSvik@EQE)X`@9Ww>;_pX0UMEJ37`N)iQ|qIjYu zX^p)dg+D=w^+7{idOb~FOQOnCvMFAYdYxBkqV24#y#M29E0O4tUh8)f25pP6+(dMs z67R*$2*FyxRR7QTN@-^4@mxRY%es7uOX09ue{F0c2ZANv=4(#@6~a{E1dwq^(@0izuOn#{P_odvfipHg3sm{h`wW`e z9g{36n2dDf*O?P$>KML_l)d^=ZI&t3@d`Ne#r~8eE9uT4wZ>st&ik^!UvZnsjx8CV zKozwvb!avG@&ov#O2$RF6UMO@SvglDqXTVldX2Fx{6*90(TRK_Y*uRdnzq z__WJ!4$oKSIMu%g=&b~tvdD+CjI}q^es3HVE|8zj6km_*jV4i;d`%{t?AJ7$I#?I^ zsx3$JM&Lg&0ZoaV$O)9?z?Of$?eEe;&$k+i@K?O0RzMpdWV4pSagw+EILR3#UZzQd z$168)I8QAy_mKpZ(rJXtSmMi9vIp#W@~W=iU&jQLN0eT$`6nkXE0yTZ=T?o{)NjTt z%@yjfl;!=a6=~;Eh1f2nW&<)8(4FRUXoTQVhEX)fRB-AVX+*j$TBs1_bR9<(gk_AZ zXFsrvhh)xci2$tk=D9dW4ULhm7upe%xagRh(UcdH5*IQ9CovY4Mc&4)I%Z%OXF@%v z1UsdK_J>`ZRG%Z6xOr5&SIEWOIe8Xky5*OQaR-^+*q;oPeS_FE&ljYNi)jyFr0dkgT6vayS86Z2gw zR_dS$6-lr0kR%S(0?xSgc?8z^;Qji*alQ;(Ii(Fg+^T7iL|?p!EZH3kcVtuQn@nWm zgyL;NQ4|R9W9j)+-9$uj@>UJ*Rw2ZRH*;X|kI0Ay@<^5u#kay`$G4R?VUW&Os@}Qj z4+!Flo)h?}%MniU-hS%jB4f?_nwegM^&4w*R*FL#@~Vv>FU+Z$%(@a>@p9|ZK~#_# zZ*pv-$m?3ubQYhU<~(9W-PDFUcBQ6Qqt>U%CNvg#F(nPy{Y6pST3X|_#J2Yfqha?u z5xRr`E~T0azndyVUE``)8yhbi=at`;-(XJCGHB#lY2;YtoU(cArmXr+f;GPGwQMfZ zlPse(I5@gLPExt3q_n{bj?@XJQ8`%P`Uk(}<0aFYrLv>1^mZ~_&MoWuRrih*aICcq z=eW*0p{SlHcP&zQE#20WKR1h_Jv=yJ%BuQ7bd~0VglQG1BwQC0freoae1{Qa^W>p?~kwa|S==~vo_M>PZYO$D< z;LT|@Qdv50uOnNk0|9X-^6R>El&-MtsFi=FA(V8{@Q-AW9v7l;qyhIb|Q0lvi*)k@HI zCdK%2LO1m5*6jWc-H^fa#(@8>5Mz}*GMGecijikdS16#%N?YONb*tS;mtAz*)H8)? zNS6?-#YwUsx47DBy|{Qb$wsECIyK(&rY-Yjk&n-CFMV0y2kms$1kV8r3qXh8Wamj= zc+5eX3UN^+7!XW5yVvToes;Oo*{G7$7?{sdUn=rT!nB8uAAhvr_*2HLDZ zc=`Q`_oB4b*o%Mg(jIsxhhqLS{R5_Mmf5U$({S%HJ5=Tnof^#AF?E${DmhkVP1dvd z_9r7)nEG5hu}Kp0`9KsK&Z*cuROb&C-|{D6(a%ad7SX0$_lEFvwP~Uj2B*g~)`!GJ zM_ru;9~}>B&}gHBO!E1rGEr9@0Vkngv+jo8pYapaWSXf%)7zPZ~Ix>>r^1V{v)Dv zkZ))g`H4JWfWhLy5f-BDP_#AsgxQ>ljkuTcJz&bm!}jsuEEiyOtg~HoyHnm+q%5-1 zmo>=tO1Z~*as^znu>L8UZ16E>A5k*>^uEcsc&4YoI4)USP*Ib%Qj0)D)!1b0<>2yF z<#GnE@0%?|(^?m4x-w|+?}PT$t@n>>XtODh=LRJE@InFCC_-UNj)y3!Odg!v%bb z@&4Z5-N~uGY$KqTh59|S@Zv6+3uhe|^5p?iF|?I{YJu!h3w4+n*1z4N+gvb37NRSm zw8Y!Yp;bo5znImy_79C<+pIehv0OShJ|WXwzPDcU9L90J&_BIl37T&{5|KSW2Z?HO zSKBR5E+q2l_<9}@nV)-d>mw8T|?CUZKdIlcA#viM{F0_lD$f#NUrzEdRR zc0+W(kKzcn`Px3xB0gRl!$;0w`AENcM{UB{@WRl|o7))X;Y09E`zZA)nz5zqJwuFb z8=Au;*-hJzdvnWs_T*C;q}xgX-7XKk05L~hL`7L$I%s{={06VX(bAl3NyW&Z$<3MU zV%|8n*wxNdmxa7t^tZp}!PAD`He%Cf+_y5(rsQ-#+^p$=4v|B6RgNCXGPQhTx=@7# z$m2Rd)v$jdJ<>svT)CgtkxB845aB>6+C_KxA@ZXYqSodT@@8lb-wn|wOvj zy|=8fvkF@fjKv%ca_qy6WU+IW%Y8e%2Lrkz$kHQFWmO&bHfiYof@cWmY#%4))XQei z?d+~|c2S4_0)p^NaXt{IoT+qs*r=M-mUNFbKlJx|4Dw5qBD?5;-2`P{T==xMMcm@G zoy-vK%?Bnr#4fg3@$a3kE=dg-5O;slJ)5$6LCe@*>MQI^H{G4c4{-6`;&=78!S-Y^ z*FbJ3Y@H`z0_F)3ilDkMx4B8~(lr z?7cVk@As3??{t_@O0}M!G-h(S3FO~@A>xe4<@E)_kSkOk#pVr0 zV8V+wP>_v_Mt`EF`+_-FAQ6eeoo!^!s4o>pPZ<4!GpHCn08{&f#I62dG*>VLPl+<| za423RXGFT}ib5_&yqo5YGs#T0h`B&=@Z`o4kO*k@M}0{=TZ-1I0G@L-S&hX|SG!kP zE>q3dFczICDaP_GtH^%5yseo>y z35c)E4d$I>szS+?u7}&R=*%fYo^IxwOQ`aPJm(KhkYzn1WY5ghDwCCA;s~ct9XB`a zjY-HC{zW9Vvw>bv@c8P9(Z!af13I|#P;PiO?;t3JCSA`e z_i{=YEhleOSZvSMI5a);{f!a=2k5L=j@uz&=%#nCv6;60Po1OmApHE{JRgt~MV8$; zDF;ymp=9Z%@?sH1u65dAQ>JF6a_FilmQCt*7?7a$V*n3EugXC27%fVfvP)3Pr0)Vc*8~d=fuB9~VTZaGI8q z;e{(_>r8SKN5>{xlvNZ4x8g-x#H*QQNQ2-`V$#F8jw`yN_frcI;4}}53yMe0E9!o; zYeddS5|Y)|)QO&#b=vn>BshNMfCHjd`M)b!n6zd-t)0O&?dP#ttg?FZ^Ii(!A! z2O3iyxV4&Ka@kk90m9*SsD0TOm(`UwUBv-i$0znRyWSlynwuKZq2uzQlRj?JDY_{Q z>(138rP@&z=Bk@nJlkRBg;2x|`Z1b_;nI0dsde%w?Fic2@?%MagOw!FihZk(rcvdS z%FUJ9eMFyI8vmLsXF2xTKB%(I=v3q0wJ~UJ0mjzjf4hK2kvpXD3nHS^D|e zqpcPlLcBQEV>Ke|!r2rMDE2s~SRMyw0TAm>(q=8a0~A$2TT|v*8ke=jvX%?_Tp!-c zf!_ni%|;Lu1@9;Y`@$W3ZOnDqMAH7&8di?H!n`qHn`u9%$1d49>+CVr58h=G`mldapVPISJzV~QOV)0_0&T7%rR0&2&bRJG$4li~S3OI(6%6rK z^`j{FXS`Uq?s}Xj0t~)I+QPtxI`9`>(((y?3ExK{9T;6Pj=PUP1Db_0zD_>$?w*_3 zG^a0hO1tuZW4l!0@x)xUSLaSkJMjJv{JTjmRO^fggZ!}F zrf4SM?{oepa2e%U-_ASGFn{sGAs?2;Rru!)l|)Yr0+jrpoI+=^Ytn<1IBoK@Gt^n2 zxs`4cLdIB=%-wIb59m_0vphQ$zwl?xi0Qx0dVC4k>C(Z#SvS8nR4d58CBS4|wS#xU zQ6fTkLF-2fuZ1RAOc+s;vNMQ4q703Bc2`hRsZL-o6PbwK6FZ9H;Gq zLMqt*X=+{>C60|pQ`}FTO(CB-pAUOC8=yYmHdYn`cruNrD;qN>nh)C8CE0sSnXQnS zNxSnfr0rB!40BJ+KbufKK?#@5VT&vJ6G*9eW6H0OIF~G1l}A+1HKW_+82I$MF~AZ| zUag@V`4j47HevGIY|QmDhf7Nd)r%9qax4b8?@1sI<*LYXrnD^HEBzxzwIsYGpNwpM z#7>`9-P&azWe%^aC~%@`t|O;4h=ptB);1fbjFyMdNzD&0zLIc1WsHWUXYm1!jD|mOGTuVA=XtF_}CfasU#g~{)`*B2j?DutT)?k%2 z`uCB0$>r`u9&4vKD#1VZi-j;=Ight4o3q!FeV-7k%*My&I{+zdH%^tV*qI6kT$ZKj zFXzxeb?Qz3OHsmO1i_!K1co>rxkJ={dZX+zcd>6=hgoJA5o`#IFwcBp7|1?(#QE!Y z=e4Aai4Z1mpYv%IrvhaxJUo6fCQX!WtW`?mQ28))1$;cxsSyWQ@}U?P?xgubDqW z?+nCL-RF|Px2^NmyG|7u!)JizB3nHpvRIIfzIIuCRq2Ti_RF*w^NsV%gLN?0vuyC9 zQ^Uo&Egy5n)XQmo&D*4jSzBwJ8A(eflGndX8PkdVuiJ-&drVz$Ih&aGkA2B1Ave z?bD^E>gw4hPho@?fl(H6*CjVU&kjPh4RMSVoeu5=h#5nhZvT0YGRk_SF8^i@ z`%rvXZ`H+-p#d82y6=+3pq}sVyerzY^!;^iG5Q(xzF*XRUE4?XL4o_al&-3ibIQ)A zALQun0`&3Wzw9RG8ag;|+bN)bJ4Obt^QnE3hFIS@Vs(e$7el$mc~nMVi&$1G@V z1e@V^ISH*u;lKPM>dy(oTEj$OKvIws8Jvt_8d< zAk?1gj#X)_kz#aV>MiEM)M93ySAnnmHXrTg9|Q4QYIB!=5q7iw{^Si!eQMN$Gf*+g zN~lcAL9jthSKr#QBS3e~Ltk1iVZ;l4OaINZ{^^t6XF;6#bKJ-txMO3TL^tq1ecbiY zsJHdtVJ}%n8AZ(vTyNT}XV$FKFx-tYi5Cfdq<^u$G;sG92^Ja`pl?e^Wcn%VU?Ney ze;bjg>Dv^ja0TC2Z-NXcya_3jcP6!UW#kAsaSbj%;^UH{f5wacOeX1aheD{6T_1+` z8v;H)h9f}Sq21Z}-jqV8zLP0KxH?Gm9g;LNnNRz>prSE{SWu;xa~qj0gGodB>g&#L zBBX!oBgh23h!o)VxB|*-Vy=6f-wW9FGkJDV1SfuYY}!Ox`uPZ7p?N4XMd=achYftPLjR^c0l!>FjeD`Urk4=FJ$KN-PKw)H>Jg#c&bWaA&an1ot3q-$6ESVRX?BgW{V(0znlQuAao$~uyTD}15f zOR~SCewrMBq_NQFSV#FIpiy~QSd#0_7=Oo>csul_`ROq)n6cFQ)sJ^z3_pa*-8j=LoH z__jZ4y({IeB3z8hh*)r;e&`@*YMU*!w_aD9lu^(U&K<9BwaSN zjE&xypjER}#$Jwmiqzn;+p-d>du(ge(pW_FI0JJ`ogNjv#ZY zkYK7T36Ppqp4%v*1!g5SI-sbxIZV9H!go`UWW>5vrY_Z?4v#OB6Rh~IQJ6DE9_2ab z1A8zE%1G0;OuzvEct`nMHR}15ObzS>YbqR=UUS z&Zh>77BDeUWcTGO2rjA_P!EW{Z>Rov)NB`+7=3p?4Yr|Cl_0kyJhG0@(_T7^CZays zKJ08#AGHW;NIpq0x9};SvwJGb3 zswPP@&t@Ig^Z|(kv%b+%hYp`8|K!vyCZr3$3z5>$zG4JO18$h@|GJ@7M=^tlG=aCR z@LE1DS;X`Ep!@d>8K3qPxU>#{o0MDT5p5OkTDm5Y{N7*Ds-1oQ~pg?BvJ!Mi9S`-tA4270DtBg(PNI=-9) z-R$5-PJM%&w7vwMCYDuxWUHPGu3lELm5K)b^`@VLqdx;~-&+7@zft#{8Sed}ifY4M zEI*$pJ`>}mymPKnD*O5qg?@@M`--UgV~NqvM9Pk2U=Ui&2^>(7_0le_qPnZH?*I}+ zY0-Z|2{t)XZL)onKOsRS?#&!|i>7*Ns}9co8)qOV{B6bHoU*EoAuHYH>}%q%$)(m(qpEWZYc$qpATrJM$!l& zr2TGJdjFYbyOr-38Rs3%RitVY01gLZB zsa4l6n4;-EtIZuS(7P9*EJ2yP;7%*{tC*VqKL9g8%)i{0>g>nTuTwQ-Ef+2|BQi5f zs610tbxw01&(&sj?-xgCdq(nRv@tR#GX*1bVRD2IfFU|}^tC2%uRfPQOJFVrv_!9O z+z{WCGW4ruq&PP+Bl8Gy5%W5~==NmiB#-Sy!?Y}tRPtDJDKD%dBeB66@(YvPE|2t0 zfwDn|ZB6;>CJKQ^PqiKAF=8(8QUi2O$1@-EbVu?X-?lWV$}Tbr^Gk!K?+!CRi#1+C z^;SQ%iA6J|@+>l1a#r~sGvg%s^|OjJQIj&{k~S3YG!_puJSTT+hmN}*@@P-?lAf~6 znlWk*b8t!#();_^VX74a&q_FFG<_xPn~YivUsDTki6IRERrx?*D6 zbaQw2_4ae0hOuz!QNS|ywwkho2IpP>wiiRRXYb2qZ?|j9;lqlzggfnFQ>g_vY@#)I zmfr1ww)0x|DuM=gUVnJca%E~09d4tvE$g?6n=Ulxa5giktu8nBig-mXbLO=-e)o<> z;{)Jrbq4Zn<#*E7ccg zt=c*^%MBNYqx7HWcc4bLta>gCW9GKIbO$@S_8#YsJ82x#d%X+zhS~NeM|WZMdhOD( zqu=g+%QVKrr?n@%%^SRFuBUb%tHXag7!$M(le}9V_p-OR#X2&rl<$L zyLmWsmvtXzCIf%Q2R>J;$@RB*{EmC}kFUKt^E?NYj9~up&p%2!uKQ;_`}e$)J@2{$ z1Q>w>2^O4!2GUZ7^hXkcaoY)0oM2!kB3f$Onp_7at8Gf8-k|afhDLJjMblFg3Oq)ANip+VlAkUH`XHu-lQe#r3UW7K4*|Vn1jYT{DL~501MyfP* ziV5m<|EN=s5J5%_EA}i}wMNYXb?a1X+p${>`dHE8ZeG26`S$hu7jR&~g9#Tld>C*($F|E63%ES*lW$nRjj;O84~A)TlW#MQFM#QK_xd!i7E8 z;ce2pE$cR@ns?KRtZA3_{M$G3(NJZ(UW>JA@{B%-yIu}9x^%9@n_tCfyZUYE*kgAM zUc58(^JdYgLIq&|X&ZGp* zL(iq_G~-UaswNB&x7l*5j=~B->LcyEL6ruS-mVwN%O?? zJV-TFGEPQYZF9WjTGI_qKl{rN)=K5v)m64+rEyC#_xv?DpP)VRMQZKDH8eP*6_GOG zinTS?J}Im9PfCqD%F!lG4K>wx<(-#aRKHa=SxcSOR^5DET<#%m*9~`5f$Jof|5x!#<0-kImYgxHp3mnVgJWs$er?%9J2X1Lm*=Ste>cJVDaW|bl(ZQM)=j`?Do zx;9tDuOaPt#4v#9`17F_Cf2vaM+Y5t zg+s*k>(@KSyCo;!6}9iceg7SJC~qLyZf-^Ab2!S=Y?W-c<1V(*8&emv|M5btFTB#M zZFjzMx{cLtYA=)bdRn0G-tqCuHJ^TV)RFFfQSr6^49j4@J$`wNlSU~C8cgjycmWjP z02kAQO||b{jJuuZ!j~vSiAQ?r(i-kgbiT70PJXOoP3GpuK-qEcPVPe)dIq(>`{C~; znKRwt2!}oPMbK=vLl=g&CNukSOofnp8jQ5$!jIU6fI$@E5LI;-AE+;6EYy_odKeQJ zQV@#a14HdRSjB=_&}bOUALjbiL96j8d(o4d>p&PnHT9~6C2JHJW4OJ@u`f1kd?JaI z_#iIUZ(_vr-rX9gK`ly4jPT(d0Et*gLlSTYQwZZ2wL`_%xoM8?|I?vSY-qB9IdWqU z^rIWEW<^8o5s9&@-xbX$MnBpQi51CLS;r+;Y ztVZGxn`O*qw{nO$Z>ABJb!;ER-f2GU>1u&)p4WB7A0MFlr-VJrXrD{OBhs3YCVQ^^HwcX+9y^Rxwr6iOne?3f+oUI@Z*a3ccLO zHmXdgRyC}L@(~b+YE;7>mQ+3%D_N!KQ&*C5syMxsR@r7Tv0W9jnKhGMtENzms&#dX zP3WxbN>#|Jb+03pDQe%EAT7N%vuK3pY^_);FZL#UNmMeJ~iD?HJ* zaf#o$rTbvGw(+fIq5)!}RDT;+>-O|JEyeCDt5{FQj_#{R`!07C$J(b-O|l++l%gI> zzvloltC~&JJ;~Tr_j;_GTM8|Cb(>PoV&tQGk^wM_|65=KS1FO>RWMuEy4A?4F|JW9 z5W~{9TD)2lSk7!PN=X_n+k$p=_7o6LAKBEXp3W*O}DxhCfyC&Lc4r*^|}6KmWKaY;xYAAiemw>i1|Ct zB;Rpm3hN1Rxz4cORLXvm0cIEa*O3Wus&XN3PBaFkonwa!WeTs;k|E` zxoqS1p4Q9LI%lHSOWjJMbEb6^DYZB&=({c$(+oy(2APcFHVMA+M#$skOz2#i&OPboUt%EVP^91i$KU>=&j`qL_-ccqHnB5uI zI9@o8)Twb0)&LjzgBkvBYrnYU-7}@F{B6@KBRtilCGn-@J@1OYyV{NlImB&lZ+Uhb zTqdUtk$g?@m?k>VBSQDa_ssOB7t-T(?m3$zEbx?%{JbHo@XWD<^M}*2sxB8h)mKTh zNjp4+U;cHzmwU>yOHSc$L9R*RJ`rsetSA285-a7=@ zih17OVSAg~K&ScC7bbJWTT9o8FL}{@yJT`Ve)76?bJ*)%XlR*z=T03qVQCF`*9$oa zQimqqQSbG0rGCoDX5_UmMQs_zdEk);c1BlS_=#)Y^ff&^wsjxsjSEZz-wbg7%5Revg7v;n0&Ok!$S>(e&A}*4{SXhkV9WfJ z=clM?1Gnz?c53=S>BERm{uuCd|8@=liI4Y4t^X{L^3cy&;4l6zEZIP=^hPYw%J1{G zCsFj~=_b$!1*!t)Z0KZhFXy&x{QiiWo`nj#5PhJq zvewM~I8f)#kOpUuaDb1{GK^xTqtv!5@8HG_e-P|e@C3(hl+cj+RLoP3P!K85!^%nw zjSdbC?&vN>?NST`jf9_=?EL8P^a5@TYwHd#Q3+Gaze3KroRAFL(9JgO5tlFqug#hA zYq|E2Q+RL-!!Qq#&-PHS>WHui2k|g&1_X4GF?!J#MPL_yvGs0|7;CKpZSWNhKF08}8~jjTND>6tOVjAkEh*P5NTV ztN7{_^$!5G4)pR#tCkKIi;?3RLl^h41=zq3@<1T@fFKLfAmhLWUO*xB0tJHcX7X`9 zt^|`7F8$sv3#02CxlqyE?-T*WlEjQ1z0ndik)hU+1;-D<^ez-Ja`;Y4$*zmVBC*jx z()w2J=dh^$v=Hrrj%CD&;=-kW{81l=(e=!L4>G|Ob^#fdfg8jj9Gp@dqEafSaw?y) z8@-S%+u&N^{ z&k`+*5EPn{DnnB=N0T(U!5MtP6*A!v;vfxfAOjR21NLHf@`5NOFbLH02}dm)+v*g{ z=Nre+s>}oZ-tsLu>@h2G?)uU%@o*>0P$pF}lUlJj)A2Vw68`9t{p^zNFcBNeF&6)l zGEK1o6=pg!(;+TyC_8g38-X<2(>>oaD!qXkw9*p{Aq`dlHZ>qU{qAS#Pyja)GfN8O z+%6l-a~79II8*TDq;W$$%hhIV4`(bqr40@}Z=M`!8QqHa*0MrcEJ+>VJsaI<78CGa;;ko z)H-r^BQq)|_bx9b zXfa!LBsDLAdPP(-hKF8F(SE5=A+knw)K7yoSiRvF_J9RuG%twE#ugPgA$8i`(Nv+Y zFbi`g|4j6moOLo~b^o^1*-TPxTryKr6kDG)1S9l6qwMC$v&p#e7ENc;QWti!J`!UaR40+s_O6k-imm&Q)jl%74}R8e;gc2QmNtnt;-Hib z|Hsjtgl#VGblS?4moD~R+4d%3&T9X%V!zOE!%<`*7VbvYLM<-~H6$o}ZtyZzW6d^Z ztM2aFbvz-kHucspG~f-Y;ci=ZG!sETQMUz>P~>(KH~}|02e-Axjdzvf=SHtn!$@sy zvSQ~|Q>*N7X_0c7Z?44Ca>Ld<2@`z|rtHeLJ4?`U>9GJYl#FUdcJCt!jKOuQ(sj>( z0!~*DuY}m%mI?i@d9M&;TM2ch6u`a=c(sp2=af^)&RjE5=#o@%C`1(+K zVMjd}bfm16YB5%Hx7TQ4an?BVd!H^7p0Z$b6dO9&gR|j-y@50}I9Q`02OOXS|31Jh z_4ZIX7t0DbBXKu=v+HGX?+yR&fwPsj^0y}LY@y1nT2fSV5om@_RfYlBx_py}rRr)O zYGdou{V3M7RuN+JcRawA;S+I!HWrD5yDuE$Ji1601nmwjomtl3G_*AH|DxymGEhKmUkx?_)_H+91r=2 zr_o0|*FV=V44=1@zLt3nv`Wh~T~Ez_|Bx?(w;R2TimSMkFYp=lRb_EDkY_YhG~fXq zpaBK|mkA)3b$OQ^zyN%C0e)GSeL0r{zyLVF1)x9;=ztJ7K^1^OgmIJ*|BjghAOHe7 zAeMm)UT$C;KhZF&vuWdNNx%6(M^u3Sw{UB6mMjy9Gj~>(^P8adlAAS(Iq*eOO=8mq z|7^IN9qDf$)CEB7d8l$V(nhijg z9l!!q01C+94^Y7v@R)q3VGItyqR$t78ycYawnJr-oM)DkleEc@HUR-tlWlgMQ>PiJ z@qWkC`LvT}-&v^duTh)UT;Gp?bvGUB**p1pMO{lL8F+L%YoIv~syEkxDHs%MxGf@Z zi}wSf`&gsR+M>}qqt$w?H`=2=+6^v27p%b>@OTpz;H)hm1Y8>S|Iqnd0e~3|;#e1W0TNpKn)?`#`5L%$riDKix~wptZJMc| zFtdH~uyr%?uD3azx_CuNxQmBR=i>L`Z{;< z9NPzbT4l?1cOQJG2bi6|n{XAEVl#PcEcrVl+`EYzRWC4S|5bZGPC&(1oW)z*#TydF zV>|?AoVEWuqbWMCFTev(yp{s{xM|o)=kdT1Ji(I-ltCxMVGYDNys+5`M&GKbgLBBK z(};~6yxaM6YbprzIG z*2^tlseRn7o7F4V$L&{<3GK38-N)HAh710?Be;o4Y}I>i;Tt`4zdafQ9xiS1-w#U! zI$;{5@*2z_-=BTVUwY3;SK=e~0sU~C5+1KIyj{bM69d@e4gSwx-ls{C;db+pgI%9> z9?&n)=(VqqN2BlB`wfsGKB00JVt3_L9-!2>$)k{w?OEM5a_f&C(h2(43jNow9LRr~ zOe^BZeZETx-sOcZ@` z+}SSGwJGi?yzmb(2sJtFzh2X>AO;Qk?YSOJYcAIJnd133cYhj6Jwq%J*46+4>ZQ`8 zS%K=UUhsv9yq{<1FMI9dbR%>1c!!S_UHS9w+^+|nke6Dl%$}ZGz6KM2^1u4_*Vpph zS;R3ukxh!ZB(J&0nbwCw%>C>XO!`j&;q_yG5P4wsqgUaB+_^ms&s8}Q*MG}JKlnrM zY9H3-WpCIO-GI|s`Kfhs0pf|kDOj?AIVi>;!i5YQIy^XK;KPLx2SzN2QK6TK920ib z_|Rg;j|?kvlt>aH%9JH5ip)r`pv#ph|7o&p8S|!2h%%j+tZ9?u$caf-&@hTLsnVrP zTQq$NHLBF9PesH*CN8Vity`7ZI6*b6*s)~Gnmvm)t=hG0qYn8=(r3<-K^+d1dpGaJ zxj5_YY>9Vh$eD2e4(3ajuoQuTyBL1lQ!vQGiFNwjxmPb2#5d(me*8o-WT2NRdKSw0 zOW(|n6$g#^a`fTYtM!Wh%(8S}ytX&WM!njwK-?-*Pt;BNZWGPMQ8%}I`}g3}&WBg0 zZuf=Lw%ogiMbYV-xNuy{j~AzifcN$6+q-`cKYr5X$T#X{9^Ex<;y9%juU{KszZE7N ze*SrM9en4pEhF__zf zxkZ*=bq$W@qJJ*6CgXK}@qog1J<10pSyudFUXkaC!axT;E*WH#PCf}GlTrfdgK7Yl z_R>Wa#>k><`_cFzWHn+qCYabch~tWAs)!L=&;8o z$NFf<%X(Py$mX&JsA+t~w!=~X0ttc{#e8aHIG1z)fdxT>b#u{1x4ZArNjJsAxiQ-} ztjr(Ry0X+2Q@gQ(ExX(;xzA-C@xNO9|8| z(7}u$jX8JWfy(n%(m*nS0g?xeF9^|p4}Rr01iZJ^xBoZyn`RdH`|7iLo%@}~JIdy_ zeA2#rL9=h$x8EhkFEgs~1SVjkAMW~xwZ7HOVDmFzT!PoW&$$m}$~&OK43#?37-tGR z3LjfsQ9XKz!xm5|zywYhIqpr)gDmWh_m>ZyRHLzWF2#zO~c zErRA_9htTkM7AX{Zuv{si7I$Q1p+X3RP@~vsg*JaqU(n;GLh}L_{Ae4P({S^VqYH8 zgczbF3PcK_|Mdvr0LX0*UlJG^4AqForD&i9c}PPBM6jJaQiWAr5S|U|WG9bZQ6p1q zV*MIfkVWQgflmV?4O5gCzKs!xlH8vqjflPwRmhN_bl)N&3CT;=P=e_KT_QC(!6;6V zh(A0S^zN9)tGID1wHU*w=%_+qQcjS>tO_5Hv5jfm!VG)Fr85bq$|45Pk$pm7C%bh@ zN@DPu5_?f88+aoeIV^Os)L|9fG)izj@nq$crYAp{Kp!59dDHx6DE}A6RE~|7>l>mr zn=jzp6xN7Hanu57~)&GhOpL&L+6_7802q-Rfk zN*sN{%tjAds{L}M!9RJDrt=IVTjN)2UD8 z6%HtBRuqszan@?(1yUQUTq`ww9<$SM3uBo*}+ctO3N~3tz~?*;5!R@Q#zH; zl|;2G>X15HYu46(iKRGx1mf z|5EIdJksdH0fH&H6q1Uy6BX~LQp;YauXUI3)z$2)_3qrDh_LO)Z@C*x=qe3yBUEoqkcqo8;j$rQB5Kb~kv}$f~WJ`_&dp-8M!e zBe};GQWP)tj(>T4frLoyxpQI1UW+ttDh_GD0ReLirk#0RObvh#*nuu4 z57 zV2&-JtqpNaNBO^6ez~;=%q&^+o7hr%GiQx-3>6o=#R!*b7@Tq9VB3tu|0^H@XKp)E z)Wz@S^G;-so2x|ON_=;LstZV2z1wfU4$1!``J-N*(g}|pF^2B)WF%Q(v8~)qc-Ohe z$@XQBe;n0L9J3hH7qC$$7}jdL!O)}kZ#TZe1q7%wzFge&#}oSvJ7YL&aga?1`@GN^ zU#H!{uEeuV^2?q3ZQ65Ab7^}z@f82Lyx#`EMl)v1sn`2VOO1MXpV6MM&$!#wz59&Q zwQP>D6xDlV^v;R{6)0r!3Nx>Hqk$j_op+F9(^`Zw}f}H#eNoqekk{UC@5}ucWeX1K<{^V2FO?lLV$7= zU_keF>^6J!7f-LWH|l3PIahxv*n&8JdB5ea41Ve zxOU33h9pCBDc4)rReNd`Svm-EHfVpaWEmR>Xs0kCo~(yg;e(fA@B)DXC#^M z0Q*Kz^ifme#)mE^fOw^Nw8wg-sDKRCdI$JyYUg*Rcy+>u|A(_dX~Xq(EZA}=6=Z2B zbLk{5e+W}(Co*!#b+Q;#$hd$z5rv>wOs24BJ!1#jV|@pAi9`p64L1RkFkbNGi2pKZ zhIe?Wcy1-vWU7~h^+Am5C|vM2GV>E@dKiEyg;FM{itTugh=zv12ZR8qNm4X%#`tY> z*kSXCMV;|{4`2zq)D4o@P+5op+n9}l1OeVyYv4$c-y@29a)SG~QV4i%Jot}8xN|=! zPm{HZMc9Uen07g6e4255APJBoNs{`gQ`v=cc6dCCczVQzknJZFQ5cT?qABshiDCtj zlvn~4d1u;jk<(Zt+@MhqNKiVP;1qAja_A!yw(7cpqN~-3|8P(SXpIGHwiiqScmZHFIvA%L5?njQy_Dkyuv7;bHeX6lJoAz_u;_-D(Io7O0iyxE&i z*#Q_CLcXv9!seK$LVHk@olI4kmPsN*Mvq)6|C+M7ldV~hdzog)$(;=9Z1cx+vovK1 zs*~NBnbc;NO~_xIL6q=0Y!uj8x|wSipjr`lpH1fh-WZ%(;R-7{0=21)Vn~+~>Q@D7 zpxP;eF9@M*33KF$mu~5o6MBno$)haEit3bB`gok!ri|6~EdR+bRJb@^DML4I)MRS*$ zhnNbI+xe3hHnx?afq(MlkpW2-isxnc^sSAps zh5A))M12^bYY^b8B>Jny8WqFfM!P_-L^nf#+N?^dFtPWo{iv)bH>9e1Y#6FVuGpkG zTA_bet^OLVK?#%=x`Gq4Oc*-}7+d7JLH-ZBju(8^s-m08MyG1^Gt*knw zEa7}6izyvQFUQ~l7YI=$OSP8M{|4INMu6Uq;Lqe*ZQsI3av<6Hbqv0 zbeLoA_@mCMv|$&nw3wj}`>a%Iv{AdW_}H_kB%Xe27-V}Y|HfI?Fa}zCd0g9@gAk)x zAq~Z`jhE2ys;kf}?! zI*Xdmc_Q69r1I!rsz$yO3%orjl6pB(ZyUHBijNEHyP3*q+8e%hiJs6&r2Kavjwi2d zAp(HF3 zYd?J}rP%qoi?;-ewrUu1xQoHw%fc<3zivyzNGM>VVXN_#1DDVZ;lK$6d;tcW zz?XOf$zWA;;J|q_y#{NlG@QS+d&0!0R03jv8?2^0DZY0bgCcycNb1CsIky{Hk9noR z@tdshYsI`I;?6dhmyKhOi|WpMdA#9y@yQYoC6hrsSpC0$&-Cj7eG z>$IuHu-+NNF5IahM#Af9NdXnXZ#;&N46ulsr1^KdJ-33SOPXevbu@c(E9bVK>jeDU zpD&iRDLOR7yT{l!{|M~b0IDoVo!q`Vc3rNT$mr^`)w#%SY`Rc9xRTb!guG3z8^!U4 z$Ok67#4JB$e4(JMqdfTqo_f7WhRh!^qIwKIAs~^F2r zm(!ffVV2MeZHqA75mUR-febWSD900h7GP!3sL%jjI?kuE1R?6CU)<6%eZx`Rrlgok zzpKUQRG#v@|I9SKe!3{lDxEtmEVO4lc2>qu>l@R>sLW@{5^;=u;Cy|sOw>(R0gvED zbkMTI)HF_AicmeYK|0gBtG;uaJI15UkS5kCoCWdh$fXO?oJ-g_J=OF4xAeJ#*hO`ZQ4uBNir)n%bCUlJ=myN*ko^98>kT)*y;(SKt?*{k_5H*- z>)z#9X&0`5ZSBN7Hr!qfuI>%k?a84mOkqZ(h~Vkd5uV^Z-X5+{xwc>cN*zO1_t+jf z;_-ck>5a?pwtT~k))O9=_ATO5Bg56^+*EGQk)7m!_?_=u!{wdGGj8GnKG`A3o>_e3 zq`T6lbP*2i<8jX8Cku5Rs0R=*=V`G6Jx9T-UG4`2u~W*+1L3>-k(;WHx2eW2!h z|8|p3zUS-d<}Ker$X1IC>A7thh$>NMUYFk>oaN~m zuH78!)h_B_3IbSKB#SWQf+Pfv9^-BKd$XRwz)jT}PN1Hw=*?2kJl*AFUhMSj-(pYg)8r{pUb>^u_IhMPD`QD)U*d|3=++ z>LbJfLL5HaUGFPy%4Q7X)>(KaC$J-)@cKdx&{_t!i2(9FSB-RM_5-X~tn zX+zgqFZkLR2h}scs^0Lu3Ayg1g2h@6PS+_IxY5eb0vunDH+x_cQFeNq&NmaWvOA?LlwBBKlk!G^|pfbs*nAbQ_ReSw~SeDh8?9HGj*JVpsx8cs7o19e}T=;O}Xp0|5 zo?LnHFte;ddo{*E*|F6jm;k!mIMpT&eXD-_nm6i?bMbN({~a^I|MVDbuLs;-F-*&% zPn)MtTfgW1rqA<-FFyO^Lk~dj;%e``z6Mm#G`>_KZ#Mx~%P+OY2<-1O33KBx!vj4G z5U~bbV{pXQ4D>-e6<1_&yB1%B5jYoPL|_00rn?|V>n7Fj zB(u(t++0k~|G?zW#~*?G6Hq}1B{Wb&VPrw59jVjNfe>txvCyV=m~+hV%mfk7G%?MK z$Rx|F6hTgTgRs>4G{wzMRkO6vP6(x3Gt50L-7?inJ@v>)|20PywM{F33W;`arL)9|%M5mAW!c>D!(IR7m|oA&?D=Di zFRm5n*m&O5XA-eQT3P%I2Jq=lxrCMKp*5^HVA%>Ly6cx+O>kX5Sth$|v(Fx`18zN_ z7VVpG_}aaW4>ncLtO;&9K2V`n*w?vXKGNt9y}o*I|926Vb=|y|1{~dpnU*^4CUsSs zvW?HX`{2s^<@@2w3CFqc3)2(N3Aay2{m|6G^+4^FS0`$2jWw5?=ErSrYxAT-0~+xF zxfaa#pg|`dR^dhOoA%FhC30~E8`q zfHHI-{#Y143TAJF>dB!CUwAbd-ll^88e0dI|F}dZHjydDtCZ}5Xhh+~%V9-AuagJE?mmv>Hy+p3CHjLEdrWO}TQkHUy zwmM}h*NDIr{SlC_gk>yUsTLocvUCNMBMCbh!$OAgk`Bs~C6nY!NcPf)sH|b;Q0U1v z?gx}g6C5#<2TVt%u$ZQVqj*%Qy(rGIK^2lKXI~|xeO*WO~^oD+H#%w<0Yx~ z5~p@vQ$WJPXB;b8PcmL1lVDS)1EZxrIMs)QuXvpincAIPlak!pF)IR5|WwyS!X9Zy3ndl({RG1C)UD~ zP@g(fq4wOK4Vy_x9j&CZ*jh>ME~V)2(Jvry@nDR@wJVN7|3H zWc5-3I~&-Cl4~Z3#cgg8djnkF|FWB@^(q%7n@)i0uCnPgWLlAmFqd-mv8M?xTd!)> z$9A<$y5uWm-$hqD7BQ~~4J;;=YgFs?)rL=Ss&3W0-dJw*T)wR?HC5Zzpj~!~A`Ipv zf!WjXqRXB)6|Qr`#ys48GLs_IuUpLtM|d?2wZ81HSvSX7=N=7jyadf2lgM5Ucesy9 zuq9*5I=KPLHM#s%YIEreMMc&%v&L0%Hvj8l1G8Ac(v9wobKEKOc4UEy^X^GuE6LDu z_rIWNrH7TgE7QK8Ie1tZk1Dm zPc^1_!GrCUnY)~`dt%YZ|7cywhMBzQS@xOFRrw%e#XDV#eOHYF6>1oJhvn{W*Q68G z@13n2F{Rd6wks8)l-)Z+;3m|%APw>;ZTDLf|8!Jxl=Pedi&-^?IbVlK@1JEo>yo`! ziboW(3E#YCIYODiV7{__JMEwzDDrPjBb-8t;Uz56qw zcD0xp?q47RtYXKM|FOVBE$zFxuXkMb>%SX*?7ZlC;y(vEi~@b}{yweWCU-W`=elgA zha7Lxz9+$XUT5fDJl{HQFn!LAaiovh#`7+znePm8jtiUQZ>_r3r*2@12fgiX?{I;y zhh+w(Si2?E`OK*}UxWvB=P!=B+Ou11W^~U><0f?rxCxs; zIIBI|!@7@pFw#@G-~qDZQ#FQZy~l`w2mCo1VFNzMgGTU#P9VZa$b&t20~_!Y16+aI z;=w0`!YGtN@}U$9BrOp$^%eCCYz}^e6!P`QXdeDn>vvEKs0)ZO{gFLW=SSW^U2#2je#6$!KZ0H42Fa$HW0RvRR zK7-U3w+zfe8+^l9G&@{uLzh!NjeEstqr+zV#a+ZSIRryCy1wC>!94VhNnFL# zvBpzm#pO^%LEHswNW^dyM@1BdPRN56(8N7Vi#@P}Q*cL9fJb*61fM$!GZ4ae#K(Np z$9?3-e$>ZCXoG9q#94cSZMr#W>b_#!x-v|?-CM?6EV+dn#vSvuX2drIx}p`tG^VSk z5iAUkd^(17Lwj*IdI8B4oIPDkI9QCNvci)+BA*0!0GZrI7Ri7cu!LOz2Spsmo(#us z|L}!GKu2+71)mfLTFA!jh=XY`%BFP6rxb^60EB@gH|cXlG+Z%WOQDr)$yy|_^z%jU z!$OTDG_OOA4ooGoyvnFKDu>jYhRnKXoXC-+9B2|h8jPqm>%!g3K}?b}E}Ou@s>$qd zr9AM3U*H8wumMdJ$iY;LKkS5O*os4hN~5Gqa8QOvXiTSgfJ)$s&(w;Y1Wih~$)tFI zVgSu>6wTCJP1c;u*9^^ZJVeoKhHr9Aak99%d`MuFFulw^W=zJiWIPoau^_4h7ZET6ZkSAL|G0%t zNQ5ZZ%(4-IM4$#lq|C~MO3bW-_gsota7tfL0DA0+D98r;BvAX@$u#)G+YG0n(@n|K zO|*=>EppH@+PLEcqB|@vuWZmWIjg+H$`6G|uj;!R5+eeQ47T! zrAo=ZJW(t2G22wos(^*mM8s||1PuVt97PHZFoRzx&?B8pQ1~YDya`|6QE{wIO4Nz- zMA9ndNksGm{RBFTY|g!0O9-{a>+GKjh0$BtKjw@%WfV>$LL)RCJB6IZIP$62!@@Pq zGA_MSEmSl(l|AM{xf(6FXX4W?wVEOkQnlCypM(Z=EE_zVnEO!|3wR4aLQ${ z0;S*sZ-CTJO+?M4REgs)j6^hTI94N1`w{n9I}z=!?1uk6!>{~bR&48E`oz0c`L z6Lmj_jn0VO+4w5H4doc33Z<7sTBh|LGj&Ds_ul?F1Jw!*q5e_)lJ@WxVy*+7+t8|mjfGt?1O;uIhCooMQj_g%5TdDIi z+A&PpUTPkk%~=?7G{1$_rD`=|71r?4B!>u$Bs-l4INSP6L|H(9x)qd7ebOow-2z1h z934_KaE6lAk=GfDMtEB*ec1^Z3)5Y)yX7vM1+1a%Tc^FtedSJ5eKi`@+rZ5~P7}t; z4chcGo>MDcUOiUIZBM)8#VAJ z5V!>^J;ZK+24-jmWnczs0EhT}O3G}6Y!yZOMOzn0ne=j7{xwh|m|N`dJQ&z4b~0e3 zQ`|vS;0Ws1Ib~ooj8nc@Hs!tC>jmMtlCv}Jr5Sn!-0bbRu&l!}EZ|o)-Z_p-G!2L&Xu+MIQf`M%3 zt%YYE$zP~^g{Ge2skVUWa2=oiX{@Gdt)}Wy?!0uhUK9>%GXPsaq`z)Cl!iw9s^|_h zYdH48s5Q=I+U4b_*vY$@Xc}F70V%=JgT+W5!o^ zOR8KAV|o2syPi>!9_EmA<2MdwGOj$pCSC`g=)ImfzRofs6HB$O>w_CwJaxtb-fa|F zouwAXDj4k?VHeM!E)W+}YP-rJYf!vJOG7VGwacksGzPg;eKP9rdt3NBO!H*Wnb4tIkN?cuy+*uB3 zvy^QM7B;=kHhTrn3vX+Q=1@J|Wsmef)ByzUCSq?0i>dZ%X?X!>hDvOpgZ0ht@iy)A zhDuHlfEV|P_U2^IcH+x^%}>bc$hPnLzHuE{?fqt%2y|@+cS}?y>yzFqWfbd!O745} zxabyRF>N~UgI?fe>jzEX#bskH=C@)!OW+RfWkm2?*1i&rZ2-Z6)Oi4LW$LNMfF?f< zV}MFW0PiH{fDZ81Q8a-AP>j)*4@v( z37xj|ti}LCZ=H7UfOm)Yc$fEemv;{c0ePq5=bKzPN1leo^#Qjpo`G%S9$!|??O<2f z7xmH?1!j=OWl>-AfB*HJlHf82s8WyXUqnBI9VDO{+)?4P@f|UFrDy<1c*0?Iq`3}0M!;(&x=6+-4J+3u%G!CYCq_=euW)`!qa)&qghOcNXcWFesl3hCWqX$|}@pC}Q zVc8UiK=|gHC#M~CN>nHS@&@;(I0nmXb{p^eDV6k|-1(Tt#3z>fONVdh(~c%sLE(mF z2;Z`%XUQ#mq_Cex-b7|vH5h+awutxg<;{4gN7jsQ+^1D(@}ow=S$((`PVy7|pAmSD z9~aJZ8zn$ZB3FY!zW^VP)+n&%W>tf^ZTzXIfMq9gagYTjW^!nUl$=Mz!*?nWQ2d?* zdhB+56)A!=VSA_58P9j{lmEhPWFl7aOEqXa!QcXYpf$<0=S8x|XoW}p4$KIWBgK&)JvM2v zVkOI#E?>foDRU;xm}Z)Z%c*mxHz*4@TmV{gDAA%Xt!&$=bZ0UHK%W8)VYH?(ap9JB zlck3Q1gIWl-drkHnFqP8&C8%)y1XHq1Mb;P&CmeY5`l z8;p>>=JlpYD)y>0pHTUpmkU2Hh%{@LqWTGygVgwJuJJUCBV4)lR!|+x*HT#b=|q-+ zGi8t#gI0;t)>CoCm!XCma@e6uLm<>$7n%WA+=$(YXxxYnBh=^BzRCQ0Oy;58%$b>3a4WRW~xNg9*S{it1zUxImK zmXO70Wp-vx$>noe4z#9>Y&L0Rntt(CUVn9A)*$VRRW=>qB>}*8aDCflp)R-9-NG! z*d?rI_NE+@PC~ima!;-ptgxTuN++$r#@X0$wz}!6oX);_;*-o`87s8a^?EFl)Q*`P zwYO#Yt+LJCNE^8zm7AQf*k)VhwYO@^tGn+8DQ^&}uBulCeB5`HE**4rV7~aq^a!Fk z!BOCajh?5H0u2~2fLjq*8n6Qh+T_f^oN|D%OrlOmss(}$Tynz%n@m>{^tL;0wexDn zqGQ(X>N1-<);w#@&BFXFyI9ofbI&bKH=T87 zB&y4_*Z)vn{d9`PK5Z@6(;?==rzoeqHeU}M%3yv$3EcKjkx)1x9hH*IVF+~ZXQ{_W zX^bexgTn;!T33mTxZRI~ih>A}KLEnyY(rj?4=pQQ8P)AF`#E+r=M1*ErFZ?c(`Y_R zw(2$)ZS<0zYyC6Jw&a(JyV4q|ojHAnsmh61jnXm~)N-|TC0f~pa2P)8WG?Ek4Ab7iJ{fL048y)~@2Zqyy&2>?e*#;L# z9sdM6(1gYtn$MQyyRmI6hQbRG&TO`W{@ukB6LQ1=z=t`LaqnQ?d&{Xj0KfCmM1A*R z-%J#DpT^N{aEvK*VE`&uk*|NJWayC4V^+O)^Lio(zgVMX9%1 zVyK86Sm+6i(#o*_%9b(-l@&J$MSrI10hE}fI1cfEeqyvGIG9m5J7`ig;!|wqgl96v zlrC@<@}0{QC(x*t(wZt#YB!x`@6g#sG5+jZSF`C#W9qFib#q*$ z1|)UnOo5713l37K%v9>HW|mJI;i{?Hd}=wP**s=hm7XJ1Eb7Q9RhqUCSpQi~Y#Cju zRi+}-n>l@FWa~Luz=q3_I^!t}NBf)~{xTL{wF3dfdP{=_^sKNw84GHXR;8>paTT2< zCk$jtyf#du6C%Z3L3zu)((I4L(it{&N=Tzp(uJI5Aa)xK46R=gSuQbnFTHI9#Ksr`g7n_ z;r2du(CveHo3V|#fKeZl<$YvfK2zBs#3CLsiA!8!37i6t=K=e#?}I9(N@aJ(xG<0Du8V zta5@LG@%P!Xv>Ls%`MoMT3Ae>>k(1Lk0UJ4=GoYp*4RrrZfAk1y5p9588e~ov1s=@ z!NX#ZreEf(exck~|B9KhQSRK8pFFxxmvgY5C9+MM%+oK%s?4vht~;LqQWW=sLD6te zP+}};LS;hE3#0S1`C{h=;kkX?!-gmdp$J4oq7jc6H@U?v?r@hI-RjOm9&GSYMK78U z99GIII+eX@n~cn*we+k}s_#^5y0e7bbR@rw-_gjo%EQ*IlK*%5>oZ%~)=k~Fu$LF# zR_jyZ=}mLSgUn^`RD8-&?zdHmEo)%&n7^eTstSheMwupXY|Es0~^aQ#LtlnhKfib0J6aWq)mC{APE{4`i3nf>p=gm2bG{&&Eq zJR>wj4!cuP5d)5OM)(rp|ivb>>2(M;4A?`1?*nF*qPLoilT9WAITS)EZLZ?7OmYKs1cZ(0LIus z86?defGyu??OpDqS@Ka9`5B)1NtSw*-FI!@1d>MBk)7I&U{pOsF?F9`HJ{c2-cg0u z;w50o=#cC20#rc2%{`9%9n>fF7Az$~0d`L;0A1>>Plo9pTR|NZ;-6YX0-PyY8cYL& z@l=jtH z;-Q){$)E#SAlq5rG11}I!B7cl;0D$dB0|#+8sjd85i*(?2AZIh*-r9-otjyq2wV$tAV9AqRq zA{=I;QdOfJ5}XP(qA^L;B#K}(rXYE}-T!Q8Bryh-2X@^VJ`g!BBsH?#lc@>Ty;L|l zWA(*d4Vey;`CT)fTn*w~L8L@FYEl-ypF74@%^l%HSpiP;<64-42&|v~0U&&|UQ$j7 z<8(y_AR1mRAb}9nnnjjFE~E{*q}iZgF8pO_1Z92mP!8NIPN4_ z9v%QmBM7Y|VLc>Y-XY3mhA_hA`Kjggoed&dBTRPWT}on^^kfspB0P#kQ0AHZv|l_n zTju$n7B1x$Ipr$CL@Y^V0g4PjYL6KVYWyx_}z$vCv(a}hbT3Y7d zBI?K>LLc=7VqDVY=mZaS$>d_TX8(C9=g_c}1X|5oqNQ&3;6)avHsR!Q&fr}RC#)FO zW7^_(f{JAFggESiCf*iNdS)t0B~|hV`g~?BvR*xoCZb$|Ds_spaTOTS;wm8*;nAU8 zI-G3cVqumgf#w~SnPErnQ3O?Ic6Os~`ldZSB6HT)aZVHAQR06V=xti(cf}!gn&GNR z=U-l=z)b-WfM>pl=M|Y}ipp4otwmS~1!Nw@GR$X-OG%2USo-Zr5f(wG)^CgHm8X)qgUdZbMn!8QIj&7=!P!oZ^9Jaq3E-Hfi^c?uiUld*C*kCTd}<+kMnymI=mbn*h21&Oc}-#2?~~nGHG&(DXUVDyLz8( z>f)Mir*OVzwM;2tT9DS3WDjaq94Al%SVnMu(H=4%He51Pp*YCXu-rN ztMusUQt&BF$W|7*BL6MDMb%lGwW<|pzQh1-+cuzVHl*yzvTVz?tTm`Y4wMgw(VidZ z(puEpks=q!5tgYQ=$IaCyPjZ~-s%f6+)O^HO-AXxx@o_%DU|-3lAe=buB!|MtiU!c ziCXEr=4vqxY{GIRncyj^94mVy>zx7-dioM8HX4Oog%!c=Tpdhl(rC5nqrGX{!9W8f zkO36jIBUR8j+5f`;`)iN#1k%0?%1=b-AD4EhK=H?W?dTFa6 zm8}>osD5eaI%mF`4y;b@*kvyBq+udP?Zjy+H6rZRHfBhEC?!?odyVa>tm9f(0~%o7 zSg9>doPsypsQ;iQuAdqX$%+)B0xD0SfdEuW#ZYhcLV&_l43T0K+)PMu=`3DNC``F- znBJF$R*mhZs;^dLFMh4zx!`9Jk2$g`=&ImadSv^`E5L$aZ6?j@jxS*n==_!>McQlX z!eJ#^;<5fIZS|<|cH*GcL>x3iCzygLSnvg7Fb1zeH*}B4fUMmv@5l0wXd=ohAa3B4 z5(=mA3Zt;#C@$Urs`oZ*F^KlqUPrcKlB7DL)={gn zcb}8!gtk9r0QC?g6K-Pn)Tbx5H++1mueii0>01iAR+fr2juH85L7_s<@54=@zKlIx2! zY-^MsISA9XK!eI1d$r>pI^<};8*Gv?L>`4N_2YO^UXOT>lUr_-L!SvZ`HE+OFOrp?`E3+>`eo@c5-e|_qd>o=>IwY7m$DZ{2+te z?!-2nEn0e3kU4zI4VR6Wpk7GNuV!UJ)gGiR_%=w=Z* zM#L>$ENmGkG#*M%u`??5qt%HI;u zpY*f4c-8OSuKicP-+SasK0~&81)8~?|GUKdAn|E3-_dRjTbW>AeX;f8$2(pSfmljp=wrUZ9}je@Ywu{j@|~)UgZ-?M`POSaKJ!fWU+ptaK40s2 zo+D$@*JYoluH|FDV!Q7s*KWmAH$Z?9I8dOI6$cR}RJf2~!xj!9MtsN+1Sx08mJM4) zhzx`U93WT#i2;Q~lP4#pJei@9xNzcN#*`V8lYtH;Q0DwKlV{9Q1x8vh!D68qXFYi; zQz24h#75wd&J^WXzAFa_DXFt+4Yu4d0lT#|(?L4r@FxQ**XZe1*N z3XYU8+LN0z;u`EbC=Ya^!Z zb~o=S)0I1K&YQDh=&Ok@zaG9xTJz^sYOoQ-1_J>GLI!187JYq%8sdEWDzh6Jn=j}y zPXkL}dTBpJfEw$93}`6osQtuIs;U6*duqRzK8f!F5A5sE!;_$j${RX963HsGKJ>7O z;C^FqyB4F{D>WEjjFCIwj05es8Yv4evhjLE&Nta+1kXnv#q;jS@s^yd$Qzsc&M+EB zgDpEGr6f$a&8AGU$tr$XFsstE<{)V?_OgC^2T_4M?t zB8H^$E;@6AGt4)&R254)afHpvz~rPg%2#P66UaJ+Ow}-5bvx6^T(=zPS747NmPjtd zR1Lc{jeRazWnqPGSvc1`Gskb8t+rcPsUG_ccJ8!RcTx0)>&jB+csU3%{3QgBmb`*?q!&{tL`;9aeh%|b&0N7Ta<71c`%i8 zRyFB3q2BQ_o{JWjFQ(rOwrauHZCBWtca^%`r>PAYWb;g@N^J%#KHF>**r>*(eUGWa z!DMpId|@S4gFlJjm{Q3vVX^H%%)Mp zeRtJMu2Xs4y)FH8Vv&7*R$IxFeqFZ!uKYs{6$HtIkG)Umfm`;5iJM21xZ7+SM0nr^ zK$J;e9B9BFoYKG@1_@I`H-!QHmH*Fedi%;N03a#K5pV~n1H;jf_BC$N;Rs}>75`+f?Twp{_fB|}W-~?4vm=htAANxg!5>|LX2KWS^t%xxL z4~T*#cCy7wlxQSvO9|oCdDM3Uc5{Dj4V(f4>L?wn0f`*(VBdtZH&RudlCbS_TT_wCq=FpL#{GiQN z$;wQ=>q{^jr3yRg$!+<7eE)#-Wr{L@zVsQ08olU59&S)Z4J;D`%CtcoGO>$k)G>X^ zs8BeJ0;RilrqE$-PmGG!r_fi`8eg7RrU8y>Rwk4z-jU`y~SxGNTxw5VQi}XJ6=HBSD#!51xWYjwL*2xzr#$9@H9$fUJ;>iv zS2~1MnU#8CWm3`RSuV*g^tZDLtVcn&(C0`&f(5;yZ$S!OkP38y(j}Tksms>2ezbE^ zA}l4-s#fk6mRyWItSJ#2-S3VSlYPZmWna71Uka16^@R|kgsLE%P{g!RIch|d3c!xV z7q(PcKz{WLUo4_(kbs@8MG+g^?B;dCVRP&xBe=+?J+Gm~t(_57SmBhhj>1m6S!Bby z&sUn5tj0obc>l%QnFiZaP3b+PbD!H{g4+1O>=mhe2^?fT6~n$oMv63`kW~diq`yen zn1&$25^x@_VnXiJ+SZ9%l;Rj#98IiZ@#@-Ewi^{?9f#zyv>a+_^=_qJrr-yu3NLVX=Z$DgwvXA+ty)tA8zYXn%CFS+T5h2 zhw*8Ply;o#GY8?q%YN^CA+}IAXLXTefWI0ograw969S;sYKrJQKTile5CMb<*$3cl z?zBIC@i2Eh;@QrYjY%wW340lYIqosonmuc0v;4xV({Z&KU28dety#i-E3~fVA8qMogRWqxKv_4=ZRG}0TQ)M2;M27?^p1P^rUhl-!So`NG65& z4*!7w>H-fk5v(rqzytc_TelA0We0ACtA4Mr2fTPKzOLV*-0ZF=CD&(^5E-$=^^3^L+K&_ zt}U%gA=HNfkiY^97~l3gRC!h_PPefNW${-}&t}izZ10|qBf`Q?`JNBgG)cvBZ*y2K zSL80-l*IYKWQAbtb_xydkne08}AQw>W=f2?;=AitrOsh^J z58y8u_Z6?5QC<>9PCC8j}hVWY)pV&K>wlu1Rw|C01`Gq z7INVjnt>UVVK!%z7i>WkFrg2|(k)#rBtl^S5CTBTF)0yD)mFkdk25|dr!*VUtI({) zMu;#KDi9?J(E?M~UJ?yMlDjZ&7F94jug5TLGBLHzF{g9*9Mj``Yb1a2l`1nAeXo*k zvF`-4C9@6&V=(0+6AXgDIWaBj)=4P?z$SViEPo(De}Mi3006L(UbHfCo=$CC?I0K8 zH^C<#0d)KNk1=r)J;$&=El4~0at^)oluXC(?lT!T)B&04v zHE~045Le=}C)ZO&ar6a)4GbG|JJXa$NeoE$%uM5uI-Bi8y$ep)>+AR|ouye(T zaZP(sJ3IUUcCwawq|{E{m~MA9F{iQBa!?&Qi5d zgY+l$bPwsYxhAc9Kvl?2Gg7ZqD{n$LwG>jDR8vjDT0?DG8?{-3tO{>n0ZTGgKU6Vk z6!=s%Jz9VuOnIQ?o`{gMqAP@&Hpo90X1F!G+4vzysn^?+%s4c zZeD3FSA{Kgn#fzf^&p;AQl%AJfvF@=V40{jAu<+Yt>}s%mglMt1#J}V$dqC2by$xJ zGTVwSg)&FEQDIGVP0MpemC^0Q(+=PBTvwI60ybYcl3{L%udr* zX-*bzzgEM*R!#Yoxw7`qI(U?Iibh4K^@e&`m{G?u79? zB~#iUEk8lmFLgBwDs5B!@ z3I~e!uGH6NfvbGo)@KDcJJ{C?mp6T1P%q^cSqW88frmg~2$C z9d$*z7im*hOwrhggO7?ys*Kf`fInAJ<5*UoxQf@eaP63N&y`%6_e1OTX1{8USx1DW za|8GCkL~kVk$3HA7K_hRj3GHm@mG=`q7Az?cjuMu0vM3}b$R=^Wv@*Jb<&YRG-&U5 zb>TISF<6!L*u_|KmFpOU0a$i>_>DdEF4Nc+F;InjH&6itaU*$>gL#5E zfS85Zo#7c|pmP_O7)LERm(9})R{s=bamW>U_?heWasl&h2RGRmd7b;!klIsbnOI!T z8Jll(H_%rMJ^62eZIDU%(B>C)GZKzbl@|Xqo<(}3F>45NGEW;=>nw19%k`Eu7n-TL zp9wZ>-xzm8musz=SfPfST~${D*PijyqS;f2!Fg?$nUfF7M=u$o8?%UUM@30Gs-@bO z=wf&8Ii(vqh)ocm#r1;~(4S#Crjb}ylzN(L*l7PLr$woy(|B@k2UlYou*`b0D{Li(_AJGTX8 zWV8B`usRKYnyFK4xK-P-Yg>CmxrseHikEvmZ4M5b`k><)nYo%@_4B#5*=|RbmYp}6 zX_^5OIYqB)oP~Jf(8Z~x`#p)^cO{vxi5N4j z*tyO4FF7o!??kM)aCU6EBCl7tS(R`(n67JirHvSoja$IC+p}wy@T_FI4T7-U8@@$6 zahdIC+c%bHm>Yw8zXKeBGy0RC`kTr7#FM*;M;jJto2PY8(%MePGn{p6&a3a*gFsV) zXSu>Bdb3$DIW|1KcmKAXK|IPwe9DcIf0Z1=cgL+cd&LL3xR3isds&v3I#H>GZbAEK z>zl@BwuBX&qNkXR%k<757^o3?%(1*DnY_QvwOCo0%KiM$58?=}e9$A<#3Qq;FMNW* z{OVNKmI+X17dy|-+sTjGx>wKA3)j{mun>OKLX9{a4BXebx1M zMF^eLA8o4%eU!cYy8+ui86B@<@_o4+@Vdq(=iI?z9n)w1w%VQ~&I-fhV$}ebQ6Kw0)!8vVGu(H^f&!F5#W82mIKF9ej1sgFCyL`w+=1 z`i0<(m7UPywV-M)Xklqd3@88S;gnr)9F2&|MIp8zUJHe zVqAUDS$^l=Rd*YH-jm#Whil`Rdw%PBGc`M)U%b42zLe?Mfty~~NuIgIeWPm6cB%Ns zeO_yEn$nl~!)-q7Z{AcE{MmS3#oL_a)%=2M9E$zgmOpv{jrvS69?doW-<4SdqaLU? zy>v5(j|*BO4f$j`-Re=a+{GLMVUDr0{B)<@bI-ac#eVX~p0FAI&3pa7+g#s0o~7d) z-}{rpd;isd)tz_Kmhn-(XTci9W4_qa-nTdZTVj^mw^yh|olRBw@MpUw#aCy7TGQ`7 zmFJouXdZYCp7KQ;^%DH_apdVQf9)T??cM%9pK;lToOu90`|C83mYzlc-&iMm=MQk( z8(xN!y_;FQ4A1}czaMrnIiF1i>{T84=^y`6Iwd>5@v%Dt-yR^q2pl-&2^N9~1sY7q z&fOt?uiw9S@d6%9xUgWuh!ZPb%((Gk$B-jSo=my2 z<-mz?Y+VZXEZWbYv6}5^c64XXFxie>{j%d`)Ihtcbxk|=Y|o;3-tLTBYD(KGRsZ&_ zyLV`^rY#;{&YQGwss&-kluk1$Yv5dEr*^B|szWE%UBA}N{N(fOS)&smzyJU8{bd7RNR&rjc?c3$TyV~@huUxolI5Lo5@wf{gR8CA8g}h9 zh#_d_4P{hsUai+ff+&g?B6TT#=H7@sQRp2?GEPUG6b`O<9fv>ZSQ2VQ)n;RdrT_Ve z-fJMHH(qzmVX;Jj07fb0l>Jd@<&{`wDJ6Kz9oXWR8(vtWhcP90T7^6kd6I}sw%6u$ z5O(;XiZQYmXM|}gxf_@>(#ay91}=CIRAj0-=8$QYh2)HHStzEOiH_-Gp(xgw@DVA_A89Ar3A$mJ2jmi;woDZj_tM0n& zw(Bl_J{*_qvV6|_XSu!#daa{6tvT+$h*}G&umWovsBlG!=3=pC-uWoKhW{1|ajK27 znQyEM2TU-v-)=i;w$bfN?!6?7$wj_pUYe(#doubieHw&e0|*0F`SQ&;=d3edTsA54 z#3~*+b^3PubFL_W5wxktw-kgbiw>?e4f2P1DiFoNz*xE!}3ZzqQ)FoO*PXv znV2?4Xips)*5);PAzZLkJhH*YB6P#fkUg?YH`ruCv(0=LZusF^!oaD5LvJnZ&yH^l z=f^Eu-7&(F&rNa5&}u!ft^V33F0XJ${=n8 zRv(tzasSTThPkgFKE>8=C-QB(&!(~La@zX6?Rcl``j6ks9M#a*EA4I1Q_I^~6i#ux z28!bm8c5*tCP=|gRnRW@+s^Kq62FqDFLFi$*xI^ww(NmUd{GOQ=Z=Oq9m$PVo$H_q zWr!;j5)f*%+n#l}heQ9Ruzxi)*bUn^lD$a~XMC83IKtsTCRXDOgS(&X{K#8 zG#?Eu_CXMmZ+`Xrox|*xAs*iCePAHs>{h5KsV(Y;-+?0tP;Am%-LO z&TOn}p&8W}G3kkJMQ$702n(5%AWSh1-Eg2Je}O2a2rNP&5}5*3*uCI$K|nN+iO&Sb8Lmmq zin^-}X_#5fELg$lrSgCF{HQ0rxWi(a5|H|A<0&U3#&|vqo+bn$xH`E_myUFg8l>q> zPiH5wX;Y8nykpa3a?m->6Qy3$m-s-5v79^!o9)`g691psKxLSK1s2U}x}qReaQp%g z6rE-hW(v}sl2Da4B`HV~N=Be!?xdC*C`;4o!LuSYrP6tk>Y5r-x%L&83^QO4kLpUe z=J0m0WU5HZ+0wF(j;{i#BvenOfiy&tstp{42PCW2&SohJ!FZ@C!ukTNax|M_0-Mm3 zYSu&Ab&KfyDP9E_Mj_&^YY83ZmyVfRn0}3{ug#-QfB09Kvh|fDd@ITDX-09~ytuAsQo4*?hm3j#_sb49)U&O9-!ae5N z1`R9Iof5df?0j#H(B|6bdWXro&6Q8T#Z+JJvy85DVOte@SG4XpYExk7X$$v;%R&^Q z4%Ed}S4`qI&nFGn*lsvfJjETXipDcFu#AoBUM{zmxj4dUkze{?#)fB%fo?F%ri(`> z^D@2)UK?xk{8POqx~v?mY3Xjv=}ZT)zMOOLf`4hXQ0ur}0q!z{K|_QwAFdMHZQv)o z>*iY5=NGXShcb*P#j#>KvFvlPZ~H9lr2i5-)t%-vqI3CW&1G5CSYGvj@ysk}6Pdpu zrFP1W{aYA+b19bgRd9LwFV$Q*$j&{qY%1+eM(Y+qF%|Szc>P`G^&;2CD@2HG&2Pw% z0^ifHf~yTTZg`T;pa+hlNp6d5RVJ!d@jiDxg(+?DO&ZMhb+;~g97FO9uDnHtkoX0|%->~R`jezrbr?P?<}=}w{@%6kN~V}C05W8zlyTHiX| ziG5*_Q}?y>H97Dizq9einu)g{e&K6vg=XMe9E&gj2d005pfk^-{hj>QGS3^|b6WO5 zwz^xhK44UPz3yK}J+?`j@T{F46IDX8{seea~ZU>!f|ECtyP6Xox0%y2oG=H*r&wevAYiw>5Ln zm3P8NT&!0>*=Hv37I)$IdH)-CbvBrLF<5&?^?Ll|Qt>ws^hQB5Q)Wl^Kp8*-3z&o= zzzWc`UBeK8P#6J7*gQP&f+z@EKL{>=Hh-T+f6aD(J(Xh$cZC{gNKK}BE@*`-ICb7< zJ+F5uPDXV%xN-qShUj*OS!j0(m3nR`G&|J<%9k@BzzEOx4TErmN=SGQpk4Te4QK#? z7Z8Pks4l)%dFwY{d02w5hlUh4YBg9?utR<-2x(qcChe1n*LB=?f$heDqezYF=qz>^VXLNP0R)B~c!@7& ziS`IU`XY6pc6zOLNui~9&om8eK#b2=j5o6f+h9Bb=|GpTj8SL-5kP^=vjk|>erw2r z+h&dzmx^d4iuSiLTBJXWAY__hoJca#WOQE^}m2e^0-*o;;Q0ZMm}Q!;KZ33a%0 zjVsxaMY&Yq*K%zai<>ulZMRpgn1W)ciN@5HUFns%$a`Nij+Szgf%GiLWr@8NTc7xJ zbGcld$ctPTmj5}nX)A#QlbADz_k76ElusF6J6D9skOPnig%$vL&O-#m)Q~p_QbP2o1S-#W0!S6$Qo9h)@8L5YU~|*8z>0E<@Rt=I3qT=A5MY zMdIfLE;(hg$W3wiV!Zd3TZoSbLoK!Fd%g0S`X`$F$eeZQPj!QT5SNPtrGC?fnEdIM z?>3g`IS|)nNuYp?yI`H2)qI6G2hw+y69}E*$r$QIle>7E(&(G~iGDChM+BNaKABto zH#sAUlK)ZWjR&fSqiJk0nSt)8Zm0-ZFL|0-z?%7plWz2p9BH4W7@L1thyL{h9y%(p zK%o|DQP_!$gpiqder0h>8N z>Lrw6im71Aa7u=a3p#qhm4)4>Gd6O+!5PYWrsR4XZ{DzcA+as?du zUjKU9POsWt!*+gr`kpa&TrmoV>!qsMXQY0Hks)W73YxBbxGZuytmZm(;epTE^$JesdDyRSZls=H^e%ek_I z`hyh}22$CuRfVvPYOD%78HeW#$OsH7fTfYxom$#F=ZcOwx`iIwhg^fEC%Cf?SA(Ca zMuORn7}m18ho_T=vFs-zx2JA7n_p?$n?9?x>OrS9wRY%=suB8&bTKo0a9K+k2LJoU zw1}&Ob&w5F%Z!@oomYE(pG31|%eFkbwNn$ESVy*sHm`a)SE*JskEM>^3V)U>qwd$1 zx#_uq!kldSx@+pEzZ#0VI=X0^wfab(tC_f30s?@rkk97~ad5a3+q6<*2-NUU+Z7Gl z>9`S#mAva8cZ<3%+kO7}u5tUd{R4`eJEZNWw+KqBdRe;Ei*c5RoGjF?#e&A zr!2#(YkP&Z%eJ#fyWDhh)ARs^pbf}a4Ss-#OKZHO@&J+W4agV`j`z3{8@>C{bhTQi z;G3X&HmeM}y=SVT-MFsZ3!p5ioahUx8;F4+T%JWirb5}NUVEP+J6l4^9RJc)y{*Tx zrfHL9x`yC8z|ZpsJXeI<06`8+z>WcoNZW+cFa`|3zz_hQLI|_znW-M4pe!n;B3i?Q zq_)wvjqfYJTD)a5thO_2ByIDl77SCETe(CEmYU|AJxZ!ey2bFTmLF`xA1l5qTy4T8 z1jTzZ56}nRfQ;hM2?iO&Lfjw5Hd9H@ASyRezXwCKg7Y{wMbw)g9br;N!L z>BYWiNg03#e_X`J!wQAmE@6Oc3B1UZ%D@+N10=^aZt#Jmgeyb+5Tdn_tNP|4MtvGVN8H=Kj~N*rbxl=G;Z za#Fi@xy~Gn#+Qtam};%u# z47haB#|OQXdGG*`%+UKWh=~`xNUX$ zr25S=+`*e&vR^y2=NH(&_O}-e*{2l(WB?6-EDo%|YrP%Wg^>Yfps0XM3@$*mP#C$+ z!_{=H+ScpQ`RvzE6Vf5sRvp{dIA*a)I={0`-dJeeH2^n2$iGK*+J}VUd<)+*THd;i&fv|`*qz;XP1YN?zU2!v5Wdz`d@lb}=-W~f0v#|6!<~Eq z9wq-q*|NX^5bKOm)O01RwRDNz>$l5>HrfOvl4>2~p*g)Qyn1K+;q#r!)h%Uro57@A z$M|*QMMh5Tku9GSb@OVoV z;ROM3phN=6M77|Z&|B@60jUM<3}~>Smz~woJdZ!h=q}yTcpTIFp0%@1>)}i9a4p{Q z6Yx*$;9%X^W?Ixsj+p6gKIrp(ZVb-&Xk#KC;w)~lVL9$!ZnuaE<5%JUP=Krh*}TyW z@lJaS!z~WAfSF1hiIrX|LO|XrYx2_u^E_{QdaLfZos;bi!gQ|DKpW*w&NMP>I`i`L zCj;JVAL6Vet0&B5dY+ah&bdN6_gnjR|Mk*U4$uEiO7um~0jnTM;6Ml#AAy|7^pK$d zYo4r}umRof?Np>V=#1|oPVn|lzsnBxp7b1v&ff8@^?3%^Ir_j%_Gbppz$QFRslPmh4-IYt_yb3wNU2x?s_^RjAhPLceAA z#vOc@;$O3Y5xZUN#W7#HjREHc^HB2M!;d9zX3V+sWw~@SQ~vC^Y+})*5vSHGknrf$ zu=~1xZJ4&*(56eDZjINo;@_-w?;ei(g;wOrkDhSgViPJA4t7?(K*6VS?Af(n-(E6G zwx&zNi3Gt-#x2voFMkCOj}hhWe{8wg^ERj>8pW1ZxTR zYSa!V1E^B3CmVa@&PO1R8;KF}!V^cDKMJ5uN1fOUGDsddYC=ZbE;P`>!!CpoO9E~C z5JkX9JQ2j+=DU(gFYmK#&4Wy=(oG5BL^DGz&*W0eEqP;6&KARzGtCsm9Fw;{UlVjr zKocyqOwAB=bRiy|lvF76)XOQ#Ni)^7yIz_aFBd3sv{VACFx}KfA0GA3!v;5WHBTy4 z{IbAC;p#HbD{q~3PeoznmBlz~jT6sB!Hl!M0Qn>K!D2gPbx>SgBy-nkdu`UiYZDdG z*wc{Z7C|XwRdqlie>C@0?Lz+;H3SxbJQrPf-&H9OZt8+=}{)mReg6eOBRWe{Hy6XS0R4G88YK&s)^OeHPI=?bMSvgNYSc#)~x8)z6a| zPB>R5L|%Dfl|Ku)Vnt2+*jkTG78cDWO#N5V6Lgv?1fhpkdTEeInJFAu#t?O14ov8m z>F$V_8Rh(1?ycZ~1-|*Mt)XSvTEQHSd91R@uKDZ%+uoKzS#ew`4t8!c#n#p5z7vcTYfUTdAZg4ykC%~K`p}nZ44m}bUw?gY zoI)$TCKPbFSqIzImUsUqJoeoVH<9tMwe=l~-s^VzV7A|O+jzGqm%QtQ%!D2HVHM<< zEV)%)JLiZO#yj%jLu6jUH(hs`XPK4%if+5p3L5p(lRM$6l4@vwe$H)tAYZERC)I+@ zuP&E<_Icz67%?Bug10K#i4SKRg3R}RXEwM2D|=sIoL73Lzz9B2T##eX?S>b<=KZXD z3B;ggR%gHiim-Bi1Dx~<)i&!H4q}L-Qw0rGK0$4eThN1G_*TfWfE5s9Z*n0RXjDG{ zX6JuNWFnM|_QaiJpoz$t5{OP1!q=s6WLlKn6|-1D8fvh322xwGq*p@T?T(8X+@cM~ zH#|4O(S;uD7~lUE)`9NG3X=%#D-Fqg~xA~KU17Jm|Cdepm~ z@UWLni=}dpbBw1T-$~C$&Muz-qT@ajDbIhha+tz2Xf0Do%RmzJoebn>J;P_pKdsN4 z>tyLlTT1_uqFqWPFJ;LPdN$FALX&td@@7L3q``u|u9w(!3{L9^(%9w3p1i!MND+$A zn;Lbejg)FIC7M%*_OYoE<)}x0>BvA;w0hBmC{YjjRGpsjt1=`fP2K9!w}PZ-R`Xw6 zRU(9=R<(;*6{tIT_#)e>t)ol@q^i0cTSzGfkCf6?!M0qO_zY1>a+JSJt9x z%(oWI;b$ec)!7WRm6|o}X_5Oz7Am*0+FYexod;AL4z;i#mE*xmyV#BqRo_;MXe&sYhDCe7q~V< z9!0NuU%&mn=wd6t-z6kfcY9$0QJ91=YC>Jzdtwx?H=Hk!aDwBwQ46~m z!k5(#4s*F65u+`vkPrMglZaL3}O?OjIZ4l@Ga>%;9`16%KyD?hD94+ zwhWiU-?Gfhz$8^09@(pQl;kDbnqt|iQ^jabF;_mEWRyyD#JLkIdW}huIYU=rMwTpw zru=4!#rUwY%0B!>Zjivi6GH=vWHIlRp^4oukDEI)OmjETh-Pkw4XtP*_gDX< z)qSuoH?rn4vza9zctERrqFz+1+OC27+oUrMWmzg1z=+GS%M^EMKTmeXwzc$?t&C4i z(|O3Dj_~tp^=n?=bjiN#Qtw6^pDo|9xDCA1ESm*Mm=*es!{v0jKiy9`!$@4Pj+Tq_W zTaXh?U}kH3sy@uNle4<odZfb+i4F)hL`^Ua>!V=rfZ7GmJ5dP7J~fEqH(kSScfjurSiox^azV@WK?9@B9AIs>n=;Pj}%m?`yhkPwQ)!_2dL~`ESduWO()+wUuVDUa!gbh{iqa$}D!b!mHYV z`xW7gg<*diCA!jSy+Z-=mz(jiDy{4^g9*23L)^Kuk4#X2fP10u3J8sgS+N~ zz04ptR`IjgGaKZqy|H^SyE8k%+mrgBI4-a=Ks&APqp??+BU@`h>chZdn>*pVwYmwx zgzLKH`#|QqxB}ZAyt}j$Y>3tx3D#S{cYB%xd_pLULiZbwZvX_On>s9{soJtF7F@X( z#IGk)ISD+wAk3&_6FF+3vYNrc!s)*H!ZzZ|z_iOP9-P3dGeIQdLV?>uJ{&^}%)K1^ znJx1+9|I~QdpHvOx;Jtx3zWMsvn8(S78zJVCd3L$kU~rhkM_$%Bgq6Qs>D+nAVurK zKXf=UEWa|W!7!vfX7MN+yfFR>zMtYk-b)*`GdHkXA=QcuMOyzY5(_tBNkrO%!0?N} z@e4%aB0TL|s=u2+3EVvfdpT(=rAMqof$5ek1jP(c3Qp`sZwwDwPyjUp#eHi5h9ku> zVwgk(xwZ3}S2RO*v_ostJByO1I-59XQw>0r!&|HvR0GOKk&#Vy*pX3RqkOAShc z$6Wllgq%J_RK*DM!);PQbeu!p7y@$i5o-8GkNn18u#OZkv20wx*CV1k^ei|$#b&E9 z@>)iQM4^sTNkE%PJ=B(c%ynMA`tibZ?euQFOeWRneo zV;FLq#p8miX){A1C`YQ(xsUA1OjL#*xCu(!$W;40H{1WUVH?K3N=dO(NThVGit9bz z8mxNkuB|d8F|$5{yF(*9DlS_@Q*6Y{$}2W}yQ0*|^QuOD{7Gi4!O>F6s1&NIoJ^~v z$RS)C^drmc0D(jJ2Cw|g0~`-)Km&cz%pT#2m_x^$e2g+01G*QGd`svKmIf@9ZNXQTF{mYP)8BAV$}aBEhD5t(m-+R49FZz)_lNC>oEfz zlN}gK5#_f$c!u&kQKoQ&0l@>2mV zA_cn0L8ZwWZ9^wDEG_-L=nPb%in#^*&;3M9CIiUX)Xp!1&At%RF(rzVC;=6)14vK> zVweVO=ms}!y!NBQB9T=md{s{&k8Q99P0;@r{u$9x6(D-F)97-?uo+I=bX1=tL@@O_ z?9MGfGFRR%hKIC6&)=l&&E))+pUc1k2D)mDcNn&mBFVZJno# z8x~>(DH2gBIpw$G*dGTl0DaAYIS>R+K!sfZhGcMtRxJ{b3ML zfP6|E)l?lV#4lymYu&678Ag>IxFl^^!GT0+_0Ysr(jutW#ESqXkqUhUfB+}}5`Y3V zpo2nKgh_Z1USOhy*gDP+V3z*sgh})@253wA_UoDE0 zyrHY4z<52@ZWX_Ar8{Aj%}CWaza3gAMMY~=P3ikEi#yho9a&hcP7dqYh>X@wTiL>s z&u!IB-rHDisz48+*Sj?e&7s>-$=9frS^;=kOK||!m0Rh!2^G)@67VE+Vp>^S0=t|x z;LFaxO-0!e+;o)1R=M1Bz0#=yHk&2LJC(6+5+6WAt7~0A-ZXN|AWa~}nd!EQGO;*?O zW>?18j9#yJURSEZDN;h*-8{4;7GOGi<{?emM-^8|_Gsaq#>5KZ=~`wQJjOd_BdI#l z!u@B09;V2gX0f|wKt|${R$@&4=xf2~jn=ntUTW?@0#7~aC2r!Ec1nZ>PA|=BM|{g{ z#$sVE=#w^1fjR$Xm-b-rt1w>^S!3C0SuSfP0~=*FKfu~eUB*+bew4fJV(Il`g-~jz zZtA~|W1DVC;n+pK2F$iT-em>hTzlv`bWnc|%4l0mp#@oirs;&49;jsKl@s2gW@~vy z)u3#~Q>eyAjP=fIwAAnEAdt?2#T+n>zosr+f4_$5(cV;y|`tkeJQ_V!l(o--=$OJZJPT4rtD@N4wm@JzAoqr`B5CbX8eYm~OgqJHmb9nATz zO*eEvVYJ}jCSRI;KJX@4DYj#xylv|yVQbZp<^}5(@8J;^-^0Fc0M~F1Px2m7?*)op zCx`KxHftdT>hIm_q5W)SrA@aUln!Jx?*lj0W?2gKauCoDQ51SNFjX7k~_PQ_kqoJ`z0R`ePl zaORPf8#Qt>cXKJX48?r2>8)M#<&p z#O~r$=MoGq@;jmt^Op6}jql4I@+0KtT|b_cMx#m|N^*}$iWYGozejYp6&iPM@b>nw zqtTw6!4CagNTu$EuJ%s*`I0Yt#&srQ zxA=ue_^_vHywAX3#ZgGME?1v=MCK(VUwfZ#`|>;ctuI$;u4d4hOAQO?9~||RpD>i} zSb>l9z&CkekLxV=e3|Ui#7BA3?`J~y`)7N6vd4L(9~4fueBk#8CRg^=Z^@jBVxuSi z%VKwD{&-ElcsQ5rXghYde|rUAYdC!UuV!ElzWY%xjg4K!=%3B$2X^A(?#j`8g*Vy$ zDzV_Vd|GGjG6#IawQ)SH`(Nj($PRx)2M91&raYM<@Ss3~1`#rB_@zt1g%1C-42&po zB1Mc|C@R#L(c?sg7CU|fY4YSlk0Tw5Dd`fSla~);YK(|7;lP_ZWx^C`bLUTxQiAeC zNwnwAmO?M~Ecj9>7^pN~I&oUm;ZcS@HzwsOvLV!~VP$@0+V!l_txv_~Z0O_#3b-xi z(yhDVF5bL)_ww!Q*Y4lIf(H{WZ1^zZ#EKU)ZVVXjjUsJNj>Wolq}iPn)lNQJb!g|b zmO~@enH4SDnw(Fb9*r8ORoAaeQ;oee^Tw$_b%!kYIi+Tjvo8~0NxF7Z_S>J&2dDqfR`|!aapgYl z@A$ue017xDfd$4Dpn(bY#lvd#71tJg__-8eg!9=apLgG7(Vlt7b$C;J8fi!!aVAL^ z-gGBY#Nm3fLFXNLE`p^}d?k*EVpI-ZxLJigs+ZkJJJJ}Uj345d7L3y&`J;R$vgqJ( zMBb>?a~VlFlXh1oS0!)_wy5H6?-}Hya%2W+A(J|O$t6KPDEQ`q2+9d3oo~*0XPtEh zVWpN-3R%`jXbRfkgGpXzXpA|6X(VfXB1+<)jH>qNRjoN%X_l0xNt>D;@)>E7OH#_C znPb9Kl8?YG*<7fSHu|Nfu)atnkGG}B=B1M!Ib@W%ei13Ct&0DOXsHxdN@}i-;tB>4 zc;@*mw9!gC?XyjUm8`Fwc^T`Lmu^aF~x$7ArBtsT}pz(;V-Yl`a1Z_^ef<%JY0qUJNeMeLFq2 z;zcjLS$PLnE?#tF8t$IxmZQ%2>Utj>YsM%5YFEHJMh7qOaxc1 zV|}~YnnK=`qPo+HUG5e~5BBcWb8Y?gp7Tq)nTP{PaO{JBk9^vkV^1Y=tOu-i&eLP+ zJ$lRQp1JldelCCg&YKIn`0=aTzS+pvF}58|MO7i4K$-vpxe2d<4t$`USP++*^{-YK z6X5EI6+6;^rgP(CPqt>)6@;aWZ#UB$^-4%UFma4?Et8(=Y6m|ILTZEkdy;o-=qUmw zFM#bzSD%EHtFfF$g@d!y{&w_26#~$9G+Z2#a#sI6xX}QDR=gq>8Fht;c~1-FO2sD_l9CA&<|%i170@XYhB7o}9R2sd zq%AX+k$mD3amh#=j?9zZ{3a*s#GhCmF_*fG+#?^B$|45SoF5z@B=b|jiaic3^-QNa zt%)TBLX(6!)aN;aR?KLwXq{#}=mo{*F(?1(Z<;mKBP_wE$YwIrmACvSG6VX|fmTu@ zZaNSH!wJrjlJt|N<7c?sr%_gl@t!?YqC5Tcw}C>lnl2rhJh$mbVCr;+`ShtVrBJ*! zo^hoD#oRCpiqXk5GN!qil0n$?#UilKKE z>sJY9u68E$aQZZ?%dnbR!sgVmTIH%&Tji~(Nj0yYJ#Aed8`__;6QwZuXj)?{+XDIE zB3v+NQPMcs7BW+x_ylFmCPa zSm#RALQ!{61)g4cK^xtT1~Q5Cg=~UR7+x2CWxmN3WO~mBGamvAS?({$4O)7dhtg^wi3C&Mkd)7=a^vz zM@h%+?eT;GtmNL}mA5u(u!*C~T@hRPLNHFTjSpGN8eet61T9#WoczB;cGb*~U1ax$ zMY?PX_{I-q-+;{+*h*rUwDJFh>x17c%J#;2&o8E|M~2YNBQtuxLohFHC0yU&zggj+>5sPsELjAVJBVL&AGU!SyA zTA2xswf0`A*}?)ll4M%-K9@;QSRV|wMSgapqYa?ijtJGMcIuj19a?6OcBg@sCU=1i zNOQi9!k86nvH8g6t*s5)btap)8GP<2&f2E6-m(#|DQm{|iqy#V?qO#fZ|iwFtSPxN zL|;8`DlHJ&(tfyF83=>_s)pS~l`%G}!&9%OPI>+mwpRd(>=mE+&LkG@l12REVPo9g zCKvR0`FiiU>XyKST*XzpEzi$*Nr*H3ib-y1sXx6^ zTQ8O4AMd!-IbFVsr<>$bUwFxJ7j=u9+2t?SgMu- z&0a%m%Ny)H!9mjlAG{qjq38O$`PvO`ZmVM*=KD6azV{gLT#MJjLl-!xN1S)N6CHYR ztWp^bYIw-A+T)yO``ImutBjskmO<{=+ZFG5!-t-cUtz+c1+ROx_Jw$0=X);=-gY{J zTf0z>`|uA3#mFDepDTCslwCi=adTax+@`mJvD_uu%{}{ItWveRKVZ1i9i`&$s4Rc^ zZoPMxRUU~n!^xQjq_x2ZoT|oKS>~3E8l&^j98J~O+(%YFGz`33Mc%29R9(!F& z>jhZeRiE_%UsBaxmMLJ9eBUdHToa|G^_%qZM8VBQ}Rcu}7JJ)ZY%)M!zeHX)qPq092cOwB)_}48q{VZQr^fAr9tXnB^M+G2suM&g8XH z1`;6{N?}l?AaX(7wozckxgpeX9m}wvDy53!d0_InOCBcP$BCdK{tE3KqU~UtYFXi6 zVV@(SMiT$f-x+?QfB8%eR$UvCne6f59b%k4k>V64;wlEv`2`^_{n_eq9<%-7c9ozY zlHC{@py;HKI3$&jOB015RB#hD{c3j55`niN@F~RBt8A)S+ZhE z`BqMHCOQ^fWNuw>O(r$gq-_mZU?!zt-VF~(2KN9L39g}zsMKuIWiRHOH&!NQ!lq=l zC3LEy=kd?<^_gZaqI2dHOP(V9gxeF|BXW{tVs52Oxg{-bW?dSlMO~L{mZd6HA9MfY zQbW3+C-x?z%|PMd@^&3L2plW6bVA`jV`G90xCkD=FUb^9j zx?`AWVjW_XaxT&7Yb=9%GrO)3WJts9f~Hdb?6W#=#hef7!pkYM(L=r zCXLqUh3+Lnh1izZT|@Rn@3`oZC4tO6=C@5FkhYydekqFqnH#+)82+M(q9av4={iy; z?a&pS?x%G2=-K$+lI~6vKBu?^nsJ6^o|2qg#_5eZX>?MhgZ5wPrDc~+D*FFeq@0cm zpLSvunQ2<3VJ40!r_!dNPH3`WDZKqyp^}|bE$ZBTUZna`AcCn~W>tY=YOe01jwX(H zM$eyCUMp^0y3MMq-Q+>yWY08Z(&6K!+Ngn+7@Uo1m{uoKl%c4C(+$vIm42G1Mr#ft z9d=SGL7)jRcGz;zT!a!OhvKPFM%lC0;*C%_rfO!+X&U|N z9-b;BIUt|vD}uhMmXamB8Q4&e6C?S+4Q%UR)|R9mrVrxgo!XU>zG`xK$kjX_z_J;y z_G(55Wm=KeD_;L@>56@(rlt=D zc9?&TWkM+0Zt54t;>{A6Ma(XuZmp<%_8ClKqLpT6qn4_;GHR1L*P`GhN^YTg7H9Km z?Yk;yyXowJR*!8OEb7#0!A{r>=2k8er^*(q((5rI(L!Z)SuW06=$^9fiQYsJ#K3MA@9yn@5SXL0R#4kEZQ@?8`=l+B8tdEo zr02$Mo0_eR`Y2cq4Bx8h&VeUbw(HzR>;+Cq(Q@y9Vh!+G7WV&o2JGqT)rOqpUY4MG zFYlUfd&Vy@-t6WY#r*N6@!DUg3UKnaQ2I7wcO9xXBFA|g>MV&}V~%Io0xi<2ui)~d ztJrRkj_;W;Bg%sBiT2v_^2oa&81u4V_L^>h#^U6GCz~!SJF4zlChNyC%}mZM5Yq4a z`s|=qp=Vg^0Q24u7x8|;Xnx=?+KH%_LU6$PoBu*7152?FQ*ejMZic!lsWEL88{)pQ zV5gd_-2!e2Yi`3*vAgmw!;&tb>MjqJE(@P5)k(0Oig5;8Yo3`g#8@%o3a}B|Ul2SR zmmZ`7XYeZ`X1XqscP1;|$}ai(tWh$tX;fn0iZBqjaLWJY@8D7$K`t_+VlV1i@s$pm zF|M)Xy=5VXt&72I9Z#wIE^^NHu?Wj7BF`nk-qM=HS#e#@`Kqg9{21Erzj*hZ!5d<*zU1$VlIxB zuoByHrr`1mV3IB)22)b#@5-_+3G+$Kt{&GiJ8$wjv$H;t?RkOAXbM^jnKT6aJ540@qpZuDhHKVY=me@zras}t;=}I))a zMpg)G@PG`=#Y_M36&*1VjB`kO zv=&dbCjT!BGj!?DGpB{oNR2?=sxG}an3M( zrD-q|wKH!pc24nT2W{bewPM<2RFA7%H>xiRt=K{9V>hXFV6g}1w%hvZQ%g5@2CG?| zwh&9LTmKGRyA2!<^i1OR6$~0!F?M4&D|`PtEZ(W5FE49vx7=S}b~C+9C0p{|jdosR zw|k53HcD>-hL;9=vQYnYO~WZhFP=D`Q>+ymGw>gSa(IqsU4)!Z!C#cQIeq^V_;`g!i{=|2Kfc9AM9=uwnCck6k(gH97n6C4((r zUv;h7coT5NA9ud0MviaqDSNYlSN4=+ z>$?W`jKEZ)dbVskw@Ab5ev>&HgSDLjD~r!;GB2jQTKN^KBxy(Sj|cgl=b};+fe^6t z#f}t|&j4%h?cz}R2;uPxUc^>dN4<`Zc7-7bGoI=asBc*DStSD7bkyrcu^Pk zj5lcY8g^DYcH(aJVb5OP8XMudI*%=m(o2%?kZuER>bgcWXV*+}Jmu>$x@m>4&-kCJ6tD5+d zw|!%|nnyak7hyT?HdZHiCYKAlbM?3n$q=k`Y9Bih7dyf4fU+Msro(wK2IQDGXMsOA zUcb2o_qmu`ou_zHvpT(^@us3Gol7E@7xY*6yT7-%#?Rt{hx{3@D!R2VXa_pQ zm$-+=`N5sKc^7U{1ADNm^}zp68^Q-cqXQ$k*E_W1oUecTig)>t^E<4McuxN^4)ss$ zB5se{cEh`rL#sH*yS&Ipa#Rm?)=#}OQ#V-K?6y<(pNcxTdwjK@G^GUPpBwW2vVDvb zvdX)M!rPjloOXVmCUeqsX>WbF@B6z;yr7pk&HImaf1tH?JLISOwZnY1Hr3JJ`oSeW zdbex)$bHL`c*_Sg=N@=+v+U6$z0q6h*W2m{i+kL|nSSR;-PWuf6E^kA_>1%E9L~Gy zv-#tD*!4oV(j;o7@8=_Xdwb(OtuIv1%Xzs6uE>|Z)RQ`NAOE1|zUe;vx|Vd(4{94NbzFCg&84o^oRxIM~ovqI+3_hWJQ!ESBiXMF{MW_BpbeT z2~%aum>F?u?8#Cm&!9Vp<_szH%gv%ciK?X8u_?`yCW}Tb_!4WEr$CifHEI=VOr}nK zW(DgrDc7iDzk>CO@GU{M2ItOgN_A`4yh`z&6>63!V6}R$3ii9VW?Z;KryeypbFJgQ zk`c=_JlU^ZrJK_x)(rWv)X$aIjwan$F(|1F=2`Kg6-a8`(>*M-n4! zY{=tKq;NwQiKB`)4=qHBMj1_9QNt#sRFTTiEVQyl(Z-swyv4#Sazy2rbMH&jl$4K1 zLA_M;Oe}ev)H}P% z%<;dt^0fbs%om57(xs$O^bycXN4+#c2~p)#FGeAC^v^f1^b^cJGxg3%89Qxs*Hm-j zuGR||I@MQLlZ-Ui6IT^9FiV%E)i+IB1eK;|i}ljl5}6A2$P_)jHOece+caEdo#hi< zI^ks2QIe?bG+i4>6|-3>Ov?7#ato7mNpJOKx6VUh+;Lr7+okkcgn5+{U^&rD*jWCO z9CuD`L%dj35zkfFOkEF7IM#(3W;H)o{~eRtiSZ4&)p)J7m`!Rc^a|!Z-z5`YZ4HKa zv4`VTw@`-ztT|?rKJIy14rS(dXny6z^vNoJuGd4Nofdj(ptq`(SQV{iIcSVqPWH!{ zo6i5&GL*CCDd$fw{hGRN!G4u)7IQOM>f4_6H)?PT=DAd4k2V$X`))q-;lt+++}!4l zyqaT&zsU<>$Y3*=Ya=Z+}Mj}%=6rxKlxYW zv8T6p=}^D+?7z2HuDP~dFMoaQ;}7XK_tk%tOSz?|{Q5*2w;dx(10c;HrzhTpuYd0= z+?o=&Jcku9b&=(X;FZ*&xdALGh*Lg4?^ z#)JAw-|n)IvfqIad?kutv^3Z{_`&Xg(3;oySg5F>0WmSy)8G)(7AOe<3WotBq7;ib zze5qth9ZpN(V{4ky{!yXNNi#d9cUjhT5*bmBjE@UXFm+Oae)gm(Y=aHW|e%j~GgeYNU) zJNy_SMajd3tk9IobK&%;_rf!-F^--&BqE=uxlt1EeyD`y40U}Xo zqU~uVlw25bnae;<>X=+4-t1uMORND1f|TSL+-PY{XO6Ly5t~>Hs~1i`&II?CBAWS=HDz&}zs8rPAQ)#Conugzo?AWLKBzuT@^w zl4y;pTKhFvKc-e-(VHd`n@PmB;VzPwYhzB!CCuEG)u>BlYfF_W+prd~qKyRO;pA!B zQ3-dm3i)9nBO9Enk~W_qaVIBhdoVGA_FZq(Yj!;*+mLp!WO+?2p`J_LVg3y^DR5e<7FO>eB0}qaCLn157)&B8|Ff z#BEw1jMxKPm9OIk*%9F@!R3xPlpd{@gCT2Q8E)&WfmN|}W#+~vC0C^#_ANZY%Hl74 zcavmwZ(BKRQPqYs#f${;jcqt&2&?wIJ;rWK<=b8-uNIhLn-c$4=c`olX0yHmhH{jf z8)ItDm~{R8s~p|>vY%9Wg9Mw)CWyrE$d!n^go`Sk6cO zvY_c3%^jOKsVKgnI>%bTrb0M_lkKiUJdDpHfBMOOt}2)J%wvQ4cuC~!Glna@S6A=V z%z!QOTRp3+58pDxSU!-9#oX&MZxhILC8l2;r$0zyHrSvJAg}X0RU7ZO!k`vj?_e8h zv>G_kl6`gOxLvwd$C|20elxE~jpJq;TBo%(udrn)G1|I$fXCY-n*Vt`I*zs5-WKw2 zJKN>W;o0Bm{;jpo3Esv|c$o>-bb^?fU4wfzF6lX>0biS@gS&gH z9RK9jyr||=XYJD4hPbi8O>k2$a?2q{tHyEcR40Ft$*I8`o=ht568{;cm~N3)SY9RF z@;aiqJm}E{PS{E39N{M?dBoE^)le1t(n4o-wds98oNAS>;FadHFKq6p1sm#SHW|;O z>+{|^nB5IN?YVUvl$hUo*2)feubj-ZJ}qkIcC2powkH51i@BCgen#Ecn4Ip4<0bGjZl#=f_Jv zHjsC@>~XJaJqNVtj1^s9qu%)0w?2dn?|qMG&P4ySn?ChUmsA2DEggJ=++7AQe&^R* zebpNt-D*>M;G5<9ln(if5Jspl#;@!+3*$yGz3xhr;)wl#4+p{Urm#@I zk_!QgkoFuT&O#_VMo;&U(Em`cxJ>Z>=*R#2fG`VT5DbFJWe|<@n2G^A#tlh_-_TJ1 zyr~c6Xw`;`33Kgl5~}}VMGZa84)<@=q@|s1u<#O3?#?B%s4(F+(b{D24)+f99B>t@ z@BkU{%7T!;uBZTEQTFQZ6|e3HQLzqbvEUNo3O~^g0nznr(G&$O69bWAkZur5X&KGQ z_#$uYn5O0=a28v!x%{daw-FV|1|$#iVT#=Pv&n!;d7LQLcK?7pIXLy$r8TPaWeb9Y1flc#-~; z?+wEWi6n9tfAJ+pX&EIDA|;U+12P$xt`Nhp5|z>j2eKuT5dBIJ15Z*3*%1J%u+oyx z*BmkLsy6WDX7c+=@&^Zu`ksywQ^ykRPVAzxA8TnLG0GbAG7_!wAqTJ& z#i|Uov7L01#uShxIj{lo&==28Bn8J6{nG5TZ3P#Qb1srKI_)r-QYIU535T+W_R_W< zu`h|zB;RrCwh|}5PbCfW6|eCLdr&jo%kOG218p)bp|0Wp)8SrF&Meal!ci{gDlwy@ zA#X5Sb__u(vfc>qx>oFtxUv8Cgwq(m5-f*qI8hR^K-0qBV&6^(vU(}_AWzdG5qVCF z{M1SfC&>nTV#B2ICtWfTs}6DGMme4H+r+RYA*wyu@`fl%=Kjt8;1b4;k}i2uHc7GM zCX+9*&W?gC@%#&s`fW6u(ka)`HLue^5ivutB|H}t5>bNd9CQf3MnN%5Ffa6Pd{RK; z(C9GKAxCl|v+Uk@P#_IwZb)jo#7ixG6Zd#D=Gc=($&&lrQ$pm?6H7BGG4TvRaN)ME z?X-*yEpr4>B}ijaF=5jqp)kxk^XuS^$oTUKe~oZTaij)*jX)-=V z??qD*ReuYWin8(oQ%EH2NC&SEF%>Jq*cR3z^a2+ zKh!p%>%~@%pPI8+p)^s$Wm%E1S)J8V8?ID`bXwPvIMr47W;8H~wOB27Pv0z5QKl1(2F{>C*ZcQC(-vidN#T@|*q*mbS) zP$le@g%Yx5Rjfj1mS#!wYD%_HJ5lr^aAPTu3o5o0wNET#R5cy-Xt}d!S9Q$p6T5Jh zN_CcOdlc)QmQJ}R|6I0H=an@dtZR7|V}15^_L4D!bv;c9r=YJ_?~z+?RS@Z@uzh@3Qh75M+@tB>7d3@sjpPxiK|+*I^O2 zKT8x+focDeGD|?1mqIlbR`;=Tt@J7gvxP*fc-Qjvm=<=~3qpy-q0Y6go)_$>H%cQn zYwzdoU=}+c^^$&8dPlc$H#1&2H*C$x`jcX)Gw)Pl{` zW{Oxtf7n#ZQGQRifK_RP&7uO6IC;JHes|Z2Q`rBo_=0Uic#TzV>8^uWFtlh`rG}gQn|C}>@>lp457lKXeN2M!M1-LNV*L@{7W0|y& zxi-S)IE7O7hB1nXvqyu!RiVBPDuWk@X?0Yua}t3PbHw;|Lw6?Wh?BvVl<$OVrkIdH z4@Eb)+2pj8O?EH31)%&fTD^BZGuQ`P*+x5(*{&8;yHH|?IGBameg!of`d6x&-SR0C&y%w3zk5bbRG8fvc%JLM`m`^wKbpcp=dH7$2%6xzJj`^ADGFktd z(~&Ge5BjWm_dB=o1+qTW;$7|$DXAQX;BJBV;W%X z^Jo$Jrn9)2g_xJ47F-`Qp~?7$KN$%1cSQBMO`|z;bBF-BY+U+S+Rmnpd7a6( zesu(vEAmhW)Sv-(Te$ZRTbgmL?lBvB*x0$hLfNhunxfN`t~dEf0v4)STB_H2l!>~G zBN~zMTA&Ggt1FsDG7lPm+KS(9tvlMYhB|~f^s3F;kybde3)ouoD5u}}m-R|p^I5Y& zT6%kzuO&&uRxxlBvnQ3dzeF{VrR+~N*N7dvt7th)o3x9AQLKm0It%(l-EIG_cNLo~ z_kU=3pY1x5{ThGInp`mtvWxJzt2KY8&$0zN++?|7P&bDK)|$td|8(v=WL2e8yDPc) z7o+-Qd^MeA8adKhlw0mtLE8+$_<|5Pl@;27<$IMAv#tU=g715qDYlpq51C!H8&_|r zURknRccOdneQ~8GLmHg-IYAxVmf0q47yBmR*uMP@r46>g7Z$9s_tPkRq|dU!&z5SF zxW9pWVbNH$0~=lgIA#ahh4pUrIQWw{56NGHym8o-y-cN<_B^@zvxpXm+5kU5z`qc| zbrd&^H@(%aU#)t^8C<<3+A&v@m1|hLSvSaGTwnRLGE>}6m$Q45{I`4C$;JHt#ol|o z5fpr_yg*CbcL377vvQLaxvYKp9b2r;4ZD{Q+s5OXpmkcxaS};k`O6=+((@C~k9mo& zSE~6@4>CQ7e~+JLp4y4%my741e1+gRxQy0`q;7d)2z+XeZ%1)DdkUme9< z@m`s{n%_K`<=owa?%uN*tC73RH=W+$k#x_UGzlG|)v?`o-3m`R&E?kr!RQ;{&A8b6 zyMZ%)mU-HBL0S6VI>tkO+O2zHr8yr*ecPrxmJqw!J5DyH*55^)*O~AtKeprv&69E7 zp>s~h%~*vo9p=M%$ThIx@m*YQU9s1-ML)`EP1uVwx5!I7k$NuV%5BB~Y+Sfa` z<%QaAcH;5S*s(U?%RcEv-m&$W(?LGa|0Nu&k>>ZF$LSuF%N@Aw__Wph>+5dAg%Z7C zTJX(&Hu-YFa`)M}J@KhZnG4>oDV?ex->C1}=_tSF+xAMqUPC0+SUcBq7vA#&pVw#o zsG{8KjT9FNK3)BM+gtyv4SDGyl6rrhW+UgQ0!G#PLCY*w$p~Q(4D_XpWF=LjE4;4;y;!&eW zj2$D6B>2#aN`oLZrsQa`BJ;cv0t@DP1v$3(57eELVe2>?$()79oCiW((T-hc^lT` zyVow+wPxemEi4$R+NB*4OT26NqgT9?1?vqA7jjp}m@DJ|)ZEuH)v#qbOEx{U%UQXN z|90kyn(*S%vm-NZt(P+Bp}B1XX1#l@Xy2*(_LeQYt!}WfiysX>wzg-QxTR+{4So7y z>r_8?4Q+g|Z0_HQ56>KtIeFM$Za3fVT6=ns>fg_t3}3bR>DeVeUe8lb_(k`g6af0S zTx;U}cOY`3)n}h#5Hh#mTi7XBp?vJ^7hrzL(biml<=xjHiC|^8VOtSacU*$>O;}=S zzEP+lfgJuepg{2<_?lBW9`<8mCh~{jhbqR%;*0uuR^5CwG6`UjH8O}Kj)(<$UUyG& zC1rHV5xJ#zBf59ti%oU;8<}pk*It;{MF}B_V!C+$qmGVYIVOl^Dv733&sC|XoX$O` zWSR##c_yMOKDZ`KZd!;Z7BJRHsfXcZX`_jIo>`xudFJG)n#8pzq+f-y7pGDp23ldC z?v3XvPEZ1B=aQIGDItuThB~NXHOBfWkMMbvJVwNUCS()pvoGoVbG$=Zo2|eEAOIootmwwWj@>J zoZo^Pu)xdOiz|V;q6=bK2{+5|qzLQV;kL-eyV=FZF5KG1(S&X^SU6rdufUgw~VmAuUZ@;XC>QwZIv<` zZQP?p&rEKzS6hkX)O03Ys>!jX%;~?0+UqsAJU=aCvT4Ii_0iQnyltk0zWrdgIr14P z+jd(!uiqbo{S&ZXYk6zGbt^t3+%F&LrNL=wjP%?M-<@^3gnK7)<<4$x`Qw>uNV(%K z&nhU{HJ840uC`)6_1ZamZqdnzCvNKIhZ9{l<=7I%I-#$dj=R=CtEn#SbpL&N#fvX* zJkvC92d>G{zbSLtt9L%D)X;M&J8*c14knz|Jr(@O0*3$J(9KsJqxz9k&;0ZB^B#19 z^XKV){B-9a1FEKjC3IlkM2Nz+O)zfhqu}6d*s~Pc@Mox# zA-+H;KkVgDh$S>j4|O;=_U$ZyQgqY>p$I`28mMLoj2rTn7(=Cn%}!4Q&kysbL^Kx9 zb;HA<3=x>cE=mfCvx^_-n5Z@`rtyyDTM-?>NSN-_aAk6&4h@xPI1&yrbWhpXA6FPe z(s^%-Zj@xx7D>JYUa^JSt5+qzSC~Xf3zD0GAr?6aN0yb5k8A83#i~d~Jpzz>Z~71J zM0v_EN-u+$^kD_nNVYPyv5TAkj3OWx`7=t=3zo;qrP!p#%#|E7j$=Gv_F!2|_|dX* z)8kwyC8k1BX3~=F5+{eI*~?T`bDciI8#>DsO?BdNncLK*J%K33c{=c&k!0sM<+(0X z#`1Z%T%Vu(39vd9)P+UV=N=n67G%0la3VPoK^J;XVR~_P^&FNm9ZJxlt@56=oT5aB zsWhuOQ+nCFpBYnnGk8uio;M_^s33aMbfUzQzPxAyOWMSaQPiV;r0E$038j|m^pNl4 zVA;|((uV@|mNOk&r&x*4eA<+oQAOn?a~eZ1@-te%R3t!=>ZRaa^{9nRpE*(1)ulS- z3mV0sNyHjgRDLi*Z*1oOMyXjxlqyi5cLS+ZS=QGJ=`*f*z3Ei7`p-4yQI=Z`sZ+B$ z*~jisvh%s;2pPId%~n=&sq3g+3wc(ZnzfXK)uOrNZ>@?Hb_K#oOhqA*W~*4w@KV=E6sO4_KFv^Xt6DPxz^A0 zwsfrg9d7reh~65im$Qt+EL;0)SPAE~v4vbPOWxwk$e?!i|4SMxI2$p7@%ce%@D5y$I^0ahxShv-%*sfuG={$Dyj+SJ!V zH@_C{uIW}7WVJfEyc7npp+QSVzAenOv$L~*sY>6v*0jhpesMM38ffipnVf^$Rn!=* zHbT#lnNEgnbuUcm48FO<3HEYr>Wk`BzqK)+eo29EjM45wxy69pb*oc-FHK+BksdVH zpr?!95NZ=N3(fTayCzi5o;t(8*7acJtJ_S|?#`7v~xznb0wKq-3gZ^4G z(?mC?zhXuIQ)61CRgSWTF&SqL_ZiV6u3w`6g5qSZdVylw_rEiGHYyEUyWf;|uh+fT zZ|~XM1C=G3`t;6ZEBl#ct+DEUs_vk!Skn8o(Nhg9YKF3Vt$u57z1yns%+}e}^NzNw zO-yosFI(ai@2krIcI<82HqAsQjG}q2-BJH{z}C(o&{?kLo(D%)LI3f&WnOfJ0ll17 zU3bnM9H=D4bjboeBA)5F@`1;E<9%GzqMIFC(mooY5GU%>4Fv0ld;79lZ!^IW?d%4- z2wJ!qd&dR6biHF;XkSj~@uF@`!JQYH46Za%Ho5ivn4PkUjcCbX1J1h^9)-f@I;*Wr z>aO$u^xd^xGSq!;xgFaa_Mqq66;y@fXN}U7E*5;$N56V}R=(~!KQfTVCEVgGJnwer zF&k;`;h}GYzKZ%X>CXOO7M8r>O*S^u`5kcPFaOLw{=DVicz5h~JE;rze5~jGan*u5 z@PU=G;=v#0>owl-Szmu>qPCwZC(i@o?6wP=0I2Z!OdUgcJSWw>^~NQ}Oi zGbd+_*Eo!QCvQ3yjh!Zj(h+xnC{jQOeOi`xXiRn0sdI&M%mv24)_JA&@ zf$0Zkut49?ej|t~{&S*D~B#s8TilxV6 zTuf&y9jpfXm;%#=1jy5?`g~(1f8IpVlbI@mr5($*%$d6KaW?o2Dyi$lssgzDxj$J8@#@Ke8=#4{Z zlrTk*f+k>Ch-*8El2<2YKDmkQV|&5~mjQNyqGW|DNtIxLcx$PaCb*bL*^xmgmMK_@ z+~}4db48%&j~uv>dD)mR_mwf(QQHWNh{**D*_0YNkv_wca>bN8#hIP|>6L8Rm*ba+ z0C{guXnYdscm;Jy82Fk`DRjT7n0B`*ve;VF0#~N#nC+*Hjwy8{6q&He82#9ms>vL7 z=xD6iaY`qNI-`3&sBhR9W5#%hmPL8>l6pATjaZ3@d8dZrn31S;Zdw?Dc6pcrNmJ&e zdLpTr{ZWR>GnCTVbF%qKt|)xmQJ!82mUB6mXxW8)DV+!jbHd4DIQf2cXPeokoTn(D z9=VRJ2XB3Lh6Va?j-;O|1D}XQp=wE;AlgO8*Mr;Xl6jV)I;N8Xbf2AhXbD=ME9!Ih zSdTI3mJpYs`Xir58k@2Pp}6UpT4`n(+C07YMbUX~1e%Z&>Z2w9s){Enl)D9qMXI7% z+J6}NnH$P9m5Fkcr-RuEcz;BtEJ}Dwifk6jm}wcCu=bA0=cLxzjlh{6^VOm*dZhC> zoTv$+NfrIGkja2BAE znxn5uPG*XWP0E$^RjkIUsjO0M#G`;g+NX`mmCxF(rztuI#$b3FkCybN1jaqH_N%}u zAGe5Be`ty=YLS4tt;t%SW~i;ZYM?(Ekp23I`8lH1nw%j2*OiNyntK|m`^E*#N|^{( zDWfBBj})-)TAli;L3m25e#)-iTB-XwZoLU;Pey*++OZbfBkt*fySkU7I)&~!pdJ^G z@+hT%MSiB~SR_lLp2@H<>Ut3BbRzYZ3sRUGN{u|)uo^3M8B2#=%Cay!tXe0ds3^3P z$a53>kxz@WkOGccIi)>|k`c+D_eDSv3z~+9sJq9R_KH)}D7Cw!h--7GPWXIB>#!I~ zXRRoi0*kdKOR#xsQl8ip=bDTOyQzTlYPt#;{>gu5Yf$_;pJN6wS*sGY2DjsCulx6y z|B9wyICWNgwR5W-AV#%HJ9vvKw@RdT4H%TRS*siW1CtAgvTUn?pc}e3dYAADJKt%o zyoa69@`;rzvqCC&jElBWOS@%?u;M9_qKLQ%)V$5tyP8{knL3%z36-&$yha;I%xkuR zBC)!gor+s^8~Cl&bFcL(I`<{868g8V=)L6Ey$6a;J3_S0m1XMLhS$4YYD%j1)xPCh zfAG|_qQ{*>YH8hco6y?2l3Qa)8?B^^JzH3pVrjZ-D`E@^k#U)BGh?3U`@aZ#TZ$^A zz)QK9*`dZ_lNl_SvWuD=3#%XGtZi$-032B2^0wkBqAR?noOi!|OSn6mq}ivcEbOaG z38@OXnh|PcGrDp_yucNUy?UFg(4><3NT2-w*hVQVy$T$}8#|_3S*rcZtH)`@9{j?m zn6E!asWgl=4jgQ8%87-xnf^K?i)*~sD#H{BQm5+0`-H;)oLkyUuSjGoRVbz!?3MOL z5ItO|sx-hYi+S{Fq^GM&4*0yIiDF%vvN^WK#VEOd>`gc*#_QX+$`zb(3ptWiki@$| zj|{FZoSSyq!aMx9#fi#uENw+KmO|&s2N$gK3dUiqlMgGnwHs=`%S=3*%bT1@INHm; z?6|nw#pMXfSW}yD*pRdAcERhz$7`-0+-|OlMC`S$v3PR*u&c}#*mmG3*r_V;z&ECAU>zTUm$fLqm z&?d@g@0`soyR{#CsW|kT=-i0_nvMevLm2&#nml}^TxR9f&I>)A#(Bq=1IzE_oLZZ^ zpSgL(tf#ZA#!KwcS6sM+iz){iy>#Wwyql;0{HWvnbx$mEc+0IO9n$^`I2YZ?Yz)oH zYM3#7u^a8wJlxOK+qK|qu(RnG6H~$3+0Zm?#_r43>G^OHJ-&fKooVgJNj)sDTUGRS z)Hc1&B8}IEl)7kyqIcWVa%{~~-ATo4jX}%TeQnl&OTuJ)dgkmV!Ne7TYR7ktkc7Fc zNfDatyA_xU#I@&}jqK8Bw^mU9*3w-Ywm+?{R$bJwY}7|Q(53xvn)ZeceXz&KxfqLl z->lO?jePi=+qc}gww<0IJ>0WP*KF9;B}}xc7IP*H*v1Xojjb~Qy**`j+vAAQL`Hkp zys)Xt#XE=Hu4Bd8eKw4R*~0VF41C;wUC%?i*XhmA3L)PaoyRJQ%xJ;h2QA(_9n7>n z);T-GUv1e<{l@1z+q);-51!Sjt*VVRtw$`u09%(*Y>Pf^F{=yGa(T^0EFJ?s&CV^$ z@QmP0tl*i6)qPyYM`xeIW8x>S)-1kk^bJq8n~!as-#%`L-)r5|i*C}&zM}o&Zq3zD z3oGbdt|XE|dYc`b35L)rF6EWz-U!N*Q#`9G{m=xA z(1LDt^F8E|UCXQnVwp_Mg8a($y{dB-;+3vuwfVMWPT;Xx*?Y#=jE;|4ntr-1=@)Fv zzbmiROv#&`=k#nLW2@MVhs^RD>YUu1!`SOEzC_e3&F=iB#crL!4(Ozv=dY*OxSi}{ zJaKj|%-qf7OYYjr>+I1EaFG6?w%+7)oLIXh)SU*h&&-a%skVySj`76q+ivdX{^pVm zTZ4P(Ee^%y2Z2=oeXGXa>B~%Z3LC$IjqNk+;5xq6TaK(&e$;Xp*t#fSl8uh(eZr`% zw@H5L0W9$RuFZG?H?EAi%)alIUhM^*y%$OwyEM?dtP z8G0}7qwBH?I?o9??{$yOczoSNkE*r)!RHw6$#~_4FRV`dY(Vb#`wh@-Eca3tee_q%+1~6ho#OH8v&qEF zld2*zzuqDKqVCSrZ3 z-TBDQ)~Dxe-rJAj9^2n{2D!;^(WL(U)_%gCkK!^7)j4_I>oeDiM@owxJ4np*}liMuZc)$dSvSF zVvoPb4~vVBoC=SV=zq*;N{a7a#iLyPiwX9hjGQxUl}Q}@wjZuiP{dT9{waR_U|)ie z6c7L*`2+W`1l*vZls_1_8hsDsYJ=K5XJ4sud;Yz8kD^rhNO}VVXm5^JY6LosrHQdM7g;W3k33lZ53gP|O;*hYRSm29FHi*)YEV{>G zdi*`;posVlM%;!XP55Jw=*2i9ja+`|B#>twS>tI%j#(R&LM1sRl^;$9rwNjQ$yR+D zO6R47cj}4dpfI{gCT)e5c;;B+eW_fakwGe=dSc!wXOjwE2oiU@SxB9rVPfdtplV); zDWg`VsA`>d0vD#F9#a2$sDm+nnyIU3a<%EMSynjbmZK_JYOW^^yCjndk*K1Sdnx;? zacr7NT6~~t$taDJHrTc1M+s>(Oy>9t9FP!3mJ8;3XE*k8*SP5JvU=Qzl zX|pemtTCE6>S?XK5cjz<$qnyo=&9JTYmvekqbqB;3qPAMW;U~UZ;%YPe4~#+)2J_s z6~~+?q9$h;HL@571@gsECA~4Kzg?@fQkoKtE7nFwj5NiTQcd&MpXrP9elx2$_GYTV zyrz6Wr#-j5Lzn+eGSW`x-0r{RVp}WEYpe zc$#kCEqLcI9}O#$;ZEM0>IN^(GPirv8{xz*FW&jduN_Wys<=OXnd@9P%KFK&a*nys zjJ|&So7z^M;OkKnj`-*w$6GyQZ;MNL>~>GDsJm)EpFH2(FF$+0MOPpF_jUHme(ly@ zPvH7Ddk;3-zAHUG^mLXBywUkHU+XT$z4UF4RQ9`_iPWSxnTZWhbb?g$Jj1iSRZA0! z!65TK=Qj-siBD$JPv08j!QLfMf%S_Y`~*io$_)-a7USS|N~XB~DX)YByrBR$c)q-q zPksnA+zI~|!@$Ie>T)4;9txROrSO5uJV<;ZUs#s8;h8Xo?@N~CzQ?<@U#9-aX#=Nt+5phl9 z$PgD;xJ4!Mj(!>;s?hkfj6I5y55%MyRhTu2=}>y^%i^f|FvKoC@{c)^WbgO|I#wR< zhiTLz{;K%N5}Xo;YlIR^S~$Ns$`X=zQ>7TC7EJW<5`bUBWgv~0FD23reOMHbE`3SI zRsxYjgTx*PsaMT9UJ;Ntgk>y0D8pZtb7s-(rZRh}$WeOln4SFCC2hA(GJ+DEU)&_* z_80%pZ5rl{PShSQb;m`5#_fRGoTtB_6~S`?vzGFzr_UzpI7C`BbcjR2JXE?@4feWAU)MqXAI8NQPu$0r(Oe3x7%6zJmhcDdaJFVz2o|+G(9tEX2Q3lVN z!IYfe(j+I1N3D$_wP31*T~S-=#pMOmTG*~lrl36{PHsY|9o4ym_S!J0_w%$~wOuS|&p|(~dHp!=I{9G7wX;*_@#;eV^^bS07u*u6BX+0W=@s(^(%+#lymc=Ao`KbMTh`44hU6jxn5dt1=A>d8<=FvxAnV+4KTnL?_d40ahK4cKc51^OS9yw1F6^U)rnypE zI-w|4HF|u@;$k}*xO^1shA+oJ9b-C)1&+#yCk<&&LrB=JuCTIiI_Lq<_Im)gS)BCO?&;a1)H$*4Uz zL_fUIbMxBIe74-0e?97L4-|OMmQk`5en#flT8`hISfkr0>4h0`+SUJNb;|;n@fK^l zrc-kieywe=dmpCHJ7c4IOTOr)Qe4j#-5tiWx9z-|Y0pZfH=%=;%}EUK zX9}F-Ld`7WgpTsO+!5fC!DHoU+}=e`00AX_p*v6pUn#&_NPOz>xF#0m(Hnkwl6(}pB`(=S?*mRYw_b9 zwmR7J4bI9_C1qs}=Gv>BZo^$2>x&&6(aEi})|Z~1QBwTW<(0B7nV$5TT*}h?EqgcP z(1V)qBOzxU>XV-OVHa;$-&YNJ);q2D#r!?+S5M)@GhKl!z2?bA3Vr+)0cx;hj<(#cvt3i@#%utXbeUv(=9h%mM}cF>$+sO{*mP_datr@xhAyW@Bxqhi$aVx6d60N) zVpU|j7JJ>2fJI1sDmaLAXkzIXf7ORuNhXD42Oe)Heaj_>)ulEm*mD*bUz6xnIMs?M z2!;CBaFr-}tD;wH$bXUOef}e0vjl%c*o>JbVXfzXyU2nf^@8#Tdv4`{qn3-K7=n%X zjJ$Y^;0Rf)*o)KljWXt6h$oAn_;UZ2Vg)2AhvbVm$ZoYqdFa@4SVCt9*JE0^S1aR! zwb*|mW_ga6im13!mw0*4)@}V4c$;{JjFyeGl8)3?jv9!OA}EBzXg?e%j#u@31n6^f z7lToV6U2vRX$Xxgscub%Zu{tw^rv(##c=jwg&Y5QbEXJ^{AG{h_jw;EKCWMX77>Y6J zhl!|^p~sUcX^XpOiE0^)g*cTnIbWrC0<_kW4_0#pcz;!STTSVd1u2c&6Ed^+h6kl( zf|hqb$dxztm3?NIf@yi=$Cnalk(d`m#aNUOi6I*4VYQ}UcR87VhLDt5m=Z}ho!4p7 zM3DuTnIbn#&X-_*B$=s+oBhRo0tkz`32*aOXr-AG+I5v`h;DQ_cX-5`q?wR}8JhK| zj|jLn>?n8q_=_i5n>Bfx$!VI;8H`tGW()s$jWB4JGW405aePckjiyG5e;H#VNRQsh zepFaU_(+Se>6%N)F25<8Q2BoD*@HF)kn*XJAlN*(cSgb2n$y{s=Xp_0M`;lnmx~B( zHV9qwl!=u&f%WBOJpw_HNr-XCpo(ddCE1{7)-x1(l+A&Y06L)1$D$m%l@oc34mX~1 zW}=-_oz{70y|$w3h@+N-n?j1AK#Dni2ZZ89o3X}p@N}KPxpk`;m9ZG00&0`2R;0PP zp%(gwJ0e!DvTUhje5500<5qtYS6)H+iP4sGRKlImiC#5oZr@0Ob;mhId267jgnTH8 z7&Vue$&k%CmX^t-S4u(HcaIO+U2gveq5X(9M(CfYc5!eDXXogqc^`hVw2cKhjZA^Mm2<)W`ztgP6Gm-vrwb*q<_QA!$? zS-F$UimueijbKTd;@YVVNTwP`vHBTs%Q|_js#T~7V7lp^vD%j#tDx6vt=~4Q##WQC zsFm(Wn7XL2I7W5Px}`mZXqEqJn}`Ol7Tc`i*fk}1M4uX{ZAq5!*`*6suQ*7hf>^EK z*shK$l)fpiB|4*c39~<`t08-+^=Y)m6|8Q_u+R9kbT_V3Td0ysw2s(KUh+v^8kk@U zrf68Qri3+zJTePg}jo&J&ZI_=% z=&&@)vTRDZu9_`dyM1kYxyH)0Y1?3ft9$?!yTW*)>Z+;28<_p+y0htQ;TeF6rK!AX zxP02RI~%W`2D-PKfqws~o|!^m(q%9IjfmGTeB@lYOW)` z%A{lymbId(y2dEFgUP_{^S*kTbcpM?l^e2dtAi@~un=sd5lgXdtC>tj><{9ZdkS52&3$Y ze$h*b1^T+JYr{8;!i#B!PglSbI>P08nPNP~t7*kX49BYr!-d3w*PZ3&r{yzjWNdx(mP|yr7eNeru}534y#8yu(D?zRMSy zj+tg&3rTm}rFd4aJ-jsy$;A!l#!ei*|GU6IiN$3+%3tiM+!>Ku+{aJ2xVKz^3XH~I zYm2-5w)K09ocPPI+$M~BudkfRz$(euS;+H=%UrvndF&XZc*<(*y?cDfCY-7rSIMe8 zkIT%=iF~f!m{CWF&#Z_z3L+sAo+|1|;qS$)63P!XP zEX&6%u{~YD0ZY?|3B){cr&nFlN(j6ZvC15P0UI?g$NA7I{nqY?7xAE(+W(6IqamMg-SU+*uu<+ z=Zm=?8mx9b*a6+ydF|NEbd_0bv9}sUPJ15#EuD#+dL8Q4Jw4G=>e*B*+WhRtvfHhD z3CKRmjEIceXJi_WSJ|!%zCfAO6^-0__^Pk;%KXJ+#D~l%5i}qe#}Z*SxLm ze;@x#t?7hAf?tGJ?az(Ot!T;H?M&E5oWC@lq7pvh6Iaj` z8_nBt(cFy5e68bun#vq&)awkv@$Ikz``l`&)yCvL{hOXwMHR)YmP)c^`TO7sFN#}A|eNGPK zYzN>#J?izH;Ek*4qL}KBu5_eV+lBtlY|g&S&21DelVmQTD0u72E3+7!uGnVhuiooM zZs9r3aO0;&W-3S?dNr9 zvVf<4dk57!p583UPhV(?aW=80j^=7+?6R)Rvz_My*vgc?pZc8JU}%`=?(k+_)?e4@ zNP5x&PwEQKtsn@koc_3yzU4DM)~h~WBekj({_T+nsP~@fqqwEuIr7Atz)b%>A#j|s z^4RY79q1tc=;?*;M`P|izTUd-kJlWI!9I`iC$Gf( z4e>CK=s}5kTn@(73WT%1=Gmv!^EUP{*Y9g7k!^d%%5B`_iqXu@%I1rZ2m9nGuhD&e zoZdb6dpqvaoAf@cdh1TIJ1vr7jkAnd?a|(mR88x67#-4m=%T#2P`};2P4!jJ)-XPX zz>KjbsPRdu^>OxQXz8}|m&+oxL`d<&)kX`N_jo_$1^v(b8^2KfTMW4j7 z--J$+lE%;5&cFLbY}vB9>s6d^BG2aGfA+EekWfC_nGMyAeqhB85GGEbNKsJ5L4*bs zCS+K`A&CzWB|;>z&|yQ288vRq)N$g(jvPgLWK+>%#)twjN@S?%q(+u2Q=**tlH^F4 zHF56bd6J^eo((AmoK$Q5Zqr#?gGEb6ta z$*Nf&hV^)LY+AERwW_3>)~?#Ob>+Hc`}M9+zG(fP6?~Sg)ejc|A5E$Bu-dqP2LtZA z(XqwIS*K2x+?n&%kDEQ?3|txRPtt|Ks{ZWNb>zO6VTvA&IP?G4lAj4vt=-#q+tR#$ z0}jpFc3zvWjSn{6ydZ3#vXhrwE`9jw%+|42hn!pZb?|$G>;4;Crn-c@8JGBZYJ$aLukJ4-kXg(=SDhjqyo{iPrE~#H+Lk2XrvT*x0*oI+1eRZbcha zJPyL$icBr93}y7Nx4F#Y5kTln6f#B1el+YzBZ&+W!Jfc;smUwrt8vDt&eW^IwfM4d zN*Ld=PQ5O(q;NqU(Y#ZnIlXMD#4?v`P|pJcTNAxDi&Ov9&kC#DGeJ8aeJnvn0j+ew zN(04AQ%n~`z?5Tk@qyDev}wNpd)0MTSB)L0)aFhl$kA+>yY@6>wItV6YjM3! zqBouGFx^4V<@QB9we?Hb_*xCOKfW6E^VzmOT=gpdxK&ZzSK*DUV%MOnA&v_HuK|O4_4MkiX}!_WmW|Iw0 zG{BN!v{u!)8s_x1l#{OcUZYOFdF7|~CFo*|cNG8GYLatycV~T-ZrQSCCuUjf8&}-S zX)d7#+iN6g9F%Kp-G-Q7Qs;IyYpXXhi)OD;m1?cS;4ERwtF<7 z6(76kOS@g}@R!r;gI>2eR(ox-10T6@$Afm9bfFa%*XYZSwvz39O%`<8Ms5DHYjQ0v z-E_nsx3yrO%l4J6aqZn(QxWk^vSKDDM?Lhg<FGX`%xJ6iz2o73RG0FyWM_H8 z!4Z$1_Ox-28uZJ`?|J6YpC3|wf1m7Eedxbl-){kN%WPc&Gn6{53Fv)`OMg5*9oWc8@c2IiCS9*h1w= zkaRR-q1=o#yCQ85eQ~oB@ZK}D>RB&{P-5V8N*KfZIp|bK{2}r<_rr$`5QG^^pZIvF zv&bO_h+Fd*3LEIFA^r?plNwvzD0squQBI9cT%o}-=RgvU3XVx6qUy9JLk2O?g$3Lr z70akV^65^4hjL#Feey=pMG%KA+aecrh?sYQkwiz-<0Ef!Ml=$MhHHFcem>_(?S<@P zbKGIbq*S%PAq{p+TaO;&xJW48Cxb)5o*PGKsae)AexxMh9aEUaj!m$aef*;UJ4wLz zX>NLjWM(mm$w$6P$1OwwrtPj+sH*?<4uZKmX8zQe!{h&MMT26R^~&F4?OnN5Q_^L|V{Doj}k zO+*6HsR#U}O&f|+0JbuZR)yYD`K8gc*65|r+*BBoid4ZB4^#_ulSg@a$0e?{f@(Dp zy1q$NxWY87OB1U1cq!GpV$lDr4gKIr=^9sP#x!)#QtI)7YQs)_HL+cdtU|?DDu3m4 zn~;UvVgG1J3*r@{*xV`IMvF{yLDHH$;Uq7!dRyA!jj~wOq-zz+#$oF7SW^n5aq;=w z%xadju-siHMK)BOvUZ}=l%X-FD@)?DHK^)?^dX&R!qUd1rI#!32 z6SItUF;YP0Ru6*p#4rE0F^KEQUAWRXS5ft8iI;3tW}&k(Dh7*?6UCijWRawfBIe@jOxhv&(0-e*P2r8Lv&<2H4aoVBfjT|ZM7o7S~#?2m2oKk&Y8&zH`vu1%n7 zYnR%FI%XZFVZF=hVOgS)7PlEgitBIV^1&MQ7-iI;FSrGgxHcrA5hufxZok0FQTHX==uDL^Qa631(dvb(rnm?PoewVw~Q!5eE0n9<k|JMqqaD82hrYL0Bc(D~`Hoaz_p--LHu1~5z80p7{o^Ia zX2a>Ob$1fJ!&1C26FYca{MucwTDEmzqdoFG7ZQ)6zP!JQo^eJhiaN6|yj_!c_>80d zs+2Z#j(h*V?!cQ9tA`dV){FB|nx9>T9j*G*9nEn2)|$M$@4UBbeN5dWeeGlFuWF-j z`R$KAObXjvc9&JZ`N7gFk=^KMHgtNfML^+`S~5 zDebbo$J@BLlRReXDU&^l=gJzT22J|aTUGAUdMy>aWo;cK-loIoG^!H~PX4b;1{ zc^ChtgTW32ur7olh?9nh9wGw1OFjPV*45Kx)!Acv!5z&urM60asxY%J2FGuE|SZw+^1@bh zMae5TkRn6I)3)_8JqAQJgn>J{B1Hitz$@IfL`+2uG%|1DERf5xCoDpei@(+zHczCu z0_4I!97YBNC?j%1ShTjz0TGd8V35Nj01g`2QJ zq(o*MM{@itc6_M{>_#hm!{v~`tb4~M3dVL!B!w(OX3Rxhj7F%^qJpHyOSCshNk;$W zn@Dby8|lNs{u(P>yhZ1$!`$;fcoZXc3&ciDIBd*DZA>rKqsSqm0ZaX%t>NA#8>+?*z>!C+b%|I!Sx%z#wv`KbFeBpN-OL`1pLWrG@DSwNv=Fa z8vL$@thsySNs|0O@QONFB+6y7D3(gd8>}TR3rU)~yQzb_^6D9pEJjsCKeQA|h-|!( zTtxfZ$zYO@9F#d~gvd@L${w5g0Q_{XgyEMU^t!VnC!X!-Q8A7dOJ3`FL!BoV36U{0NH9W-4+%!gayUhO^OU)=8 z%7w7Q7||!?vNRyTrQ{#%`L4vBn8MC^Ev+~JwTw;z0dP8 z3;ifETrh~(PWMB=_0-5QgHZt;weECNsytB^gs>WwmO3RRw+kd0+*3$wy`EIWKn=@5 z6+a41(RtiW(ELb~4AUxQ(~itCi?m9wTD)s)%7BzRQNSa$Im8)TTF|;;&{=FY zYTHxc9M6fOQg=$zUtK-S94>VVQB(|z_K8#g#fpYxwlf9GpbJ-4rKfpiPAL64P!(7C zJ5sd-M@lVLZJpD}yHY-)Nzl8`zD%r4?MhJO(ljfq!=-PQlJo4a@A$B$%}6h_wM3WHRFq0Qp2J7N;nM$0S5iIMw+dN`{nI#wz@SZQj+I*+wbjVF!`w)gUY)X6EkFNJ`!|BMT!e*>Q(0FXrA=ZL zI(-bv+!fx#HP;#K-DaFytf<=)K*H1gTLg=_(lyJu0TPR#t@2 zhSgg}Ez!|@)C`yRV+vN2=s@t(yh2PoCtjASdfi>WjY|LyTUG@deEIGR7 zJ>SWFUcqZxm382Nb6o*WTF_P1dp%5&DoDjW-}rq?kwxIu)m%+`*&4LkggDpjtx$N; z&z%L|d_~^H<-UW3+l{;_eUsCRT;OzcU>Vja5yn>WZPx-d)*4>g7e%(_F$lN>+#p_J zC-&Y3e&T!FP{Y;Xl)Yimb7C>Z;Nqk{g`KYJZDRih&SIAv!`4OH;ssY5VO!!G<1%j1 zB_5R~)!*>o+8jp7h=gE}Wnm7LU!&ctngqL$;5qjE$=l%JGquS)4djx+;vLS>{!w5$ zMq$?z&dsya)vVN-`qLB!RyN7xL5|WA_O#jr%(NX#vi;;b4o>Q`W4G*IQ>J9x73IVX z;9uO^%tT;VZC|=P;}uNf{k>G$edU{#*H5ya50=i%-OV=+!O61OLR{XZCEOmSMG@W0 zqzqgXqcY_jX6+E*6ZPs?t2jjs51T#nmpoHMY!UTh`_BHRsd}*k>f=Qhvm# z<>i?DoJMk0?1g1cc3yr{;}=3`uaxJvMbH0)df0W;z)o6bX0F7+WIi7T!AVV4GX9on zbm79i*zo>C$L50r)`~%L$c~^*Mu$Uf6h?+yy!Ar=`k%=m#%2Dx@JW7 zPlDcM3Vx?=zFjM=PoRh)V07qMp5gKBVBX|gfX+gpl2&X^-$Nbe&(-LSzFVMHma#J7mv>sd9172p{%5Rfo!RzecO=Ut> z)x3D^sZQve+SFV0Yyew8q`yHE1R}*$nFGF2*9R?ev!3yA#pv_TL|MYwKif!iMAS%TD^9)`bq_Jq&Oq6V_Ye z?WUs7<@Vz-j^I7HFbZGr2G3x|ChZCqY7eh)tcmOcM{u8p*$yx94{u|;Ht=7LuF!6~ zfweC1PS8g#p!bcb0&el6mFX8(Xj{f`s%*m%2J)Pq>=Z{+xnAEUt4qrsaw5NC5s%XF zZYNn|^5Gt04z^ez=W51Q@3!Xh^DglJBe7C4FmGgpoaPsg$vE~%A^vU< z59V#o&DbvNJ%aMs`!(ynYjh^d7y4_BjcF-$3c3e0Lb1Ijtw{GT;w4^g=guIrr9^md5xNba_$q zP=9iqhU;%Vbs(i@73cKD-g8r*Nh|l|8!axLJaIiQb7MdDa{=@wf6~oVZA$0zVV877 z4Ciad->&nlT^}!cjnQu>>d%GUpdNQT9&=9abeWv-bg!Q&=W`e5V9DbdBM+ffhH+cE zbzBEn=-zgLo;L4Z=O)L|cjtHidxzR`-`sN#Wx!6{jLhRP43m>xI=0kOq z$ayv-^P;ck!1VLqm3x2A;!c-ytUpL&_I9$zLX(gC6RwKe{_W~4e2OpikHd6=-#nF` zaH#wEe>D33zCWQg;dUSFaA(7pjLmEV8p3lKyjJtlTYCOpS;q8RLU;RTw|lzJ6hnjk z1kLG@eLX@7M8$ww1U2lHrGW2#SfYZv_9%xQcz!uclnR5$&ZX6~Pdck1=> zdG1`#ReJ7zecE0=sclfuiFlvv`D{Jbwq*DDjdWz+{P(UX=q-L?{(Y+-`@aWIREF#v zx8d}MdWIHv?FR@I0tXT-XmB8j4+=>fG(j-oLWL*AxF;j_-6Gw*B z7}23fl58ZVMEId1Lzpp19@M0AW=oAHK<=cOQ|3vZ9$9iEDzv4*k3)MRJ(_eSP^U|y zHhrkG=t-O@uiE?>)T_y`T%|JY8PO$&pe#%(pT4L!E7>BEHgGFH)A zG3CIqM<2zUII?BaU{|g#4VE-;&Yi^)N2%K^ZPcuf_qLtdxN_ezpTBm9`|bi``RQ-vo%}d;@*(!0c<~81QENQ; zH`;k4y;s$KPZ5aVgyD&YA9R<=B^!VG*|*q-o3&TdWd{P-orx08XIyV8ZkQop3laxf zfWw7&ABv+nhara-#t5U2*#Y@ug>DroVT$gZ7#4XC7HHs&A`&^+jNnm6mV8MH)tr_U zv0-J9VJ6uB;FPoVSJsFpswor1lx46Hqn&YNfj;bUIabBtEdpnY9UZJ=C$l0b8db%opwF(>Su90HtYqN_=t7(`k zW~=SBtVP=`k~2PQD7Ua`cqy}Zmg}KUY8uG zQke|@D58Qs%yG&sf1D%DY0g~atrj!Wi<Ckg!(hV< zD%u01Z1$*he%Ue8QYEYG;D1+)w4+Z$nzQ32AdGj}_&VwK)}2=y@PAw;=dZaqe_i>u zaI-sc%9J|}Fy^U~9(cN(D_gnYqSMwmiVm+XcF+_{elg^Algs*(rxWh-*|e9wJm8u0 zt$KZMJM6m0vG=#D?{#ah`QysZ?tH5uds}vXJvZ;S@W@-ftlrccc_a3~gFkis(34;P zyZP~ZJCk>QSHAwC&VBgn()Vt6!1fu>XFFTp{@Rs41?ul6<6F{#7$`gW@k@Si8dRug zGPvCp?|u#J+roH9A^)d4tyZK4o#l)WUOD4L4 z`Ab`>l#GzH=z=b~#%#i9dWSpNNA9vVC(cF&*y?4r2%xyP^Sv8Gc0#i^Zw>c#4b zGooANs$FbaOluyLc_(F6(B9gSu8fqRP-IA5d6+n}LKQ^z3}sBq`ouLV6jJFN)Y9y_ z*S{K-rcNtoV~v>DTjH^=@eCJMiCHXu3MW~2#Vcz?$XBBENvv}e7By*k*pnVHr1aeA z97{AN!|pV*!8Pqty;)bHD$|^vRV>+>*+8@%bGGjjY;u9iOsdjRYHDJxL)qHWmEJZ= zCdwojhw5AIVV9`^on=Rjds?NM@oP_=sAk>j!QTefq?CIF+;qaI>*XX&HzX+x;;<8)52~YQ<^_}nkc*$Ee|FTuI%!R7@ z&WJ-@>e8yyJ!26)`Qmeu)2p3@E)Z`T+ByPRN;|gUhYvhehSv0@#c`FB`{+y|E)a@T z&alD=NaR`q_bo?0Zn*6DF)bSty&F}pkAJ*D{K}20Tjp{?d*$T_hj@&pV=AwX#>mJm z8L5P&GnN~gW@+lym|^bnoFUg+>xvkc!6})m)L;e+Q2Gm&?g9id?EnT;q0^rJG^ayd z1x;sK0+yz<88V=1D1)c6fQDzY8rfrR?wPo6E-eqwT3|~qn#A*kD~3y~L5O0wer(*_ zpkZyZT9Yrl_ku5kvubC-?OC_dMR9YT3&d$w^1rtRiN9L^NEq<4_}Avf&}GhW0S#Ed z)S3phsN+rQ2F#n@p|2@uaFa!8YDXP6{oOzpdeEb=Z!Y-z3ust_Z3gaVIVU?uoV_yFf*o;~`_eIs zUTd9!tzq-=q_Qn;_;CS>azX28bVA0u$5+hf8ON673MaP7S6=c?7W|)5w``}p9d~BN z`C4Cxc*G$L60-;U0~xpgrn8`Lejh#QKv%laEnj*6&2L`wOn3UK72V6evs}HjX0oAg zCe&)9CAa7um#yTxb-d?2)_N~8a?!4FWTM{DsmD0n4=;N}Pgt_Izq{QH4rY};i0#tr zz3+c7cbPBy+Hq@T;SKU<478i`-tRp4!!Q2vZ=UiF=z;~#z~0TuTI{%Q^KP3WWyaG@ z*sU)#;5~}`xre>}{C~fZFx%<%-+&3;;60NKS>NkL+wjfau#t@Io!ssfmDcrF%K4M= z?HT=5pw(&D{o&uR)LfD|9^`!=`JJE%qM!;QoxFkG!--G1?cJIkn0G}Vb;aPcP1cxo z8;b-WXid`7$XNf?-USifWW-#RWgp88p5IOXopOL+2x1?W*<5azS%=LN!{J&Eahz{u zkwjJC+xZ&TMN7!&8WaW|A8Cb4IgCxP!K6t*3a+3W&LJJ5;J>Ax;wj;ZT_6UsUTDkU<9YL3A~Y^CjF8;#wg7 zo-cV#?$I6q?t}m~+7)V|4&D>&@!>FrVt!4aAE}}%5#wT=VM8$=Dem707Gc&&;4+e9 z8Wxnt;Z_EIpcsM-uZ`Xze#qlV9{FMaUL5A4KJFv_J&kys}tA459V7bYCmDC8p+B>V}9CHkLqjT`>);3p=dGX7uZDBwgAV?`pMAS$8| zBIL~x8g6`K)$O6kc$z(io)I)+91iF_KGS*Z=WmBTg-(?3&sN=$YnAg$L zF>(nRaKTRArBCLiUWVGgdDuuIm#mx}kznNwrlUe#$07QYexw=)ujPwi)4u zwv8XA;uxJLXD+5krli8TXXMEzi?%2~(x>&{XMP%BPHm-(zGiSfXb@J|g}SDO)?Q^s zW_Qw^eT8U!VP->O)QRr@mkf0W#epW19;nM<g$yBNfo>8K7PM>p*6`CR7a!M(j0pZ$(DWMJ~=)9?Ky(gNEDyiaSsPUqH za_aUFoQ29MgvuYCHX+!JR&r+OXeJ+n+LM9~DVzqOp&}`uR-b`Do9Ou{j%Md_qNpdX zr8%J^bk^8+5#~K5>uR;5EL9atb)TA=YN>Xsi=sgoR?zaX=WBhbQ=|u%f~tgGYglL{ zM7~;q-Y2F~$f}C}qPh|xb2=!P^5~|1TcaN9cFB}j+N)_=qjv@?ts!iQIqNc7CZg=A zPf)AdS?e@{lNFtTO>V2VZY;-!-xt&;K>~@MkeV%@3c$c5t^iQCNrBxz!4r9z^-N^6J88dd(QiMr)sSb$x2 ztkqsE`R!&3Edm_N^O+d>aFT)t}aK-QezoG8VrUjTh=X~D%ajZEx=mo-+X|m;w08qF1N-fs&=WL zP8Dys>yJAB)~wNcWY2&Kw&x)>+f*{zc?XPB%+rBN~ z258(4rRusD*a@wtir|onBz3ljds;5@Ht*8mn;HD+rxfki-lv-uRi`o{YewqZxZ>JE zE9yof^YS}mYF*6ua}XRnrS_#SL@>a21h$4Po%?jl}~KIT^vuk3zr zQeZ$AXsq)dF!Q3HejRQac_ZH5>G^_OjXJ7`M(z8y5F0k9==$wty_foS6x8sq|8gSF zj%#QtZvS#G;4Y5rR`9~Q-T2OK!#3^PxNng*@VYW^`oeEpmY@M&E&>NJZlXbj!EJfg zu#N5ikqEn7Fi)BB=hd z>kTuoXBz5=a+h3XuL>&}euaZu^x}A1=!l-ZgI&j#_$RzGjf;kj%@5c5F;gt z#G=#F<||A_C4n9>58E*Oj%|yvuM>aoA|t2iW#*#Vud&kc6bABOMltfjF?w`u4_S)j z=J6iKGMZ*C6$7&T991n7FiCn5yC!<~A!6LHzrSKHTs~Z#Yb%rtBGT=cn zZXFNoou%ytA8#>(uM2ao4NGedOK}JH@>jgFESIw^_i?659N3cb*vau23vy)LiRuLZ zmC-<(F!!zn{~8K2YzoUT5;xm7V>3KgRE);6ahCEVU!*P*PA3B+$qMv_3F;7$n9rS_bXG6G`j8d=@Dm3mszpSuT_)s*~Ti7njs1=F0yLx zUN;0D|6G|$HDOn7eG*unA{F_{^)fT_(iUS$Z(K}+^*HivHYT*9RQ7K5T3=KD+sm2R zNkHsRF)LTwa$TFGSidZ0XEridBe``pOK&woyF})}a$(5+fdb6kmfNU_Qv%|8rc*{0lLu_!Xu2VtctsXTsUlt7WOnP=^eJk_HZg(pRH}Xy* zS|4wc=r>t2aceu(4p*{G=h7m##lwvvad;pzPAZ8fc#umuO3OID$ajh}B!t`db$c6X)Ad+? zXppHgjGK9b!|WV0Vr?(Eo;Pn7u(!`rG6XfZoyV0rCN;LIbyg5o#ySEwt zGZYsI1~7T6cl!{>9*3VX`kF1{-8Bf4d4898ru#a*0yS(oI&#ndIneOWS)gYkL-KeJ zc{U$np^-MKC$op+sO##uxYw`)<0)jxka=^vw>P|QssX_lJQqv)PCGcAld&l0I%$ch z#gDRZ-TD{PuxV%ebl*F^tF~uTu}+Bg3~Tql|9S&j@m+;5L@4JiTWI_~^#f?M!}olt zegPNGy2vN@Ut4>f2RzEZs%yhLYy&rVdwgjF@2(p-z4z_Qi#XJWpr&ri2|LlV)4HIF zZ^35yFE2BukMNT|1qAFo!~4A3^Q4~#q{PoSse`;ekL;K$y4a6>Bp>J%Bl?Kr_1u?e zwAT31SGCeFJy#L_;g^Ub-)^-l{=Mq^Y-4-jqw?kg(B$&}{M&c_EPqI@D3p4K7YITHn){Q z567-$z}mOH=Rf~GvUfE9wDC+gd>=njM?8Xne6qhP?$Q;;bG)(NdA$4nc(8UNQhi#} zm7<=$(I@`*=b-s>k?m)_RUvJuSN_chqSyk23V{PZ6eKYaVM2l=*pR8hz(Ev<6Dd}- zcoAd7j2k(2^!O2ENRcB+mNa>iqlJS86}EKwG6lnfFlnaHR1@bygEMpXbSZNu&xAXD z0u5@AjZm9Knbu^P^C?WDN{dE?YIW&VtS*y&DA9EPA=sf*e`Vzaho`xU6$ zw^^t5nOb)1&$}@*?VbBKFJ7lc-xicBHSo>BWLqY_`d5YHr7{l-j0+hd<;s|uc4fR7 zY+b{RB_lk;}cMiHS4wv*LY~*i%sD4 zJN)+V=*$;S*V`QTa>1KRE4S{Ox>~k&iIVmT-Sg4n;@K_R{Yfl03)GAE6?0n3_E3x#l$?6XEjm|Ht1eDRU_+s%W&!Vgoy&MChRL28X zTy)U;tZXzmI6L(;KO=YJ(Nzv79rQFcZM_xOT-D6L&B$^i^wB&cm2^uk1GQAhAY(1D zROvFU)YKhIZ8p^-QGN5(U*Xe?+EKYwvcO=4Rj)24twge0L!XsTOHsZ3(OpEXRq?QN zSH+avAD4aiTerZR^@|4>G*j1t4L%tEVUQ|}b>CuvEfUgUyPQ>GM;)!$-i-UDmtTjk zy|>;%vF%mka5V;b>Vm+$No+M8n*dEODNvUf$2VFuMQ2nbFX z>7fN6=AejM`1BQ&F9DXSIw@0q^@ z7g`LpMR7@=nLWJfz^6SO?X(A%I#IAa=b7}lQ|3Ce*jaZrQa^Lv+w7s~zOHB4?_}9` z&5Kv{Y1tb}t#Qene;#_17WQ5LcuM>I9COPLG@V$xvDbd@%AH)@zu?QyT5c*`zn%Tf z!zU14P&-$D)MG>bdiU(1?3()81sC*x=riBWLM1KzX$4-WXQG;%rVh+nFt^92fd~+LP>hKjr;H6Q8P&}6v%atR6 zFiwe0ROBKhr;Yheaqm_g2s4vcHd-4$;rNPm^>duJRZ31b&VANFuu_*xeq z!DYrS%5johyyP5dIXj6-ag2Vf9xJC5NO`%CTKRI>=n4|BL^2YY$xPVvK$y!aX3~;Z z^Q9oyH$WEl(sZd(-IL>fxOK4|frApJ4fq)Ves6jnb zZtyu$lFCw^Fx9C4Ifv-XEb7f%@a$4X_eZ{LG8CzvG=WI*n7P~VbebRJrTd&3#|;({ zA!xO!SFwu99eMPl9mOV9Z@SR3R#XK({i#s-+SdkM;F(5sX7VN~)e@Xkjdr^u0cU#2 zRqE-noK&kj$yrCYb_Su94J=JC6elklma_V}D_E-;%(0U7e#jv#TPvB_mH4f-csnBM z{u`y?8Z?j*xe{#{Rg6?rrPejIPt`55Lb}@vMi#r- z{p?)(QbaJ(wYD!Z=kA!A)!S}tpN8G$8Z)X`y0$dE-P0~)mn7M;YF292g)aNZt6%?~ z7PYJ$Ut1jiQd|Qc7(!pz?mR6zUi_g;Tq%|AZ{vDZ>KHDn=K7Oh3wzmY-50+g-t1A$ zYc-nrcC56uZ!1MSVaUFCUEnn_Z_4}K-bQznHPmr~EBs)gNC3gY6>^aKs^A@0MZa&= zniorZtdxGn$qt?2NdO?M&*!6gXre{~6GZlfas@d}khS8O)>==1X2jG1x^?#V@s^X1vB# z4=0(o9?o>0L+e#rY89oBCRdZ8Ogj{8b-jBov7`wER@t6}tW7Rm##zP6pYi|c3WFU?i)v#;q*senAMD7iBhLafL77k&~9jn}>i&&HB%$dkGTEJV%`qK;Nbb#}0+7;jb zoXu$8smav+b!)%+>qiG9(`$lAtsg$?fc>MMvls8Vlbh^iZ@67+t!Z#uUUVKOx~JV8 z_`yqE>1RK)qV9fkp=aE|WC6L?`8#uLPc`mmHjWt(U;D)GoAa>;@kuS(l!8Aw^tnH} zrMpS>Wy3k`ohLlwvyD{Z<6ZBkFMaPR9&!%qa?|a${PP7bb>D-tCBX%#?a9w;HMBhQ zypw+QCx3C4tB=srmzB*~y85Uaj?kJ;z2|Y9+kTf5{LBsdFptF^X7lI>YPfI2>~H({ z==GGZ>Y5Mxs)zQ<&jL+OnQVjPmQVDS%J=~A$`J6Acu!^)Edd!2=yVS5&MWNy+-}-% zPw?z6_`Xl75)HyqZPJVm;eOARFsz;0qy?Xj?trQ00;2*k@B))?k=9@X@s0n$tvpDi zS0*O52(Y9;hoTmZ{#tLrRPg;O%i!d$`()4kj3f0(kO)oC*xaa;wr0Z^OOoJlEMQOg z8tn+&kPrV*77^_H1n~|#$h4|3 zo+PW#Ch!vhF8+Ye6#K3TxeyO^Dom0u0%4FDHSrCnaQ@V;2wl$xDGZ|j2*aaR5uA(< z&3aDvFwu-$j{P_X4QA0C?adXN(LGkK{RHd)yN#WO?(L)~-Kq?fDiH#YuNd_&v-Z&z zSueLxQLJ9;9X~A$TMz}A1hK4<-CoW{XrzL^M;Vu~4sme?Q!yuw@Enj{#Gd(Sx(VRl9RU5Cv)xl zN)0Xh@dV+88zoXLqsRrPs~vTbD;H5LP3PNGGRB$-Sjz2qV6y4|`0fY25hr^Q1kH{w zP2(y*!U-DF2^JG85wq2TQUV3=7bmk-#O)PL1jZ7x+lJBs>yazsa&_uS6{#^F_puQN z@h~%FHG|OKywWqx4KzbjD0#3nDM~F5k^@PSW#msww(061vmzGY2_91qBw++fffBl4 z0s0U+iSr{s65wR)87EO4Er=+eG94$A?-CN}!m~GhB`s+%H`{6dHggZlLPtG{Azz{yc7LH*WXrKlr zR2L{fIumq4x=y;VPz^=Uljck8LbN3nrzT;u0VVJtDWgCC_bUL$^C;u2F5%GtWhS+_ z^B*~sE$2}*?^Ce;4zn7iEq62EgwPp*6FWAsay|e-uW~^h01-@q7b0{*r?duWKtd(q zF)?&D9H&XO6wn}G80k{Yvamfpr9iic%AO?%ID=+EPYZ`+RFJ0;@|LGj7G76rc3c5fJD!~@4 zfl5DhN+lE(IC5#gfD~Fm6(m6pEEH3>&Px&O1CWs_#7;bMluqU3)drL`0ZDP_@SR4= z>6S4WSCMrHGtVBiQA1Hze^oQN>n>?^6kF3D@oQQCgOwFiY$;z5PH!z3!4F#HhfMqI z93L|b450;%!3IE8U8%GMo-=ZI;ZvD`6)HgwoHI*b)xePNUzCe1%kE4EP)2t(B$;nO zt@S^D68{F(U;&g-bFoGxB}nUwAoo;CB$Ghv)IJ3QJZtr0jcQ>V3S<@4KZ%ZPoH08O z>RiNC7Nx)mzyK3kAsHmJO4n6g(=`_GwKbez5+*cVKeZZop%fS)3+{CmjcjD0FqV!) zOaWFUyrwf^&%JQTfH_!`DttYQ$AZXZH3Yo z&k{Aim+az~#Z7tOn_9ms4STBzS8MO(m zmQSg$Jz^0H#;^9Ca}Zhq8U}Z8_jX++6b~FHX%?UYl3{PHG*o4v6$ar_-Bk%GN8A21 zYMJ(HJ9I;1v`Fz0ZClq9i7k|Nlo^qAJ);#($9688N*GUSb!z;89qS{xS&-Jc%YbYdiB?OAvOw^ z6*C`q{Zc1>^;4&+O^X21PDwa+%~qoS(3gXsMHEX=d*655Ad;Nc)6d%uu8%&33N1U(qz3exZ$5(avGvn~p{KoWX^ zN)dX1fA<=qAs1Gl4vYW@1mK~Mc>okZphdzIqPm&+RuUlC_M}&q=~I`rR!zC%`2O{% zzu5`XH}Ym!l=B#;>92GD+q#55*D?Vc7$0S%LA1YY(DYDnJLxx!U)QD6&9^Q$9cLMv zs*z$npge|?QV}eox9*200S3z2nWMTGXkioJU;uQW2fEs;z4`!L6=^Dg7n*^rMf+2a zp*f%6cEdV)H1tR#)v~d(r1g3TM;WD)cH7pPWWy4kwG)pEbDU>)kNa~aF1s@|86gK1 zx!+c~i}YEKTH|&yut_47iLI$z zu)7lk!OqHIcZ)Ih`i5FHGaR^4Frc%J5R4(oCsZ0-fDVvA2zEdRwps{)T+m%x$Uy=D zT3ZKr+gF3!S~;`Thm-_!oRR;sTW*p$?yt2Y0z2@m|2(;dS+>W8g3yE41lY70MPM! z&;=c=dHo~*fPA%spaXJ&8fx3NYvF+>9e4kXI;$MqRo#~GD$RFsl|MF}Ex5~D_pdFz zS$`CyRb5v_olPSg-A4<%1Do9smXq5TgI!6pdkunHRu!b$kn#K%I3Wq*yV)C_01ki% zo*mi^9oeOQ2bRDQUO*XwU9@SS1u7tlzZ4=&@jV?^+$|Yy-E-gZI!^04tJa*RtI^X> z{)P&6K+{3%}-aXg2XP)14Qk$vq<`Z1) zCvQ9d@4n%__3cgk+}WPzHB7}nJp88q&rqS!ZJQVxddHdF=?ft05ubsozT$rzzO?`l zUI6Tkfe)mB(t+Mr^ZvM{wQCLE|KMJ$N}kofEXzTh?@gZcr5jKoJl``nGh5%xYt^$* zaU?aEQ0eXrC?CO`V5}uHZylKy;NS=zKk^}(_=z4Rh~V-O-3XL`(FNQZRAB;6&bMhF zjMaY1xj5W`3GZ>AA}`$PZr|R4|Mz8o_B{~iWnK9=9d04*g-`4yQ&>0v;)8>MQ5ZBZ zh%lkTg$x@ydL9ZR;W*RyOjwbh#TgWS29u)e(um#$r~arff=`zGb8OMC2ZM%v8Y^YnvvGT7 z;}ycq2Q#G_FOK{;OeZ5S8tv#@hNvX~Nb)Snv*keL+`CVta$qM<9UW*xc-rK#4Nfe02RV0{h#CYx?t0jJ>qR}?Nd zTV4ERIAMjT5eOk~jOiz0fCcL3potNp1)z%d4R~9L408Bliv=dQA&V|rwi|{sswfv3 z@Wn@Dkuy;+O?n=Ev;q^=nRH!tG7V{Dl~I8wgh~PE0LLiVWJHvb8_7_KQ&d`sCQM{_ zxYvp!+GyKX1>oojS%SCyH>6CMctOJ{ag&DI&Hg zh?yw*XO8%hcxi_kKFTMXdNvBGp%0!)simoAI#{Bg)MwCJSr9a+yqN{hB zN~yTCvI=CRonm@ntO26CZlRNoi>SG;HhQn1{q7hqtdo^%slN5P`(~x1wkxWu^voE=fU-!@MTO0k=kH-Uw%mH`hl$O(@irw#~Z#=?|wky4GN|zBSyb zyMDW)prhX4-U3to_U^%Z?3nOVhxn%Mzt`UJ@@g~RCdCT(DZ2_8Y>vHqtt=@N4Y_oH z_{szjp={&XZw~EAJOH(%wasknxB2JGuTTaiNdNhd!{1tb{z82FNccO7V0e zjGzVWcJr!H0=M77laB#~l{HBmiK73oeHqOB`U2i8PW0miR_YPO)x~@t@nO zD8N#=%ZmO2>$rFkVV7?P27V${NHp)_zWHhB6Kbf@@YEm_}ROK!)2&fV|Pl2ao zn)R}P$VwIo0Y1^f5(=O)8zzgAnxm#Nvq!Ta_%II15EBecGRbRN$$lz`7@Tku%T(Qx zd3XCI2^rW+ca{Kuz8t17otDm0ZV@y2Or;lfIk$M)&WyMt<%iUnNn+MBp%|>AKNTv^ z4_q&q;-siUvQ#Vq6!KUDnC45U?fbXPjD&I+*q(LT$)!8!=Qf;C546Of`no*slK z3j29SuHkf@aC~P$-3U~M(iDwxe4-iy*vfkf^k{QT;+|@G)Hv?blMr+0Lxozjs1|j1 z_v{@TzS>TMGS!}aDwrN&DpKQQ69|h`+)L4_!)gvBJV4mN8-M|(jR<80#v(#m;fkC! z4HbbRd>2^hcDAOjvYx?PYA3ZC#W`ZNY#f8^K^JORtL79k%|q<-{<+mz+S8|99jIx| z>BLQrwX_5~j95Wymap>CHxmWyU!f8?w}#ZVXw?Y;RJMup5Jf1t$n5~&$6M}DD2(W2 zuA&07+@pq-mLCkJ={Chq{@L`jAxuf%QjmKHVo=~>h#i|2$I$rLo zcc>3cs%Y0MuGdc1lfLOfausRF+x|CZzP0NMj-rIV4wyROhNO(1KVjE1!^gyM}U3_?J+{;uLXAVbfj~m!m|ei>I8m7GXJh zW9FibwQON3uJL#xmTGr3`!VZ2)yvx@b7Fb3$ue{KsT^+Z3ZFdWi9mp^Cvh^M1MTDR zCC;yiHcp*1Gv+?Gn7x>Vl!{6F-5k^Z)VUx8Bb);|-}H)l)adnanzM{yO|w$Zr|xr% znOMvaw;7n324IO*@P$J*x>w<0^sWJ0O+u?g2*1A47tk_VEQ2t=E=IML-~2BFwu;2N zWF2Ku8DFi=8q@&ubSGckY-bBF%x7Ng#x@-44zF>xp$50O-K}bO>ZP{DuD8A4BW#Tt z8l;D=sQtjKv{b{mzE)*+XfIuAJR^UaWsOQYzx1$ zVy%eohwIJdu&s2{-+M-SowMBkpQdGHi+)&!TXxn|Wx7zY?evk;8ID1EE6!tnc9>GZ z&}K(FA1^@ej-l4iaGp4-tL&!N**Df=hxF3h?O2uLx4p3a-_HBMX`d4{?BPB!(P;&A ze5OvrK<~P%b;*^B2ffyE94)=mu4~YXe)KhgK)47`ph{&uZD=0*<~y!b7JC-O?(X!f z1CLXzf4c4vPq@HaFLuUHm*wn+Hqm&#_+(dT?(*8UoKdfN&ciX+ZYRC%B~_jDLGG5R-jyt9877Bw|87v?vCU^jq`Cn?gF zHlGqYZ1Y+aqJaXKdM4LO+a__6wSvJ%YwedG9!P^?lto@Af&}M%H+X(MsCcv?0ig$h zM~H;>CIJMPfCZ>x3x|W^=X|}RfCEEIQEC2Zl~qbQZ@`KIj!|kc4~4hd2j!I<<9T2#B=te{zC`c*uVih+S_8 zhhIm0q2y2NO9w5Yn9ecIyhg$c^2|TNVI|>?ei&q;bvngUGmU*Eo*2cPr6oVN&OQZCHtM zNRRtNjre4boaj|2IBkUpi5bX<$>)e87>oCqi|L4svw?ly$dC;gAIO(jpg4tt7b!F7 zg9rG3j(3T%myhg5R_hm8Ro8O^H;LsZIwDDrR49)YnOT`=UgDT#Y}Q;`SQc#~heDT) z%-CvzD2->KD@NpyK`E5j1CBB1lFkT_uXlmB*o7u(hcYHR#}{qzrGZkpRlvxP)rgb{ zql>d=h-6ULf5&2YyTbY!H7+ST6kHL76Qw56H zWhz>vlRYRkm}Zjx$ar^nm>P+B8fTMQ*){P*h&IxgfT@?#my+&wR&c4Ao7t8O&^dug zmvzaKiFlGE=qYUEcWpR}G6sAf2YWX;k5=fIq3Laj`GLO2fvEX?SyhdciIS*TZdk~f z!%3WILL#lr~ zD1_*Bg)#^h;u&L^S)A_)pT>a(tVx^O`J3xVo-WCTmKiS&mQ%91jvo^v`=hFY6-8fWo#rHz`NU&^VW38hggr7bs-9O;Bowsg6dr8pV? zP;-GyNjj;yYJGC|oS5pUYYD1@x~kC^tOklz;753`7>g;msJ^`umgDp3q z_Q!iEGG%GFrDcb!x(cqKX9g*Tr>1I+fVh#)N~7g!XSg_Nq?n8r2ukp3i>b=421u{! z>Zj8xmMTd{)irKmd3))4ncccu;fk>F$)Ng5d3`CJF-n?Xnw`VQq@{{}hl)uC<*6-6 zrmFfF`O2_DimJfqX%=gqo2Z3PSwd!DgbC}i-#TFA)r6^`oUTK63OJVxRc8F!wfAbaHmiTO;!tJls@hhec3WqFS+*yNn1sQASu411 zDYK;Nq*e*G|N4?8`D3{Ku zPZu+$NHuX+JGiYol*h(d>{+gRimn_tb)_4*D|(OUh&yRJx|W-=pNgLZd$@?3xQ^PZ z-)XNETZX#3wtV`Ly_A~4dx}-Np010%Zb=mzD6EqBvk(hwD++Z3DzxSUFv_vbs6x*cJgS*XJoxA(I8{&6NnSRv!y&FQL3-$yHK)^7Yy}1hiyYcI>Xlt@D z$(!{{p$@9FCD&BxtG?D7zCHq?8~eXiySzPFUJxv&3YWhVoWY#Szvw%E1-hmNTqJt% z2_rBEkb0{we838;xC`97LmQ$+i@cvpv$iLprdz$T>7^StvXRD@&X%H)7=MR#f0&Dw zz8i-QTg1h>jW+BZPEZNe@DZOt!&-d9@42Koyp<5_rzecDuDQ8Rth0M-!4I~+6Pug{ zH;$^?z*XwQsw0Ovd%hC;m~kw*7>vYznxO(b2wrRh&cO<8I>wJo6A93!whR_U$fp0b0H3hS8c_>}9L(|T5D84j@N29;T&=9CxSf19zS+3* z3eC#ezxB$`D&GifyEsIuikTcLx1FP`M^6b$L0364- zd*3Y1vzUK>T*zIC#&-#Crb7i_!DJiOs4hMyZc>PLU1jFdne*MIxTmwm2q44R4Z zlY#aOOr2MkfLw%4+h${2w{poGV?) zDw~j-UDy5!&VZ`iW(n8r=LLSbCNDI0mVd<~b@<@`@l zOo~Pc*`M*ovlZOloVUAe%z%>9nx)M*z0l_BMP0=I-o~5Vx53@YAqUN%B-L;SPSDp2 zF5brR1QZ|%EzkmT5XS$dA&6JsBuu=_dEkV+u>y|Op4;A@(jm^%#mG~O!mQDX;&YA9h@IHeo!D|N z$6(IPih<6Ed<{yX3<(fqZO7ylRRO%<96Q6yV9?>f<^|6!s8}AJ9vI;Q90dd|Md7$k6QzJ2GjIhGp6;brsRc9Ncz(|ZyHa<_uFBFIw%tR<3lE-P9EI-juI>=A0D6!l8O;%)@B{mX@e&cQ z#uwuvOUz4taQCCa-D|K$Kr%BsHKXkOQnKFarQ?8&|AqJHcYZQ6TW(IZbkh9D-7 zplAeO(L~SWPrwJ2)9%mIV=qq4cGkB+xZnRN|Hx4^x2LS_MtkZ&zshCGDUP}D)roLB z|J92N^THR_&K@b?o?OQO+r(uANze2d{}2;k3`brAE`S4zlU!w-@3HEjBi!n`EzrS= z?LFQ0JFK}mpU@zz!alm1m}wO72t@9pw78u`m_?ftEhWKNkBHmfcE zmywyKd7Ar<|Mi^D?Es-d;6Q=}4H_iz|3TqGh6xjzNO2IMLroF~TByPRf<}%VJ$?ik z(!ofPBu$n?>A;Dk8ZBMEY&pZtk01gD+!S!&?Xid5-Rrc0e% zf*G|&v^D{nUd6iejKzp0C`$awRcu$XWw|;e0aoGIf@{sHP0Lmwo49h}*0p=LA=el2Ubf4Za^A3xKR}fG7_#Tjkt<@>{8u&O z$(2XDh8^34XxOX)HzxgBV3(}DlM<~Z6=o|QIE@4S?OXYB=FO8khyL8bGvP67aLS<| z`gWe6?~bM|`}=s#mUT-uAG&p6|Fnwz+GgFpwPx}4?YjAh57k7m5K)8N1FhTX&J8Q%KicF6!!0^iuNz{@&FE* zo34Fg(r35jwp-;4sey(Pqd`JPZO`rPi%Z)wl3fVX!mwRgd3~)`Vs-V5Q`s0w*4Sdd zMAlzhnRS)RRO2-3!Gklom0pMOWtCxhBVMe*iQT)mUx78Ycuj$qMFA{yyDg7b#6I--j$CK%$Plg8ZgB`?Q#!~DJ|{7@(+5mz`8{j3|Om2=;_c;ksDi2`F7wc}Cb z2Yr4d2@rSpasTYSSlG^4Zyj>(xsE;jAXledK+-cm7P1V@Ob=|w*R`HqfF&n?{QAW& z|N6@FZ+z!Sk1vT6mRBOVS?f5_10Vtu=&h%Ot3vs)pv!ea&n z!e|cFs1Au}|Dl86-DG%Aq+k@KNGN8+Z6?|&;&u)Upk*_(NNp zHa8zHe(rp>@?iRI=%xLou#GjGVFo*h#uEndj=d5R8K!6wC#YgtGil-k7pTZVHnKTR zD4C61z(htK&jP6%P#o8GI(b3lUVp@+$G}*+w9)X4_-k0b+V@6>f%1Z)d?C=Xw819T zQFGqAoY`PFLRRw8mz-RW54|JIp2sc4Z|L}oM@Fo9|C=_MpuMvk!f z6KF1nda=YM<;d6-UAj(_#Jr#_-9;(}c~NUNMBynz_|A8Y^OgE?rRuC!ukOjSmv7l) zI&BC~|JISxpd;McFV}dh_QA)VvJwp&u;9oAfIwO$Y90YnW;bq1)1x0{$`e?@s7K_$ z2p*bZKQn1gIgV1G1I;HmU8+8UmW7_F6bm{lR#PU`Q)_iHrGmiIC7ud(rXee*3(;vu z4kq=e_N%8tyP{KE)$=wE0pi0%bB0O+Pzr_|ml2wI6PtCjs~~-*+vH%f8stK(2ym8J zZ-xP=tu&k$0$o5=;8ZbINS$Hau69Ay>^~8D)zC_HF@fQ0Ox1~{;R-acEWNH@`}tDkqK_~*{aj&t z+7RXf*SF3k?LABNzeWzCcfL~s6P-C*`qmdD6fZkV|0$O#<7#W1-;1XX6^8rNAy{|hk1 zn_VKVK+xo@dfOtzs9P(lb`i@9{v=k@J7)XIve7&Q^Ogr&P{gA0Xm$1Rd5QepD-Zdh zOa7pQpNixTbNa-Q7Eq#39N|1(grb93X1O$aEx6Lz)^-Nz6WnVfTG(Wpw_b{F1r1;f zV^`IZUFYl?D&DDGnAC7Isyri&YE?QL$_F(gVAGjX+O5yi#}(UQvHk2~MjOrdb26p- zC{^>a7uZc%fGzawKu_QRaCO6VzUljddBk%?bnsf&*I_<+8&(pT43OzqMqpw?*0Q9|Y0=4U_Kg$!M!3(|t zl(^?Rz!c!3*WPJ{N?k3S_An%oz+UKs3^l%Jn55GwCFDCmyhHE0t3-@IIYb|(QzJ7oum!}w?o%5@|0}V)xPV6LoA!f=Yml{+ zxf?PR#T6t8{PIG(6T?N)J2zZDBjmpaJ4EY)G@=6}!PCP8?3_N_L6GYpJ^Z8MGcT1x z!Z8y>rGr2y>=*~sswKQdE9>1JSk(sJH(+M6Rb~uM=Q%bMD#u&JC%leu@ z>_bW&jLjAbMvH?@VsuJrtjfyVOdT4~(bP=?-9OZfK1SrqP^vlr<;mNWM*=O#3B|U0 ze9)T=I^Hx+l2ENPOvf+`(QJtXS)e=TJV$X67ieGwLr@8?T#8aaBHw9&qo{xZV$mM; z(LH;HLJ&t9Qyxj8n;|W|+;h+>{6Fer&;zZEsEoksdZ)kJHl-p$s$9b48%Wcn$I^U5 z{$olCtNe3T2SBP+TBO zAxJLEwlM2bos35HiXVa8#SB$MDD9MYDbQJEQiN={IRQIa?a41yQ>}c}2puCQCCy+3 zO>w(IVeQa?I4#FC9!Rhes!%dhADD)Uc>y zSUn27X8o0ZOAhb7TQ~JD|PMgVO^} zn|-mC;Drf*R-bT58#x9F7z#hI2D>F(m#BoisjZiE2^XNX5G4s_Y)yR?K1K}Ka&ySe z^fEL(w@H-Pr-fRHcuhx>#${bnn@pT$?*g2%BqMVwE8l(~J zS-2G*y;%vjEZiRzmt)X_z5NX{JjZ0H0tFydk&puR3tqxi1iplsBKXa5(Ma^myP~b! z|I||3eMjz9U7_6CCn>M;|Kd=AW6ca4+S&}?@VYATW!B6?T}9Ng3v<|$JKyvzT_(g$ z)pS+=>k#8D9v*$pxiMM1d0s?~-XC>_;^h&UQQVgh2C)hP?G1@YnBWHX(LSq*PIVFJ zO`_Vf*JmoxVHT zSgL)&RZXnv3f=H3h_-RPLS?PsJioPlmM0Kl4))O(h0mh6NJbfk;RFIk&EO5jV&?>e zKjFES*;yN*nGc@HALPDHQXO03-+ldGEOjFw{u0F-*#48<;c~2ioXVzsVLv`r7H;9@ zD_;_0ll28qLquU(|25rI#Z_Yh;g>mt7kCD0xQ6$_hD4}VvTT_J&;y!nS2F(5ztzz$ z^kNI%$fUU9GXB#)Xr@c%jwdi+saOGPv1LkeM-D}{=<>mwNzm?v-8}YMi1bOU#|i6enya@?Bx5bCS|I{<_gVCOn`EeWFH zL@82G{Zqv~)NK`)Rv_S->*C~f8d`#L>SY!&w5DIO%cpOSV~L*VKep0DmgJ4TSdC6= zLMGE_#v^zs=aeYfrk>(`K9oH`InBsFrFQiLv==89pdin3x6xjv^m{>x_MI^bX)yc& z@CJYg|3U&S@C4wcXGU=ZF-D2ct_~RZ=So@t()OKW5QhBL@BQZQ{`T)-*za3lfj=N@ zoM>Ke0bbw91No|ML|MhV-fOF^Dx#%4i^il*3v2eRT%XL(AN-M&-iNsjOew2c_7oe;0VObl$HpaN~gZkO3aAB}-Ts0khz%O(nPb>sxM)a;g! zfytCvR`%!BLkatiid&#+9VhZD$MRVl@&o4zVhV5TphR&!e(_5D?aTXNY5Oa)zPf>3WKARPJWtkUgvMEMVq`)9;&gPI z|5(RSp1rz#2^KH{owo7<02Ce20$`x@m%t952FWg5>VFRC^^Unqm$6l6b>q;;S8sJ+ zyFIX~j!?LPre^ZuIpJ+~YpP>rzTOz1n?+j%?)g1rzvdJ^Utz*q_950>Jl_xD7SlV2 zSPfSTq&+U$1oZb!^a=g-;HJbAs77gu^_`y6LAX)ptOign_jV70nn?v8H-d(~FZdRY z(7scUh!iQe4wQLxS9kY-FYHlDJg1 zFY`^gyrkTAiyulrFZSK$N8LWy{iXJmj#w9#W@CqN(0f*CI)Iro4)^XBJnK;!{{RFz z6ZqG1by4t9N63Lcvv;YGZzzXq&Gz@6XZnBd-ItjFPSjR>7nJ!kW|OD!KyP@h-}*2e zX^_We6ysQ`W$X5h$H+BPl#g!EWYCYN)jn@|j!StE1Luv!dKWkQrR>k48ajr|5So4_ z1t{4-IVqT#faTHblFD*?%a)8l4k}>YKoNjk=+Rp+DN!GZqJJ@}H-IQdWfEEXrg!Sm zC;fKE8(%oXW~kR7Kx*T8Xu2lrxfWO!KjM{`RcRVKz^~E@55h60aLS3dnD81VV%)e+8P~r~}|~99IAV|5$hdKu{Cbpv~)}G4LlR@(!Y73mR;*t?cASt=`KbAwy;T!mM>$@Y*91k z&Ym+rnMCj)>C!UVC@ipWHN(#h3_KcLdNvFr3o|aL5Mws)VMho6|G9mU%K}LSc^e$K zBK7Jjt~Wz~F8w+6%&kld3uTA700q&jgLmFJ!()??)za-+*RkQo?cK{gZ2r6n_=wg2 zZA``>{k8VwsqAo>3_ImtTPF#pmF95JF~OQhm{f;Y$6{XQ71u{pTT3 z848u)Q2jBMRb&bhhS!KKGB(&p;)PeEjng%N73nm3lmVQ(^4jZV$81Ru9BdBRU5;T! zfg35ZAvcR{L|znSk^}h`oNyOqc^q=e2_U4Kz9I{*MpHPK!UtF0Bwxi5wq zkJWF%9CxZ}$OJPCu)qpJoUefi*UHAaFRKf)k=6to19z)=7qdo47G%RgGzbHT5Zn>* z9Ys-U+uO6j;il!5T>_W0%u{P7WSb2cO|@&No+@El{{(|vBB}$E$}vwF|7%yMDrO}k zpC%(r@xpUo9Jiv1rHn7!VUPNv+#?&TZ{DLyjA)}8V?}b>aI@UF#dc#_H{Fvf47uHB ze5tkOn?saauuH0Dbv*yY7L|mTyI?`hSg}JO2}{VC{|mrxV)rsz;L=yU0EWzA3v!>{YG^~1 z_-86N9Gd`pIKV%_aAo1+ic@fPJ{zXWhs+b%`o32v9&&GhFU%el=Lf?S`jC3ETH+8} zctiuC!Gs1BBl0Toxj4KoYhz57(Vmb60^s0+w!`3%G$<_}QR_Dz%!t$QSc4Fbj*NmF zWJS(^#ljs@Qb^1q`eLXjD0*#%G;}1aK6S)I!mn&sTpqo=_(iuR@sNlV2@Ch9z9()n zikM7Qc@_yHNUG3#=>sC;MA=DE{jZWLAOj(Lc_TCGZZ>FS4e@M5oZuN?j_490mXIc; z4l<38!JG{seQ8ZWlEIetx}*SwD9h;S|AmtLb5SV8$v$qnvT+`(r8c|BPC21-dgwIb zIQ!?q6^^n}v@B;i6~|9fw(4*NQ>Q1J_?0oJ8N}c$)ZsyXUgj&of^XaLR zS_MBprRNmQS)%doF9o@!Gm>QzHY1#JB)=2Q52GoFGS zY~5hV*uOT_t|;XYE+skHnif>1|0gYp8rSOCh6Zbx=~`oE&_x7@>L@oC-Bt~1cdd)` zk+s$IENy!w0k<`buSyN5Zl?-L{?X5Qx5R5G54)n?I(4P7bSGTJ7Tk(Kw~0OV>ng!U zL*w3+xT%67B9W^w>;f>HkkxEs@P#YV)|P~z-O{kO>MI2#^8g5lnKQ?_w6bC=w!Gop zXw&OoFx`cdj4f;=S8B=l1$S-hJMd#8D^*37z`NfKqJ$I6$iXbG!OKM|7RP%~>3yt} zR@_r=9joDiI@rU6vFuTq`(Ok&rnCQD=z66j+5w=}gktp(SvTs(+0Hn~)$zhMON=NB z6SR`~V{rfQhZ7yvkWt4C|CNSQEZxf*`NGrv?Mz+eFXcuT!i2>#*tjg=Tg{biX_H@( zIoY-S8`d%;M-1Xm{V&tLjj0mP{4iD{ zSv{g?+RU-Ji0f()BF(~KU$&S{~JzitZKDe3lL;|d3;|VPwNdg&;gq!zJQN|JmexDImjPQTmOw( zyo$|r%CUXt6lu3Hl{UA)Rqk(lQ#jwc-gcK6IdGrLTHZphHLbO%@L41H<>1sT4r%W6 z40n3nQ9t<3dycVd^K0QKak$BQHG+r(f!LfgHf=JBJ4A0u8IR~d8{oi)x5Ir9a-Tch z>mGMKRN&)W-+R|L;$kaHmfbv!bflZ|q#5)@tP@@7Qg^wjVajf%XO`Fa z)b6B~GH-rej}2&p=WrWO*ig6p$~k8|()GjlzVlrYV4pagl4bkbv(ZSawRo~&yX^hS zU>d@w2Jwq;|NP+}Kl#n@#UN-8`)l$R;j>IVT$!xt=dymWmB+Kek1k#6$CP}z-hS0J z-`wO1cjY`({J{_pWo_@)`vi~b94o(Zg^a zCArx>f!~7F8>mE`_6^+)#vlISnzeZuoxNbqksiYwp8FY<>V+Up_0W_hS-*`R5`A8! zO`8XnkpBf520bsnYqK;MUcl35iA(zE(v@fquCmN3FsGgoy-_hHIUj zvb|z11`8!X0Ue$q=Tz3$NaD9qT?$Q^3bq=o0Z|L88ml2;7EM}7l%k{{WBV|p(8b^$ zP9B;qBFwp&CTWV;z1Ai~*kO@Dh)qU zgg*ji2L6$196(XtrSU+fn2aAt8ewBGr3{tcS=tKW2^{A&>$&TZG5 zd1c>Z87ZnD4}NC}K2pqyC#G$hW_BlpZRfuf-GCk9PQ96MVrO<%M2#IMb0jB{ROhjE zln^|D9qD6X?h!6N=qnC{BlJM;An1pB)@RzMN?PSoA|)w~BK!eYdSYWoT3!8tnK%+C z&cV%l-lzF&A_)56K~Cfnl4wM(q)6`PjD}@68rU^%UXr%wO{4*c9w% z@>d|8VUE-7xgs;s`KM}|@p+9mugsshvmQ-5f{y zW{$Qbpq{C+!YaZptFWqPYgS%hwWpIptAa`?v|vOnY${;-43HU3|8!EIVNL{MZVT~U z!xozC$)fDZUV}79!wW0{(U|MHG#xrJ-HP$sstTc_@u=YTy--&6HEdN9*jMuG zz7B2Qv}nRED!i_%i1yWX0_$tK&lA$DKAG6yLE@r5EX1m&#FDDC@&>gY&#@E%CWN6E ziecJ<;pZqCbZV)RaH;QoPBg4Q9caN4*ufw0Z65UP-}-If3a;MhLxpa6v%dt|HzU?HMBt-xemuUFAqSk z1x4@kQm-6|&f+reu9zz7&TH!CC+jX9__nUlzV0~6CQHt)>V{-_#$O?RZ_@%N=Tfd~ z+A6O$7xUID? z)3Iz2?R=}J`ba8Fltf)G2!F7LW-qTm+53ubGrp_52J7tFY<$+Q=OQYQexK-a?T?0U zwhu4W`!=Bwy_002K}?vCy5YJ?O_+yS_b5hQ>X zYq8aI3n0vZlmIW5!mYO&Z$u#PXoS!Ri!d7xNsdAB|6M*A_tq(qo}P?Mt`K*nX4x_2 z(XhU*a4pfRpe}J)4y@%+CHqE<_ogX+o-XVL%sH}U`kpT+cJ4)v?hQV13G<5B3KMg{ zu|{CAkTkF2E<_Fp!&!L?7UZKCf9!?Q?bDcY8@n+Zb8_QO&Lj(QkJ1UB&S z5&N(qE9xLWWe)f8p!TP-nkWm`?$ai64DXfX@m0UhFXLU2SuSlbA4nWyrxbs(#a;#x zSW8zeQxEuVqBR?25@y+*F$83bE3fe^*Rnn1Ohw)D>pdb0r*QWGG0V9RyC&`UHuFD& z$9{OO#}S}KidesfGY<=kgW6u zU23PsvTk#0=>T|uxA)6@!FP&wS95nls^erMsnzx%ogR2MXLX_auXT&JyAHNyVe=M& zpHVCHbyIWsezh?>bz+aWrBzH-$@hTch5`l4FNi8DgUNFG5txeU2(|PE_qS~QH)P%( zwy?NuZRQNO=cy6x9Lr{{I^NBO+2y{3=F0DhpZ9vIudgaHQET@`B6o?q+jeuan_^c- zS8YRIQiKBzQ@<*qHaB+v@?@!a|BzD$9%L+OM1uo?$plD4u+%{g+_>@Ncsxe|2vD#r zlQ5i@P=Rx{nX9Ikzu16crRxpeCIucHp3N6l)#yUZB-v17RliS{uj z7yvyxwC}I$vT4vxIEWMR|EiBnba~QScDc^#VGjqfep>Xzn>(^=bjfS=ZQ5|d6wtvV zk0+OgG9ZCM2ycxHf~+swK;(ki-MqhRFrXU(Oh;&b6E~cr(2zGa5(_lyxsCd&jrEE9 z){?h^H}slH{F;+5de;@UEBuK!^2vK5|03hmk9!V^ct&TkRjWJZUOgT@E6ihtXk4m6 zYyzJ<8?4(xPS!xZE7Q+saPj{3Vb*=o2d~`!PP-Vm$6q;k8}2|4UEAJPW(g%l^77fZ{Ly(yzXXH9Rwhb!u+-=_4(;E8VFlw3Ayn z+uN|^fBnK=b@Ve~qps-lOSrwZKDu*1*Kd|L|8VkWh8WB{(cgmYthi-7fgaEdK-3U8 zkl;WWZFmp}B4B_52n--PkXRu`4H^Y8!Z0#mp^%6lC1zP5=^{pqD}Hcn2$E$>moH() zlsS`TO`A7y=6soln1yuAd>>#Y{PLYssi3pTIi1G-=2>ap#s; zWw&nMzk3G<>7TIhBJ!o)44LNghKNw9!QM3*vBv41caI_J` z+u#c_J|T&mX#qW^DX*YctdJrk+@h#t2J@7pA%yC#6R&~Ywo_80^kO1UN%T}I(#$i_ zM6<`$|7^@Kvk-ISOF%bWgY&`^F8MYG$MB4A7FxinzPTyY!U(=m{~8yNFC6)cbYTZMlt>TM2kNtl!E)KvXU*U~$<Z%mg(urf$z>2liN`lo2Mlx$>HZ1v3e=sbV3AgynetX# zqdAtL0e)C6zAnpqcIlUzHp$wQ%KY5;q^)VrSA>Hx2o3i5;kal!4bldTEDPVO(=1D&5FNA8xU6|7TPqEb-(^ zGLkBkkYU`PSh=SoqO_p!x@R?OQJz{j zAq(~d!!g2{Q({E}A+}S=G_}L5-X(x&z>{YQ>G@KnW>QED<)|k^R?=dcw3o7J(p$i4oN2_?KlqR%&ii1~G2UZ*Dy=$UB{Mvy+CD2hNCao2X|6ZX+8q2Ga5`cs1 zC{@81xrZ_}k5L#wd6-dCZCP>;&Cuy%jWdG|3@wo>V`Lv~X9OCO^E~H-+EPI~t6x5G zt%4=gX-!MfkIwaca^&jXGU_$9!nJK}J>M@?G*7VZwfw}MY{A;w zt}0i#W?imRUF$H^8rPY;^@{{TyPH9@^MOFMBn2HiJIIQzB+Z~hLRMISm>jKIxgshg zLBfTR9JRAW&F+1PBmw&Al9qoFYijGKMs>vxxwmyL+VGlSvX0i12_0f|9g5oV^*6cu zZR1K$`(KL2ji9VGux^8>;H|zEpc<_(RITgPwxrl7*d?qE|E*D;Ptf$m#^c3!AuEg} zcosYgQD;3{;tO28bF*XeEPjzJq%YvIxxoD2FsI7o@9mYZBW9^Btt{2jCiuj?wC!#W zyj;HVhq+;8ahMU*&r$C4w$WXpLN7|EFO>v2?R=i#QYuc2Jx{EHPdfLr)C+cAoF#PU z0uEY&q-bXhwxGy+`oIl-PBdq0@QcazSS1GdX*XG7{|nCM0tfbOi5#fG*+1l<(aVXT zr}3?mG?+SYq!zQP?dnm-X%xi9M)kq@O=4&}+hgz=l!lA_Dn{}`WIm65i2!?p)+!57r zh*Axp0|nFp7%!8j=)`RV75aRIEi}?0e#V_@|G0tEFM&cNz?qBprgO1Rm)1urV2oqv zVgw)n1LE_zqP%+5-^V_6n(6-PyVmmGg_nEA8LsA&npy2vM!0J$EOun~p3GUMHEo|4 z#l0UF`6_n{#w;v0-KV|dQ{1X+GvLDPs+&76c(2Scsri(&K@`n6^dvD-k_MJAI@M6d z3bX)sc&zhk3=vRWo~7-#`)AR7?y6_ntdX2|tq0vT?F2AV+? z2Eo(XZueM>Rs6;4iY@$_sQQd=qmu6hyUyZ1$?eK627@WLbSv+8Z((e(;GPT3>nL0y#_%M>L3sPU;{ER z4u8(+IB+-)f#_-g6>v`szeV_bug-`~`9x*Ql<)%Ss4UY6m^c<211o zEiu?cBn4M-`dU$ySk09}kp?j?7oTn6*640ZW)dss3Fbga>>v)c?WLaJI(nepuAmMc zArxL=7>Yp|CJ-AMP#9<-6*d77=->!&AP0Uf91-alb0YF|KoP}}BW&UcdVmK4UK#1ns02%Le-%Wd;*67N_V55y}VQX3z3*YAOJy#wj_}aV1%X(unE@ zbl?VhE(w%?3EZG3-9QWc&^mC^7&)&fvji9+fCwDTD2t~iXmSq0a2{JC8Ja~AdVmT% z547eZ;Y=~%DlQ0jZ3RK{?gEl4iLfh=knp5%E!i?sZt&Pd($&N=`!3NHflK5FlDT%z zEJyMdH_{;i^Wu2W3SXy$4Q$E+Yj42ckOBsZ>WphwFZ5-lT4#Lh;` z>{11s%D7Uj;ZmdOV38!53^oPQAYUZpa#JnYOc#GmmV(oJ>W;2dv2YZt_3p_DBq5uQ z0}dEsG##^BKoc`NQ$1O)J)SbX%+pBHF*E6qG$R5N5Q_;)@1?NNBFi$3J_a~lFgay& zAj$GS`EvLek~;CuHS2OLQIZsq(EAXy1Rm0~LWMc!vN?0jH!Czj4fHQFvO3=q6P1k> zA#^R&FSHt~JYK;VJ&g#`lRcr5c!b~pveI&b;5`-MMsIk3(VP7w@Z9Ah8CTK}m;nR^$sSXOulP@BoM)NB?w71Qjcv04u%o zCaQo@9hDLrkpe>RI5q(sk1|nxz!Fkpi1SUs(!Z|sOyP9F z&{R$Bl*;60R=2ZOOO-ZFwcz}-BALhRyfiGSuZie#P3wnp@QXP1lm_k~AymfGxBwyq z)lkh%13LmoCl%dkH)(lfuO#Z8iABZ0lInIcsx3|C1xF=t`66 zLQ(8ke={!S|8-1_aAPP^L51~I2kJpRg*6Szm-H!47ZOoQ^g3x(fOPdBn+*e!4Blj_ z-2$-@vm;U|HC#c~K3_t><{mEP4LuWnTjk~M`;WcXD? z@%8KgFGaPkR%JHeMzz6UHB}c3Ak#)Wwe+sCs7(=eSGTkV*Q#e%tshJ5Ku;rN)5Hmk zAwOeMWVuyr=aGVvWSkx$NqvlK|J2~(70QZJV3C$sl~!uuwO3vCZI!4ny2woi^GhFx z{3a@AcNSOs5=x~|X%(_c2^Lvt(Qf^&UoBK$TM&(!Z%2NX2N!l{t71h%s~)-IN?7Po z$+mPk|8QIv)2A5XV+}|GM0HGCmT}WGW((F}B{xv=_I3#uaR631ofHNOH+TsYcDIjs z3$EFqFJSQla^Hw~bJcz3)xpk^N34A-3~vWk zZ=2R6rMG`ePGWj-X3Iq-N!Ol=bTQqaI#}0yJs24YVVo`^4gj%x-2>F%HzF@`aqALs zqtr?nIAL>FXhZG5o^V~+b$?WKHhFl46_+jZ%xaSt z|E1GVuRJ&*AsF$4u{g9AVCcXXBc9=rHua@4AccPya0_qP4%ltyH;IW5RcTm_aY;&{ z7!%c$dPNNggP3aF=K28h6B%@P-I5Hl7zmU(xS z^BBPP7zhhkT?09LtwOHy7l~_kkX5i2t#*LnXKDGCf*D2&$rrS^m^l{t5IUHI7uGMS=N6LUF$RTz*1|BPY# zcwXK4e$AAfYnEo6`72|ymfv}mST0WuK}l|5e78BGzsmznRspb8n{{ZD^5o-`cesr6 zj2pO#^;eKX+LqTjApiM+{c(Z zwG^Rm`BjJFFh99SzP4Gkppqr}sdb1D#54bDAX8V*lau;4R z8G&v1W~Y>wF|yW5jh5&5r}23cU3r&@(>nk7r0s{N;qp`+myI{Eko&rNUAl4`IH6Zb zoRx}MyBH%}!0`|psv)~uZj3t)g0iAAt9^qin7N|^_v8ZR%z*b2(Xy-&|CzKD*ojSB znX~F|TeAdrc$xdTarkIIxU43wUj22U@hhgvLlo#O4553$(c}qYN`xB$ zWzW@pWfr1hw>KL%s86)Y9#^e$+i=l4ic}j+_0_Inn|x^7j62)5N!$Y-cD`5oc}RP5 zQ%bLiucQN8ZFaXjyfR!Id01FqS)v|AhdTYRg6$Vlfx2 zg3G^N+~ah7#zDNR41318TW8IRg4=t3F1#fBn?t;4%~u<(jkjLs8brz4FoaoagSKhm znaAfAz`YKx^VSPGZ2_pVJQ{Cfm;BJrQ|R`z23SDC{gj%hJjF?E!&f*}EZjrAx*`D^ zh?{wzA%~@rn6uZKiQJmhR}96|7-TYB(l_0CdK1h4`*r~uf4}^##k#jI5+I%L#E)6P zlQX&TtDDHlI4q?M0yE)OIR z*#Uk%io->F0LqnWE4w}3yE@@T+Qfew+k4vj3c7|ttm+=Fh~2ihqb-Qbo#9*BP?&%KhL(LTqQ-e*;L>{V*p!~c)tf5L*3tT-0CAd3@Tj6kRZZ_4+%DuII$wdix?M@*eI~0 z#}6MpW=d%B#7K^8I1bEMvZc$HB|5U42(qOIlNKYE)cKNUikdxrssO5yC{3XXktQ`d zvnWWVFpo-I>NG0Vg%B8M-O9DAR|jCjeyt*Qtl6?>&Hp}8Rf9&2w{YV|OAv%?+Pir3 z>fOs1ZQs9s0Sg{XxNuiJ*WxO+@fHvcBLgA}81N*p;mdddw_wW9#0D`}I|b!ejC*ZX3DrhOTX+HeGtU z_3O-^N7vrlW%h%#o68;zJ~?sZ=F4wCo-@5fl;mZ9f1VOJZ`||G8?=DAzh%C1IHTBr zHEfcDUH|!~;DQV`=-`707G?{9iv2>DWRhjkzyk?FNZ19#g?LnIwb?fwX(*N`;&Upt zCSraWh1cGS^_|$=j5n(1n~Ci8$Rdf{>DXIwF#oQX34TQe2^x^FsaD;S)UBwblq1Tw zSw%JC*rbh1xwoT1UY?NUmt>X~CQM8QsnU)}wuq)qYIrE8S5C0f7KLv)bHxA~b~xvs zfCeh4piUSv1DUu6m!Jj{D; z(Rx`hC8i)}Y;lxO(rhivCbxQ~)+RaYF|-D|H*vM-0SqzNC$smpXvtdbHO6vVoi)c* zx5swZ#E!hTwm6YpaLX#wt#HNta*dwMhihD&w@~v{#TeBf>eeeiJk6oek$3Jn)D*z5 zb25_w;V9&vcclizhSzyXyZO?%`JE7aLHQ-4tV3PSETRZ z!6)x4-lI|dd)kfY)+amH(815{ z*KdFOgc71Og?9YlG|>19;DWrgzVMOHc^WI9u+pRw*a-_u3#(n(h_$=zwJmY~B8lxD z=sPim3400jmje+9tP#EpMkXAb?);{`nGw%qg@apC4w$wPDo#`>QVz(j2NV8iNPs|W z&;q~!jnN6=071N;5|^l;Nf^<8r?b}*rS>r6k??tnyITrh*f$yKE@l)Il?B0w#Wqcg zj4r}quwppA5KfSWR}|P87kDeged#HFney)8+N8Q$B&`$d^~hX29n4~ z24P}<1lmLoP{+hdTGB&%aQ_RU`bRIx5J8Gd%m94~xv2uau8q)=UI}+7GO#7`Ml9^$ z3S~zzHe!owZ)?%@Na-t68W4`945TchqQzHoahAkvp)N<(J@n;qm1a|=0u9MHhY`?H zkhxryb z%JP}D)EX~C#;@kFj5b~jCiR4g&uQLqZ@xriE|V$8Q6Y?X$SmUlu}3l*DWy^>!_<0w zd9!lbOA3%kC!%g407{zlr7*qA0`w4rM8)MAb0fGa+R{tp=GraicuYo7OPImB1fl7UC}-jl^-jv#i0Akz`Cw= zXWguLeE$YB7YQ67$F_o6`VLWkGik-<-2)E7eZ4I#qI_wlfF0CJkqyy36 zG7q~7JtjaEoBvd=jW=W#g)D?eiQUx_&b`asCu>EhT?3!i!=nxFF(tT9GAXyXD7IyL zkE_(^#p(l~eCaX}CCSNrQolHk=@XoA00aDY06o>F3@;1f>>{|TQvG9uA3V5TIT)63 zQ|@z}YCx=!xU{nq4tK9htu2!f%S8^GHCasJCVNy>E}SxIH_YVNU5m&|Wg(jt;@X!Q zVljE@9~21?;2it8&yiDrk4*>UaejeQj=idPZPj7p8rHPvbxm^^F$Oz25CtQ`-z!}+*oIY$iJOK!1+G0y5*THDpm z6kpPlnZW|D58(^X*4NS8-b`nh;Yp^f(~qv+ziu0$N(Sm_GO&Ojx-|?GaA!L)1YDr| zz5nNb|I6y?NOYr%SRvcS}cab=%B(E-$ohnjZ>#KOG~_fBxXCbpB_J4|eMt@9}GUcD__!=2V|u z(_wwRMp-WZAejO8L+kzC3oZQq`+qM3W;e0tY5#J37gKbzhkkq$eO0$!Xk~e_hJd2y zMzi;DRX1Gar)i*faE51O$;W*2$64<8UJez3&Q?J*LrNLwaTRERCkT7R22(`PZ~sn% zfB$!bx5a(kRd@x5U@0ViS=Df37Jnl~g45;{fP{7(=yIr+epDuEEBI=mH-!~uctBWs zcO-&D7;6`Jc&cVhUFUsI$bz!>8f0*LOtfU}GpqVOW2ED2SRBg&s(8)$@aP^j%~peayvxc?f~uCtX)qX)LHrcgO}=U`}wr5v8#&@AujW>8`WweW@sBph1LjRViEUmYN zDYt;+_Hl~1hm`1p%_xT;2!$P19b#u@ka&wN=ZwX8jBXcDg_I)IrE%$~gKfo$ZZ&8J z@Oz^8iPo5q-=d9v_oHYs%e#QX*+MZACx(q#Cec-5rD8cm9;2=mAIOt1by=;mGmf) zPI;OCn2C?roKnbI!C9J7`I>(Th=C}cjHgD4S!S{Zj(F*rx;c@v7<%nkWkQIG#aW;B ziI9R}nPVApa}!eI34ZVih`(u`k%(m{mXEARnx4jkm}xA&DW9$xo>K{G8@Yjrr=VT+ zQPKHclvt1Z>7DHcmjLQ@D+xPqDPQ-QqQ<$Rb@fxYD3(a(nEwXoU^cXMp9!7Rsh8vC zbQKDtBsY@ehm7sno8M_1M7n&mqn%%Qa(!5g?x~|*=!h2AotzSzuI6UZvV=RqqAJ>@ zIhkkxdYi!5W!)yDLkf?48ICOZaHlDh9x9&ysc5U1nPPfE=rFNqz z8IxCfdJD=UN(xPYIiGtvGH1x8UizqR7>94dr+R9pm}#kMx~74esdJj1ce+)BIdKn4 zfH3Ko2&AP1)dy4;ZW)M=I9i1M_=;s3r`Q*&@JEP5niP(@tB~5O^)q-Xc&JPWenN?= z6l$x{6_e#ipiY{go%*DN)s$uEgh6>=ib|=Kx?V$CL;u7fWv=?FmxrLxYJ^J}q0gEz zrAkOhIzwLItGw#2Kqqt-T7}Gcr2I&Q%($%tcBd$kn@zf&d6Qydimazfuo(7vB{QB_ zN2|lyl?IEcLm7R`I&mDCaSfWN;(D%cx|-O50h0XT8|SYu`&=tIsD_DT0}7=xNly)HGx!;@ z?+Ud_TJwv*h@)6dRvL zqOBOKu#;D{vwCDOCbfK9pKJS6K3aU(imq)basMpgt+h#gHrunY*Pch)c?CPTS&E2< zh*?wGgjyJ`Y)hz+X@!)UwVn#JE)k7U+qb4WPE;F$NlT}oE4Q3GsHI4hwFzBxt5KJ$ zime;C$-20bTdVCUtxH=`hYP4v29O)7D^vG&g)6Wq7GtOTyrB32;3>1)c&0iVmgWi^ z6N|Vj7NROCo30ygyE~>|r@L9kjz7D)7n{?vqzS$d`jS9W| z`-a%aVP{6`OBC~TDtvf!Y8a3nyJ26`jo_4HUC4$!s{A$)-tLpTXBkNu>reJzo0nMI zn5~PYY}LRRJm1&#ftp2OH?9S%Cq!JvygnpV9c>H9LLi6b}s9r`9Z=5YR6W_!hbBm+6%`CF~)^@ zo1u)yI@`)ZjKm;ZoxI4BW5=nRiyYD>tif2h1`$ztT*&sC#fv=5D9oa(6CAFLO1k{I zFM6q|)o7{3$xv)$Nes)g%*xC;iT^Q-&3SsLlMIwboXSd@VQ@=9NcpuyT)^S{z3FVI zrYvuRB%T%Z!xvU2**Tk>WFD@+6&pTBsoE6jD) zyq)>0ix<0T){8b?JIV;F&;0C@XAPMX%l~1^)?)q8VHd|gt;+D*wOT#VK-$$ctDE~P*KvK>coBy? zP0E6K$a>1od`+93xyLsgb}&7?*EZ3cZOLIR$JuM7exzMzox!CgK5gxeq^-LB%p!@5 z*}gqA%IC>jt;r08I7K7S=>}yq;(C?BfQ$z=GjGEkH`JKI$W3Ne2Rw6gN2x-+kNLUDYei((op*qOIJt z?UK^X)t@bgToVCLJ>L0M0kJ?0)gTP!9jROE)~zkVsJz?s3ffqm-DdTC{avfo{l$X4 z-=})41+Lphjdt-}yZ?k8LfuThX-&8(Zo@A@(hM$qmk?W;#0+5Ih6pvKHSW+EZo#U$ z#K63yG z?tzNl=U?2fOIpqfHroyO+*yXyQHkkUcA@?)wp8BR!p8-yunVm~2zD;szZL~MP9Zcv z2~NNTYyNYXsO8O^c*SjqQ7Gs#Zn*JHt^-bz$t+aDy~>cy%2PPjvnI(?-Kx4yyw5tZ zq08w+{ODLD$NzTw>8Pm!aiZ#-^8#=|4Yg1KmErBc<^+2X40ysA%@76%@b1BP%^Qr2fsV$>eP%o?=E)rK!u#E% z2)qi@xO*wn&j#=a0*a_U$g#al8W0AEx4Y(+%&}NL%qT5Y~~=U zJbu02KU?tH{_^a||A9%<9P4)vHFyA??w`UgQoED>eLpjK<=qt zoKAoUt#Bxe0r`wkW0YU{4HDJa+SBz4>7qZhROWy?ztLNkr%KCxY0vp|pW6q0H$tE2 zYTx}5d;Z(cp2U9pmni;!PVH#o{DU%6c{MJKK@F-P{PYhH3CQK3^bneWV zDgVVypfh_8g0 zw2L-sYrIW6S(}dnLW=Y~+pizbVHk3E&;S&yzPA8N4>gzcJ20s78XPdZ1reOgya~BW@ISXWE08e?75~F9 zLk&4JD!>RU^sht@CEN}?14+bB#h1EZ?Kn)mKY&i{#KzP^vHrs?571-N|J(M?ShxeiyYk1XT4`K$hHdxR7gdY27|IkkQ z%&#PSQ|)e_mNVX}R}A=SzvL~GGNTC{+TVM@KHF)HDgMIeo;x<=n2~$LO_)lukiu47 z6GuEtBry>t=9wF>!4)lV)_G?jgsA-Tjx88m)NTL1dr*B(G#lyH7ysr|T}@qwG-BIH zr5JFoeHXlLhS}|#Y%_mvy=~e-WIp!5t#$iU;ODM7LG}5pG}eI-dv+b+_h0FnSr>m+o2!w>=?mZOd~Z z@yb^>55}!(y$hfChQ>GH8LxU?3!D#AxH^0>MGXyPB1FVci)_d08qMS3L#}0jpjxP^8bZs(NLjI`DfuMDaoV}l25(U zW`KMOPjZehsMKSp-TF2`g0^#~VAAG1^LfW?s?(BmvSEBC)ux}~w5aCH9XcWA$hv{D zr$98&OjYm!F1Yk^Lg2v>{veEz%1ma*SVbWmFgdltrZDs??`y_J{{1>K;cc)zv2Qv{92@JeSy5#-?PAIBSFqcktNB>_Rrroltm(Ax^jsSn$a0c*0@knFIP27a!m}tsy`*m` zJHFwD*rrC5sa7nI-i}eh06~~i5H=Bwz{Yh3y&wf2D8Pj$>=M10i^2rta0y)iE3URF z1|Y~=r8c6NM$@b&+gL}>2va!1*ovxEKU>?}63w&W9586nL)y!3@SOXRuMIss$*n;d zQU7hQYA37I*vi(luWK5A%M4pH^OntHCNnrijKsF7xh^x2fRdR-1fAi`6EXPikdxDl zSX{yo6~O3@iv$8y_|?%Fv7ay!F@Q84IseIqw$7INS>-1OIK!!ZEqnLo&n)vd%W|eF zmg#7<3#T$Im`y6Lw@GIM3&>pb?b0C2Ipv%_$h`@Q^?qkv$2;3P&y`)O5iQ2Tni^ZR z!QFBovpFqyTAI{2I>2;rfP_R$bkjU)hAvbwi7PHv+`kb6E;zmJ#?lZ=JS_(o=f`1^ZD>0WU^id3mfy}#tc&lze|Pz|fvB3PvkCz{XEDy)@Cv1mlm@rqg)m>a zfL93}H!Ik{0FE^}HI6#*zyVr+9eWrck`_y`3Z?)NBw{rFDjPQ+bn85g5zKC2ObJGb_HMy8o&*L#^%WHZJo$L8~&aD?sYoI=st3224N}!5hF6t>$|c z>??uOTRA6Nq`reYp(r%`o43WQ66WHCY(T#uGlnR*zxGQBDPRWptB7cLg~Fo0`UAos zgeFsaFl0kLg5x-#DkPh`LZceMV8f?6)3BGDuoYysvQxbeT){3Qyae;03Y?+TgE`hq zih*OhW3xUthpFjHl|uq^HtAR#UjG*t0PtL)_Uzup2xS zyudVMB|&_bQS?GBJpVZ1(x;swMG#s$U}VMn+P?_oLRwrsLR1=LTSH%L#mT6_R!PL^ z&;bBYf({6UXxOwB@BsusfXkBvDYAiJ5CJ#vypI4q#9AXH!!Bx62?(gVS`0;w)5Z6y z!)E-mFl@F|6vhDjLYk8>TqD6Qv`5{Vt$}1g!Na(jb3lv(IZ@n23hcmWOhyw~uw`^c z+k3b?gEa%Zwte!)jVvmty1oQMNenbS#EVBPp#mvUL?obtRA>gt1BAmmFD8-$&l!eC zXagx>rUU>9^71!N%r1INr4|glmU~EMG&_te#(zA(9zwZxQNXj~Lc24@>ElNW0zN*} zI|-C5i$pU>I{(F33`rQIJBlo!;Q>hpj2fvdNt2|&|I5W+e2kX-K9{tPn8ZQpcmq*5 zhHQwgCXoguD6eFJN5l~$`k@A4*aVN55+w{h#_Y?K&_De`NU1?f7hFiT>quqHLzT?O zk!(Xho6B>uLJu^kh?7F83d>9hI1wx;Hf*G8f<4eoz>b5sh2%xua%)F-#Kr`OgGaDV z$HWL%5K8Z4LZ2aokg0}ah%`Dlf*jyC6iIjqa*yHE+iOAb@gU;CrHL?mbwNQ&c9Q(VycG`B!GiQpoRCl2so(B?}VQ!7z9X|gD^mu6=TPuY|lJ(jVH9a zvI)V~Y*Mgz!-Vrp0vk@VQqwhM)3$TU-=s=}5>bXsP%6dHDOFWf0yq$bTu26+5z=IB2$X3kYuv=k zw9!gsi382bVpUKLtwYfyQ&0_6RQ1gy-O$Y}&STudQZ<_715y5)i)@3_rli#|O;uuq z$XxZv(hN>yT*-tql@XJ>bybRWiO7R3J~sH)Tv=AdjMQdT&noFwMIArOlvwMKMFZ_a z%gV2fWH48iQnhQii9Azz{m7XU)qt(nf|L;28Xr}2ONV(8lMOV6Y({fYyGSSvKGyZr^dMN;<=g)I*SZB>ft_8M$kzjGD&HMdJ``5s zTAsYzOR=3^#k)aK%PS%P+t8(6Qd1pq_1O|*SC>r+jjYnwL*7rl+cEuFLV32@HCX$^ z-MF+sses+8q%5QTRS8AhD{bBW1z4x@--@hTTqVF^#ofQ1FXw&1yR?bs9RFSC)Ld(Y zV9eEykP;+x@J z-Cv||ST_?pHDg{Uepo2RVi6W&8eZT(gkq9q(EltxE^c8ljIS>SW1x6o(KX^B3CHaf zVm^*XCR5lnWMaBB)A+sO-_=qD24qyELqn#;+ahGhovN=)V8*>wwKZN4apBZ0vp6(Z z_U+ftY+y3JSL2IZY{3s6IvhM+Wme9TGN_N!MU|x0UmccR4N*ZxWfFr|V~u1ng*O+S++$Mi$^Uc4SfhQf1cWTfXOW24$KvXL-KlGqzco1?W`8 z=iNKYdbVUzE@cg3-8D7QI}T@w4rk3oMM37~EY4C))?ub~XQgzfP=sOlHRBJ>U)O|V zhCXE!uI1Z(G^;NuE39 zO;_QAW+@zBO-18C9#Dl8r=ON$!ZYcGmdLF}>Ta$reJ8f^8k;XCseB!_! zzTx(-Sk`IeuH^mnXWHdrHDt{nj_$^GMe*(A9xm_4HvjIorBL*yi69Pd3eQvRFlz>H zYrLK1@%3q!mTH^!V9y5Oe<3T7K4v67@Y}S#lnm`O-sl8hQ%c6|?rvllmtna*aR`wt zzRm9ulWrH6i3zW8BBw?(D9|^Q9uNp8VN3QV#Z@uE)a<9}-F-K&8)N+Tm?Rie--dY%2PS_x?$}aEk zu$JCDKlSv&01dxIR-fuz^l`ry@eXx#)6->4C;#CQ-m)}D=ntv#v76lW2IKGz_J6Ey zAUAQKF60-4@Pd8nmhML^XYSkH3|hZezcqGO&+xm$095aGqzv@~({?n)^w+j^>85G` zcJ_ga-OYa3piTA{+UZsAZ8%5t*`xgMQp#jPwWPFQ>L<<^LB-Y zrb-WW+>GJ2)mv1Ra<<`hAjdxK2KW%BY&uQxVDD;te{$V=T5PvV1@~~h9dl1^cukkE z!=CoE)OLffcJx8kg}-_DVfmSl>&6=x=rd?vLExee<`R^$LG3k4;@2{4q9kfW&@*zi|*7>%>KIwFG3iclz}Q zh!iRYY7$8BAi{$m3?d}4FrmUe5dRq_beM_a#Ecp-PPF*pqs5ICL0%Ne=Ap=x1xb!1 zp_1c9lpI06WZ6)rN{=Qwg2V}P;7*=2YZ5JK^e57yFI(DN8u2Cs1`ecBof^ez)vQ>x za_zd+E7-7N$C52;_AJ`8YS*%DD^^WNr3IPxtQ%LZ&buX?-fTKIDNvt*T?z%esVx@BTgf_){f_xBvcK`FGj2r{~w+zxrzR-Buid(JcoVblvp@nt_y^q#$m@ zK{y_EuA$K2eiFte-fM^fs1bA>1~uY;CH552Y21w%9(K%SDBXtz8n;_-!Wnp=jHFeF zBaJ(E zx#pZnO%`aRchX6xh%QDsppkpBNvNklw#lh=gMnx0p)CT2YGr4-nyI6YLP`{QE?w{? zuDR;EE3a8zFlCuhvj19CiOsDlYpb7<>LyQ>(zWK9&I+ljKo17kDR4t!%j1}o$_cEs z$x^%Qrim(AsOj<%J8B8x_UUJj9FdVFEV{532tqZ|jPDat*T(Q4=j@!T!q3 z^QEb-oi)Ll`Tu?N);7_NEU0A;&bLN()_twnS6ixe+c6mq`r}nki+Rnp?q`A6t-Jm@ z*cKd&w6LR_p17&Allkx4gV#xL>T^H+>AAKmzB20NhRWHg+1AA*+tl4H_{&Y>e!aOr z0*d2~Erw`(+?snXevzg3JK6D_kF5TM%~MGE-_^4p`0d;J-kQM61C<8Eu>1c%0OOMZ z(m@V;Y6D;B>SZDG`Q~N}5uW_;W27}9 zDJRA0>S*PJRMt%fh;;rR52!noZ~i8++s7;UDe-bIjn(BdK)Vc5h1 zR?mcBjAI%@^+ZZ_kTuGSq8-i1E)+ViIjkchA`^+oFqLtFf&?Mk?&vNy!cdG$6j2r- zXG2J;@QGETt(47{~+(w5ayvsh(b%kwYTWp-z43T7DH&z)jIR zBqiz+VJgR;Wpsw+gria6=d)jqGn3vF=_@&CQpXL?iK)^uUVwiBsg z&Qz7UOliRG`MoDzl$voZWIid{$&7?`kZ;0hNr9QKFIcImmW3*2m07l&=2Eef(<@;P zG$gC>m8*!=p=8O5T3n(JmoB~PPFYJWaMIPV+N9xO(*(U&d6u)Wg>3W0%F*F*kpG@Y zZ7KEIN=nr_@T`gT?9jZLq|&;is*nwtw={CA%yPH8WWfMG#kts$nkl;G6>Dl!7$~s* zmSoa>qp0fROH6@Nt?7;INab|e9YPVdBtz;~V1>bXq)4$B6?m?9r z%KXk#wgA=V%#IY`^LllC#wDmtEqBbzdbh+x-0acndpx>+cEj)eX9(AL*ITNK!z7KV zM&}DsY`zmsk=yT9b!ta9uI9tO%^ozv3*i>SEyg&#u6<~BUjO>oKOh}0aG@t-6(3i< zT*R;@d#oTL{IYDSQCZuaiizX=RH>THN6PK1nQ7|9o^3YYDK-MZbK)#^mvOzU|I zae&B{r4&8L-fu6Czxa)`U!6&8EPFbj?&j}WnH}j)qndPFF6^}54YW=1mC_I&w}aFT zp#^$6*Uhrrvu%5C507=!U){FG@r*S;(^0;Zr8mrBXX}w$amN1E_5aG}XSgK?`o?=c zc3q3z+DofCdR>`81yYB0v-zG%o45P$sX;I5 zfxh=UUy{8LPIuoQo$A3>-pf#`8^Oa~&BI4s;Ff_s!5y#K-rl_GxsPw-#q99zSzgkG zemgM}FT-5gq)KTYJ^1CrNJV)aVAbC|lqt_LDTllHX`VWsY5#9^u9upv^k4etQmk+E ze_rUWMRUgmV1-?rj{KU^(OvJo7KKd^$5~&{{T}fxoD3mUtc9Nix(AB&0k37307e`K zcGTBJRI2e(-36cD@ZRjn9*8{{du5*BeVyv99$cXu;;~=O`P&H@pnfG70;%BnnV#E$ z9qYkK$uVHoP1^@@o(Z87|H#?}KH+)TTM?St0rr^(<{OpOU<^(l09xVIIiLK6A;u*g z(bZp=iJ=3|U*}06)-B#{Rf_UeA+Vt#^9>U*+0^wgdS8bV^-!&Z55ltyRQu!TDE7ArTU;!cyqgRZd1R~UdMII!w zAT$l)7V2L{F&`MRq2}RT%jsS%isB1C;(h&LFT$Vp!6I-i*)xV<93EMEB_l?KRT66B zN$Fr34xl+o1T`Xt8oV4a=A#906N#MOH?SFCLvbO42|=7d%$og2V?a{dLOPwf8Du%)+wc|SCOVcl-WC^D$LMP z)ix3rD25|bq9dP88{p9-3{E2UutWtqVN7C{6e1g|o!m6;S~gC|MUr8SDOm~*UN`#S zT-whUa+V7gWlcUMLtf%i0;a;9Vx^KO4Mv9<6A46W^2L`ftKfWN~KWlCQ|06P-PvP?dKGZQ;f`}H)7`1Mc)kGize13UhY^s7U*S4 zsLvJYaRypdUg$`|W{Nskon-)1edwH}HWm%Q0nM&epCk{7Z!B&5}g22gmeV43>rs&1=G$|I-(DwDw8gOX`-PV1kdqn&Al8vm$45+NlZs=A)hflK(>FxD>5J{$zz(D9%+R|)$Z)5(rgy~tGE?Jhq|oSt#ym9F|sz%B{gFpx6p0 z@))1bvWUtu-+$;WuC}U~a*P4K?Z~<)krL?hStrD1ZOsnuaVnTlHW%5ZPUyib+NQ-m zX4;<_TTPm&<5A-^ik*J4t)@bzw3bZf<`&LU zYr$=#=9=p#vTIh7XM>pr2oDm{QhOH3aE2pZRJ?6RhVfmjv}l8 zTcrJR<;fyo4gzlAnxd8Qr*5EEq0a94YO3jiZROISe%flEl5Eq?@1xpXZ-S8UUfWI1 zFz!k)rVYmjm;rZog@TsnBEvl+8+&ZrnrZChdsg4Ay{r~bJfDSAY&m*QOqYZZQ3g%nLmTYta-wQ`497`e+p0H~UoDYks|H9s2 z&EnYYG5Ye%d-|388D_MG?cUAu_@*x_V`bl+?l1#kBzLCgulcF%O$8<~VQzPplEU*QBoS-NG*awlO%Ha@1a7 z0sn9|mzgndSidH4XIwz`PI3`Fvn=Ctd!q6C<}5aY*6 z1G1EcvM7hJCMQ|I9V>?|p+INb`i`?g#whq=@)Pgu@k(zp6bDK?cN|P$RoQN7M zb7x-hS^s8mh`MyF!tz|cGeg7cN7wV={`1pfDD(~TST^7S8?^$nFUYdAHy3WiN-8ij z>NO{Gk3yI~lB+5^^%3)~M=v$?nle*|byE2*0DtpTv&I@&Km}&-Syu7|K;1;290W@( zSvC@^b_-K5g_G}5S0X`|NjZT?(^DtD^lW!K9XD%hG)&*LbF=t@KbCGz zv0ig{hYJx=SF#$|wqH_XiC8NNt3pJNBE9&R%5}pTf4bDtEE@FccY3{2An~acY#!R=9PO*W&eEv z8SEpMi#dWv_n52%po8}z%QsX5bL4fQsHcFbIH4nEjOyYkatGI=TR@ff&umw^hx0WA`1PY} zOYQ7A^EU6R4>yk=(2K*hRtqqympiRbCt9~OiI27P>EwMPtI`f+m{KQQH#c$#A#c`lM<3DfFUw_#_S%m1SEiKjfcGi;KdJEJ#yfd8+$RL6P3 zE4(9zvreNtvpZ>#7c6~)P`5ui224HGo52NeeAG*sumhqNqHCPjHGcahtK)oR6F9rS zX4ubaLjhPUr_<(q9)>Z}8nvMtJ@h6xa%Y&*A3B*M4}hzDr-Rnko_V5Y(Diz;rQUhoKXA>IJ=!O}nn$^4|GVX1eu1ZYXG8p`<2~b=x#JIdk=ZnooAc@4J?3kv zllF%LR;EOT#j)&fU-SQk`t+AP zdI~0FE4hJ7ILL1yU;}^Sy?xt`Cm{mF2Z1S66f{WiAi{(T88$5Okc2>q4;?D3=uqNB ziWd)RY^ZfARi;C)dUa~G<5;v}m2yq%7HnCmVb{*A zO1G#+p;2|J@Y29<1;drw*0JHmaUuJ~TbE?y%WN}F=G=GhR?UY= zKcrdFGfvBe<*r_s`Y*xJiBU&3TY7eB*17>_#u}S3=&zhz^A=sXHqHOgXmiUhP8fLa z&A~CBCL0^}aGA|1Pe1;=d-S&@J3qe-UG!Yu;fvCKo&Dl(_kGnz=YG5~c*K9V$qZ5K5XM0V+%eEN zMa^&1i`5a-N`ak}&H#1Q z^gcCLG?cuN?({U$QfE3<+E8b0woqJ)bk$T+H|lW+ky_*iZ!nn)qIcl9dty*uxl|9&0wVC#|Y{S0x7FH02 zj`;AB;ck5FNlzMCSj#tG8}-5+<{RBlF}6_RyVVW4^_^?iPD~+5XIbH{f95Z1cDL?X z_l*Z{8*#T24m|W*W%nBFm$bfE9 zm%AMS+2uO2xh;Ltu~`7;MnMh|PJ#>Epb3wLKD_@piBT)8o(IKdK=}R6ah~g5=P0Pc zr>&2FcFSB0ZKpobt%im_^q~bqh{1D(uRk_SpvLr9zpmg9fI~DN)KXYPD;g1mE=y7p zHTcAqMN5h+JR$QKNR{&u(S0)PViPl=IyoW`j3}gE9F@gAPz|q&VHDrwrsX{7l~GlD zI>GElD6>S4j%|-aUYgMOJHfHgju2@O$tW`#d+o7}2c*>dzPJ!Ty0C&O>!Tk#S;;k$ zQi=S_+Pz-sMLJrHi~TDO8DlxZF|tyKW(*(}MJdP^VykbS1f?<;X}?o05_fP^Auk>H zOJMf0FeUt)D?tfMo>4J&FvJowGkC{8k<7*wHJRig*3DIX!4(uzhksrbw!?Sj%YS6=9zHRK@V z&MHfirInu?1?WtHR8+8LHK!L*9WHlT&U{gFn>q|66OTI3hDMa2AoOZoO=-}PE>ovl zOlT+{dRSrlEpSnUD^WR>#=ZhFncV-O1Vbe?FoSVih^ZR#|>QgorFt)y$AieBTo_rB=` z+Gg)3*<;H0tLzPCX^$IS0#_Eo5mse=+4nO56SZQW{BC~-DA%PD*s1!&BVILE;OaJ5 zrD%;NhOPTP4P!D-6HTy!`JMl4`)#88pu)xTFn-Bu|)k_YGZqmu;hN?~`; z#fVXY(Df^ELkL<)?huyKtuFs#cU)GF#%r{aQSy9gTw@V`P^ih%?tVv%W&>~8WGtp` zky#fKDAG1@PR{I`-ArW()47Q`!t+&`4CfY3`MQ*?GvivvXx3smv3&MPhCiIz|6ba- z_$9GY9oybH))vVic60b5`&lA3_T36iaO=oXJVb15Md2OjN z6IsA#+N_rS%-vfXThqlZ?s&RLOJPEqunqNfuc!TJWPkCOC{DAs0e0t4Bh<&yZZ>Sk ztsj`V4y0;itJO-#?q35;%0Cr0WNqEz5nox>f~$97&CJ<=0Xx>jqxQP{z-ZNWHH7r8 zcan9C>2N>O%7s=SA+i7KaF)HBs*2+)`#7%2?EV|z4E&hFB^~fTzm&}L4EZ;sOu)>x zn}_RF_rOJnx)}G_!tgD*iHm*eZpRm+M?UYe31>~Tx>biccP@v8?DG1gCYdQ||GhD%y%Jpao_peVQq0o>YZV$W$kt?*xI#**3xu6d)3qKC=Z?amXV4}XIW^-!UGuN z!!mm5oc-iMd!F$KmmjOQ9rVMa{L6kfSl%I5Q=*xqV^#EQhf^PMX_DN$gC{%XGyTRc zuRPCDzhS&;UFQG26J5f)W$0p`D%v(rU8`hV`v3uVXWZRf#dZ#44oMjK`MNiy#5OY4 zGjCa(tA4rl#cVB=k1X9c-}%qa|I_1*ZQotqCXkC_IuF{AM!A9w_TVostc|ivZ}-BB z@N(?`z|GzUtonGR{~qp`Jn!?M4DP~hl_EvTMyBHQkLcD+=0NP}+ArU5N`$U&_Ye>H zX0Gq_3jeBV$>fghc2LrQFTX5}hFI^bWN-#)5Px2<1c7SC7O3*PoB_F0*Oxp$BTY4&;m0I z0I5(8Pw)R>kVyfP?*Y|I_OK7p#4rk{@a_JG2X(NJ43Oz^5YQYD!S)Ugg%9wqkE!wt z=*p1iTx^r15E2uO(=N`ZmaGy7?-CX9>h=xo=1}#xuLB=36z__s0I?Kdarju!6)ZnI)hJIGGYVJK zFBZK~7K1MrO)ll$>iZh*{D$fMK+q6%F&a5h>VT{qwGq5BaJZ6=7K>Nt{6KAor0Fhf$Lz5iblfy-@HU@emayt`pPH@W`+p?eVjW@fc?j2^A3E z5DEWSjIS5laS+2J5UY_mmN1u4ZP9YD{_LhCMX%}fP{S}v9#wH86EP;GalY`e2J1{6 zK@H?=at$SF4;%6jITC^N>i`9h?C6Uj?NDLxhWAJ<0#8o;APb2Y?DanI*pf{YGtMf% ztoL4VeuNUJ5KI|WQUy{`atiJl0Wu?#QRooR+=}uX*Rlv75{K9dFI}R%lyW)V@eZwV z`~J!tff6nGP}-UhDucu=9WN;t?k0=qZ^)7OItwB55EupS{~*$r^l>1SE~F~wZ(vRf z7qb=Zh%PIWq@Zyg8FTDP@HJ5{^fpqnOtZOot@|(%HW$%$I(ne8Yft|q zzoa*PbIn>4{7Nm0?8pqS%U{XDU%I#K(EQ_u&wU8a-u?OFiAmNcf!&4)z@Hv6AeID&Ru}~(>XaKLX z^%4{(mD3p8^DKwXK9w*-ByxX9Z$Q%%`T!K}?(Z%k(=*pkCoix*G1Nmb@zTgsA@A`n zB2*2%j}42QF2+@eYyxzS92zG!6Z-3n#8p1duV~5>7RH!gzquU|;h zOy#si{p~wdO%uUWqp{3?Ov?&#&bf;)J&%o6GyL6v2icCFc|+c1jB?P zb;MQE^0s7COy^TBXEWbQOI1Vl$7=OHWpUJel1xJhOkC4bBeO^m^ytFyD4&qnl#Wfe z)E2{4K0~uw<$)_Z0uR-)lU(VVL3)qFBbppe9M61rh+;Z zh=3LJptDec%}!zV8`TM4Csj=kE-$kJxTcd`)eT@3R70u5WmRro{cu#hG6h9bT%itC zYt&@B1gdCD5_|MEPlr5_$>>g^75V=4ZHM+%&1`B_^)dM`WwDlH6;^I1wSc^qA5BOuk2Pi&4Kubkuel2h}(^S7}Gq z@(eh1`!zMimDP;qP@=c099UgBtZk7KZBeO%(X|_g6nmAIdmFZZ(U%R@_i8N{VJL8O zNAxGxwteX~EWxv8ZO?WQ_Y1>Pg~gZP9P}?K*eI+wK;ffvzjtZr(R)dj!i?8{L(<($ z_!`r9ipgtgk+^kNcYqByeuGPiYgdYAwc6ZPKihCx#gG4mTlgRQfJoc8hO^iPwb(tK zk#y*I_V{-17_@=k)kI79h5I;N1I}&{c!?L7hCek-J0pjoc#O#yk15sD()f@6j)_4y ziQkx%Q)rRKUFt>by$dB7LbGXYrQB4OPP`@IXjOuD0jC@_fr~SxhHkBmK(Pi zmvUiZ*mED1>u|VNt+rC5^GP{bc{-!FXw}wy4vUX@hIiR%{q~M6n3`iNV_MmCZzdaw z7?Rl;b|H3_dASz9IGANOjCshK4Y`tG^lLZKoxk~#=W=X4mxq72o`d&kg_U{-dLT2U zn-i{HWw@Q?%q4;MpdnX8Ftcuzwkq}Xh`Vxmi*f&ukJcO+y2fOgmM{9Uptqo7FK07X zQ$N;W0U9@HX>64dhcB~^!6$n2d74vsMRSs2jdbUpStl>;nG4xeRa%0H*(i4!fx`}_ zA3CH*(uKiPjT3mCKa{E4a(fC^pCNEVr+T#FOs0$alry;M{#GhmRUzZgj$b!!V_Gjw zdON$fN>OPNuB|8(vRWm!$Ab zV-!O4^kGr4vpM*vN13)2+Lce3ktwvak30WNHFqa%IcQ}S$sF6P_1YE*m!o%RU6C|5 zrB(9CvVTPx-ZHy3$4X5S5>@HiX&G?2n>xI&x$D~7#b^(Iy*Y1j8d6h8D?UoC%lEp0 zGpuoP;MiNTCE2hknP<}!6bTyq?z%9$kwO1@TVFEzmimsN7M<6wzA4VS^^$V=Q@rnc zI15+gJov2r8$jQCh*>vvrPry+7ql6%G8#Owf19LJoK&njmAf-v)f<||*PzuCnBjZ7 zG4-->4N8YxmysD(Gd8wO+)6F`w2LtJ*poocmz8tbwrAUz4KKKr(DC|o*zCH)+weED zT)r|qpI6*$xmupRd;~4I+8}$BZ@K@E8BRa|9LO!(mBISJCp&59y1$WI5<%L~;oPsK zC&@^7!&$d!G5e>3G@_Xkk#`(eAuL(r^~^a+og>|#nLDd{%gzxTpRb9Txm>r&8OMK) zw9RhK%Q>Y19T!a-X^}E_(+!>l8lR8+XGs@h3H+kx52{a`N+(^bamkW%{c5z_Iz_u{ zYEGkd8rIpj&7(DvMZL$Xmb`J@lxrHzH+{gj{8tNG$zk$jNi@`jxJ@)wP%jzqIKU72CPd*_&9njXvj72h_11hzb5iJw{zU zlUxH+#P=P>sU)ZEzUj68;d2UoF>+Y_K9m7J@Hd|A34bUndI>vy$^Bl39o(h$9te$F zP|rT^ecs;9HHhu|!~*+*n?C;Xo=zj3U-CQ2%B;oIF2+x5#+RM#H5 zllJWozQc7GrFB2)DPI5FfuGi8e%dXc-51^=6Fr;bo9mf>-lZG+sXf$*a(~;jq@mgR zufF%U9hA#v`Q6GQqd&Ee%S2S4)}&v)x4+zHJ;-C<-n}?BTQfxgfAZMQI}DX25nlErBJO{vsUfuG$+@v6QvT} z33hDSn_tg*b*OaePBw0VZhdRQCdim#Ti(T+^DjcbWcBi;xmN91w1Nv0c6>9j*%FWs zvjrSka^$>tHTVDZ4A^hn#-Z0f#@tr0Wv5+1gEsrR#AwK|FQd-vS#D?2TXRCERe{uWlmDP8T9~f}}8upoh;$asZbp-B~UtbEzN7H-bVbu_S&~XPJcp8T1 z9)qSCsNja{sTX2t2@=QNe!Yn}(09n;$0CQ>+1FuI2Qns^e;KAVBZ@I1NF#(d>UUpq zDXQ4wbpXP+qmMoIcjJHwp$DXt^!*3ilNFXY<%Sjx7Nm(MYI!7*N-k;Tl@od=nt5e9 z*cOtwNtpjse$0JICJNkfnc9b8GFT;fe=Z1JgK8d1B#S*dS)+}8U??Y_h;CM-TzT%P zqlb6m322~<5-J=DR3=Jkqd&^WrU!x=nyHtpVhLoGkcI~$kFEAOrjMO6HQK6gf*Rm* zqz;QKr>5E!X{oV}NN0ex{tDr#b3#k&kSV};shryh3+J*X&g!bQX^Ls3t$waLXt%&h z>a4Zf*7s?$wV`RJyE0KrtX{Icdg^pi`dZe#=rT!exao4croG-CJL!w~YAX|);35oh zUOCdsZno7)3)`8-BF67aU&=e~q_?VD@xrN1tS`f0#y7IVF{>P0yZ!2#p{5}l{P1M? z_N4#tseHK`G|ecBd{wSHPc^En0Vlk)xEVL?a-Ba5ytAAxavbftRX1#D(J~V{wWm>M zEmGOvlC<^FS97h`$silL>xvJyE%x1LquMjC;>kTX-79|$IM^v8y|>}}wf!^RdB40a z<2s*R@Ck5lOgI}XV|_T`RCC_);8v^qIOL(1&bOkHV_7oU1doki=h&_8I_iNvrFpl7 z>sfo>ko!J&&Xs$Oxy!q&Bzu=`w`_Z`qm$me$EY7~`sHfFnz`q)Q;#F?y%&FF^sT=< zev>sTPBHOsgFSA1pQ|YL!S90%K3sRjMe@y;GfV$%*Na|1^r@hE{oCA{yvMTuUhDrX z+*4h%;8iiGXefTPQ=b5lx4w5J4|e|h*#0z#o=i1mdgTLQ1j|=JX*Cdl&s$#gHn^G+ zLdk>H`_R!=Sil^fP;eBKVYsqqG#Hw&U~VE=(_khT{J}3|1Wa2BL)gQ_1yL*+#NiSJ z7pfx8FMT(JSrp^eL}h7jM?0LN#l~d75Aup@M=X!3q*%o+KCUipeBu>Z<-;{v@IlAJ zm;%rD!0)NCT_hyS2)(F81iCPe9kk;jSvbfca`1(Wq~u$gn5Qk8aflQNWXAv|NC1;z&moa+5a9qSUZRuH0!dcEXd+ zG0m1hAvUmd<7DSG!&$9dKGT)>{GlO9Q?41oYhGb|(d!nc&j7~okNd{H6oZ>CC51@{y%tR~_NVI*uL2hwZbR<@(4?gQ66YEkr2VM%BJl z>hxh@8BNnqZ*|zpX-vE6O^;f!dwW5aJ+J1kjwVT;5=<&nC)zk)2K0^SENGod zR!9m$siu|$W>7rg8i*dNiAq{Iy1U<(`1!xl=d!>p7A{q@gYiZG8$y`^2{8dA_< z*0AkKZ9`j$na198b^txwX|JfhT=7nf*}E<3;))-kniaOQ6)j{T>Q#?26r4$%r#dg{ zTj3JdwYZw@NU3;T^3~R&)a_hpQQO@lDF&^YW_PN)-LFMiieL2(n76N$<9)p+-$HHEzBn^)oX(q7$LzGT z1m>`Jg-crQRq&hVVB?{KlpS)k6BnbR`fgN6SVNm5F`*f2ILgLFDx9%NVy{KGl2Yzfk9|ztay@s(ZtikxS1iZ`lW#^ns^PW_t>YHAv%7m!yxqEBBiTa?Srf`cVOvL{!eK5~K#M7Y8P3KW!(!b_> zQ+-$YQ$nLr&CDayOt;<7R!!O2-@Y`Y3p!XdUs=Nr6Rn{~B=Hg>JeDb3_?H#7YXyt5 zzaCfhQ`z_Ki|;q%wXrY&L+M8LuC=uWPl~?}2f(h<;u6RV96- zn>YA(v0g4#p_Wk**Xwpk7Iwr9KIM<@rng*D`qFv#N}Ezst9}Nyj`Ou)HX}RdEH^ul z1C2(7d);SjZ#thNTX&OV80AiXdz=|1l&oj=blbEpM>Fllun#YPwmmz}hh^+zYjB`N zb$h=3esjjUTjq0ivYY{pq+(B;?=V-jmp#dh(`N@j7F?@ojC{&6j@lH2?LDtDo-A3jJdH79V_fzDNTHe|JWH z=|@=c8^wXEHhnYXfh8zY`H;Z4GZ2hKgPgYmJh-u)`d}3&b`nHMKlZ~I)i^zD3(8r4@MS|qmj8rj= z=(UR~$26eWiRCs*spF1bh=$(iVcY-ZG)qQ`YWG)G=QRNrgTh#iI~I@zn0SrnF&8B( z2w8@u(uC#8xSNO@+blf@T^K`B|a){W+)hzItEs%MRs_HtLp zh~Czb9TSy68J5ZfW>7ATWaNtUfgmo~+7kw}b4#A$g+jZJxj z!3A90nLdYGZMB)AIgFV}oH0m-(K&cCxtdSsOkW9&!xo&zNu8~DnzI>zcBglq^_S0i zlSMd`a1)c0S(RrglI|vU!MT}^7?LeXdBa(mvDtDgiJi1*WaZYH11XeIwwq)5kFzG8 zA84KI#e}>`mGRh$16nK#3ZMe{ooa}TVQ89z!F&#Rhx4a@)aIRQIYsR`pYiE?$BB1T zSA$x3oxvB5`kA3UiJ+#~pwGF2uh^d)YL^{EWp}xryq2Dp36Zynk#p%nyXd1-2$;J$ zq=3n4P`ZY*`IOb!gXI4vpY9njGgG5Bk(K_WQfA4H&e@^h<#pLKZSNPP-YI%f7fn%0 zrcueCi|M2o8fo>nrA(PyeLx&SilTjHe^g48k0@<2czEXLq9}=^2Fij`D5ozsdL904d7K)*m7_8EHh{+{Aa9E5C_f6EQqt#Wa8k%qBs({v-p76+{ zB{WOKM2IlONkgjbh@_%e>L8m;nLg`>HxeHpN*ikvF6g@4l& zP;`-(*qjtQuLN7Ky?Upgc4QT{PWh;<(5ap%xMU>SF#Afb*w>$($A1I+ZS`rd-O7rR zh+y<6v_TR>h~%r-+O0$BmKytd4hfYsTC0+}h^P{>g(!H7s*)bLu=x6QFL<*pQIiB| ziX^raVS1a8`AW7DqR6+a`lwY2tC`XhMOxZZQ+p`W7?|?~qE7pG3R|pKI;{Gdn=`6$ z75RB=2(1jJx5+xVmngByXs%KRo)#+*M`^4$tEa<}nv0vae%W)ig|yIbd(xoK3k#ZhHWn^ccV+X>ngRC zyS1_krm5ztZdbVS_>zMNh*;JoMV7Qmd$Dh-tUQZ@{pz{ZvWo90yo4ujhZ~K?d%Tak zz1VuJzZYN`)S)E_cj>%T0cz3;2D zH*36*E4ycEzlk}va;v-v`D%99zP)p!lSiDz@xXoymVf(z*#}`%62I7srz$u!{~Lqi zsHFM|yw2OZBO1OpjFxb@ymK07=*hnn9J%ura#st!*m#xHySL}l!sv^NI{Cp3ce@Rn zV+Q}*c+9KC%%!JA_MlS{!n5n3K1q7qN}F8vU8jhm&q|)o2*z~UZetvw`?PTq?0HLD ztsfP)|Cz6+skx9E#~B-c?rXt(?6%3f#pm;_#+ko1{G<2zxqPX?y!$ksdaT6D#tT@G z0m$#i^ zETxS+l-^6oL@dcf9J82usEd`!HGIr-s)Tr~vf0|a#VoK^49!IxeLXtBHN>$NinxK7 zz{q8g^E%GPjI6u7!~x7v<;l#=e8`Ok&!0?Aay-Y;%**bq%wjf7n@gdw3bO(nnqL2k zyRtmXwL7A9NJ9O@pIj-2^{l!^>Xg$;vUJC6<@|=79D;5ft{IHOub9uajLiKCsuL}% zugQZZ2B(Z_#2PKp0)5YjaA*`!Hq)7RXkB$=kFG@~RcuWb6wlSp)cJF$Z3x*c6{mb=M z^Bjvf5r(`gP=URKpsPe12o{5hqne1=73^gn`qL+nY-5Kn`*%=#;*O^W$V?jHq%;JZ=LXqAE!F<* z%60zZ`6TD|thui|=owv^=cwm<4%549-M%d7V*bm4&Xexcxo&>hXD-}~&b6m(!d%Qm zp3d1VuE|!bbOY|=TLR0}jpsY;&#s!`BuvTOZRZi*#pishCbj6cI;fO0-O`PR(D8k5 zi*y9uB(lk!wd>%~y2=VxTJ-GClMLpjj?v>f>*Yt(4xR0xyyK9L&o8x9(2lWDsd$GT z<>`B&WzN|3gyGt3MbCJ!Ax7?9eYak#>C7&pobIjp_~f!aWJv#f$yg`PC2DH?e(EjF zX_6k(|7=UoF5`Mhqfh+K!Wz;8Evc>R)T;dJ2Po~vIPC<_y@j0b8}HreJj2T@-OJwH z_8y;hOXS7*nFoWFd3{-sY+$hc-sXPqIM36RPChWtO5g08JWXqF7w!_M@F)9^rz-Lz zfAi*9tB47@%X#60UF}Mr&pz+x6d%h{9?t+-m=A;rdSb5 z{WkxYhQ6ZV+Wmb)A>V8BN}kKj&E2i9!Hz!C-;ba5E&c>P#i^zG5d6zzPU?2A{NgXt zqz<_RT;mh(sI)CA_MhGu+;+{b{O5n{Z{Nn&JO7TlimHG9@1OI4j<|N;>@Z%%$6nzV z2Kx`am1#o#QjNi!vi|$u{aT^@k^-f_kI)rP(R!6XX72BD{zd%iKl4Ieu+eVc=oYRg zJ@JsM`tk4CmOte;y#1}u^%D>KVP@^ZFDZR%{*Mp7)!k&S@A`Tl@~}V1`N>m#Th@=S zl8yc8y04-aYvkc7vbPUf%sHi8|LNPW{MV1+;Q#U>3-?am#=Uv`!nplky4NtC*&l9u dB0F>$%+Q!``W-K(2cD{~FZ#?X!%h(p06Xhg=yU)8 literal 0 HcmV?d00001 diff --git a/demo/resources/images/icon.svg b/demo/resources/images/icon.svg new file mode 100644 index 0000000..90eddd9 --- /dev/null +++ b/demo/resources/images/icon.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + diff --git a/demo/resources/images/image_sample.png b/demo/resources/images/image_sample.png new file mode 100644 index 0000000000000000000000000000000000000000..a3ac4f9f893bc2dd212ad29277a7259cee520bea GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK^4&aL977^n z-(E4~Vo=~YdZFgyzwmXdcdc%IsTM0IDzsq6vaHHUEt7vAdn|Y%|NqZ@^>vJl2l@W+ lZD3}4)4*V@aDa~k$YkU1O)+im-3YRQ!PC{xWt~$(697%~F8BZd literal 0 HcmV?d00001 diff --git a/demo/resources/images/image_sample@2x.png b/demo/resources/images/image_sample@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a58d1d9deea30053c132b0e6962000f86c15e83d GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf + + + + + + + + + + + + + diff --git a/demo/resources/images/mountain.svg b/demo/resources/images/mountain.svg new file mode 100644 index 0000000..0f907f5 --- /dev/null +++ b/demo/resources/images/mountain.svg @@ -0,0 +1,94 @@ + +image/svg+xml + + + + + + + + + + + + diff --git a/demo/resources/images/tile00.svg b/demo/resources/images/tile00.svg new file mode 100644 index 0000000..05cfd17 --- /dev/null +++ b/demo/resources/images/tile00.svg @@ -0,0 +1,65 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/demo/resources/images/tile00_50.png b/demo/resources/images/tile00_50.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c4ab18759c804665d5346cec56c33796646a04 GIT binary patch literal 1128 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 bf5B$$>VAB@(pvdvE&+^hnZrLCB4hspJV$*L literal 0 HcmV?d00001 diff --git a/demo/resources/images/tile01.svg b/demo/resources/images/tile01.svg new file mode 100644 index 0000000..2cbfa58 --- /dev/null +++ b/demo/resources/images/tile01.svg @@ -0,0 +1,65 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/demo/resources/images/tile01_50.png b/demo/resources/images/tile01_50.png new file mode 100644 index 0000000000000000000000000000000000000000..41a082d33d65cdaa8cfcc351c7d5545cbd81d9e8 GIT binary patch literal 1154 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 literal 0 HcmV?d00001 diff --git a/demo/resources/images/tile01_50@3x.png b/demo/resources/images/tile01_50@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..bff513ddd8a307d6f6e9d7763b2cc8376f0fef41 GIT binary patch literal 3549 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 Ch^h+! literal 0 HcmV?d00001 diff --git a/demo/resources/images/tile02.svg b/demo/resources/images/tile02.svg new file mode 100644 index 0000000..adeab52 --- /dev/null +++ b/demo/resources/images/tile02.svg @@ -0,0 +1,65 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/demo/resources/images/tile02_50.png b/demo/resources/images/tile02_50.png new file mode 100644 index 0000000000000000000000000000000000000000..f732632910a6b220baadd01fc36f41b2d1e7c4da GIT binary patch literal 1132 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 Hn8bep7il>Y literal 0 HcmV?d00001 diff --git a/demo/resources/images/tile02_50@3x.png b/demo/resources/images/tile02_50@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ba1aaece9488e851c0badebf02b4ae8d47cba59 GIT binary patch literal 3389 zcmbVP`7;y%8)mWVT3gQ0N(n7;=N58o5|ty1m0e5HI&vSecI7T~h}>5t?6U4_Ws{tt zq;1_-6pKZZJDE$1;JINcJCHP?fy4goAIK#%{DwK^!b;@A`oG(`m3_}&c+LHoP2 zgoK1Bdir1kFz5&FioX6H*{gbDEG)du<|anAp*brP51%02MZ4CS!LfJhzX+eW)?irp zroi^KB*HKnMc`*wnh{>&h%S%;N^>S&8$N+KUu0w|dH;loaih7dNg-#PZA^Xb8&WKw z?n15LXzVo}uMvxbxlDB2NI>LZ(7^uXp6roekEuVanI3~-gAXUSwI$E}f3W*z7s#eF z{@Rf>lr5BlehV2eR7~xKD=CAt-froDLzT!jeS1KH2Of?WC&>Q67Nt!LAl4$ljnEyX zV8JA(IKr9v@nG1qQmO+rl@P^p(8%%JMH|-UBCXGaHM4rZ1!o9CS!HT|5pG&A@# zInlMUyC@w@g{zJ5cvpDAiOrt$)@mF7NuM*pcJ)9+{6vZagp!b(CsIc_xyrUgE3B)+d&@aJy6v^Dnl6^sYz=! zSo{=QdDY>d4Ku2oiDbjraTcTTuty zLAS1rJ>}N{G9fq?Ev49hE*qt75=eLn84N2mm_7IadA9$qy0c_8+#!#QgH?Sb^EJD4 z9SpGtRj!pbG@X7{fP*!4aUQN!1`nt{WmKfefoRpd zOT1$)#`IX@u5y3Wf$a3d3OI4~DO0IkW+R9q2f8gBNhDL7`>Q5EnzvAP;(}kTAH!0GIny| z*0d9K%BDiIS`H*kR~K!Y@;l@8%;fagxDam- zn%E-)#6y>IZ$yEw=f7PE1eMpoyZ+9>;vZ0ZC8d$rA4W;lp7S` zOy^!`tr}qJpf0Yj&Ly+TU?K}z@oe|l2YJ2d)XlU*gXw%~039*hM=xFB5?hSx#K04J zQpUR59Tn!LN(6>as*^5M5!tX3QgA|iRq011)EQT7UcV3VjEXQ%xA|)($25aJv{ztc zOMX8Hn6446l}c=R03qU3CG`4r$inC|*Z*{HTv*=Eo7XtY2~hh&;32TFg0EA@WHf|0qP% zPmuvl(h?BPU~TIyJ4@Qg$%>Gg$=C`qFUbryZv^f@(6W# zztzNF0BNkD2Jv@U8d9*LmE33loy1COXv%AbDZNbyzhEVX=-S&q;vc`wZ2YOvZ~SF8 zq&qjjzBx5(<1vKmoWHyo{xX?fu*&bXYQq@c zLob&K2k_T=xOUX%yg-S2|GFF<(pj9cnes8p=U-D#)@KvSpKe*$BdR8J>`x)*W?S-D zZd`p3?1S#lu&(gI^-^E?MdCy@({qnF;s&`ZRC%%Kt{1#5^i)_c93d)_g>AD1~Z@9iCxqmg(7)_F=pIWXQ@$Kqp;@u7x>J|`h~O}Az(PEHDh*AubY^C zRLR}(PSr&JwvF0$NBeV->9$AF{9A*aG$p20d z8t%HUsd%IPUXXvxw!#gxZsNv}z!2m0pwxQy-GCY`3y|;rPCyEf_P{ z>=3P={u39!V#Y)`$+ta$G(|ed2J&j5lJOz!m)-9XMAk}^2~S0h6vcz)6)wb-3D9BBH^9;w!)Lvadv=4bo2vp^zb*Gpy zBoOvhtX*}YHZncX{+nANB)j~5Y{;PV6jDC2PE~lU!G=7w$leapm|{u6{Ir`mfBedb zr~uIip&e6F0q%y0T8vVvL{y29l>&2eS z_1ed;K>W2AgWPpoBSm(s+I2Q~1?}PJ8m9vv`_=?7oCp}`kWoB7EXMDK<#yMI98E| z`Ds;t|BxVxNJ&x$F#hI@O$Iw=O!&ST71;HW47*7xL5iRaweM=GV=X;H1%e%1>2mv6+)?b%C;Q*1nHZ?(G%M7d zxyM0^UzWw)1hc|LzD(9%;tO^8n%q6o+5sV^^vg(nbvC3Fj2hNerb|n=sHuWtT|~`z ztfk{POn8Xc$M*|rOCEDU%HE`HtF&8N3vdpct6|NKyU0J*9}4 + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/demo/resources/images/tile03_50.png b/demo/resources/images/tile03_50.png new file mode 100644 index 0000000000000000000000000000000000000000..5f5033419019162dd28261f70e980885f16887eb GIT binary patch literal 959 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 VuPf(}aQ`DgD5r~#EJR4|{{XDRjM4xA literal 0 HcmV?d00001 diff --git a/demo/resources/images/tile03_50@3x.png b/demo/resources/images/tile03_50@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0b8263718dcf151fdaf4584e32129b8176943345 GIT binary patch literal 2884 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 literal 0 HcmV?d00001 diff --git a/demo/resources/images/winds.png b/demo/resources/images/winds.png new file mode 100644 index 0000000000000000000000000000000000000000..0854fdd249dc29392c2becc59a767edfcc413132 GIT binary patch literal 18925 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 literal 0 HcmV?d00001 diff --git a/demo/resources/strings/ru.rui b/demo/resources/strings/ru.rui new file mode 100644 index 0000000..42ebcda --- /dev/null +++ b/demo/resources/strings/ru.rui @@ -0,0 +1,34 @@ +strings:ru { + "Text style" = "Стиль текста", + "View border" = "Рамка", + "Background image" = "Фоновое изображение", + "Controls" = "Контролы", + "Popups" = "Всплывающие окна", + "Filter" = "Фильтр", + "Clip" = "Обрезка", + "Transform" = "Трансформация", + "Key events" = "События клавиатуры", + "Mouse events" = "События мыши", + "Pointer events" = "События указателя", + "Touch events" = "События касания", + "Font name" = "Название шрифта", + "Text size" = "Размер текста", + "Text color" = "Цвет текста", + "Italic" = "Курсив", + "Strikethrough" = "Зачеркнутый", + "Overline" = "Подчеркнутый сверху", + "Underline" = "Подчеркнутый", + "Line style" = "Стиль линии", + "Line thickness" = "Толщина линии", + "Line color" = "Цвет линии", + "Twenty years from now you will be more disappointed by the things that you didn't do than by the ones you did do. So throw off the bowlines. Sail away from the safe harbor. Catch the trade winds in your sails. Explore. Dream. Discover." = + "Через 20 лет вы будете больше разочарованы теми вещами, которые вы не делали, чем теми, которые вы сделали. Так отчальте от тихой пристани. Почувствуйте попутный ветер в вашем парусе. Двигайтесь вперед, действуйте, открывайте!", + "Shadow" = "Тень", + "default" = "по умолчанию", + "Hello" = "Привет", + "Hello world!!!" = "Привет мир!!!", + "Yes" = "Да", + "No" = "Нет", + "Cancel" = "Отмена", + +} \ No newline at end of file diff --git a/demo/resources/themes/default.rui b/demo/resources/themes/default.rui new file mode 100644 index 0000000..963b85b --- /dev/null +++ b/demo/resources/themes/default.rui @@ -0,0 +1,88 @@ +theme { + colors = _{ + optionsBackground = #FFDDDDDD, + optionsTextColor = #FF000000, + }, + colors:dark = _{ + optionsBackground = #FF404040, + optionsTextColor = #FFDDDDDD, + }, + constants = _{ + optionsFont = sans-serif, + optionsTextSize = 10pt, + }, + styles = [ + demoPage { + width = 100%, + height = 100%, + cell-width = "1fr, auto", + }, + demoPanel { + width = 100%, + height = 100%, + orientation = horizontal, + }, + optionsPanel { + column = 1, + height = 100%, + width = auto, + background-color = @optionsBackground, + text-color = @optionsTextColor, + font = @optionsFont, + text-size = @optionsTextSize, + padding = 8px, + orientation = vertical, + }, + optionsTable { + grid-column-gap = 8px, + grid-row-gap = 8px, + cell-vertical-align = center, + }, + optionsLine { + padding = 8px, + orientation = horizontal, + vertical-align = center, + }, + transitionBar { + height = 24px, + background-color = #FF00DD00, + margin-top = 4px, + margin-bottom = 16px, + }, + header1 { + semantics = h1, + text-align = center, + margin-bottom = 0.5em, + }, + header2 { + semantics = h2, + text-align = center, + margin-bottom = 0.5em, + }, + paragraph { + semantics = p, + text-indent = 2em, + margin-bottom = 0.5em, + }, + tableHead1 { + background-color = #FFDDDDDD, + text-align = left, + table-vertical-align = top, + text-weight = normal, + italic = true, + border = _{ top = _{style = solid, color = black, width = 4px }, bottom = _{style = solid, color = black, width = 4px } }, + cell-border = _{ style = dashed, color = gray, width = 1px }, + cell-padding = 8px, + }, + tableHead2 { + + }, + tableFoot1 { + background-color = #FFfefbd8, + text-align = center, + text-weight = bold, + border = _{ top = _{style = solid, color = black, width = 2px }, bottom = _{style = solid, color = black, width = 4px } }, + cell-padding = 8px, + } + ], +} diff --git a/demo/splitViewDemo.go b/demo/splitViewDemo.go new file mode 100644 index 0000000..54f8981 --- /dev/null +++ b/demo/splitViewDemo.go @@ -0,0 +1,26 @@ +package main + +/* +import ( + "github.com/anoshenko/rui" +) + +const splitViewDemoText = ` +SplitView { + width = 100%, height = 100%, orientation = vertical, anchor = bottom, padding = 2px, + view1 = GridLayout { width = 100%, height = 75%, content = ["View 1"], cell-vertical-align = center, cell-horizontal-align = center, + border = _{ width = 1px, style = solid, color = #FF000000 }, radius = 8px,}, + view2 = GridLayout { width = 100%, height = 25%, content = ["View 2"], cell-align = center, + border = _{ width = 1px, style = solid, color = #FF000000 }, radius = 8px,}, +} +` + +func createSplitViewDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, splitViewDemoText) + if view == nil { + return nil + } + + return view +} +*/ diff --git a/demo/stackLayoutDemo.go b/demo/stackLayoutDemo.go new file mode 100644 index 0000000..e05d7e1 --- /dev/null +++ b/demo/stackLayoutDemo.go @@ -0,0 +1,95 @@ +package main + +import "github.com/anoshenko/rui" + +const stackLayoutDemoText = ` +GridLayout { + style = demoPage, + content = [ + StackLayout { + id = stackLayout, width = 100%, height = 100% + }, + ListLayout { + style = optionsPanel, + content = [ + GridLayout { + style = optionsTable, + content = [ + Button { row = 0, column = 0:1, id = pushRed, content = "Push red view" }, + Button { row = 1, column = 0:1, id = pushGreen, content = "Push green view" }, + Button { row = 2, column = 0:1, id = pushBlue, content = "Push blue view" }, + Button { row = 3, column = 0:1, id = popView, content = "Pop view" }, + TextView { row = 4, text = "Animation" }, + DropDownList { row = 4, column = 1, id = pushAnimation, current = 0, items = ["default", "start-to-end", "end-to-start", "top-down", "bottom-up"]}, + TextView { row = 5, text = "Timing" }, + DropDownList { row = 5, column = 1, id = pushTiming, current = 0, items = ["ease", "linear"]}, + TextView { row = 6, text = "Duration" }, + DropDownList { row = 6, column = 1, id = pushDuration, current = 0, items = ["0.5s", "1s", "2s"]}, + ] + } + ] + } + ] +} +` + +func createStackLayoutDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, stackLayoutDemoText) + if view == nil { + return nil + } + + animation := func() int { + return rui.GetDropDownCurrent(view, "pushAnimation") + } + + /* + transition := func() rui.ViewTransition { + timing := rui.EaseTiming + timings := []string{rui.EaseTiming, rui.LinearTiming} + if n := rui.GetDropDownCurrent(view, "pushTiming"); n >= 0 && n < len(timings) { + timing = timings[n] + } + + duration := float64(0.5) + durations := []float64{0.5, 1, 2} + if n := rui.GetDropDownCurrent(view, "pushDuration"); n >= 0 && n < len(durations) { + duration = durations[n] + } + + return rui.NewTransition(duration, timing, session) + } + */ + + rui.Set(view, "pushRed", rui.ClickEvent, func(_ rui.View) { + if stackLayout := rui.StackLayoutByID(view, "stackLayout"); stackLayout != nil { + if v := rui.CreateViewFromText(session, `View { background-color = red }`); v != nil { + stackLayout.Push(v, animation(), nil) + } + } + }) + + rui.Set(view, "pushGreen", rui.ClickEvent, func(_ rui.View) { + if stackLayout := rui.StackLayoutByID(view, "stackLayout"); stackLayout != nil { + if v := rui.CreateViewFromText(session, `View { background-color = green }`); v != nil { + stackLayout.Push(v, animation(), nil) + } + } + }) + + rui.Set(view, "pushBlue", rui.ClickEvent, func(_ rui.View) { + if stackLayout := rui.StackLayoutByID(view, "stackLayout"); stackLayout != nil { + if v := rui.CreateViewFromText(session, `View { background-color = blue }`); v != nil { + stackLayout.Push(v, animation(), nil) + } + } + }) + + rui.Set(view, "popView", rui.ClickEvent, func(_ rui.View) { + if stackLayout := rui.StackLayoutByID(view, "stackLayout"); stackLayout != nil { + stackLayout.Pop(animation(), nil) + } + }) + + return view +} diff --git a/demo/tableDemo.go b/demo/tableDemo.go new file mode 100644 index 0000000..188280f --- /dev/null +++ b/demo/tableDemo.go @@ -0,0 +1,206 @@ +package main + +import "github.com/anoshenko/rui" + +const tableViewDemoText = ` +GridLayout { + style = demoPage, + content = [ + ColumnLayout { + width = 100%, height = 100%, + content = TableView { + id = demoTableView1, margin = 24px, + } + }, + ListLayout { + style = optionsPanel, + content = [ + GridLayout { + style = optionsTable, + content = [ + TextView { row = 0, text = "Cell gap" }, + DropDownList { row = 0, column = 1, id = tableCellGap, current = 0, items = ["0", "2px"]}, + TextView { row = 1, text = "Table border" }, + DropDownList { row = 1, column = 1, id = tableBorder, current = 0, items = ["none", "solid black 1px", "4 colors"]}, + TextView { row = 2, text = "Cell border" }, + DropDownList { row = 2, column = 1, id = tableCellBorder, current = 0, items = ["none", "solid black 1px", "4 colors"]}, + TextView { row = 3, text = "Cell padding" }, + DropDownList { row = 3, column = 1, id = tableCellPadding, current = 0, items = ["default", "4px", "8px, 16px, 8px, 16px"]}, + TextView { row = 4, text = "Head style" }, + DropDownList { row = 4, column = 1, id = tableHeadStyle, current = 0, items = ["none", "tableHead1", "rui.Params"]}, + TextView { row = 5, text = "Foot style" }, + DropDownList { row = 5, column = 1, id = tableFootStyle, current = 0, items = ["none", "tableFoot1", "rui.Params"]}, + Checkbox { row = 6, column = 0:1, id = tableRowStyle, content = "Row style" }, + Checkbox { row = 7, column = 0:1, id = tableColumnStyle, content = "Column style" }, + ] + } + ] + } + ] +} +` + +func createTableViewDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, tableViewDemoText) + if view == nil { + return nil + } + + content := [][]interface{}{ + {"Cell content", "Cell value", rui.HorizontalTableJoin{}}, + {rui.VerticalTableJoin{}, "Type", "Value"}, + {"Text", "string", "Text"}, + {"Number", "int", 10}, + {rui.VerticalTableJoin{}, "float", 10.95}, + {"Boolean", "true", true}, + {rui.VerticalTableJoin{}, "false", false}, + {"Color", "red", rui.Red}, + {rui.VerticalTableJoin{}, "green", rui.Green}, + {rui.VerticalTableJoin{}, "yellow", rui.Yellow}, + {"View", "Button", rui.NewButton(session, rui.Params{ + rui.Content: "OK", + })}, + {"Foot line", rui.HorizontalTableJoin{}, rui.HorizontalTableJoin{}}, + } + + rui.SetParams(view, "demoTableView1", rui.Params{ + rui.Content: content, + rui.HeadHeight: 2, + rui.FootHeight: 1, + }) + + setBorder := func(borderTag string, number int) { + switch number { + case 1: + rui.Set(view, "demoTableView1", borderTag, rui.NewBorder(rui.Params{ + rui.Style: rui.SolidLine, + rui.ColorProperty: rui.Black, + rui.Width: rui.Px(1), + })) + + case 2: + rui.Set(view, "demoTableView1", borderTag, rui.NewBorder(rui.Params{ + rui.Style: rui.SolidLine, + rui.LeftColor: rui.Blue, + rui.RightColor: rui.Magenta, + rui.TopColor: rui.Red, + rui.BottomColor: rui.Green, + rui.Width: rui.Px(2), + })) + + default: + rui.Set(view, "demoTableView1", borderTag, nil) + } + } + + rui.Set(view, "tableCellGap", rui.DropDownEvent, func(list rui.DropDownList, number int) { + if number == 0 { + rui.Set(view, "demoTableView1", rui.Gap, rui.Px(0)) + } else { + rui.Set(view, "demoTableView1", rui.Gap, rui.Px(2)) + } + }) + + rui.Set(view, "tableBorder", rui.DropDownEvent, func(list rui.DropDownList, number int) { + setBorder(rui.Border, number) + }) + + rui.Set(view, "tableCellBorder", rui.DropDownEvent, func(list rui.DropDownList, number int) { + setBorder(rui.CellBorder, number) + }) + + rui.Set(view, "tableHeadStyle", rui.DropDownEvent, func(list rui.DropDownList, number int) { + switch number { + case 1: + rui.Set(view, "demoTableView1", rui.HeadStyle, "tableHead1") + + case 2: + rui.Set(view, "demoTableView1", rui.HeadStyle, rui.Params{ + rui.CellBorder: rui.NewBorder(rui.Params{ + rui.Style: rui.SolidLine, + rui.ColorProperty: rui.Green, + rui.Width: "2px", + }), + rui.CellPadding: "8px", + rui.BackgroundColor: rui.LightGrey, + }) + + default: + rui.Set(view, "demoTableView1", rui.HeadStyle, nil) + } + }) + + rui.Set(view, "tableFootStyle", rui.DropDownEvent, func(list rui.DropDownList, number int) { + switch number { + case 1: + rui.Set(view, "demoTableView1", rui.FootStyle, "tableFoot1") + + case 2: + rui.Set(view, "demoTableView1", rui.FootStyle, rui.Params{ + rui.Border: rui.NewBorder(rui.Params{ + rui.Style: rui.SolidLine, + rui.ColorProperty: rui.Black, + rui.Width: "2px", + }), + rui.CellPadding: "4px", + rui.BackgroundColor: rui.LightYellow, + }) + + default: + rui.Set(view, "demoTableView1", rui.FootStyle, nil) + } + }) + + rui.Set(view, "tableCellPadding", rui.DropDownEvent, func(list rui.DropDownList, number int) { + switch number { + case 1: + rui.Set(view, "demoTableView1", rui.CellPadding, rui.Px(4)) + + case 2: + rui.Set(view, "demoTableView1", rui.CellPadding, rui.Bounds{ + Left: rui.Px(16), + Right: rui.Px(16), + Top: rui.Px(8), + Bottom: rui.Px(8), + }) + + default: + rui.Set(view, "demoTableView1", rui.CellPadding, nil) + } + }) + + rui.Set(view, "tableRowStyle", rui.CheckboxChangedEvent, func(checked bool) { + if checked { + rui.Set(view, "demoTableView1", rui.RowStyle, []rui.Params{ + {rui.BackgroundColor: 0xffeaece5}, + {rui.BackgroundColor: 0xfff0efef}, + {rui.BackgroundColor: 0xffe0e2e4}, + {rui.BackgroundColor: 0xffbccad6}, + {rui.BackgroundColor: 0xffcfe0e8}, + {rui.BackgroundColor: 0xffb7d7e8}, + {rui.BackgroundColor: 0xffdaebe8}, + {rui.BackgroundColor: 0xfff1e3dd}, + {rui.BackgroundColor: 0xfffbefcc}, + {rui.BackgroundColor: 0xfffff2df}, + {rui.BackgroundColor: 0xffffeead}, + {rui.BackgroundColor: 0xfff2e394}, + }) + } else { + rui.Set(view, "demoTableView1", rui.RowStyle, nil) + } + }) + + rui.Set(view, "tableColumnStyle", rui.CheckboxChangedEvent, func(checked bool) { + if checked { + rui.Set(view, "demoTableView1", rui.ColumnStyle, []rui.Params{ + {rui.BackgroundColor: 0xffeaece5}, + {rui.BackgroundColor: 0xffdaebe8}, + {rui.BackgroundColor: 0xfff2e394}, + }) + } else { + rui.Set(view, "demoTableView1", rui.RowStyle, nil) + } + }) + + return view +} diff --git a/demo/tabsDemo.go b/demo/tabsDemo.go new file mode 100644 index 0000000..ce05659 --- /dev/null +++ b/demo/tabsDemo.go @@ -0,0 +1,48 @@ +package main + +import ( + "github.com/anoshenko/rui" +) + +const tabsDemoText = ` +GridLayout { + style = demoPage, + content = [ + TabsLayout { id = tabsLayout, width = 100%, height = 100%, tabs = top, + content = [ + View { width = 300px, height = 200px, background-color = #FFFF0000, title = "Red tab"}, + View { width = 400px, height = 250px, background-color = #FF00FF00, title = "Green tab"}, + View { width = 100px, height = 400px, background-color = #FF0000FF, title = "Blue tab"}, + View { width = 300px, height = 200px, background-color = #FF000000, title = "Black tab"}, + ] + }, + ListLayout { + style = optionsPanel, + content = [ + GridLayout { + style = optionsTable, + content = [ + TextView { row = 0, text = "Tabs location" }, + DropDownList { row = 0, column = 1, id = tabsTypeList, current = 1, + items = ["hidden", "top", "bottom", "left", "right", "left list", "right list"] + } + ] + } + ] + } + ] +} +` + +func createTabsDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, tabsDemoText) + if view == nil { + return nil + } + + rui.Set(view, "tabsTypeList", rui.DropDownEvent, func(list rui.DropDownList, number int) { + rui.Set(view, "tabsLayout", rui.Tabs, number) + }) + + return view +} diff --git a/demo/textStyle.go b/demo/textStyle.go new file mode 100644 index 0000000..1666381 --- /dev/null +++ b/demo/textStyle.go @@ -0,0 +1,143 @@ +package main + +import "github.com/anoshenko/rui" + +const textStyleDemoText = ` +GridLayout { + style = demoPage, + content = [ + GridLayout { + width = 100%, height = 100%, cell-vertical-align = center, cell-horizontal-align = center, + content = [ + TextView { + id = textStyleText, padding = 16px, max-width = 80%, + border = _{ style = solid, width = 1px, color = darkgray }, + text = "Twenty years from now you will be more disappointed by the things that you didn't do than by the ones you did do. So throw off the bowlines. Sail away from the safe harbor. Catch the trade winds in your sails. Explore. Dream. Discover." + } + ] + }, + ListLayout { + style = optionsPanel, + content = [ + GridLayout { + style = optionsTable, + content = [ + TextView { row = 0, text = "Font name" }, + DropDownList { row = 0, column = 1, id = textStyleFont, current = 0, items = ["default", "serif", "sans-serif", "\"Courier new\", monospace", "cursive", "fantasy"]}, + TextView { row = 1, text = "Text size" }, + DropDownList { row = 1, column = 1, id = textStyleSize, current = 0, items = ["1em", "14pt", "12px", "1.5em"]}, + TextView { row = 2, text = "Text color" }, + ColorPicker { row = 2, column = 1, id = textStyleColor }, + TextView { row = 3, text = "Text weight" }, + DropDownList { row = 3, column = 1, id = textStyleWeight, current = 0, items = ["default", "thin", "extra-light", "light", "normal", "medium", "semi-bold", "bold", "extra-bold", "black"]}, + Checkbox { row = 4, column = 0:1, id = textStyleItalic, content = "Italic" }, + Checkbox { row = 5, column = 0:1, id = textStyleSmallCaps, content = "Small-caps" }, + Checkbox { row = 6, column = 0:1, id = textStyleStrikethrough, content = "Strikethrough" }, + Checkbox { row = 7, column = 0:1, id = textStyleOverline, content = "Overline" }, + Checkbox { row = 8, column = 0:1, id = textStyleUnderline, content = "Underline" }, + TextView { row = 9, text = "Line style" }, + DropDownList { row = 9, column = 1, id = textStyleLineStyle, current = 0, items = ["default", "solid", "dashed", "dotted", "double", "wavy"]}, + TextView { row = 10, text = "Line thickness" }, + DropDownList { row = 10, column = 1, id = textStyleLineThickness, current = 0, items = ["default", "1px", "1.5px", "2px", "3px", "4px"]}, + TextView { row = 11, text = "Line color" }, + ColorPicker { row = 11, column = 1, id = textStyleLineColor }, + TextView { row = 12, text = "Shadow" }, + DropDownList { row = 12, column = 1, id = textStyleShadow, current = 0, items = ["none", "gray, (x, y)=(1px, 1px), blur=0", "blue, (x, y)=(-2px, -2px), blur=1", "green, (x, y)=(0px, 0px), blur=3px"]}, + ] + } + ] + } + ] +} +` + +func createTextStyleDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, textStyleDemoText) + if view == nil { + return nil + } + + rui.Set(view, "textStyleFont", rui.DropDownEvent, func(number int) { + fonts := []string{"", "serif", "sans-serif", "\"Courier new\", monospace", "cursive", "fantasy"} + if number > 0 && number < len(fonts) { + rui.Set(view, "textStyleText", rui.FontName, fonts[number]) + } else { + rui.Set(view, "textStyleText", rui.FontName, nil) + } + }) + + rui.Set(view, "textStyleSize", rui.DropDownEvent, func(number int) { + sizes := []string{"1em", "14pt", "12px", "1.5em"} + if number >= 0 && number < len(sizes) { + rui.Set(view, "textStyleText", rui.TextSize, sizes[number]) + } + }) + + rui.Set(view, "textStyleColor", rui.ColorChangedEvent, func(color rui.Color) { + rui.Set(view, "textStyleText", rui.TextColor, color) + }) + + rui.Set(view, "textStyleWeight", rui.DropDownEvent, func(number int) { + rui.Set(view, "textStyleText", rui.TextWeight, number) + }) + + rui.Set(view, "textStyleItalic", rui.CheckboxChangedEvent, func(state bool) { + rui.Set(view, "textStyleText", rui.Italic, state) + }) + + rui.Set(view, "textStyleSmallCaps", rui.CheckboxChangedEvent, func(state bool) { + rui.Set(view, "textStyleText", rui.SmallCaps, state) + }) + + rui.Set(view, "textStyleStrikethrough", rui.CheckboxChangedEvent, func(state bool) { + rui.Set(view, "textStyleText", rui.Strikethrough, state) + }) + + rui.Set(view, "textStyleOverline", rui.CheckboxChangedEvent, func(state bool) { + rui.Set(view, "textStyleText", rui.Overline, state) + }) + + rui.Set(view, "textStyleUnderline", rui.CheckboxChangedEvent, func(state bool) { + rui.Set(view, "textStyleText", rui.Underline, state) + }) + + rui.Set(view, "textStyleLineStyle", rui.DropDownEvent, func(number int) { + styles := []string{"inherit", "solid", "dashed", "dotted", "double", "wavy"} + if number > 0 && number < len(styles) { + rui.Set(view, "textStyleText", rui.TextLineStyle, styles[number]) + } else { + rui.Set(view, "textStyleText", rui.TextLineStyle, nil) + } + }) + + rui.Set(view, "textStyleLineThickness", rui.DropDownEvent, func(number int) { + sizes := []string{"", "1px", "1.5px", "2px", "3px", "4px"} + if number > 0 && number < len(sizes) { + rui.Set(view, "textStyleText", rui.TextLineThickness, sizes[number]) + } else { + rui.Set(view, "textStyleText", rui.TextLineThickness, nil) + } + }) + + rui.Set(view, "textStyleLineColor", rui.ColorChangedEvent, func(color rui.Color) { + rui.Set(view, "textStyleText", rui.TextLineColor, color) + }) + + rui.Set(view, "textStyleShadow", rui.DropDownEvent, func(number int) { + switch number { + case 0: + rui.Set(view, "textStyleText", rui.TextShadow, nil) + + case 1: + rui.Set(view, "textStyleText", rui.TextShadow, rui.NewTextShadow(rui.Px(1), rui.Px(1), rui.Px(0), rui.Gray)) + + case 2: + rui.Set(view, "textStyleText", rui.TextShadow, rui.NewTextShadow(rui.Px(-2), rui.Px(-2), rui.Px(1), rui.Blue)) + + case 3: + rui.Set(view, "textStyleText", rui.TextShadow, rui.NewTextShadow(rui.Px(0), rui.Px(0), rui.Px(3), rui.Green)) + } + }) + + return view +} diff --git a/demo/touchEventsDemo.go b/demo/touchEventsDemo.go new file mode 100644 index 0000000..0fec7c3 --- /dev/null +++ b/demo/touchEventsDemo.go @@ -0,0 +1,122 @@ +package main + +import ( + "fmt" + "strconv" + "strings" + + "github.com/anoshenko/rui" +) + +const touchEventsDemoText = ` +GridLayout { + width = 100%, height = 100%, cell-height = "1fr, auto", + content = [ + GridLayout { + padding = 12px, + content = [ + GridLayout { + id = touchEventsTest, cell-horizontal-align = center, cell-vertical-align = center, + height = 150%, + border = _{ style = solid, width = 1px, color = gray}, + content = [ + TextView { + id = touchEventsText, text = "Test box", + } + ] + } + ], + }, + Resizable { + row = 1, side = top, background-color = lightgrey, height = 300px, + content = EditView { + id = touchEventsLog, type = multiline, read-only = true, wrap = true, + } + }, + ] +} +` + +func createTouchEventsDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, touchEventsDemoText) + if view == nil { + return nil + } + + addToLog := func(tag string, event rui.TouchEvent) { + var buffer strings.Builder + + appendBool := func(name string, value bool) { + buffer.WriteString(`, `) + buffer.WriteString(name) + if value { + buffer.WriteString(` = true`) + } else { + buffer.WriteString(` = false`) + } + } + + /* + appendInt := func(name string, value int) { + buffer.WriteString(`, `) + buffer.WriteString(name) + buffer.WriteString(` = `) + buffer.WriteString(strconv.Itoa(value)) + }*/ + + appendFloat := func(name string, value float64) { + buffer.WriteString(fmt.Sprintf(`, %s = %g`, name, value)) + } + + appendPoint := func(name string, x, y float64) { + buffer.WriteString(fmt.Sprintf(`, %s = (%g:%g)`, name, x, y)) + } + + buffer.WriteString(tag) + buffer.WriteString(`: TimeStamp = `) + buffer.WriteString(strconv.FormatUint(event.TimeStamp, 10)) + + buffer.WriteString(`, touches = [`) + for i, touch := range event.Touches { + if i > 0 { + buffer.WriteString(`, `) + } + buffer.WriteString(`{ Identifier = `) + buffer.WriteString(strconv.Itoa(touch.Identifier)) + appendPoint("(X:Y)", touch.X, touch.Y) + appendPoint("Client (X:Y)", touch.ClientX, touch.ClientY) + appendPoint("Screen (X:Y)", touch.ScreenX, touch.ScreenY) + appendPoint("Radius (X:Y)", touch.RadiusX, touch.RadiusY) + appendFloat("RotationAngle", touch.RotationAngle) + appendFloat("Force", touch.Force) + buffer.WriteString(`}`) + } + buffer.WriteString(`]`) + + appendBool("CtrlKey", event.CtrlKey) + appendBool("ShiftKey", event.ShiftKey) + appendBool("AltKey", event.AltKey) + appendBool("MetaKey", event.MetaKey) + buffer.WriteString(";\n\n") + + rui.AppendEditText(view, "touchEventsLog", buffer.String()) + rui.ScrollViewToEnd(view, "touchEventsLog") + } + + rui.SetParams(view, "touchEventsTest", rui.Params{ + rui.TouchStart: func(v rui.View, event rui.TouchEvent) { + addToLog("touch-start", event) + }, + rui.TouchEnd: func(v rui.View, event rui.TouchEvent) { + addToLog("touch-end", event) + }, + rui.TouchCancel: func(v rui.View, event rui.TouchEvent) { + addToLog("touch-cancel", event) + }, + rui.TouchMove: func(v rui.View, event rui.TouchEvent) { + addToLog("touch-move", event) + }, + }) + + return view +} diff --git a/demo/transformDemo.go b/demo/transformDemo.go new file mode 100644 index 0000000..8c92495 --- /dev/null +++ b/demo/transformDemo.go @@ -0,0 +1,361 @@ +package main + +import ( + "fmt" + + "github.com/anoshenko/rui" +) + +const transformDemoText = ` +GridLayout { + style = demoPage, + content = [ + GridLayout { + id = listLayout, width = 100%, height = 100%, cell-horizontal-align = center, cell-vertical-align = center, + content = [ + TextView { id = transformView, width = 200px, height = 100px, + text = "View", text-align = center, text-size = 32pt, + background-color = #FFBBBBBB, radius = 8px, padding = 8px, margin = 4px, + border = _{ style = solid, width = 1px, color = #FF000080 }, + shadow = _{ spread-radius = 1px, blur = 16px, color = #80000000}, + }, + ] + }, + ListLayout { + style = optionsPanel, + content = [ + "Perspective", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = PerspectiveEditor, type = slider, width = 120px, + min = -500, max = 500, step = 10, value = 0 + }, + TextView { + id = PerspectiveValue, text = "0px", margin-left = 12px, width = 32px + } + ] + }, + "Perspective origin X (pixels)", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = xPerspectiveOriginEditor, type = slider, width = 120px, + min = -1000, max = 1000, step = 10, value = 0 + }, + TextView { + id = xPerspectiveOriginValue, text = "0px", margin-left = 12px, width = 32px + } + ] + }, + "Perspective origin Y (pixels)", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = yPerspectiveOriginEditor, type = slider, width = 120px, + min = -1000, max = 1000, step = 10, value = 0 + }, + TextView { + id = yPerspectiveOriginValue, text = "0px", margin-left = 12px, width = 32px + } + ] + }, + "Origin X (pixels)", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = xOriginEditor, type = slider, width = 120px, + min = -1000, max = 1000, step = 10, value = 0 + }, + TextView { + id = xOriginValue, text = "0px", margin-left = 12px, width = 32px + } + ] + }, + "Origin Y (pixels)", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = yOriginEditor, type = slider, width = 120px, + min = -1000, max = 1000, step = 10, value = 0 + }, + TextView { + id = yOriginValue, text = "0px", margin-left = 12px, width = 32px + } + ] + }, + "Origin Z (pixels)", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = zOriginEditor, type = slider, width = 120px, + min = -1000, max = 1000, step = 10, value = 0 + }, + TextView { + id = zOriginValue, text = "0px", margin-left = 12px, width = 32px + } + ] + }, + "Translate X (pixels)", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = xTranslateEditor, type = slider, width = 120px, + min = -100, max = 100, step = 1, value = 0 + }, + TextView { + id = xTranslateValue, text = "0px", margin-left = 12px, width = 32px + } + ] + }, + "Translate Y (pixels)", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = yTranslateEditor, type = slider, width = 120px, + min = -100, max = 100, step = 1, value = 0 + }, + TextView { + id = yTranslateValue, text = "0px", margin-left = 12px, width = 32px + } + ] + }, + "Translate Z (pixels)", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = zTranslateEditor, type = slider, width = 120px, + min = -100, max = 100, step = 1, value = 0 + }, + TextView { + id = zTranslateValue, text = "0px", margin-left = 12px, width = 32px + } + ] + }, + "Scale X", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = xScaleEditor, type = slider, width = 120px, + min = -5, max = 5, step = 0.1, value = 1 + }, + TextView { + id = xScaleValue, text = "1", margin-left = 12px, width = 32px + } + ] + }, + "Scale Y", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = yScaleEditor, type = slider, width = 120px, + min = -5, max = 5, step = 0.1, value = 1 + }, + TextView { + id = yScaleValue, text = "1", margin-left = 12px, width = 32px + } + ] + }, + "Scale Z", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = zScaleEditor, type = slider, width = 120px, + min = -5, max = 5, step = 0.1, value = 1 + }, + TextView { + id = zScaleValue, text = "1", margin-left = 12px, width = 32px + } + ] + }, + "Skew X (degree)", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = xSkewEditor, type = slider, width = 120px, + min = -90, max = 90, step = 1, value = 0 + }, + TextView { + id = xSkewValue, text = "0°", margin-left = 12px, width = 32px + } + ] + }, + "Skew Y (degree)", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = ySkewEditor, type = slider, width = 120px, + min = -90, max = 90, step = 1, value = 0 + }, + TextView { + id = ySkewValue, text = "0°", margin-left = 12px, width = 32px + } + ] + }, + "Rotate (degree)", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = RotateEditor, type = slider, width = 120px, + min = -180, max = 180, step = 1, value = 0 + }, + TextView { + id = RotateValue, text = "0°", margin-left = 12px, width = 32px + } + ] + }, + "Rotate X", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = xRotateEditor, type = slider, width = 120px, + min = 0, max = 1, step = 0.01, value = 1 + }, + TextView { + id = xRotateValue, text = "1", margin-left = 12px, width = 32px + } + ] + }, + "Rotate Y", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = yRotateEditor, type = slider, width = 120px, + min = 0, max = 1, step = 0.01, value = 1 + }, + TextView { + id = yRotateValue, text = "1", margin-left = 12px, width = 32px + } + ] + }, + "Rotate Z", + ListLayout { + margin-bottom = 12px, orientation = horizontal, vertical-align = center, + content = [ + NumberPicker { id = zRotateEditor, type = slider, width = 120px, + min = 0, max = 1, step = 0.01, value = 1 + }, + TextView { + id = zRotateValue, text = "1", margin-left = 12px, width = 32px + } + ] + }, + Checkbox { id = backfaceVisibility, content = "backface-visibility", checked = true } + ] + } + ] +}` + +func transformDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, transformDemoText) + if view == nil { + return nil + } + + // transform := rui.NewTransform(view.Session()) + + transformView := rui.ViewByID(view, "transformView") + if transformView == nil { + return view + } + + updateSliderText := func(tag string, value float64, unit string) { + rui.Set(view, tag, rui.Text, fmt.Sprintf("%g%s", value, unit)) + } + + rui.Set(view, "PerspectiveEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.Perspective, rui.Px(newValue)) + updateSliderText("PerspectiveValue", newValue, "px") + }) + + rui.Set(view, "xPerspectiveOriginEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.PerspectiveOriginX, rui.Px(newValue)) + updateSliderText("xPerspectiveOriginValue", newValue, "px") + }) + + rui.Set(view, "yPerspectiveOriginEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.PerspectiveOriginY, rui.Px(newValue)) + updateSliderText("yPerspectiveOriginValue", newValue, "px") + }) + + rui.Set(view, "xOriginEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.OriginX, rui.Px(newValue)) + updateSliderText("xOriginValue", newValue, "px") + }) + + rui.Set(view, "yOriginEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.OriginY, rui.Px(newValue)) + updateSliderText("yOriginValue", newValue, "px") + }) + + rui.Set(view, "zOriginEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.OriginZ, rui.Px(newValue)) + updateSliderText("zOriginValue", newValue, "px") + }) + + rui.Set(view, "xTranslateEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.TranslateX, rui.Px(newValue)) + updateSliderText("xTranslateValue", newValue, "px") + }) + + rui.Set(view, "yTranslateEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.TranslateY, rui.Px(newValue)) + updateSliderText("yTranslateValue", newValue, "px") + }) + + rui.Set(view, "zTranslateEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.TranslateZ, rui.Px(newValue)) + updateSliderText("zTranslateValue", newValue, "px") + }) + + rui.Set(view, "xScaleEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.ScaleX, newValue) + updateSliderText("xScaleValue", newValue, "") + }) + + rui.Set(view, "yScaleEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.ScaleY, newValue) + updateSliderText("yScaleValue", newValue, "") + }) + + rui.Set(view, "zScaleEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.ScaleZ, newValue) + updateSliderText("zScaleValue", newValue, "") + }) + + rui.Set(view, "RotateEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.Rotate, rui.Deg(newValue)) + updateSliderText("RotateValue", newValue, "°") + }) + + rui.Set(view, "xRotateEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.RotateX, newValue) + updateSliderText("xRotateValue", newValue, "") + }) + + rui.Set(view, "yRotateEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.RotateY, newValue) + updateSliderText("yRotateValue", newValue, "") + }) + + rui.Set(view, "zRotateEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.RotateZ, newValue) + updateSliderText("zRotateValue", newValue, "") + }) + + rui.Set(view, "xSkewEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.SkewX, rui.Deg(newValue)) + updateSliderText("xSkewValue", newValue, "°") + }) + + rui.Set(view, "ySkewEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { + transformView.Set(rui.SkewY, rui.Deg(newValue)) + updateSliderText("ySkewValue", newValue, "°") + }) + + rui.Set(view, "backfaceVisibility", rui.CheckboxChangedEvent, func(checkbox rui.Checkbox, checked bool) { + transformView.Set(rui.BackfaceVisible, checked) + }) + + return view +} diff --git a/demo/transitionDemo.go b/demo/transitionDemo.go new file mode 100644 index 0000000..5ac91fc --- /dev/null +++ b/demo/transitionDemo.go @@ -0,0 +1,70 @@ +package main + +import ( + "github.com/anoshenko/rui" +) + +const transitionDemoText = ` +ListLayout { + width = 100%, height = 100%, orientation = vertical, padding = 12px, + content = [ + "ease", + View { id = bar1, width = 20%, style = transitionBar }, + "ease-in", + View { id = bar2, width = 20%, style = transitionBar }, + "ease-out", + View { id = bar3, width = 20%, style = transitionBar }, + "ease-in-out", + View { id = bar4, width = 20%, style = transitionBar }, + "linear", + View { id = bar5, width = 20%, style = transitionBar }, + "steps(5)", + View { id = bar6, width = 20%, style = transitionBar }, + "cubic-bezier(0.1, -0.6, 0.2, 0)", + View { id = bar7, width = 20%, style = transitionBar }, + Button { id = startTransition, content = "Start" } + ] +}` + +func createTransitionDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, transitionDemoText) + if view == nil { + return nil + } + + bars := map[string]string{ + "bar1": rui.EaseTiming, + "bar2": rui.EaseInTiming, + "bar3": rui.EaseOutTiming, + "bar4": rui.EaseInOutTiming, + "bar5": rui.LinearTiming, + "bar6": rui.StepsTiming(5), + "bar7": rui.CubicBezierTiming(0.1, -0.6, 0.2, 0), + } + + rui.Set(view, "startTransition", rui.ClickEvent, func(button rui.View) { + for id, timing := range bars { + if bar := rui.ViewByID(view, id); bar != nil { + if rui.GetWidth(bar, "").Value == 100 { + bar.SetAnimated(rui.Width, rui.Percent(20), rui.Animation{ + Duration: 2, + TimingFunction: timing, + }) + } else { + bar.SetAnimated(rui.Width, rui.Percent(100), rui.Animation{ + Duration: 2, + TimingFunction: timing, + FinishListener: rui.AnimationFinishedFunc(func(v rui.View, tag string) { + bar.SetAnimated(rui.Width, rui.Percent(20), rui.Animation{ + Duration: 2, + TimingFunction: bars[v.ID()], + }) + }), + }) + } + } + } + }) + + return view +} diff --git a/demo/videoPlayerDemo.go b/demo/videoPlayerDemo.go new file mode 100644 index 0000000..d85a319 --- /dev/null +++ b/demo/videoPlayerDemo.go @@ -0,0 +1,152 @@ +package main + +import ( + "fmt" + + "github.com/anoshenko/rui" +) + +const videoPlayerDemoText = ` +GridLayout { + cell-height = "auto, 1fr, auto, auto", width = 100%, height = 100%, + content = [ + ListLayout { + row = 0, orientation = start-to-end, padding = 4px, + content = [ + Checkbox { + id = showVideoPlayerControls, content = "Controls" + }, + Checkbox { + id = showVideoPlayerLoop, content = "Loop" + }, + Checkbox { + id = showVideoPlayerMuted, content = "Muted" + }, + ], + }, + GridLayout { + row = 1, id = videoPlayerContainer, + content = VideoPlayer { + id = videoPlayer, src = "https://alxanosoft.com/testVideo.mp4", video-width = 320, + }, + }, + ListLayout { + row = 2, orientation = start-to-end, vertical-align = top, padding = 8px, + content = [ + NumberPicker { + id = videoPlayerSlider, width = 200px, type = slider + } + Button { + id = videoPlayerPlay, content = "Play", margin-left = 16px + } + ] + }, + Resizable { + row = 3, side = top, background-color = lightgrey, height = 200px, + content = EditView { + id = videoPlayerEventsLog, type = multiline, read-only = true, wrap = true, + } + }, + ] +}` + +var videoPlayerPause = true + +func createVideoPlayerDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, videoPlayerDemoText) + if view == nil { + return nil + } + + createListener := func(event string) func() { + return func() { + rui.AppendEditText(view, "videoPlayerEventsLog", event+"\n") + rui.ScrollViewToEnd(view, "videoPlayerEventsLog") + } + } + createListener2 := func(event string) func(value float64) { + return func(value float64) { + rui.AppendEditText(view, "videoPlayerEventsLog", fmt.Sprintf("%s: %g\n", event, value)) + rui.ScrollViewToEnd(view, "videoPlayerEventsLog") + } + } + + rui.Set(view, "videoPlayerContainer", rui.ResizeEvent, func(frame rui.Frame) { + rui.Set(view, "videoPlayer", rui.VideoWidth, frame.Width) + rui.Set(view, "videoPlayer", rui.VideoHeight, frame.Height) + }) + + rui.Set(view, "showVideoPlayerControls", rui.CheckboxChangedEvent, func(state bool) { + rui.Set(view, "videoPlayer", rui.Controls, state) + }) + + rui.Set(view, "showVideoPlayerLoop", rui.CheckboxChangedEvent, func(state bool) { + rui.Set(view, "videoPlayer", rui.Loop, state) + }) + + rui.Set(view, "showVideoPlayerMuted", rui.CheckboxChangedEvent, func(state bool) { + rui.Set(view, "videoPlayer", rui.Muted, state) + }) + + for _, event := range []string{rui.AbortEvent, rui.CanPlayEvent, rui.CanPlayThroughEvent, + rui.CompleteEvent, rui.EmptiedEvent, rui.EndedEvent, rui.LoadStartEvent, + rui.LoadedMetadataEvent, rui.PlayingEvent, rui.SeekedEvent, rui.SeekingEvent, + rui.StalledEvent, rui.SuspendEvent, rui.WaitingEvent} { + + rui.Set(view, "videoPlayer", event, createListener(event)) + } + + for _, event := range []string{rui.DurationChangedEvent, rui.RateChangedEvent, rui.VolumeChangedEvent} { + + rui.Set(view, "videoPlayer", event, createListener2(event)) + } + + rui.Set(view, "videoPlayer", rui.PlayEvent, func() { + rui.AppendEditText(view, "videoPlayerEventsLog", "play-event\n") + rui.ScrollViewToEnd(view, "videoPlayerEventsLog") + rui.Set(view, "videoPlayerPlay", rui.Content, "Pause") + videoPlayerPause = false + }) + + rui.Set(view, "videoPlayer", rui.PauseEvent, func() { + rui.AppendEditText(view, "videoPlayerEventsLog", "pause-event\n") + rui.ScrollViewToEnd(view, "videoPlayerEventsLog") + rui.Set(view, "videoPlayerPlay", rui.Content, "Play") + videoPlayerPause = true + }) + + rui.Set(view, "videoPlayer", rui.LoadedDataEvent, func() { + rui.AppendEditText(view, "videoPlayerEventsLog", "loaded-data-event\n") + rui.ScrollViewToEnd(view, "videoPlayerEventsLog") + rui.Set(view, "videoPlayerSlider", rui.Max, rui.MediaPlayerDuration(view, "videoPlayer")) + }) + + rui.Set(view, "videoPlayer", rui.TimeUpdateEvent, func(time float64) { + rui.AppendEditText(view, "videoPlayerEventsLog", fmt.Sprintf("time-update-event %gs\n", time)) + rui.ScrollViewToEnd(view, "videoPlayerEventsLog") + rui.Set(view, "videoPlayerSlider", rui.Value, time) + }) + + rui.Set(view, "vodeoPlayer", rui.PlayerErrorEvent, func(code int, message string) { + rui.AppendEditText(view, "vodeoPlayerEventsLog", fmt.Sprintf("player-error-event: code = %d, message = '%s'\n", code, message)) + rui.ScrollViewToEnd(view, "vodeoPlayerEventsLog") + }) + + rui.Set(view, "videoPlayerPlay", rui.ClickEvent, func() { + if videoPlayerPause { + rui.MediaPlayerPlay(view, "videoPlayer") + } else { + rui.MediaPlayerPause(view, "videoPlayer") + } + }) + + rui.Set(view, "videoPlayerSlider", rui.NumberChangedEvent, func(value float64) { + if videoPlayerPause { + rui.SetMediaPlayerCurrentTime(view, "videoPlayer", value) + } + }) + + return view +} + +//MAH00054.MP4 diff --git a/demo/viewDemo.go b/demo/viewDemo.go new file mode 100644 index 0000000..16cf070 --- /dev/null +++ b/demo/viewDemo.go @@ -0,0 +1,116 @@ +package main + +import ( + "github.com/anoshenko/rui" +) + +const viewDemoText = ` +GridLayout { + style = demoPage, + content = [ + GridLayout { + width = 100%, height = 100%, cell-vertical-align = center, cell-horizontal-align = center, + content = [ + View { + id = demoView, width = 250px, height = 150px, + background-color = #FFFF0000, border-width = 1px + } + ] + }, + ListLayout { + style = optionsPanel, + content = [ + GridLayout { + style = optionsTable, + content = [ + TextView { row = 0, text = "Border style" }, + DropDownList { row = 0, column = 1, id = viewBorderStyle, current = 0, + items = ["none", "solid", "dashed", "dotted", "double", "4 styles"] + }, + TextView { row = 1, text = "Border width" }, + DropDownList { row = 1, column = 1, id = viewBorderWidth, current = 0, + items = ["1px", "2px", "3.5px", "5px", "1px,2px,3px,4px"] + }, + TextView { row = 2, text = "Border color" }, + DropDownList { row = 2, column = 1, id = viewBorderColor, current = 0, + items = ["black", "blue", "4 colors"] + }, + TextView { row = 3, text = "Radius" }, + DropDownList { row = 3, column = 1, id = viewRadius, current = 0, + items = ["0", "8px", "12px/24px", "0 48px/24px 0 48px/24px"] + }, + + ] + } + ] + } + ] +} +` + +func viewDemo(session rui.Session) rui.View { + view := rui.CreateViewFromText(session, viewDemoText) + if view == nil { + return nil + } + + rui.Set(view, "viewBorderStyle", rui.DropDownEvent, func(list rui.DropDownList, number int) { + if number < 5 { + rui.Set(view, "demoView", rui.BorderStyle, number) + } else { + rui.Set(view, "demoView", rui.BorderTopStyle, 1) + rui.Set(view, "demoView", rui.BorderRightStyle, 2) + rui.Set(view, "demoView", rui.BorderBottomStyle, 3) + rui.Set(view, "demoView", rui.BorderLeftStyle, 4) + } + }) + + rui.Set(view, "viewBorderWidth", rui.DropDownEvent, func(list rui.DropDownList, number int) { + widths := []rui.SizeUnit{rui.Px(1), rui.Px(2), rui.Px(3.5), rui.Px(5)} + if number < len(widths) { + rui.Set(view, "demoView", rui.BorderWidth, widths[number]) + } else { + rui.SetParams(view, "demoView", rui.Params{ + rui.BorderTopWidth: rui.Px(1), + rui.BorderRightWidth: rui.Px(2), + rui.BorderBottomWidth: rui.Px(3), + rui.BorderLeftWidth: rui.Px(4)}) + } + }) + + rui.Set(view, "viewBorderColor", rui.DropDownEvent, func(list rui.DropDownList, number int) { + colors := []rui.Color{rui.Black, rui.Blue} + if number < len(colors) { + rui.Set(view, "demoView", rui.BorderColor, colors[number]) + } else { + rui.SetParams(view, "demoView", rui.Params{ + rui.BorderTopColor: rui.Blue, + rui.BorderRightColor: rui.Green, + rui.BorderBottomColor: rui.Magenta, + rui.BorderLeftColor: rui.Aqua}) + } + }) + + rui.Set(view, "viewRadius", rui.DropDownEvent, func(list rui.DropDownList, number int) { + switch number { + case 0: + rui.Set(view, "demoView", rui.Radius, nil) + + case 1: + rui.Set(view, "demoView", rui.Radius, rui.Px(8)) + + case 2: + rui.Set(view, "demoView", rui.RadiusX, rui.Px(12)) + rui.Set(view, "demoView", rui.RadiusY, rui.Px(24)) + + case 3: + rui.Set(view, "demoView", rui.Radius, nil) + rui.Set(view, "demoView", rui.RadiusTopRightX, rui.Px(48)) + rui.Set(view, "demoView", rui.RadiusTopRightY, rui.Px(24)) + rui.Set(view, "demoView", rui.RadiusBottomLeftX, rui.Px(48)) + rui.Set(view, "demoView", rui.RadiusBottomLeftY, rui.Px(24)) + } + }) + + return view +}