From c0465f96051dfa7ad857a1c54de6a4363a4a6399 Mon Sep 17 00:00:00 2001 From: Vadym Slizov Date: Mon, 28 Dec 2020 10:47:09 +0200 Subject: [PATCH] refactoring: remove "StmtTraitMethodRef" node --- internal/php5/parser_test.go | 264 +++++++++------------ internal/php5/php5.go | Bin 266451 -> 267006 bytes internal/php5/php5.y | 34 +-- internal/php7/parser_test.go | 264 +++++++++------------ internal/php7/php7.go | Bin 221592 -> 222523 bytes internal/php7/php7.y | 52 ++-- pkg/ast/ast.go | 1 - pkg/ast/node.go | 60 ++--- pkg/ast/traverser/dfs.go | 43 ++-- pkg/ast/visitor/dumper.go | 21 +- pkg/ast/visitor/formatter.go | 23 +- pkg/ast/visitor/formatter_test.go | 158 ++++++------ pkg/ast/visitor/namespace_resolver.go | 4 +- pkg/ast/visitor/namespace_resolver_test.go | 14 +- pkg/ast/visitor/null.go | 4 - pkg/ast/visitor/printer.go | 14 +- pkg/ast/visitor/printer_test.go | 55 +---- 17 files changed, 456 insertions(+), 555 deletions(-) diff --git a/internal/php5/parser_test.go b/internal/php5/parser_test.go index b2d3144..ad51d2f 100644 --- a/internal/php5/parser_test.go +++ b/internal/php5/parser_test.go @@ -24032,44 +24032,36 @@ func TestStmtTraitUse_Modifier(t *testing.T) { StartPos: 30, EndPos: 43, }, - Ref: &ast.StmtTraitMethodRef{ + Method: &ast.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 30, EndPos: 33, }, - Method: &ast.Identifier{ + IdentifierTkn: &token.Token{ + ID: token.T_STRING, + Value: []byte("one"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 30, EndPos: 33, }, - IdentifierTkn: &token.Token{ - ID: token.T_STRING, - Value: []byte("one"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 30, - EndPos: 33, - }, - FreeFloating: []*token.Token{ - { - ID: token.T_WHITESPACE, - Value: []byte(" "), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 29, - EndPos: 30, - }, + FreeFloating: []*token.Token{ + { + ID: token.T_WHITESPACE, + Value: []byte(" "), + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 29, + EndPos: 30, }, }, }, - Value: []byte("one"), }, + Value: []byte("one"), }, AsTkn: &token.Token{ ID: token.T_AS, @@ -24453,44 +24445,36 @@ func TestStmtTraitUse_AliasModifier(t *testing.T) { StartPos: 30, EndPos: 47, }, - Ref: &ast.StmtTraitMethodRef{ + Method: &ast.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 30, EndPos: 33, }, - Method: &ast.Identifier{ + IdentifierTkn: &token.Token{ + ID: token.T_STRING, + Value: []byte("one"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 30, EndPos: 33, }, - IdentifierTkn: &token.Token{ - ID: token.T_STRING, - Value: []byte("one"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 30, - EndPos: 33, - }, - FreeFloating: []*token.Token{ - { - ID: token.T_WHITESPACE, - Value: []byte(" "), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 29, - EndPos: 30, - }, + FreeFloating: []*token.Token{ + { + ID: token.T_WHITESPACE, + Value: []byte(" "), + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 29, + EndPos: 30, }, }, }, - Value: []byte("one"), }, + Value: []byte("one"), }, AsTkn: &token.Token{ ID: token.T_AS, @@ -24905,83 +24889,75 @@ func TestStmtTraitUse_Adaptions(t *testing.T) { StartPos: 30, EndPos: 58, }, - Ref: &ast.StmtTraitMethodRef{ + Trait: &ast.NameName{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 30, - EndPos: 38, + EndPos: 33, }, - Trait: &ast.NameName{ - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 30, - EndPos: 33, - }, - Parts: []ast.Vertex{ - &ast.NameNamePart{ + Parts: []ast.Vertex{ + &ast.NameNamePart{ + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 30, + EndPos: 33, + }, + StringTkn: &token.Token{ + ID: token.T_STRING, + Value: []byte("Bar"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 30, EndPos: 33, }, - StringTkn: &token.Token{ - ID: token.T_STRING, - Value: []byte("Bar"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 30, - EndPos: 33, - }, - FreeFloating: []*token.Token{ - { - ID: token.T_WHITESPACE, - Value: []byte(" "), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 29, - EndPos: 30, - }, + FreeFloating: []*token.Token{ + { + ID: token.T_WHITESPACE, + Value: []byte(" "), + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 29, + EndPos: 30, }, }, }, - Value: []byte("Bar"), }, + Value: []byte("Bar"), }, }, - DoubleColonTkn: &token.Token{ - ID: token.T_PAAMAYIM_NEKUDOTAYIM, - Value: []byte("::"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 33, - EndPos: 35, - }, + }, + DoubleColonTkn: &token.Token{ + ID: token.T_PAAMAYIM_NEKUDOTAYIM, + Value: []byte("::"), + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 33, + EndPos: 35, }, - Method: &ast.Identifier{ + }, + Method: &ast.Identifier{ + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 35, + EndPos: 38, + }, + IdentifierTkn: &token.Token{ + ID: token.T_STRING, + Value: []byte("one"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 35, EndPos: 38, }, - IdentifierTkn: &token.Token{ - ID: token.T_STRING, - Value: []byte("one"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 35, - EndPos: 38, - }, - }, - Value: []byte("one"), }, + Value: []byte("one"), }, InsteadofTkn: &token.Token{ ID: token.T_INSTEADOF, @@ -25119,83 +25095,75 @@ func TestStmtTraitUse_Adaptions(t *testing.T) { StartPos: 60, EndPos: 75, }, - Ref: &ast.StmtTraitMethodRef{ + Trait: &ast.NameName{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 60, - EndPos: 68, + EndPos: 63, }, - Trait: &ast.NameName{ - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 60, - EndPos: 63, - }, - Parts: []ast.Vertex{ - &ast.NameNamePart{ + Parts: []ast.Vertex{ + &ast.NameNamePart{ + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 60, + EndPos: 63, + }, + StringTkn: &token.Token{ + ID: token.T_STRING, + Value: []byte("Baz"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 60, EndPos: 63, }, - StringTkn: &token.Token{ - ID: token.T_STRING, - Value: []byte("Baz"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 60, - EndPos: 63, - }, - FreeFloating: []*token.Token{ - { - ID: token.T_WHITESPACE, - Value: []byte(" "), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 59, - EndPos: 60, - }, + FreeFloating: []*token.Token{ + { + ID: token.T_WHITESPACE, + Value: []byte(" "), + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 59, + EndPos: 60, }, }, }, - Value: []byte("Baz"), }, + Value: []byte("Baz"), }, }, - DoubleColonTkn: &token.Token{ - ID: token.T_PAAMAYIM_NEKUDOTAYIM, - Value: []byte("::"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 63, - EndPos: 65, - }, + }, + DoubleColonTkn: &token.Token{ + ID: token.T_PAAMAYIM_NEKUDOTAYIM, + Value: []byte("::"), + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 63, + EndPos: 65, }, - Method: &ast.Identifier{ + }, + Method: &ast.Identifier{ + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 65, + EndPos: 68, + }, + IdentifierTkn: &token.Token{ + ID: token.T_STRING, + Value: []byte("one"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 65, EndPos: 68, }, - IdentifierTkn: &token.Token{ - ID: token.T_STRING, - Value: []byte("one"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 65, - EndPos: 68, - }, - }, - Value: []byte("one"), }, + Value: []byte("one"), }, AsTkn: &token.Token{ ID: token.T_AS, diff --git a/internal/php5/php5.go b/internal/php5/php5.go index 6b818aa38179998d09246d888e2afa779678cb79..a65a4c86b8b6110e0454d39af0d3a8041ac5b829 100644 GIT binary patch delta 6243 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 delta 6282 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 diff --git a/internal/php5/php5.y b/internal/php5/php5.y index b422f9f..581d612 100644 --- a/internal/php5/php5.y +++ b/internal/php5/php5.y @@ -2295,10 +2295,12 @@ trait_precedence: { $$ = &ast.StmtTraitUsePrecedence{ Position: yylex.(*Parser).builder.NewNodeNodeListPosition($1, $3.(*ast.ParserSeparatedList).Items), - Ref: $1, - InsteadofTkn: $2, - Insteadof: $3.(*ast.ParserSeparatedList).Items, - SeparatorTkns: $3.(*ast.ParserSeparatedList).SeparatorTkns, + Trait: $1.(*ast.TraitMethodRef).Trait, + DoubleColonTkn: $1.(*ast.TraitMethodRef).DoubleColonTkn, + Method: $1.(*ast.TraitMethodRef).Method, + InsteadofTkn: $2, + Insteadof: $3.(*ast.ParserSeparatedList).Items, + SeparatorTkns: $3.(*ast.ParserSeparatedList).SeparatorTkns, } } ; @@ -2322,7 +2324,7 @@ trait_reference_list: trait_method_reference: T_STRING { - $$ = &ast.StmtTraitMethodRef{ + $$ = &ast.TraitMethodRef{ Position: yylex.(*Parser).builder.NewTokenPosition($1), Method: &ast.Identifier{ Position: yylex.(*Parser).builder.NewTokenPosition($1), @@ -2340,7 +2342,7 @@ trait_method_reference: trait_method_reference_fully_qualified: fully_qualified_class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { - $$ = &ast.StmtTraitMethodRef{ + $$ = &ast.TraitMethodRef{ Position: yylex.(*Parser).builder.NewNodeTokenPosition($1, $3), Trait: $1, DoubleColonTkn: $2, @@ -2357,10 +2359,12 @@ trait_alias: trait_method_reference T_AS trait_modifiers T_STRING { $$ = &ast.StmtTraitUseAlias{ - Position: yylex.(*Parser).builder.NewNodeTokenPosition($1, $4), - Ref: $1, - AsTkn: $2, - Modifier: $3, + Position: yylex.(*Parser).builder.NewNodeTokenPosition($1, $4), + Trait: $1.(*ast.TraitMethodRef).Trait, + DoubleColonTkn: $1.(*ast.TraitMethodRef).DoubleColonTkn, + Method: $1.(*ast.TraitMethodRef).Method, + AsTkn: $2, + Modifier: $3, Alias: &ast.Identifier{ Position: yylex.(*Parser).builder.NewTokenPosition($4), IdentifierTkn: $4, @@ -2371,10 +2375,12 @@ trait_alias: | trait_method_reference T_AS member_modifier { $$ = &ast.StmtTraitUseAlias{ - Position: yylex.(*Parser).builder.NewNodesPosition($1, $3), - Ref: $1, - AsTkn: $2, - Modifier: $3, + Position: yylex.(*Parser).builder.NewNodesPosition($1, $3), + Trait: $1.(*ast.TraitMethodRef).Trait, + DoubleColonTkn: $1.(*ast.TraitMethodRef).DoubleColonTkn, + Method: $1.(*ast.TraitMethodRef).Method, + AsTkn: $2, + Modifier: $3, } } ; diff --git a/internal/php7/parser_test.go b/internal/php7/parser_test.go index 5b63320..aa1b77d 100644 --- a/internal/php7/parser_test.go +++ b/internal/php7/parser_test.go @@ -26000,44 +26000,36 @@ func TestStmtTraitUse_Modifier(t *testing.T) { StartPos: 30, EndPos: 43, }, - Ref: &ast.StmtTraitMethodRef{ + Method: &ast.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 30, EndPos: 33, }, - Method: &ast.Identifier{ + IdentifierTkn: &token.Token{ + ID: token.T_STRING, + Value: []byte("one"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 30, EndPos: 33, }, - IdentifierTkn: &token.Token{ - ID: token.T_STRING, - Value: []byte("one"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 30, - EndPos: 33, - }, - FreeFloating: []*token.Token{ - { - ID: token.T_WHITESPACE, - Value: []byte(" "), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 29, - EndPos: 30, - }, + FreeFloating: []*token.Token{ + { + ID: token.T_WHITESPACE, + Value: []byte(" "), + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 29, + EndPos: 30, }, }, }, - Value: []byte("one"), }, + Value: []byte("one"), }, AsTkn: &token.Token{ ID: token.T_AS, @@ -26421,44 +26413,36 @@ func TestStmtTraitUse_AliasModifier(t *testing.T) { StartPos: 30, EndPos: 47, }, - Ref: &ast.StmtTraitMethodRef{ + Method: &ast.Identifier{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 30, EndPos: 33, }, - Method: &ast.Identifier{ + IdentifierTkn: &token.Token{ + ID: token.T_STRING, + Value: []byte("one"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 30, EndPos: 33, }, - IdentifierTkn: &token.Token{ - ID: token.T_STRING, - Value: []byte("one"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 30, - EndPos: 33, - }, - FreeFloating: []*token.Token{ - { - ID: token.T_WHITESPACE, - Value: []byte(" "), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 29, - EndPos: 30, - }, + FreeFloating: []*token.Token{ + { + ID: token.T_WHITESPACE, + Value: []byte(" "), + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 29, + EndPos: 30, }, }, }, - Value: []byte("one"), }, + Value: []byte("one"), }, AsTkn: &token.Token{ ID: token.T_AS, @@ -26873,83 +26857,75 @@ func TestStmtTraitUse_Adaptions(t *testing.T) { StartPos: 30, EndPos: 58, }, - Ref: &ast.StmtTraitMethodRef{ + Trait: &ast.NameName{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 30, - EndPos: 38, + EndPos: 33, }, - Trait: &ast.NameName{ - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 30, - EndPos: 33, - }, - Parts: []ast.Vertex{ - &ast.NameNamePart{ + Parts: []ast.Vertex{ + &ast.NameNamePart{ + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 30, + EndPos: 33, + }, + StringTkn: &token.Token{ + ID: token.T_STRING, + Value: []byte("Bar"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 30, EndPos: 33, }, - StringTkn: &token.Token{ - ID: token.T_STRING, - Value: []byte("Bar"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 30, - EndPos: 33, - }, - FreeFloating: []*token.Token{ - { - ID: token.T_WHITESPACE, - Value: []byte(" "), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 29, - EndPos: 30, - }, + FreeFloating: []*token.Token{ + { + ID: token.T_WHITESPACE, + Value: []byte(" "), + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 29, + EndPos: 30, }, }, }, - Value: []byte("Bar"), }, + Value: []byte("Bar"), }, }, - DoubleColonTkn: &token.Token{ - ID: token.T_PAAMAYIM_NEKUDOTAYIM, - Value: []byte("::"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 33, - EndPos: 35, - }, + }, + DoubleColonTkn: &token.Token{ + ID: token.T_PAAMAYIM_NEKUDOTAYIM, + Value: []byte("::"), + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 33, + EndPos: 35, }, - Method: &ast.Identifier{ + }, + Method: &ast.Identifier{ + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 35, + EndPos: 38, + }, + IdentifierTkn: &token.Token{ + ID: token.T_STRING, + Value: []byte("one"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 35, EndPos: 38, }, - IdentifierTkn: &token.Token{ - ID: token.T_STRING, - Value: []byte("one"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 35, - EndPos: 38, - }, - }, - Value: []byte("one"), }, + Value: []byte("one"), }, InsteadofTkn: &token.Token{ ID: token.T_INSTEADOF, @@ -27087,83 +27063,75 @@ func TestStmtTraitUse_Adaptions(t *testing.T) { StartPos: 60, EndPos: 75, }, - Ref: &ast.StmtTraitMethodRef{ + Trait: &ast.NameName{ Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 60, - EndPos: 68, + EndPos: 63, }, - Trait: &ast.NameName{ - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 60, - EndPos: 63, - }, - Parts: []ast.Vertex{ - &ast.NameNamePart{ + Parts: []ast.Vertex{ + &ast.NameNamePart{ + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 60, + EndPos: 63, + }, + StringTkn: &token.Token{ + ID: token.T_STRING, + Value: []byte("Baz"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 60, EndPos: 63, }, - StringTkn: &token.Token{ - ID: token.T_STRING, - Value: []byte("Baz"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 60, - EndPos: 63, - }, - FreeFloating: []*token.Token{ - { - ID: token.T_WHITESPACE, - Value: []byte(" "), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 59, - EndPos: 60, - }, + FreeFloating: []*token.Token{ + { + ID: token.T_WHITESPACE, + Value: []byte(" "), + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 59, + EndPos: 60, }, }, }, - Value: []byte("Baz"), }, + Value: []byte("Baz"), }, }, - DoubleColonTkn: &token.Token{ - ID: token.T_PAAMAYIM_NEKUDOTAYIM, - Value: []byte("::"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 63, - EndPos: 65, - }, + }, + DoubleColonTkn: &token.Token{ + ID: token.T_PAAMAYIM_NEKUDOTAYIM, + Value: []byte("::"), + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 63, + EndPos: 65, }, - Method: &ast.Identifier{ + }, + Method: &ast.Identifier{ + Position: &position.Position{ + StartLine: 1, + EndLine: 1, + StartPos: 65, + EndPos: 68, + }, + IdentifierTkn: &token.Token{ + ID: token.T_STRING, + Value: []byte("one"), Position: &position.Position{ StartLine: 1, EndLine: 1, StartPos: 65, EndPos: 68, }, - IdentifierTkn: &token.Token{ - ID: token.T_STRING, - Value: []byte("one"), - Position: &position.Position{ - StartLine: 1, - EndLine: 1, - StartPos: 65, - EndPos: 68, - }, - }, - Value: []byte("one"), }, + Value: []byte("one"), }, AsTkn: &token.Token{ ID: token.T_AS, diff --git a/internal/php7/php7.go b/internal/php7/php7.go index 2c353f75d3b926764fe4fb288d77a2b9fa2c96b8..8c4c775da8b45637d7cae76a854812cd6a982fd1 100644 GIT binary patch delta 4831 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 J#uc@??4QON_|X6W delta 4063 zcmai1Yj9Q76`s9zLLej|2$F=Go7{*20x{h8gOHE_Nr+YxVg#fSl7>f-M+hKRd=LgJ z*xCZ3Syl!KXiF84fR5W&Fkmf|5gHjmr=t?ID9S5fD~JmH_CDtVPRI7ooqP7#Ywfka z^{sEM^Txi!r`}F%b)*T;vh=j&>1jfxr_p0c?0!Qynh%H=-aCkXE~}O>~H6J!p% zh3sW~iP_|&;sv~Y1!Zzk9v$MDxm3!P`NGA2&n4&ovr(`~7rdj99NghYls_^G|MwXu z-4xFoU9ulPF_b3rJP)-|*pAP=fU17N;<|e%i@)+w8F?aH{3qN42gUN#Af<8VNd((^ zif&LZ`pF@Lo5$sge%u+LdfvU0(ys&-tFZrw5I*j`A0BGgh!uPyOk=q?5yrR76Ws;h zHJrwZ0IwdbJ&b_yhr_8%1e7bEMhFUqxpe}xInvmEfP94%ti zZMV@9!D<|Wf@$S(F@RTAQ8zWXit+{dgS@m@Wbm@vX$7Ln+Cm;Ks7A;^>vkPAqA$C< zL?Z95#^J#r7k84I^Y5Us6!O`3+&|tR+Eg69Os~E;bx5+AX%S6hK5gyf8 zLk~)wOnWFTUhsIYcZOH~hRGq*(&020q1KSFV8{jVuiBW}Vm-mr{~UT$AY z+18#RD>P_c7V9Wm&3sgglelQzCthv-jZT^WO3LEZiQnpM1?+Hhf2WOu*MvLk_a+C| zg!{ruy%N4A+AmijEKNvLv9-@oPnGjH0OiIUna<{U?i$>Yd(Q+7nr@e|yyFSF%$~cg z$7D{ar8*wfOiyUu0JuzbzM1-Iq0%s^o1UUrTth^!G4T%?!@w0BdZ?DCwg2K8B;Vk2 zY^@f;paKe`HU6N51ubt~463g2%^S(wlsWU#16%cL7%AR+M1yOR?f?cooVQw9r5Ns)eCG zU{mCEls~k>#dp3z`w*5v7XJh63dj&|dz02k4^V`(WavHU)Jzq;*C&(sP#c}%(QP2+ z7dxq^4h^DjBa_{Z6Fq89JDt_BP1#M267Xn!kbt8x4)vZqQ6zE7-;5lN%K$spSpTmo zP{RR=W7@4^U6CNyjkk&$W3X zra1sswG4pb9qFKVAbuLK_Jb585bXT>v{h2ruP(e#(uN*_1@F?>z?GFpHoEdHM1&Dj~lSr5m{BI8EV}jiQ%2{5jQYwxJGOYSMAqEI4u;#I8I^ z-I}Xp0{^)}ZsbE>A(@yC)<7p)%TVv`aWau_IYD1)adld2<4@8z&>|FvgOktEUUr|x z{mnJa%gFFcx7(RqP- zGPdmI+<)U@frzgCPx+2-umSn9E}(XPqY2<;^jh01R-D{5Qj~GUx3q(|KZ&hHmZFI!2cA z1}F0WW{lKXLBeg*P%KQnsxwXw6#QH_y!BZ#iZc!_ptr^aR4Wdz{CeLUExTrnS<(aZ zml

vvj`LLq}!`KU1CVDYFGH?z+$OaKoPj#x zD(SrUItg`*Nc-4Peeejx@z_V!3!jSVE1PV=YUw8z3+{kA@a*w2)r>(FLtjdj-30ef zl@TudN~@}trSkr=8DeGByEa{Z#}^&4gpWQXoZK-$UgAkk90eYjqnv!mX)x8o$weU< ztBNw@451tuI{s5G{Cbr?3&9}E>S%wND)_*SzzB1*ZuB_eA`cq~mo0h@tt=63TrmiE zg*1ze=5$l94U(9EpzB%!&Gm=m$P&z>Mz|c7)y+d>saXifwv4rKBMVP=j>dZ z3*F3>ciL^=gdERZH_2*UZ8n(q=9wJ6l_yv031FOC?$B)?GM&lydo_YXFhaCWCm+8O zl2u&cmwma@A=9{z7nb%+05H<5Pof9k#Ye|Muf(TQBP!rWF0#4l5GCIYyGotlPK{9&i z&VpncVcEk6#>)xZQXrGL$wR4}`~h^nZMz7ob3X%r!KA1L^-+T{;%f!eZjE$Ch4xDk zQjb^4*#xu8Rq|F{O?oy|xZWb1tv;I|_kg2ja?ViuCdqpRzc5L