pax_global_header00006660000000000000000000000064136766011640014524gustar00rootroot0000000000000052 comment=94c589d890bea635baca9098f809a91f8dd2072e is-1.4.0/000077500000000000000000000000001367660116400121415ustar00rootroot00000000000000is-1.4.0/.gitignore000066400000000000000000000004121367660116400141260ustar00rootroot00000000000000# Compiled Object files, Static and Dynamic libs (Shared Objects) *.o *.a *.so # Folders _obj _test # Architecture specific extensions/prefixes *.[568vq] [568vq].out *.cgo1.go *.cgo2.c _cgo_defun.c _cgo_gotypes.go _cgo_export.* _testmain.go *.exe *.test *.prof is-1.4.0/.travis.yml000066400000000000000000000011161367660116400142510ustar00rootroot00000000000000os: - linux - osx - windows language: go sudo: required go: # "1.x" always refers to the latest Go version, inc. the patch release. # e.g. "1.x" is 1.13 until 1.13.1 is available. - 1.x - 1.6.x - 1.7.x - 1.8.x - 1.9.x - 1.10.x - 1.11.x - 1.12.x - 1.13.x - 1.14.x - tip matrix: allow_failures: - os: windows go: tip exclude: # OSX 1.6.4 is not present in travis. # https://github.com/travis-ci/travis-ci/issues/10309 - go: 1.6.x os: osx install: - go get -d -v ./... script: - go build -v ./... - go test ./... is-1.4.0/LICENSE000066400000000000000000000020561367660116400131510ustar00rootroot00000000000000MIT License Copyright (c) 2017-2018 Mat Ryer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. is-1.4.0/README.md000066400000000000000000000024041367660116400134200ustar00rootroot00000000000000# is [![GoDoc](https://godoc.org/github.com/matryer/is?status.png)](http://godoc.org/github.com/matryer/is) [![Go Report Card](https://goreportcard.com/badge/github.com/matryer/is)](https://goreportcard.com/report/github.com/matryer/is) [![Build Status](https://travis-ci.org/matryer/is.svg?branch=master)](https://travis-ci.org/matryer/is) Professional lightweight testing mini-framework for Go. * Easy to write and read * [Beautifully simple API](https://godoc.org/github.com/matryer/is) with everything you need: `is.Equal`, `is.True`, `is.NoErr`, and `is.Fail` * Use comments to add descriptions (which show up when tests fail) Failures are very easy to read: ![Examples of failures](https://github.com/matryer/is/raw/master/misc/delicious-failures.png) ### Usage The following code shows a range of useful ways you can use the helper methods: ```go func Test(t *testing.T) { is := is.New(t) signedin, err := isSignedIn(ctx) is.NoErr(err) // isSignedIn error is.Equal(signedin, true) // must be signed in body := readBody(r) is.True(strings.Contains(body, "Hi there")) } ``` ## Color To turn off the colors, run `go test` with the `-nocolor` flag, or with the env var `IS_NO_COLOR=true`. ``` go test -nocolor ``` ``` IS_NO_COLOR=true go test ``` is-1.4.0/go.mod000066400000000000000000000000461367660116400132470ustar00rootroot00000000000000module github.com/matryer/is go 1.14 is-1.4.0/is-1.7.go000066400000000000000000000033231367660116400134070ustar00rootroot00000000000000// +build go1.7 package is import ( "regexp" "runtime" ) // Helper marks the calling function as a test helper function. // When printing file and line information, that function will be skipped. // // Available with Go 1.7 and later. func (is *I) Helper() { is.helpers[callerName(1)] = struct{}{} } // callerName gives the function name (qualified with a package path) // for the caller after skip frames (where 0 means the current function). func callerName(skip int) string { // Make room for the skip PC. var pc [1]uintptr n := runtime.Callers(skip+2, pc[:]) // skip + runtime.Callers + callerName if n == 0 { panic("is: zero callers found") } frames := runtime.CallersFrames(pc[:n]) frame, _ := frames.Next() return frame.Function } // The maximum number of stack frames to go through when skipping helper functions for // the purpose of decorating log messages. const maxStackLen = 50 var reIsSourceFile = regexp.MustCompile("is(-1.7)?\\.go$") func (is *I) callerinfo() (path string, line int, ok bool) { var pc [maxStackLen]uintptr // Skip two extra frames to account for this function // and runtime.Callers itself. n := runtime.Callers(2, pc[:]) if n == 0 { panic("is: zero callers found") } frames := runtime.CallersFrames(pc[:n]) var firstFrame, frame runtime.Frame for more := true; more; { frame, more = frames.Next() if reIsSourceFile.MatchString(frame.File) { continue } if firstFrame.PC == 0 { firstFrame = frame } if _, ok := is.helpers[frame.Function]; ok { // Frame is inside a helper function. continue } return frame.File, frame.Line, true } // If no "non-helper" frame is found, the first non is frame is returned. return firstFrame.File, firstFrame.Line, true } is-1.4.0/is-1.7_test.go000066400000000000000000000017471367660116400144560ustar00rootroot00000000000000// +build go1.7 package is import ( "bytes" "strings" "testing" ) // TestSubtests ensures subtests work as expected. // https://github.com/matryer/is/issues/1 func TestSubtests(t *testing.T) { t.Run("sub1", func(t *testing.T) { is := New(t) is.Equal(1+1, 2) }) } func TestHelper(t *testing.T) { tests := []struct { name string helper bool expectedFilename string }{ { name: "without helper", helper: false, expectedFilename: "is_helper_test.go", }, { name: "with helper", helper: true, expectedFilename: "is-1.7_test.go", }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { tt := &mockT{} is := NewRelaxed(tt) var buf bytes.Buffer is.out = &buf helper(is, tc.helper) actual := buf.String() t.Log(actual) if !strings.Contains(actual, tc.expectedFilename) { t.Errorf("string does not contain correct filename: %s", actual) } }) } } is-1.4.0/is-before-1.7.go000066400000000000000000000005541367660116400146520ustar00rootroot00000000000000// +build !go1.7 package is import ( "regexp" "runtime" ) var reIsSourceFile = regexp.MustCompile("is(-before-1.7)?\\.go$") func (is *I) callerinfo() (path string, line int, ok bool) { for i := 0; ; i++ { _, path, line, ok = runtime.Caller(i) if !ok { return } if reIsSourceFile.MatchString(path) { continue } return path, line, true } } is-1.4.0/is.go000066400000000000000000000212021367660116400131000ustar00rootroot00000000000000// Package is provides a lightweight extension to the // standard library's testing capabilities. // // Comments on the assertion lines are used to add // a description. // // The following failing test: // // func Test(t *testing.T) { // is := is.New(t) // a, b := 1, 2 // is.Equal(a, b) // expect to be the same // } // // Will output: // // your_test.go:123: 1 != 2 // expect to be the same // // Usage // // The following code shows a range of useful ways you can use // the helper methods: // // func Test(t *testing.T) { // // // always start tests with this // is := is.New(t) // // signedin, err := isSignedIn(ctx) // is.NoErr(err) // isSignedIn error // is.Equal(signedin, true) // must be signed in // // body := readBody(r) // is.True(strings.Contains(body, "Hi there")) // // } package is import ( "bufio" "bytes" "flag" "fmt" "io" "os" "path/filepath" "reflect" "strings" "testing" ) // T reports when failures occur. // testing.T implements this interface. type T interface { // Fail indicates that the test has failed but // allowed execution to continue. // Fail is called in relaxed mode (via NewRelaxed). Fail() // FailNow indicates that the test has failed and // aborts the test. // FailNow is called in strict mode (via New). FailNow() } // I is the test helper harness. type I struct { t T fail func() out io.Writer colorful bool helpers map[string]struct{} // functions to be skipped when writing file/line info } var noColorFlag bool func init() { envNoColor := os.Getenv("IS_NO_COLOR") == "true" flag.BoolVar(&noColorFlag, "nocolor", envNoColor, "turns off colors") } // New makes a new testing helper using the specified // T through which failures will be reported. // In strict mode, failures call T.FailNow causing the test // to be aborted. See NewRelaxed for alternative behavior. func New(t T) *I { return &I{t, t.FailNow, os.Stdout, !noColorFlag, map[string]struct{}{}} } // NewRelaxed makes a new testing helper using the specified // T through which failures will be reported. // In relaxed mode, failures call T.Fail allowing // multiple failures per test. func NewRelaxed(t T) *I { return &I{t, t.Fail, os.Stdout, !noColorFlag, map[string]struct{}{}} } func (is *I) log(args ...interface{}) { s := is.decorate(fmt.Sprint(args...)) fmt.Fprintf(is.out, s) is.fail() } func (is *I) logf(format string, args ...interface{}) { is.log(fmt.Sprintf(format, args...)) } // Fail immediately fails the test. // // func Test(t *testing.T) { // is := is.New(t) // is.Fail() // TODO: write this test // } // // In relaxed mode, execution will continue after a call to // Fail, but that test will still fail. func (is *I) Fail() { is.log("failed") } // True asserts that the expression is true. The expression // code itself will be reported if the assertion fails. // // func Test(t *testing.T) { // is := is.New(t) // val := method() // is.True(val != nil) // val should never be nil // } // // Will output: // // your_test.go:123: not true: val != nil func (is *I) True(expression bool) { if !expression { is.log("not true: $ARGS") } } // Equal asserts that a and b are equal. // // func Test(t *testing.T) { // is := is.New(t) // a := greet("Mat") // is.Equal(a, "Hi Mat") // greeting // } // // Will output: // // your_test.go:123: Hey Mat != Hi Mat // greeting func (is *I) Equal(a, b interface{}) { if areEqual(a, b) { return } if isNil(a) || isNil(b) { is.logf("%s != %s", is.valWithType(a), is.valWithType(b)) } else if reflect.ValueOf(a).Type() == reflect.ValueOf(b).Type() { is.logf("%v != %v", a, b) } else { is.logf("%s != %s", is.valWithType(a), is.valWithType(b)) } } // New is a method wrapper around the New function. // It allows you to write subtests using a similar // pattern: // // func Test(t *testing.T) { // is := is.New(t) // t.Run("sub", func(t *testing.T) { // is := is.New(t) // // TODO: test // }) // } func (is *I) New(t *testing.T) *I { return New(t) } // NewRelaxed is a method wrapper around the NewRelaxed // method. It allows you to write subtests using a similar // pattern: // // func Test(t *testing.T) { // is := is.NewRelaxed(t) // t.Run("sub", func(t *testing.T) { // is := is.NewRelaxed(t) // // TODO: test // }) // } func (is *I) NewRelaxed(t *testing.T) *I { return NewRelaxed(t) } func (is *I) valWithType(v interface{}) string { if isNil(v) { return "" } if is.colorful { return fmt.Sprintf("%[1]s%[3]T(%[2]s%[3]v%[1]s)%[2]s", colorType, colorNormal, v) } return fmt.Sprintf("%[1]T(%[1]v)", v) } // NoErr asserts that err is nil. // // func Test(t *testing.T) { // is := is.New(t) // val, err := getVal() // is.NoErr(err) // getVal error // is.True(len(val) > 10) // val cannot be short // } // // Will output: // // your_test.go:123: err: not found // getVal error func (is *I) NoErr(err error) { if err != nil { is.logf("err: %s", err.Error()) } } // isNil gets whether the object is nil or not. func isNil(object interface{}) bool { if object == nil { return true } value := reflect.ValueOf(object) kind := value.Kind() if kind >= reflect.Chan && kind <= reflect.Slice && value.IsNil() { return true } return false } // areEqual gets whether a equals b or not. func areEqual(a, b interface{}) bool { if isNil(a) && isNil(b) { return true } if isNil(a) || isNil(b) { return false } if reflect.DeepEqual(a, b) { return true } aValue := reflect.ValueOf(a) bValue := reflect.ValueOf(b) return aValue == bValue } // loadComment gets the Go comment from the specified line // in the specified file. func loadComment(path string, line int) (string, bool) { f, err := os.Open(path) if err != nil { return "", false } defer f.Close() s := bufio.NewScanner(f) i := 1 for s.Scan() { if i == line { text := s.Text() commentI := strings.Index(text, "// ") if commentI == -1 { return "", false // no comment } text = text[commentI+2:] text = strings.TrimSpace(text) return text, true } i++ } return "", false } // loadArguments gets the arguments from the function call // on the specified line of the file. func loadArguments(path string, line int) (string, bool) { f, err := os.Open(path) if err != nil { return "", false } defer f.Close() s := bufio.NewScanner(f) i := 1 for s.Scan() { if i == line { text := s.Text() braceI := strings.Index(text, "(") if braceI == -1 { return "", false } text = text[braceI+1:] cs := bufio.NewScanner(strings.NewReader(text)) cs.Split(bufio.ScanBytes) j := 0 c := 1 for cs.Scan() { switch cs.Text() { case ")": c-- case "(": c++ } if c == 0 { break } j++ } text = text[:j] return text, true } i++ } return "", false } // decorate prefixes the string with the file and line of the call site // and inserts the final newline if needed and indentation tabs for formatting. // this function was copied from the testing framework and modified. func (is *I) decorate(s string) string { path, lineNumber, ok := is.callerinfo() // decorate + log + public function. file := filepath.Base(path) if ok { // Truncate file name at last file name separator. if index := strings.LastIndex(file, "/"); index >= 0 { file = file[index+1:] } else if index = strings.LastIndex(file, "\\"); index >= 0 { file = file[index+1:] } } else { file = "???" lineNumber = 1 } buf := new(bytes.Buffer) // Every line is indented at least one tab. buf.WriteByte('\t') if is.colorful { buf.WriteString(colorFile) } fmt.Fprintf(buf, "%s:%d: ", file, lineNumber) if is.colorful { buf.WriteString(colorNormal) } s = escapeFormatString(s) lines := strings.Split(s, "\n") if l := len(lines); l > 1 && lines[l-1] == "" { lines = lines[:l-1] } for i, line := range lines { if i > 0 { // Second and subsequent lines are indented an extra tab. buf.WriteString("\n\t\t") } // expand arguments (if $ARGS is present) if strings.Contains(line, "$ARGS") { args, _ := loadArguments(path, lineNumber) line = strings.Replace(line, "$ARGS", args, -1) } buf.WriteString(line) } comment, ok := loadComment(path, lineNumber) if ok { if is.colorful { buf.WriteString(colorComment) } buf.WriteString(" // ") comment = escapeFormatString(comment) buf.WriteString(comment) if is.colorful { buf.WriteString(colorNormal) } } buf.WriteString("\n") return buf.String() } // escapeFormatString escapes strings for use in formatted functions like Sprintf. func escapeFormatString(fmt string) string { return strings.Replace(fmt, "%", "%%", -1) } const ( colorNormal = "\u001b[39m" colorComment = "\u001b[31m" colorFile = "\u001b[90m" colorType = "\u001b[90m" ) is-1.4.0/is_helper_test.go000066400000000000000000000001571367660116400155040ustar00rootroot00000000000000// +build go1.7 package is func helper(is *I, helper bool) { if helper { is.Helper() } is.True(false) } is-1.4.0/is_test.go000066400000000000000000000133341367660116400141460ustar00rootroot00000000000000package is import ( "bytes" "errors" "fmt" "strings" "testing" ) type mockT struct { failed bool } func (m *mockT) FailNow() { m.failed = true } func (m *mockT) Fail() { m.failed = true } var tests = []struct { N string F func(is *I) Fail string }{ // Equal { N: "Equal(1, 1)", F: func(is *I) { is.Equal(1, 1) // 1 doesn't equal 2 }, Fail: ``, }, { N: "Equal(1, 2)", F: func(is *I) { is.Equal(1, 2) // 1 doesn't equal 2 }, Fail: `1 != 2 // 1 doesn't equal 2`, }, { N: "Equal(1, nil)", F: func(is *I) { is.Equal(1, nil) // 1 doesn't equal nil }, Fail: `int(1) != // 1 doesn't equal nil`, }, { N: "Equal(nil, 2)", F: func(is *I) { is.Equal(nil, 2) // nil doesn't equal 2 }, Fail: ` != int(2) // nil doesn't equal 2`, }, { N: "Equal(false, false)", F: func(is *I) { is.Equal(false, false) // nil doesn't equal 2 }, Fail: ``, }, { N: "Equal(int32(1), int64(1))", F: func(is *I) { is.Equal(int32(1), int64(1)) // nope }, Fail: `int32(1) != int64(1) // nope`, }, { N: "Equal(map1, map2)", F: func(is *I) { m1 := map[string]interface{}{"value": 1} m2 := map[string]interface{}{"value": 2} is.Equal(m1, m2) // maps }, Fail: `map[value:1] != map[value:2] // maps`, }, { N: "Equal(true, map2)", F: func(is *I) { m1 := map[string]interface{}{"value": 1} m2 := map[string]interface{}{"value": 2} is.Equal(m1, m2) // maps }, Fail: `map[value:1] != map[value:2] // maps`, }, { N: "Equal(slice1, slice2)", F: func(is *I) { s1 := []string{"one", "two", "three"} s2 := []string{"one", "two", "three", "four"} is.Equal(s1, s2) // slices }, Fail: `[one two three] != [one two three four] // slices`, }, { N: "Equal(nil, chan)", F: func(is *I) { var a chan string b := make(chan string) is.Equal(a, b) // channels }, Fail: ` // channels`, }, { N: "Equal(nil, slice)", F: func(is *I) { var s1 []string s2 := []string{"one", "two", "three", "four"} is.Equal(s1, s2) // nil slice }, Fail: ` // nil slice`, }, { N: "Equal(nil, nil)", F: func(is *I) { var s1 []string var s2 []string is.Equal(s1, s2) // nil slices }, Fail: ``, }, { N: "Equal(nil, map)", F: func(is *I) { var m1 map[string]string m2 := map[string]string{} is.Equal(m1, m2) // nil map }, Fail: ` // nil map`, }, { N: "Equal(nil, nil)", F: func(is *I) { var m1 map[string]string var m2 map[string]string is.Equal(m1, m2) // nil maps }, Fail: ``, }, { N: `Equal("20% VAT", "0.2 VAT")`, F: func(is *I) { s1 := "20% VAT" s2 := "0.2 VAT" is.Equal(s1, s2) // strings }, Fail: ` // strings`, }, // Fail { N: "Fail()", F: func(is *I) { is.Fail() // something went wrong }, Fail: "failed // something went wrong", }, // NoErr { N: "NoErr(nil)", F: func(is *I) { var err error is.NoErr(err) // method shouldn't return error }, Fail: "", }, { N: "NoErr(error)", F: func(is *I) { err := errors.New("nope") is.NoErr(err) // method shouldn't return error }, Fail: "err: nope // method shouldn't return error", }, // OK { N: "True(1 == 2)", F: func(is *I) { is.True(1 == 2) }, Fail: "not true: 1 == 2", }, } func TestFailures(t *testing.T) { colorful, notColorful := true, false testFailures(t, colorful) testFailures(t, notColorful) } func testFailures(t *testing.T, colorful bool) { for _, test := range tests { tt := &mockT{} is := New(tt) var buf bytes.Buffer is.out = &buf is.colorful = colorful test.F(is) if len(test.Fail) == 0 && tt.failed { t.Errorf("shouldn't fail: %s", test.N) continue } if len(test.Fail) > 0 && !tt.failed { t.Errorf("didn't fail: %s", test.N) } if colorful { // if colorful, we won't check the messages // this test is run twice, one without colorful // statements. // see TestFailures fmt.Print(buf.String()) continue } output := buf.String() output = strings.TrimSpace(output) if !strings.HasSuffix(output, test.Fail) { t.Errorf("expected `%s` to end with `%s`", output, test.Fail) } } } func TestRelaxed(t *testing.T) { tt := &mockT{} is := NewRelaxed(tt) var buf bytes.Buffer is.out = &buf is.colorful = false is.NoErr(errors.New("oops")) is.True(1 == 2) actual := buf.String() if !strings.Contains(actual, `oops`) { t.Errorf("missing: oops") } if !strings.Contains(actual, `1 == 2`) { t.Errorf("missing: 1 == 2") } if !tt.failed { t.Errorf("didn't fail") } } func TestLoadComment(t *testing.T) { comment, ok := loadComment("./testdata/example_test.go", 14) if !ok { t.Errorf("loadComment: not ok") } if comment != `this comment will be extracted` { t.Errorf("loadComment: bad comment %s", comment) } } func TestLoadArguments(t *testing.T) { arguments, ok := loadArguments("./testdata/example_test.go", 23) if !ok { t.Errorf("loadArguments: not ok") } if arguments != `a == getB()` { t.Errorf("loadArguments: bad arguments %s", arguments) } arguments, ok = loadArguments("./testdata/example_test.go", 32) if !ok { t.Errorf("loadArguments: not ok") } if arguments != `a == getB()` { t.Errorf("loadArguments: bad arguments %s", arguments) } arguments, _ = loadArguments("./testdata/example_test.go", 28) if len(arguments) > 0 { t.Errorf("should be no arguments: %s", arguments) } } // TestArgumentsEscape ensures strings are correctly escaped before printing. // https://github.com/matryer/is/issues/27 func TestFormatStringEscape(t *testing.T) { tt := &mockT{} is := NewRelaxed(tt) var buf bytes.Buffer is.out = &buf is.Equal("20% VAT", "0.2 VAT") // % symbol should be correctly printed actual := buf.String() if strings.Contains(actual, `%!`) { t.Errorf("string was not escaped correctly: %s", actual) } } is-1.4.0/misc/000077500000000000000000000000001367660116400130745ustar00rootroot00000000000000is-1.4.0/misc/delicious-failures.png000066400000000000000000002427041367660116400174030ustar00rootroot00000000000000PNG  IHDRsBTEGiCCPICC Profile(c``I,(aa``+) rwRR` \\TQk .,xPgzzZ qZrAQ c \^Rbw"E@Gs@t{a rA $g$`|d$!#BJR+J@s~AeQfzF#0R/bTC,`A8#zeXIfMM*(i>hASCIIScreenshothiTXtXML:com.adobe.xmp 2 1 1 2 274 Screenshot 654 F@IDATx|mٲ%Yն1̀l0J$CB$J$8B/^ ndHe[6g5ϮvW+[6)޹sfVsڀ{8qppppppppA;vpppppppppNNNNNNNNqiǸ9 8 8 8 8 8 8 8 $s̈́ѦrDYu]kl999o7gc%29]g'%}e]LGGG/++TVV5k֘'|ώvppppppOhToǍ懏gND=ng8h'?ɻߵTN,43gbr3X!n6  N?j9Saj233-;矏6qIOO7;"ex s=m~1iiif/06mV^m.niiiiiii`G@BjNa_٭]oV yO3fv# C3XVTT?AsM7| خӀӀӀӀӀӀG=C]7}-u"M:ֆǺap@#7yR%,⟸{FOc]|} 73A1s̱4ᄏ)--3wCqO5tpppppp؎40p֡sLǎ}/=,hN*2$fq;K3+'U#J-8e? f?4|ƍ&pB`k0ab3qD _`jkk͉'`MfƎk\WfʕCvLN8}g`8#܂ӀӀӀӀӀӀv8=n9nC)OuUI>l#4Rj3uT<ɸzV ɺWXmƾl^k.,,֮]kbc"&XzwNNNNNNN;Yfؐsi\Ӓ2c d\d&L-~Y%<44444444H(8fU{ᓬ*ycs}w;# WVwr`/468N7 ii`ЀcNERva6GF, pa= fݺvT_im1oxQdi,cǺ6'fr7o$ŬYik#ǙCK\qzP.-L*d_l&λeEY+@a) +ґE\k} "G q7_gZ@ Tasee=}0rʩfW1XR3]6a}q>͛7?Oe\8O4Y3 m%ogO$1wG_|!`SO1IG|.Č~TeV2F\ך[jG!%hHɐn~4ax5Dڍ]Ӄ.j> rM pX`96mr9Nwnkd;Iq}ά7ʊMk0ÅZ9cA-:ܳxqr3M9TLެi %G^(`8 8 o 84I̡iCӭږS0=EԼiȸ2 C̯dۼ)JFXCOKj}Ś}2憎õ3~faVd 2`RY5896>0+cFV'-;YrjAҶEX^c"<앂šy%M36і/A+M} ߖFO>dzJ;X|x׊;HZThA[%" H7L~`LaAf_<^Lc3*G[/h OF50-TWYRX@!e 'E?-TSRl~ywǍBR@@8saY%^ua(˹X]c.ƀB_sd",TB0D]j-C~kDG.754pKбv}l8 8  tgڏR$M]"u|~-ه"hd$\`Z:-cC5U m+LaKUej+#&@9zSosB,nmkBp [ ZT#ftnm|;~|r1)̘1C@dɒǝ.>( BغWDvV"l#핫̟k7MoO=AyvϗX ([`:}sȸ6BE>=re_#"/L*_a=\)2&\DŽC~$0{u`@K-͛'M0ħ5Us(:E^EG[wp_pdž ̭2w-0hD,J_OЪbt֭mS #~I>t2dhI{&1:V5mXƠ_{=z](xٲ}6R{<5 pha*ɑ܃`ݚC{XOe>R1bW'k`z}Ǭ #m˅EԌtRW#,+o@U hD=CG_z0w$0˶Z PW`vvW9X"XaDq `O7Fk; 8 3 8v Lͬ=<*)k @R9v"j:-wuMQ0i_#0%)`K7 3_'`qР4qXg Gv&555fkرQ}iHv=D_S]%SK'S @>3#i[S7rT|0d^?D͠)H#K=ycJhmN94H DVdA9H{؍62~ 9b//:GJХ78ɬPZl)z2qpp`+vDQzI8nz8(z $1+%EM,4e0yXS2zވlBjh[(jSbT:Lz&0i7x"1y,a7؇ ~zκmk~u¶vTq캺:K/NcM 쳷KE/?o~1cmBL0ma&NDpR@fKW*Ћu,qaxC 6Ĉm36W Iz`*(e奀I*3#gBy0OxgAr<㑫%<Z( g,ii`kusF WEZj-L5HS!ն9 \LGR}SPTfUт8Xs55TyweCaDL/K:zT9E% A}\ǎ >L#UmlH ˲ ]#:D[cDDY Gm׿N8o12T @ xajs lDD#S蘺Nq`, F` ((zSX2|%u6肱WwI7FYS4@  UVIՅ~Ze}1. 68r;%a Us5~y9U|M>=sR'HHdx64eYlC̼a @$zrڟoW@ݮ:غ@j&:HV`a>Ɏl?KLɉ=V"xx,ʀr`kMX`zſ 8+6-+8+z#yI] md2Xd&9OMyp~ #H>M'ꎗfM ={C?iiˡ_x;Ֆ5 le][K9u(edXfpIqA;Fydz-A##8&_<@ fr+@AC 42Kb& ޴:\Dq8XAJhcys+i ٿ6Hnii`Ӏ[`6l"Q50''>A S۸GCrAd6sۜp/uvg4444444k <{=iiiiiiii`G׀;vi`pJ$V_D'[_Ep}DGUq۝' ,*i{p+UL2sbw4O7k5Qe&DM_O ȵ+ ЇH^K5lko„ ⋿mjkkLADHtiS$?SQKNm !z:: RR&MG'q;%($ǧFd}\|*9qH\pL/8D ɳm^J^E\%N^AR萐;sOvN~ԥ)=ڞD_M[Ѷ~ZT@䱌&%'Z9׵T!yg͚efWQ#ܝSIVz}YRq$P'= ߵQc%&G.9Zp|pjBY]\g+P%BoM]U(#X0<IJ kn%›3T ͵̍y-|Fq$VV9Йnΐ3K*z?lBgR'?>׾vQHsO>H<餓_oLyyۓ<9FZ*#33钼5|c{je'H&. 'i߷]gOOiRq$^$mE %69>W8 ZTeR9w7",e2C"pdlf'i̓J1/=1ҥY*t ̣jJ0Y|cd^F+0m*˖ KrOთ/U/RfücJIT9<#K噵~R疓72o=k]vn̲}=-tKGFteF fpsT {-k/4Z;K~:<̳vǴߔSq͔n*R#UTT[n9x߾8p_{9̄ -C+-|fز$o}o^u;W_eNv]wkdC ǛUkǟ0ɿ /H  !n쳶Vg_:9hsI91RV^LK@!R{|RUR9zfS)1X"cHKXOJ6|%;%Qo$Rq%)Y/^-aŮ< (Iam=XU#.] q(!prs$=l]EK3){9LGi粏>0—'3MAbõTY"2%2ul4Հ^mĹ ( )uԪ'`d70.5/wt-NüI֐ @/gXs`|w:l~쌿./9&fU2`R/sl6>`):aEHK*v1uRz1X~w|آ.8#;ڸuM5 a$e}b9!w%D f6F&y%"mjD4`㯗rrAm-L߉'`c3DFyо~8AW__[TlY/5 >~kn4{9#ٳ %}9/oqޱƢ [3@[ 6 `!l_0id2"10kR/lk]"t>ZPT`0 ȶ` && C$s7@%,i),+[7< LTYt6<^F.QZD5UROBaHk6@4r~͍[^K(ȋv:e?p$sKfHkڲMMMG_dgsi:}]d EFL|8s饗xzŷ }30=ICCwܱ~W#:HmmEE#RZ{1Ofkl;`>oD0nM"=`R)+54ɚ6{>6Ǭ{@~T]E`)[V˪p5)73/ {*˻\@nIX'.mD`"Ģ0; {bF ̱-; l 8Zn]fS|Ƈ*0}1arJx1`;/8}D]j_3Cvzad1y#m"&ٶ5-8: c&%zTȠ'11bFرc86[nL<ٜuY\xb~˼;f~̥_`*IٓD ̣]"@Sy>P}mSJ/juzzFBYL8$;6mㅋ̡MɞoUwkLBA=3>:aS J@R4Q*F47{oO[l/Bo5c:@b&+`^6"5a6XH% &ܘ"}!0*jFd[R7}Ƅ;`}s~Lz&!Œ na >=\ ːr"^>0~ĴDۚ h8wuμKMeLʧ~j*SPP`>qڴi6ڀx ;是YЈxij|DJ[A2CNxS6X)flhYE5Dj!e ^L0A\1ϕ/[i%],H rQv4DcZLz|LƇQҌA#y.'TFy,p̹G^*A@0{[J]|qw t2v T(¾a%8'>[f- l8S =4@ -ѳ7K ]Xi5XBa. f])&TUj1a?=i8WO;M-M5Cser ̞^РL>m0T,ow$!Wz4%yD(S j"(9#0^veDv>kXxŗzjs%3\`fs? =NNQBfsLD|5g#n~cƌh7#&٪e6*_(eυH]̟/ A[r6,,W0> c,?*\ߕ$?@-t8/~Op16Mռ$0Ds$~y׬PNnHXMu4oUXU.!_QO.Bb km75?oX$w+=V a"$z:Lt d?‹[-,Ib]$=VeFz4ΔK'5=^ }زNG. $7<#Gt_'/ 8qHV8&9 ^! ; $3 O.Gd`GK} )LA*hA`1Wƚl((Xf?XG4IP_8l!kt6裏-p|ݓZ&}  }$hl8aN-+8v!f3Gb2' l# uY!ʆ'*00`J #t*]b]GQ<컄1ƨ2닉?&2@>2W@+2r~'49lR/D))b#%r5 Y?ZSk[1}V" H 8V9\g>p+)ҖDwѪLk/!NR Q\-yźT:~ vdɀ"@_C6C^sr9P33+6' q3 u[&ֲˈo'lz#AA=r ²P2&PMm82)I2#y-[ $]ŧ艏%DJ:yyµEבOm ҏaG^foPMtA_O#cE08fc//(E LtPiG+9-z ]:qp @ϖyeX.F·80^<t~j.@{hs̍y>8mODĤL|#`$ sIhq: 7[`9(^6ٞ+xQ~?ОFJ}O[j6F Miii`G׀cw+iiiiiii E*Ep8 8 8 8 8 8 8 8 pqǸ,T * Q4%dy>If;Q(YM6EJ+nQNfkA 9^g/c ZEoK) q+))MI+ԆޞK7'O9Nnt vAIJOUuHQo2}WOkܜs&KX^DJV`vdTb JøG #&:t[+0> ?3IxC%/*(HF{Rb/Y^xGrAEoAcY:rJ0^ ʖIYP IټF//Ljwy=4w0aw̃,X[6o#*3uavuW3o޼zO ǛURI^3?Sxr^ݫh_wܡQIl=B>IGLÀ|?7uaq56,~5Z*)}yc?ySN9̙s={ӟf{5;׶%f۱^$-52]*̒*)OJJU J.ՑӔ,P*$ֺ/oFٜ Y@с-#T/Ѻ鲟rc^4_UOY].9DžRy@_qEϛz*#wDG$G%]Ry/laZBo9RQG+N=Qr$˸Z[ 2+6&~ ɓl ur\G٨ہm(K %jqBTbd5cɖJGr[DQ F[G|C.jd\jIfٕa3Idk K$17XM1uʎz37 ǴYL*eن\u!hGPoam]R>ւ b0MQ;0Y+.` j`&hO0ԋ" e~m[Ј0I[|e˪] WeNDnFC:~Ϟ==s_N(o&96y6)^ʠIgGdT{Җ{&<}!`{yQ;[3"a&ͧu_yFVE=4Hm2(jG .j" k)>Hɽ7ZEMI=1UGJ؀%Lɚ9- }$8>EEE]V^mͩu`t1f3 j_c®1*p #k0bT}[n5'O6gu0^x9oy]I7d'̥_`*8tb 0 GךccY^tv=Oƞ9sI=vۏcD= ap~%# Lp;ywoAbBVTT2sv' CwSš6/t3|т#@T2xFd[3P؅;5hLs~ߴ4Ij9 S*# LH?B=g~j*S w6mj֦0ar1_ų~]w\޶o@J Bn}=L l^u͔)Sl5\~J\䍉N̿߰l[8;:_ق-ʌxE>̥BL^!pK|&$`.0L)+;NY,(Ł4C@IDATnO㗵)D"X"sr m` ,)[Ci0 ִXZ/"D .9o5=ƃ9\<@ʀArU Y}9&i8WO;W+=x}Bׯ 4Y=˼5@%q!Qw5JT;KF%g26`E)ԨѶ & "A0us=njc|0UU3<+0H} 2ځ}XxŗDLП| 2Uדu[hO j{ţ¾;}5S}࿏~[mG?餓IlC"*O5 XwS,} j j%\5Z|(5lhii hz[Lj=$Z.~_)8ǟ*E$7yql, ũCk%<y K ~M.>) \Wc[J&-Dv8G"OK[׬z|Dߗc~9ÇD^>aF!@?J$ž"{y+Hډ@p1A`#+GZ j >  @NEˑB%,MUт8@V9ijі E`좚Oa԰\"+B}e}@n3 f.lJcGv8GTo A$&1ұ]c/Q0>ܸQ$T>UUU~̚5|9p/{Ƞ(_g=Jzo4T :>RA'\+-k&;IDŽ8"\ca"8 Mm{&yUWdy0oL_8E"^0@B`vt+ ioek;z_6.Sa-a:AҜ  _No:;%8^K5W˨Q1d&F5ޛo0˒p$^1_2; A`7KlP~"2q'P&!|}IjVG^SzFR 'F㘿T:hUKR5#OrmK T߈b-? *Y71 \7~yj6%ªa Jr2:sffWmO43/@a[f|c/ A2hvra ZC`J%]ZCM?U)y^ umLQ.urFk$σ -R^ơ]x˭I ;I" ,H00o㠋lI^>d&T~9rac513\i+։nv?*F{{Ds%$6 :hC;ŒK}; lm 8ต5ќtCci1 #瓑f-p>nۗ`a5gOԗ-‡/R bFT*?x B,R.n=ѢhkæM&\1ofhsN&uq/ Gh[5wۜv 8qG<X!o>>iiiiiiii`׀5tg4Mq.GJP񴏷MD&SJmwppP ,*IWwb*r2sϢ?.\Zfyܗ(֩M2UԈe?̛ >_IEOqm7yZhbm/\WOk: (QIPϭ >^ߔh~'NNN=iI$Lt1=}H.*Ο[^0BDʩ{/ؕòlu*R(l -P*7ך$E/Q$_M[$LTHdIJl =BGQyIn&Mhs8~3TYAp hMĮIֵM<_TsךzKm["8U2ȭYjLF2Elj;"_׶vK`NN8w#pWsOcsOnJ7B82l*Z4wo+_#@iDhk#8I5$f=/U4 G;ZgfyG@# ) 6 Exn~ Q%,80Lۊ16TRt+miV5URh:F<ߘ9-O$ 5HsϷ76,[P\jMI%We5E](}{k·$?_@x2 IRіԣ/niii Hp۶@Qie#ήD)Q*ht'i0>g'F4K%5_$ߤaU9`#i8- 6{y(#jIQf%BV Y3@8a~i^)9^ZX]?#k(8e1t Ŷ&'p l#ZTz<: PGa"8G>kY|'HzBSGrFO0$W. 42淾uld)P`֬^aM[nTLD?uf„ [v-g }%LeEH*7ۋ74cEz%Ff=x?^3g .8_7~{8°& \ FJ$yb]6ӥ:,TTpCuu$15ɽO)/14N#(*7Lo>|^N(lSR93)g2MC|ciM:qpp1I\<LYR &T'Gflf  dO@ H(&cP3z'ax¦Ěc|:eL_1sc^$0gH"0G@# /ֽB;@rZZs<Ä9ß67VwRy|Nu$#a8}kMo@FA &TϺ6Л_baZao8= 1^x+QE, 4z{i_6Znņ7ӾPtS7'2xPog=`˱mxQ`) Hڎ` 2[ 6RQj)'HfJQzٕz%@*%z3ɜ9I22qRs<)QC& hTaAZ9_$ljӀ׀cZBo8 ]E]= 0/)`x8d}ы5|xЖ`D%3<Ԥ N+R3i^ P0(D:$, h[z! /+jC_+YS%e! KiL#@7H0 ( ^X_?~c"+^N%(œZh~t?Kt-c^-j3^f6?_SFe_OM{)r lNX!C 3Hfbk(%ѯ5,!I|B]>,lo7Z̖+䉶<'s{>IY6@@ {c`^6B#&NN}*Dv! ` X0NX(أd@K49R99–m=؎(A/~Iݧ aHY̍~IFܮL ,d*e,5Ӣw EG7Ǧbaƕ0 "K/Uɀ=6WďS ihh0+Mu̩7_OlLա_N wxaY%&Ow@䥦`3yJ," {|͚Ѽ|]=,l:5‚Y.0ɾC lhcG44M5cv xt ƇFF2gYNKI/R/9Cje1|ЬϜpA>o-οk-?Yd[~aQ̙cN9dn-2/YNv=6A]sߨyEr) qOtD 0sZjͬY1!u2Ç߼ڒ+ӭbVv|݃ɫ'R/@>{=|gUfH1Qx~<1*~^깻Ӏ) @ WExP Ü!<4Պ 3E6gC8 kH2 :2 kv0JR/L/K:z1E%pT&6rP}\ǎjY 53~} yPh쌚\tID v,N % I d4EyU !A# @,̙chߩS[hAhW/Y/_ڊȑ߀ Gf7vw'j̶MrrRYq0;)9٤"HLX^c`yP8P6;qp60u]Nrf;Q*oDFRjo" 1f$t_7c*+&+? DO`|ĺcm)|¢m)'@Ӵ\G |r%cxE pP!N@4h2϶؆ s /{{q.eyAP|ߝmVI{=(/"3otFSviv~dJJ=D96l%608 8 l{ g(Oa>oyv?akAOmA  #Ɍ 9ŜTk||Aw_42O3ڹLhMS 2= KKL ƮR}ioέ5΃~?2 ћ]ME-7G0HHC ['iFqۜpܺÆMطTzu\&M5#~;&?n~tn  Mo?mGGuoȘ8 8 8 FTNNNNNNN_" xJ|ڝӀӀӀӀӀӀӀ@pU:8 VDtЁ}RZQpazδo_׿u2{1y>i$󕯄"&G^͐۹$qA9B%{orr;44 iќCeHJH{ِ4\\{챇 裏ͧ~ݔi^{K2˗Gi*9 XQɷy't,999)wܱɷ[oEQGion-pƨr3^_+v}K̼nv+NN5cw}$F^IWeeefŀ&Ǎk.;sϳsd -'d}8 8 {-J+C{͵HrHRdTi )=~_Tb$/II̢k! ##ZΔɣ eWIMvs\IT9<# [k몶8l[q[Y+H#67TL{B;*4-:8o=.XCu󟖽ÌzZ߫ .8r!vyGHɽ"#= ZH]\\l #^x!&ͅ^i\g&Ol:[{-[&#_>Eܹynb`Nyaʽi1w?no7xsG0rʩ<1Ҹ ʟ;{c. ߵI˃#<Ҝu֙6}m?}W_e?ax '?,.OWuoGٳ'dÏ}~5>^ :驧"̯̫j1s9ۺpVӈrŊ/".[9rdp| 50 j{/핫vo7Jue&cIq6jr?\Sk_Jɓ U|ż"|HL >_1E#@;\m(u)OY$[dT-Nڝ?:JQE;Gv;4)˒uk[0cS]hxª!Tb)r3jF$eh(Xs`,Oɺw3w(鷔I9х^H;h'-; EHSSۖ +|뀀u jXbND-w_8͍ewu=TH^J eeeه.O`sQGEZ7o6_jW3zͷlמX㳏s0z/6@W\nɖiwzVى|hd[Z` Z]$ QƊaX%42@nm00md߉mZ(/|KJǝ1#ec*"Ch㤲R[S%rlirr3N7Z%IN,8 lk t=-Lj 4}$xU/nkYA@`tIY6#+&O`l!k-bb^v٨ ["qM&fn5U MAJ1/HFQA+mVg09{ oDA]b|<]<֓ڿ-jҥKbA]~ee=9?ȡyo>noHh /em)dr?E ~~'ٙ¬Y؞] ^z0QsUEd߂)m'!iS`K/,%Sz-+&/`!!\#b n7 <[8;?oK@#>B]];3eC΍K0?uT/y_t[7ԾxRA"G\G ۈ&`B2eΧ s`v4Y0_*>*g,)|sE UANgס"kt᢭RG꾝zҀ=i(1ܺumnp%0hD: X9XvJu  Y@x36lQCj<.OLTA/;j?ݖFqG`D9+ q#Gvg̙g!{Y(EyH)S؀I&Z3);N5e駟fItdDkW?6VW***,ݦgJ{+~}0m0-/kaadSaLVpk:yC=`T#o}tLo=澜l'⭭=6\xվWl* io[eM,If#i}}!N `K+_cʏnY+#_"wSk׮U{?p`W`=X3c a>t{?Pw걂oF{_/ZȲAmz um` ,EVSƬ2i<]Dvԇ[`^K` iT,4,!._1oݦH 9j1a?=i8WO; 29F|BWg9 k1зo&p*;{l_#8I=[ִLJdM˒k3tk}͙3\{l;lf#mugpm{aâ"KF.Q⯼ws= CTX8B| zSN~vnBfn5^vY{I)[ĉ"~: oL)F@\ ~FOt(HwTkHa#YEqO#c0W෿} a{Ogؗ56ҙe Dг;s?ƛDHgwX`{9dSDgEo]t݇_$z*䨢B fcyNY_H=(!fDP#lr 8+9H^"P!+W }, ܱ59ҳ9#&Qz fjR(`!45>y0cA/kGڶ5v`5,5 HYb6vncQHOs俦*1sV:za6}Xex !7hAxr =,s.k6!9đD?^QxcxZZ fCLr ._7ԔQ;ЙviMy]7>sεg&- b,؞?>Ҏ> {c 3e. bl先nRLY,ݼD"r>:9]WӺ}o5BWқb\۠7|Ӳ jЁ`'і~|sWa~"R{?駟c Pc` 5wC+Ztя~l y9!pꠃI:]_ƽzѿ7B@jYe"S2yn&X7ݞ-k/;8+돏  M#Q^ŞD, {W4F{4(bC,,ei ,?y{wv^K9y3͝;sNqٌf7#"gB#h6)OqRFn֦]?@t,Qf m;tvG~9>Lڈp]qr60J L ^`2|ZLli)_NVn_?~=K7\Dݴ#LDO(P<%}y[/_nzp`] 6ѥׅF !Qnʦ 'ܰ<}sw#$_t]A ҆ AH0v9K;mGu ?C=X*3ιD?G7+))DQswLZF"5 صkAsŨ~qcAe꜁Fʫ3'( ~ᔜ-6z~"5rzsrR]`6Bt?sO]ѣoݜ{g6mcMWw&ս K_!x{ Eՙ[+쁰{ 쁰zVzxa=@a=@@(N´a4@`u)W^MKX'Ytۭ9n819BO>Cas!<l݀7ja=c'<%NX/kLQKuʝf5a6cw<[yK" :,tycc _z ny|qֳ#>@<:]S\G(Ç+|Ar@]vkU-p%.z.{om!n7wOM!=@cIz]cӫVķdMZP@|6oW=O@ҌNsuapDzGE̵!۴-'q)4g:6Л0a6w֬9i6nMG|D94Cz￟)Qm+J[jk6Nz)zȋej6T8f[t-MYYse w9RӎiPzP";:s|G=_/'?O-.o(KbL{9̷9@xڋ%4-ō߯c#\p1GvbIXE|=fcn+~?$gfͽ)s~ͫ'rnc;c$𜖝ja++fqL;kE,.ﵕv!g82gHTڈ1.]{I@+`mirQwh)XphAbp%[gjhXI.|Cd"ÏGGX=C8B}ya?8Y2Nzi_It@~"񏑰lK4%\~n6-3gPp:NT]_{ҤIF(p<2s=ith3+vh9'|{ϻ;c y1ǪScYKw8~$~[Ms㏽_Zu]{]t.?_مP8f%2x ܘ1)~>|po?~#Fsx$b3. zgj>@L%㮏5J/0ptwpDvT/|Ҹp}E^̕^eꬻL?9li$[*\wVyoKhuQs q/s`Qo<.-Mͼ%u^lII]q"3gRiK a;PX +W.?Nμ){AZij!"̈׼(Ń&_6PFʴbuL_्p i# ۾XeװiӺ\(@,a FӺN|Yk&! _ܽOM5 4A-,b bn%\\'a )α¤ '|uIڜ7,RYϞ=eGt`ĽD(8ƹ5}= rt<ݻBRֻ]srD0 \9yyyuРA rx{gu:pM:6scE;I9\7B94;F~?"daXss=GdUU%o~sd%K /\0kBwqK6lu6uHuUFrĒ"!l&˂o^>ة;G^2U]%"Y|`Ig%:qDB)T)/6t%PK"" # cnT f +i!5s E&뮥}mc1JDd([/Y&1\'$5 Ϩe^kmH8C~TCA1W\M!M&f[x,6t-#1%τcꫯDS/++qh穧r*O<x}x fDTӅ~1)K;F= 6,'񈡳#Yg)Ct{_h]Xn]]c:;'xuNBDAc-fcaܳgn ~ǎ*z?ē XP./|'RV^&{!F}ᇔ諯;tع=K.K0oXROn#pӥ/bVzZ{ 0/c%:! uBճ|Q^ӯ7][͗ @K&OUo++܇={  ֬UtssD^%yp D84j6(wJ>ty5Z%U86N y@ /~r]YDN\xLVtv-&Gf%p'4>fr _KU@[AU8.a~.M~2zGR_%vm o>0΀#?N4k !+b?78P]*--UΜ{Ύ1ΰ1dm,yJ"yA1NYq}wxY9ū\?L#2~',X *Cz;zL?p~b'#/{x%M+&>+9K5Q6Llez׶[y=L,j[w"n6䇛8@7kOXmz߈+dRBO`~L_Dpؖ\k1ڴĊt17dvBnlmn1Z^;oBIq\UQ8}ɞ7.W~.#z=pK+%ĤF1W*P5kȹ?\?<H)6RKE;C4Zbnl@K7p}o{c;t~|M  81cR N! :T8;i]G'ց?hu SNUePlΡJ8ϟMiF3 juÃernXXWxo}/}g(x6ۣC;T"g{ob#W'z  00VKf28g`XKŐ cm J]p@H\N:Oqmp]=OV8 BLTkWׂ(AI`rq{DkStO] Fi|왼q F0׿Eah'׊x"}yTO7TrvŒ!<,5ݻwĮہ1qp^Щt LDW_}K 5z '}nSr[V[)h.L[U ;y HGo4Uzc[ZT# 5ݺYpvq_L@IDAT.&#u$",@+z+=/.lK}&b)=_1 n[ f1QviOrR5خx7%d1hY[HEŽQM^=4{ҢedE  q,m : i- %$zM`u(*pXеZ@dQo'#R/\8!8Yjp^o!}/s50 %/u:pǸ`ԱVJ_?eK @k,eF/D2[9_t&\є)S(fH{o}r*Z&F%]vb 6Uz뭷NbPr8BC=T .9`-TD,^8UaQQ3jk.Vo=;e\uX(zc=!TJ9h wq1n>;sxw_s5^>cz6$a,c}m@у}:V=՟~(d c MŰ6;,'A[~O՞c>}šHXQţ3K; Xcӯ_?G{?'؎q5QcpfN;MϣX[QA~Gf^`@; a jkk(0'9d}T'ʽpHY4my@Dǜ3 A؈['GTL,~!zAȕPZΛ3[[Fuy&kձrNpC)609Ap\ZP9[f\&$pJVЈ*R.^8O q^ K"F5@kۡnڅEK&I8zk  N6\yFp oVLJ߉/1Ju<^2(QC9Lߨ&Lџdlތ3믿AKii^Ǔ壃szvh〽7gCJ ?Znvea(<dCo^'JĚútR'o G=D.K2G 15l~Sكc ''6tl1`ǡ ݬM~ Xj%~D+/ LJI8+NNX)?!R>4yԋ{cOSܓαےAELޟ]cϽ@㵑4q G pd"'|BE~A,onJ&vAĺ` lK Qu[ąKq7 eS\JnX?瞻З't]NyXI6!]؅ x/gꮻԶu¥k#ɚzπCi: cƌs.яDGJJfq=>Ƈ{0f~bLrޯoO 7 S=t|m#. ++=E/w:Ps52a 0bC!r N44ڗ1m7n֊&1C4{ Y<74o-Š4Tb΢+7ꬄòh޼y!pHaG!}x"O;K=\#mLP%,CHc.f8dž;cD>̙Q N&1q!tY$'B(^Ы|N{gK揓ry҈sr?><|w3{ >~9jE|KL?bydRVP8!wT_&pN뢦s ©b Ah8XtGWe95j3/Q,-[V(oC_X\|G)?T] z=PG 8~gȑ#k"~(gMD(Ι;H>q˓}Yg[vY?袋b˻CԷwEBUoK^_/1GqĚ=4fhǷD<8p.:T@*p:牵|"?L MhA_:{1%BvC悫8ļsw$rsgjlZ{e "q~#ԩrYd·bYYP($3~m=lC WCkoC֓Ión45~;m!ɽl;kE,.ﵕv!g826'(r \.]{I$Ypseҥ{]?W]uFN2d#!cn6Nxw}0.xF!*w-olt_ZZ* BC8Z&M]wrq#Ͽ0v_ޙic:7ް?ǬY;9RpoDX:TCnZywxe'zּo?}{ԨeV,>!O< No¡:+vT/|EZCϯi~o'|BH[3k"n~sAjӳ(zF,'F=H#tiLu/?YTc[ѡY3|b#yʶVϦrSiNťp\PX +W.-U3oF4 UWZQh7`F-% A&Q(S#e=Gd;{r,6Fhȶ/,6eč8̈́U߿FTFY; BrĈ͒$Ϛ5[P:gNnӧO|:trD!Bmd#!u2B:kKT1!jc8&}HmZ8>IbtCw D%x˶owH=DHYlcF4}?+![*Ϛ gpfKPg[-*%P6mcpmwqG^t] hMHGyҧ5-\K4N:{ݼyvP.gS8uBk76.۴ xnT f +i!5s E>2]Kzz-JDYܭ_(XPbD>bnmsfMֳĺFlgvӈH I *jbnuRGԀ>ʀ, 'E ȇRBd .O>EcD{= |!aĈ׏k(u#/tu֙/xD.2pFE "P'%6Eq* w|;;Cđu>n8oFO/G2 _+w2_ڡ 矧&LȺ4#TN94JH?)\m &cܧP-g͘S㼨(b >oodž^ ` .ǩ}㍣4&;{ UNs='sy\r.`SG}DWo֭[7鍊FY3IY 0>y޽+|.6z(˩J @ D"t9##t|ZZ;2fB~o)M:! ~'M=$=J5=EM_aYS-܀ VhyŲ%9-p '8,lrxT;bU\$< ?@ҮJz-ZH$#8 ޱY>D R.G!⊊ 8a["69T,ZIhB,ɑE'P(%&<@#t9*gڈG1 Q+c, @&P0t=s[o&˯ip_ ĐNTlm'gR*Fxix裏&O{'Agq.Nz`{ŗO嫯FTSl1Y[Y$[oMVO Y&i'cV{|o900_p?r>Dp2J.rW=+ݤ!wmVB̀D'GۨldBd~LUv*:ƶ\^\j#:#R p;!7[7 GP`y\=:cʪK8pr)I~!~.΀e˖Qʕ Dndvp:pΌ90xEϑv_b;j̙^`mfo:Q&& 2M ݏڐ?={H\X`r_VӵƙmiAT Vy 7!k7A %@l2rcmw"G}T~[{=k#_"-0ɵΞQK7nۺJOI0y7Lg)3˽/d-5ehm7t8$}C Fscڇԥw`p\cDKŐb dm0 "܄$/ !?r! U4"Bc(m 0L:ltݓnNAL1Q]\4ݳ{>cDwXh(OZ~RLVp q5Opkg18@\7߶.땕-O+Wp⢇ͥNe,P|`w$={= #=eJjD/X/W ɩSUرcUJ[LL׋N(tc5 13f=^YYk2{0ψ \9\Lz / gLwg}+PfmE\j*nj g_6@z+ & (@ys{kk( n@Z(McA,pC)6u҂ }X 4n >(OA 0*6G3G6#W!B32xPzRuG+6_Tp`qNp.%{;gV[M ؀h#5l@pxM]$c ctx_}ယ4$X mu9ߠײR5^qŕ)ד~Jg.|v 0b\'xRFgx}ݽ}{cu':8#b*X3xo\ZCT5n;nb3]N< l/S?0yLDD؀L,1#Q+Xn, 1%]t#/ts,nEM6 ‘9 ?*9k)P>VbhCD(6jɿ-8>ogrs6*oc"bMi%~Dprq1kb7/`4p]qr696J, }H^`3|r -?{~pO:VnN9Y> L~NAV.FYqr,^%D'=0V1@ώ7ni?-^c1#&.ow{ǏwOtL?a x8B=`,1cr3YHIXA,lu.Rq!(v${H-Z(3I['jG+Z=&bdr~+wU^YYDSfqrYΦ#u ]H|'@&\1JgSއq=?=Эq7M4JpC6Q?zsf~8o <Co-ֆp^Y2XƮqߐ{)Gƍ/SqY@D1$.iCT=Sts)BaCQWfnk?:+ <{ 쁰{ 쁍o- Q@̈́ { 쁰{ 쁔z 4IDa=@a=@!p @a=317Ѣ~%K2`g\rq|$S }ͷZ7ɮiӦ{1;GIFt(z3gJO?M~o?͈Eyķn_i}.,㹾GBW Ifx|F\y}gq̠6VU"r<8Dpˆ2#phL ]M2H,xl/^AdpLA?"q7mp ڀPkqHd]ګw,YVMՃ}Dա"K^2IӹcY";n/+w'.h/5Wȇ2.GG%T ;uH|q4Ɏqz}䑑cf̘=3 _b3~w"pŊg\꫱}Q{OgyF'dR L('/m,D_!(#n2nW1y  W C\yVWH?;Cd%8W63{Zs}x.w*e1mlr㒪JMێRMm~V\_!P i}G>#"Їv@$c9F9#aoyp&?x}r)1*,,ԴK$ p(~mݮՎ{FE`j#GO>Q_6qIS(K.D9m z N㓵Eڹ瞫cy-iqov~NiTɂ52_Kp 9TE ׮nH+E͛y)MrY?S"IH?hhvށ6يyuǗ{%vmyo_ +/Hh-yrDr)/ߑD}E"OB V 0&.0l!r=%^53cG~3)2"-|ojťf'N K4!w׉8 FnBQ7[3%ˡLʲHVJ J:142)/,~q&]Ӧ8DLĻ@,mw։p.5 e8!&N8A}-4hG`YLX&K\v޼ytRšт5/q}Ztr!nLDi2d[GK{ٵq^R-ɚ%"P&MtOcgH3.Xh0x-q|uzL"QWӽn]Y8M'O=X, IKy,~t60Gft!`JF:Mo:a #'xi  q1c&#,Dƀ.tncKs*8|J \ճTF׾W;-*qm{[kNK 2IhiGHAS5M|hXgeH_ةPf#,"Qpg'?~ }6u\ygzp l~Dg\Dmbac0nfC׵NAP%"v&n5EqHv ݜY5)8&Fp=hi8K*F xp*1r^Oo]3v*.ItF3,[O"'u)X&ڈL:TAճ>=zI?qvLLU)c N,\}&\Nq 221 Iw饗zeeSK#׫W/o[ rE~o$1spN]wsgy=~;K.e*/i%&q6&NAr7OߴM_o6+#z.cBBY x{8_S/mx>԰N0T'G/g=jL  hpU]D8m!>5 IE?\ҎP 0@NpDõAD Pי~L*b¤ UTT(p$n.cϖIni;边s#}Ү&s3QcDp\4 g)K]wHp~q. e1 c8 {HwMtwfȻjlɢF(CMD8pT!$S-XXF&|0^Y9G#n}^{wj!O?K/{Ŏj,ExY|r5akcZ("j#oek#\‹/D4Q`;x,B5X'K-x % $_ 6lB9qc+kRR2x@m/O2&zDa?M3ܨKEBQ0́%,BNB!JTN}zyS~*zk!@%+fN*< ^ܬʵ[`/kq7QC&%}FnݜC3iy\uIcet-P?}϶L I?ҥ{nɇ{U$JfΜ95D8a:Z=F"c=US둌xs'rάvB?u@@N%KP~tM\an*Ed y-Z,k9(ȱpQ V"(\?h{oNژ>MF[(9eK/K{Ove=dH]{>-vIek ,mnb_$B5-K;@ Ψkt9Aҙ덣)(^df$HJoM뿟Ki86þT -uIt# n ".V! .(Y, *CɋMN{yVp!b]#&>pLsHɇE^sD,duEW"*Nv֭I=NM7ݬ⫣>k=E̷7p@_N=LҨaՙ괅I@s rpjFnViR ;o{zv8{^9s%;<6S6l#C`©,S;O&Mw`vO]Eq߾}4+z k(Y]BG.4Y3 L]b(Yx;w[j9K X'0N2q/E0tiG늑ɏ(;4]87CPD-t'[yK"~:C!p' 2>Ąm : h;MrC;+tp dm1LDXi,\.g.'0 %/u_,DN:3qhI(X@r(C< \+ѷ@%qK5kVqDDH-@ߓrk>nX[ p[[2/svr/L{b׼{YW椓FA*$տ!wIO&! "7D]#AN/a?(cϤOZELFfy">Ҿ@d3&<l =H3V`׸h+nyQxBbqG+Kn,̡V2>Q8T&fs淛1iTؘ ,#c\堜AtWrЋFY-Ays{kkĀiGEL(ڠȿt҂Ji- \BK *g+PA` &vcόw4R+$ppL)/+fX,XNKVk'9蠃t#=\ ~7G>fڷn.# +/ nDugg5ʤBCWE@Gq`\.m+˹Tmnx'%p\3DSN*D?C!g4ŪKU +<^ PgqO=/ z>4Y{ÀFV9"FGVG4Zh[Z5|YYpÍvYʾVzRn#87JF$n7nxUV[mȋ3dm@ǟPQ"p6~"Q͙]=)Oư6,#bN>!a6XÊn}PcѬEK,<=ĠH10kgu8tF6|襫i}a$K)Ez1{`}@WO=@a=@x1 @a=@a j { ͲB18-#b0J=ݔM]W Nͣt~bx9A>Ә#j;ȶQŷK2C resLdT7Osy̝O6uyBE26o'n_eqEY7 .9IMxXoz)1U)_qR;q;+#\`M hDZoj; ^>uy.\a)&8!SqblcqY,DŽO qNNoI>x8Ƈ#[(qϗ?_*1cFE70N:Z?뜷p $"=%|i?f[Pl r9傧x\3 ^иD,_$rԩuJ}]'^YYpȺn0"|'傭~ 3P;#v^/"ڕ1o'ሟPk`^ !G@ 5=[1땟}'e=FKtNwu58CODAmL~C] c=_ԥL%ײ VSS 0D@,#ph85\*5D F % \3(uH8 D }!y~4R++fh&1v!" zC[YEd$Jqb[R7ih3:а6͝e5uA{e;䣇H" m&R׌MJD%QC܈ M; 6{䑇5 Ἓ(0{pO.T<3_s͵/a" Rj窓Yf wr,y5wn@ϒ~&"N y-Dʴ.0z=k˯"GQ}D:J@xG#ߠt;в_w|_Diʷv ٯ:)RB >Z^s}N24zgaULTmo'J&D${חJw0$jO~(_:D,:\Vw!H4!L(4|d\PXZD"!^2M.ncL:nאqCzha}wxMCL`l.1ѮP]67mCi!29x"N9(wdݏ5:;J^OUڀ|2JN8((;H$F ?Xqۯ%: /#F(ܻn2*8`A)~ ҭ[W]@£H /fmb/- ɿsi}?TQ6;FAbwrȐ!grVb{̽'5tyir?ĭn۶ص[6HXdnuEJY六i~)ukq.5L13KU81ݲ~,?ZNxROlGzEf`AkF>$u5-z$mDtsE7S~#gPh<\4|pÝҮ[8pLS~;ȷJiǠ=W;-i3ʿ*l~$11-O_@`QkpL8t-q-t6n5Eדw>bn̙5Ys1\=e"9&g$ =>U%[-Mc,,|kC>=zC?q,1QOh &Fzҟ5|8=$vA\tgϞrʩ im?td* 1)Ėf$ e${YΙ%!d(jLƔ읰,2!_7$8hA5¥DԤg'ē>3Ugoww\^^.er!~ i@PbT!}8/*k7CdpOQ]:]ދdzcC/0xjkpAoq:u]P?s]r%G>#ywk~F@l[nM7;z-.I'TuAxwyrzmYP+|=V3@ŤY AtQ'ᢕ໋2ɋ_t A/̋o 0l嚺 Ldm ]*# `^&M%tz{8^͐FAm.وTlVAd3ƞIbĨ!۠\TGEt M+Z 11C\ 鿖ߨ_Y9ԑ;-L؀GKLv dQQaNcB{΃w& td` z.UZ*ŢCEd::X45O:y8-A^[oپ+-7XXcK4hE6hB%4jiG۬iӦ)@36|vBÅL5C>cM9y?!F:3,bi#1uC! M?_?}Q0W8ɞY IG}n6VO YcI+A߈X8AN#:GxTE7iYd~!"KE0 ״BpMW h/x%#!tCPWW# ;ȶJ1"Z|ubŹ!Bg9\#&MkǞo/Q8=xU Na&bCuTY)-mBUn9L(z?pJ:cnYL gϞquIېnŊN!:WbI.t6=.[D9D![8qpGEW#Lu&Q.8ZsTP@Y9^)!o. f!dG6GպwU;zR%{K>믿֤djøħ㶢~JO xS{Kv /m˜q4L1w=0BwJjio@LҡhD<U&Dclp:1 t#X%gkb dm# I$?>L|yW׆kurnq8rkc'&]`g0cv-čTYtͪtGC]Dc^~TH) ;O;SF#I{}*G-cwa`L#|4+L|eevx@\[8ٳjX"#hw.9HopJ>Z\k1CD.xzB _xydF䎱. GԲіԁ.\Fn%L\ї~!Zo2ݫن8$,f# D_̴)(ȵ RĒjuĠE%TDZ- ?| ډb> )q6nb|!.[Z׿^UjKX۹uҙ:.!^/:{:܃$6nq 2T!-Z 1&Ԣ'*wgڈG? 'ak<d*{"NCww,p4~iX_ߨ{gI3?Xp0M( Mm$-Zг5J0lk#Q[kS2JNo ɊsoQTYY7j(U!T /\ESNkB06eՉ/B2j+ZsF)//O%545W3eJ:SLb!}X ,bjoVno~Y^yU[αc*5w4G+hY5>/ZΣc Q]1:÷)d*GҺpA‰ <_ \[ n6Qp]wlNhMAu*TVy/^[/!ζE/wE2-"m<_wXzcAJ'b CkQ1by_Ƚ[g (8X'\A_"/X؇1^s!KX4CL KpSr0%Mt^Aq͙.`X%|q8N{A,c 5Pt&jH^9ɤ  Axt,G3?&rW;gGTtuWkP1blʰ՗w.|P7b=蠃 q̘K/vmucB8~W5= & aXU8\ΰtk7-eтyxx_b(w>ĺ簾b /J"+T1ݽTEo(-lpgNJ(/tƸ]Bts{ƾ<ēZ/8JJSGqZ}~rxרu~4 issP.Q sp8]3:PG? qZ ,ä*L~^ˈ|u)qB 9h㜅\ew[yOXxN0 EΤ Cz{P""K1cƸb+>c ?څ# _wH(#7"^7/\nd_-(X˛y2Aߨl1Y; \{ֈI4E:#k|]ƏRj:U}{ŵ6]_o5L#ztiܸeB { =.=3ʭ fxƧ6q&=D3E.(R ik"#dm B~J >Z浊7|Y+ <{``HR&ڜ{`s@=}=Ϸ"? ,쁰{ 쁰{ G=rsԑa1a=a{#,|;DL26c[10Xڹ㾉OSkq1I^۷jF4@ Q|6eUHXTe`dma$8&Qlo2[Z]YKa֡'I7SSO=ETY9_]-,kfO4?΅hhӮU×\R-ц s SE: ;C@Aۯ#Gԟm>r¹瞫G5(_[y/ H{G}&@]oC|C⸻82yW\52M/Oxf%4-&s&Q㈘J{"&^L8n& fy| 8Zo$yQpS&Ϸ3f}ܸqހO>N:Z?뜷8>s;W0NLZ} NӍJgr_rsm(.^Wn4MHQX_N`^|OxY*QXnTmZ{yyD|sg&z`ʓF1m&'ʎA dg!pu)s,zD555jnG*Lq*(6tKD_8n۾Hs8 6QpČp8$pA!GE,DȱI[YEdܭϝЬiصJzHqqĔ} U o)B߶n#ʊ*&s N]%[=kL 8B& ;Nǎ}@#<,Q)ppMw}WK%qETG#&N{g4\+--W&[lwu}%d Sn,jHoD@  NDT10Y1GT6i1T/b5̓ ZDb Ǐq{ s Fqrn5 W"&aZ1LZ jj{|`.<8*ϘdTKYPETz>|y>,Seg$ ͎q I|8|7`ܪr.\(7$Rp"λ'V;o(1?#5 aDy2ڛ6>HLYcBg  # ^:MH$`rP"u|~)-/WmO^*!/UZOtp2y%W'#ߓs*C7nk*~+-"q`Cvp#f2>)qoi4a/=r n QBA4Lt8eN&$8 T$ $B/Q(ڃ(ʷsOF#N%LL_्4hȶn ]"y6Dp%;fbp(Z : l5.5AOGϻiq 'O&x LX_]4ekxydLc[y טsCGԇ֢7!5rǐ!x:Z¢ݣ}ћLml.os;~FU @,( Cc,ܱBt9"bkP'10]C e0, ]+Y:{#==0nሳ ΪӆEܧM; eP$y*λ@S?X)`=\'G~#G=gӇ쎝i\g6 55kܢwC![nASw 0Hw]w C) A}c}:u8Sfw8 5{?ZBJCGwL8 ~ 0iߴNxpNĐ1%JF[zC$4$xQcJO_RBn(QgpTq59mxKR6\dK`KIG0[(z2~j!q . }Sa6Xqޚ$[>sfMքތinn8buʄgun!Hzpn\@-)5Q#R9n$ӡN8:tg}{_1$ +..PoLX&Lԍ[T쳷Ջ&Jǚàf?AҺdHjF.$nr2' %W) \q_8 "X? 96}oe^,%[֯SInl}!f 2DԈtfʦvxoӮ]?@z>ȶ Gc*hk$RE3g}֚ @Rr̘]x'~%bg|H85;ԭ5">ձfRAޒ :STMMHk i;=؍~8q|!Ԁl2-IAڤX<`PuvB6禌J/kZY?̋',Q̞8DRıJb]#<^z%Z/}K"9͚5vmb@cWS3}?p7\!myW}皛K(RhѢ5jTJG'x5{=[@3I~:p/EJŢcR{m}iF9q<% I]QXTycۺnk{g׮O}ds!Vw3^ T>s e+Vl&\E!A{J?Ӕv@U,q([v0k{bC#j &3Ec 7{5D~cvt6~ofA7vTI#0h,=} 7DH?07znwwO ׋}N58D%0>os~})߷PS^F>CR%Va},Q4qr`a ڱ@6!q6smg mI R(]/xlMuyS]m "6'MOwGy fZ3a-:R;hqqPlN3:&" WlxB0 bzL: 1b|I4p#~9#C "7/8! Y~4 le;z6Nkě g~pZ zH e?jH_"$O3!lZ2'6P>z {H[[tU2M&k£"9𴄟H*Pxm.S'+D Lw'%[%瞏'cxr!Ο"G!ޡm<̰\-j'$F+VP)S.ӱV:u{Թ_yonH0R;Mcfjk{ BI$[ߐ]k=HJE0bMq]}'ԑGˀ1Žw^V]E9.@}O}L]cq |\b/w#m!Vj>1'9OΑ2x祬Wܹ >3QYE5ƫFky x_ zvv{ؘjҤI?HE:qlvӦMKjr({%6]ާ-ViiG% !kG,x<4oIK셄x}N8Q?8{Yϕ!O>Cc>$1=WUBŵg4>zLe3OE)wuw Gjd #O_b l#y,/^>w¤ԥmȡaZ~g/pVfDԱP#gZ~y xo8>Hgwʟ .7g/h#FԺ:=Sk}㎩bQᏝ˾0y)0eٌ71jZqIFG ` ]A}::.̀#N$D",⏑l_.SRzbI;iPwj>*0K0r#ͥ(B}^ܓN 3rۤ=Jq2 Rp@%aA[a2J 9~?zxpHӭ!:> ̼D~'7@۾3mNj( e\<nDHbA64< >"@^(tkSXy` OL :{4Wzk{!Ǝ,Ht ^8C2˒ `mlu־U-sK^5͟w=5T<m=D? #?H"٦dl)M2 [qR:[{/V{H};ïNK٨|R"EBj su=HL-Lw\c*Ǣ/sЬQwoҾ#~%!H1Wƫ*/1 =uHr}|I*mzQ%ah[8ڇe X?vKgm+ q sÍ/{?PT}&CE@>l܃Qsr|TĦ4bu} ~4ݖCk ښ$²Qo9e$#IE w&+FMXTk]Ł*Άq3ڷ 88888888PXXX~!.bGhhΜ9w>cҝ]q家6l2wW''a:8rj|_x~ 9r&~#g)S.jw7>'+&EiweK?~ߧmke:>f;gWB!sCoz7dxJTvD'i'OK,@6z-ܢ|Lwp(7N'qȬ1]^'#qk*\Z`_G̼| A@S<{c~[A ^/_ZRh,8o%j|%Hd|a}>DoHWeIcY܅`ŀB5\8kl7rH7yyLF%] JKKO?/kP~G,yuFvȒ($с|;wIʵ#5(<yΜPo3fHfx\71"rAi7|Ss*Z({DbHV1c8vՊ_׭[bٳۿ%:e!F?yx}"_ m򱪀ʅ`s6g.6[^@1kE[HF?"A6a U 3H2k&,cK<+ Y Fl P@AC% yQQ,k qL#-B̺ɐc}l}4E`1H -Nַ`NLjWY=2)pWY 蚉5-Y(a>RI@e+Wsyh,s~׵_`@Hwqknnv^x#PrcҥMrR8! A<۩N:=4{;K;>D wM c=@KWRR.Ri5q9xJF=GO&J!AM󟉶vHA"mDz_\|^gd:%W^bv)$W9o$y?_n67oqQM1K;N DuJ}!ԩ9%e|Jd\ 2s M#͗P[czZeLl։;[$ʚ/k4!%U$OϞ}]^[G ,.{TiA5+~]>p3VhHH#H^yt'P0w;WӦMTI;ʸ<^1p hԨ:n]]!D҉iǴ)4uf"cGYp2Q&>fO=kh@kiK27Ng} ?(#1ֲ:2QWŕCqIŖ.߇"-=y)7} 1^E)kMI2N9 e TTBK?}qL;24@--Q]ߗT:㫆DJ7ʱ?~ZM: KJ*juN|s H#ͱtoZ|^$2O͎d>4% GojEɰqD.tkh;4˕D h[`vELA#.$HP$YVڒ)g>:8tFApֆdP?DL%n СC8KiD 6e%)sjS֥XA^6kA͹IlƎI\oq!ZKns;IA|Ɵ9gcJTЛofVjC`B&#E\[[׺)*[׷~[Tбd׆( dR(/TKw<__EISݻN'Vu ^Զ;P/3wyN tuasG|zA@@DMB+gvOG$FB[S:>[[l "H[/嵫WhBMe1'#E +׀Ps\!K% K| Kul T*\%hRPERz^Y"-Gc_"-eq3qIl.]8tUge,ԝGV!LDݑ?X!&u6;,4n>'oEE-80Y=e1Ud;4NMɚ$-ÙfĈZC a2+z͛*v)jזpk# qpy1\JYj#2z0Db/Խܼ\ꓪIICTsCq '6 vFߓ5I&{R9,@@aW(c$o|P"+u?Dx0yj*TF][۟: QiEk}i¶B !~.)jq6I6@Id{ :/w555ncjʆ%:bII;(8# G [/OO?EjT2 ,"?yvн֊tN<=ญ /ӟ{vne~& J3D-Ag?p[&j\5km~:v=k=g(x'3g}eYx8l. p9/| g^r?jձHQq$W<@i &N0-=~,BXdIż[׬TG!q(JI`Fc׉2J=`R"kTyaAcOLQ/|CM'7n w}}"yoJqрDA}Hj/'+Ջ Xf ,Udi)V2Oa;֬jVP *Q\Rm̋c aPQi 5DM|W=lx`ws[𡶷r,G~53ǝM"*c<|PΡ8yI(x`̸>>UVPn=FqaƋOUr{t4 jO«}ٺ{U8bDk$.S犖[oiɓ-vЄ U~TrI`oe9FGqyswiLBGT'u;֖λ;QRQh]}jy~ڊ4{z>~(:uI4N3m4)uvBn/&LP2@򗿼51}ݫRDA'wZ p"㈂4U~#r%Kk8ÐSb!pz1B !#SlAW#kFxA]ܾđ9xù"6siHm7LuBq9o5ؿHzv|(N2M( HÁ0'Y!vp fG Sp L DS@ΜD$#20'#tɢv([+lFHD!Tt !u /? 4@} ?(OGG9ln|2;ktȽb03p@8;<"C@IDATQcmU9s_',E8đq5I;H_# :#T %JB'!p _pJ6kZۢJ|C[v~ 9T[bG*k 5nH_KL,l@I{ki~s}bzz%~#U A7qd3IFkEpd#1xYCtnS33~1>Ds ]@r۷1s[}g#Yg5caW0|y,DPyřH^$]u-3kMlq/`qq;M̋(="E4tt.e9%D80s BHKQoDZ6]D8r -|aQv{#Ni@ "a|' .͟ea[KXc@Wq6F%/ )&:} FMtHC$s8PxơRۼ <nWxFp6Jf4Sÿמn8%:/?PS:i{IR%3kc*ߖ5O0٘wjqԥy9wBXa(p p p`{@p\6D<{w~tbP:.Mԉ>ϲuĮP?>\>[B -Z0S>Ưj_pV<gqPYS<0hgy&C}{&sAˑB/) $AK%^10Qt]=-߉Hh+tJؒ)3~Hi:p\=cVtm8ƥ{6>r@]{pDҮQ;1:t#$Ém5GR Oȕr΁,ݼbYJ|KۻE= Jȣt1qHGhxxܻロCXSrOs@|k_b GJ::QzFŶDvwY-1 lυt}f=R(ח q{2p JV]1tinHF֏M{4,3KZ& W6$S iKqT2_TRbn $h8_Ųlڴ5,Jʪ4"iW47ɐNC3$ k%CȡFKɽ[98#%aGh9IƞTnDA`4}䠼r[!}m퓝z;|, MKqTIז裏v'tbbx/lvJJJܥ^q/XP3֐!iqs|H--J/ϸ"H}CR l?%L#i葦l0]Iw #=$(L9r@ϗKk=RF?ʹ"᱒F$f-YI͇ec%|;'ΙAMeZ/\fKhhdI9Qt$IUL%9F]_2HOZD;wz$35ׂ/ySž_yHDldu[#aΓPCgs徆^'SA?x߼<'<оb6pp`7X s?0V7PTǤ쳒gݕuuRhjģ_rNAK3g)9HY*qմHjvJ˫4‡>f1fPKZ=D:!ii!(M50U/&B -ieexa5"1dFl'ٖ̯OxU5ctkf6֩4CQ؃Ty2V^|>vJ*jHZl[d8w8MM sߋOhf?9xn 0bDI/X& cƌ*/ALS6$9JIG0gf9  O3s\[!ral!}D0l(Yv` 4;eNxҗc-Bm$~(yũ_ݺ9я^$@7jCK/I~P|s~NSؼFI|$bM)sAC%w#ph%s`VpأJFƸzz3>g:f3V\H9lEpW pyyT9,y9׳GHT`fxiC*D%iëykx J`@9$yԡŊ-0Ll:Pj 0[Pa>xU3u(ՎsE9B,*veW W,O=!DnR_ׅ$)>$k4J[rZ#GulQE ջZ]k[S.dMHUyTb,6dgy{e?VkyNJɱzxw8#FԺ믿a_C?MN㎣v̙};e?qDu={KwΕ*Kw"#w19m=lG (!#P);P ) $GpYM;8.Eh":a8a+Vd^AUh=T4eڇ:'R=~ WƇvy|ܤ!R$ ɖKO DI=Q&pvZT!=zC"ց3ɴF} T @|~JdmPQ1>4kpyxY"U^sǗ4*8F ?Xp"-ړƺ m@@r/*%WsϞ̭2TV\:d-B D @\RB$tf;ȜEq`B9 K| Kw\|,6RK Z]WlFYsTh><wrFrӧO7K4!C:뮚aك[_ĉ;k^^x#TuI~suƍKgsdY% n2 pT d}luJbh)7Ćq)X_FۓT|RrG@0Aղ"B))zfn{$q 9*S@#4SskA?7!yO8&O{5Ł#| uS_P u(&yfFYr_@皖ʽU$νpD:[>]$LTuH\Z+e79@v13rnѸx17>kV-wH A((@mKTF])3{)@~`1}mumj}} _}'L W\\n&1-A=[LRh؉q3tPWYYi ~ba_idvp_"K&d>oĦ0w?A+,$p|)-u}85%A62iuVj]9DMy4BTv; jmnY?kl)͞i!nc?յ @q#ls ɫghqF7e8`q$W<@mdi zi #ڼ, W)$;q$RW8G!Ӧ '0&?b>7i&6>1o߾Eǖ*q@ۙ}b:|!?Yz?5$@gD*@o/^&O>سf2<~i߿v G(UPC5 2 j,q@aLp8fPaQ EBGTa8u2Ap2aq&DsЉ6ԙD !yb-c?/r6yƨBI^ؚE D97Ӝ ˄]MrosĿDֈsxԗ vxOi#8^4z2qճK!k~NlxS>)hq' >a[5KXjj9C) gN"Y,G% ةR@flkTףGkJFir`ES-T[߅]+]@ x_ʓQ%< l,W+c-5,+at'-mX0և-Ycs֫j:s_v#F1N,Gv~ǯ|xun>9ƭ# ?‡:Gsu]w+--q2xRso)|K3аE6ރ0"aZc/.[jy#K{n"E [dGIؼYl Rme6t$wjk@H(MM)3 ASũ;E!uFgGa3il%aR7͠b@d Gڦ[c1m>|#ي >ah}Smqf{" U^d@I{d)[Yq+aAiV,qV&` Nk!&#K4Rs ]@r۷1s[}-Zc#ᄇ]A8p }D J؝u:E+ &DʆD1J\'$`REEkp|Tf"zd{x'5kLF뱽Î5;LԐ~6W?> ky|A%M?f!Ճx#{TQq _nJ=m bnkvFΧ_?qAEgt[z  Q"t%N9BJICxin9T4BO8s ψ.OZ|8\gI>WZ7gle<@+Ol gdWjhm7ӑ5I&e.5OM h̺Z MVi3b*FH@8O s *#p p p p p p p p p pP88p{?BL9cB;5pHwɘQ-d(SvKOSPs2X%&ys&.h#P9hp<{NC\}uϓ8P:.S͙k9gٺYbWJ#WamkFmK.r5%?g24C'NF)Du]x,g4fhI5Wџ 8RbPMIL2g.9HK9sHZY1NfI,0ϝa y.=t Hˁ=+KiQXޅ}~'1IX>F%{OHy)' ZZ'>$Ǥ?\'12,?vx9@]׀gRhB|et)[XΙ&7ͽcBp:}ycÞ50;m k=̻}s HCGh7JFֶ=$]`e@zI $j2A)U׌MtY*XZRooXYҭ4 K@XM6H6yZJ/fqEs 94PJHdc9th}\c}`:NeQ+cZA2 \O-iӖL ?Ws+$CI]䒋ݸq4 IvM7?~{;[>󮬬\LЬ0~{W~׻^{}=f4s_|zmVL^k*B,Y⮾ܬ?OܠA܌3^{gկS~ik?]g>g#y:T 3'3VyWI>~|;XyqY{DlC&SQ 0D^א5l?m+%ea2/|"_X#Ǥ;X$%Ɉ~$o7$W"5iɰO8>$Lo;5#vXY7@tW-9̗'Z._>#\"gI0|(_&وH㙛(#yj 0?ykd<)=%K:} ]P'덽`iDd!md6kGxl=4Ch U)cG4zƢ%K 92dK E'SQɽ&"kK>*N*$;C٬_/ȋ`y>XXOݵL gr/H^-.n31rlw>B4qݺO6Y 2xzIpL,qiJ @%XVc,uf20MbhȖWupҎ>={~g37mXƺvYjH-7%v]V1nH(WgCE+]xn]v0dk`8˗Kz c7axeAsiK>uF@}39r;+c|ɇmH6AIwϐШXlȡ{&ȟgQGMXOv%%% 6YկYoyFT~L~[?AI_}T ny@6$V_KHr:Cd>~fT ]痆TjiV` pZ& pwIoף%7!+Ftc7!@cgH@dDPl@JH q,hm nR.b(v(kgCϤ=eݧd}\O@2gɵ*΋6٬!d5pO$FpؠA'a>}o?F [PoNs}) ?5SKm=u"O51P:gHx$]ߛlQup̃+O:HW_7[r''[I@a} hj9AR :$uC"[C؛.֥el>H "Qs-yy@1Cc|_#rK0֬J Bu5Ҥ^" nn}$w'o,+0(~.R5#_$ iEБWKzK9rDb wutDa;Nw{ p4ig]g)򛚮!҈&/%\Gyn> z=۝zj |=p'eOH0y#}yu U3f*xCwV+ҦLx`oRkɡ}H Ёt{fNj/6~9 DC~\ 0 lY!>Qwqr=hM|r9WI2JFklr<\R^vHĎ3$4E֏s1RB$>v Gz6'Jn#) y \:hKD̋݇O76Wc80yT Y#sx:y!oa/:NrlFxAUׅ\={vjljz`_ZUL20'QWœ*z`)|I?}0F ZTpEjr>_p:!rJ"}iA r!3"O>i9o_-^XAaEEJ9rX>}JB"5ztw9g󇐆BGv^x#'\4>\)+ >>zK}!ɁPWV$<̖̔UqxjUk|ݭtl:Wǁ$<ȴk)BԘH)g^]?F>zfh7Bk`ئZu Kt"C4&;H~t D*i/. "IɈsIaրt>J!$?Zۧdk{0ű ^A]X%>͒{6aۄ8vuh\<c$o|֬Z.R&3x@JmPHwvB6B;Ar\H6)$و)xlBH06 )*ddr>$1D(mzˏhp]Pm1,vb]a2TOeX\%ٍа|\dxBc{<ȗZf^lm5brmxbGk{p .8G >H熈3 &؏)%1AI[.(di %%߿=;"l!#[@x2;n]RPwn9`Vu`WjE}k͛C)`d %OuTB=:eQѱP/Ѷ)7I)ƎݧM 1  Z86.]sSO=~{}r9JCCԘ(S}>ٖa'/̩Jq@?lSE C-d.[6QTHxFb+E!ko:p 'ssGy:Nwsͷ~[d vzd泿Tt7+hW:8B-'=|Sl璅 >=#3ԳEe 9Ol[%W:Z6w{|qK=If13/^Tx%烇84^?TВ8H=yXj4ƃ& \HG MNYnj&p~{ {7xb;kaɽ2yDRqNy^ 4[C&>bPh<6.L 8O!S\nƉk9'>guJ$g޼ywyZioo`o2TO؝Ysi9ZN *;Sg<3/H+PZ8^Gm2m';ϒTLkDu4xx>?&/,` pa1x[B Ea 2R&7{! iqP3^jy18"#c;8fecmi1m5d#>™n)ë%^TstxG{59{vqW-8׷mI{zW +aAq4*J+P/ QY?>+>1>Tj\0q! H_n6FtnVy$Lx,< #pjs)//ﲱ9>Fm}k_I\&vS<[;M$58tQTmc^f @6+ QG)yHv|G0.vt{Vc{snV,Mֈ"Rd"9ObtY'H|yemUPΟRdtkȖKt t-/MO5++ TbMa|RZ7wvɺpb_F@q$l*w7Vfv.p p p p08888888@ \& ́3(؉۠XRaG:1L8888888Mp 8t2 .4M^Bqɭ S9MrzZ#gٺYbWJ.)!2g!wkF3I<36ޒ'tyI??r."D%\^z%cmɥlv/qj /]Mԉjj/3g{%wb5p p p`@8vR-&cK d =6k]1Oc|HK(z_g2CK2 .LHenE.#j5d>* yUƏIcڈF2U4'-3'p p pK9$ybC@]Z[ےJE!8^6ILmd1S]36eoYFI7Hl T|@AC% yQQ,WLv%eU~4+udY'@5'Y@6Z$\c}`N,]eȤ⬙=` N輔3v:䠼r[!}cu#W3A Np.]p/n̘1zM,Y⮾4-w?|~gǩv^ MI;?ڔ nsZĉ~mu~?|ԉdDG~kz̟N8A#:Eґ=C:@v?pwKݭWe?3%@fۮ jkkUW]%WKF};ޒ2-]pX=YqOORBֻ_]zÆ s .a888]s &ٮO'jR|DTnjMl\n~ m9Te|t4Hv/LƲʘe٬57 / FNѧgXl6%73%5OCY.q4kSrLJD7x`(OJ Hv,dߩ|j=y-Z rFsgҥ1,X5J:jΝe˗/2c=d-<Ӵ FdCqEͷͺ0si:T>!`Y%ni> MUMQ``1{Jc@=->)g\\ܠ T&6seF$ޮnvL~ uHרFqD.tkh;+ΧDi  Dn}F.$HWHF%5Rtmves>X.Zh\2?Ѭg 2T -fbyi+8喛߭ZJ$jk׮w(@y[?t^ve|M"5ᮽ6JjՋ.+r瞻ZtcV{y :w9?p_qE]wݥW^y%Q%vyNu9禭ϵCjEkO p+M={+[/嵫Wb*BLg1D45tJR'E]/U8D9 K| Kw\1FC8@gHl\ԡH Šru@zD6*[-Ҳ- h&O>_Mjz!Ce?y'pmɏJʉ \mm^d%U.d)G6RW(ā3q(NY#H AQ 0%k])3poQ\$c;F@KtUObQK;RGlR0nɢ*W :@ct}j*duJeogbfM 6PT-Mv0%n#@bK;XFJii&w'交?WWQ.rgv?pf

