From cd47e72a221cc9dc8236efa2d050684b3beefc5e Mon Sep 17 00:00:00 2001 From: Zhou Renjian Date: Thu, 8 Jun 2017 19:04:50 +0800 Subject: [PATCH 01/52] Fixed bug that notifying pipe sequence back to server does not work correctly --- .../ajaxpipe/net/sf/j2s/ajax/SimplePipeRequest.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sources/net.sf.j2s.ajax/ajaxpipe/net/sf/j2s/ajax/SimplePipeRequest.java b/sources/net.sf.j2s.ajax/ajaxpipe/net/sf/j2s/ajax/SimplePipeRequest.java index 2736e4860..a3f62f472 100644 --- a/sources/net.sf.j2s.ajax/ajaxpipe/net/sf/j2s/ajax/SimplePipeRequest.java +++ b/sources/net.sf.j2s.ajax/ajaxpipe/net/sf/j2s/ajax/SimplePipeRequest.java @@ -341,10 +341,14 @@ public void run() { request.registerOnReadyStateChange(new XHRCallbackAdapter() { public void onLoaded() { String response = request.getResponseText(); - if (response != null && p.notifySequence < sequence && response.indexOf("$p1p3b$") != 0) { + if (response == null || response.length() == 0 || response.indexOf("$p1p3b$") != 0) { + // Incorrect response + return; + } + if (p.notifySequence < sequence) { p.notifySequence = sequence; } - if (response != null && response.indexOf("\"" + PIPE_STATUS_LOST + "\"") != -1) { + if (response.indexOf("\"" + PIPE_STATUS_LOST + "\"") != -1) { p.pipeAlive = false; p.pipeLost(); SimplePipeHelper.removePipe(pipeKey); From 6b734632f398db9b29fa06e6924c58e58ca0685c Mon Sep 17 00:00:00 2001 From: Nikesh Yadav Date: Fri, 16 Jun 2017 17:11:11 -0500 Subject: [PATCH 02/52] Auto stash before merge of "swingjs" and "origin/swingjs" Fixing global replacement of "new Boolean" with "Boolean.from" in transpiler --- .../sf/j2s/core/compiler/Java2ScriptCompiler.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/sources/net.sf.j2s.core/src/net/sf/j2s/core/compiler/Java2ScriptCompiler.java b/sources/net.sf.j2s.core/src/net/sf/j2s/core/compiler/Java2ScriptCompiler.java index d824aea3f..116e1254d 100644 --- a/sources/net.sf.j2s.core/src/net/sf/j2s/core/compiler/Java2ScriptCompiler.java +++ b/sources/net.sf.j2s.core/src/net/sf/j2s/core/compiler/Java2ScriptCompiler.java @@ -321,6 +321,7 @@ public static void updateJ2SMap(String prjFolder) { public static void outputJavaScript(ASTScriptVisitor visitor, DependencyASTVisitor dvisitor, CompilationUnit fRoot, String folderPath, Properties props) { String js = dvisitor.getDependencyScript(visitor.getBuffer()); + //js = js + "\n//SwingJS test " + System.currentTimeMillis() + "\n"; String lineBreak = props.getProperty("j2s.compiler.linebreak"); String whiteSpace = props.getProperty("j2s.compiler.whitespace"); String utf8Header = props.getProperty("j2s.compiler.utf8bom"); @@ -357,6 +358,18 @@ public static void outputJavaScript(ASTScriptVisitor visitor, DependencyASTVisit .replaceAll("finalVars", "v\\$") .replaceAll("\\.callbacks", "\\.b\\$") .replaceAll("\\.\\$finals", "\\.f\\$"); + + //SwingJS 6/15/2017- Trying to replace new Boolean with Boolean.from because + //new Boolean("false") returns true. + //Require implementation of Boolean.from in runtime + //javascript considers any string to be true while java only considers the string "true" + //to be true + //js = js.replaceAll("new\\ Boolean\\ ", "Boolean\\.from"); + js = js.replaceAll("new Boolean ", "Boolean.from"); + js = js + "\n\\\\Created Boolean.from js" + System.currentTimeMillis() + "\n"; + + + String abbr = props.getProperty("j2s.compiler.abbreviation"); if (abbr != null) { if (abbr.equals("true")) { From 990685770f4d5dd58acb71ea727a480f3d55ccac Mon Sep 17 00:00:00 2001 From: Zhou Renjian Date: Wed, 21 Jun 2017 15:01:22 +0800 Subject: [PATCH 03/52] Fixed bug of generating @SimpleInOut annotation does not import correct class --- .../generator/net/sf/j2s/ajax/SimpleSource4Java.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/net.sf.j2s.ajax/generator/net/sf/j2s/ajax/SimpleSource4Java.java b/sources/net.sf.j2s.ajax/generator/net/sf/j2s/ajax/SimpleSource4Java.java index 396291e28..7e9238a6d 100644 --- a/sources/net.sf.j2s.ajax/generator/net/sf/j2s/ajax/SimpleSource4Java.java +++ b/sources/net.sf.j2s.ajax/generator/net/sf/j2s/ajax/SimpleSource4Java.java @@ -685,7 +685,7 @@ private static boolean importAnnotationClasses(List fields, source.append("import ").append(SimpleIn.class.getName()).append(";\r\n"); } if (inOutAnnImported) { - source.append("import ").append(SimpleOut.class.getName()).append(";\r\n"); + source.append("import ").append(SimpleInOut.class.getName()).append(";\r\n"); } if (outAnnImported) { source.append("import ").append(SimpleOut.class.getName()).append(";\r\n"); From a40ffb56b229e8bdb8b7160f24b17ec3e2e27198 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Wed, 21 Jun 2017 11:58:40 +0200 Subject: [PATCH 04/52] gitignore "bin" folders --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..c4cd01e44 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*/*/bin From e6ad837464a49f4f5892fa7178fdeeb9ef595cf0 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Wed, 21 Jun 2017 12:16:01 +0200 Subject: [PATCH 05/52] Bug: 'net.sf.j2s.test.junit' references 'JRE System Library [j2se1.5.0_06]' The classpath of project 'net.sf.j2s.test.junit' contains a hard reference to 'JRE System Library [j2se1.5.0_06]'. Fix: use Workspace default JRE instead. --- tests/net.sf.j2s.test.junit/.classpath | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/net.sf.j2s.test.junit/.classpath b/tests/net.sf.j2s.test.junit/.classpath index bb14e726e..96ed17b3b 100644 --- a/tests/net.sf.j2s.test.junit/.classpath +++ b/tests/net.sf.j2s.test.junit/.classpath @@ -1,7 +1,6 @@ - From 6a6493911a8a820c50b0e7d4a0b49be18e6ef1b9 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Wed, 21 Jun 2017 12:32:39 +0200 Subject: [PATCH 06/52] Bug: 'net.sf.j2s.test.junit' references 'JRE System Library [j2se1.5.0_06]' The classpath of project 'net.sf.j2s.test.junit' contains a hard reference to 'JRE System Library [j2se1.5.0_06]'. Fix: use Workspace default JRE instead. --- tests/net.sf.j2s.test.junit/.classpath | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/net.sf.j2s.test.junit/.classpath b/tests/net.sf.j2s.test.junit/.classpath index 96ed17b3b..1e591daf0 100644 --- a/tests/net.sf.j2s.test.junit/.classpath +++ b/tests/net.sf.j2s.test.junit/.classpath @@ -1,7 +1,8 @@ - - - - - - - + + + + + + + + From da4c407d8468508fe9645d143dd5f539516d3507 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Wed, 21 Jun 2017 12:55:26 +0200 Subject: [PATCH 07/52] Bug: "junit.swingui cannot be resolved" error when compiling "net.sf.j2s.test.junit.WorldTest" The class "WorldTest" referenced "junit.swingui.TestRunner.run" to run "WorldTest" as a Unit test with a Swing UI. This is the only reference to "junit.swingui" in the whole project. As "WorldTest" did not do any real test (beside a "assertTrue(false)") "WorldTest " was removed, thus also fixing the bug. --- .../src/net/sf/j2s/test/junit/WorldTest.java | 28 ------------------- 1 file changed, 28 deletions(-) delete mode 100644 tests/net.sf.j2s.test.junit/src/net/sf/j2s/test/junit/WorldTest.java diff --git a/tests/net.sf.j2s.test.junit/src/net/sf/j2s/test/junit/WorldTest.java b/tests/net.sf.j2s.test.junit/src/net/sf/j2s/test/junit/WorldTest.java deleted file mode 100644 index 22cdc0a8e..000000000 --- a/tests/net.sf.j2s.test.junit/src/net/sf/j2s/test/junit/WorldTest.java +++ /dev/null @@ -1,28 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007 java2script.org and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Zhou Renjian - initial API and implementation - *******************************************************************************/ - -package net.sf.j2s.test.junit; - -import junit.framework.TestCase; - -/** - * @author zhou renjian - * - * 2006-7-21 - */ -public class WorldTest extends TestCase { - public void testWorld() { - assertTrue(false); - } - public static void main(String[] args) { - junit.swingui.TestRunner.run(WorldTest.class); - } -} From d18433981760bf6c7fe55e9d82e79330af306778 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Wed, 21 Jun 2017 13:57:26 +0200 Subject: [PATCH 08/52] Bug: "Comparing identical expressions" warnings in DoubleTest/FloatTest This is related to tests like this: assertTrue("-0d should be == 0d", 0d == -0d); I.e. the warning can be ignored, as we are explicitly checking for identical expressions. Fix: add '@SuppressWarnings("all") // "Comparing identical expressions" ...' to the methods raising the warning. --- .../src/net/sf/j2s/test/junit/DoubleTest.java | 1 + .../src/net/sf/j2s/test/junit/FloatTest.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/tests/net.sf.j2s.test.junit/src/net/sf/j2s/test/junit/DoubleTest.java b/tests/net.sf.j2s.test.junit/src/net/sf/j2s/test/junit/DoubleTest.java index 5c781308f..10672e8c8 100644 --- a/tests/net.sf.j2s.test.junit/src/net/sf/j2s/test/junit/DoubleTest.java +++ b/tests/net.sf.j2s.test.junit/src/net/sf/j2s/test/junit/DoubleTest.java @@ -392,6 +392,7 @@ public void test_doubleValue() { /** * @tests java.lang.Double#equals(java.lang.Object) */ + @SuppressWarnings("all") // "Comparing identical expressions" 0d == -0d public void test_equalsLjava_lang_Object() { // Test for method boolean java.lang.Double.equals(java.lang.Object) diff --git a/tests/net.sf.j2s.test.junit/src/net/sf/j2s/test/junit/FloatTest.java b/tests/net.sf.j2s.test.junit/src/net/sf/j2s/test/junit/FloatTest.java index 4eea3bbcf..5e190f577 100644 --- a/tests/net.sf.j2s.test.junit/src/net/sf/j2s/test/junit/FloatTest.java +++ b/tests/net.sf.j2s.test.junit/src/net/sf/j2s/test/junit/FloatTest.java @@ -202,6 +202,7 @@ public void test_doubleValue() { /** * @tests java.lang.Float#equals(java.lang.Object) */ + @SuppressWarnings("all") // "Comparing identical expressions" 0f == -0f public void test_equalsLjava_lang_Object() { // Test for method boolean java.lang.Float.equals(java.lang.Object) @@ -552,6 +553,7 @@ public void test_toStringF() { /** * @tests java.lang.Float#valueOf(java.lang.String) */ + @SuppressWarnings("all") // "Comparing identical expressions" 0.0f == -0.0f public void test_valueOfLjava_lang_String() { // Test for method java.lang.Float // java.lang.Float.valueOf(java.lang.String) From 089ad28f58079bf27d216126ccb0f913957c8605 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Wed, 21 Jun 2017 14:05:43 +0200 Subject: [PATCH 09/52] Bug: The value of the local variable ctg in J2SClasspathLabelProvider is not used --- .../src/net/sf/j2s/ui/property/J2SClasspathLabelProvider.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SClasspathLabelProvider.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SClasspathLabelProvider.java index 7fc18282e..a1c662172 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SClasspathLabelProvider.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SClasspathLabelProvider.java @@ -43,8 +43,6 @@ public Image getImage(Object element) { } else if (element instanceof CompositeResources) { return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_EXTERNAL_ARCHIVE); } else if (element instanceof J2SCategory) { - J2SCategory ctg = (J2SCategory) element; - //if (ctg) return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_EMPTY_LOGICAL_PACKAGE); } return null; From abe3d797e65d4c93a35b3b07431459e6c81761c7 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Thu, 22 Jun 2017 13:33:04 +0200 Subject: [PATCH 10/52] Doc: javadoc package 'net.sf.j2s.core.builder'; comment changes in JavaBuilder also: - extract conversion code between "Eclipse" and "Java2Script" builder States into separate methods 'toEclipseState' and 'toJava2ScriptState'. --- .../net/sf/j2s/core/builder/JavaBuilder.java | 33 ++++++++++++--- .../net/sf/j2s/core/builder/package-info.java | 41 +++++++++++++++++++ 2 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 sources/net.sf.j2s.core/src/net/sf/j2s/core/builder/package-info.java diff --git a/sources/net.sf.j2s.core/src/net/sf/j2s/core/builder/JavaBuilder.java b/sources/net.sf.j2s.core/src/net/sf/j2s/core/builder/JavaBuilder.java index 3525e61c9..cbbaae0ef 100644 --- a/sources/net.sf.j2s.core/src/net/sf/j2s/core/builder/JavaBuilder.java +++ b/sources/net.sf.j2s.core/src/net/sf/j2s/core/builder/JavaBuilder.java @@ -252,6 +252,7 @@ private void buildAll() { if (DEBUG && this.lastState != null) System.out.println("JavaBuilder: Clearing last state : " + this.lastState); //$NON-NLS-1$ clearLastState(); + // j2sChange: Instead of BatchImageBuilder use Java2ScriptBatchImageBuilder BatchImageBuilder imageBuilder = new Java2ScriptBatchImageBuilder(this, true); imageBuilder.build(); recordNewState(imageBuilder.newState); @@ -263,6 +264,7 @@ private void buildDeltas(SimpleLookupTable deltas) { if (DEBUG && this.lastState != null) System.out.println("JavaBuilder: Clearing last state : " + this.lastState); //$NON-NLS-1$ clearLastState(); // clear the previously built state so if the build fails, a full build will occur next time + // j2sChange: Instead of IncrementalImageBuilder use Java2ScriptIncrementalImageBuilder. IncrementalImageBuilder imageBuilder = new Java2ScriptIncrementalImageBuilder(this); if (imageBuilder.build(deltas)) { recordNewState(imageBuilder.newState); @@ -419,7 +421,18 @@ private SimpleLookupTable findDeltas() { } public State getLastState(IProject project) { + // j2sChange: We need to convert the "Eclipse" State to the "Java2Script" State. org.eclipse.jdt.internal.core.builder.State lastBuiltState = (org.eclipse.jdt.internal.core.builder.State) JavaModelManager.getJavaModelManager().getLastBuiltState(project, this.notifier.monitor); + return toJava2ScriptState(project, lastBuiltState); +} + +// j2sChange: convert an "Eclipse" State to a "Java2Script" State. +private State toJava2ScriptState(IProject project, org.eclipse.jdt.internal.core.builder.State lastBuiltState) { + // We use 'instance to bytes' serialization and 'bytes to instance' deserialization + // to do the conversions. + // + // (Note: casting is not an option here, as both State classes are independent.). + if (lastBuiltState == null) { return null; } @@ -785,6 +798,20 @@ private void recordNewState(State state) { if (prereqProject != null && prereqProject != this.currentProject) state.recordStructuralDependency(prereqProject, getLastState(prereqProject)); } + if (DEBUG) + System.out.println("JavaBuilder: Recording new state : " + state); //$NON-NLS-1$ + // state.dump(); + + // j2sChange: We need to convert the "Java2Script" State to the "Eclipse" State. + JavaModelManager.getJavaModelManager().setLastBuiltState(this.currentProject, toEclipseState(state)); +} + +// j2sChange: convert a "Java2Script" State to an "Eclipse" State. +private org.eclipse.jdt.internal.core.builder.State toEclipseState(State state) { + // We use 'instance to bytes' serialization and 'bytes to instance' deserialization + // to do the conversions. + // + // (Note: casting is not an option here, as both State classes are independent.). ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(baos); @@ -802,11 +829,7 @@ private void recordNewState(State state) { } catch (IOException e) { e.printStackTrace(); } - - if (DEBUG) - System.out.println("JavaBuilder: Recording new state : " + state); //$NON-NLS-1$ - // state.dump(); - JavaModelManager.getJavaModelManager().setLastBuiltState(this.currentProject, newState); + return newState; } /** diff --git a/sources/net.sf.j2s.core/src/net/sf/j2s/core/builder/package-info.java b/sources/net.sf.j2s.core/src/net/sf/j2s/core/builder/package-info.java new file mode 100644 index 000000000..6cdc64cd6 --- /dev/null +++ b/sources/net.sf.j2s.core/src/net/sf/j2s/core/builder/package-info.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * Copyright (c) 2017 java2script.org and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Udo Borkowski - initial version, based on an email memo by Zhou Renjian + * + ******************************************************************************/ + + +/** +Generate *.js files while compiling Java sources to *.class files. + +

This package is a modified copy of the Eclipse package +'org.eclipse.jdt.internal.core.builder' from +'org.eclipse.jdt.core/model' +(Git). + +

The major changes (beside the new package name +net.sf.j2s.core.builder) are in the class {@link JavaBuilder}. +The changes mainly reference several new, Java2Script-specific classes, like +{@link Java2ScriptBatchImageBuilder}, or {@link Java2ScriptIncrementalImageBuilder}. +The changes in JavaBuilder are marked with '// j2sChange: ...' comments. + +

Also notice the new *Proxy classes, like +{@link ClasspathDirectoryProxy} or {@link CompilationParticipantResultProxy}. +These *Proxy classes keep the original JDT classes unchanged as +much as possible and expose necessary inner accesses to the Java2Script builder. + +

Historical Note + +

In earlier versions of Java2Script the original JDT Core plugin was modified +to add the extension point. Therefore it was necessary to re-deploy the Eclipse +JDT Core plugin jars and restart Eclipse after installation. That approach +caused a lot of inconveniences and was drop. + */ +package net.sf.j2s.core.builder; + \ No newline at end of file From bc6425216b915bd9b4ad6111c8bb9f24fa666277 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Thu, 22 Jun 2017 17:42:18 +0200 Subject: [PATCH 11/52] Bug: warning "The value of the local variable anonClassName is not used" removed unused code. --- .../sf/j2s/core/astvisitors/ASTScriptVisitor.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java b/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java index 74af5df83..2ca149eed 100644 --- a/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java +++ b/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java @@ -672,20 +672,7 @@ public boolean visit(ClassInstanceCreation node) { buffer.append(")"); } else { ITypeBinding binding = node.resolveTypeBinding(); - String anonClassName = null; - if (binding.isAnonymous() || binding.isLocal()) { - String binaryName = binding.getBinaryName(); - if (binaryName == null) { - String bindingKey = binding.getKey(); - if (bindingKey != null) { - binaryName = bindingKey = bindingKey.substring(1, bindingKey.length() - 1).replace('/', '.'); - } - } - anonClassName = assureQualifiedName(shortenQualifiedName(binaryName)); - } else { - anonClassName = assureQualifiedName(shortenQualifiedName(binding.getQualifiedName())); - } - +// FIXME: commented-out code. To be removed after St. Olaf merge. // String baseClassName = assureQualifiedName(shortenQualifiedName(getFullClassName())); // String shortClassName = null; // int idx = anonClassName.lastIndexOf('.'); From 399b61ef01f541308e93f89465c7b49f2100566c Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Thu, 22 Jun 2017 18:09:34 +0200 Subject: [PATCH 12/52] Bug: warning "The value of the local variable details is not used" removed unused code. --- .../net/sf/j2s/core/astvisitors/Bindings.java | 37 +++---------------- 1 file changed, 6 insertions(+), 31 deletions(-) diff --git a/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/Bindings.java b/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/Bindings.java index 567071409..87b5c2b2f 100644 --- a/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/Bindings.java +++ b/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/Bindings.java @@ -50,11 +50,12 @@ private Bindings() { // No instance } - private static final boolean CHECK_CORE_BINDING_IS_EQUAL_TO; - static { - String value= Platform.getDebugOption("org.eclipse.jdt.ui/debug/checkCoreBindingIsEqualTo"); //$NON-NLS-1$ - CHECK_CORE_BINDING_IS_EQUAL_TO= value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$ - } +// FIXME: commented-out code. To be removed after St. Olaf merge. +// private static final boolean CHECK_CORE_BINDING_IS_EQUAL_TO; +// static { +// String value= Platform.getDebugOption("org.eclipse.jdt.ui/debug/checkCoreBindingIsEqualTo"); //$NON-NLS-1$ +// CHECK_CORE_BINDING_IS_EQUAL_TO= value != null && value.equalsIgnoreCase("true"); //$NON-NLS-1$ +// } // private static final boolean CHECK_CORE_BINDING_GET_JAVA_ELEMENT; // static { // String value= Platform.getDebugOption("org.eclipse.jdt.ui/debug/checkCoreBindingGetJavaElement"); //$NON-NLS-1$ @@ -86,35 +87,9 @@ public static boolean equals(IBinding b1, IBinding b2) { isEqualTo = bb1Name.equals(bb2.getBinaryName()); } } - if (CHECK_CORE_BINDING_IS_EQUAL_TO) { - boolean originalEquals= originalEquals(b1, b2); - if (originalEquals != isEqualTo) { - //String message= "Unexpected difference between Bindings.equals(..) and IBinding#isEqualTo(..)"; //$NON-NLS-1$ - String detail= "\nb1 == " + b1.getKey() + ",\nb2 == " + (b2 == null ? "null binding" : b2.getKey()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - try { - detail+= "\nb1.getJavaElement() == " + b1.getJavaElement() + ",\nb2.getJavaElement() == " + (b2 == null ? "null binding" : b2.getJavaElement().toString()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } catch (Exception e) { - detail += "\nException in getJavaElement():\n" + e; //$NON-NLS-1$ - } - //JavaPlugin.logRepeatedMessage(message, detail); - } - } return isEqualTo; } - private static boolean originalEquals(IBinding b1, IBinding b2) { - Assert.isNotNull(b1); - if (b1 == b2) - return true; - if (b2 == null) - return false; - String k1= b1.getKey(); - String k2= b2.getKey(); - if (k1 == null || k2 == null) - return false; - return k1.equals(k2); - } - /** * Checks if the two arrays of bindings have the same length and * their elements are equal. Uses From 936c41eac565d19d64a14f2c5a302ae70e13cc6e Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Thu, 22 Jun 2017 18:18:20 +0200 Subject: [PATCH 13/52] Bug: warning 'Resource leak: 'reader' is never closed' for FileUtil.java Fix: close the FileStream --- .../net/sf/j2s/core/compiler/FileUtil.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/sources/net.sf.j2s.core/src/net/sf/j2s/core/compiler/FileUtil.java b/sources/net.sf.j2s.core/src/net/sf/j2s/core/compiler/FileUtil.java index 2aa33de3e..c71878955 100644 --- a/sources/net.sf.j2s.core/src/net/sf/j2s/core/compiler/FileUtil.java +++ b/sources/net.sf.j2s.core/src/net/sf/j2s/core/compiler/FileUtil.java @@ -9,8 +9,9 @@ public class FileUtil { public static String readSource(File f) { StringBuffer sb = new StringBuffer(); + FileReader reader = null; try { - FileReader reader = new FileReader(f); + reader = new FileReader(f); char[] buf = new char[1024]; int read = reader.read(buf); while (read != -1) { @@ -21,8 +22,27 @@ public static String readSource(File f) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); + } finally { + close(reader); } return sb.toString(); } + + /** + * Close the given FileReader. + * + *

In case of an error the exception and its backtrace is written to the standard error stream. + * + * @param fileReader null or the FileReader to close + */ + public static void close(FileReader fileReader) { + if (fileReader != null) { + try { + fileReader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } } From bf8dd1fa9ac36c09f0998af512c2ad93f60d9a8b Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Thu, 22 Jun 2017 18:26:25 +0200 Subject: [PATCH 14/52] Bug: warning "The value of the local variable javaProject is not used" --- .../src/net/sf/j2s/ui/cmdline/JDTUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/incubator/net.sf.j2s.ui.cmdline/src/net/sf/j2s/ui/cmdline/JDTUtils.java b/incubator/net.sf.j2s.ui.cmdline/src/net/sf/j2s/ui/cmdline/JDTUtils.java index fbcce90b7..2a46034bf 100644 --- a/incubator/net.sf.j2s.ui.cmdline/src/net/sf/j2s/ui/cmdline/JDTUtils.java +++ b/incubator/net.sf.j2s.ui.cmdline/src/net/sf/j2s/ui/cmdline/JDTUtils.java @@ -77,7 +77,7 @@ public static IProject newProject(String projectPath, String name) if(!isAnEclipseProject) { addJavaClassPathContainer(project); - IJavaProject javaProject = JavaCore.create(project); + JavaCore.create(project); } return project; } From 3cc8794a441c96f1815f0160e4664aeeacf04611 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Thu, 22 Jun 2017 18:31:17 +0200 Subject: [PATCH 15/52] Bug: warning "Resource leak: 'reader' is never closed" in PathUtil.java --- .../src/net/sf/j2s/ui/classpath/PathUtil.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/classpath/PathUtil.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/classpath/PathUtil.java index 11e267f0b..3fec15ae4 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/classpath/PathUtil.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/classpath/PathUtil.java @@ -11,6 +11,8 @@ import java.util.List; import java.util.Properties; +import net.sf.j2s.core.compiler.FileUtil; + public class PathUtil { public static final String J2S_RESOURCES_LIST = "j2s.resources.list"; public static final String J2S_ABANDOMED_RESOURCES_LIST = "j2s.abandoned.resources.list"; @@ -147,8 +149,9 @@ public static String joinArray(String[] list, String seperator) { public static Properties loadJZ(File file) { Properties props = new Properties(); if (file.exists()) { + FileReader reader = null; try { - FileReader reader = new FileReader(file); + reader = new FileReader(file); char[] buf = new char[1024]; StringBuffer buffer = new StringBuffer(); int read = 0; @@ -184,6 +187,8 @@ public static Properties loadJZ(File file) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); + } finally { + FileUtil.close(reader); } } return props; From 675b99d8e272e972c874bd387b73b7ffdffa6af1 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Thu, 22 Jun 2017 18:38:29 +0200 Subject: [PATCH 16/52] Bug: warning "Dead code" in UnitClass.java --- .../src/net/sf/j2s/ui/classpath/UnitClass.java | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/classpath/UnitClass.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/classpath/UnitClass.java index a0bffe00c..c6e0b7bd3 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/classpath/UnitClass.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/classpath/UnitClass.java @@ -32,18 +32,8 @@ public boolean exists() { return new File(getFolder(), getRelativePath()).exists(); } public String toHTMLString() { - String bin = ""; // Class unit *.js is loaded by Clazz.load from now on. - if (true) return bin; - if (this.getParent() != null - && (this.getParent() instanceof CompositeResources)) { - CompositeResources cc = (CompositeResources) this.getParent(); - String binRelative = cc.getBinRelativePath(); - if (binRelative != null) { - bin += binRelative; - } - } - return J2SLaunchingUtil.wrapTypeJS(getClassName(), bin + getBinRelativePath()); + return ""; } public int getType() { From 76a452e88254f33bfc3001261f7fe9c434f32c29 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Thu, 22 Jun 2017 18:42:12 +0200 Subject: [PATCH 17/52] Bug: warning "The method hookContextMenu()|fillContextMenu(IMenuManager) from the type J2SConsoleView is never used locally" --- .../net/sf/j2s/ui/console/J2SConsoleView.java | 21 +------------------ 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/console/J2SConsoleView.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/console/J2SConsoleView.java index 850e74504..601c03137 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/console/J2SConsoleView.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/console/J2SConsoleView.java @@ -181,19 +181,6 @@ public void changed(LocationEvent event) { }); } - private void hookContextMenu() { - MenuManager menuMgr = new MenuManager("#PopupMenu"); - menuMgr.setRemoveAllWhenShown(true); - menuMgr.addMenuListener(new IMenuListener() { - public void menuAboutToShow(IMenuManager manager) { - J2SConsoleView.this.fillContextMenu(manager); - } - }); - Menu menu = menuMgr.createContextMenu(browser); - browser.setMenu(menu); - //getSite().registerContextMenu(menuMgr, viewer); - } - private void contributeToActionBars() { IActionBars bars = getViewSite().getActionBars(); fillLocalPullDown(bars.getMenuManager()); @@ -204,16 +191,10 @@ private void fillLocalPullDown(IMenuManager manager) { manager.add(actionReload); manager.add(new Separator()); manager.add(showAddressBarAction); +// FIXME: commented-out code. To be removed after St. Olaf merge. // manager.add(actionStop); } - private void fillContextMenu(IMenuManager manager) { - manager.add(actionReload); -// manager.add(actionStop); - // Other plug-ins can contribute there actions here - manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); - } - private void fillLocalToolBar(IToolBarManager manager) { manager.add(actionBack); manager.add(actionForward); From f02eb2a62ba6290e1d20870cbb471dce7efd40a7 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Thu, 22 Jun 2017 18:48:37 +0200 Subject: [PATCH 18/52] Bug: warning "The value of the local variable offset|length is not used" --- sources/net.sf.j2s.ui/src/net/sf/j2s/ui/generator/J2SView.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/generator/J2SView.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/generator/J2SView.java index 48234b288..93963c5eb 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/generator/J2SView.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/generator/J2SView.java @@ -378,9 +378,6 @@ protected void performLinkWithEditor() { private void doLinkWithEditor(ISelection selection) { - ITextSelection textSelection= (ITextSelection) selection; - int offset= textSelection.getOffset(); - int length= textSelection.getLength(); } /*(non-Javadoc) From 16df8f4844bb2c5c4883c012338ba2f20a707b9e Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Thu, 22 Jun 2017 18:54:55 +0200 Subject: [PATCH 19/52] Bug: warning "Null pointer access: The variable action can only be null at this location" --- .../src/net/sf/j2s/ui/console/J2SViewImages.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/console/J2SViewImages.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/console/J2SViewImages.java index 4be38955e..9e2f6fe43 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/console/J2SViewImages.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/console/J2SViewImages.java @@ -39,6 +39,9 @@ public class J2SViewImages { public static void setImageDescriptors(IAction action, String type) { if (action == null) { + return; + } + try { ImageDescriptor id= ImageDescriptor.createFromURL(makeIconFileURL("d", type)); //$NON-NLS-1$ if (id != null) @@ -52,7 +55,7 @@ public static void setImageDescriptors(IAction action, String type) { action.setHoverImageDescriptor(id); } catch (MalformedURLException e) { } - } + action.setImageDescriptor(create("e", type)); //$NON-NLS-1$ } From 17effeaf70c16707f67429fce14122efc2e12808 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Thu, 22 Jun 2017 19:00:26 +0200 Subject: [PATCH 20/52] Bug: warning "The method dispose() from the type J2SView.ListenerMix is never used locally" --- .../net.sf.j2s.ui/src/net/sf/j2s/ui/generator/J2SView.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/generator/J2SView.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/generator/J2SView.java index 93963c5eb..f984f86cb 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/generator/J2SView.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/generator/J2SView.java @@ -445,10 +445,6 @@ public ListenerMix(J2SView view) { fView= view; } - public void dispose() { - fView= null; - } - public void selectionChanged(IWorkbenchPart part, ISelection selection) { if (fASTViewVisible) { fView.handleEditorPostSelectionChanged(part, selection); From 95840eff16dd81be2e7feed313a762ec78af2ca3 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Sat, 24 Jun 2017 00:59:54 +0200 Subject: [PATCH 21/52] Bug: warning "The value of the field ExportJ2SAppWizard.selection is not used" --- .../src/net/sf/j2s/ui/wizards/ExportJ2SAppWizard.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/wizards/ExportJ2SAppWizard.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/wizards/ExportJ2SAppWizard.java index 294d7c565..d3261984d 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/wizards/ExportJ2SAppWizard.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/wizards/ExportJ2SAppWizard.java @@ -23,7 +23,6 @@ */ public class ExportJ2SAppWizard extends Wizard implements IExportWizard { - private IStructuredSelection selection; /** * */ @@ -44,7 +43,6 @@ public boolean performFinish() { * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection) */ public void init(IWorkbench workbench, IStructuredSelection selection) { - this.selection = selection; setWindowTitle("Java2Script Export"); } From 6bce2a4d62dc2bcc5c447b9f69b4e6328364a18c Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Sat, 24 Jun 2017 01:04:33 +0200 Subject: [PATCH 22/52] Bug: warning "The method resetStore() from the type J2STemplateManager is never used locally" --- .../sf/j2s/ui/launching/template/J2STemplateManager.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/template/J2STemplateManager.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/template/J2STemplateManager.java index bcd2b156c..e892e7547 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/template/J2STemplateManager.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/template/J2STemplateManager.java @@ -135,11 +135,5 @@ public String[] listTemplateNames() throws Exception { } return tnames; } - - /** only for debug porpuses - * @throws IOException */ - private void resetStore() throws IOException { - getStore().setValue(PREFS_KEYFILE, ""); - } - + } \ No newline at end of file From 611a6bcd5759cdd020c15dc1a29e40a9b185b294 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Sun, 25 Jun 2017 12:23:16 +0200 Subject: [PATCH 23/52] Bug: warning "The method createSuggestionsFromOpenDocument(ITextViewer, int, String) from the type J2SProposalProcessor is never used locally" also: - document origin of J2SProposalProcessor --- .../ui/text/javadoc/J2SProposalProcessor.java | 628 +++++++++--------- .../sf/j2s/ui/text/javadoc/package-info.java | 25 + 2 files changed, 330 insertions(+), 323 deletions(-) create mode 100644 sources/net.sf.j2s.ui/src/net/sf/j2s/ui/text/javadoc/package-info.java diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/text/javadoc/J2SProposalProcessor.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/text/javadoc/J2SProposalProcessor.java index 67b63762e..a628c9e1c 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/text/javadoc/J2SProposalProcessor.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/text/javadoc/J2SProposalProcessor.java @@ -1,324 +1,306 @@ -/******************************************************************************* - * Copyright (c) 2005, 2006 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - * Genady Beryozkin, me@genady.org - #getSuggestions implementation copied from HippieCompleteAction - *******************************************************************************/ -package net.sf.j2s.ui.text.javadoc; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; - -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; - -import org.eclipse.jdt.internal.ui.SharedImages; -import org.eclipse.jdt.ui.ISharedImages; -import org.eclipse.jdt.ui.JavaUI; -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.jface.text.DocumentEvent; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IInformationControlCreator; -import org.eclipse.jface.text.ITextViewer; -import org.eclipse.jface.text.contentassist.ICompletionProposal; -import org.eclipse.jface.text.contentassist.ICompletionProposalExtension; -import org.eclipse.jface.text.contentassist.ICompletionProposalExtension2; -import org.eclipse.jface.text.contentassist.ICompletionProposalExtension3; -import org.eclipse.jface.text.contentassist.ICompletionProposalExtension4; -import org.eclipse.jface.text.contentassist.IContentAssistProcessor; -import org.eclipse.jface.text.contentassist.IContextInformation; -import org.eclipse.jface.text.contentassist.IContextInformationValidator; - -import org.eclipse.ui.IEditorInput; -import org.eclipse.ui.IEditorPart; -import org.eclipse.ui.IEditorReference; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.internal.texteditor.HippieCompletionEngine; -import org.eclipse.ui.texteditor.ITextEditor; - -/** - * A completion proposal computer for hippie word completions. - *

- * Clients may instantiate. - *

- * - * @since 3.2 - */ -public final class J2SProposalProcessor implements IContentAssistProcessor { - - private static final ICompletionProposal[] NO_PROPOSALS= new ICompletionProposal[0]; - private static final IContextInformation[] NO_CONTEXTS= new IContextInformation[0]; - - private static final class Proposal implements ICompletionProposal, ICompletionProposalExtension, ICompletionProposalExtension2, ICompletionProposalExtension3, ICompletionProposalExtension4 { - - private final String fString; - private final String fPrefix; - private final int fOffset; - - /** - * - * @param string - * @param prefix - * @param offset - * @j - */ - public Proposal(String string, String prefix, int offset) { - fString= string; - fPrefix= prefix; - fOffset= offset; - } - - public void apply(IDocument document) { - apply(null, '\0', 0, fOffset); - } - - public Point getSelection(IDocument document) { - return new Point(fOffset + fString.length(), 0); - } - - public String getAdditionalProposalInfo() { - return null; - } - - public String getDisplayString() { - return fPrefix + fString; - } - - public Image getImage() { - return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_JAVADOCTAG); - } - - public IContextInformation getContextInformation() { - return null; - } - - public void apply(IDocument document, char trigger, int offset) { - try { - String replacement= fString.substring(offset - fOffset); - document.replace(offset, 0, replacement); - } catch (BadLocationException x) { - // TODO Auto-generated catch block - x.printStackTrace(); - } - } - - public boolean isValidFor(IDocument document, int offset) { - return validate(document, offset, null); - } - - public char[] getTriggerCharacters() { - return null; - } - - public int getContextInformationPosition() { - return 0; - } - - public void apply(ITextViewer viewer, char trigger, int stateMask, int offset) { - apply(viewer.getDocument(), trigger, offset); - } - - public void selected(ITextViewer viewer, boolean smartToggle) { - } - - public void unselected(ITextViewer viewer) { - } - - public boolean validate(IDocument document, int offset, DocumentEvent event) { - try { - int prefixStart= fOffset - fPrefix.length(); - return offset >= fOffset && offset < fOffset + fString.length() && document.get(prefixStart, offset - (prefixStart)).equals((fPrefix + fString).substring(0, offset - prefixStart)); - } catch (BadLocationException x) { - return false; - } - } - - public IInformationControlCreator getInformationControlCreator() { - return null; - } - - public CharSequence getPrefixCompletionText(IDocument document, int completionOffset) { - return fPrefix + fString; - } - - public int getPrefixCompletionStart(IDocument document, int completionOffset) { - return fOffset - fPrefix.length(); - } - - public boolean isAutoInsertable() { - return true; - } - - } - - private final HippieCompletionEngine fEngine= new HippieCompletionEngine(); - +/******************************************************************************* + * Copyright (c) 2005, 2006 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + * Genady Beryozkin, me@genady.org - #getSuggestions implementation copied from HippieCompleteAction + *******************************************************************************/ +package net.sf.j2s.ui.text.javadoc; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; + +import org.eclipse.jdt.internal.ui.SharedImages; +import org.eclipse.jdt.ui.ISharedImages; +import org.eclipse.jdt.ui.JavaUI; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.DocumentEvent; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IInformationControlCreator; +import org.eclipse.jface.text.ITextViewer; +import org.eclipse.jface.text.contentassist.ICompletionProposal; +import org.eclipse.jface.text.contentassist.ICompletionProposalExtension; +import org.eclipse.jface.text.contentassist.ICompletionProposalExtension2; +import org.eclipse.jface.text.contentassist.ICompletionProposalExtension3; +import org.eclipse.jface.text.contentassist.ICompletionProposalExtension4; +import org.eclipse.jface.text.contentassist.IContentAssistProcessor; +import org.eclipse.jface.text.contentassist.IContextInformation; +import org.eclipse.jface.text.contentassist.IContextInformationValidator; + +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IEditorReference; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.internal.texteditor.HippieCompletionEngine; +import org.eclipse.ui.texteditor.ITextEditor; + +/** + * A completion proposal computer for hippie word completions. + *

+ * Clients may instantiate. + *

+ * + * @since 3.2 + */ +public final class J2SProposalProcessor implements IContentAssistProcessor { + + private static final ICompletionProposal[] NO_PROPOSALS= new ICompletionProposal[0]; + private static final IContextInformation[] NO_CONTEXTS= new IContextInformation[0]; + + private static final class Proposal implements ICompletionProposal, ICompletionProposalExtension, ICompletionProposalExtension2, ICompletionProposalExtension3, ICompletionProposalExtension4 { + + private final String fString; + private final String fPrefix; + private final int fOffset; + + /** + * + * @param string + * @param prefix + * @param offset + * @j + */ + public Proposal(String string, String prefix, int offset) { + fString= string; + fPrefix= prefix; + fOffset= offset; + } + + public void apply(IDocument document) { + apply(null, '\0', 0, fOffset); + } + + public Point getSelection(IDocument document) { + return new Point(fOffset + fString.length(), 0); + } + + public String getAdditionalProposalInfo() { + return null; + } + + public String getDisplayString() { + return fPrefix + fString; + } + + public Image getImage() { + return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_JAVADOCTAG); + } + + public IContextInformation getContextInformation() { + return null; + } + + public void apply(IDocument document, char trigger, int offset) { + try { + String replacement= fString.substring(offset - fOffset); + document.replace(offset, 0, replacement); + } catch (BadLocationException x) { + // TODO Auto-generated catch block + x.printStackTrace(); + } + } + + public boolean isValidFor(IDocument document, int offset) { + return validate(document, offset, null); + } + + public char[] getTriggerCharacters() { + return null; + } + + public int getContextInformationPosition() { + return 0; + } + + public void apply(ITextViewer viewer, char trigger, int stateMask, int offset) { + apply(viewer.getDocument(), trigger, offset); + } + + public void selected(ITextViewer viewer, boolean smartToggle) { + } + + public void unselected(ITextViewer viewer) { + } + + public boolean validate(IDocument document, int offset, DocumentEvent event) { + try { + int prefixStart= fOffset - fPrefix.length(); + return offset >= fOffset && offset < fOffset + fString.length() && document.get(prefixStart, offset - (prefixStart)).equals((fPrefix + fString).substring(0, offset - prefixStart)); + } catch (BadLocationException x) { + return false; + } + } + + public IInformationControlCreator getInformationControlCreator() { + return null; + } + + public CharSequence getPrefixCompletionText(IDocument document, int completionOffset) { + return fPrefix + fString; + } + + public int getPrefixCompletionStart(IDocument document, int completionOffset) { + return fOffset - fPrefix.length(); + } + + public boolean isAutoInsertable() { + return true; + } + + } + + private final HippieCompletionEngine fEngine= new HippieCompletionEngine(); + + /** + * Creates a new hippie completion proposal computer. + */ + public J2SProposalProcessor() { + } + + /* + * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeCompletionProposals(org.eclipse.jface.text.ITextViewer, int) + */ + public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) { + try { + String prefix= getPrefix(viewer, offset); +// if (prefix == null || prefix.length() == 0) +// return NO_PROPOSALS; + + List suggestions= getSuggestions(viewer, offset, prefix); + + List result= new ArrayList(); + for (Iterator it= suggestions.iterator(); it.hasNext();) { + String string= (String) it.next(); + if (string.length() > 0) + result.add(createProposal(string, prefix, offset)); + } + + return (ICompletionProposal[]) result.toArray(new ICompletionProposal[result.size()]); + + } catch (BadLocationException x) { + // ignore and return no proposals + return NO_PROPOSALS; + } + } + + private String getPrefix(ITextViewer viewer, int offset) throws BadLocationException { + IDocument doc= viewer.getDocument(); + if (doc == null || offset > doc.getLength()) + return null; + + int length= 0; + while (--offset >= 0 && Character.isJavaIdentifierPart(doc.getChar(offset))) + length++; + + return doc.get(offset + 1, length); + } + + private ICompletionProposal createProposal(String string, String prefix, int offset) { + return new Proposal(string, prefix, offset); + } + + /* + * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeContextInformation(org.eclipse.jface.text.ITextViewer, int) + */ + public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) { + // no context informations for hippie completions + return NO_CONTEXTS; + } + + /* + * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getCompletionProposalAutoActivationCharacters() + */ + public char[] getCompletionProposalAutoActivationCharacters() { + return null; + } + + /* + * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getContextInformationAutoActivationCharacters() + */ + public char[] getContextInformationAutoActivationCharacters() { + return null; + } + + /* + * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getContextInformationValidator() + */ + public IContextInformationValidator getContextInformationValidator() { + return null; + } + /** - * Creates a new hippie completion proposal computer. - */ - public J2SProposalProcessor() { - } - - /* - * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeCompletionProposals(org.eclipse.jface.text.ITextViewer, int) - */ - public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) { - try { - String prefix= getPrefix(viewer, offset); -// if (prefix == null || prefix.length() == 0) -// return NO_PROPOSALS; - - List suggestions= getSuggestions(viewer, offset, prefix); - - List result= new ArrayList(); - for (Iterator it= suggestions.iterator(); it.hasNext();) { - String string= (String) it.next(); - if (string.length() > 0) - result.add(createProposal(string, prefix, offset)); - } - - return (ICompletionProposal[]) result.toArray(new ICompletionProposal[result.size()]); - - } catch (BadLocationException x) { - // ignore and return no proposals - return NO_PROPOSALS; - } - } - - private String getPrefix(ITextViewer viewer, int offset) throws BadLocationException { - IDocument doc= viewer.getDocument(); - if (doc == null || offset > doc.getLength()) - return null; - - int length= 0; - while (--offset >= 0 && Character.isJavaIdentifierPart(doc.getChar(offset))) - length++; - - return doc.get(offset + 1, length); - } - - private ICompletionProposal createProposal(String string, String prefix, int offset) { - return new Proposal(string, prefix, offset); - } - - /* - * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeContextInformation(org.eclipse.jface.text.ITextViewer, int) - */ - public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) { - // no context informations for hippie completions - return NO_CONTEXTS; - } - - /* - * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getCompletionProposalAutoActivationCharacters() - */ - public char[] getCompletionProposalAutoActivationCharacters() { - return null; - } - - /* - * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getContextInformationAutoActivationCharacters() - */ - public char[] getContextInformationAutoActivationCharacters() { - return null; - } - - /* - * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getContextInformationValidator() - */ - public IContextInformationValidator getContextInformationValidator() { - return null; - } - - /** - * Return the list of suggestions from the current document. First the - * document is searched backwards from the caret position and then forwards. - * - * @param offset - * @param viewer - * @param prefix the completion prefix - * @return all possible completions that were found in the current document - * @throws BadLocationException if accessing the document fails - */ - private ArrayList createSuggestionsFromOpenDocument(ITextViewer viewer, int offset, String prefix) throws BadLocationException { - IDocument document= viewer.getDocument(); - ArrayList completions= new ArrayList(); - completions.addAll(fEngine.getCompletionsBackwards(document, prefix, offset)); - completions.addAll(fEngine.getCompletionsForward(document, prefix, offset - prefix.length(), true)); - - return completions; - } - - /** - * Create the array of suggestions. It scans all open text editors and - * prefers suggestions from the currently open editor. It also adds the - * empty suggestion at the end. - * - * @param viewer - * @param offset - * @param prefix the prefix to search for - * @return the list of all possible suggestions in the currently open - * editors - * @throws BadLocationException if accessing the current document fails - */ - private List getSuggestions(ITextViewer viewer, int offset, String prefix) throws BadLocationException { - List list = new ArrayList(); - String[] tags = new String[IJavaDocTagConstants.JAVADOC_GENERAL_TAGS.length]; - for (int i = 0; i < tags.length; i++) { - tags[i] = IJavaDocTagConstants.JAVADOC_GENERAL_TAGS[i].substring(1); - } - if (prefix.length() == 0) { - IDocument doc= viewer.getDocument(); - String last = doc.get(offset - 1, 1); - if (last.charAt(0) != '@') { - return list; - } - } - for (int i = 0; i < tags.length; i++) { - if (tags[i].startsWith(prefix)) { - list.add(tags[i].substring(prefix.length())); - } - } - return list; - - /* - ArrayList suggestions= createSuggestionsFromOpenDocument(viewer, offset, prefix); - IDocument currentDocument= viewer.getDocument(); - - IWorkbenchWindow window= PlatformUI.getWorkbench().getActiveWorkbenchWindow(); - IEditorReference editorReferences[]= window.getActivePage().getEditorReferences(); - - for (int i= 0; i < editorReferences.length; i++) { - IEditorPart editor= editorReferences[i].getEditor(false); // don't create! - if (editor instanceof ITextEditor) { - ITextEditor textEditor= (ITextEditor) editor; - IEditorInput input= textEditor.getEditorInput(); - IDocument doc= textEditor.getDocumentProvider().getDocument(input); - if (!currentDocument.equals(doc)) - suggestions.addAll(fEngine.getCompletionsForward(doc, prefix, 0, false)); - } - } - // add the empty suggestion - suggestions.add(""); //$NON-NLS-1$ - - List uniqueSuggestions= fEngine.makeUnique(suggestions); - - return uniqueSuggestions; - */ - } - - /* - * @see org.eclipse.jface.text.contentassist.ICompletionProposalComputer#getErrorMessage() - */ - public String getErrorMessage() { - return null; // no custom error message - } -} + * Create the array of suggestions. It scans all open text editors and + * prefers suggestions from the currently open editor. It also adds the + * empty suggestion at the end. + * + * @param viewer + * @param offset + * @param prefix the prefix to search for + * @return the list of all possible suggestions in the currently open + * editors + * @throws BadLocationException if accessing the current document fails + */ + private List getSuggestions(ITextViewer viewer, int offset, String prefix) throws BadLocationException { + List list = new ArrayList(); + String[] tags = new String[IJavaDocTagConstants.JAVADOC_GENERAL_TAGS.length]; + for (int i = 0; i < tags.length; i++) { + tags[i] = IJavaDocTagConstants.JAVADOC_GENERAL_TAGS[i].substring(1); + } + if (prefix.length() == 0) { + IDocument doc= viewer.getDocument(); + String last = doc.get(offset - 1, 1); + if (last.charAt(0) != '@') { + return list; + } + } + for (int i = 0; i < tags.length; i++) { + if (tags[i].startsWith(prefix)) { + list.add(tags[i].substring(prefix.length())); + } + } + return list; + + // FIXME: commented-out code. To be removed after St. Olaf merge. + /* + ArrayList suggestions= createSuggestionsFromOpenDocument(viewer, offset, prefix); + IDocument currentDocument= viewer.getDocument(); + + IWorkbenchWindow window= PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + IEditorReference editorReferences[]= window.getActivePage().getEditorReferences(); + + for (int i= 0; i < editorReferences.length; i++) { + IEditorPart editor= editorReferences[i].getEditor(false); // don't create! + if (editor instanceof ITextEditor) { + ITextEditor textEditor= (ITextEditor) editor; + IEditorInput input= textEditor.getEditorInput(); + IDocument doc= textEditor.getDocumentProvider().getDocument(input); + if (!currentDocument.equals(doc)) + suggestions.addAll(fEngine.getCompletionsForward(doc, prefix, 0, false)); + } + } + // add the empty suggestion + suggestions.add(""); //$NON-NLS-1$ + + List uniqueSuggestions= fEngine.makeUnique(suggestions); + + return uniqueSuggestions; + */ + } + + /* + * @see org.eclipse.jface.text.contentassist.ICompletionProposalComputer#getErrorMessage() + */ + public String getErrorMessage() { + return null; // no custom error message + } +} diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/text/javadoc/package-info.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/text/javadoc/package-info.java new file mode 100644 index 000000000..58ea8ce84 --- /dev/null +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/text/javadoc/package-info.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2017 java2script.org and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Udo Borkowski - initial version + * + ******************************************************************************/ + + +/** +Support Code Completion in Java2Script JavaDocs. + +

{@link J2SProposalProcessor} is based on org.eclipse.ui.texteditor.HippieProposalProcessor +in org.eclipse.ui.workbench.texteditor from eclipse.platform.text. + +

{@link J2SProposalComputer} is based on org.eclipse.jdt.internal.ui.text.java.HippieProposalComputer +in org.eclipse.jdt.ui from eclipse.jdt.ui. + + */ +package net.sf.j2s.ui.text.javadoc; + \ No newline at end of file From 6867aacd401b682fef665917839d87b9df13008f Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Sun, 25 Jun 2017 12:36:56 +0200 Subject: [PATCH 24/52] Bug: warning "The value of the field J2SProposalProcessor.fEngine is not used" --- .../src/net/sf/j2s/ui/text/javadoc/J2SProposalProcessor.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/text/javadoc/J2SProposalProcessor.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/text/javadoc/J2SProposalProcessor.java index a628c9e1c..898947e4c 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/text/javadoc/J2SProposalProcessor.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/text/javadoc/J2SProposalProcessor.java @@ -159,8 +159,6 @@ public boolean isAutoInsertable() { } - private final HippieCompletionEngine fEngine= new HippieCompletionEngine(); - /** * Creates a new hippie completion proposal computer. */ From fe54c5137e058c3b04c9b859ac26f0d5ed315dbe Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Sun, 25 Jun 2017 12:39:09 +0200 Subject: [PATCH 25/52] Bug: warning "The value of the local variable filter is not used" in J2SAddInnerJarAction.java --- .../src/net/sf/j2s/ui/property/J2SAddInnerJarAction.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SAddInnerJarAction.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SAddInnerJarAction.java index 0cfca1aff..5618c93d5 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SAddInnerJarAction.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SAddInnerJarAction.java @@ -73,7 +73,6 @@ public J2SAddInnerJarAction(J2SConfigPage page) { } public void widgetSelected(SelectionEvent e) { - ViewerFilter filter= new ArchiveFilter(new ArrayList()); IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); String rootPath = root.getLocation().toOSString(); String rootTruePath = new File(rootPath).getAbsolutePath(); @@ -178,7 +177,6 @@ protected TreeViewer createTreeViewer(Composite parent) { dialog.setValidator(validator); dialog.setTitle("Libraries Selection"); //$NON-NLS-1$ dialog.setMessage("Choose libraries (*.j2x)"); //$NON-NLS-1$ -// dialog.addFilter(filter); List rr = page.classpathModel.resources; List al = new ArrayList(rr.size()); for (Iterator iter = rr.iterator(); iter.hasNext();) { From 460d3ad7bb9ed5e9b4ed0ed7efb52aaec2bd1dfb Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Sun, 25 Jun 2017 12:43:24 +0200 Subject: [PATCH 26/52] Bug: warning "The value of the local variable project is not used" in J2SAddInnerJarAction.java --- .../src/net/sf/j2s/ui/property/J2SAddInnerJarAction.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SAddInnerJarAction.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SAddInnerJarAction.java index 5618c93d5..4a65c27f1 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SAddInnerJarAction.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SAddInnerJarAction.java @@ -85,7 +85,6 @@ public void widgetSelected(SelectionEvent e) { } prjName = j2sPath.substring(0, j2sPath.indexOf(File.separatorChar)); } - final IProject project = (prjName != null) ? root.getProject(prjName) : null; ILabelProvider lp= new LabelProvider() { public String getText(Object element) { From 88be00fb6bdaa9560fe171f63faf905e1d9528dd Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Sun, 25 Jun 2017 12:46:22 +0200 Subject: [PATCH 27/52] Bug: warning "The value of the local variable prjName is not used" in J2SAddInnerJarAction.java --- .../sf/j2s/ui/property/J2SAddInnerJarAction.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SAddInnerJarAction.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SAddInnerJarAction.java index 4a65c27f1..6104fc5fa 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SAddInnerJarAction.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SAddInnerJarAction.java @@ -73,23 +73,10 @@ public J2SAddInnerJarAction(J2SConfigPage page) { } public void widgetSelected(SelectionEvent e) { - IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); - String rootPath = root.getLocation().toOSString(); - String rootTruePath = new File(rootPath).getAbsolutePath(); - String j2sPath = page.j2sFile.getAbsolutePath(); - String prjName = null; - if (j2sPath.startsWith(rootTruePath)) { - j2sPath = j2sPath.substring(rootTruePath.length()); - if (j2sPath.startsWith(File.separator)) { - j2sPath = j2sPath.substring(1); - } - prjName = j2sPath.substring(0, j2sPath.indexOf(File.separatorChar)); - } ILabelProvider lp= new LabelProvider() { public String getText(Object element) { if (element instanceof J2SLibrary[]) { - //J2SLibrary[] libs = (J2SLibrary[]) element; return "Inner JS Library"; } else if (element instanceof J2SLibrary) { J2SLibrary lib = (J2SLibrary) element; From f8355e200f5350d0c1229daa955ee2e7708a15bf Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Sun, 25 Jun 2017 12:50:44 +0200 Subject: [PATCH 28/52] Bug: warning "The value of the local variable status is not used" in J2SAddProjectAction.java --- .../src/net/sf/j2s/ui/property/J2SAddProjectAction.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SAddProjectAction.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SAddProjectAction.java index febf9dfb7..5ff2c0c19 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SAddProjectAction.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/property/J2SAddProjectAction.java @@ -120,7 +120,6 @@ public void widgetSelected(SelectionEvent e) { List projects = getPossibleAdditions(); ProjectSelectionDialog dialog= new ProjectSelectionDialog(page.getShell(),projects); dialog.setTitle(ActionMessages.AddProjectAction_Project_Selection_2); - MultiStatus status = new MultiStatus(JDIDebugUIPlugin.getUniqueIdentifier(), IJavaDebugUIConstants.INTERNAL_ERROR, "One or more exceptions occurred while adding projects.", null); //$NON-NLS-1$ if (dialog.open() == Window.OK) { Object[] expandedElements = page.viewer.getExpandedElements(); From c55c63ad6f1d157a315ab7b849e43de4071b6baa Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Sun, 25 Jun 2017 12:52:29 +0200 Subject: [PATCH 29/52] Bug: warning "The value of the local variable font is not used" in J2SClasspathOptionTab.java --- .../src/net/sf/j2s/ui/launching/J2SClasspathOptionTab.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/J2SClasspathOptionTab.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/J2SClasspathOptionTab.java index 6081462fe..237f7a6e2 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/J2SClasspathOptionTab.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/J2SClasspathOptionTab.java @@ -63,7 +63,6 @@ public class J2SClasspathOptionTab extends AbstractLaunchConfigurationTab { * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite) */ public void createControl(Composite parent) { - Font font = parent.getFont(); Composite comp = new Composite(parent, SWT.NONE); setControl(comp); From 03103b1cc26cc150428823e44785683b7d1901c4 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Sun, 25 Jun 2017 12:53:35 +0200 Subject: [PATCH 30/52] Bug: warning "The value of the local variable useDefault is not used" in J2SClasspathOptionTab.java --- .../src/net/sf/j2s/ui/launching/J2SClasspathOptionTab.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/J2SClasspathOptionTab.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/J2SClasspathOptionTab.java index 237f7a6e2..de2c6aec0 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/J2SClasspathOptionTab.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/J2SClasspathOptionTab.java @@ -194,12 +194,6 @@ public void performApply(ILaunchConfigurationWorkingCopy configuration) { IProject project = javaProject.getProject(); String prjFolder = project.getLocation().toOSString(); File workingDir = new File(prjFolder); - boolean useDefault = true; - try { - useDefault = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH, true); - } catch (CoreException e) { - //JDIDebugUIPlugin.log(e); - } String path = javaProject.getOutputLocation().toString(); int idx = path.indexOf('/', 2); String relativePath = null; From ba759d8a44dbddbe73f9f14062641f26a12ffbb9 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Sun, 25 Jun 2017 12:55:04 +0200 Subject: [PATCH 31/52] Bug: warning "The value of the local variable isViewFast is not used" in J2SApplicationRunnable.java --- .../src/net/sf/j2s/ui/launching/J2SApplicationRunnable.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/J2SApplicationRunnable.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/J2SApplicationRunnable.java index 10e9189a8..d920d4384 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/J2SApplicationRunnable.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/J2SApplicationRunnable.java @@ -30,7 +30,6 @@ public J2SApplicationRunnable(ILaunchConfiguration configuration, String url) { public void run() { boolean isToViewInConsole = true; - boolean isViewFast = false; boolean isViewMaximize = false; try { IPreferenceStore store = Java2ScriptUIPlugin.getDefault().getPreferenceStore(); @@ -41,8 +40,6 @@ public void run() { IJ2SLauchingConfiguration.VIEW_IN_INNER_J2S_CONSOLE, preferred); isViewMaximize = configuration.getAttribute( IJ2SLauchingConfiguration.MAXIMIZE_J2S_CONSOLE, false); - isViewFast = configuration.getAttribute( - IJ2SLauchingConfiguration.FAST_VIEW_J2S_CONSOLE, false); } catch (CoreException e1) { e1.printStackTrace(); } From 79034dadd58dabb7d728f03e6a9e0b8c432d4343 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Sun, 25 Jun 2017 12:57:13 +0200 Subject: [PATCH 32/52] Bug: warning "The value of the local variable ref is not used" in J2SApplicationRunnable.java --- .../src/net/sf/j2s/ui/launching/J2SApplicationRunnable.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/J2SApplicationRunnable.java b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/J2SApplicationRunnable.java index d920d4384..a7028c9c8 100644 --- a/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/J2SApplicationRunnable.java +++ b/sources/net.sf.j2s.ui/src/net/sf/j2s/ui/launching/J2SApplicationRunnable.java @@ -77,12 +77,6 @@ public void run() { J2SConsoleView j2sConsole = (J2SConsoleView) console; IWorkbenchPage page = j2sConsole.getViewSite().getWorkbenchWindow() .getActivePage(); - WorkbenchPage wp = (WorkbenchPage) page; - IViewReference ref = wp - .findViewReference("net.sf.j2s.ui.console.J2SConsoleView"); -// if (isViewFast && !wp.isFastView(ref)) { -// wp.addFastView(ref); -// } page.activate(j2sConsole); j2sConsole.setFocus(); if (isViewMaximize) { From f0c5e2035f8722283694c07172f0accc3083a365 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Sun, 25 Jun 2017 16:54:43 +0200 Subject: [PATCH 33/52] Bug: error "Could not find net.sf.j2s.lib.build.SmartJSCompressor..." when building j2slib Steps to reproduce ------------------ In a terminal - cd to "sources/net.sf.j2s.lib" - run "ant -f build/build.xml" ant fails with this error trace: > j2s.pack.core: > [java] Could not find net.sf.j2s.lib.build.SmartJSCompressor. Make sure you have it in your classpath > [java] at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:139) > [java] at org.apache.tools.ant.taskdefs.Java.run(Java.java:772) > [java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:222) > [java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:136) > [java] at org.apache.tools.ant.taskdefs.Java.execute(Java.java:109) > [java] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:293) > [java] at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) > [java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > [java] at java.lang.reflect.Method.invoke(Method.java:498) > [java] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) > [java] at org.apache.tools.ant.Task.perform(Task.java:348) > [java] at org.apache.tools.ant.Target.execute(Target.java:435) > [java] at org.apache.tools.ant.Target.performTasks(Target.java:456) > [java] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1405) > [java] at org.apache.tools.ant.Project.executeTarget(Project.java:1376) > [java] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) > [java] at org.apache.tools.ant.Project.executeTargets(Project.java:1260) > [java] at org.apache.tools.ant.Main.runBuild(Main.java:853) > [java] at org.apache.tools.ant.Main.startAnt(Main.java:235) > [java] at org.apache.tools.ant.launch.Launcher.run(Launcher.java:285) > [java] at org.apache.tools.ant.launch.Launcher.main(Launcher.java:112) > [java] Java Result: -1 > ... Solution -------- In the "build.xml" the value of the property "workspace.base" was a hard-coded, absolute path "/workspace/..." > This fails in settings that have installed the java2script sources differently. Changing it (back) to > fixed that issue. (The new statement already existed in build.xml, commented-out as the line above the buggy statement.) --- sources/net.sf.j2s.lib/build/build.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sources/net.sf.j2s.lib/build/build.xml b/sources/net.sf.j2s.lib/build/build.xml index 9b2981051..eb68db772 100644 --- a/sources/net.sf.j2s.lib/build/build.xml +++ b/sources/net.sf.j2s.lib/build/build.xml @@ -11,8 +11,7 @@ Building j2s-core-*.z.js - - + From 7a0a031bdfa6b4a05bb242fa4db187b4c97ae719 Mon Sep 17 00:00:00 2001 From: hansonr Date: Mon, 26 Jun 2017 13:19:38 -0500 Subject: [PATCH 34/52] Switch in visit(MethodInvocation); Java 1.7 --- .../.settings/org.eclipse.jdt.core.prefs | 24 ++-- .../core/astvisitors/ASTScriptVisitor.java | 107 ++++++++++++------ 2 files changed, 84 insertions(+), 47 deletions(-) diff --git a/sources/net.sf.j2s.core/.settings/org.eclipse.jdt.core.prefs b/sources/net.sf.j2s.core/.settings/org.eclipse.jdt.core.prefs index a34770859..d17b6724d 100644 --- a/sources/net.sf.j2s.core/.settings/org.eclipse.jdt.core.prefs +++ b/sources/net.sf.j2s.core/.settings/org.eclipse.jdt.core.prefs @@ -1,12 +1,12 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.5 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java b/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java index b0da65f26..5712123bc 100644 --- a/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java +++ b/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java @@ -468,19 +468,19 @@ public boolean visit(AnonymousClassDeclaration node) { methodBuffer = buffer; methodBuffer.append(methods); buffer = tmpBuffer; -//SwingJS 6/14/17- Imported from master branch -// ITypeBinding declareClass = binding; -// boolean prefixed = false; -// while (declareClass != null) { -// if (!declareClass.isAnonymous()) { -// buffer.append(declareClass.getQualifiedName()); -// prefixed = true; -// } -// break; -// declareClass = declareClass.getDeclaringClass(); -// } -// if (!prefixed) { - String packageName = ((ASTPackageVisitor) getAdaptable(ASTPackageVisitor.class)).getPackageName(); +//SwingJS 6/14/17- Imported from master branch +// ITypeBinding declareClass = binding; +// boolean prefixed = false; +// while (declareClass != null) { +// if (!declareClass.isAnonymous()) { +// buffer.append(declareClass.getQualifiedName()); +// prefixed = true; +// } +// break; +// declareClass = declareClass.getDeclaringClass(); +// } +// if (!prefixed) { + String packageName = ((ASTPackageVisitor) getAdaptable(ASTPackageVisitor.class)).getPackageName(); buffer.append(packageName); buffer.append("."); idx = className.indexOf('$'); @@ -489,7 +489,7 @@ public boolean visit(AnonymousClassDeclaration node) { } else { buffer.append(className); } -// } +// } buffer.append(".$"); buffer.append(shortClassName); buffer.append("$ ()"); @@ -1022,7 +1022,7 @@ protected void visitMethodParameterList(List arguments, IMethodBinding methodDec - + boolean alreadyPrefixed = false; String clazzName = null; ITypeBinding[] parameterTypes = methodDeclaration.getParameterTypes(); @@ -1458,19 +1458,19 @@ public void endVisit(EnumDeclaration node) { } //int anonCount = ((ASTTypeVisitor) getAdaptable(ASTTypeVisitor.class)).getAnonymousCount() + 1; - StringBuffer tmpBuffer = buffer; - StringBuffer tmpMethodBuffer = methodBuffer; - buffer = new StringBuffer(); - methodBuffer = new StringBuffer(); + StringBuffer tmpBuffer = buffer; + StringBuffer tmpMethodBuffer = methodBuffer; + buffer = new StringBuffer(); + methodBuffer = new StringBuffer(); anonDeclare.accept(this); - tmpBuffer.append(methodBuffer); - - tmpBuffer.append(buffer); - tmpBuffer.append(";\r\n"); - - buffer = tmpBuffer; - methodBuffer = tmpMethodBuffer; + tmpBuffer.append(methodBuffer); + + tmpBuffer.append(buffer); + tmpBuffer.append(";\r\n"); + + buffer = tmpBuffer; + methodBuffer = tmpMethodBuffer; buffer.append("Clazz.defineEnumConstant ("); @@ -2482,15 +2482,51 @@ private boolean containsOnlySuperCall(Block body) { } public boolean visit(MethodInvocation node) { - ITypeBinding nodeTypeBinding = null; + ITypeBinding nodeTypeBinding = null; Expression expression = node.getExpression(); + + buffer.append("\n\n//SwingJS BH methodInvocation:" + node.resolveMethodBinding().getKey() + "\n\n"); + + ITypeBinding[] paramTypes = node.resolveMethodBinding().getParameterTypes(); + StringBuffer sbParams = new StringBuffer(); + // TODO don't want to do this with java, javax, or sun + for (int i = 0; i < paramTypes.length; i++) { + String name = paramTypes[i].getQualifiedName(); + String arrays = null; + int pt = name.indexOf("["); + if (pt >= 0) { + arrays = name.substring(pt); + name = name.substring(0, pt); + } + switch (name) { + case "boolean": + name = "B"; + break; + case "int": + name = "I"; + break; + case "float": + name = "F"; + break; + case "LJava/lang/String": + name = "S"; + break; + default: + name = name.replace('/','_'); + break; + } + sbParams.append("$").append(name); + if (arrays != null) + sbParams.append(arrays.replaceAll("\\[\\]", "A")); + } + if (expression != null) { /* * Here? */ expression.accept(this); buffer.append("."); - nodeTypeBinding = node.getExpression().resolveTypeBinding(); + nodeTypeBinding = node.getExpression().resolveTypeBinding(); } String methodName = node.getName().getIdentifier(); @@ -2519,6 +2555,7 @@ public boolean visit(MethodInvocation node) { if (!isSpecialMethod) { node.getName().accept(this); } + buffer.append(sbParams); buffer.append(" ("); IMethodBinding methodDeclaration = node.resolveMethodBinding(); visitMethodParameterList(node.arguments(), methodDeclaration, false, null, null); @@ -2773,14 +2810,14 @@ private void appendFieldName(ASTNode parent, ITypeBinding declaringClass) { String name = declaringClass.getQualifiedName(); boolean isThis = false; int superLevel = 0; - ITypeBinding originalType = null; + ITypeBinding originalType = null; while (parent != null) { if (parent instanceof AbstractTypeDeclaration) { AbstractTypeDeclaration type = (AbstractTypeDeclaration) parent; ITypeBinding typeBinding = type.resolveBinding(); - if (typeBinding != null && originalType == null) { - originalType = typeBinding; - } + if (typeBinding != null && originalType == null) { + originalType = typeBinding; + } superLevel++; if (Bindings.isSuperType(declaringClass, typeBinding)) { if (superLevel == 1) { @@ -2794,9 +2831,9 @@ private void appendFieldName(ASTNode parent, ITypeBinding declaringClass) { } else if (parent instanceof AnonymousClassDeclaration) { AnonymousClassDeclaration type = (AnonymousClassDeclaration) parent; ITypeBinding typeBinding = type.resolveBinding(); - if (typeBinding != null && originalType == null) { - originalType = typeBinding; - } + if (typeBinding != null && originalType == null) { + originalType = typeBinding; + } superLevel++; if (Bindings.isSuperType(declaringClass, typeBinding)) { if (superLevel == 1) { From 9deb2cbe7b756f8e763187d950a16dea2ada5112 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Tue, 27 Jun 2017 11:21:01 +0200 Subject: [PATCH 35/52] Bug: "AJAX-SWT" included in class path of test.junit, but not needed --- tests/net.sf.j2s.test.junit/.classpath | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/net.sf.j2s.test.junit/.classpath b/tests/net.sf.j2s.test.junit/.classpath index 1e591daf0..065ac06e1 100644 --- a/tests/net.sf.j2s.test.junit/.classpath +++ b/tests/net.sf.j2s.test.junit/.classpath @@ -2,7 +2,6 @@ - From 0efcd2f2ca07d52802ebbf8ad579ad3150c397d4 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Tue, 27 Jun 2017 12:56:33 +0200 Subject: [PATCH 36/52] Bug: "j2s.ajax" project does not generate "*.js" files; no "Java2Script Builder" section in project properties. Cause: - The ".j2s" file contained invalid pathes and some other issues. - The "java2scriptbuilder" was commented out in the ".project" file --- sources/net.sf.j2s.ajax/.j2s | 17 ++++++----------- sources/net.sf.j2s.ajax/.project | 16 ---------------- 2 files changed, 6 insertions(+), 27 deletions(-) diff --git a/sources/net.sf.j2s.ajax/.j2s b/sources/net.sf.j2s.ajax/.j2s index da34996a6..fa75d9eed 100644 --- a/sources/net.sf.j2s.ajax/.j2s +++ b/sources/net.sf.j2s.ajax/.j2s @@ -1,11 +1,6 @@ -#Java2Script Configuration -#Fri Jul 17 23:11:27 CST 2009 -j2s.abandoned.resources.list=bin/net/sf/j2s/ajax/AjaxPlugin.js,bin/net/sf/j2s/ajax/AJAXVariableInitializer.js -j2s.compiler.abbreviation=true -j2s.compiler.status=enable -j2s.compiler.abbreviation.prefix=$_ -j2s.compiler.mode=debug -j2s.resources.list=../../plugins/net.sf.j2s.lib_2.0.0/j2slib/java.runtime.j2x,bin/net/sf/j2s/ajax/XHRCallbackSWTAdapter.js,bin/net/sf/j2s/ajax/XHRCallbackAdapter.js,bin/net/sf/j2s/ajax/IXHRCallback.js,bin/net/sf/j2s/ajax/HttpRequest.js,bin/net/sf/j2s/ajax/AClass.js,bin/net/sf/j2s/ajax/ASWTClass.js,bin/net/sf/j2s/ajax/ARunnable.js,bin/net/sf/j2s/ajax/Base64.js,bin/net/sf/j2s/ajax/SimpleSerializable.js,bin/net/sf/j2s/ajax/SimpleRPCRunnable.js,bin/net/sf/j2s/ajax/SimpleRPCHttpServlet.js,bin/net/sf/j2s/ajax/SimpleRPCRequest.js,bin/net/sf/j2s/ajax/SimpleRPCSWTRequest.js,bin/net/sf/j2s/ajax/SimpleFilter.js,bin/net/sf/j2s/ajax/SimplePipeHelper.js,bin/net/sf/j2s/ajax/SimplePipeHttpServlet.js,bin/net/sf/j2s/ajax/SimplePipeRPCHttpServlet.js,bin/net/sf/j2s/ajax/SimplePipeRequest.js,bin/net/sf/j2s/ajax/SimplePipeRunnable.js,bin/net/sf/j2s/ajax/SimplePipeSWTRequest.js,bin/net/sf/j2s/ajax/CompoundPipeRunnable.js,bin/net/sf/j2s/ajax/PipeManager.js,bin/net/sf/j2s/ajax/PipeObject.js,bin/net/sf/j2s/ajax/CompoundPipeRequest.js,bin/net/sf/j2s/ajax/CompoundSerializable.js,bin/net/sf/j2s/ajax/CompoundPipeSWTRequest.js,bin/net/sf/j2s/ajax/CompoundPipeSession.js,bin/net/sf/j2s/ajax/CompoundPipeRPCHttpServlet.js,bin/net/sf/j2s/ajax/SWTHelper.js,bin/net/sf/j2s/ajax/AWindowRunnable.js,bin/net/sf/j2s/ajax/AWindowDelegate.js,bin/net/sf/j2s/ajax/ISimplePipePriority.js,bin/net/sf/j2s/annotation/J2SIgnore.js,bin/net/sf/j2s/annotation/J2SIngoreSuperConstructor.js,bin/net/sf/j2s/annotation/J2SKeep.js,bin/net/sf/j2s/annotation/J2SOverride.js,bin/net/sf/j2s/annotation/J2SDebug.js,bin/net/sf/j2s/annotation/J2SIgnoreImport.js,bin/net/sf/j2s/annotation/J2SRequireImport.js,bin/net/sf/j2s/annotation/J2SOptionalImport.js,bin/net/sf/j2s/annotation/J2SNative.js,bin/net/sf/j2s/annotation/J2SNativeSrc.js,bin/net/sf/j2s/annotation/J2SSuffix.js,bin/net/sf/j2s/annotation/J2SPrefix.js,bin/net/sf/j2s/store/IStore.js,bin/net/sf/j2s/store/SimpleStore.js,bin/net/sf/j2s/store/CookieStore.js,bin/net/sf/j2s/store/INIFileStore.js,bin/net/sf/j2s/store/XSSCookieStore.js,bin/net/sf/j2s/ajax/ManagedCompoundPipeRunnable.js,bin/net/sf/j2s/ajax/ManagedCompoundPipeSession.js,bin/net/sf/j2s/ajax/ManagedPipeHelper.js,bin/net/sf/j2s/ajax/IManagedPipe.js -j2s.compiler.whitespace=false -j2s.output.path=bin -j2s.compiler.linebreak=\r\n +#Java2Script Configuration +#Tue Jun 27 12:46:23 CEST 2017 +j2s.resources.list= +j2s.abandoned.resources.list= +j2s.output.path=bin +j2s.compiler.status=enable diff --git a/sources/net.sf.j2s.ajax/.project b/sources/net.sf.j2s.ajax/.project index f1c1b5b62..b6b7197e7 100644 --- a/sources/net.sf.j2s.ajax/.project +++ b/sources/net.sf.j2s.ajax/.project @@ -5,27 +5,11 @@ - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder From 4b53c8429fd31cb2aa9ee19e7e035a63b005193a Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Wed, 28 Jun 2017 11:13:23 +0200 Subject: [PATCH 37/52] gitignore 'j2slib' directory generated in net.sf.j2s.lib --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c4cd01e44..8f8e21276 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ */*/bin +sources/net.sf.j2s.lib/j2slib From e724f4d883c3f40f3f1df743df62d87277f47b03 Mon Sep 17 00:00:00 2001 From: Udo Borkowski Date: Wed, 28 Jun 2017 12:06:27 +0200 Subject: [PATCH 38/52] New: set Ant property 'j2s.lib.include.junit' to true to include "junit" in 'js2lib' --- sources/net.sf.j2s.lib/build/build.xml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/sources/net.sf.j2s.lib/build/build.xml b/sources/net.sf.j2s.lib/build/build.xml index eb68db772..76d25ca3b 100644 --- a/sources/net.sf.j2s.lib/build/build.xml +++ b/sources/net.sf.j2s.lib/build/build.xml @@ -6,7 +6,9 @@ josson smith ====================================================================== --> - + Building j2s-core-*.z.js @@ -36,6 +38,8 @@ + + @@ -737,13 +741,13 @@ - hZ85!@oNLNQCrE@7?Y>3-#$zZqS!Rwd+Z z{MAmC=q(EI`XXhxq9_H!oi{7Dgtab$yQRW4H8+{H@ePMC)mE*A(dtq9tdB1>M4rXA zDT2Pz8^4XD6>1^*iU@gnj7?73#r`sLxF#th|(cQ za&OC5mg_Zt3qGW7fte-SA2IcF5wqghfGIfhz$yV|ZA7~M5_s0jNY7uv?SBi@vtEY= z)*HCa-h>v`R%mB!gMQX_7;5c+G1gl!(Rv$ZTkqhS+6fD-cX5l~g==azY_i^im#jVT zs`Wm+W$lG`tbOpF^$F~=K7)S)*5~kp^#!i0F9}#*#hHj`u{EHL{s;N2cZGc9OBH|HyEMQ(wa@#k zqo!a0fJ2W2$eZo{!NP<-D@{||=DrT|i=YMW>hpcq=!St=va+fV?2^5xU2>qO!Wvsd z>tUUJ-qs6lwC^RES{4{NE%TALgDZM%3F{(v`-J){V4n2BUR4CMuo)9_mEvzyuGIU< z^9Xji51gi~nG2*flKy|RvTTi5%4juSr7g26YPqGkLRwJx1$oC$Zt#s-F&Q)I4;qY3 z(Qp&FQZ{2Tbi%LdR$$~xk7FZ1_Q_KA`O25kELWmSqtI+$*RC|j(K7xEa(6(Uf7|de z-u&P5spO5|3Dpf@zZ;}GmnBRX?=@j1V{B8ZWGk{{K zjnDV}52fNPD;hx;T*C*DjXwy&`WBL{L%3glk9*}0P}TYoYFR%)wsja9T0bNE{tL9X zeuc}eBhc46itPKJFvL2B`{iFS+B%N=#oUOqz>Iq?Je| z9Yh-GCL*MtNGI2b%4C?xAh(LDWRj>(rics3Oi_c(6`ABAQIo6?waIExhpZL#$nzqL zY!=z%4Ut3M6}e=us82o@4airbA^BD`B0q}8UCbD^T@XCS&{{<;CA4~qp6HMbjRIrX=1?;Lvm8S9 zD^pnt2;;bJxj^9<4fDyjOU zO=S`rtWtk7p^nNk$YzxHRDEPGSc;+<I<+Cirz#*cu0+c zot9QA0i)-uE9Z=Yj7GT}G#OMqfE~UF`w=B_Z6<%R*+U9woCn6PT%Wc`YkEanjEsc( z%VA(fLXG7pE#o@s8CyqkU$qrz<6@{JbLUC%SAttAl*bC|Ocg6as#EcR&EM>!G$LZi zb#^ZK`rFcztw;+B`{YX{H&mcJWR0S|OhQyNiLlr8`xZk^@NtrYs*h8jP)U;YMD>|= zR)l{=%#G|?B4H(B2Sj~};Dex#60nbUU^OEMY=>9OCeKS1`R|fXd*g8E71iyiLTH?TnYU}ceqaU zfYG8S+$OGqS)vcj6<5O|(HB;U{;)<2fDK|GyeJ02HZd696W7A0VkmqehQR?b9FBj8 z5pY~wM?hRp62wT7CT=E`#VC>`Mw5IohO`!ANf$AW3>CMKQDQuj#R+7VxRpF8CX%IM z5_weIMoPr(WQUkcJ`hvL*J3J?z3JpA-a94k(ljwgv&B7{C+^jf#au02%+qR!`C5)x zpfwQpX^q8$T1&A|>mVN1I*UcxRib}L8z`1&L&YQ7D6v$VB$jJ4#L76JqM0%BI5QxR zm{P<}0u{{+T!9R2DjTE3^K^Jkkv#^PP@>450j=ONpE$u>=%NUqWR6xT4`l|&;R5x9 zfmNreCrnbAT*t;L0@wxCv2lv9&4O`05+ivKhWSX0WGVDlOrRhu;A&s7OGi_hji-U9psw;SU78d*A?aERB!SX} zRB?S0A>TL;sEbU+$f-ClIhCddlBeS8{5hH3B0Y?d994??Kb_0W1g7nCeY%Mf zmL#3+0@B$c_!dbo)VFZCv};MySzVFNboos@_DzPQq#P+}jJC_Ipum5Wru3>YX0$Q? z!daDDq1}&LJ&4DUGCYoy;R&P+#Yh>RgxcaM$QG-ych*1~u@){BPs8P69rO~Cw7oZVkfC0-X(vv#4d7?*i9}Kdyr|`Tkgd}y2k{j?$MP=x<^+grX;g~E0c7M zt;{uSpu$bfgjK=HtPRWAc%=_*1DC1w$l-FFI}=a-K$^ zuAVjEJ7}nCHsJ`=@z)ut5 zP~wE*D2B1&flBYwK&4mW$9a=hXTB*|F`1aHJo&n0OHV$@2>mKe#2 z@J;O2BGMtu=n6=Q^RA=$w3svt=2l@b$<3B7fTT*cbOBV1#a;hgAN+OR`rwCXeF}|C zu`nOWECt!JQ>K3&k~igwVz(>zk`>at%gRlt8ODV zsVzuP+aXtDnE|#(rrXJ6hFyuw5ucK|b~?G=u1uEN8DzCxg>0}#sfAnuNpkka7IKLm zb&m13PO1HSMlB;9x45-zhO*Um$y3bNd?b)3*erjwkgG#G<)UYzFxz5=5;_2)ze49gR;gX(%&$=WB>an}!X(nk3)!9AK z(@f|OiDi&nj>n3KP#B3(Ot|mVFCUv&TaX zdje$J6XODZ=Elw;a$y)-p!835eUEqby-0b^;5H5OxoX>e!O_iJEXMKn>g*DFQ`ek8 zgR>|{+DA&q^MF5J3~4WE(XcK z)X}}ak5rQm<@vr)N^g*IsT4|aCz%dV^(1svL-R;5G!Nn9a%i5!p&8LN$2TeVkAai5 z?z!a$7|PO=EtM)WbHHKtCe3E~*Q^Xk{P2F?K zBQMb5GV+4nTO!>36aM7YlJ&M1;=nwFGxlMyZItiq#W*NSAk$t7_3UMkXD^3l_6lfi zuY`{FDk!ucg{$qypr5@4hTCi5Hv4IqVy}Zc>}TL^dp#_%pMxjt=i>(I$=H8DJ&6Og zM-9}Y%6>%RRz4IQsMdq20hCZPsL7VotyroxRADP5o&yey#~Q;-q%l(<%ZFuG1C-*3qa2f|-Ro7zRxNz3UC7zh$yXWTw?)ehzBriv8 zY)LtCPp1+UWG!wyl~oZ)$&r7XoXmy0)R}joRDVA%`9PYLD+{A2cq6XO>u_;AAqPVp zq<2S_F>Ev{VXI}-SH&O}L5sMJJ4-%#4zK8&56BxEu<{q8VBY%L83qX(>ZEJUf2bnv zq1dp`f(vliH{!5w0&c$qF8(Ikn<3495sB6-IQ*|dE&Dadv9~}Y`*nXD{x@)Kz6qDw zTcNwX1Nz%<;n2SgBkgx!ti2N^+V8>)dl$^JcjH=p4_4WGV6D9uUbH`et@eko9m~9L ze+pmNpTQyfb2wsu2`BBZ%V9upYlu#f(?}H8s44Q7QhI6F*3Z~QFG_nU|V=UKzsF1aM=2Pv=y#shJ6iAiLNoNyZ`L-!J)|pIceyi+_)nX zRuUT}-^(IP_Kf{4F3LkVD&Ikt{XJ63AE2fEBQC_Bpo@JNdfR_LBenb`&eJ;P0gI_& z^j-Xf#@KIuTr_>ZVkYXs$pNfvmMgpkLn~> zrPwZsUW>{17DL3J7yrM2*h*xje*vxiFA;00uk50-eMNtywytFKy}pSyFNQm%fDm|T zprEcWi_)_q))qKj9?y0F&6j>q^7au4$7D$yBY{GEd65><%iPCBu~g|A>V;5Q=EsA3 z#QPf<(y@aFjvW(ajvtSDXZa#hpi9vJ+ZCa0=|4i-(tm`ueWbjkg0`i9FETOuHd95T z`ETB4{+EA1x_^6HoNI?aFdzByUuW4XjiXT~TAddSS03+CB~I3h7^G-&;h;I@Tm3L9+Z^n0;1G*MnxBL)zIF<^2?k{-eO~li61?9d;9(YfIREwYP_3IX-fI zG1N(B-vpUPtXNVkryStE9EmuLy%QgOo$W19=kf~PR@%nMK2Iu!v5}-$pC?C>)tbzU zB+Gv_nUWPrDPNPF{DE(WnNh^v3#mlPZ6Tjh!K;%cTyMpvB;;*5WN@NfqDjFx%n2tJ z!79JiK4frttHz(FRZY&fcAK%wrcsM`N!!~6$g4V&e+>C$uBROOsD=?#kh z_UPBxoPz~^SgBAXDV*#BGRxplkt7MotmS_vzr?=pvyuH+kP@vsTnsfM;aJ_3B9&fe zJBuK}r+Jo&l5JrD{}rDE2jhN_YBi#2xWng##|=kcQmL5GNTt|IQX{GAC9eOHAB*8T z%#pp7ofS!~K(BYHYrnH3NOG#*yCt$b4$C@u`$$1rRwS+bnIajx+b7^{WwLWYM9+Uu zFNWHYNH{%)##A{{Sz;w;L^7o5XofU(nUPMy>5)i)YW$&86{!YZ8edC;^Vd>20Av2g z>ULrW_%1IevLXoz5;*L~_)b+e2kAlADjeZBh~a?DNJ!yWZ_;-E*qgL&F|8H!X6ti$ zlRDvK+y@fl7AsDP_#W1O3VK-o#_xY&{nPXGu)a0c!{m#&z9CyG_DwSTN%f07tWvI+ z#bimezf$xP_Ot9P5y_Cq)I;$fh9f%ld`869=k>KMt8KpRyfRkwdbBZ)my zH41gHSgJQ58oe{VIey$exY^Gu#+rjf|KJs!)GK7A{{#nC^?!u}t1wy578H~HKAZLF z{~O=`8^Fh3fJ`S5YC6e~?W91yQwc71B5;Y50fkOg7~)ie z@lGa8bZWwErxq-9YQrk04!q*jg)L4!*y`lKPA3<3JN4lUrvd!nG=!s09-MU=5#lr< z)M-jWPClvRTu3f(nvt4L0cqg0AdQ@sq@~k}v~w;ZJ)Db4AEzzp=hS~E!<95`B4A90n*J!sn1GQ<+AZ?B_SX<}}(N;OvYEL^uwT;d&?M3H$ZM!p4 zd*8WH`@$Ke9dJf#hn;^h+EHh$cG?-IQ|A^vJzZ+MCVq0x-(0k?abEicjo8|oxAlV&OQ1H=U%89Lv2mM(GD(?^}>=xXPAy1{vYZgNWKTh2zh)7eaSJ1^1q zotNpS&MS1k^C~^;yheX@UZ*FWH|QDXO5bBWQ=HH>`B zYvbBR7uPkqxt`J64H-j_$Gyo-GA6mn#w<6*nCFI#g>HYEvB*s~R=Aaob#8{S-mPl9 z=2kPdxtYcux2Cbrtz{f=Ya55$y2eqro^jmGGD_WS({^*rBsbSgb?ci|+$=N4%`@}e zMrJFwvDwaTVqWPsHG8}H<{ypW=?=)7|m>E_VW-=ibU6a3}J` z?rnUPdpm#9oy?zir|=SY8h_orgTL#};2*g&`F?+Q7C-FX#s6~W@G|#qOStz~3GTgC zWp}Ps)tzr$;4ZLgyZ2dn?t@lKccFEO`;c{oyU6P07Fqq=#nu>ii8axE#G2#nhWch_2_?$ZL? zb;5skpB0|FUPRo{qOQ9^G;&Ksb9bX??QRlX-OXZv`=S`+zAQ$#uZWx6SH)QOH8IJ3 zUEJZmA?|YD6c4yt#Y66PvC`ck*1B(r4er}wi~Ek)>FyLCyYGsx-Cg1*cegm|z9&w* zd&F6HuT9(!Y{UJ~PIUL#8SW=`E%#Hqq5FTCeWClg-O~NS?&f}J_i?|nZ*sr3C%XIX zsqQ!S-R=Qo>VTqZB}@%7B$W0gPU8R~ztG7FAo3^LWeV_~!fgAu03v^(eK3H?-%Y9* zx;hyD6y_?QKn_2^IE6uEkxFop0)Q8!9V99kOqhgUVX88-?wk zz-hNZYvrJ1X>%Yi0LDLHJ)}VOE$x4>HP<(2(bED@eTjYKgX%kaUI41^>a7D%eNSJ= z532fXeF^{4V9*E4Jqtbja@6G`4MRrlqSx_|Vd9s0bdq^iAvA~RH1mW)Zc3ncn#UA? zej>dWCad=*(Is%LdT%ma4RzG_rqKORO#$Pluo^JUFURs=xL=O7iI!s%W95HJFwZZy z4ZNV-L1UqU`cGot1z`Tk1{k**T%|1IX8bE4#Ylqs>e;Yy0fg1Fm5km-bwe5*gpCQr zQ+F#Fv*4Jzn`-QX$5ac_jN{N$jZDNi1&x#sLb_=~l7i;1Y$oA|Nof8IvlWh|DrdHV z7D2fyp>j~JH>3pRw$ZNs+suCtX%qi#yt)3K|2E!-yyw@#`yqFvYT-AMwSF!9E^?n= zi`5I>Q2wG-tcg%yI5QshS*+#C+arQ7UkZFAfy(3- zqk4%^qrfHwF6K+2W*%n7Fixbi+;c`P8JX0mE5l}ulGj=4I#*r~#A~u!T{n=|SIFyq z>bjx4ZX>ThRM&rvp#?WzPwJ5*C0D14WzR6llZR85>9rD^SSK~h#ENu7U*ruspk)=QmxQg9BEL<*AS zI44U3ha_d)%dv=`nHFUFhP^7ep&&^H1dFJXmE^!gDOOpouhq|qW+oeL%C-6tS1&Qz zCX8JHDcIl@;N>P8?R?>~hRO(I#w9W%H{$yFB1q*1pf0j^l-lc56lT11Dt`8T&&Di_ zuY#Tco&$f}bHVdGNcKWd6@P1a3DD3>gqB_swD*#svzHEqUIz5^s>0P?H5lYohY{Wd zFv`Qt*2{$1UQM{$s|ELawPB%G2bO#FV3n5ztG#Sk@8!TIFBi6W^YVEw2S>=(QwGz1F0q*M@ZQE+$uc zZAlNW9qH{|LI!yq$PHdcajX6ZqaV?#%trf3EEWeR&BO7QJd#Y((dza(-wJ?wH00uZMB!6z2MC(cc9cZ z$E=h$2P~gVNhU`_mTNt3hX#&?r>zO_g==XK8Xc7rajrHyKre5p-K4g46MAYrRgek} zgS5-khHSwIt!>~NK3mIFo39ObYt@ZQRbYSSRT?*>Yncn{VTKO_0h?g53cwm7Ey+!A zuQH+P4b6;B$_a81G*AIp6UZ{+7@e^NA@Vf*K@Z|qpFlRkk46_6O^AF9@2GS1B=Q%m zR?g7L>O}Nos8TA;k&uMWZ$nDKA+a5x46g8@E+sua;1}^BB7O;i;7D>Tt&Zy|49tJg zCiyv}{yPZ@phDVf=;~kTPo1P3M-tR_n}wSK?hUnlA8Y(KlHM%UD8oKW_>V92VK;*i zI+kzvbVqBRkPkW{PY3#818Wo-1kIv`h1eTtal<8V| zY(BFXNnHhNHo0?^pQEk-5iuoNV1tMm9GA+g3Ma`@rAX>!ml!=tjGmJ28RfBjq$AtE zNANLv`zJj$v4TG8*e2cogq=muQ>M1Coxw>#G`HV}Ua@dHtA&)}cKe;ynV@2wE==+5&;Ji4Jg;?W=(%BF!z zUKIpC%8znO(7rqjQu*mqgJ@8s>g7R^D&wPZ2VTbC!z4{qVUoHadXIm=NN*{O^OnJ6 zZ#m5JR=|93B|Pb^f_2`bxDP%CFL`U=Rc|fsfluT9w+;?^&%htvdN|`fM>OwwVt6kQ z%iBOwyp1H)+l2exi=@5x66x=~Oon)`ka6CtWQzA1?r&RgZ+o4r@ZKP+y*F`x+e$Wh z+sGTzyg#+e zyklAq@3_|2JE4v6PHJPkQ`%(j4DN5G+Wp>H?Nq&EkS0ynHQM&HZQHhO+qSK1+P2+2 zZQHhO+cu{0&3iw8&Z)?#Sdp1K_s$;`6^XSMQmrfve87vYt4?9z zO$_HI2jN_IPSgcy5$Fyq=_M6mDeq;)27M0HmCG>dbMOMyZh#1-90Q!#6OG8Zcb=kI zw*jR{FT1K30e(frE^b9h9K!MnMd-!FqVV&RkFeH9mtyRd91lb+ zxunV8lY})g%W`q?UTUNU=xdska>xYZRlR+ftxs)ozAt2n@w1l!nF!FOl`%9-X00QKm^j9yp9v1 zACGsW2b$rpkJu296T)k-p=z>6N~2EE1~iRH!o_D&#RLyX5?mCR^T2BTE#^;NSpT>B z2SHH=6buFk2nq_wE_hZte_4kj1Of;s1P%y@sTGSEcn|{gUw!K?C-9$N|Dj-UU}V_; zP=*rl1u*>oS!p%U1P(I-0o_}rC8z*10eqkhRhOS%+h4oW(q#4BL1d8$$M{){B9i@f zNlAn8NXrJ?duR+$fF4A<iI(L zkoGkfM=WVKRCh6Pm`JoW@Tzri8plzSz05sLJVou=?61SYQ!KMSy;E$Fn4sD^jZzxFMrGyC)FAB z2qjgaq;pl(aH^x&<&aF_@LF`^xf*-08_i*;YaDcWcmrpD)sNk=RAz;8NJywkP-m^i zmT6;@YYU*@cFLv>nddFz*63;97TR7Islcxd?jhY6(q)gFbd;Qhj)jLb1NKWYKSqAR zA1f;eo!gMeHF~aq|B{>k;1&uB!=HSvGs#LU=Lom6wvBzGjDxYAaG)^Xo-E*B!nj5v zXHaiwfe)U78zl~O=Fur84go{sJ}Oid!ZMrhko0;Cosc|Sa5S?EURE+dtI@-^kACRf zw6rs26Qq;L98kMF4a3=b0Tf9|SMf7jhKmGI#+2(}#02y=+^qd#%_$m3S7mORqLDun zj;pNMW&AUQ$5@Y}7phjIj1*I6ZoOM%Wyf_{Rf!BMgyjH%+ zlM;EZ10PdRk4Pj7JiR|MeZ2n*(I~DU=Pak0Z>IoA?kr!lyS}ai0U(`yG-nDk&~brN zXv1VyZ48{{RFSWbcbYwqTU{N?O1|hS)KcrLx_>kt!k;P3qUF#SYeF-rmF$Ac9YUo5 za$KA+&0989;H4T_;wU0gRHLn^)OxjE3~bIvki~pdNo!7>2)(&fZc|fDSGDwTK!(oM zl&&FXU$GjbMJ|J<4G>@JZD|+`}7!c8k-Hwp%S*TT$M81b=DVip<+=~>UJ zAf5<76~BbxanIdrga#S6(xI5wi?0e!KsXE4b6GWR8<)oaCx0CUjQ^Nh_Fqu2XjvJlPG9m)<-l|E`Y$@ZQX!JQc0X4LFi?umQsq;IN`%a#vOU zlbBUv{=)UAP=zAqp!^%=-`Onz_KtlZW3o<x!#%v$FtJ;xW<9^!PhCqg1!x+%*;~* zbgn@y(np$Z4KF-=;{Msl;5S;}an85X;I^C~7fqCIbZq`}G?#bIfM{0L&V0hXnkym$ zkmkMz!c;3gGAg%PyZgSG6VNrtKbo-naXlk(2a2ZNlI&JpH)Q(SEQo9Ov1V;JB-`zv*}yme2>sx$!!Q9i-gP}-F+h`wt;1Tx-nX7ord7t> zcQIq^uIaIV4E;FKZ0HMo>C=`Mfe?0{@2J=~xsVLhYecUQ|Ev^^92@{Hs)_AX|GKGs zKulVMrfM03@V;?BEo{-@am;7Ar@ z7q@0(f$bz9>bzu2+@nHmnvNYow<$Ufhzzi2&`hA+yL(9Q+@IRMi%sf}2v5Rg5)_Q% zV#6F6l({$&CyCh~sc?(eH1oi?q@{LC+l?-9i+Q$K_41rDG*<1SFJCmSdH)fS93>nP z7nniOM1mSa2ZDnHqE|3sUSp9&90$AUzeJj;N6Bp2Tm&3a~byFOm;TK zzAXBJQmOvtiNSB;zy9SU4zg`Ah^_*b^Cjo%E)3yc1!qwQX91)AG;O*9klKgo37vN7 zACWXMY3krsUfofgJ!fCs{wFdTe6NDbl%~@2WN8b1C*o?S*H+$+6imkhEajTTDoK)7 zTmVxXGp#1~9HWgW*!*V->5;2uAeL|UeG){1_K1P+PrX(`CgYxKC;Tug{&&9A;qFr? z{BO$)9AcH}>#%tBYPKp6-MrXQ#C6S}n3F#WFZz&((^(ANRLC~UG~zaea+*|TBH0Fe zo8m3oJNTR1bNTZCfaX3iqe}z{y<3LXnywbC`J87vNzI;k3d$0P&})Kqin4P6exfB1 zUO2>dDXP2bZWH{98je0}BuqDYf4_3VVt;&%%TTi|zZFi`LH~u?bWBVQg8ix6ModpX z(qj|W_ZX7Ekry-Dl3H$`8>!w%DEwNd51yS9ETWnYKPLw+K&O>-;RuDt3JS#~i^Lwo zBVR_%&yMcsqS*X1LQIBD;N&D&{R-V<^MD?za+^Y8YtTww*~C5J=9 zL3o!;;(tS)95ras`Cjcgf&`g@wp!ItNsn_H}Md&Ni z(#}n-O{srz74IJ6b*4Ww)`q-;Od0R=<2CjTw31=**xUPX!`vN3+6Q2&)I&$Pb{&bB zh95QD8SBY_Z?@SqWAJ?xF3{;aTpq3R5J2)hf%{Lh6BR)c34lScaX_GGmbG9(KE-+x z4v6#t5QVKjV$kcgdyiigcdhEnqW`$ZQMyTE#u-}4=^wfd>gYbHqv6kuR~$j4#Irib z=AlOQMb5>y(BBxdE?sIZ)-(;qU^81#67GlmQ+e|(k~L7t?{MvLr)b$iQA ztn5kM)QOh9LG=ZB%aa?MyHv7BDs|>K>NzK~T*;s#qk-S`NDIu3lfvi*9{(D%%G}=J zi;Y2H5*G7jfsWbCDpX;N@Khd+<(`udbsKj#%nRbHQlP!H}?ws5`h8^nD{D{%GhG1BXr>yF)o4 zje-b-ZD|zs`=RR0W)LTkco#LYd^oO^VjBzdo)m_UNe3dw-Wpt19WrzYO>{wFEc2Y@DcJy=vkU%jx&pks?f&LYz(;WVoPCYv2)Pft;x1%N? z5qlbhsBo>d+82_2HYVlF%s)I=H|O%gc#Cs6MwUS2ETmy=It8i|s}6ejh;_GG7cH1{ zMqlQznq$WmBgVQ}KoLByP|E3CLpyK8?gU>d*L3R?_llN5TdgdSI{qFmd|gBaI9vMZ zo>(Xj5OKxAuPS9rN;2H7WS~)3o7FXS?F;Qw8hw#SPm{rGk0t>&3DQzp1M`7tD@JoJ zrc(&vaInZnEPjG9%-7I&H|R$#m*@zK%y74Yz#W+;=7O z-H-z#?*7xZmpE!XHnO|?38o>G7Oqc5+G%f7r{|B1( z8b*pngdJ!+KW(AHpe<6o`Qs}}%I$n6=e#CcEP}Q+E#$G>~(0NV`cp-n~a^L#%p?ZB(S;bfZK1`Dt3!IIYm zNIO_+l+M4Pjiz1`N~8&$tW{EP-)7Mggl#O%D;T-?k*aHI?5bj}qsFkEZ<KU#BYEJ9&x$PK&)vOfY#%C}NGbjqNjelsG=%xP0d`JixQ5-6LJ56FCcZcFZ0U z)y(o!cX2goLoeB;IeZUiNrmxmSKkyCH+osqEO1+SG+kI2PNW8C_ zQ#`Q`R=hdE9FT`elxYxq6!U_gw$LHc&ft3wnt;bFZ*JYNgZpcuX`Ukai*dDO-?_eHoqbc+j5rI@XbFEz5g;JswhqF^PSDT=7AYf@PUoxILfX2ij~ZOYeX{m|#clFqX_8 z;P@l&&q#h-f*%lgU?}87W7i&#)gq;YxYm1lwmZ#EA8CXodK%F3SU&*1cOdKts7KSa z1vSGE3f%?Q!w|9E4Px(=F*!pXmMhRF*z(nJVu9cC#aTi#9P-FFDfg5tE>fj=XUrg$ zGyZt23pY39gKl>DiUcM*XKwitgw?B~SQFmdpuB>9M$rR?sU7mw2VgK^k6PshA=pOjak}$UGq?)`S||-zo1|>&@=^&0c1YI{T;L$WBz4D6#JZgP|{dLio z{9fkq-BDj_pv>hh3%Y3ny@Rc-3c@zRS0H>Khny(j>^O$pF+PvB6|dv=`CjK_JJL?( z{TyLleS&p_5Ed1ZLGc5*2%JJ}5~rqAvUQK0nJ3VyVvcp1tD2(Zm8TKBOpO;!7=e@r z8CC~}6`#ysyT&KC75?RIxv{uUE!YYS{aULj_%eS+HG%s)%2%w>;_Zj|s2 zf;ATyX4sTXunDb0&_^(bS8-`USwyu=?z3cWHio5ln_UpP@0 zP!Lv7?6c(kk#1UESX?`wrQ|QQ)Sr8ZZWw~la6Pod#`~>~fY8xueyXVw`q<*(1>B|itcXOlQ`cq+K2s+=DV;%qd)D= z%xH)J1=r4*Pp5~yu)*-82;JMq8Q2pF8=UURU#l)g@)~<5P^deo|CV^IE3A0um9xw@ zjS`3c5Y#O4{5L8#@!YGtLa zlqucI@CgM2zTwhLuwm~o7bFdgN#J+++knJGd;YK|+pI{0Ma55EVNkmSk_7>hP7j!3 zD3K>gLMaihtR(I=Cq0WW7s{;%+ibU$=kZ}zqvP^oNTaASIKQRusETx=3)G^@hr zOz12;3SsL~i=ZuHCS2BML4j+37)qIFL0%R#04zM=3X*j5u;hv-%&yHKJ-62Mz-Lzg z60e7skAFOLa-}2-vunIJWE7(PRz6tl=VwP608FGB!`B{7yceR6BwtyGFOI*g<(M4g+^RNG8a@+c}z5{&ay z06g849k$lqO8v0vJda8v&$QYWhlQ&*2d3RnCKKZZn0QwInK+|2JLWc+c62_WS^?J+2gK#ndXfbmpSNb3E%dRkqnc>Xr>qYi=aCbjIg^O{(8wj zE|D-Y=bN?(HkFD`?)D2zncMqF5?l?^$gM$pJcO}4MDRc|P8iQ9K&c1#*fjodfa;q9 zuLFIsg1?p#ZFv<;{?(qpXNG(lJ=0sl^X9xT8})cAL|Zi*vksfYw!|fJD9K7z`x@FSrJP=NKL1Rt3 z#4N{0NBEV=$&*a!o8pbI7gQpsD4^voY7&;y0>atuf;T>x zbt#)z`!;!}rgX$=NLf$DAF@8nE3OwS!1~UM?_yqEa3X)9Q*=2*| zBJf63$#7BrI_D$DhQO8P0U$dm_XPif|QgOH0A?UGbO0yo!Q8$`5AMXiV>xYZ&S0zpElmB^K-ekuN0`dh<6hF2m>HnD?f zrl66^r03*b(69pz@$d#2_hCGJ`!%%1tI6Q%61>n;>z^v8=SCUITP}Gx= zdma7lk?48c%afWR{&zb$lRFH?4Ek5Xqh%3ov9T7s7k$3Uk+3!uhEkBOEK_^-Oajdr zh!?dUxyHhBLtszbYtDmf9NUevizRPFlq$6`iPn3K^j_#3dNFj6JaA;2rq&^sBbxTb zX&^P-^CYE~A7B}$lYops91cB;I10fw%9z#V~o4UB3D+inHk z`Rm#cfMoFU2kFwWxT(4LpPGJ zhy{6*Dkho)*9JZ!d3K*k`OSfD^SHgXa>bxyg?y1O+#ZK*?l*S~I;B|0;Q4%FZT+|=R%3mV z&Mh?`zh!x4w11k?!_E5}eB#w#*soKMH-;&{J_2=N6#d7yFkPNmzQkz65(eAk%+!Qd zj&)?7)`WMOgfsv2mjQD9ZIdyCFL%m=2z5k}HEBsaKKHh}e%ZR|C3_ znG}>8xU6XB0Q`zR%bH3L@QJK2?)q!1>f4({4w1pwWBrLJ#$%Ho{ASM1HbRA}Gi=BC z?G_5{B5Y97?t^4=%J`9Y%Ix&uih&Y`Zk(zkVxOt?-+wcK^6+biPs=KltLI4k*b|9C zPNUd}-L{IMQ|@3{bkXL%grohun(v;g?L0?x@$c3W3If3BD7}OL;0d9SPcXQ^wxS$a zAFCWgNxLt5VN+E~Bu*E@%svNJ2#>CaK(HoA6WvH@&8j>V?o|;sU8AyG>LOLX{zhR? z|Ispe0kN8Mij(B7qE6VWc@25j`R^(tf5&I({J!BFCyqJnk&$hQEbreKI(&xQ+6nNh zdmk#cVFZX@sV#BEfG!2z3*xBqo3GzdO@c`Ucf5nBzxfUEh<#QWM zApO8#4__n;r!jjhvi253-6$QkF10An8x7lI58PV6o+~J{`Z=qD3eenQfhDz~H-oQW zB}Yh@Dvx*_vCKdgVi*$G7lWAKyzGgwF1^vmaL|`Xjl2?m0j`^-+Je<_(v*Xoxa`F9 zsz*|Cr;dq>7CU@>=@T!4a97T7i&o(JVJItvbAYoIuf3NGnk0P_ITNS}|0Q*J#L_ff zGj6pR?0z)tQw~YVsA0Tymr>X0WzX*$&Y5_o5ZAjXvyfG`UzqldH9jJ5p8Jb3MXZ)% zY}8POHQRh?0cii)%YJ7L)|WV*xEgWy*-DpIjK)C<_YW3yWdWI&2m7Og7;Y~@_;1_O zmLrD!CXn;CBx8iHX{aqtp5>;n&Pkw}<3+jg9w;ZK2Lltq>uz&JG=C!#N>yhY#7tph z52AvQ4l%Dn20_L${7qIb0yF05t9HUGTeOnz+?j6O9)Nk6g)k0Nd%PZasebiOcJF4f zM{66PNDzwq7%w&+sU#s}-dW(JQ*v-}ME$%i&>2ID z_en=F0SXhLmfte^ZqQXOF<)*Ojcm?vsy`-=pifm^I|XkgDBVG2gJBdaplU@=x`@zN z;Zr~cSo$SDIuvT8k1%J?BsZRlj`O8W~Re2))yPZ9U3L-%*AX9$uFts#%rwL5R{IBdS9$=9kyj_Q*`wB|)c z7gZB0+J+x5QMEZz9e^s_g3)pP(j^d1Tbl z3h*N&_zq@&tpb)ZTky>Q#Ly#Z$R$f55}PC|#3Cm}Rw5)Lmy~+w6_arV9G&7EU-=;2 zYReW*-btM&<)jax$q7x}KgHCmkDp}uQQWT8j0K&>5`>?mlKde)S?-KYIqAw2E!16}mrZZcR#oB*A8#_5VGMMD z|AU4+&i<189dg+ugJP*U^YF*0YgTG01V*G?{XV#e_}l7l5|C^EKJT?}JMR(`EI{!! zda8cU5tkEJq5TBx!c4x%|AZ9VRK6siD?~g)#j1fTrsPlcQ1-r4L$0mh{m}RUtyT@A z9=BX7tg2iCLCBHtINQ3XzM)a=b9|H`m=tT|!m;sZ%XW@kMbQIdHc^`Yk)%AP?}AFWE=n-a+D8URG{!Jw7dn^UM;ln=0S=Zxp++k2(Bq1J~b!PlT~ zEnIKq1PJw93WQe#x>k~wJFJ;wm|!Ju5>LpRSzc9&J$t(VzS?0coV%iQtnHfIxqX(c zX^fHQ6x|pCy>laQ;hF>W;nc&Xc|A;yca}3m-{uqBEPFMP02p)F!juZ-ARrrZlQ!gJ z!ZKeg_8h~|hrYzw1vhi+gg2*$2@pPWHZcssqj7y`8Xi%$d#kYzo?1koZ0rpyd9~jnV5%PCuI4HRoPzI z=vm6N7dwgI4{tkGY5^PnZvgYZrxe;ieWP!%3#}zQ+bcZOz-eD0WZd8J`cs1@LdG3C zdPa;j8}Hu*VA(+0UO!MjntXf9t9)L(De4# zLRZj8mdC*R_HqO&;EuF5S)*OKZhYdwECMdxzqxCK>`Rx!38w!FRAItqIfUQKE~?9( zLBDpjcC~d3&j*z5A#|ayzt92yFo}S4&^O%oWH8z8JJ@sbi9^SVaRcxR=wuq3mM0raMuq~wCW zWFnMf9mhkj{a!Bq&WL|{dZ&$o)_qaw-6T}_^(LR+7lrOEybIt@>7oXEJ_GB@&tMSVWl&OhG!re>u*`nf$+Z8Dm7ZR;tbgaOX5P(jKFLzG`3}II zYPD*7hqq(fEtZ*jJ;Q$V`zUy)*s%J}xMBVge$4~`iXo=}bA=~iPetzv-ZP)!`YbPuFg!9!ei9YC`-^271*#w5be6hw0%f zOj8^Hn4@{me)xXls)t>l#A?t>t@7_9GL%kwg4>r&&PU(s??W)Nb`)x|jJ^N%w~JM) zGR=u3THzja(0?@~QVyk9(`1-yQn|w9VraovH!biITBdxqccfV_D!(^Hy^f4oEcxXj z?ma_Z5I;k`p2R^2wcljeJ6&ijZK9K`pFdIoNPn7>PW!^PWyxqS^YeYy=2a=v%I|%1 zqjqK9O6n3N`uLFcI|s~!++r|<*vf*}s1eGc>>gIHVHid_ed-c6Hr46Tw7V^nk4u@< z@#*SdEMt~e58tS_vxZE@YBg758IrCBTuBe!+4a7_BV1#FW+yR_Td9gS*1&ync(WV; zL9G)87mT+%;6HUHLc`n$+Mq?)ZL-UzNMoJ55-S7G%0w2Ho?f+sk2I_ z{F~+2qv%pw8<6KZawP&A=I6!|?y zZ(B#4MT+6QmuA;gqouy_Jn!ruhzR`O4ZSi;J+mSx27SzI4ZF3MTld(lzH&ids~bPf zL4kk7Iv$93laHwO9L01EC>PM~Ik%2sFJR2%U22;vh+C+mFD>*CPuJZQ8G5?`3O!`u zI6Kyd-PMvk1Vvv73}Rr<4x5-sw$W1Sawbbb2(hDi$yv%*tuB7UH$_q>=|^__373zX zzDmR#TC*9%&MHgG5f*%#_OQ-Y4e0$%=qjCJ(GE7F!(i>&~wRtu&9U&>O5CP7QVd#`=XjN= zJEM;h>UdwP6{QN*Zo=9YRA~AI#BY;6~D!8Pa5}qIOc(D zSbnv%^a0Hj)UUK!B|hU}_P?`^aw7;?vd}fs7s1%jD)60`o#h_D7!SClo%_l zgMJA6jRV@);;tIj;IJIH^gON+oG zQ2(KvEnrXF{}ARoaNGZ=8_1c-i8KEQA94t3apJ(}X>*3)xUGnPf%hQ(^RdK6!CA}= z1jOv0v`6({D_$!T2uKt6f5V*dg5>`%swjRCpZ~do76P#Y`>)kY48#xeKlCmO;)wPi zvNZ;=hW`((JAzQa{pTY{pbOd$7zk(^IV}2zwsCSLB9VN z@EJ=w+X_4okOtxZaZS+E1W7=l{xfNX2mm>U|8GR7kByfvP#~a4xU~71|4$#}R=Ri) zxc^1Rn+($PKlGIj0t^0MOt85iW&f*d`2zy;KhJ}OAOruKS$GM^Cg*?s%y&WL|Hq4I zJq98DU%#Cb5D5sR|6{{2ZKTeJvj72MIRgPvB`Ja6r0pGpfB}TvtZYrqoas$$ja*!+ zb^nhdv&?_GBei4tKp2lmh)75%sjdjN^cyOeP7(+@9~eB$^ml+M`3x!TN-?$lvbJ3{ z%nEp`s+d@aU^KCMl#iVaM)QjH^?`btwg>5t$Bhq5Mpf|lHG`MKPUmF%Y3?!4>DH?N z;B4MclvQ8A29RLPO^sTHgQLgizTI}VHsMIh=&t5h*FlYl#k1PmFRj%jyd+0U!T6i^8bnwzK;A?AZ z^{x!m0C;_URLkF%dR{rb^nI*VGJ&$7O)sGXZvD$b>yz_(?ChI-yLRF7prBb7#NT4{ zaTWpipP&JTrTRTx!B&c!5Jp&JJESJ>yz8I!%inX@b4bvkD^Tmlu&K1v8SM?O5Gvjl zzr0g^%eWbSDFfX6`eZ~H*SD~uG7`=m@FIstL@e#$!!_M0j1B$rG=)N(~AwA{H?rV8TC=c3dj4Io*4U1j@g z%nWko6XLf__P0#&>rBi8>DpnA8K#kP6pN~5-xr2u6B)Q)6vyscS7yb0B-;{;R-s~u zZA@XU1ZHcC7tDaMUUI~GEAr_;(!j=RfB{p?M7`;(2|mcQ2KD>z&}=bMiMxFx5F zwQUnDwJv44>Z~Hd!_cB-W3ZRf2FT_~(i3yW2WK7fj!k5W(QQXnnXT*<3{17zPT zD@+f-#x?6EFn_wtnD4dN->uM4Il_lOE=4ImS_>MM{NR}@Et|#uWaI5_G=;7he;`(& zsr0TvMLcRX#g;4h0H-Kb+Ep;o=v~Imi~!EMWnR6r z*yqIIv@qCxjVGq{cAycsz08rc0R-DlnIDRJb>u(<=+IMJs#s+yF_62)i-iiave4lb z5mr}a_~+zLUF1s93n$G9C|$2yw_@0aT|sXeFrCVHP}SvwHBXneJoor4%Nm6u44!op z&u0Fkw_2|F4LUY;Uh@r%@lZ`?j5BO4fOh`hIos@P3;2u^ z{eBo`J5Nxu0Kr z%5JMT-Fzq2*cIK(1e}Xy>Hjeh`skw)`g@HRxv2^9w^^>YV0R$(-Npu#=*nElqR`zF zRU}yd1J9Jq!a7zA@H?_K68MO04>V7|`JBxg&wTXP47v!+MBwtW5M<5t^Zf1kFRi(} z;nx{7DgVrGV$ts9*wpmV^F;LX_ZGR^v59UsqtoKJZ~335GXMd!bWR-^dpAvXaO#1Q zn83+DON#A)qQ-+5(QKyH&2c%me0i-!psb~DDuMdPJWPB%zDH$xI1kguIU`A~7BfZ!v$6z{-985+s`?mPjOvYy@-#QPr z_~IBs4gerY(<^7n@H(TmX_7ZeUXG&SH%H|gz-(w&u|EDVYr!uPpstk(n9G5jdqWc- zStv;$V$zrvE{!5ayhKnORRb*zf_n{|g|6&b*1}QR8XX!?*s#KTr!B5--SDw43f2~Q zWSCRV1<05L`n4{_6kfMbu)aMe_Bb@3xz3qhbAYz1Kc}uu=<7qh>?qk3L^YI}+N7;r zo&U^8vtcz0pFaBO+Z$)D;l1aX)N4WEdNkRa$)hMgerzE(Tyl2a86J9VOfW|#-Nh6Y z%&9_CdpfXAs34FLp|nWK9OItfSX9Agf4waDHs&|`r4t-?o~a7;y0b@v9J-euZ;T9W zE?|c~Zhg@-S5D&|Zb%p}Wa)`sPF8>$Hp}eMwvjGn85lrnpR}*owsg`?KBiL9Lo}Z`}<1PBEL!n-`fjX zMXGdQ@p=d^m4ddjb1*oDZC=LjeGP@5KHK12E zY=JuJa#PSc%#gt0Xd2xC1V!5*f>-h;dUpTT=A!%B-}`sxaV~GzKH= zl@Za=gD>@_+vCafwXk3M4(w|%H2`R%u8I~cxQMpket7ijF0gsDe@l66eS{~2;}7xB z7yMnaqce39rj<8(A9uRFM2T`IFL6LptMez+v&7`N=}gm5ZsyMDv0e{B9_&j~7{ zyE7UQ|39kEDY(+63)IQP_QbYr+qP{@?Ch8`v2EM7ZSUB&COA|7cdAaEySMu7b=Rw^ zd-ZzyiGL(e4YhYPp}7XVKn2kJw#RNu%?u5Um8NNugh&6nI{5r482DN#n|;;J)EurfeelnxEn--j%( zWr4f~Yw5E_c96g}`Jhn#11j@-td^y?FEJuy)$}|b2wJLAx?H5@pS@G}swl@DZfpCH zOTKoB@jHWP-izw<+vGv_Lz7ZoKL|rj{Ks0ca(lLSt->*2^te|#N8H(o0X~7f```$$ zPdu>Nhci@AtZst1(+GI;V-DAj;fALGx$(qdz= z^7_kOmEtM2^Lvdg0P@|62Vne=`hkHgu_SFXwld6uJ1m*t?*NCjORkYA^Ds4p`iOG4 znJV4$DNYFS#+!-c1jkXupx3ZM=w!=6V5b$SSig{>k{z((4hn$cVJJ(!4+W7uQkGVl z!>La)vcA4gI3k~%`aRK*tXT{q-)y0S2|=c^j;wW>8Z;K+aHO^&C!=2e*ivj)k`HVZ z6J6fauvV#RC=6sbk(6r}p*pjzboC-mm!sYez^KTrW>E(Si{@AKQ3(5GTZqV-?*_I^ zs00r!@_@Mg`EDZrJ$0Wi2TR3HJ4TLH&Rv?q6&so{h_5y7;vULbnFA z$)RW+biZ6ND%)baU?J&Cr>hv+iE`Xq%VyRDboE-N8o}A2VY- z6JcOY;wb>`%inDBi+{R;ZSlA^ESIym+!(RV6ML(BopfGiVau5DfcH$qZ(J)1H)BYa zNz#9f8{;Kvx_#a@DJ|>uwwYEg5YiYDCULN*WMqhFRgRRmj?`AzKo>RKdzeJnR9zpUGYi?ji4s|9KPG82MupfUka zEMtxOSd9CFTQQh+E?GZpvQtJ2y|ZFE{i^TstigNDs>C zZC<85_xSOGHghBzR_lC~Rl3+*qu#kqbY>DAaEV0t zvZ(B>1oZV{b7m=#807en_1#Ks9MeBlc+?MYpet4ev5vunii($%thZR5s^1L$Y_aYg z!@ECkkc53vCfqnT4EnXWfiDUOFDgg!(<^Q0K36Rnx97H0;FWbBg(z@XcfRBSkU=SX z5M^j(rAAd25pS-pF3y(^4x%?@oe+G=3J0(852{Gfi%Mi{r>I#Lxg*h+pS`%#x65)R zDfn4didGDB%kh&UvujJ5hHd0NUkyxAKBgyCXxqwGx{t;n?JTYkWFG=fyNIj1IFzXU zkC`%*QESRU3HrKH6zZE^m`cmGj$581Yp?M$>5$_=)+_BP!)C2u@D}jT zZzI33B2%vaw5h%{yLHS6ZAFgD>o-#>mkcTXG%*7b_NXD9?q~f)@vM4gR?H32vJ?i7 zSMXTBjH#fu#Q9yv-3|uGt`67nhW-)Fpr2z#Z_h7BDkJL->m%p#op~s7QfxKWOkjLb z_$Vb=vX3>XwVC6G4wlcObE4z@XbkVu6oO3Jc;mPT;p zFT2UI3*F=Telv;8|B(PSBSCnB2YPOWxW!;Hz6mSrZ$SJ~PTEH2W^5i+Lf9 zxTLrHkAKU~mbvBwD^qMZGvV1R)ylQIDEG#p(`ahp(V~=0B<;_DaMt5*HS?0*zCR*g z=n+d30Q-^F*;NE+QY%orIsY{T>{7$z;3@ChRv>B9i{T3uqpe!5cZ^dR(oN<{A5a^O zZtwMM7XLh2GrS0FK8wHg9`}j8YGGP(ct|;-2lKIN)yzH5nz{)ZWa*cAp~bFcNEMw_ z2Z`{80Vy!pnDKOX=3ukn^C}bou3(_HdIeugs-zhBudxBde3MU6s#r4i7bhRn2aYlD zqojbf+>Yh0{F5vGE+J0AtOZL%ZpGD;kG{L7ZVOnrAW2Uj%>gb0Ui z3x@$2uWx|C0O5P?b`>?0;Yzr^+zGlp8&LgzC55BoiE|+XSjN@n76ILa*}?3?M(yq2 z?|u8fvhLTEeQQ&?HYEUJQR)WzNP2VBP&$@>kce&C=2tT1D3ld+CLR@zwkv1PWZr3l z<0sy20AzvTCoJ+dx(8qhh+*gT6|dMWePKdWr49i5HvegzTgjjnuFS4?UnP7&2%Das zXmzd&9ok_3a6uA`oz~^nbN||&2x?x+v^D$X<00QhO-E3bi}{%5!c&#HB6{%#`qa&L z*!7h8yTu=;M>2O=A%zw7)A0hD8}Bq{iHp*?4ewUK$G(DqbdaCJmyN_2nHiUC%~nK< zb2xw|u~MCHoL*l~lneL97nDNW_$955j*D^+&2X#_ zzfV*mTpW@EiYPG+hFDoX(=I`YL|$1blo~n z5ty1Hv?x+&&)WefS2%3&2_k2T_yuKD<+1Tj9Qa_ZPGtE9e)si9t$)!c6CCRPS{WdT zovg_QA;T`R#zYXs_JY4(jjy7SR z_p2f6lCzh!EVtc41>k}&1a`*>_st1i4S8Uo%prj*GdNYoeSDrgo9%=j(^+UmrV}$z z3)7a-{z&S|_H}emn)DrqT`(6%J#?HH4m)R$hmp=HGL`m;OvbA8Ejp6{&$6w0~o^EN^4paAgdCuY@1XQd~l|E^i^5Nr-@3$DZg&2 zD#|Xk{@Ai!Q<8dFps2bfa9OqhKGX|}q1F40ni?vA%qogSoA9NJsamrn@9QY2T5)H~ z(cT`~Wk~E4o;5+NR^DAoWQZfM;gY5-__592IyT4u&UQuAL6!Jq&IZVy1O}6yI`iZ* zfY76r$MnSR;4~r>z@3rYK9P-$4!6k;=)sM}V)I!Yb;=;D4r^(NA4kurr?Ran<}6wxS_(m=_xt+59~OdTO@ z{t#{w3^l^RMKAaX>j5A%xir&^GqsbG6f98f9})M|LEJOQ_*cKs*U+6qsCISa4m_bmb1C^b>!ug0EHI@G=h6`qcoRM{)r*%#N` z8l2>}UCz*272pyp9D0@YL7QuXJxwyop-Zzdx|&~iL*8dS#{tsm2`hKNfx1RDh?e(% zn5v*GEBfo1Qgot!T8cK4D4kFZQ3gFf?XFXZy2XeVPS)?u>7iinGU1qnh+s1y<`)I4 z1x)ixQLk+Y&@+kJx47E+uG?LSFi3Li8&~lOW)r;TX?E*P7eUE5m1A6%PqXC5A>}L?DP;=(H z2S|NSwDadQR8L6xZJLWBdbFoFJZNgI&i$Dem%C%W*w zQFmfe@-vKUvaMHkl!vRCXMcI=PZ?Hc$rgcYxI=a-Ie=@XeKwDwq>s<0?!5SG`&y{Y zT~G%ZEUr+3JgDhDY9{%HJp%7E0%t~M%8Q?sM#JW9vdsCip|9Vj39XhAK{VyA!&JyXdk?2t{j8RopBaDL z(}$(CrR||6qFSrRWHyF_9f^4bX|0h?*yivS?EoFt9H`ScRwN@_9anl@cVCf;aEE6M z&uq@|mIbAO-(+ZTn5?g9?snjd&;R^xCotXxnB5eDqA3nUE}f1hQK!(?EZqmc(ig^5 zTRpiKGt(QokAmf9IU0l(Yg1XGTqIhPmzTE)9mW#0<~ug8jp)!^2T(t$bE4HG{qJ-HrRGBKVjjO2HX744!oA=x}*;RDi@94mWD#|a+!9$t0qt8;{}GVi2@vNsR>kDxdG zPtxykNOO`Oe122C`HHXV-pPigtFOA=`d+7g$?}9{zIvmJ;pbxSQrTjJmDrDwJfUAj z6Q{EkS=(yrkC@Fl+bWr-wdZ)=x&VFAo3e{D$8&}E&W_lxe1g6QNv07vtP6I%oqnww zlPV`z@o`P{RMQ^9xtcRj)A3%JM7`sZHJJkX1)AdjuPqkunl*EPF@5dg+MV6rd9 zbE`(}E+NU*ZNNq1s|`4V^zORU7mDWYwcErfkUc5Ht#$<1+_o9wE_j@)#9|n}4xZti zjL~cRd#8Em`mt&ae@8xe{(?kCS^KWj($u5F@#FgO6}Zfn447EuRZ4xZ-ZGjE31-Vq z45zT9AS{aiX-WC=7WQsI0eDf!fqB^sQi4!OU*E^2+n%6!%*XbPk8u?01<-c-!N>u2i;Rx`PqUOP(R(%BCG z!~m~jIW~6kN^^|NL}DK90%E1b@24Qn#kFO(FRo#?RkVGFx!D|d0%(WmK79>@Nq15W z>!Jy_29X5OS+SW=s9*mg1PrwX$U=bz_7-BhMjQu}i4&m`!&Vz5gD7Zp>~}zxrqt@|wVwf6Q@SzQ1avean)!N?y-zT&_YIA>5tan|%>|Em?pMTR z#-y@B=;ca?`~2VP02-`Zp~rPdfsQolea>&~nCecBI-}O;M*>api)eAjC227W6oo#& zU#;0vzGX43pGlBX0C8d3UA3(v{)D@h8-wi0FoTFiGiaS*wmIQbA|s>NcbD--%|VD- z^ds*A)_fZQF|7!lY&p$*UD%QqOo z=p3ond56&2$6ukSLRG=08xRgPg@Ow^2b=$FX2x7-7L|en$AN4?jYjW~^CEhaUQ9s= zc6Jv^Jee+5tVpGBp5XSOY1>nzX9@)3Nd4MZ$McW6GofG;rJU^nUo&2hNL$}Iwia+1F!K!lEu-Gd;%Ox&M3$$xMR z)D2jUMIQqgWkam3Y}|epo@VHESze|`Ap$k=+~yb9u(4YI+?1qI zokz7r=@akB2BSnV95C(cL1^d=5#ENU0f@}+dtXVJDncx^#|r(RWy^ZE00`Kcr|Xquu_x>G;tz3hv(G6ncl(WC z==4@9<0ORg6QgW|sRnXr{GJ<7{YUmmUBin7loZmYiS3zsWUUEZs@Ufm6RT*|kU0AS zv{OwPOCaKZZ0cB3htpH!p56JTUy`;_FfkKb4i<@NFqTqN`+qQ&{ty5wXn;3q2vXQj z2GosM&j0gjb<`9zwk6oKMa@8PbVX<`B6LBXPQe+@D(NXG5>2u!2dK#kgpg$Jo&0qIfQ*<4Rha!)VQGhqj{>ce zvEY1~Ws2u2wEWGfCfWKBrjS*2f6VUUE`Cp-uBP!Tpu{M1B;vZ3qr^pQ%C+KvXTt<* zLc~jLu8bmUg~*~sJ{FDlinz(FOgb&s!z5O4yI3LPMz0jZhv=s`3ECy~!1hh)F~Ed& zl1C`lT$^Q1|Iyz+C3LJu%Y;HPCHcr+jkRU|NBhjWOkD9v1K)yjwo2B1`spH?YNN`t zd=s&PHg$SAavckoL;KM^q|6GMpRNiwEBj&?m-+kDzdMw!i3U{eQ0;!ox>Bx@oW>~= zm;Gq{kl_wLo%BTW_A2bvny1L@CV+yOoLmc%-{yPMFH5}%2t_nxF96~^Q(CoNO|ghT zCdDuC87i5{HpEvGF!((QsTYclD9*(vUqs;8$-KR<0B{g&&}1D=noz@maFAO$Yy$(%k?P29B^fv{ zf8UR~;*Erqd=pPJ!W)o;=eIsyUem)Tky}~Zrt_#fq+i;v?0M$GV~|~Q3~J>sexMGK z)r@4sI(w>4Q?)JC4DZo052$-6oAqd#QZYqgSR+-{%_~SbjrTGtKYB$9K*xIWjLx9n z*cJgR(+r24;e|tKWSdc%8{LLX_gMKYG^Mu_QA>^CFY?tZ)$aZxLZ?x8$Ft@LszG?I zV#!v4@pqZ#u0gu1QCnU8Qn~VkvyvS{+()f$O*IYTuP#tXAhA`s88A(wqr6mh{!%tQ zEIoa`6;)NlfBvy=#?S)Wknpl#Kb*q$996Sqp{?>ZR%(ij1r(7zmE(calx!;@@+1N` zKZ94D6%23fPIZ1209pTghUE_;@~^c2Fvylk2x_w_hx3mO_nZWmx{0 zC$ZbiZvO0C#0}+m29V!=Zqf|la=fUP==s=pNPZW)M80;o?wZu0rXR*jjVsl|imhg` z0EX3Hpzgq1yFT*Ixr=XAuHFzRJ%Y?}kXl?p*DT==OxXHC;j`IYuePLeGLe%;!IXt5 z3^(Oo20a!ueF8r|ghyof#o+eF>fo&!rQx%LH1S+Pdy*;k2k;(WuPY?EKlO|YMrKhd z{i#NWfmu5C$x-5iKwINV!j85rH`)uz;+fJa4V+pkasUev`TKcZBe7hUoMK*lss7>s zmK&{#V@061i)Xzd+t96=6|>PcO7R5Z{odfKsPdo@z?QqF;5tr|@aeC$jTdnAz+T=> z$65q3i(ygB2B;{pKTOOV>R2B~NOI25w#zTiV8^v)bz_Z9@(i0#ef;A+m7IzYaTJkT z0xu8%@`+vc=%RFda>nHk>U>YKwJ9s4*c&AL&ThZE1LE}g6Y>n>9p#&#>@`;DRMXhP zu#ocA?H%G92J#HSJN;X(_TDfsY6p_WKd0xgcfR$*13>XbS$f;K6~4pj>>jhE#Z4Mx z#gqi^CU1K)QSqRq*@$50}9}b2%va)t%S$yuL(%(b91`N7% z>RYLh<}WRez2N|hL$^d)|JN<{g9?W%E%jTxJJ9^^!zeU`U_Rd#;bblj!!fUFo8IN0 z$m|X?LL7%zG7!tMy+rrBS^=?7dLj!2O(i@+Xn+UuD9>+j-VwzP>_@NtQjhY~2_XmK zzQUTcG&;BK2Uz$f*)YkkWT(!`qke{`Oo}I;62DC7 zCQCcPJTQ;0c5iw#j5Bc)vfiS(MBTSt;o;RA0;}1uewKJoK|A2#z?2zS4ioZeCeAOCqRfKyf@UyPjc}UInEt! zIxL@8pP61WN`nfiT5TL1#GqTo>uhvFa`oS<_6_;2-Dk?l60wy6O@_sbi4}zWg)C>Q z6@s6_2t}In$MWnEUlovxz3Lpk-^f&NOgu%-c|wEjsXVYkUdTds^L%oDj`fl!Ljg3g zvFdMnRj_Sx7|!i9`!0byEoG*!DttQ?BX_`auI>Dh2M6{*Le0?!v~#gSbW5(FOPbJs zF6iF&Tq+2`B7s5tq##12Z)O?hfE)E(Ts^^%8#P0$MHVbl0Ch=d`25v5tr035@wdhk z`!(LE8!CcLAfYSMDCcV|Lda=iJ3x&l?0}2fK62~P)bZQj$Vz|-@=G>%Ou7X~h*F8S za$&@DJ%|Q#6bq)r4;@Pa4c4!lAGy^48~)pNA!3@v)rK$6Ik*+j!ijZG*078|p+>nl z-)Gd`Ca59L+J${1hvIQF+I|fzneRxwMnLr*B`t8}0;eR2%8ZedEp0C$1#nvMylOor z%(0>)$%3?M4)3~$hCm;OUW2(BYIp`%3~RXYX^<10f*gUtocXKJ@Cbm@AV$)7mj?7SWS^A+<^z)w+ zPbS&Z5aCeUOeHDo{dF%b01#~}DGUZ4Pt%rd&7e3!g6QVy%!hFv$OHF5myg$s?m&r6 z`m`K8w;Bo72#siw1!fmO1!0MbPl`eu_VFX9EgSr_nF#ze`iANERwdMp=IZ4!^|59m z0Rszjlyz$dpAYTwF|WBhn3-$fA)Wi(AsCTOlxp%1AE_8av+NT9p`DV#JN}Wsv{94Y&p8+D)s- z`Y5JYC}8YA4|;C6R7SZYV(kYTjq|o^fUt97JkHK9>Zij>gV2N~B&R55WC?@!z=8Zr zwuD^)1j&xq&RQd73*cQb@`CM?Y1^1MER#_cdALi; zeh=0SrdB1@SxbLJvx4>&l5eNR--_(hoqKG=V@P-vzg`A)C*LyRP_$&uN^`+-fRHPJ zpajJ`Wju&a7EpV(etd23E%FaZ_54c?td#u&4B?z}K_L4Zqrg> z^rY&^kbT?}D$wCbYZdjdVl^W(@ey;(B(%4RN@AvsF83Bz6|5H4S)P*P5yx`d3Ngu? zjGpp4C+9?KFF47fT={ILZ;Ie(>%>2}Og@2rgY73YBOv^gmrRuv*!U|xNTQoal+l$r z6VI8JC46flnuR~Wz8TRjSR@-hQgEJcDLUiPq;&0*%yCOb(wzL}h1Ee%ppaz+ zZn+Fl3{ZL3qX9H&`B&U@+bWZE#h`=9>Z@`mzD`sry_ch`{1ikLD= zb2LXe(6z^=NOp1gEZO?z zduP{b0QPN{aQhMf$KlJFA8GG!y=B|`oJ)pp_)i>wyzRZ%xntHRq%S@G>F_0=YA!Ua zb>&XiFRAajkUCkb4r*>H?~qBkX5D!Q2Dd94v{~1y^F+RF@N(%#UV@t1Fb;CS!*bKe zqZ_hVh&O(b@>Fn7@o;*0S?e$->+PXTB0{@`uLE4RO#`W&0hc2EPC%mdmU}P7Yu}yM)1|4D6}qgSE+e(-Nv4u*M{F>1q0L!d{oHrb5*s8n5!;@J^lUI zoXP#(Uv~ar)l|-i@8xPvFQFa)<#cHuPZMh-=`<|hBBx`q=_bsl{Z+`>C_6#WGJl%e4?2)q*w;k$b6lOuo=`#osni4S z;`bQ;B1GYRfzoOn@}!KGVU)e*4&iS+KI#G-zu0p4--XRUoAUc_ zS$ZLAJ@U!_WKBmV>27kr^HPLNW}==SoSM}*3ksQnx}=QHhygSrIL$& zJh9KGA1jZ1SATA%4H8|<(~`3(sB8OfoUR2POPFg=CJKb#VMv=;%Vwr8W=h>03|dKY zR`nIl9sbcN&x_-L3x|?K6cyR^izp5+VEZAzn4kQ;Z(D-U`uLRtX9@*#Yv#qVyY5a~ zyZ)}_A{p*uuV`=7s#UhmnbqDSYf?h~3#U>`BW~}hR)bA-M_S?RJ66ME{gP~KVc`=q z%+b<3!{k=sY_|eb2Dpgt#_o{eIhce>`tiK$AL;)|c3}UXWvA7b80`OYQ-q{o=~(|` ziaL40dj2DceEGqW|D%x5MZom_V~W#Xyk067mlKt3dpZl_CoIM_&bO zL;h@K$p?%1j{=Jb)sW5qN16qLry9k8{Y?GeoU2kW6o4X{FgkxDu%Y-Lt$HL&jgG8K zr6w#)eJ_Mz*C0d^LCj}A`4e-}q48h;e~e?-xvcciE7%9)7sTBqIyywN^vTTDKT65v zX6thGCbtK~GXMi2N@#+kTdzBTH>2`oBF5I4yGC1mak|>c?@U`Ap+e|!%+vO;BFrys zlLkNC9H5wIzurLaC{7eNa|v4panc7*8t@DqWQBIRLch6XhnFhnF-oN_A4mYC#$DDQ zZ2ou%RedthbqjR*>=n8HVZ6$Q*peNlOYu+nCaa!8T6@U)&KSR$W4j*ig}@xxBM7Yg zBQxwe7*U`v%IKzF?9~tN&lDrj8|NRmmh0vI2{<(Z7i|;&>>&#@^6rhJe$N_2A!8o+ z!fMX2W=%3H)9R|JAtxo2fIYw&0S~J!S$FMXFEu9Q^U>t6%{f{_ksE7SiFj(^FZ{3= zWuLHnD?;j}MeYs3Z1oTF6;6jPVWLOA&(bgn+@i+Ce6-R+jnF$^u8feEM9nWAuMhZ#gNo+wdJ(LD>H~N6(LC!8_id$R>9E^{0tp&V8Y!5DrLRmlhx+ zn3qf3;W5E2DC!$47WpSFYPNs+QVtCa4sZ^$zsMRGvN3d}iCGg;(Ixop9&{?v5;>0+ z;_GAC5%~y318s~Vn{>IU-s2)4|D_ad4H(RS$-r3) z2KnEYP#u^o(*M#zT5jqXmK+4+OY(o<V{} z*w8Jvi;@x{oCpE~`Gr6}v|HtFPm@!*`Vu7a z#j|RYjqZg`r&g*?lTGu+f=%*A?@4$1IIPLvo6;$-n{Ag_{+G*>p4X`yC_;(?(Pni5 z6**Osd@=Q|YJiQrTUP}+4%}X8BkdMSlsZ149%hw;U1Vq{YV$ZV(wUr>EtB#x%I_vk zcD7oWW-`8{akY9)9yga&N|E>#CEF-i)nny7DK6$jXl`K_E@w7Qy zLH%=ulB{GKEkT9OVn!LPBx=4E+1k7!8M?Nn`UwLP#lZZS%B_Iu9FOIq78Su&OkfR> zB&skTF-M`VHi!1%ixTl-(Wj2dKM|D4eM>lMw25*&<6^)0(cdk`NG{S$JDTS?tP-#n zFkn$V8z6=nmp9V&$Vv`Pa;t(j0oo(1jwMa&k3Pj5C;^QzPOqa}BE>==mki0q+*(>h zDCw14Xx@&a(Df-ilDr8^_TH~18-gN-x&Apva<=ng6&lRWGGuOeLtft^-}I_aOnsq zfb_xHI!WnvssCvJ!V5X?9?1Zf_lEZ=au*%AwM7>k%V;vd~I|#H>WcyOv|d3`PeV zi+kpq$dCt@Uty$)DI(Y~<)2>LiSqlE#HxBCPnKwVg53$pkMbxvI1Ya=65nsO=th=| z_B=K{S`@W%HIxiqy6ZhqIyIX82tZyCT~HtL8ZIkA=2|SRIlnvxcM*gSBu3d5CgmQw zCG|X0>5zD=w~jzUh!9I%XeRk{kydhDik#&#jm*7mwD4!3IXT0{5WtitW#wmL z)u%8ava(~k(2Z)uUm1MoohNhKF|SXJXcUyao{gWKI;}}B){9y;Caj*?Ou!` z=v!qWBw4qAaH{(P|sPcXyQFKc&3KP@ES&^_6C1hYmyR&2~Juh!wiCYZHuqw~eQUJPTdPBWNfvRp* zaMOsAI{CeAAtM+yr~u1_n=>R-9MQ;;!*SZM)DTj~g9J}tk>ETo(H;TfgsBbI8PnMS z)ld7;@qM^Lq92-Dt>jCEEMfRv!)h&>O~k*kA1%wBAT=;A2AtL>^LmMX1XWz1Pi`qA zbx*R{mvs{*lW7iD9s@$iqQXh&aqBqRCuBRxdV7$9{!E6We#BY7_duHrkFg2Hp+7MD z?dSKhCf_tyDY~JLyE!Ea6a(^Tf?;NpZ5a6nU8f?1Un(<`$w0+AfRBzypSFgV@cL#8 zmXF-7Anxz6>BpyY4SRn9$xX(KjtiI+e$qZz5Q%HifCFJlY2vsy51AEW=Wx!U$wdeVctu3{lsHBGMkj|)aXbe! z>2S}94G0w1>*#WtjYq%aTBV zW4fe|AEDxo$}C-6pNsIL8=e|*Jd)z@VSfUNY!ocFAOT*QEdlXl_2m?ru=V?(L+2_H z%?vsHryV2k7ajxj$)z6QrnUznr5lH5B9>bqJPsIhr+G7Q;XFDAkc44LKpdNE$oav& zyWm*bRp>moqH)lC^O0fDz|HFoWvqQFrmb^p-cs+x$OuqWCSv&TAd zn9()}?f~+w%?N2QQh9otyH_dlKdF}YdWk16fWrQr1gm=!l4j)z>|^i9_L;+j;x@L< zPMvuDm|6!ttjmN*2nxnSZ>$(ytVo~smA=Quy>URU`@>W4{C43?oo+(+lAmaXBc&Kd z7xbax|o1?gfS@aCr1(F%(z2g10BYpEDN z6bQej+M#WP&6N#4(q=~|&q7dz!eb(~$Mm&K%u~7vgg~6ndh|(%X~o@;!q6!GtC|?} z2hid=TN$dmDr-*OlXMwW3>t87S?z}YyIE!5`c$l+?EQXA9>G7*xN^{uKPucpBoXvs$bo_O$AuUzZ_PmI?Nm zXD>^cHEvi)^W$&679EbQmGxPS@KzUzJ-{#67S70f6K~NaIS&6^@y+uB#}g2@p3zH@iYTEhGXwpB8KgRWM32`HNp^j9L>9FGY*rZh3aC7qfll6!Sj;G_kP zc)dOD`Bq(y{ab(Ro+)LNugiLj{my{Cf7h0nu$|~iOk(%qO#*2r;NG^D2R)J@6wsdO zi?;LIrSDxwwT9d2)a@8rQ`EPzXtQZ?3TZ@BmSJCa4)QiOpDov;(6MlJcheXVN+#XC zbll@kk*tI=2>Io{4y!L>m5dhti&_JpzVe#g3vMU8F;taPo0K8GlHR|si1p1fhsyFdKdyx8PO zioI?aTtuNXmGFdezV1Pxq|d*e$rs$ujze&I*7Fs!Zp8meh?PQca+df!p9jl%$c((< z2Diqw{hro;d$9NGyko6eUIicdJIwIcUmFj+9`zO@WB}{oq#{KbcVl{;2_Oq5JWh6M z<16Au8}oPjI=RP~H`yE_*;QNOB8l_&zy8*kE{-NpAIbu%ay=3WF74fp$1GI1rx9F= z-f^qyMy0WK7;y7*=pD+0aq)@1!O*~LmGr%pBDDKC#*e1&Kyh8Bzv0j=7*oi505&asae7 zN;YNla^ybQHA65P0~ZMFkl~E{%Sxt4OO<44bvTX{Fcm{rbjJ0TIoxox__oife;%p( zmC%X>&KUIV%T%bpI{=#Fq#YcEQ`)^13rgn57VY^oAROMy=;~+6s;aF!F=xCD)gm0p zO(qpI?D8QOEWNY5$9t8QW01=w88wIye`bsd%$wW#9)!6 zOW^M*hsXBWpbo1^R)8oVBtrMAM@>G!(^qpxok&%};{i-7OphL7Tls%pT~~-- zWybBTmsBL9$L+ySj_IjRtBw+Dw-XZn?2O;;o=)r3gaQ)QBOKPwsEt;l^~H2fCKzF* z7rooQ0(i=jDnd&tQX6H8QDTTMB}{S6eB;X%Tx%$KR$IbMonmd0IC$hO>wSvTY90}q z(U+(BexcgXO9RAYw|+DZRaeM#*)Z!Ls8g0>5G=C|yu2^Zi*?avlvSX`X5I9#g_&H4 zxzH9vO(V3F2<)};yhXQEB+9!*@nHND8HAl4`X*)Q_e?1X^D*eNIG&?ObyN(iRm&9A zg{&jMM6QXG`ukj+R5a=?-bA(Vs_|+tf5Br z(SCC;E|4ZAarY+5QsB^>qs!bys>*2KoV)%jXbaTN{mG=s?>Ks}V*6+K!{eC@?M>;X zaR%@Ga;$`MgH-TxeuD>B4-Gkz|2b&1th57?nTC3o9U3I%=VF$=oV<#Cj(4U5Yz}+> zd8n7}&kM*c$AhUILK&GS2P;lSEs>j!9+8LcHyLOV+;G?2(f>(xBJ!13 zAAX4D>oGWo>ncA&ndWQ9TbYSkHsNagqEt%3g=KgBB1$61?GRFuIVKP5z#Q(&TNkIk zDg;CwA0Rw|psL^y<0RIiJ4rr4o?yeWHyq7`ky0(8s088fu__Dc8I?hW-={dF!#i*; z%`WnW>j$~yA-jHuiRe$cz&~ldk2$P}hE6>okmn923@&!SKcP!tVxMDLbHuxL)@j?b zEaIMP8%=R6F~;kwRLQJ^P%m-w1rvs%CIc=Io-)~zXLfa{TaBB6sLBXWBuolSOOtho zn4;I>rh6;>TD3pmbbG=APE7Lk;fF&oML!8#WD%Z5o3yst11G=1lZL~*(I6aUoJr7H zKiHNw(+sT2JQfmU@8U$(Ai%-rUKVtmRy*mb<@WuiIC0KJ#ohxSTu6c0h=fXc`2c|* z3wolT{Pvs?#qo1pX7(X6aVOa4xo7kV_X-B}H0a)2W>iaF+}FNju3=~d2%!bBme}W$ zY{qi^6bX%fzsj}U!bYqo(sH0|6-lfzh^APZem~v?GEr{)Ip&VsL;1}emXe%8$V6sM zcG76>-;)0ZIl~wsv61-D&eGdAcMpJSm}|qi@<;7Q4UrIiKq4a&S8(=Enp(xl$ZjDu zCc?Rbh9H$rG7+}sXmXOmXOPLva*{?*U}}O%vkyi_l$xaCrY&V^0yD>fN=w=ned>i7~QLXF<3|I*Y}MaZT)!A9bbmR@}w zSF;Y*HgL3pTVUOTHu1uev5&>o;a|bGw2EF32o&0Ba95`5Lab*v)7mg0$~Lo-UC5I5 zOMe;D;!c8tj#uvKT=RwYBv0cp zn{XGoP!)9J&5vDII7t8Tj!0wQ@Dvo>qM}VSICEM&o+-W45L}VbvH&0sl;d@QQs-R9 z);*gu;Mtm?OPiOKgyMr}v{PhUcA)r936LbX@E*GmST;>XQ$6IzW2&>Nr<-VKbXSSV zUY3>hwtlmi01DIAkB@^EhL>z=LzF%)Sc5uxD^-qP6Hjv3)e3fc^ET7y`1^DGZM44` z{qd$hS0T2)_LN1ku%AS+w>_)W{qu~!gC&kLd^5Xk6N zL@v1eIAcyj++5_RbPdWK~B6W#-|$;ETeA-@b;#DEsFL8>^#4y{2!{$DK4<@d)V2wG1<0l+cni> zo2Mq*w%z2KJYmvg+qPYA|L^bWz1yF2)?VlKti7J~>^#6w?TBej{L~H^%D1b!#f4H6 zYgr=GAX(EJRny7cI9b4&iovmS*dcDTsxz+sn^C7#lR$ggJ7^Cdm3MPg;z{R{Mv?Jy z3u4}?xK04S_cIpK6LfZ3R94GPTR=}3627A$QQR~dZchA{-6#m=)wyMkJ)3=YM+T*+ zaiZuxz7|--SoQ~0PHNJS-Ro)ft20&73FpVu)}|}>jx3{hn8UPv%MljI!|V`(PRWdS zK-lO7t+&o_RvoVY845nALSko*1s#J96q+XxTYc@_+YzdP5_NL#_BEc6+uEm*rQHFsz96YMBHc?%FOfIvwymxHBZY%&W<$2Di$=dy!i3P z)B=D0HP6Yns?e<~khT+R$AJmTnY>`u6lhs7oEIX!r1KuDMNVPQ4dS};TBt=!ffGru z>x-Ov;^q8dvl1Yd!f%V1*!%GU6=p>ybxbdq);)r~`z*^F_N&O{nezopNbc}@)m0FX z#=f?1*QRL~-=8X}4DT+IJ?f}LFr9bJ-~~ec^RZ?zD>G`<&t02O^2cc<7b_86yLhwg zmD8qUPORHy4C1a_`PM5h3RmaA@5q`{{HuwIi0%>AYYj{I=I~w1yt6J;iD#AOdXDVx zA>Y-<@)yvZPm=gO0zT3Zj|HBUC$Hfl5NLIGg*s;FjdvIY4tt zkwI3;>h#F!oc1NeT|l5{UAAY=zUa{8vS+$w3VtQ%uJ8e)t5`sZ$%bi$ZpGnP<6Oa8 z;T8T}@iqLT++yamJ@2D9Z3h3v%v%k4O7Df5c`}1L_6-!@0i|6Us^w?{Yr(TKBoaCqZ5Z| zB0uctcX)Ci^6iN5(AG&;r5TBPlj zO6d&d3E7FiZ^m^ce^GSY3B*p45Ysy&EHIW4EEz)m8jA2ead$&?*kZfJ5Ho#7+z4N8 zoW}}F(|5~gkC@zXP|aTTpzbs~_f&ZlEOQfTlfY*O`3#kqhCB`y> zok-l`&I{ms`fKZlGxe#V+SUd#{hg)OUN7*4o#4Q8PwP+H8CmdV1|A7N7@zOuYqu@~ z4HFDUDFI@oB4e$NXIB20Q1kZ)Ab<+r{T|0Cwv46jo5$w&C55y`2bSux`DG9Kv$Bn4 zkL(W#=gn(e^rTnCEjnWnC6z&<%B%SE0v;mTb1|43&u{_XlCbK#Iw@K?WJ06Eg3x~g z>Ic!GS6S~AF*jH9K=v!HS9kKKyxEa4@wZHlZ-3Zh<}P*L8g84W`-Os0?2%I-Vkq{ikUrrGO24X zs4fucUUrUsekwR-P7^Ucy!tNG)9XdQQD;|{WJ zKO>iR3~d`DMoTY>eZAH>o70GsGuPZV=>3c_@12p70pR&L`;C(Eq#g*j}ezbcU1Wu+K>ajIKtYmwvW zLC(=g7HX=F^De-i?OKfA}gxx%fEuBLe!e$T#HP>Bxmfj<^Ct`*(PwDMD8m z5Cau=0G8Htm@kZ9-+XreEKeTteuaMjZCilS9v)U~r3-UxV^ON;=oU`z+R<36mPXR2NJG#(ak#EzE18_Mbd z%#g2=jcb<9y2W9AJ`ZO+F5|8~T?R%IonSRlTEV&VwL;!wed=8Wnl0mE0kIw|KKY8R zPf?_5M&xCZRIS5uv3$9Sq*<@8T=%1;K6`NesMgfhjq0_x@eVX& zB}ICpOjP$P8#x3`T_dJ9tQoi|ohF_@B!b-X4f#Z6q`B1tCx;>{;W=<5b%%{IXHH z*(vIs!$eM~(C0yS)$Ez=1>cy}#r)g;#J&WHscd^-5IF}Q-+HgPmh|V3l>@~{X~#V4 zEbvvX-)hD{SGIqHzWS5*{7+z9owm+|EoQv{i|e_{aD!cifKtr)sO`nK~ zUDhKe)$I3c>!RpPwLh>}!i{@=&1@AR7*C3tYJR)m73LVqZ%Q<}GcXmb zPFJo^jvc8O24>eM<{oO?(YBHdHP5^b3w~~Kz9g=0<1yIg|DhGO;eb;Z6E_@Fn-V1a zd8Qilqb#+_+?N6`G;8W@E%3MD#;{W1yjN<^2vh#FSIXoz z*VNkC&h3*}6DQE|3|4X-LL1dnW7{oFIF4Oqdfgr0^9$?R%No+C_NQ-%^)8)8@GsT% zPMw_o#fr;Y#1q{+8L5{S~g<9Ijw2-^4u%=P?n zI6Az_dhvQo^~de0F&YFGer)(1^CTp zJm1Nr6|5sz-wEAta}hGDdrFG8$9BNZg-)C+DDwAt-9nmXr!LjqN@f-FhD#J@PlF&i z_+s3U&Wf?{;uoG}+O-t4v`o(++cn-%?wp?y+W}dF-KN=&BYDdv!t*;Lm6&Fp^E-Rp z0_*w()eP5cwNs2rm)?5zl;soJ<_#-ag?lyK9rhH#qbtI)io1gM8uhHXAEVPNiR11_ z?4CL8SlI`{VQH18bqZ8~hdAz0!2cSa%3+?p}9@s?zmraI7Px*YtPp_rF<+ztvLg z>x+MU<1PO#Z!(?c8p&4|CaX+R(7MHB$-f~~W}PfMO9L2*t2U=p-V*l$ij;&WWLbt^gYjt%cIq-n{8Um|Z7wW?QzSYGha1|{W2{ezWpdD{=(kR0+X z#jETs`+(glwY|9>_V`>XMnU?QK#W30YI{-rh-pO!-q!)|g}v=)|C9g-&MH{IAK(>K z`T8B9*QUY{#4ODYq_m_3JilQDG~To#3?yEH7;3n2t_Y+Yo*0_CZVnwpI+PC-j^Um? zU{iGx1ViV9CqO0j1+&*uP5{|h?*uY{CDj`?e@XQhNObd@1L$9!6AzGGhI{A$*i>)A z`~g)55CY?hRuD?vlSvS0-4iB|5+KzZ+c>f01I{tNL=c2~NfiL6Zk!te*-w3e$nR7A z1WC88SO-y~zjp|zNPQv5pHVdeQP;6X?q!!F3lO7M09Dt^L}Ff_VFg8MW(VJ5mb(R; z)6Rr-Y%AFZAuzG>0+G_y1r_d{fdl=at&7^LlFEsFCWUK`2NK)owl|te25`1a7DX`)-oc9Q&6O@m24vH-jdr_ z8Y;*%6*(xpG^L@h@BJfz2>xH78W}_e6u83ImP;ClQkefXr?WyN|L++S55yVRe{YHS zA-2(wzT#w)bKo<+eKDBB*lCWjP-%86Bq8j?Y z6_hW878vsXCD0~oxXacB0fB-5OLK~a!u>Bph0e@0@c$xClC zS6#5BOjF_4(J{TGzFzWYuxRig+7!T8PF$f}M(Che9XS$wjiP<41cMv5msRZiJ#Ejg zTBHmDCtOgeT#mQiv7T3RX6UZYC{z=98^wF71hxFJvEk6@v0HWR&!K}k=B-^j(Rlqm zGv!_a=&lS^-gV?0tCLKrxuG>O*q=3dcquGz*stU_iaFF4`D3v=Qk=~+6s0t{!=Dv* z>Z=iLfw_hA%lY1c-psg?OSmW3ryO9Y8B-gKo8-!0!)(p%s+DSvh+=)n;hwAh_ z`1`~8{%se zpdAzE!ZI~4&Z5Yd$H(#B(ZN$?(gIF9$+{pRwdw@_2}J1gw6OD^;eM3Ipl5=>aHNDv zmB^1UrZ~68+kN`H!zgbA1C<*xwm8Dkv6-I#W!6r@kHQdNt;ZC8xZ)RHB{IspU#(HJnaKWGZ{5XsKy?5_AGKo_v z;xubE^%`$SSC&wb!zv3%W$%STsOTF{KxKY+kX%T2pCPOgtGe)VUwnN3dZ#kGsrtdp ziD#&CS7JS)Nx5Dx1WEn2j>?*CJ6G4}*eYSNG%P8iatWZAv zLiACxv3O3`n`n>xzN>xxeGqPSk^5BmVRumHx_)er$fiZ-jlrk}dZGA?U8P+XNK?2H z<6)SH%x&GGm}IhOTzGvi;U&gCxvRnuDK$8HYN$SmEe3v%@-0#yShv^Sxa;42 zcBrFQN%PoAm1}wV{XS_JQo4$^3)Am!Iem;+!ERi$PgWeOk-KC{d$tynjB(?u=dPai zV+(LyG!JPab39ZNDxV4*Rc^coF3?Ngj;(z+YAITH=3o)NPc2A~t;jO+iqyYIF=Uuy zn^OEr)zO%!bxwAl99^z{1KDAPX&OZES5s|1`KKS1jU0xn$PJg~l09r&klM}Qm;SB- zYoiUsI)VxvX5$2_J4rQ^jf53iGiYXNSvuGSOCQhe!#+LP6TD+^sj(I~iwrgdxtd+slkNpRr)D*eo$ z!%~wE(9{0OAl?Te-au76^dua0obgUdssdoC5~(_ED? z(F%-;+tbinJfkkY^a{1f;7= zaTyAwYX1(A5SGJUu5tA;L4qJDjK~h#nykv<^9dFc--xTe$nPqJ*};D z2Qr6`WoCSgQchip8=XZbcW1R+ytLLJ`=!)F4aDh+bSEtS?HipTjc4GL(#ncVYw5fH#t-4R@g4QS-Fd2@slLiw0r$=OC0jBiZ7zp+RNDYyC)`*CKW0ly3sBpv z-D8<|lcPD}{u8u0+5FdjgBQP4rioK{jtl7J{=m$_eR&%A_l}~Dj^*`jgIQ2z+&dvs zfq92CpekGE;bk7OoD}|J+Cx=o+AWoCP!)NbQkvnn=bv8o9c-`#Y^}b+iO6Fq%T#yM za{r1r?Af>7sK)LR2ziJ;!BHZ9_PaO~Hui1htb!4G5w^$qL-b=Dxh>}U>A4HPTMCO#4S;9WW@z$S=r7mQdlJOW%XAL(Mq!wAvN(QUgIWSr7!Xi{F4XK zCX8vnCAJeI&L8WgdJx~xD!{H-R`uG({AnJ!sjZh!QMTtopEz>LI>bBHRmgV`|61I)wN}`At@o^vMiNZPCi_^g_<*4_GoNYoYh-`Feu{Q7n zF0l>-v!XmrA%=gJcf7>EPR<~z2LS#N;9%di^638l$fGE%$1k1`JfjitDJMnzw^$VR ziB!T=PcNyTAPaCB zW`E-Pl4uUjd=OSkjk1m{Ctsw&3gA*7R#C&pU`ef|C{ zNZ;hj=D(23#)q^aX(Q~R^O}J&;An&6g7~A;f?!o6bd2&M2YkOi{rADa@8$RO@?;6( zyq7D6l{Bfp9A3=4dN`(=kvSl7AgFsxT=@Qq40$r5Yn)eYOj!uL7bFk7y@aXusxq0%QR-5pS)6>BY9plst0R0 z01fk%F2Y?``)>PFqgZEgYhzfZRYb{5Qd-D%03G(K)Xe^ScpvQQX~F(JQwZA8E+dE! zv%Y#Z+|y9B6?d-ujd@I1eF7z#g!py%#RlC&nqYt!N!2^cl8NIfP=l+70OhA$q`$>t z-~Nv_N)$~BnG=tUhJ4Sh=%;0Z)a7qUSjxYST~XiZ*hKel&EJoYDd;h!_IK34NURR@bcC1$iiw)?8IA2U;mnm*a)fKd-Sh#m|a<; z9;#E8Q6^?7S1l^Q0f^Raqzz@xa;%SMzrEN*9Yn1xROliF!C10#tjSL?Y&@4y=@Y6)gKF3 zjr~vrc^O^PW!B%d30YKf+b+c;zxA#b`gww}Sv?g%W69@c0{3cH3-0P#R>H;3aS_^C zYf|n01oa{G8b4Aj|oJPr}e%YpY1#+=8-?SyQwfg>| ziF8CJKD9I3z`wX*QmUGTY%i6VjyH14t`%o!#mlvApjkkT6DM?o~$h;>3qN! zh6?7l)_l24d{=D)>06`Fqkhm>nfMv8@wncTRTn3g5GF8+pxZalHXvLe&^UVLq!2kM z=u}a$2)N`1`P<<_3vX6;y9S5BOAHdRQd@J23uq=X7};d|J$MBu@N~XhVCISUmVk!@ zQ=xe?+?1im8FhL->|OCBgzVrW)y<&8QsTL&o5qPalzhQ~U=^0924js%o*qgVX$zY> zHI&wL6Ju5Soqv5GB|L`=7xS4$A3a|vud1KQfh#Qd)tMlK*c-TCpKu;MRLzM3P>8w( zl#_p?_B`gv+ng-Qo~z$b-~%I-dYOri6?rn*H%yPA%qzH(*XXy5Nc-tX%z})goUVbIorq-1F~idol6kp^#9;WC-t%)iH0CHs5p`=g z9m|y?2tMq4R)6f{+Me2Cid5?>@3z+T2|yMjlQwq{zu3a=AtOj%4ZT2k5tzcstpG7L zwZVw9@_ndLT!G9UpZ2f8`chtzP#r$k3V2;o3N^1Gx8C~lknMNh28elG4-;3VcW`7l zyP7p=8{*Nyb>0pfqy0bgSYAx!0M(9I$gprC+uGj^fB0X8O>)$6o?CCiTsv`-a)8@+ zhKc!wyrWiGoeO3yZ3(^9I?U75t6fj`3}~d%mVX`y1!vUm z7`5q1u+Y2uVaEgV9(+ez)3(ynOM$ZPe08;OgeuwXYOF0q&w~uMpVy{S{~g{L`8+vkOUQ!(h)GVuRQw@fC1G$8w)tzG_2ZS!D zIr3?B57*Tkj3V0%W#W^qW~_~(sV8I|8^e4;T3I;pGrMU-H4srm(a_ka#;Fiueey z2H6Lv@eKAnNJ`fx4P;kuQkV@=7szTek%V4PwzOK;6k}mv!O%@<0wLcqj)Sd9c1u#r zrVS_qH_)Pt5Lcp%sFJ>vHgbRJ^f-JoWDqM!QVcT~?_ZGu3UH{+JCR<#+w;24I}n?D zJYMvCf zXlH|^yOMoEbmwdiz`GFJfBsXi<`=_=bIFkgq-~i81weEeglWL01m=+{>k2D{8fd)kuiun zX)s^?t<70mg~A5ntki0dh;zq!XTedR^Q|G|B>j0n<{ZViompvd#$kz<&(==82|t^} zFtms~TTo;eDF>9v1*rqEH2fAiap_fk8$sMR5E1_`j*nFGL|q>>%>rgQEM0z^H-hplNQg8suTCv-d4Q41}VgqZ=ZA6z=?K7>_4D8(_dg*3E+CRZs6L; zk{{Y}+`b0m-()v12Ty^8;5d6LBpx@az%SElv**=wft4d_ln2Ak=ut)1ZguaQ(6L`J zH{D#RwQntP=+1N6YpqXeo~+s&x#29WGAUy7R6t2Yob0MKkzN=eJw^#PGayd{gsIVf z5Oy>JmgK&>K#M0iXJQ!H?;S6E4ve7~d~Fvsmris)w`JbFh>l}36{RKy3xh3mKhmL} zQnqLx18b-E(W~Px)JQNX2zy&~(OUOG|BOU!fGRCnBuOQV_Z_v(lB#ho^z`7?D>qcn z`o5$=cH32t7*kU@^67kcX%yK3X0SxPpI%MCgOarn?l8!v{NQzSb~1i&bAaVNRItgK!0tCw1!1ZU^OqBXI%k_!ciaN#v&URI^vWuC3 zNmTqA^*}ff*;*o{4dkx_GzlU84R-c=uz}3B;7a`miRVE3vhdj}6#6P80*f3~uRkNNk6c)9g~oC0VrE~`9XcIj&5T(V zBj_jNN9<)UGKM9jZ#$uLQpiM@(PdvSO>zd*_bTOoO#`@?qtOZS-ezIp^)Gf8c9S`oERKk~_z9>7EH z0%0L7LawT+wlO2ByZOEo&M4BrM~6uAeL94^F@tU%VgkPb6RDidP~xVhU0(6D~0_xODEB2;(W` zF5;kqd05r2q)m4*zkiC&;YY$S+2`3rkzmFE+G zB3U9KUUj~8FY-IRV`C9e@4@$>)bBXu-R6K+B|oOWc_rK@!hxSA;a1=urT~*~Y6)vm zj^{0Yz}2G2T-u#?T;$wMj|~TTD}Yt`q@$!R!Xrke#Wy?$s`v{CX^ZNWC-wV|2p0#M zT0urihF3Q4CEn zwqw$;I+a!K__An%2YE;CGF)*a?+h=@E>6UHePqkGfRb_(BgrJ9w0(PZ3x%hDYKaM; zN-J9d##GvWbd*p{t@2Gh&Ev~!y*mn^DQY$hJMjo!*yufhY(fJ37ec>(awTEx43}(r zMJtKuWCT(j%`Xy#Rv#UrR@%G_*&q~~`&KErI0*)bkg?J}R(iFJRKav7yc(#kEmxCZXn%f1U1c>5GmnlJJI5JN#>&qU20* z-dFWXD_g71A-rUk{_n6&tV7owje}Dy!m!q6W+1TrIfxpf5Sy={`ssk7%YFvJFlg?d zsHdJdO`AC}GZfg?bhR?~5*h#F+_bdX?sEli#@N_N3VIc==G>}IG`WRzF*|nkO!#Nu z`-&$*AHL9QZ?J0pCA3N#Rx(RpnV&TTYT>UgB*5WU12-(+)z@P@uoYbA5U;vRb*dKpEPwiT3I87T zKJ8umeg59vDuy46*(cs%&}}-bc+i`GR9&P-tl>^$O->P44U-FH#Du^&8X3=S~d z){;Fh(2PH3^HJ|I(HaiB42o`pW{LT#ly$Vz!bvV9Nklu}hhx*L4OV27$o{_QH*PGQ zmi=VJ90;it5;!=L10yzw?LNGk3tMgP%X6^3gBy)rhx(f&096q&IhTO21SJ}2_Nebf zm$Z?cw@CB7WO=wb@8(>&4Emam)d@ISfyEDFjJ5+WW?Gc*`2jEDXcDy`yM_rX(eyNP zB1jQHMZAR6FMvl(q;M!pntfGR1WiD^g5;&`waGHWuvkT2$i-K`0a9jOpd{B=(dW`Y zQ~b^7`tq$(qGPv!Mxgfgw?SUV#+ukI)#YEc&MZt{>`pSiJeRcKF@+s*1Y=;+`@3^} z;d`&2l!Mor_wV%=FnA`|?Y;0ymK8ne%hcEKu`k@*6Tq}AIGcTN`|G#@+}mIq>8$Sc znx=q7A?q`PuLr;4t42IGON3PStxIqbhbY)+)ZOqUh#7a(qiPecHJ~nSv$JR&f0`Os zxpA&SMV;5cy0)4<8CX1=y8)ap57Iv?ks1!XVeQbLt95v77_!{fTMhOag7cl^SeO5z zEg#%0;aOD|(WfR4R1-*kpm(9lMTyyj6et!dAL)piwgut`|DI}0+vUQj$1`<3zHUtu zGL;;&Us7$LvI~b*r*W#RVQvnjcI)`5UW7AGA|7(8jFDGe95KbmKi#jsy498KJ-0o;%ke~*H;i7pehzYq zr#5|+ul64<9yyHp1+?wedira$P$KJT%JZ@oHjjJrS4M{wmwL^K;C9|FbeR-g-FNZ2 z>0biGKU6YV76Bw=)I*FP?C#eMNBP&=5anJur}2!6k*=nu6Qn+>aSgxPAWAa0as@nf z@2~rN7kt#r9@$=d{EF(^CbkIWmT)&?9^3IR3-H@P%iO!lesQ^CK|y%l68#E+>tpjJ zQ_n4<(E~r;V0Nv>Wd9D;{J4O&CSToU>D8&~!}!ZfmjM_iv!E4p#q3J%Z9?YaV|cCn zWEIL#2>Sk9R>RH}e8|-_E&b+)MWJz8RVF#ykoDGro*2G)ec|X=OfjpPz>0ffgbLl01 z9F4m`g#{emVH{$_1muYCvEAnU?uy<16k!xc3o~)s0ulUWe0Q;31E;|dGUj}ejgx+x zb{%IPp?J9bVc<}w5J<1z{quwZgNPrz4Ms|Zu7F2=XIYnbbm0!@l^3Q5*AG&6OQ5d% z0SR&TccYHYt9A2xoB>-$lL9!u#%cM4LJxvEgc+F=)OaG#wML)$-~N6BIa_%;mnK71 zSj7<3(gt*R^rR)`Ma@^SAp5Ie`r+H1wW5TSBmTCHew>rBgn531WmtB&&vSmYW+$f_`J$_r6w>fr5D7{<7b>;xd!(npjus)vNd$ zTqJ5eDKZMIT%rYDlxV%Z`iSeoey&l9>>p>Rw?-x{+D(Pcjpmy@;(Vyws2`h9oyGHK z9^N8=9`cc1S61Bx!Je4GN>Q$RSsA9TeYZLR!j1 zIGPzGL&0saMwj2%celhSn9Kwkn!bq|Pg!H0c>QV5X_=m>4n@;EB93%=pmNV~Rf4dz zStvj4SOqsh5?SO(1&wpkM6EAevMHt5*lM|>mrMPCWIWJT|HQ{Z^edP0-Rhu*&I+`2&sxZ7+C8(-&J$eS5 zQ=BC0!(1Il2vo2Tj>&maGRx}UAv2lfA|E9seooAb#%xtSaoOv&Fi)3q(GKGu1yjVD z$igz0*rl`C45HnW72hELPGbha$N)QxN@=v2LUxp|gXvUtaoYhNf1QvPr~TL?2Ty~5 zn87zlCaS|5=;+6iwV{0Ki?VBQgiJV=m5oCC1%h!UQA~~csL}3t);Hogcio&^M4in+ zpQgYNTUfU8rUm3Po4I{J)u>_k*XJ#%6^xKe6R%a;ZM7LAT}6?0gS`DOVOF+R|JKf@qd2}K>-O1$3^3jr!5Es0y}<(o9hE90{gRozbWzU4*o{G%<3pOh4`JYf zEN}=(@;f>!U?Kjj(*?Y?3JFajjCp3%tRB&abGx&m8+`P}s%Lpm+ow2-p)gOUOLUWHlA~}4%-v^iwea98;`Fto zvs8+mpiEa?^Q_Em5eSoCM6GitV#k0df)&I{rq})qGjAQfzRvsi5irrw2hql1 zP)_8alRcbtzWi_SuxZE*_#O^;p}Tu?=ycGq@RY9 zuIKUw5N5FC4gvLXD7&HLu>`sw(gw+q;ZdULg*3sNMRj`4Il)0BRjv#Z9Edbyan?*| zE9(A=SpP=c-coAWfJlmD!CN}qyJS#_ z!B|{1a#4WY)=3_;1R?(O5L?l$BRf*i|G@m`W-3CP3pDS($NIZ%*lo{&I1ZTTkC?l% zwg(Bv4XB@dqG$G`9b`??#DBS&4$-OgAxG@nZ*Xju(h!%kV}@`=WS~PayLid66X7P4 zk=5`+kCIrPd=+u6*-rA`;JP($OSp?0LZBUZ_1wz#4%nHKxS zxJ?(DIWy=S9u3oF`Fk&q2ip%++y@2336gcaP;S#SyS$cX9&W>`Tkq-?N(j=;7D%CJ zt&`dQ&5IweK0ZcSzsR1sMH6v_XsVC{eVKvgxbliiNz8a~-^4;A4R7i8Ug3_cbz8rLJJw4pjFqhiIU9~T>c>IE4nOu%y$2tr-7 z(p(LsF0X7&c%4SI_sbX_#Yw6pj4uJ-HqRSZS;seGtO|;XG4$U-t1fCf_|R$#aZ>HM zl>UwiwL@=A-nf~+Tv$0e3|#tr4G<`PfbtxopzR4ifyuY*%&f(m(WCS?O_bICZJUuf zxf*1mr}1Q}nypWI`M*xk%Df6&0uQ!xbc9|?I=pggjvw{hg3vf&rxjaO>N6ld?eSoh zzRc>f&yE){o6^?2%Otd5fOD!We0=&{cXk@%H%TN4X|(^ViG=os9RQit-iLA9T7rPG zbSM@AO0PKa6fkRdt8MNQy{$ZvR>_Oz+wcDWA2R9 z^mOgrl;xw$nYtD}8E|^4m1dIiWV{&Dy}{Q?LW(qnHHtzk{L%VqzlIcJR`WwwA4de- zqiSWOKMwoew-f?0?ERNh{*Htpa#iDY$GbI-=%b7G^6}EDOu<5W3p()j=0e$D_pvgL zK~Hr`w5yLKQ-1{E((2F|=9g7p!?wTHwp}!P0E@wdR{U^*QH8;fc7I&Wa z#;zs1Ub@1t{c7b8-vM|NHpml&{AC@Q4wn*DKmRK%d}#b{Kz_~S-vWa?V@oaU@u6sG z1-Qk}2S152$m@y3Vf`FxJHD(=M2~faqNBC#Y3hllS@?IDawQbT*Cnt#t{|kK!im9%al1MLueb^YIyO%MBQ_Hk7aY3x5+Y_!EmdwO(xiUxbQJBm9&J zjrXnX(Z#dGG`e$>Dw@IkH;z;b_J5Fcx5Uo=dUvs^}CF;PBtEbdz#W5Ul3o&hpEjJ-x79a| zSSRBl4A}*^AVC#JRqed}e7MGZBXm<0TQ_7v-CVKf9On*g?QOFw_t)VFsgf#tPC#RO zw{OS(~c)i_|P$5hOTZPVi38DbSq$Lb`hDWDxuk<@L(_ay+I1f7R7<9_b}oc z+%FF~YeOhE8CzjTFMv17c?8ep8(gxshYF2)>oNl{vf}O**!=X1ES~*SGZGD-QhterdArmJmIb0y%5)1~4E?5Lo|4tX)L4|X+M1Wzq$)>ggD_rz z+%6e7E#|2eiLc8g+S-VyMqZ=c!f6uxl}X$#sZY*`xQ0Qp8B{+TmT|PSUHAZpY@x`6 zTqqVwob3ATpCFcKHeVGH6J^Jg9TPehmc)*Uh+G`)nP4(Z|bb>Pu~xP%r4 z^2eg+b&-14{{w44l)r7Ez;b9tZyc8=IR2TA3Lco9*2zg?{BP5L1x(vshl;^Qau;PS zD3D81%H8a)_}vj`O(oximZlG=EbSR8bt>K&3De+3MahB(@p9HBAF%ebIzQL(&J&dO zFMFdY=YKqF&9qA`hFGL#*S-(gqUTxTac=$-+T3=27}poWvsnp-W`7uuMtG&n(1)Hb zr8;x+*X1#NA<^r34F}fIuGMG`L{xrptXWe{6@80H(sfM^d`+~{R| zca3itk3rljY;~)_Bx0@vvI9V73wsB=+uRJMPlzngaqQ9lr?AqntT-h&qmslxS z^p=3SyNpWd{XqKet*Yjip-Ybr!D57>a!STWwrs3*WJS5LkbwPu%v+7TR9+noiwcL@P25>~&Tc2^>qM08 zNVcT;jR;sIAI5O#J-6K#g=Qvr;sNM{Q+1Z@j87*!Akz2YAFOE95h`eq?BoY!N@K0 z`tJMn_}sY3?EJ^O{puKRC3nILM@btVjr^layCNT#(@%YL@v3wG^wM8~1aNCYF*k&s zPDEdhJ#{x9^LRQ<`c<%CY^HYymi>hx$7K^iWP^6OT#CwD=H3H{#i062eBQ?I#(y7& zT3LPd^61s&Vgc8qm}*XysK0k8D-=f#sdKc^fL?>PA2=DgTh5yGK=$2Yng757y163V z&JIAFC=5&0Y5(Q*#j3nKzi{7b`?m-Ap_bW$!Ly~sajg+gQVKrCQ!^-SD=lX^UPKU|he@6VQae%-o5=4P#|^9lGl zBlBui*Ss~su2V}mk!skRAUV`7=dbgm@tEYL2t;5V<{eG9ZWL}?qifDg?SC!WZO6O` z2iSYtbY!KOIJCY#0K~1FZ~p>(JZYi&g++f^EIL*tzhvgyX!z{FS1+pz2M#jfpYl)U z=E?;4qh3#1U<|sV9}U5iA>*!_sr9fJgDPjZp)McUQCi|XM;Ofurd$V3j?O(9_WWdeOwE|eHvgStxw4@hp_tTS2^UxAuQdwEDfy%aBs6A%bTcga-%aPIwly=othF* zJtXiGm)+P&MQ7?4wsyWR@)g8O`NTwwIOm-$wMviMtU`NX;(xy6I@G1~oP{7t;L?r8 zGTT-dNt>XeCoCqob~aU)?z$pZ^BRN@Gg#FA8Mfvg9*J6PmnQMCzjkv+KHFKMMb@Gk~Gp;un2G z$X#~|6}(9JPJibU=qG^&cF>knyR1cuu*cu&cMSl)=CP5lsk)8z`hD74Gniy$^x8Fz zTJC|E=vAd!KZ~-~K?C9SH7=%dHO*JM8ODjv%FEgU^L4~;aK-H2-1EMnI;|Z#uhD91 z4sTfvTld!U<*VZ#4_`lFk3EaCSS$K_u;X6kXZb2uYkv&5n&y7)lUmy@R2T3ESK#k~ z%Cd%?XUHQfRqkyGY3p_gL{+xnG+3u;zR>znY?zUKIE*?)k63p<*_7)@*Pf5x%Qd%n z?M(xmeL3MahpDC_g zR#kmM%tv0(BlYP+QGA@rYqe5Z&C&Vu&taR?^S4Rc?S%vqoMYBqON8BvS!J@3YdTlC zR#-HsQ7Zj>1=>}M(7#RT=9*R6({=hQt6sUF12l+?Q(dE&1TNqX)oGz>QBB6H>3`;n ze1BC;&EC+Lh2h;deK-b(2NP0&vxmts8#N12Lnx=;JewIH*bTK z1dZpmst|&+&SL;7^Y}z>=PHagVi*B<+d5&H5Wr9xhg%#U?TV!*EspakA&7<^h8wa(!;2OO?w0>U<970$Q`hWaA2>anJ^NoT0`f)wp2C)vtq4da$RySrIO)V7) zM2-X!F>nMR9{NG?|2=F9F(JnYp_#P^=~;9S>k{1%JfwSOt=k9~5|01zj?OS(e9tW@ zZYgX?*xHF{%?5gc8~BUyinp4q{oK@kehG0ygIV)EHgv~HGca)ixVP9V~#al5HU5s0$p@ts=D$0}#Z|AZ-whv$36)KGy zm7Hu>O6F%L5a8EidLdv+f(Lz%->WpPGMLwO96?T)9i26i@hP^Jw8)Sxdt?VOVnkV9 z);@hC5e)E&dX4wmb_;y1Pk;K2w9&S@sI{7eUF~($U!C(mskU~6)6zWVWpsS=*0h&T zy+0q?Xvbv zJ?*^;j>#bFWFbRazc31Z$&9yGPKcU zf~C~7nc2-NmBvz-AAh1>y4p>a`#V8XY$;_jZQNl2n~D*8p2hexUzZVY&P=4;*Z^qn zR)iA}d_=Q*8M<*~b(vLpuJ9=K1FzsAnGbq|g2DG5#;Vr`YgUz)tBIN{RYRY+TiWAO z47z4DU)f9EAEe+>axy8GJamfA1OwL(+U#-Qiz?N$E`pNl9e;bwZ3mco9tXnoe8n9n zIB=Dn1v>%8dwO|(u3g*gNr!OopA$_CY8^*-aJR;WcTG>J0mdGsRQ0!gs7vsJF1)&H zti(4n!aybv0WUdLx5bA2a%~#1wm_Y%CXJ(J#tS<1Hpn~ElOn|xBcT4T?_dA$?DJqg zIyqU3*lbBalz)&(Wv^!MS*?4-U7=nqa)62)sjH;tGaU4o(p<3_monK(d-&bwIS<=# z!Fq^B;2hnL&oY2A-k*iLg{rdC{0y=vXkYRP02PoG1771matp$h8c_3}r%I&BKaRn#2$8xbod5cK{C`Px<{JZ#EbA}D6by%Y&DxLO zDRwI5+ED%H0&TjKv2( zVfrB1alA+E1Z&)}kIyJIV4?tYI2;ayEr>s)hJrmoX4YqD1j69?4ZuhX)guQU-P!0L z-v)3XdX?|cyruUV0`;W4HMi?|x-g6d8R__fY#D4fT zh<__Yo(qd6H2V{%qakJENPTX^>mMk%j$l2aM+g0XOXJuyzf{mD>0|{#jRFVbaG`i! z+VHHB4sSQ;?7O$o7m@r;T?~6D1!B_bl10Lh$5SS(`jq$@cOW(@TiwFQ)C||b+Sl9U zeD@JJ*fN68K>$rS{~_7^Ci$`mAm8Cmc7Og}(eMvM*zAys$@eHOYThY0)Cmh+M} z3isT+MV;paQQF1dJ>Im?!E+{}bO01lJBSaT&R+L}Ww3!_ZavS>!Mg~a#`-P}e10*j z!R&!m$wRo{^3`%y)H{Pjsqu2%@nIj)m(id}1WrAv1QIG8oqv^!hlca(_y1 zjfH%}zIMx8TMW~31>uM4Pd4rDYP_f*uXNuvu}dgPjeWFYc(8>4EO*-f-AUd*I#1iE zgky7ojY$;ac!d$R7u<2BaXWPFVysygIoh%r+!|+g;f~At+=}NtPufWRC500o*`faK z%(XsP64|`FF?M6vu%1TF>?p?;Z+{yLibS^ka$+iX@Iw{0yk$z#wkQ18vYK?n;XVha z8$J<9&N zuc@~mFnc-fc*18%^ex&?@_$?d*V=(y`~MsW)c3ADOrWv-QR6wDCU?Mw?(`a~b)mm* znnu}KhEq%ITRYdQ^nPO=Q|%vbdDQDhw4TM@h{IM+Iyzqb=<1m}sL91HL1wOqof)C6 z(y_75LHou=ea z9Xc@quG7Oym`_Pb@H2L8iNV4>nh&u2bBdU32S#B zFV6&+i^_$fBwlYOtAD~b+0*0y`r*kp*|Clqf|reB3r}Ax&p%c9?95dLR~LX)9BsV% zq(Kyml&XI)x6x-xd#xP;d;vZGBsR9Kp^}t(jEzz_%EYl0jXgb_Omc7> zYS0D05N$3!gP59tv2+?Q(DFOC4K%U+JZZ}82HlHxK)4Hj9J34z$mDM5x`hwiPVz-n zz{5AUFxwqOPmiA;KGQqiSLHPwVYRFl=WjOSd!NToi=w(NjEkQhA)F=&q=i1r3bo7I zCj{Tj^Y`>hEq~xkn6vxN8BodP?lvsqas`u!SL;tp9o|07-KUdCn>U0vf9~io9Z>ve z(afi}(gMNd4B7rN#kEgvRFEGfJZ6|%dQW<2c_qKI^bHZeq=NV+nK`(+8rls_Z&vs+ zGMA>do?fI^^s(meA7#>P(pyHftP|=Ct^1tn1HbE}K!4-u6v|zn$%Q7_(5f?aNj)PS zyn7R~MgC*>!Cb5zt^e(QXR_fnnlI6q5@G=J^dSTFpt)>&6ue^6oqZZpTDEg z$)~E$=fixp8Y<;uQO_2k9qaRpAf8{}w&?WVN#xO5VWSqvZ43>HV9KDei5kc+Q9G!C zyc04v2!D`=7jCz%0+L5?@YPU)`e3Zz*`toF@BF z_%hZq(Ob6zcUQ&Q?X?>yYq!T>zDPyw_W8_4x__Uz0on>r|3d3uIGaOq@_n(JHLNOj z5_e&qepkI#ONlv)Elkn^tw@+#de(<>Rh)x5V**Gx*FN*Aj_*Zs!ya!)o7({}u|Or7 zz=>k(rP@zcr{_?^{YXPdg~TNXtPDPUH_Bh>%@GiX;5g6_*ZM!6#x__~;IoP^K`@#` zD1Q(VoL*6LkIl`zG0%0$1mF)Ww+PbyTpez6?D%MyHm>U9#Wer;;*5!F+C3Hlxv5K) z=<0is^}-^5Xpt8Nu{s2HvDFCu!_boEkbmr_kURvxb7E@o(ZkhhhUK2QXS%edeK!zz zDl{K|I?eGq25F}zc07YOl%KMlI}h*d4~N4YjEVyh(0()AyRUX-_C&j?WnT^V?|Ut<<)*k%*u+klGeowDy-lqB^07DqTyeJwD<3na^ zeTUIeALP*!@UqNKKB#8@cmlyYruj7cdi1-|!{0v0UghWqG0jfzY&kb%V2q;6qvoOT zVDfZ4d0)M8LEkvoI;AuU*YkGh1Aq4P*#BHc3(_quWVh*=h74nuHFl4Bj6A+9X48C? zP0N|u2KFzWun)g^yeuikoVpZ9i{O6(9W46F5rq(bK&^yEcUk zx0yEro5sZ&G}1&G0~bLqit4*iRSfYaEz*YD3P|FS(xJu`(%oevmMgX!cYlv97q>v~ z><|!<9CD*cqF8P7ntM5&x=yw5B{1tppU?{4(9UvCkBhA}gtf=K>5Z;$Y1n`ui2=MM zbl8!6tQ36n^cxU52<#}J*5Zo&97nxMtuP)V#nz{BQj*Kc#~4vihP=K;inM0D=_tz% z-GDV_S-$&l%@KOSu0y0J27jq`kdg0-E2f)ZMC7BCNq8+!#?7{Uw|(EkF@jzp4`cnF zCNh{C_O z49{GP+iP#fZ@@gsxOw<^!wrmsP4ih^=STV}$6jOCt;%V>NA}d1g@3O*Cet@E|A2Ab zXaM1Sa=DFl#Z^iOlP*0Ol_%FeEJNuj@!EH@*Il9<-TEfyG--A)j`Zm~C(d@9a-Wr{ zkczxaUfYqYRBqt*s+#m94tP>GqDkpl5RLG(IQCIF3w;opU5?y^wUxI6e0}0~qS(hS z=@xn2DEd0U23gXj>0tA2xQ2*{{xN>bOF~XS%I7U^?R{VM{GidQu*hO5^F?!3LFY z7^Aj*^3P@|X#GuHLl;|JyUOM?8kR@L|wUCxqp2st()}KMAuse9XTlo zX1q9FVi;zIRigO4vHjd7@6qKQ)Ay`*?+YWUO#e^I(exnJnl>x)0-(eklZ+QBI0e_WOnVam|Dwnr1j5Hf*gN3kc{B%NO~f;I<9#z7`ptDc<0zc z6<_#$$I6{#*brS@LrTHLnW^HbObd?XP4Skx&Aah3!+*ll$l-JCy=#}(?oEMR>{Ut9 z!!)2KT_Euz^>q)_+eUIp55B{|tvX#_P0j)N5ydv*=}%4lGl@A^C1oa zy*}&doy<|x=x-G;gM^2Zke~C-f1{{7Z##zFfvYzX(#)UjxbJM@zZE&!?HsMVr0u~t zYiuVUG=B;Rn@I?piwNsw1n*ZL#F8-`{`qIArUQbz5RANy&Hi~&xSZs2MG1-Qz=teJ zN=2-r%z^BVfs-L*dgd-vvkxn%zXHFBVzIC{GkN9etiq?Qc{MbJVq)lq3)^^FIG%~N?^|x|G*u2N`Dm(K&$e{HYk8A*_ZUJwosB0x)so2hbz^m*rs!|E<^GPNv22xb z%1BxomeKUcp2O$!W&P>tC3+AYnKaguQjIP@)LUDLH7-%H>Nhr!X=k7=J+@V#8_4b4 zg@39I<3zl&Y^Us*%`Poq1(?gxI0BTd>ArDNo3Mm{Y&WdEO9%im9vZs)mS&7-EGaut zXPjRa<^(Z?XznvupCB%j4s z5+O+_n)?_a;lA&3XqFEvbHFXa4&;4Al7C^m(iL}U=wpX_GvS!j`a(H_Pm z)1pgQ9pzQTsHL+wlD9gp^oDV%O#;(XpMe+@%n~J7p5&A>Jw_Okf5q#sLKjg>kUZtW z0<9Dj%DA&WJUDUI zTUx?=UR$d%l=-n%2XfRdt-&Z(!@KC63TcYJe%6E}U`}4PP|#*u*%?NW%xLLW z&}gKyK>)EGN*8IHeH% z#8bVckAoE^AEje}sTs2x@qa?oz(!Sd!qn$;bCPg}mJW|sL!du|v6M5s`BA7l^r2LW@}u5_+=7djAf!ku==zi!0+ zH9;L8AJpcu=0? zL;(O;PbYwy^LAu%QiH+ERlfB14o;dB56+N$EvyAy4$Y2=_{Mtp25NXJ{ctRwVO%l@ zz6SShoW8oL<~+;slz(_paWpc+knGk@LvFTe2!)j>6uV>aiSRAFmbM-nYDpRjEt8liW+5Yrb(^ZE3%9jv?;VfJ+=WyB{BNlkt3s zV7c)Y=%evtH;WC}gS26AgFSvL7Qrvx+;*d_p1_;l&z*O1$A4|S!9H#>MQ*Z{8%7_x zO+=SDR3CNoT!=!V<(v-ahjn(VlnnQKHnL(h9)I z(&B}5-PY((Ue+L9>GE;0@XP~9xt%?Dko_=TO)j#BzunFD_x8R9oO7SvPD(zc{~rwk zD6So0TxBrm0e{4+T+M8*2nSBz`idr7sUj#3)1Kv^>@?4H+cUDWmRo6$%oG*|V{ zbG0Vw5!|Z2&sU>A0LdOr^Lkv&emyRxk4%SteZDF$mw*39eR%kr-~9VmU;kRQF@5yg z-~Hx)?Coj9j4wG^kc`@sp|E^H2V=^%?4A4F;SFpOZ#rzH(OPCtnSk1$@j58H z;jN^O6-}zu77=KeGSfkoS)-S<)ZXr8uk)&Qx3+XOSK3{~9aGi6%DU58s>i2(7ha6j zuQuk$G#}3(wtQLT!B!V|j>h-y5;9)n>6~4twSSzHt~<*Pw{Y{C6!K+sgRa+>YbB+y zADA6FAXW?Ne96k@W*5G#FKorMy}`Au`bxt-3(o+bni|>F6z=-^4Il%89)dx?b63a2 zk&y5Pg-#*Gr+xk-53fX_Jy~rkh#o1Hq|P8>WvdJE|7XZ+%Cyl{q~0x0KzuYxs`ffX z+kZJwHLCx;@F=Cwx_7NCYvuqqkFL&&RaJ{ZDn^>BE|naOY+o1a!|@QiqyE(4MzY7K zwwq7a=D)`7sUeQQ$y#-q)-{0UKZnD|Zkw<$tMO$D_M7+$E?VNgw=0dboAzVPoN;?cvt_ zZ2L?{8(xW3xvDt(QH>BB_!-hv%z@mxA0m>p;daOxI^K+d*UrT7U44 zf}d#w%T-yI_&{;zmU_8Pq6+E;(-^LF9^I78u?@x=FPukBq2ir$C0G|vu$H}-NW_Vc zZt~=cNtY1USs`NYwp!H}EPAUGdysZSwXfmenisbv$ zxMrG_jcA#PSV|v&VP(3f2HN} zU&IzdykEqY+Y?*T0?FqTHGUByz9=E$7xCd2@!=Qo;lHK$u+{U%Wao;VI87Q(68?l3 zc|di7r+4u;IQl{4Fs@iS6e2A&$?QWjr}Huw(5*LD8y30B&z0ztuV`%(8pim7iI1bD zCYiTeD{_Fz^8|e&DlpMW<==D7i5=DSybD*eH>QC%cTN`7iVxM_kSTZx`Rwzjd7); zVWP7K&;sHQR@xuL*Z)v1?$)l3Vv)qjD4*_TRcV~8(8C7(PEK3Y?BPSh@JpP}rMS48$fFl&{ERLft{fK2zi{_M~ z36?ZFPWkznHD)X8h4Ev9Opm-)L;P6U)5`TU6h^tGrC>RJH^6C02w>9(Lx3OsO0#ar zAr_4&c$93>@PEYRL9(c8j;w`z(2U+v=7pcbhBj+E#OT?$>rx#CsA|M`o!Kl9R-&ZE z==%X3j8kxNIp?Dhbi9p@N;n@AZy(^N(JF{};G3<2AEQSS*l|^Ra=H4hm@5Q$MBE2# zI)`w*8moeQQTbOA?^&+9UMKa!Qb>S~-sgrB?0=*$_|a}J;A~>NUO*^1D`&Iv z1HR0iYFj0)OV~R(-*rR2KQQeMpA*6l%&;M01B8iI}X9wqW2=Gqc4jCH9XA2IA0SAP^sd zl5`8$*KlG}Y5;G%TiwNpGVCGT=#A|j{ukf35%4HxC@=UoGJhLIK(iJnIo1Rz5#t7s4!|Xm52bb* zS%H!MbhgQZCshBWNQZ;Z8|v_efew{YsvY{6C#F6z6t(s15j#Iu{wV-#|6pS(xFFn$dHNHwET_FaB9zMR#z zlYe%4Y~>+~KB?E|0WH_Qt}m|g)vO%D#4E9GSz`Q6owun0f+2FIm7_5}7K!jA0T`M} zf337&td;+#E_^oNNkec%5MEnJE$6TWbq6Z{!K`XInTbWwHmQkf>UF83x#l#RNnb{9 zS4At_uy-ZYW&lDsMY^-&Ac?ky86%Bb$bWL_Y_z*Fn^%hVp;*9!tt#g+chO?cGhB+i zGt99zoWp*}tNzaL-cLW>d9(N6cW>{jUxxQ~X#O){c%DZ0jbIi~%6Cxr&B2A~kL1K& zx71{!G2{p~pRTGUPF%qC9d`ZL*%yQfsY8UD#C2i0GDY{?+h`?H@Tq;(M`dMAv47yK zE<~LR%gWPb3$w_ONdsF~ho=Q5*|4ck4CDF9MKqMwqs0`95h+e41yp5HK-dq$F2i83 zsWuWpVJjXK_BP|o>Q3q)>iVYliaM*L!vHvL*TT8lhxhKnBdK+}ABvTONR}A{7b8Ic zF}0XLgY|^Bw^xxKiy`S0_^^VI+ke$xiu%GisJJyxZtz?R<$5LVVFA#q`Q$DV`GTqqkUQZEH#R?FjWmyvz?(U1Q#)(f zmsrb3zNZUk`Tjg!Fi}8tWBM|%H0HVfB%6o%DmS1B_qicsy>To_Hh*7X-8=F&lqdT% zoaTUdVH}xoTV4|m#*zhYt#LV!>LeUuUgD+z^Ev!4qnGF;n1)1#ia% za%`AtqODx>$jLP*o@^l3pg&=ExyDw%p*g21n%0rYK+>3u0_J;z(1Tx)r%f`aBy&XR z{OYtr?L^q54j6v%7Js6A_BOnQga@cBm(*tOg`0w=Nx77?R*N!8+y#2;+xeaJjiU;w z1*7C0?I85eSTWe}t*jUPC-qXAUWTkq1*W?640+a!+;>nvD$A;QeC0;pq)mN5cqX^l z;e*IQ=nP?o;yfM}^sX^DCLSADv-+a+e^$u^GrP`q`vWGpRbQR0{(w=Q&LJ({vl8wn zzbh3jm5cya-G7i;dwvPLA>G&(TkA=Ovj8gs7^IO9LzLuy6#WB#79>AdSkf*pO)~_c zybO3F-L|yFxkXa$>#hGEP)h>@3IG5I2mnrP&bM#d1QP@UPHoP&h2I2|2m?)R&bJ%r z1aJrgPHoP&j_?FD0uD`W&Pr0cJhn_J006wxm(cPAG=F_-a~sF8=x4Y}|6#Cd8r>Cc9`%ky~cjpW7Cvi|NuB-g~q7nVcKLsAMgxOF12hlZ(6-i>f@YvN=_N@*a)>LyEV|Dk|V(SGOu%_{N9}} z?tB6LDXT{O1fx2Fah{F#t17#G1_QsBcz=0N&Sr9g#IIAYzs>54W0|bk22mBaFMw8- zZiH{OESh{SNBcF*5(c5Q;Hz2Iz_8BKMSq$$s`$}!8sJr>POcYnMVbGGzC16da(4KB zA{R)T6%~&2^CD}O)hfW#az5HWK3T8S3&3EVlBY1Evq^*fdIBXfHP_au3G?WBUVkp@ zgIQMB8`iCB=rc~-H3}cTUw}xg*Ms~tm$T{qWC9h|D1G!eFQy)QsDp z1`fgo#lO!$^n=`8zl!R^QE^#L)*UL~=x&Qk0{y*M6JACoY$+vHx z9vwb=^7ir3izi1fzIl6m@)|zIVymB_;1dmu$>8Bk7U#{y*53B^A6~qCasS1$&8lyFZ}Td)wRMMG5K(8ZRcG5PBapPP)8@)M;7HWLAiSZx0W?dw+ZI^7Wy` z=IHqC;oslvKYM%f5<1+|)u;*GmCJ0llw)C}+~{03PbBD+mn3=mTOmQ0`SujwZ%;1d zlWxXo$OGQ7pld`QsnegONm#_0f3&?Hpva>~A&I zQl?q}0&Q<^OrLKKPu~9b{(txTZx5dxK0kbcvJs#-GQp2qC)78xK@oqbERRHAu+cSe z{pCc1hSnh4o8!Z`Z;n1G$(FTzbF>M$R^WJBq{1n3jZPfbTI9+iZmvpkY9t66 z(hBrQJk6`R0c%s_Q@}rOt_3j!SiTC3GPnx_LjQ<&^4gf$9ze3CD}S`>RmH!-FR<%R zcVN7*30+t;mCVo{&1&&z0$TiQG`$~f)7OzW2C>qJ`Lb>l6j78=RqCQh9bMFKWS8)% zB^bO@)6z&6sU#R5h2a-^xE;w)!%d1TeKWd%{!q9dyITI4(zy{TV<!SE7R zc{N)C*NtZ7`D?i#DfnEmR$sH&P!D`GBeV>&47As3bERj*DuJe!n;^knl+6pEJIoj- z!4wBVSwc#qf{MtMumk6nIfItvUa!aOxpzBb&c}QF)qn1o^Qi^?ZpU)Pzy1ZKI+|jn zdbeYy;X5_)SL;Wzh{=a!728F2DV1tLF{jLAoYM*fyvQpd6(caUIudVcsr9E)T%l+% zBjCnjp!J$)N~21R0<($~5mCxi8Sf0!k$4U|vsGILpgeUM!@32<`NNMMr{T{}$7>4E zNDtRtVt*_3qlIU{{1g4WXhc315B5YZ9tm3?et!9-kqe~IBSC+<^F#h4Y8dz!s3zhz z_&hcpGE>;2DB^LE)fWdaaBSXcHfbTDe(TLAc|EqaP&})^j7!ncRInHfyjdl$gEwwk z5z_!d@}cskYL_B>L-La4e2#dLr&rbueqSuBMSlr%MU=(tTJzn>1?W|pOjxQGR~Jx1 zEGl^)=LPvP@dY}PmosuG&wzcEajMXS5{d@*sO@>yj1))LQbtQ~Ah)bQP=a|sy3FNO zy8is%1%Ke)!+UGOH84uXzeE#BTb$*v7!Pz2xzf-Nx$wr$S>wZWaQ9 z^@hq48R|-^OvI(9^wG+tiGkDItn+{3#0gEMTzoAa*fo`cZV5KJ$Co+5+kRiQKQJu- zdHVT44B#eb zA%f-X68Df{2?4`c$O=YP5q(vIRd%JC%4=)8=;l0&oyyQUh2ez_0$D^3Mo_8|-;8fV zrNypyT=^6$t;d$S5`rCfNmtxJIC=Tx$o&4j~;Y0PpAPiMr zXIDObL%*J}w^ATq?H_!%|9?#g^)yt;=(!pFDfCyR06srF`S#@#1CMn(vS2M@DJ`dw z?VW-QdzZxg`~BBP`;VU;rke_l&b1mt*0Eri`KDjDQU}SR*3epY=?Wk8XQD4td6t1p zTSa$OTEWp}?B@F$3?_i(`vio1VFZ1OA8eNf!?*?2#E0G&^uNH?xqmG4sbFd(n)E}v z_|J>UY&n&BOL!rfzk?IVZ>bf-SAs-843EX7p2wqlBRtfuoSMgDL`MX%s6q8t%Tt3_cK zV16mTKV**4b1)C{`hQJitxV;tCmri&@n@4%&Owq6gr zGRmgYzAK3S5e@KzQ~k;Dv+)9zm}fn7?` zi9!d032F8ylJ?_8RbH`ejL?+ys%Yf&?ktR_aZPJq`TD5rDTqCa1ii{@9rv_zQB3MMtf>lk*_pl7{w;B9J3oKS@iGO5Zcp4;h1&bpql3vKTwHF4@ zVc-G{zo`VuDjhHo^H$_R#Bn3P;8Bs5CPT9lu;_9|i>wciOK3Pr76r|MWF~NRC_SV? zrfy$?t9nVlN!&LmI@UF;&jj(NN3kE$burl1z~_-TGrcp;vjl(YO@Rc1syB>7ai2hs zopbb9{(rkQ_SG1*@$X5Rf6eBG&%mw^RFALpbp?Qe4Cd8xy`x(8C$(Fr0gTWKk?2>g zrSp(>RJ25=`h*N_%iyLr#@_&WSjrBmTD_h(nc5yk08KTN znAxge$JEv}+jb(^@QuR=9C+=ezKR(tJw=1B}ll!+Zx$~lHTEe@mL4GW)GC?8Wd-1tQc*Fx?{!LSw z>VG)&%v{8tT$M{STvcbJ4rai`@XE;)OzazxWw?>a9M8u!G`gOdT|1_~&WV`U$IH{& z9AeT_V#pXhu#JNmkl=k5gYG63-(R&mCA5`rqn={T4f;x+=wNIn%c>gt-JxPg6nqyi z7hG@1>8d+qn7XD~=*~lzIq4IMHGe2DE`JA4BmUP{fBEXqdv+Go>b>y~C`INzX= zuO56gy5qaiu?>T%IzC`NJ`14VuK+qIi@K?nlcuabf$Z^D3(CG)86WZKBo?y-@|sbm zKhVbu@O;5tuhbK@CFK>i_D0+4=)~)|u{@HUcLcWKAmecW$;4>d9RxqN6dJODpnrTv z;wM3L`H6>-aCq>FZ%e412EXJFKmBM#SfhUrSdE@VzI|97X+X`x1U$Ykilr-Z`|j z?H;=7?cG#(ymi=m=+KbS?v#@WbQF2QcB~MxD;RErZGvMPl0KF_6`A%Sp?_)}$2feC z?6Y=-$v7>cGk;+hNG6rSgik2%I?gTEYND4N>*6-?vX<9tdqcO^ElVHn2@b@MF-(8c z^5?V1?w5J&){%>Co_QYd`=gPWDVu&AI|)?-Ej}zO=5()95>&nVC?Yh4w4;-&*NuN` z2ZA1aa`D>TJy*BO%eYYwKYxqXU$tm`dHR!_G;uidnRNlUs0dXyd5Wk3%tQjoR?>7 zJB9UIJxzUSwxK8ZH!JlwGpLP3I|&@i*1@yVDeVT}CW0{D(CRc?1Ahqq!QT!^*RpS> zfO=_!QPI+2& zMhHxTc{&SHO3dA!P>214hwZ<|>iG=QL!s=cmVAQcM~*+BEbj^ym*?s0h!=t`cU6{7`1K&ef)@s0H4 zhKjcY*Q2?vXcWI^*?8oooW7BCY_&hSXH8_4;Q#djoOa`6eU2u>DqcCQ;A9m5^wH%& zBwh7$PCoZNNq?@6xzTo-Cef{Ez~`s30{hm__A4;mHdBUlzUOR~ozo~|m6SH@I%Vl< zwW=mA)Tu*#*KDXrUsYv8dHTXK>4Tc6G`tsq3Ji3h4MSi@G!rU^H5~w8S)sgKCrDQG zG5EM}R_c~`Qww+9D+cqY)CdQ6!+qP}n&cqYj zo;mZ)d(MyZZ(XapYIk>a_qDt4r=F#mON)@zr?wI$)S3(I$w43*nx?vxQb`ka0>7JC zt&=$a-3U!%@}YycVJm&%%0+S}m^(A5tQtU(E8Up32yRo|fU?Ydx;jeN8BA3bGARA+ zeDq3!^3aa{k+aOWTERhKVrJY^mcb=$Xw&V;g62bevKAxEE9?G=O!1b>@40C93X|3M zUE9vw5K;n|pGDbnil&}02RHi+zF7=k>d2X75=zO-Fr8{#pBtrX`-r+^5gm%HWG~oy(os$w6&d%z<(dK|kj%W)ACs12QjlJ2_U=mP z-PPIsC_dm@aR;uJI4fs&97wG`G%62iGGN6_DWV)fezUQzT&H>7NV;JU#O215xAV`? zmc9XQ8*Or1o}Z;3eOA|5lpst!6aQ6{tiG7!sITz5w1~aD>V)?62rC49x*~EGUCfMn zKbWb>hWmx(H|)Q-yIzpJKZ?)vV<7NjTnXQ8;xr;=-G2SjHA!ZhH>9faNP0D&F61xt zZ7E7(h4_j|YYm`c_pLhgEo^d~8vR8-So{tgeNns!p{+_w>1F~N1QJ4F+C>vAC(@I0 zd7W+55zvsfwyC>K$f*3la1=2hsvJeK+sYJN=+EkxIm@0TnGDFdJdoqjtN5J%5w-Lg zYDIO;L*;UjkdZ1Uwjhwt4`w=NS(C83w)wLbRknu6>{?%N#Ls=v@VskHeXUo(sx%CU z-UfkHbJK}-@8CdW>ak7XOkh?cIJJu;o^#m4=o)bnZQjxOv!FIDIi1=DLeZhldD&(b zGqs88zF=W8)Q2o*f6WzqbTKEydyn$)x%G)g@94I{Ho4!#I3THdp7+DA7=`f#M)Ih* z-zXse_^Ymgbv5|tqZp-qt8{DIHd+t3Dd)6?|3fxLjhPEvwQ22Rt#5b+5}W^iYpc+F za6se=)s$l^fbtu{FLlH!CcWfER{DErBep42eu_2PHYS2Qp}p_Qt3TwDXT7M+Cxq$+ zKSP$g8A=U<2yIhFYm4_p^ljwiF)+1`#Bgq3W{H)trLmRKU~dpnJ69FIop8GYe_%f& z!WGVR7a(N|cYf9qnXg?exDH`wYPLU4aT(J2`ohJo`9P)k^F#3OwzRCYM4K03r9cYm zNSz~4nI`ol{kSbFz6eRv7LS16@libL9Ft4~4S#=q4{iYFLo5x2o`JU+!z$i#~q8W>LNQ#DLgz&w-rvGs@ zJr*0E!C8U!NRUWCs99r=96Y(V_NjaSfJm%{0D)Ugaq+Fs8v=pIKU)XAU3o!z4A{rfz!`~J(sIGnQ`rQ=1-^qLaKeof;sA#L{qIBr67PdrUMbeoEi61%q0(KZ z=ttX?>e|qa@Fa})j-M_rBcDllwnkBH!|HG1aw!@rnVUt}Inu`eT6+df%Hr-X3iK|l z|9mSvu~-^xZwm&-<53-vGJph!dzg&fk6!mBaQamR9r!FUq>-0q^xBmLkBr^J3a4V< zH1g>4r7&}Cw>q7AXkQoI{tU8RpvJ91x&z*C{76(^g5auxeE?3<5bd^r94>vG`*3T* z9Fm<9H0vN}MQlN+EfIv&^2dj0PJPF~^y~Hu>MU*ZHp>8BVzDMppcQ-4u;`z)aB9|Y zSxWLI0H;~^bohnjH!6sVHjFwb2ms4kQYL*KT*cO6Q4%;`CK?OK1Mu7!N&=_?=}>N> zm4CmJ16}Xq+Q!1DRv~S-)}k}5Vq_yxtYc(JMI+q@WNW)IaxJzGHbQ@dKnYSZPLZHs z>(fSE#$y2`?sc~_j!{Ks8p1o9ta;Sud;`2)0N1s!C! z_*i_7lste-{^y_Fc&}8`_kzK^RF;63^lV=Z}sZ@&mjkdlz#FXiS zD?M*Bm)d>|P5a!D#;2oXnN%f8pP9Q&~gV zGvN9r_!N1Pe95CExlxh`jf40|LM0E0)T`+iv$qfZyHq$7zn(u1Efx-m-Wmsl6QGID z;zHNIEX`wm7CxdTMxaL}!SCO=NPKzynm`2HbLE9NwIh65A4X|e-S$&Ik{4YCT}S%f zC$VKR+j_Z@Ja_2=>t!nV^>#UOO-X9olDsJXxX?dEpJ(>`xP|-n!hD**9Ix7S@FV@( zB^w6PZjoNqf-g^!#Y`KH6`m%1$6{LD&BDdGmhJe=L#IZ7cO+)JF|?aV3g z_4KXEBFw??Qc%$6G{*3tbC(71^@AN6@6+E0}FUhF1jvPPf}k*abu(c-Uug!^M=?PCZ#0VE!H(*N@o zysZLUpr4n&t=->IGNE^Xi%~Bp^PwDuW`I z!;3>8VV1y7#}a}nY#B0VvrZS&GibpXBg>T{jl`PN(TfG9Ac!(-xxbOatphel&$RxB znQ;mtb0u%EI!P5jXIJ~=q5RN-u z{b=T}CY8p$Om~Qb(PEdydgGQ)$RxGfCf#Q05%xz_+uNPjnL@;%R|0Bg>QT#s zM_|+OLSvdmYv%V1zSWbEa4;+X(wV9ZvsOaUSjR&^`f@jr_da_HGyN@&cX^ywv+#M- zkv_lY4^^J#1ubg zEBEQ(T3MDG=OOoH=6hip=PQX;k1xClcCISR@4JZCmY-F9A(C1FeJr4W9-J z$y~@2d00klFCYgFc(HD~vnQ*gfxj0kn>TaH#&jCbaaUM7D1_m&_&QC-xqg6`Af&+F~ggrEUIFTcS1@yPFqthF$) zG=wzup8TzSyP36${2*fB6nmfGj+Akjl`1Xco@fy=G?))8@Ed92p9j{wZZxd)egKnm zE>00geaEo6c25=5=2!wD`0%!E8iWaQY!yOJV=|1|>@U))=d9nj-6u$^16ylhV@!E} z6{h4`pl&J?@r#V!1ubQ{E=zx%F*v-x@StPRA-Qc|U=h>rOSLWec!rB@qB9Gn!3bZD zs0_TrzFm7<0EPXK;^m#>XuOs~_{{xncLD0d%Z>8-%E<$my zh+3UuU=FO8QN0R!@_u)2&*0jZaBLUfB}flmGKz!b?7FI?ecnDubOz`J2y z+=BTK*VdbxGP?q>TK?#_WgA$%l%xI&W*scZa|abO?>(APm!PoYtS@91JxwHk8!xLK zj~Wre1EUnWVSl9CH`Z9$G=%jYIiH&$6fom|g;I^M!P3;RJmoh6PQ?v?NXhw7kf`pM zonEQ$SMEbO<}Gi4gUqvjF4aJ=*-1RlkCv#$HlL}f0Q@`iE`~#$C{-dKsmHMpWk^{X z$cYenN>X{(j&XE-&Of;%-eZ>5;kx719JbN>z%tF~hCwNE%wtG$lg-X$Zq~1j^o_He zB_{%)J#F|Tl;sQjhIdkb2oxbgkkM-ac8mmgW-=`PUFG)S{EOHvPI|U~#l*>tGDk9+ zs2wQBrR^{GaiS%dWz1 zph|`JfyYp?@P6BZ+Zlz0)0b~HrgW&o3)tSz$?qcLNPBj6OJnylV8>4th)Yi~UK~_E z@EvR$cMsBS{sOIr3r<+s>5^o=f?q%;n;08*QOe60p9yG_M%PIcn2+p?iw8Mtz88#FgL zy<^EnS7f_E)3|%3O~v@wH*m~r5D0nZ=qE7WC_#2Q3arFAkn z2+0vdl0IVV#!p}WYa6%>~_UBnPpjv zY5@m-SD@jsD{h@yhC7}sPX;RV^>TKm`3)5R{UG$JCeXv;o00fp<)iXHf-zBQL>txe zaVD+Cw0|EeR%8U-N70J-u*=M8>fG$Z)4D=1OqTz++&MJQ4XgLAv#EOrw6V)~FfFRv zIx3CfT6JdxKAq%1A#KW?h!N*`4!=AXI@jMz9ZhC?HJL<@@Tf+89K{UahO2-aK)t-S zBvR>go9@sSN^Bd)RG?X=z3V_l&d_Ga*9Bo{bY8{7CSN5ibB(mG7$-?jzh3QDX11Y} z+QG|nmGYo6ir3w>s{Q4kaK_KHrw^dQw~c2WT5RZ5AFd2lkQUx8$-d4H2qUTHqAvJ( ztj7nmv%e69DyihX^L|c1Xc}baH454Qt@w&1zS*Qz_6zQ`>f?j6z-ac=n~|wywY0;w zg8p&}k%Ed2tdBymZ_r)!GfqX)2X(F{xKNV8lb~EqiI8x1d{?domfl0_XB*p6=4F7x z^}2T6ju?V`{a@0SfvK`+lnv|hB!oMBP3myM?v%<}k@&+3g&+vsZw^VZ*Y}P5ysvHO zN|hL;7kM$?BCi_Q#LPzctMQ>U=;!0x73S z4Z3P@)3>yafMW$~Kc)s&-R64XIu8e!n2L)*a%BvT@6QXc;G2vixd{_&@YRmDWp*3Lx~VN`|L^OS(iTb@xZ3Xf{=7@>y}Z$K!WLn`mIAn?iNmaPvN4} z9CdT%BggbvEE+Rv1h#x$#d#)J7hdxS9MQ$RqKy8YQXS6;rV{V5@ZHaF#pe2ZoY3Zx zTw8rR9uVwF@oEu5{#$?zZHk8r1&nZ8d#M$&Myb3FR6zSH^X8~0lYsz)W&LX$vX|_6 zxYR}oi3F}<2hkRns4Cm2h)u5;xe~9C5Jj*>y$#gZTafYc2zqUfR8+=hdusezg^#as z#Pw^RhI!+FCyL|-=Y^9RSiEr+Ik}CE{`drM1kl}p{C>}kIm)Ik#soE<;Pn2oIu&6+ z!;rwSj}x<#785^9df&vuG=$3t1Kl#Kc+{9Mn?gmdbk`pHW}{`o{_)l9Eq1k|!sAe= zqG}xF2FyD(eDG@CE2SfDF6CLY+hk0CYK2}JTr4^SAw^1;TA6OYaivczQ3N8Ezcpnx2PZx&{Hjp{s-W zV&9@mvYgUE!-*K=P?xynzVSBBNIg(O`2F!mNfsOe76b$u8svW(&mVXIIO2aQPRkxJ z(=1RB5LNKB_+1FfG`$N*w6;-RKndtS;io-6ARqEygdzrj1^XupC6oYUgZ<0(NC64~ z|ArZ30s&!>OLL5c#7%^NPt(1E#Aqv50K_Bx+m_b=VE14DDkFd}?Z4bjBmm_< zF)5?1>4Fy`2nYp7nu9kaZkiAoICL9x3?LKn--a_;07KY+Kh9JNX#4Av_xBjiY5=I9 z|8l=;0a-Bra@p;GG4Owpc{kwCf01QBAO`R+_c{XLh4>e7OacJ^9fH6#VDP_Puzl** z7@+_G2`x<%o&=DkNv%O*wMoqZmMH#pA$$UO{5MR-JD}pfvm^cqumd3eJ)trR2NuHUu!7m))L9ecPxXct0$9LhCX5IkW|MMVGT#@)?7?Lm-2Ap7$^xm9m@IDnPpe*!mvT3C2I2J4avssRM=$W@xP@~H)5UTc0uIMAxj5_<skOlHqw4^Ky29Zk{J~3UpnFcG*n1d?1wWz)*f0!vyN!~_&8#X4LCSM@}G2u!}fCBs&9odsi}MQ6}<&_%SJL$x^O=2`=N5CL#ztUXf)S9^IPlkRBB@ zobQ?p{vp!5dHTSN(w>xDXj8-Vo8TXeVW_-Mv7aD{C84cp#0bUysW@M*%fw*0lG;E= zG!Puor!i#{zK0|vB2e9Y-vgwT`Wq1JPo#7(=01oDbOl*?OR&-eTuyNsw$KTXZ!p)? zj8HdW+dJxi#JVw<`gn1A#2)`R3UKWT3ikX2K7>gWJh-CIln_NG?c9AhbtjV zMoZOBTOQ21h#^7jbx&mp(f;Ij;2ZQPqb(OW36d@#oD+UGgpDJt5EPHDihFkoB4!R^ zNDI=z=AJ0rB?&hC|1B*sRos3lJN0V3wfA3wohTwva$Ne?md7z!xCO@l9Q?%JA-# zde;ul77ix-phgE?F|o9W?2PujobNg}xAAbFbSH+L^S%i13>tiveKhB!-9* z>IE?oAAqv~A*%4~hdY%n$Gzj}oewLN&xD0)1`iE_4rUxo8pUA;PC{M&3}FD|v*xS) z`AjC*^VRLWBkmX^FL18++a${l*n?KWI_!dwku33w+1zw{@^DIsfmW%|DYk+7FsJG-Pf4q%i#q)lIlmcgnMqy*|MqW<)5vy6ZxD;z?@8+A4Lh_ZN4x!xz`Wq)J?CaL zjT`^XGdTrpx-rr_%T^g>*CL9|B66TCy~18U4+OzmwAT!uh4>er4m?y~%MnTNqM*+F zS1V7fS*8aZtCmei(Ojjx6y}=Jn-!0#O@KGk6skMM7Jr)FcJyJcX0g32Tn~VE|JOs( zk>=0Hxi*kLeG@>ztn8j+px8UwdzF<4!X(f(3Qh3ggXHy)+53!1h`rUwpS)9192l>7 zU||x4OpGMVfq;CfR~ZS~L(9tlyNFaTeUhie6wqw}-v2t_HHtlT(> z8hpGz1Xr*gOIkQ--xm&2UpM=$0lJhV9@EdLi$=nImb5<2p9u34SeN171<}4S;CK5I z1c4dlqwqCI3+k<*u>cje?~~L(ts4re`WxYpEtr<{6dYNTqDinDQJj!5gz3ms7+Vq? z(&^qvzt;wzZSQB^e54=&terbe7Ih~I(}-rFHKISPM6l6Edjq`DYhC`*ZUx!wDa4uz zLXA;$Uwn7-=v~qe780e2X!@IPx&zbx;BW?Xf?wqB4Ns& z3Uh2M8#TaQjpKTNWw-dx{<<-lNik1#f00j&6zhcS z{2(wrj)G|-$0ao$A)kP_2TxialQQIFtT4zTrOF)TNcJHff1>Cu+}1UiuX$)>hNlm( zq|~!dHjyf0>OYwN!J!AR$ak@N$O6f%82WvXYUoZMZpfpfIjh-ba28JHh}8CS@?dVGOE`jG zSV=~xy^~7hpcIE4f{+==O5+)v`HkOlEdn0KWv!2EsT;1m1Ofmy8pAMf6%3`Q6v?z9 zWmRS8z)4@Ghq9bUzR2&mTzNo}c&T%Aj6I1|8p_pfPd2+ibqfFz z3pkIM(%nO4%f>`@8xW zxS#XH$i%z*xXHtHssG%2gYZ#AR71t1`L@35xQ-;s)qEug^#=1yXb=8)ee?OIf@q&P zqOJcFIy9if-pZjaAk7evo<(!UV`0*pEU~cMmb5v#@Sf$tfH-xttp``8jjJQGi696; z#Lqb>D_>2{$AH!N9Cg}SB0}oh%B<}V+YBE1Q;%m9-}zF*E|&gY=) z8q`q0=0#SU2`?KRprQdIpY-sD>a0^8OIGPZv0IJ-l1%jJw|Y;Th9t4s4+g zdV(ShN}Crn;`}}ji%E)v+ z?1~C!BM?|v9t3dxwZ?C&f)WGz2dI}Ez&x2#%D`1#iglMzY68Hj7%>mB5Or&me`^Vy zI#vk1qTf6(n6!28j*{f;m8Mq!>wW8jHoit}6tf?V?E0gdFc}k=IR2x=(e$Nxjr*ki zJ0n}0*(@yzXsy5|UwLIj2}d$c%IJ7%se2H^0?&$2!p~I6rUQIXtdkOXKVTCFTzi%* zk4E-OG-HL`qP=DRm1SrQu**(ud7_Huur~N&d3BOiJ)*-1!}jlTfcNpFsbnsn2*_G+ zB&TCYDLvuhqg3L)+0+O6d546U;ao_l)(31ZQ?PPysTFV|*A>xFi9I=9I+W_XjRZB@ zII}Bm$j+6pH6oPOMn>$%B4B2$4PRy_?H;Enx$RVNu z;c6G#DZeWjU50v(I}r;O43Z7O?a?%b)+;cWGG#DUpF(od!hX`v!f)@X-YeYw^+$A< zI%Me4lOVu=+&aet?9U`Gob-F1Ce7VuTCB7}x_~u~@ep{a=*8K` zB0Os+otxbmmPR?s-38oFmlLZi0oX|usbEZ(m z)2LYXw+oE9`ckRJgKAYt6IMxy29jFu_GXP)*p|XhO3!u7C(xRnJz#}`I?H3l9H9cL z>+|x&QKoW~SU(|v96`fp`?JU`%>yE=ZN?;fOAwhxhtJ)5=WVa@!|voWD_334=qP4& z%PXB`ZQm^yP(Nb7dXXz57FeUtKzinDP}y9SR;_}jm}AdQ)Kh(5=E{O_LAT&R9sP>xFP)lLgj7+l8qD{!^6y2^}auyr+& zu~lCAUAYB39b9|6Y~($ji>b|9d7OG@i+lGisJ1(Ni*%)9S4}1Loe-a1srt+gS=By* zt6#0W7j1Tn95)mWDo4IbMdyKl9B>-X0yQ3z*7gKu-lRiynSTAu>dmNArUE zxq9QnDwc^Mue%ya_kNuLOOAbo$};s(DvpByNx6A?v_DN+1aDaX*}8O&p)cU`4ow(! zg^L$?rOvrFiUD{v>eYj#%5L(Y)hdy$f^$}}@pY|$i3<@CinG35Gt;81ljFLzSuV$8 zw9JiO1E!D(OZglU68(x!kUroOZy5%N7n&B<@K(ntkvzGld~~5hHC$=}Pyxocb*YcB z)p2$cwKgD;M<%)}^(#^y7AoEtO`9UcSRp)f9|_S(GXvDva`0V#DJA)2piv=B&CXRw z1co-dv)OtxJ;=$-x{vmDI>P)69lWIyYb8;LKukKcQZC-Cs;GCDn^%&gUpZVyU2A^D zb|sULre2yDUzG|Yn(`2qk_wzfX;uKApwMzS>)*yg8#W;EH|jGh;0y zfCcxk=8YcI+!RTnOqu-`SX?)el0!2zFsTVX)Uq`{tGee8WO<4J&u+|!tn=LYDaTV0 z*^U!Q$!IFF(XZOr!-DSgcG!kEWCdmwYARRz*gcI#x0Z9c>nZqw06#YwHyRo00r@P_JT z@GrBGdR(q?#zVw>TfF>!tj8C6IAU{8b>I$!OOq*daZI?H-200u>?O0t+qG4p)> z0I;Nsr~>RNHh<11!I@XUvQ3p3BUh61f0H0}FfuplFSGvX+}`LFa@OCZ2hXt?D__1V~dH* zFQoBQ?~PD@)VWVFw0!qIZGQFVU?p_@=5Q ziSf6Wn}e_lMr+#a=lz6QWMqR?7+!X)PCE)cDk};V;XUzs!cjI}5QAYGaZfYk37tOe zog1aqWpKS07rNaFum#h$<(!x(>`4n*M;IJKQ_uT1=xIKZ2EqAc5UXd$!NZ8|2{C3{ zoxwhPNdfhQF;A)NNMS1-u}y%XLQHwl5aJ6ff}j3Qz}4LrgLzmPR>%j&QdRT`-yAI$ zDH#@ep6ixa!m)uMWaHZ-W zZ<8E&Tw(X3y(|yfS!Ex|r0@E$VQT7$SY>89()`!e6+nFjJO0#_RDLr5k!C11W3U}7 zB#WMbeY`;BuI+NN2D4dahQ#?(MRCv-ZEAk7fOJ;RCf&VgWDtq!y%PKh&0RG+j8(x@ zhGKa>VrYmBIB!NjHpBC<8PGa7?zTyzs#{P1tG#S4^y&DQV$S!FU~knB#GEePskmk( z^W;b<@at=8l^cwjl@00VcG{vo1*OpQf$(5c-tjRh(h#D@^b<_M$JMk6w)X_a?54YhF zv3#|u=FJBslTV-b7^>=66pxJt)n`T<>v?mkcQ8S3=yzq<-UZbxL?~58>((P~*n650 zLR8s6hD;5q1Q%=awD!}M*oP{SUDqetV*>-s*7fu#2d5S1UkOmuNO5ab2Y=W4@tI$! z{m{S{tfBqzIara=8rJ)&{5@>qiR<=gR}_@#n&Px_tK2cq9#9lsB`Tv@)Gkj!xZ_#p z?(Au{Ju~=OV-K9jTRMZ&N_KxR<0%qfa6dQ(x^M1iwH++NP%9uVNK^Bj2|qm>`EjKk zaoi7z=hjr}>uKNrFs0GHu>Z+Na@buDmi&giDN3VXr#sm8DxADDUvk| z6w(~Zr9HexWc2IyS`#EN_Fu|gXTeh4O?N&StWTwO-z~oyi~#5@^})17bHoiX$tiv)BcSCgGBFo@#SPS`STLPll$nY}-SE96{Ju*3z!~ZfjI-@^Mur z(QrPoxANSLgsgIUny9vjLw5yWP$>-p5d_jHKMrOjZC}p!)TeSuxc)@P2#bV(6LOLg z)(gllK0-dPCuhD@z}g59{rMUnIdId*xc}W76B17@=}+K~2S(=R zNk83ctwg5wP9RL!C8$uSi?eAS{2C1Wg{hFr2XA%>MK^1#QKAMNnN+5eqs+1a47X4y z$Cm8oC{f|*En1{zhcds%E*GaU7jhNc!=9g}Y7qzn-!YvHUfxhpx?jLYub3%)Ul^3& zlLU{N^K>OUhk38_c3Khq)9bP+*m3@aHGcOnd!~N!>BD>;{T}o{HwkW~N~pc!IR0W3 zryxbmX(g|#^&X{I>;#S8m$D%PY)IrjJT0bzqkP8=;yc+M>~U?;tMHyjU|J@8Z5$X& zmfCiWg&InDK677)%go5`RE++D%rWuP+-s~dv64XB9ibP78uuG?w=R+&XL6$S!) zu{aF8aCgKXcp0&YqngzzB~8k;(NEy7&Fs+g7wNKFpTlS=T# zL*>~L+}k-U+L}Ty9JXk}Q8$ssE6h3n%;V&~%=K;PfIQB11vN!2?UZZoyw)6W6!S~D zvzAN+QabjW?ITBbk}n;W8%+c>tDBMFu5|r zE15)6tXyX}lb8&)AJzg4DsBqd?y84cvL#K zPmc-tqwIoyUocEN(QW2ot92A#VvR^9&bJ{xa{~gRq}w3&`B4mkf9~Rd?~15#ttBP> zb#RAT?C(FpqsBV9T2YzR^q)<8ub;!VU&?Zf0h%{D+`H-=Pvm`&N;}fk_mQbf+6mnu zh3}IWe{PBU1V#(&9a-GF&bo+v4AReeK2+Y**3<&($7P~`*Md~Paml{w zj}pwv`>aVLJC2oI=Lrnf3v9t`Vrn`3VrtEN&r8L(pJHb~t&GarG9))1O0bn>#_`HPz4+HQuQ#Jh9uP!R92v zTZ~AHwbYMxOYLvr$D80OKNoegqUNj63npxih}1lE3Aeto1AnKB+zsh=9&A6V9&((C z%R-z#z-;RL^;Gb=Tg|PnZDlH+U=@m8?zY-P zU9!NZurz<1wzQlEWm1;zv^CF8#$>T_Fm|)9exs=Z_=T=p6#lq9rNzUrC z^7}y)?GPNNY$f6$iSQ*@s#Yi(PAt(+lFg8!m**~xH;98eZ^$I&2Eo32Z$6QZnGStl zPSdw)V9AsDM^VKam1pFO?WLcb%U0Dv=x{=Lc)ZqgOM%tX3{Wde7@k?1@ztwy&Ic~Z zrKai~K7Vqa618u%S`bzN5e}w=hGI2M8oz|KMR2w3{U{AwdzV?qX}}EJ&iiCi2;Ul~ z5*ES!v$2>NY07uiz(xhLATH();Qz92^uMtCFDRA~v+Lp9{)@Obz(GKG(@P#ebN1LwrvWqthUDtGB3f>2pG3`;Y^GhLUh59?g za};$lT;}9JmPQ!G$?=}P(E5}+O*EQKV4BHZ&``_8<@2?uRov)?@=8+b7RfV~>mLu} z!`>>LBB2&m32Z$kOC8|rL3U1hIBG=-cJ#Jz{`8`&@Y#1{QGOBzlZ>9La~-H~jOx=g z$#$`*iNqh+0!g_!C$b64jYrW~uFlLWS@H)lBk01m3aFxVQh8rv z=IKpRiB%YSa}UGOBQjDqE%KW*)1?!6@|ShPxiUyHh1U7l{7`JCOJq78I-sdiZ9v4t z)>KlzpIB|LYeQib^>C?}^z%nYl(i@PC%gZ@^x-1_QuW`|rzrnJ zFvu^+e}aZiHq0n5G!T$drT<+G{6IUGtx=TU)6>5Mvym0SWY{dLmK4e=S;;O+QmdqD zX{hWN6rspt$*GZrZbhUko_4#uZ=mq07o|7-!p%jJ+E1RJ-Co>Yo)IU8ChWM1$V=3f z6oN+laO4^T2gg|B&~)&9-bT_4ho|`HXd9t5jgc(|aMm<7vzEvy>{4w=$)XF+4 zCTi_-EF6>0o5f;;K0k?kR(7%rquG=!d4M~-2KI27ZPwM%*efew2`DX`hJH#_xJ4(> z=h}189GS+(6-pGF;&6baT%rkikmoPHfhzCvZF#Gnx(mCder(z^bo}^(?HU>WIb2n5 z-?;FnozN1-B=F<+_gNh*L%)QzL-O2sY1C8-7QK-M>}ZgcV45QGld>0#Oy6SMKQZK9 zfupohWQkZf<@JwQpFosay-yzEO^%pmlQzA#LVbmgfF6WXvB*JUuqh5^TmK##-Sm-6Wi<4ke!_>cK=`b}cnEH# zrZpI71rDYW_(u~K@ft5kxI{TEN3yJkgr(m2?s#g;qDr7Fqr&MV7DFQNmY*;>Sn*Iu z@zK2Tj#`(Rwu1bGEsff&V+KgHrnTFrJ|bJctoOMGEf3rnpv=ArVVnacnnXIKK>#SJoaNY1GfJPSSROl}T1HH+FpyP@ zmMI@Gn}K2W6~6q}Q96KXci7sRv=bU!h$;L7mPNMV2Ri{<$hUyIlCH}JE6JC6>1QNj zimF+X?asc;_g(nDv#p`}X!+=(&g7@|Uxy?${P)iD!i=w_4olwZie-Bd&hzynT)^6c zGgBZTCXqm()33H~YzW>u4xR=6b8?SLGWw1sj6xOb+7&;H%bUXvp^Rg@=yu}?-CpZo z%RO2hca(Grr@^N+D5xSDIw9dOT#Ajbrion3vTmr&Tj(OGk8^iLR$~ezd931j>ml-N zi)ov(+rsUpx8yu9_1=BP1>W9m8clRv(F%bSC7&sl4HV4yv4k?~3y|9ScSgy@9QVo} z^aUSI{8t+Mszud)@$KK0qwbKS!az*tSQ2`RU)n1_Qe_iHj~?=TV->iQ_x-^uGW1*` z!J1&`Xs`*I1sAJwyLRp)ZaMoi@VpL8dEU*d&(Vp!*YCc`59es55Q|r`(lzytsL}z) zDQA+AIFy$>G_dHEZ&%GIX&dkpFRGI0oYgcp9&qH9o$BQe^hc#RI*#6^-XBXkn&=v% zyM$W4DE6#hIiX?iNi5%Efe-uIx5wWfc|`~CKFrI^E_Om+{>X7&|7>V$ZK~fF-e|Z9 z6VpHi``r#IK-Wm|V(#WS3JvSqoa+u8WOP+iauyREJ~kCM9I=9sPRXT+%k){K-B`m}fF{#>vzHUs2XU@|Pbn$+9Rg=jICg zjj+~GRRMv76_9-ps>;uruBmH-zfDXQ%ISVQddY?yaUsoNVR^X}BW*2GBix#tPfqt6 z$3j~~)DbA2fT5Wrt#35S3UF0k7@)V_TZA5jd6yeW)QGvQTzeqx5|y;qpjl0(zASJW z*fh>O0)v!7BS74}jC-^-8<7VN6ZMQ}b|a<}5uWOsh3QYwrx^bz9s0muC!VAOl1`bT zf&mWq%DP7^{4Ugn9+$&J%|$zD{40_LhmGnD`V(2};&d|*AqanXw5NybbF=te3aUan z+*zqC!`wv$tjwn%fbYhcw#%mO4`DY)(}n#6l_jq_Mqa06hd864V^jg^X;FA6>6&-U z1_WSLHJe!=R8LX@|POPjuy4&annm zOd7|IBAcJfkTXGH;ziw8E1$D&Ft5~0irH^7`b=24e6Kmj`W;aUO|9`G=1+YjFRP$& zMEFr@#5XZJA`V;k<;!>A1DV9sc1?+cL}W{E=agz!h3;&}7N^6wO_*Y=1x>N+?t*o$ zxF(&Bkvxj#9LdIAmTOwcdWw-X9ico0mR^4o_R@{8nCgYv+d`I-9G|1 zF8BkjE`OayT`7U!y<6`LP@jV1pg>tr;0U_X|0(NAz@h5i_+`ckMRsFfE7>VKk*$Q# zYDrOjZIbPyv`vO$vzsil@hZDl(zb#8W~d{yk2h>wobud(X5oMhaw>y6*FgpQ@t z|86{oFi7gh#-pETkI#AHPFj6I{m-lzo-@Yf*=4`RhL1+PHP$azSvr@Gt zXTZ8(r7aQsuXc_fJ#$@~ce}jipEmiS|+$!ss1^NAvc#^uK8B6 zpjl2$BHw?c*w4m5;lH>CKcqfajN0rtu`7C~pP8G-9;1+4k-j4d2?1`k+t)llvxe8_ zfQD!DVvR!m_5XRhxm4Aj@Y}-a<@91j6Kkl9)Au5WMAMUz?OOZW#V$sZmH%|d>12Hp z8d)hmT4B8AnNy6VlrZ^7J@vh8^6A|R+A^;GFg(90vxj|Cn`*}6($-LOmpG+=Mza-5 z^paI_mRW?c#t5{J{qPzNa&}Si6AtiHx|->BeqbwT33+1b{V%t^{`bt{N)Qz>ZsPXh zxo0P5>h*6Xd}80?xGpbH56{kzoTTvkEPy|ZK4gG(DW*hld$iAWmzv^V}- zz|>RU2$l$b^7N)dRz?w)jkVfmscDYC6gWIMME~WA3r}fQzGc<=hR>GAKy64RD zDT&0y*0+_ih106k)uKI5OFMSI&#iox{482-m*#FDj(%#VcC*39my6a#6k0TRx0P^3 zu`WKDZ1*_5T>9~hcv@=Afiu^1mU{4bc7NJN@sx0pJ>eW@ch7G}&wHO;e$aJ-Dwp@A zZ)&hDapr7WR7JFW9>2r6&Ejj%t#`HI)seq_ZLdEcZ+&%p7w6g^W%q~duSw>qpr2{_ z?Z;jsD{42?wrX#sX~~g`Ge;$1__;j$zC9~KS;L(DZyh=mY;{$BSADI9^ps>~ktu(& z(u0j*S}iuZl3pEdJeFG@1SXzpGZo9BjxHGqJo86=!AX~z{l^QthN86H)c%R|HAIgS z4>^$nt7p0zx`ggI{qgQ{(diqE`_yO{Br)}qUpk1jqW$VL>$?8Px}`b$n-8~q;n~?A zEz^+W^*lA>j?IsME-u#iqB^`rPHi&e$?(X?M8mdc33tj&9&fZKv#>w9ag0mN&Gqpx zwc$(AJ9T$HBN=M%vAQS;e%b1?&mO4vob2^pWi%`#(C0ED}T;uDfrquFP^bD?dj`vTD32Ho1>_K{LtlSWV#A3s*yL=h5Qsa>{zqG|fRa z3T6ABjo#Ld>z*}7x9-mwgq=Y>r$@tW`EpcybL~SEtS54H@;nY392Bw}INPy|_fTEK zP93KmZ=dGpNkvUk(*M5&`JAv!e#IzqmOZLu$Ejm*st8`%9s`GDSp5ElAd@jmq zdmkO%aW#ue=b*OE;o~wbxf2GVXzX>n2sr?7qMDSdEUr< zUBBmW*-J^@Ne^zGK`;N^#kR}qog!?T^J>Mm=9S3rZeBDnP_^+>qM7i*fPu!F8tN%^ z%6j)pMY9!Ko&7ey3$_qS=}Q#3tCuCZ-rwy(dD}y3Xk>&|n3;?u`^(TW;n8LTEqA`x z-}(C9Wsk4l(BR!Qigf%rhrKA*ZfB)v0w#id`>9Az4 zE=T&4z?6_1vf9;K^zGsWhNrdt1@f0&h<9_yG82)}Ken)BQl~oWLm%0xbX?G0u(2*s z$k4-|M~>QesqK6E4!aMANe>V2R({QSv)e{J`*6KvvwQDE9o55FZDU-M)8z9)lfr_9pP2eZJ*CN4ND1J?L5FDmj+zEB-U`y5ptYcIxdM z`h6C%ceH|!?ztH8leeeGA|S*kvQ|H<{`(fL8(}_bdlINTnX#9-pWHdRJmO4K0fz>u zpZ`+!WNc)s{AZ!^=jrzj~C34c0Z9?rEixK($xNWr0iO`1C4)c-oQ&#AR2a`V@JmhHZg z_%iivI=jK)s18!1eU@VClJC5TR522=IBK5nYs+?#Y;xdh zv4qUP!$_B~oFk_e739CpP)?d@v~2J1mc0;P)};L~U1qOYYu5CMt$DWHiPq%`Iwu_? zqXu&W-`yO{`!*y-&A0iUtXi?(Sxsbz8^&(vNperU`_m>d;F^DLSet}pg>fUrQC0ck z>u$NdE9zq{bq_9--kbGsQB;T^mbg1BJJnK8na7?YqxIT--Kl3~@8VwTZdu`G`6FH3 z(U)D+#PNJBrIgP+>`2u;_gy4yaZx$Vlw=>OS4=|Ewfm3!?!Tv|nq6fL+Tg}>1|x^s zM!Ado@lyl@LUeb_ODnJfpNdsGMK?}aa-Upct|_iZiKUeIe9=6{60N*Ob(xBK^w@oQR7))kpb-USe~BN{8SP-~2v_18Xt^ zwxsX}TxE|c6yaIuSfeab5aAf%w)^MAk>mHadZp$XJxsT2_P+FB&;&UA{=Jy_jE_4R zlmp@rwkZ|tr5(pwWCCT{A>Y3bK>7mWkS{%vV!Z@l*g`@4;U`gO+zHro?4JQknsQtr z=w=}u3ay60ML?J2i7xVsfH86LrwFJK7aGMtlepMZ477=h8^yqYxM(Q`Ylw?wFM%0x z;rSAn6BmzXB}iQi3cdougjnqr-KzU5u!4}lS9Gg2uYf)w;VPkrU{?aH2}xoJ-Otw& zu$GV@&tlN_HBcu0I{unYEPo9)5)$cB;6#H;!8YQeY4$?D47d`K_}Pnz*$d}4U^@Zj zy`gi&%E9)#B;ku8vLLjn0K77I08S5;f=kpf zY{}UW3WQ+sfD~U`&MZ zRmAZrD{^bmL|2cWD|hZmGr#V4`bH8>=*1 zB2wdvzZ_kKri?9m*l#71zblitk}1LZptVf*jy{HIo<#qcSWj4?dmVbfuc8JlC8%V9 zs5U#)R{E$Zn0q75h(=Ye1&Ty7IMt%qY>jEss9LauFfb`<+ABlGunnjc<~8c{ab)W2|*4`3M)#kUn#wdzn5TczjEhuEOM`0xV|BwS^FK&Bo?F(5wp`vcv} zqK^ogxlDu9h5-e-e56BOI8+!%K(Qle#1x~@3IBy2*L~NcUOC8xVQ8)~UbllPug}tD zp?V#?(Ri+1n$ATePBap<7-W1-9!bXOW`t4w6W1ReMB~H@88%>IoxY8;#9&(;P$lx= z`Gg`{mqL@GM>!P;1N{6cQsZnG7LTGr!;|s49i;G?hzfr0VqF9i+E|5P#V7iL)P$P~ z>}KGUIY_S_K{vnBAn$sxlJKI@7+V{@0>eanF%11c3gdMO69auTDF*Eu0Iw9jlH4+^QFEYRSgH<&q4CFf-45CYPc;BTLcg#9>Hjvs^_SzH zSOU1Pk={X4jkswe9Fm02jX;nHaMPZB!GfqA`B6J6Gi>6m?O;laqHq)~b5CcjRNz*! z%xTaybCM7gX`-(O5jT#tj-$1p13mo8Jo_$L(fB)>=o1xK%bSm*iMJX}JOw7N4Nf#_ zK@$)sGHPi;4kJ=ROdl=^RWsoi&@zA18N=k5OugJiQ}Sx2Z>eXSk*Vkl zH0cZU2jQRE8KgV}P8z%Fn!c8LMTqQV2CbPp-v{w-dd+R+9{ksUmo(N$WDh(K~+d&3wgn|aV zT1StErxW>{<|V`;u!5f~p*(Letc!{hvzAAFWVH~jQw(GHtg%J)V<(^xN#DZ_#R-$4 zod|ge9O$ImpT@;HqGZ@FMwWoOU(ocyKi(f^4O^Lka$1f0op~U$NI;ElfR-Ui@?v;) zmLJXWrQRRKuna9?%$v)gB#m!Z3ix2l7c~EoeK`CDjq?l{1|$NFx&ROUsW-ImLXedL z4lRMXrKmbnS0s}mS3f66NN_b@!KqnIV3Euq0m;L zeVBO(KdXcD&7^Tw=Gx5rm-sO35SqEntRwnFDAB6i(9Mt@2oY#wHwtu{EiF*-uRxN> z%;+nU)^4OpsbA5KisyR^mp<^NNzeaF=9|mMZpz~$K=Gk_!{-$mZbzZaH(*Z0=P38^ z=QR`?AhXVkFZVdjYT7q?1aH3~U#XvHQdHhb5D}>KAZcL}P3qNy7BsxEFW}P6UuaTP z)JhY*KeHnGY#Zu*a}*Nuc2w4fQ|0g?R|I-}M_qz9-rP@a&EF0F4B&iOyvXHHKj0qV z{`cU;2ignQg0>tf3=7WwzdDfu9}EE@{3{z!-75$=ztabZ#CH_)ZCwI|_TPaLk;zG1 z8l}(Bxnaa63As^(1lo(ED^@d5$tqO8>-8avc<VgB3u{A&nI{%`_(1#n3 zA{PEGLzltE*P?~@7<_)HIE4BIZ+X2Tl$vxp4LUId1PCiJDj#HzqSbUWij;XpEqH=c zO$gSVv|szu5$g$JG5ZRC26=~pCDG!}!^p$Ad|XWmE=IMOhU)xrhzCBM;vwFOjB%h% z(Ud80(U%Ne8Mt%^@DR?O?+N^Ph?4Y0I?T=;OL4v=^d12UL<9*VC<3=PG-+!cUhtq! zC#=kUx5s=dODbr5^=dS(@a`i_dHz7AOh#zXY)QyVj1|VKFu&pkzvnIKp|W+-Oa|-fIi|-<`=M{ zCGZP5Op(L|lF&p86>~Yi=v%^D95U5lKq63Tls-ySNAa{Z84wwIj?#w;n*g@08)Y1f zmMZ3AW=sp-8U;qgFl)yRDC*J-h>xMkhz~xKF(j2Tq)AaZC;%^x(K}|j0=9fDn)5@O6&Y_A?nAm}c;6*2Z7)u|N8An0_o-G0;*6urae?yH->|Eq@mrF5f<4OPJn({xLxx|196LQ)F#Gjr!@ z-u=rGDoXhwM?ZZGt(!sS-2bED_(36Fm~z9PGxWsf&JyP@2|QVUDWTIv;kjl1!q7Q| kODK|PG>n*6x3Fx6k~DPw0~T?oVQHAI5r%m_MU8;{4=Bs$jQ{`u diff --git a/sources/net.sf.j2s.ajax/.j2s b/sources/net.sf.j2s.ajax/.j2s index f3a59e7f3..2403e51d7 100644 --- a/sources/net.sf.j2s.ajax/.j2s +++ b/sources/net.sf.j2s.ajax/.j2s @@ -1,20 +1,11 @@ -#<<<<<<< HEAD -#Java2Script Configuration -#Fri Jul 17 23:11:27 CST 2009 -j2s.abandoned.resources.list=bin/net/sf/j2s/ajax/AjaxPlugin.js,bin/net/sf/j2s/ajax/AJAXVariableInitializer.js -j2s.compiler.abbreviation=true -j2s.compiler.status=enable -j2s.compiler.abbreviation.prefix=$_ -j2s.compiler.mode=debug -j2s.resources.list=../../plugins/net.sf.j2s.lib_3.1.1/j2slib/java.runtime.j2x,bin/net/sf/j2s/ajax/XHRCallbackSWTAdapter.js,bin/net/sf/j2s/ajax/XHRCallbackAdapter.js,bin/net/sf/j2s/ajax/IXHRCallback.js,bin/net/sf/j2s/ajax/HttpRequest.js,bin/net/sf/j2s/ajax/AClass.js,bin/net/sf/j2s/ajax/ASWTClass.js,bin/net/sf/j2s/ajax/ARunnable.js,bin/net/sf/j2s/ajax/Base64.js,bin/net/sf/j2s/ajax/SimpleSerializable.js,bin/net/sf/j2s/ajax/SimpleRPCRunnable.js,bin/net/sf/j2s/ajax/SimpleRPCHttpServlet.js,bin/net/sf/j2s/ajax/SimpleRPCRequest.js,bin/net/sf/j2s/ajax/SimpleRPCSWTRequest.js,bin/net/sf/j2s/ajax/SimpleFilter.js,bin/net/sf/j2s/ajax/SimplePipeHelper.js,bin/net/sf/j2s/ajax/SimplePipeHttpServlet.js,bin/net/sf/j2s/ajax/SimplePipeRPCHttpServlet.js,bin/net/sf/j2s/ajax/SimplePipeRequest.js,bin/net/sf/j2s/ajax/SimplePipeRunnable.js,bin/net/sf/j2s/ajax/SimplePipeSWTRequest.js,bin/net/sf/j2s/ajax/CompoundPipeRunnable.js,bin/net/sf/j2s/ajax/PipeManager.js,bin/net/sf/j2s/ajax/PipeObject.js,bin/net/sf/j2s/ajax/CompoundPipeRequest.js,bin/net/sf/j2s/ajax/CompoundSerializable.js,bin/net/sf/j2s/ajax/CompoundPipeSWTRequest.js,bin/net/sf/j2s/ajax/CompoundPipeSession.js,bin/net/sf/j2s/ajax/CompoundPipeRPCHttpServlet.js,bin/net/sf/j2s/ajax/SWTHelper.js,bin/net/sf/j2s/ajax/AWindowRunnable.js,bin/net/sf/j2s/ajax/AWindowDelegate.js,bin/net/sf/j2s/ajax/ISimplePipePriority.js,bin/net/sf/j2s/annotation/J2SIgnore.js,bin/net/sf/j2s/annotation/J2SIngoreSuperConstructor.js,bin/net/sf/j2s/annotation/J2SKeep.js,bin/net/sf/j2s/annotation/J2SOverride.js,bin/net/sf/j2s/annotation/J2SDebug.js,bin/net/sf/j2s/annotation/J2SIgnoreImport.js,bin/net/sf/j2s/annotation/J2SRequireImport.js,bin/net/sf/j2s/annotation/J2SOptionalImport.js,bin/net/sf/j2s/annotation/J2SNative.js,bin/net/sf/j2s/annotation/J2SNativeSrc.js,bin/net/sf/j2s/annotation/J2SSuffix.js,bin/net/sf/j2s/annotation/J2SPrefix.js,bin/net/sf/j2s/store/IStore.js,bin/net/sf/j2s/store/SimpleStore.js,bin/net/sf/j2s/store/CookieStore.js,bin/net/sf/j2s/store/INIFileStore.js,bin/net/sf/j2s/store/XSSCookieStore.js,bin/net/sf/j2s/ajax/ManagedCompoundPipeRunnable.js,bin/net/sf/j2s/ajax/ManagedCompoundPipeSession.js,bin/net/sf/j2s/ajax/ManagedPipeHelper.js,bin/net/sf/j2s/ajax/IManagedPipe.js -j2s.compiler.whitespace=false -j2s.output.path=bin -j2s.compiler.linebreak=\r\n -#======= #Java2Script Configuration -#Tue Jun 27 12:46:23 CEST 2017 -#j2s.resources.list= -#j2s.abandoned.resources.list= -#j2s.output.path=bin -#j2s.compiler.status=enable -#>>>>>>> master +#Wed Jul 05 11:01:01 CDT 2017 +j2s.abandoned.resources.list=bin/net/sf/j2s/ajax/AjaxPlugin.js,bin/net/sf/j2s/ajax/AJAXVariableInitializer.js +j2s.compiler.abbreviation=true +j2s.compiler.status=enable +j2s.compiler.abbreviation.prefix=$_ +j2s.compiler.mode=debug +j2s.resources.list=../../plugins/net.sf.j2s.lib_3.1.1/j2slib/java.runtime.j2x,bin/net/sf/j2s/ajax/XHRCallbackSWTAdapter.js,bin/net/sf/j2s/ajax/XHRCallbackAdapter.js,bin/net/sf/j2s/ajax/IXHRCallback.js,bin/net/sf/j2s/ajax/HttpRequest.js,bin/net/sf/j2s/ajax/AClass.js,bin/net/sf/j2s/ajax/ASWTClass.js,bin/net/sf/j2s/ajax/ARunnable.js,bin/net/sf/j2s/ajax/Base64.js,bin/net/sf/j2s/ajax/SimpleSerializable.js,bin/net/sf/j2s/ajax/SimpleRPCRunnable.js,bin/net/sf/j2s/ajax/SimpleRPCHttpServlet.js,bin/net/sf/j2s/ajax/SimpleRPCRequest.js,bin/net/sf/j2s/ajax/SimpleRPCSWTRequest.js,bin/net/sf/j2s/ajax/SimpleFilter.js,bin/net/sf/j2s/ajax/SimplePipeHelper.js,bin/net/sf/j2s/ajax/SimplePipeHttpServlet.js,bin/net/sf/j2s/ajax/SimplePipeRPCHttpServlet.js,bin/net/sf/j2s/ajax/SimplePipeRequest.js,bin/net/sf/j2s/ajax/SimplePipeRunnable.js,bin/net/sf/j2s/ajax/SimplePipeSWTRequest.js,bin/net/sf/j2s/ajax/CompoundPipeRunnable.js,bin/net/sf/j2s/ajax/PipeManager.js,bin/net/sf/j2s/ajax/PipeObject.js,bin/net/sf/j2s/ajax/CompoundPipeRequest.js,bin/net/sf/j2s/ajax/CompoundSerializable.js,bin/net/sf/j2s/ajax/CompoundPipeSWTRequest.js,bin/net/sf/j2s/ajax/CompoundPipeSession.js,bin/net/sf/j2s/ajax/CompoundPipeRPCHttpServlet.js,bin/net/sf/j2s/ajax/SWTHelper.js,bin/net/sf/j2s/ajax/AWindowRunnable.js,bin/net/sf/j2s/ajax/AWindowDelegate.js,bin/net/sf/j2s/ajax/ISimplePipePriority.js,bin/net/sf/j2s/annotation/J2SIgnore.js,bin/net/sf/j2s/annotation/J2SIngoreSuperConstructor.js,bin/net/sf/j2s/annotation/J2SKeep.js,bin/net/sf/j2s/annotation/J2SOverride.js,bin/net/sf/j2s/annotation/J2SDebug.js,bin/net/sf/j2s/annotation/J2SIgnoreImport.js,bin/net/sf/j2s/annotation/J2SRequireImport.js,bin/net/sf/j2s/annotation/J2SOptionalImport.js,bin/net/sf/j2s/annotation/J2SNative.js,bin/net/sf/j2s/annotation/J2SNativeSrc.js,bin/net/sf/j2s/annotation/J2SSuffix.js,bin/net/sf/j2s/annotation/J2SPrefix.js,bin/net/sf/j2s/store/IStore.js,bin/net/sf/j2s/store/SimpleStore.js,bin/net/sf/j2s/store/CookieStore.js,bin/net/sf/j2s/store/INIFileStore.js,bin/net/sf/j2s/store/XSSCookieStore.js,bin/net/sf/j2s/ajax/ManagedCompoundPipeRunnable.js,bin/net/sf/j2s/ajax/ManagedCompoundPipeSession.js,bin/net/sf/j2s/ajax/ManagedPipeHelper.js,bin/net/sf/j2s/ajax/IManagedPipe.js +j2s.compiler.whitespace=false +j2s.output.path=bin +j2s.compiler.linebreak=\r\n diff --git a/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java b/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java index 039be01b0..a25d54700 100644 --- a/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java +++ b/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java @@ -685,20 +685,25 @@ public boolean visit(ClassInstanceCreation node) { buffer.append(")"); } else { ITypeBinding binding = node.resolveTypeBinding(); - // BEGIN MERGE 7/5/17 (Pulled from java2script/java2script Commit bc6425216b915bd9b4ad6111c8bb9f24fa666277) - // String anonClassName = null; - // if (binding.isAnonymous() || binding.isLocal()) { - // String binaryName = binding.getBinaryName(); - // if (binaryName == null) { - // String bindingKey = binding.getKey(); - // if (bindingKey != null) { - // binaryName = bindingKey = bindingKey.substring(1, bindingKey.length() - 1).replace('/', '.'); - // } - // } - // anonClassName = assureQualifiedName(shortenQualifiedName(binaryName)); - // } else { - // anonClassName = assureQualifiedName(shortenQualifiedName(binding.getQualifiedName())); - // } + // BEGIN MERGE 7/5/17 (Removed in java2script/java2script Commit bc6425216b915bd9b4ad6111c8bb9f24fa666277 [6/22/17]) + // need to retain because without it we get the following error when exporting + // 89. ERROR in .../java2script/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java (at line 750) + // buffer.append(anonClassName); + // ^^^^^^^^^^^^^ + // anonClassName cannot be resolved to a variable + String anonClassName = null; + if (binding.isAnonymous() || binding.isLocal()) { + String binaryName = binding.getBinaryName(); + if (binaryName == null) { + String bindingKey = binding.getKey(); + if (bindingKey != null) { + binaryName = bindingKey = bindingKey.substring(1, bindingKey.length() - 1).replace('/', '.'); + } + } + anonClassName = assureQualifiedName(shortenQualifiedName(binaryName)); + } else { + anonClassName = assureQualifiedName(shortenQualifiedName(binding.getQualifiedName())); + } // END MERGE 7/5/17 // String baseClassName = assureQualifiedName(shortenQualifiedName(getFullClassName())); diff --git a/sources/net.sf.j2s.java.core/.j2s b/sources/net.sf.j2s.java.core/.j2s index 0b4c25fde..37a30f584 100644 --- a/sources/net.sf.j2s.java.core/.j2s +++ b/sources/net.sf.j2s.java.core/.j2s @@ -1,5 +1,5 @@ #Java2Script Configuration -#Thu Jun 15 16:28:15 CDT 2017 +#Wed Jul 05 11:13:03 CDT 2017 j2s.compiler.visitor=SWTScriptVisitor j2s.abandoned.resources.list= j2s.compiler.abbreviation=true diff --git a/sources/net.sf.j2s.java.org.eclipse.osgi/.j2s b/sources/net.sf.j2s.java.org.eclipse.osgi/.j2s index ccb814b75..3face6589 100644 --- a/sources/net.sf.j2s.java.org.eclipse.osgi/.j2s +++ b/sources/net.sf.j2s.java.org.eclipse.osgi/.j2s @@ -1,6 +1,6 @@ #Java2Script Configuration -#Thu Jun 15 16:28:18 CDT 2017 +#Wed Jul 05 11:01:04 CDT 2017 j2s.resources.list=../../plugins/net.sf.j2s.lib_3.1.1/j2slib/java.runtime.j2x,bin/org/osgi/util/tracker/ServiceTrackerCustomizer.js,bin/org/osgi/util/tracker/ServiceTracker.js,bin/org/osgi/service/url/URLStreamHandlerSetter.js,bin/org/osgi/service/url/URLStreamHandlerService.js,bin/org/osgi/service/url/URLConstants.js,bin/org/osgi/service/url/AbstractURLStreamHandlerService.js,bin/org/osgi/service/startlevel/StartLevel.js,bin/org/osgi/service/permissionadmin/PermissionInfo.js,bin/org/osgi/service/permissionadmin/PermissionAdmin.js,bin/org/osgi/service/packageadmin/RequiredBundle.js,bin/org/osgi/service/packageadmin/PackageAdmin.js,bin/org/osgi/service/packageadmin/ExportedPackage.js,bin/org/osgi/service/condpermadmin/ConditionalPermissionInfo.js,bin/org/osgi/service/condpermadmin/ConditionalPermissionAdmin.js,bin/org/osgi/service/condpermadmin/ConditionInfo.js,bin/org/osgi/service/condpermadmin/Condition.js,bin/org/osgi/service/condpermadmin/BundleSignerCondition.js,bin/org/osgi/service/condpermadmin/BundleLocationCondition.js,bin/org/osgi/framework/Version.js,bin/org/osgi/framework/SynchronousBundleListener.js,bin/org/osgi/framework/ServiceRegistration.js,bin/org/osgi/framework/ServiceReference.js,bin/org/osgi/framework/ServicePermission.js,bin/org/osgi/framework/ServiceListener.js,bin/org/osgi/framework/ServiceFactory.js,bin/org/osgi/framework/ServiceEvent.js,bin/org/osgi/framework/PackagePermission.js,bin/org/osgi/framework/InvalidSyntaxException.js,bin/org/osgi/framework/FrameworkUtil.js,bin/org/osgi/framework/FrameworkListener.js,bin/org/osgi/framework/FrameworkEvent.js,bin/org/osgi/framework/Filter.js,bin/org/osgi/framework/Constants.js,bin/org/osgi/framework/Configurable.js,bin/org/osgi/framework/BundlePermission.js,bin/org/osgi/framework/BundleListener.js,bin/org/osgi/framework/BundleException.js,bin/org/osgi/framework/BundleEvent.js,bin/org/osgi/framework/BundleContext.js,bin/org/osgi/framework/BundleActivator.js,bin/org/osgi/framework/Bundle.js,bin/org/osgi/framework/AllServiceListener.js,bin/org/osgi/framework/AdminPermission.js,bin/org/eclipse/osgi/util/NLS.js,bin/org/eclipse/osgi/util/ManifestElement.js,bin/org/eclipse/osgi/service/urlconversion/URLConverter.js,bin/org/eclipse/osgi/service/runnable/ParameterizedRunnable.js,bin/org/eclipse/osgi/service/resolver/VersionRange.js,bin/org/eclipse/osgi/service/resolver/VersionConstraint.js,bin/org/eclipse/osgi/service/resolver/StateObjectFactory.js,bin/org/eclipse/osgi/service/resolver/StateHelper.js,bin/org/eclipse/osgi/service/resolver/StateDelta.js,bin/org/eclipse/osgi/service/resolver/State.js,bin/org/eclipse/osgi/service/resolver/Resolver.js,bin/org/eclipse/osgi/service/resolver/PlatformAdmin.js,bin/org/eclipse/osgi/service/resolver/ImportPackageSpecification.js,bin/org/eclipse/osgi/service/resolver/HostSpecification.js,bin/org/eclipse/osgi/service/resolver/ExportPackageDescription.js,bin/org/eclipse/osgi/service/resolver/BundleSpecification.js,bin/org/eclipse/osgi/service/resolver/BundleDescription.js,bin/org/eclipse/osgi/service/resolver/BundleDelta.js,bin/org/eclipse/osgi/service/resolver/BaseDescription.js,bin/org/eclipse/osgi/service/pluginconversion/PluginConverter.js,bin/org/eclipse/osgi/service/pluginconversion/PluginConversionException.js,bin/org/eclipse/osgi/service/localization/BundleLocalization.js,bin/org/eclipse/osgi/service/environment/EnvironmentInfo.js,bin/org/eclipse/osgi/service/environment/Constants.js,bin/org/eclipse/osgi/service/debug/DebugOptions.js,bin/org/eclipse/osgi/service/datalocation/Location.js,bin/org/eclipse/osgi/internal/resolver/VersionConstraintImpl.js,bin/org/eclipse/osgi/internal/resolver/UserState.js,bin/org/eclipse/osgi/internal/resolver/SystemState.js,bin/org/eclipse/osgi/internal/resolver/StateWriter.js,bin/org/eclipse/osgi/internal/resolver/StateReader.js,bin/org/eclipse/osgi/internal/resolver/StateObjectFactoryImpl.js,bin/org/eclipse/osgi/internal/resolver/StateMsg.js,bin/org/eclipse/osgi/internal/resolver/StateImpl.js,bin/org/eclipse/osgi/internal/resolver/StateHelperImpl.js,bin/org/eclipse/osgi/internal/resolver/StateDeltaImpl.js,bin/org/eclipse/osgi/internal/resolver/StateBuilder.js,bin/org/eclipse/osgi/internal/resolver/ReadOnlyState.js,bin/org/eclipse/osgi/internal/resolver/ImportPackageSpecificationImpl.js,bin/org/eclipse/osgi/internal/resolver/HostSpecificationImpl.js,bin/org/eclipse/osgi/internal/resolver/ExportPackageDescriptionImpl.js,bin/org/eclipse/osgi/internal/resolver/ComputeNodeOrder.js,bin/org/eclipse/osgi/internal/resolver/BundleSpecificationImpl.js,bin/org/eclipse/osgi/internal/resolver/BundleDescriptionImpl.js,bin/org/eclipse/osgi/internal/resolver/BundleDeltaImpl.js,bin/org/eclipse/osgi/internal/resolver/BaseDescriptionImpl.js,bin/org/eclipse/osgi/internal/profile/ProfileLogger.js,bin/org/eclipse/osgi/internal/profile/Profile.js,bin/org/eclipse/osgi/internal/profile/DefaultProfileLogger.js,bin/org/eclipse/osgi/internal/module/VersionSupplier.js,bin/org/eclipse/osgi/internal/module/VersionHashMap.js,bin/org/eclipse/osgi/internal/module/ResolverImport.js,bin/org/eclipse/osgi/internal/module/ResolverImpl.js,bin/org/eclipse/osgi/internal/module/ResolverExport.js,bin/org/eclipse/osgi/internal/module/ResolverBundle.js,bin/org/eclipse/osgi/internal/module/PermissionChecker.js,bin/org/eclipse/osgi/internal/module/GroupingChecker.js,bin/org/eclipse/osgi/internal/module/CyclicDependencyHashMap.js,bin/org/eclipse/osgi/internal/module/BundleConstraint.js,bin/org/eclipse/osgi/framework/util/SecureAction.js,bin/org/eclipse/osgi/framework/util/Headers.js,bin/org/eclipse/osgi/framework/log/FrameworkLogEntry.js,bin/org/eclipse/osgi/framework/log/FrameworkLog.js,bin/org/eclipse/osgi/framework/launcher/Launcher.js,bin/org/eclipse/osgi/framework/internal/reliablefile/ReliableFileOutputStream.js,bin/org/eclipse/osgi/framework/internal/reliablefile/ReliableFileInputStream.js,bin/org/eclipse/osgi/framework/internal/reliablefile/ReliableFile.js,bin/org/eclipse/osgi/framework/internal/protocol/reference/ReferenceURLConnection.js,bin/org/eclipse/osgi/framework/internal/protocol/reference/Handler.js,bin/org/eclipse/osgi/framework/internal/protocol/bundleresource/Handler.js,bin/org/eclipse/osgi/framework/internal/protocol/bundleentry/Handler.js,bin/org/eclipse/osgi/framework/internal/protocol/URLStreamHandlerSetter.js,bin/org/eclipse/osgi/framework/internal/protocol/URLStreamHandlerProxy.js,bin/org/eclipse/osgi/framework/internal/protocol/StreamHandlerFactory.js,bin/org/eclipse/osgi/framework/internal/protocol/ProtocolActivator.js,bin/org/eclipse/osgi/framework/internal/protocol/NullURLStreamHandlerService.js,bin/org/eclipse/osgi/framework/internal/protocol/ContentHandlerProxy.js,bin/org/eclipse/osgi/framework/internal/protocol/ContentHandlerFactory.js,bin/org/eclipse/osgi/framework/internal/defaultadaptor/MetaData.js,bin/org/eclipse/osgi/framework/internal/defaultadaptor/DefaultLog.js,bin/org/eclipse/osgi/framework/internal/defaultadaptor/DefaultElementFactory.js,bin/org/eclipse/osgi/framework/internal/defaultadaptor/DefaultBundleData.js,bin/org/eclipse/osgi/framework/internal/defaultadaptor/DefaultAdaptor.js,bin/org/eclipse/osgi/framework/internal/core/Util.js,bin/org/eclipse/osgi/framework/internal/core/UnresolvedPermissionCollection.js,bin/org/eclipse/osgi/framework/internal/core/UnresolvedPermission.js,bin/org/eclipse/osgi/framework/internal/core/Tokenizer.js,bin/org/eclipse/osgi/framework/internal/core/SystemPolicy.js,bin/org/eclipse/osgi/framework/internal/core/SystemBundleLoader.js,bin/org/eclipse/osgi/framework/internal/core/SystemBundleData.js,bin/org/eclipse/osgi/framework/internal/core/SystemBundleActivator.js,bin/org/eclipse/osgi/framework/internal/core/SystemBundle.js,bin/org/eclipse/osgi/framework/internal/core/StartLevelManager.js,bin/org/eclipse/osgi/framework/internal/core/StartLevelImpl.js,bin/org/eclipse/osgi/framework/internal/core/StartLevelEvent.js,bin/org/eclipse/osgi/framework/internal/core/SingleSourcePackage.js,bin/org/eclipse/osgi/framework/internal/core/ServiceUse.js,bin/org/eclipse/osgi/framework/internal/core/ServiceRegistryImpl.js,bin/org/eclipse/osgi/framework/internal/core/ServiceRegistrationImpl.js,bin/org/eclipse/osgi/framework/internal/core/ServiceReferenceImpl.js,bin/org/eclipse/osgi/framework/internal/core/SecurePermissionStorage.js,bin/org/eclipse/osgi/framework/internal/core/RegisteredPolicy.js,bin/org/eclipse/osgi/framework/internal/core/ReferenceInputStream.js,bin/org/eclipse/osgi/framework/internal/core/PolicyHandler.js,bin/org/eclipse/osgi/framework/internal/core/PermissionsHash.js,bin/org/eclipse/osgi/framework/internal/core/PermissionAdminImpl.js,bin/org/eclipse/osgi/framework/internal/core/ParentPolicy.js,bin/org/eclipse/osgi/framework/internal/core/PackageSource.js,bin/org/eclipse/osgi/framework/internal/core/PackageAdminImpl.js,bin/org/eclipse/osgi/framework/internal/core/OSGi.js,bin/org/eclipse/osgi/framework/internal/core/NullPackageSource.js,bin/org/eclipse/osgi/framework/internal/core/MultiSourcePackage.js,bin/org/eclipse/osgi/framework/internal/core/Msg.js,bin/org/eclipse/osgi/framework/internal/core/MessageResourceBundle.js,bin/org/eclipse/osgi/framework/internal/core/ManifestLocalization.js,bin/org/eclipse/osgi/framework/internal/core/KeyedHashSet.js,bin/org/eclipse/osgi/framework/internal/core/KeyedElement.js,bin/org/eclipse/osgi/framework/internal/core/IBuddyPolicy.js,bin/org/eclipse/osgi/framework/internal/core/GlobalPolicy.js,bin/org/eclipse/osgi/framework/internal/core/FrameworkSecurityManager.js,bin/org/eclipse/osgi/framework/internal/core/FrameworkConsole.js,bin/org/eclipse/osgi/framework/internal/core/FrameworkCommandProvider.js,bin/org/eclipse/osgi/framework/internal/core/FrameworkCommandInterpreter.js,bin/org/eclipse/osgi/framework/internal/core/Framework.js,bin/org/eclipse/osgi/framework/internal/core/FilteredSourcePackage.js,bin/org/eclipse/osgi/framework/internal/core/FilteredServiceListener.js,bin/org/eclipse/osgi/framework/internal/core/FilterImpl.js,bin/org/eclipse/osgi/framework/internal/core/ExportedPackageImpl.js,bin/org/eclipse/osgi/framework/internal/core/DependentPolicy.js,bin/org/eclipse/osgi/framework/internal/core/DefaultPermissionStorage.js,bin/org/eclipse/osgi/framework/internal/core/Constants.js,bin/org/eclipse/osgi/framework/internal/core/ConsoleMsg.js,bin/org/eclipse/osgi/framework/internal/core/ConditionalPermissions.js,bin/org/eclipse/osgi/framework/internal/core/ConditionalPermissionSet.js,bin/org/eclipse/osgi/framework/internal/core/ConditionalPermissionInfoImpl.js,bin/org/eclipse/osgi/framework/internal/core/ConditionalPermissionAdminImpl.js,bin/org/eclipse/osgi/framework/internal/core/BundleURLConnection.js,bin/org/eclipse/osgi/framework/internal/core/BundleSource.js,bin/org/eclipse/osgi/framework/internal/core/BundleResourceHandler.js,bin/org/eclipse/osgi/framework/internal/core/BundleRepository.js,bin/org/eclipse/osgi/framework/internal/core/BundleProtectionDomainImpl.js,bin/org/eclipse/osgi/framework/internal/core/BundlePermissions.js,bin/org/eclipse/osgi/framework/internal/core/BundlePermissionCollection.js,bin/org/eclipse/osgi/framework/internal/core/BundleNativeCode.js,bin/org/eclipse/osgi/framework/internal/core/BundleLoaderProxy.js,bin/org/eclipse/osgi/framework/internal/core/BundleLoader.js,bin/org/eclipse/osgi/framework/internal/core/BundleHost.js,bin/org/eclipse/osgi/framework/internal/core/BundleFragment.js,bin/org/eclipse/osgi/framework/internal/core/BundleContextImpl.js,bin/org/eclipse/osgi/framework/internal/core/BundleCombinedPermissions.js,bin/org/eclipse/osgi/framework/internal/core/AliasMapper.js,bin/org/eclipse/osgi/framework/internal/core/AbstractBundle.js,bin/org/eclipse/osgi/framework/eventmgr/ListenerQueue.js,bin/org/eclipse/osgi/framework/eventmgr/EventManager.js,bin/org/eclipse/osgi/framework/eventmgr/EventListeners.js,bin/org/eclipse/osgi/framework/eventmgr/EventDispatcher.js,bin/org/eclipse/osgi/framework/debug/FrameworkDebugOptions.js,bin/org/eclipse/osgi/framework/debug/Debug.js,bin/org/eclipse/osgi/framework/console/CommandProvider.js,bin/org/eclipse/osgi/framework/console/CommandInterpreter.js,bin/org/eclipse/osgi/framework/adaptor/core/StateManager.js,bin/org/eclipse/osgi/framework/adaptor/core/SignedBundleSupport.js,bin/org/eclipse/osgi/framework/adaptor/core/SignedBundle.js,bin/org/eclipse/osgi/framework/adaptor/core/InvalidVersion.js,bin/org/eclipse/osgi/framework/adaptor/core/DevClassPathHelper.js,bin/org/eclipse/osgi/framework/adaptor/core/DefaultClassLoader.js,bin/org/eclipse/osgi/framework/adaptor/core/BundleInstaller.js,bin/org/eclipse/osgi/framework/adaptor/core/BundleFile.js,bin/org/eclipse/osgi/framework/adaptor/core/BundleEntry.js,bin/org/eclipse/osgi/framework/adaptor/core/AdaptorMsg.js,bin/org/eclipse/osgi/framework/adaptor/core/AdaptorElementFactory.js,bin/org/eclipse/osgi/framework/adaptor/core/AbstractFrameworkAdaptor.js,bin/org/eclipse/osgi/framework/adaptor/core/AbstractClassLoader.js,bin/org/eclipse/osgi/framework/adaptor/core/AbstractBundleData.js,bin/org/eclipse/osgi/framework/adaptor/ServiceRegistry.js,bin/org/eclipse/osgi/framework/adaptor/PermissionStorage.js,bin/org/eclipse/osgi/framework/adaptor/FrameworkAdaptor.js,bin/org/eclipse/osgi/framework/adaptor/FilePath.js,bin/org/eclipse/osgi/framework/adaptor/EventPublisher.js,bin/org/eclipse/osgi/framework/adaptor/ClassLoaderDelegate.js,bin/org/eclipse/osgi/framework/adaptor/BundleWatcher.js,bin/org/eclipse/osgi/framework/adaptor/BundleProtectionDomain.js,bin/org/eclipse/osgi/framework/adaptor/BundleOperation.js,bin/org/eclipse/osgi/framework/adaptor/BundleData.js,bin/org/eclipse/osgi/framework/adaptor/BundleClassLoader.js,bin/org/eclipse/osgi/event/BatchBundleListener.js,bin/org/eclipse/core/runtime/internal/stats/StatsManager.js,bin/org/eclipse/core/runtime/internal/stats/ResourceBundleStats.js,bin/org/eclipse/core/runtime/internal/stats/ClassloaderStats.js,bin/org/eclipse/core/runtime/internal/stats/ClassStats.js,bin/org/eclipse/core/runtime/internal/stats/BundleStats.js,bin/org/eclipse/core/runtime/internal/adaptor/URLConverterImpl.js,bin/org/eclipse/core/runtime/internal/adaptor/Semaphore.js,bin/org/eclipse/core/runtime/internal/adaptor/PluginParser.js,bin/org/eclipse/core/runtime/internal/adaptor/PluginConverterImpl.js,bin/org/eclipse/core/runtime/internal/adaptor/Locker_JavaNio.js,bin/org/eclipse/core/runtime/internal/adaptor/Locker_JavaIo.js,bin/org/eclipse/core/runtime/internal/adaptor/Locker.js,bin/org/eclipse/core/runtime/internal/adaptor/IPluginInfo.js,bin/org/eclipse/core/runtime/internal/adaptor/IModel.js,bin/org/eclipse/core/runtime/internal/adaptor/EclipseEnvironmentInfo.js,bin/org/eclipse/core/runtime/internal/adaptor/EclipseCommandProvider.js,bin/org/eclipse/core/runtime/internal/adaptor/EclipseBundleInstaller.js,bin/org/eclipse/core/runtime/internal/adaptor/ContextFinder.js,bin/org/eclipse/core/runtime/internal/adaptor/CachedManifest.js,bin/org/eclipse/core/runtime/internal/adaptor/BundleStopper.js,bin/org/eclipse/core/runtime/internal/adaptor/BundleLocalizationImpl.js,bin/org/eclipse/core/runtime/internal/adaptor/BasicLocation.js,bin/org/eclipse/core/runtime/adaptor/StreamManagerOutputStream.js,bin/org/eclipse/core/runtime/adaptor/StreamManager.js,bin/org/eclipse/core/runtime/adaptor/LocationManager.js,bin/org/eclipse/core/runtime/adaptor/FileManager.js,bin/org/eclipse/core/runtime/adaptor/EclipseStarter.js,bin/org/eclipse/core/runtime/adaptor/EclipseLog.js,bin/org/eclipse/core/runtime/adaptor/EclipseElementFactory.js,bin/org/eclipse/core/runtime/adaptor/EclipseClassLoader.js,bin/org/eclipse/core/runtime/adaptor/EclipseBundleData.js,bin/org/eclipse/core/runtime/adaptor/EclipseAdaptorMsg.js,bin/org/eclipse/core/runtime/adaptor/EclipseAdaptor.js -j2s.abandoned.resources.list= j2s.output.path=bin +j2s.abandoned.resources.list= j2s.compiler.status=enable From f099395b02f403cb221272c9c63b571c8980bffa Mon Sep 17 00:00:00 2001 From: Nikesh Yadav Date: Wed, 5 Jul 2017 11:26:12 -0500 Subject: [PATCH 51/52] Skip creating parameter qualified name for files in dir starting with java., javax., and sun. --- .../core/astvisitors/ASTScriptVisitor.java | 93 +++++++++++-------- 1 file changed, 53 insertions(+), 40 deletions(-) diff --git a/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java b/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java index 5712123bc..30f81a232 100644 --- a/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java +++ b/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java @@ -2480,60 +2480,70 @@ private boolean containsOnlySuperCall(Block body) { } return isOnlyOneCall; } - - public boolean visit(MethodInvocation node) { - ITypeBinding nodeTypeBinding = null; - Expression expression = node.getExpression(); - - buffer.append("\n\n//SwingJS BH methodInvocation:" + node.resolveMethodBinding().getKey() + "\n\n"); - - ITypeBinding[] paramTypes = node.resolveMethodBinding().getParameterTypes(); + + private String getJ2SParamQualifier(IMethodBinding binding) { StringBuffer sbParams = new StringBuffer(); - // TODO don't want to do this with java, javax, or sun - for (int i = 0; i < paramTypes.length; i++) { - String name = paramTypes[i].getQualifiedName(); - String arrays = null; - int pt = name.indexOf("["); - if (pt >= 0) { - arrays = name.substring(pt); - name = name.substring(0, pt); - } - switch (name) { - case "boolean": - name = "B"; - break; - case "int": - name = "I"; - break; - case "float": - name = "F"; - break; - case "LJava/lang/String": - name = "S"; - break; - default: - name = name.replace('/','_'); - break; + + String className = binding.getDeclaringClass().getQualifiedName(); + if (!className.startsWith("java.") && !className.startsWith("javax.") && !className.startsWith("sun.")) { + ITypeBinding[] paramTypes = binding.getParameterTypes(); + for (int i = 0; i < paramTypes.length; i++) { + String name = paramTypes[i].getQualifiedName(); + String arrays = null; + int pt = name.indexOf("["); + if (pt >= 0) { + arrays = name.substring(pt); + name = name.substring(0, pt); + } + switch (name) { + case "boolean": + name = "B"; + break; + case "int": + name = "I"; + break; + case "float": + name = "F"; + break; + case "LJava/lang/String": + name = "S"; + break; + default: + name = name.replace('/', '_'); + break; + } + sbParams.append("$").append(name); + if (arrays != null) + sbParams.append(arrays.replaceAll("\\[\\]", "A")); } - sbParams.append("$").append(name); - if (arrays != null) - sbParams.append(arrays.replaceAll("\\[\\]", "A")); } + return sbParams.toString(); + } + + public boolean visit(MethodInvocation node) { + //ITypeBinding nodeTypeBinding = null; + Expression expression = node.getExpression(); + + buffer.append("\n\n//SwingJS BH methodInvocation:" + + node.resolveMethodBinding().getDeclaringClass().getQualifiedName() + "\n\n"); + + String sbParams = getJ2SParamQualifier(node.resolveMethodBinding()); + if (expression != null) { /* * Here? */ expression.accept(this); buffer.append("."); - nodeTypeBinding = node.getExpression().resolveTypeBinding(); + //nodeTypeBinding = node.getExpression().resolveTypeBinding(); } - + String methodName = node.getName().getIdentifier(); List args = node.arguments(); int size = args.size(); boolean isSpecialMethod = false; - if (isMethodRegistered(methodName) + if (isMethodRegistered(methodName) && (size == 0 || methodName.equals("split") || methodName.equals("replace"))) { IBinding binding = node.getName().resolveBinding(); if (binding != null && binding instanceof IMethodBinding) { @@ -2554,8 +2564,8 @@ public boolean visit(MethodInvocation node) { } if (!isSpecialMethod) { node.getName().accept(this); + buffer.append(sbParams); } - buffer.append(sbParams); buffer.append(" ("); IMethodBinding methodDeclaration = node.resolveMethodBinding(); visitMethodParameterList(node.arguments(), methodDeclaration, false, null, null); @@ -3026,7 +3036,10 @@ public boolean visit(SuperConstructorInvocation node) { IMethodBinding methodDeclaration = null; if (constructorBinding != null) { methodDeclaration = constructorBinding.getMethodDeclaration(); + //String sbParams = getJ2SParamQualifier(methodDeclaration); + //buffer.append("\\Testing sbparams in methoddeclaration: " + sbParams + "\n\n"); } +/// 6/26/17 visitMethodParameterList(node.arguments(), methodDeclaration, true, ", [", "]"); buffer.append(");\r\n"); return false; From 2a89334ad00fc6c4aa9cebb9c6bda0982cb31906 Mon Sep 17 00:00:00 2001 From: Nikesh Yadav Date: Wed, 5 Jul 2017 11:41:21 -0500 Subject: [PATCH 52/52] Merge branch 'yadav1' into leeas --- .../core/astvisitors/ASTScriptVisitor.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java b/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java index cfbbb9f80..a9acae446 100644 --- a/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java +++ b/sources/net.sf.j2s.core/src/net/sf/j2s/core/astvisitors/ASTScriptVisitor.java @@ -686,19 +686,19 @@ public boolean visit(ClassInstanceCreation node) { } else { ITypeBinding binding = node.resolveTypeBinding(); // BEGIN MERGE 7/5/17 (Pulled from java2script/java2script Commit bc6425216b915bd9b4ad6111c8bb9f24fa666277) - // String anonClassName = null; - // if (binding.isAnonymous() || binding.isLocal()) { - // String binaryName = binding.getBinaryName(); - // if (binaryName == null) { - // String bindingKey = binding.getKey(); - // if (bindingKey != null) { - // binaryName = bindingKey = bindingKey.substring(1, bindingKey.length() - 1).replace('/', '.'); - // } - // } - // anonClassName = assureQualifiedName(shortenQualifiedName(binaryName)); - // } else { - // anonClassName = assureQualifiedName(shortenQualifiedName(binding.getQualifiedName())); - // } + String anonClassName = null; + if (binding.isAnonymous() || binding.isLocal()) { + String binaryName = binding.getBinaryName(); + if (binaryName == null) { + String bindingKey = binding.getKey(); + if (bindingKey != null) { + binaryName = bindingKey = bindingKey.substring(1, bindingKey.length() - 1).replace('/', '.'); + } + } + anonClassName = assureQualifiedName(shortenQualifiedName(binaryName)); + } else { + anonClassName = assureQualifiedName(shortenQualifiedName(binding.getQualifiedName())); + } // END MERGE 7/5/17 // String baseClassName = assureQualifiedName(shortenQualifiedName(getFullClassName()));