From 0b01324e39c62ef71d06fe0df29be6dfa522e5d1 Mon Sep 17 00:00:00 2001 From: Andrey Vokin Date: Fri, 25 Dec 2015 17:36:56 +0300 Subject: [PATCH 001/105] Html. Slim. Several attributes with the same name supported --- platform/platform-resources/src/META-INF/XmlPlugin.xml | 2 +- ...eValuesProvider.java => HtmlAttributeValueProvider.java} | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) rename xml/impl/src/com/intellij/html/impl/providers/{HtmlAttributeValuesProvider.java => HtmlAttributeValueProvider.java} (83%) diff --git a/platform/platform-resources/src/META-INF/XmlPlugin.xml b/platform/platform-resources/src/META-INF/XmlPlugin.xml index f9aa5b62c489..50f6344e39f7 100644 --- a/platform/platform-resources/src/META-INF/XmlPlugin.xml +++ b/platform/platform-resources/src/META-INF/XmlPlugin.xml @@ -97,7 +97,7 @@ - + diff --git a/xml/impl/src/com/intellij/html/impl/providers/HtmlAttributeValuesProvider.java b/xml/impl/src/com/intellij/html/impl/providers/HtmlAttributeValueProvider.java similarity index 83% rename from xml/impl/src/com/intellij/html/impl/providers/HtmlAttributeValuesProvider.java rename to xml/impl/src/com/intellij/html/impl/providers/HtmlAttributeValueProvider.java index ef7da92de83e..a7d20bba37ec 100644 --- a/xml/impl/src/com/intellij/html/impl/providers/HtmlAttributeValuesProvider.java +++ b/xml/impl/src/com/intellij/html/impl/providers/HtmlAttributeValueProvider.java @@ -19,9 +19,9 @@ import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.psi.xml.XmlTag; import org.jetbrains.annotations.Nullable; -public class HtmlAttributeValuesProvider { - public static final ExtensionPointName EP_NAME = - new ExtensionPointName("com.intellij.html.attributeValuesProvider"); +public class HtmlAttributeValueProvider { + public static final ExtensionPointName EP_NAME = + new ExtensionPointName("com.intellij.html.attributeValueProvider"); /** * Calculates attribute value. Used when it is impossible to get attribute value as text of PSI element From d9f95e9353a2d87969d7a16d720df970221b64fe Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Fri, 25 Dec 2015 17:40:32 +0300 Subject: [PATCH 002/105] IDEA-149712 Widen-selection (ctrl-w) to include a step for 'for' statement header --- .../ForStatementHeaderSelectioner.java | 45 +++++++++++++++++++ resources/src/META-INF/IdeaPlugin.xml | 1 + 2 files changed, 46 insertions(+) create mode 100644 java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/ForStatementHeaderSelectioner.java diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/ForStatementHeaderSelectioner.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/ForStatementHeaderSelectioner.java new file mode 100644 index 000000000000..a770c7a08ae1 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/ForStatementHeaderSelectioner.java @@ -0,0 +1,45 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInsight.editorActions.wordSelection; + +import com.intellij.codeInsight.editorActions.ExtendWordSelectionHandler; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiForStatement; +import com.intellij.psi.PsiForeachStatement; +import com.intellij.psi.PsiJavaToken; + +import java.util.Collections; +import java.util.List; + +public class ForStatementHeaderSelectioner implements ExtendWordSelectionHandler { + @Override + public boolean canSelect(PsiElement e) { + return e instanceof PsiForStatement || e instanceof PsiForeachStatement; + } + + @Override + public List select(PsiElement e, CharSequence editorText, int cursorOffset, Editor editor) { + PsiJavaToken lParen = e instanceof PsiForStatement ? ((PsiForStatement)e).getLParenth() + : e instanceof PsiForeachStatement ? ((PsiForeachStatement)e).getLParenth() : null; + PsiJavaToken rParen = e instanceof PsiForStatement ? ((PsiForStatement)e).getRParenth() + : e instanceof PsiForeachStatement ? ((PsiForeachStatement)e).getRParenth() : null; + if (lParen == null || rParen == null) return null; + TextRange result = new TextRange(lParen.getTextRange().getEndOffset(), rParen.getTextRange().getStartOffset()); + return result.containsOffset(cursorOffset) ? Collections.singletonList(result) : null; + } +} diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 5778c0ff46e1..b7ad68c1e127 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -1206,6 +1206,7 @@ + From f2eb2eec9abda90016fa0fcdce2794e3ce435a48 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Fri, 25 Dec 2015 16:05:46 +0100 Subject: [PATCH 003/105] ensure that we customize Netty before use --- .../src/com/intellij/idea/SocketLock.java | 1 + .../src/org/jetbrains/io/BuiltInServer.java | 11 +++++++++++ .../platform-impl/src/org/jetbrains/io/NettyUtil.java | 11 ----------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/idea/SocketLock.java b/platform/platform-impl/src/com/intellij/idea/SocketLock.java index 10b02e47fa48..da9053d98511 100644 --- a/platform/platform-impl/src/com/intellij/idea/SocketLock.java +++ b/platform/platform-impl/src/com/intellij/idea/SocketLock.java @@ -143,6 +143,7 @@ public final class SocketLock { myServer = BuiltInServer.start(workerCount, 6942, 50, false, handler); } catch (IllegalStateException e) { + Logger.getInstance(SocketLock.class).warn(e); myServer = BuiltInServer.start(new OioEventLoopGroup(1, new BuiltInServer.BuiltInServerThreadFactory()), true, 6942, 50, false, handler); } diff --git a/platform/platform-impl/src/org/jetbrains/io/BuiltInServer.java b/platform/platform-impl/src/org/jetbrains/io/BuiltInServer.java index 4f90ed65fc23..05d7b9e3b886 100644 --- a/platform/platform-impl/src/org/jetbrains/io/BuiltInServer.java +++ b/platform/platform-impl/src/org/jetbrains/io/BuiltInServer.java @@ -20,6 +20,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.util.ArrayUtil; import com.intellij.util.ExceptionUtil; import com.intellij.util.NotNullProducer; +import com.intellij.util.SystemProperties; import com.intellij.util.net.NetUtils; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; @@ -29,6 +30,7 @@ import org.jetbrains.annotations.Nullable; import java.net.InetAddress; import java.net.InetSocketAddress; +import java.util.Random; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; @@ -41,6 +43,15 @@ public class BuiltInServer implements Disposable { private final ChannelRegistrar channelRegistrar; private final boolean isOwnerOfEventLoopGroup; + static { + // IDEA-120811 + if (SystemProperties.getBooleanProperty("io.netty.random.id", true)) { + System.setProperty("io.netty.machineId", "9e43d860"); + System.setProperty("io.netty.processId", Integer.toString(new Random().nextInt(65535))); + System.setProperty("io.netty.serviceThreadPrefix", "Netty "); + } + } + private BuiltInServer(@NotNull EventLoopGroup eventLoopGroup, int port, @NotNull ChannelRegistrar channelRegistrar, diff --git a/platform/platform-impl/src/org/jetbrains/io/NettyUtil.java b/platform/platform-impl/src/org/jetbrains/io/NettyUtil.java index df29d384379e..b3541f95b383 100644 --- a/platform/platform-impl/src/org/jetbrains/io/NettyUtil.java +++ b/platform/platform-impl/src/org/jetbrains/io/NettyUtil.java @@ -17,7 +17,6 @@ package org.jetbrains.io; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Condition; -import com.intellij.util.SystemProperties; import io.netty.bootstrap.Bootstrap; import io.netty.bootstrap.BootstrapUtil; import io.netty.bootstrap.ServerBootstrap; @@ -46,7 +45,6 @@ import java.net.BindException; import java.net.ConnectException; import java.net.InetSocketAddress; import java.net.Socket; -import java.util.Random; import java.util.concurrent.TimeUnit; public final class NettyUtil { @@ -55,15 +53,6 @@ public final class NettyUtil { public static final int DEFAULT_CONNECT_ATTEMPT_COUNT = 20; public static final int MIN_START_TIME = 100; - static { - // IDEA-120811 - if (SystemProperties.getBooleanProperty("io.netty.random.id", true)) { - System.setProperty("io.netty.machineId", "9e43d860"); - System.setProperty("io.netty.processId", Integer.toString(new Random().nextInt(65535))); - System.setProperty("io.netty.serviceThreadPrefix", "Netty "); - } - } - public static void logAndClose(@NotNull Throwable error, @NotNull Logger log, @NotNull Channel channel) { // don't report about errors while connecting // WEB-7727 From 86b2b222baef2eb7baf945a8f6eb214416da2851 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 25 Dec 2015 18:31:25 +0300 Subject: [PATCH 004/105] IDEA-149645 "Access can be tightened" inspection should have option for avoiding synthetic accessors --- .../visibility/AccessCanBeTightenedInspection.java | 6 +++++- .../visibility/AccessCanBeTightenedInspectionTest.java | 6 ++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/visibility/AccessCanBeTightenedInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/visibility/AccessCanBeTightenedInspection.java index a208a32e586f..78a0c28c39ef 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/visibility/AccessCanBeTightenedInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/visibility/AccessCanBeTightenedInspection.java @@ -230,7 +230,7 @@ class AccessCanBeTightenedInspection extends BaseJavaBatchLocalInspectionTool { } return myVisibilityInspection.SUGGEST_PRIVATE_FOR_INNERS || - memberClass == aClass && memberClass.getContainingClass() == null ? PsiUtil.ACCESS_LEVEL_PRIVATE : suggestPackageLocal(member); + !isInnerClass(memberClass) ? PsiUtil.ACCESS_LEVEL_PRIVATE : suggestPackageLocal(member); } //if (file == memberFile) { // return PsiUtil.ACCESS_LEVEL_PACKAGE_LOCAL; @@ -253,6 +253,10 @@ class AccessCanBeTightenedInspection extends BaseJavaBatchLocalInspectionTool { } } + private static boolean isInnerClass(@NotNull PsiClass memberClass) { + return memberClass.getContainingClass() != null || memberClass instanceof PsiAnonymousClass; + } + private static boolean isInReferenceList(@Nullable PsiElement list, @NotNull final PsiMember member) { if (list == null) return false; final PsiManager psiManager = member.getManager(); diff --git a/plugins/InspectionGadgets/testsrc/com/intellij/codeInspection/visibility/AccessCanBeTightenedInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/intellij/codeInspection/visibility/AccessCanBeTightenedInspectionTest.java index a395dc96beea..38e229346c87 100644 --- a/plugins/InspectionGadgets/testsrc/com/intellij/codeInspection/visibility/AccessCanBeTightenedInspectionTest.java +++ b/plugins/InspectionGadgets/testsrc/com/intellij/codeInspection/visibility/AccessCanBeTightenedInspectionTest.java @@ -96,13 +96,15 @@ public class AccessCanBeTightenedInspectionTest extends LightInspectionTestCase VisibilityInspection visibilityInspection = ReflectionUtil.getField(inspection.getClass(), inspection, VisibilityInspection.class, "myVisibilityInspection"); visibilityInspection.SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS = false; + visibilityInspection.SUGGEST_PRIVATE_FOR_INNERS = false; doTest("class C {\n" + " {\n" + " new Runnable() {\n" + " @Override\n" + - " public void run() {}\n"+ - " boolean isVisible() { return true; }\n" + + " public void run() { isDisposed = true; }\n"+ + " boolean isVisible() { return true; }\n" + + " boolean isDisposed;\n" + " }.run();\n" + " }\n"+ "}"); From 1480d3bda7b138a0d2daf85613654297748ff9e9 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Fri, 25 Dec 2015 19:10:15 +0300 Subject: [PATCH 005/105] IDEA-149712 Change widen-selection (ctrl-w) behaviour for a class or method with a comment --- .../wordSelection/MethodOrClassSelectioner.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/MethodOrClassSelectioner.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/MethodOrClassSelectioner.java index c6526f63695c..59ee5a35a2bf 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/MethodOrClassSelectioner.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/wordSelection/MethodOrClassSelectioner.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,8 +40,7 @@ public class MethodOrClassSelectioner extends BasicSelectioner { @Override public List select(PsiElement e, CharSequence editorText, int cursorOffset, Editor editor) { - List result = ContainerUtil.newArrayList(e.getTextRange()); - result.addAll(expandToWholeLinesWithBlanks(editorText, e.getTextRange())); + List result = ContainerUtil.newArrayList(); PsiElement firstChild = e.getFirstChild(); PsiElement[] children = e.getChildren(); @@ -77,6 +76,9 @@ public class MethodOrClassSelectioner extends BasicSelectioner { result.addAll(expandToWholeLinesWithBlanks(editorText, range)); } + result.add(e.getTextRange()); + result.addAll(expandToWholeLinesWithBlanks(editorText, e.getTextRange())); + if (e instanceof PsiClass) { result.addAll(selectWithTypeParameters((PsiClass)e)); result.addAll(selectBetweenBracesLines(children, editorText)); From 0932b523e1e95444ba0501d0ffde488e2087554c Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Fri, 25 Dec 2015 20:02:15 +0300 Subject: [PATCH 006/105] IDEA-149816 No completion and strange errors in condition field in decompiled files --- .../src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java index 206c74680073..9915c1b3e862 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java @@ -511,6 +511,10 @@ public class XDebuggerUtilImpl extends XDebuggerUtil { return null; } + if (file instanceof PsiCompiledFile) { + file = ((PsiCompiledFile)file).getDecompiledPsiFile(); + } + if (offset < 0) { offset = 0; } From 7c6e3956e75af9f4bdd2881ac136a1aeade24699 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Fri, 25 Dec 2015 19:15:15 +0300 Subject: [PATCH 007/105] Removed logic from PyTargetExpressionImpl.getType() that duplicates PyReferenceExpressionImpl --- .../psi/impl/PyReferenceExpressionImpl.java | 41 +++++++++++-------- .../psi/impl/PyTargetExpressionImpl.java | 36 +--------------- 2 files changed, 25 insertions(+), 52 deletions(-) diff --git a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java index b99d83a82ab8..b03b6ec101b5 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java @@ -206,23 +206,27 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere return PyNoneType.INSTANCE; } } - PyType type = getTypeFromProviders(context); - if (type != null) { - return type; + final PyType providedType = getTypeFromProviders(context); + if (providedType != null) { + return providedType; } if (qualified) { + if (!context.maySwitchToAST(this)) { + return null; + } PyType maybe_type = PyUtil.getSpecialAttributeType(this, context); if (maybe_type != null) return maybe_type; Ref typeOfProperty = getTypeOfProperty(context); if (typeOfProperty != null) { return typeOfProperty.get(); } + final PyType typeByControlFlow = getQualifiedReferenceTypeByControlFlow(context); + if (typeByControlFlow != null) { + return typeByControlFlow; + } } final PsiPolyVariantReference reference = getReference(PyResolveContext.noImplicits().withTypeEvalContext(context)); final List targets = PyUtil.multiResolveTopPriority(reference); - if (targets.isEmpty()) { - return getQualifiedReferenceTypeByControlFlow(context); - } final List members = new ArrayList(); for (PsiElement target : targets) { @@ -235,8 +239,11 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere } members.add(getTypeFromTarget(target, context, this)); } - - return PyUnionType.union(members); + final PyType type = PyUnionType.union(members); + if (qualified && type instanceof PyNoneType) { + return null; + } + return type; } finally { TypeEvalStack.evaluated(this); @@ -244,7 +251,7 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere } @Nullable - public PyType getQualifiedReferenceTypeByControlFlow(@NotNull TypeEvalContext context) { + private PyType getQualifiedReferenceTypeByControlFlow(@NotNull TypeEvalContext context) { PyExpression qualifier = getQualifier(); if (context.allowDataFlow(this) && qualifier != null) { PyExpression next = qualifier; @@ -262,7 +269,7 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere } @Nullable - public Ref getTypeOfProperty(@NotNull TypeEvalContext context) { + private Ref getTypeOfProperty(@NotNull TypeEvalContext context) { final PyExpression qualifier = getQualifier(); final String name = getName(); if (name != null && qualifier != null) { @@ -320,9 +327,9 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere } @Nullable - public static PyType getTypeFromTarget(@NotNull final PsiElement target, - final TypeEvalContext context, - PyReferenceExpression anchor) { + private static PyType getTypeFromTarget(@NotNull final PsiElement target, + final TypeEvalContext context, + PyReferenceExpression anchor) { if (!(target instanceof PyTargetExpression)) { // PyTargetExpression will ask about its type itself final PyType pyType = getReferenceTypeFromProviders(target, context, anchor); if (pyType != null) { @@ -399,9 +406,9 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere @NotNull TypeEvalContext context, @NotNull PyExpression anchor, @NotNull ScopeOwner scopeOwner) { - PyAugAssignmentStatement augAssignment = PsiTreeUtil.getParentOfType(anchor, PyAugAssignmentStatement.class); + final PyAugAssignmentStatement augAssignment = PsiTreeUtil.getParentOfType(anchor, PyAugAssignmentStatement.class); + final PyElement element = augAssignment != null ? augAssignment : anchor; try { - final PyElement element = augAssignment != null ? augAssignment : anchor; final List defs = PyDefUseUtil.getLatestDefs(scopeOwner, name, element, true); if (!defs.isEmpty()) { PyType type = defs.get(0).getType(context, anchor); @@ -445,7 +452,7 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere return myIsImplicit; } - QualifiedResolveResultImpl(@NotNull PsiElement element, List qualifiers, boolean isImplicit) { + private QualifiedResolveResultImpl(@NotNull PsiElement element, List qualifiers, boolean isImplicit) { super(isImplicit ? RATE_LOW : RATE_NORMAL, element); myQualifiers = qualifiers; myIsImplicit = isImplicit; @@ -457,7 +464,7 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere } } - public static class QualifiedResolveResultEmpty implements QualifiedResolveResult { + private static class QualifiedResolveResultEmpty implements QualifiedResolveResult { // a trivial implementation private QualifiedResolveResultEmpty() { diff --git a/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java index 7fe837556a3a..c9bf4b266bcd 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java @@ -19,11 +19,9 @@ import com.intellij.lang.ASTNode; import com.intellij.navigation.ItemPresentation; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.Ref; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiPolyVariantReference; import com.intellij.psi.PsiReference; -import com.intellij.psi.ResolveResult; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.SearchScope; @@ -126,11 +124,6 @@ public class PyTargetExpressionImpl extends PyBaseElementImpl typeOfProperty = refex.getTypeOfProperty(context); - if (typeOfProperty != null) { - return typeOfProperty.get(); - } - final PyType cfgType = refex.getQualifiedReferenceTypeByControlFlow(context); - if (cfgType != null) { - return cfgType; - } - return typeFromTarget; - } - } if (assignedValue instanceof PyYieldExpression) { return null; } From fec813dce11875725e5d7d55302f9c0f977c0fc6 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Fri, 25 Dec 2015 20:42:15 +0300 Subject: [PATCH 008/105] stop smart step into on return --- .../impl/src/com/intellij/debugger/engine/RequestHint.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/RequestHint.java b/java/debugger/impl/src/com/intellij/debugger/engine/RequestHint.java index 2ace5c22e0ea..ae14c8cb3cf9 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/RequestHint.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/RequestHint.java @@ -281,7 +281,7 @@ public class RequestHint { } } // smart step feature - if (myMethodFilter != null) { + if (myMethodFilter != null && !mySteppedOut) { return StepRequest.STEP_OUT; } } From 2015ba27a2f0a23553082aaccf4b9d478cb9ad81 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Sat, 26 Dec 2015 13:49:32 +0300 Subject: [PATCH 009/105] IDEA-113878 dir-diff: fix "compare by" combobox rendering --- .../openapi/diff/impl/dir/actions/ChangeCompareModeAction.java | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/diff-impl/src/com/intellij/openapi/diff/impl/dir/actions/ChangeCompareModeAction.java b/platform/diff-impl/src/com/intellij/openapi/diff/impl/dir/actions/ChangeCompareModeAction.java index 9c1a0a8a0b60..707696a9229b 100644 --- a/platform/diff-impl/src/com/intellij/openapi/diff/impl/dir/actions/ChangeCompareModeAction.java +++ b/platform/diff-impl/src/com/intellij/openapi/diff/impl/dir/actions/ChangeCompareModeAction.java @@ -37,6 +37,7 @@ class ChangeCompareModeAction extends DumbAwareAction { ChangeCompareModeAction(DirDiffTableModel model, DirDiffSettings.CompareMode mode) { super(mode.getPresentableName(model.getSettings())); + getTemplatePresentation().setIcon(OFF); myModel = model; myMode = mode; } From f65bf12e135b2e005cb2e7bc4827d9028aa9820d Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Sun, 27 Dec 2015 19:08:23 +0100 Subject: [PATCH 010/105] make ImageEditorImpl accessible for plugins --- .../src/org/intellij/images/editor/impl/ImageEditorImpl.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/images/src/org/intellij/images/editor/impl/ImageEditorImpl.java b/images/src/org/intellij/images/editor/impl/ImageEditorImpl.java index 33daa79df65a..c6003a3e249f 100644 --- a/images/src/org/intellij/images/editor/impl/ImageEditorImpl.java +++ b/images/src/org/intellij/images/editor/impl/ImageEditorImpl.java @@ -26,7 +26,6 @@ import org.intellij.images.editor.ImageEditor; import org.intellij.images.editor.ImageZoomModel; import org.intellij.images.fileTypes.ImageFileTypeManager; import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActions; -import org.intellij.images.ui.ImageComponent; import org.intellij.images.vfs.IfsUtil; import org.jetbrains.annotations.NotNull; @@ -37,13 +36,13 @@ import javax.swing.*; * * @author Alexey Efimov */ -final class ImageEditorImpl implements ImageEditor { +public final class ImageEditorImpl implements ImageEditor { private final Project project; private final VirtualFile file; private final ImageEditorUI editorUI; private boolean disposed; - ImageEditorImpl(@NotNull Project project, @NotNull VirtualFile file) { + public ImageEditorImpl(@NotNull Project project, @NotNull VirtualFile file) { this.project = project; this.file = file; From 730c646012d6377d5dc61a7e642e85e4560b4441 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Mon, 28 Dec 2015 11:35:33 +0300 Subject: [PATCH 011/105] smart step into and set breakpoint popups extra shortcuts ad --- .../actions/JvmSmartStepIntoHandler.java | 5 +-- .../src/messages/XDebuggerBundle.properties | 2 ++ .../xdebugger/impl/XDebuggerUtilImpl.java | 2 ++ .../xdebugger/impl/ui/DebuggerUIUtil.java | 34 +++++++++++++------ 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/actions/JvmSmartStepIntoHandler.java b/java/debugger/impl/src/com/intellij/debugger/actions/JvmSmartStepIntoHandler.java index 41d4368ff66e..4985cd6eef8c 100644 --- a/java/debugger/impl/src/com/intellij/debugger/actions/JvmSmartStepIntoHandler.java +++ b/java/debugger/impl/src/com/intellij/debugger/actions/JvmSmartStepIntoHandler.java @@ -73,8 +73,9 @@ public abstract class JvmSmartStepIntoHandler { } }); ListPopupImpl popup = new ListPopupImpl(popupStep); - DebuggerUIUtil.registerExtraHandleShortcuts(popup, XDebuggerActions.STEP_INTO); - DebuggerUIUtil.registerExtraHandleShortcuts(popup, XDebuggerActions.SMART_STEP_INTO); + DebuggerUIUtil.registerExtraHandleShortcuts(popup, XDebuggerActions.STEP_INTO, XDebuggerActions.SMART_STEP_INTO); + popup.setAdText(DebuggerUIUtil.getSelectionShortcutsAdText(XDebuggerActions.STEP_INTO, XDebuggerActions.SMART_STEP_INTO)); + popup.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { popupStep.getScopeHighlighter().dropHighlight(); diff --git a/platform/platform-resources-en/src/messages/XDebuggerBundle.properties b/platform/platform-resources-en/src/messages/XDebuggerBundle.properties index ca129821f44e..a02870baed79 100644 --- a/platform/platform-resources-en/src/messages/XDebuggerBundle.properties +++ b/platform/platform-resources-en/src/messages/XDebuggerBundle.properties @@ -138,3 +138,5 @@ settings.show.value.tooltip=Show value tooltip. settings.show.tooltip.on.selection=Show value tooltip on code selection settings.scroll.to.center=Scroll execution point to center settings.tooltip.label=If disabled, use "{0}" to show/hide tooltips + +ad.extra.selection.shortcut=You can also choose an item with: {0} diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java index 9915c1b3e862..6df5ffa8efa6 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebuggerUtilImpl.java @@ -247,6 +247,8 @@ public class XDebuggerUtilImpl extends XDebuggerUtil { } }); DebuggerUIUtil.registerExtraHandleShortcuts(popup, IdeActions.ACTION_TOGGLE_LINE_BREAKPOINT); + popup.setAdText(DebuggerUIUtil.getSelectionShortcutsAdText(IdeActions.ACTION_TOGGLE_LINE_BREAKPOINT)); + popup.addListSelectionListener(selectionListener); popup.show(relativePoint); result.setResult(res); diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerUIUtil.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerUIUtil.java index c5e79244a3eb..3b876ecd65ed 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerUIUtil.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerUIUtil.java @@ -35,6 +35,7 @@ import com.intellij.ui.EditorTextField; import com.intellij.ui.ScreenUtil; import com.intellij.ui.awt.RelativePoint; import com.intellij.ui.popup.list.ListPopupImpl; +import com.intellij.xdebugger.XDebuggerBundle; import com.intellij.xdebugger.XDebuggerManager; import com.intellij.xdebugger.XExpression; import com.intellij.xdebugger.breakpoints.XBreakpoint; @@ -400,16 +401,29 @@ public class DebuggerUIUtil { return true; } - public static void registerExtraHandleShortcuts(final ListPopupImpl popup, String actionName) { - AnAction action = ActionManager.getInstance().getAction(actionName); - KeyStroke stroke = KeymapUtil.getKeyStroke(action.getShortcutSet()); - if (stroke != null) { - popup.registerAction("handleSelection " + stroke, stroke, new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - popup.handleSelect(true); - } - }); + public static void registerExtraHandleShortcuts(final ListPopupImpl popup, String... actionNames) { + for (String name : actionNames) { + KeyStroke stroke = KeymapUtil.getKeyStroke(ActionManager.getInstance().getAction(name).getShortcutSet()); + if (stroke != null) { + popup.registerAction("handleSelection " + stroke, stroke, new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + popup.handleSelect(true); + } + }); + } } } + + public static String getSelectionShortcutsAdText(String... actionNames) { + StringBuilder res = new StringBuilder(); + for (String name : actionNames) { + KeyStroke stroke = KeymapUtil.getKeyStroke(ActionManager.getInstance().getAction(name).getShortcutSet()); + if (stroke != null) { + if (res.length() > 0) res.append(", "); + res.append(KeymapUtil.getKeystrokeText(stroke)); + } + } + return XDebuggerBundle.message("ad.extra.selection.shortcut", res.toString()); + } } From d001502d51bf35a633df82e2f85b1779df768d4a Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Mon, 28 Dec 2015 12:06:01 +0300 Subject: [PATCH 012/105] IDEA-149802 In Gradle project, $MODULE_DIR$ points unexpected directory such as ".idea/modules". --- plugins/gradle/src/META-INF/plugin.xml | 2 + .../ProgramRunConfigurationExtension.java | 83 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/execution/ProgramRunConfigurationExtension.java diff --git a/plugins/gradle/src/META-INF/plugin.xml b/plugins/gradle/src/META-INF/plugin.xml index 57c478d8d32e..0497b2b12a02 100644 --- a/plugins/gradle/src/META-INF/plugin.xml +++ b/plugins/gradle/src/META-INF/plugin.xml @@ -92,6 +92,8 @@ order="last"/> + + diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/ProgramRunConfigurationExtension.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/ProgramRunConfigurationExtension.java new file mode 100644 index 000000000000..c74945ff31be --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/ProgramRunConfigurationExtension.java @@ -0,0 +1,83 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.gradle.execution; + +import com.intellij.execution.CommonProgramRunConfigurationParameters; +import com.intellij.execution.ExecutionException; +import com.intellij.execution.RunConfigurationExtension; +import com.intellij.execution.configurations.*; +import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; +import com.intellij.openapi.options.SettingsEditor; +import com.intellij.openapi.util.InvalidDataException; +import com.intellij.openapi.util.text.StringUtil; +import org.jdom.Element; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.serialization.PathMacroUtil; +import org.jetbrains.plugins.gradle.util.GradleConstants; + +/** + * @author Vladislav.Soroka + * @since 12/28/2015 + */ +public class ProgramRunConfigurationExtension extends RunConfigurationExtension { + @Override + public void updateJavaParameters(T configuration, + JavaParameters params, + RunnerSettings runnerSettings) throws ExecutionException { + } + + @Override + protected void validateConfiguration(@NotNull RunConfigurationBase configuration, boolean isExecution) throws Exception { + super.validateConfiguration(configuration, isExecution); + if (configuration instanceof ModuleBasedConfiguration && configuration instanceof CommonProgramRunConfigurationParameters) { + final String workingDirectory = ((CommonProgramRunConfigurationParameters)configuration).getWorkingDirectory(); + if (("$" + PathMacroUtil.MODULE_DIR_MACRO_NAME + "$").equals(workingDirectory)) { + final RunConfigurationModule runConfigurationModule = ((ModuleBasedConfiguration)configuration).getConfigurationModule(); + final String projectPath = ExternalSystemApiUtil.getExternalProjectPath(runConfigurationModule.getModule()); + if (StringUtil.isNotEmpty(projectPath)) { + ((CommonProgramRunConfigurationParameters)configuration).setWorkingDirectory(projectPath); + } + } + } + } + + @Override + protected void readExternal(@NotNull RunConfigurationBase runConfiguration, @NotNull Element element) + throws InvalidDataException { + } + + @Nullable + @Override + protected

SettingsEditor

createEditor(@NotNull P configuration) { + return null; + } + + @Nullable + @Override + protected String getEditorTitle() { + return null; + } + + @Override + protected boolean isApplicableFor(@NotNull RunConfigurationBase configuration) { + if (configuration instanceof ModuleBasedConfiguration && configuration instanceof CommonProgramRunConfigurationParameters) { + final RunConfigurationModule runConfigurationModule = ((ModuleBasedConfiguration)configuration).getConfigurationModule(); + return ExternalSystemApiUtil.isExternalSystemAwareModule(GradleConstants.SYSTEM_ID, runConfigurationModule.getModule()); + } + return false; + } +} From e379c5a0737ff7f4f44ba8daa236459cc9144348 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 14 Dec 2015 15:36:45 +0100 Subject: [PATCH 013/105] method signatures: skip identity substitution --- .../com/intellij/psi/util/MethodSignatureUtil.java | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/java/java-psi-api/src/com/intellij/psi/util/MethodSignatureUtil.java b/java/java-psi-api/src/com/intellij/psi/util/MethodSignatureUtil.java index a7c3ca7b3ffd..f6553508a3d7 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/MethodSignatureUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/MethodSignatureUtil.java @@ -23,10 +23,7 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class MethodSignatureUtil { @@ -323,20 +320,16 @@ public class MethodSignatureUtil { result = result.put(superTypeParameters[i], factory.createType(methodTypeParameter)); } - final PsiSubstitutor methodSubstitutor = methodSignature.getSubstitutor(); - //check bounds for (int i = 0; i < methodTypeParameters.length; i++) { PsiTypeParameter methodTypeParameter = methodTypeParameters[i]; PsiTypeParameter superTypeParameter = superTypeParameters[i]; final Set methodSupers = new HashSet(); - for (PsiClassType methodSuper : methodTypeParameter.getSuperTypes()) { - methodSupers.add(methodSubstitutor.substitute(methodSuper)); - } + Collections.addAll(methodSupers, methodTypeParameter.getSuperTypes()); final Set superSupers = new HashSet(); for (PsiClassType superSuper : superTypeParameter.getSuperTypes()) { - superSupers.add(methodSubstitutor.substitute(result.substitute(superSuper))); + superSupers.add(result.substitute(superSuper)); } methodSupers.remove(PsiType.getJavaLangObject(methodTypeParameter.getManager(), methodTypeParameter.getResolveScope())); superSupers.remove(PsiType.getJavaLangObject(superTypeParameter.getManager(), superTypeParameter.getResolveScope())); From aecd5691645ff4d2137c3b743df5d64cedeffab6 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 15 Dec 2015 12:14:36 +0100 Subject: [PATCH 014/105] method signatures: do not merge methods by override equivalence which are determined by super substitution --- .../src/com/intellij/psi/impl/PsiSuperMethodImplUtil.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiSuperMethodImplUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiSuperMethodImplUtil.java index a18e2c959ed3..3f6fa62e7a32 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiSuperMethodImplUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiSuperMethodImplUtil.java @@ -207,8 +207,8 @@ public class PsiSuperMethodImplUtil { } if (nameHint != null && !nameHint.equals(method.getName())) continue; if (!includePrivates && method.hasModifierProperty(PsiModifier.PRIVATE)) continue; - final MethodSignatureBackedByPsiMethod signature = MethodSignatureBackedByPsiMethod.create(method, substitutor, isInRawContext); - HierarchicalMethodSignatureImpl newH = new HierarchicalMethodSignatureImpl(signature); + final MethodSignatureBackedByPsiMethod signature = MethodSignatureBackedByPsiMethod.create(method, PsiSubstitutor.EMPTY, isInRawContext); + HierarchicalMethodSignatureImpl newH = new HierarchicalMethodSignatureImpl(MethodSignatureBackedByPsiMethod.create(method, substitutor, isInRawContext)); List list = sameParameterErasureMethods.get(signature); if (list == null) { @@ -238,7 +238,7 @@ public class PsiSuperMethodImplUtil { List> flattened = new ArrayList>(); for (Map.Entry entry : superResult.entrySet()) { HierarchicalMethodSignature hms = entry.getValue(); - MethodSignature signature = entry.getKey(); + MethodSignature signature = MethodSignatureBackedByPsiMethod.create(hms.getMethod(), hms.getSubstitutor(), hms.isRaw()); PsiClass containingClass = hms.getMethod().getContainingClass(); List supers = new ArrayList(hms.getSuperSignatures()); for (HierarchicalMethodSignature aSuper : supers) { From cc190097cdebe88602afbc2c4e07c454b35dafb6 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 15 Dec 2015 15:12:05 +0100 Subject: [PATCH 015/105] new inference refactoring: compound initial state; run nested sessions with top container --- .../graphInference/CompoundInitialState.java | 45 +++++++++++++++++++ .../graphInference/InferenceSession.java | 4 +- .../InferenceSessionContainer.java | 37 ++++++++------- 3 files changed, 65 insertions(+), 21 deletions(-) create mode 100644 java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/CompoundInitialState.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/CompoundInitialState.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/CompoundInitialState.java new file mode 100644 index 000000000000..90367e9e59fd --- /dev/null +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/CompoundInitialState.java @@ -0,0 +1,45 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.psi.impl.source.resolve.graphInference; + +import com.intellij.psi.PsiCall; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiSubstitutor; + +import java.util.Map; + +class CompoundInitialState { + private PsiSubstitutor myInitialSubstitutor; + private Map myInitialStates; + + CompoundInitialState(PsiSubstitutor initialSubstitutor, + Map initialStates) { + myInitialSubstitutor = initialSubstitutor; + myInitialStates = initialStates; + } + + PsiSubstitutor getInitialSubstitutor() { + return myInitialSubstitutor; + } + + Map getInitialStates() { + return myInitialStates; + } + + InitialInferenceState getInitialState(PsiCall call) { + return myInitialStates.get(call); + } +} diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index 8850d2408746..cba5bd7d2f79 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -584,13 +584,13 @@ public class InferenceSession { return mySiteSubstitutor; } - public InitialInferenceState createInitialState() { + public InitialInferenceState createInitialState(InferenceSessionContainer container) { return new InitialInferenceState(myInferenceVariables, myContext, myInferenceSubstitution, mySiteSubstitutor, myIncorporationPhase.getCaptures(), - myInferenceSessionContainer); + container); } public void initBounds(PsiTypeParameter... typeParameters) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSessionContainer.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSessionContainer.java index 78eb3cd06ef8..35e5a8d7c198 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSessionContainer.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSessionContainer.java @@ -17,7 +17,6 @@ package com.intellij.psi.impl.source.resolve.graphInference; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Computable; -import com.intellij.openapi.util.Pair; import com.intellij.psi.*; import com.intellij.psi.impl.source.resolve.graphInference.constraints.ExpressionCompatibilityConstraint; import com.intellij.psi.infos.MethodCandidateInfo; @@ -73,19 +72,19 @@ public class InferenceSessionContainer { final PsiExpressionList argumentList = ((PsiCall)parent).getArgumentList(); final MethodCandidateInfo.CurrentCandidateProperties properties = MethodCandidateInfo.getCurrentMethod(argumentList); if (properties != null && !properties.isApplicabilityCheck()) { - final Pair> + final CompoundInitialState session = PsiResolveHelper.ourGraphGuard.doPreventingRecursion(parent, false, - new Computable>>() { - @Override - public Pair> compute() { - return createValue(parent); - } - }); + new Computable() { + @Override + public CompoundInitialState compute() { + return createValue(parent); + } + }); if (session != null) { - final InitialInferenceState initialInferenceState = session.second.get(PsiTreeUtil.getParentOfType(argumentList, PsiCall.class)); + final InitialInferenceState initialInferenceState = session.getInitialState(PsiTreeUtil.getParentOfType(argumentList, PsiCall.class)); if (initialInferenceState != null) { - return new InferenceSession(initialInferenceState).collectAdditionalAndInfer(parameters, arguments, properties, session.first); + return new InferenceSession(initialInferenceState).collectAdditionalAndInfer(parameters, arguments, properties, session.getInitialSubstitutor()); } } } @@ -96,22 +95,21 @@ public class InferenceSessionContainer { return inferenceSession.infer(parameters, arguments, parent); } - private static Pair> createValue(@NotNull final PsiElement parent) { + private static CompoundInitialState createValue(@NotNull final PsiElement parent) { if (MethodCandidateInfo.isOverloadCheck()) { return startTopLevelInference(parent); } return CachedValuesManager.getCachedValue(parent, - new CachedValueProvider>>() { + new CachedValueProvider() { @Nullable @Override - public Result>> compute() { - return new Result>>( - startTopLevelInference(parent), PsiModificationTracker.MODIFICATION_COUNT); + public Result compute() { + return new Result(startTopLevelInference(parent), PsiModificationTracker.MODIFICATION_COUNT); } }); } - private static Pair> startTopLevelInference(@NotNull final PsiElement parent) { + private static CompoundInitialState startTopLevelInference(@NotNull final PsiElement parent) { final PsiCall topLevelCall = treeWalkUp(parent); if (topLevelCall != null) { final JavaResolveResult result = topLevelCall.resolveMethodGenerics(); @@ -126,10 +124,11 @@ public class InferenceSessionContainer { topLevelSession.initExpressionConstraints(topLevelParameters, topLevelArguments, topLevelCall, method, ((MethodCandidateInfo)result).isVarargs()); topLevelSession.infer(topLevelParameters, topLevelArguments, topLevelCall, ((MethodCandidateInfo)result).createProperties()); - final Map nestedSessions = topLevelSession.getInferenceSessionContainer().myNestedSessions; + final InferenceSessionContainer container = topLevelSession.getInferenceSessionContainer(); + final Map nestedSessions = container.myNestedSessions; Map nestedStates = new LinkedHashMap(); for (Map.Entry entry : nestedSessions.entrySet()) { - nestedStates.put(entry.getKey(), entry.getValue().createInitialState()); + nestedStates.put(entry.getKey(), entry.getValue().createInitialState(container)); } PsiSubstitutor substitutor = PsiSubstitutor.EMPTY; @@ -140,7 +139,7 @@ public class InferenceSessionContainer { } } - return Pair.create(substitutor, nestedStates); + return new CompoundInitialState(substitutor, nestedStates); } } From 95f39c3f12075f4fe3afc747d2c941582b02979a Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 15 Dec 2015 16:27:07 +0100 Subject: [PATCH 016/105] new inference refactoring: expose only substitutor to clients; use states to retrieve substitution --- .../graphInference/InferenceSession.java | 22 ++++++++++--- .../InferenceSessionContainer.java | 31 +++++++++++++------ ...mbdaExpressionCompatibilityConstraint.java | 15 +++++++-- 3 files changed, 51 insertions(+), 17 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index cba5bd7d2f79..a134f73e9ea2 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -406,9 +406,8 @@ public class InferenceSession { } } } - final InferenceSession nestedCallSession = myInferenceSessionContainer.findNestedCallSession(arg, this); - final PsiType parameterType = - nestedCallSession.substituteWithInferenceVariables(getParameterType(parameters, i, siteSubstitutor, varargs)); + final PsiSubstitutor nestedSubstitutor = myInferenceSessionContainer.findNestedSubstitutor(arg, myInferenceSubstitution); + final PsiType parameterType = nestedSubstitutor.substitute(getParameterType(parameters, i, siteSubstitutor, varargs)); if (!isPertinentToApplicability(arg, parentMethod)) { additionalConstraints.add(new ExpressionCompatibilityConstraint(arg, parameterType)); } @@ -848,6 +847,17 @@ public class InferenceSession { public boolean collectDependencies(@Nullable PsiType type, @Nullable final Set dependencies) { + return collectDependencies(type, dependencies, new Function() { + @Override + public InferenceVariable fun(PsiClassType classType) { + return getInferenceVariable(classType); + } + }); + } + + public static boolean collectDependencies(@Nullable PsiType type, + @Nullable final Set dependencies, + final Function fun) { if (type == null) return true; final Boolean isProper = type.accept(new PsiTypeVisitor() { @Nullable @@ -879,7 +889,7 @@ public class InferenceSession { @Nullable @Override public Boolean visitClassType(PsiClassType classType) { - final InferenceVariable inferenceVariable = getInferenceVariable(classType); + final InferenceVariable inferenceVariable = fun.fun(classType); if (inferenceVariable != null) { if (dependencies != null) { dependencies.add(inferenceVariable); @@ -1727,6 +1737,10 @@ public class InferenceSession { return myInferenceSubstitution.substitute(type); } + public PsiSubstitutor getInferenceSubstitution() { + return myInferenceSubstitution; + } + public InferenceSessionContainer getInferenceSessionContainer() { return myInferenceSessionContainer; } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSessionContainer.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSessionContainer.java index 35e5a8d7c198..2c454b32aabd 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSessionContainer.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSessionContainer.java @@ -45,15 +45,15 @@ public class InferenceSessionContainer { } @Contract("_, !null -> !null") - public InferenceSession findNestedCallSession(PsiElement arg, @Nullable InferenceSession defaultSession) { + public PsiSubstitutor findNestedSubstitutor(PsiElement arg, @Nullable PsiSubstitutor defaultSession) { InferenceSession session = myNestedSessions.get(PsiTreeUtil.getParentOfType(arg, PsiCall.class)); - return session == null ? defaultSession : session; + return session == null ? defaultSession : session.getInferenceSubstitution(); } - public void registerNestedSession(InferenceSession session, - PsiType returnType, - PsiExpression returnExpression) { - final InferenceSession callSession = findNestedCallSession(((PsiCallExpression)returnExpression).getArgumentList(), null); + void registerNestedSession(InferenceSession session, + PsiType returnType, + PsiExpression returnExpression) { + final PsiSubstitutor callSession = findNestedSubstitutor(((PsiCallExpression)returnExpression).getArgumentList(), null); if (callSession == null) { final InferenceSession inferenceSession = ExpressionCompatibilityConstraint.reduceExpressionCompatibilityConstraint(session, returnExpression, returnType); @@ -124,11 +124,22 @@ public class InferenceSessionContainer { topLevelSession.initExpressionConstraints(topLevelParameters, topLevelArguments, topLevelCall, method, ((MethodCandidateInfo)result).isVarargs()); topLevelSession.infer(topLevelParameters, topLevelArguments, topLevelCall, ((MethodCandidateInfo)result).createProperties()); - final InferenceSessionContainer container = topLevelSession.getInferenceSessionContainer(); - final Map nestedSessions = container.myNestedSessions; - Map nestedStates = new LinkedHashMap(); + + final Map nestedStates = new LinkedHashMap(); + + final InferenceSessionContainer copy = new InferenceSessionContainer() { + @Override + public PsiSubstitutor findNestedSubstitutor(PsiElement arg, @Nullable PsiSubstitutor defaultSession) { + final InitialInferenceState state = nestedStates.get(PsiTreeUtil.getParentOfType(arg, PsiCall.class)); + if (state != null) { + return state.getInferenceSubstitutor(); + } + return super.findNestedSubstitutor(arg, defaultSession); + } + }; + final Map nestedSessions = topLevelSession.getInferenceSessionContainer().myNestedSessions; for (Map.Entry entry : nestedSessions.entrySet()) { - nestedStates.put(entry.getKey(), entry.getValue().createInitialState(container)); + nestedStates.put(entry.getKey(), entry.getValue().createInitialState(copy)); } PsiSubstitutor substitutor = PsiSubstitutor.EMPTY; diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/LambdaExpressionCompatibilityConstraint.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/LambdaExpressionCompatibilityConstraint.java index bd0258078c72..91902eb94d62 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/LambdaExpressionCompatibilityConstraint.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/LambdaExpressionCompatibilityConstraint.java @@ -4,9 +4,11 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.*; import com.intellij.psi.impl.source.resolve.graphInference.FunctionalInterfaceParameterizationUtil; import com.intellij.psi.impl.source.resolve.graphInference.InferenceSession; +import com.intellij.psi.impl.source.resolve.graphInference.InferenceVariable; import com.intellij.psi.impl.source.resolve.graphInference.PsiPolyExpressionUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; +import com.intellij.util.Function; import java.util.List; @@ -76,9 +78,16 @@ public class LambdaExpressionCompatibilityConstraint implements ConstraintFormul session.registerIncompatibleErrorMessage("Incompatible types: expected not void but the lambda body is a block that is not value-compatible"); return false; } - InferenceSession callsession = session.getInferenceSessionContainer().findNestedCallSession(myExpression, session); - returnType = callsession.substituteWithInferenceVariables(substitutor.substitute(returnType)); - if (!callsession.isProperType(returnType)) { + final PsiSubstitutor nestedSubstitutor = session.getInferenceSessionContainer().findNestedSubstitutor(myExpression, session.getInferenceSubstitution()); + returnType = nestedSubstitutor.substitute(substitutor.substitute(returnType)); + boolean isProperType = InferenceSession.collectDependencies(returnType, null, new Function() { + @Override + public InferenceVariable fun(PsiClassType type) { + final PsiClass psiClass = PsiUtil.resolveClassInClassTypeOnly(type); + return psiClass instanceof InferenceVariable && nestedSubstitutor.getSubstitutionMap().containsKey(psiClass) ? (InferenceVariable)psiClass : null; + } + }); + if (!isProperType) { for (PsiExpression returnExpression : returnExpressions) { constraints.add(new ExpressionCompatibilityConstraint(returnExpression, returnType)); } From 7d34d5ad36afbf0e053c372d1c0476e08a666375 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 15 Dec 2015 18:26:51 +0100 Subject: [PATCH 017/105] new inference refactoring: replace all variables with new ones for each inference, so cached inference session is used read-only --- .../graphInference/InferenceSession.java | 5 +- .../InferenceSessionContainer.java | 132 ++++++++++-------- .../graphInference/InitialInferenceState.java | 76 +++++----- ...mbdaExpressionCompatibilityConstraint.java | 2 +- 4 files changed, 120 insertions(+), 95 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index a134f73e9ea2..a6a62606ee70 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -583,8 +583,9 @@ public class InferenceSession { return mySiteSubstitutor; } - public InitialInferenceState createInitialState(InferenceSessionContainer container) { - return new InitialInferenceState(myInferenceVariables, + public InitialInferenceState createInitialState(InferenceSessionContainer container, PsiSubstitutor topInferenceSubstitutor) { + return new InitialInferenceState(myInferenceVariables, + topInferenceSubstitutor, myContext, myInferenceSubstitution, mySiteSubstitutor, diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSessionContainer.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSessionContainer.java index 2c454b32aabd..3758bbf59917 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSessionContainer.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSessionContainer.java @@ -20,17 +20,12 @@ import com.intellij.openapi.util.Computable; import com.intellij.psi.*; import com.intellij.psi.impl.source.resolve.graphInference.constraints.ExpressionCompatibilityConstraint; import com.intellij.psi.infos.MethodCandidateInfo; -import com.intellij.psi.util.CachedValueProvider; -import com.intellij.psi.util.CachedValuesManager; -import com.intellij.psi.util.PsiModificationTracker; -import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.*; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.*; public class InferenceSessionContainer { private static final Logger LOG = Logger.getInstance("#" + InferenceSessionContainer.class.getName()); @@ -72,19 +67,29 @@ public class InferenceSessionContainer { final PsiExpressionList argumentList = ((PsiCall)parent).getArgumentList(); final MethodCandidateInfo.CurrentCandidateProperties properties = MethodCandidateInfo.getCurrentMethod(argumentList); if (properties != null && !properties.isApplicabilityCheck()) { - final CompoundInitialState - session = PsiResolveHelper.ourGraphGuard.doPreventingRecursion(parent, false, - new Computable() { + final InferenceSession session = PsiResolveHelper.ourGraphGuard.doPreventingRecursion(parent, false, + new Computable() { @Override - public CompoundInitialState compute() { - return createValue(parent); + public InferenceSession compute() { + if (MethodCandidateInfo.isOverloadCheck()) { + return startTopLevelInference(parent); + } + return CachedValuesManager.getCachedValue(parent, + new CachedValueProvider() { + @Nullable + @Override + public Result compute() { + return new Result(startTopLevelInference(parent), PsiModificationTracker.MODIFICATION_COUNT); + } + }); } }); if (session != null) { - final InitialInferenceState initialInferenceState = session.getInitialState(PsiTreeUtil.getParentOfType(argumentList, PsiCall.class)); + final CompoundInitialState compoundInitialState = createState(session); + final InitialInferenceState initialInferenceState = compoundInitialState.getInitialState(PsiTreeUtil.getParentOfType(argumentList, PsiCall.class)); if (initialInferenceState != null) { - - return new InferenceSession(initialInferenceState).collectAdditionalAndInfer(parameters, arguments, properties, session.getInitialSubstitutor()); + return new InferenceSession(initialInferenceState) + .collectAdditionalAndInfer(parameters, arguments, properties, compoundInitialState.getInitialSubstitutor()); } } } @@ -94,22 +99,41 @@ public class InferenceSessionContainer { inferenceSession.initExpressionConstraints(parameters, arguments, parent, null); return inferenceSession.infer(parameters, arguments, parent); } + + private static CompoundInitialState createState(InferenceSession topLevelSession) { + final PsiSubstitutor topInferenceSubstitutor = replaceVariables(topLevelSession.getInferenceVariables()); + final Map nestedStates = new LinkedHashMap(); - private static CompoundInitialState createValue(@NotNull final PsiElement parent) { - if (MethodCandidateInfo.isOverloadCheck()) { - return startTopLevelInference(parent); + final InferenceSessionContainer copy = new InferenceSessionContainer() { + @Override + public PsiSubstitutor findNestedSubstitutor(PsiElement arg, @Nullable PsiSubstitutor defaultSession) { + final InitialInferenceState state = nestedStates.get(PsiTreeUtil.getParentOfType(arg, PsiCall.class)); + if (state != null) { + return state.getInferenceSubstitutor(); + } + return super.findNestedSubstitutor(arg, defaultSession); + } + }; + final Map nestedSessions = topLevelSession.getInferenceSessionContainer().myNestedSessions; + for (Map.Entry entry : nestedSessions.entrySet()) { + nestedStates.put(entry.getKey(), entry.getValue().createInitialState(copy, topInferenceSubstitutor)); } - return CachedValuesManager.getCachedValue(parent, - new CachedValueProvider() { - @Nullable - @Override - public Result compute() { - return new Result(startTopLevelInference(parent), PsiModificationTracker.MODIFICATION_COUNT); - } - }); + + PsiSubstitutor substitutor = PsiSubstitutor.EMPTY; + for (InferenceVariable variable : topLevelSession.getInferenceVariables()) { + final PsiType instantiation = variable.getInstantiation(); + if (instantiation != PsiType.NULL) { + final PsiClass psiClass = PsiUtil.resolveClassInClassTypeOnly(topInferenceSubstitutor.substitute(variable)); + if (psiClass instanceof InferenceVariable) { + substitutor = substitutor.put((PsiTypeParameter)psiClass, instantiation); + } + } + } + + return new CompoundInitialState(substitutor, nestedStates); } - private static CompoundInitialState startTopLevelInference(@NotNull final PsiElement parent) { + private static InferenceSession startTopLevelInference(@NotNull final PsiElement parent) { final PsiCall topLevelCall = treeWalkUp(parent); if (topLevelCall != null) { final JavaResolveResult result = topLevelCall.resolveMethodGenerics(); @@ -123,40 +147,38 @@ public class InferenceSessionContainer { new InferenceSession(method.getTypeParameters(), ((MethodCandidateInfo)result).getSiteSubstitutor(), topLevelCall.getManager(), topLevelCall); topLevelSession.initExpressionConstraints(topLevelParameters, topLevelArguments, topLevelCall, method, ((MethodCandidateInfo)result).isVarargs()); topLevelSession.infer(topLevelParameters, topLevelArguments, topLevelCall, ((MethodCandidateInfo)result).createProperties()); - - - final Map nestedStates = new LinkedHashMap(); - - final InferenceSessionContainer copy = new InferenceSessionContainer() { - @Override - public PsiSubstitutor findNestedSubstitutor(PsiElement arg, @Nullable PsiSubstitutor defaultSession) { - final InitialInferenceState state = nestedStates.get(PsiTreeUtil.getParentOfType(arg, PsiCall.class)); - if (state != null) { - return state.getInferenceSubstitutor(); - } - return super.findNestedSubstitutor(arg, defaultSession); - } - }; - final Map nestedSessions = topLevelSession.getInferenceSessionContainer().myNestedSessions; - for (Map.Entry entry : nestedSessions.entrySet()) { - nestedStates.put(entry.getKey(), entry.getValue().createInitialState(copy)); - } - - PsiSubstitutor substitutor = PsiSubstitutor.EMPTY; - for (InferenceVariable variable : topLevelSession.getInferenceVariables()) { - final PsiType instantiation = variable.getInstantiation(); - if (instantiation != PsiType.NULL) { - substitutor = substitutor.put(variable, instantiation); - } - } - - return new CompoundInitialState(substitutor, nestedStates); + return topLevelSession; } } return null; } + @NotNull + private static PsiSubstitutor replaceVariables(Collection inferenceVariables) { + final List targetVars = new ArrayList(); + PsiSubstitutor substitutor = PsiSubstitutor.EMPTY; + final InferenceVariable[] oldVars = inferenceVariables.toArray(new InferenceVariable[inferenceVariables.size()]); + for (InferenceVariable variable : oldVars) { + final InferenceVariable newVariable = new InferenceVariable(variable.getCallContext(), variable.getParameter()); + substitutor = substitutor.put(variable, JavaPsiFacade.getElementFactory(variable.getProject()).createType(newVariable)); + targetVars.add(newVariable); + if (variable.isThrownBound()) { + newVariable.setThrownBound(); + } + } + + for (int i = 0; i < targetVars.size(); i++) { + InferenceVariable var = targetVars.get(i); + for (InferenceBound boundType : InferenceBound.values()) { + for (PsiType bound : oldVars[i].getBounds(boundType)) { + var.addBound(substitutor.substitute(bound), boundType); + } + } + } + return substitutor; + } + @Nullable private static PsiCall treeWalkUp(PsiElement context) { if (context instanceof PsiExpression && !PsiPolyExpressionUtil.isPolyExpression((PsiExpression)context)) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InitialInferenceState.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InitialInferenceState.java index 5c851d5eb272..e8f95119377a 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InitialInferenceState.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InitialInferenceState.java @@ -17,12 +17,14 @@ package com.intellij.psi.impl.source.resolve.graphInference; import com.intellij.openapi.util.Pair; import com.intellij.psi.*; -import org.jetbrains.annotations.NotNull; +import com.intellij.psi.util.PsiUtil; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Set; -public class InitialInferenceState { +class InitialInferenceState { private final Set myInferenceVariables; private final PsiElement myContext; @@ -31,48 +33,48 @@ public class InitialInferenceState { private final List> myCaptures; private final InferenceSessionContainer myInferenceSessionContainer; - public InitialInferenceState(Set inferenceVariables, - PsiElement context, - PsiSubstitutor inferenceSubstitutor, - PsiSubstitutor siteSubstitutor, - List> captures, - InferenceSessionContainer inferenceSessionContainer) { - myInferenceVariables = inferenceVariables; - myContext = context; - myInferenceSubstitutor = inferenceSubstitutor; - mySiteSubstitutor = siteSubstitutor; - myCaptures = captures; - myInferenceSessionContainer = inferenceSessionContainer; - } - - @NotNull - static PsiSubstitutor copyVariables(List targetVars, - Set inferenceVariables, - PsiElement context) { + InitialInferenceState(Set inferenceVariables, + PsiSubstitutor topInferenceSubstitutor, + PsiElement context, + PsiSubstitutor inferenceSubstitutor, + PsiSubstitutor siteSubstitutor, + List> captures, + InferenceSessionContainer inferenceSessionContainer) { + myInferenceVariables = new HashSet(); PsiSubstitutor substitutor = PsiSubstitutor.EMPTY; - final InferenceVariable[] oldVars = inferenceVariables.toArray(new InferenceVariable[inferenceVariables.size()]); - for (InferenceVariable variable : oldVars) { - final InferenceVariable newVariable = new InferenceVariable(context, variable.getParameter()); - substitutor = substitutor.put(variable, JavaPsiFacade.getElementFactory(variable.getProject()).createType(newVariable)); - targetVars.add(newVariable); - } - - for (int i = 0; i < targetVars.size(); i++) { - InferenceVariable var = targetVars.get(i); - for (InferenceBound boundType : InferenceBound.values()) { - for (PsiType bound : oldVars[i].getBounds(boundType)) { - var.addBound(substitutor.substitute(bound), boundType); + PsiSubstitutor subst = PsiSubstitutor.EMPTY; + for (InferenceVariable variable : inferenceVariables) { + final PsiType substitute = topInferenceSubstitutor.substitute(variable); + final PsiClass aClass = PsiUtil.resolveClassInClassTypeOnly(substitute); + if (aClass instanceof InferenceVariable) { + myInferenceVariables.add((InferenceVariable)aClass); + if (inferenceSubstitutor.getSubstitutionMap().containsValue(PsiSubstitutor.EMPTY.substitute(variable))) { + substitutor = substitutor.put(variable.getParameter(), substitute); + subst = subst.put(variable, substitute); } } } - return substitutor; + myInferenceSubstitutor = substitutor; + myContext = context; + mySiteSubstitutor = siteSubstitutor; + myCaptures = new ArrayList>(); + for (Pair capture : captures) { + PsiTypeParameter[] newParameters = new PsiTypeParameter[capture.first.length]; + PsiTypeParameter[] parameters = capture.first; + for (int i = 0; i < parameters.length; i++) { + final PsiType substitute = topInferenceSubstitutor.substitute(parameters[i]); + newParameters[i] = (PsiTypeParameter)PsiUtil.resolveClassInClassTypeOnly(substitute); + } + myCaptures.add(Pair.create(newParameters, (PsiClassType)subst.substitute(capture.second))); + } + myInferenceSessionContainer = inferenceSessionContainer; } - public InferenceSessionContainer getInferenceSessionContainer() { + InferenceSessionContainer getInferenceSessionContainer() { return myInferenceSessionContainer; } - public Set getInferenceVariables() { + Set getInferenceVariables() { return myInferenceVariables; } @@ -80,11 +82,11 @@ public class InitialInferenceState { return myContext; } - public PsiSubstitutor getInferenceSubstitutor() { + PsiSubstitutor getInferenceSubstitutor() { return myInferenceSubstitutor; } - public PsiSubstitutor getSiteSubstitutor() { + PsiSubstitutor getSiteSubstitutor() { return mySiteSubstitutor; } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/LambdaExpressionCompatibilityConstraint.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/LambdaExpressionCompatibilityConstraint.java index 91902eb94d62..0a9d98a242a6 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/LambdaExpressionCompatibilityConstraint.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/LambdaExpressionCompatibilityConstraint.java @@ -84,7 +84,7 @@ public class LambdaExpressionCompatibilityConstraint implements ConstraintFormul @Override public InferenceVariable fun(PsiClassType type) { final PsiClass psiClass = PsiUtil.resolveClassInClassTypeOnly(type); - return psiClass instanceof InferenceVariable && nestedSubstitutor.getSubstitutionMap().containsKey(psiClass) ? (InferenceVariable)psiClass : null; + return psiClass instanceof InferenceVariable && nestedSubstitutor.getSubstitutionMap().containsValue(type) ? (InferenceVariable)psiClass : null; } }); if (!isProperType) { From aa70efc9a4e20a0d96338fa3a74af31a5588f86f Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 15 Dec 2015 21:40:02 +0100 Subject: [PATCH 018/105] testdata for IDEA-149224 --- .../lambda/newLambda/IDEA149224.java | 15 +++++++++++++++ .../daemon/lambda/NewLambdaHighlightingTest.java | 6 +++++- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA149224.java diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA149224.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA149224.java new file mode 100644 index 000000000000..72f86973b2d6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA149224.java @@ -0,0 +1,15 @@ +import java.util.concurrent.Callable; +class Test { + + public void test() { + Foo f = new Foo<>(() -> "this doesn't compile"); + } + + public class Foo { + public Foo(Callable supplier) { + } + + public Foo(T value) { + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java index bd3d81749d03..670ebfd1f190 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java @@ -248,6 +248,10 @@ public class NewLambdaHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testIDEA149224() throws Exception { + doTest(); + } + private void doTest() { doTest(false); } @@ -269,4 +273,4 @@ public class NewLambdaHighlightingTest extends LightDaemonAnalyzerTestCase { } return suite; }*/ -} +} \ No newline at end of file From d9aeacbf48f29335152069546aeb67a2f67e99f4 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 16 Dec 2015 11:59:12 +0100 Subject: [PATCH 019/105] overload resolution: don't prefer generic to raw substitution (IDEA-149289) --- .../JavaMethodsConflictResolver.java | 6 ------ .../NoNeedToPreferGenericToRawSubstitution.java | 14 ++++++++++++++ .../daemon/lambda/OverloadResolutionTest.java | 4 ++++ 3 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/NoNeedToPreferGenericToRawSubstitution.java diff --git a/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java b/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java index b52561b246cc..c391fdc71382 100644 --- a/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java +++ b/java/java-psi-impl/src/com/intellij/psi/scope/conflictResolvers/JavaMethodsConflictResolver.java @@ -675,12 +675,6 @@ public class JavaMethodsConflictResolver implements PsiConflictResolver{ } } - final boolean raw1 = PsiUtil.isRawSubstitutor(method1, classSubstitutor1); - final boolean raw2 = PsiUtil.isRawSubstitutor(method2, classSubstitutor2); - if (raw1 ^ raw2) { - return raw1 ? Specifics.SECOND : Specifics.FIRST; - } - final boolean varargs1 = info1.isVarargs(); final boolean varargs2 = info2.isVarargs(); if (varargs1 ^ varargs2) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/NoNeedToPreferGenericToRawSubstitution.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/NoNeedToPreferGenericToRawSubstitution.java new file mode 100644 index 000000000000..9df00e20bff7 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/overloadResolution/NoNeedToPreferGenericToRawSubstitution.java @@ -0,0 +1,14 @@ +import java.util.List; +import java.util.Set; + +abstract class Test { + + public void foo(List list) { + set(get(), list); + } + + abstract Set get(); + + abstract void set(Set set, X x); + abstract void set(Set set, List l); +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/OverloadResolutionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/OverloadResolutionTest.java index 2e9eeb9e356a..5e7519b18e3e 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/OverloadResolutionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/OverloadResolutionTest.java @@ -191,6 +191,10 @@ public class OverloadResolutionTest extends LightDaemonAnalyzerTestCase { doTest(false); } + public void testNoNeedToPreferGenericToRawSubstitution() throws Exception { + doTest(); + } + private void doTest() { doTest(true); } From 1d9dadf557669bf4e6204e4ac94633d4af8cd99e Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 16 Dec 2015 12:17:21 +0100 Subject: [PATCH 020/105] batch analysis: if source content intersects with library sources - let content to win and be analyzed (IDEA-149055) --- .../codeInsight/daemon/JavaProblemHighlightFilter.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/JavaProblemHighlightFilter.java b/java/java-impl/src/com/intellij/codeInsight/daemon/JavaProblemHighlightFilter.java index dd376bb5c962..922c8a4e0ca4 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/JavaProblemHighlightFilter.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/JavaProblemHighlightFilter.java @@ -18,6 +18,7 @@ package com.intellij.codeInsight.daemon; import com.intellij.ide.highlighter.JavaFileType; import com.intellij.ide.scratch.ScratchFileType; import com.intellij.openapi.roots.JavaProjectRootsUtil; +import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; @@ -36,8 +37,11 @@ public class JavaProblemHighlightFilter extends ProblemHighlightFilter { if (shouldHighlight) { if (psiFile.getFileType() == JavaFileType.INSTANCE) { final VirtualFile virtualFile = psiFile.getVirtualFile(); - if (virtualFile != null && ProjectRootManager.getInstance(psiFile.getProject()).getFileIndex().isInLibrarySource(virtualFile)) { - return false; + if (virtualFile != null) { + final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(psiFile.getProject()).getFileIndex(); + if (fileIndex.isInLibrarySource(virtualFile)) { + return fileIndex.isInSourceContent(virtualFile); + } } } } From 6594af0dc1ca896da4ce90b625128756e82a6fcb Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 16 Dec 2015 13:41:53 +0100 Subject: [PATCH 021/105] tests: allow tests selection from file with multiple test classes (IDEA-148273) --- .../AbstractPatternBasedConfigurationProducer.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/java/execution/impl/src/com/intellij/execution/testframework/AbstractPatternBasedConfigurationProducer.java b/java/execution/impl/src/com/intellij/execution/testframework/AbstractPatternBasedConfigurationProducer.java index 719d8d20763f..1275cf8d5af8 100644 --- a/java/execution/impl/src/com/intellij/execution/testframework/AbstractPatternBasedConfigurationProducer.java +++ b/java/execution/impl/src/com/intellij/execution/testframework/AbstractPatternBasedConfigurationProducer.java @@ -34,6 +34,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.search.PsiElementProcessor; import com.intellij.psi.util.ClassUtil; +import com.intellij.psi.util.PsiTreeUtil; import java.util.ArrayList; import java.util.LinkedHashSet; @@ -163,6 +164,7 @@ public abstract class AbstractPatternBasedConfigurationProducer 0) { + for (PsiClass aClass : psiClasses) { + if (PsiTreeUtil.isAncestor(aClass, element, false)) { + psiClasses = new PsiClass[] {aClass}; + break; + } + } + } + collectTestMembers(psiClasses, checkAbstract, checkIsTest, processor); for (PsiElement psiMember : processor.getCollection()) { classes.add(((PsiClass)psiMember).getQualifiedName()); } From 930bbc66e293e624e0c651a88e1108908371aa90 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 16 Dec 2015 14:02:02 +0100 Subject: [PATCH 022/105] extract super: ensure extends reference reformatted (IDEA-149247) --- .../extractInterface/ExtractInterfaceHandler.java | 8 +++++--- .../extractSuperclass/ExtractSuperClassUtil.java | 5 +++-- .../multipleTypeParameters/after/Test.java | 3 +++ .../multipleTypeParameters/after/TestSubclass.java | 2 ++ .../multipleTypeParameters/before/Test.java | 3 +++ .../com/intellij/refactoring/ExtractSuperClassTest.java | 4 ++++ 6 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/refactoring/extractSuperClass/multipleTypeParameters/after/Test.java create mode 100644 java/java-tests/testData/refactoring/extractSuperClass/multipleTypeParameters/after/TestSubclass.java create mode 100644 java/java-tests/testData/refactoring/extractSuperClass/multipleTypeParameters/before/Test.java diff --git a/java/java-impl/src/com/intellij/refactoring/extractInterface/ExtractInterfaceHandler.java b/java/java-impl/src/com/intellij/refactoring/extractInterface/ExtractInterfaceHandler.java index 6d604f466955..6188ef3f6712 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractInterface/ExtractInterfaceHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/extractInterface/ExtractInterfaceHandler.java @@ -26,6 +26,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.project.Project; import com.intellij.psi.*; +import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.RefactoringActionHandler; import com.intellij.refactoring.RefactoringBundle; @@ -140,20 +141,21 @@ public class ExtractInterfaceHandler implements RefactoringActionHandler, Elemen String interfaceName, MemberInfo[] selectedMembers, DocCommentPolicy javaDocPolicy) throws IncorrectOperationException { - aClass.getProject().getMessageBus().syncPublisher(RefactoringEventListener.REFACTORING_EVENT_TOPIC) + final Project project = aClass.getProject(); + project.getMessageBus().syncPublisher(RefactoringEventListener.REFACTORING_EVENT_TOPIC) .refactoringStarted(ExtractSuperClassUtil.REFACTORING_EXTRACT_SUPER_ID, ExtractSuperClassUtil.createBeforeData(aClass, selectedMembers)); final PsiClass anInterface = JavaDirectoryService.getInstance().createInterface(targetDir, interfaceName); try { PsiJavaCodeReferenceElement ref = ExtractSuperClassUtil.createExtendingReference(anInterface, aClass, selectedMembers); final PsiReferenceList referenceList = aClass.isInterface() ? aClass.getExtendsList() : aClass.getImplementsList(); assert referenceList != null; - referenceList.add(ref); + CodeStyleManager.getInstance(project).reformat(referenceList.add(ref)); PullUpProcessor pullUpHelper = new PullUpProcessor(aClass, anInterface, selectedMembers, javaDocPolicy); pullUpHelper.moveMembersToBase(); return anInterface; } finally { - aClass.getProject().getMessageBus().syncPublisher(RefactoringEventListener.REFACTORING_EVENT_TOPIC) + project.getMessageBus().syncPublisher(RefactoringEventListener.REFACTORING_EVENT_TOPIC) .refactoringDone(ExtractSuperClassUtil.REFACTORING_EXTRACT_SUPER_ID, ExtractSuperClassUtil.createAfterData(anInterface)); } } diff --git a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperClassUtil.java b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperClassUtil.java index 8812398b4f75..7e6b86b732a8 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperClassUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/extractSuperclass/ExtractSuperClassUtil.java @@ -95,10 +95,11 @@ public class ExtractSuperClassUtil { // make original class extend extracted superclass PsiJavaCodeReferenceElement ref = createExtendingReference(superclass, subclass, selectedMemberInfos); + final CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(project); if (subClassExtends != null) { - subclass.getExtendsList().add(ref); + codeStyleManager.reformat(subclass.getExtendsList().add(ref)); } else if (subclass instanceof PsiAnonymousClass) { - ((PsiAnonymousClass)subclass).getBaseClassReference().replace(ref); + codeStyleManager.reformat(((PsiAnonymousClass)subclass).getBaseClassReference().replace(ref)); } PullUpProcessor pullUpHelper = new PullUpProcessor(subclass, superclass, selectedMemberInfos, diff --git a/java/java-tests/testData/refactoring/extractSuperClass/multipleTypeParameters/after/Test.java b/java/java-tests/testData/refactoring/extractSuperClass/multipleTypeParameters/after/Test.java new file mode 100644 index 000000000000..ed3dd7401cd6 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractSuperClass/multipleTypeParameters/after/Test.java @@ -0,0 +1,3 @@ +public class Test { + public B m(A a){return null;} +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractSuperClass/multipleTypeParameters/after/TestSubclass.java b/java/java-tests/testData/refactoring/extractSuperClass/multipleTypeParameters/after/TestSubclass.java new file mode 100644 index 000000000000..b0c6fc9e1314 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractSuperClass/multipleTypeParameters/after/TestSubclass.java @@ -0,0 +1,2 @@ +public class TestSubclass extends Test { +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractSuperClass/multipleTypeParameters/before/Test.java b/java/java-tests/testData/refactoring/extractSuperClass/multipleTypeParameters/before/Test.java new file mode 100644 index 000000000000..ed3dd7401cd6 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractSuperClass/multipleTypeParameters/before/Test.java @@ -0,0 +1,3 @@ +public class Test { + public B m(A a){return null;} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractSuperClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractSuperClassTest.java index 8422ffed3b32..84aac46f44b9 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractSuperClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractSuperClassTest.java @@ -59,6 +59,10 @@ public class ExtractSuperClassTest extends RefactoringTestCase { doTest("Test", "TestSubclass", new RefactoringTestUtil.MemberDescriptor("m", PsiMethod.class)); } + public void testMultipleTypeParameters() throws Exception { + doTest("Test", "TestSubclass", new RefactoringTestUtil.MemberDescriptor("m", PsiMethod.class)); + } + public void testEmptyForeach() throws Exception { doTest("Test", "TestSubclass", new RefactoringTestUtil.MemberDescriptor("m", PsiMethod.class)); From b9b85cca9dde49fe34d25b8ee8c5dc14ced4284a Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 16 Dec 2015 14:59:44 +0100 Subject: [PATCH 023/105] inline super: append implements cases to extends list of type parameter (IDEA-149230) --- .../safeDelete/usageInfo/SafeDeleteExtendsClassUsageInfo.java | 2 +- .../inlineSuperClass/typeParameterBound/after/Super.java | 2 ++ .../inlineSuperClass/typeParameterBound/after/Test.java | 4 ++++ .../inlineSuperClass/typeParameterBound/before/Super.java | 4 ++++ .../inlineSuperClass/typeParameterBound/before/Test.java | 4 ++++ .../com/intellij/refactoring/InlineSuperClassTest.java | 2 +- 6 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/typeParameterBound/after/Super.java create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/typeParameterBound/after/Test.java create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/typeParameterBound/before/Super.java create mode 100644 java/java-tests/testData/refactoring/inlineSuperClass/typeParameterBound/before/Test.java diff --git a/java/java-impl/src/com/intellij/refactoring/safeDelete/usageInfo/SafeDeleteExtendsClassUsageInfo.java b/java/java-impl/src/com/intellij/refactoring/safeDelete/usageInfo/SafeDeleteExtendsClassUsageInfo.java index 4b586aa979b1..596df66375e4 100644 --- a/java/java-impl/src/com/intellij/refactoring/safeDelete/usageInfo/SafeDeleteExtendsClassUsageInfo.java +++ b/java/java-impl/src/com/intellij/refactoring/safeDelete/usageInfo/SafeDeleteExtendsClassUsageInfo.java @@ -47,7 +47,7 @@ public class SafeDeleteExtendsClassUsageInfo extends SafeDeleteReferenceUsageInf final PsiElementFactory elementFactory = JavaPsiFacade.getInstance(refClass.getProject()).getElementFactory(); final PsiReferenceList extendsList = refClass.getExtendsList(); - final PsiReferenceList extendingImplementsList = myExtendingClass.getImplementsList(); + final PsiReferenceList extendingImplementsList = myExtendingClass instanceof PsiTypeParameter ? myExtendingClass.getExtendsList() : myExtendingClass.getImplementsList(); if (extendsList != null) { final PsiClassType[] referenceTypes = extendsList.getReferencedTypes(); final PsiReferenceList listToAddExtends = refClass.isInterface() == myExtendingClass.isInterface() || myExtendingClass instanceof PsiTypeParameter ? myExtendingClass.getExtendsList() : extendingImplementsList; diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/typeParameterBound/after/Super.java b/java/java-tests/testData/refactoring/inlineSuperClass/typeParameterBound/after/Super.java new file mode 100644 index 000000000000..f0c2064481b6 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/typeParameterBound/after/Super.java @@ -0,0 +1,2 @@ +interface Int { +} diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/typeParameterBound/after/Test.java b/java/java-tests/testData/refactoring/inlineSuperClass/typeParameterBound/after/Test.java new file mode 100644 index 000000000000..57debb255ebd --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/typeParameterBound/after/Test.java @@ -0,0 +1,4 @@ +abstract class Test implements Runnable { + void m() { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/typeParameterBound/before/Super.java b/java/java-tests/testData/refactoring/inlineSuperClass/typeParameterBound/before/Super.java new file mode 100644 index 000000000000..5cad93fa93a4 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/typeParameterBound/before/Super.java @@ -0,0 +1,4 @@ +interface Int { +} +abstract class Super implements Runnable { +} diff --git a/java/java-tests/testData/refactoring/inlineSuperClass/typeParameterBound/before/Test.java b/java/java-tests/testData/refactoring/inlineSuperClass/typeParameterBound/before/Test.java new file mode 100644 index 000000000000..6c08bc994ab4 --- /dev/null +++ b/java/java-tests/testData/refactoring/inlineSuperClass/typeParameterBound/before/Test.java @@ -0,0 +1,4 @@ +abstract class Test extends Super { + void m() { + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/InlineSuperClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/InlineSuperClassTest.java index 658f41934f9d..043874000c2b 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/InlineSuperClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/InlineSuperClassTest.java @@ -16,7 +16,6 @@ package com.intellij.refactoring; import com.intellij.JavaTestUtil; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClass; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.refactoring.inlineSuperClass.InlineSuperClassRefactoringProcessor; @@ -70,6 +69,7 @@ public class InlineSuperClassTest extends MultiFileTestCase { public void testMultipleSubclassesInheritsOneBaseBase() { doTestMultipleSubclasses(); } public void testInlineSuperclassExtendsList() { doTest(); } public void testInterfaceHierarchyWithSubstitution() { doTest(); } + public void testTypeParameterBound() { doTest();} private void doTest() { doTest(false, false); From 05b90b10a39fbae5450e3c82a04df39882760154 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 16 Dec 2015 15:57:06 +0100 Subject: [PATCH 024/105] introduce: shrink selection to exclude whitespaces and comments (IDEA-149120) --- .../introduceVariable/IntroduceVariableBase.java | 11 ++++++++++- ...nWithSpacesInSelectionAndTailingComment.after.java | 8 ++++++++ ...ressionWithSpacesInSelectionAndTailingComment.java | 7 +++++++ .../intellij/refactoring/IntroduceVariableTest.java | 4 ++++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/introduceVariable/SubexpressionWithSpacesInSelectionAndTailingComment.after.java create mode 100644 java/java-tests/testData/refactoring/introduceVariable/SubexpressionWithSpacesInSelectionAndTailingComment.java diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java index e401a679f87d..6220a00869f9 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/IntroduceVariableBase.java @@ -302,7 +302,11 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase { final InjectedLanguageManager injectedLanguageManager = InjectedLanguageManager.getInstance(project); PsiElement elementAtStart = file.findElementAt(startOffset); if (elementAtStart == null || elementAtStart instanceof PsiWhiteSpace || elementAtStart instanceof PsiComment) { - elementAtStart = PsiTreeUtil.skipSiblingsForward(elementAtStart, PsiWhiteSpace.class, PsiComment.class); + final PsiElement element = PsiTreeUtil.skipSiblingsForward(elementAtStart, PsiWhiteSpace.class, PsiComment.class); + if (element != null) { + startOffset = element.getTextOffset(); + elementAtStart = file.findElementAt(startOffset); + } if (elementAtStart == null) { if (injectedLanguageManager.isInjectedFragment(file)) { return getSelectionFromInjectedHost(project, file, injectedLanguageManager, startOffset, endOffset); @@ -323,6 +327,11 @@ public abstract class IntroduceVariableBase extends IntroduceHandlerBase { PsiElement elementAt = PsiTreeUtil.findCommonParent(elementAtStart, elementAtEnd); final PsiExpression containingExpression = PsiTreeUtil.getParentOfType(elementAt, PsiExpression.class, false); + + if (containingExpression != null && containingExpression == elementAtEnd && startOffset == containingExpression.getTextOffset()) { + return containingExpression; + } + if (containingExpression == null || containingExpression instanceof PsiLambdaExpression) { if (injectedLanguageManager.isInjectedFragment(file)) { return getSelectionFromInjectedHost(project, file, injectedLanguageManager, startOffset, endOffset); diff --git a/java/java-tests/testData/refactoring/introduceVariable/SubexpressionWithSpacesInSelectionAndTailingComment.after.java b/java/java-tests/testData/refactoring/introduceVariable/SubexpressionWithSpacesInSelectionAndTailingComment.after.java new file mode 100644 index 000000000000..d69f3f6af288 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/SubexpressionWithSpacesInSelectionAndTailingComment.after.java @@ -0,0 +1,8 @@ +class Test { + { + final String ab = "".substring(1) + .substring(1); + ab // comment + .notify() + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceVariable/SubexpressionWithSpacesInSelectionAndTailingComment.java b/java/java-tests/testData/refactoring/introduceVariable/SubexpressionWithSpacesInSelectionAndTailingComment.java new file mode 100644 index 000000000000..1c58a8bec362 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/SubexpressionWithSpacesInSelectionAndTailingComment.java @@ -0,0 +1,7 @@ +class Test { + { + "".substring(1) + .substring(1) // comment + .notify() + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java index f84ec7a34264..a486f2b3a7fd 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java @@ -313,6 +313,10 @@ public class IntroduceVariableTest extends LightCodeInsightTestCase { doTest(new MockIntroduceVariableHandler("ab", true, true, false, "boolean")); } + public void testSubexpressionWithSpacesInSelectionAndTailingComment() { + doTest(new MockIntroduceVariableHandler("ab", true, true, false, CommonClassNames.JAVA_LANG_STRING)); + } + public void testDuplicatesAnonymousClassCreationWithSimilarParameters () { doTest(new MockIntroduceVariableHandler("foo1", true, true, false, "Foo")); } From 6fe7ef3c1247cdfe765c4b6714abeb463e8c045b Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 16 Dec 2015 16:19:52 +0100 Subject: [PATCH 025/105] extract: don't reject super types based on calling of final methods - they could be called on inheritors without problems (IDEA-149121) --- .../codeInsight/ExpectedTypesProvider.java | 4 +--- ...pesHierarchyBasedOnCalledMethod.after.java | 10 ++++++++++ .../TypesHierarchyBasedOnCalledMethod.java | 9 +++++++++ .../refactoring/IntroduceVariableTest.java | 19 +++++++++++++++++++ 4 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/refactoring/introduceVariable/TypesHierarchyBasedOnCalledMethod.after.java create mode 100644 java/java-tests/testData/refactoring/introduceVariable/TypesHierarchyBasedOnCalledMethod.java diff --git a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java index c2a1bfef670c..c6dcf130c3f8 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExpectedTypesProvider.java @@ -1230,9 +1230,7 @@ public class ExpectedTypesProvider { final PsiClassType type = substitutor == null ? facade.getElementFactory().createType(aClass) : facade.getElementFactory().createType(aClass, substitutor); - if (method.hasModifierProperty(PsiModifier.STATIC) || - method.hasModifierProperty(PsiModifier.FINAL) || - method.hasModifierProperty(PsiModifier.PRIVATE)) { + if (method.hasModifierProperty(PsiModifier.STATIC) || method.hasModifierProperty(PsiModifier.PRIVATE)) { types.add(createInfoImpl(type, ExpectedTypeInfo.TYPE_STRICTLY, type, TailType.DOT)); } else if (method.findSuperMethods().length == 0) { types.add(createInfoImpl(type, ExpectedTypeInfo.TYPE_OR_SUBTYPE, type, TailType.DOT)); diff --git a/java/java-tests/testData/refactoring/introduceVariable/TypesHierarchyBasedOnCalledMethod.after.java b/java/java-tests/testData/refactoring/introduceVariable/TypesHierarchyBasedOnCalledMethod.after.java new file mode 100644 index 000000000000..37fcc4adbbb1 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/TypesHierarchyBasedOnCalledMethod.after.java @@ -0,0 +1,10 @@ +class A { + public final void foo() {} +} +class B extends A {} +class C { + void f(B b) { + B v = b; + v.foo(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceVariable/TypesHierarchyBasedOnCalledMethod.java b/java/java-tests/testData/refactoring/introduceVariable/TypesHierarchyBasedOnCalledMethod.java new file mode 100644 index 000000000000..e1d75f927852 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/TypesHierarchyBasedOnCalledMethod.java @@ -0,0 +1,9 @@ +class A { + public final void foo() {} +} +class B extends A {} +class C { + void f(B b) { + b.foo(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java index a486f2b3a7fd..d74120994221 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java @@ -521,6 +521,25 @@ public class IntroduceVariableTest extends LightCodeInsightTestCase { }); } + public void testTypesHierarchyBasedOnCalledMethod() { + doTest(new MockIntroduceVariableHandler("v", true, false, false, "B") { + @Override + public IntroduceVariableSettings getSettings(Project project, Editor editor, + PsiExpression expr, PsiExpression[] occurrences, + TypeSelectorManagerImpl typeSelectorManager, + boolean declareFinalIfAll, + boolean anyAssignmentLHS, + InputValidator validator, + PsiElement anchor, final OccurrencesChooser.ReplaceChoice replaceChoice) { + final PsiType[] types = typeSelectorManager.getTypesForAll(); + assertTrue(types[0].getPresentableText(), types[0].getPresentableText().equals("B")); + assertTrue(types[1].getPresentableText(), types[1].getPresentableText().equals("A")); + return super.getSettings(project, editor, expr, occurrences, typeSelectorManager, declareFinalIfAll, anyAssignmentLHS, + validator, anchor, replaceChoice); + } + }); + } + private void doTest(IntroduceVariableBase testMe) { String baseName = "/refactoring/introduceVariable/" + getTestName(false); configureByFile(baseName + ".java"); From a19f41e6c6523b592630c1965d304878c1a5a8ca Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 16 Dec 2015 17:57:41 +0100 Subject: [PATCH 026/105] extract: collect classes to search for available methods from intersections/captures, etc (IDEA-57404) --- .../ui/TypeSelectorManagerImpl.java | 16 +++++++++++++++- .../refactoring/util/RefactoringUtil.java | 13 +++++++------ ...onConjunctBasedOnFollowingCalls.after.java | 19 +++++++++++++++++++ ...rsectionConjunctBasedOnFollowingCalls.java | 18 ++++++++++++++++++ .../refactoring/IntroduceVariableTest.java | 6 +++++- 5 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 java/java-tests/testData/refactoring/introduceVariable/ChooseIntersectionConjunctBasedOnFollowingCalls.after.java create mode 100644 java/java-tests/testData/refactoring/introduceVariable/ChooseIntersectionConjunctBasedOnFollowingCalls.java diff --git a/java/java-impl/src/com/intellij/refactoring/ui/TypeSelectorManagerImpl.java b/java/java-impl/src/com/intellij/refactoring/ui/TypeSelectorManagerImpl.java index b97e98789ede..b308a4cdf929 100644 --- a/java/java-impl/src/com/intellij/refactoring/ui/TypeSelectorManagerImpl.java +++ b/java/java-impl/src/com/intellij/refactoring/ui/TypeSelectorManagerImpl.java @@ -154,12 +154,26 @@ public class TypeSelectorManagerImpl implements TypeSelectorManager { final Set occurrenceClasses = new HashSet(); for (final PsiExpression occurrence : myOccurrences) { final PsiType occurrenceType = occurrence.getType(); + collectOccurrenceClasses(occurrenceClasses, occurrenceType); + } + return new ExpectedTypeUtil.ExpectedClassesFromSetProvider(occurrenceClasses); + } + + private static void collectOccurrenceClasses(Set occurrenceClasses, PsiType occurrenceType) { + if (occurrenceType instanceof PsiIntersectionType) { + for (PsiType type : ((PsiIntersectionType)occurrenceType).getConjuncts()) { + collectOccurrenceClasses(occurrenceClasses, type); + } + } + else if (occurrenceType instanceof PsiCapturedWildcardType) { + collectOccurrenceClasses(occurrenceClasses, ((PsiCapturedWildcardType)occurrenceType).getUpperBound()); + } + else { final PsiClass aClass = PsiUtil.resolveClassInType(occurrenceType); if (aClass != null) { occurrenceClasses.add(aClass); } } - return new ExpectedTypeUtil.ExpectedClassesFromSetProvider(occurrenceClasses); } private PsiType[] getTypesForMain() { diff --git a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java index 4912bdd76769..26aae675623d 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java @@ -46,10 +46,7 @@ import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.tree.IElementType; -import com.intellij.psi.util.InheritanceUtil; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.PsiUtil; -import com.intellij.psi.util.TypeConversionUtil; +import com.intellij.psi.util.*; import com.intellij.refactoring.PackageWrapper; import com.intellij.refactoring.introduceField.ElementToWorkOn; import com.intellij.refactoring.introduceVariable.IntroduceVariableBase; @@ -389,14 +386,18 @@ public class RefactoringUtil { PsiElementFactory factory = JavaPsiFacade.getInstance(expr.getProject()).getElementFactory(); PsiType type = getTypeByExpression(expr, factory); final boolean isFunctionalType = type instanceof PsiLambdaExpressionType || type instanceof PsiMethodReferenceType || type instanceof PsiLambdaParameterType; - if (type != null && !isFunctionalType) { + final boolean isDenotable = PsiTypesUtil.isDenotableType(expr.getType()); + if (type != null && !isFunctionalType && isDenotable) { return type; } ExpectedTypeInfo[] expectedTypes = ExpectedTypesProvider.getInstance(expr.getProject()).getExpectedTypes(expr, false); - if (expectedTypes.length == 1 || isFunctionalType && expectedTypes.length > 0) { + if (expectedTypes.length == 1 || (isFunctionalType || !isDenotable)&& expectedTypes.length > 0 ) { type = expectedTypes[0].getType(); if (!type.equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) return type; } + if (!isDenotable) { + return type; + } return null; } diff --git a/java/java-tests/testData/refactoring/introduceVariable/ChooseIntersectionConjunctBasedOnFollowingCalls.after.java b/java/java-tests/testData/refactoring/introduceVariable/ChooseIntersectionConjunctBasedOnFollowingCalls.after.java new file mode 100644 index 000000000000..1163b038b1ca --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/ChooseIntersectionConjunctBasedOnFollowingCalls.after.java @@ -0,0 +1,19 @@ + +interface IA { + void a(); +} + +interface IB { + void b(); +} + +interface IC{ + T c(); +} + +class K { + void foo(IC x){ + IA m = x.c(); + m.a(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceVariable/ChooseIntersectionConjunctBasedOnFollowingCalls.java b/java/java-tests/testData/refactoring/introduceVariable/ChooseIntersectionConjunctBasedOnFollowingCalls.java new file mode 100644 index 000000000000..e89dba1958a4 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/ChooseIntersectionConjunctBasedOnFollowingCalls.java @@ -0,0 +1,18 @@ + +interface IA { + void a(); +} + +interface IB { + void b(); +} + +interface IC{ + T c(); +} + +class K { + void foo(IC x){ + x.c().a(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java index d74120994221..ae1fb74ff029 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java @@ -539,7 +539,11 @@ public class IntroduceVariableTest extends LightCodeInsightTestCase { } }); } - + + public void testChooseIntersectionConjunctBasedOnFollowingCalls() throws Exception { + doTest(new MockIntroduceVariableHandler("m", false, false, false, "IA")); + } + private void doTest(IntroduceVariableBase testMe) { String baseName = "/refactoring/introduceVariable/" + getTestName(false); configureByFile(baseName + ".java"); From 70a05d28f16dcf94d45c7d0b020738accf48baa5 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 16 Dec 2015 18:56:15 +0100 Subject: [PATCH 027/105] generate equals/hashCode: provide default templates with defining fqn so if it is not found in the scope - corresponding template could be marked as not applicable (IDEA-149147) --- .../EqualsHashCodeTemplatesManager.java | 38 +++++++------ .../generation/ui/GenerateEqualsWizard.java | 56 +++++++++++++++---- .../generate/template/TemplateResource.java | 13 +++++ 3 files changed, 77 insertions(+), 30 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManager.java b/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManager.java index 0f25e54cfa1c..71f1046c5f08 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManager.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManager.java @@ -21,7 +21,6 @@ import com.intellij.openapi.components.Storage; import com.intellij.openapi.components.StoragePathMacros; import com.intellij.openapi.util.Couple; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.util.ArrayUtil; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -30,7 +29,9 @@ import org.jetbrains.java.generate.template.TemplateResource; import org.jetbrains.java.generate.template.TemplatesManager; import java.io.IOException; -import java.util.*; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.Set; @State( name = "EqualsHashCodeTemplates", @@ -42,14 +43,23 @@ import java.util.*; public class EqualsHashCodeTemplatesManager extends TemplatesManager { private static final String DEFAULT_EQUALS = "/com/intellij/codeInsight/generation/defaultEquals.vm"; private static final String DEFAULT_HASH_CODE = "/com/intellij/codeInsight/generation/defaultHashCode.vm"; + private static final String APACHE3_EQUALS = "/com/intellij/codeInsight/generation/apacheEqualsBuilder3.vm"; private static final String APACHE3_HASH_CODE = "/com/intellij/codeInsight/generation/apacheHashCodeBuilder3.vm"; + private static final String APACHE3_BUILDER = "org.apache.commons.lang3.builder.EqualsBuilder"; + private static final String APACHE_EQUALS = "/com/intellij/codeInsight/generation/apacheEqualsBuilder.vm"; private static final String APACHE_HASH_CODE = "/com/intellij/codeInsight/generation/apacheHashCodeBuilder.vm"; + private static final String APACHE_BUILDER = "org.apache.commons.lang.builder.EqualsBuilder"; + + private static final String GUAVA_EQUALS = "/com/intellij/codeInsight/generation/guavaEquals.vm"; private static final String GUAVA_HASH_CODE = "/com/intellij/codeInsight/generation/guavaHashCode.vm"; + private static final String GUAVA_BUILDER = "com.google.common.base.Objects"; + private static final String OBJECTS_EQUALS = "/com/intellij/codeInsight/generation/objectsEquals.vm"; private static final String OBJECTS_HASH_CODE = "/com/intellij/codeInsight/generation/objectsHashCode.vm"; + private static final String OBJECTS_BUILDER = "java.util.Objects"; private static final String EQUALS_SUFFIX = "equals"; private static final String HASH_CODE_SUFFIX = "hashCode"; @@ -72,17 +82,17 @@ public class EqualsHashCodeTemplatesManager extends TemplatesManager { new TemplateResource(toEqualsName(INTELLI_J_DEFAULT), readFile(DEFAULT_EQUALS), true), new TemplateResource(toHashCodeName(INTELLI_J_DEFAULT), readFile(DEFAULT_HASH_CODE), true), - new TemplateResource(toEqualsName(EQUALS_HASH_CODE_BUILDER_APACHE_COMMONS_LANG), readFile(APACHE_EQUALS), true), - new TemplateResource(toHashCodeName(EQUALS_HASH_CODE_BUILDER_APACHE_COMMONS_LANG), readFile(APACHE_HASH_CODE), true), + new TemplateResource(toEqualsName(EQUALS_HASH_CODE_BUILDER_APACHE_COMMONS_LANG), readFile(APACHE_EQUALS), true, APACHE_BUILDER), + new TemplateResource(toHashCodeName(EQUALS_HASH_CODE_BUILDER_APACHE_COMMONS_LANG), readFile(APACHE_HASH_CODE), true, APACHE_BUILDER), - new TemplateResource(toEqualsName(EQUALS_HASH_CODE_BUILDER_APACHE_COMMONS_LANG_3), readFile(APACHE3_EQUALS), true), - new TemplateResource(toHashCodeName(EQUALS_HASH_CODE_BUILDER_APACHE_COMMONS_LANG_3), readFile(APACHE3_HASH_CODE), true), + new TemplateResource(toEqualsName(EQUALS_HASH_CODE_BUILDER_APACHE_COMMONS_LANG_3), readFile(APACHE3_EQUALS), true, APACHE3_BUILDER), + new TemplateResource(toHashCodeName(EQUALS_HASH_CODE_BUILDER_APACHE_COMMONS_LANG_3), readFile(APACHE3_HASH_CODE), true, APACHE3_BUILDER), - new TemplateResource(toEqualsName(OBJECTS_EQUAL_AND_HASH_CODE_GUAVA), readFile(GUAVA_EQUALS), true), - new TemplateResource(toHashCodeName(OBJECTS_EQUAL_AND_HASH_CODE_GUAVA), readFile(GUAVA_HASH_CODE), true), + new TemplateResource(toEqualsName(OBJECTS_EQUAL_AND_HASH_CODE_GUAVA), readFile(GUAVA_EQUALS), true, GUAVA_BUILDER), + new TemplateResource(toHashCodeName(OBJECTS_EQUAL_AND_HASH_CODE_GUAVA), readFile(GUAVA_HASH_CODE), true, GUAVA_BUILDER), - new TemplateResource(toEqualsName(JAVA_UTIL_OBJECTS_EQUALS_AND_HASH_CODE), readFile(OBJECTS_EQUALS), true), - new TemplateResource(toHashCodeName(JAVA_UTIL_OBJECTS_EQUALS_AND_HASH_CODE), readFile(OBJECTS_HASH_CODE), true) + new TemplateResource(toEqualsName(JAVA_UTIL_OBJECTS_EQUALS_AND_HASH_CODE), readFile(OBJECTS_EQUALS), true, OBJECTS_BUILDER), + new TemplateResource(toHashCodeName(JAVA_UTIL_OBJECTS_EQUALS_AND_HASH_CODE), readFile(OBJECTS_HASH_CODE), true, OBJECTS_BUILDER) }; } catch (IOException e) { @@ -110,14 +120,6 @@ public class EqualsHashCodeTemplatesManager extends TemplatesManager { return getDefaultTemplate(HASH_CODE_SUFFIX, EQUALS_SUFFIX, template); } - public String[] getTemplateNames() { - final Set names = new LinkedHashSet(); - for (TemplateResource resource : getAllTemplates()) { - names.add(getTemplateBaseName(resource)); - } - return ArrayUtil.toStringArray(names); - } - @NotNull public static String getTemplateBaseName(TemplateResource resource) { return StringUtil.trimEnd(StringUtil.trimEnd(resource.getFileName(), EQUALS_SUFFIX), HASH_CODE_SUFFIX).trim(); diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/ui/GenerateEqualsWizard.java b/java/java-impl/src/com/intellij/codeInsight/generation/ui/GenerateEqualsWizard.java index 8c6f8692a279..7ee8fc9b3b74 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/ui/GenerateEqualsWizard.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/ui/GenerateEqualsWizard.java @@ -29,18 +29,21 @@ import com.intellij.openapi.projectRoots.JavaVersionService; import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.ui.ComponentWithBrowseButton; import com.intellij.openapi.ui.VerticalFlowLayout; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.refactoring.classMembers.AbstractMemberInfoModel; import com.intellij.refactoring.classMembers.MemberInfoBase; import com.intellij.refactoring.classMembers.MemberInfoTooltipManager; import com.intellij.refactoring.ui.AbstractMemberSelectionPanel; import com.intellij.refactoring.ui.MemberSelectionPanel; import com.intellij.refactoring.util.classMembers.MemberInfo; +import com.intellij.ui.JBColor; +import com.intellij.ui.ListCellRendererWrapper; import com.intellij.ui.NonFocusableCheckBox; import com.intellij.util.containers.HashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.java.generate.psi.PsiAdapter; +import org.jetbrains.java.generate.template.TemplateResource; import javax.swing.*; import java.awt.*; @@ -265,7 +268,7 @@ public class GenerateEqualsWizard extends AbstractGenerateEqualsWizard comboBoxWithBrowseButton = - new ComponentWithBrowseButton(comboBox, new MyEditTemplatesListener(project, myPanel, comboBox)); + new ComponentWithBrowseButton(comboBox, new MyEditTemplatesListener(psiClass, myPanel, comboBox)); templateChooserLabel.setLabelFor(comboBox); final EqualsHashCodeTemplatesManager manager = EqualsHashCodeTemplatesManager.getInstance(); - comboBox.setModel(new DefaultComboBoxModel(manager.getTemplateNames())); - comboBox.setSelectedItem(manager.getDefaultTemplateBaseName()); + setupCombobox(manager, comboBox, psiClass); comboBox.addActionListener(new ActionListener() { public void actionPerformed(@NotNull final ActionEvent M) { manager.setDefaultTemplate((String)comboBox.getSelectedItem()); @@ -400,13 +403,43 @@ public class GenerateEqualsWizard extends AbstractGenerateEqualsWizard names = new LinkedHashSet(); + + final Set invalid = new HashSet(); + for (TemplateResource resource : templatesManager.getAllTemplates()) { + final String templateBaseName = EqualsHashCodeTemplatesManager.getTemplateBaseName(resource); + if (names.add(templateBaseName)) { + final String className = resource.getClassName(); + if (className != null && psiFacade.findClass(className, resolveScope) == null) { + invalid.add(templateBaseName); + } + } + } + comboBox.setRenderer(new ListCellRendererWrapper() { + @Override + public void customize(JList list, String value, int index, boolean selected, boolean hasFocus) { + setText(value); + if (invalid.contains(value)) { + setForeground(JBColor.RED); + } + } + }); + comboBox.setModel(new DefaultComboBoxModel(names.toArray(new String[names.size()]))); + comboBox.setSelectedItem(templatesManager.getDefaultTemplateBaseName()); + } + private static class MyEditTemplatesListener implements ActionListener { - private final Project myProject; + private final PsiClass myPsiClass; private final JComponent myParent; private final ComboBox myComboBox; - public MyEditTemplatesListener(Project project, JComponent panel, ComboBox comboBox) { - myProject = project; + public MyEditTemplatesListener(PsiClass psiClass, JComponent panel, ComboBox comboBox) { + myPsiClass = psiClass; myParent = panel; myComboBox = comboBox; } @@ -414,11 +447,10 @@ public class GenerateEqualsWizard extends AbstractGenerateEqualsWizard Date: Mon, 28 Dec 2015 13:48:02 +0300 Subject: [PATCH 028/105] avoid 1s delay in completion in debugger fields if session is not stopped on a breakpoint --- .../debugger/engine/evaluation/DefaultCodeFragmentFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/DefaultCodeFragmentFactory.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/DefaultCodeFragmentFactory.java index 27c5b16515e3..1166f6f56c03 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/DefaultCodeFragmentFactory.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/DefaultCodeFragmentFactory.java @@ -89,7 +89,7 @@ public class DefaultCodeFragmentFactory extends CodeFragmentFactory { final DebuggerContextImpl debuggerContext = DebuggerManagerEx.getInstanceEx(project).getContext(); DebuggerSession debuggerSession = debuggerContext.getDebuggerSession(); - if (debuggerSession != null) { + if (debuggerSession != null && debuggerContext.getSuspendContext() != null) { final Semaphore semaphore = new Semaphore(); semaphore.down(); final AtomicReference nameRef = new AtomicReference(); From 9162378ef38db10253adff821db3e5ad02dfbdae Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 28 Dec 2015 12:14:38 +0100 Subject: [PATCH 029/105] Cleanup (typo) --- .../openapi/vfs/impl/local/NativeFileWatcherImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/NativeFileWatcherImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/NativeFileWatcherImpl.java index 0263d6bc11ed..86259b45de35 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/NativeFileWatcherImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/NativeFileWatcherImpl.java @@ -221,16 +221,16 @@ public class NativeFileWatcherImpl extends PluggableFileWatcher { final OSProcessHandler processHandler = myProcessHandler; if (processHandler != null) { if (!processHandler.isProcessTerminated()) { - boolean forceQuite = true; + boolean killProcess = true; try { writeLine(EXIT_COMMAND); - forceQuite = !processHandler.waitFor(500); - if (forceQuite) { + killProcess = !processHandler.waitFor(500); + if (killProcess) { LOG.warn("File watcher is still alive. Doing a force quit."); } } catch (IOException ignore) { } - if (forceQuite) { + if (killProcess) { processHandler.destroyProcess(); } } From 74a6cb2448ac786cd28dad53c74d55edd8d96738 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Mon, 28 Dec 2015 12:49:45 +0100 Subject: [PATCH 030/105] rollback fix for IDEA-140824 --- .../src/com/intellij/ide/actions/SearchEverywhereAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java b/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java index 6df525b7a7aa..9f7e41f69394 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java @@ -1179,7 +1179,7 @@ public class SearchEverywhereAction extends AnAction implements CustomComponentA myTitle.setText(title); myMainPanel.add(createTitle(" " + title), BorderLayout.NORTH); } - myMainPanel.add(cmp, BorderLayout.WEST); + myMainPanel.add(cmp, BorderLayout.CENTER); if (cmp instanceof Accessible) { myMainPanel.setAccessible((Accessible)cmp); } From d7e8813e68f90f4d3f27b0c374a2fc2cf42d8495 Mon Sep 17 00:00:00 2001 From: Elizaveta Shashkova Date: Sat, 26 Dec 2015 16:35:52 +0300 Subject: [PATCH 031/105] Suppress exception while updating wrapper object in Python2 (PY-18078) --- .../pydevd_concurrency_analyser/pydevd_thread_wrappers.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python/helpers/pydev/pydevd_concurrency_analyser/pydevd_thread_wrappers.py b/python/helpers/pydev/pydevd_concurrency_analyser/pydevd_thread_wrappers.py index af2675137967..7d9e908a7f82 100644 --- a/python/helpers/pydev/pydevd_concurrency_analyser/pydevd_thread_wrappers.py +++ b/python/helpers/pydev/pydevd_concurrency_analyser/pydevd_thread_wrappers.py @@ -22,7 +22,10 @@ def wrap_attr(obj, attr): class ObjectWrapper(object): def __init__(self, obj): self.wrapped_object = obj - functools.update_wrapper(self, obj) + try: + functools.update_wrapper(self, obj) + except: + pass def __getattr__(self, attr): orig_attr = getattr(self.wrapped_object, attr) #.__getattribute__(attr) From 295a6b3b8333eb2e84c9dc2379509648ad3fb263 Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Mon, 28 Dec 2015 14:56:59 +0300 Subject: [PATCH 032/105] IDEA-116406 Maven dependencies with scope import aren't resolved locally --- .../maven/server/MavenServerEmbedder.java | 6 +- .../embedder/Maven2ServerEmbedderImpl.java | 35 +++- .../server/Maven30ServerEmbedderImpl.java | 155 ++++++++++-------- .../server/Maven32ServerEmbedderImpl.java | 154 +++++++++-------- .../idea/maven/project/MavenProject.java | 15 +- .../maven/project/MavenProjectReader.java | 76 +++++---- .../MavenProjectsBatchProcessorBasicTask.java | 40 +++++ .../maven/project/MavenProjectsManager.java | 38 +++-- .../MavenProjectsProcessorResolvingTask.java | 10 +- .../idea/maven/project/MavenProjectsTree.java | 48 +++++- .../maven/server/MavenEmbedderWrapper.java | 23 ++- 11 files changed, 387 insertions(+), 213 deletions(-) create mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsBatchProcessorBasicTask.java diff --git a/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerEmbedder.java b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerEmbedder.java index 46cffc841e2e..45cfb149a90a 100644 --- a/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerEmbedder.java +++ b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/server/MavenServerEmbedder.java @@ -45,9 +45,9 @@ public interface MavenServerEmbedder extends Remote { @NotNull - MavenServerExecutionResult resolveProject(@NotNull File file, - @NotNull Collection activeProfiles, - @NotNull Collection inactiveProfiles) throws RemoteException, + Collection resolveProject(@NotNull Collection files, + @NotNull Collection activeProfiles, + @NotNull Collection inactiveProfiles) throws RemoteException, MavenServerProcessCanceledException; @Nullable diff --git a/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerEmbedderImpl.java b/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerEmbedderImpl.java index 620c3a8181cb..b1333d58926b 100644 --- a/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerEmbedderImpl.java +++ b/plugins/maven/maven2-server-impl/src/org/jetbrains/idea/maven/server/embedder/Maven2ServerEmbedderImpl.java @@ -18,7 +18,9 @@ package org.jetbrains.idea.maven.server.embedder; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.ExceptionUtil; import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashMap; import gnu.trove.THashSet; import org.apache.maven.artifact.Artifact; @@ -287,18 +289,33 @@ public class Maven2ServerEmbedderImpl extends MavenRemoteObject implements Maven } @NotNull - public MavenServerExecutionResult resolveProject(@NotNull final File file, + public Collection resolveProject(@NotNull final Collection files, @NotNull final Collection activeProfiles, @NotNull final Collection inactiveProfiles) throws MavenServerProcessCanceledException, RemoteException { - return doExecute(new Executor() { - public MavenServerExecutionResult execute() throws Exception { - DependencyTreeResolutionListener listener = new DependencyTreeResolutionListener(myConsoleWrapper); - MavenExecutionResult result = myImpl.resolveProject(file, - new ArrayList(activeProfiles), - new ArrayList(inactiveProfiles), - Arrays.asList(listener)); - return createExecutionResult(file, result, listener.getRootNode()); + + return ContainerUtil.mapNotNull(files, new Function() { + @Override + public MavenServerExecutionResult fun(final File file) { + try { + return doExecute(new Executor() { + public MavenServerExecutionResult execute() throws Exception { + DependencyTreeResolutionListener listener = new DependencyTreeResolutionListener(myConsoleWrapper); + MavenExecutionResult result = myImpl.resolveProject(file, + new ArrayList(activeProfiles), + new ArrayList(inactiveProfiles), + Collections.singletonList(listener)); + return createExecutionResult(file, result, listener.getRootNode()); + } + }); + } + catch (MavenServerProcessCanceledException e) { + ExceptionUtil.rethrowAllAsUnchecked(e); + } + catch (RemoteException e) { + ExceptionUtil.rethrowAllAsUnchecked(e); + } + return null; } }); } diff --git a/plugins/maven/maven30-server-impl/src/org/jetbrains/idea/maven/server/Maven30ServerEmbedderImpl.java b/plugins/maven/maven30-server-impl/src/org/jetbrains/idea/maven/server/Maven30ServerEmbedderImpl.java index 09c8d520b4f3..3851354863eb 100644 --- a/plugins/maven/maven30-server-impl/src/org/jetbrains/idea/maven/server/Maven30ServerEmbedderImpl.java +++ b/plugins/maven/maven30-server-impl/src/org/jetbrains/idea/maven/server/Maven30ServerEmbedderImpl.java @@ -17,7 +17,10 @@ package org.jetbrains.idea.maven.server; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.ExceptionUtil; +import com.intellij.util.Function; import com.intellij.util.SystemProperties; +import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashMap; import gnu.trove.THashSet; import org.apache.maven.*; @@ -84,7 +87,6 @@ import java.lang.reflect.Method; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import java.util.*; -import java.util.concurrent.atomic.AtomicReference; /** * Overridden maven components: @@ -523,15 +525,29 @@ public class Maven30ServerEmbedderImpl extends Maven3ServerEmbedder { @NotNull @Override - public MavenServerExecutionResult resolveProject(@NotNull File file, - @NotNull Collection activeProfiles, - @NotNull Collection inactiveProfiles) + public Collection resolveProject(@NotNull final Collection files, + @NotNull Collection activeProfiles, + @NotNull Collection inactiveProfiles) throws RemoteException, MavenServerProcessCanceledException { - DependencyTreeResolutionListener listener = new DependencyTreeResolutionListener(myConsoleWrapper); + final DependencyTreeResolutionListener listener = new DependencyTreeResolutionListener(myConsoleWrapper); - MavenExecutionResult result = doResolveProject(file, new ArrayList(activeProfiles), new ArrayList(inactiveProfiles), - Arrays.asList(listener)); - return createExecutionResult(file, result, listener.getRootNode()); + Collection results = + doResolveProject(files, new ArrayList(activeProfiles), new ArrayList(inactiveProfiles), + Collections.singletonList(listener)); + return ContainerUtil.mapNotNull(results, new Function() { + @Override + public MavenServerExecutionResult fun(MavenExecutionResult result) { + try { + if (result != null && result.getMavenProject() != null && result.getMavenProject().getFile() != null) { + return createExecutionResult(result.getMavenProject().getFile(), result, listener.getRootNode()); + } + } + catch (RemoteException e) { + ExceptionUtil.rethrowAllAsUnchecked(e); + } + return null; + } + }); } @Nullable @@ -573,15 +589,16 @@ public class Maven30ServerEmbedderImpl extends Maven3ServerEmbedder { } @NotNull - public MavenExecutionResult doResolveProject(@NotNull final File file, - @NotNull final List activeProfiles, - @NotNull final List inactiveProfiles, - final List listeners) throws RemoteException { + public Collection doResolveProject(@NotNull final Collection files, + @NotNull final List activeProfiles, + @NotNull final List inactiveProfiles, + final List listeners) throws RemoteException { + final File file = files.size() == 1 ? files.iterator().next() : null; final MavenExecutionRequest request = createRequest(file, activeProfiles, inactiveProfiles, Collections.emptyList()); request.setUpdateSnapshots(myAlwaysUpdateSnapshots); - final AtomicReference ref = new AtomicReference(); + final Collection executionResults = ContainerUtil.newArrayList(); executeWithMavenSession(request, new Runnable() { @Override @@ -594,81 +611,83 @@ public class Maven30ServerEmbedderImpl extends Maven3ServerEmbedder { String savedLocalRepository = modelInterpolator.getLocalRepository(); modelInterpolator.setLocalRepository(request.getLocalRepositoryPath().getAbsolutePath()); - List results; + List buildingResults; try { // Don't use build(File projectFile, ProjectBuildingRequest request) , because it don't use cache !!!!!!!! (see http://devnet.jetbrains.com/message/5500218) - results = builder.build(Collections.singletonList(new File(file.getPath())), false, request.getProjectBuildingRequest()); + buildingResults = builder.build(new ArrayList(files), false, request.getProjectBuildingRequest()); } finally { modelInterpolator.setLocalRepository(savedLocalRepository); } - ProjectBuildingResult buildingResult = results.get(0); + for (ProjectBuildingResult buildingResult : buildingResults) { - MavenProject project = buildingResult.getProject(); + MavenProject project = buildingResult.getProject(); - RepositorySystemSession repositorySession = getComponent(LegacySupport.class).getRepositorySession(); - if (repositorySession instanceof DefaultRepositorySystemSession) { - ((DefaultRepositorySystemSession)repositorySession).setTransferListener(new Maven30TransferListenerAdapter(myCurrentIndicator)); + RepositorySystemSession repositorySession = getComponent(LegacySupport.class).getRepositorySession(); + if (repositorySession instanceof DefaultRepositorySystemSession) { + ((DefaultRepositorySystemSession)repositorySession) + .setTransferListener(new Maven30TransferListenerAdapter(myCurrentIndicator)); - if (myWorkspaceMap != null) { - ((DefaultRepositorySystemSession)repositorySession).setWorkspaceReader(new Maven30WorkspaceReader(myWorkspaceMap)); - } - } - - List exceptions = new ArrayList(); - loadExtensions(project, exceptions); - - //Artifact projectArtifact = project.getArtifact(); - //Map managedVersions = project.getManagedVersionMap(); - //ArtifactMetadataSource metadataSource = getComponent(ArtifactMetadataSource.class); - project.setDependencyArtifacts(project.createArtifacts(getComponent(ArtifactFactory.class), null, null)); - // - - if (USE_MVN2_COMPATIBLE_DEPENDENCY_RESOLVING) { - ArtifactResolutionRequest resolutionRequest = new ArtifactResolutionRequest(); - resolutionRequest.setArtifactDependencies(project.getDependencyArtifacts()); - resolutionRequest.setArtifact(project.getArtifact()); - resolutionRequest.setManagedVersionMap(project.getManagedVersionMap()); - resolutionRequest.setLocalRepository(myLocalRepository); - resolutionRequest.setRemoteRepositories(project.getRemoteArtifactRepositories()); - resolutionRequest.setListeners(listeners); - - resolutionRequest.setResolveRoot(false); - resolutionRequest.setResolveTransitively(true); - - ArtifactResolver resolver = getComponent(ArtifactResolver.class); - ArtifactResolutionResult result = resolver.resolve(resolutionRequest); - - project.setArtifacts(result.getArtifacts()); - // end copied from DefaultMavenProjectBuilder.buildWithDependencies - ref.set(new MavenExecutionResult(project, exceptions)); - } - else { - final DependencyResolutionResult dependencyResolutionResult = resolveDependencies(project, repositorySession); - final List dependencies = dependencyResolutionResult.getDependencies(); - - Set artifacts = new LinkedHashSet(dependencies.size()); - for (Dependency dependency : dependencies) { - final Artifact artifact = RepositoryUtils.toArtifact(dependency.getArtifact()); - artifact.setScope(dependency.getScope()); - artifact.setOptional(dependency.isOptional()); - artifacts.add(artifact); - resolveAsModule(artifact); + if (myWorkspaceMap != null) { + ((DefaultRepositorySystemSession)repositorySession).setWorkspaceReader(new Maven30WorkspaceReader(myWorkspaceMap)); + } } - project.setArtifacts(artifacts); - ref.set(new MavenExecutionResult(project, dependencyResolutionResult, exceptions)); + List exceptions = new ArrayList(); + loadExtensions(project, exceptions); + + //Artifact projectArtifact = project.getArtifact(); + //Map managedVersions = project.getManagedVersionMap(); + //ArtifactMetadataSource metadataSource = getComponent(ArtifactMetadataSource.class); + project.setDependencyArtifacts(project.createArtifacts(getComponent(ArtifactFactory.class), null, null)); + // + + if (USE_MVN2_COMPATIBLE_DEPENDENCY_RESOLVING) { + ArtifactResolutionRequest resolutionRequest = new ArtifactResolutionRequest(); + resolutionRequest.setArtifactDependencies(project.getDependencyArtifacts()); + resolutionRequest.setArtifact(project.getArtifact()); + resolutionRequest.setManagedVersionMap(project.getManagedVersionMap()); + resolutionRequest.setLocalRepository(myLocalRepository); + resolutionRequest.setRemoteRepositories(project.getRemoteArtifactRepositories()); + resolutionRequest.setListeners(listeners); + + resolutionRequest.setResolveRoot(false); + resolutionRequest.setResolveTransitively(true); + + ArtifactResolver resolver = getComponent(ArtifactResolver.class); + ArtifactResolutionResult result = resolver.resolve(resolutionRequest); + + project.setArtifacts(result.getArtifacts()); + // end copied from DefaultMavenProjectBuilder.buildWithDependencies + executionResults.add(new MavenExecutionResult(project, exceptions)); + } + else { + final DependencyResolutionResult dependencyResolutionResult = resolveDependencies(project, repositorySession); + final List dependencies = dependencyResolutionResult.getDependencies(); + + Set artifacts = new LinkedHashSet(dependencies.size()); + for (Dependency dependency : dependencies) { + final Artifact artifact = RepositoryUtils.toArtifact(dependency.getArtifact()); + artifact.setScope(dependency.getScope()); + artifact.setOptional(dependency.isOptional()); + artifacts.add(artifact); + resolveAsModule(artifact); + } + + project.setArtifacts(artifacts); + executionResults.add(new MavenExecutionResult(project, dependencyResolutionResult, exceptions)); + } } } catch (Exception e) { - ref.set(handleException(e)); + executionResults.add(handleException(e)); } } }); - return ref.get(); + return executionResults; } private boolean resolveAsModule(Artifact a) { diff --git a/plugins/maven/maven32-server-impl/src/org/jetbrains/idea/maven/server/Maven32ServerEmbedderImpl.java b/plugins/maven/maven32-server-impl/src/org/jetbrains/idea/maven/server/Maven32ServerEmbedderImpl.java index 2f7cc8c5cf1b..a808a521578c 100644 --- a/plugins/maven/maven32-server-impl/src/org/jetbrains/idea/maven/server/Maven32ServerEmbedderImpl.java +++ b/plugins/maven/maven32-server-impl/src/org/jetbrains/idea/maven/server/Maven32ServerEmbedderImpl.java @@ -18,8 +18,11 @@ package org.jetbrains.idea.maven.server; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.ExceptionUtil; +import com.intellij.util.Function; import com.intellij.util.ReflectionUtil; import com.intellij.util.SystemProperties; +import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashMap; import gnu.trove.THashSet; import org.apache.maven.*; @@ -88,7 +91,6 @@ import java.lang.reflect.Method; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import java.util.*; -import java.util.concurrent.atomic.AtomicReference; /** * Overridden maven components: @@ -538,15 +540,29 @@ public class Maven32ServerEmbedderImpl extends Maven3ServerEmbedder { @NotNull @Override - public MavenServerExecutionResult resolveProject(@NotNull File file, - @NotNull Collection activeProfiles, - @NotNull Collection inactiveProfiles) + public Collection resolveProject(@NotNull Collection files, + @NotNull Collection activeProfiles, + @NotNull Collection inactiveProfiles) throws RemoteException, MavenServerProcessCanceledException { - DependencyTreeResolutionListener listener = new DependencyTreeResolutionListener(myConsoleWrapper); + final DependencyTreeResolutionListener listener = new DependencyTreeResolutionListener(myConsoleWrapper); - MavenExecutionResult result = doResolveProject(file, new ArrayList(activeProfiles), new ArrayList(inactiveProfiles), - Arrays.asList(listener)); - return createExecutionResult(file, result, listener.getRootNode()); + Collection results = + doResolveProject(files, new ArrayList(activeProfiles), new ArrayList(inactiveProfiles), + Collections.singletonList(listener)); + return ContainerUtil.mapNotNull(results, new Function() { + @Override + public MavenServerExecutionResult fun(MavenExecutionResult result) { + try { + if (result != null && result.getMavenProject() != null && result.getMavenProject().getFile() != null) { + return createExecutionResult(result.getMavenProject().getFile(), result, listener.getRootNode()); + } + } + catch (RemoteException e) { + ExceptionUtil.rethrowAllAsUnchecked(e); + } + return null; + } + }); } @Nullable @@ -588,15 +604,16 @@ public class Maven32ServerEmbedderImpl extends Maven3ServerEmbedder { } @NotNull - public MavenExecutionResult doResolveProject(@NotNull final File file, - @NotNull final List activeProfiles, - @NotNull final List inactiveProfiles, - final List listeners) throws RemoteException { + public Collection doResolveProject(@NotNull final Collection files, + @NotNull final List activeProfiles, + @NotNull final List inactiveProfiles, + final List listeners) throws RemoteException { + final File file = files.size() == 1 ? files.iterator().next() : null; final MavenExecutionRequest request = createRequest(file, activeProfiles, inactiveProfiles, Collections.emptyList()); request.setUpdateSnapshots(myAlwaysUpdateSnapshots); - final AtomicReference ref = new AtomicReference(); + final Collection executionResults = ContainerUtil.newArrayList(); executeWithMavenSession(request, new Runnable() { @Override @@ -609,81 +626,82 @@ public class Maven32ServerEmbedderImpl extends Maven3ServerEmbedder { String savedLocalRepository = modelInterpolator.getLocalRepository(); modelInterpolator.setLocalRepository(request.getLocalRepositoryPath().getAbsolutePath()); - List results; + List buildingResults; try { // Don't use build(File projectFile, ProjectBuildingRequest request) , because it don't use cache !!!!!!!! (see http://devnet.jetbrains.com/message/5500218) - results = builder.build(Collections.singletonList(new File(file.getPath())), false, request.getProjectBuildingRequest()); + buildingResults = builder.build(new ArrayList(files), false, request.getProjectBuildingRequest()); } finally { modelInterpolator.setLocalRepository(savedLocalRepository); } - ProjectBuildingResult buildingResult = results.get(0); + for (ProjectBuildingResult buildingResult : buildingResults) { - MavenProject project = buildingResult.getProject(); + MavenProject project = buildingResult.getProject(); - RepositorySystemSession repositorySession = getComponent(LegacySupport.class).getRepositorySession(); - if (repositorySession instanceof DefaultRepositorySystemSession) { - ((DefaultRepositorySystemSession)repositorySession).setTransferListener(new TransferListenerAdapter(myCurrentIndicator)); + RepositorySystemSession repositorySession = getComponent(LegacySupport.class).getRepositorySession(); + if (repositorySession instanceof DefaultRepositorySystemSession) { + ((DefaultRepositorySystemSession)repositorySession).setTransferListener(new TransferListenerAdapter(myCurrentIndicator)); - if (myWorkspaceMap != null) { - ((DefaultRepositorySystemSession)repositorySession).setWorkspaceReader(new Maven32WorkspaceReader(myWorkspaceMap)); - } - } - - List exceptions = new ArrayList(); - loadExtensions(project, exceptions); - - //Artifact projectArtifact = project.getArtifact(); - //Map managedVersions = project.getManagedVersionMap(); - //ArtifactMetadataSource metadataSource = getComponent(ArtifactMetadataSource.class); - project.setDependencyArtifacts(project.createArtifacts(getComponent(ArtifactFactory.class), null, null)); - // - - if (USE_MVN2_COMPATIBLE_DEPENDENCY_RESOLVING) { - ArtifactResolutionRequest resolutionRequest = new ArtifactResolutionRequest(); - resolutionRequest.setArtifactDependencies(project.getDependencyArtifacts()); - resolutionRequest.setArtifact(project.getArtifact()); - resolutionRequest.setManagedVersionMap(project.getManagedVersionMap()); - resolutionRequest.setLocalRepository(myLocalRepository); - resolutionRequest.setRemoteRepositories(project.getRemoteArtifactRepositories()); - resolutionRequest.setListeners(listeners); - - resolutionRequest.setResolveRoot(false); - resolutionRequest.setResolveTransitively(true); - - ArtifactResolver resolver = getComponent(ArtifactResolver.class); - ArtifactResolutionResult result = resolver.resolve(resolutionRequest); - - project.setArtifacts(result.getArtifacts()); - // end copied from DefaultMavenProjectBuilder.buildWithDependencies - ref.set(new MavenExecutionResult(project, exceptions)); - } - else { - final DependencyResolutionResult dependencyResolutionResult = resolveDependencies(project, repositorySession); - final List dependencies = dependencyResolutionResult.getDependencies(); - - Set artifacts = new LinkedHashSet(dependencies.size()); - for (Dependency dependency : dependencies) { - final Artifact artifact = RepositoryUtils.toArtifact(dependency.getArtifact()); - artifact.setScope(dependency.getScope()); - artifact.setOptional(dependency.isOptional()); - artifacts.add(artifact); - resolveAsModule(artifact); + if (myWorkspaceMap != null) { + ((DefaultRepositorySystemSession)repositorySession).setWorkspaceReader(new Maven32WorkspaceReader(myWorkspaceMap)); + } } - project.setArtifacts(artifacts); - ref.set(new MavenExecutionResult(project, dependencyResolutionResult, exceptions)); + List exceptions = new ArrayList(); + loadExtensions(project, exceptions); + + //Artifact projectArtifact = project.getArtifact(); + //Map managedVersions = project.getManagedVersionMap(); + //ArtifactMetadataSource metadataSource = getComponent(ArtifactMetadataSource.class); + project.setDependencyArtifacts(project.createArtifacts(getComponent(ArtifactFactory.class), null, null)); + // + + if (USE_MVN2_COMPATIBLE_DEPENDENCY_RESOLVING) { + ArtifactResolutionRequest resolutionRequest = new ArtifactResolutionRequest(); + resolutionRequest.setArtifactDependencies(project.getDependencyArtifacts()); + resolutionRequest.setArtifact(project.getArtifact()); + resolutionRequest.setManagedVersionMap(project.getManagedVersionMap()); + resolutionRequest.setLocalRepository(myLocalRepository); + resolutionRequest.setRemoteRepositories(project.getRemoteArtifactRepositories()); + resolutionRequest.setListeners(listeners); + + resolutionRequest.setResolveRoot(false); + resolutionRequest.setResolveTransitively(true); + + ArtifactResolver resolver = getComponent(ArtifactResolver.class); + ArtifactResolutionResult result = resolver.resolve(resolutionRequest); + + project.setArtifacts(result.getArtifacts()); + // end copied from DefaultMavenProjectBuilder.buildWithDependencies + executionResults.add(new MavenExecutionResult(project, exceptions)); + } + else { + final DependencyResolutionResult dependencyResolutionResult = resolveDependencies(project, repositorySession); + final List dependencies = dependencyResolutionResult.getDependencies(); + + Set artifacts = new LinkedHashSet(dependencies.size()); + for (Dependency dependency : dependencies) { + final Artifact artifact = RepositoryUtils.toArtifact(dependency.getArtifact()); + artifact.setScope(dependency.getScope()); + artifact.setOptional(dependency.isOptional()); + artifacts.add(artifact); + resolveAsModule(artifact); + } + + project.setArtifacts(artifacts); + executionResults.add(new MavenExecutionResult(project, dependencyResolutionResult, exceptions)); + } } } catch (Exception e) { - ref.set(handleException(e)); + executionResults.add(handleException(e)); } } }); - return ref.get(); + return executionResults; } private boolean resolveAsModule(Artifact a) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java index a1fb331f3fb1..69f34416900a 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProject.java @@ -109,11 +109,11 @@ public class MavenProject { } @NotNull - private MavenProjectChanges set(@NotNull MavenProjectReaderResult readerResult, - @NotNull MavenGeneralSettings settings, - boolean updateLastReadStamp, - boolean resetArtifacts, - boolean resetProfiles) { + MavenProjectChanges set(@NotNull MavenProjectReaderResult readerResult, + @NotNull MavenGeneralSettings settings, + boolean updateLastReadStamp, + boolean resetArtifacts, + boolean resetProfiles) { State newState = myState.clone(); if (updateLastReadStamp) newState.myLastReadStamp = myState.myLastReadStamp + 1; @@ -632,11 +632,12 @@ public class MavenProject { @NotNull MavenProjectReaderProjectLocator locator, @NotNull ResolveContext context) throws MavenProcessCanceledException { - MavenProjectReaderResult result = reader.resolveProject(generalSettings, + Collection results = reader.resolveProject(generalSettings, embedder, - getFile(), + Collections.singleton(getFile()), getActivatedProfilesIds(), locator); + final MavenProjectReaderResult result = results.iterator().next(); MavenProjectChanges changes = set(result, generalSettings, false, result.readingProblems.isEmpty(), false); if (result.nativeMavenProject != null) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReader.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReader.java index 31f245ccfdc6..40c106a4adec 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReader.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReader.java @@ -18,6 +18,8 @@ package org.jetbrains.idea.maven.project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashMap; import gnu.trove.THashSet; import org.jdom.Element; @@ -453,45 +455,61 @@ public class MavenProjectReader { } } - public MavenProjectReaderResult resolveProject(MavenGeneralSettings generalSettings, - MavenEmbedderWrapper embedder, - VirtualFile file, - MavenExplicitProfiles explicitProfiles, - MavenProjectReaderProjectLocator locator) throws MavenProcessCanceledException { + public Collection resolveProject(final MavenGeneralSettings generalSettings, + MavenEmbedderWrapper embedder, + Collection files, + final MavenExplicitProfiles explicitProfiles, + final MavenProjectReaderProjectLocator locator) throws MavenProcessCanceledException { try { - MavenServerExecutionResult result = - embedder.resolveProject(file, explicitProfiles.getEnabledProfiles(), explicitProfiles.getDisabledProfiles()); - MavenServerExecutionResult.ProjectData projectData = result.projectData; - if (projectData == null) { - MavenProjectReaderResult temp = readProject(generalSettings, file, explicitProfiles, locator); - temp.readingProblems.addAll(result.problems); - temp.unresolvedArtifactIds.addAll(result.unresolvedArtifacts); - return temp; + Collection executionResults = + embedder.resolveProject(files, explicitProfiles.getEnabledProfiles(), explicitProfiles.getDisabledProfiles()); + + Collection readerResults = ContainerUtil.newArrayList(); + for (MavenServerExecutionResult result : executionResults) { + MavenServerExecutionResult.ProjectData projectData = result.projectData; + if (projectData == null) { + if(files.size() == 1) { + final VirtualFile file = files.iterator().next(); + MavenProjectReaderResult temp = readProject(generalSettings, file, explicitProfiles, locator); + temp.readingProblems.addAll(result.problems); + temp.unresolvedArtifactIds.addAll(result.unresolvedArtifacts); + readerResults.add(temp); + } + } + else { + readerResults.add(new MavenProjectReaderResult(projectData.mavenModel, + projectData.mavenModelMap, + new MavenExplicitProfiles(projectData.activatedProfiles, + explicitProfiles.getDisabledProfiles()), + projectData.nativeMavenProject, + result.problems, + result.unresolvedArtifacts)); + } } - return new MavenProjectReaderResult(projectData.mavenModel, - projectData.mavenModelMap, - new MavenExplicitProfiles(projectData.activatedProfiles, explicitProfiles.getDisabledProfiles()), - projectData.nativeMavenProject, - result.problems, - result.unresolvedArtifacts); + return readerResults; } catch (MavenProcessCanceledException e) { throw e; } - catch (Throwable e) { + catch (final Throwable e) { MavenLog.LOG.info(e); MavenLog.printInTests(e); // print exception since we need to know if something wrong with our logic - MavenProjectReaderResult result = readProject(generalSettings, file, explicitProfiles, locator); - String message = e.getMessage(); - if (message != null) { - result.readingProblems.add(MavenProjectProblem.createStructureProblem(file.getPath(), message)); - } - else { - result.readingProblems.add(MavenProjectProblem.createSyntaxProblem(file.getPath(), MavenProjectProblem.ProblemType.SYNTAX)); - } - return result; + return ContainerUtil.mapNotNull(files, new Function() { + @Override + public MavenProjectReaderResult fun(VirtualFile file) { + MavenProjectReaderResult result = readProject(generalSettings, file, explicitProfiles, locator); + String message = e.getMessage(); + if (message != null) { + result.readingProblems.add(MavenProjectProblem.createStructureProblem(file.getPath(), message)); + } + else { + result.readingProblems.add(MavenProjectProblem.createSyntaxProblem(file.getPath(), MavenProjectProblem.ProblemType.SYNTAX)); + } + return result; + } + }); } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsBatchProcessorBasicTask.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsBatchProcessorBasicTask.java new file mode 100644 index 000000000000..5423d6c46857 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsBatchProcessorBasicTask.java @@ -0,0 +1,40 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.maven.project; + +import java.util.Collection; + +public abstract class MavenProjectsBatchProcessorBasicTask implements MavenProjectsProcessorTask { + protected final Collection myMavenProjects; + protected final MavenProjectsTree myTree; + + public MavenProjectsBatchProcessorBasicTask(Collection mavenProjects, MavenProjectsTree tree) { + myMavenProjects = mavenProjects; + myTree = tree; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + return myMavenProjects.equals(((MavenProjectsBatchProcessorBasicTask)o).myMavenProjects); + } + + @Override + public int hashCode() { + return myMavenProjects.hashCode(); + } +} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java index 300f28e0e797..56a1b996d26e 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java @@ -850,25 +850,33 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent toResolve = new LinkedHashSet(myProjectsToResolve); myProjectsToResolve.clear(); } + if(toResolve.isEmpty()) return; + final ResolveContext context = new ResolveContext(); - - Iterator it = toResolve.iterator(); - while (it.hasNext()) { - MavenProject each = it.next(); - Runnable onCompletion = it.hasNext() ? null : new Runnable() { - @Override - public void run() { - if (hasScheduledProjects()) { - scheduleImport().processed(result); - } - else { - result.setResult(Collections.emptyList()); - } + Runnable onCompletion = new Runnable() { + @Override + public void run() { + if (hasScheduledProjects()) { + scheduleImport().processed(result); } - }; + else { + result.setResult(Collections.emptyList()); + } + } + }; + final boolean useSinglePomResolver = Boolean.getBoolean("idea.maven.use.single.pom.resolver"); + if (useSinglePomResolver) { + Iterator it = toResolve.iterator(); + while (it.hasNext()) { + MavenProject each = it.next(); + myResolvingProcessor.scheduleTask(new MavenProjectsProcessorResolvingTask( + Collections.singleton(each), myProjectsTree, getGeneralSettings(), it.hasNext() ? null : onCompletion, context)); + } + } + else { myResolvingProcessor.scheduleTask( - new MavenProjectsProcessorResolvingTask(each, myProjectsTree, getGeneralSettings(), onCompletion, context)); + new MavenProjectsProcessorResolvingTask(toResolve, myProjectsTree, getGeneralSettings(), onCompletion, context)); } } }); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorResolvingTask.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorResolvingTask.java index e957f1901994..ba4bf02a4de8 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorResolvingTask.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsProcessorResolvingTask.java @@ -21,17 +21,19 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.utils.MavenProcessCanceledException; import org.jetbrains.idea.maven.utils.MavenProgressIndicator; -public class MavenProjectsProcessorResolvingTask extends MavenProjectsProcessorBasicTask { +import java.util.Collection; + +public class MavenProjectsProcessorResolvingTask extends MavenProjectsBatchProcessorBasicTask { @NotNull private final MavenGeneralSettings myGeneralSettings; @Nullable private final Runnable myOnCompletion; @NotNull private final ResolveContext myContext; - public MavenProjectsProcessorResolvingTask(@NotNull MavenProject project, + public MavenProjectsProcessorResolvingTask(@NotNull Collection projects, @NotNull MavenProjectsTree tree, @NotNull MavenGeneralSettings generalSettings, @Nullable Runnable onCompletion, @NotNull ResolveContext context) { - super(project, tree); + super(projects, tree); myGeneralSettings = generalSettings; myOnCompletion = onCompletion; myContext = context; @@ -39,7 +41,7 @@ public class MavenProjectsProcessorResolvingTask extends MavenProjectsProcessorB public void perform(Project project, MavenEmbeddersManager embeddersManager, MavenConsole console, MavenProgressIndicator indicator) throws MavenProcessCanceledException { - myTree.resolve(project, myMavenProject, myGeneralSettings, embeddersManager, console, myContext, indicator); + myTree.resolve(project, myMavenProjects, myGeneralSettings, embeddersManager, console, myContext, indicator); if (myOnCompletion != null) myOnCompletion.run(); } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java index e4e5ad761621..e36edb88194f 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsTree.java @@ -25,8 +25,10 @@ import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.Function; import com.intellij.util.containers.ArrayListSet; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.Stack; @@ -39,6 +41,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; import org.jetbrains.idea.maven.dom.references.MavenFilteredPropertyPsiReferenceProvider; +import org.jetbrains.idea.maven.importing.MavenImporter; import org.jetbrains.idea.maven.model.*; import org.jetbrains.idea.maven.server.MavenEmbedderWrapper; import org.jetbrains.idea.maven.server.NativeMavenProjectHolder; @@ -1237,27 +1240,60 @@ public class MavenProjectsTree { @NotNull MavenEmbeddersManager embeddersManager, @NotNull MavenConsole console, @NotNull MavenProgressIndicator process) throws MavenProcessCanceledException { - resolve(project, mavenProject, generalSettings, embeddersManager, console, new ResolveContext(), process); + resolve(project, ContainerUtil.list(mavenProject), generalSettings, embeddersManager, console, new ResolveContext(), process); } public void resolve(@NotNull Project project, - @NotNull MavenProject mavenProject, + @NotNull Collection mavenProjects, @NotNull MavenGeneralSettings generalSettings, @NotNull MavenEmbeddersManager embeddersManager, @NotNull MavenConsole console, @NotNull ResolveContext context, @NotNull MavenProgressIndicator process) throws MavenProcessCanceledException { + + if(mavenProjects.isEmpty()) return; + MavenEmbedderWrapper embedder = embeddersManager.getEmbedder(MavenEmbeddersManager.FOR_DEPENDENCIES_RESOLVE); embedder.customizeForResolve(getWorkspaceMap(), console, process, generalSettings.isAlwaysUpdateSnapshots()); try { process.checkCanceled(); - process.setText(ProjectBundle.message("maven.resolving.pom", mavenProject.getDisplayName())); + final List names = ContainerUtil.mapNotNull(mavenProjects, new Function() { + @Override + public String fun(MavenProject project) { + return project.getDisplayName(); + } + }); + final String text = StringUtil.shortenPathWithEllipsis(StringUtil.join(names, ", "), 200); + process.setText(ProjectBundle.message("maven.resolving.pom", text)); process.setText2(""); - Pair resolveResult = - mavenProject.resolve(project, generalSettings, embedder, new MavenProjectReader(), myProjectLocator, context); - fireProjectResolved(Pair.create(mavenProject, resolveResult.first), resolveResult.second); + final MavenExplicitProfiles explicitProfiles = new MavenExplicitProfiles(new LinkedHashSet(), new LinkedHashSet()); + Collection files = ContainerUtil.map(mavenProjects, new Function() { + @Override + public VirtualFile fun(MavenProject project) { + explicitProfiles.getEnabledProfiles().addAll(project.getActivatedProfilesIds().getEnabledProfiles()); + explicitProfiles.getDisabledProfiles().addAll(project.getActivatedProfilesIds().getDisabledProfiles()); + return project.getFile(); + } + }); + Collection results = new MavenProjectReader().resolveProject( + generalSettings, embedder, files, explicitProfiles, myProjectLocator); + + for (MavenProjectReaderResult result : results) { + for (MavenProject mavenProject : mavenProjects) { + if (mavenProject.getMavenId().equals(result.mavenModel.getMavenId())) { + MavenProjectChanges changes = mavenProject.set(result, generalSettings, false, result.readingProblems.isEmpty(), false); + if (result.nativeMavenProject != null) { + for (MavenImporter eachImporter : mavenProject.getSuitableImporters()) { + eachImporter.resolve(project, mavenProject, result.nativeMavenProject, embedder, context); + } + } + + fireProjectResolved(Pair.create(mavenProject, changes), result.nativeMavenProject); + } + } + } } finally { embeddersManager.release(embedder); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenEmbedderWrapper.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenEmbedderWrapper.java index b8542eb34005..1c5c727dd09e 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenEmbedderWrapper.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/server/MavenEmbedderWrapper.java @@ -16,6 +16,8 @@ package org.jetbrains.idea.maven.server; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.model.*; @@ -105,15 +107,28 @@ public abstract class MavenEmbedderWrapper extends RemoteObjectWrapper activeProfiles, + @NotNull final Collection inactiveProfiles) + throws MavenProcessCanceledException { + return resolveProject(Collections.singleton(file), activeProfiles, inactiveProfiles).iterator().next(); + } + + @NotNull + public Collection resolveProject(@NotNull final Collection files, @NotNull final Collection activeProfiles, @NotNull final Collection inactiveProfiles) throws MavenProcessCanceledException { - return perform(new RetriableCancelable() { + return perform(new RetriableCancelable>() { @Override - public MavenServerExecutionResult execute() throws RemoteException, MavenServerProcessCanceledException { - return getOrCreateWrappee().resolveProject(new File(file.getPath()), activeProfiles, inactiveProfiles); + public Collection execute() throws RemoteException, MavenServerProcessCanceledException { + final List ioFiles = ContainerUtil.map(files, new Function() { + @Override + public File fun(VirtualFile file) { + return new File(file.getPath()); + } + }); + return getOrCreateWrappee().resolveProject(ioFiles, activeProfiles, inactiveProfiles); } }); } From e26ba0c1ce2d6833ebf1ada306f51d053f1c4232 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Mon, 28 Dec 2015 15:48:26 +0300 Subject: [PATCH 033/105] IDEA-149786 Watches editor is broken --- .../impl/ui/XDebuggerExpressionComboBox.java | 7 ------- .../xdebugger/impl/ui/tree/TreeInplaceEditor.java | 6 +++++- .../impl/ui/tree/XDebuggerTreeInplaceEditor.java | 13 +++++++++++++ 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebuggerExpressionComboBox.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebuggerExpressionComboBox.java index 6a9f1fec19b9..3d418d2fcdcd 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebuggerExpressionComboBox.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/XDebuggerExpressionComboBox.java @@ -144,13 +144,6 @@ public class XDebuggerExpressionComboBox extends XDebuggerEditorBase { @Override public XExpression getExpression() { - ComboPopup popup = myComboBox.getPopup(); - if (popup != null && popup.isVisible()) { - Object value = popup.getList().getSelectedValue(); - if (value != null) { - return (XExpression)value; - } - } Object document = myEditor.getItem(); if (document instanceof Document) { // sometimes null on Mac return getEditorsProvider().createExpression(getProject(), (Document)document, myExpression.getLanguage(), EvaluationMode.EXPRESSION); diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/TreeInplaceEditor.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/TreeInplaceEditor.java index a92011c4f3c4..6dea5a4edc1d 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/TreeInplaceEditor.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/TreeInplaceEditor.java @@ -60,6 +60,10 @@ public abstract class TreeInplaceEditor implements AWTEventListener { protected abstract JTree getTree(); + protected void doPopupOKAction() { + doOKAction(); + } + public void doOKAction() { hide(); } @@ -281,7 +285,7 @@ public abstract class TreeInplaceEditor implements AWTEventListener { for (Component comp = componentAtPoint; comp != null; comp = comp.getParent()) { if (comp instanceof ComboPopup) { if (id != MouseEvent.MOUSE_WHEEL) { - doOKAction(); + doPopupOKAction(); } return; } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XDebuggerTreeInplaceEditor.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XDebuggerTreeInplaceEditor.java index 49b2c47b20c1..4a427bdb457b 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XDebuggerTreeInplaceEditor.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XDebuggerTreeInplaceEditor.java @@ -17,6 +17,7 @@ package com.intellij.xdebugger.impl.ui.tree; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; +import com.intellij.xdebugger.XExpression; import com.intellij.xdebugger.impl.ui.XDebuggerExpressionComboBox; import com.intellij.xdebugger.impl.ui.tree.nodes.XDebuggerTreeNode; import org.jetbrains.annotations.NonNls; @@ -47,6 +48,18 @@ public abstract class XDebuggerTreeInplaceEditor extends TreeInplaceEditor { } } + @Override + protected void doPopupOKAction() { + ComboPopup popup = myExpressionEditor.getComboBox().getPopup(); + if (popup != null && popup.isVisible()) { + Object value = popup.getList().getSelectedValue(); + if (value != null) { + myExpressionEditor.setExpression((XExpression)value); + } + } + doOKAction(); + } + protected JComponent getPreferredFocusedComponent() { return myExpressionEditor.getPreferredFocusedComponent(); } From 9cf87f8098ddbfb94b7f567b685a2cbfc868ab88 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 25 Dec 2015 19:11:32 +0300 Subject: [PATCH 034/105] cleanup --- .../com/intellij/openapi/vfs/newvfs/persistent/FSRecords.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/FSRecords.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/FSRecords.java index 477cd7d9abe3..0a5d3e19c417 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/FSRecords.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/FSRecords.java @@ -280,8 +280,7 @@ public class FSRecords implements Forceable { @NotNull @Override protected ExecutorService createExecutor() { - final ExecutorService backendExecutor = PooledThreadExecutor.INSTANCE; - return new BoundedTaskExecutor(backendExecutor, 1); + return new BoundedTaskExecutor(PooledThreadExecutor.INSTANCE, 1); } }; // sources usually zipped with 4x ratio myContentHashesEnumerator = weHaveContentHashes ? new ContentHashesUtil.HashEnumerator(contentsHashesFile, storageLockContext): null; From eca8f0aba69b9082c1bf48c2077d2e55f525951b Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 25 Dec 2015 19:11:50 +0300 Subject: [PATCH 035/105] clean more on overflow --- platform/util/src/com/intellij/util/PausesStat.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/util/src/com/intellij/util/PausesStat.java b/platform/util/src/com/intellij/util/PausesStat.java index 9399505d223c..1d3ea72b9e6a 100644 --- a/platform/util/src/com/intellij/util/PausesStat.java +++ b/platform/util/src/com/intellij/util/PausesStat.java @@ -43,7 +43,7 @@ public class PausesStat { assert !started; if (pauses.size() > N_MAX) { // guard against OOME - int toDelete = N_MAX / 4; + int toDelete = N_MAX / 2; assert toDelete % 2 == 0 : toDelete; pauses.remove(0, toDelete); maxDuration = 0; From 033118e301056000a0772e36c2a9584bf1e0f328 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 28 Dec 2015 16:02:08 +0300 Subject: [PATCH 036/105] turned off "declaration can have weaker access" --- .idea/inspectionProfiles/idea_default.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.idea/inspectionProfiles/idea_default.xml b/.idea/inspectionProfiles/idea_default.xml index aabceb3d9fed..7768ba914899 100644 --- a/.idea/inspectionProfiles/idea_default.xml +++ b/.idea/inspectionProfiles/idea_default.xml @@ -809,7 +809,7 @@ - +

`~QjYD=**5+=-8@&qw`Aj0q)!EmZhE`Ke%jI&7$!ayNLJ0<27ZT!k6Fh+lWvJFz zwD3#tc&>1~Qxgi6h)j@$zF;BBrgVm+O{>?Hwr)qEo?ySHZQ*gf?{x}1=P4Cnm4)lY zbDrw;xRVBlo&jzz&WUQLTf97fE9ZadHsq4bawp+kMl31#$=6zSEBVDv4~-aHs#QTO zcXp=Sj(7&NOW|1EkL;tuNTKeBIG4;ytHDhRNS2?W#^j5-9_M~gYZ1lo>AL*_1aBlQz7VoT*=p~Qsxn89KxUD4@ zBN!V<>YA6;W5)nccU3`LU<-}E^Y(Egsvko>A`KV;0N~|PXSIARi`e5WV`%sRT^-p& z3LM_gruedg&xeLQ`CyTLsP=|L=f_^S7xldZJcL{yQ0DjLk2x(XdIRylmhG?me9 zO1*xVis!386^7SF(^gPttj0M`FZ0w~BzF2G(u zo!|Eba2`G7jp6vcDlUt&I=}7nM^~`)dRba&GF$#=nf6nUiAw6sVA9BFOEWxZwslv!8f zZN^hGojKo5Gu!*#!Dx7*g;=@cLQj>rshPN`vvX21a#Bv6is$Z@Ek?v>40^ia_L1tx z#2c3I@{X88uRzk}%HqT-$m^i~wo$#uTMVlv9 z8x-mCW%UN(UdY_W+Ypk{8szl`w*Tn*$n=hJyz$|suHJ@s$BG~Sq{-tSPWl5r^eK)J z&+e$_7nF8H+fBnibos~mUBk~X?-UrtQ`)?@3iwkwde00O9xWNQGQjMXuNW_Hr|^)u zhKtV|($pt4)hyPZu!1ivOnI!XXEOd2Hvft%#;Z&!xyHzlKnnKZ@Wrp1QoCy9@i)jh z^zjMJAF;n)KQ1NwNa1c)qutWFTDGq&ZJ#`}vnp*~QyQ^r>EosWwENOmnt8(f($knPUND(%c#R^m@JBc(317=^AUo)y}*R_)nC@LsC!EETQ zTc=4ollE#JGsa0*Pc=aHsh!hOIc50TVi=98J$Gh1Foijrn;MU<+Eb+g^idvNL@W0Z ziiXPjlSoa$oA@~WwjgUA$LBIR8`F3of3&BPb_pqN4&*%H@r`2qWRSZnEj@&tB@0ec zvsmI>tn@rJ?#CIY-g2 z#>oJ>YV^Sb<5Ih9ANge2%$s!%TZQ%;l1k4(`RPcp*jsYp8kpD7ZT(|Fc}Tid%{~d= z?N?gmWbUDc-X^&8w1?i>!tXjqjFy5OdFv4j+aB9oxEhC&8L~kI{}@M-zY4L5EHgJ| zUcYw^_(o<%#_GD(T_^kwi%tS~WA{lbN0r#fC{Y(Xf?6>_sD*-KihlU2vfGS1r*yhgN4kF^4`; zeVr@&Q;&Z1(-B8r{xD;>ig~3J%OW#-Jwi9yRuRWnK<;2!m~n3^^fIk|e16-sa2SUe zQiR^wG6+i=<6^8O4RE1L9^?ZO2mvIcR=gCe*8?K9{8SurE7zkau_+tk46qanTe7GQJE{O$6<=t7NO=E-N+gfr@P3lGTcC%Hll@(eP-8*+(lYCcRa%8?1? zQVg7+@k!qO`NFO8aXxS9q{gw&oV#DN`cP=_!~Mb7KFS}-HumAz;~g}zrECH3ZG|Fk z5fjJg)}Qkp#3nYUFQnII0keIgbEf~-2PPW95|#7U!pa?JC#RmVxIuEC>ym%c&`jOq z(zEwJ-t6iggRlDVKYnx*{I}!?>3>d+s2SQ=ntZ!j{p-cvqi(H?y^84vhonV_Hf9jS z$Prr~LmUFza7YFU!J2R^#t4Btz6L0MB&suvX_hWV1(e!mdMB}@v9)c;Es)s?Ep{@W zr-8REHs@t#%rxV_V!u-JWGp=4&>Fe7058tCXt>QD_wdeo&U(jwKHl*AK<@FqvxR8! z;0b}sOFX+FoRaE52tgWRWgz&p|0-MZ(iw!Yp9U|un>j`}i9aUpAaMC){U&?lp49qr zLKUU}g<)WO-TkJhzZ!$?&zBVhy^~>mW1@Zd!;9VbAUmF=c(X=~;ip1p-m)5uoCvFGv*#j=DKrc5ExiS zVfyq)J2{H=!U+V7C70>%vl8tj!+2*rB#PN#EIhYrOwUrgw>0IFCQh_VA2(u~bRaNl z;%4*JoK6SPO%aB1rL+}OpEAl_dV(o^qc#N)oj(Yme=t9IYScvUF3Jl}s4zJfO>{$~ zpveqUBk7s8w{?%~y0 z`F!UL6(RYJJPefMmh0_Sp^UxU&Znx)Dl0rmg(sKvaPLWmdZz~xR7jYP6A18(VfLw@ zSw>`KBM9Dlsyzw*H2a%?yy>xpjNwHE7gm^h8;h|?b7dCP(FS{`6Kak`mAwEyu3aQk1yi+_PGn2flO+ zEZ(XJQiNl61+tAh`14TB&$5>wkXl|NEPtBm=`dfijs85;$*9yhk6psKl!ejty@NJZ z@)^%Wb}0mPVh%FO^u8yEs7E_+BT`{TM!GeqA&^@XxCFftGxlrsJDNoP|QrsIQc>F23kM z%lDC}Fe#cR6c+yOvqol0WZ-a@?wR^ z58Y8wuqX}_yDp?JvbTMJuHS_W)${r}yeGG$xXvj9rQ-tc`(i;bp{8)(A??N<3-R*_ zGN&kYhC03+?01}BXe|Grd+qqm7qZptOJ|=@J!L(Nzq=LK0y@Me=WEB@DO%gSJP-j4 zKUY2a+a2r$Zm>OSmjdy=A0#{hLP#E-mDE{LSdEjdwUU#3q#9-KPs(0D7!SirXX8jM zu3({4Lg~}a&~uB2x;4a}2!x^u^vK%$&&p86UfXD1i_#s$*F%i3eS5tU#6d=rK%3Gs z;G=l31x`zl7ugVxfmYz$LV9?QJp1|{l$$Y&nATkpVOX{LD=aHt_FQut&%gSg*vHRW zBClKU89G-&_!|}5f-<)p=VcqK<%TtF5~WACh64&yQOn$0)p$)VvCui~CHJKxR_F~_ z(SDxOg-&m_%Hz``j_`PzMU69sjkAS~vAIxGZ!}anNo-W|;S_zxq1E#-Hp2^^B4;Et zIc>BiVGtQI@9cLz>r|b}7Ws<}Su>o_y1}8>iqN_syr^e*EpwdYwr6sY65`!+R}Mwo z*5}bsIVPws(_gTiW02d(A=g3J+iPNHqin+NkwmypGZWm~XLRe0PTkol!7D54f`6rr zCgUx#+Fa@kPBF0o@dzE!Vp9>%5%C5xgT}2eSWh$gIoA|0+Tby1%x5=I6eCL$Y-KB{nE*p^ovxzoinnFT{&c5?Rpvgyu?4T$XCZG+R=4}M|oo@wo#aqS&aTRLC5pGY7VW?Mh+o8?Q_kmAc&T)lV4r{;@U50^7$4Wueqk{`#lC<-yY>T-VPZKd@2% z8yn#HAK8HGcR`U}(8$@v$6A>;3TAnHwf8LV6Za{19rx$qynNpe57-tKrt;!j95T-e ztMrTD$g1kz(FGRi@7Ld=L_s3ilxk`%xnuAX=ZZ|zLo2`&78(l;Y-uHE3-uR`9VWNf zI@9l%KNGL1HXcd96`37|*m`3Lz!Mw5mPj?7hOY0%IdQ6sY(12L&>cmO;;b)Rchjv| zCj9jl8%`aIT4^(x4R#4+Da7D^CJ43@Vp6aO6&Rm#p2+{^VfP!vw_2NonsfNuYa-Vj0$K!%}8ek$~mr}SHDF(08BfmODL zCb!4Rk)4BcBoFBmxlPN1Wry1f8Y2zKD@EQW(t8G)_`pjt zvvA6lGj2!7OdgzaVbeTVN?s^1<=>5v9S)6XUW4L2I%C6^#JVJH5l#Zmv1qk4P4Zo^ zXkLx#6Z}APG_8B4ULtj?*Lh7?Q&1dhy5NP0s=Q0o&;*bs$y$4E9z-cG_Ns_G*~f9hNvLC+}1 zMy#M5$53e~B%I;rzpq2^ets%B%OrE4OSIoT#_@Z%fO3~`+6Y||?m?j_{v>KBKWNbB zI0;tpDhru?WVd?R0g-Wlz{5XYzbtyj>O-tK@b$-mHobR;fn_}i1h=NmEpb77V1e~A|V1PWzSmw#i0 z%DB?EMJ_M>d9maICdMEEQ8*$qk_nQm2to_h$Q}_2w0q8pstpA0Rky%?-WhzmVS#FR zD6}*?%{w{m&1J}ZZDYAy&;Fz5>6ZKT)%)xH6?Xt753InD27=)hG*Luyq)fnx4Fr@E zVKF0}y620X5Zu!-Lxqvl2u!ekHyd^YBw#C2ad$k5S8wx}+toVjhW(GM;mV(=6hOVJ zFwddb_6pdp&hjqGnZbOs4C5?ALift}5_oW<%I*=&JnG_s^>hwY+v;Db7$V%#y^!in zn4a;aiPYYzwsNT}4#=MqX3Gnri)7t59i+c~!D~!3xAZE{W5DehrrL99^}-d&AWv-^ zeLL!V71PVYj$%4VT^5NVJsLx6&(&DJ8XHGo6(xF%AksqZY!)5KjsIk3*Pm~6CC4l< z?9Ly_mP&nRNDe!%exHptp*PFhQaay#B?ldQEwVjBD{nCGot(87&mjn^2*VUnnX&Q+ z=#1b9w?X#+!aRx#0tx|R>8rP(!B}YZ<%SroWLPsW z57YFXI;75E5&N9W!BCYwmC|@WG-fqQR_V|K7+r!2qTGsZ=RiOgGw2P@>u!BgEnK)I z#H3S3@rEHu?}(d=D7Y5F48(8!I)mWy(^l|c=B~lPH>rY%pr)NO@)Y>`PkDd62Q*S~ z!tGDu4b3{hEQ3VW9?Q*T6lsM0yeXixt^e zevYY*Bz&d)#bcjis$jM2d`1I8N!P^j?LCT*SxA(@mv~N|(JXvJ{wf#dw$?B(61z8m z$~|gXjAmbioHk$JToug3$tLNgT)fqI3%7slgZ{zd&WTn!f138yFDWDZ@=w>i7p$q1 zg>N}R%71lp;rL%hj2Nfef&kIo1tBdZ!U+ zc}Db6&-#LAG8mZ*2E`Rc=DQ!H$n1>9M!3#oCk=)NXcI8-S z2Dwhu$Jo1R9B^AnqF0#VWF9pW2BXG@hdu)hObL>F%_L)Qlp2X6R<0i6R>xK66AxB3zX*RpA z+x?FAXlgoO79E`tq@fNT5r5-kQ4UiXZGz9T7#sG7BQkJ85Eb(GE43YqAXCInhz@ME~lU=n(yS4+cJS| zpR#%%%-@BvdL|pQ0v(ptXzLe$Fm~sl`Jfewu)qI=GU+QV_Tz8CPyRO%_|I2~@qY(p z|Gq=&m+C63s9(708PLq`3J3};r4$AR;KLRq5&5)8wh-{zgc!||Juqz?Tw4R&?zi)7 zlG;hllGgg3OAiTTF$)@50>lbN);5_NEwAVg!mk}4bG2@NmDSOxAKkCFJe^<-VShW% z@R@%-uAB4EbojrV z*#Er6%~rqFUH6k8cp|<3nfP80Ix8K4PO=o0*o`89z@K;&gwso-o|7i+N8`<((47Z< z%iN9BKYLe6QulHP-Ces^h@a&kIgpI++W1j|58F=C_5=u;gz`HUN3NAf)|XCZFNs|> zy`cqL{Py~O7aQ0F{_N2r!df@iIKc#J*<^5OqAn#x@)GJ_Ey}~3qYXsz-no7SG;1iy zQE_=Hu4^xQ>troyC8@EjY?R41Lnp(DjKNGxWp)Ov4)k*StBx7Sd-Ij;=ux}`3txFZ z7wz0VTd4C`D%72wD9qXrtCM5ubg||wHqf-+gc$3Z29lt!-zUYEEOXxL-f76hY0S3| zpknKgbJ@Tq--Kf+TE_`E8ZX8Nlu`3lPR5AC_V9D^6=nr*NJM8xjt1Q)Roze+xP^37 z)yL43v7=733xNKlp>+x(){etPVFvaM?Vo(xH+DZr5NnhanZ0POct~PLT4YTkM3ViD zomW4z_C5q0D6v)FT%KT{1F6Ev9bq}DaT%C!$kXH2L6xp&DxMis1!V@d!phdsB{-1X zKe{

Z_Q`P7fkB(B0oE^!P_nxkqFe5*-Vd-2*h`9IV5QarQAM_6*rc9ulk%m4f*} znFnAe&CW_~hX!2s!Ze{nzF?(}JjPc}vv36pU;=K{)C|nI2A<3ny-SzLqqXyM;SOrC zgN7VcVf=gdTpXPjL4tVWtoaP-3W}wSEwc|!R9dUqsT{bW4xDAr)_}F}3*VcDMu`VS z+;H(q-VE~H46+Z$jlfk7&d0fkI<*UYM;sWp76}tjGBrXg*u0LP7Gu9u-mi^fY$tzH|~X%f3GW40u~V=4CVp{OZhy`Y6RN9+iw=&u%FkE?GK zi)q-{?y`#2QV4ta1~n zTQ((Bb;Q3`cT}Kz!}U^m$Lox|Oe8U=Sc~DM!W*b>K2}5%L%kuIfT}zIhpTu7(U3D& z?G7^xyh?cXsB)ExlVvJ}*$IvCaX-d0@x53`Gy7EB%T19m(}$y0O84?C#{kR0)(b2a z*pzxO(dS=ie^MPDIO7OzqLM+Vo?wmjlsx8)SKXy`S`>`O@9e%yL(^V49wdUNO$9$^2h>obpD0CF=aWBA3J@qy__KIZK_s*BS^W-|JwIL$}>(~_N2c8OpO zTzHiLaH>dhqR1l*=oc>bi~M1$;8;hyGUTXLO`%Tno2V6^2~XL}+xD(ExgDd}1M-Er zz|%v>2u)AYCy`>GpV$MIbO^QN{0o3@>ic@${(&IzsEz3NM4 zcU?j4sPgeSzi|!bZ6y7jK>>h?VxdRR(#(T!pMiWQGm?oHhQ0Syh znIqK4(!!5j+8{J)j{H66cM!A&*@4Q)i8zH(weT;)DCdQ|(^NRKcWvXhkT1>CXPZ%V zNzKC?)2wx=T7DN)YcvI7hZ2L2q+)n;1Mcj4%`~mqB6wK+5wF>K&FVDroMp9vs~@Kx zV)A!BxhF3?Lzp}8*O`-PR(`3;Pk~Lnv1Ai_P{01VJOTod7#q1 z`)vcFTAiu(HAD0V5=57%o(IDa@Rg)~ZB9z2+Fhh+@AT7B_v~jy-%(bZo!DTRz1#Cm z<>$?mOO?!Et9Yyf)D@e<^Ml5`UT)f-qe4!3uYhl+L+g@m|AsuF4faVsxBb~;9khmf zhuDAW9DH-y$0m748+?P>-z9rr-W(K%_(eS*c;oV}DO}%Wm*2o{gASyLOmY`m#=Ilz zxz9yC1`GOvP;OwW9hD_RfuLkCb!ez0%G`3zF-Gn*${0K5JPHv1RmH^2H{PJhaFRsA zESD(9L>iUd|Ca&M;twkeY*^MQ;>0xzYM8(4kzCRrHn*cz4)8QiAe>ZE8V!oKK;k!3 zs~4ywR?;j3YS(Lngons;g|%8GXNzlVGl;aN-Wq$dx{~mL9xmptzX~2&CcZA@C<}ea z&-f~j^2vw##$6FtJvPBIsc!n`|H?|ZPHWCEeY=szeUEPb&xGWE9y#*=$ziJ4TbtTR zy8L6lfxXke7)eaRwluaN%E&AUBX*m03}Xa-O-&wSWIKEbd?8A)2m*`eEy%^D8LrE; z8QGLv;YZ$UK0Op|`Ru3SK@J8@EmWh!&D62`wrdgv?)usIS4w!!p*=MMkCyFf=a$Q5;ml%G`w2K& z@Yo&;ZK_^sY#kBZZ6M*kJ@Za(qhD$0t#aM5r+{1zC--Kk;dv_0$B>kG_KrD{4+D`N zTOGBkJO}-xshtGd&kxW0`g9Z#)FQ)1^mg8;+NzLDJUjha-IO#Brs z08DXt_Di=Z8hD;7Ls)h&(zp8Ij+mQ*Xtw@nvb0LxbFJWqNbpzeRx6y)({d6|lV>;Z z&~I!wM$>|KCf0irv}3iB{4+-xy$VV%LF{C_o>tMETG_wES7hbP7rs&I2I$TCa}}js zLrBZNk-1__+^xQZ57g;ALziTuzhVhro#?CS=by*{wFn&1KJYoe3owNi+v;bGT|&ERa99mul;rlW{qw0qE>^!&_svf^{wqHv`_KIJA9Jbyk;VRZ zuZ(ZBAk-iOf~bEpRt=ap@cCeiV0U2QUSaz!C?i}8t8B3)wcd2-&szl}k<}UV&(onP z@7`}I#VjwKl1fzaekT|Y$5UuWzDjkL zEMzioXIot8MD1R>%>0nwz!F}Tl0N;#IE|Li z-t1Mms()#CB^=gM#A%rHy8*R}Ee`_F;E@c+N^f9$|NvvU9U9;B$8%OeY-e8JLg zyJ;2^KoA)$L-B?}jXp4~!1;ASsX+;t!tHUC41r3n7OIB&^LWDz&y}ppaZVdaN(tf^)|(qMX)} zZNKSg7*(fr4z=fq=&r(sG-N6`85C9CcNSoGeWDchKKf%e&k250pK=VNO1XV>{(b@6 zX1)X#%z?*k&$J}=UCnltmBpy+NKe<%ILVaWr(&+Htch<6Y6OL%iL15dIlV|dm+&Cl z=WJk7+gW)|r+cUTdB+{X4aH$)1voxCIRJG}tF8_bWT9@4^a6v$P-2Kige-y@y$vd; zNgk>`KXT@rbn|p$8naaup#hkc(_5P9WNpD8yAn^@0wSAHwT@~huf_<$=o3_Kp$?&x zj4b;@f>_8%WhgyjECGAt){C^LCJe&#&YB@Zx-bS7Jpx}bH78CylLV+0zf6T0Sdx)i zUbusqWPb}!AW%gl0tV1kjTIK#4{-*l{WiEPYc;iiRxy{!hGQ+>&N<4kJQeW~75N&q z95Al0f16-@&9vB5Hk>%4mV;BKS=O4t({H*|tHcQt za)}UFn?d6`HHy6!m1+Dm6$T)UNLE$7n=s>~BT>}0$TKhH9D85aA43+-fk7m6rQWkj zr9VMTdD9Pee@%fuo_|NKOIhzP%e&3RYUXSL5$A@;i7s#&43r${!^Y@Oa2;|xV#T&| z8V)C#PgI)L;6{1`SjS*B{HyPAR9SN}T0;J~J3*fsHqbWcxwan4cls8a!Y}W5KKI=5 zR_~h-C?ia`t%?mG$L2Z=Z3-Px)VVk18)6Pk@p0j*!hV5q<^ALn&&;rYWt$Pk;2(eT zBH1nIiinxEi*kB9lo?=->TdL~jA=W@l#3-UEeO;RYqCD}VR6AfANl`7Me|^EY76@f zFtq=5p3eU&)c)NwmZEB{j4X}7n`FRNUBxqeDyqXOB+*as3|f~;K!qg$i*$EqxE}3j z+SJ9$Juo@j{&loN1)H24XRr2>MKhU8LY7ZCpki8TUfLx;d!D;Pzq{l6g8^`Q#Szeq z1#odO)EGm|UQQSY2RLJixmsYv8p}+dE`NfN>MkJ;k(PLO(Vpy{YGp#2N06za~K2}lwq!tw*HjzQm$Y`W6mBL zO|%Tghrv`-U!^hqVRcvc9Dh=K)=H<89-F2}(xjGPkx7}Yiaq^h4YQim#s0?HJ|GHc zrR)dkKcjrvDlb;ThmJ^gd+B+$i&eu<%G zAI14_jjp88DN_NeBhQGr}x&WQUxHVfsV( z3+~m^5DbW(!2*`DLmL7>JS_m`zpqrBfwc=`c5gB2>N)RZzs3eXM9Wj^-;#T$=G!&# z6hs=SV>cfgrn90irAk?Nx20m!0ZBYX_WZkX2g-}ir6w>MKP0G>AcOLqM$9jcm?qT|3We+pHYli zpS6RwPfNw1+IUyIMSb9N zy%}jI-xwsv_GZ2XrNos)UC`a{tj{VL>Ky|J2zxEc{p`DkI*88z7{4OHXONOBBG`8% z9k3{&A{?^^^GewqSQ$nFZfRF!FBi!}X|I?#=9oMKm;ZQK@Yh7<3+^AG>l2yEsQVqd zhyOKn>HZgA$$uxWRJFg0+z6j?zqeafvxYfnM^q#iS6F*V8nRM>BeImrV2dLbmBK=j zFE==)wl=Jry67gTzkowPB~*?H;RzJOkRS)7sZ##-(m15rZnx5ms_183OUVB zeVolsvN8_C;(Fik`Y|2&a|hZHFi{P&)foe!q4d-U_X{Iw$WV2Z_J>Tt>dHaAS%07| z0(*=4%!JQkqBi}4)Rh~^j*M?752@nQLB6yW(ov6BXPDiab=q#XSv$cBX0yfE%BHzY z9iath0HsQ6S7niA?XqIR$?B=tT~P*WtXEo{vWm%i+<-I47Hn0QRwJ2a;LxsCQ+oW_ z?USWmIZE4WR&wE1k&Sfi#REo+zi_|!D@OJ(sNU!!@ZFqT5R<9Xsa6?SQ_$nZljmf{S zHZ5X!D2K+5!R6Gp$0I7yd9c`uYx%b3V#SIXS)PVZR+K15*A{#-|6+uwt@@WmCPnUg zRO>G{OZ>5R>Erj8g~)_S;868u8F$Zm1p8v&;BgfO0q# z;$r-8Jm3^T`8F58BFBtlInAq0pOV&5At)Xgn1h~GDApvqKKzJ{EL@)=SVmkv|K?sp z5-jw=Q>GrizaPv3vCUJ@?N#+qP}nwzJZ< zZQHhO+pe^2XQj=_bMNi>rl-5l+=qGk-~ZSVd#zZpSEO-kx6Mq=+wcB}b4DW#?|KXC z=jPwu-;ERgFMO8iHnR@2+AoHQyEU<9%uH$S6A-$j}N40 zaUU#FvFyScBz&&MN0RubnWPn8QhG<&3yV-z4uSd+_RqxMJOv-eg+tPtlA+~RwJ=FD%1$Jh|6hsa&YxpF-ayNiVE0Y70# zpyQdis>eXk$r@>hd;(wTiKg9eK}*|&0R7tX-e%B-I|uZxuz^Ba=p;Ho+Ia;sr#yy< z0PYd^U?lZkU`;2} z1Geq3eROer^iyXtq~#)gbGoR^>}^v+8~uJF~P$5 zT$s3_xgK_9up;;ycPy`yuObZRTDy>tA{QsyN9qKXp*Pg_qO6U77Va9rOQSB!7MXGe6Bz(zHR~ zN8=u_GU}jS`QD97sZv?1i%Q$13>H?E&eUh_Pe0oNOzKEUW$42H0!m`O7XbT;>p3&H zRvLD*ifi<4tghMCNZkFK)!~Tq_#401Y;Sx2X!X}ZGib#VwuGNdxkHlTXhpyAB6;+VAFVJWX(M@!7QK>|E26ZlgQ%a5y0z$_CB^? z5U$rAQagIse5!^GVzkNB)}%6Tm9Y+$W_T70fY4zm-y+Oob$O=PiB`ASY2L2Bc$w7V zIy5G(W(?-OOA+w&rh2ST@NH4^B}mPltf%4-pbzZgXkRv4Px1auMoV17Xdz616H*o6 z1hx8r2q0wk5(ANg4@#9OQ~T6|R{`H>3A9vgMFP|Mums(KUb#)Jn()&Rnl*%1e)q__5;hkeP5_zl0jsMv0y_*@R?-#5cBf+CYGRJ z^SOX{_TOrv;@_&-RR7);`o9(IA|-8$Z<5K~Al@+MY*5hD6uz`Fm=0@&&_hv()Tjg| zEYt@{{D*H z3%yYnE5I_e8xIU=L2`>?ua+}{j6^jkzwm2JXmya;FVOuc=%t*m`Sj5P`9Z-M*0AP^ zHzh>RD7Vx4Fx&ARbSi?wp@nN(aUGydK*|25j?c5?O9_ICiCc#U>wb-4#bHfbBtARd zui(|M*FJA$!v!XD`(&7HszHIeW}nj>P7D#*uT5JAI0V3X;K`_V-l<GFq*J){b>BThzWM;6M- zEhw9liih~Z5ZOEka4V6QG3Zv+ZN)KK$m-s$D7=PoV<-8u5d$;KhKMw_&BJN@7D?kd zx{1M|UNftswo)?yHSG0lzvo_*_naILG52I8aKU%q&>eJQ;n4a$eV{%-BCwz{cO!$a zbKKKZYKlou3VS;YW?CHQ*?5C1?GsXeQ6`1J`NT&?!M68GS<&jdId-wh7ywF!Ax+)1 z1WComVS%F|k%UyxdH-XI@t|W%h~@h{p8c)5{coH{ReL>KTO-4N0y;0bI*GyWi3*2o z^(cASIuuBFVOvN^$|O!OG8BlVbB^FlkBr(3p$}$A-rg7lQal&^T_nc4txnLGmv{HC zAGYCELCitW{R*bsddJr%=H?s)SvNu5ZmIQFQ(&jhi}ss|Nih%^5QKTw6)bAm-yX=T zz?eQ(X9-&swZd$*i&Ct#7aZBjpK06q)){lBxVxWTbWW2oK+N0q8y+wzQ-h;%bgvl! zwJo{!$E|di8yeAe+0nM0u|VGT`txm96c(>{S>V8|JqsOQB~m~7e|XKx{R+(6G2#!a z1y8(3<_E0Q*EXh5b%UxW`T+SWs}~8zTrR$IR`YFN-D)yI_ z^QyXWNFW~`F>@k{9u_>fTq3bz{dyg z=;9yh;&<%4JhbTDxjPXQ&bm`Ev|}%N?4If{I^emGI?C6f{&y5>H_X5>6;| zz-YZwnSO$@cPtjHpI2n_loYKTCAj;msq@dLYdZnd<(UNDwfGq&Ar1&;&Wj` zoTKA+;kzq^Wt`#@a4TsZYYDH3{ePl6DhDg|*zZ7>2c4ecHG>GSd7|$#4a5EcCC&vldCWJCjeX;1Hrrt z+FenVxP>7w{Rfp`3=ZRkke0*-7L|Dut=Sa)A7FR?fVe@a5Jr<&PZB*D%sXcY&a`uc z9!EDM*6g4s)9k0y2B-d#v$#;b^~o$w7YN5>hGM)w3;@oOKRuQxb6ep(3M0#?kiGVs z4Nl=hGS7eKF8re6Kd(&1iOGs9N|s*5mHl3!Dc&^@R)|awGh*muZicu{Too)XWp*;~ z6Z(U#bQdfe$#gsvJ#-{WoO{ben#4qn%z{~py}lgd>B@#F;ilD4Yt|O^*8s)%vr~t) zEIiLrPw>?)IdBS-)-W=#ti>}=ww{yl0rZ&t(lwQL?runH`L3vI__AO#Wg)!jRQcgg zM)ORT{2=1VH~xVbJLNtH3~&D&h7!pG?bqrgoOh{#%~sI?HUf-j1EqoK8%UMtV4Xcx zjO>v>e;vpLByvyap1wdnW$$aIcNGcG0<0~dEF(ckhSCohRp90WMr^U+J^6unD}fl6 z_`C}FfvX!(_ILS#oNu$wAXF0=OwTwPB&m7hzXf zVuJQU^jYdHMRh8lp>3v4oF@pTPNrH*EMde<7vZ`M?I31Ww^RMFYp3LB+gD?Fuxdi& zxn(a`?83BQ?IfK%0M=u}3IpN`^-IM5$`z#}Er$DtY=jR9-E~QX>!MirH2RpQ_nS_h z>~4*N?wp@8DQePF)R)%IHAg1hlnS=Kl{5%PLjKnvkg1yW*cwF_zoMKjoB6PZkU4}q z(*3E6^5jRk3#XBo3K}acMTW-;aawBb^4l_8WRgGQUes6dA557@9Zc{QEkGFuj|G>UazZ5l^ z0v6FdX<7gJXx_zI-WPYr2_=#ejY(_v*hxS(Lh5j7JE?igADwy25;Bh< z(G*`Ag-eh9t^`}4ml=C?P@+5Dyt8~Z;3^Cu^-!b(o7;K#E z>9PoM?ps3twNFcm>m_F^)kpUQs)-cY>0ADF+oCnxgw$ShnBK({WtHFoQc78h z2^mIg8CMLpjFjV1Kh8Q#>ueAmU*pHgK+-Me3eI|P2jyTWD>2W*H*P=m5#Q{ch-a-m z9Oc>HLcMPUU;=-npV5oVs&*y_#v5mV8;ICR@1)%T?JJD4aB%+iT4ME(roHI+d} zuYucrLL%#>y|{ZutUKG4rsSe=TDe}kBhx~AXiAP?z{amW7?MTm#XjN28P$G-WXGx( z9vQ`7nZ$8?&@y`>YE)T;=LW#zEUk6X@qN8Q9L3bt1AIoIC@Dqego!uuPF=hKKQ1T6 zJi58&aUx6L*Dy3hDth~OAl61qwMGv4G1lCG|D-7PnK(7J-I07g%dBc02fyNSy^uOQ z>u|lWQvTts?pp8^; zIJMcSiH$%suv7VHhM|;R9H*qQ5+TW1io)KM*YzRM}bb7VcG?KiczeBbdK(NVqkiA`d{ADKB643x>HG(NKwe=UNSX&n0LpG@MQdViTwt869b;5^ca za}{E6f*ffNNb0O<`0TZw!C)kaTP@_7Rq^?LQ)dl{eIkUbo`uu^SA*0CLTAYOPtso- zQ$QO1|1r>v|KbV%DWPBcpEN6BwfJqq!G!bV9^@W!OB|t{EYe4<%b!hvZgz$uP=R6h zR&j}^RD>zOK;nN(9laUfPOiV*LHZ&~70vovgL0b@&79{>_xT3kgLrVu`K{`T9UZ}- zS9bEiL#65G4qA7qpzQL{N`|j&JPoz!olGKEy!(5^SA@5yRzqx8PGZwHra(PSJ3qgm z;%U!4%%HCGUpO8&B_^VqI_UzmAu-A&Q6EZT1DDqm{x0LOqubL*GN8dKMC0%|OOz5* zrx~X2qdPxOH=zmYgk!Fn8dN@53|p|Mrtj+i0n(D22zD1Q8W)<*#_QoiH&*)$O2}*@ zq?S7w1yjPSJ-4@>`l3o&XdVR`o=5AV_5M-Pq~@dvp-f*Ag^%=EY-J5PQEOTnSPV{T znqYd+6wfTc`hi1zC#wq^>LfOA#_GT9*xdIap-pTGHAT}&a1&~Hh7#=rO6j((`{B2l z%WW(~&>-%WUvQJjPr8XxeGs(EeZmg|@EwBSHt-qB$2{3!VRIe8)IGlYQW zl=_oLItregw>npIdb+(qui<3iL9CPHdhO9ETdM}j{WysaYAtiEbtip?V( z3`_rDbpS4lC*gi~-wae=6u68>ZC?9THK8PzfYIK_1)GUIGWDECP(5j(JGd@eH+>m~ z<1#L85QpdtR;R(qf-`_8aI#QZ^RF&kV%kbd)oyyPAXSU#=^c_cPfdT)!yfv=!sbd$ z-gWjkT2WR>3}*;!64;;e71xdAJZnfc5eN8!5xvItVy26vulGY5?nQjksEXE`^s>zI z%?p7WA(EJbTxO_^WQIX2p)Y-cu_1|L2s5a3w%|s6nC7^0%|QydGdM0t;y{%G-}v`P zh){ej%KHrd0CCU+!)XCv6?g5IOS4SS`}E9#a`~zN5$xkFsMKK_BbSK}i%^_Bz?yVc z9qz=wj)fG?pKx#Ar^cCKrjj!du9XnZ5N~0W%n6fB?2@WbHar2Ah&nQ<9VTbM&8tc+ zN)2&7WFCSzn!1)U0sjKOfHX$ilHJ*s%M?wL$?~6O@J#LP83L$cR4d#>UKn;#AuDhT zvKi&(6#g6mI>&yX-_ssy+Vufn4%yu7mEM>~1~=j34ch(-7%VHcjst&R7O8(bpTqud z0|S10dp)=R(iK-+7eV?Yf;0>STb@Z2pkrbh-cS%zu>Og#*JvG?$D9ISt1J2FI@%uppnS$p>e8dPuSYsqQuv2PcocxThdUx9X z9woXCrRgw{%Y;2Wt%3Y-eI)YF_@PJcp8^tmLFZ;Lr%5CYw_7CWOe3?|;HFyAHfF$9 zy$hA^y%(=26K)0o<@F+4b6neciAGL5;>F{30}P$uKbQAX0t*#3BMvyM&XMFZSg4Y3 zT$a)pYpOB~%f{R_tUW~5p&x>?S$TyjG(^m@4li1=-CYqapjXi3<*-Rl;PZJVpW?E3$ zQBQ8TJly6cD;&nL+||D%kP^+%lFQkGX{o3}Er2BVv(kI~RxO*IVu`*oAA1?t5y=E6 zBNUkN3bw_o4o{h08fsa&(QY<^=Vu+`Gdkz_F-ro;x?Xb1#&n%Fj1u2_<&jr5%Z}O7 zlQApKN_SBQu_`kANhfZxKA_uA)@cG%s^#s?ChVBghK@{vTUyA@2p;4dJvETcmAuR@ z#+^U(4SWSH&8v(pVAtA@)<}JUo`^cfkLKg`sf@W8Yd zqy(3_(hDtDe+{!r{~Sos8e))Ka)6@bbsnQGAp)MfU%ddq4=Wkx?w`F~w`skLmIW5w zqx|ZSS*Yz4{uN$rknP6!+o_3*^Xs`E>KJF)?AK@Xi;bSfoi@ZD>Zi1A#|!Syjcsxt zW8|5K8WIVYh9K`;01bTpgOtS2a_Dz+Pzx%p)3Dg-k-~`9pF#IDo&vAZ_3!*~2vreb zgkWLWAU9}ntg$e1ai$;e_4il`g%4;+(6{vYHgZm2hd&m>nzNUyUZ;26FnLucrYsP` zw&lEhDQN@J?c%9RiJZ{l+5Fw@ki7QLj0f$gLZ4=&j}c?H;uDAn@dXi1mZjD-IoKLP z3&CY+SVJ}+e(fpw769naBPo+Iya|SP zlNtmrafS&leEOcLmTK|{e1IEOh*2q?A)7_HW4|*`%DThMx&{`f{Zjbe9Gopzu8}Sl zc_dfqjLo3z0j4gMuOfv{!XpxrN+M!RM`R3u#4xzVjt;1&*+Mo}f(Er79v9St>=k4T zaN7rdDxglN9xvF6oqxQw$LmTP#C$n(X&u(St{3$h+kU3AHL!L@ZqfA9;$9Sj(J>f3 zaUSY5!XYUq9*f*Soubb34?{As*CB61CSkIZzFUIY7C~}Ln9=vw4R@k|`27#QciOcl znf8yXSS-r84e1&7G3K9ZKP+V*jmU*|L-c=^x2o!MBAD;DqE;e4lUyU6AXDjrkN=|# zLh6vv=YIFAiNXI4H*^2nWl+J$*~s3(NYKX0R`35DU{%omYk-xzVU=UDebG~`YOS=2 zgrv?fhzBV>HYLa(4+6t0XOLfow86-QrD!JPGq)Q_quh&(=SeioMVex+Qf_6HGn4)J zcbCg$&bdy{&(6MLz-VC5>Dtk{#1W+AlDGkfXyj;AC>dTXPq;Wby+OJj50c=1NvT|} zFBlv81K0pXYAFQq;6o{ej&&=iQ1(R_M_mr6hzHAtVfuhSA*2UP9hjzVDNybVXW`id zhQyjo46;d{i8S)8BTB^gWi8vB310K*LKvKho>>R?MIJqyUaVthT!s&PaZ`G!LS8RC zVh%KKc?v|}0$xJ*%Vje`5h+;bG%RvPsS^wiH)w9C!ij9=P&Q=@)1HauWT1IGDLH#R z{%@C75GnR8SHKmrC&&Rk9+=IejN1_f7I+CsZ-b+wPdEnjq zDS{RS|6wu;tODPx++V4T^M-Vi_{!;g6KbGH#o9Bl6i5!~gc{;>66P0x1$Nwd_U-k|J8HHP zX9owtmLz@TG+LI;Opn%-435prJNnIm5u}T$k8WD4coMnITgj`tOowUiW1nemRsfI2C*C6OJ58`K7T!>op$io@It-NgIr43|ka*y!6yb(+Io43{Z4-00gW zH-P8?43DE|^#-&!vGfmq^L5Heg z+3UawwcuP+#gIry)5ZuAlpQS*#9=b|>xG=dumb&)Zd`MF#Fh7cGNX{TrsvBOcXJ?! z5hViY-Hwg35NFG&jJUr6fPjM~Z}G87q^i^zeW?3c`K^iJttqY-4-d>{zmCIX>tI8Y z2a2B$$QLoMt``li18T$Lkeez3_BCh%cxmVmlnBv;L4Y*}+cH(s5T;TF{xGRQxRPhu zREyZBoJ(GvaY{x|Iv540P@gm zCB=|Suw$9340irhLP779ua@M2FIE10|(FpE{-hl$BA8lE93 z3npxenl-FR{azkUu4B4SZcA?=iSyD{#B^;xVIMwcg2wD8XKF+gUo?8AM$~T~gwwVF z_iS!u$`wywpn$Q4>DHuWu4Kk2pes$oSW?l=lPNb(Wha0G+*~{8Y1xhwxW+{@*`x8H zr!p~}sxgfcZ4W00zUBCKjXyP`bPt|^neI@zU`J%Y=pg9f;N>BjJkWF#?VgPgo|)d| z?aYdHUZvbZ8D}M7L*?E)mosy`MD#|mtIMY>10f^`Ps}4@1Fv8fkE2XXvBxK|^3Zcd zG%Z3>ZX6(zwT)HXij&DYCl3BC5)tFR9X>Cc(o0dl;@b@291=yj?5ur z@y|wcx#m8^6V)b_n$oV7J`Ma3vvGR+PzxevE(L3 zbVWE?LJ(6Ixl>3-6bj^`rn7V{e>wPahCsKe1k!LYhkoh|5fY>8ER6j zX#Ob;MG-^)1{XYKLXrbJ>Qo7OCgow?G}Ccr5Y6Ds2(TMFxZ^BU`k#CQQ<&XS%lT@F zU_z`zEvA%laGa|pzW#O02+Chh7I2!grmKJ93is4gs*THZuF&5Kj32E4yFTD#)QZgW*><$$5yF-d> zgBVFQQnjI;obmCARH;Z6=%Y|~=5(NLElR4AAp+r~O16#5A(hZM=R`Q)4dqOXy6`l^ z9cCQ>e3Q+A^!B6__3A#;Em^3FN-AbIaCifKJ&@oFtE+;X%8tuQ*|~I0(Yv8_zHw?H zJk!QVGq*-IEO_{rE&3ZStDzPk!LpJ;nIx;?Jy|jdXu=JfXy>DC%^X6sP(QeIk(1{P zQ-#R}gI$p(Uh|Ucg@b;6wQ4^1*%H-sVdO@kQAhdD9&&VylQPr}8My1XT|?idldFBq z4Rqz^^I6i-uG?@stu`O|S_^y*wDWUR*jKEWp3EzL=i%Qsm-C?<0CBdVF~A)Wgvu7* z|2O8EQW7R7@=R4_){#wT@t}T3?*wwBSOcIR_-M;_G?~IxQ97U0+cQ1;sReZFX+cXI z#{onjj|*lq^Duhgqf{yW_~#aWJT?5l!)UzSnXA~hA*tKkOm58oEP8o&J7dXI1Zv~`zuM%DXZ?CZCX*3$cKMowU zFkaCaGtScEyx|?S9^2E0+9$Kn-AV-)x=AVB&=V;aOJexj6uE_Ut$h2zB^!rU=|`VQ z)y+fIWeg6RgV6iv9wbR#FwxzfcwI;!PVLoW;?R85=K5)OAPJxFLGnb9+QMfKA74|^ z3}dzeT-nbV_Ae?0TbPn`i%HsYSM@??!fyy|wx;#B2D#f|S`EmwW4O#gw?;VcTDOOc zIPa5ZPF7F_eBgzf0!{bP_!WTqv?k9`;zKM*S77={=hPQY(rK%&flrFbP?68mnKw=YsNK^r#*mOH%X)efh=IP6s)YmBFt=%dy zEuC`*T;4!LmZYulf{@)SCS4VdPAY%1*dKQT89eBni&X69q zR%H)v=J|j)rM!%VoT$aD!1;^_^+|!VWeJQHUxqDm)-V{C;y@y3^KAfGitQ!8RFN@9 zDEhm}w@Kn8&@sAm#)LDYgZ2)kQ3~~H4D~IIm<4f&f zi8zpE7{M-?F!GqvdHbQ$4jh`H5kUtC37U=>yN~O(3mCL3nB<}!%b6h6`|pVyec~+0UFeLm}%?su672JtT2UbtLt~KCotow^zUL-`jB(C zdk%_I>V=v06|t*Y{VRsn?SY_s9-0zZJ8Z#c5sp9)bY>4J6fXVxJ-gw?AA*b*L4=;L znnYSfUNuJuM7!zC2sz=mf@Ja6#4s7SdFuTsFL>9>JpK5i=~I17R8mh1O&4i3I~)UD z4Ny;OA$Gw(UenZJSlFSPYXpWLTKjY}rW^ncNOV}bmUDaL3wlmN?;W6DGnijB=T0Ws zPrX1ss-%1{or`A`WnMJ`yivb4tDCxm;g%~>d(s%Q@NiEUTUGEryC`@V$|K#g<)`V+ zq*p>?ES)(pikRk&zi9tzQ@-ezMZ!V<_)&@Tcl`Ws98(NztiKt#Bdy>+z7F3yrm(Al zk?miC=091Nll;VA+o8AtSIiGTM0F+<-JNShQi6hLNZ?f-nQ zhN97amOsk^4->K@X>-6m&h)T3+P`~%?&WEQqQW=8i^#mc<$&N=LTfZwb{PT}%-d*h zAW1$|?>2B2I(eOvKTOA8g0f~4EI)jGH|ILJskM0E8b>+?-(06l9q-&D;^?n`v$817 z>&I#?iPgn{Nb9jWt^MkhjlywKGR zCx0UGgnRb-q+=NAe~{8N19R|05j-`CmYm*?K4ca!;o9j=1w2H7nuz`ELV~`sojodu zJCx(rsea$YTo0XP9Yq9A(2UhCE)4|J=Brrx)tfzPpoVWzYMI4W+>gol4t!%otXb7H zP|8hs8;V9~tz=K=umNaj8>)P3AKKVRtG?tom?TX$dm!Z)B2;jHwzzgFW#%0Y!Y@mn zpnyI1k9Lb2;pwp1H*YrlTbc52UVZ%MaDG1${ugytId`5Hf%`m29aTZ%>@y=Lw#ud6 z8D)|&BTs4dBZ&?RbI5bf^V>qIvqLf*6O9LS^L+$=#j|q%dFJq1(eo}=fh_5OCO^Mgl3m>=t#7gys2V#;Us0VD_qi8%vFj?%Y{%^Q)pp|>DK z){cey%O3$J*ND^wJE3DjL^oVJBkAaJhZ7_qB+#a9=-HBc)g1{1shy}FU!(`Xtg>ZAnm^lCcx2N zoO!tCc9yG}v1>3*G+!=j^;0|582gtMtsma!7kO-L;PqfuD-w5aKk~}b1Tz*}z1|@N z$IrVE1)^qw`U}!q)u~iig0~dfs1u=+L-uryL5`iOt{$~gju(sWC(8-YykI!@;vakX zGOWFS4N5Fr@Z`zd2ak`FzH%HTgSRiPM`dWYa=UK~_Vrnll{OQIo9G0GNpA&gIfT~%yv^B7Tq8eW?$Zetgw`zHE z;Qfz>%9SOHd6O|fwpemL* z`Zmm?wUS#;gFBC=>X9u*kkJOBMX zJrm+vkHTq)OMXhWtp%LF!#ShRL#AiGXkfsvW@#PbJwiVV5jW(BIA!4^h;|#Eni!!PlP)?KmmkZ)(jX~gC^=G(&Q{)_3b3C7xM|d4zBxA)sn>b<+ z5QzfxDdtZPMqN^XN0nX~kP9ng@XT_9c*|`wsjVu5aFPgOSdWR z?&Hs!C)yqWwZRdJ;=j)G1)As`_<^l<-vk9pZRrj&vV_TtGH?yKtF|zJ$akgjQ6!-r zic3i_LZ;Xf(?z1B*c#Nds~jIo_xJa20oI>rHUOmrAS}Db_A~9RB5_O`{Z@WMip|!m-LlTN5f4+9yXst| zwVvZk@g40pYs@e5?m-@C04XvQwM&f_9m%Azw5ieiAnvGQuv(kYK}?P#URX_Bo1RcL zK9}z9eBrN=!LZkP!3@p7KqlmtlB+y(w$QZKDyFT3FG_-iM>p2{GQWax+$i5s2fUkIHwP= zM46;myQb2BT9e5?B1dJ>#Z(|vy&7i;B-xI^_m^c8!f_tKj?(SpjE{fllpT81RF$f*R(cdL1YlFkP z`^PrPHscnxwC}{%{9Du0ea&oYZi257S-geV_x+Pkj}aBp^WiUI{INl z+BY^ZK5e7pY0IJ8VajES`zhz^^BJ<2PKEh?Co>oy%Hm`=G#GDc;xGgYl}&`X^jQp0 zRBHf@#$Ia=Z8>+}AbJ8zm8ntRpD-^EQkA%$Xas45^rzN9BT&X}>r~u9s*xP6M)P4b zBU9ijuYnxG6nEcDdZT5W#x!l1z_8l*tW3fAhFUwVREi!)VyBHIT3x1I&ETAMU%l!u zg);(sff`l?@@dTq1%DJhQ;GI~C!Iy5oAKkjgx$uqe%FC;qV5a{ZkqmN6IRE`i$cF4 z8uVg*_m-nugj5aKQ~7Q#>%lOLp}4vv=Q*&VlzM!Ivs4CweVB9*K+lV(FO9ZiJ!+{D_LmP>46@gn%dkr!5hF&NZ9_pZd zG+CtdI%c$)SX!h!UN!|3G`2zMpkSOK>}uP@jDzm+QTrbaH+lRU;O+%IT{GF=1zc8# z%l7#U;#P~RM|4gb0W)<_dY1XW8ZbfCPNN|7<{ z41N7HhsNI1JH}>|Yp_t!IL3`K@IQ(ygX^sng=+lv#|s5ir49VGOf~M(YTa;BxtPe~sA_GZ0y!nP zD%n{ea@+pfTeP%CBx6*aMs+leBdXAP-IOzzMBGJa%V*m&J)N)q)i)5((5D7O)S|1$ zt5BMj@X#_h#@!kAK=x-sRM4=C>7poO!7A?7PY(%PsH?fsKGA(RaM<}N@XSKyu!djH zr?WpQM`=7`c1<(^X=fWFf?IEaG+cE-CA7kTlC+=qKTSaww&{?(K(e7SyK&_?&KC4>ysFA;)mlCu_0;PAd2cZDfhH|Fi?Y9E6Z!Pwc@v%H*y8Yd_<`h>{-Ium<-ACcm24xKf{&E)q1*72 z`N}yNXAzoHKXmC#+ZxuSo#|@QAuU(s>X|_+SPg;w{0BZs2aKo{{nnHH|Mrn7^ZzUi z{s%r0GBVb4vUL2vD%BrV4_m|$^e<|jQ=%6-T~Xf+KEv#K;#J*VUn#tm;NdVUJQk+l zV%ua`b+vAX!UX8Vz{GeK@w`C%w{4c@r*`BD~|bPCLc$Rd6Ib< z&eKNn9d8d(O#u#l5})PUi|zdjFt6ISyE5>0sKx|+pzWcBfPgem`n)07aCS36G5fKQ zF1yxSSVsdMSkFKqxVw|2*lgoTttqrGpZ z8cx*R1bY=QT;zKe1ksEu%fgGL-Pw7gs%-)MrVH)J!RXZT%4U*}PUJT*ZImKdA=Or= zYbAkB!NxihJZ^l|VPocn#o95Vi(+0dCG;eu2oFKA<5$qX$sc(r*J2JvfUCKmnx|nEQ5Vkv{!1VLoA4#LNV&G|z7pX{1 zOD*RC6X~@Hc|-#WkWCcSgN$qm<^jz;`+U6W9&t6jxk2o+yrS;j7^NHpD5orm=`J_7!eOy3()&3G?p)|gO|5x{hQ=H zHm?zmc2^WFt`@O_Xd_w%oRjT!gl!rVqkAyxoqXWtGo`#tU<@Ye;?XnYcnp{mAc_g_7aVq)5b{EF zl!FtL2y%G#W_ld)$L~X8@WB4^XeB0Mu<7}F|Hr(h9J>5h7QrUvZpkyc&9CV}zBD6= zlmi(EH+1u2u%~w^Lp7G6$SS+4oD;uHa>iQ)9@&mD1!57zGy>r!AJPHnAjvcpVn&-1 zW;5R1R)TX0M&jhk;IV}Y$n!+uwgv`ivqXhLRWnwEx<#?J&V)nr<56ZBJcYHUF|Wb{ zC!PrjE7p16l(+tAl*>k>z2?-3=~)F0ZrTU(_G-Dp0@7;eTg8~c-w*2EJMk3Nd&my- z^R)A%(S4D;RnCTaB}PiWiLx-8y1k`~7U*OP7;+YO6A~y9jc6M@>&l^w4GhKe6f>x~ zk2;DQdckh=6&N}MeD6D!+8*5aJ(}Jkih_l~gZ73@>m2O-&~h25Je!UD0zc=I5a zyXOADT!JuqL^xH|d5sJn8kQ{{4l=Mr6oggXnCd9Sz|5Qph#oIVEAdxV!#Ao#Zb@mzTvuss8dqkSrM$f%C)snDCgB5DN@Z0|59l~~Ai7eOP&NStleAw)2%XLe z{0T8r;!lKcQjYS^Dux-DT(~XyaZ*n;qn%0tW1UCeryg6pemcSZ30YgGv;z=6t*dcN z7CsC>2p65#I*tn#-Je_z5!sJ}z~#>iO>cO&LeqN%FM-YEm_Bem-Mgr+L6sS_pnd=^ za+01QGDc<`>1J6L8|Cw`B0^_@RAk^eyaE)%CF z6MO00IQPVosE^6j8pYC;FoRn#(vMRqfQFeHYevutNMZLn8^kHD@2`>N4S0_^SVdF? zlHb*OfN&<<7;1`LQe;W6CS*yE)(MPQm&CT7E~HVKMFMWfXD!oyn8spKF%}B*dRxf* z%rLkEXIZpdvp#0Q0lT=Q}|TdRUUCDFh=81cMBf5HKJ!H&j^i)<{TPB zr683QiRO;zw|N0-;QbjZ%HIo0bDuTofZ|pl6|Fp5_zA6DYiS4b$Jog6*?aBwGJEyg zV;qEu!J=2A3TLHXWD3uQPa$~#6MtdZemGdSgJqG0vK8(i$_Q9)-5A&Wm`2^(3+XYHT>9JssmQa^7BU?^`K z0<^u;3Raq+eNu7I0dp`#>Y`|K18ZQ2NTYOJe9S%%&?TG9HYw&R4yeTm*JJ{C8KPCx zpR|+DU=OHe3D=|nNT1d>-$4l|4WCIaN9~B%54^%#q76wKe4^IHeQE-#w?yNK{h3ef zpVkFYNQ5XMX9+3G=ZZ)YvLO;e6e&X~B>$CDU>+|*`->0D#4Z*GTa-RnGz_P}WWdfH zKeOL0{Q<#lY9D|b{?`blYr-!epFs=PjFXPRwouko-<$@7cmE_r?NFU>*M;!KJ?Unc z9%EL-&EW0Y^&8D*&>n-gYY!H_d%7+Cn0?s`pwHg}u}!(}3=~3^g;WLa=@XKvX%SUB zi;(-NNo8hL=t$Q-SaLivN~6FSH+(gZQrzw#_Gvk3A@5uv^gAWjJm7Uul!^=5MvmvM zE={xA10CK4m^+(AA}#SQ7Lk_>ThJJr=3CmE6qyV zwr$(CZJU+0?MmCWGb_zX+qU`T-hKP@cl(a6bM6@T$2-P)|Hg{-#Ecp7%o+CEDl)xz zQ&;@3xwNlSkaTnNXz!KtU>jHI_(Qz*g(l17vk&quWAw$h2IsR-vR9acmR1o0R}{=} zX|PD2wSF7V5skP4ZBilSSyd*4RM&zPxsF>z_5=4Xf~l-+ZB6HkT#`ll)4<^md(r;{ zaMI?Ej^;L|O73>X|2A<5itUu?r$Z9qZ6-Ds%q>9xLJ<5>h*UyMF#|Aw(5s}TQQO{I z1|6nNEb}vFFmRv;=t?g1RE}P`umAp?eOUEo@o|{+2fjyN+p=x`8Ow!psT0U=+%|9ovp;J=5SbT0()ch2L-sqFjB8=gKtWDd`t_snd91ww^5owv8 zS-*aNdp-mJB>miyG#T2!1%D;G2{Eqz)~lMx4yuK{#|+otGKdLToe8PL7QFUt#VV0q zP8;C+LcL6@^IgPeWY%Ft;B(%D?O!Q>hWRv&{PhCr{`eA@{s%9?+1kL^;on-8BsEVb zqF#QdW|An{QTHpSL$HJls`hXU{3Vv@>R$S>f2FXO3rGKCUmiUcO&E zN>6@14v2rFyn_ACe6$eDrywi=>dB0RUrCVP8`6L~QNzSjhmo8&42%7$bhcQ7)`}a^9uM(_m&Tx}5*HqikBZk@W;mGfRcv?wM)Fu2 z&Jf|vgBd+f^)}Q~9(0$I|FE6d;4Vg2B&ibC!t@V9K%UYaa^CDARi?E_)9~wxU<)th z!9^yfT-iZ+n|{bg7gwU)G!GEt zG!n;@xG2rZK>uZ$v?eRpkTe&QUz(ZrI*gD-oLcIXDAlWa1#HK#!yJggNzxgRDkzgI zZ2c{9M-@<-$7*@?8^%P%A0#JN%mWDYrz9Z4y`z&aV6qt-^!Yrl+6Nb8i^@I;X(Qi7=o+d^PgO}<3@@`jbThN;S)+OiBu-hDt; zR^H_qjR)hyBG04qReH;|ga%QYvjbYjW#$~fwD|9dEXy-FxP2(lkg2cwA^M`jvXy0| z0>S}Qa3Z3|EJBAIpQrmqtT-%KhKXJnvD+=2#X?dI&;M&aL8;o_>bNA#E^3Y)N_bjNu${L zG%=?g&0kY@;3*y=jsKEmCa#w%jYhqWm&!J6xlNe3F3>-IV(B7u+@zjfUb2)w^L*-( z>eRwRxsWI#e}MGCbL8Dy7!h?$h?`6`WX{ubXIj=aJ!jnIHgRRB9X^|2YbQJbuAPK1 z3GOfyKq$c_PfcKLVb7>BShs1cLgo;cuh~IJUhz~s2v!pzxMa9Dd=ol*R~nwWas*M8 znqh^c;t(z{#MW?1T`JtV8L?CprDTbua7K1CWI@?9uS?-A-bHm&9;Usf1d$LMtae6o zlg6nody0zQ+;Pn>(jF|^dF1%`!Anu{tK5b9M7BkFIOn>}znpdhO!-ZCSob!VZ(U1c++P=xuf}}fUDcrRL8PiQKi~nJ>fq8+-mh;qXK>^(h%*Oezh3R zDB!WkD1%Im$vNNgH_Q8dgD6X-v1sb_+ES$fgk?GWRQkj5j6k=iQG@&_!_v+|vL(SR z{q7l>d+t57qFrZ(G6&?dgv-h~;nXsbrGu01 z?1=U8jt>e|nVS@=(hQ23(nb1~NsVV3%+*XJ2@KK0N}heQdxI8=ijNwNbwyX^g2^Z) zjE8Yg5vx&A6^|ixEEz1sWK)}h3Y9iEeDZj@_18<3`bWuaH5E7M&oi)Gw^YUt*PB5h zHzqOPu-IAL26G5SyQJMk?5d(J=W60yJ%w$MylhAqa+L7zY0v{55@{j(yey1BY<_^1 zhc*~O4IAaS#Da#8C@C=$0aeecYWw8@xWNeEipUpO!0GsT<;Tk6HC7*BNxaBo-C+4O z6_~(%#FB1>1$vnRWtRb%;oJ7GIsg;nCo%oZF1rvNL7XlTFCr!B|bdcS3j;&wB!h$!Xq#oCpYh3k8@{64_g#Gt3MfDeF%`Hj3qCK2`!ne2N$*72;#;u1M!cx2J>i7`h@P+3nd79G)zay?u5{LqxFKH zRyn{)$|$cUQT-M#D6Uy{dme%25`)Ff0(Bpn?e2Mm5ipNaY5D~Byh+dlJtu?AE(!^L6ELrL2$}5)zfw1y+XfbZ% zHo$z=&}>)j#AQ9F0548#dof{^+2qjhg%4FkLl*YX%`ZF^I=;p4ddAQ9UUbo{vCw+T zp&BV5T*LOeOqn8~Gq>4-HQ~_r4_Dx$0$txU2Q-t?<9ISyx45G-!fU9vh!GSl3n1*^ zSq;8(Y65Yu3>5y*F7GdrS23TzFnwNviMIq_bP&}F(U-_BI0G+~tuLCY0m?4CgQ_@9 zA#>k|KEJ=x!V6GzqAHr4xpEQ5GfemKqj6iScNs?ySvP#I52CtJWRJ`se0N*LQ^6HH zrz<1ekBU6UTfh>$rb{PaOolZ$r>7cwTw(}T`ao2a2stz$p5cCo-}(Go&ATQvW3By* z%q{q%fC9^Z502y-kC8ca-y`X4Dtd zUCaU=h;dW)8v?c@!QQ$WF=J`d_I2 zf6eNZB^Br7zD9Q9o~ul1z+QMyeEh4y2uMf;;jqBM0H#z7dF671A}a+X=s0VX2#>^t5&=KA2AK1NBe9u_1GsH#^T#eHb~iq=F(tfn8XI3 zzk&)Htu;iBc)2Xt72PdEtNUkrJ3hq4J)jNc?Z(`JXpbE&WG3HW&817Ks0A~&osyK} z*Fq|WQH;pt+}z#01!hwQlb;Z3i$^;q!Ub^ErLs6=n`_$03xtL1<7r4Yc@NZu5lo_Q zB&IQoSd*43vb;0bg+&#gR~&HDGeC(fG#x|{tB!e^h`gSQNjZ#8a+({?BOT6>;e20R z@ZWX|o}(s1W-^2wb_Wq``ME_vL(Ucq1Cl~NZnxz+ujxKUcsZekF7r<8(}u)H3E}|J zeoU07t#7t2@}(RL)1fHIZrJBU-W`HGK!}EXri$FKo9<7qWoov09f*d}v=QfziDr7V zA}+iy&){_VjrO;BkYN7;RH6TdLJl)x$yJLq09wm&w2|WmLVvb~vO@~K)Ndw})@+-? zV>izHPZjo$%!`&l-skQ{(XLlY?;;$I2gDh6@tF>O1jWfJa*T2d@!$iqB>5+1QA-zz zE&gX5@dKB13yu)6v1$&q5*W|wHs3L(?Ajyq{e(OZ%L3HwCvm;JEVDJqc9(SYiH|49 zB~J~yvwZpB7?G$RZlmQGlohBa%Xxgf?2_`UPQM&v1YI~C;q{+)Fb-U`faY=*ar4Gc zPyrvzS7|7pkp8Da2z~MvE8pP5zKOyYTvK!!SI;Cs%68I(nl$` z&>oHsY_6#r>Kb=764>T9&ESGe5_Bab-yEZG$%h+sQBWKRkj?<(C;ztYK zG(TQYD^?K3PNod0$wNgzM#ZSI6AT?YcB#;JHL2&Mepk1lz`q81Bcm@D2pEvM$zqs# zoanfHdAI}o=}!!mj|6P!j-+5)~sTdmz!J4Ejkx9owr4Q!OAm|;&1$$lA6?J}wKHTz_= zdiD^pT%-jz4?&G*k(6q$bgx@HV6X9H2zao&D9aGu{Wj#7z(f%m!!pAPQ{5<%wwfnE zi-$n*m&$~`Zh*Z#t#3qo`{kglK|p}s~8!w(o)^MC2&I=r)Ytv&D$ZCN6N!N zx=dInk;%-8^A>ueE#2!HsJ9MR+2}9N5#7Wf=MPx zen0KUVl)o$iFQUjUwJk3y3+EG8&CG>$R~DWm6%pei$_rhDnsfCx-RTUGICjyI5QLk z@C&OXQm0(3U6E>!1&TOgZHWYn(Z_WV%bX0MRe`i^=A;;w@AM(Te2Gg`G`gYOMhjds zmhh^Dv)4>x4}RZ(`zQ^`E-loNl)$NE+u@gLk6`;hrSbzYW(ETgst_u2vs9!Pf z{bQN?zlr%j#drSCn1{FU)B5iaQ$W(=AYF4TTki}kqc4jNbk8Pi^}=4|4`gqVx4Ipv z&S)#&Jx(2>{t&DHyQ2`jk^K+w-9HPNvRIYmzG;wpp&tzb# zw8mq6UA~<)-Voi=JotJ-Pe|OID?+F~me0!PUzGUUvMucQB%g`Jf|FXxuazx%gzRW{+0XU2-Bo|nD= zwn3bwH$g++woMk^^c%=uK`#z*kwyD|8uWh(;l%aItnz)agi+X1T8aYXp>i!sVq3tw z5?T~|T0g?YVsRp4!($j(e`fv~u0~vcw3NsBThRXol$%O>=QA?`ItrxcqDrC-V_%WvpF3 zACUjmxO7m59AQL0#Yd&d5UGqY(yyHxqcr9hq#t~(8$gk$Yl%{X?bQn%fLYd5{RwW7 zSGgDVOQE|wf5}(d#U>2^T1HzU&T4>5T6mQ1bMgokoIlxO#)RyeXj{F616|O$=dv6& z_T+-6D_6`gAAbfKs-eXGM#3qbSTdDNrMibE4rsLj_Fh=#6^w04_ERCAV7YMx2-4Kf z@{w%1*+6BS^Y)QCQe=>cE1<(N6(?vlfUx72r=BC}=S)Bu2f*}oD&tg?Ts;wuqK z{-2$A|5VCR{M$*DJE6ti0{XkPAbG=nF3%ZJRh*vRd>O)byjY2P@H~U#B|$s;p*URr zv*&MoUSi7y;6wxIF#>D$ghU2Vzh^Toan~Ka4mZ-itbE_U*`YQCL#e6QOA8_|GAGs$ z=qvZ72Vzp#SWMeV4q78)Qm~*?w0B)4a0l1vcj?Kk{6c-t;xaraB{wg29bY#hol12N*Kay~3`!_~SDq%fv+wuI z>eyG>#zV4wYG0B;hE#Q3gop9M7=U&)m^}8wOpr*()w6R(X5n>Xeta&zY%NU zM@u+Bm(>Z$j*e&z9!oW)n`(`?_k`A) z&VlUBci9@CkNLFcK85UGVE=C3MMx^KF%g)D6?G;+MZyc!b^=m+rqZ>iUm& z`~M)N_U|?He|0SX%%@Z~d+D5lePtZ$To>}jpHy;)1nTA#1ZfI`GKEzH!`Q+!(NS+? z22-%PRI#B0U{~^?r!D^RHDVRDm)xR`2jf~(@6V^Nu-{&%g{&m>mMFGKvP0b{_sg-fv z<=LCn!Z1>jfYhI9ppJ||(Fr|Rw%gi;xrlZXF5!uE(#wucg;q5cli-sQlDvK&DqptH zyXVpPsV-&`8wkVeps4NsX6ISz@3WZLxa5Iv2z$zqT*DP`QW$w7b=qf(q78ra+;p_B2r~#8ol%0yf7Lx<{&g&|!7Hwwd?gX;AGNT_{xc90cC#~g z_?jPnS)lzRf2?DBWdi;xOr_M|O^qjm`Sdt<1YowacLo*)W%O~uui=;ig;2{N4b=y| zU`K+?(XnXdSSufxEY_K_!8zDB>sFp>GvKZxOLuz~U7`@)qK3=7U4GX}qxS;!$9`%g#WB z0)rd7w*n$TxJ_mWpR-M`F|@tk>l8$9Sj64KXYROVo$?G!Xu2uEi{+c{!dcT)I?6qg zDCb(<2wE>}dHeLr@wZEixg+?Fu9mlPi)eBqv?sA9IqcM}Z9I<_?Z0K@j|s(WQjIUP#VhkGs{eUZ_y;yY#N6s@z`;XX0$@EG9$|G?vIt`^s1zo`+ zh=gwRWeH=-!}+5$Sv-1Z8J#_gY;@4SG@^L(;UcfgYb0XQYE81IIKm#DzV0ISpuM9V z(zgYQVfL@`p&7wicFv7jG%Li=TC!}r+)0TgKaU>ExuZBfFs0RYrCw|9Gi}Q3!vFpX_6QP%Iyd zmlXK)1?amf*bC(|`-x+LFgcC1j_{k0=%mM>;W2effKK>5ArFz5_pdZ;m~oN%{S`FT zKL+g&Iwk*m(EbsvEG2DOOwlhf8x|c;`q=cCU>`U{0Siov6yS6wJq&@&zyUtu{IY_| zvcW74m{aWrow>WxxU#N0+&$E**$@>-e)EExWHIj}Sqldf*Y6M_%B2;ZjDHyhOuk>e z-B02A0=9%sK|^ml00uk>g;8>t?4~lp3DZZr8^0)pm9M*DLP= zqPjmj1lD!xGT!jsZ=+V#i28n9m4=Bz&5b-&VMCLl*>&-VXV!CK|BIjIGv6&dz-P*; z>WMkjsLoZrU+SSn!^ybLhuMH8-&S%nqZ#!;LX~6vkW>0|7BGLOVXcgaKKR@>!A3`0 za)+xZfi0qzXo#M~?t$(t-gqS4oVuk^B|w^jyJVEQ`eF&Nc*QY}24&7=tWGJ_*l$Bm z1-8;OR%S=LBSi?{Yamrhq*6l>%d^+9qoncMlUNc5fE^KTpJ#%j$eMKBPAe_h&yX=^ zkJmBX20L(BPqquitbtID&E;Ip-S7HyUf;y0;U)8O@&-yO+sFVIl(D+8ai`U}{XkZ3 zyrPULnk~?KYGaTrClw!@he{s0M8NTrXOrqX;k^1gkar?(yVuX0UDl6aoc#|jo-H21 zG1|~8u<^YIJO=~RbcDDt)Fb!cBabpm*xL7zrXose*4hX+8wb>|&G%UKQ7q_DVbJbC zV47R>j>+O`p*&Xc3zVr#JEqapA%;gj-i8#e$fMM0`qEv&pQJ{qq`Wflg*%V2C{d@4 zYlddDbc4hnNWndXkzlVjehjW*VZ~w=Os-#6eJ}=`w4W*|*@7__co@(3KhD6NMrp+i zvQl;9r&WdCFi@|)o9Mj&?;iCfnrI>K_1eRfHx6k)R2jCC9=QkhW&-N9`uA~*>@}Mn zY0KW9Z_j@KticHaWB@l#gN1xw?W0TQf$skv;;yS_B;%3l$}WTLo)}>FUmZRM<2l|x$QnL?4METtpO$oKx3Q~0;bk1_f(^q||N7od zURR@1zHkfhA8$!e{O7VGZfaxeU@WNbX#8J=CrQQf>vja1kBmTFEEObnE;Jk z1*(MKtOAWSRUrkEb*D2#@o}FCs|^dD+c9bPGtgZ^G_KQ-Jr>6<(hPdB&vgLr=(RU1 z6wz2;kI~J=vSaok`{jA&-sazzBP`tz1i?1+8HY`Hf^S=j^>Y2PFDcw;LBBLc-EeWq zo?=mX!wG|9+z;?Eqb3ZX;rHAckU|CsarT$Fq6LQui>T{8vL_HShOJbV(5xV>q(GAW z^ZaFzmH=nu*XOh7{p=VT@#I+bsm1*UB5g*O9rWc_Zdda787oK9jIEV1$vE5S?L;Y~ z>Du&VrZUnMn;>Ez07NLOgG~;=4zM&?Zwb?$gW~8@mX1}S;JO{y4&>hLYR|x-i60Hi zOfG0>#xfb>S9po-NPbA1kiRHQjvk~}B7+bp78zDUm8j1pJ_P0_Nz@U=-neg^_xZD0 zWI8siLHez6QR2N6@_F!eB-v@F^tp=zJQBsAZIt5a5wmEbR4A93a+#(@7iAQ##uHe< z5^%xEVV&yKl9k4#OSc|yq&pW>vZF|6Nfnh5ET|tIe=d`d+C`BB$2VE*p=S=J^*p{H~S1p1X{K(0|l28u`G?~t% zQhGwdu3l!v)}`iPMSUnWnkmd4E7=P+DJ^BJ(M*P+xd`nYfZ57Hj~Hw$;i`bgVw!ZG znYpmeNu0q-ttn$hEdGL;mYWBKx^!0~UW(R>mo(a44+&=M*K63a=`Bck%zoK3^q}LG zqYPq6!H^2a20tA@L9-JdF3X?KN>^eKI)MybzSLt%QAA(3<%q1iRTeHTRoW7!3E5>d z!h@_1+7-4+VZzqLnTmYG({r0132qb(|C3Ksj@U(@j9OS)hH{-RYapt`@s-$1wVLm8 zCOzk3V+ezykyTq-r@V<6NLF;MU5L$!_t$9yhWca4{Av4e6ZKKS&jcS>PPjfvCcqWE zmd0N$bDE^wAl!t<)S<;paBgWd<@{d??%T6z>La(2J4&6D4 zC(Sc(LyiMYaGQ5wC~~lKi08$$ja6S4bhpvse!T%P*MC>uBApMDMjZu|XC-CPF;0QE z=%||3O$kSEEWPJ0^a&47TG4J^8n$K%eqdLc@!S#DDr(LZBuVArjHUq5<+2{dvUBBeG`+7AK3v_pwZ^P0U~kn;$+eGGYfbyzkzQi^xvgm>ozmv}Mo?Ffp0`phP3N;Rj0@neM{ znP%bJay|ca+WM{TckgTSZ;3R=-;P?n%MvFfvM+b2AD>w!04kZnXLxV@%z*CY!7lPY zeE&KdOUAM#2EO1pH1wYUS>$3{RVBo|2-+DIk=Um^OFPE2Ra&Jh#3TzSHVas!^Vy~A3w z+HFdiBU_(BIRM&Q*Sk~r$ofl+6g!xGQ?r(Sb)v-56;5tr5jL?YICBg<7UL7xH1AM~x<&UJ*cJBZN?bWIn7%@LO4#L3=CF z7RLGCD5}nFxr)w7=sj{AF+Ra(Ol%Nv&Dq<}fuL`nmBPs%Q{eAqR7nV?{OxYOi6A>+JhG&mVy6NcexiQ(wBckcFyO6mi{Jwn%698JomgtMYYNq5bTzcB1r$ghd zUEkFxjg0Lb<)#=acP#0!KNtkqike;$mDf(H+1HAgg}!$O2zB!Vw4u3=#}Vg#{)5=$ z3Q$~>`{J?|{%Gp;hh@BfW$EAE(f{ms{sG;S6s2Xq*iG+KHgyDOG{ASzSva$uX*TPa zuvm(D3HiAPzJWqg(u$s~rKHa7UEL%g;gek6pS)!!6$#TU{LJ_I9rdpp;~iPcxV+uo zU{{d$SPW_t@#~`H{U+?_I?JZht^q*3HGJ(m{XaL6^@oo=8uDLvv>dn$#k#MJ-Fo#J zymSNGvk`>}3|e%n8e*~(P0^Bek_@nrbP-!jXqh=_j_ z6p)g;BU-SDOfwS{&!;JOf@V|^F-u&5$LxM0Qq67(U_dSTr;Y631mlXr!#YQ$3M-Vt z7ll$p{ym{c6NOK?`RV{u{zyjrp>_UOPDvX7o5*vNqPFbnmxPUsptJ-i^^Ro#KN-jh z68sWQ1cfwsK{z0+Qb+NieyOAP%J1&ALg1+;%MV&^4` zo8Kq1c1<)Jh@R0%H{7>IZG^_-3`*_gw#n#z^j3iQg}QjNMhlP2VG_g$iRicISY9y8 zB@j3mqtU;KAzjKjM9oP!-)3pNmnzVwCDdRx4s;ct;P@6=m$gY7(U}+^1#3uWs10(6 z&Im!Uh^FZi(mw;uyrx_(Vct>8zwwVe@9pM+mOh+=Fr364j^zNX96{K5U{Pf#56hGzG5rQ{ZUskvL8Cjrp*8!mBqeaJetHrz#5h55 zz!;|I=PIlLmq*Hf0J_UTYkiHe#*?)C&YoT}43r}rUVt=A!|UJaD)wEeKJ|1ehhEqb zhlAw$#@-=&hFL)kY0*p+%91YUZwEI-$js4^uS9wOBlY<|N|b-3%-=`QKUo7!Swwlb zkKhfnc91;^vR~5Vs{+DEfh=fz;^25;!U)n*Yc?@0(--mQD1)S*!L%Z}%obuTL_BC6 z17Ny$VCcJE0R`RN*tREIQb;=0~F#W3Qz{)K!a&p$}a}g2nb{)lUs( z6lp=v)?Qd>P!nNHF}N)?&gHx&q%xL2*WP1GP)T=Jsn^z;GF9x;nN~n=(t5o%`Gz?`LUcmNN8o~E9tJA{)$P@q2;-^bDrc`Y`32mwh{*-;rmF6dHkQEl{o)8_A?r63oA0fIjdxALiM z4kC!AVuwx$DU+|aAI_w8fnpwn)JP!X1>7jW0GOiAL(a-KO@JiKSw<{fiszFz#^_gJq>3h9$b8gLolfHuNLb zOtUb>^TCY7{;p4vvNOobL7p^i5L1XuqPEt3r(NwJ)otH%Mi)k{pI9NWi1eU3pj*bM zHU)EGp?DKQ1FV<4LHva}JA^3fZ@=of%^!Cw{vcrWue0~Rp8l<-D@)sA z3ZwZ9ZFuZXu-LDY1S!nI&F;j=73&^{M2Xw48|)MzgoPhj??R6>ZLFJh!jP-_fRk?Z z0Tcv^;msHlfAFtjB7nv60r~+e@N?B~uqkWrnZRC-bKUw(+;%a(zIShWfo(zCpo#5D z#qU)31+b+IKu?m=heJWOmkbaGA^)x@*!>O!I(bZnNtg6Mw!zfGUA|lAm$>3CIgE_0 z4A7sJg315;`&&Cl6(sb6^<%Ua3;;m=LECIKQ>BVz6R^wzX0{?YPvV60vDUmXe1En=H^G+(w--2pF2;d|e2p1dTNF}=3>9o zOasB9YzMK$g%U@E1A<*9pR55{^*%+@UohZN2_{TaswjKR)oj9ddBQkS{hO~oxbH3M zUFs5V>Q0(zAfNhx>kS%q7zIZX;HhdTI0hktD%ZiyDqQ>Ts@N;^9%qw3Z-+lbsTOh7H+ zRFEslke@FB4IycA)uEF%V94gPdBnW+-}v2vT3hFm@u^Ep$FTQjos;2x|$8&-IARhj1l|ALZp#xKL6 z0Vao04Z7NJXCP)o=Os`K=!yBg*R_bj?ntPZE0q&~sYGq@ZU&2Zi)~ch;1p=aM_&@N zgtnKynlLc!*`d!PbGTvgG-$`EsF)-dG%62pP;Ph?iqbJsN+9Wbfhe?G3x9w)n>D_A z%rlfUT!|RKO7#+Ts%ef0g5$&x;ZQZHRo+}(!;_P^wors+jL`=9Vp99$&=Inz^%f9M z41C6Gk0{oWu2A^sCJk+X8JJ3yZ=g;NnmrUi7&tf^hab)@}K$I z|EdZ909lo)>aLoq$RE+f&nvU{iAyq>OE#HowNxW4enmu0ggY%TY&d|8hKP!0RfQQ! zVHKwqb~|)PWKMd)0;_T+WaMyo0I-2n61WoeD!6W2xx9X09{?2H4YlmM-T-PCO&Ruzb=Y_k98b(N&I1(es(n6UQ zMTB5v$721uuR$!AUnDwbGApJj9&H-wHZ&gNZD?Yn+z$(aQMW)6IoN>!ycUxoqV&_1 z%Ygc>usZdc*s(Wn$DxciA$suDp=1)!78JOw*Z>t#gd>3o1ZM@s&CbJ0&%*>yijap8 zfnKqcaim1tb|8~)Uyll2G6Y2H;{x4-)k;`gPPBzRO+A%0VQ$DPlhNigQ)_b@x7&yc zU7h6y`q#)p{75ezdO)}W%_Y?!nWS|_z`Tbjxdl*dFfN4K*<3o=*Iw%&W7c3VIP9Bh z@ncG^Dv!(uu6PoEGZ*xM%78>clo~;ygVfKFgD}jn2yfE^+O)VkK33Rj6AEh~nz?8W zA{|7(l|c7GJVcQ6_jQo3fea(+0|$+ms&Uc$oQ!y|EokZpfJD_VcvHSKaC&6gbm%_( zVrkn%{vro+uO;I z&B8a`%XU(PW`s50{7rg?jkt1nM|$jf1oH2^`Xi%5mP9zrisqh{?e8*&g|oIfy9&`d zWzbfnd&EdwycbRq2LgifUtY5j%0=@EV@Z+>ii)$#0-gGlIK}QZve>EK#crIy4Qduf z`t+R@CmWfNiRN_1>!nM~iqg@LMxetltQ?%Xbf_C=KY|Ywj|RKxDItHXb;n8#u8NQzOzwy78kIM#4EFi!$?l# zoV@Aqmh74;bPxRuVDpeQOxi~@yAghl`5>}qq8I<#Eb zqGpHb^rkUnfnr*Cw0MpArXmU~kKJsiIh_C061}wPKje6Y@ zor;uVr!I`aB1+aE6!;U<9B5;d^J?K}$Z_h@6^FKio?1>+iS+{WYz!f~tEU#BId zaa=mSlb2MW+6stoH>leL$*yG`l4gy}f3GZ+s(Nht+hA5JTpfMmb`<1wtfjxSLOEU5 zD3a~BNb`=vvu1wgv{7r=2!W#N4bqltit$sY zPrO{|lT#An+Lcfd*>qH@XJ{@hA5TmJcNa+z_jZ@(kBcoy4ZI(aUB~LWOT2x)pvZ3E zQFU^)n|-Z@N5xoMN8hy005teo7VvEZd7{C{JAnZd-=^p)zYRluLssw60qZdY&Q$$D zH$3>`Ct^P_AkC_b4NYj=8^fp1JHV@bNPRw=HKy0^=%KVNZYS|O$TCua zx?4yLLCUN3fMIV&B2(M9FJba6+L>kSLpTHIQ>2r|-M>pZ+TLxESqGXR|%PBB6iJVR$g%*<9zn z1{yw+)+^285?lttn3-p-A-j2-)`t?^q|-a<{n@8iWs@7~2cH-kq@D$R7%NCEhcGMJ zshxgV+)lNd>xddb)uJNgmtGN^mu{)g(Dtcc{<*_3KgF?x+u4F?W@2>gu|$PZWioq8 z(E3`?h6oLS>vxcFkn>ychR%!}I|FoVWcso8d1qX3ozGT1-_eM5;abCYM^K{M%{Wk@ z>7j7QMgZvzfp~l2bI@6?;6&@_+<;D(9yvIM0^Bnx(EIq3T6!1*N9)}sc=WCAa4@xV zX_WC-Z&@%qS(uD>=gDXNBA4( z#F?|pdC%{3FRBz&b^}8+6I0FkwgmR7P7|}$>rz+9xxQ;q8?IdAD>|2!`upD?(XC86ChrR%sv!Pp z67kjnq00dPGT(1Y&4#MJi6|Tt1DZZD^ z{uS{ZK-bHznLxQqV_)?NTctIVlaUM}zw54ZZtVDC&iimICMM?_R=)yt7Mh|xS1{aA z`ivhUeKlRnTN_;!0j^;CK>C+I;!b3EJ;fx1 zkV!Q))f&=KYIiyB^jxw|S5{Yp*CH7Qx}Tl6F0$FJl=5)HEYu6d{RGIZi@IwWvf!3p zCv!Vf$}(hyr1Tx+{qDN58ZMw19nqn&)EYe2kM)j-0OK~0+3Gru6dp6= zXwj(MBMUzr@o$o~S%^ToW*d%G=$*&Bb}T>)K-x9PF-)b{Q&pl*vTFqj;n2PCHH#azS8JF7Pq4kMXWaH$ zBJi5?&U~D#$J;*A8s|IlhALE!y(sj4118gg(@ChTfj0l9MpZ_KzCoP{qw|GaKiak} zlvSAOmJY!}Y>DXznTAbrg-Lbzk=`E($F-V(ix+pKv_;3tZv&wPpCDIkY}#|1U$}dNw{usJ=~z z{GF{HRt|S!=vv^5BHcc=u|)1WqD=wuPLU2!>c}a%q(iwrUj(#p`|b!~Ly zlVgRw#o89m_cxr|lk2Le-8^^9``?>p?7IP1l3zVs$R8;i(m#N51!XaPN3;Lhpomhs zl-2y&pn#$7Y|t95rUyMQh#ZkfGjwbtue6GkU*u0y(1RJio6SywYHpUkq^9F7Q)hau z7#dGaP1V~m5FoIc6XJcEpdG@U;q9UIxrdeWnmPuN07^5z*>K#r%{=tpz%Azec%5+l zHc4>WWe0zi`(2(E2LB-X{%sqvJjKf>II#8SmH~FKcS%2SEiU|l1Gb2F=&o^Xt3nKL z)q)}PZXZ!lnw*_2%UMSoBO|J1G5e6s5z&R4c4wa4U~w zBBhCQq@mq%QH$%t9QG{UN${C+d~XNcs zKa#65TF!OHq1dBdUr1@y>#EvezAIx3!4r%@yPURO-on1)D&}fI=fIvFmpY2{$D}a1 zZVS&yRs32I$8<|LDHiDO2xnrTXu&(>`3c;9Oy7VjCn|A10-|J>p)hg2kR#xo{t?pJQz^2OQ06M zdI#R;jZDZ-V`0&c1J-+wO&s#r(~LZeZOmU!@>E8>iS@l>H8DeQ^=TBpfNS)&ofHWf zVEwLp0TeO-<7H-Rdeb;675il&f%gaAa(+WZpETu9?%DbIzBO2RM01z-MgY}6Ljwmcs;oIMXDEBHxMh^U4(F} zumLRjfW07Jlx_)**a`KiCiXK{H8?j5-bv#~_Hx-ejyato7SYs!_q zg`4roagSBRRBB7!`(LjfO7YiS=UK&_c_*Fbm8FNUl)VIsp5rBNe^}(gmFw0|ZAU7- z3UJ2%xOK6}5kM>(AxawgQ_qRbQkG#hKrFHU#nK7tjRwS1d4$sqcTym|STXwy(ms>x zaOA%27R2ktL*2OyXQC;O+5UxI;Js(a!btM?p>0tUYz35^zJ>11xSw)x)F z8Qdq||0!+pmwcLU5sz;Hj&Dl7cj+^DmUQnk9h7GB?HAp|ErHBr2!K-RfZx#T-#;ZR zosS54pfSWE=-Bx`<7Va7bSryVqN4ISlEaYa;RF|9_O3Q&h) z+i%#5hS|tY^LVMjSCwWRM^o87^g9{TF`U_%$*>YOXhfZ;MUj1XgZY=pHnF0@*md1( z2OeKND2k}_3Eh7^ylpHYfl zVmK5UUS@`(YSGl$r0F?;1?r8_l7cY;?3Ao8OiAo&26++cGC4{{fg)7`vmCS=B^RTz!*Hpn$9CUt zeR3m_Bdb$?!ics@PkXWP;_!z0Om#*P0ZTu%=I8}Ge0|En@=JO4Qj}8>Z4*lz^?rh; zv?;9>iK^4aRNt7{P-Uc0s~k|jaRg!yVh-`V8rS1mT2!hcEzYYwb^*rHinpvv(_<20 zT9g`-!CdjnN`N^ST2qh3PRy*%QkUO;(b z1$BQI$_c<)Z{*)^Cc#F}cC155LcqNgtmG|i^#Vg=;ZN3f$X5imWcwv@{8U8{*a<0U zC$}#9@}4qX32kDtu_R}~)8B=3U99!K!=Br68|^s689}$tdJyY=H$4iQs6v;*g_iro2)9h>qQ|}iMqw(6 zJ{~4ztXprXZ0G}yCr7CLx8-usnbhEv8_JFe1pc&w@Lp9FKf4JSmC8+WPCw-4lh%oH;$^ozGHrq9^9(lbvKs#+IVR7UJZiON{IcEw2ZgF!oa1kf;i& zPveB#TnqC7X@?OrKQQ%IA5|-jZ+NjWZ_1c3!R{3_!a7( zlHotx0Lhr!I6E0TirPAWj-mgXXxv*-#})}B1N*fV`m7luUq!$g^<2=prO79`nN2c1 z){kBp*?X-IWvGwNKQHQ6E`KjL{yez%brG3l7}@(L-^A-lK|$hWnTN^ow#RkH%dF?O zqapfFW6KN(LQDb7;+UCtE3`@{ips%NmqHdM^m0Aqr{%4km9 z7K}!f9jLZRgnFp7qeh&uAUj^>m$N+MPuQ7-ZuUWfv(~$JlWS&n(qoTPWvHs?FjY zZvlIm0Y+Pc&&|;y$WpCUhARWO>kIZ%1KvD(sV{2#_G0rDor9l{;p_6HWe2O7YDI7@ z$reGEN)P-+DM4#-of|cRFzn?9yWwAa9S1b z537A+@A3vHsq*EFFb@DO0;t_(MgT=iml-=aI_s@zma+{a8&v(BtfzR!FyF-o=39e= zT>G%7*_l`G>-AKoq=wnN~NAdLD5ZRdiYpL1ubs>8qR$OZkx zAw*(t_pXF)h=4@J%z?Q_;Jq8el=K!1@D>gC?gi@$(4$oBI0n~wf&Ob7Aj=3liVfNo z1OE|zLGqtVu&lF{)qmIEsD!^LGC(Kya{xdx(PPG!O$06Z@PL3q)hswJh}}rzc0Ke{ zOo&XfR4Lpi@;_hL>6{LXca9hF51z6}oFuVK+DFWP@m#*@++_Xw@Ol4I8>IN13XR## zFXX1K(4Y+*3a`wq(m-U8N~qi{6`*Axet4tuy~wKT2*z6rFw)ZXg4g1D$18w1$SB(; zXU*WW@NLQZ`-0u#+0aE8{+97^nMQF1c5%Z9C0qO&*F3g|!11Ba&iN)`O;4Ht1V&EfHHfSo&B})Xc~1wA(1Z>CjbX9i`bRW6D>H^Ip=3QXbO zGV&81spHR1l_%`$XGC4BWHQlK*KjYtbT$1fVr3<-1T1 zz!;PUOAQn+gkoR#d5W$>h@MpKll6Cwx{`DY4>JJ^zXBx~ceu0J6GJVJQT3OGYbQ7` zS$%M^wg?6%qEXiJcF`zp49S#PGK>`7b%wVHeVV^^ul8+;R0qoeZ#oEbN_-tB^3a7o z!k+o%CmC2iut(vY7&8S__yn$hiR2F+e!6v7i^cGy^Zd2c>%yt55c|pp!o@(h%9gCR zP->o@D1-3Opa7xe_)rEXvXBB);8KV47_h#hw-ll!NtEtlH8c> z#wbo%jSVWwq%(7yPCib!(#_@k>h=a_2rBWpqcRhg7C_$p{BoKwb2;Sqg&xUgUEU5k zun#7zUkl1+FPgy>>@+*_73vfbJsZ4_nZ{5UND-L1fa9ID24g*ky_%d%!GTGvf6GEo zW+Exp4}+J0j{CiNU>kcR74wKt$g%Mo0}FGOIHwCx8ve1naM|86iFsbmRGLp~xZ2KB zK#OsBP6oJfHW(BK#qnyuxX!%F1qo zuqD18s(F%}Sy259Iy;+!PCa8i)1kGBGntowLAWb3yuwVVgh7W&(>^ZmEYWt9!A+An z-laYEpqN=<-hFaJolHn)Qw0GJ7d8W|AK^(#IWhBa8uk#RB~6TKC|+&`G}PBLimYf2 zC#NEtuG+x-SPvg&gmilWVK8kc$J^KC9VVm3a0 z1t)3~3RzOg7%SM2DS(>+_#F zw@}<%lay{uu3@Tb-*0z7ZDCW)Ykvf!s=&Ih;*93-*-!A_;CFOjp5X}a?{P2x7@(iM zhX3%wAH}n9)jeB6;6>$ zdfWWQR*QmHj9?+7vvQ_Kvrxck{G ziYwVMURc^qDABky)|hqB*(r>@$~jV2NG8xcbP)OeHvkY1_p$#S6kxjlh&~qm&lTuj z0j6edWn`%DV5H>q*9ohT?J9)7HLsJi@OfHYxZ4oi} z)8j$R``m)XOReObL7|MamaWI`OK<+1%bG`r%PqN!FBm=8h>hFAC=!{G`Iu9~2Y!EG zMD3uaEI4q3$sXg~=)##fs8fVsF_LezQI4*?5@lnA+MEVUUo81M8KII1cR;thD1!y?meYwPADKOD`Wr5n~~92N>-*xZt6jhV9C8NL9H zor(@qcjHODFE}W!_GTr;z`2~Ac0_RL^|i&QSDhO77-7|%r1j$Sy!l^(vGO3rhEQ}D zufn6v@6KAo)i7nVWZWmAvLxJ-67|#joR#XY04I>-DrN4~DkvQ+0IN`9u9xW=ebFJ- z&f+}`56TiQ6M?dbOVgCeNybPXr##Q1Sk|@C^}IJI@A2kfB?`=H>UG}vgj@EY6UIz0 zGu2=1^KwzTMYWD!=bc11{Wp56TC*wU%y(jC&P*h#ByGZTdA^{Crj@V$;N5*4nyxRo z=#GaQcql71A2#ZvP(lxivQSwT0leRR=Kb)aqG0xK#@UAXtaeatl+XgcqcGln5WVuO z=sc5(o(MLeZv3Mw4;7# zv9}(3+dC(paZN3x9*%Wv3Gv0RnX~<54S*oSFBG&Tg#3Y1^#|JNhW`57Icd)YazQ>} z(M~7;FXu(#?z?bF7$8pCgkLZe;Gss_{Z*z5Rz+jY1Y(T&4>dmHw``0!GPxbIPqQ+L z7JYnvEQTH9-Nh?&;^3xZpLaq@_Am1cGoExvtr*)798LXtOsfsOy8<#c;#7wvn=Ey?4+-5}%5oZF2dkDsjAg%>;2JiKrg^W%ef z^-1n{ho5-LcO^e%WYVUjUHp5dQ96NP#jygQuJiij z4Msy*3e>3lPGE0}w*+o02bO>AzIBPH_60ewi;eGqZIQN1+%365KEeN0?6rz@PB1_{ znBzY}sTBT4x#<5bK`A+bXpjC4qfs0IF?1t%%jOl4PS;nAOBx_tOK(mO-4wh1(b zpFIIRt&!HtNo@15)U;Ux8)TTD?Fr=XYKr2zW!~C*rmOO@q4p@MP*U3z1;$c}7ivXM z9@1D4(`b(H%w&r3hAHyJx1WaLJF>e9a>X{}x2A>m2UWqc^Vl{#w^+;Hm%T&E%-dTq z=P3f0y@j0UoHOe6HgzjX+X-v$J&i7Mwp27%c>T|l_&aNAbfNAR`q7Xn@hP*)JP0#B zi%CW?u<@N&Y?H$-ao3aUC^PIDphVDpm#5K_*uKJ7K`A9+(CsOAFPVUQRwZbOm*4us z3X|+!{Ng@+b3#X;G0xRQ3RC35(Qq)JN;UGaytlF|7k$k+nGFu!R#@Ep@J+!Jpp@Y& zc)>`UDV|}s>MlCt-dlS+dXRwQ%mBt7Y_P)^BC!2;3zW7C^T`DShb6FXQm0; zRY`8F@kK}l&hMtH;j8=*FKy+cuD)LxT(np_Qa!tw=hJd!xm_eh+MjsS#LyTWjqldEGh!BI_6#JC8vKOzJIp>(U-lgKR7p`x= z+4vIfq;UC=hItk(9)Z9svNzbcQ&PLO2SdbZa!SNLv>fqW;kbQL|dPl!Jdy0tub^7#UD1?h|_PQ=w z&dIBMj~Q3Y$?IYO9VC3|-vdDAlt2Kow|*6HjaagP0psb03$P5HG6l2fywID5LaJYM z@3gME_>sX&*H-nza2U59!sC7vaIg?zxr8ua&Kh)ARAFh!UR_=NQ?;Yc#QpyCG@Z4n z0&+k|g4O3I!~R3?VtW^FG7wW_Svj|8Iw5l0J@@Ddd~hu58CjwrqXg3>@X} z^KF3{kY&_UPLJ)>T{b_(imaEtnt5oDo2zY%D}GflIW-@gH?{xio>*MeGnO0PtAbI- zT}&RWTVy>*jW{@I5PFYY)7qL_FaT3+TEh_-B%;+85I1Yk^x)!3L}&Gt3ysy!IJs71 zV{i>Mrg24=L;dw5U2_mdM2x=BjkZ@|&vuWLq~`94Mr#iXlUVQ&=9y722@H3H)}vvT-K{v-~f3uc@zgrlCvNN_z788kHBY_(}yABMwXEC8zT8wqb+&qDESzYNlJEDoOynpdtG*jwB>Xfl)Y1G^x zgtuiU=Tz_B*i%{)AE|Lx#F;~D^yr67T|T~qY}AzEWoiSipP?#3GSk(ye^sRxE13vx zu&++o)j1ZZ`NJXCCyVZN)qxE9R@p-9( zA`XZs`;2uP6-Ag55s%=sL!`Ye*utXE;{i#&%sTLUS1*0zvu{nwgaz})=drtcx2|G- zJx!gByegBn6Ps&r!SVFVLL+p{<=wub**j``%pD^*KckDA1|v%nt$^YoQy`W6?Tb+H z(y5)N;j=-pt3r4qUDD^z=Jwbe2*{#GQwC|bOoYfr#S*Y!bdm*5llKAP;ZW$+y$eD4 zwGXjdR&~-z3D(8rX7ttTFzQTV9LzV65$`@BF+3nqZ)WYpFe!*A-#L6@nir&B1L^9& zqkr2seMbxBL>9ejx2t0*@KGlqNMJR478IDX2K<&}B4QJ{P;HZOTgJwOKpX3!s9#&M zus0(c*07A;QRY@!?`AXB6dtODB!(&6(`%!E?wq04+Tf$?1!{b5*g%E=7!(FD1&WPe zEsszlLV9s_YG1Z1+8Y@8HgDFccQz61TtiB{}+EecXEY}jy_Xs$g=DrdH3X6;t1vY2L5oBTEVQH`+-Ao{jkQZU47jj!d2&0ObtckMysE1ADx_l zhZWkZrG;HrKMjMCxQahBN=Plg%W37_q=m#-k8Ih2volHd8wQPiG^wsAyjZ|lykbc+ z24?VXY$*D=lEjHsJcm<9%MN4&Kt~=#q|Ly+@aH6AcfW-9pZ*>cJJlWD_1IQWy3IN- zO*(|NRi<7(ZQek-YSHW^$dUP}PkbcCRxi;ObXMq)#NV7}?K4LAF~hNZ*w$eHhn>)c zo`hX|1L<_9I7(D;;5f_|p*%>9U+s1vmZIOsJEyl>q*fZj5|0+>FBK$MF&v5N48gv(r6-7eKg;z@FdY%FN#e?T%}?1ArzgS z_&z4}1)sMr2A@4)4Wkd!dWA=IPe&7oTr4R8Bv^0g#y2g0pIjVbCoQ0Lz1>9lq*}|E z_V_lx`GsfMS~3_pUz6s{l`rjGLIUvdAsL;iH!YvJ1hdxT1}yGd)fL9!S2;g=u+4p< zygZA<g+64zQm|03OZIb;NIBS=nR8AFzgbHCJLrc z{$r>99z$dHd+ChhzCI#o>;!Ugv_o;ZZo%I#!(4Im!C>SM3h%j8M|~8 zO8GNW-g^H1Pqs{~YQv`P=3(w^*F>)q5zE3VY18xH5L(>5kT zeC%4tA7ASCv$8?A?PA~%S?lOmSC46oTN#+oz2BZ=wiL<_LLw}l^>bI{-7<4@BF$;W zIso?6zA^w{!>7r3MQen{l#U=r3}n>j*HEz>Bo1~O22{9Vd@Up?NykS47(r}WM`~=} zjCf9Znug31I2%W)?>iKfyne0m>t93ZDfxRm(u(na^j*=cR3f)VkX{_7J?QZ~)X%)e z270>T`FsPI-aAm!Qc_h>uf+`XGZ+)U?!omfgm4VmbmTM|9vfS?G;486TTu8-y2bvw zFoq3L@Au|_du%uaX9R=4#=`Fnw%}bwgdp$c)W^BiMOpBo@*PP+O9UR*ze;$EQ&Hj$ zxQRr}nAe=zXWv4$UZF5uvyknYGF(^A9{AZ6G1Bu(^l8e%TXO1Z#VXa~+kX}B2Ggid zVg3}jaPcFv*%MpgW12czUnDKm@DFSJ6}HRD?eN~aQ71+N!RULUdytp)TKO^Gd-7qI zxU;g{Eso-d{yd;*Gw3-ac2=8+pH-DNbpFNR{L}2{$)_WMXM)*Rgr9s<3c6~FE}t;R zQwT#|;~L@9%8uaEYY(zc!`RD>SUKt$`*RQF`KH2g%_a6B zM*+kx?a4^>Z(+cCEZ1#lpG5{#!X*Csnt3% zEqC*>MC2CG)oSs{l|ul@%~rRk^4gnX8|V&Ua!YWd1pS?%E%8IKgaKyTO?EZ@@Ga9k zgJVMyUun(HSX+_Ixm@x@h{7s)Ft4=Q>eC>%Xni6D+67rqi$IwShOow#_@o2g_9~lS zxWd;YNx_O)6Yj(~vUWNIC zwvMrEYiT=1Suk39`?x*Qua*jxwkCB_Om0>#r#KgN^Xs28Q@P|G9u3^iARxViJ2 zF4`J+J~l^td@3d!O#7CoJ24p&7KKqH)Gry%4!?iU!YA5eNvD`I=%5iOpmBFALjo0( zMe;{R<@C56h8Xmo6~0$uWQSxcCMKlK%E1GfvX~6wa+b~WIvM4rX5oqXrDB3On5A;i zFH3iSNMXf1!grxOto46P^-b_ON#Ji<<@8vfBH|mZRm9+95@|Dz4|ET6r;iAPPto=_ zejP+~dDm_`Q%{&o++Xj1u)9#`C;p;c@}+Y^;!Vs2ID3Z5tGIeB)cx)!>z|-%K*g$u z#cDuS)$3)^hol)&KvsH z?sUhn0^M~M?RW9*(=k_0Of__E4&4BO&bZhjshfZE4r)7$?d*YDPW8ag6K;(B%lO=L zmh9>xnD*$LZT4xS7e4F!ta$-`y>*e6*$F59y#gm}UYV9T$2($=Fqb*YJ426*i~PqE zo0p&m2!TfkaM)0L7K+&u-8c#OP#zC?>AVnOPF|wJX}Li`4{4gbArV|&Qq`FT1KKxj ztHPg9?7Z|`CnAW2TM>@O@ViJJ8eS2)sA_YTyIdYR>pyJ6GmdHP$-BrOW^)F+?(*Cc z`H*7fhIT1mg#QHaA=gYJUUPZVZRXMstg(>rA*4TPbFhSj&H*7ylBt}mlkChbMdDqO z7#c6bP^??Tm%fV>KOn~y;UXn8k_VOXQr|S83;RFBry zso1CAMsbAT1BtAXk&Nps9RNgVX7qZMZ$WgD!w4F4O2S=MDEZPI;iRRT!gM? z?HBFe?O-dHdsT%=?VzOel2-qSYn3dMjc4yG%e0T+__^P8!lmsyUu1z``Ww%^3~A}s zi~UMVkz$dmS*CvUOX_sUzR>bCO%>(=kX%^DDCE*c6_7t<*ZP`qMfZ=-x7W_K55 z-4ixs+#@Lf%&;Ug9AY;`f&mqQBS0n~CC~x57lj(B6qSGp9i@a35t$S@D9URXrZA*# zQE5QKjD;~4Wy_$7QGrPvB?>eLVgXM?k@p~hnm|k-7cdQ27TFMK0$c%l068f+#wXTM zc%~-8DBTh>+<`2>XP^@h3!v4!35oUrO%0(f&@(~pUrmrh%J?kmjA!hIr!8C14cp093r5l z_$_h|4Q$3Z6aQo3#*{-cFCbJOc*_4vC zXY`>C^}+Z{VY6Q(2GcneK))ffDoCI~Y1aysLdS-*fCDPKie0~0WvHO~V zl`sAcvDY0I-A~A>9G<8fKv8p7K^F1*g$rWC$QdN zC0X703iEm1u$?W7$rJ*eCWGH9tXqF7Iz1&XvJ85O*$zkz1y-_-h6x5eR6}En_2R3Z=8QS3q}N!ysQRLH+wpC^ z>d?1(F0|Ux-F8`}EoFPDA?x)Sdo`>_CmMhGlK1n*nfh|$O+CM8)b$ht6|`!`S}@cz zE;7qCy-J;Mg2w^oF1a#ODJq=@R+6HN5rf1g zS|^dfR}e6G&@O#*qO{54+Z_1>0v3r?#xAG8Qr6e+zv9M<90n#Um)dkpQkemHfSK2d zLb5Q03Gkg%#`x8{t3N|Xcr#Qa0trtvQQHalF1)xifbMsQH-sCvTVevf!2`m##p-f+#YjRtigYVegy7g%0{9B;62shqcV8WeR zIv~7Wegpq7Js|gzi%sVn;vUZ~^}2x*reVUqwsSZi*C%9=@03j1=GD7GG(4v2S0!3i2)-uxqq;~y^mLCZ21b3^05*3{;XAnefJOS6By z`}e&^v;b5e1A>UJMbm0<>m5WpW3E&Rnp!~aHXp2zL=+^6`Cvuc)h9ejD+L4rJ2rR| zw~whe`>xOG1Txcd40;%v4F!VF+rsjT3`Pl2jpTTfg_c|zj)f6ND)Q-`4o&d`kM!M5 zV-8B;ns&6(y=t0nzcTSKL>Gm@pzXKr7g&Bpw8K-O4>f7#CdE?3dn&#^~uxi(W#GKb5myreJ68U8xaQwTZezy##vrQ>MJ8krj?~y%fgHQwuC%=J2h-0y1=#KopPtu zb#}FV)CF1Wh0V38JC)lNC|UBTMV#=`b~en+P;Ij!sN=HRg+R`8|p8@Zq`JN0qe* zu!H=?#2YGOj_h8cy{k`SU4+ER@}f{wgc{8B0@O70oZJ$C?hfn`$k-ubWAZP~XcN7-@wlCL2=tj7S zPrdjN?Vfk`R&(opA!nM0eFnbZmJ=%iz$XDd;8glp`waV+_1lDdJm z>4WCT+)N1cL;cyIn^)O#h*_T57?gncH}r<{TaL||PUB(c1A=V}97GpOxLGGnN{fEo z*yP<8$CCfMG zcM(6ei+8a{b{>v0)(cF|{zE@|g#MS?LDBa3B7;()IB1RcpM(A%gk}Dt+sWDddsUYu z-z(V<^1O_~D4;^sGaJWY7m*@E373J8^6ar*38r_hR#Vk7oApJejhK>XYf64~8} z47%~oH1^JxaWAi~uCEvcm%YH^2wHURFXu{Sg`CK>;QeWS%p>R|(`k|-OU7&^yL9O# z<8J!8XpB0;?I*#?%1p&tl7(!87Izpbh!vA6nTML?`{Cn4-F9_n1tGlnaGGECIHtbb zN}G#lRA-wN1&2Nh%P6=HBj|`GX8W768SZOo1^~GMCVRd*2?`7NXeKHPP?)8TyLni z`p1zVl{p=lX5fx=Pxihe(y?q&eg{)TsT)i|A}0Ir7*VmM20Cc$C<(m#5jJ0}9)+fl zT7N1zXkJ|;X*0re{Oq*U*;YbGzU3h3XAPfz;3$cGxRuJa-(9ZMKXq)?R1BTnyb;G&$}RdFPoT1X`89G`ozn>moq zw1jMsT#Bu=p%$_x&boJqPEF^K1_&o+z1DR7cd^UlMfCXpcKrWAvHQ0!PtkuByP#G^ zI!01b`EE_Sva=wLMlT#Ju)I?7q`nY{Q~!*;N=5XcYEZSi_=7_y-ber{cl=O{(MtZA z1c(dqu8R$~CP3Tlhoc(Xt{$gU{I>M8bWgpU9iApm7TUoA%? z@7u8o2FwN>JZ7?H$is9q&)TI1J$J}DA~y`D{kEt_RNkUPKsV{8qwVmk|3`ETktKol zRJa?56Ru4Y@@x9zx_D3lhL)?h8ViO?lzZ=7mDL5aQHDSYGm2*Q)K8cfT)gf&ZajB~ z=DjQ8UU`;xK{j6Qa2K{Mru{XWsg^;4!sS_I@eQlUg5)SnZe4^npG!`3Z~-+S zFRF?<6`H-kpnEA5RB2gjj5Q{_GLLYWd|5aZU7mP7m-6S~qBa#QKvS_Z;Mam|mK6}=>za2{B7|3dS+#835w)a^!0cWAjYCnBrXKO}if zo-xKNafFzD5!^!7@g=$-^p5_FBc;yTULQiCiZEW4YOUlY zbuw3Uunw5aIKUsy`XSp-lKDl=&f2PG@B0dk4xq&@$%T5pA%LlRf473k-HB`Ci_hPA z0{?XsRt!`irT!6b_djsef2$c4sa(p<{QzB_0->4$tzi&Q(zu+c`Psl&+x>TOAR%+@ zMTvc=4w#^Hq*m90F3H}x;~_9)=55K|6@ZV;lpLmgg%X!t-H-2H7j0*c`1t%^Q+o~I z1*Z=f^77FW98wh-Xj#p{(rnh{^R|n_NlcW-catTlTTs^(>{0|6sk4W0dl57?naV|1 z*)kQmY_Yp@jE^ZbNrwx{e*AW7Q24kAIv*)LmAObQhT1+tpL#+(&MLTgbf~lMTb%!5+=J%~k|W zW|DD2Je!zWr>@vmY}P%JSQALY%^;S>-l;`-Pv{#!+AgoIIb}yM{+%5HdiS(ia6hXO zm)ai3)mtQx?VjlJ)^ntrdN_|2fK(dJWX7@b3K)kE;dOIYQExkU*b8lQsF{{c_6}$B z`C8Y~vWrY&$bxgTVOW$L#pf@{N}4+ca~txp3$gu~fX^@%$70g`2#2iNeJb@fqlJ0! z`hYsa`*`cyczvb70CX3bZep4x!o|w=>+i^W>xahiOc&m;@K^Ezy8Xl`M)8ch@}62* zsrsM#pUP?tQmsP1!OWeb3UOpq6T{>;Dvct4CtYeF2}~G4^Rf_81PI>z-cO>z=18lj z;3+RHR)d|}=fhos!Ckg181CAG+x&B+&)xf^oPmfmp@IPOIE4{_RRmq}K*;WpyYRh| zP&UPwUZ*kZ4k;x}95LOQ01Hm)<}1kwNi5xuO9Z;uL6P*6{TUIaaycBolYalNPR9vK zV#n(tg?kiH0^%m4ac&z|*yQ}PM1^N!5MClntDgfd)3uec_FC8N+!yR-?jIq1gpQFD zQ)VuR@4N`X5=P2Qa4fz zC04?+RCNOw+c74}z_IGIEY)W@KC>^INHX*6pnIN-4Wxv=2>k?J$A^8dqnj+|*Vn0~ z%TG4jx^SG*S_&h?F{cawg$4uQs!5d#Z4Bc$XDN58tDR2IHMi#2G(;p@OJ}tjd}pnW zZ*w=Px8qNOCB^e;W?Wh@rizNjRvmf@YT_nSB3gM#1>Ayw7l$dyn#vVr`!q@$C=~4M zxO4GKo)nPoR98R2m_CIw@zt(6@C$r~PooaIt*vuo zL~Ec3Dpdo?RlUQ$S;)PzHzC7vD4V!&UYTIq?22xR$AT8TnLS&Vn@BflM4F^?RJ8t$ zLb)ioSCjWyR8usi!Ru%9LdBt>e=X@j<&YYT+j7> z!d*b|a2SZv{kFt)UI5H%SA==LytX)I%63QYi7A%+m@1_x>~gUC=ECIop@v2|e*F%) z*#bjPrcuNvX#FYJV1^0)Y9GT4d!IWj;f_PZI-L(qsdVDEz`V&LgZyjIIJi2IoRWz? z=SI=~vPUjub|cZxwZR^A7^u#(+YjjxNM^Tml7uI83ran4J!|-tNAFzQu5|jV2&oyV z<{uGYF(v9^e&O30Z=r@Cr#N-iq4>jLITT?(t(alig2zTQfJueVjM{@7O$w{PCwOXw zDMI)6zxfD$xxR&Kg4}ueAG;`#|8;l%w==7rDIu$&d~AGMuGK*O?5-IF#Y#dUP@$4X z5TJ@si&`$2Gv)wGJ!aG15vEwRxF}|6x+-h>BCs}jC-jr~UMPzyk!fxy#pify-rV!T z1eru)h{>4D^^*5-eT(y#<0Nki|NF~{=_k)?AJS$+c_18&1P38;C?O#xoPJ3pVr2NB z1m@I^J7ft-H?? zVyu|~CvCDe%u%1XfoK37alkDS45TBB%3JwZLNc#!IJxss(-CH(z}&veuRJa|SBxHn zSuavRRR7UJOi7zeEOx!5xf(l{ z=se1Kb9J&4y2iBv)jH;exda0VfYq|PzpEz-CZ}OsgYVKvj(dIb80!*a%*U~DV8v!* zeghBSf2;|Q-Ztlwo>#e*ei#sGb2D?dj?yx;Kp999H8U%K5VB~_tetT_HRL!~&`w@5 z={PZQ8r4?LCY5)^DAare-STlTOmZC&kIGnW&JQ7yKP^rV+bCVdqata=n`1jSaogK zuBW3F8@jRU7qD?GANwOb&u5UVNIzK)Uo8tWJUxJ8m9(?E2T-6#p1X}Pt;Nt5-?oN0hSK~!`O&})}F0ES67ZmOm=aypkKz+dKMIIkR@F$dEj zxzS1_{7bMM>P{+^dOjt79arT@xK}LVUYu}WbH%;)d`e%*PcUdltkMKkyjlue$^5ad zj#7XQKjS`GV_Ly#R0PoJbHjK&BBZQgqMrhJ)IJU=i>er>5Y_1BjHP;?;1fYtP6me{ zZcWJv_Tw=Fu79P8?I~aLoND1fIMuZVHZ^^UY!=_?XeUK;;vorc%UcjjM`E zShMIY!W+^t$qHUN?Cc1Ecgx@|e6K+S#6U7)rn>NoP-2Uk+8>A$>B=`k!AC;f(=L|9 zyv$;AWhU?@nm`km&xkHF>~|<{rI>NmemTOJRsNI9UxRj`OFJWunfAksgGK;?@y-ip z=(Pe?^ts_C(95l%r#~+|_4?L5cJMob7&;=qbp({~Hq!{8!ENWt8O96u$y(BMho)of zEN+Sr=OxcMDS1IU3uGehzSMj6db8(*AF|P7?g+E~jpkCj#>vg?r5j>a zXmh&8eGyW{`HqcskxTbZjU~D|f`=@fJdH5`6=(tVWf?qnIYfS0%*+7)Xgb5|&c@&t zrfx)pb~{h3-pUJ2$_z@c@Xd9&?g5M?h2RDfu`Lkmf%0_4RQS-*O8=)@v7nx>K|~N< z`s2GPT1JG1mjq2W5!z4W2wSN-j!aWVL8Q0@u9#14wBlZYOwB>$U(~O=zU=1oT=LY4 zev_3ve$}#)M$aCf$Q?Njckvql`frjYr=KBE}c!5JW3M!O|gZ}MJq5o+B_78NR|6u_3 zuT0&g4(+A11&c?EX)H>iX%d^Hv zBiUU0CFA*I{r2fs&e7GgRL&ENAFG4-5F1Z%0sc`}tJct-o1l=a80q9IV*s>8Yv~R$ zl$G)j`86fJY0lzRVKk=OXw1}hjq@K^z6!uE75SXGtHx+7k;}{Z$4lp@D|gmc5aKwL z{^?r8O9J+zaAyo^Cx`V<1i*Kp4&kGCXUmzU&mH&n8kN;k6!xczRklh)&GR)*_R^KJ z$Q`zYo50Am4D8nIl{M_v%#}{lb$;LQS6{h)-(&TV6sO9;N7g?-`r)0el+R$@RwD3E z%z!aT6dz@P4@IL7tqGreKn|4$|J)Tn*1K9iHJ0wel_Tu0>1!Em~jNzq@KBFI22R^6-A zth#9hla^f$Not24#@S?_dn=pG7JthX$(^&k?xk71B=#JOlTA2j5v7B!_yj~AM^J{c zBoYjb80h>!Xt}MfmVzo?qS6Z(mvLx?k=^$%z(iWx>+C8G9pc%_0mf)uF~>i_&5ZWp~A>o?sWv$~k4< zqRA(!^Zffw+POVAdb2R&tXNz!cQq^zl-e{CEWc5Y&8*^3l?X=+_VIHhPDGHmR#y+O z6@{Wr>ST2Ei-2>(<1-ts$j~}}@F!;oH+QVfkft{0jys)g>k-N33@J%K8!@EwVy!IX z^_AHS>dG88Ab^&?8a;`|!w1(^sZr5H63lCjrmjau*oihy#rfXFHyF^Lk#kr@5-c&d z21jU)yDJxp4NNTANyUH{dR)##lc=OWb=g;b9vDd3?HLEB8Lc}A7-vB^k+biX!uX9RGNQ&X*~q&%+>HA8xKT0-J3F-OlFS^o@$Y-f zPy*g~EXkqqbNdC_!$g8gWgOT)lo!klLEJ3=2Wjv4UFp7UjaJ1@#ZD@=?TT&Ns@S$| z+qPLrW^CKG%{Oc9ecId3xp%L7TDu?SAMl%PJVSl--XSsTL{aOJA`iheCT#03i%bv5 zB-q=-@fU{?1(HS>9`X@GVc%Fbs)p?ZP7DKmH@{JL?n61|7|Ks38H7oheYVScP`Kn&-k!ajtGCMEJ@;ZUM5|VdeEQ1-UR{L z9D%jy8D%kSfvQtn<1uQ55zDzj6UT(rsXQaU`+tM)mQ$jP!SqLg-8PTd$YwfVu!XzB zc!1zB8(gmxAz?t% z=#!{!$RFGO8ZB>T?FY|$C&@*T4NkjcnYZk1)06?7iH|bDiD8~~M5<+4HX5R?(})kD zU?+unqq%rO5mlS?F*CS^%&ptaPjkSk6LB$P7|?KID-nyvZx&DPMuCAMs@Qp;Ve$F- zskndSXu(x@99FR_CmJcZO8N@R?!yVwDrI|jQB*@Z)|CUq9w!Z}ngD;pk3iM+i`rU> z$S)8p6N)i0RU`;8RH5fu*!bZZvU}_xaFGBLPMQqX$-p2-y6fVHbuV#dX4ly~!yoIO zM$*(pCxmn#Jo@2+B1v~-s*E#2Xdn1G7rgs@B*xScCplWw*-_SgkI_sRK?0HdRGQm| z3ddR%Zca1mgSo^&8u?P{MA>D&NYlHr+`V6Av|dD2xC%*feubAgD8%MHO*#VkCYp*@ z@Anc?bk`poa-{@+objX>v5)hXWI4w9GjwE_f;-E{ddjId6_ZHPx1PH}u67>53|KkX zOi9G*YcFnS(x&1Qi-#&GIdqf66++OhS&SxAGZ%0;4c2v!vZm%L!~yXRW$1{U@@Dni zdS%81Rc91r8HKvq>w+2u(iGJiT~o`U@rJs>;B)0`+qrJuaoTn8Lp_RhutbSXxV)kiAq@)v2E3#qumv589cq#emEg;dD2M72&tiA|NR0vNkz=_jph<7K}Dv^AxdEVp|OKYH8h!7{jY$l2ka(G(MwY?<=WcLQ1HKqZZNYg=96U#$037 zr!CmoLC0(m;We=D-!#9BHIPC47s^oQPjGr22h>gI!|gY?*m#FCoAdoXeeUlGZ34?E zX}Z@L!$vj`T$}=E_>nStGG4%>JN=5cuzY#A9^^d%pikL8wi9`-oP*}MwrlXLaNW`V zB|Z3KBFK?+wQwRfVa3cgk+vmMSIV$|O1CX@YMNC4^y6(xN6DIt4UAuA$c-IUTBG-j zRmlqM3Mne(h}0s7?@LNtu{mH9&hNq%Zf=ubDq^D)X2(P!QrUm6w@X=9%ib+7>6t#2 z70@oPlADv=XP<9m*PKrQXnNVDpg9EtU0?%kkNnyf(yX+pQm!{go_VV&=GiiX*{{)c zInw}?K(&k1*065j@?8yY*Sb&21q3$mM>N%1&iPS9sX;M;`0vcyIpbH_aL;e@?{kv9 z;X-+1_45WeBi=GqKEk=(O1oWYCBdQrZaH9J|A;_q_x^@0X6_IGaOw!zlm~Ho!~F@D z^{8DgN+2~Q^5;Aht_{JYfoli03iHr{lSmj!Od3iQH!M7!sdtfi-=#B6F`_wP^G~yP zcU?ld(iF`6Spmv4=qAUU|J=Lb^GIF+@e0J_ybC%PeD9MbKz0VN2=>O#bO&P~rP};- z6gG*K3Lm|050`jF?_zG&1#qF1nlts>j7(g3q+wFqe4Rc^d89kAefwE^L9l_LzY*E` zM5nNeTd{>@2z-&BdTA2F^J@tlgC2gm0#IdHc$ZeviJ~r2Ha}l z3jFOI-y6>ZB!YZHo zFqNZHKB_Zh-Yf0Peqj=^gt7P|p zMm(rvEBsl>?=)#9A-_`b!DIN-zUXZ*r6cLAiuPLZ@c1@=Y2ox8*`pJM*);mD&Af(t zMnlaXi?A~ba}D`;{`V9@s}HMA-+1rZ#TijNPX3WT+4-I`+Mni{>mL-s>)g2mZw2_l zqS5t#nEzChEbstxoq55m&%4_#VcDz(#cRxs)oK#U+#;+3WMLIo@HITkahm&}OFK7e zL{x3Kqs|R}7eQ4i2mF!QHfKL;z6M$`vDt!2LgrgD=Hm(krosS+hPhE39X?a-YllAy7|@nuY|FeFx|{{7XTS0=aRmvuT1|Iw%?GoW z-|zn@zeq1g0=!ebjmR3ua;d5do`nz?Q+~;^xSUY}l6iQ%u3f%4Iy|7MEoSw&xuR0v zFk2)a)+l5RR^B*bCs^m`Xm{s$Ad&8^x}*&H|ev3lgOxQyq@xG*w~yZQMy?r%#7;*1FQ?VIY)f0{Yz{`0!X0wiJP7*7|(sf3bG(=h=v-D0o8N^mN zoL@$h1BJk)pWi}lQx~j49N zZoGI+ktIK80Och4eExVG%X>i05v8{-!r~`NnnJ2!Tg_I41%1&0vgDMmB^#y!nAKl7y2LTXKEs{lagIIB`}nC{inl%4tuAX@HFI z#4smSL$wArX!6-x0S(tAmHB#jRJta`W`o0{;why<`IyCAy9f5@!Nf`{DB>9DIgCuY z@F1o0tVJB>xb%3oU0hYesYO$a1cw26>E1(Kv%&JLv~k9rC2RUB>CcCG-tSz8(XugsuRP-(eD{G@<%s;=WPdASVtqM{j%NCxtti%6Q!}ZFl7(j{EF1cdh|;N2wJz)@zpR}m>{#qq zT*-C7l!jCIFTLe(vrNFw3fzO;W;6E>3{DqdQA9aYg`7iS<7mgMBQh5*uCL3e5k-2}5VitBVJLjv6O59#0!#;bnEUeHJ`p z4nL?5gG&YpY&XX^7m{x1v#6xcF{@yex$+j|b|0Us0M1HaNVvr?$JGiD^@@I2cQ)L8 z!%t8e*Bf}#+v8?SQ>ZC_fKE%GG=7dv*Z9xt^(pxpL269b2;fpltNNJdA5x!0 zV=DO^PIVWR$C~VZ_wHQ+ap`M=BmBVaW&QHah13=~=TzzwnivIxknqW z$Ul$*c{jg$4I49_Bb%Y_WI>s>s3f#gO6JSJ{VB6$4|8-|(vPN^LaUFZy{)sHyac6V zEY`(Op<{Gatq)VZZKl~xhw!>hDaZb!4~dV+4_)r<(r4TtRLA;H)pqEuK#&jG%uj(l zj*D8B-d2%dK$^~S!9tGt3s|XV)AnP(*p(>>s*}8{rAVEP3v0I z%|)-~9z3#KxS)Un0Fe4dFdr&56K=8>W@1Sim2qdkypW(!gR(gGbfmq13m$z~^K?l1 zTkrLbnoB^rs%dQ%{tGUD#Z!}WC%>{Nc*BGYGd+u!|0SJ0mHk+K-O05}g0lK1F{B#n zP{=+d@=o3d7F_~1CXK1i>f(>R8Rb$wQojV=;y2LY4@BxGl+By!Wz0X@0Z)}hvf$q7 z7{;|oAX1ifPpJ6`LDDljQGDC7Xt#fUYWKhPa_I9PWA>s=VYuUP>fanA5*SI9{f<;- zUl>FU+s~+(rL9Y>&b=o1P0Xp{z~wx5>+JCEzHkknA?|H>`Vo45g9hjGXUFwT${sH7 z02Qt*GeF9k!E4=sO9XIkG{Dd7w5T{qiSn8q@{x)A=}We8nDR~vzC$e?j##ADVUkeI zf2TLkhyEGOm8aqw*Cq+k$rn9dLsB0VmFsko_6JhWMEatWed`exU5@bNPk^O+zVPR- z9Bxb(B;m6gSAi^Gwd%x;jT^Fu+$>luL+d&Gij(QG-Xle+g6Rl+lpg#Gk$ESs!WA3A zM)RypIx7TOeUqVG6%D-MKMvX^tj9XHM>5d1pMF-sddco;6oqZKI`zx1a%qws!kBdp4}e_Qu6SQ6QrdpCc;bp_-2w; z<)7k|Udu_0j0c6Pl&y<%&EbR0>oJvqsLw&H%r6aynpwM|EZAvgPFRbk&DCsRDhJzpauSt7?Yl_s{Ov$nS48s}mcuW|<$9HGV;lOLj_;zeq4>-={9IAw5vn_t>QrW2!+V2 zp`M6dkBaMRrv{eOdK#B3!gbsUQcZ62*1lbcw+c@)2lO_;B6(67=7(Tl)srC{e9mlZ zc+XKHdFNC3o{J~)uQ@zW?s4?_( z(J+9(kFm=pi{f4^7$zR#Gf@{&B)j;oaIiX6!xVJ8MyYDK`T#s*G(7aDAMRj0y@&$8 zL+}LNnBvdhfwfUTe`Gq`uH~rDrU+HIWwy_ylz*0Ieo&VpB%4VFmk`R#1uDh|J34Ij zMa+mE%ws7QK}(wi!3j0n?V%{=2SU32p`E5g%YlysI;Yuzs)V7XJf@ucNkSTE6Gs$J zlwXCf55}o0(qQ0{C`-y-Vyj0*@k+k=(WVbJFb)S~yhRE!u85VZFbKjQV2x-@=ZA$3 zKr}0I2Puc3@H0Fy?~6j%kPzgU@?umFbS#kPGHMlS;fHayNqRHht43c!N9YvZ(`ut^ z7HjjuPYrJVKc0Jyc=J%WI{1B?``cbWMJI-`1p6n4NSOV_KcsZIw~Teq!%Z z%@YaPHi#R0lox*`jvQgT*6idhhuWV1E+>!dM-T}YCZA76BZm4x88(ZzA46B3Mp_AP zxNq8N3u932uc}`mMO|Rth#-@3d?B*?!YGIoYK_1n7ai9YSwHFSd2Huh>Sl}UONv?b zPRyCJ?Fe#|Gwn0fVja^N!6{<9&)fY(ALnk5lR-I#bpCwkx%e6+ypI7J>9IFO^?bqj z(QwSW+q;16+BJ9SDk$~d^JwTILHzQt`BxI)J?DOC`eNf?|D%!==|3ldeU-? ziYshzt)zck96-C~f*q`dd>z2Sb4;)kvckPTKpQKc^eIj)bLt`tkn?3+TInh*SCd_6 zqHG{lM1vFpKjj#AVdH2~mYqWmCmEBSTf+<^f|Yk>VYRf{B&u<41RLJ7xUl$rwpHY! zU@x(o)KrB-on8&W;slA>bl)FzGS(?<7)_5He!=oUdJ<>MCclV+%b>1*of{+eob}y2 zd79M5D5?knjcVP?3zDed$Ez$EHj1L6W%fyLU1c9@|BIQsm6%vUt;!Kn89==xbNv|qj^on0ew zq`jRnDdG`>S}*Z5Zup2+C6Afwu;?ymqC2S}IFU(Y>K0uIe*Bk6Us(qI7e=KVo`U-v zl+8kaiaesaBMH=}$Dr}d-GGK;_oY2w-|r(F!F*>N_t(KlVa4E`5ko-UCDpX3mnvW> zwUDuX@|4P`m&(Re13dRqehk~EVdpG)+owwKtJS#T4iq{%*FPiW;I;eV22OuJM1ogu zJAQY;)~}Z_(51tcN)y)4TTQH>hu@H`h)c<;o;?Z|dL?}pT_;y%(n43wWT)8Z3$>p* zfWw2|=v~Eaz$a6sQxmR?4WUO5V;TUD7Z9Ga*jO}yDNi$r29JlF-5fPF0T1G3*-|lb zm??um`E+J_Q|I&A?XkAy2ejjM6nl8-7~MKQb^F6#$AaVSBEkN7+=73~2lti-@g7J? z3xo~rbID?O&&I(kG)aC=&3T8M)g`c?vXkzTd<-;j#3@ij8i9ZxGmR;SjXOlq>otpTQ9O)wWDy(<^2mDevm^`$f&zmcy9U z*=jL-$x$+o*8__ntd^@MQfZWAdo3eTX-Y^^S~3_!Ub~q7sWWrOJ>aUTCt#FzjT)kQ z7QQ2@7~*XK^|ek3KTB~IjyTF`{W4IO${ZV0=3h5`AK(EK+{Os2;jqG$Z9Y@9tfWw% z__)$l-T&ocLmbx`YSBwsrmk`8#za_bkXJ-sk}+Kg?K5arr8D9*+jgcogk3it_3Qy> zxhEmBn_dc;&ZeH`O3@9JrC~QA;qoCp;fgVtyq|G+-9PX=(y28rdpe4GxCn}Kz9cyU zCtal#unPHJ+#n{qQZB;=Z}1!*Lyznb-K%UY1CTpc?Qa|#CWfVk^@ORi0utFK@!zFW zKA=OU0CVR7YuAS;lI1^PfX}7PBU63F#r`f{izh4)m7q`DZ!AW>jp%|=Xd(`yx`bg# zjvSR6!L@J6e#R)Kq7fgYLa$T;K>j{hNvAc@h_kQh?gB-R+-Z}CcQOH~`>h;dpl~VB z{OM#Pk}P|X{!9p))yA1Ht_9Zp3g}_mk$(e!&wed{lB^PYLP51MS3v;nla|7vViw&t zYEW_w8m_koTOe*eKShbUI;Wv6XcXOe_PdS^jD4H=2u)42zEwNZQelr?x${Di9J^oi zb8Ah{cKx4l;p|QeZOjjZiV3$1`wr;!L(%E^=Ml?rKqcD%-(6P^Uu;6LAoBAWPcU)b zk&l8$6qx(T9e$XWZjUk8Kuyi+DRzGz6RNdDZeR&9Qb{3d8HIlt{_oU4ie_0*q!bJ; z73bF@$w;83(&d?Yaf}}?pA_YAATtmhkU_f7t0lXil&bWpukN)WrKKp~`y{{0vdd&$s?x0-<$NRDBK&(f8YtKfyNYD(5E&Iav_mL{U!x#*h zQ7ly4EEjEy!>%tFV`XE#Jv+~vEy!tGe2-mo$jCN!m#a0Oz}AU1$3=7VW-ec&kRIDt zd0$@69n9HarBIfJe!*BYuO*aFE8XCE<0xC!HHrVoG>1>85NM<3G)r2{5M0K88my^v z@6b`oPtK=`3|Gy{Z+WWx#a!Ws8~bkOUsV`M<3dIoZ%^q*k)yB zpRZ@phSBaOaNh}UP*C_7%8s(IaO4Q%{Ck!8%#-rDAs5wZKU^`J92G~d$BZ#)kJwFH z$U70|plMxY)_Ez%hH~}tiDPw^Eg$YRN5=#%@dsq<;L2ioclFgtxwQT^gw@r_Lsmt5 zIU|HSyxcrtNm(k}A6P4_jd+F+1gc7mVqK(wvJjf5gRRpj^9j5jGhtP#1cI*yj zAy=e?PXCLWJ5(`Ager&MAITXsE;z!$uX049ByAuMg?3O6Fj6@6WG`D>J#9p``qW{{ z*qqhmCLhbZiqW6U;mnaZQH)mM1X1Z8U9}U)VTiN_Cow;9eV{MEZgbgAf53JQ_~uxr^)Sk8SAI9NK0_Kk;=@Jg zAD1NV>c13^nE1HI@hpm{T)CKc$K+uX2_G$8`=MwaV1lab5jxI@!$^~*rpomS&9-Kd z%y%}%0?;p)@+ELQOlH0r@rD!{oJ@mJv4hn>Sh?5vtN+`NahEBF{Pt}H@t=mke;VY! zhQR+h$VdOpI}G|X)7Lj(Qqt-67hUz|<5KQ`2;`p<2!E7n3#wd(El3Z$FXal^>H)vX z?OS%aI?xMB_5OGcdVcwM0Ch*3DZ!$q+SX4&X_P*XuV9g1Jdoq5o?R%T&?2KI&9@+CA*c)> zpKY~FASVql)ozx;FCK|SJWO|Lus@7M&}SWh1L{5IJ=#Q}#OmF;9MI~D3%r+k;>*S( zfg`cKu%$~$A&-eWo}r1o&r>%-l#s@tT8^ZNU$ZK(ao>*=do z7W+qb8~H!?)7Fj-UseVGMIa80_&24!LA?^x9Ykmm>>46(E3ah=x{qycfhm@x(uElf zw_6|-0gWbea_lOY_wu=o_Z!uZUM%YylW_l9_}xEiq|Fo541K1;s?`^nn){T^R$p^RyJc1bQ(RwQOo}U}M4tSo671DfiM6NAnv$*U zm(4fyds-N;4|qu*FkZI^zOhuT*gdm#x?`cqc^a9lCaP410v}21-U(R?m;x_07!Ky=%3D{2Btad^LXu{ zm-mERdA6VULvE}HwWpz^YvCn7x<~=AEpwy$wa2BPe^9D?Ph6k8Au-Opf9i+gRtaCG zr50h6Wh#={bu|ovxhm}qfy0b`fb`cbL)zgH<0=?J$3S~aCKbuB4X2PsTg5i>2)xsQ zct)#nP^K_0hT7$3@2QA;rPx{UTdCo-{o2cTGg&6p%}?BWfvnn5f9Q-ddr=?Ck5Ebp zM5M_BN)eLR>OoP$Hx5*!2(Z=7fBKs&Ce^I4g8a3|I{HT*0OSAavy(9TPeIpW8;6Nl zW)~b6CySUq@bd?JK^VyQ0t#|2rjyqJEfh5O$TLU$P2VT@7$0%2tM4Aj`Yd6{eBszG z%j+1~^^Aii4}+6mjK(#QVn2ea1hZCk-#~MY4($O3DxGk#6C(dijmtx;h7SA9g)^WO2acJBIRVMTI@E zdQ3y;WMeA;7^gF=`d05RM!>V%ERCKHlMk4CwE0u zZk83wvmeu?-vm}mO%n4Cn7}Ls-+=(O%k)s$Ot>bd)co-G?&_0y;%wu8A*Tr$)pWcD z$Gdn(@FmmB-Rvu-s>Y5BWC~O0gWO=8YPoanf0aZhc&)P2uk5vYFxEdF)@?k<5Ryp^B(2+AS=#hO`$9LAPtvafUy5Kb@7s`yl}Oue#x{L@*|)u+l_ff3w)X z9{jcOo*4Uhag2JOK7VERGp#{~C zcPpcF^lOYxN-@Axrot8zZP>a8bHX}@v%bs!q-rOEjQmxBwQ6t3W8Iphs;fHv+3RIF zyF@SEv~883y~xr^zVh>#LO{P%?hq!Gd33)TsCb|=Os*bMEU^-H@rN(zp_`Fol{_q@ zSax`s9ymz!k)?-rKuEp>1GAmc^XO$Wb@U>}j@t*Uz#@Cy5)t=H7|5)VUWx{?Xo2u{ zZYW+Hne$2Bw#GpnCD)EAtyZ$TMAP=`jK00s{jdTKVWX-q&?2%t9szMr z0fHW^4r>INTUO`}RPPDmgqQMtcqBZ~{kSnRz%{@`k)4}ST!n-a1#mlFY;duXsj=vR zjG{AE8Y1CKdeE7#`=lEYo`@d@U|ESu^>t9wD$e%cfbwp}$Qv|Xa zvFd#>Q$;#X6uRm;xuE>Ah||9-Y0@=RMV)M&0fR^WQM>*VC6o7fN6_$&MZcyo?!`>r zqCKv5*NCNZ3V|6o?Y}&}CKul`qt|&qpO4YLCF=%G1@-)-wGNt!a`>@m!ySPS6HM=i zb@LOcm&{81BuR6i_o%x?lVmSWi4H>;gdJ1?zwgQ^gj!Of90}?Mzk#4KCr4Mfr#(Q| zbquBHK%FI*xjl#4yfn-_L0+Z>m@1C-Kytit$!{u!Uduf)Cn~k5MnpVq7b2LhHTqzS zW}~2K?%WIxmE<4>{SZ%trHKf3m&9;Q;G8|f)&vJ9m8 z@&TCEm~u(IAf7ic9+>q}FfL6O=!B}|vrwG)(y8f5b?Y}6kh)qD6b_h0^!LvRK6Ea8OBlsyIed3eCG^Qni*@I zn>+KHTKB!HuXv|ujJdwS8qq+}K+6y6V^?>!l`bm@$yX7A*N&f41H~(8@rOrQQ@Tdr zQSL^ppHj-`4u=Y(0J$hV8YrjG9-yRnu~F`4FHjuQ%d+vvCXv+}%J1^Oq#D*|&dz-i z?gv6uN{}USn8(?x@DR$LOb}E{u`*Udlc>^54Hyl!ZxC1*?5llGsV(+3ZZ(Nj?zXDN zuJmbHgp-2_m<1QNU8MWbgiosCaLKeoVY&hM$t1Si*s+DxXmh_PliH}V7H`JzJEh?q zVUt1WIoa^_4>P3O!&scPCG;i6J)=18+!%I{&?pe~* z-@iz!HE$Z2iW7mEO=tFl2?jT^|_WX$y?qvZA zfF%nZG+p_1B{H-fyT{z?mg5dFgUvClOY^8YZyZK_lfcKshXql~ZiJ=RJ3B(`Br6;s zd0=O)oQQXek-bB68t5gG@2!RCt^0d0O1vdH7N;%s3X5QQk0mcIOzMH2w`)wJ3* zvH5tluNE9z3@>c;~KehG#OVhag235^VVq&5=|Ri0ZO?u$RuqZ`wP~ep*6L-Uo_5LufjJXH9!iK7{xxLaiNOt!oXj{%l^ezJdQ$ zr%6S=Ysr6QEtIeE_5bgvp{!@&X!Jjl)_;u}Ew+f7h-Eouk29q78nKrg5r(qDOsC;u8X@miz7V@dootewlEd9tBeH#|ZsWWT zkQ?!_is>+?mF!pN2>#2_&Y%L0KMAi%pa%&sZft*HFd}9n1MJGVmkz<#pj{dcJ8>?d zb>#AIqSnG&MiBXF8dd;ui~RB5VIGu`LksY(m{7<84_y9x0%_4Cvozxj8sbEn{g48@ z*&A3^&SnGS6KY;EhhlO@q!Wlb9dYU&jzOoU_be1Gy7>WhURq7IXpdA4mTWfEYbIAW zC=o6(q04jO#XFI2P=}$`W7o$+G?oXWqQt>OckD8Sys%kuo!+Ha78zv$uP1?52ER$1 z94j%BVZ6Jq_CALiO1A}h)!a7RD)-C&>id{a?o8C~CTrED+C{5@U@XfvRKwEZ(Q9xX zA%b@643N9bxKNL&_^TgGIB5TG--k!{$6))E{0?pI$Z`u&tASybr#yk&G-4OmKl5BR zrLIcf$W8~qu{$nNl|A4~& zRsR0f>?Nu^+iR$xd{hxUtKHnnuiBomnUR>|3`?XjNtw4-CHM79WUx44Yl?V;nf4g)9Bpn!y-Y{QKp!)H_u?ke$wpbhP~)M| zkxAGR<02j{-aEBt@Yv`^10owlGrDfL%8K2uzqu#Q^<19ZR|$Af!ssFi>!OLU4jEz% ze9-)6a@|4oXP?ua`w}rJ;^B%r2COH zql5CzD4S_8YU(tBdF4xx9k?=A@Ulk4Kr0j!ob-iNp~`e}sf;tl&)a=f=d1?L6oY%q zg3j}yHnN^TO85Pp#xTWYqBKHduUrxmMuK{Fw~uWkIE+LzO!K7*-T@D_s%(kUvbvcP zIowPPQ>d62mZwvB8$n*FEUoh`NyrRW2B6tULHNze6ywDf({cQZO&lvp4g#FAZet^> zyv^e^2_(0rg@96hTE z^^7e+NqPw*s<0Wco1v@YSBQNwlsG9s$t-GGf;1;d9Tuo!YTo;uq3n+4sfyc@vUQN* zXEA|N#&~gxY~0f1Ft@_Lx1Flmmquq3+n$wFl&5P6c)%JdBE^lg<8|T^o&bw3%H=Cf9N6e>eAJX4NAnK|I@uXTAHQVHYbs{NfiO#Emky%b}74 z6k+_m%HPacue+|DDqXyfP?^D1w%C;4P8K2`KDtSx)B!DPykjZbtsKh!9JrD-Uj%xJ zBdKh(>e`S3A*$d(J(lg!Tb1{>~5d zl>rSiHKckr(;Wz5se%}mYx}p}K2n>xK6G3bTMQM+F-T`^E*B(d5?q8`>tP$-DomHv zK2CHd1ioti(VKzWGAW0S(Fx{jiR)bz{rAPZ@m^9XE~wQ$$R#ML(bIABY?P}nZdoH8mYGh~R%AAyHwl>zPllE)>KY&sWnTdcCR!f=<8T7=a5-_DG!Z)Vbkk;( zu%#PA4M95PkT=OpbWps22ezFAJvYY7xhe7Uf#m_A6N=N8^jQG7HoM`|ugj#_Kzp3* zIxcrMC);^Zu`Vk;u)|!x`72FdXVjau^8;03nyVj<4!I!U%yq#Wpv!_;!S-f!Oz@kC zQxG1=EcCvenyxi6Ld@5IqmH@vhBu?ibW3b;gA6!Z z=w=kw)j4cz;GY#u_!JBBkXP9FlY~BKvi;upjV_RmkQhM-FkO(d3S@S8tKgt`1mwvck-=5KL8by0Xh~ z%_bOKo!i?zh~3O9-5hO5xO6C3!-GbG)3ZtNQ%@gLX#z46Oeu&#sR}klKPL)|!~TSr zBHHk^on1qwEop(mCj7pNMS=OMoS96ivEa&ctEDOR8hKH?D$hf*d8JL_`91dpCtpu_ zz-7S{UInPa4e6AVb;|B~S!D?u>%i8%iqpZnjCyTTS$$)m&2-37s4&?GVVGsZJmFr# z3N7(o*+8I~$>Und0vo!_)#CU4{4;8eTJ12)=prhyuLX4(Wg1|CTR0NmQeDx&L8s-T zOL*eo@C#4+agj&aemt_?B5>YA<4CKnMA@c@^-u=KmBT?_($<)ca^)3ruMLc}%Hwkg zEQ)ojwHshnj^y-*ro`1^6qF_&;JM~pjnrYVcg5TQatFuSkUjMs+$|#mNrE41Z3;Mm z=jd0ygKJ!{Iar&RwU3=jt=1spk@P)2I9lgvz6W6#X5k!?-_Sum3?!xHPJqO(LZ`i><;Dm^KZkq$mRue z5r}W!_>ump*Zn7$=KpEwY8lfb{v`)1ba^^Apj_T~g4bfoI?-#?uLa6yOTW{rg^g>l zk_y6LUG|X%&D$M~IE$RSf;beIY;R3-dHTAG)D0Si0*3+yB?2YD|0%TSJaOxvUSA10 zZ2Bg6r0x~ZMvxIP(9GC5Wmak#YrGRlO%i}J$t=Od1twq&RbF^4xyAhU;X2SNsT?mX znYsbtPCcPx6{KBhudu2pF~io5LVU-t_>@sCg~5X}(DY~fPy%?H%2|n`T9c;5&S~QE zp5hf=0{!h0Ylj6INxHe|^an(x4PpZzDBfuamgARf;ChMHU9SYR`}Kwh?@7Q65IFy)B zXw>KjVMSI;ENMCb;S9;chk2NGiohE{=z%uUD1IY@(%Kq)XH=_pkExL~8lHI_vjo5>NWXmT@^qq)4X(MQg z2v{#K9&%)IiUQtk${!rwt(zh#Oj#|9>nWXTbTJiy9#WYhQCr)4^RaEyefD;D@v!>a z#C8`JkLFDdPV)Lue+rt)k9ZrUl)+A$tu)griI#0&ELI^#e5z(aM)EXrzAozRr~orC z@I@F;{}-|P&_T1FfsABq4cL!jK z*&ILxUYmHETYBrkp6x*d9O%H%wi(28$D|a5Q^ehidUUy)b2ZIJWb5=zlpYfreoJfe zAu--7^jox7^HG=L(942jzrKK4b{YkzH5jA`SsEA-6lV~9w^MZti$%K6yKKj)h z5q~ub(LFi!ntc-+i`c?bU<9+%5P_c&OCM1ZQIDRB_`3=n2;_cV*dKoiCVgft1Brq) zl9zBfi}$(2J(J8)F_C6|t4$x-QGA_e>+2X*Q=~I7>%7;2aG9DO_Z7f-Vw5;aaSJOIZtE{4}j)jqAEyc@bHtVtNWd<4%!;DPRf)xxC_82=yrL`mag=mGtP>f z(+n{q8gx$jLL6{p1*@S=uonn52{q?~LRNi+Sei2*6wNH+AwrE(DpUeFjISK*EkiwD zA9&e(MdQ24r(yYxcZz;IGIA!F|L)M%*NxMYj3%%AWLi2kI)C}QaD!vph`KhmE>oO0=bsNi$qa=N!C)nmE|V}`Uv^c)INzg zBeib3t(TZcQid(agfpP(+0tNgNQtXHBOSWImEUf8tpTQb2Lcq7zrxgYf=913)HzqU zS+_&{wJI>N__?ghLN%RT#9}WC+Q3B20zyQUSWZ=KT;`b;|H3lW$}NJ9NvF=)e#2aD z1F5~Kk?>*tw<=^}HViKb0_ZG5CpkY05?q`Xv7pJBBcEwDD|M~vvKG=rSgo>gWSvn< z_)esV>9Cjl3#@M1-+T1^v2n#|SHp?g>B7MUHke1mRVa&pnkU=>_SzR(3T zE@e8x@k~sb{OlM=M(yVjQ5h!9#O*3wA9zOWIA|+upxoU%WQb$B?0v%>}! zA+CuL_{4GPFWaBuLUTwH;|#YvBmQV>8jccgNYzpI*2&=UfF0}nn7${RLQwA_aPvdo zM!yyqf-Z_ynRn*-g=nn?xP$D4sUtEov3Uc5+6L%It~Gb;CW--Ej(L4hb<*FW`k*J$ z-j=pLcuF+DjC(=Nf=*^j0tRN_S{r0a&7>WvyYE0#Qa&&$BhBD`z#_tKx6v{V)kWM0 zRqR%5rmm^rQOAV-$`Zg`zux;h_VK2ZYV*FJhLL|%^!$e==D!u8e?@-ezqfQq#ZH!* zY4YkhYcsklY@qxBTf}n2iYVj+`^0hx(diEJG>#UA)?p*yKY4<{V_HOiUjGfxjti&@ ziFd4IUO#1|W`=)$yxxO%BXK$C?M8uvJL4d8tExWQKof&MVuOJEcr(Txbs$AlBVqKb zj8;VDA_1w?o~b^0WZ;N>C*nyeR&&fzQuL(muU&TE(aOArMWO7JTB4fdhj@g1&fNQj zh^j%6R1NlCCCQnGRcoYemI{?w5HN4Iva7?~^ zEa+h{HZbjv-!kp0c6qkg?0T)maPLc~v0o$R!UE>KG44R&)<%8rK&#D(QNaDopGpN~ z@XW&?DecI5AtY9`1K=)=jspfy=NWQqce?RWmtfo_MJs9UqK@<9S4fVH z^Z@tX1dKs^fupTzGd{}*ddHgA%Zhl)2^u&P49I+zY^czO7k&gXRR96WK)+H%b5v_Q zXs-HXHA?(J=qn11O}@nJAx~ygsvEO<5S|;gZp3^TugvFxlaHYLpzUW`w5@ELz)5W7 zr^r!GsQ**im4L<6e(|xCB19okw#w3;5G~p@G;NcjltxV%+RRjn7E?(mDI|R%Oey-3 zv@a@Il1f4%N(-{3qD10B0q?>Xl^?|IilbfR3XvA#+Vbm;uZ zH(g!4JH73uS$d1i9gQE(xhXe-2QDd0J=!xtXC zrpnLYg=lAb-$696N!coAS{zMBbV{5^J>k*BZ@3lb1@DDAIm{m`@}Zz7b6P=t*0Tpc z+V{#Nw(h+*L9t!;M|5}5dsUiTfqcN~np?CQT8*D6Br+N6z&H8q;pj-x?6snc+qYD- z?V7zJLrQe7noQz>q(x^$^+fNqX3lR(4z-=?zBFQ{ULM@VPtw% zmGHCW;;}EYC2BHOl`^JQ7*}sgnbd53n)<#=u=&-bTrc~_kL9gj-xcnT5Bp~^KCc|d z?^m9gcg1~M`W?Hl8}aVBmLK?5s27oK_kBAyOMlAN*2V{?Tw?i*Z)6Bvs!Vj+M>F@C zdF^eVBzg75rE*svx}S9x;M#Hm3hG{VV{?m-pzoj+Z(jwmuMOHsz_H}J}sfw zBc~ZwrL;$gShBrwwM*F^QNgX@H)8_6{;;xiBRtAqN3)iaIYu%}e)>;Sfm{6bh79@f zapF?v=WX?z{PEM1o0PPL!e@8l<T1vAJPJhs@y^`krJ0-d^HR;DU^DNzw-RnRI!6Ww<4B)diCXG&o`aW zF&{2g^baiS5hWXu1c~#<#Uu%TYj+qJ%7AiTJ?NDu_`t`1oMh(F2aa629Z4jZHo`ss zvkH}W*cqMSv(XX{o`7GnY_DX<;R`9p=JP4cy&$>5na?)C&gl}d%;U|OV_)Y@6Wq~x zqB&&My5Pi=C6}|++q!pOXq5Cl>pw(;8ta;KOy%nbC$)Pdh?MnHFwA?V3$@YsIg>F1i-`l=#$1 zu*K!OpiN^FB~7G`@IslMur~WfhVPjE{!WYp5eSFcO53Ty7?Sw<9CN+h3dS>i1!Ev^#vGIH8MD}kQbHlrkKeIsM6 z4G+1OUMlXNWHqq=srA8|V(rPbwSsK#VNd5{y3BU}KazU5BWU6B?##`(AjG zl9I8~35VC~6ekZ({*IfWsMRrH3LYrjvKe$nRxDX)FY<=gQAFB7hmczn2W zw@LlW$J49rN97$#IA9f#DdxE2_zlhJ`01M$iCLd<2wr$ZF4=e2>E^4JI|R>-^56R! zXAwv0&OV^(Jf@%Daa0w_rpzBV&;L%Vdi`n3uHpmE8fIN)Hw+|$%n~PPYp=73t%{7> zrKR|B^!HHG%)X303+s+e?>gi(BT0KOlyp1w+SlN!>W&Gp^Kk*b>9awMqsDSW8LM7G z@p*??&UYDCm9HQ4UhMd|?!E4zPm0GDOKn-&rg!Ws@kBuJfPpO@{W5CeQHZj*< z(OkSV@0BYn)Vf34ZNt6PcUiWJBW9Gne}Z2U9-0 z{xYp5t6VsGbE@mShUR>~y5 zh^fNMF4#ym*PC%xykLrp&i27@*$s6W5z{J1P2{&)mPS``)d|@@itp`sIXZ2?JoZQ!4})H({qAWp!i^>sgk$*HNWb#glLD}^0WZ#Yni|)mGPPt0e9v@hxw#Ov?xOn)q7R5(F+WeBO zONt-P)m1-wMH?ju5v5L_72fcjN{qA@ADg_T`+Q1NiH?$FW7*?{U4EzCN(LK0zN^?K zazkiQZPa@igLY-VVuSiXs)j&W;pFvYkpWrJlXna64xQTH(UB~)YUXYw;YNdVr3y7C zyUq-j?t3IaFlZ}OQ`FAHJB*v*oZI}px3yxQ;l4H(|M1NfeV4qhHP0Rxb!d-a-{*?w z-Ft~`wCda=epl-Xj&D76u6;1^TYAt=Qi$rgX6g~N{?h~^*>qW>G z#7VEEAKK>G8LYQViTN_-`(5SMh@BlBiLza_v@VLzE#bk9U$1ZetcbX$mZ;_ul0*wMpH!D}bk z)rain;l7>hM^k{`z>j}GLGBUd6=fJq-j(F;GK46K6A%!sah3#$(fOs%*Rc_Aa1^wRT|irwr+ ze(!6mQXgu}X`8<}BSQS*&fwjm3djC=W&44EH=1zLOiZZj-_j@b?SpOx&Upf7+U255 z?4JcRw*`s^962j?gm)42L;yh+hoqn(EZ{SuItuYR%8|NcKU$5>dCFyPY%x67cw>H=%(4Z zLK_rI=mVk$lht3pR1cyqzagTL%$Q}Y+quS1|B$#@?}8Pg&v&OJU3fg{ogj5(@^-#| z9o{xL9@~|esjoQ2?}_}FUR<_zr$a=}shBvUmbGf`N!^d;nQkwhwpBpm{`a#r+5Cs) zjN<~A#tsf$`5l;4Qojs($$bz-{Td5|vuQ{7|Im&n)x(oa^`ekz(v<`xo1At_fQfQ# zb{YPj!I=r&lV@}mmBt-fmUZ$dCE`;b|5HsZdv7u+>AHl5wOUnsv(U~;x#WVadqj3? zk4>B9HLL4)ksUST@&8B6Dkn|kJ-9WqeaJXZXVFkMv5@*y$Y}k5{Cg`x9Y;qU= zzyhQvI`R?nV$hLI4L?64=$POQ4TzQs1VdKB``9E5t$d^)gw+5O+6}aqU#zl!0Y^+& zzOWhj0@aZJ`27s#=QxBSl0OKci2i=0(PA@!1}WhP;_XFo{UaxHP@H_i27wHkK440J z1d~94DT7)6UacXHsALzi?;oMie7RynG4D=hH4#KzipA!VF~T_9()l=?^iRGJ6G`O= zHY9FcGRb{Ch-^6KWQVLDeD|pdKE436K4{28u$c9GRfiz;A)5p?q~hX^mn$Gh-T{-S z$UbalVbDvaV?vs_lDwQfsBTg^RL89pFS4VTH+AIt3U-zoYUlR80(?>EyO5(Q%)+2s ziF3y{1?K^&7u{WmevqQljk8pg?!Ts;1c_9@?bm3jBua86!5K2Gv^RY|aNP{BNTX z&tfJbyczVVYq3Fx#EF11Cve#HHvcH?1`Qy+!Q9ZWe(QLF9T`uv!#c-==MMmPJ^-za z;#QBq3+x7hvDwcq1@G?Z?FI57lQ1m9+V|Sm%@83K&1DyOnh6ioINL_+=eLsz$Ki0Z zrm>rwgFPlFY>K2fK||yWDSadA;B_!Je}L6MNyXin6QnodRCTt{yr?8cFMY@@42^{B zgsdm(l4ul1mO~Qk^8X@U^|B6BdJGI3*@(_840^)0zoRrngh=+{T%%aKeeU8wXEt57hp+=AUiY_E6=~9GPG$GVqaGhjm9oB@9K>;D&W4N zpwm@mRs`M*`Wfn9QQ-`~&@iLv5>!GBDuMRED!aMDbGSZ{o&By_=b6dC?h|-qQ0(gj zVB#bF(9rrcXP!T8dF3_{_?3rV1G(anSr~NnK(3ew_K@{p`5ylRvC4LU-u4@MGW{>m zFnZfPG|!o>>@lMg&jrm@Vny{M$R<0h|LEA{tpWiYu};mE`G3cH%6OvwFU_zJXuc z3;ENfm<+?4LEm+l8!~6as7&$lNZ>OBB!T2yXBGy%A`TN#&%+hzoFR+zpL)HFsB;Ss zafHr@=M@^m?6Qj|4> zloP?)q+x7?cxeGq{#B;<3P##;6b;CFV$R05GXVnjAbnSJjq%8_k`|32VU_E&e^My2&aM=Z!u8~DX!o=nK7o+@P9euI}bEQ9tTN}g}wmYP2Pey5u?4L z@i_yh+&Q)OI!IYa2!~sO5=U+qCNSQ`-GfTjBhkp10?`N|J~9KltB24VE#~{Zn7GCi zSo0VfIFF=QWseq4teJAW2Sj`vI7T~0zkVK2hlV*!d2^PB$oPcH+dyFugpF2Y^;aG! z{C2|zdku>8Wv_e$xw!x46#Kv`F%FKl|k913qN-XoOQdhEu;(Cfv^u` zkH)l{#03*`q^4T*S@;Y{p&q*Hg(yD1O~J;rSZ_q4ZN+Rn2b>Zf76B--FtPvz+5;)> zv5drGJtm-u^2EwnV0Aa4_Go|lV-_YLf#UA%MW(S`fyJ&Ud9~3QcLBN_geryN)msu1 z+Qi${6_Z&>iO=QV0nr{@2Rd$yorj4yyn+BJnhkt;n1r!SwtFoG0;Yk58KRi}EX9R{ zHO1A*kwkSGo(MK0!5D`sg}jgeZ}^v-t?xvu(9k^VSE!mfie|{-|3Z@!BSbIENlmQ{ zy1|tYPa1%dR-nlH%KiuPoa?woHLDuAbi3y_J3Ft5NrVV9rtVJM?98rj*`^HO8(I~c zV^i10gk~-V4X5sg#S277WU3Fv5o78%U%%9BDp06{M++q-a~-Z!Mvx(Fb*8v@BP%5^ zexy>dhQ8zFOM^r}SVmxo=otL2F0ZtPD@OIhiZ9hCpKJ%0fh&Xu9U~hW{5=g*cMP$) z%naRu43LnOOEj5s!@nm(^rUb$uLR90yExZowb9>`vE1pwnarGl%86@0G3&qqp%qgE zm)~KyU#6*z7{O1)V8rIE+3L|WT#Wyk21ba^nnHXH%9x8y|C)v#cor8As^8CwVT5R` z$!`r%L?bNzZ=#&_#hUvF9Tl$G@V6v6Q(#RBp@gbbp))3h;m&}E-iS3_0XhaB>yC-e zAK0A^|JDe~`flEDs|P)=S!uYyFsoK|dPI3kj}6 z5Y~IK&_kT(p}Y`azxj<_rL4EttYUHxZw9>v=IOZ02*Do~*PjO=thbt=brBxH3mqOt zA*_d!(I(#j>k?e6!nqx>9@Rygyw`DT(BDrvv&)_JBrG}-FNA463}#Wse%TROkMyBu zx3f-QBBG8m{W?#}j?H>x3cbXod6HLb&hlkFQiGQ7%0%9fIpeY(a6ofRJIfR9&*M4l zvS8gFkLFl2i8o}<9JB6OMNh(PJkJX*E9!X6{jS4J9ND-w8)h4SZnk6Ye*Lv!jeWE1 zFP4yx@xOlzHjA|z78~_f1c0DM{RJwJgRQpA-LVLTU;ATO_hzc2oLb9&q%g8umem%J tt)8sABXv=Pg3^DJE~bE3tAY^vweizz9UqL;VdxA0sL(SyBbyy?{{t;>+Fbwu literal 0 HcmV?d00001 diff --git a/lib/imageio-core-3.2.1.jar b/lib/imageio-core-3.2.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..60842d5ce72990a0fbcca3779a824ac23fb13080 GIT binary patch literal 65232 zcmb@tWmufc)-8%V!96&^-QC^Y9U6D{pp8RtcXtVH3GVK0!7VrhyJW5P-EWK(J0uBTO1_WftGExHMZy(tA?{Z?QLUdB{;tY!K!_Yxs zU|{~IVd#G!CMP5>B`&6-N-rmF8#^iu&V&xU59kolCz7g&6n3kk=?9HFR^R!t^pQM; zn2TklnZu1*ncDn5C-!Y-IhasUs!O;mH37xCap#mj29$)Xey;CMmL7}rE(h7{&Tdw0z7E@TWH?5806Mg;u zwnuyuim&AYkPqqQ555iq%N&X_&@ch%qcaolZ>t6h0`hx3{#>?!e_1w&_Yo%cwtuYH z|9S-KUn5-H0XA*`TYEcefT#1{#t;6>KjQu`$6MMOnFB2C|6v}{Kh86;x3PEnhuH-G zINRC5@*n0B|MOfICxFr47wBJKnD8H`ySiA~{O#HQy8gez*1^f%%+dz%=c4`@w*UGJ z#(#WCilaYyw9KglM)X2q%-o(bp**RK$(;ZC={k3@6bk+sl)&dT)Xw{fl0FN?I z7==ocXo^r8M6TjHIZjXVxZTovBIZs1ZqO^NhtE|%7U2k2cGC)J$Kw{^&gNEvhxyk+ zzN2GeIWu>&^Otk?i#6|(&#%|3@E{bItU%HSMxc`JVX+Z4FtUZLm{5#~E;|LF8%{zf zg09iuF%@LpLT@5IV1wYzh}GZW;YSNpFh1-@Bvwy!WQovWBGa~N2KeCin=?x@(HbhH zKJo&I>stL8`fg&d&qrD)L=u$D!ZK&&*7+tGQ*=|cW|A8_^3oc8rW;+qvbTBzE~Ar` zn{f(d)RS0Fv!>=bzg!yt1w zqt$zaIh8*u)cFJ?ekLGvifL5vX3pdCdocuzSyp$A=?H=k3pSo}H(PfN)q&`=yYkM= z(qL>jxQ@DD_prOS$Y8P!Za49)y67P6jHc&lu%#F@owkXa9yg@ITpcvIBV*vGLG?G9 zxeVIcG9i#-MV75oi{@Fdoxy#pgjWeKtKVJG?$6q*7AJ3X%*!)Gkif_s@P^|&Pk@AE z<5m1J=m_*9u6NR?v1Y5*aaV{U)W|gn@2RytOFm-7LmYMUbnWW4mGfA0)BBEgMOA3Z zt7@1#v9+u>{FM9Hra)mpIff<6KtM8Q3j=(~s@AhP7Ef9Q;}v7-G}5Zpw&$+a-Y*A3 zOAdrOHue@4!o>k@+lB=i{Y*Dgq;BDfCesfUo5!Cowi(q*w1Xq)Hp5;o;s-3IyV|w! zAS+`vmV0gTNX!=o@m9pda24zx-$(~(P;!?8oaWnVVwCuAY{4f|QY>_Uq>}A$>6)1K z2k5*55rJyFMv@woU)KiLH1}OceTFo$+#a|U<|*(#ZrbMgu0qh`h*l=W_-4hCcl*Z! zI1Rl3*SPlPcLPB`NS~EdSTbYQ>{|J$jy)NYNbtk8=1;9EW@d)f<=?(h_=VrOCKHLo zQrdZ0*WpS+sY{Alv$jZmN`gNnev9)c#CEN6dyLCl5BTXL2MJY!u~%Gy_eiz6ppHMS zjtRblI@FS6gkTPa{f#NCdp!N=yLB<7m4m#BY22nPTnGrhW$<|vsi8-xT^TmnG`odc zl$n(1A(G-uXniZOC1nTbUFLq2Td)mQG{sa9tOCuRHU1}j^1E5o0tNpGDi;+4<9vVL zte_ioZoQdF+hxoVNZhYOk4}+=49EjBX|67SnQuf5AC7SHk6eQnnJ*>1$!qG^Ko5oR zZ`M-9u{EYbD_m6cdyRA{nh%)dc~IL>J6V;jZxEwN=A4Y-rQ%~LunJ=rr*cLPrg(+Z<6Ct>CswHJHW?BhZtFl)r6 z-spME<20uJ-ss^I5HD!NEy^Z^o9$=*u@Bww@T*yM3sOd~;Q2~VI|*IZj;MqlzzsSw z>C0}!)6H(v*n=oUEB(WgfjyQ(3ZgbepIkxYtd zrbL-wiV1Nb3C@LP;lXC`vO>-4N{=FyALBF6ha}-NW2q6lovI!3jg9ZyDYj6de1{kj zLue8GDhRtW+HVmZ9@2w1jf02C!ZpYeq61IN6GNOb2IAF-uX0v!TwW9A>1Y(Pldm`A zKyzl)OQoV?Zt(@~{98IIKM5K_58jD4_}_KWp5+1)4H5*T<308Mw@&!iye#&Q3HQ%x zBqAjyYh*0)yE2K`+qnUpTmVjFQZ_cOww88Ab}oNr;VM-b6*M8_SMoH|1lIs;0#t~o zz;pAw;yYTZXkky} zJ4U{j)Yq=_?5xSn%}Q|2kP0D(%=qb8P}nTgi6M&tt-4J3t&S)m1StzFAuKS9?XqYF z1&?F2?<%o@NC0Le_|1Nh6%VV(mw>nGs%t1 z<5{&n7aiE9cSZ=Z{SWc6`Hw&4t%S`#pw2=#oUbc;k6yNMnKeB zpR3l8c24K3n!quQ)6E@*1nShC^0{is;g)O3?tj$bhzz=1rvylHxSFTtx#Ibcor?MZ z^XLysL;9_c<3}UxfWhb@j3rod^JPnYvse}4m~01ba@Sn9p(}*g)Yxj+_Og9@R<#4; z(v}v3NeC)*P7~!zkha2DRgpICJ1zcdQ^e=)C4sC1WKk@-Ys77V^stG9io(%TVW28-h zvx(@pZsX)~SD*z+<5NWVtwBjR!iA<44v8TgQqtiXJ+K|?i~HYA!OFP3XV68b2JjsPviBdY9k z1-C@w!M^1yj!Vk3cQco8!$}k3R`&-m(NP z5NT9A392(jo_cOoYNl%=zMO1~a;$F~oDaykCtUD7cGAG?UHL%DwW`$~d~@Kiw#n5B zW<0gZD1370Nurph-WQ(!SW;(Cc7^tvrW_MH(5&DfAbC*#L{sknLz@1{%_3DD8+0}7 zSF`)Eu?ZJ%Bg!ny2!C56cldSn@AP-|w(iUNOPCg;jj5cgAI@yt&C|~sFwjioWYP1L zf*$g>lSJc{(Hf(X3}M2>b9{dGL!%K!bsZI?Ks-;@>QpOmn_o>n)*NJB@VxnW-;ZX1 z-0g~C7~Mckm5>A!M)gu-E5ivNnujlfB$74i*^HWQ&Q)W#YGyNwGN-wU<8lG4ja=jS5t`1fXNr>~BiRcl4v+JU&f_ z^*V;nT0b>b+tXyFA@i^>!5MD4Z)>|DPU@#;PaW2Hpfx5gVdVk}KNT|iL?Tr#v+eT! zkTAaq=0LP;4DF8T#L%RYASFhz>*%1aiIdw>Dov}NdBZmaL83(IB68&pRigFP1MZT^ zOpILgDm1E##HS&tyXeI5Cw|aZF7t4!koaMTczK?ET6FU9#D1(&@0D|%`hk2DQFw8x zl@-qLs5+tnM`6L|&&H^IQkihZ40n*zF`CHuhd%<%^bSAlaGj<&a)+^S;`KpHz;gaH zP)AqnS3n)dxpTR(Ah(uB{q~A1;W(IZ+fkYzK9SC>D=glG?`}$*f`$xVM946E`2{dW zr+Mch@i0uZH&`3`Bk(j#L=xqD>(~ zKzT~b-1BkUDMPjxk|pB?WK=m4eIJXV@4x|}fL$!l0EzpNjql?F)GqoAfEeTw2u(Q#mzWg!UfZ%EFrLwy2Z2=!?5J{6FDz|vrW_# zCs+ZdPmi3Ymd*~%;3eQT=2k_frB?p_0e@(mpl+8FOT`^c+sUMs(g4Q|;%l`>5i zOzK#4oB;RWDfCWMCExurd5~}!IOz>i6bMBp+o>k%htxgTS{=puq?4g#{dK9$9Wg_l z!y)AmK2={C_PUH@Ux32`cYAKAXs)kF_Rw|$HGh5?VY~5D#`YI$wzWdN^nPKVDMvTN@Np1WZ;mEjgR<>la0{>TNFuQjU6B3KQRET#I(~)xok*v5 z@^rS}+x%(hzbDdvZ7^B?okS|9CG&^cQE@Ob0sNUleU)q#W)0E#itKeX1_XIKe!b?Mo$YPmC0O)q~;l=@+aUcpGMqhWJq=*QrV$dXtt$rHORalDTY!k3@w=6^=_8X1owX8y|i zcHrWE$`_leIv8G=i?u8iSsx;NIkIDn{#vEK#1`334&Azr_>w9uYBXQoY1Or#%Xq~r zRoUDjL?cbgd)oAI7BH|_zB)c0xdSk(AOY9wcdaZ<71ZwMoMApMqwG~=LX;Cr?nVgG zviLYsHN}x{GRWif%;<5@ae-59@BWd4*Zxfa%ZzcD*!w7o)wsKUX#f*`VZL2*FeMw` zCCZk^OD5xP-Tz4Lt3^K89q>Cgn~aKLq7msd6`F*ee=j=VzFP%CHi=p45nb0Z{>>Fw z$FQXkR>X!vot{Vq42KAd}Oba>HN9|6`h+uV;Dm zQ#gNoK|DAaBZp7Qo+e0Pmyl&P$t`Tpa9FM=C!xS)58?0V%zsJq<^=-**?BMZ|E!?uBoN{XM`rjjY{__A_L!M8>FJA7oJ||m#9qbe<|w=_J<&CWjvtnWGah6V420GJwEQ|4F5RW-NX3KOP-#aFA@rr z$JaYlmxmNc)`|u4BL*RqtBMYN;nXcIKm29a(U<$ zRO}#zG~dE0Pmzc^C8hHyf0wQ8_H2vUr7xXkxe~)esKvLt%;YXgqcwmv9pTVofzi|u zn-of%sn{sfXabhnOczaGO%?1-S68f9XB)5$RZMC-Mrf9h+}YOrSy1QmC*au=Ndqr| z7)k!HQ~HtPHygX;iC{FAo5fH1k$7%R0DRk!ZYkf{{rWIlfr!=%MYi~_*C(HMBN1>f zX?XV$sEqdz&0g#HeZNWzK;>5b5TjK2^2MCEKi4XZq#!ljPk5*LL(`N_5=r|+@pObN zIDTc2;1$8?9f#EZvi&R-E^&@*#?>oA5#M9j9Qcy`6JF0ssdO$rIJ&E{+RaSyFN)t- zbD?L!0pE8c_1^LR|HhjAKg3!>SxD=@kY1JU6?{k9cBL?Sx+!~dFt94H%%cnjR|zgZ zpCk;cKH56EIGoHfviX-VfnYy8;dhNo{Jv#vQ3!^$$gHd!``5H}-zN`G$Xfq0bXAw5 zsi~?0=+2R}EsCqT5+lK0#vp186vn<7bt)YvUJ7k9#j6l-V9Q<(4DhCSH@r%_kv7m* z-%V<|)i#oGY#b|6bPv9sz16h6%F1`L2C_-hoh+lyXA$X+o=a^k>zbS6i|B}d3_Id) zoXreBqT!O`L^K(&6#yMh@{hf-cBomisB2&bIczOWUKvMiPpdyFKh+o}@+v?ikM=4C z&#AdF>z%8Oon5uok^;Mn`|y-T%T2Wgc>+GKWY$-a#3 zp#xWf(DWCZ_A)B|S8o620F@lT8P>z~kEm3O@gd zbejFFr4_LTcSVPQ$WfF4$tB3$>MO987Qp0U9F{L%9^sd+`UdeEX{Ov?cfXO=`bVVM z{zIf?0G@vVt@H<_`8cE!*o(C{FPbCSAxT?QMd@Jr7xQ<7HJUG1#AihlRF6s?Ann#* zB6fsbP9(w;8X{T};GNAU#<*DA&j$}iY5W0WCyGp80-}Tvd$|V~2{K?26A(sVV>yFd zI)-zrxwFx#m7_v7s|k2^CCU)w{h*(US&kYiOe(H31G>k7fyMd{Z;=46XoYF|hZgJ-fU(<_## zVK*gH;e7DJeY8|9pJ109RXo%7GR#wSxC-Ll<6tvb>uYxIj?`oNv1Mf~7q`nXAnLN{X85O%O7Gr|Rr&&|WwFXK&rq1O3D4eX*) zo4}A_KY{%YfiS<^?A-Sdu=&Rj;QbFnKvqg#Oi0;4Swi@Kru=}#$)gXZ4TfyqRHb31-nG?fwx(>}$VpK&h_&La|KDV)+71H{dW#PNQCn=4W87Q+Jv1Wt4#rrvBYL#YyEr#)Nq)$JD#PPbazet@q3A*NOc7DWR>~?wXqN(m+Sd{x^wxI-| zkCA*E7@RTgLD(#eox(^=8nenw&NLqdwT5yEjam$7*zH9&gOG!{T}D2K<8T({!0C|~ zS9DYeQ(?~9|3u3e9Dl!GT#S}L1xyH6v(=0Im2D)R5TmyhWA4B)fc%k#wzqv4IqYV` z+#+ffXJRUzk=AcSJkh_qc0za}`_Hk$7}R@-7g6K18fxBxYOHwhwlbk!8&Y+b4@qWRVbqy2zu@ z5Ox%mfbszX=@arB6^s&YI)t7ORPck18g2Dc%(ksO|AJ>Xi%n!+71^hYS!eHN)Ot9l zT&F5}s~EAL;`1$M894Lxd}=qst{i%?2lEJ%R$WJBvzIN}pkhvXX!^QrCrh5U@jSV9 z*u`bP=rv}$l9)Wj$E}Lfip9@xTSb_Y+z1bKy^>A{8WjSFowU?yp;UwjlEHN5+B-Ku z!t~Lxp<vcDsr4*OD3sos@sRM!gpXFQu0~RgqNINt~pXA0zSLCzv zx{FKcoK-cBi;`###u;TZ?r~SMaY^B@`0`;xI4CRbBwxmFPOs9opNV5e?JzAkvE@}a zVn)Ik`^qEL${kLpj`4jA%YiOfHvT*fE%@Q! zfm`(mCa%98h?Lqf+qXUhTeb0V)j5O)(5YO&0Z{0cJ4BoZrf|w~5ndUqQw`g1OTYRW*=x;%^nvl->}18SYE&HksA6iQ=>K%WqW_<5T*L6nlF zDNY^b_NM6Bb|&s&Hmxk;d$G(a)DEe@EcqAoJFu$6 z$;Cr6fo(AFz{pd)sM-t1pcj9~JJOv~bFw8&U;EG9%uk3kry9J4$EHi{U51lCgE6LM z{JcY4)>fPvi)bvp>kki6q$XLwLCcl+zU4L{} zJeH#4HuwW2f3Qa}W?Ue=Ig|Osr2DJ0+5XG*E#i0TeXm?&#ZVwIelNDt1cX3bi4x*2 zZvF4BvWlj30s}u?PuvSQPn(3 z>x7f0)v|?(S2e>(TZwv{QTLZzui-M|$4rja05UIxLrKdaoK)eB@2qC5W6X&*-;BiR zw%Nsc@9FzoEw~Z&v1063W(J-C>;_y7v{rBUQS}Gm-<>?MBfhka$QO@xwzX>TV7c`% zPA7ZN9BU@gowT4nl$=qixS}L=GVWx{X>}>mpFc;}Fj@53Uxu-eg(ck^{2DxTF-YQv z%q{z2JtZY1%MVKh1>kzGXU3N}bx-U|GVQ#^7)u*NSm z>oq81^a zc`tAsNEL^&7RG$^h=>S0EM~bu+;Oq^r5znlPz)@7e}x^DFmo#usul-K=ly4&0|9fh zKjcfLQ63UC(8U6KfhkaFPxvR0H`+3FO3_fUh(s9JcZ3PRi@E5_K#(r;>3NqgK*OPh zj|Qjf9Z9(c2JD^{=QTGYY zzNk0GWox#vB zZbspo@-i+M->PlFcBzPDMG+!Q*Ie-YP`x6c-_OLK2 zCbX(gT1Rkz5&0OHxOJl&N|k!WJf;rKe3QjI`#V^rr437M4UH9zPu0d}UF|RTLt>!P2tq0>@?FC*T{JEKQ#L%jnO=2VP90~vxdH1EM(Xk_ga?}xy&X|OR zqXTp;YVrcr`QXiEE%-T#j?m|-Kcz6Ne^OyoEmiacwW~Jl&cg8*{5$6i1uq-1_u^UV@l6vC+@0TT{bivr$*FlpTNabXhxWy zJ^*!}iv!KocqtAhS1$vlvp1D5ZG9yABOj^*FUlNtpWys*w?e`08n+c|1PnzXSQQv8 zg4aR$P?<>J{K#^fJXX?ixtm?8tyF);`@5={2WfQ2J~l0!xY2lM5zU@iwk@?wbt|;s z5*PUcqM3*cb(ZH^{F3~a$QY{x==<>*T}F^OOZu@^wj<8j!P=wn^S0bfh<2_nrk)T! z5ADH23LB*ip2?Rk6hXfzy(Nja=o_}RTg&v0+zpVI%_fJ8Cesyx#0tjnpht<`8oC4# zgyCT38paCJhikAkvblP#>8w?4usJ7hlZif$}XKz~OaPM+3V$ zXAjwW#HY*^P1RGrF_cP}7>VTik*r``%K5sp0(z2z5pNF?RNQiec3=3*;9quUeRYOe zIQ(caZ=rRoyabMJ>S$=lZZM%B8`_p)K)#gb=&shdsXQJU~Gle@0l+%2^{{$3gQlVS0~l;+nO(qiID6ZEuMJ}0iNT7k$1BPGKHpfF1aC7?}SNL$T78DQTS*VxBL#OxOe4+E*+GtJx^U!eYD*+G@Uzte)+?RH zYr*!nha4csWirrqiC&QnvJ02K7jyW;HXwhNC!5XH27m772N}HTUN*1~8a?4CSSGw* zC|%k7auj->K6PiRe&Gx7pDuw;O;9R0g3FmEybTQmyI#-J%q^kCjz}-1vX-n!1HhiM zs>1~Az*^;#4Npx))2Y&TVp?m4-bU0~^ibP?u`Ei!G}i0$As?DKN=hq=7L%iQzqtX` zOsRzDMVqEl0TjIrO#4VTLls5&p9)9UWUeSrK7AbZk*b`{v0NJCt(;2c=Wk`kPY z0u_}5LuNB8wDyWR*UTX|V3-v;yn36*OnT4H$yxYjj zb$!9X!u>g0R)~CwFcLK$*kyuXt8F*VrB*LhPwdFYcsSPHq)9|n%i2jaSfKfN1vN`v zl)Qsb{a7ih3d$a;?AHww$3R`HXg+7T7JP604|S-mp?;ix5dCVe( z;~9#`y}tdZlN6TX%Y5e{t*uH&W5()13d;|af^mC2eagko&d&Y&W+O!UqQ@n=lg41LE99!uq^Ye7@a^OAaT>-&-Dxt`@$99xHEDKIP{z0%!{C4`!?{&f2F( z;93H5#``V6at)Jh1Rm7MR;6M-=prycuwU|lXK;NZv-P7=T~2cJYvo$xx*%X-h?mcK(ckfGOOExu2nB1`-LA2{>}e3=@F;5)~0f-`9t@D zGFR|exe;a6{Gd?F>G;y1VmIX*)E_@v zqqAWQaRVt$?e(JktZ+rR-15M{HG^rS+%b}OaJ|mB-+S~zsG}WzIX2*Q6LT zve!KLS{+kbvvYJmv(?cnCoeE!en%YYkB&N)YdAHV+s15hq|tW7+x6igb%oAvN$9-P zpB08=5A9{D_)>fcPHME`T+3wa?+yXEQ7*z+a0_DQv6{XA^%tX=nSWr44*r6@);W5kCL3W~;KG6tBCpb+doUvKU z58U9M2Qwp%YDw%SpfVZqXu=oL+{2$~j)$K_N;U6$tvoGMDdwZDcW>rVRH_kiuIWvq zNgZZzWb$|FG-HD9P5owNmjo327%pD`2^4@1SZFnhUE2K1a){l>a35vrP^E@CCkNJo z9qCSaz{Xa<{r2$#=p}aAYRk3ibkLVKaoIY`CDO)(Z*aq=l!A55N!zqI!bb_I>&mwX zx{uC4CHAORC*@QDd+h5yoe7wc&PQ{C9xVw8hbD-iYa;3L*t5{is$WZi1;M7%hVgo0 z-0dT*ZqSO2Sj*6gS>Fs{*m@n*2=Qd=D!!b~?JXRee6Y?mLh0s{WZAF7JW|y(?~mJ+ z&lhepBt#(^6yl9Qe{I(~`Cik2YShhZB-S`2T2*V3rs$YG6rl6NI4L#egWsku3Ebn} z))s{|tXqV#?x+2q6=w8zVUI0RiM#BMR=m7 zsg2Byj^wxG<*bVs%T+==#&Gpi_Wgl(kErHj}K*w5hyL4p2x(MykR(Hk#@ytJ_KzwkdPhr=GRSC zTXY%Scw*f5q{Rt%RPAX;EpS(Z_r|&qkIp_!lS2kSBB!Aqy?vM#gkK#DWc!9U_adkJ z-#1OyNFw5H>3_?7s9dO&FnACU1nj>z?*Hojzv&%Q{OC5|i> z?zcU~{iD}y8Xc`|d2<4tH|Hn2l7w!}H`fY;pQS9c?p;@>4vy+1Agy&GFu-r!YG1zE zo>$w|=Gp85>)cl@UAhX|tSxY9TVtREZh7!>Z1gnl85-_ij3f^a2PCe1pKoVjz69B? zZJZs0#3`=pc-6mjM;F*0mfcTQcN_auO897fZ>SPzJEuAGS!{8z2n+q-_Kaw;ecj7r z1pfF^k)LI+$b(2)8O4?eHRW}Z)4RYG#)6=9Akq94)@n_V4jFvvll@``8sv(ePJ7VV z#j6^EBm=W226)9dM8I1L0k`K1Ud3hmkzsqCpY3|=VT6R3La0|mXT|C^-P=+Vh_B_| zxUrEQFAjCvFTv%hlZ~ zc;ZmTAN(3zq^&+~R0`6W#otkK0$3hiJP=eI30QEmPw8cGKD0CX`li;Lvs(5#T!Ha^ zMNeB~u5`gFyTA!;!YgOQKuq1M)S=AYiBqLB;9Sdvd3S$WT9j{_-PJUAIW) z8Nd<;|1~_y*(l;WdkS?&yDBq4RC`ZWNvllRO1@i{+$Ei*Zf6-E-9PDpj{)K6)9AIk z{$ATw1j$B`TDs$*>DNr?dJ8tRh!S!SFP$P7WYp_mmtmCvNQVck4-&Gr@yPIsY;RwM zahj-1Xqx=Hkv1uu)8G}SvKy3rFoH=x=#4j^6f^-1v$O*u3BQvoQ5q?Bds{?U9q_r!U(@g@=> zrY6R;qIq$;R`jFa!-&R1RKBD8#6?0fC==WPzH7mc+fTEDx<-QFmM$W6sId~PKmtmN zU|1fw`=o4W!nx{B^&u_~oDc#r59-3Fi$-3^zQe9?G!3ON0vDeyn$uf6mC$lvbY z{OvfPA&4I>M&2ndv5O?I2yY5c`jk?*b4&H*lb47pCb+cx*0)XKGgdoHNUt&^Cen!v z4wj2y4h@dPwu6G^&1~^sb89mU0-Ku@4W+*8jW>Hge*_rnNuV%&;Rw29DDG@;>keV9 z!WXx14xMhxKJF^&H5|HQZ3(iM^{H?4J&SE{_7fnxu^Oas;`eLsg^BO9KAT{7&6O;@ z17=5Wt~#>P@p<3BGh?8{tB(*oz1q2^=}kQPL~rdhw7yB)gG89rX;O1?I&ur-KE^eXpQ3bdGW$lBkXIt~ovvFPCeCqo z=mcn=lAVFPv$tja0k>(V!;F~Jqh#!_bzeqs=vrm59#Z7Q=x@l~GGXVYeV8OsK5D+hI zDwJ8YkbPx!8oH4k%-%l;OgUjZ_M5<^%65Wy=5E;{!Y7b}(Fnr>eVSpy#I33ZJyR$` z$M7Y&R1dsZ&iaMCYbgQdbm-summucG!7VL1%?@?Mc8zou-MAxagY0E8`|9FTQAPHGJ}w6z*d~Yd}UKI7(UC+Ibx6d#jjQkPA-tSW?dgIaU>+U^Q@*B zF>~sDdI+S;bvm8liccyial|s! zbI|PG!`m9FAr@_|)P9XtDf_!J|JvXStujHDz|QZMYhr@6sx0{s26~w2Zm}5-W;;9I z#IZa7IRf-ZioC|yuyI{z>#ZpCgZ^8$mEPBramM+Ys*F6E4;ZAkx2EDc?yr9qW~=wY zY-#gen1O8^F4gzN-t06S&x{POA4dj1*M;UUVMgW!27wpj@eLUqZUl1$Vo8`;T+Ri@ z1*C4s0Y6B|y^h1p8IvD@LWbIOc&FYOQOB5wzYen+jW{d;kMMeZ5JRP|U$-DVyoNET z91A$gOoMN=BXqLAX720QFpu$ zC=*N9o^%&+5n$Mk!n~%ZU7~zlNv$k(B3&I~j6Sxf3lJO8p#2sIR*TvWC?ao^joiu7 zsG~|N40E?i+DG7?_3Q@IYDjk;X2$33tYU_M2^SN#8fT7ybXekmk|5jrjW|NPDNhTtZoD zC(7s&=&$J*X4v9WLc0CfameeCS#o6JfXe|&*xE=kQjbWf^t`Y0%qinzr^Q1eg;!Vx zM4t-;)M?cBK(AOmLFMEp13{M)ldlUH4z98;GH2JX7c1Vk*%`ytzy}?)CAtMscDczB zGP||#n*vbzr+=1#>K#oUrOy3K164VjIC<#6!g8of>7chvWj3Vp)Eb|KyQ&YMX(?}7 zM9>|K0^;Fz86Ku3=gHPE{($Sp0Q$-|kYhtpGowdF8>;m+Kb9-R>&g`(V8QiAU_ln$ zP;7IEA%~n8lTr=)F9t_R>;I5&w488E-Z_Lmf=@wfc-HCz0AK7zI&Z0K%sp_s<`@SJ zTa-xe`YKh4V_beV5MGjVT!O~1+)zX_uIA``?IfCFv^NID0M52!+_hnm-GL!ihh@y5 zL98TNlN6Vdmus31xnDVyt06Ya(r(iLukB@=yUW^YEZZ!{RFqbiM*B5}k~(!M*JF}{ ze|_kt$qG8a$Xu5!vZt`5^)PH-?sH(Bec-KJX0{PO>2YhhXlE``_p$Biw?!M(Tn?n9 z>P3AVsb!!2;x};5*=TNBArQmhLAis1Lr#Un$HZp5^Wi+bCG-iGAoT$XNzNxS6t|1z zlFwt|?8^INR-M*)k&^7NWsSzZu4FfU4n?>m_J?PQ$Ax3k?V@(kGg@r&P0|Ou+-Nck z)e-(SSW`_bM`>Mo3~KuUYOMQ+!~AeUyfun85gxvk;L-jk1d4mqH5B)>bZHmU_#)rV z;iAp1RFNzg-}1b52fLKR^MVrBijKUbwdR?zP~0!le~igs%!& z>JF&AH{9hl@UopOtbUR_Y%J;RgE;|wd62!ZxZcd$LS8`Dm0Ue8NRzQ!p)voMyc2`2setv?aEHgcOI zF;f(3MuMRH@!7QQ4d^e$eh*F}m*s%g?*f|wW0Mz;c;B(_!P35G3FZ(LOG^;O1iy}P zeP~q!41Xfl$>{a|X>F3m=;60so)vFJSai1l%{6)rpi{tP=#7OKd(oKUt@0l%T)fid zLK_e7J+ul}PX;PMz*xd)tM()DKob$NUIOo_`_DfsdHUE^}Zp zShzqi;TA_%DJ=cK!!*(>xe4z&9O~sKnH+EL^P_9tgBzDkKc8P5iL`Ue(o_DkTsKs}^Zk^$(_dB%gFoClzQ4qhZj#zO{T~J;~phU3|=#E1ARmt1C z9#|Xs`K%{sCloSRPHsMmjB7^_vjebf-%x^(6=<16XU>cJrx>lVsvc*~fqQ8_y?J3B zfNx&stvYTFvluz+`_OA!pk#`ysgP_smEXWCoje>JHH6NhzTB(GcdZm zCXgp+VoVPa$?auL6=b@~=x=x_Gfn@Z0FO z0mDwDJadeGd{$Mp*F5JU78%?tp{|r!tK*Q0f}?4B^%-`=9_Yo? z|B}^#OziGf$C%cVDf;r{eIaGEc}3`)Gwa{SGLJ=#IUzjlL5?ye-?$TR&oj_)a9Q9B zZ0l%uZ>VjQl#M)<1$AI~_kqwn9tM zxN=MaEhDI-l6M9aU4n=^KMvFGrAtrv5aB+nrMWM!^$gA2&8g4RCD<_bR@K`T96om*@JZO!;T76B6EVUokRb_T&YP9ha ze7W$QgW;k6!2PGbkl)gvUVS$ohP>Nz{{L}E_8&O(+kY&G&Nr)JRcTvgFC^+PO^uxg zBitVXDpaZ#HWvb)Ry@ndHY_QtePYn6tos1!m*{~Pgh}0!`jqZH$+h-$`FQssH--&g zEAjnwE>%LTHxMX>D1*>SdNleol~}K;5r?_>7!Ihc@+%+16CXwQGDZfYlY)=|d_G~< zv|{D-8kFOKk=16e{5vPh`09^#M`vd789EHeCeCQ+g^c}HfTMA|0!eL;e`pWRS+o$` z)ED!q^KT_=v{1%5n;5O6YtwSrgWw zS5zic%3`8VLV0S&pL{-Ps<6OOmbHOIBLI}4idp2+gdGatb!(aFbzMe*Rd$R_11&6< zSPz8H;OW@MSyZgSq6Xv#6Yck%*Asjfz5>5)AiqUw@ALfx~l8avT)eAUXxM4qnQIR+G{sPy%qN?MBT25ZG?fjWs!h2=~R`14W-XoabQ zq`uG?$XA!BvLnN#F^dr+1Vv@9MgvJ#!gF(F(%&Fq-{Q3|8OXGQ41v-&PgG4jvZbXQ z7)DGW3N}py{DNSNEd_MxrY<_Q9bcM}PHxRRvnjrb*Pe4ZX&L@HhX5{zx0X~^d^a1} z^L7)Fw`=1a)AbSMZPQ51k@wuery^M%Z$G*}NjxuYJfX~mkg30Hh(agq^oIW}y^YHx zaZxqJI4)1eevDAPL3zIRwm#3gqUFQEJZCSscy<$N)AT8hC=7Z#s)%n~7jBCOh!CZb{Sd-k&_Fv8|sNFm((L}+%&Ns=OSmstv?#ZPj*Kb1#wBg zATs#4y~&-mDGiS!yn9a;W3pa=66PI>+z9V!LVw)iI2e_w0>5+hvqc5L*jW`59 z3M5=)WNo-TwM%8Mk(8OtU6Oe*g-{lkv4=dRc7xS>#PCp(K%==EiFDJf^%C@RsJi|? zw7p|=tc}(!n4Rn-JGO1xwr$(CwPV|MvSZt}ZQFKo^PY2V_xaB4`;Pl{kFH-;|7ujN zHP@UA^Fa;Tc@qG^%#G|DTecxQz1Jj)vW8CG<1~=o+|%o(2^h|fp~yY@$MUoqslcDy z?*!QYrcVER?D{{s)Ke4C7qI`oJPH1p0)dKJG6Y75-rB3uW3-NI)C=mzVc-&EmKMoc z&J@Fs{(wM%_*Cb;+S6vK3D#?9@*s{K%eFOeHjM5i+O9hTgN8Q92+645*LyOi`nxi; zbaFTCb82LR{n8GTZdp&`sdr3wdpcVm0J?x0_u_;h zW;)&pUuNQ>pOAM$Cj~L@1{TL96x_XXqt4F6A}xuHKSW^TtYkulb(IOZ$12#U57{(r z`JKPxr!7Y8pw_HKRaf^rvxS!)p@bNi69#?7d$#pplNFwjAxaJwG?N%i)~VX$$19y; zL?A2Q#hpFy64MD7=2o@WCM!_TS}(^ilbhzO#-k5)QVvjxXtn0d2O<5bI9q#kr;a(u z`wBIs6jY$oj2e^_N1^mR5B${)Oc>(n?i*g}XNWx@g5*nRC_Iwli}Ngk&BvC<6BsJa z_C<&Su8L3665Sk=!6fJ8%t$A=+;vs4iCC5#3-yTbk?;MLg)+--LXszBQ=L^Cki2p* z$>D|J?DWO>p~s}lMTZR%@e&Tv7VA%Ojo6ka4ZDgg{Ecg++X?ibfWZV%lWY^i;i!92 zo%2ZburS~&4fuPt*5j*32ABj<^N>2w7&etKg3T3{PEY$jR4Ymp7t*lHj-fh`+EVbH zd`ZwONY$B=Xn15PK>C)y28M0bmKDfPxgU&~)3vjUJC<8v%dc&>WYZbR8iZtSj>Zwf zs#i%c4}mdN%;UzZRXe zN`ZE;zJWuKz<%SyBhJ#>wARb=o*R#kA9h|rcml_9+kBTq5XrIEt;JX6l*T9zh{yPH zeBII1IKL~h3K@_r$4~NUDXZ;5?R@+=#W+bfE7&HfEVB^N5cqqE@OPmWq0x z+$?S4416^ukCFNg)>Ss?U$HUy2yKH_Hvz2H(If?SBAh$W&9B?}KD^~B zXFog+5WR4u-2wduS~*m0y0KwDvi97WwjVuO;vDa~S&(l%q<3hdX6oKI8;xjQyw=&T z-U!_%s!BpI6fdMoZ;%u1(`EfC$=o@Lb7xH+;4Zg;PWwnicN_{P{PvW4hURH}?>B~j ztIbOqc9Yx8Vxv`)XFEnf1(<4jd(;~e3xEc2d5a_r_Nk>MIPGqea5>7irko?OiW!%5 zIn3|4_0r#j2PBy?vXT3B{!o_ht4^g@u*fe4mARQE)Be0a>3XD+$+dp3vneA6g>*yf zMCtO?J;9b}qmr_M${;~vw0KGtc*=qK@qAJkI&*j(*lc#WxWDyR+xFR9*irtQYc>8C zsrR4vn+$&|^~C=229r0^Gc>a2*K;r;q$8yJCuAkcYuLc^A%23y1YVFMmY}pNQj9ie zO_TW3@yW*%D@HD)JvUYpWVW6&asVCk&}w@}z~tTZJfBC?XZ@H%hsQ}7$#Qty_uNW# zczJkxg8^`{<%mS2UKP#P-GisrXx85&U$oNfb0T1-T(6cj6g>sX4TFMULF?W=55S9N z_bot zF%fkvm_no1g1Z&T*NYaJYS-4~)YgGO>dG zj2PdH&;K)p11=DwBid}#-QR}w2vj1-x_t1;`wDHHyWc&C28xzInSiAzYcz~SayGmZ z3rQ9lnC8#UOl8StJ7YU782Z{EI5R*j&_mm0w-A86)94{CqIlMh9JC5=2zg^FnBuyk zsPpXOf;tOSd9;x`nLu$T4T8S_p9+i;DQ?$6laMmOF6V6qUhSD1Rj^xMLZ+_2I&QfL8B~tyg=T1` zqB63Yywu{(e*Ue+jsMg`2X53W5saCv+%uM80NNP98GV0&llyVFOY_ASqKCE--myLq+gD z06{$4i6P*uM_I$;Vd18`*JYi>LjOYf!Vvep$igK90xfTS8nB1)@@f&Q4eSSDlXI2B99b39aE?3Ar6-;{a?aHX|wY~QW}s) z4Dr2aNAacgzvG+4f)GtVQpObOz_K1JwLSc?h-Sce zhEIm{3>*XL9Au$rLEUMrMrEd^I?izu|j=yS$YS{Ll`i0IA$f^F4d+>4sWow1w~ju`YY;m8mg> zgo4qzh>t%K9HmO$EfcvDBlSU{cN+47G zu@aTerm}2)?4sPRsULO7Rg1a9W<5$(1E=J%I#O=iyqn5=EIY2j#NTf;ssK$Lp}L+K zCoP;RL*bwygzO_DYMZXS1=F?Xqiq{#R&vYkk*YzFkxw6=$jr3UGA}3f$t-v@Z(l^r z<>VHB+x=rVD7VbL+FU#c3XzB0DzAhSbxfj0%bFSdfBI_)bF_thoTKNRvq#ln zh*qbw_F3-$wndJeLswSgeBVI@aGaaGk9zln?{9^tfesVo><~e{F||jesb}PNf!>!W zLhsPF9$S-aT=~5rJ+5T2#WW~&8XQ{R96;|xNqkKlW{ z0RV9GU%b)&6I><#Th(01)yz@MSlUL#%-Yb#Mb_TP!N}TCRL|Pb(#ZaQmU*pjaSqG% zWPL()rksP!!^bPvB(5154U1qUZYlq(Mi|Gn)p5w!h-dh6wpZsy=Q-~=miu+v27jyB<`nUs-cc-Y=4*<0UYbb$PAk!!TjMJW@gYfniFAyj!&NUgDfhNQ;+ppgO<14OS z=ENa$=5`No^^*9_EP4@WPW59xHMocd6dWl~2vnlE&~~kd{*rVZNtK63?F@H#&4wlZ z#!!RIh;t1B>kY3E(BX?Tn{0|f=jxzHbM3QYtGS;1dYdO;8!Hn~SL-z)+F-Hal6i7B zg<3v0>P`EJc8qK{6G5hT(h9>4l%0QMJ$|4AT^!R}Sj<~U$-6HCGk5ewY}h~% ziCTS5_i+{H{5C-AeS+GqgtyY5s5>czT=>s5?Ghd68_Hh=nuZhZ_vm*khxKm@^xq$T z|7U^z$LDXaJtNEiNewdJ58OkrKZYhU$*->!RlC|vojTMj?BGj>{SXDu;WsYAuh_&9r z?@%V7GhHDYjP-D+q)W;n>T(EP-JAM7&iV>(LEoS@KnxQ+6jg4#gx>Tue}5qGVP(=n zrE*fM$810Ff{g2uEu8x&pyG`p-okeH6bl8#hmFoFI`JRq`%piT!-$j~BGIB$rS5KS z(6{1QNjhX98@A$;0q=_Q-MG%52{zY46);iOOBeP#CBCR2lb%}$Uk*Yfg`E>Sz&_`O zZGk51ntC13X2ud>U=N~GSQAXgtEG4!PaxJHQn-3~_%(O#66y4>VyL=;Q3W|+br9B5_Jo~am4dB{a9wHs%Q{SK-nPdzwdN5$7_c{$ru!22&{A21o zXHK(9{!JP`{{M+d`hVhBrm~bRf)eIehiAo#^&Fs70~P*9H?f&Ge~FT*7*%1SZW{Rq zuVALz2InY$twvosGEEkz$IMCAX;MSMX?QaYyyuwMesf=Dn5upiCvXWmp{(O197La^ zmemAlc<0n~=f3U7AmEm5z9Q`u?0ieAb0p`~289!)=+NPv=Nx&QH?U3YkkR}h6q?Tx z_j9xa)z7Dlk|U~gOUhqIX^C^w;dki0$FYdMY+K^|WBc*nzHjrXK@hGQe8PQzwdmRd z)qX-ySKC@pC^h}C?wBPMWx8s8;L1#zy&jM=>{&#UNtJQHu?~T=tw!d}kbaymmfOmb zZS{C^C@u8f4lGVJcodO4F%MjBkODphgAb6H8`uxR`=$0;D2-f>_^F1fRt*Q)Hj#Qcb_8^ebC!Ry z=JRsF>?q-_$WQYlT~Svxze;6*CQL7ukC2rl3PKwv=4YFlowbgmBqch?UF_8DAjR8G zRh91lj6SKB8dk#1Hw4JLu~QM(^F1)$^3?ql=A-wLwnXXVxb|s~IVMpDrB#J{%}{(c%?^$1 zzrydX20B0<+}qj?Z2RSYjWu6B&(s>;sAZZ==!J8^^pT6@_}o~xX;q8Wi&ikLwgNL9 z%INVEJoN(&?-Am4xeC>|OE2sr3eh9P>=865M8x+<0eGmOn6Z_jvmzc4en6Cy<5jo! zDDyh_LvIU(l@t9jIurW-=kN#?W;<|~%^L&H+ih2{cBt%%d6Qt~N2v89%InG&Dk1ym zr(H$hwpT!o-!B8MFZgT}ITh+4xK%Ggj3Ei?TkX859iczei2?6t``(}bP^JE(O1)3t z;9~x_#7XYIMV$Vv=n0tWS(_N~>ls*>*xNW+8}b=An%P+Y3w0DMEdIfs4r`1t(o?wS zUriTC%{#271wa)W!=mZ+_5lL z;7N;u*-N%us)@HRgGyzr4is=@H<^NVm2=_(;C(?atP$N$Lj3RoW7+biLW`|hquR?Y zqZOlfu@Ysy#0@Yw=Y@--e`>QB=ckxLC!Bb^nUzcVoZTayfdalL&lC8HYhbuD|MCjU zrr@cDTaa=xWJm0Z-i>hwEQ=)j0X0&v>6~=C{EC*^h6A-r%{7yxdy~-U(bx=$a%ZGy zTM@xPnrOF?hVci2Gt+3){VWEw0BeEkbZDmgo;dDj(id>KDq42CVL!%A;|F1++cenm zc2V~sCH>DNbf2rW%7Wc5x#?8Qc!aqTwF7i!gO4r@{m7~LowdZ_wTmAMr5h&5JIa4* zxrS`g)j;|t)(k=pGi_of+6?wPZ6$LC8;$MUe*1a;Q0WvD>eM&<5l#Y$F^>DvGRffZvLxm3ygZ~;d99dmak#+2u|a&0 z2=3?l4d{z*=cY^Q9G`BTy>PJke$c%-o>5n0D?fag0=;-H28YRvHJ8ruDV?oOpp*e| zK(X}%{Oo?Vb#Z;bc(4LFS-FJZI79{c1f_N5+_Ds7(aTh4Zc{KGo{C-S%*e)-eWtoe zE076W%u6M!xu@?Inrz*ABlfw2M|6{xNwCko6J8aB3d{y`^UC&S>B-%@Tne}VrzCB@ zeiELBRZHcRij+n1NlTlw!2o!`8EyFk5|@uXYpSCdE554nvm)!<@Q1IgXCG`uE7T;d zA_BBe%UY$wRfAfSSp0EHFBqgmuPpU^;{=xi%M(z?X(LBvUuKSdfyZHLW>WQgnBH)T zdVFw{jSzt;oglc7zg~5*=cG^_(zGnghSt=sOrRvQefcN{J)_b?e~sl5inK!{C{RO3Vyxh@M-9N=?oV_N9gEZ=s+&A0+d(tRV0tM$Z1)Ad!^f&@8<37c>ysg5HG2 z6UK*!SLPo)Ue`9)FnI}@?F{lMe#VuoJ3R+81;ltO6s@=_zU7(T>djzvs2h|MeYFk*RWv} zQR#irL9@VFT(+<=u41QtQJKjD>b&q8&2mQo=ikdP{cW-iH8qlqLOLiwEvhJ?`MPTM z0kwh6vx35AdYW)4vW+9|zy=-L^k9X8go&@7np6oUBm^+JCy!rDjB~$@pO1Tfy_`V&R$D(0^cDOmN7%<&Y=G})oe>>Fk2DBu z)c(hS-jA^;K|xqVSwuQ`1Xiu|rj+zLt{N?ZXb8@F^Dv8qGsx9jN?eBW_EvZy5vtg} z>0D!04?rNg%h;_%0`e}fwmj8aVL3gII1{SoA~mVEz5q>^2caE*UFb4&zDErrz;?`@ z@{74|%+Ulk(5Z7oDxE{A?zk;UVPomK$mXz+Y9p{jDd@7j{8!MY-$4jTq`Fx1l-r0h zI<{aP{<_L+MJTucz83&4bKqWj#qX;!Cjexs*MtZoZ5Ue8;)L!z%VwjSZut~};NwYB zP9PGxZicS5M0IPj;Kk(YH)>g^qTLr_62($cRyPEEZPAM$QXXs>W5n#U2P`0$l1?@HDz ze>h3zMC@P~WhBn>*7b2p%Xm@sg9Qvw<gx3S|6+Z^iG#&2*l>7#T8-)^h>Wy3ul_qg){caUfcY!(WAOuiQ6EOMh=Uf za*ROQxbxqHh}(jvLGRE1e6UK{%f6Ts1=Q0+R`}6PkU%(%aj%lM9s|dvKI!_ik6f$V zdkY$}JweS#TBGOzyX%u|=fdv&nz4rfT4fGuSVCRc#Lev(Kwat8<%yZ5lkPO}!!m)( zzxr8o+z0uZYwV5#GMuL`E0ge9ocm9iv&g=_9sZpOkbgUj`R}!F{*8tFkfpA30qNn52^yk<;m$wuHEL&u5ciXqlxtqTVl zX+IP^WpO-j_$C-n;Uix!af~>rAQNCkAb0MwJUXw|uQIaMzG;XjXmvmtIATU5UXU5u zk^V2dikMV6QxoOE3_!Fy`pL0r!+kX22=*$lpp#u_8@tRaH}~rND#oU!K!Q?>PM1tP z`@U+(E8;%M$F1pgVgc8MO8MEEJiSnl33oMCjCRXe=~Ci$s9+6hIBSP!6v@q6tYp0S z39i$F3i;u)?tAPgLqe#gqvW*6pbOW$)4OQnBkZ^W?jMj#L3)jN#7*X}?rtKAoN@3p zZtb-m$t>&*WG-2Xf_)5@V~KXL?{OQB{h`_X1a zLS<_Jv^=HR$hYW*RQ1*Wa_ie$hf_w2c*KZLCzsKB% zQAR2S$6R6}5}AH72yfo!>cmU!uV8M>7K5hbZqT8q|6m&o1_JL;@aNUAG{tnFtKyHZ~Bm zxk`2;Iol$^K)xm}nV$kkB#=VG(;B3&N)+m_iEeTa9cnjTrY-Q7ugaLta;!vfknFj` z%(M4$zVVeu!XJ>p1|DSK$(e3LrL5X3=#hX+6i){ec0v0wI`EJuerKT$4hv*(5o`)b zw;3N>r^EDSyQ2>s5cnyN{-vaJn2hG4CU~{|?brAgxIr07?wEBJjP_x51d}dyB6JS| zm~Oi%dyF%jr&GW}bmybi8cR-&s)vg=%#Wwb!FpH~rtz!ZAa_s(YW@y$bNH}@tchCp zTv$505fQaco`H4j;HbGEjv0M!=6plIE#4J-_`*&RVmDBeXQ;{gkjaL}O_0TneFn~P z(yEbg=uQrUN7 zO^6e;gphN_qOo$i}08-kCemFSIB4#r;w z*lSq{P+cdcHiihn#}>`$o$=rmjx4_=g*TCJ3A^`&@K&UiVOGd1QZ9 zLrL}xSb1xK#l-Ij6c5N5571{vA6WZ(+=D0wNKB;;*xS;QV=V>E6|qL8Y!8s#pmXz) zd#DMJmONwMph6FIya%}Dm$PL__FMh1#I$iV)i0A67=hKrVO9Z%4m(m; z1j>}QNxFGXI5wX)-!|Ld;(4CVhp<6yu{Pv<8J=UpU@T;>tAhx+^XT^Df}(ff)U=ZD zC{*Wa(_$C$={+SI>*zf-gN772D|5kRh7ZM%R2a)`nX_eYMgX`Ey5J^xpq!o^0kY+8 z)SxV`Rp{RvaJ{L2cimilMfoFjZ-HF9_`SUVd}{ZhTn_+rDu()W^OQc<232jB(R)fs zcT&%9OmGjN%cYQ{u+Jv`N2tWHwE+@INqgr z^Y!ChJZZ`twOa|zyAIX8J|M}w zKBDxeM@tZ@(wKQ5BvWlgVy<*yB6-CuY@s_8LcMw+h;NnN4q7tkpwz5-;$m67FAz-LJ}&AQi8ZBbvu5or2wPC zacKg2wyb*ko0&Wy0&eX?fS(Wh-Mm{BJKp?GS7v+VGw25Mi#?9?=r}eclqa>jCG~JJ zI4t^TowU07FqjzlimPK$mAM939Y1vx3kb>`no*BtE0_x!7#Ie3)AAed$L&@`wIc|G z8MBBLkwh(j5hw{0j}I5bI6cCW3s2AyAV`e0{%RQuQxg+@yb2x6Kk*8P>^bUezhUiJ zGm5ND8FSCKtK(r{(kBkaRH8~gBdQt7>yR%p@TsUi-L>9*wS?|^_ZV2yX%qgIXWtkyhukcx( zxffy()E7t)KoHH9h?U`nnxC(g*Cu`D$!aAH*NTixJ+*kq3Ob)ER$SoC&b=ycS*k!D8mw*^tDl!)BNzV-i>XbgFAm@}acao0~VQ+&de<+ge@{fW$JOb{b}V zE`}Z&YD#D%@dqt7BvssMv&M^K$F-V8U#g*KDz&EWFaar>k){CiN4|0y)vDYaDpP!> z@aVecuQq+RF%O%aBxZj1*rxYIb`9PjK8pB=6wv(LMkb;sO9XwaroF^~LEwV)F*?ke zU3Tr@r90lGQ^W${M1FQAxjJd8da0ogSKc8k*M=w$yX>f??FM#jqP3ub7lvVOCtmV~v-;pid*@S@BG#w#IWwM( z;gL$lz(4c33M5V^^HQLW?4lk{r?~>;fljTV&}Z`!UgQsB#=i{;JuhJmwo2yUTGfj4 z8UM_|UJ{mT;=Z?BkB=dp`v+3u;y6mO+QDLLC;UJrmqF5MA;)#e(Di~0gY-8Zk0_Xs zYxEPRnKnz2K6MP!{zES&4Lk|z>Q&1;rMCQ@Y2SBPsaTh3ERqi4@7 zbYRaUS)2$TsL;mmlQ=PA@6hDTXP#P+TD9J&oa~FPt+F}BROlk zZXkr$9ZVdz$R^^q+CroOU$3=G-i&}IifU2-cLyQ^ZmQO^n`$^JPA^e8FQTgH5W$f# zgZX`SM_oCzVip1uw| zb#XpkM=5%S`7^yd4R}KBHUfk@^$L%cfGAvB*d$T z04=8W^ZoUe6m4wT4%>aV)=IM~n;qVlA?XR{Mq>@(qy6%aB4?am8vaI=G=NYM8Ha{5 zS!Gtv$~EQ7h6w~_Zn-1ledb|n0w|;NP7&mj%&dAubFmSo?Ng#ss~2u5{)&Fxx<|ue zsw2N`Ib+2f{AK>YB>mxX>Cdnj?Mb!a2X}L@{b4cj)tf=X3g5hxq)_T$Wwioyx#M@I zmRuL1d9-u(tA`#D0(Gu0R@jv6ji1!bZ9fb_;Y51+( zQ;{@=sR1h({*sL?1VYA>G#O?ShtcpP{W*y|Yu-`d=+tyRSEhVtFMM&Q?lQGOU|Kpw z0_d(uz8D3!5zi}nO8HV4YE5l1Mwk$p|4tDEOC99x+gyZ8x=B8q0=+Go`cd`9Md%pj zjhL^VnAnzL)E*{gsPhpVrBfoG=KaQ@zCtH1=g^x?i9p64l{1xtkw(+A^=Jb+2BGRC z5urnNNK_HYGL@U#aDsDckHL(pWGj0VEOKa|zNQmnnz${4Mfyb0`3uz4SMN#lh;^n7 zf*SMNZGxd$TPS%_C2S1@m+lcL5c4)<9DrhZuf(-Hto9%WFjTvb+sr5WW>=nRSEA2L zjpdhJ{8l}u@`%Dx)=RF%mtMlY)A$~S>ywgeDqza534S!|v>+4o%@`60ona0jA7t}C zC-kI@{@q530cplLTEa%8_rJ(_fTW7TBW{0@QwzXI8Hj}h7phSjI4kwFYi9{DRjCZO z5{IuwFUxnv4ly4CNC_09Q5K8H$<(Qe;0z(V15!BxYu$_8PZ!hjW)G6Rat@xDxFXD1 z`Pw6SeKl@#Ao0v}<-IQhyNz@WmQ-NPs@PErQdU&c+S>Dkx(Mk} z`dqdM4ee1z%*CL}!W#KNy%~gViP&zT*^Z22Q~J~9j zPp&8amm5}pB^smAjApm~Bh_7X)Km}rLu^Io!u8$l(XUw=+W_xS$PaLrxw>Y4m6hvv zSC_60{f(cln=7?z8dqMP$y0S>I%ic6T)%_dZ7RB~n$T~JYAUp?Ci5Pkd9>PJ6-mP{ zCOl7~{Ay0O_X_>o2mB{EgAsWu4V1$9l6c*a6UjeAj?u~u{9JamCJ#o*kmdU!C-baa z(U%^W!LCj#)Xv9u-AFRD`Z6|{TC|YcjP1A-xVmhRSs+!evV=W+6eN&6q{sDXEWEOt zHy9tsT$HwkF|+_+_#d5?npG3 z{B(SVcbDMxN}kRJ8bPW<)jf`7o7w3KNH4Z?Y^vH!POi0&O7PEh&z{IT*=g^UsU6KV z{YA=tnm|;3Uude3q?cTa`IdmhS}>oZQ_@E@DxRUDyyIMm?Lu01V_o0c9AUIw5)c8c@^oo%0BF7W#)E>e6wO#Msb~J$00e4r(=}#Zjy5n zjbj<(5XT+JHO!sXDnX zSbu>sh%g*$?ZT?$$=I%4Z4iM3+)iNv3`QI_Z8n6QC?HWBp}7CMc8{Gfb3a{EZa(`_ zpmsu}8$J*Qd8`o0TxvP6Bu(wk+s>s?Y7dXx3c)D!m^;goucf$AlqOz`dxD}TFh?D0 zH7;`H2zOq1b8c@wLXx;9fmUVrP^qn_4Oj&WC^0EzkU_Or7gVKcF@%fO4fUPSL|Jr$a$Md$=9(m0GE)TN+WrwKW-4mqP27t_7a`V5mt;EvJ@*{x=U z&o75C^hKFu5_aEgM<)&B=(hem7uL7uN*Jt$3Do7#Uo7^hn4 zhOfYFbHbQI;4DVpz?d~+a`kJ&732uj;P=rT=heXr;1tFBS4_Emkq*#bU6(?V`x7)M z002a+zw4^g{C5UV|5RNSYX9`Zm7!;_p?3qL75n{dzD-0c7E>)O1qjcKCh-d%8L07f zxSbG&m|<@m170?~p>TDevC;X5hOB9%`l_DFLezICBb7h8{@bU zSkd>+Ly60dtIfI%hbf=Smh1aek!%3kht)kHpKM{e(pyOJKonS@jE7xOS?RYpeOJdFYrs3-81Tlo=#27eilT} zxlo%HTI~SLUcFRL-X4Ey*P9p!n0yUkF6#STxR>+TDUpLaIbe|tSIM3|YEIvL>SuWT zD6j!Lk}Sn*D-`1$j=ZNfHcocD2{E&*xI+);O?u}nE|0~~Vl7vYEtE-|kR+UM)vxzn z1HscHQ}~j~x_gwjgF>zOz4MXfq*rqMPUM~Fud~M@{jU5g+hND$xdXzd`;I#6Ge6`d z-Va4nHIS$68m0Zub`|wI6ph%O3-Fh%9+kH8br{6iO{t$x*!vRVyF^bHQoA&%_M%zJ zXOhwmlrSmmr7G5ff%~v#ZXh5Zm$>XlZVa{-{JcILSJ5`l&*UyGiv<<)^atD@KSlb` zzYac?0%9qeOxNngEBeYcv6%Udq2|!}&tQahiS=3=Hr31~&~`>s&=wjV#eHzZ@|k)p zqtpouQy{9{A+o})))X$I>SzA&&^jD_ zxECpRfY=h{<4~`#2+iS_;2v`pGr7 zN!4PWCo>qzpcH}X3CqJDkedIX&GGTVp=qb+z*CqTGpew*BkFlE8nm+nQA<=f;cZMbVAH&FZbgiMZyY2 z-b~O{aKSV3R|E)|fp6u9B}~s)savX%j9D;)WbG8-ajG}Q=I3fLq&U{wD4>(FelD{@ z$VRDZH1|!x(Yvr_jp!aB_J;=dsH|a107YY82&NkD+~L@ zPu{3YVc?^>!Y>5S8s@AAA>q)$XtRf?C*EcDDa(6h8Ile~1;%>s8!cx!{QU>4SqD(k z)9qs+eLqw&Betb&z>Z*883O7Knb;MD`Z`Gd`0iCPW3X*DLyu()-FH+m!zcw_4p~n> zO{*tovlN)^E5$uc>T=O=@ix&7CFEK+CO2Q6dF5C9lwMVMB1Vp;iDL&01``#7Ev(j9u~MbIT`D~wbDqa0{KCVM6PC{;>$1sOY~UGwvA|=ftLEW zWhT6h1mpT87HZrkuj)Bu`lj=QrS+Y9+ij6m&u*ytw@C+8;(B`ODAK5k+0RHtGsG4p z@*I9?bmej4pKJgce?$vs7=;UK_T|hn821Xvh+*`kaVO%S33MCX z#yYH8XI72fQQSZ96l@mq8P3isTaCRoMxDk~Wq5PJ$P=dp6WbZZ3P*OY$Yv!A_6--MelA9st=Fnk>2ILoEUpEHiw{NL7 zs1&X+isZJy=iVWvRmmd-^Jqn2kz4l_|3aGBc@(b`fU%xi>&vZpeOzt{CGy=XsT+Vv zCUq6KJla&I_T`DmkqkBK9-({cBKryA@t|XN(by zYTS7@pc^|~oO-DowQEOKxEyyzoP$wu#Zp0@%d}D@nxL&B#DJ;+Kc98ps7ATk!}{>} zN8KJm4zVVC$R11PSrnhwF}5l^v7!uDF+5hmp+3<4*{(Wm5*#|2)w%V+(Gd<G3B25|bRuS{qcPKR?fd0-)G9HDek1Cb{KkiPi=FpwDs``CBDz z!5+y_f`ziRJjk+FKyXw0yf#|5;E7bTn1F?vqz1_UY42Dqy#)~{Cw$e|K&WYQMGeF?&`+Is& zCq5NF+(X1o2%T5Hjg;9PZ#;ays6mW8e<@{R0ZW0<^(G;7-bJZ!J}LfG4F zfNmK(r~_ise)qGwP&**f-+zs2ycwzGJ;0720IWGGaR|0vax6{P0QkLGtdwjot9hzs z{=R$0Mvc3+W`fquo>un~rSO*&mlTX*r)DWo>jDk;;@iX$BQ;f9UU z*QL5ppQLBMi?y-PZaN3k1Jw4KfMSG>t)#DqnB5AL0n;1DVLf}$Y!B*E)P8eNr#5(@ zmn|zj<71cuP$izD3G{U4_S|}(iga={cx5mAY7kP5&F{SkJHj^leDKfBhHV>!t1P8I zKel7ODC*l($xra6jq>25neZ7_KYh+1GgnL~R`bk6zw()4J1{8P+t*HnKY9p8Z`O@A z_hL0RlJOpvFq~%Q@FI3`LRZ#2PjXczn}q%P_%OH&mzmLjw%1l_{_bG2%-zgeEsgN$uUw zH&Q%N>@Ag|s1-+76Raf@SL83R{6vb1h`Ne#MB&+6C!LYl9=jcWb`ra!Uf3nD7mRX|YGmYtK85kFM1azaN}U@*9Z1GW`zx8Qq-^BKwe zQWb9hGG;QmlYuc-S)1d*JQzS2Hh5xnryJUH{pC=Y>SC3M|KVv?T6yrj$QG8-7QwIS zIixLF>*;F7FJxbcvH+%p5an(uBpzFb!4&*DX~E;U-WkE!?nmbu>Hp~joybCqWJABZ z*$bJ`>)Gxv#2Ptf2a*vuEf`StLevqj*_>+s0+$@EVMb`ZXTZ%H*c?2#i;J{JE7dJ` zyDR4X%++_*X;OkXHOJV_J9mShxI8B!@I{^fWQxNTkKD zSK6R&N+!I2kinPh2SZ-|tfhDxvKd5Uu})@~>9^sP=F1)^vNvhZJSt}!?*{{?cF%H0 zBeq|(yBZ9mf&KhTKo5m`HCfLRSym)bu$djJZQ5o8_p?zSMc=|e}Hp4pj%tZ)SO7K zZzfNRSDZn|xmTLQPcw0awDtkPz(T0KnNV$cLgQ4o$48dEfOzw0I6yru@qcddduM$8 zL*;Oil^KRY0ss)B|GUchPv43E1C^s?;3Ew&U=7y6)uk!ZmVX^h7NRjxN}* z3@U`Z6oMVBZEwfv0rJG`0are_mDR@x85K zCOkBaZ7@T*n}Bt2TOXCU%(#P&y;6LMVyjsYKl+%;sMGC`#n$!eRq5B)Gp(SWF*y?j zjk8c}+?Z{#iepK_o8L18NsB~FQF*$br5WhEYI(uQfhU|5K|<=j`NcM`YFXmb>ct9LS<@^<6cRW z+ql{C0-T6&UsjZfYb60iGAlg$=3p_qwQe?EQdL6SB!u3gP>DP@vd*g3Y+jxrDi4hn z@=IQO;;dtEuu4I2k{sjcdag^2fzqikU++==CjL1+2CA{U9x8}VI$Y!V^YYO~kzn(3 z7I+m5ybGmkP+%G9QTOhPSSec&+1nx71tiN9qbT`CK10!GMHU+WzSANpYp^+SA-bOB zuY6Zgy>sn?WX=dKjAQF5XR|@aA{oHCdor{_8H5Q(wGqeDVgx1-vB8rQcF%htzngxr z(P~1w>5$Xz zSPs-9@b9CcaQI*!p}sn>n>e8vIbThU3w*r*nCSMX!hCA@6?*a+HfUip)KGzYB-4dM z7xRqwFriDlzeMV3>gNZMz%x@V4GRU&@Hg%C5bDP?pHo;ooYeEfIzsPU2E2foST)xf za|xxxWu!CpyCFW&?YrCOz^QVEgZIF|En_|fiklt7^r}`_VhG4iO0_IhM#+TRm#@q^ zO61=!dH!mfR9gPgzW<(EL;dX{_}?4ZIM|xe{M+nW!Pe}rv-p4EN`l2-E4e{a3F5hk zrHvtZ71Mc_e$}ph5^xFT4Mng9Vp7+0-O}kZmqc}Q^4>{0j5q!~-QR0gCKi%~$*6tA zS9Kgm8Ekixo8Is5k5~YgJ?X5P{*ZVQ&C;s4l<@WeoO+?Q{9dLM;e0)RFx{dGqlN0IFsD8Ur2!?_+wlrafII6q!K@)3w8g0A zH4YkxqDHMZC{ma}X7WrRKt{qG2eil75Y4l3nCalF+^L)h#p6I6j82!V6dw+tVft4^ zHV^5V)4RF0WV(TRK{zG533?5B5yFsk8Ggu^H3P4KxeC`D1z?3CfzgoO#OV|DQiOF7 zYx>dqKg_h9xeV(1wmS(Y&@DfAc?{~d;yFq+Hx@rO`&$%3)$xz1NnJ9RmnzR%AznWQ z8j;6jjp>$Nk_G<{+P*P3^L%ZyJGO1xwr$%sI<{@wwylnnPCB-2+u6*_`)-{xyE}WT zw)R_|%Gc}nzjeVf9gZ%Qc^o#NSPH1hUE8_TXeKUtiTC=LqfCHykObEMBHsS^h5DT{ z>!U+cE%>*>aGuNBX-=40CsL#5rXokF#l?!&a%=0>MD^6#L3)Zn2GkJLtuOz=zDDz4 zZhUpj+m$~~i~96*IP9r^@r@v)d)1+=CTz};`C(dh(f79Mw6!VEm|ZC|Gcnl4c+BL> z>oJw657RYV^ecilO*2RNM`|>>^Q|+fEPcub6zxE!kM*OUJ_z1V4zAsigy7_%TW&6H z`;c@>K+M76`4f3V^7L~+76{0q(s>A_=5tUKVH`2-zU@!Q3OW78)p)!5x9FumxkL`G zIRI3B{$$Tqv?K^ff3d5^|BXHS_X_wQ0`{*e_&31*Ns%2kl`NV<`7glg@UwaLg%FU< zTS(&%#iwso1leTFZ)i8PsBRfPiy-PgeSec1O5-%7IA?*n%!>=6D2N_4J9NdBlxP~^D z>>ABAnuEa}n-k5SMNBsIK_IOrr`|xBp`s_d9~7#_}m%XHb=Ku>v#zYfm&2uYZfS_ zH&XtM&gxg-X_LlHssstOd01Bhjdn@2C+a?o%evlZ;O=pCiO(UUPs{CTt)|Aa=Fi_B zX<>sA)r;pG5*<#z&q-9JwY2RlMa?$$(p5ckpoSuMcmgtiH=Tv)6Z^#pxbo+$XR2{sGwv1H$%i=x<%qe!RqQH>TH~=%NTSaJ{z^GdHMurC=6N$ii8IQ3VF2 z;B!P2(Gt1wrQ~x=6hZ$5*_oX8KOpOUYhK!mC30}}KOt*TbGan@1=-*K2wA#+TuuM+ zjs3EZbvFMp9TB%NvHk1oYOScLI4cMDA(O#k4hFz)L*f4z-#qskMDaseUPG?7)HaV> zFIU;;%VfI%nkoY)Rf$ukjCASap~#7-qG{n`3b%SqEm*}rwqKP zq%{nU%xW(gx(W}q6FqfNUbv2U5J;!k*GW4L3PGaGHIV3U4$KH)Vmw|pWv?9S1{{OL zg>r(34#|+s5U4dqZ3p6IKUSGO>ThmKqPkXZY+H;rNAaaoW;a9u$5(Z0Ghk;CeCjsV zydV z*W$JSIc!%%ZQB9G`DWQP@WR^GAxDMm8n;?~9B(^cb79nYelF8ziYcMQ-62xk8VyVI z8Q!2caV?s>b)rtgsZ2RJ2Kf-oNTbG_DV&a>bi<=jdZ_X0ElmxJThPOyutcfsJPrqMz-DbwB%@oi#`?yqQGWk@Sc6|k z!1k!;fNzZHEu*HF#mAziT1BhjOl5)Uky=o4=R{|0%$G+k6I7Vr|fK=4S15ti@Z-A`7aMT6Ja8Id=*AD*ZT>UrFO z$FYne{+Zz0Zy?67@IT5CQ2^U&%59nbh*1ronYfG~x@$0NqZ3V`C|VkRKD zLZr||X{HiiVlku+y9sy+J%!f8{%XbB&6h$GIe{-)+JbOBDIzq8KiLpDv$w_Gh>+Wj z`D86zz-^M08zgwn%2xus`|bt8Y(!t|af{B0x`2p%aIwq2;SiWKjV>(K0A=gKEXzf)-m|8h!%2e(R+#Vs(*1Cst+ zPBh##lkivRSz(PYxA^Lns{W0x{`b=J&r0z>-tk|&-oI+k|N5rSlgAVZg|UWv0R3X= z;KaZ>b`h5L)0kqubptPghUZh^@jIt@wF)vAfyPT&Fz7FrbE_qXaI2m427toiaJeq^ zYcv%kD{ExGhjglcxHIsXaU?bsvC`(~KGyWC-=3S^4D0s1fo!So^|>NK@^>POAa20y z0-yxAk_MVy*}zG1bq`9vmvMsPPU}1jQoLK$P+HW1Q&oYeI6@g<7 zXf4Y18m^CMZ^%cD3in@%+Sm5dl|{W%;K{PLYDmmcoKh*fI7;#ih^ke>7Gs+hv@s(L_TGWeXWKb*b(KWl^)?mbu zf^5v-W-&}8dYDu6!9Bg8`0#2QB4JGdMy1BS5;#(?&Y)60Xx+at)dHCaZamIqtvki#t-7Q+2RGs+yuHB`j+Wpbsck_dEIdzhAW!u>2 z<*@oIylioythOw}JRY@2e(7b9pgeM3LD5Pm+c@{H@w6{A# z)PqlW2J}vIc#K`hMAnveP_%WDw|6~+i0f+ab=l2ZQI{?4HEX+x+8|soawH2%jr-(P zo;y@O#Y?Q*^d$XHd-xP3sGAuu+Nc`^1ajm^)nRrLSDSdlaMnUMn{>nALz6hUtG?NF zFyOPZXwpHzlEIA|>l5IF=70qrwff8?i#)yv1s_}07MG|>#uSdM{H`&~iS+FCf*5zv zTAAGv@wtq|Ld6U}$-4$GzYoR%xP3^;A~Ib~T9~Iem8FOP@2rRM2tse~xyhJkHw`aZ zh90lA7{qRynHa@xn)4RfSNkE`oO=UU0LQ}Y0$zqm#dF!lSk)~^mJi0n&FMSBbRPj< zU~l2s`vWu$1{#eR3;yz^I&f5cmSckPM&AhM;-*%)w1t!W0CRrSEGbI|c>U|x2%6#` zZAZqcb>T$w@(8q94z0Ud*OCafSppjOw1xd0tl4($OjC`ypa($pd_kc#q0H7Gnfgu9 zWOSPuAlqpmn_c8~)|y=yl;eCVL(J2W9gH7y25>I55nR7oBfL^w`I=;FLqf>59FVRF zqE-S^jwroc(?(DU`Q`JL`m*uvo<;;JQm7DLi)L!coI(K=%sa@q@pKBqGLy^m@4nm1 zaae?qy{EDTvWGP)Cwfa@#bF#F6~TrTC;-CCzo6SoS>#G5dW&ZcS0I=#67s(wU)RrB zwy>Qn4%nA5QAqUQ%ZQaABNlBUkQUA0$iHA;GaonZ>@;?h78mJw49eremlVx7~znXPJD76mY)I=Kp6Q8t*^%C5}Ig^{r_I zoJ_tnHpWJOj)CGfc2168F3w;7_^VBcQh9YiTtxm@i0_Q=Tv`$d)Z+v}fvBtLZ8-_zagc z$%6k)+k{cSkdBg3(8L@b9o~UJs;&dCA%db3u70F!BxITf2aOk@?!_zYHa|2)sFP|ZJrp?tffhr*1Pfywh}?`ZCMV03#sFYGp9lu-~OvCtnn;8|;Q!Qp{?odT0b4-<(g z`7A%r6!{FND_3`><}O2>+c5RnTXi!h(U?J%Y&9X;z*p1c*Kwn~5}bYW-Jw}lYD-jL z0ZM?N$wXt05?sti$?Ot2@JH`kWnQlF+&KF1*fM$nThXN2Twq9bVWht`LYM!>t5X_M z&UT}@Iyh`KEk!wWLUVRITQMruC5$CXfWu^^p+NrJ(X!ANU$C|`CRLcwm~zT!n}gBp zloowR7-kyYel@ZAS5aGF+yp9k8@1t5e?Faw?4D$?o=av78CZG|KR2^!>+}SfSvA>E zq*XWDBpdQzE%`8PVWnr7A)WPs<5;J}cukz)*og5NyUI6tnS-&x#O-t!Ww>e+qnfK? z{co~iVx>=M!8yCA5Y8K@c^EJ|^w2#6t-*`el*l~`SD0@q{kyIL{Z5^E+tQsy+b*t} z{hVy&`e?&Uoe``^cWh1u$8AzRGxd>?HrO;Kztjm$RTV3C9x*ohUmHVk`4?9hKj>0?wl8fnn&J7v%`%l|LAo81{_mz zv+Vs^udi)D;D8$SJYylVC>iCy^T=Wa)W9+dsjVKOU9_*UiL_3$^gYS^B>C9XaV59=WQ}`W>Eu{eWR^6YfduUl`D`(XT50~en#0s{ zymhQsj=Yw+siUj^Va>6Nd!F8&tL~%FC$G5E{;#O4dB(L{hpCAU3ifl2e!p~%ithtl zC`QKDWN{wf<5kj|#{n=$Gj-DG>Nz^qCb1U*|g)KtXmaVuF3c%D6c@z`abYJ*^J3NkMbXV-iI-%Jhd56+0N zSZ`Lp!PvhuS3Ca@1ss;^Y;nR&&Rg3P=uJq}KNMv3_Z;b-NXvQYnyc$~%aCu7^aJc#)^%%?U6Qz=_tMTJ2rAyy@OdLNGW9H&P1s3O~i%d}%Bcv7Xa zimG35P^&Gx_VsKF9MoxF@9tgslM*+BWY>DZ{c5oj`XWwe`RN4U4*m*YD zaO&E}^x|lUZ3k;(bs&FGm7du+c6W-5g7#R{%&mwbQ&racWc@JUeqGXdJxxqFT^?Rs z>5*nvJ|`FDe#;pA*j$2BE%YIusZXBvXhv5Hv?YsM_=I>MJbZ>=q*YM9-WgSp+d=}~p_J`QTY3ZY$ZCA+YUL9Dqh6L_p zKsA_FMe-N;q(vG1m}J1r=RY+=s-rFrh+lf4%73iCeE(7Xb#pZ4|M5fL?SEf@vy?X# zF_ph0ul1uOtNWq?{1AR3r!AR%vT1U;JG!4soZr6kQ#Xi2a zJnTGA3b>i%EVJloJkMLW#MvH*UiDKQyOO^Bc5eM_Y6V@k@lpuwo+;v{uyb4H+C+42`*^&tDgE2Mi5Uv61378KmzX@U1Dz#7w9ia?`QY*uOu_M%G z>|p={Pex#lTYcrR1456{5DxHpj6=~U^Bh98stJ#9M9k#=K2|bp#=b#M}u%Qk@p@{pzJ*-?@1@%U4kEXgScWekjGK+`0>aRs2lL;3RoFv z3pE)#)aaOU#uUMD4=iA(QAegbm^Ll^K8GYvxAf4{Pa6Y+$NltTOo&75Pwn7&Nt7j$H3x8`?zM{4Z>wnye!WkoEOf9 z*LPU3r!RMA4>n0}y0nrg=HF|AlaM$4F{A`+PtD4_6vsMzpyEdY0H$$?YTk6){>{hC zlH*2*x10n79P~a2ik{(UxGPl!kAu)fgFEy1o)ilebJL{e_Y@uesx>qDj8g9fm;@Z= z`3^}2h=HEa=vpN{G_0~E$$dp8uOVfTW}MRA4o8S5gUSlfX8E1BdOiGpa>FFngFsS-TwtLn@Kt2+X zvUWCcHqN>^F}^;jtK0M4HSmx=a!3zDY|tLs5aeQLI>-ZL2wG|YzW*I<#yxA!Kq5j4 z3j}9?&RTDXFB$(ufJ33n0IYwk3$vLR#hbDD`V}orW^^XL<_M9YT9eATkV7O&}l}Wt= zH23guO^=E-OVViCOU*vT87B)66LfbcT8-dus3WYT?k>B1QZ? z*XgR)zI`&t^`Z}P9`q+11`}SLeln^AH8IYo$>!KT z6(tjAELyO0Uuz$qcj^?Z-3BU}q;`KhedB5x%Q?NWmHjmSpx3U zPoh3UoJEXtHm#d&miH&?%LOD4n<7OcE$wmQ<4Cxj4}7rUYy3scmDb-W$ipk$*YaZ z)$EYf22wwDo$kUNCaWPr)kVlKRC1;HL9YpcaISnh9pW=NPj1Qsxnj_88Z<}V) z<<;jF!{-{Q*xYR#WN14)Qm!)j?A$p`6R~HTLu=@ybbew+lzbVtofvUY6JMllF-=wk z*Nv)<3*XdaB1S1&nTo<;n6Hft4A#+_n<7oI-T#41k4%Yyqo-`Mb3=tcMZ>R9 zsl?%tnH?N*b5!r4G*=}+VZ9%9ZuNV#T6Tq*QkRu6!|)(T&<4zAC_k-L;%2lLya5*JMo+!N zJJ3^-a~eN-bJ<2CQUFy)E2OegE?v8TtN{??em3aB9sO)OWJAs4&=ZR;d?XOuhve|j zs~IWpU=py&U<5OWUZLu6*bFie)G1ILB@0;tdk~=!Z@=9zQ!)-Zk3Fgr+hJ`)Y~F`; ztPJd{nR-qkBAOSu!|1A-a z>Nz5%dTKLO1JC7*Zsf2%!eRGMP6h&Wp&IhnhllqcYwOBkSb&_nn-AwCyY( zoY$$AB!F+3!gw{PA^ z1`GCp14`jkU0E@YCe9}BU)~6~-*Ebv<$BKmSV)Hm7I;=cGn}ewk?msYFI%7&>^*V6rBf$n zXTJiy9HhDr&U1%%#rLPHolkT6Ie|(6*KkRGw6ZcxCT*09#0FD)Ed31 zQ6y?fq9x;);sMnxiW~yt11yTEN&FC{I&P5Mn>)$Y=!RyHEvrJ}f=N@+E}L>HaOGhW z_=vk6V0EwVZbL~g964Cl!HNENBWmKkR9k|j_8z^DCo@q>b60cwz?{cuSmf3zj3Fg9j7S#u|8V9evTVE`#^P zU-gj^WK^6qx(ix;Y6n9|Eb;^xSGaBl<$&WNsn?1wWtecD1zHT%vSjb`iuu=BibP->;or zNA0%oesURPw!N_Z-JH+ZBL5zPSkR)Ao)GNR&Wf^LAXHb%3LIP9WDeWKa>H~5pbir+ zmZ0N&LaHaj?&Kfn@YzcqKRhL=PLPHV&4n+XQS7e$7}w3Du*@#}>)C%mwUC$a@}2&a zH(Hv_I35y6k*4S@e`Y5Xq$Z1lS_`vM>U8_X623>a`Pz6IXMmqg%C z07~vGsEa<3So{170NcrwgO-&B3e?MVf)@*M2d~*$V$6>Fuuy6PV*wUy*xy7;o zRf*X;CYO4Zi%}tVh2O925+mEX8zQ3_Jyf32iV4Nee6@Q5((kYc84}F_*DC}i*hU*| zFpPWCog2>xclgfPQpJ4;*G{M#(0Nr3Yj3Sc8xv6D(4k%cRegP3|yqIEO$#oWH z7V-#iW7LHgDPBUIrE*4baqjX&7KTxZK$#JejYiI!Sm)>AcoDoif=I2aS~G!rQHK-I zZY>dYG3G5=%HL|a)g1;}D}`h?JpjBXom!ekwjKXHgH1a&@&pltF4dY`cn-=HDme(P9|htcZsA+Q7kx5RS3lGWm34K~AC_;We@eiJvJi`3Vt9UEjlS*fhB1u(W)`3rs| z;X*eE>L^)^g_6$iK;zzy{)z8bNXLdp%v1^EaUeQzh3g8<)h|M%QHpi4adkZe_t49< zWbHn`UnX~nGR5Olz)Z-^E4QohCF{lOP@-9w^B%lJ}s zN{G%Ywm>dom2=HtM*qrSX$CHLp+CRdN`#%|O|M%a&zsA}o6>Y^;5hU&i-UWC9 zI6!=ml~N=HKw!}HM4%FJzu37laB>oJ@#7FUOHn+@^3LL`4c<7Pxb7uJ<6_*JcV4d} zsgiSTbVRyrDUvJ;k&cy$jzgTRbr03AetvfH8;@_w&k*o&`?V>(EfauS41y7h)}RJxT{fHt`z_og zfld#S1(Oqz!4$(YPgRZiXB^lMRSJ(a?k@N_dJHep(1#r*)8?zN^+(TUgGV129<4-; zhWod@hiEd0`G+LH;zrB1!N;itRr%8wF2avP`~-J$5@-rBMt@!d2Q+uug6pniYi=*; zvFRe*RF|sxVPl|IV_la?td8z+k8zPq<%-o=wFuQU`l~`y<)JY^aqEn=+>k##G^UF- zF7%*IWUF1TY1{L)6Ppy*U_^|aLKd2Zo+WI(XC$jm zjKCGI`I;vg)@e|M^I5gb=%LwC<`8%U|2L!&uiFEr|i;;+y|rR64-s-Np*jat#%Kn)N? z|BJ4(^Kv#DX*IaYA5CXE7POm=?5;D<5VWJ*-Z8PRtQc-bfFH=CnHY-q>cPsNVUJO9 z#qs!bmyms4&w5$#tfID6Rk6Dg+nymcbhn&3TsP=wv(RY)qB*_4}3nR%8=w^e!@B%MiyQo_oJ<1_d) z!#cwCg>$8ytb6d2(#kTo^*8}WiL!X*EWTmPE75)#<@4ZIcONf)*TKb+E$RvQMz1jk z-8^z0V5CC&3Oz;sZm5dOq;l{J}zDYiSdwo|4LJ+9=S#gY61}X#A+x*hB}5^wI26Gd_LFRQe!~^byi)eo@HofC@w}u?G1 zx!xQfs5A~nAAvH8@V}S^AF1A>n23~S$kGT#TXeA~QDK#}3s4tJFY%7xPZI9tLWYv8 z9REt1W>md4!~OaSt%Cj2$^D=A3QmsZRcvj1{s=Qq-~`;v3~*LF==(-u(`?qgxY z$j}rKBf$>*JExWxINGlwJ~EUXMpWSQrch(G zlM-N{tVi5TLLU>R@$G@q_Wd&+kjL`etff)uL}6BQlB^x(tF;ec6^qbI8V32IV-R$` z(fnsb<5JnV>--DXI+-#@>J!wmOtB9Ajsyj#Xl+|(pb*PeB&Mh0_{Q#P5}I@<82RmS zlbP9zVRUIz;uRFG1rb%qD~5G)QoYy$7>t!hF)Y$t4dyPPBT2W2BFWVt3_)4~Jw|kP z4pa-OagwGAV=L|#aHQ1){{5X;B?4@1l&Nz1{?3xZAbXV?NI_7U;8;A^ORU8^ihD|D zgFMLmfl6n?-*@!m1808XMqwbSRyZGe48hQGeb$(%R2C;2W{3(feV@&<4<(0}=gZI~Sa&Gv3T~K6jBX>EzXSyqw28eQ)-r*E$9*2tV#OWvjXTHV2s(LtXF4|_1~kAKRW@v?-=GGtOTnz*9?$Ds6nXvI zhFu|iya)Kj;T`cd+}MCLDAy4Z%XI#4o%%TQ8gNm78%?Smxg*j3!3OO{SH71wM0EC zI~Ap_R>%fSoW~P(h90I5By?N_d!%UQQ@N`4FQ^A<!6xIGKDlo_hko60|w0Oelt&?(C-r zo4U{$GJ{@Az)~Mx_OkBORH(G4jz~Y@f!+qUu75dc2w!;aP+2=7Kt9HWcH%fjq9U8N zQ5$+ZpZ(}*Z#>v~X1FWw{WJ)+J$x{s7TN_~Zm zyz3!hnr!ysx8*H_>Wxq)g!iiA=0E7_D2~tsg{>Oa01+1vU0*@)1NGAcdG+u|o!6U; zlr&bD&jYwpTpt6#l142{uu$x7&>E3k=Gm!&rhXr(@}~=rfwHZ?U);DoK~%W6a#@sGSxE%4%R1;rt|`>7>bq zqs+l)O~MVtAlCg=V8H{)`=Qo7?UW~9DMr$1SMuxeze+Z1Dg+E~Td6E&eqhJ&ml*Nj z9?kke`qX+|5(=tvl}PW$6DENe4ydD;^U| zt93U?Hz#DDp|wwh?5HGvNJUSTvR+Oe6X-=&UhRM<(;1O+S7e-_>hg=u)m!P5rr(Hk z;$R|MeWzJ@`y|L|IBC_9FgR)G2m?51-Ag{XEg1@*+LV@cRegZYp(|~6eO47tQfzuM za<;`7tPHd$N#>O2EWI6zzmU57@iPUB~`KxzE(G0uR<720k?^K z99{=J;p9v=)JODAdxlMTQdStesZlOhzq44rvzJY{@Wl4icn5%8S_i*_vC^6;%0vRp zuteI8lFjVq&nW3;ULFb8uL-T;-zK!b-&?5uaYFlVfGdCXM}KufRjRKJnDfXV)i@ij zU2NcL_CjY|W(Y>3VP+6Eby2U< zePusiXXs&-<%1r!T<0zv-$6bNhtqlOgS;lsqw>EWbyN`BP_ z*d+TJ3O~q4(c`6PDc$&FC!EITZ?%e{#@wa}7!c#d1CJOw$C>FV6psn2H9>M=ummQ<=_ z%f{K zjB|NX64b2ja&45qTv`BH2CTW=Jk@BG6k1rUm##fWB`^#{R>lv3E`AJmLZL>?e~U&J z*PJY36v2%U;fvFUi5>zPvgmWb%lD8}R17vQwD5Q0cU)g8#5&-oCMT;xL zBp7%kCqj!77C&xU@BmK8XlQiXwmW21m;U6BUImP2;;<%l=-6RI4?XK-_749z4e$4r zU%U{R#*|$90`j5S(h_f69#J`6gzPtb3K0~HtZEqD%zVmoa0;Z9gVG%Rk}F>uNt8iE zY*+8o*&<@;c!LI;U(>DqVT*qk6Ens|AN`waIIc5kp7B6Y#A1A^tXsBwmC${G3<5|% zJ7zw$0b1?W%cdWEtWi6-s;y`~91qFj+Z>oyuQ^HS8qllMG7`q4;|L35M^SY!*#*K< z<6O>Ik@~r#Uq_8D05QNQ(fpBWHCfnOCXp$Tn@(>3dBFn>T&t-QX%h&uj!x{JF!1K| zmG&2V2Il~&vvAuubN&iqg5s$=7J;7(wEu= z4!+`g;1bwEB{?*>-c%-i)%^O}g3Haof{hPRT)cnRATwq7ju} zc0!j)OX1f|Oloh5oEcEenbw_<<5(G`VquKf{dvjA8pL9C@P8*6oIoyQ57*Ot)8H!v+=P4{h=1sHw%s)0`x^8G8-rxt7bBKCp zGvb5MbH<*CM+Vr_q)zYo(hmuT8xOxExUvV<6KL|m(%O-a;lCMItrl^9QV9*Hj8fKd4m>1CsU&tkQ2L1JkHcHuLo&Eh%~l9kwA6Qj0l!#UZV?}>J_%$i%)FG%MCZ;-2KTC^_| zyiBle-H#x>GLDC)K&OI4x0fGedd@@JHq=Nv)yK-#@1% zm++P!_z;(!M{S^<6jN&D>wCX`ZB<)LdAN@Mqzd2;QsMfom%|S?X+SAsNSZCkIzeYW zX-KQ{lTK$qf1JIyrSF!!nd0bhv!`r2@|8|5>=P+wp#M;CZ1g;auGL}bm*^`y(DTwr zsjUxal~I5ZYnODGQar{F^R)$26 zjDt9&@#mFfZci%&9Egq$Zr?T6g6weuq9eK*u?(c$DUJ7?%H<(l8c3R*CkY0rsiF zU2nx4Rhzf~-h#d*^=$C+gMJJFdG?)stdCl8a^+lywCeJ=_yZRDf64YAl;1z1(Usinj1}#S4b4r=jej`&Rf?mOP8DYP(6}X6Lj?vwe`6i_&!;k3*EQp4pFZ5Mx!Jz2dsQXg=?WICXI0@E}x3eQ(A(Xh} zrouxQaLCPu3M0wUW6%v0otK?U(21zu!|@pu$?bv)R|es8{=!SY}!31 z$`Tn~Gcwk;gRDl^b}B+T?wWPSicy_I*JEL8+J4xfmbyGekW^RAho&S)#m61cFBxv=VCh0glRLm zyz@M9j->AU>!o$15_8EqK)Yn^WG>Cmre7rhw!4bwXpoa^LDnDRHOfKi^vrZJBMM1zJt4`AxY79E9 z$xVl`^?Ow)Fs#LNy8e_*x`E+cd+l$$ToK+SPBS-nqsss3o=@Oc7;dwcc&#+ZXry$9 zN8A?~u5(B4sN2c?{Z?!68wfg%7Qx`B)}dvZFYX-k#a-n&FYv->MT)fFve>>-tW$-g z@!HsN(PpBR5aepNu@)m*-oL4;M9if~40EP`M2hL)=C2S6^&ANT6oseqmEOXops21v`bQ9M|Cc>x4jx8^RrO@C9REg`$P!uMI<=x-yA@Pi3IoW=Mc)RF%n#SmWbV>j_WKSvCWK!f&<4MbZF*QSalY(TfOWG_wF%BHOYTGAC|k-ehH%? zj?cf3Qf30CluVQ~U9RaQJ~FT56>-SsnnRHKEBT9`hfUJa!}X;-T>D2(0MCE$ zLT!wUUH?m{^KTFJuXmcH^rv3~H((I8<#%e>K>%u`THrh~p4goN7PO2+3o4cE2=!(` z^rZ`%W<{J23TY_j_|lwr`JoQUfTB4PoBD=^Kic8(tc2(L*HxEqlCB5Csp0m4$U;g| zdJ4jD(>PlFiQzI*l&SVTEl2}OrJ)s9hAO?8{;S^O6-WL4{(=6&!57N<5YK`57-JXa zpc(?4iQw`J5?pcg5pQJH=*bN>$Zc_vsA!(%=?r(KL8A`yH!LnJjn)AKfbIRvqdBTB z&aM3s=qY~s49TMd8E&+C@laiEWyi0l>F4rsQXtH>%Gg;wa5VR=q=nI&Y|U;P2klGn zYwC7s;8i&hN_M2a9cl(>=H=-&Ki43)cyNH|d_%rR>a+Wbs_COylQQ`dshH>B6jKDn zxt1wA7f~(~yPv_#4UyZfPmL=O3`?dXfpYD$t=Q{$?pca*v=r4!S&Zwd4bg#_6=o_l zjY}_ogYZa;gD4Wo7GfygBVM_6KY0%kpm=q*?xTKA)K_o$1@1Ny1*p?J?&Yn;K1*B4 znDuFeD>#s3?+9ZH46bYPXoSinh;%%Fjx-zJR<0i#-yXvCv*Mh)ddx_Wh!$HvIsSSK zk7MuQzz{48oyt1N`h>!XyC%sxU{RH@DssU$7lJYcYGdo%xvct9(E5kCXG60~^i}4y zNQGES*tE(Gjen?#oRUItS4EezYnz3bKBhk^I)~vkwJj0$^XIaVqFM zQqxNTze(e?cmIp2Bk;sE^0$nO%}&nD+(V=j6KGWnFwgv^?%#So(5gOiJaj?kcL)ud z_(#`~ibZt7q;vsfB4jhrB8wx^eIZ=uUs)Z0DA_(9g6QhM#z*#lRM@ls-(Sa<9M|+K z@!LVl+`-Y<=3fnxg5v+o795_Onh8=cs~|}9xCaK-iYFlf0r)OpCi8DP4RSwu!V&d~KiE1MEL6$aS_imwnEt z`!YNMWga!1Vyh2R4sbJfRp2Z_P!;EVm?^O{QIcHAmVA`)-nTr7?kidT2oYp--GXvM z>VfKPghVCiBev)x)(M^*O77woZ1X6ReZ;pvcLvH!bv=Jkm=~&h=aH;>PQK3}VaHsb zBjEHp_dJ`ay0#3ha@`iO1C6Xjg>#zHBQ>!1#m9_sNsvoB82%+i6c4)K&Jy*waKo<` zP2HFSJ*%L`2jG>T7HUYmArP<($lj$m{mr2fDtRqG?to||4S(o}{WYtle`ekL+QJuQ&Xs{Pk zf<{DkhIo}Q?e9W|W^vxQiPZ>i5^cJah`%D`rSrH<_P)3>k^cszzjI~&gH_vKDsK^U zD`UkkaiqEH*I)nhL=&ZKsrseISWn@yVMN#YKBzH`M0wx`)r4Xh(8z_5k<3RdXLf1{ zmO^LDkig7HzFo2fJ4H*C(q4(AUGXJVFO%eUVThC4(eQ3d^SEd`JnOn-C#C&-*#-8s zTx$0f2Ns+{f-(%>E%&G6iH_S(*W!`4!=8oU8H5JT*)DecJxCugX_z`l4ctPHI?RPq zXf3~Tg9RK-%XVRhgub)dSH&i>&S({ZUw0?uQ*K#oquf+~h^E3kJk?>k{HoGc*I>vL zG&Z&Q!@@PVEa{HJZQz&4{7hFcAzJZd_C#jPl73o?wc?SAO|rkx*9qpz1YMx)4lwx2 zzl++4p&wx^Y9-lj;f^|i%C>MKBoQ_Lf3$bz@lbC61NXJ>k+mCzx}vi0N@8q-kzJH! z>?3BxWGmAhA!JLbt`^Ers!J*EuT++ZQIWW^++0K|axG=4pUzp4*Mn{78>85KbX%Mxlfa& z9dr9@N@t4Z;AEPR=$Gpi`vy+?Yo-rMXIK}nw=gte;659*^DgGsD++rwPmOGNobHY) z;MDm2B}(PJ`iDd9!<8W~Z++lVxaYA$?R9YD)($;u`D}wB+pZn=OU!Qel&2;98E92? zUbIUlZ|@V%>PR71_w?+W?mTa{?kdx)zMsI>(%E7=%x5roJE34m?WFB6kG<`Y6aU)2 zlW2Wn@w*Vp#`aKfU7osM#mERswz#0|bAof@gGlr)A+`240k(W^6C+Y-%IzJK5@9yM z<4C1|p@Yu`pJjUrA)}>R{1Rh}rQ6rgxQjE^|9Y#dFLpn~lTqjjFgnVJCS^ zJ#xHrt<)zJkA8oNXLzQ6A|YJ5Jh@?%D^mG^@eO^pGSw@pYP~U@fs)3j>@FpGCiB;R ziywMS>`{`c=X>s%Nz7z5N!{ez7K_=nrd#?lxq`3c!wa$FdU3_FYq*Tz4yE({TI!e5rN)R zM`7hs$qXH0+cDRMuZYzA0@Z_2gjfXkWFHxoS${F zT|Zs2=(iHlGM&QLTUs5E1;nVzP|9 zPfkiVt@C6W7)k1BH(=+Qo^(ZLKeD=dsNz-cTxe?jLbmDy12;Ch12_76PiAH|?T}c! zit^0nI~wD*NNZ>4o-Lh5?2eE3*$G)!?D<@s6y;AETv2$C&i2iJUDa_l#F!Yem<21Qu-Ht#h&Ch^kpm9j<9&_1&LV97=1uU}v`nyovyjXo zosKukZ;lt&57^X&gr>=$+!IC-#GpG>MIntU+5PL9Pn=AO-Sti7dL;iZw@I(tDmXX) z!>Phtdg$D~;FvqE7wp1Z_G!noxL}_-F`c%s>d1F$9?{sFRG-=`vbT5q&5dd%Th?oY z-j{2|lGW=w)$51EY%WAb9eUDdnP<8`{hTnPnuU*F-~|89x^t>g&DB=17oT?B_WR1X zePTRcs4ahb=9;VGp74lgAPmU?*IE2*{xZVQ>@_3H4nuPPABGkSLs-q&Ef=Cb-ffvO z9x@giKSJi@jYibl5OX?Dz%v*)=Y0h+ugMdA|JQ(>cnoV%5V|FD(9T{ zei_izU;HNiBkA?f{4i8GWZMmep}X|LP`=v*59cZ-|3LriVeIbXd#fBKGWK4dVBNO$ zQB~+xd@9!CYEwe4?DhLveYWe>(BYH0w(Vy-BdYQ-9gh?<6EXrm#xpsnZ2mQZVWUUr znBGwC+rd+wZM@!dZK@Ns9gQvV z)x4rF&qlb%-_Rg0=JdT^FirnON#FTPxAtd_wDhYr|G_GsnbO+zBH<~IhU<;P(b?nX z|M1Dz)+ly3rf%D}hyC;Kp2R$7fs4+DpI+I&8s$bfYbTpN%prWu`6jhJUop|rF7uk{xWIQc#|giD64rb^AS&E&oY9J*o4v|~eCB(n`X&dz zPKl>`P9wY>Yre($jxqbKAsGIFN6G!`gGCgUT^HUl6UE|E)fk%^}s`VjwfjnJu>Q zdlKPOAccQ;js7faLaXeMe)Gz8GC>=5Rfm@_nW|X-^O2I0KHm^D}d;g1ftHr7|t($bX2czAfYxdkD&o7SVP-P~%PZ{{?aP7!ThL@d^TyJ(IVJ(r08+$n?Cq_D+ zAjNKKz0GttemBP2!n-iajDU6bzH}+d^^ty<~DhZPvyOr+up3lWo5cTlDXbBWfEES zWw&q^K^UubO`=B99;~eTM`m70t#eI!w}TGc0KAq$9XMFI2YbG1Fei+Gk$~VNJa9o?GcpAk*xA_`l;`OIjbBzLGZ1JH7T{lX>LK>AgkVglZcOj%&TrCzCJe+rSp!)H3_Ni8BSI`EisX3 z==hXdM#PozS`q;#BGl_7^$O8QZ2G`6Cd@(h;JZGj#l&?^X!@d}o!eaKm%C>YzN<8UzRPWj#Y?BbQWVt+p%dVFz2 zpe(eKPIf#Lj}DCpyTP^gw2F4bv%4ExOLuF?o8)RA$lA11%Q(OF-t)EM7NOT)VGnTP zIn&ynG&le5(yQW9(rk8j@XF2A}k)Vi~DMvY7IUYEFToBz-ZJ?4iO;=hlbju~oLi0-|NhNCs z=vpD0Qd@|k;oJ#0dg3-xiHo2sZsr{fE^L17Q9Ih7K-iB^I-70Q(IAy@D*p-#fcd2d zAP;oyCnb@H9dyf}=MI!Yd*D%Cc(f-PkDi^fhf9YFrBT<-rV85sWpGWQAw@KJl8Adi z1X|o+vsH;e8k(cs5m2=vaM%#g(7l2-BmMmk1z@mfES@&9q5JZ_F5vJDV0Zy-UZx}x zag1wq$b}rpa95^&KfDu|s2ixKN`ZhUiKxrJ3=YcCY(_DgK(xo){nT*dK?E(qi=45* zN1XvhlZxO9+Y%|h>Hv>cNb#$Vwhf>y;F^J*_C{Q@2BodJ*NgAZRn5e|BSwrdjz%q*lfV zUesQ!S*&N{K-1#}LwY4jwSXsy=(%}CjD;#dT}-@%$&>?VgF&E+f#x76i9|F5{n=7o z40xMxrSy%i{@5`2pCbx*bA&+C-trYe0F<);#0A>_ia@wvdZ05?GN}Xrid_JDtFb~* zCgCPJ^4M2JnyMZT(_#9YrDUFZ_#GC`$ps^S{CIWQMMj#^Kf@m~R$bg#r zMz6mB;mr;k8^5fOh#6cJlvL3#wZal;51H z{0Hn-BHl0zgGYK>;2bbmPh6-aSmO1<;!V(4Pk+j(sriaE`YE(+1(urvWa`*f;II<% zj3vQ{%FBN-6CSIzs~86qKVU*?62fVfq`A}3^L6_5#H)ffV9mpTW<_O9lFKSd2wybT z$4ejWalj`CcL?jL=YhxIu(T_)r!>*%3NYy~82Z{!;iueIjmP1F7vLAObhGx~ohLv6 zxIufP)?dQ&|Fi(K^*`x{`e#4D4}kVU?aW(!R*9eSF54h9HW*yLi+1;4WK{d7g+WCW zsB}v(KBs;qVDMWd*$IaWpjX-O@9|QP*gglW4oTan@GoLP-@T$F5;5fP3OEaeL(vod zbsTEp`{R}rKD+Yr^HVtUTO<5SCe#t;k3@RHp_gP>|7-*Q+zy-pDFFZU1U17YWm$|_ zCFnBX*Wy#Z&GM%$#Q=kud7reHuL1m$YUY1^Of?l)>&y^Tw4&Vqh6enCcEf>RVMN{f zEAy5CT=dSg`HI1BwxJ#l>gBJ113weDP@x&;fZbq1?Hp;hmI0!DZNy@63VvS&HB8{n z>S2ov3gAc5p=o?dA`#PyRt=+VMEEgAYOfHxPY*>o*|pe-ceqzTl?6XdM(q_gWy|5f z-GSMCV96k_~b5QQ(kQF}z)su^?3qwtD?JOaM@W$?pF(D30%_W~0yZY3&pAXMOw awLMES7VwtDz+epi*sf<_@O}gR?|%VIHKlI= literal 0 HcmV?d00001 diff --git a/lib/imageio-metadata-3.2.1.jar b/lib/imageio-metadata-3.2.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..5c788527eaea348a59744349867888d326fe576a GIT binary patch literal 73478 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

^4tGbiGc8^N(K#0q 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 + \ No newline at end of file From 67e3188b2e7d0d7beb10f5294ea7726ab2303830 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Mon, 28 Dec 2015 17:57:14 +0300 Subject: [PATCH 056/105] tweak transparency --- .../src/com/intellij/ui/picker/MacColorPipette.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/ui/picker/MacColorPipette.java b/platform/platform-impl/src/com/intellij/ui/picker/MacColorPipette.java index 073c4ce9d545..ab130ee02a57 100644 --- a/platform/platform-impl/src/com/intellij/ui/picker/MacColorPipette.java +++ b/platform/platform-impl/src/com/intellij/ui/picker/MacColorPipette.java @@ -46,7 +46,7 @@ public class MacColorPipette extends ColorPipetteBase { private static final int SIZE = PIXELS * ZOOM; private static final int DIALOG_SIZE = SIZE + 20; - @SuppressWarnings("UseJBColor") private final Color myTransparentColor = new Color(0, true); + @SuppressWarnings("UseJBColor") private final Color myTransparentColor = new Color(0, 0, 0, 1); public MacColorPipette(@NotNull ColorPicker picker, @NotNull ColorListener listener) { super(picker, listener); From 90601e47a06efb05dde3098f12cadb8194e355e9 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Mon, 28 Dec 2015 18:01:52 +0300 Subject: [PATCH 057/105] add license info for imageIO --- build/scripts/libLicenses.gant | 1 + 1 file changed, 1 insertion(+) diff --git a/build/scripts/libLicenses.gant b/build/scripts/libLicenses.gant index 16de2c7f08ae..b0d3cd4c23d2 100644 --- a/build/scripts/libLicenses.gant +++ b/build/scripts/libLicenses.gant @@ -214,6 +214,7 @@ libraryLicense(name: "imgscalr", libraryName: "imgscalr", version: "4.2", licens libraryLicense(name: "batik", libraryName: "batik", version: "1.7.1", license: "Apache 2.0", licenseUrl: "http://www.apache.org/licenses/LICENSE-2.0.txt", url: "https://svn.apache.org/repos/asf/xmlgraphics/batik") libraryLicense(name: "xmlgraphics-commons", libraryName: "xmlgraphics-commons", version: "1.5", license: "Apache 2.0", licenseUrl: "http://www.apache.org/licenses/LICENSE-2.0.txt", url: "https://svn.apache.org/repos/asf/xmlgraphics/commons") libraryLicense(name: "xml-apis-ext", libraryName: "xml-apis-ext", version: "1.3", license: "Apache 2.0", licenseUrl: "http://www.apache.org/licenses/LICENSE-2.0.txt", url: "http://xerces.apache.org/xml-commons/components/external") +libraryLicense(name: "ImageIO", libraryName: "com.twelvemonkeys.imageio:imageio-tiff:3.2.1", version: "3.2.1", license: "BSD", url: "https://github.com/haraldk/TwelveMonkeys", licenseUrl: "https://github.com/haraldk/TwelveMonkeys#license") libraryLicense(name: "ini4j", libraryName: "ini4j-0.5.2-patched", version: "0.5.2 (with a patch by JetBrains)", license: "Apache 2.0", url: "http://ini4j.sourceforge.net/", attachedTo: "git4idea") libraryLicense(name: "ISO RELAX", libraryName: "isorelax.jar", license: "MIT License", url: "http://sourceforge.net/projects/iso-relax/", licenseUrl: "http://www.opensource.org/licenses/mit-license.html") libraryLicense(name: "Jakarta ORO", libraryName: "OroMatcher", version: "2.0.8", license: "Apache", url: "http://jakarta.apache.org/oro/", licenseUrl: "http://svn.apache.org/repos/asf/jakarta/oro/trunk/LICENSE") From 24f3163041316e4870f9a1b44b7256f2c67116f1 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Mon, 28 Dec 2015 18:08:18 +0300 Subject: [PATCH 058/105] IDEA-149570 Java debugger "Treads" view does not display frames, stalling on "Collecting data..." - use current context if applicable --- .../engine/events/DebuggerContextCommandImpl.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/events/DebuggerContextCommandImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/events/DebuggerContextCommandImpl.java index 0aa60f78f3d3..808fb22bc3e0 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/events/DebuggerContextCommandImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/events/DebuggerContextCommandImpl.java @@ -30,6 +30,7 @@ public abstract class DebuggerContextCommandImpl extends SuspendContextCommandIm private final DebuggerContextImpl myDebuggerContext; private final ThreadReferenceProxyImpl myCustomThread; // thread to perform command in + private SuspendContextImpl myCustomSuspendContext; protected DebuggerContextCommandImpl(@NotNull DebuggerContextImpl debuggerContext) { this(debuggerContext, null); @@ -44,10 +45,14 @@ public abstract class DebuggerContextCommandImpl extends SuspendContextCommandIm @Nullable @Override public SuspendContextImpl getSuspendContext() { - if (myCustomThread != null) { - return SuspendManagerUtil.findContextByThread(myDebuggerContext.getDebugProcess().getSuspendManager(), getThread()); + if (myCustomSuspendContext == null) { + myCustomSuspendContext = super.getSuspendContext(); + ThreadReferenceProxyImpl thread = getThread(); + if (myCustomThread != null && (myCustomSuspendContext == null || !myCustomSuspendContext.suspends(thread))) { + myCustomSuspendContext = SuspendManagerUtil.findContextByThread(myDebuggerContext.getDebugProcess().getSuspendManager(), thread); + } } - return super.getSuspendContext(); + return myCustomSuspendContext; } private ThreadReferenceProxyImpl getThread() { From 2030aed7e55e8efdf26719121982c02793f80e94 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 28 Dec 2015 18:11:52 +0300 Subject: [PATCH 059/105] reverted --- .../openapi/progress/ProgressManagerQueue.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/progress/ProgressManagerQueue.java b/platform/platform-api/src/com/intellij/openapi/progress/ProgressManagerQueue.java index 594d45f8d3b3..aa28f50dd13e 100644 --- a/platform/platform-api/src/com/intellij/openapi/progress/ProgressManagerQueue.java +++ b/platform/platform-api/src/com/intellij/openapi/progress/ProgressManagerQueue.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,15 +44,17 @@ public class ProgressManagerQueue extends AbstractTaskQueue { protected void runMe() { if (!myIsStarted) return; if (ApplicationManager.getApplication().isDispatchThread()) { - if (myQueuePollTask.myProject.isDisposed() || isEmpty()) return; - myProgressManager.run(myQueuePollTask); + if (!myQueuePollTask.myProject.isDisposed()) { + myProgressManager.run(myQueuePollTask); + } } else { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { - if (myQueuePollTask.myProject.isDisposed() || isEmpty()) return; - myProgressManager.run(myQueuePollTask); + if (!myQueuePollTask.myProject.isDisposed()) { + myProgressManager.run(myQueuePollTask); + } } }); } From 093a992d7b7e08bcee5d5784f8f3a40d94386063 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 28 Dec 2015 15:48:00 +0100 Subject: [PATCH 060/105] avoid EA-77189 - NPE: ThreeComponentsSplitter$Divider.processMouseEvent --- .../com/intellij/openapi/ui/ThreeComponentsSplitter.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/ui/ThreeComponentsSplitter.java b/platform/platform-api/src/com/intellij/openapi/ui/ThreeComponentsSplitter.java index 6d5c2652bf25..f20adf5a9992 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/ThreeComponentsSplitter.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/ThreeComponentsSplitter.java @@ -745,7 +745,9 @@ public class ThreeComponentsSplitter extends JPanel implements Disposable { case MouseEvent.MOUSE_PRESSED: if (isInside(e.getPoint())) { myWasPressedOnMe = true; - myGlassPane.setCursor(getResizeCursor(), myListener); + if (myGlassPane != null) { + myGlassPane.setCursor(getResizeCursor(), myListener); + } e.consume(); } else { myWasPressedOnMe = false; @@ -755,7 +757,7 @@ public class ThreeComponentsSplitter extends JPanel implements Disposable { if (myWasPressedOnMe) { e.consume(); } - if (isInside(e.getPoint())) { + if (isInside(e.getPoint()) && myGlassPane != null) { myGlassPane.setCursor(getResizeCursor(), myListener); } myWasPressedOnMe = false; From 89e5ce2e4809c09cb9731b6b2eac2d3e51b21c59 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Mon, 28 Dec 2015 19:39:40 +0300 Subject: [PATCH 061/105] diff: remove duplication --- platform/diff-impl/diff-impl.iml | 1 + .../com/intellij/diff/DiffRequestFactoryImpl.java | 15 +++------------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/platform/diff-impl/diff-impl.iml b/platform/diff-impl/diff-impl.iml index 45f1719916ff..186e74c7578c 100644 --- a/platform/diff-impl/diff-impl.iml +++ b/platform/diff-impl/diff-impl.iml @@ -12,5 +12,6 @@ + \ No newline at end of file diff --git a/platform/diff-impl/src/com/intellij/diff/DiffRequestFactoryImpl.java b/platform/diff-impl/src/com/intellij/diff/DiffRequestFactoryImpl.java index 23e74c4b4539..24d3b3555748 100644 --- a/platform/diff-impl/src/com/intellij/diff/DiffRequestFactoryImpl.java +++ b/platform/diff-impl/src/com/intellij/diff/DiffRequestFactoryImpl.java @@ -37,6 +37,7 @@ import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Consumer; import com.intellij.util.containers.ContainerUtil; +import com.intellij.vcsUtil.VcsUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -103,23 +104,13 @@ public class DiffRequestFactoryImpl extends DiffRequestFactory { @Override @NotNull public String getContentTitle(@NotNull VirtualFile file) { - if (file.isDirectory()) return file.getPath(); - - VirtualFile parent = file.getParent(); - return getContentTitle(file.getName(), file.getPath(), parent != null ? parent.getPath() : null); + return getContentTitle(VcsUtil.getFilePath(file)); } @Override @NotNull public String getTitle(@NotNull VirtualFile file1, @NotNull VirtualFile file2) { - if ((file1.isDirectory() || file2.isDirectory()) && file1.getPath().equals(file2.getPath())) return file1.getPath(); - if (file1.isDirectory() ^ file2.isDirectory()) return getContentTitle(file1) + " vs " + getContentTitle(file2); - - VirtualFile parent1 = file1.getParent(); - VirtualFile parent2 = file2.getParent(); - return getRequestTitle(file1.getName(), file1.getPath(), parent1 != null ? parent1.getPath() : null, - file2.getName(), file2.getPath(), parent2 != null ? parent2.getPath() : null, - " vs "); + return getTitle(VcsUtil.getFilePath(file1), VcsUtil.getFilePath(file2), " vs "); } @Override From cad20492947aad3fc601aaebacfbd1b77309d7b6 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Mon, 28 Dec 2015 19:11:30 +0300 Subject: [PATCH 062/105] diff: better title for "jar vs folder" romparison --- .../com/intellij/diff/DiffRequestFactoryImpl.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/platform/diff-impl/src/com/intellij/diff/DiffRequestFactoryImpl.java b/platform/diff-impl/src/com/intellij/diff/DiffRequestFactoryImpl.java index 24d3b3555748..09c085aa4407 100644 --- a/platform/diff-impl/src/com/intellij/diff/DiffRequestFactoryImpl.java +++ b/platform/diff-impl/src/com/intellij/diff/DiffRequestFactoryImpl.java @@ -129,12 +129,19 @@ public class DiffRequestFactoryImpl extends DiffRequestFactory { @NotNull public static String getTitle(@NotNull FilePath path1, @NotNull FilePath path2, @NotNull String separator) { if ((path1.isDirectory() || path2.isDirectory()) && path1.getPath().equals(path2.getPath())) return path1.getPath(); - if (path1.isDirectory() ^ path2.isDirectory()) return getContentTitle(path1) + " vs " + getContentTitle(path2); + + String name1 = path1.getName(); + String name2 = path2.getName(); + + if (path1.isDirectory() ^ path2.isDirectory()) { + if (path1.isDirectory()) name1 += "/"; + if (path2.isDirectory()) name2 += "/"; + } FilePath parent1 = path1.getParentPath(); FilePath parent2 = path2.getParentPath(); - return getRequestTitle(path1.getName(), path1.getPath(), parent1 != null ? parent1.getPath() : null, - path2.getName(), path2.getPath(), parent2 != null ? parent2.getPath() : null, + return getRequestTitle(name1, path1.getPath(), parent1 != null ? parent1.getPath() : null, + name2, path2.getPath(), parent2 != null ? parent2.getPath() : null, separator); } From 311fa6441746d072d69b8ae7ab3e7ee593ef76f8 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Mon, 28 Dec 2015 19:30:03 +0300 Subject: [PATCH 063/105] diff: allow to step into archive in "Compare With..." * fix titles for archives, selected with "Compare With..." --- .../src/com/intellij/diff/actions/CompareFilesAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/diff-impl/src/com/intellij/diff/actions/CompareFilesAction.java b/platform/diff-impl/src/com/intellij/diff/actions/CompareFilesAction.java index ef9cdb72a0a7..e0d802ccf0d8 100644 --- a/platform/diff-impl/src/com/intellij/diff/actions/CompareFilesAction.java +++ b/platform/diff-impl/src/com/intellij/diff/actions/CompareFilesAction.java @@ -121,7 +121,7 @@ public class CompareFilesAction extends BaseShowDiffAction { Type type = getType(file); if (type == Type.DIRECTORY || type == Type.ARCHIVE) { - descriptor = new FileChooserDescriptor(false, true, true, false, false, false); + descriptor = new FileChooserDescriptor(false, true, true, true, true, false); key = LAST_USED_FOLDER_KEY; } else { From 213c8737f08dafb93b4d51e5cd1e2a7cdd065491 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Mon, 28 Dec 2015 19:49:11 +0300 Subject: [PATCH 064/105] diff: use filesystem-dependent separators in diff titles --- .../intellij/diff/DiffRequestFactoryImpl.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/platform/diff-impl/src/com/intellij/diff/DiffRequestFactoryImpl.java b/platform/diff-impl/src/com/intellij/diff/DiffRequestFactoryImpl.java index 09c085aa4407..91c1c2b7958e 100644 --- a/platform/diff-impl/src/com/intellij/diff/DiffRequestFactoryImpl.java +++ b/platform/diff-impl/src/com/intellij/diff/DiffRequestFactoryImpl.java @@ -41,6 +41,7 @@ import com.intellij.vcsUtil.VcsUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -121,27 +122,29 @@ public class DiffRequestFactoryImpl extends DiffRequestFactory { @NotNull public static String getContentTitle(@NotNull FilePath path) { - if (path.isDirectory()) return path.getPath(); + if (path.isDirectory()) return path.getPresentableUrl(); FilePath parent = path.getParentPath(); - return getContentTitle(path.getName(), path.getPath(), parent != null ? parent.getPath() : null); + return getContentTitle(path.getName(), path.getPresentableUrl(), parent != null ? parent.getPresentableUrl() : null); } @NotNull public static String getTitle(@NotNull FilePath path1, @NotNull FilePath path2, @NotNull String separator) { - if ((path1.isDirectory() || path2.isDirectory()) && path1.getPath().equals(path2.getPath())) return path1.getPath(); + if ((path1.isDirectory() || path2.isDirectory()) && path1.getPresentableUrl().equals(path2.getPresentableUrl())) { + return path1.getPresentableUrl(); + } String name1 = path1.getName(); String name2 = path2.getName(); if (path1.isDirectory() ^ path2.isDirectory()) { - if (path1.isDirectory()) name1 += "/"; - if (path2.isDirectory()) name2 += "/"; + if (path1.isDirectory()) name1 += File.separatorChar; + if (path2.isDirectory()) name2 += File.separatorChar; } FilePath parent1 = path1.getParentPath(); FilePath parent2 = path2.getParentPath(); - return getRequestTitle(name1, path1.getPath(), parent1 != null ? parent1.getPath() : null, - name2, path2.getPath(), parent2 != null ? parent2.getPath() : null, + return getRequestTitle(name1, path1.getPresentableUrl(), parent1 != null ? parent1.getPresentableUrl() : null, + name2, path2.getPresentableUrl(), parent2 != null ? parent2.getPresentableUrl() : null, separator); } From 63c4a0f54601bd87ab5da79be7ab305a90609762 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Mon, 28 Dec 2015 20:19:39 +0300 Subject: [PATCH 065/105] IDEA-149570 Java debugger "Treads" view does not display frames, stalling on "Collecting data..." - use current context if applicable --- .../debugger/engine/events/DebuggerContextCommandImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/events/DebuggerContextCommandImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/events/DebuggerContextCommandImpl.java index 808fb22bc3e0..767811b4d274 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/events/DebuggerContextCommandImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/events/DebuggerContextCommandImpl.java @@ -48,7 +48,8 @@ public abstract class DebuggerContextCommandImpl extends SuspendContextCommandIm if (myCustomSuspendContext == null) { myCustomSuspendContext = super.getSuspendContext(); ThreadReferenceProxyImpl thread = getThread(); - if (myCustomThread != null && (myCustomSuspendContext == null || !myCustomSuspendContext.suspends(thread))) { + if (myCustomThread != null && + (myCustomSuspendContext == null || myCustomSuspendContext.isResumed() || !myCustomSuspendContext.suspends(thread))) { myCustomSuspendContext = SuspendManagerUtil.findContextByThread(myDebuggerContext.getDebugProcess().getSuspendManager(), thread); } } From 22bec0feb473b88eaa22a6cfa010b6b18b9d6e87 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Mon, 28 Dec 2015 19:25:49 +0300 Subject: [PATCH 066/105] always on top --- .../platform-impl/src/com/intellij/ui/ColorPicker.java | 3 +-- .../src/com/intellij/ui/picker/ColorPipetteBase.java | 7 ++++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ui/ColorPicker.java b/platform/platform-impl/src/com/intellij/ui/ColorPicker.java index 48e8fc51125a..8bfd64da1541 100644 --- a/platform/platform-impl/src/com/intellij/ui/ColorPicker.java +++ b/platform/platform-impl/src/com/intellij/ui/ColorPicker.java @@ -23,7 +23,6 @@ import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.Couple; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.SystemInfo; -import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.WindowManager; import com.intellij.ui.picker.ColorListener; @@ -162,7 +161,7 @@ public class ColorPicker extends JPanel implements ColorListener, DocumentListen @Nullable private ColorPipette createPipette(@NotNull ColorListener colorListener, @NotNull Disposable parentDisposable) { - if (SystemInfo.isMac && Registry.is("ide.mac.new.color.picker")) { + if (ColorPipetteBase.canUseMacPipette()) { ColorPipette pipette = getPipetteIfAvailable(new MacColorPipette(this, colorListener), parentDisposable); if (pipette != null) { return pipette; diff --git a/platform/platform-impl/src/com/intellij/ui/picker/ColorPipetteBase.java b/platform/platform-impl/src/com/intellij/ui/picker/ColorPipetteBase.java index a8ebe0122fc9..9c3397dde8af 100644 --- a/platform/platform-impl/src/com/intellij/ui/picker/ColorPipetteBase.java +++ b/platform/platform-impl/src/com/intellij/ui/picker/ColorPipetteBase.java @@ -16,6 +16,7 @@ package com.intellij.ui.picker; import com.intellij.openapi.util.SystemInfo; +import com.intellij.openapi.util.registry.Registry; import com.intellij.util.Alarm; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; @@ -44,6 +45,10 @@ public abstract class ColorPipetteBase implements ColorPipette { myRobot = createRobot(); } + public static boolean canUseMacPipette() { + return SystemInfo.isMac && Registry.is("ide.mac.new.color.picker"); + } + @Override public void pickAndClose() { PointerInfo pointerInfo = MouseInfo.getPointerInfo(); @@ -142,7 +147,7 @@ public abstract class ColorPipetteBase implements ColorPipette { }); myPickerFrame.setUndecorated(true); - myPickerFrame.setAlwaysOnTop(!SystemInfo.isJavaVersionAtLeast("1.8.0")); + myPickerFrame.setAlwaysOnTop(!SystemInfo.isJavaVersionAtLeast("1.8.0") || canUseMacPipette()); JRootPane rootPane = myPickerFrame.getRootPane(); rootPane.putClientProperty("Window.shadow", Boolean.FALSE); From 7bf18cc681be9f0c38fe84865555ae21aee91805 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Mon, 28 Dec 2015 19:45:34 +0300 Subject: [PATCH 067/105] cancel pipette when screen capture failed --- .../src/com/intellij/ui/picker/MacColorPipette.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/ui/picker/MacColorPipette.java b/platform/platform-impl/src/com/intellij/ui/picker/MacColorPipette.java index ab130ee02a57..e42f06d3c09c 100644 --- a/platform/platform-impl/src/com/intellij/ui/picker/MacColorPipette.java +++ b/platform/platform-impl/src/com/intellij/ui/picker/MacColorPipette.java @@ -97,7 +97,10 @@ public class MacColorPipette extends ColorPipetteBase { int left = PIXELS / 2 + 1; Rectangle captureRectangle = new Rectangle(mouseLoc.x - left, mouseLoc.y - left, PIXELS, PIXELS); BufferedImage captureScreen = captureScreen(pickerDialog, captureRectangle); - if (captureScreen == null) return; + if (captureScreen == null || captureScreen.getWidth() < PIXELS || captureRectangle.getHeight() < PIXELS) { + cancelPipette(); + return; + } //noinspection UseJBColor Color newColor = new Color(captureScreen.getRGB(captureRectangle.width / 2, captureRectangle.height / 2)); From b6894df57d8f79a68ab31900026d69331207e98b Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Mon, 28 Dec 2015 20:23:15 +0300 Subject: [PATCH 068/105] EA-76904 - AIOOBE: ConsoleHistoryModel.getEntries --- .../console/ConsoleHistoryModel.java | 100 +++++++++++------- 1 file changed, 61 insertions(+), 39 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/console/ConsoleHistoryModel.java b/platform/lang-impl/src/com/intellij/execution/console/ConsoleHistoryModel.java index 9cc7e6079654..6ddc0a22a801 100644 --- a/platform/lang-impl/src/com/intellij/execution/console/ConsoleHistoryModel.java +++ b/platform/lang-impl/src/com/intellij/execution/console/ConsoleHistoryModel.java @@ -18,10 +18,10 @@ package com.intellij.execution.console; import com.intellij.ide.ui.UISettings; import com.intellij.openapi.util.SimpleModificationTracker; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.LinkedList; import java.util.List; @@ -30,13 +30,13 @@ import java.util.List; */ class ConsoleHistoryModel extends SimpleModificationTracker { /** @noinspection FieldCanBeLocal*/ - private final ConsoleHistoryModel myMasterModel; // hard ref - private int myIndex; + private final Object myLock; private final LinkedList myEntries; + private int myIndex; - ConsoleHistoryModel(ConsoleHistoryModel masterModel) { - myMasterModel = masterModel; - myEntries = myMasterModel == null ? new LinkedList() : myMasterModel.myEntries; + ConsoleHistoryModel(@Nullable ConsoleHistoryModel masterModel) { + myEntries = masterModel == null ? new LinkedList() : masterModel.myEntries; + myLock = masterModel == null ? this : masterModel.myLock; // hard ref to master model resetIndex(); } @@ -44,23 +44,27 @@ class ConsoleHistoryModel extends SimpleModificationTracker { return new ConsoleHistoryModel(this); } - public synchronized void resetEntries(@NotNull List entries) { - myEntries.clear(); - myEntries.addAll(entries.subList(0, Math.min(entries.size(), getMaxHistorySize()))); - incModificationCount(); + public void resetEntries(@NotNull List entries) { + synchronized (myLock) { + myEntries.clear(); + myEntries.addAll(entries.subList(0, Math.min(entries.size(), getMaxHistorySize()))); + incModificationCount(); + } } - public synchronized void addToHistory(@Nullable String statement) { + public void addToHistory(@Nullable String statement) { if (StringUtil.isEmptyOrSpaces(statement)) return; - int maxHistorySize = getMaxHistorySize(); - myEntries.remove(statement); - int size = myEntries.size(); - if (size >= maxHistorySize && size > 0) { - myEntries.removeFirst(); + synchronized (myLock) { + int maxHistorySize = getMaxHistorySize(); + myEntries.remove(statement); + int size = myEntries.size(); + if (size >= maxHistorySize && size > 0) { + myEntries.removeFirst(); + } + myEntries.addLast(statement); + incModificationCount(); } - myEntries.addLast(statement); - incModificationCount(); } @Override @@ -69,48 +73,66 @@ class ConsoleHistoryModel extends SimpleModificationTracker { super.incModificationCount(); } - protected synchronized void resetIndex() { - myIndex = myEntries.size(); + protected void resetIndex() { + synchronized (myLock) { + myIndex = myEntries.size(); + } } public int getMaxHistorySize() { return UISettings.getInstance().CONSOLE_COMMAND_HISTORY_LIMIT; } - public synchronized void removeFromHistory(String statement) { - myEntries.remove(statement); - incModificationCount(); + public void removeFromHistory(String statement) { + synchronized (myLock) { + myEntries.remove(statement); + incModificationCount(); + } } - public synchronized List getEntries() { - return new ArrayList(myEntries); + public List getEntries() { + synchronized (myLock) { + return ContainerUtil.newArrayList(myEntries); + } } - public synchronized int getHistorySize() { - return myEntries.size(); + public int getHistorySize() { + synchronized (myLock) { + return myEntries.size(); + } } @Nullable - public synchronized String getHistoryNext() { - if (myIndex >= 0) --myIndex; - return getCurrentEntry(); + public String getHistoryNext() { + synchronized (myLock) { + if (myIndex >= 0) --myIndex; + return getCurrentEntry(); + } } @Nullable - public synchronized String getHistoryPrev() { - if (myIndex <= myEntries.size() - 1) ++myIndex; - return getCurrentEntry(); + public String getHistoryPrev() { + synchronized (myLock) { + if (myIndex <= myEntries.size() - 1) ++myIndex; + return getCurrentEntry(); + } } - public synchronized boolean hasHistory(final boolean next) { - return next ? myIndex > 0 : myIndex < myEntries.size() - 1; + public boolean hasHistory(final boolean next) { + synchronized (myLock) { + return next ? myIndex > 0 : myIndex < myEntries.size() - 1; + } } - synchronized String getCurrentEntry() { - return myIndex >= 0 && myIndex < myEntries.size() ? myEntries.get(myIndex) : null; + String getCurrentEntry() { + synchronized (myLock) { + return myIndex >= 0 && myIndex < myEntries.size() ? myEntries.get(myIndex) : null; + } } - synchronized int getCurrentIndex() { - return myIndex; + int getCurrentIndex() { + synchronized (myLock) { + return myIndex; + } } } From 2be1c64a13c7f72e4ac40ee36caf4dd28935f1b5 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 28 Dec 2015 16:31:05 +0100 Subject: [PATCH 069/105] new inference: correct capture incorporation (IDEA-149807) --- .../InferenceIncorporationPhase.java | 2 +- .../resolve/graphInference/InferenceSession.java | 2 +- .../constraints/StrictSubtypingConstraint.java | 1 + .../lambda/graphInference/CaptureConstraint.java | 15 +++++++++++++++ .../lambda/GraphInferenceHighlightingTest.java | 4 ++++ 5 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/CaptureConstraint.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceIncorporationPhase.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceIncorporationPhase.java index f9518571414c..b120d5dfac12 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceIncorporationPhase.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceIncorporationPhase.java @@ -167,7 +167,7 @@ public class InferenceIncorporationPhase { for (PsiType lowerBound : lowerBounds) { if (mySession.getInferenceVariable(lowerBound) == null) { - addConstraint(new StrictSubtypingConstraint(lowerBound, superBound)); + addConstraint(new StrictSubtypingConstraint(superBound, lowerBound)); } } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index bf9e498deeac..a748d3aacd3e 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -674,7 +674,7 @@ public class InferenceSession { } substitutedCapture = elementFactory.createType(psiClass, newParameters); - myIncorporationPhase.addCapture(copy, substitutedCapture); + myIncorporationPhase.addCapture(copy, (PsiClassType)returnType); addConstraint(new TypeCompatibilityConstraint(targetType, substitutedCapture)); } } else { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/StrictSubtypingConstraint.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/StrictSubtypingConstraint.java index a198108dad9e..63b1d3eba800 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/StrictSubtypingConstraint.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/StrictSubtypingConstraint.java @@ -32,6 +32,7 @@ public class StrictSubtypingConstraint implements ConstraintFormula { private PsiType myS; private PsiType myT; + //t < s public StrictSubtypingConstraint(PsiType t, PsiType s) { myT = t; myS = s; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/CaptureConstraint.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/CaptureConstraint.java new file mode 100644 index 000000000000..278eef71a063 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/CaptureConstraint.java @@ -0,0 +1,15 @@ + +import java.util.List; + +class Main { + static List foo() { + return get (); + } + + static List get() { + return null; + } + + static class Base {} + static class Child extends Base {} +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java index 61534eecad63..a2705496f2b7 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java @@ -347,6 +347,10 @@ public class GraphInferenceHighlightingTest extends LightDaemonAnalyzerTestCase doTest(); } + public void testCaptureConstraint() throws Exception { + doTest(); + } + private void doTest() throws Exception { doTest(false); } From 5463bad1abdcad08b069599deb683dd8a4cb5322 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 28 Dec 2015 17:16:02 +0100 Subject: [PATCH 070/105] restore default level when new jdk was created from project page --- .../openapi/roots/ui/configuration/LanguageLevelCombo.java | 1 + 1 file changed, 1 insertion(+) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/LanguageLevelCombo.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/LanguageLevelCombo.java index 11fd46ca6278..b3e8c77cf98c 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/LanguageLevelCombo.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/LanguageLevelCombo.java @@ -98,6 +98,7 @@ public abstract class LanguageLevelCombo extends ComboBox { } else if (!(getItemAt(0) instanceof String)) { addDefaultItem(); + setSelectedIndex(0); } repaint(); } From adaa0f09b7278ac3210efebc2a5b6680284228ce Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 28 Dec 2015 17:31:41 +0100 Subject: [PATCH 071/105] new inference: pull erased flag through nested calls (IDEA-133613) --- .../graphInference/InferenceSession.java | 4 ++++ .../ExpressionCompatibilityConstraint.java | 13 +++++++++-- ...heckedWarningNotionThroughNestedCalls.java | 22 +++++++++++++++++++ .../GraphInferenceHighlightingTest.java | 4 ++++ 4 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/PullUncheckedWarningNotionThroughNestedCalls.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index a748d3aacd3e..637154939948 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -1810,4 +1810,8 @@ public class InferenceSession { public List getIncompatibleErrorMessages() { return myErrorMessages; } + + public boolean isErased() { + return myErased; + } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/ExpressionCompatibilityConstraint.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/ExpressionCompatibilityConstraint.java index e835006ec171..b41c9b682873 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/ExpressionCompatibilityConstraint.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/ExpressionCompatibilityConstraint.java @@ -56,8 +56,14 @@ public class ExpressionCompatibilityConstraint extends InputOutputConstraintForm return false; } - if (exprType instanceof PsiClassType && ((PsiClassType)exprType).resolve() == null) { - return true; + if (exprType instanceof PsiClassType) { + if (((PsiClassType)exprType).resolve() == null) { + return true; + } + + if (((PsiClassType)exprType).isRaw()) { + session.setErased(); + } } if (exprType != null && exprType != PsiType.NULL) { @@ -94,6 +100,9 @@ public class ExpressionCompatibilityConstraint extends InputOutputConstraintForm if (callSession != session) { session.getInferenceSessionContainer().registerNestedSession(callSession); session.propagateVariables(callSession.getInferenceVariables()); + if (callSession.isErased()) { + session.setErased(); + } } return true; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/PullUncheckedWarningNotionThroughNestedCalls.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/PullUncheckedWarningNotionThroughNestedCalls.java new file mode 100644 index 000000000000..b2f49981a245 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/PullUncheckedWarningNotionThroughNestedCalls.java @@ -0,0 +1,22 @@ +import java.util.List; + +class Temp { + + public static List foo() { + return parallelizePairs(asList(new Tuple())).partitionBy(); + } + + public static List asList(T a) { + return null; + } + + public static Temp parallelizePairs(List> list) { + return null; + } + + public List partitionBy() { return null; } +} + +class Tuple { + public Tuple() {} +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java index a2705496f2b7..5b6a9741a14d 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java @@ -351,6 +351,10 @@ public class GraphInferenceHighlightingTest extends LightDaemonAnalyzerTestCase doTest(); } + public void testPullUncheckedWarningNotionThroughNestedCalls() throws Exception { + doTest(); + } + private void doTest() throws Exception { doTest(false); } From 2a1cdfff85a2c03cdcf7bcd9072ff732b4e73da6 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 28 Dec 2015 18:16:08 +0100 Subject: [PATCH 072/105] push down: decode references once with respect to other moved members (IDEA-149639) --- .../memberPushDown/PushDownProcessor.java | 8 -------- .../pushDown/ReferenceForMovedInnerClass.java | 12 ++++++++++++ .../pushDown/ReferenceForMovedInnerClass_after.java | 13 +++++++++++++ .../com/intellij/refactoring/PushDownTest.java | 9 +++++++++ 4 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 java/java-tests/testData/refactoring/pushDown/ReferenceForMovedInnerClass.java create mode 100644 java/java-tests/testData/refactoring/pushDown/ReferenceForMovedInnerClass_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownProcessor.java b/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownProcessor.java index 913412636ea9..8b1bb9fb3224 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownProcessor.java @@ -17,7 +17,6 @@ package com.intellij.refactoring.memberPushDown; import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInsight.ChangeContextUtil; -import com.intellij.codeInsight.generation.OverrideImplementExploreUtil; import com.intellij.codeInsight.generation.OverrideImplementUtil; import com.intellij.codeInsight.intention.impl.CreateClassDialog; import com.intellij.codeInsight.intention.impl.CreateSubclassAction; @@ -319,13 +318,6 @@ public class PushDownProcessor extends BaseRefactoringProcessor { } private void decodeRefs(final PsiMember member, final PsiClass targetClass) { - try { - ChangeContextUtil.decodeContextInfo(member, null, null); - } - catch (IncorrectOperationException e) { - LOG.error(e); - } - final PsiElementFactory factory = JavaPsiFacade.getInstance(myProject).getElementFactory(); member.accept(new JavaRecursiveElementWalkingVisitor() { @Override public void visitReferenceExpression(PsiReferenceExpression expression) { diff --git a/java/java-tests/testData/refactoring/pushDown/ReferenceForMovedInnerClass.java b/java/java-tests/testData/refactoring/pushDown/ReferenceForMovedInnerClass.java new file mode 100644 index 000000000000..0fde2da784f3 --- /dev/null +++ b/java/java-tests/testData/refactoring/pushDown/ReferenceForMovedInnerClass.java @@ -0,0 +1,12 @@ +import static InlineIssue.ClassToMove.F1; +abstract class InlineIssue { + public enum ClassToMove { F1 } + + public InlineIssue create(ClassToMove e) { + F1.notify(); + return null; + } +} + +class Desc extends InlineIssue { +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/pushDown/ReferenceForMovedInnerClass_after.java b/java/java-tests/testData/refactoring/pushDown/ReferenceForMovedInnerClass_after.java new file mode 100644 index 000000000000..2f447026e692 --- /dev/null +++ b/java/java-tests/testData/refactoring/pushDown/ReferenceForMovedInnerClass_after.java @@ -0,0 +1,13 @@ +import static Desc.ClassToMove.F1; +abstract class InlineIssue { + +} + +class Desc extends InlineIssue { + public InlineIssue create(ClassToMove e) { + F1.notify(); + return null; + } + + public enum ClassToMove { F1 } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java b/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java index eb06a85f99a5..344e3c904a7c 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java @@ -63,6 +63,8 @@ public class PushDownTest extends LightRefactoringTestCase { public void testInterfaceConstants() { doTest();} + public void testReferenceForMovedInnerClass() { doTest();} + public void testInsertOverrideWhenKeepAbstract() throws Exception { doTestImplements(true); } @@ -92,6 +94,13 @@ public class PushDownTest extends LightRefactoringTestCase { membersToMove.add(memberInfo); } + final PsiClass classByName = currentClass.findInnerClassByName("ClassToMove", false); + if (classByName != null) { + final MemberInfo memberInfo = new MemberInfo(classByName); + memberInfo.setChecked(true); + membersToMove.add(memberInfo); + } + final MemberInfo memberInfo = new MemberInfo(psiMember); memberInfo.setChecked(true); membersToMove.add(memberInfo); From c4711f94ef9c175c99d9a4d1b87a0c050263d382 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 28 Dec 2015 18:52:45 +0100 Subject: [PATCH 073/105] testdata for IDEA-149709 --- .../lambda/newLambda/IDEA149709.java | 15 +++++++++++++++ .../daemon/lambda/NewLambdaHighlightingTest.java | 4 ++++ 2 files changed, 19 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA149709.java diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA149709.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA149709.java new file mode 100644 index 000000000000..4c5e4c0c7c39 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA149709.java @@ -0,0 +1,15 @@ + +import java.util.Collection; +import java.util.Set; +import java.util.function.Function; + +class Test { + { + Set> exceptions = null; + transform(exceptions, x -> x.getSimpleName()); + } + + public static Collection transform(Collection fromCollection, Function function) { + return null; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java index cbfa8ebab539..9a537a8d7e40 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java @@ -256,6 +256,10 @@ public class NewLambdaHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testIDEA149709() throws Exception { + doTest(); + } + private void doTest() { doTest(false); } From 46ce9ed914cba21c025711f17221766f12266b18 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 28 Dec 2015 18:59:45 +0100 Subject: [PATCH 074/105] testdata for IDEA-149774 --- .../lambda/graphInference/IDEA149774.java | 14 ++++++++++++++ .../lambda/GraphInferenceHighlightingTest.java | 4 ++++ 2 files changed, 18 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/IDEA149774.java diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/IDEA149774.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/IDEA149774.java new file mode 100644 index 000000000000..c3094be0822e --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/IDEA149774.java @@ -0,0 +1,14 @@ + +interface Item{} +interface Holder { + boolean apply(Item i); +} +class C { + void f(Holder h) { + h.apply(create()); + } + + private Item create() { + return null; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java index 5b6a9741a14d..0e724b542202 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java @@ -355,6 +355,10 @@ public class GraphInferenceHighlightingTest extends LightDaemonAnalyzerTestCase doTest(); } + public void testIDEA149774() throws Exception { + doTest(); + } + private void doTest() throws Exception { doTest(false); } From 7f083fdc6db775acf162c0a92a20799e22fbec07 Mon Sep 17 00:00:00 2001 From: Alexey Utkin Date: Mon, 28 Dec 2015 21:21:11 +0300 Subject: [PATCH 075/105] CPP-5488 Swift plugin version detection is broken --- platform/platform-resources/src/brokenPlugins.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/platform-resources/src/brokenPlugins.txt b/platform/platform-resources/src/brokenPlugins.txt index 04844ce0c6dc..70481b725f2e 100644 --- a/platform/platform-resources/src/brokenPlugins.txt +++ b/platform/platform-resources/src/brokenPlugins.txt @@ -35,4 +35,5 @@ org.bitbucket.connector 1.1.10 1.1.12 1.2 1.2.1 ro.redeul.google.go 0.5.0 0.5.1 0.9.1 0.9.10 0.9.11 0.9.12 0.9.13 0.9.2 0.9.3 0.9.4 0.9.5 0.9.6 0.9.9 0.9.15 0.9.15.1 0.9.15.2 0.9.15.3 0.9.220 0.9.221 0.9.201 0.9.223 0.9.230 0.9.231 0.9.234 0.9.238 0.9.241 0.9.242 0.9.244 0.9.249 0.9.250 0.9.251 TFS 121.185 121.390 124.218 124.297 124.344 124.533 126.254 126.309 127.14 129.105 "Haxe Support" "0.9.7 for IDEA 14.1.4" -com.sencha.idea.IdeaPlugin 6.0.6.456 6.0.4.438 6.0.3.430 6.0.2.414 6.0.1.396 6.0.0.390 "0.4.325 (SenchaCon 2015 EA)" "0.3.323 (SenchaCon 2015 EA)" "0.3.312 (SenchaCon 2015 EA)" "0.2.251 (SenchaCon 2015 EA)" "0.1.211 (SenchaCon 2015 EA)" "0.1.210.1 (SenchaCon 2015 EA)" "0.1.210 (SenchaCon 2015 EA)" \ No newline at end of file +com.sencha.idea.IdeaPlugin 6.0.6.456 6.0.4.438 6.0.3.430 6.0.2.414 6.0.1.396 6.0.0.390 "0.4.325 (SenchaCon 2015 EA)" "0.3.323 (SenchaCon 2015 EA)" "0.3.312 (SenchaCon 2015 EA)" "0.2.251 (SenchaCon 2015 EA)" "0.1.211 (SenchaCon 2015 EA)" "0.1.210.1 (SenchaCon 2015 EA)" "0.1.210 (SenchaCon 2015 EA)" +com.intellij.swift 144.SNAPSHOT \ No newline at end of file From 3b08c8d60bbf1ce6974526a4c3f9e9d045d50fc1 Mon Sep 17 00:00:00 2001 From: "Ilya.Kazakevich" Date: Mon, 28 Dec 2015 23:24:11 +0300 Subject: [PATCH 076/105] Env test fix: env tests should obtain real packaged --- .../python/packaging/PyPackageManagerImpl.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/python/src/com/jetbrains/python/packaging/PyPackageManagerImpl.java b/python/src/com/jetbrains/python/packaging/PyPackageManagerImpl.java index 9b713a14908c..f280e347808a 100644 --- a/python/src/com/jetbrains/python/packaging/PyPackageManagerImpl.java +++ b/python/src/com/jetbrains/python/packaging/PyPackageManagerImpl.java @@ -290,12 +290,13 @@ public class PyPackageManagerImpl extends PyPackageManager { @NotNull protected List getPackages() throws ExecutionException { - if (ApplicationManager.getApplication().isUnitTestMode()) { - return Lists.newArrayList(new PyPackage(PIP, PIP_VERSION, null, Collections.emptyList()), - new PyPackage(SETUPTOOLS, SETUPTOOLS_VERSION, null, Collections.emptyList())); - } final String output = getHelperResult(PACKAGING_TOOL, Collections.singletonList("list"), false, false, null); - return parsePackagingToolOutput(output); + final List packages = new ArrayList(parsePackagingToolOutput(output)); + if (packages.isEmpty() && ApplicationManager.getApplication().isUnitTestMode()) { + packages.addAll(Lists.newArrayList(new PyPackage(PIP, PIP_VERSION, null, Collections.emptyList()), + new PyPackage(SETUPTOOLS, SETUPTOOLS_VERSION, null, Collections.emptyList()))); + } + return packages; } @Nullable @@ -493,7 +494,8 @@ public class PyPackageManagerImpl extends PyPackageManager { else { process = commandLine.createProcess(); } - final CapturingProcessHandler handler = new CapturingProcessHandler(process, commandLine.getCharset(), commandLine.getCommandLineString()); + final CapturingProcessHandler handler = + new CapturingProcessHandler(process, commandLine.getCharset(), commandLine.getCommandLineString()); final ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); final ProcessOutput result; if (showProgress && indicator != null) { From 4e5a2af27a2e2e4e0ac2af0e1747361b9bac52a9 Mon Sep 17 00:00:00 2001 From: "Ilya.Kazakevich" Date: Tue, 29 Dec 2015 00:10:44 +0300 Subject: [PATCH 077/105] Env test fix: env tests should obtain real packaged --- .../packaging/PyPackageManagerImpl.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/python/src/com/jetbrains/python/packaging/PyPackageManagerImpl.java b/python/src/com/jetbrains/python/packaging/PyPackageManagerImpl.java index f280e347808a..774ba6cacbc7 100644 --- a/python/src/com/jetbrains/python/packaging/PyPackageManagerImpl.java +++ b/python/src/com/jetbrains/python/packaging/PyPackageManagerImpl.java @@ -290,13 +290,22 @@ public class PyPackageManagerImpl extends PyPackageManager { @NotNull protected List getPackages() throws ExecutionException { - final String output = getHelperResult(PACKAGING_TOOL, Collections.singletonList("list"), false, false, null); - final List packages = new ArrayList(parsePackagingToolOutput(output)); - if (packages.isEmpty() && ApplicationManager.getApplication().isUnitTestMode()) { - packages.addAll(Lists.newArrayList(new PyPackage(PIP, PIP_VERSION, null, Collections.emptyList()), - new PyPackage(SETUPTOOLS, SETUPTOOLS_VERSION, null, Collections.emptyList()))); + final String output; + try { + output = getHelperResult(PACKAGING_TOOL, Collections.singletonList("list"), false, false, null); } - return packages; + catch (final ProcessNotCreatedException ex) { + if (ApplicationManager.getApplication().isUnitTestMode()) { + Logger.getInstance(PyPackageManagerImpl.class).info("Not-env unit test mode, will return mock packages"); + return Lists.newArrayList(new PyPackage(PIP, PIP_VERSION, null, Collections.emptyList()), + new PyPackage(SETUPTOOLS, SETUPTOOLS_VERSION, null, Collections.emptyList())); + } + else { + throw ex; + } + } + + return parsePackagingToolOutput(output); } @Nullable From 09600fd538566e36fda4dee9373539995c1ff499 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Tue, 29 Dec 2015 03:36:23 +0300 Subject: [PATCH 078/105] Unify generic types of qualified reference expressions (PY-16267) We used to unify generic types in call expressions, including the receivers of calls, but there was no unification of generics for non-callable attributes. --- .../psi/impl/PyReferenceExpressionImpl.java | 24 ++++++++++++++++++- .../com/jetbrains/python/PyTypeTest.java | 23 ++++++++++++++++++ .../com/jetbrains/python/PyTypingTest.java | 18 ++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java index b03b6ec101b5..f7b8ac717a84 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java @@ -325,11 +325,33 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere } return null; } - @Nullable private static PyType getTypeFromTarget(@NotNull final PsiElement target, final TypeEvalContext context, PyReferenceExpression anchor) { + final PyType type = getGenericTypeFromTarget(target, context, anchor); + if (context.maySwitchToAST(anchor)) { + final PyExpression qualifier = anchor.getQualifier(); + if (qualifier != null) { + if (!(type instanceof PyFunctionType) && PyTypeChecker.hasGenerics(type, context)) { + final Map parameters = Collections.emptyMap(); + final Map substitutions = PyTypeChecker.unifyGenericCall(qualifier, parameters, context); + if (substitutions != null && !substitutions.isEmpty()) { + final PyType substituted = PyTypeChecker.substitute(type, substitutions, context); + if (substituted != null) { + return substituted; + } + } + } + } + } + return type; + } + + @Nullable + private static PyType getGenericTypeFromTarget(@NotNull final PsiElement target, + final TypeEvalContext context, + PyReferenceExpression anchor) { if (!(target instanceof PyTargetExpression)) { // PyTargetExpression will ask about its type itself final PyType pyType = getReferenceTypeFromProviders(target, context, anchor); if (pyType != null) { diff --git a/python/testSrc/com/jetbrains/python/PyTypeTest.java b/python/testSrc/com/jetbrains/python/PyTypeTest.java index de485e54ae62..e469e4e4660f 100644 --- a/python/testSrc/com/jetbrains/python/PyTypeTest.java +++ b/python/testSrc/com/jetbrains/python/PyTypeTest.java @@ -960,6 +960,29 @@ public class PyTypeTest extends PyTestCase { "expr = f\n"); } + // PY-16267 + public void testGenericField() { + doTest("str", + "class D(object):\n" + + " def __init__(self, foo):\n" + + " '''\n" + + " :type foo: T\n" + + " :rtype: D[T]\n" + + " '''\n" + + " self.foo = foo\n" + + "\n" + + "\n" + + "def g():\n" + + " '''\n" + + " :rtype: D[str]\n" + + " '''\n" + + " return D('test')\n" + + "\n" + + "\n" + + "y = g()\n" + + "expr = y.foo\n"); + } + private static List getTypeEvalContexts(@NotNull PyExpression element) { return ImmutableList.of(TypeEvalContext.codeAnalysis(element.getProject(), element.getContainingFile()).withTracing(), TypeEvalContext.userInitiated(element.getProject(), element.getContainingFile()).withTracing()); diff --git a/python/testSrc/com/jetbrains/python/PyTypingTest.java b/python/testSrc/com/jetbrains/python/PyTypingTest.java index 6f840f5923ae..a9ae43a86e5e 100644 --- a/python/testSrc/com/jetbrains/python/PyTypingTest.java +++ b/python/testSrc/com/jetbrains/python/PyTypingTest.java @@ -419,6 +419,24 @@ public class PyTypingTest extends PyTestCase { " pass\n"); } + // PY-16267 + public void testGenericField() { + doTest("str", + "from typing import TypeVar, Generic\n" + + "\n" + + "T = TypeVar('T', covariant=True)\n" + + "\n" + + "class C(Generic[T]):\n" + + " def __init__(self, foo: T):\n" + + " self.foo = foo\n" + + "\n" + + "def f() -> C[str]:\n" + + " return C('test')\n" + + "\n" + + "x = f()\n" + + "expr = x.foo\n"); + } + private void doTestNoInjectedText(@NotNull String text) { myFixture.configureByText(PythonFileType.INSTANCE, text); final InjectedLanguageManager languageManager = InjectedLanguageManager.getInstance(myFixture.getProject()); From fcd7fd402ee72fd1d44385c523784425e730818b Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Tue, 29 Dec 2015 10:51:57 +0300 Subject: [PATCH 079/105] fix attributes generation for template languages --- .../src/com/intellij/psi/XmlElementFactoryImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xml/xml-psi-impl/src/com/intellij/psi/XmlElementFactoryImpl.java b/xml/xml-psi-impl/src/com/intellij/psi/XmlElementFactoryImpl.java index 47d7f9d53f23..d99798af9446 100644 --- a/xml/xml-psi-impl/src/com/intellij/psi/XmlElementFactoryImpl.java +++ b/xml/xml-psi-impl/src/com/intellij/psi/XmlElementFactoryImpl.java @@ -18,7 +18,6 @@ package com.intellij.psi; import com.intellij.ide.highlighter.HtmlFileType; import com.intellij.ide.highlighter.XHtmlFileType; import com.intellij.ide.highlighter.XmlFileType; -import com.intellij.ide.highlighter.XmlLikeFileType; import com.intellij.lang.ASTFactory; import com.intellij.lang.Language; import com.intellij.lang.xml.XMLLanguage; @@ -27,6 +26,8 @@ import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.html.HtmlTag; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.*; import com.intellij.util.IncorrectOperationException; import com.intellij.xml.util.XmlTagUtil; @@ -72,8 +73,7 @@ public class XmlElementFactoryImpl extends XmlElementFactory { @NotNull @Override public XmlAttribute createAttribute(@NotNull @NonNls String name, @NotNull String value, @Nullable PsiElement context) throws IncorrectOperationException { - final FileType type = context != null ? context.getContainingFile().getFileType() : null; - return createAttribute(name, value, type instanceof XmlLikeFileType ? type : XmlFileType.INSTANCE); + return createAttribute(name, value, PsiTreeUtil.getParentOfType(context, XmlTag.class, false) instanceof HtmlTag ? HtmlFileType.INSTANCE : XmlFileType.INSTANCE); } @NotNull From 1f37008fe6a0a986ed71561fe24f05e2c4f147a1 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Tue, 29 Dec 2015 09:49:36 +0100 Subject: [PATCH 080/105] DEA-149666 Bookmark icons are not shown for files in Project View: allow testing element icons: reuse new API in IconUtilTest + fix for already calculated deffered icons --- .../src/com/intellij/ide/bookmarks/Bookmark.java | 2 +- .../src/com/intellij/ui/DeferredIconImpl.java | 11 ++--------- .../testSrc/com/intellij/ui/IconUtilTest.java | 4 ++-- .../src/com/intellij/openapi/util/IconLoader.java | 2 +- .../util/src/com/intellij/ui/RetrievableIcon.java | 2 +- 5 files changed, 7 insertions(+), 14 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/bookmarks/Bookmark.java b/platform/lang-impl/src/com/intellij/ide/bookmarks/Bookmark.java index a3d061dc06dd..ee498a170632 100644 --- a/platform/lang-impl/src/com/intellij/ide/bookmarks/Bookmark.java +++ b/platform/lang-impl/src/com/intellij/ide/bookmarks/Bookmark.java @@ -357,7 +357,7 @@ public class Bookmark implements Navigatable, Comparable { private static class MyCheckedIcon implements Icon, RetrievableIcon { @Nullable @Override - public Icon retrieve() { + public Icon retrieveIcon() { return PlatformIcons.CHECK_ICON; } diff --git a/platform/lang-impl/src/com/intellij/ui/DeferredIconImpl.java b/platform/lang-impl/src/com/intellij/ui/DeferredIconImpl.java index 4b4762fea4de..5598b6274327 100644 --- a/platform/lang-impl/src/com/intellij/ui/DeferredIconImpl.java +++ b/platform/lang-impl/src/com/intellij/ui/DeferredIconImpl.java @@ -35,7 +35,6 @@ import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.TestOnly; import org.jetbrains.ide.PooledThreadExecutor; import javax.swing.*; @@ -250,8 +249,8 @@ public class DeferredIconImpl implements DeferredIcon, RetrievableIcon { @Nullable @Override - public Icon retrieve() { - return evaluate(); + public Icon retrieveIcon() { + return isDone() ? myDelegateIcon : evaluate(); } @NotNull @@ -378,12 +377,6 @@ public class DeferredIconImpl implements DeferredIcon, RetrievableIcon { equalIcons(myDelegateIcon, ((DeferredIconImpl)icon).myDelegateIcon); } - @TestOnly - @NotNull - Icon getDelegateIcon() { - return myDelegateIcon; - } - @Override public String toString() { return "Deferred. Base=" + myDelegateIcon; diff --git a/platform/platform-tests/testSrc/com/intellij/ui/IconUtilTest.java b/platform/platform-tests/testSrc/com/intellij/ui/IconUtilTest.java index f168f7a19f2b..73c5ae39675d 100644 --- a/platform/platform-tests/testSrc/com/intellij/ui/IconUtilTest.java +++ b/platform/platform-tests/testSrc/com/intellij/ui/IconUtilTest.java @@ -314,8 +314,8 @@ public class IconUtilTest extends PlatformTestCase { @NotNull private static List autopsyIconsFrom(@NotNull Icon icon) { - if (icon instanceof DeferredIconImpl) { - return autopsyIconsFrom(((DeferredIconImpl)icon).getDelegateIcon()); + if (icon instanceof RetrievableIcon) { + return autopsyIconsFrom(((RetrievableIcon)icon).retrieveIcon()); } if (icon instanceof LayeredIcon) { return ContainerUtil.flatten(ContainerUtil.map(((LayeredIcon)icon).getAllLayers(), IconUtilTest::autopsyIconsFrom)); diff --git a/platform/util/src/com/intellij/openapi/util/IconLoader.java b/platform/util/src/com/intellij/openapi/util/IconLoader.java index 3f2fb80aa6d2..38103ab21e27 100644 --- a/platform/util/src/com/intellij/openapi/util/IconLoader.java +++ b/platform/util/src/com/intellij/openapi/util/IconLoader.java @@ -319,7 +319,7 @@ public final class IconLoader { return new RetrievableIcon() { @Nullable @Override - public Icon retrieve() { + public Icon retrieveIcon() { return icon; } diff --git a/platform/util/src/com/intellij/ui/RetrievableIcon.java b/platform/util/src/com/intellij/ui/RetrievableIcon.java index 910ef735ed7c..27cdbd63b4c8 100644 --- a/platform/util/src/com/intellij/ui/RetrievableIcon.java +++ b/platform/util/src/com/intellij/ui/RetrievableIcon.java @@ -27,5 +27,5 @@ import javax.swing.*; */ public interface RetrievableIcon extends Icon { @Nullable - Icon retrieve(); + Icon retrieveIcon(); } \ No newline at end of file From 604bbafe9b350e728e119879b6c354ff5ac80332 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 28 Dec 2015 19:06:09 +0100 Subject: [PATCH 081/105] [platform] system L&F in config import dialog; code reuse --- .../bootstrap/src/com/intellij/idea/Main.java | 2 +- .../application/ConfigImportHelper.java | 64 +++++++------------ .../src/messages/ApplicationBundle.properties | 2 +- 3 files changed, 26 insertions(+), 42 deletions(-) diff --git a/platform/bootstrap/src/com/intellij/idea/Main.java b/platform/bootstrap/src/com/intellij/idea/Main.java index 123b84772dde..b735053bdbd6 100644 --- a/platform/bootstrap/src/com/intellij/idea/Main.java +++ b/platform/bootstrap/src/com/intellij/idea/Main.java @@ -349,7 +349,7 @@ public class Main { scrollPane.setPreferredSize(new Dimension(Math.min(maxWidth, component.width), Math.min(maxHeight, component.height))); } - int type = error ? JOptionPane.ERROR_MESSAGE : JOptionPane.INFORMATION_MESSAGE; + int type = error ? JOptionPane.ERROR_MESSAGE : JOptionPane.WARNING_MESSAGE; JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), scrollPane, title, type); } catch (Throwable t) { diff --git a/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java b/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java index f1aadb1f710b..fcb7163680a0 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java @@ -18,12 +18,12 @@ package com.intellij.openapi.application; import com.intellij.ide.plugins.IdeaPluginDescriptorImpl; import com.intellij.ide.plugins.PluginManager; import com.intellij.ide.plugins.PluginManagerCore; +import com.intellij.idea.Main; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.AppUIUtil; import com.intellij.util.*; -import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -42,22 +42,25 @@ public class ConfigImportHelper { * Holds name of the system property that is supposed to hold 'true' value when IDE settings have been * imported on the current startup */ - @NonNls public static final String CONFIG_IMPORTED_IN_CURRENT_SESSION_KEY = "intellij.config.imported.in.current.session"; + public static final String CONFIG_IMPORTED_IN_CURRENT_SESSION_KEY = "intellij.config.imported.in.current.session"; - @NonNls private static final String BUILD_NUMBER_FILE = SystemInfo.isMac ? "/Resources/build.txt" : "build.txt"; - @NonNls private static final String PLUGINS_PATH = "plugins"; - @NonNls private static final String BIN_FOLDER = "bin"; - @NonNls private static final String CONFIG_RELATED_PATH = SystemInfo.isMac ? "" : "config/"; - @NonNls private static final String OPTIONS_XML = "options/options.xml"; + private static final String BUILD_NUMBER_FILE = SystemInfo.isMac ? "/Resources/build.txt" : "build.txt"; + private static final String PLUGINS_PATH = "plugins"; + private static final String BIN_FOLDER = "bin"; + private static final String CONFIG_RELATED_PATH = SystemInfo.isMac ? "" : "config/"; + private static final String OPTIONS_XML = "options/options.xml"; - private ConfigImportHelper() { - } + private ConfigImportHelper() { } public static void importConfigsTo(@NotNull String newConfigPath) { ConfigImportSettings settings = getConfigImportSettings(); File newConfigDir = new File(newConfigPath); File oldConfigDir = findOldConfigDir(newConfigDir, settings.getCustomPathsSelector()); + + try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } + catch (Throwable ignore) { } + do { ImportOldConfigsPanel dialog = new ImportOldConfigsPanel(oldConfigDir, settings); dialog.setModalityType(Dialog.ModalityType.TOOLKIT_MODAL); @@ -91,10 +94,8 @@ public class ConfigImportHelper { return ReflectionUtil.newInstance(customProviderClass); } } - catch (ClassNotFoundException ignored) { - } - catch (RuntimeException ignored) { - } + catch (ClassNotFoundException ignored) { } + catch (RuntimeException ignored) { } return new ConfigImportSettings(); } @@ -141,28 +142,26 @@ public class ConfigImportHelper { copy(oldConfigDir, newConfigDir, settings, installationHome); } catch (IOException e) { - JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), - ApplicationBundle.message("error.unable.to.import.settings", e.getMessage()), - ApplicationBundle.message("title.settings.import.failed"), JOptionPane.WARNING_MESSAGE); + String message = ApplicationBundle.message("error.unable.to.import.settings", e.getMessage()); + Main.showMessage(ApplicationBundle.message("title.settings.import.failed"), message, false); } } private static boolean validateOldConfigDir(@Nullable File installationHome, @Nullable File oldConfigDir, @NotNull ConfigImportSettings settings) { if (oldConfigDir == null) { if (installationHome != null) { - JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), - ApplicationBundle.message("error.invalid.installation.home", installationHome.getAbsolutePath(), settings.getProductName(ThreeState.YES))); + String message = ApplicationBundle.message("error.invalid.installation.home", installationHome.getAbsolutePath(), settings.getProductName(ThreeState.YES)); + Main.showMessage(ApplicationBundle.message("title.settings.import.failed"), message, false); } return false; } if (!oldConfigDir.exists()) { - JOptionPane.showMessageDialog(JOptionPane.getRootFrame(), - ApplicationBundle.message("error.no.settings.path", - oldConfigDir.getAbsolutePath()), - ApplicationBundle.message("title.settings.import.failed"), JOptionPane.WARNING_MESSAGE); + String message = ApplicationBundle.message("error.no.settings.path", oldConfigDir.getAbsolutePath()); + Main.showMessage(ApplicationBundle.message("title.settings.import.failed"), message, false); return false; } + return true; } @@ -405,24 +404,9 @@ public class ConfigImportHelper { @Nullable private static String getContent(File file) { try { - StringBuilder content = new StringBuilder(); - BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); - try { - do { - String line = reader.readLine(); - if (line == null) break; - content.append(line); - content.append('\n'); - } - while (true); - } - finally { - reader.close(); - } - - return content.toString(); + return FileUtil.loadFile(file); } - catch (Exception e) { + catch (IOException e) { return null; } } @@ -493,4 +477,4 @@ public class ConfigImportHelper { return -1; } -} +} \ No newline at end of file diff --git a/platform/platform-resources-en/src/messages/ApplicationBundle.properties b/platform/platform-resources-en/src/messages/ApplicationBundle.properties index 4599bc8e2b72..1262bc1d8521 100644 --- a/platform/platform-resources-en/src/messages/ApplicationBundle.properties +++ b/platform/platform-resources-en/src/messages/ApplicationBundle.properties @@ -1,4 +1,4 @@ -error.invalid.installation.home=Unable to import settings. ''{0}'' doesn''t appear to be valid {1} installation home. +error.invalid.installation.home=Unable to import settings. ''{0}'' doesn''t appear to be a valid {1} installation home. error.no.settings.path=Unable to import settings. {0} does not exist. title.settings.import.failed=Settings Import Failed error.unable.to.import.settings=Unable to import settings. {0} From 99ebd030c1502d9d79e2e865a5a48fd59d28b737 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 29 Dec 2015 10:46:09 +0100 Subject: [PATCH 082/105] [platform] ConfigImportHelper API cleanup (IDEA-149673 prerequisite) --- .../application/ConfigImportHelper.java | 83 ++++++++----------- .../impl/UpdateCheckerComponent.java | 2 +- .../src/com/intellij/idea/MainImpl.java | 4 +- 3 files changed, 39 insertions(+), 50 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java b/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java index fcb7163680a0..ed53b94d45f9 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java @@ -38,12 +38,8 @@ import java.util.PropertyResourceBundle; * @author max */ public class ConfigImportHelper { - /** - * Holds name of the system property that is supposed to hold 'true' value when IDE settings have been - * imported on the current startup - */ - public static final String CONFIG_IMPORTED_IN_CURRENT_SESSION_KEY = "intellij.config.imported.in.current.session"; - + private static final String CONFIG_IMPORTED_IN_CURRENT_SESSION_KEY = "intellij.config.imported.in.current.session"; + private static final String BUILD_NUMBER_FILE = SystemInfo.isMac ? "/Resources/build.txt" : "build.txt"; private static final String PLUGINS_PATH = "plugins"; private static final String BIN_FOLDER = "bin"; @@ -61,27 +57,34 @@ public class ConfigImportHelper { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Throwable ignore) { } - do { + while (true) { ImportOldConfigsPanel dialog = new ImportOldConfigsPanel(oldConfigDir, settings); dialog.setModalityType(Dialog.ModalityType.TOOLKIT_MODAL); AppUIUtil.updateWindowIcon(dialog); dialog.setVisible(true); - if (dialog.isImportEnabled()) { - File installationHome = dialog.getSelectedFile(); - oldConfigDir = getOldConfigDir(installationHome, settings); - if (!validateOldConfigDir(installationHome, oldConfigDir, settings)) { - continue; - } - - assert oldConfigDir != null; - doImport(newConfigDir, oldConfigDir, settings, installationHome); - settings.importFinished(newConfigPath); - System.setProperty(CONFIG_IMPORTED_IN_CURRENT_SESSION_KEY, Boolean.TRUE.toString()); + if (!dialog.isImportEnabled()) { + break; } + File installationHome = dialog.getSelectedFile(); + oldConfigDir = getOldConfigDir(installationHome, settings); + if (!validateOldConfigDir(installationHome, oldConfigDir, settings)) { + continue; + } + + assert oldConfigDir != null; + doImport(newConfigDir, oldConfigDir, settings, installationHome); + settings.importFinished(newConfigPath); + System.setProperty(CONFIG_IMPORTED_IN_CURRENT_SESSION_KEY, Boolean.TRUE.toString()); break; } - while (true); + } + + /** + * Returns {@code true} when the IDE is launched for the first time, and configs were imported from another installation. + */ + public static boolean isConfigImported() { + return Boolean.getBoolean(CONFIG_IMPORTED_IN_CURRENT_SESSION_KEY); } @NotNull @@ -223,7 +226,7 @@ public class ConfigImportHelper { } @Nullable - public static File getOldConfigDir(@Nullable File oldInstallHome, ConfigImportSettings settings) { + private static File getOldConfigDir(@Nullable File oldInstallHome, ConfigImportSettings settings) { if (oldInstallHome == null) { return null; } @@ -239,7 +242,6 @@ public class ConfigImportHelper { int oldBuildNumber = getBuildNumber(oldInstallHome); if (oldBuildNumber != -1 && oldBuildNumber <= 600) { // Pandora - //noinspection HardCodedStringLiteral return new File(oldInstallHome, "config"); } @@ -251,11 +253,8 @@ public class ConfigImportHelper { }); } - private static File getSettingsPath(final File installHome, - final ConfigImportSettings settings, - final String propertyName, - final Function fromPathSelector) { - final File[] launchFileCandidates = getLaunchFilesCandidates(installHome, settings); + private static File getSettingsPath(File installHome, ConfigImportSettings settings, String propertyName, Function fromPathSelector) { + final List launchFileCandidates = getLaunchFilesCandidates(installHome, settings); // custom config folder for (File candidate : launchFileCandidates) { @@ -274,10 +273,9 @@ public class ConfigImportHelper { if (candidate.exists()) { final String pathsSelector = getPropertyFromLaxFile(candidate, PathManager.PROPERTY_PATHS_SELECTOR); if (pathsSelector != null) { - final String configDir = fromPathSelector.fun(pathsSelector); - final File probableConfig = new File(configDir); - if (probableConfig.exists()) { - return probableConfig; + File candidateDir = new File(fromPathSelector.fun(pathsSelector)); + if (candidateDir.exists()) { + return candidateDir; } } } @@ -286,21 +284,18 @@ public class ConfigImportHelper { return null; } - @SuppressWarnings({"HardCodedStringLiteral"}) - private static File[] getLaunchFilesCandidates(@NotNull final File instHome, @NotNull final ConfigImportSettings settings) { + private static List getLaunchFilesCandidates(@NotNull File instHome, @NotNull ConfigImportSettings settings) { final File bin = new File(instHome, BIN_FOLDER); final List files = new ArrayList(); if (SystemInfo.isMac) { // Info.plist files.add(new File(new File(instHome, "Contents"), "Info.plist")); - files.add(new File(new File(new File(bin, "idea.app"), "Contents"), "Info.plist")); files.add(new File(new File(new File(instHome, "idea.app"), "Contents"), "Info.plist")); } // idea.properties files.add(new File(bin, PathManager.PROPERTIES_FILE_NAME)); - // other binary scripts final String executableName = StringUtil.toLowerCase(settings.getExecutableName()); // * defaults: @@ -312,21 +307,17 @@ public class ConfigImportHelper { // for compatibility with some platform-base IDEs with wrong executable names addLaunchExecutableScriptsCandidates(files, "idea", bin); } - return files.toArray(new File[files.size()]); + return files; } - private static void addLaunchExecutableScriptsCandidates(final List files, - final String executableName, - final File binFolder) { + private static void addLaunchExecutableScriptsCandidates(List files, String executableName, File binFolder) { files.add(new File(binFolder, executableName + ".lax")); files.add(new File(binFolder, executableName + ".bat")); files.add(new File(binFolder, executableName + ".sh")); } - @SuppressWarnings({"HardCodedStringLiteral"}) @Nullable - public static String getPropertyFromLaxFile(@NotNull final File file, - @NotNull final String propertyName) { + private static String getPropertyFromLaxFile(@NotNull File file, @NotNull String propertyName) { if (file.getName().endsWith(".properties")) { try { PropertyResourceBundle bundle; @@ -359,8 +350,7 @@ public class ConfigImportHelper { } @Nullable - private static String findProperty(final String propertyName, - final String fileContent) { + private static String findProperty(String propertyName, String fileContent) { String param = propertyName + "="; int idx = fileContent.indexOf(param); if (idx == -1) { @@ -411,7 +401,7 @@ public class ConfigImportHelper { } } - public static String fixDirName(String dir, boolean replaceUserHome) { + private static String fixDirName(String dir, boolean replaceUserHome) { if (StringUtil.startsWithChar(dir, '\"') && StringUtil.endsWithChar(dir, '\"')) { dir = dir.substring(1, dir.length() - 1); } @@ -421,7 +411,7 @@ public class ConfigImportHelper { return dir; } - public static boolean isInstallationHomeOrConfig(@NotNull final String installationHome, @NotNull final ConfigImportSettings settings) { + public static boolean isInstallationHomeOrConfig(@NotNull String installationHome, @NotNull ConfigImportSettings settings) { if (new File(installationHome, OPTIONS_XML).exists()) return true; if (new File(installationHome, CONFIG_RELATED_PATH + OPTIONS_XML).exists()) return true; @@ -434,7 +424,6 @@ public class ConfigImportHelper { String[] mainJarNames = settings.getMainJarNames(); for (String name : mainJarNames) { String mainJarName = StringUtil.toLowerCase(name) + ".jar"; - //noinspection HardCodedStringLiteral if (new File(libFolder, mainJarName).exists()) { quickTest = true; break; @@ -442,7 +431,7 @@ public class ConfigImportHelper { } if (!quickTest) return false; - File[] files = getLaunchFilesCandidates(new File(installationHome), settings); + List files = getLaunchFilesCandidates(new File(installationHome), settings); for (File file : files) { if (file.exists()) return true; } diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateCheckerComponent.java b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateCheckerComponent.java index 2771da8448b1..37454618fa09 100644 --- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateCheckerComponent.java +++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateCheckerComponent.java @@ -82,7 +82,7 @@ public class UpdateCheckerComponent implements ApplicationComponent { notify(app, UpdateChecker.NOTIFICATIONS.createNotification(title, message, NotificationType.INFORMATION, null)); } - if (!eap && current == ChannelStatus.EAP && Boolean.getBoolean(ConfigImportHelper.CONFIG_IMPORTED_IN_CURRENT_SESSION_KEY)) { + if (!eap && current == ChannelStatus.EAP && ConfigImportHelper.isConfigImported()) { mySettings.setSelectedChannelStatus(ChannelStatus.RELEASE); LOG.info("channel set to 'release'"); } diff --git a/platform/platform-main/src/com/intellij/idea/MainImpl.java b/platform/platform-main/src/com/intellij/idea/MainImpl.java index 88ce048d3b0d..abb1948773d5 100644 --- a/platform/platform-main/src/com/intellij/idea/MainImpl.java +++ b/platform/platform-main/src/com/intellij/idea/MainImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,7 +40,7 @@ public class MainImpl { public void run() { PluginManager.installExceptionHandler(); - if (newConfigFolder && !Boolean.getBoolean(ConfigImportHelper.CONFIG_IMPORTED_IN_CURRENT_SESSION_KEY)) { + if (newConfigFolder && !ConfigImportHelper.isConfigImported()) { StartupUtil.runStartupWizard(); } From 9c7309fff6cef4c2bbf0daf85118031a184008f4 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 29 Dec 2015 10:56:03 +0100 Subject: [PATCH 083/105] [platform] suppresses channel switch notification for the first launch (IDEA-149673) --- .../openapi/application/ConfigImportHelper.java | 10 ++++++++++ .../updateSettings/impl/UpdateCheckerComponent.java | 8 +++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java b/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java index ed53b94d45f9..2329e369d9d9 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java @@ -38,6 +38,7 @@ import java.util.PropertyResourceBundle; * @author max */ public class ConfigImportHelper { + private static final String FIRST_SESSION_KEY = "intellij.first.ide.session"; private static final String CONFIG_IMPORTED_IN_CURRENT_SESSION_KEY = "intellij.config.imported.in.current.session"; private static final String BUILD_NUMBER_FILE = SystemInfo.isMac ? "/Resources/build.txt" : "build.txt"; @@ -49,6 +50,8 @@ public class ConfigImportHelper { private ConfigImportHelper() { } public static void importConfigsTo(@NotNull String newConfigPath) { + System.setProperty(FIRST_SESSION_KEY, Boolean.TRUE.toString()); + ConfigImportSettings settings = getConfigImportSettings(); File newConfigDir = new File(newConfigPath); @@ -80,6 +83,13 @@ public class ConfigImportHelper { } } + /** + * Returns {@code true} when the IDE is launched for the first time (i.e. there was no config directory). + */ + public static boolean isFirstSession() { + return Boolean.getBoolean(FIRST_SESSION_KEY); + } + /** * Returns {@code true} when the IDE is launched for the first time, and configs were imported from another installation. */ diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateCheckerComponent.java b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateCheckerComponent.java index 37454618fa09..9ede86bf6706 100644 --- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateCheckerComponent.java +++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateCheckerComponent.java @@ -77,9 +77,11 @@ public class UpdateCheckerComponent implements ApplicationComponent { if (eap && current != ChannelStatus.EAP && UpdateStrategyCustomization.getInstance().forceEapUpdateChannelForEapBuilds()) { mySettings.setSelectedChannelStatus(ChannelStatus.EAP); LOG.info("channel forced to 'eap'"); - String title = IdeBundle.message("update.notifications.title"); - String message = IdeBundle.message("update.channel.enforced", ChannelStatus.EAP); - notify(app, UpdateChecker.NOTIFICATIONS.createNotification(title, message, NotificationType.INFORMATION, null)); + if (!ConfigImportHelper.isFirstSession()) { + String title = IdeBundle.message("update.notifications.title"); + String message = IdeBundle.message("update.channel.enforced", ChannelStatus.EAP); + notify(app, UpdateChecker.NOTIFICATIONS.createNotification(title, message, NotificationType.INFORMATION, null)); + } } if (!eap && current == ChannelStatus.EAP && ConfigImportHelper.isConfigImported()) { From b901b34a8f3457860b3c4a6053ef9275d4b00c01 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 29 Dec 2015 11:01:04 +0100 Subject: [PATCH 084/105] [platform] obsolete registry property dropped (superseded by ConfigImportHelper) --- .../com/intellij/ide/startup/impl/StartupManagerImpl.java | 6 ------ platform/util/resources/misc/registry.properties | 1 - 2 files changed, 7 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.java b/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.java index 0faf3d97446d..40a0baab32eb 100644 --- a/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.java @@ -36,7 +36,6 @@ import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.startup.StartupActivity; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; @@ -208,11 +207,6 @@ public class StartupManagerImpl extends StartupManagerEx { } } }); - - // otherwise will be stored - we must not create config files in tests - if (!app.isUnitTestMode()) { - Registry.get("ide.firstStartup").setValue(false); - } } public void scheduleInitialVfsRefresh() { diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index 270ed16fcd3b..47ced80e09f2 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -44,7 +44,6 @@ actionSystem.extendedKeyCode.disabled=false color.blindness.icon.filter=false -ide.firstStartup=true ide.debugMode=false ide.debugger.inline=true ide.debugger.inline.description=Enables variables view in editor From baabc7982f95cfc72d4511bf03d5ea2d56a85921 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 28 Dec 2015 16:36:40 +0100 Subject: [PATCH 085/105] [java decompiler] "new" expression writer optimization --- .../modules/decompiler/exps/NewExprent.java | 119 +++++++++--------- 1 file changed, 60 insertions(+), 59 deletions(-) diff --git a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/modules/decompiler/exps/NewExprent.java b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/modules/decompiler/exps/NewExprent.java index fb0adb727f82..1edd0e43af07 100644 --- a/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/modules/decompiler/exps/NewExprent.java +++ b/plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/modules/decompiler/exps/NewExprent.java @@ -159,7 +159,32 @@ public class NewExprent extends Exprent { if (anonymous) { ClassNode child = DecompilerContext.getClassProcessor().getMapRootClasses().get(newType.value); - buf.append("("); + if (!enumConst) { + String enclosing = null; + + if (!lambda && constructor != null) { + enclosing = getQualifiedNewInstance(child.anonymousClassType.value, constructor.getLstParameters(), indent, tracer); + if (enclosing != null) { + buf.append(enclosing).append('.'); + } + } + + buf.append("new "); + + String typename = ExprProcessor.getCastTypeName(child.anonymousClassType); + if (enclosing != null) { + ClassNode anonymousNode = DecompilerContext.getClassProcessor().getMapRootClasses().get(child.anonymousClassType.value); + if (anonymousNode != null) { + typename = anonymousNode.simpleName; + } + else { + typename = typename.substring(typename.lastIndexOf('.') + 1); + } + } + buf.append(typename); + } + + buf.append('('); if (!lambda && constructor != null) { InvocationExprent invSuper = child.superInvocation; @@ -207,32 +232,7 @@ public class NewExprent extends Exprent { } } - if (!enumConst) { - String enclosing = null; - if (!lambda && constructor != null) { - enclosing = getQualifiedNewInstance(child.anonymousClassType.value, constructor.getLstParameters(), indent, tracer); - } - - String typename = ExprProcessor.getCastTypeName(child.anonymousClassType); - - if (enclosing != null) { - ClassNode anonymousNode = DecompilerContext.getClassProcessor().getMapRootClasses().get(child.anonymousClassType.value); - if (anonymousNode != null) { - typename = anonymousNode.simpleName; - } - else { - typename = typename.substring(typename.lastIndexOf('.') + 1); - } - } - - buf.prepend("new " + typename); - - if (enclosing != null) { - buf.prepend(enclosing + "."); - } - } - - buf.append(")"); + buf.append(')'); if (enumConst && buf.length() == 2) { buf.setLength(0); @@ -257,16 +257,41 @@ public class NewExprent extends Exprent { } else if (directArrayInit) { VarType leftType = newType.decreaseArrayDim(); - buf.append("{"); + buf.append('{'); for (int i = 0; i < lstArrayElements.size(); i++) { if (i > 0) { buf.append(", "); } ExprProcessor.getCastedExprent(lstArrayElements.get(i), leftType, buf, indent, false, tracer); } - buf.append("}"); + buf.append('}'); } else if (newType.arrayDim == 0) { + if (!enumConst) { + String enclosing = null; + + if (constructor != null) { + enclosing = getQualifiedNewInstance(newType.value, constructor.getLstParameters(), indent, tracer); + if (enclosing != null) { + buf.append(enclosing).append('.'); + } + } + + buf.append("new "); + + String typename = ExprProcessor.getTypeName(newType); + if (enclosing != null) { + ClassNode newNode = DecompilerContext.getClassProcessor().getMapRootClasses().get(newType.value); + if (newNode != null) { + typename = newNode.simpleName; + } + else { + typename = typename.substring(typename.lastIndexOf('.') + 1); + } + } + buf.append(typename); + } + if (constructor != null) { List lstParameters = constructor.getLstParameters(); @@ -286,7 +311,7 @@ public class NewExprent extends Exprent { int start = enumConst ? 2 : 0; if (!enumConst || start < lstParameters.size()) { - buf.append("("); + buf.append('('); boolean firstParam = true; for (int i = start; i < lstParameters.size(); i++) { @@ -311,31 +336,7 @@ public class NewExprent extends Exprent { } } - buf.append(")"); - } - } - - if (!enumConst) { - String enclosing = null; - if (constructor != null) { - enclosing = getQualifiedNewInstance(newType.value, constructor.getLstParameters(), indent, tracer); - } - - String typename = ExprProcessor.getTypeName(newType); - - if (enclosing != null) { - ClassNode newNode = DecompilerContext.getClassProcessor().getMapRootClasses().get(newType.value); - if (newNode != null) { - typename = newNode.simpleName; - } - else { - typename = typename.substring(typename.lastIndexOf('.') + 1); - } - } - buf.prepend("new " + typename); - - if (enclosing != null) { - buf.prepend(enclosing + "."); + buf.append(')'); } } } @@ -344,11 +345,11 @@ public class NewExprent extends Exprent { if (lstArrayElements.isEmpty()) { for (int i = 0; i < newType.arrayDim; i++) { - buf.append("["); + buf.append('['); if (i < lstDims.size()) { buf.append(lstDims.get(i).toJava(indent, tracer)); } - buf.append("]"); + buf.append(']'); } } else { @@ -357,14 +358,14 @@ public class NewExprent extends Exprent { } VarType leftType = newType.decreaseArrayDim(); - buf.append("{"); + buf.append('{'); for (int i = 0; i < lstArrayElements.size(); i++) { if (i > 0) { buf.append(", "); } ExprProcessor.getCastedExprent(lstArrayElements.get(i), leftType, buf, indent, false, tracer); } - buf.append("}"); + buf.append('}'); } } From f5ad942a0d7010ed421742541d92536141c80c44 Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Tue, 29 Dec 2015 11:13:02 +0100 Subject: [PATCH 086/105] ApplicationImpl.isRunningFromSources() to determine if IDE is running from sources, not from a distribution bundle --- .../openapi/application/impl/ApplicationImpl.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java index fc9296c9cc7a..f557cbd004fe 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java @@ -104,7 +104,7 @@ public class ApplicationImpl extends PlatformComponentManagerImpl implements App private final boolean myTestModeFlag; private final boolean myHeadlessMode; private final boolean myCommandLineMode; - private final boolean myIsRunningFromSources; + private static volatile Boolean ourIsRunningFromSources; private final boolean myIsInternal; private final String myName; @@ -198,8 +198,6 @@ public class ApplicationImpl extends PlatformComponentManagerImpl implements App myHeadlessMode = isHeadless; myCommandLineMode = isCommandLine; - myIsRunningFromSources = new File(PathManager.getHomePath(), ".idea").isDirectory(); - myDoNotSave = isUnitTestMode || isHeadless; if (myTestModeFlag) { @@ -358,8 +356,11 @@ public class ApplicationImpl extends PlatformComponentManagerImpl implements App return myCommandLineMode; } - public boolean isRunningFromSources() { - return myIsRunningFromSources; + public static boolean isRunningFromSources() { + if (ourIsRunningFromSources == null) { + ourIsRunningFromSources = new File(PathManager.getHomePath(), ".idea").isDirectory(); + } + return ourIsRunningFromSources; } @NotNull From 195b2dd048f25d53572e121f6c70e5f37850a1fc Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Tue, 29 Dec 2015 13:47:23 +0300 Subject: [PATCH 087/105] IDEA-149752 IJ does not fetch schema --- .../daemon/quickFix/RealFetchTest.java | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/xml/tests/src/com/intellij/codeInsight/daemon/quickFix/RealFetchTest.java b/xml/tests/src/com/intellij/codeInsight/daemon/quickFix/RealFetchTest.java index c173bc304249..91c0747df9dd 100644 --- a/xml/tests/src/com/intellij/codeInsight/daemon/quickFix/RealFetchTest.java +++ b/xml/tests/src/com/intellij/codeInsight/daemon/quickFix/RealFetchTest.java @@ -15,13 +15,17 @@ */ package com.intellij.codeInsight.daemon.quickFix; +import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.ide.highlighter.XmlFileType; import com.intellij.javaee.ExternalResourceManager; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase; import com.intellij.xml.XmlBundle; +import java.util.List; + /** * @author Dmitry Avdeev */ @@ -36,10 +40,28 @@ public class RealFetchTest extends LightPlatformCodeInsightFixtureTestCase { assertNotNull(intention); intention.invoke(getProject(), myFixture.getEditor(), myFixture.getFile()); assertNotSame(url, ExternalResourceManager.getInstance().getResourceLocation(url, getProject())); - ApplicationManager.getApplication().runWriteAction(new Runnable() { - public void run() { - ExternalResourceManager.getInstance().removeResource(url); - } + ApplicationManager.getApplication().runWriteAction(() -> { + ExternalResourceManager.getInstance().removeResource(url); + }); + } + + public void testOverwriteFetchDtd() throws Exception { + + final String url = "http://helpserver.labs.intellij.net/help/images.dtd"; + VirtualFile virtualFile = myFixture.getTempDirFixture().createFile("images.dtd", ""); + ApplicationManager.getApplication().runWriteAction(() -> { + ExternalResourceManager.getInstance().addResource(url, virtualFile.getPath()); + }); + + myFixture.configureByText(XmlFileType.INSTANCE, "http://helpserver.labs.intellij.net/help/images.dtd\"> "); + myFixture.testHighlighting(); + IntentionAction intention = myFixture.getAvailableIntention(XmlBundle.message("fetch.external.resource")); + assertNotNull(intention); + intention.invoke(getProject(), myFixture.getEditor(), myFixture.getFile()); + List infos = myFixture.doHighlighting(); + assertEmpty(infos); + ApplicationManager.getApplication().runWriteAction(() -> { + ExternalResourceManager.getInstance().removeResource(url); }); } From 3dd56de80e9e249cf9bd1f099b0ee04e81c632a4 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 26 Dec 2015 14:35:41 +0300 Subject: [PATCH 088/105] vcs: less logging in ChangeViewManager: display the stack trace only in the TRACE mode --- .../intellij/openapi/vcs/changes/ChangesViewManager.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java index b1115901ef2a..dd5f074ee40c 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java @@ -126,7 +126,13 @@ public class ChangesViewManager implements ChangesViewI, JDOMExternalizable, Pro @Override public void valueChanged(TreeSelectionEvent e) { if (LOG.isDebugEnabled()) { - LOG.debug("selection changed. selected: " + toStringPaths(myView.getSelectionPaths()) + " from: " + DebugUtil.currentStackTrace()); + String message = "selection changed. selected: " + toStringPaths(myView.getSelectionPaths()); + if (LOG.isTraceEnabled()) { + LOG.trace(message + " from: " + DebugUtil.currentStackTrace()); + } + else { + LOG.debug(message); + } } SwingUtilities.invokeLater(new Runnable() { @Override From 52f7588809ddfd24269ebd931948b3f2726e4a7e Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 26 Dec 2015 15:13:08 +0300 Subject: [PATCH 089/105] vcs: better logging in VcsDirtyScopeManager * Proper stringify AbstractVcs; * Better find the caller class avoiding internal delegation. --- .../vcs/changes/VcsDirtyScopeManagerImpl.java | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeManagerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeManagerImpl.java index 14c712c909d1..78ee87bd32d3 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeManagerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeManagerImpl.java @@ -19,6 +19,7 @@ import com.intellij.openapi.components.ProjectComponent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vcs.AbstractVcs; import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.ProjectLevelVcsManager; @@ -85,7 +86,7 @@ public class VcsDirtyScopeManagerImpl extends VcsDirtyScopeManager implements Pr if ((! myProject.isOpen()) || myProject.isDisposed() || myVcsManager.getAllActiveVcss().length == 0) return; if (LOG.isDebugEnabled()) { - LOG.debug("everything dirty: " + ReflectionUtil.findCallerClass(2)); + LOG.debug("everything dirty: " + findFirstInterestingCallerClass()); } synchronized (LOCK) { @@ -139,7 +140,7 @@ public class VcsDirtyScopeManagerImpl extends VcsDirtyScopeManager implements Pr if (filesConverted.isEmpty() && dirsConverted.isEmpty()) return; if (LOG.isDebugEnabled()) { - LOG.debug("paths dirty: " + filesConverted + "; " + dirsConverted + "; " + ReflectionUtil.findCallerClass(3)); + LOG.debug("dirty files: " + toString(filesConverted) + "; dirty dirs: " + toString(dirsConverted) + "; " + findFirstInterestingCallerClass()); } boolean hasSomethingDirty; @@ -290,4 +291,28 @@ public class VcsDirtyScopeManagerImpl extends VcsDirtyScopeManager implements Pr } return result; } + + @NotNull + private static String toString(@NotNull final MultiMap filesByVcs) { + return StringUtil.join(filesByVcs.keySet(), new Function() { + @Override + public String fun(@NotNull AbstractVcs vcs) { + return vcs.getName() + ": " + StringUtil.join(filesByVcs.get(vcs), new Function() { + @Override + public String fun(@NotNull FilePath path) { + return path.getPath(); + } + }, "\n"); + } + }, "\n"); + } + + @Nullable + private static Class findFirstInterestingCallerClass() { + for (int i = 1; i <= 5; i++) { + Class clazz = ReflectionUtil.findCallerClass(i); + if (clazz == null || !clazz.getName().contains(VcsDirtyScopeManagerImpl.class.getName())) return clazz; + } + return null; + } } From 060f086dd18fa72d23b604c6b51037a464cd505b Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 26 Dec 2015 15:15:09 +0300 Subject: [PATCH 090/105] vcs: logging: remove unnecessary space --- .../src/com/intellij/openapi/vcs/changes/VcsDirtyScopeImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeImpl.java index 761f01cf6c68..c4a961fa1b59 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeImpl.java @@ -517,7 +517,7 @@ public class VcsDirtyScopeImpl extends VcsModifiableDirtyScope { } } if (!myDirtyDirectoriesRecursively.isEmpty()) { - result.append("\n dirs: "); + result.append("\ndirs: "); for(THashSet dirsByRoot: myDirtyDirectoriesRecursively.values()) { for(FilePath file: dirsByRoot) { result.append(file).append(" "); From 55da8cf563b7b5849729c38aede9ad69abb542a6 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 26 Dec 2015 15:48:39 +0300 Subject: [PATCH 091/105] git: more correct message in the log --- plugins/git4idea/src/git4idea/repo/GitUntrackedFilesHolder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/git4idea/src/git4idea/repo/GitUntrackedFilesHolder.java b/plugins/git4idea/src/git4idea/repo/GitUntrackedFilesHolder.java index c1139a94311b..0345f30e9e49 100644 --- a/plugins/git4idea/src/git4idea/repo/GitUntrackedFilesHolder.java +++ b/plugins/git4idea/src/git4idea/repo/GitUntrackedFilesHolder.java @@ -256,7 +256,7 @@ public class GitUntrackedFilesHolder implements Disposable, BulkFileListener { // if index has changed, no need to refresh specific files - we get the full status of all files if (allChanged) { - LOG.debug(String.format("GitUntrackedFilesHolder: Index has changed, marking %s recursively dirty", myRoot)); + LOG.debug(String.format("GitUntrackedFilesHolder: total refresh is needed, marking %s recursively dirty", myRoot)); myDirtyScopeManager.dirDirtyRecursively(myRoot); synchronized (LOCK) { myReady = false; From 8249885599b350885777488595e1398041b03cf3 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 26 Dec 2015 16:16:56 +0300 Subject: [PATCH 092/105] vcs: logging: log current changes before refresh --- .../intellij/openapi/vcs/changes/ChangeListManagerImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java index 0e06753dbaf7..8d844fa75295 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java @@ -537,7 +537,8 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec return scope.toString(); } }, "->\n"); - LOG.debug("refresh procedure started, everything = " + wasEverythingDirty + " dirty scope: " + scopeInString); + LOG.debug("refresh procedure started, everything: " + wasEverythingDirty + " dirty scope: " + scopeInString + + "\ncurrent changes: " + myWorker); dataHolder.notifyStart(); myChangesViewManager.scheduleRefresh(); @@ -575,7 +576,7 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec myWorker.onAfterWorkerSwitch(oldWorker); myModifier.setWorker(myWorker); LOG.debug("refresh procedure finished, unversioned size: " + - dataHolder.getComposite().getVFHolder(FileHolder.HolderType.UNVERSIONED).getSize() + "\n changes: " + myWorker); + dataHolder.getComposite().getVFHolder(FileHolder.HolderType.UNVERSIONED).getSize() + "\nchanges: " + myWorker); final boolean statusChanged = !myComposite.equals(dataHolder.getComposite()); myComposite = dataHolder.getComposite(); if (statusChanged) { From 8ba6db554d9b01df0e830ed38d454146ada0a02b Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 26 Dec 2015 16:25:21 +0300 Subject: [PATCH 093/105] vcs: cleanup: weaken access, rationalize static call --- .../vcs/changes/ChangesViewManager.java | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java index dd5f074ee40c..71cebba698af 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangesViewManager.java @@ -14,12 +14,6 @@ * limitations under the License. */ -/* - * Created by IntelliJ IDEA. - * User: yole - * Date: 11.07.2006 - * Time: 15:29:25 - */ package com.intellij.openapi.vcs.changes; import com.intellij.diff.util.DiffPlaces; @@ -81,7 +75,7 @@ import java.util.Collections; import java.util.List; public class ChangesViewManager implements ChangesViewI, JDOMExternalizable, ProjectComponent { - public static final int UNVERSIONED_MAX_SIZE = 50; + private static final int UNVERSIONED_MAX_SIZE = 50; private boolean SHOW_FLATTEN_MODE = true; private boolean SHOW_IGNORED_MODE = false; @@ -211,7 +205,7 @@ public class ChangesViewManager implements ChangesViewI, JDOMExternalizable, Pro EmptyAction.registerWithShortcutSet("ChangesView.RemoveChangeList", CommonShortcuts.getDelete(), panel); EmptyAction.registerWithShortcutSet(IdeActions.MOVE_TO_ANOTHER_CHANGE_LIST, CommonShortcuts.getMove(), panel); EmptyAction.registerWithShortcutSet("ChangesView.Rename",CommonShortcuts.getRename() , panel); - EmptyAction.registerWithShortcutSet("ChangesView.SetDefault", new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_U, KeyEvent.ALT_DOWN_MASK | ctrlMask())), panel); + EmptyAction.registerWithShortcutSet("ChangesView.SetDefault", new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_U, InputEvent.ALT_DOWN_MASK | ctrlMask())), panel); EmptyAction.registerWithShortcutSet("ChangesView.Diff", CommonShortcuts.getDiff(), panel); JPanel toolbarPanel = new JPanel(new BorderLayout()); @@ -301,7 +295,7 @@ public class ChangesViewManager implements ChangesViewI, JDOMExternalizable, Pro return SystemInfo.isMac ? InputEvent.META_DOWN_MASK : InputEvent.CTRL_DOWN_MASK; } - public void updateProgressComponent(final Factory progress) { + private void updateProgressComponent(final Factory progress) { //noinspection SSBasedInspection SwingUtilities.invokeLater(new Runnable() { public void run() { @@ -355,7 +349,7 @@ public class ChangesViewManager implements ChangesViewI, JDOMExternalizable, Pro } } - void refreshView() { + private void refreshView() { if (myDisposed || ! myProject.isInitialized() || ApplicationManager.getApplication().isUnitTestMode()) return; if (! ProjectLevelVcsManager.getInstance(myProject).hasActiveVcss()) return; @@ -497,7 +491,7 @@ public class ChangesViewManager implements ChangesViewI, JDOMExternalizable, Pro } } - public class ToggleShowFlattenAction extends ToggleAction implements DumbAware { + private class ToggleShowFlattenAction extends ToggleAction implements DumbAware { public ToggleShowFlattenAction() { super(VcsBundle.message("changes.action.show.directories.text"), VcsBundle.message("changes.action.show.directories.description"), @@ -513,7 +507,7 @@ public class ChangesViewManager implements ChangesViewI, JDOMExternalizable, Pro } } - public class ToggleShowIgnoredAction extends ToggleAction implements DumbAware { + private class ToggleShowIgnoredAction extends ToggleAction implements DumbAware { public ToggleShowIgnoredAction() { super(VcsBundle.message("changes.action.show.ignored.text"), VcsBundle.message("changes.action.show.ignored.description"), From 7e5df29dc2baa2ba8f0008e8682d8e322f39eb06 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 26 Dec 2015 16:32:45 +0300 Subject: [PATCH 094/105] vcs: logging: log when changes are added/removed to the LocalChangeListImpl --- .../com/intellij/openapi/vcs/changes/LocalChangeListImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/LocalChangeListImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/LocalChangeListImpl.java index 5c7774e3168a..940e77cdf337 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/LocalChangeListImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/LocalChangeListImpl.java @@ -132,12 +132,14 @@ public class LocalChangeListImpl extends LocalChangeList { void addChange(Change change) { myReadChangesCache = null; myChanges.add(change); + LOG.debug("List: " + myName + ". addChange: " + change); } Change removeChange(Change change) { for (Change localChange : myChanges) { if (localChange.equals(change)) { myChanges.remove(localChange); + LOG.debug("List: " + myName + ". removeChange: " + change); myReadChangesCache = null; return localChange; } @@ -156,6 +158,7 @@ public class LocalChangeListImpl extends LocalChangeList { || isIgnoredChange(oldBoy, project)) { result.add(oldBoy); myChanges.remove(oldBoy); + LOG.debug("List: " + myName + ". removed change during processing: " + oldBoy); myReadChangesCache = null; } } From 629ccacef9aabcc5e1b48d6b8ace555f61dbd421 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Tue, 29 Dec 2015 14:15:34 +0300 Subject: [PATCH 095/105] javadoc: make the url to be a clickable link --- .../util/src/com/intellij/openapi/util/text/StringUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java index 04834ccdfd52..1993c7cfc330 100644 --- a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java +++ b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java @@ -2684,8 +2684,8 @@ public class StringUtil extends StringUtilRt { } /** - * Implementation of "Sorting for Humans: Natural Sort Order": - * http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html + * Implementation of + * "Sorting for Humans: Natural Sort Order" */ @Contract(pure = true) public static int naturalCompare(@Nullable String string1, @Nullable String string2) { From 3bfa859a44db6b73476bc7c5c3e8b388d5e0a9af Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Tue, 29 Dec 2015 14:31:20 +0300 Subject: [PATCH 096/105] vcs: logging: check isDebugEnabled --- .../vcs/changes/ChangeListManagerImpl.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java index 8d844fa75295..2876772b2d1b 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java @@ -531,14 +531,16 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec } myUpdateChangesProgressIndicator = indicator; } - final String scopeInString = !LOG.isDebugEnabled() ? "" : StringUtil.join(scopes, new Function() { - @Override - public String fun(VcsDirtyScope scope) { - return scope.toString(); - } - }, "->\n"); - LOG.debug("refresh procedure started, everything: " + wasEverythingDirty + " dirty scope: " + scopeInString + - "\ncurrent changes: " + myWorker); + if (LOG.isDebugEnabled()) { + String scopeInString = StringUtil.join(scopes, new Function() { + @Override + public String fun(VcsDirtyScope scope) { + return scope.toString(); + } + }, "->\n"); + LOG.debug("refresh procedure started, everything: " + wasEverythingDirty + " dirty scope: " + scopeInString + + "\ncurrent changes: " + myWorker); + } dataHolder.notifyStart(); myChangesViewManager.scheduleRefresh(); @@ -575,8 +577,10 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec myWorker = dataHolder.getChangeListWorker(); myWorker.onAfterWorkerSwitch(oldWorker); myModifier.setWorker(myWorker); - LOG.debug("refresh procedure finished, unversioned size: " + - dataHolder.getComposite().getVFHolder(FileHolder.HolderType.UNVERSIONED).getSize() + "\nchanges: " + myWorker); + if (LOG.isDebugEnabled()) { + LOG.debug("refresh procedure finished, unversioned size: " + + dataHolder.getComposite().getVFHolder(FileHolder.HolderType.UNVERSIONED).getSize() + "\nchanges: " + myWorker); + } final boolean statusChanged = !myComposite.equals(dataHolder.getComposite()); myComposite = dataHolder.getComposite(); if (statusChanged) { From a4bc67891b6ca2c49a28e776225cf6537e5c11d3 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Tue, 29 Dec 2015 14:10:28 +0300 Subject: [PATCH 097/105] IDEA-137936 diff: reduce editor gutter width * do not paint debugger-specific gap area * do not paint right free painters area --- .../src/com/intellij/diff/util/DiffUtil.java | 1 + .../editor/ex/EditorGutterComponentEx.java | 2 + .../impl/EditorGutterComponentImpl.java | 37 +++++++++++++++---- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java b/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java index 57ed72f9e5ec..d7c9affaeff6 100644 --- a/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java +++ b/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java @@ -187,6 +187,7 @@ public class DiffUtil { editor.getSettings().setShowIntentionBulb(false); ((EditorMarkupModel)editor.getMarkupModel()).setErrorStripeVisible(true); editor.getGutterComponentEx().setShowDefaultGutterPopup(false); + editor.getGutterComponentEx().setShowRightFreePaintersArea(false); if (enableFolding) { setFoldingModelSupport(editor); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorGutterComponentEx.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorGutterComponentEx.java index fa8359127337..393e4761d879 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorGutterComponentEx.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorGutterComponentEx.java @@ -72,4 +72,6 @@ public abstract class EditorGutterComponentEx extends JComponent implements Edit public abstract void setGutterPopupGroup(@Nullable ActionGroup group); public abstract void setPaintBackground(boolean value); + + public abstract void setShowRightFreePaintersArea(boolean value); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java index 63f76aa7da98..43d91537532b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java @@ -103,7 +103,7 @@ import java.util.List; *

    *
  • Left free painters
  • *
  • Icons
  • - *
  • GAP_BETWEEN_AREAS
  • + *
  • Debugger additional area
  • *
  • Free painters
  • *
* @@ -146,6 +146,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse private TIntObjectHashMap myTextFgColors = new TIntObjectHashMap(); private boolean myPaintBackground = true; private boolean myLeftFreePaintersAreaShown; + private boolean myRightFreePaintersAreaShown = true; private int myLastNonDumbModeIconAreaWidth = 0; @SuppressWarnings("unchecked") @@ -884,8 +885,8 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse ((LineMarkerRendererEx)renderer).getPosition() == LineMarkerRendererEx.Position.LEFT; int height = endY - startY; - int w = leftPosition ? FREE_PAINTERS_LEFT_AREA_WIDTH : FREE_PAINTERS_RIGHT_AREA_WIDTH; - int x = leftPosition ? getLineMarkerAreaOffset() : getLineMarkerFreePaintersAreaOffset() - 1; + int w = leftPosition ? getLeftFreePaintersAreaWidth() : getRightFreePaintersAreaWidth(); + int x = leftPosition ? getLeftFreePaintersAreaOffset() : getLineMarkerFreePaintersAreaOffset() - 1; return new Rectangle(x, startY, w, height); } @@ -1184,9 +1185,8 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse } public int getLineMarkerAreaWidth() { - return isLineMarkersShown() ? ((myLeftFreePaintersAreaShown ? FREE_PAINTERS_LEFT_AREA_WIDTH : 0) + - myIconsAreaWidth + GAP_BETWEEN_AREAS + FREE_PAINTERS_RIGHT_AREA_WIDTH) : - 0; + return isLineMarkersShown() ? getLeftFreePaintersAreaWidth() + myIconsAreaWidth + + getDebuggerAdditionalAreaWidth() + getRightFreePaintersAreaWidth() : 0; } public void setLineNumberAreaWidthFunction(@NotNull TIntFunction calculator) { @@ -1267,12 +1267,24 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse @Override public int getIconAreaOffset() { - return getLineMarkerAreaOffset() + (myLeftFreePaintersAreaShown ? FREE_PAINTERS_LEFT_AREA_WIDTH : 0); + return getLineMarkerAreaOffset() + getLeftFreePaintersAreaWidth(); + } + + public int getLeftFreePaintersAreaOffset() { + return getLineMarkerAreaOffset(); } @Override public int getLineMarkerFreePaintersAreaOffset() { - return getIconAreaOffset() + myIconsAreaWidth + GAP_BETWEEN_AREAS; + return getIconAreaOffset() + myIconsAreaWidth + getDebuggerAdditionalAreaWidth(); + } + + public int getLeftFreePaintersAreaWidth() { + return myLeftFreePaintersAreaShown ? FREE_PAINTERS_LEFT_AREA_WIDTH : 0; + } + + public int getRightFreePaintersAreaWidth() { + return myRightFreePaintersAreaShown ? FREE_PAINTERS_RIGHT_AREA_WIDTH : 0; } @Override @@ -1280,6 +1292,10 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse return myIconsAreaWidth; } + public int getDebuggerAdditionalAreaWidth() { + return isRealEditor() ? GAP_BETWEEN_AREAS : 0; + } + private boolean isMirrored() { return myEditor.getVerticalScrollbarOrientation() != EditorEx.VERTICAL_SCROLLBAR_RIGHT; } @@ -1658,6 +1674,11 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse myPaintBackground = value; } + @Override + public void setShowRightFreePaintersArea(boolean value) { + myRightFreePaintersAreaShown = value; + } + private void invokePopup(MouseEvent e) { final ActionManager actionManager = ActionManager.getInstance(); if (myEditor.getMouseEventArea(e) == EditorMouseEventArea.ANNOTATIONS_AREA) { From 0b6702ba92962556cf49bc849c78647782bc6b5e Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Thu, 24 Dec 2015 15:58:51 +0300 Subject: [PATCH 098/105] IDEA-149782 vcs: sort conflicted files in conflicts dialog --- .../vcs/merge/MultipleFileMergeDialog.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/merge/MultipleFileMergeDialog.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/merge/MultipleFileMergeDialog.java index fbf129dcc069..c229854cdcc6 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/merge/MultipleFileMergeDialog.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/merge/MultipleFileMergeDialog.java @@ -120,6 +120,12 @@ public class MultipleFileMergeDialog extends DialogWrapper { public TableCellRenderer getRenderer(final VirtualFile virtualFile) { return myVirtualFileRenderer; } + + @Nullable + @Override + public Comparator getComparator() { + return VirtualFileComparator.INSTANCE; + } }); columns.add(new ColumnInfo(VcsBundle.message("multiple.file.merge.column.type")) { @Override @@ -443,4 +449,20 @@ public class MultipleFileMergeDialog extends DialogWrapper { } } } + + private static class VirtualFileComparator implements Comparator { + public static final VirtualFileComparator INSTANCE = new VirtualFileComparator(); + + @Override + public int compare(VirtualFile file1, VirtualFile file2) { + int delta = StringUtil.naturalCompare(file1.getName(), file2.getName()); + if (delta != 0) return delta; + + VirtualFile parent1 = file1.getParent(); + VirtualFile parent2 = file2.getParent(); + String path1 = parent1 != null ? parent1.getPath() : null; + String path2 = parent2 != null ? parent2.getPath() : null; + return StringUtil.naturalCompare(path1, path2); + } + } } From 053ac359dbf42c44510641aacc196b4fd1fc81ba Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Thu, 24 Dec 2015 16:01:19 +0300 Subject: [PATCH 099/105] IDEA-149784 vcs: speedsearch in conflicts dialog --- .../vcs/merge/MultipleFileMergeDialog.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/merge/MultipleFileMergeDialog.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/merge/MultipleFileMergeDialog.java index c229854cdcc6..de425ddaade4 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/merge/MultipleFileMergeDialog.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/merge/MultipleFileMergeDialog.java @@ -46,11 +46,14 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.ColoredTableCellRenderer; import com.intellij.ui.DoubleClickListener; import com.intellij.ui.SimpleTextAttributes; +import com.intellij.ui.TableSpeedSearch; import com.intellij.ui.components.JBLabel; +import com.intellij.ui.speedSearch.SpeedSearchUtil; import com.intellij.ui.table.TableView; import com.intellij.util.Consumer; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.Convertor; import com.intellij.util.ui.ColumnInfo; import com.intellij.util.ui.ListTableModel; import com.intellij.util.ui.UIUtil; @@ -190,6 +193,15 @@ public class MultipleFileMergeDialog extends DialogWrapper { return true; } }.installOn(myTable); + new TableSpeedSearch(myTable, new Convertor() { + @Override + public String convert(Object o) { + if (o instanceof VirtualFile) { + return ((VirtualFile)o).getName(); + } + return null; + } + }); } private void updateButtonState() { @@ -437,7 +449,7 @@ public class MultipleFileMergeDialog extends DialogWrapper { }); } - private static class VirtualFileRenderer extends ColoredTableCellRenderer { + private class VirtualFileRenderer extends ColoredTableCellRenderer { @Override protected void customizeCellRenderer(JTable table, Object value, boolean selected, boolean hasFocus, int row, int column) { VirtualFile vf = (VirtualFile)value; @@ -447,6 +459,7 @@ public class MultipleFileMergeDialog extends DialogWrapper { if (parent != null) { append(" (" + FileUtil.toSystemDependentName(parent.getPresentableUrl()) + ")", SimpleTextAttributes.GRAYED_ATTRIBUTES); } + SpeedSearchUtil.applySpeedSearchHighlighting(myTable, this, true, selected); } } From f78dbdba4c55c42b4da96ebd184cda350a0b90a5 Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Tue, 29 Dec 2015 14:40:39 +0300 Subject: [PATCH 100/105] conditional expression with similar branches doesn't distinguish different constructors in PsiNewExpression (IDEA-149822) --- .../com/siyeh/ig/psiutils/EquivalenceChecker.java | 6 ++++++ ...onditionalExpressionWithIdenticalBranches.java | 15 +++++++++++++++ .../expected.xml | 7 +++++++ 3 files changed, 28 insertions(+) diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/EquivalenceChecker.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/EquivalenceChecker.java index 6b08da31bf65..13a9c4ff0574 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/EquivalenceChecker.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/EquivalenceChecker.java @@ -15,6 +15,7 @@ */ package com.siyeh.ig.psiutils; +import com.intellij.openapi.util.Comparing; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; @@ -775,6 +776,11 @@ public class EquivalenceChecker { if (!expressionsAreEquivalentDecision(arrayInitializer1, arrayInitializer2).getExactlyMatches()) { return EXACTLY_UN_MATCHES; } + final PsiMethod constructor1 = newExpression1.resolveConstructor(); + final PsiMethod constructor2 = newExpression2.resolveConstructor(); + if (!Comparing.equal(constructor1, constructor2)) { + return EXACTLY_UN_MATCHES; + } final PsiExpression qualifier1 = newExpression1.getQualifier(); final PsiExpression qualifier2 = newExpression2.getQualifier(); if (!expressionsAreEquivalentDecision(qualifier1, qualifier2).getExactlyMatches()) { diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/conditional_expression_with_identical_branches/ConditionalExpressionWithIdenticalBranches.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/conditional_expression_with_identical_branches/ConditionalExpressionWithIdenticalBranches.java index 6e10b9151fca..24fccf260af9 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/conditional_expression_with_identical_branches/ConditionalExpressionWithIdenticalBranches.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/conditional_expression_with_identical_branches/ConditionalExpressionWithIdenticalBranches.java @@ -47,4 +47,19 @@ class ConditionalExpressionWithIdenticalBranches { int someMethod(String s, String s2) { return s.length(); } + + class Item { + Item(String name) { + } + + Item(int value) { + } + + void v() { + int i = 1; + Item item = (i == 1 ? new Item("1") : new Item(i)); // warning here + + Item item1 = (i == 1 ? new Item("1") : new Item("2")); // warning here + } + } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/conditional_expression_with_identical_branches/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/conditional_expression_with_identical_branches/expected.xml index 03494e3dd12d..6b270c082c80 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/conditional_expression_with_identical_branches/expected.xml +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/controlflow/conditional_expression_with_identical_branches/expected.xml @@ -55,4 +55,11 @@ Conditional expression with identical or similar branches Conditional expression <code>new Random().nextBoolean() ? "2" + "q" + "1" : "2" + "qwe" + "1"</code> with identical or similar branches #loc + + + ConditionalExpressionWithIdenticalBranches.java + 62 + Conditional expression with identical or similar branches + Conditional expression <code>i == 1 ? new Item("1") : new Item("2")</code> with identical or similar branches #loc + \ No newline at end of file From 49b1c385352c631225ac286d65284097a0c05595 Mon Sep 17 00:00:00 2001 From: Elizaveta Shashkova Date: Tue, 29 Dec 2015 14:35:19 +0300 Subject: [PATCH 101/105] Asyncio appeared only in python3.4 and temporary dont run tests on Iron python (PY-18078) --- python/helpers/pydev/pydevd.py | 2 +- python/helpers/pydev/pydevd_constants.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/python/helpers/pydev/pydevd.py b/python/helpers/pydev/pydevd.py index 6bedfd61a8fe..6755ba14483a 100644 --- a/python/helpers/pydev/pydevd.py +++ b/python/helpers/pydev/pydevd.py @@ -2396,7 +2396,7 @@ if __name__ == '__main__': if setup['save-threading']: debugger.thread_analyser = ThreadingLogger() if setup['save-asyncio']: - if IS_PY3K: + if IS_PY34_OLDER: debugger.asyncio_analyser = AsyncioLogger() try: diff --git a/python/helpers/pydev/pydevd_constants.py b/python/helpers/pydev/pydevd_constants.py index b7960c13d836..1fa374f8b56d 100644 --- a/python/helpers/pydev/pydevd_constants.py +++ b/python/helpers/pydev/pydevd_constants.py @@ -52,11 +52,14 @@ if IS_JYTHON: # Python 3? #======================================================================================================================= IS_PY3K = False +IS_PY34_OLDER = False IS_PY27 = False IS_PY24 = False try: if sys.version_info[0] >= 3: IS_PY3K = True + if sys.version_info[0] == 3 and sys.version_info[1] >= 4: + IS_PY34_OLDER = True elif sys.version_info[0] == 2 and sys.version_info[1] == 7: IS_PY27 = True elif sys.version_info[0] == 2 and sys.version_info[1] == 4: From bad16ab78b26ce41b63d9255ab775060e9bf356f Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Tue, 29 Dec 2015 14:55:25 +0300 Subject: [PATCH 102/105] do not evaluate obsolete nodes --- .../engine/JavaDebuggerEvaluator.java | 5 +++++ .../intellij/debugger/engine/JavaValue.java | 3 +++ .../xdebugger/impl/ui/DebuggerUIUtil.java | 6 ++++- .../impl/ui/tree/nodes/WatchMessageNode.java | 13 ++++++++++- .../impl/ui/tree/nodes/WatchNode.java | 7 ++++-- .../impl/ui/tree/nodes/WatchesRootNode.java | 13 +++++++++-- .../XValueNodePresentationConfigurator.java | 22 ++++++++++++++++++- 7 files changed, 62 insertions(+), 7 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaDebuggerEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaDebuggerEvaluator.java index 9568cb2bfcef..1a15a5bc2335 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaDebuggerEvaluator.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaDebuggerEvaluator.java @@ -39,6 +39,7 @@ import com.intellij.xdebugger.XSourcePosition; import com.intellij.xdebugger.evaluation.EvaluationMode; import com.intellij.xdebugger.evaluation.XDebuggerEvaluator; import com.intellij.xdebugger.impl.breakpoints.XExpressionImpl; +import com.intellij.xdebugger.impl.ui.DebuggerUIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -74,6 +75,10 @@ public class JavaDebuggerEvaluator extends XDebuggerEvaluator { @Override public void threadAction() { + if (DebuggerUIUtil.isObsolete(callback)) { + return; + } + JavaDebugProcess process = myDebugProcess.getXdebugProcess(); if (process == null) { callback.errorOccurred("No debug process"); diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java index 2a9c31304755..80a37df68768 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/JavaValue.java @@ -141,6 +141,9 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider, XV @Override public void contextAction() throws Exception { + if (node.isObsolete()) { + return; + } if (!myContextSet) { myValueDescriptor.setContext(myEvaluationContext); } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerUIUtil.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerUIUtil.java index 3b876ecd65ed..79197d3f7943 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerUIUtil.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/DebuggerUIUtil.java @@ -18,7 +18,6 @@ package com.intellij.xdebugger.impl.ui; import com.intellij.codeInsight.hint.HintUtil; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.ActionManager; -import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.LogicalPosition; @@ -35,6 +34,7 @@ import com.intellij.ui.EditorTextField; import com.intellij.ui.ScreenUtil; import com.intellij.ui.awt.RelativePoint; import com.intellij.ui.popup.list.ListPopupImpl; +import com.intellij.xdebugger.Obsolescent; import com.intellij.xdebugger.XDebuggerBundle; import com.intellij.xdebugger.XDebuggerManager; import com.intellij.xdebugger.XExpression; @@ -426,4 +426,8 @@ public class DebuggerUIUtil { } return XDebuggerBundle.message("ad.extra.selection.shortcut", res.toString()); } + + public static boolean isObsolete(Object object) { + return object instanceof Obsolescent && ((Obsolescent)object).isObsolete(); + } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchMessageNode.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchMessageNode.java index 71aa2fb7fc9f..53115cd36a7b 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchMessageNode.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchMessageNode.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ import javax.swing.*; */ public class WatchMessageNode extends MessageTreeNode implements WatchNode { private final XExpression myExpression; + private volatile boolean myObsolete; private WatchMessageNode(XDebuggerTree tree, XDebuggerTreeNode parent, @NotNull XExpression expression, final Icon icon) { super(tree, parent, true); @@ -65,4 +66,14 @@ public class WatchMessageNode extends MessageTreeNode implements WatchNode { public String toString() { return myExpression.getExpression(); } + + @Override + public void setObsolete() { + myObsolete = true; + } + + @Override + public boolean isObsolete() { + return myObsolete; + } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchNode.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchNode.java index 415f94779110..54a84ac6f967 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchNode.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchNode.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ package com.intellij.xdebugger.impl.ui.tree.nodes; +import com.intellij.xdebugger.Obsolescent; import com.intellij.xdebugger.XExpression; import org.jetbrains.annotations.NotNull; @@ -23,7 +24,9 @@ import javax.swing.tree.TreeNode; /** * @author nik */ -public interface WatchNode extends TreeNode { +public interface WatchNode extends TreeNode, Obsolescent { @NotNull XExpression getExpression(); + + void setObsolete(); } \ No newline at end of file diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchesRootNode.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchesRootNode.java index 6ce8e55b597c..78172bba8c72 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchesRootNode.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/WatchesRootNode.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package com.intellij.xdebugger.impl.ui.tree.nodes; import com.intellij.util.containers.ContainerUtil; +import com.intellij.xdebugger.Obsolescent; import com.intellij.xdebugger.XDebugSession; import com.intellij.xdebugger.XExpression; import com.intellij.xdebugger.evaluation.XDebuggerEvaluator; @@ -58,6 +59,9 @@ public class WatchesRootNode extends XDebuggerTreeNode { public void updateWatches(@Nullable XDebuggerEvaluator evaluator) { myCurrentEvaluator = evaluator; List newChildren = new ArrayList(); + for (WatchNode child : myChildren) { + child.setObsolete(); + } if (evaluator != null) { for (WatchNode child : myChildren) { final XExpression expression = child.getExpression(); @@ -212,13 +216,18 @@ public class WatchesRootNode extends XDebuggerTreeNode { new WatchInplaceEditor(this, session, myWatchesView, messageNode, "watch", node).show(); } - private class MyEvaluationCallback extends XEvaluationCallbackBase { + private class MyEvaluationCallback extends XEvaluationCallbackBase implements Obsolescent { private final WatchNode myResultPlace; public MyEvaluationCallback(final @NotNull WatchNode resultPlace) { myResultPlace = resultPlace; } + @Override + public boolean isObsolete() { + return myResultPlace.isObsolete(); + } + @Override public void evaluated(@NotNull final XValue result) { DebuggerUIUtil.invokeLater(new Runnable() { diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XValueNodePresentationConfigurator.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XValueNodePresentationConfigurator.java index 536822734d86..23a9c5b597f9 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XValueNodePresentationConfigurator.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/nodes/XValueNodePresentationConfigurator.java @@ -1,12 +1,28 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.intellij.xdebugger.impl.ui.tree.nodes; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.NotNullFunction; -import com.intellij.xdebugger.frame.presentation.XRegularValuePresentation; import com.intellij.xdebugger.frame.XValueNode; +import com.intellij.xdebugger.frame.presentation.XRegularValuePresentation; import com.intellij.xdebugger.frame.presentation.XValuePresentation; +import com.intellij.xdebugger.impl.ui.DebuggerUIUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -89,6 +105,10 @@ public final class XValueNodePresentationConfigurator { @NotNull final XValuePresentation presentation, final boolean hasChildren, final ConfigurableXValueNode node) { + if (DebuggerUIUtil.isObsolete(node)) { + return; + } + Application application = ApplicationManager.getApplication(); if (application.isDispatchThread()) { node.applyPresentation(icon, presentation, hasChildren); From b916981e598ce78c74e280c7ac4b7c99c126ad3e Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Tue, 29 Dec 2015 15:03:06 +0300 Subject: [PATCH 103/105] consistency of column names in change class signature dialog --- .../src/messages/RefactoringBundle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-resources-en/src/messages/RefactoringBundle.properties b/platform/platform-resources-en/src/messages/RefactoringBundle.properties index b528efe95647..1b7cfa542cb1 100644 --- a/platform/platform-resources-en/src/messages/RefactoringBundle.properties +++ b/platform/platform-resources-en/src/messages/RefactoringBundle.properties @@ -41,7 +41,7 @@ changeSignature.no.type.for.parameter=Specify type for parameter ''{0}'' changeSignature.no.type.for.exception=Specify type for exception changeSignature.refactoring.name=Change Signature column.name.name=Name: -changeSignature.default.value.column=Default Value +changeSignature.default.value.column=Default Value: parameters.border.title=Parameters changeSignature.exceptions.panel.border.title=Exceptions changeSignature.propagate.parameters.title=Propa&gate Parameters... From f278aaa372579683ce9872355aff4a33eee995f0 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Tue, 29 Dec 2015 15:11:37 +0300 Subject: [PATCH 104/105] add '=' if attribute value is missing --- .../src/com/intellij/codeInsight/XmlTagTest.java | 14 ++++++++++++++ .../psi/impl/source/xml/XmlAttributeImpl.java | 1 + 2 files changed, 15 insertions(+) diff --git a/xml/tests/src/com/intellij/codeInsight/XmlTagTest.java b/xml/tests/src/com/intellij/codeInsight/XmlTagTest.java index 6736abbe4fe6..66be6b8a618a 100644 --- a/xml/tests/src/com/intellij/codeInsight/XmlTagTest.java +++ b/xml/tests/src/com/intellij/codeInsight/XmlTagTest.java @@ -1017,4 +1017,18 @@ public class XmlTagTest extends LightCodeInsightTestCase { } }); } + + public void testSetAttributeValue() { + XmlFile file = (XmlFile)PsiFileFactory.getInstance(getProject()).createFileFromText("dummy.xml", XmlFileType.INSTANCE, "1", 0, true); + final XmlTag tag = file.getDocument().getRootTag(); + final Document document = file.getViewProvider().getDocument(); + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + tag.setAttribute("attr", ""); + assertEquals("1", tag.getText()); + assertEquals("1", document.getText()); + } + }); + } } diff --git a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/XmlAttributeImpl.java b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/XmlAttributeImpl.java index 14beaf05ad89..a6343628cc3d 100644 --- a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/XmlAttributeImpl.java +++ b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/XmlAttributeImpl.java @@ -104,6 +104,7 @@ public class XmlAttributeImpl extends XmlElementImpl implements XmlAttribute, Hi } else { if (newValue != null) { + att.addChild(newValue.getTreePrev().copyElement()); att.addChild(newValue.copyElement()); } } From fbaa14eaa98b95450e4fb0856b393eb25eae4001 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 29 Dec 2015 14:45:57 +0100 Subject: [PATCH 105/105] [platform] more verbose FS case sensitivity diagnostic --- .../com/intellij/ide/startup/impl/StartupManagerImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.java b/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.java index 40a0baab32eb..614ac137f99a 100644 --- a/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.java @@ -256,10 +256,10 @@ public class StartupManagerImpl extends StartupManagerEx { path = PathUtil.getParentPath(path); } - boolean actual = FileUtil.isFileSystemCaseSensitive(path); - LOG.info(path + " case-sensitivity: " + actual); - if (actual != SystemInfo.isFileSystemCaseSensitive) { - int prefix = SystemInfo.isFileSystemCaseSensitive ? 1 : 0; // IDE=true -> FS=false -> prefix='in' + boolean expected = SystemInfo.isFileSystemCaseSensitive, actual = FileUtil.isFileSystemCaseSensitive(path); + LOG.info(path + " case-sensitivity: expected=" + expected + " actual=" + actual); + if (actual != expected) { + int prefix = expected ? 1 : 0; // IDE=true -> FS=false -> prefix='in' String title = ApplicationBundle.message("fs.case.sensitivity.mismatch.title"); String text = ApplicationBundle.message("fs.case.sensitivity.mismatch.message", prefix); Notifications.Bus.notify(