YFRutPߤk6Ȣ~Ɇz1o{OmU"4 9c > '6SKǔd3'"刃 ‰(EZZQ@ ר Otk"`R<ѧ]+]@IkByp<:*R<6jev e Te/Mtۦj۶IYH_p O Ct?<@ a+~;wjO1*h0 8RNhprmp3grG8>_cѱ&L@7 XӅzH~ke?rp{`ҤIrƌc! ^lj}~N_^^ca'p p`{@I{yn0V#bJ+ݖ@L1Uy`!QC%1_5D053vTѾa Cv}>1bmVi #iZ]!I{J؟tj\l"qYrU!^𰆚veTKu֩S?GJ4J(ZF ǁ[pҽ{L2u7m1D'N@Gpaq wRn ڸ9x>Áb_WIa(q8p9b(p p p p p pŁrúf]8888888@6p p p p p p p od?>k,K,q@"{֐[Xywk=Aϟ﮸DL [9IF9sJ5nv2O3ff nDved8Y 72շ,lQ$qdesQ !׿7Np/2EoHwF~WrBn{q?I{$^;? r8FWH(*ꨣL4yٿّOdO@@@@@@@#38C=k,ݒ2|E2 (c='VWW~N.tMեQ@a'p p p p p p p p`s`Wd;W7x`wN:Qmqp/~VZ...\(ݰaGM:~뭷܇t 9uTZCr gح[7]bKKJoF,SOQ`m#蒒*]llltK=ē6WwUVV5ƦQ@a'p p p p p p p p`q{3M6-[[[;v;D (Moe޽{k HlpN/88888888P(DZP lq۸Na;p/AX@@@@@@@'J TIENDB`is-1.4.0/testdata/000077500000000000000000000000001367660116400137525ustar00rootroot00000000000000is-1.4.0/testdata/example_test.go000066400000000000000000000010231367660116400167670ustar00rootroot00000000000000package example // CAUTION: DO NOT EDIT // Tests in this project rely on specific lines numbers // throughout this file. import ( "testing" "github.com/matryer/is" ) func TestSomething(t *testing.T) { // this comment will be extracted } func TestSomethingElse(t *testing.T) { is := is.New(t) a, b := 1, 2 getB := func() int { return b } is.True(a == getB()) // should be the same } func TestSomethingElseTpp(t *testing.T) { is := is.New(t) a, b := 1, 2 getB := func() int { return b } is.True(a == getB()) }