From davidk at ci.uchicago.edu Fri Feb 1 09:57:32 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Fri, 1 Feb 2013 09:57:32 -0600 (CST) Subject: [Swift-commit] r6209 - SwiftTutorials Message-ID: <20130201155732.70C219CCB4@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-01 09:57:31 -0600 (Fri, 01 Feb 2013) New Revision: 6209 Added: SwiftTutorials/IO/ Log: Space for IO tutorial From hategan at ci.uchicago.edu Fri Feb 1 20:07:51 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Fri, 1 Feb 2013 20:07:51 -0600 (CST) Subject: [Swift-commit] r6210 - branches/faster/libexec Message-ID: <20130202020751.13E179CCBE@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-01 20:07:50 -0600 (Fri, 01 Feb 2013) New Revision: 6210 Modified: branches/faster/libexec/swift-int-staging.k branches/faster/libexec/swift-int-wrapper-staging.k branches/faster/libexec/swift-int.k branches/faster/libexec/swift.k Log: made provider staging "work" Modified: branches/faster/libexec/swift-int-staging.k =================================================================== --- branches/faster/libexec/swift-int-staging.k 2013-02-01 15:57:31 UTC (rev 6209) +++ branches/faster/libexec/swift-int-staging.k 2013-02-02 02:07:50 UTC (rev 6210) @@ -5,15 +5,18 @@ * Things that are not exposed to the translated file */ +SWIFT:SCRIPT_NAME := contextAttribute("SWIFT:SCRIPT_NAME") +SWIFT:RUN_ID := contextAttribute("SWIFT:RUN_ID") +SWIFT:HOME := contextAttribute("SWIFT:HOME") WRAPPER_TRANSFER_MODE := - if (vdl:configProperty("wrapperlog.always.transfer") == "true", + if (configProperty("wrapperlog.always.transfer") == "true", STAGING_MODE:IF_PRESENT, STAGING_MODE:ON_ERROR + STAGING_MODE:IF_PRESENT) pinOption := configProperty("provider.staging.pin.swiftfiles") PIN := if(pinOption == "true", "pinned:", "") -PROVENANCE_GRAPH_ENABLED := (vdl:configProperty("pgraph") != "false") +PROVENANCE_GRAPH_ENABLED := (configProperty("pgraph") != "false") namespace(swift) { @@ -73,7 +76,7 @@ stdout := if (stdout == null, "stdout.txt", getFieldValue(stdout)) stderr := if (stderr == null, "stderr.txt", getFieldValue(stderr)) - wfdir := "{VDL:SCRIPTNAME}-{VDL:RUNID}" + wfdir := "{SWIFT:SCRIPT_NAME}-{SWIFT:RUN_ID}" tmpdir := dircat("{wfdir}/jobs/{jobdir}", jobid) cdmfile := cdm:file() @@ -83,17 +86,18 @@ setProgress(progress, "Submitting") swift:execute( + progress, siteProfile(rhost, "swift:wrapperInterpreter"), list( siteProfile(rhost, "swift:wrapperInterpreterOptions"), wrapper, - "-e", vdl:executable(tr, rhost), + "-e", executable(tr, rhost), "-out", stdout, "-err", stderr, "-i", if (stdin != null, getFieldValue(stdin)), "-d", flatten(unique(outFileDirs(stageout))), - "-if", flatten(infiles(stagein)), - "-of", flatten(outfiles(stageout)), + "-if", flatten(inFiles(stagein)), + "-of", flatten(outFiles(stageout)), "-k", "-cdmfile", cdmfile, "-status", "provider" @@ -110,31 +114,35 @@ stagingMethod := siteProfile(rhost, "swift:stagingMethod", default="proxy") - stageIn("{PIN}{stagingMethod}://localhost/{swift.home}/libexec/{wrapper}", wrapper) + stageIn("{PIN}{stagingMethod}://localhost/{SWIFT:HOME}/libexec/{wrapper}", wrapper) if (cdmfile != "") { - d := dirname(cdmfile) + d := swift:dirname(cdmfile) file := basename(cdmfile) - dir := if (d == "", "./", str:concat(d,"/")) + dir := if (d == "", "./", "{d}/") loc := "{PIN}{stagingMethod}://localhost/" stageIn("{loc}{dir}{file}", cdmfile) - stageIn("{loc}{swift.home}/libexec/cdm.pl", "cdm.pl") - stageIn("{loc}{swift.home}/libexec/cdm_lib.sh", "cdm_lib.sh") + stageIn("{loc}{SWIFT:HOME}/libexec/cdm.pl", "cdm.pl") + stageIn("{loc}{SWIFT:HOME}/libexec/cdm_lib.sh", "cdm_lib.sh") } appStageins(jobid, stagein, ".", stagingMethod) stageOut("wrapper.log", "{stagingMethod}://localhost/{ddir}/{jobid}.info", mode = WRAPPER_TRANSFER_MODE) - //stageOut("{stdout}", "{stagingMethod}://localhost/{ddir}/{stdout}") - //stageOut("{stderr}", "{stagingMethod}://localhost/{ddir}/{stderr}") + if (false) { + stageOut("{stdout}", "{stagingMethod}://localhost/{ddir}/{stdout}") + stageOut("{stderr}", "{stagingMethod}://localhost/{ddir}/{stderr}") + } stageOut("wrapper.error", "{stagingMethod}://localhost/{ddir}/{jobid}.error", mode = STAGING_MODE:IF_PRESENT) appStageouts(jobid, stageout, ".", stagingMethod) - task:cleanUp(".") //the whole job directory - ) // execute - doRestartlog(restartout) + task:cleanUp(".") + ) + + + doRestartLog(restartout) log(LOG:DEBUG, "JOB_END jobid={jobid}") } else catch(prev) { Modified: branches/faster/libexec/swift-int-wrapper-staging.k =================================================================== --- branches/faster/libexec/swift-int-wrapper-staging.k 2013-02-01 15:57:31 UTC (rev 6209) +++ branches/faster/libexec/swift-int-wrapper-staging.k 2013-02-02 02:07:50 UTC (rev 6210) @@ -213,6 +213,7 @@ if (wrapperMode == "files") { swift:execute( + progress, siteProfile(rhost, "swift:wrapperInterpreter"), list( siteProfile(rhost, "swift:wrapperInterpreterOptions"), Modified: branches/faster/libexec/swift-int.k =================================================================== --- branches/faster/libexec/swift-int.k 2013-02-01 15:57:31 UTC (rev 6209) +++ branches/faster/libexec/swift-int.k 2013-02-02 02:07:50 UTC (rev 6210) @@ -307,35 +307,6 @@ log(LOG:INFO, "END jobid={jobid} - Staging out finished") } - export(graphStuff, - function(tr, stagein, stageout, err, args = null) { - if (configProperty("pgraph") != "false") { - errprops := if(err, ",color=lightsalmon", ",color=lightsteelblue1") - tp := currentThread() - to (graph) { - concat(str:quote(tp), " [label=", str:quote(tr), "{errprops}]") - } - for (si, stagein) { - si := basename(si) - to(graph) { - concat(str:quote(si), " [shape=parallelogram]") - concat(str:quote(si), " -> ", str:quote(tp)) - } - } - for (pv, stageout) { - (path, var) := each(pv) - file := fileName(getField(var, path=path)) - file := basename(file) - label := niceName(var, path = path) - to(graph) { - concat(str:quote(file), " [shape=parallelogram,label=", str:quote(label), "]") - concat(str:quote(tp), " -> ", str:quote(file)) - } - } - } - } - ) - fileSizes := function(files) { math:sum( for(f, files, file:size(f)) @@ -396,11 +367,13 @@ replicationGroup, replicationChannel arguments = [], stdin = null, stdout = null, stderr = null, attributes = null) { + log(LOG:INFO, "A ", currentThread()) stagein := list(unique(each(stagein))) stageout := list(unique(each(stageout))) + log(LOG:INFO, "X ", currentThread()) allocateHost(rhost, constraints = jobConstraints(tr, stagein = stagein)) { - + log(LOG:INFO, "B ", currentThread()) ddir := initDDir(), (wfdir, sharedDir) := try { @@ -410,6 +383,7 @@ throw(exception("Could not initialize shared directory on {rhost}", exception)) } + log(LOG:INFO, "C ", currentThread()) uid := UID() jobdir := substring(uid, from=0, to=1) jobid := "{tr}-{uid}" @@ -445,6 +419,7 @@ } } + log(LOG:INFO, "D ", currentThread()) setProgress(progress, "Stage in") tmpdir := dircat("{wfdir}/jobs/{jobdir}", jobid) Modified: branches/faster/libexec/swift.k =================================================================== --- branches/faster/libexec/swift.k 2013-02-01 15:57:31 UTC (rev 6209) +++ branches/faster/libexec/swift.k 2013-02-02 02:07:50 UTC (rev 6210) @@ -4,7 +4,6 @@ import('swift-operators', export = true) import('swift-lib', export = true) import('swift-xs', export = true) -import('swift-int') SWIFT:SCRIPT_NAME := contextAttribute("SWIFT:SCRIPT_NAME") SWIFT:RUN_ID := contextAttribute("SWIFT:RUN_ID") @@ -15,6 +14,10 @@ pstaging := (configProperty("use.provider.staging") == "true") wstaging := (configProperty("use.wrapper.staging") == "true") + impl := if (pstaging, "swift-int-staging.k", if (wstaging, "swift-int-wrapper-staging.k", "swift-int.k")) + + import(file = impl) + import(java) once("vdl.k-print-version") { @@ -175,10 +178,6 @@ log(LOG:INFO, "Provenance graph saved in ", gname) } - impl := if (pstaging, "swift-int-staging.k", if (wstaging, "swift-int-wrapper-staging.k", "swift-int.k")) - - import(file = impl) - export(execute, function( tr, arguments = null, From hategan at ci.uchicago.edu Fri Feb 1 20:08:48 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Fri, 1 Feb 2013 20:08:48 -0600 (CST) Subject: [Swift-commit] r6211 - branches/faster/src/org/griphyn/vdl/karajan Message-ID: <20130202020848.61D9A9CCBE@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-01 20:08:47 -0600 (Fri, 01 Feb 2013) New Revision: 6211 Modified: branches/faster/src/org/griphyn/vdl/karajan/Loader.java Log: add command line properties before compiling Modified: branches/faster/src/org/griphyn/vdl/karajan/Loader.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/Loader.java 2013-02-02 02:07:50 UTC (rev 6210) +++ branches/faster/src/org/griphyn/vdl/karajan/Loader.java 2013-02-02 02:08:47 UTC (rev 6211) @@ -47,6 +47,7 @@ import org.apache.log4j.FileAppender; import org.apache.log4j.Level; import org.apache.log4j.Logger; +import org.globus.cog.abstraction.impl.execution.fake.JobSubmissionTaskHandler; import org.globus.cog.karajan.compiled.nodes.Main; import org.globus.cog.karajan.compiled.nodes.grid.AbstractGridNode; import org.globus.cog.karajan.parser.WrapperNode; @@ -194,6 +195,12 @@ context.setAttribute("SWIFT:RUN_ID", runID); context.setAttribute("SWIFT:DRY_RUN", ap.isPresent(ARG_DRYRUN)); context.setAttribute("SWIFT:HOME", System.getProperty("swift.home")); + + addCommandLineProperties(config, ap); + if (logger.isDebugEnabled()) { + logger.debug(config); + } + debugSitesText(config); Main root = compileKarajan(tree, context); root.setFileName(projectName); @@ -204,19 +211,13 @@ if (ap.hasValue(ARG_RESUME)) { arguments.add("-rlog:resume=" + ap.getStringValue(ARG_RESUME)); } - - addCommandLineProperties(config, ap); - if (logger.isDebugEnabled()) { - logger.debug(config); - } - debugSitesText(config); - + new HangChecker(context).start(); long start = System.currentTimeMillis(); ec.start(context); ec.waitFor(); long end = System.currentTimeMillis(); - //System.out.println(JobSubmissionTaskHandler.jobsRun + " jobs, " + JobSubmissionTaskHandler.jobsRun * 1000 / (end - start) + " j/s"); + System.out.println(JobSubmissionTaskHandler.jobsRun + " jobs, " + JobSubmissionTaskHandler.jobsRun * 1000 / (end - start) + " j/s"); if (ec.isFailed()) { runerror = true; } From hategan at ci.uchicago.edu Sat Feb 2 02:23:03 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Sat, 2 Feb 2013 02:23:03 -0600 (CST) Subject: [Swift-commit] r6212 - trunk/src/org/griphyn/vdl/karajan Message-ID: <20130202082303.C2AA19CF8F@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-02 02:23:02 -0600 (Sat, 02 Feb 2013) New Revision: 6212 Modified: trunk/src/org/griphyn/vdl/karajan/Loader.java Log: use async appender to reduce contention when logging is enabled Modified: trunk/src/org/griphyn/vdl/karajan/Loader.java =================================================================== --- trunk/src/org/griphyn/vdl/karajan/Loader.java 2013-02-02 02:08:47 UTC (rev 6211) +++ trunk/src/org/griphyn/vdl/karajan/Loader.java 2013-02-02 08:23:02 UTC (rev 6212) @@ -40,6 +40,7 @@ import java.util.Map; import org.apache.log4j.Appender; +import org.apache.log4j.AsyncAppender; import org.apache.log4j.ConsoleAppender; import org.apache.log4j.FileAppender; import org.apache.log4j.Level; @@ -221,10 +222,10 @@ arguments.add("-rlog:resume=" + ap.getStringValue(ARG_RESUME)); } ec.setArguments(arguments); - // long start = System.currentTimeMillis(); new HangChecker(stack).start(); ec.start(stack); ec.waitFor(); + if (ec.isFailed()) { runerror = true; } @@ -560,6 +561,11 @@ else { fa.setFile(f.getAbsolutePath()); fa.activateOptions(); + + AsyncAppender aa = new AsyncAppender(); + aa.addAppender(fa); + + replaceAppender(fa, aa); } Level level = Level.WARN; if (ap.isPresent(ARG_VERBOSE)) { @@ -598,6 +604,11 @@ } } + private static void replaceAppender(FileAppender fa, AsyncAppender aa) { + Logger root = Logger.getRootLogger(); + root.removeAppender(fa); + root.addAppender(aa); + } @SuppressWarnings({ "rawtypes", "unchecked" }) protected static Appender getAppender(Class cls) { From swift at ci.uchicago.edu Sat Feb 2 02:45:09 2013 From: swift at ci.uchicago.edu (swift at ci.uchicago.edu) Date: Sat, 2 Feb 2013 02:45:09 -0600 (CST) Subject: [Swift-commit] cog r3579 Message-ID: <20130202084509.4BE718D000A2@bridled.ci.uchicago.edu> ------------------------------------------------------------------------ r3579 | hategan | 2013-02-02 02:43:47 -0600 (Sat, 02 Feb 2013) | 1 line removed unused debug stuff ------------------------------------------------------------------------ Index: modules/karajan/src/org/globus/cog/karajan/workflow/nodes/grid/AllocateHost.java =================================================================== --- modules/karajan/src/org/globus/cog/karajan/workflow/nodes/grid/AllocateHost.java (revision 3578) +++ modules/karajan/src/org/globus/cog/karajan/workflow/nodes/grid/AllocateHost.java (working copy) @@ -41,8 +41,6 @@ this.setQuotedArgs(true); } - private static Map stimes = Collections.synchronizedMap(new HashMap()); - protected void partialArgumentsEvaluated(VariableStack stack) throws ExecutionException { Object constraints = A_CONSTRAINTS.getValue(stack); try { @@ -63,7 +61,6 @@ Contact contact = s.allocateContact(constraints); t.setVirtualContact(contact); s.addJobStatusListener(this, t); - stimes.put(t, System.currentTimeMillis()); s.enqueue(t, new Contact[] { contact }); } } From swift at ci.uchicago.edu Sat Feb 2 02:50:04 2013 From: swift at ci.uchicago.edu (swift at ci.uchicago.edu) Date: Sat, 2 Feb 2013 02:50:04 -0600 (CST) Subject: [Swift-commit] cog r3580 Message-ID: <20130202085005.16CFE8D000A2@bridled.ci.uchicago.edu> ------------------------------------------------------------------------ r3580 | hategan | 2013-02-02 02:49:11 -0600 (Sat, 02 Feb 2013) | 1 line adding a security context there causes the stored service to not equal the updated service any more, which effectively disables the caching but also causes the cache map to grow indefinitely ------------------------------------------------------------------------ Index: modules/abstraction-common/src/org/globus/cog/abstraction/impl/file/FileResourceCache.java =================================================================== --- modules/abstraction-common/src/org/globus/cog/abstraction/impl/file/FileResourceCache.java (revision 3579) +++ modules/abstraction-common/src/org/globus/cog/abstraction/impl/file/FileResourceCache.java (working copy) @@ -53,7 +53,7 @@ private int maxIdleResources = DEFAULT_MAX_IDLE_RESOURCES; private long maxIdleTime = DEFAULT_MAX_IDLE_TIME; private ResourceStopper stopper; - + public FileResourceCache() { fileResources = new HashMap>(); services = new HashMap(); @@ -113,9 +113,7 @@ if (provider == null) { throw new InvalidProviderException("Provider is null"); } - if (service.getSecurityContext() == null) { - service.setSecurityContext(AbstractionFactory.getSecurityContext(provider, service.getServiceContact())); - } + FileResource fileResource = AbstractionFactory .newFileResource(provider); fileResource.setService(service); From hategan at ci.uchicago.edu Sat Feb 2 03:02:25 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Sat, 2 Feb 2013 03:02:25 -0600 (CST) Subject: [Swift-commit] r6213 - trunk/src/org/griphyn/vdl/karajan Message-ID: <20130202090225.DAC109CCB4@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-02 03:02:23 -0600 (Sat, 02 Feb 2013) New Revision: 6213 Modified: trunk/src/org/griphyn/vdl/karajan/WaitingThreadsMonitor.java Log: stacks are not guaranteed to be the same in the same sequential scope (though the frames are), so don't assume that's the case because it leads to 'waiting threads' that are never removed from the monitor Modified: trunk/src/org/griphyn/vdl/karajan/WaitingThreadsMonitor.java =================================================================== --- trunk/src/org/griphyn/vdl/karajan/WaitingThreadsMonitor.java 2013-02-02 08:23:02 UTC (rev 6212) +++ trunk/src/org/griphyn/vdl/karajan/WaitingThreadsMonitor.java 2013-02-02 09:02:23 UTC (rev 6213) @@ -24,48 +24,95 @@ import java.util.List; import java.util.Map; +import org.globus.cog.karajan.stack.VariableNotFoundException; import org.globus.cog.karajan.stack.VariableStack; +import org.globus.cog.karajan.util.ThreadingContext; import org.griphyn.vdl.mapping.DSHandle; public class WaitingThreadsMonitor { - private static Map threads = new HashMap(); - private static Map> outputs = new HashMap>();; + private static class StackTCPair { + public final VariableStack stack; + public final ThreadingContext tc; + + public StackTCPair(VariableStack stack) { + this.stack = stack; + try { + this.tc = ThreadingContext.get(stack); + } + catch (VariableNotFoundException e) { + throw new RuntimeException("Cannot get thread id", e); + } + } + + @Override + public int hashCode() { + return tc.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof StackTCPair) { + return ((StackTCPair) obj).tc == tc; + } + else { + return false; + } + } + + @Override + public String toString() { + return tc.toString(); + } + } + + private static Map threads = new HashMap(); + private static Map> outputs = new HashMap>();; public static void addThread(VariableStack stack, DSHandle waitingOn) { if (stack != null) { synchronized(threads) { - threads.put(stack, waitingOn); + threads.put(new StackTCPair(stack), waitingOn); } } } public static void removeThread(VariableStack stack) { - synchronized(threads) { - threads.remove(stack); + if (stack != null) { + synchronized(threads) { + threads.remove(new StackTCPair(stack)); + } } } public static Map getAllThreads() { synchronized(threads) { - return new HashMap(threads); + Map m = new HashMap(); + for (Map.Entry e : threads.entrySet()) { + m.put(e.getKey().stack, e.getValue()); + } + return m; } } public static void addOutput(VariableStack stack, List outputs) { synchronized(WaitingThreadsMonitor.outputs) { - WaitingThreadsMonitor.outputs.put(stack, outputs); + WaitingThreadsMonitor.outputs.put(new StackTCPair(stack), outputs); } } public static void removeOutput(VariableStack stack) { synchronized(outputs) { - outputs.remove(stack); + outputs.remove(new StackTCPair(stack)); } } public static Map> getOutputs() { synchronized(outputs) { - return new HashMap>(outputs); + Map> m = new HashMap>(); + for (Map.Entry> e : outputs.entrySet()) { + m.put(e.getKey().stack, e.getValue()); + } + return m; } } } From hategan at ci.uchicago.edu Sat Feb 2 03:05:56 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Sat, 2 Feb 2013 03:05:56 -0600 (CST) Subject: [Swift-commit] r6214 - in trunk/src/org/griphyn/vdl: karajan mapping util Message-ID: <20130202090556.29C129CCB4@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-02 03:05:55 -0600 (Sat, 02 Feb 2013) New Revision: 6214 Modified: trunk/src/org/griphyn/vdl/karajan/VDL2ExecutionContext.java trunk/src/org/griphyn/vdl/mapping/DuplicateMappingChecker.java trunk/src/org/griphyn/vdl/util/VDL2Config.java trunk/src/org/griphyn/vdl/util/VDL2ConfigProperties.java Log: don't store full references to the handles in the mapping checker; only store minimum necessary to provide useful information - this allows the actual swift data to be garbage-collected properly; also add configuration option to disable the mapping checker since, in theory, it is an organized memory leak Modified: trunk/src/org/griphyn/vdl/karajan/VDL2ExecutionContext.java =================================================================== --- trunk/src/org/griphyn/vdl/karajan/VDL2ExecutionContext.java 2013-02-02 09:02:23 UTC (rev 6213) +++ trunk/src/org/griphyn/vdl/karajan/VDL2ExecutionContext.java 2013-02-02 09:05:55 UTC (rev 6214) @@ -28,8 +28,10 @@ import org.globus.cog.karajan.workflow.ElementTree; import org.globus.cog.karajan.workflow.ExecutionContext; import org.globus.cog.karajan.workflow.ExecutionException; +import org.griphyn.vdl.karajan.functions.ConfigProperty; import org.griphyn.vdl.karajan.functions.ProcessBulkErrors; import org.griphyn.vdl.mapping.DuplicateMappingChecker; +import org.griphyn.vdl.util.VDL2Config; public class VDL2ExecutionContext extends ExecutionContext { public static final Logger logger = Logger.getLogger(VDL2ExecutionContext.class); @@ -100,7 +102,9 @@ super.setGlobals(stack); stack.setGlobal(RUN_ID, runID); stack.setGlobal(SCRIPT_NAME, scriptName); - stack.setGlobal(DM_CHECKER, new DuplicateMappingChecker()); + + VDL2Config conf = (VDL2Config) stack.getGlobal(ConfigProperty.INSTANCE_CONFIG); + stack.setGlobal(DM_CHECKER, new DuplicateMappingChecker(conf)); } public String getRunID() { Modified: trunk/src/org/griphyn/vdl/mapping/DuplicateMappingChecker.java =================================================================== --- trunk/src/org/griphyn/vdl/mapping/DuplicateMappingChecker.java 2013-02-02 09:02:23 UTC (rev 6213) +++ trunk/src/org/griphyn/vdl/mapping/DuplicateMappingChecker.java 2013-02-02 09:05:55 UTC (rev 6214) @@ -15,22 +15,44 @@ import java.util.Map; import org.apache.log4j.Logger; +import org.griphyn.vdl.util.VDL2Config; +import org.griphyn.vdl.util.VDL2ConfigProperties; public class DuplicateMappingChecker { public static final Logger logger = Logger.getLogger(DuplicateMappingChecker.class); + public boolean enabled = true; + private final Map map; - public DuplicateMappingChecker() { + public DuplicateMappingChecker(VDL2Config conf) { + enabled = !"off".equals(conf.getProperty(VDL2ConfigProperties.DM_CHECKER)); map = new HashMap(); } - private static class Entry { - private DSHandle write; - private List read; + private static class Info { + private final String name, line; + public Info(String name, String line) { + this.name = name; + this.line = line; + } + + public String toString() { + if (line == null) { + return name; + } + else { + return name + " (line " + line + ")"; + } + } } + private static class Entry { + private Info write; + private List read; + } + private Entry getEntry(PhysicalFormat f) { Entry e = map.get(f); if (e == null) { @@ -41,30 +63,46 @@ } public synchronized void addRead(PhysicalFormat f, DSHandle h) { + if (!enabled) { + return; + } Entry e = getEntry(f); if (e.write != null) { warn("Duplicate mapping found:\n\t" + - getVarInfo(h) + " is used to read from " + f + "\n\t" + - getVarInfo(e.write) + " is used to write to " + f); + formatInfo(getInfo(h)) + " is used to read from " + f + "\n\t" + + formatInfo(e.write) + " is used to write to " + f); } if (e.read == null) { - e.read = new LinkedList(); + e.read = new LinkedList(); } - e.read.add(h); + e.read.add(getInfo(h)); } + private Info getInfo(DSHandle h) { + if (h instanceof AbstractDataNode) { + AbstractDataNode a = (AbstractDataNode) h; + return new Info(a.getDisplayableName(), a.getDeclarationLine()); + } + else { + return new Info(String.valueOf(h), null); + } + } + public synchronized void addWrite(PhysicalFormat f, DSHandle h) { + if (!enabled) { + return; + } Entry e = getEntry(f); if (e.write != null) { warn("Duplicate mapping found:\n\t" + - getVarInfo(h) + " and " + getVarInfo(e.write) + " are both used to write to " + f); + formatInfo(getInfo(h)) + " and " + formatInfo(e.write) + " are both used to write to " + f); } if (e.read != null) { warn("Duplicate mapping found:\n\t" + - getVarInfo(e.write) + " is used to write to " + f + "\n\t" + - "The following variables(s) are also used to read from " + f + ":" + getVarInfos(e.read)); + formatInfo(e.write) + " is used to write to " + f + "\n\t" + + "The following variables(s) are also used to read from " + f + ":" + formatInfos(e.read)); } - e.write = h; + e.write = getInfo(h); } private void warn(String s) { @@ -74,22 +112,16 @@ System.err.println(s); } - private String getVarInfos(List l) { + private String formatInfos(List l) { StringBuilder sb = new StringBuilder(); - for (DSHandle h : l) { + for (Info h : l) { sb.append("\n\t\t"); - sb.append(getVarInfo(h)); + sb.append(formatInfo(h)); } return sb.toString(); } - private String getVarInfo(DSHandle h) { - if (h instanceof AbstractDataNode) { - AbstractDataNode a = (AbstractDataNode) h; - return a.getDisplayableName() + " (line " + a.getDeclarationLine() + ")"; - } - else { - return String.valueOf(h); - } + private String formatInfo(Info i) { + return i.toString(); } } Modified: trunk/src/org/griphyn/vdl/util/VDL2Config.java =================================================================== --- trunk/src/org/griphyn/vdl/util/VDL2Config.java 2013-02-02 09:02:23 UTC (rev 6213) +++ trunk/src/org/griphyn/vdl/util/VDL2Config.java 2013-02-02 09:05:55 UTC (rev 6214) @@ -120,6 +120,7 @@ put("ticker.prefix", "Progress: time:"); put(VDL2ConfigProperties.FILE_GC_ENABLED, "true"); + put(VDL2ConfigProperties.DM_CHECKER, "on"); } private VDL2Config(VDL2Config other) { Modified: trunk/src/org/griphyn/vdl/util/VDL2ConfigProperties.java =================================================================== --- trunk/src/org/griphyn/vdl/util/VDL2ConfigProperties.java 2013-02-02 09:02:23 UTC (rev 6213) +++ trunk/src/org/griphyn/vdl/util/VDL2ConfigProperties.java 2013-02-02 09:05:55 UTC (rev 6214) @@ -44,6 +44,7 @@ public static final String PROVENANCE_LOG = "provenance.log"; public static final String FILE_GC_ENABLED = "file.gc.enabled"; public static final String TRACING_ENABLED = "tracing.enabled"; + public static final String DM_CHECKER = "mapping.checker"; public static final Map PROPERTIES; static { @@ -143,6 +144,11 @@ "operations within swift such as iterations, invocations, assignments, and declarations, as well " + "as data dependencies will be logged. This comes at a cost in performance. It is therefore " + "disabled by default.")); + + PROPERTIES.put(DM_CHECKER, new PropInfo("", "Controls the run-time duplicate mapping checker " + + "(which indetifies mapping conflicts). If set to 'on', the checker is enabled. When enabled, a record " + + "of all mapped data is kept, so this comes at the expense of a slight memory leak. If set 'off', the" + + " mapping checker is disabled. Enabled by default.")); } public static Map getPropertyDescriptions() { From ketan at ci.uchicago.edu Sat Feb 2 19:14:33 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Sat, 2 Feb 2013 19:14:33 -0600 (CST) Subject: [Swift-commit] r6215 - trunk/docs/siteguide Message-ID: <20130203011433.AB3DB9CCB4@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-02 19:14:33 -0600 (Sat, 02 Feb 2013) New Revision: 6215 Modified: trunk/docs/siteguide/futuregrid Log: update futuregrid desc Modified: trunk/docs/siteguide/futuregrid =================================================================== --- trunk/docs/siteguide/futuregrid 2013-02-02 09:05:55 UTC (rev 6214) +++ trunk/docs/siteguide/futuregrid 2013-02-03 01:14:33 UTC (rev 6215) @@ -1,10 +1,14 @@ -Futuregrid (x86 cloud) +Futuregrid Cloud ---------------------- +The NSF-funded FutureGrid cloud is administered by Indiana University. It +offers a variety of resources via a multitude of interfaces. Currently, it +offers cloud resources via three different interfaces: Eucalyptus, +Nimbus (www.nimbusproject.org), and +OpenStack (www.openstack.org). The total number of resources at +FutureGrid is close to 5000 CPU cores and 220~TB of storage from more than six +physical clusters. We use the resources offered by one such cluster via the +Nebula middleware. -FutureGrid is a distributed, high-performance test-bed that allows -scientists to collaboratively develop and test innovative approaches -to parallel, grid, and cloud computing. - More information on futuregrid can be found at https://portal.futuregrid.org/. Requesting Futuregrid Access From ketan at ci.uchicago.edu Sat Feb 2 19:20:52 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Sat, 2 Feb 2013 19:20:52 -0600 (CST) Subject: [Swift-commit] r6216 - in trunk/docs: siteguide userguide Message-ID: <20130203012052.A32829CCB4@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-02 19:20:52 -0600 (Sat, 02 Feb 2013) New Revision: 6216 Modified: trunk/docs/siteguide/futuregrid trunk/docs/userguide/howto_tips Log: asciidoc fix Modified: trunk/docs/siteguide/futuregrid =================================================================== --- trunk/docs/siteguide/futuregrid 2013-02-03 01:14:33 UTC (rev 6215) +++ trunk/docs/siteguide/futuregrid 2013-02-03 01:20:52 UTC (rev 6216) @@ -1,5 +1,5 @@ Futuregrid Cloud ----------------------- +---------------- The NSF-funded FutureGrid cloud is administered by Indiana University. It offers a variety of resources via a multitude of interfaces. Currently, it offers cloud resources via three different interfaces: Eucalyptus, Modified: trunk/docs/userguide/howto_tips =================================================================== --- trunk/docs/userguide/howto_tips 2013-02-03 01:14:33 UTC (rev 6215) +++ trunk/docs/userguide/howto_tips 2013-02-03 01:20:52 UTC (rev 6216) @@ -39,8 +39,8 @@ This use case allows the user to submit an MPI job to a remote queue. -In SwiftScript, we make an invocation that does not look any different -from any other invocation. In the below code, we do not have any input +Swift makes an invocation that does not look any different +from any other invocation. In the code below, we do not have any input files, and have two output files on stdout and stderr: ---- From ketan at ci.uchicago.edu Sat Feb 2 19:33:40 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Sat, 2 Feb 2013 19:33:40 -0600 (CST) Subject: [Swift-commit] r6217 - trunk/docs/userguide Message-ID: <20130203013340.430769CCB4@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-02 19:33:40 -0600 (Sat, 02 Feb 2013) New Revision: 6217 Modified: trunk/docs/userguide/coasters Log: starting to fix coasters desc Modified: trunk/docs/userguide/coasters =================================================================== --- trunk/docs/userguide/coasters 2013-02-03 01:20:52 UTC (rev 6216) +++ trunk/docs/userguide/coasters 2013-02-03 01:33:40 UTC (rev 6217) @@ -7,17 +7,17 @@ order of a few kilobytes) for which other grid protocols such as GRAM and GridFTP are poorly suited. -The coaster mechanism submits a head job using some other execution +The coaster mechanism submits a pilot job using some other execution mechanism such as GRAM, and for each worker node that will be used in a remote cluster, it submits a worker job, again using some other execution mechanism such as GRAM. Details on the design of the coaster mechanism can be found here. -The head job manages file transfers and the dispatch of execution jobs +The pilot job manages file transfers and the dispatch of execution jobs to workers. Much of the overhead associated with other grid protocols (such as authentication and authorization, and allocation of worker nodes by the site's local resource manager) is reduced, because that -overhead is associated with the allocation of a coaster head or coaster +overhead is associated with the allocation of a coaster pilot or coaster worker, rather than with every Swift-level procedure invocation; potentially hundreds or thousands of Swift-level procedure invocations can be run through a single worker. From ketan at ci.uchicago.edu Sat Feb 2 19:37:52 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Sat, 2 Feb 2013 19:37:52 -0600 (CST) Subject: [Swift-commit] r6218 - trunk/docs/cookbook Message-ID: <20130203013752.826B09CCB4@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-02 19:37:52 -0600 (Sat, 02 Feb 2013) New Revision: 6218 Removed: trunk/docs/cookbook/cookbook-asciidoc.txt Modified: trunk/docs/cookbook/cookbook.txt Log: removing duplicate cookbook Deleted: trunk/docs/cookbook/cookbook-asciidoc.txt =================================================================== --- trunk/docs/cookbook/cookbook-asciidoc.txt 2013-02-03 01:33:40 UTC (rev 6217) +++ trunk/docs/cookbook/cookbook-asciidoc.txt 2013-02-03 01:37:52 UTC (rev 6218) @@ -1,20 +0,0 @@ -// To compile use: asciidoc -a toc -n cookbook-asciidoc.txt - -:numbered: - -Swift Cookbook -============== -Swift team -v0.92, March 2011 - -include::overview[] - -include::swift_basics[] - -include::coasters[] - -include::diverse_infrastructures[] - -include::debugging_swift[] - -include::log_processing[] Modified: trunk/docs/cookbook/cookbook.txt =================================================================== --- trunk/docs/cookbook/cookbook.txt 2013-02-03 01:33:40 UTC (rev 6217) +++ trunk/docs/cookbook/cookbook.txt 2013-02-03 01:37:52 UTC (rev 6218) @@ -1,3 +1,7 @@ +// To compile use: asciidoc -a toc -n cookbook-asciidoc.txt + +:numbered: + Swift Cookbook ============== Swift team From ketan at ci.uchicago.edu Sun Feb 3 09:40:13 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Sun, 3 Feb 2013 09:40:13 -0600 (CST) Subject: [Swift-commit] r6219 - in trunk/docs: cookbook userguide Message-ID: <20130203154013.D4AE29CCFD@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-03 09:40:12 -0600 (Sun, 03 Feb 2013) New Revision: 6219 Modified: trunk/docs/cookbook/overview trunk/docs/userguide/coasters Log: organize coasters section Modified: trunk/docs/cookbook/overview =================================================================== --- trunk/docs/cookbook/overview 2013-02-03 01:37:52 UTC (rev 6218) +++ trunk/docs/cookbook/overview 2013-02-03 15:40:12 UTC (rev 6219) @@ -5,7 +5,7 @@ infrastructures. The Swift system comprises of SwiftScript language and the Swift runtime system. For introductory material, consult the Swift tutorial found -link:http://www.ci.uchicago.edu/swift/guides/tutorial.php[here]. +link:http://www.ci.uchicago.edu/swift/guides/trunk/tutorial/tutorial.html[here]. -WARNING: Please be warned that the cookbook is under construction and most recipes are not tested rigorously. You are advised to use them at your own risk. +WARNING: Please be warned that the cookbook is under construction and the recipes are not tested rigorously. Modified: trunk/docs/userguide/coasters =================================================================== --- trunk/docs/userguide/coasters 2013-02-03 01:37:52 UTC (rev 6218) +++ trunk/docs/userguide/coasters 2013-02-03 15:40:12 UTC (rev 6219) @@ -1,18 +1,27 @@ Coasters -------- + +Introduction +~~~~~~~~~~~~ In many applications, Swift performance can be greatly enhanced by the -use of CoG coasters. CoG coasters provide a low-overhead job submission +use of coasters. Coasters provide a low-overhead job submission and file transfer mechanism suited for the execution of short jobs (on the order of a few seconds) and the transfer of small files (on the order of a few kilobytes) for which other grid protocols such as GRAM and GridFTP are poorly suited. +Benefits +~~~~~~~~ + The coaster mechanism submits a pilot job using some other execution mechanism such as GRAM, and for each worker node that will be used in a remote cluster, it submits a worker job, again using some other execution mechanism such as GRAM. Details on the design of the coaster mechanism can be found here. +Mechanism +~~~~~~~~~ + The pilot job manages file transfers and the dispatch of execution jobs to workers. Much of the overhead associated with other grid protocols (such as authentication and authorization, and allocation of worker @@ -22,9 +31,12 @@ potentially hundreds or thousands of Swift-level procedure invocations can be run through a single worker. -Coasters can be configured for use in two situations: job execution and -file transfer. +Coasters can be configured for two purposes: job execution and +file staging. +Coasters How-to +~~~~~~~~~~~~~~~ + To use for job execution, specify a sites.xml execution element like this: ---- @@ -46,6 +58,7 @@ ---- ---- + The url parameter should be a pseudo-URI formed with the URI scheme being the name of the provider to use to submit the coaster head job, and the hostname portion being the hostname to be used to execute the From ketan at ci.uchicago.edu Sun Feb 3 14:49:41 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Sun, 3 Feb 2013 14:49:41 -0600 (CST) Subject: [Swift-commit] r6220 - trunk/docs/userguide Message-ID: <20130203204941.A768E9CC9C@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-03 14:49:41 -0600 (Sun, 03 Feb 2013) New Revision: 6220 Modified: trunk/docs/userguide/log-processing Log: organize logs section and add a subsection, may be need a debug section Modified: trunk/docs/userguide/log-processing =================================================================== --- trunk/docs/userguide/log-processing 2013-02-03 15:40:12 UTC (rev 6219) +++ trunk/docs/userguide/log-processing 2013-02-03 20:49:41 UTC (rev 6220) @@ -5,7 +5,6 @@ To properly generate log plots, you must enable VDL/Karajan logging. TODO:How? - You should check the scripts that you intend to use to determine what log lines they require and ensure that you are generating those lines via log4j.properties @@ -18,6 +17,28 @@ -------------------------------------- TODO: Does it work for coasters-based runs only? +Meaning and interpretation of Swift log messages +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A Swift log file is typically a text file with the name of the Swift run and +its timestamp in the filename and an extension ".log". In addition, a ".rlog" +file is Swift's resume log which is used by Swift when a run is resumed using +the "-resume" option. The .rlog file is only for Swift's internal purpose and +not to be interpreted by the user. + +Each line in the log file is typically made up of three parts. The first part +is the timestamp, the second is the type of log message and the third is the +message itself. The types of log messages follows the java log4j standard types +of TRACE, DEBUG, INFO, WARN, ERROR and FATAL. This section lists the various +Swift log messages and explains the meaning and likely interpretation of those +messages. Please note that the list is not comprehensive at this time. Also +note that we will ignore the timestamps here. + +. _DEBUG Loader arguments: [-sites.file, sites.xml, -config, cf, -tc.file, tc, postproc-gridftp.swift]_ +. _DEBUG Loader Max heap: 5592449024_ +. _DEBUG textfiles BEGIN_ +. _DEBUG Loader kmlversion is_ + Normalize event times in the log to the run start time ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From ketan at ci.uchicago.edu Sun Feb 3 15:01:41 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Sun, 3 Feb 2013 15:01:41 -0600 (CST) Subject: [Swift-commit] r6221 - trunk/docs/userguide Message-ID: <20130203210141.9A9B09CC9C@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-03 15:01:41 -0600 (Sun, 03 Feb 2013) New Revision: 6221 Modified: trunk/docs/userguide/log-processing Log: organize logs section Modified: trunk/docs/userguide/log-processing =================================================================== --- trunk/docs/userguide/log-processing 2013-02-03 20:49:41 UTC (rev 6220) +++ trunk/docs/userguide/log-processing 2013-02-03 21:01:41 UTC (rev 6221) @@ -39,8 +39,11 @@ . _DEBUG textfiles BEGIN_ . _DEBUG Loader kmlversion is_ +Log plotting +~~~~~~~~~~~~ + Normalize event times in the log to the run start time -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Generate the log, assuming the log is titled +swift-run.log+ @@ -51,7 +54,7 @@ Make a basic load plot from Coasters Cpu log lines -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ . Normalize the log. . Build up a load data file: @@ -68,7 +71,7 @@ Make a basic job completion plot from Coasters Cpu log lines -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ . Normalize the log. @@ -85,7 +88,7 @@ ------------------------------------------ Make a basic Block allocation plot from Coasters Block log lines -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ . Normalize the log. @@ -102,7 +105,7 @@ ------------------------------------------ Make a job runtime distribution plot from Coasters Cpu log lines -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ . Normalize the log. From ketan at ci.uchicago.edu Sun Feb 3 16:41:51 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Sun, 3 Feb 2013 16:41:51 -0600 (CST) Subject: [Swift-commit] r6222 - trunk/docs/userguide Message-ID: <20130203224151.802489CC9C@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-03 16:41:51 -0600 (Sun, 03 Feb 2013) New Revision: 6222 Modified: trunk/docs/userguide/log-processing Log: adding log lines Modified: trunk/docs/userguide/log-processing =================================================================== --- trunk/docs/userguide/log-processing 2013-02-03 21:01:41 UTC (rev 6221) +++ trunk/docs/userguide/log-processing 2013-02-03 22:41:51 UTC (rev 6222) @@ -38,7 +38,29 @@ . _DEBUG Loader Max heap: 5592449024_ . _DEBUG textfiles BEGIN_ . _DEBUG Loader kmlversion is_ +. _DEBUG VDL2ExecutionContext Stack dump_ +. _INFO SetFieldValue Set_ +. _INFO get__site STARTCOMPOUND thread=0-8 name=get__site_ +. _INFO vdl:execute START thread=0-8-0 tr=_ +. _INFO GlobalSubmitQueue No global submit throttle set. Using default (1024)_ +. _DEBUG vdl:execute2 THREAD_ASSOCIATION jobid=getsite-ymj72ook thread=0-8-0-1 host=localhost replicationGroup=xmj72ook +. _DEBUG vdl:execute2 JOB_START jobid=getsite-ymj72ook tr=getsite arguments=[644] tmpdir=postproc-gridftp-20120319-0942-adf1o1u2/jobs/y/getsite-ymj72ook host=localhost_ +. _INFO GridExec TASK_DEFINITION +. _WARN RemoteConfiguration Find: http://140.221.8.62:38260_ +. _INFO AbstractStreamKarajanChannel$Multiplexer Multiplexer 0 started_ +. _INFO AbstractStreamKarajanChannel$Multiplexer (0) Scheduling SC-null for addition_ +. _INFO AbstractStreamKarajanChannel Channel configured_ +. _INFO MetaChannel MetaChannel: 651528505[1478354072: {}] -> null.bind -> SC-null_ +. _INFO ReadBuffer Will ask for 1 buffers for a size of 6070_ +. _INFO ThrottleManager O maxBuffers=512, crtBuffers=0, allowedTransfers=256, active=0, suspended=0_ +. _INFO ThrottleManager mem=113.54 MB, heap=482.88 MB, maxHeap=5.21 GB_ +. _INFO ThrottleManager I maxBuffers=512, crtBuffers=0, allowedTransfers=256, active=0, suspended=0_ +. _INFO PerformanceDiagnosticInputStream [MEM] Heap total: 482.88 MB, Heap used: 118.58 MB_ +. _INFO vdl:execute END_SUCCESS thread=0-8-0 tr=getsite_ +. _INFO WeightedHostScoreScheduler CONTACT_SELECTED host=localhost, score=99.854_ +. _ + Log plotting ~~~~~~~~~~~~ From ketan at ci.uchicago.edu Sun Feb 3 20:09:37 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Sun, 3 Feb 2013 20:09:37 -0600 (CST) Subject: [Swift-commit] r6223 - trunk/docs/userguide Message-ID: <20130204020937.0F4579CCFD@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-03 20:09:36 -0600 (Sun, 03 Feb 2013) New Revision: 6223 Modified: trunk/docs/userguide/log-processing Log: format Modified: trunk/docs/userguide/log-processing =================================================================== --- trunk/docs/userguide/log-processing 2013-02-03 22:41:51 UTC (rev 6222) +++ trunk/docs/userguide/log-processing 2013-02-04 02:09:36 UTC (rev 6223) @@ -43,9 +43,9 @@ . _INFO get__site STARTCOMPOUND thread=0-8 name=get__site_ . _INFO vdl:execute START thread=0-8-0 tr=_ . _INFO GlobalSubmitQueue No global submit throttle set. Using default (1024)_ -. _DEBUG vdl:execute2 THREAD_ASSOCIATION jobid=getsite-ymj72ook thread=0-8-0-1 host=localhost replicationGroup=xmj72ook +. _DEBUG vdl:execute2 THREAD_ASSOCIATION jobid=getsite-ymj72ook thread=0-8-0-1 host=localhost replicationGroup=xmj72ook_ . _DEBUG vdl:execute2 JOB_START jobid=getsite-ymj72ook tr=getsite arguments=[644] tmpdir=postproc-gridftp-20120319-0942-adf1o1u2/jobs/y/getsite-ymj72ook host=localhost_ -. _INFO GridExec TASK_DEFINITION +. _INFO GridExec TASK_DEFINITION_ . _WARN RemoteConfiguration Find: http://140.221.8.62:38260_ . _INFO AbstractStreamKarajanChannel$Multiplexer Multiplexer 0 started_ . _INFO AbstractStreamKarajanChannel$Multiplexer (0) Scheduling SC-null for addition_ From hategan at ci.uchicago.edu Sun Feb 3 23:26:10 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Sun, 3 Feb 2013 23:26:10 -0600 (CST) Subject: [Swift-commit] r6224 - branches/faster/resources Message-ID: <20130204052610.200D49CCFD@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-03 23:26:09 -0600 (Sun, 03 Feb 2013) New Revision: 6224 Modified: branches/faster/resources/Karajan-no-provenance.stg branches/faster/resources/Karajan.stg Log: fixed a bunch of issues in compilation Modified: branches/faster/resources/Karajan-no-provenance.stg =================================================================== --- branches/faster/resources/Karajan-no-provenance.stg 2013-02-04 02:09:36 UTC (rev 6223) +++ branches/faster/resources/Karajan-no-provenance.stg 2013-02-04 05:26:09 UTC (rev 6224) @@ -1,15 +1,14 @@ group Karajan-np; -vdl_log_input() ::= << >> +swift_log_inputs(params) ::= <<>> +swift_log_outputs(params) ::= <<>> -vdl_log_output() ::= << >> - callInternal_log_input() ::= <<$it$>> callInternal_log_output() ::= <<$it$>> variable_log() ::= << >> -range_log(from, to, step) ::= << >> +range(from, to, step, datatype) ::= <> cs() ::= << >> Modified: branches/faster/resources/Karajan.stg =================================================================== --- branches/faster/resources/Karajan.stg 2013-02-04 02:09:36 UTC (rev 6223) +++ branches/faster/resources/Karajan.stg 2013-02-04 05:26:09 UTC (rev 6224) @@ -59,9 +59,9 @@ procedure(name, outputs, inputs, arguments, optargs, binding, declarations, statements, config, line, initWaitCounts, cleanups, closes) ::= << -$name$ := function($if(optargs)$ "$proc_oargs(args=optargs)$"$endif$$if(arguments)$ "$proc_args(args=arguments)$"$endif$) { - $inputs:swift_log_input();separator="\n"$ - $outputs:swift_log_output();separator="\n"$ +$name$ := function($if(optargs)$$proc_oargs(args=optargs)$$if(arguments)$, $endif$$endif$$if(arguments)$$proc_args(args=arguments)$$endif$) { + $swift_log_inputs(inputs)$ + $swift_log_outputs(outputs)$ $if(binding)$ $swift_execute(outputs=outputs,inputs=inputs,application=binding.application, name=name,line=line)$ $else$ @@ -70,6 +70,13 @@ } >> +swift_log_inputs(params) ::= << +$params:log_param("input");separator="\n"$ +>> +swift_log_outputs(params) ::= << +$params:log_param("output");separator="\n"$ +>> + compound(outputs, inputs, declarations, statements, config, name, initWaitCounts, cleanups) ::= << unitStart("COMPOUND", name="$name$", outputs="$outputs:list();separator=","$") $if(initWaitCounts)$ @@ -87,7 +94,7 @@ >> proc_args(args) ::= << -$args:arg_name();separator=","$ +$args:arg_name();separator=", "$ >> arg_name() ::= << @@ -115,14 +122,10 @@ unitEnd("PROCEDURE", name="$name$", line="$line$") >> -swift_log_input() ::= << -parameterLog("input", "$it.name$", swift:getDatasetProvenanceID($it.name$), currentThread()) +log_param(dir) ::= << +parameterLog("$dir$", "$it.name$", swift:getDatasetProvenanceID($it.name$)) >> -swift_log_output() ::= << -parameterLog("output", "$it.name$", swift:getDatasetProvenanceID($it.name$), currentThread()) ->> - swift_stagein() ::= << swift:stageIn($it.name$) >> @@ -144,14 +147,17 @@ swift_arguments(attributes,arguments,stdin,stdout,stderr) ::= << $attributes$ swift:arguments( - $arguments;separator="\n"$ + $arguments;separator=", "$ ) + $if (stdin)$ swift:stdin($stdin$) $endif$ + $if (stdout)$ swift:stdout($stdout$) $endif$ + $if (stderr)$ swift:stderr($stderr$) $endif$ @@ -175,9 +181,7 @@ $statements;separator="\n"$ ) $else$ -sequential( - $statements$ -) +$statements$ $endif$ >> @@ -187,7 +191,7 @@ function(name, args, datatype, line) ::= << swiftscript:$name$( - $if(args)$ $args$ $endif$ + $if(args)$$args;separator=", "$$endif$ ) >> @@ -214,6 +218,7 @@ $parallel(statements=statements)$ $cleanups:swift_cleandataset();separator="\n"$ $endif$ + unitEnd("FOREACH_IT", line="$line$") } >> @@ -237,14 +242,14 @@ callInternal_log_input() ::= << sequential( - parameterLog("input", "TODO_name_or_pos", vdl:getDatasetProvenanceID($it$), currentThread()) + parameterLog("input", "TODO_name_or_pos", vdl:getDatasetProvenanceID($it$)) $it$ ) >> callInternal_log_output() ::= << sequential( - parameterLog("output", "TODO_name_or_pos", vdl:getDatasetProvenanceID($it$), currentThread()) + parameterLog("output", "TODO_name_or_pos", vdl:getDatasetProvenanceID($it$)) $it$ ) >> @@ -252,9 +257,9 @@ callUserDefined(func, outputs, inputs, line, serialize, partialClose) ::= << $func$( $if(!serialize)$parallel($endif$ - $outputs;separator="\n"$ - $inputs;separator="\n"$ - $if(!serialize)$)$endif$ + $outputs;separator=", "$ + $inputs;separator=", "$ + $if(!serialize)$)$endif$ ) $if(partialClose)$ $partialClose$ @@ -276,35 +281,30 @@ variable(name, type, expr, mapping, nil, file, waitCount, input, datatype, isGlobal, line) ::= << $name$ := $if(mapping)$ - swift:new("$type$", dbgname="$name$"$if(waitCount)$, waitCount=$waitCount$$endif$, _defline="$line$"$if(input)$, input=true$endif$ + swift:new("$type$", dbgname="$name$"$if(waitCount)$, waitCount=$waitCount$$endif$$if(line)$, _defline="$line$"$endif$$if(input)$, input=true$endif$ $swift_mapping(mapping=mapping, file=file)$ ) $else$ $if(file)$ - swift:new("$type$", dbgname="$name$"$if(waitCount)$, waitCount=$waitCount$$endif$, _defline="$line$"$if(input)$, input=true$endif$ + swift:new("$type$", dbgname="$name$"$if(waitCount)$, waitCount=$waitCount$$endif$$if(line)$, _defline="$line$"$endif$$if(input)$, input=true$endif$ $swift_mapping(mapping=mapping, file=file)$ ) $else$ - swift:new("$type$", dbgname="$name$"$if(waitCount)$, waitCount=$waitCount$$endif$, _defline="$line$"$if(input)$, input=true$endif$) + swift:new("$type$", dbgname="$name$"$if(waitCount)$, waitCount=$waitCount$$endif$$if(line)$, _defline="$line$"$endif$$if(input)$, input=true$endif$) $endif$ $endif$ $variable_log()$ >> variable_log() ::= << - parameterLog("intermediate", "$name$", swift:getDatasetProvenanceID($name$), currentThread()) + parameterLog("intermediate", "$name$", swift:getDatasetProvenanceID($name$)) >> swift_mapping(mapping, file) ::= << $if(file)$ -swift:mapping("single_file_mapper", - swift:parameter("file", "$file.name$") - $if(file.params)$$file.params;separator="\n"$$endif$ -) +swift:mapping("single_file_mapper", swift:parameter("file", "$file.name$") $if(file.params)$$file.params;separator="\n"$$endif$) $else$ -swift:mapping("$mapping.descriptor$", - $mapping.params;separator="\n"$ -) +swift:mapping("$mapping.descriptor$", $mapping.params;separator="\n"$) $endif$ >> @@ -313,23 +313,23 @@ >> assign(var, value, line, partialClose) ::= << - swift:setFieldValue($if(line)$_traceline="$line$"$else$_traceline="-1"$endif$ - $var$ - $value$ - ) - $if(partialClose)$ +swift:setFieldValue($if(line)$_traceline="$line$"$endif$ + $var$ + $value$ +) +$if(partialClose)$ $partialClose$ - $endif$ +$endif$ >> append(array, value, partialClose) ::= << - swift:appendArray( - $array$ - $value$ - ) - $if(partialClose)$ +swift:appendArray( + $array$ + $value$ +) +$if(partialClose)$ $partialClose$ - $endif$ +$endif$ >> callexpr(call, datatype, prefix) ::= << @@ -353,11 +353,11 @@ >> range(from, to, step, datatype) ::= << - sequential( - tmp := swift:range($from$, $to$$if(step)$, step = $step$$endif$) - tmp - $range_log()$ - ) +sequential( + tmp := swift:range($from$, $to$$if(step)$, step = $step$$endif$) + tmp + $range_log()$ +) >> range_log() ::= << @@ -408,9 +408,13 @@ // the wrapping layer disappers in the (perhaps common?) case of a // single layer. sequential(statements) ::= << - sequential( - $statements;separator="\n"$ - ) +$if(rest(statements))$ +sequential( + $statements;separator="\n"$ +) +$else$ +$statements$ +$endif$ >> @@ -499,7 +503,8 @@ swift:new("boolean", value=$value$) >> +// Why is there a value attribute? sConst(value,innervalue,datatype) ::= << -swift:new("string", value="$value$") +swift:new("string", value="$innervalue$") >> From hategan at ci.uchicago.edu Sun Feb 3 23:26:55 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Sun, 3 Feb 2013 23:26:55 -0600 (CST) Subject: [Swift-commit] r6225 - branches/faster/libexec Message-ID: <20130204052655.8C70E9CCFD@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-03 23:26:55 -0600 (Sun, 03 Feb 2013) New Revision: 6225 Modified: branches/faster/libexec/swift-lib.k branches/faster/libexec/swift.k Log: fixed case for several functions Modified: branches/faster/libexec/swift-lib.k =================================================================== --- branches/faster/libexec/swift-lib.k 2013-02-04 05:26:09 UTC (rev 6224) +++ branches/faster/libexec/swift-lib.k 2013-02-04 05:26:55 UTC (rev 6225) @@ -4,11 +4,11 @@ export(readData2, def("org.griphyn.vdl.karajan.lib.swiftscript.ReadStructured")) export(readStructured, def("org.griphyn.vdl.karajan.lib.swiftscript.ReadStructured")) export(writeData, def("org.griphyn.vdl.karajan.lib.swiftscript.WriteData")) - export(strCat, def("org.griphyn.vdl.karajan.lib.swiftscript.Misc$StrCat")) - export(strCut, def("org.griphyn.vdl.karajan.lib.swiftscript.Misc$StrCut")) - export(strStr, def("org.griphyn.vdl.karajan.lib.swiftscript.Misc$StrStr")) - export(strSplit, def("org.griphyn.vdl.karajan.lib.swiftscript.Misc$StrSplit")) - export(strJoin, def("org.griphyn.vdl.karajan.lib.swiftscript.Misc$StrJoin")) + export(strcat, def("org.griphyn.vdl.karajan.lib.swiftscript.Misc$StrCat")) + export(strcut, def("org.griphyn.vdl.karajan.lib.swiftscript.Misc$StrCut")) + export(strstr, def("org.griphyn.vdl.karajan.lib.swiftscript.Misc$StrStr")) + export(strsplit, def("org.griphyn.vdl.karajan.lib.swiftscript.Misc$StrSplit")) + export(strjoin, def("org.griphyn.vdl.karajan.lib.swiftscript.Misc$StrJoin")) export(regexp, def("org.griphyn.vdl.karajan.lib.swiftscript.Misc$Regexp")) export(toInt, def("org.griphyn.vdl.karajan.lib.swiftscript.Misc$ToInt")) export(toFloat, def("org.griphyn.vdl.karajan.lib.swiftscript.Misc$ToFloat")) Modified: branches/faster/libexec/swift.k =================================================================== --- branches/faster/libexec/swift.k 2013-02-04 05:26:09 UTC (rev 6224) +++ branches/faster/libexec/swift.k 2013-02-04 05:26:55 UTC (rev 6225) @@ -27,8 +27,8 @@ echo("RunID: {SWIFT:RUN_ID}") } - export(stagein, def("org.griphyn.vdl.karajan.lib.Stagein")) - export(stageout, def("org.griphyn.vdl.karajan.lib.Stageout")) + export(stageIn, def("org.griphyn.vdl.karajan.lib.Stagein")) + export(stageOut, def("org.griphyn.vdl.karajan.lib.Stageout")) export(parameterLog, function(direction, variable, id, thread) { From hategan at ci.uchicago.edu Sun Feb 3 23:27:45 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Sun, 3 Feb 2013 23:27:45 -0600 (CST) Subject: [Swift-commit] r6226 - branches/faster/src/org/griphyn/vdl/engine Message-ID: <20130204052745.B851C9CCFD@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-03 23:27:45 -0600 (Sun, 03 Feb 2013) New Revision: 6226 Modified: branches/faster/src/org/griphyn/vdl/engine/Karajan.java Log: some vdl -> swift renames Modified: branches/faster/src/org/griphyn/vdl/engine/Karajan.java =================================================================== --- branches/faster/src/org/griphyn/vdl/engine/Karajan.java 2013-02-04 05:26:55 UTC (rev 6225) +++ branches/faster/src/org/griphyn/vdl/engine/Karajan.java 2013-02-04 05:27:45 UTC (rev 6226) @@ -478,7 +478,7 @@ if (!isPrimitiveOrArrayOfPrimitive(var.getType().getLocalPart())) { StringTemplate mappingST = new StringTemplate("mapping"); mappingST.setAttribute("descriptor", "concurrent_mapper"); - StringTemplate paramST = template("vdl_parameter"); + StringTemplate paramST = template("swift_parameter"); paramST.setAttribute("name", "prefix"); paramST.setAttribute("expr", var.getName() + "-" + UUIDGenerator.getInstance().generateRandomBasedUUID().toString()); @@ -492,7 +492,7 @@ } private StringTemplate mappingParameter(Param param, VariableScope scope) throws CompilationException { - StringTemplate paramST = template("vdl_parameter"); + StringTemplate paramST = template("swift_parameter"); paramST.setAttribute("name", param.getName()); Node expressionDOM = param.getAbstractExpression().getDomNode(); String namespaceURI = expressionDOM.getNamespaceURI(); @@ -508,7 +508,7 @@ // TODO factorise this and other code in variable()? StringTemplate pmappingST = new StringTemplate("mapping"); pmappingST.setAttribute("descriptor", "concurrent_mapper"); - StringTemplate pparamST = template("vdl_parameter"); + StringTemplate pparamST = template("swift_parameter"); pparamST.setAttribute("name", "prefix"); pparamST.setAttribute("expr", parameterVariableName + "-" + UUIDGenerator.getInstance().generateRandomBasedUUID().toString()); @@ -1124,7 +1124,7 @@ Profile[] profiles = app.getProfileArray(); if (profiles.length == 0) return; - StringTemplate attributes = template("vdl_attributes"); + StringTemplate attributes = template("swift_attributes"); for (Profile profile : profiles) { XmlObject xmlKey = profile.getAbstractExpressionArray(0); XmlObject xmlValue = profile.getAbstractExpressionArray(1); From hategan at ci.uchicago.edu Sun Feb 3 23:29:12 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Sun, 3 Feb 2013 23:29:12 -0600 (CST) Subject: [Swift-commit] r6227 - branches/faster/src/org/griphyn/vdl/karajan/lib Message-ID: <20130204052912.1F9249CCFD@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-03 23:29:12 -0600 (Sun, 03 Feb 2013) New Revision: 6227 Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/SetFieldValue.java Log: make sure that the state is null when starting deep copy Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/SetFieldValue.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/SetFieldValue.java 2013-02-04 05:27:45 UTC (rev 6226) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/SetFieldValue.java 2013-02-04 05:29:12 UTC (rev 6227) @@ -112,8 +112,16 @@ tracer = Tracer.getTracer(this); return fn; } + + @Override + protected void initializeArgs(Stack stack) { + super.initializeArgs(stack); + this.state.setValue(stack, null); + } + + @Override public Object function(Stack stack) { DSHandle var = this.var.getValue(stack); try { From hategan at ci.uchicago.edu Sun Feb 3 23:29:39 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Sun, 3 Feb 2013 23:29:39 -0600 (CST) Subject: [Swift-commit] r6228 - branches/faster/src/org/griphyn/vdl/karajan/lib Message-ID: <20130204052939.8BCAE9CCFD@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-03 23:29:39 -0600 (Sun, 03 Feb 2013) New Revision: 6228 Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/ThrottledParallelFor.java Log: fix thread set multiple unlock Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/ThrottledParallelFor.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/ThrottledParallelFor.java 2013-02-04 05:29:12 UTC (rev 6227) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/ThrottledParallelFor.java 2013-02-04 05:29:39 UTC (rev 6228) @@ -180,6 +180,8 @@ ts.unlock(); decRefs(drefs); + i++; + case 2: ts.waitFor(); } } From hategan at ci.uchicago.edu Sun Feb 3 23:31:32 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Sun, 3 Feb 2013 23:31:32 -0600 (CST) Subject: [Swift-commit] r6229 - branches/faster/src/org/griphyn/vdl/karajan/lib Message-ID: <20130204053132.E36009CCFD@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-03 23:31:32 -0600 (Sun, 03 Feb 2013) New Revision: 6229 Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/Parameterlog.java Log: the variable param to parameterlog is a string (the var name) Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/Parameterlog.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/Parameterlog.java 2013-02-04 05:29:39 UTC (rev 6228) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/Parameterlog.java 2013-02-04 05:31:32 UTC (rev 6229) @@ -39,7 +39,7 @@ public static final Logger logger = Logger.getLogger(Parameterlog.class); private ArgRef direction; - private ArgRef variable; + private ArgRef variable; private ArgRef id; @Override From hategan at ci.uchicago.edu Sun Feb 3 23:32:22 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Sun, 3 Feb 2013 23:32:22 -0600 (CST) Subject: [Swift-commit] r6230 - in branches/faster/src: . org/griphyn/vdl/karajan org/griphyn/vdl/mapping org/griphyn/vdl/util Message-ID: <20130204053222.56EAB9CCFD@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-03 23:32:22 -0600 (Sun, 03 Feb 2013) New Revision: 6230 Modified: branches/faster/src/ branches/faster/src/org/griphyn/vdl/karajan/SwiftRootScope.java branches/faster/src/org/griphyn/vdl/mapping/DuplicateMappingChecker.java branches/faster/src/org/griphyn/vdl/util/VDL2Config.java branches/faster/src/org/griphyn/vdl/util/VDL2ConfigProperties.java Log: port of duplicate mapping changes from trunk Property changes on: branches/faster/src ___________________________________________________________________ Added: svn:mergeinfo + /trunk/src:6214 Modified: branches/faster/src/org/griphyn/vdl/karajan/SwiftRootScope.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/SwiftRootScope.java 2013-02-04 05:31:32 UTC (rev 6229) +++ branches/faster/src/org/griphyn/vdl/karajan/SwiftRootScope.java 2013-02-04 05:32:22 UTC (rev 6230) @@ -17,12 +17,14 @@ import org.globus.cog.karajan.util.KarajanProperties; import org.griphyn.vdl.karajan.lib.swiftscript.FnArg; import org.griphyn.vdl.mapping.DuplicateMappingChecker; +import org.griphyn.vdl.util.VDL2Config; public class SwiftRootScope extends RootScope { public SwiftRootScope(KarajanProperties props, String file, Context context) { super(props, file, context); - context.setAttribute("SWIFT:DM_CHECKER", new DuplicateMappingChecker()); + context.setAttribute("SWIFT:DM_CHECKER", new DuplicateMappingChecker( + (VDL2Config) context.getAttribute("SWIFT:CONFIG"))); addVar("PATH_SEPARATOR", File.separator); addVar("SWIFT:DRY_RUN", context.getAttribute("SWIFT:DRY_RUN")); Modified: branches/faster/src/org/griphyn/vdl/mapping/DuplicateMappingChecker.java =================================================================== --- branches/faster/src/org/griphyn/vdl/mapping/DuplicateMappingChecker.java 2013-02-04 05:31:32 UTC (rev 6229) +++ branches/faster/src/org/griphyn/vdl/mapping/DuplicateMappingChecker.java 2013-02-04 05:32:22 UTC (rev 6230) @@ -15,22 +15,44 @@ import java.util.Map; import org.apache.log4j.Logger; +import org.griphyn.vdl.util.VDL2Config; +import org.griphyn.vdl.util.VDL2ConfigProperties; public class DuplicateMappingChecker { public static final Logger logger = Logger.getLogger(DuplicateMappingChecker.class); + public boolean enabled = true; + private final Map map; - public DuplicateMappingChecker() { + public DuplicateMappingChecker(VDL2Config conf) { + enabled = !"off".equals(conf.getProperty(VDL2ConfigProperties.DM_CHECKER)); map = new HashMap(); } - private static class Entry { - private DSHandle write; - private List read; + private static class Info { + private final String name, line; + public Info(String name, String line) { + this.name = name; + this.line = line; + } + + public String toString() { + if (line == null) { + return name; + } + else { + return name + " (line " + line + ")"; + } + } } + private static class Entry { + private Info write; + private List read; + } + private Entry getEntry(PhysicalFormat f) { Entry e = map.get(f); if (e == null) { @@ -41,30 +63,46 @@ } public synchronized void addRead(PhysicalFormat f, DSHandle h) { + if (!enabled) { + return; + } Entry e = getEntry(f); if (e.write != null) { warn("Duplicate mapping found:\n\t" + - getVarInfo(h) + " is used to read from " + f + "\n\t" + - getVarInfo(e.write) + " is used to write to " + f); + formatInfo(getInfo(h)) + " is used to read from " + f + "\n\t" + + formatInfo(e.write) + " is used to write to " + f); } if (e.read == null) { - e.read = new LinkedList(); + e.read = new LinkedList(); } - e.read.add(h); + e.read.add(getInfo(h)); } + private Info getInfo(DSHandle h) { + if (h instanceof AbstractDataNode) { + AbstractDataNode a = (AbstractDataNode) h; + return new Info(a.getDisplayableName(), a.getDeclarationLine()); + } + else { + return new Info(String.valueOf(h), null); + } + } + public synchronized void addWrite(PhysicalFormat f, DSHandle h) { + if (!enabled) { + return; + } Entry e = getEntry(f); if (e.write != null) { warn("Duplicate mapping found:\n\t" + - getVarInfo(h) + " and " + getVarInfo(e.write) + " are both used to write to " + f); + formatInfo(getInfo(h)) + " and " + formatInfo(e.write) + " are both used to write to " + f); } if (e.read != null) { warn("Duplicate mapping found:\n\t" + - getVarInfo(e.write) + " is used to write to " + f + "\n\t" + - "The following variables(s) are also used to read from " + f + ":" + getVarInfos(e.read)); + formatInfo(e.write) + " is used to write to " + f + "\n\t" + + "The following variables(s) are also used to read from " + f + ":" + formatInfos(e.read)); } - e.write = h; + e.write = getInfo(h); } private void warn(String s) { @@ -74,22 +112,16 @@ System.err.println(s); } - private String getVarInfos(List l) { + private String formatInfos(List l) { StringBuilder sb = new StringBuilder(); - for (DSHandle h : l) { + for (Info h : l) { sb.append("\n\t\t"); - sb.append(getVarInfo(h)); + sb.append(formatInfo(h)); } return sb.toString(); } - private String getVarInfo(DSHandle h) { - if (h instanceof AbstractDataNode) { - AbstractDataNode a = (AbstractDataNode) h; - return a.getDisplayableName() + " (line " + a.getDeclarationLine() + ")"; - } - else { - return String.valueOf(h); - } + private String formatInfo(Info i) { + return i.toString(); } } Modified: branches/faster/src/org/griphyn/vdl/util/VDL2Config.java =================================================================== --- branches/faster/src/org/griphyn/vdl/util/VDL2Config.java 2013-02-04 05:31:32 UTC (rev 6229) +++ branches/faster/src/org/griphyn/vdl/util/VDL2Config.java 2013-02-04 05:32:22 UTC (rev 6230) @@ -119,6 +119,7 @@ put("ticker.prefix", "Progress: time:"); put(VDL2ConfigProperties.FILE_GC_ENABLED, "true"); + put(VDL2ConfigProperties.DM_CHECKER, "on"); } private VDL2Config(VDL2Config other) { Modified: branches/faster/src/org/griphyn/vdl/util/VDL2ConfigProperties.java =================================================================== --- branches/faster/src/org/griphyn/vdl/util/VDL2ConfigProperties.java 2013-02-04 05:31:32 UTC (rev 6229) +++ branches/faster/src/org/griphyn/vdl/util/VDL2ConfigProperties.java 2013-02-04 05:32:22 UTC (rev 6230) @@ -44,6 +44,7 @@ public static final String PROVENANCE_LOG = "provenance.log"; public static final String FILE_GC_ENABLED = "file.gc.enabled"; public static final String TRACING_ENABLED = "tracing.enabled"; + public static final String DM_CHECKER = "mapping.checker"; public static final Map PROPERTIES; static { @@ -143,6 +144,11 @@ "operations within swift such as iterations, invocations, assignments, and declarations, as well " + "as data dependencies will be logged. This comes at a cost in performance. It is therefore " + "disabled by default.")); + + PROPERTIES.put(DM_CHECKER, new PropInfo("", "Controls the run-time duplicate mapping checker " + + "(which indetifies mapping conflicts). If set to 'on', the checker is enabled. When enabled, a record " + + "of all mapped data is kept, so this comes at the expense of a slight memory leak. If set 'off', the" + + " mapping checker is disabled. Enabled by default.")); } public static Map getPropertyDescriptions() { From ketan at ci.uchicago.edu Mon Feb 4 08:27:40 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Mon, 4 Feb 2013 08:27:40 -0600 (CST) Subject: [Swift-commit] r6231 - trunk/docs/userguide Message-ID: <20130204142741.F23699CD0E@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-04 08:27:24 -0600 (Mon, 04 Feb 2013) New Revision: 6231 Modified: trunk/docs/userguide/coasters Log: polishing coaster desc Modified: trunk/docs/userguide/coasters =================================================================== --- trunk/docs/userguide/coasters 2013-02-04 05:32:22 UTC (rev 6230) +++ trunk/docs/userguide/coasters 2013-02-04 14:27:24 UTC (rev 6231) @@ -3,40 +3,39 @@ Introduction ~~~~~~~~~~~~ -In many applications, Swift performance can be greatly enhanced by the -use of coasters. Coasters provide a low-overhead job submission -and file transfer mechanism suited for the execution of short jobs (on -the order of a few seconds) and the transfer of small files (on the -order of a few kilobytes) for which other grid protocols such as GRAM -and GridFTP are poorly suited. +Coasters are the Swift's implementation of _pilot job abstraction_. +In many applications, Swift performance can be greatly enhanced by the use of +coasters. Coasters provide a low-overhead job submission and file transfer +mechanism suited for the execution of jobs and the transfer of files for which +other grid protocols such as GRAM and GridFTP are poorly suited. + Benefits ~~~~~~~~ +Much of the overhead associated with other grid protocols (such as +authentication and authorization, and allocation of worker nodes by the site's +local resource manager) is reduced, because that overhead is associated with +the allocation of a coaster pilot or coaster worker, rather than with every +Swift-level procedure invocation; potentially hundreds or thousands of +Swift-level procedure invocations can be run through a single worker. Coasters +can be configured for two purposes: job execution and file staging. In +practice, the Swift script remains the same while working with coasters. A +detailed description of coaster mechanism is explained in the next section. -The coaster mechanism submits a pilot job using some other execution -mechanism such as GRAM, and for each worker node that will be used in a -remote cluster, it submits a worker job, again using some other -execution mechanism such as GRAM. Details on the design of the coaster -mechanism can be found here. - Mechanism ~~~~~~~~~ +Coasters run at the task management layer logically under the Swift script. The +jobs and data movement requirements resulting after the interpretation of a +Swift script are handled by the coasters. The coaster mechanism submits a pilot +job using some other execution mechanism such as GRAM, SGE or PBS scheduler, +and for each worker node that will be used in a remote cluster, it submits a +worker job, again using some other execution mechanism such as GRAM. Details on +the design of the coaster mechanism can be found here: +. The pilot job manages file transfers +and the dispatch of execution jobs to workers. -The pilot job manages file transfers and the dispatch of execution jobs -to workers. Much of the overhead associated with other grid protocols -(such as authentication and authorization, and allocation of worker -nodes by the site's local resource manager) is reduced, because that -overhead is associated with the allocation of a coaster pilot or coaster -worker, rather than with every Swift-level procedure invocation; -potentially hundreds or thousands of Swift-level procedure invocations -can be run through a single worker. - -Coasters can be configured for two purposes: job execution and -file staging. - Coasters How-to ~~~~~~~~~~~~~~~ - To use for job execution, specify a sites.xml execution element like this: ---- @@ -45,10 +44,10 @@ The jobmanager string contains more detail than with other providers. It contains either two or three colon separated fields: 1:the provider to -be use to execute the coaster head job - this provider will submit from +be use to execute the coaster pilot job - this provider will submit from the Swift client side environment. Commonly this will be one of the GRAM providers; 2: the provider to be used to execute coaster worker jobs. -This provider will be used to submit from the coaster head job +This provider will be used to submit from the coaster pilot job environment, so a local scheduler provider can sometimes be used instead of GRAM. 3: optionally, the jobmanager to be used when submitting worker job using the provider specified in field 2. @@ -60,10 +59,10 @@ ---- The url parameter should be a pseudo-URI formed with the URI scheme -being the name of the provider to use to submit the coaster head job, +being the name of the provider to use to submit the coaster pilot job, and the hostname portion being the hostname to be used to execute the -coaster head job. Note that this provider and hostname will be used for -execution of a coaster head job, not for file transfer; so for example, +coaster pilot job. Note that this provider and hostname will be used for +execution of a coaster pilot job, not for file transfer; so for example, a GRAM endpoint should be specified here rather than a GridFTP endpoint. Coasters are affected by the following profile settings, which are From ketan at ci.uchicago.edu Mon Feb 4 08:29:41 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Mon, 4 Feb 2013 08:29:41 -0600 (CST) Subject: [Swift-commit] r6232 - trunk/docs/cookbook Message-ID: <20130204142941.ADC029CD0E@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-04 08:29:39 -0600 (Mon, 04 Feb 2013) New Revision: 6232 Added: trunk/docs/cookbook/debugging trunk/docs/cookbook/infrastructures Removed: trunk/docs/cookbook/debugging_swift trunk/docs/cookbook/diverse_infrastructures Modified: trunk/docs/cookbook/cookbook.txt Log: cookbook organize Modified: trunk/docs/cookbook/cookbook.txt =================================================================== --- trunk/docs/cookbook/cookbook.txt 2013-02-04 14:27:24 UTC (rev 6231) +++ trunk/docs/cookbook/cookbook.txt 2013-02-04 14:29:39 UTC (rev 6232) @@ -13,8 +13,8 @@ include::coasters[] -include::diverse_infrastructures[] +include::infrastructures[] -include::debugging_swift[] +include::debugging[] include::log_processing[] Copied: trunk/docs/cookbook/debugging (from rev 6230, trunk/docs/cookbook/debugging_swift) =================================================================== --- trunk/docs/cookbook/debugging (rev 0) +++ trunk/docs/cookbook/debugging 2013-02-04 14:29:39 UTC (rev 6232) @@ -0,0 +1,17 @@ +Debugging Swift +--------------- +Swift errors are logged in several places: + +. All text from standard output and standard error produced by running the +swift command +. The .log file from this run. It will be named swiftscript.uniqueID.log +where "swiftscript" is the name of your *.swift script source file, and +uniqueID is a long unique id which starts with the date and time you ran the +swift command. +. $HOME/.globus/coasters directory on remote machines on which you are +running coasters +. $HOME/.globus/scripts directory on the host on which you run the Swift +command, when swift is submitting to a local scheduler (Condor, PBS, SGE, +Cobalt) +. $HOME/.globus/??? on remote systems that you access via Globus + Deleted: trunk/docs/cookbook/debugging_swift =================================================================== --- trunk/docs/cookbook/debugging_swift 2013-02-04 14:27:24 UTC (rev 6231) +++ trunk/docs/cookbook/debugging_swift 2013-02-04 14:29:39 UTC (rev 6232) @@ -1,17 +0,0 @@ -Debugging Swift ---------------- -Swift errors are logged in several places: - -. All text from standard output and standard error produced by running the -swift command -. The .log file from this run. It will be named swiftscript.uniqueID.log -where "swiftscript" is the name of your *.swift script source file, and -uniqueID is a long unique id which starts with the date and time you ran the -swift command. -. $HOME/.globus/coasters directory on remote machines on which you are -running coasters -. $HOME/.globus/scripts directory on the host on which you run the Swift -command, when swift is submitting to a local scheduler (Condor, PBS, SGE, -Cobalt) -. $HOME/.globus/??? on remote systems that you access via Globus - Deleted: trunk/docs/cookbook/diverse_infrastructures =================================================================== --- trunk/docs/cookbook/diverse_infrastructures 2013-02-04 14:27:24 UTC (rev 6231) +++ trunk/docs/cookbook/diverse_infrastructures 2013-02-04 14:29:39 UTC (rev 6232) @@ -1,182 +0,0 @@ -Swift on Diverse Infrastructures ---------------------------------- - -Beagle -~~~~~~ -Swift is available on Beagle as a software module. -In this recipe, we will walk you through a very simple example running Swift -on Beagle. The prerequisites required for running this example on Beagle is an access to Beagle and a project allocation. The example is a simplest form of a real application that involves reading from a disc file and writing onto another disc file. It runs the +/bin/cat+ Unix command to read an input file called +data.txt+ and write it to an output file in a folder +outdir+, called +f.nnn.out+. - -image::figures/catsn.png[Swift Example] - -The steps are as follows: - -*step 1.* Load the Swift module on Beagle commandline as follows: +$ module load swift+ - -*step 2.* Create and change to a directory where your Swift related work (source, inputs, outputs) will -stay. (say, +$ mkdir swift-lab+, followed by, +$ cd swift-lab+) - -*step 3.* copy the folder at +/home/ketan/labs/catsn+ to the above directory. (+$cp -r /home/ketan/catsn .+ followed by +$ cd catsn+). - -*step 4.* In the sites file: +sites.xml+ make the following two -changes: - - 1. change the path of the +$$$$+ element to your preferred location (this location is *required* to be on /lustre, say to +/lustre/beagle//swift-lab/swift.workdir+), and - - 2. Change the project name to your project (for instance, +CI-CCR000013+) . The workdirectory will contain - execution data related to each run, e.g. wrapper scripts, system information, inputs and outputs. - -*step 5.* Run the example using following commandline (also found in run.sh): - ----- -$ swift -config cf -tc.file tc -sites.file sites.xml catsn.swift -n=1 ----- - -You can further change the value of +-n+ to any arbitrary number to run that -many number of concurrent +cat+ - -*step 6.* Check the output in the generated +outdir+ directory (+ls outdir+) - -Note: Running from sandbox node or requesting 1 hour walltime for upto 3 nodes -will get fast prioritized execution. Good for small tests -Swift supports a coasters based computing environment for Beagle. A detailed version of Swift documentation is maintained -http://www.ci.uchicago.edu/swift/docs/index.php[here]. - -// -//Intrepid-BG/P -//~~~~~~~~~~~~~ -//Swift on Intrepid-BG/P -// - -PADS -~~~~ -Swift on PADS -To execute your Swift script on the PADS cluster use this command: - ----- -swift -tc.file tc -sites.file pbs.xml modis.swift ----- -where the contents of a simple pbs.xml sites file could be: -[xml] -source~~~~ - - - - fast - 00:05:00 - 10000 - .10 - - /home/you/swiftwork - - -source~~~~ - -OSG -~~~ -This section describes how to get Swift running on the OSG Grid. We will use a -manual coaster setup to get Swift running on OSG. - -.Coaster setup on OSG -The following figure shows an abstract scheme for the manual coasters setup on -OSG. - -image::figures/coaster_setup.png[Coaster setup] - -In the following steps, we will go through the process of manually setting -//Swift on OSG -// - -Bionimbus -~~~~~~~~~ -This section explains a step by step procedure on getting Swift running on the -Bionimbus cloud. We will use the _manual_ _coasters_ configuration on the -Bionimbus cloud. - -**step1.** Connect to the gateway (ssh gatewayx.lac.uic.edu) - -**step2.** Start a virtual machine (euca-run-instances -n 1 -t m1.small -emi-17EB1170) - -**step3.** Start the coaster-service on gateway -+coaster-service -port 1984 -localport 35753 -nosec+ - -**step4.** Start the Swift-script from the gateway using normal Swift commandline - -+swift -config cf -tc.file tc -sites.file sites.xml yourscript.swift -aparam=999+ - -.cf ----- -wrapperlog.always.transfer=true -sitedir.keep=true -execution.retries=1 -lazy.errors=true -status.mode=provider -use.provider.staging=true -provider.staging.pin.swiftfiles=false -foreach.max.threads=100 -provenance.log=true ----- - -.tc ----- -localhost modftdock /home/ketan/swift-labs/bionimbus-coaster-modftdock/app/modftdock.sh null null GLOBUS::maxwalltime="1:00:00" ----- - -(See below for a sample sites.xml for this run) - -**step5.** Connect back to gateway from virtual machines using reverse ssh tunneling as follows: - -.From the gateway prompt - -+ssh -R *:5000:localhost:5000 root at 10.101.8.50 sleep 999+ - -WHERE: -*=network interface, should remain the same on all cases - -localhost=the gateway host, should remain the same - -5000(LEFT OF localhost)=the port number on localhost to listen to **THIS WILL -vary depending upon which port you want to listen to - -5000(RIGHT OF localhost)=the port on target host that you want to forward - -root at 10.101.8.50=the ip of the Virtual Machine on Bionimbus cloud, this will -vary based on what ip you get for your Virtual Machine instance - -#On anywhere as long as provide the correct callback uri: here the -"http://140.221.9.110:42195" is the callback uri of previous ones - -**step6.** Start the worker from the virtual machine -+worker.pl http://localhost:42195 tmp /tmp # where 42195 is the port where the -coaster service is listening to the workers+ - -.sites.xml for the above run - ----- - - - - passive - - 4 - 10000 - 100 - 100 - 100 - 1 - 10 - 25.00 - 10000 - proxy - - /home/ketan/swift-labs/bionimbus-coaster-modftdock/swift.workdir - - ----- - -//Magellan -//~~~~~~~~ -//Swift on Magellan -// - Copied: trunk/docs/cookbook/infrastructures (from rev 6230, trunk/docs/cookbook/diverse_infrastructures) =================================================================== --- trunk/docs/cookbook/infrastructures (rev 0) +++ trunk/docs/cookbook/infrastructures 2013-02-04 14:29:39 UTC (rev 6232) @@ -0,0 +1,182 @@ +Swift on Diverse Infrastructures +--------------------------------- + +Beagle +~~~~~~ +Swift is available on Beagle as a software module. +In this recipe, we will walk you through a very simple example running Swift +on Beagle. The prerequisites required for running this example on Beagle is an access to Beagle and a project allocation. The example is a simplest form of a real application that involves reading from a disc file and writing onto another disc file. It runs the +/bin/cat+ Unix command to read an input file called +data.txt+ and write it to an output file in a folder +outdir+, called +f.nnn.out+. + +image::figures/catsn.png[Swift Example] + +The steps are as follows: + +*step 1.* Load the Swift module on Beagle commandline as follows: +$ module load swift+ + +*step 2.* Create and change to a directory where your Swift related work (source, inputs, outputs) will +stay. (say, +$ mkdir swift-lab+, followed by, +$ cd swift-lab+) + +*step 3.* copy the folder at +/home/ketan/labs/catsn+ to the above directory. (+$cp -r /home/ketan/catsn .+ followed by +$ cd catsn+). + +*step 4.* In the sites file: +sites.xml+ make the following two +changes: + + 1. change the path of the +$$$$+ element to your preferred location (this location is *required* to be on /lustre, say to +/lustre/beagle//swift-lab/swift.workdir+), and + + 2. Change the project name to your project (for instance, +CI-CCR000013+) . The workdirectory will contain + execution data related to each run, e.g. wrapper scripts, system information, inputs and outputs. + +*step 5.* Run the example using following commandline (also found in run.sh): + +---- +$ swift -config cf -tc.file tc -sites.file sites.xml catsn.swift -n=1 +---- + +You can further change the value of +-n+ to any arbitrary number to run that +many number of concurrent +cat+ + +*step 6.* Check the output in the generated +outdir+ directory (+ls outdir+) + +Note: Running from sandbox node or requesting 1 hour walltime for upto 3 nodes +will get fast prioritized execution. Good for small tests +Swift supports a coasters based computing environment for Beagle. A detailed version of Swift documentation is maintained +http://www.ci.uchicago.edu/swift/docs/index.php[here]. + +// +//Intrepid-BG/P +//~~~~~~~~~~~~~ +//Swift on Intrepid-BG/P +// + +PADS +~~~~ +Swift on PADS +To execute your Swift script on the PADS cluster use this command: + +---- +swift -tc.file tc -sites.file pbs.xml modis.swift +---- +where the contents of a simple pbs.xml sites file could be: +[xml] +source~~~~ + + + + fast + 00:05:00 + 10000 + .10 + + /home/you/swiftwork + + +source~~~~ + +OSG +~~~ +This section describes how to get Swift running on the OSG Grid. We will use a +manual coaster setup to get Swift running on OSG. + +.Coaster setup on OSG +The following figure shows an abstract scheme for the manual coasters setup on +OSG. + +image::figures/coaster_setup.png[Coaster setup] + +In the following steps, we will go through the process of manually setting +//Swift on OSG +// + +Bionimbus +~~~~~~~~~ +This section explains a step by step procedure on getting Swift running on the +Bionimbus cloud. We will use the _manual_ _coasters_ configuration on the +Bionimbus cloud. + +**step1.** Connect to the gateway (ssh gatewayx.lac.uic.edu) + +**step2.** Start a virtual machine (euca-run-instances -n 1 -t m1.small +emi-17EB1170) + +**step3.** Start the coaster-service on gateway ++coaster-service -port 1984 -localport 35753 -nosec+ + +**step4.** Start the Swift-script from the gateway using normal Swift commandline + ++swift -config cf -tc.file tc -sites.file sites.xml yourscript.swift -aparam=999+ + +.cf +---- +wrapperlog.always.transfer=true +sitedir.keep=true +execution.retries=1 +lazy.errors=true +status.mode=provider +use.provider.staging=true +provider.staging.pin.swiftfiles=false +foreach.max.threads=100 +provenance.log=true +---- + +.tc +---- +localhost modftdock /home/ketan/swift-labs/bionimbus-coaster-modftdock/app/modftdock.sh null null GLOBUS::maxwalltime="1:00:00" +---- + +(See below for a sample sites.xml for this run) + +**step5.** Connect back to gateway from virtual machines using reverse ssh tunneling as follows: + +.From the gateway prompt + ++ssh -R *:5000:localhost:5000 root at 10.101.8.50 sleep 999+ + +WHERE: +*=network interface, should remain the same on all cases + +localhost=the gateway host, should remain the same + +5000(LEFT OF localhost)=the port number on localhost to listen to **THIS WILL +vary depending upon which port you want to listen to + +5000(RIGHT OF localhost)=the port on target host that you want to forward + +root at 10.101.8.50=the ip of the Virtual Machine on Bionimbus cloud, this will +vary based on what ip you get for your Virtual Machine instance + +#On anywhere as long as provide the correct callback uri: here the +"http://140.221.9.110:42195" is the callback uri of previous ones + +**step6.** Start the worker from the virtual machine ++worker.pl http://localhost:42195 tmp /tmp # where 42195 is the port where the +coaster service is listening to the workers+ + +.sites.xml for the above run + +---- + + + + passive + + 4 + 10000 + 100 + 100 + 100 + 1 + 10 + 25.00 + 10000 + proxy + + /home/ketan/swift-labs/bionimbus-coaster-modftdock/swift.workdir + + +---- + +//Magellan +//~~~~~~~~ +//Swift on Magellan +// + From ketan at ci.uchicago.edu Mon Feb 4 08:44:44 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Mon, 4 Feb 2013 08:44:44 -0600 (CST) Subject: [Swift-commit] r6233 - trunk/docs/cookbook Message-ID: <20130204144444.87BA39CD0E@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-04 08:44:42 -0600 (Mon, 04 Feb 2013) New Revision: 6233 Modified: trunk/docs/cookbook/swift_basics Log: polishing cookbook Modified: trunk/docs/cookbook/swift_basics =================================================================== --- trunk/docs/cookbook/swift_basics 2013-02-04 14:29:39 UTC (rev 6232) +++ trunk/docs/cookbook/swift_basics 2013-02-04 14:44:42 UTC (rev 6233) @@ -12,10 +12,10 @@ ^^^^^^^^^^^^^^ .Check your Java Swift is a Java application. Make sure you are running Java version 5 or higher. You -can make sure you have Java in your $PATH (or $HOME/.soft file depending upon +can make sure you have Java in your $PATH (or file such as $HOME/.soft depending upon your environment) -Following are the possible ways to detect and run Java: +Following are some possible ways to detect and run Java: ---- $ grep java $HOME/.soft @@ -32,10 +32,12 @@ Setting up to run Swift ~~~~~~~~~~~~~~~~~~~~~~~~ This is simple. We will be using a pre-compiled version of Swift that can be -downloaded from link:http://www.ci.uchicago.edu/swift/downloads/index.php[here]. Download and untar the latest precompiled version as follows: +downloaded from +link:http://www.ci.uchicago.edu/swift/downloads/index.php[here]. Download and +untar the latest precompiled version as follows: ---- -$ tar xf swift-0.92.1.tar.gz +$ tar zxf swift-0.92.1.tar.gz ---- Environment Setup @@ -99,7 +101,7 @@ The _profiles_ field should be set to null if no profile entries are to be specified, or should contain the profile entries separated by semicolons. -Setting swift configuration +Setting Swift configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Many configuration properties could be set using the Swift configuration file. We will not cover them all in this section. see @@ -201,16 +203,16 @@ What if Swift hangs ~~~~~~~~~~~~~~~~~~~ -Owing to its highly multithreaded architecture it is often the case that the +Owing to its multi-threaded architecture it is often the case that the underlying java virtual machine gets into deadlock situations or Swift hangs -because of other complications in its threaded operations. Under such -situations, Swift _hang-checker_ chips in and resolves the situation. +because of other complications in its operations. Under such +situations, Swift _hang-checker_ chips in and gives indication of the situation. . how to use the information to identify and correct the deadlock. . How close to the Swift source code can we make the hang-checker messages, so that the user can relate it to Swift functions, expressions, and ideally source code lines? -. The current Hang Checker output is actually *very* nice and useful already: +. The Hang Checker output is nice and useful: ---- Registered futures: @@ -224,7 +226,7 @@ Resuming a stopped or crashed Swift Run ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -I had a .rlog file from a Swift run that ran out of time. I kicked it off +I had a .rlog file from a Swift run that ran out of time. I resumed the run using the -resume flag described in section 16.2 of the Swift User Guide and it picked up where it left off. Then I killed it because I wanted to make changes to my sites file. @@ -250,8 +252,8 @@ [nbest at login2 files]$ pwd /home/nbest/bigdata/files [nbest at login2 files]$ -~wilde/swift/src/stable/cog/modules/swift/dist/swift-svn/bin/swift \ -> -tc.file tc -sites.file pbs.xml ~/scripts/mcd12q1.swift -resume +~wilde/swift/src/stable/cog/modules/swift/dist/swift-svn/bin/swift -resume \ +> -tc.file tc -sites.file pbs.xml ~/scripts/mcd12q1.swift > mcd12q1-20100310-1326-ptxe1x1d.0.rlog Swift svn swift-r3255 (swift modified locally) cog-r2723 (cog modified locally) @@ -274,13 +276,6 @@ in previous run:2558 ---- - -From Neil: A comment about that section of the user guide: It says "In order -to restart from a restart log file, the -resume logfile argument can be used -after the SwiftScript? program file name." and then puts the -resume logfile -argument before the script file name. I'm sure the order doesn't matter but -the contradiction is confusing. - Notes to add (from Mike): - explain what aspects of a Swift script make it restartable, and which From ketan at ci.uchicago.edu Mon Feb 4 13:37:36 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Mon, 4 Feb 2013 13:37:36 -0600 (CST) Subject: [Swift-commit] r6234 - in trunk/docs: cookbook userguide Message-ID: <20130204193736.695FD9CD0E@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-04 13:37:36 -0600 (Mon, 04 Feb 2013) New Revision: 6234 Modified: trunk/docs/cookbook/debugging trunk/docs/cookbook/swift_basics trunk/docs/userguide/app_procedures trunk/docs/userguide/commands trunk/docs/userguide/configuration_properties trunk/docs/userguide/language trunk/docs/userguide/mappers trunk/docs/userguide/overview trunk/docs/userguide/reliability_mechanisms trunk/docs/userguide/transformation_catalog Log: SwiftScript -> Swift script Modified: trunk/docs/cookbook/debugging =================================================================== --- trunk/docs/cookbook/debugging 2013-02-04 14:44:42 UTC (rev 6233) +++ trunk/docs/cookbook/debugging 2013-02-04 19:37:36 UTC (rev 6234) @@ -4,8 +4,8 @@ . All text from standard output and standard error produced by running the swift command -. The .log file from this run. It will be named swiftscript.uniqueID.log -where "swiftscript" is the name of your *.swift script source file, and +. The .log file from this run. It will be named script.uniqueID.log +where "script" is the name of your *.swift script source file, and uniqueID is a long unique id which starts with the date and time you ran the swift command. . $HOME/.globus/coasters directory on remote machines on which you are Modified: trunk/docs/cookbook/swift_basics =================================================================== --- trunk/docs/cookbook/swift_basics 2013-02-04 14:44:42 UTC (rev 6233) +++ trunk/docs/cookbook/swift_basics 2013-02-04 19:37:36 UTC (rev 6234) @@ -90,7 +90,7 @@ The _site_ field should correspond to a site name listed in the sites catalog. The _transformation-name_ should correspond to the transformation name used in a -SwiftScript app procedure. +Swift script app procedure. The _executable-path_ should specify where the particular executable is located on that site. @@ -141,9 +141,9 @@ source~~~~~~ -First SwiftScript +First Swift script ~~~~~~~~~~~~~~~~~ -Your first SwiftScript +Your first Swift script Hello Swift-World! A good sanity check that Swift is set up and running OK locally is this: @@ -163,7 +163,7 @@ Progress: -SwiftScript trace: Hello, Swift world! +Swift trace: Hello, Swift world! Final status: @@ -173,7 +173,7 @@ http://www.ci.uchicago.edu/swift/guides/tutorial.php. Follow the steps in that tutorial to learn how to run a few simple scripts on the login host. -second SwiftScript +second Swift script ~~~~~~~~~~~~~~~~~~~ Following is a more involved Swift script. [java] @@ -438,14 +438,14 @@ RunID: 20100310-1105-4okarq08 Progress: -SwiftScript trace: 1, output/myfile.h11v04.mytype -SwiftScript trace: 2, home/wilde/bigdata/data/sample/h11v05.tif -SwiftScript trace: 3, home/wilde/bigdata/data/sample/h12v04.tif -SwiftScript trace: 0, output/myfile.h32v08.mytype -SwiftScript trace: 0, home/wilde/bigdata/data/sample/h32v08.tif -SwiftScript trace: 3, output/myfile.h12v04.mytype -SwiftScript trace: 1, home/wilde/bigdata/data/sample/h11v04.tif -SwiftScript trace: 2, output/myfile.h11v05.mytype +Swift script trace: 1, output/myfile.h11v04.mytype +Swift script trace: 2, home/wilde/bigdata/data/sample/h11v05.tif +Swift script trace: 3, home/wilde/bigdata/data/sample/h12v04.tif +Swift script trace: 0, output/myfile.h32v08.mytype +Swift script trace: 0, home/wilde/bigdata/data/sample/h32v08.tif +Swift script trace: 3, output/myfile.h12v04.mytype +Swift script trace: 1, home/wilde/bigdata/data/sample/h11v04.tif +Swift script trace: 2, output/myfile.h11v05.mytype Final status: login1$ ---- Modified: trunk/docs/userguide/app_procedures =================================================================== --- trunk/docs/userguide/app_procedures 2013-02-04 14:44:42 UTC (rev 6233) +++ trunk/docs/userguide/app_procedures 2013-02-04 19:37:36 UTC (rev 6234) @@ -15,7 +15,7 @@ mechanisms by which Swift performs that translation; that is described in the next section. -In this section, this example SwiftScript program is used for reference: +In this section, this example Swift script is used for reference: ---- type file; @@ -40,7 +40,7 @@ This application workspace directory will not be shared with any other application procedure execution attempt; all application procedure execution attempts will run with distinct application procedure -workspaces. (for the avoidance of doubt: If a SwiftScript procedure +workspaces. (for the avoidance of doubt: If a Swift script procedure invocation is subject to multiple application procedure execution attempts (due to Swift-level restarts, retries or replication) then each of those application procedure execution attempts will be made in a @@ -87,7 +87,7 @@ of the application executable), then the application executable should exit with unix return code not equal to 0. - * Each file mapped from an output parameter of the SwiftScript + * Each file mapped from an output parameter of the Swift script procedure call must exist. Files will be mapped in the same way as for input files. @@ -212,7 +212,7 @@ information at execution time to aid in debugging and provenance capture. -SwiftScript language compilation layer +Swift script language compilation layer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Step i: text to XML intermediate form parser/processor. parser written in ANTLR - see resources/VDL.g. The XML Schema Definition (XSD) for the @@ -220,7 +220,7 @@ Step ii: XML intermediate form to Karajan workflow. Karajan.java - reads the XML intermediate form. compiles to karajan workflow language - for -example, expressions are converted from SwiftScript syntax into Karajan +example, expressions are converted from Swift script syntax into Karajan syntax, and function invocations become karajan function invocations with various modifications to parameters to accomodate return parameters and dataset handling. @@ -261,7 +261,7 @@ Function reference ------------------ This section details functions that are available for use in the -SwiftScript language. +Swift scripting language. @arg ~~~~ @@ -287,8 +287,8 @@ Swift v0.3-dev r1674 (modified locally) RunID: 20080220-1548-ylc4pmda -SwiftScript trace: defaultvalue -SwiftScript trace: hello +Swift trace: defaultvalue +Swift trace: hello ---- @extractint @@ -408,13 +408,13 @@ @toint ~~~~~~ @toint(input) will parse its input string into an integer. This can be -used with @arg to pass input parameters to a SwiftScript program as +used with @arg to pass input parameters to a Swift script as integers. @tofloat ~~~~~~ @tofloat(input) will parse its input string into a floating point number. This can be -used with @arg to pass input parameters to a SwiftScript program as +used with @arg to pass input parameters to a Swift script as floating point numbers. @length @@ -428,7 +428,7 @@ Built-in procedure reference ---------------------------- This section details built-in procedures that are available for use in -the SwiftScript language. +the Swift scripting language. readData ~~~~~~~~ Modified: trunk/docs/userguide/commands =================================================================== --- trunk/docs/userguide/commands 2013-02-04 14:44:42 UTC (rev 6233) +++ trunk/docs/userguide/commands 2013-02-04 19:37:36 UTC (rev 6234) @@ -8,15 +8,15 @@ swift ~~~~~ The swift command is the main command line tool for executing -SwiftScript programs. +Swift scripts. Command-line Syntax ^^^^^^^^^^^^^^^^^^^ The swift command is invoked as follows: swift [options] -SwiftScript-program [SwiftScript-arguments]* with options taken from the -following list, and SwiftScript-arguments made available to the -SwiftScript program through the @arg function. +Swifti script [Swift-arguments]* with options taken from the +following list, and Swift script arguments made available to the +Swift script through the @arg function. Swift command-line options @@ -26,11 +26,11 @@ -typecheck - Does a typecheck of a SwiftScript program, instead of executing it. + Does a typecheck of a Swift script, instead of executing it. -dryrun - Runs the SwiftScript program without submitting any jobs (can be + Runs the Swift script without submitting any jobs (can be used to get a graph) -monitor Modified: trunk/docs/userguide/configuration_properties =================================================================== --- trunk/docs/userguide/configuration_properties 2013-02-04 14:44:42 UTC (rev 6233) +++ trunk/docs/userguide/configuration_properties 2013-02-04 19:37:36 UTC (rev 6234) @@ -173,12 +173,12 @@ value of this property. If set to false, Swift will report the first error encountered and immediately stop execution. If set to true, Swift will attempt to run as much as possible from a - SwiftScript program before stopping execution and reporting all + Swift script before stopping execution and reporting all errors encountered. - When developing SwiftScript programs, using the default value of + When developing Swift scripts, using the default value of false can make the program easier to debug. However in production - runs, using true will allow more of a SwiftScript program to be + runs, using true will allow more of a Swift script to be run before Swift aborts execution. pgraph @@ -188,7 +188,7 @@ Default value: false Swift can generate a Graphviz file - representing the structure of the SwiftScript program it has run. If + representing the structure of the Swift script it has run. If this property is set to true, Swift will save the provenance graph in a file named by concatenating the program name and the instance ID (e.g. helloworld-ht0adgi315l61.dot). Modified: trunk/docs/userguide/language =================================================================== --- trunk/docs/userguide/language 2013-02-04 14:44:42 UTC (rev 6233) +++ trunk/docs/userguide/language 2013-02-04 19:37:36 UTC (rev 6234) @@ -1,5 +1,5 @@ -The SwiftScript Language ------------------------- +The Swift scripting Language +---------------------------- Language basics ~~~~~~~~~~~~~~~ @@ -64,15 +64,15 @@ The examples above have used the type image without any definition of that type. We can declare it as a marker type which has no structure -exposed to SwiftScript: +exposed to Swift script: ---- type image; ---- This does not indicate that the data is unstructured; but it indicates -that the structure of the data is not exposed to SwiftScript. Instead, -SwiftScript will treat variables of this type as individual opaque files. +that the structure of the data is not exposed to Swift. Instead, +Swift will treat variables of this type as individual opaque files. With mechanisms to declare types, map variables to data files, and declare and invoke procedures, we can build a complete (albeit simple) @@ -172,7 +172,7 @@ z=q(y); ---- -Arrays in SwiftScript are more monotonic - a generalisation of being +Arrays in Swift are more monotonic - a generalisation of being assignment. Knowledge about the content of an array increases during execution, but cannot otherwise change. Each element of the array is itself single assignment or monotonic (depending on its type). During a @@ -208,9 +208,9 @@ ~~~~~~~~~~~~~~~~~~~ As with many other programming languages, procedures consisting of -SwiftScript code can be defined. These differ from the previously +Swift script can be defined. These differ from the previously mentioned procedures declared with the app keyword, as they invoke -other SwiftScript procedures rather than a component program. +other Swift procedures rather than a component program. ---- (file output) process (file input) { @@ -249,13 +249,13 @@ More about types ~~~~~~~~~~~~~~~~ -Each variable and procedure parameter in SwiftScript is strongly typed. +Each variable and procedure parameter in Swift script is strongly typed. Types are used to structure data, to aid in debugging and checking program correctness and to influence how Swift interacts with data. The image type declared in previous examples is a marker type. Marker types indicate that data for a variable is stored in a single -file with no further structure exposed at the SwiftScript level. +file with no further structure exposed at the Swift script level. Arrays have been mentioned above, in the arrays section. A code block may be applied to each element of an array using foreach; or Modified: trunk/docs/userguide/mappers =================================================================== --- trunk/docs/userguide/mappers 2013-02-04 14:44:42 UTC (rev 6233) +++ trunk/docs/userguide/mappers 2013-02-04 19:37:36 UTC (rev 6234) @@ -24,7 +24,7 @@ The above example declares a dataset called f1, which uses a single file mapper to map a file from a specific location. -SwiftScript has a simplified syntax for this case, since +Swift has a simplified syntax for this case, since single_file_mapper is frequently used: ---- @@ -35,20 +35,20 @@ patterns. These are documented in the mappers section of this guide. -More technical details about SwiftScript -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The syntax of SwiftScript has a superficial resemblance to C and Java. +More technical details about Swift script +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The syntax of Swift script has a superficial resemblance to C and Java. For example, { and } characters are used to enclose blocks of statements. -A SwiftScript program consists of a number of statements. Statements may +A Swift script consists of a number of statements. Statements may declare types, procedures and variables, assign values to variables, and express operations over arrays. Variables ^^^^^^^^^ -Variables in SwiftScript are declared to be of a specific type. -Assignments to those variables must be data of that type. SwiftScript +Variables in Swift scripts are declared to be of a specific type. +Assignments to those variables must be data of that type. Swift script variables are single-assignment - a value may be assigned to a variable at most once. This assignment can happen at declaration time or later on in execution. When an attempt to read from a variable that has not yet @@ -98,10 +98,10 @@ ~~~~~~~~~~ There are two kinds of procedure: An atomic procedure, which describes how an external program can be executed; and compound procedures which -consist of a sequence of SwiftScript statements. +consist of a sequence of Swift script statements. A procedure declaration defines the name of a procedure and its input -and output parameters. SwiftScript procedures can take multiple inputs +and output parameters. Swift script procedures can take multiple inputs and produce multiple outputs. Inputs are specified to the right of the function name, and outputs are specified to the left. For example: @@ -155,7 +155,7 @@ Compound procedures ^^^^^^^^^^^^^^^^^^^ -A compound procedure contains a set of SwiftScript statements: +A compound procedure contains a set of Swift script statements: ---- (type2 b) foo_bar (type1 a) { @@ -167,7 +167,7 @@ Control Constructs ~~~~~~~~~~~~~~~~~~ -SwiftScript provides if, switch, foreach, and iterate +Swift script provides if, switch, foreach, and iterate constructs, with syntax and semantics similar to comparable constructs in other high-level languages. @@ -265,7 +265,7 @@ Operators ~~~~~~~~~ -The following infix operators are available for use in SwiftScript +The following infix operators are available for use in Swift script expressions. [options="header, autowidth"] @@ -286,7 +286,7 @@ Global constants ~~~~~~~~~~~~~~~~ -At the top level of a SwiftScript program, the global modified may be +At the top level of a Swift script program, the global modified may be added to a declaration so that it is visible throughout the program, rather than only at the top level of the program. This allows global constants (of any type) to be defined. (since Swift 0.10) @@ -295,9 +295,9 @@ Imports ~~~~~~~ The import directive can be used to import definitions from another -SwiftScript file. (since Swift 0.10) +Swift file. -For example, a SwiftScript program might contain this: +For example, a Swift script might contain this: ---- import "defs"; @@ -337,7 +337,7 @@ is imported multiple times, for example in different files, then Swift will only process the imports once. -Imports may contain anything that is valid in a SwiftScript program, +Imports may contain anything that is valid in a Swift script, including the code that causes remote execution. Mappers @@ -754,9 +754,11 @@ The output (stdout) of the executable should consist of two columns of data, separated by a space. The first column should be the path of the mapped -variable, in SwiftScript syntax (for example [2] means the 2nd element -of an array) or the symbol $ to represent the root of the mapped -variable. The following table shows the symbols that should appear in the first column corresponding to the mapping of different types of swift constructs such as scalars, arrays and structs. +variable, in Swift script syntax (for example [2] means the 2nd element of an +array) or the symbol $ to represent the root of the mapped variable. The +following table shows the symbols that should appear in the first column +corresponding to the mapping of different types of swift constructs such as +scalars, arrays and structs. [option="header, autowidth"] |============= @@ -793,7 +795,12 @@ |stus[2]|qux |=========== -Advanced Example: The following mapper.sh is an advanced example of an external mapper that maps a two-dimensional array to a directory of files. The files in the said directory are identified by their names appended by a number between 000 and 099. The first index of the array maps to the first part of the filename while the second index of the array maps to the second part of the filename. +Advanced Example: The following mapper.sh is an advanced example of an external +mapper that maps a two-dimensional array to a directory of files. The files in +the said directory are identified by their names appended by a number between +000 and 099. The first index of the array maps to the first part of the +filename while the second index of the array maps to the second part of the +filename. ---- #!/bin/sh @@ -837,7 +844,9 @@ ---- -Assuming there are 4 files with name aaa, bbb, ccc, ddd and a mod_index of 10, we will have 4x10=40 files mapped to a two-dimensional array in the following pattern: +Assuming there are 4 files with name aaa, bbb, ccc, ddd and a mod_index of 10, +we will have 4x10=40 files mapped to a two-dimensional array in the following +pattern: [options="header, autowidth"] |============ Modified: trunk/docs/userguide/overview =================================================================== --- trunk/docs/userguide/overview 2013-02-04 14:44:42 UTC (rev 6233) +++ trunk/docs/userguide/overview 2013-02-04 19:37:36 UTC (rev 6234) @@ -1,6 +1,6 @@ Overview -------- -This manual provides reference material for Swift: the SwiftScript +This manual provides reference material for Swift: the Swift language and the Swift runtime system. For introductory material, consult the Swift tutorial . @@ -10,9 +10,9 @@ and procedural composition. Swift programs (or workflows) are written in a language called -SwiftScript. +Swift scripts. -SwiftScript programs are dataflow oriented - they are primarily +Swift scripts are dataflow oriented - they are primarily concerned with processing (possibly large) collections of data files, by invoking programs to do that processing. Swift handles execution of such programs on remote sites by choosing sites, handling the staging of Modified: trunk/docs/userguide/reliability_mechanisms =================================================================== --- trunk/docs/userguide/reliability_mechanisms 2013-02-04 14:44:42 UTC (rev 6233) +++ trunk/docs/userguide/reliability_mechanisms 2013-02-04 19:37:36 UTC (rev 6234) @@ -26,7 +26,7 @@ using the unique job ID and a .rlog extension. This restart log can then be passed to a subsequent Swift invocation using the -resume parameter. Swift will resume execution, avoiding execution of -invocations that have previously completed successfully. The SwiftScript +invocations that have previously completed successfully. The Swift source file and input data files should not be modified between runs. Every run creates a restart log file with a named composed of the file @@ -38,7 +38,7 @@ fails, swift can use the restart log file to continue execution from a point before the failure occurred. In order to restart from a restart log file, the -resume logfile argument can be used after the -SwiftScript program file name. Example: +Swift script file name. Example: ---- $ swift -resume example-ht0adgi315l61.0.rlog example.swift. Modified: trunk/docs/userguide/transformation_catalog =================================================================== --- trunk/docs/userguide/transformation_catalog 2013-02-04 14:44:42 UTC (rev 6233) +++ trunk/docs/userguide/transformation_catalog 2013-02-04 19:37:36 UTC (rev 6234) @@ -22,7 +22,7 @@ The site field should correspond to a site name listed in the sites catalog. The transformation name should correspond to the transformation name -used in a SwiftScript app procedure. +used in a Swift script app procedure. The executable path should specify where the particular executable is located on that site. From ketan at ci.uchicago.edu Tue Feb 5 09:10:55 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Tue, 5 Feb 2013 09:10:55 -0600 (CST) Subject: [Swift-commit] r6235 - trunk/docs/cookbook Message-ID: <20130205151055.1D9B09CC9C@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-05 09:10:54 -0600 (Tue, 05 Feb 2013) New Revision: 6235 Modified: trunk/docs/cookbook/infrastructures trunk/docs/cookbook/overview Log: cookbook update and polish Modified: trunk/docs/cookbook/infrastructures =================================================================== --- trunk/docs/cookbook/infrastructures 2013-02-04 19:37:36 UTC (rev 6234) +++ trunk/docs/cookbook/infrastructures 2013-02-05 15:10:54 UTC (rev 6235) @@ -3,30 +3,44 @@ Beagle ~~~~~~ -Swift is available on Beagle as a software module. -In this recipe, we will walk you through a very simple example running Swift -on Beagle. The prerequisites required for running this example on Beagle is an access to Beagle and a project allocation. The example is a simplest form of a real application that involves reading from a disc file and writing onto another disc file. It runs the +/bin/cat+ Unix command to read an input file called +data.txt+ and write it to an output file in a folder +outdir+, called +f.nnn.out+. +Beagle is a University of Chicago's Computational Institute super computer +dedicated to bioinformatics research. It is a cray XE6 machine running PBS job +scheduler. More on Beagle could be found +link:https://beagle.ci.uchicago.edu[here]. +Swift is available on Beagle as a software module. This recipe will walk you +through a very simple example running Swift on Beagle. The prerequisites for +running this example on Beagle is an access to and a project allocation on +Beagle. The example is a simplest form of a real application which involves +reading from a disc file and writing onto another disc file. It runs the ++/bin/cat+ Unix command to read an input file called +data.txt+ and write it to +an output file in a folder +outdir+, called +f.nnn.out+. + image::figures/catsn.png[Swift Example] The steps are as follows: -*step 1.* Load the Swift module on Beagle commandline as follows: +$ module load swift+ +*step 1.* Load the Swift module on Beagle commandline as follows: +$ module +load swift+ -*step 2.* Create and change to a directory where your Swift related work (source, inputs, outputs) will -stay. (say, +$ mkdir swift-lab+, followed by, +$ cd swift-lab+) +*step 2.* Create and change to a directory where your Swift related work +(source, inputs, outputs) will stay. (say, +$ mkdir swift-lab+, followed by, +$ +cd swift-lab+) -*step 3.* copy the folder at +/home/ketan/labs/catsn+ to the above directory. (+$cp -r /home/ketan/catsn .+ followed by +$ cd catsn+). +*step 3.* copy the folder at +/home/ketan/labs/catsn+ to the above directory. +(+$cp -r /home/ketan/catsn .+ followed by +$ cd catsn+). -*step 4.* In the sites file: +sites.xml+ make the following two -changes: +*step 4.* In the sites file: +sites.xml+ make the following two changes: - 1. change the path of the +$$$$+ element to your preferred location (this location is *required* to be on /lustre, say to +/lustre/beagle//swift-lab/swift.workdir+), and + 1. change the path of the +$$$$+ element to your preferred + location (this location is *required* to be on /lustre, say to + +/lustre/beagle//swift-lab/swift.workdir+), and - 2. Change the project name to your project (for instance, +CI-CCR000013+) . The workdirectory will contain - execution data related to each run, e.g. wrapper scripts, system information, inputs and outputs. + 2. Change the project name to your project (for instance, +CI-CCR000013+) . + The workdirectory will contain execution data related to each run, e.g. + wrapper scripts, system information, inputs and outputs. -*step 5.* Run the example using following commandline (also found in run.sh): +*step 5.* Run the example using following commandline: ---- $ swift -config cf -tc.file tc -sites.file sites.xml catsn.swift -n=1 @@ -37,11 +51,6 @@ *step 6.* Check the output in the generated +outdir+ directory (+ls outdir+) -Note: Running from sandbox node or requesting 1 hour walltime for upto 3 nodes -will get fast prioritized execution. Good for small tests -Swift supports a coasters based computing environment for Beagle. A detailed version of Swift documentation is maintained -http://www.ci.uchicago.edu/swift/docs/index.php[here]. - // //Intrepid-BG/P //~~~~~~~~~~~~~ Modified: trunk/docs/cookbook/overview =================================================================== --- trunk/docs/cookbook/overview 2013-02-04 19:37:36 UTC (rev 6234) +++ trunk/docs/cookbook/overview 2013-02-05 15:10:54 UTC (rev 6235) @@ -1,11 +1,11 @@ Overview -------- -This cookbook covers various recipes involving setting up and running Swift under diverse -configurations based on the application requirements and the underlying -infrastructures. The Swift system comprises of SwiftScript language and the -Swift runtime system. For -introductory material, consult the Swift tutorial found +This cookbook covers recipes involving setting up and running Swift +under various computational systems based on the application requirements and the +underlying infrastructures. The Swift framework comprises of a scripting language +and the Swift runtime system. For introductory material, consult the Swift +tutorial found link:http://www.ci.uchicago.edu/swift/guides/trunk/tutorial/tutorial.html[here]. -WARNING: Please be warned that the cookbook is under construction and the recipes are not tested rigorously. +WARNING: Note that the cookbook is under construction and the recipes presented here are not tested rigorously. From ketan at ci.uchicago.edu Tue Feb 5 09:43:43 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Tue, 5 Feb 2013 09:43:43 -0600 (CST) Subject: [Swift-commit] r6236 - in trunk/docs: . cookbook utils Message-ID: <20130205154343.B834C9CC9C@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-05 09:43:43 -0600 (Tue, 05 Feb 2013) New Revision: 6236 Modified: trunk/docs/build_docs.sh trunk/docs/cookbook/debugging trunk/docs/utils/gensites.txt Log: build script mods for mac Modified: trunk/docs/build_docs.sh =================================================================== --- trunk/docs/build_docs.sh 2013-02-05 15:10:54 UTC (rev 6235) +++ trunk/docs/build_docs.sh 2013-02-05 15:43:43 UTC (rev 6236) @@ -57,8 +57,14 @@ chmod $CHMOD_DIRECTORY_MODE $INSTALLATION_DIRECTORY > /dev/null 2>&1 fi +unamestr=`\uname` +if [[ "$unamestr" == 'Linux' ]]; then + pushd $(dirname $(readlink -f $0)) > /dev/null 2>&1 +else + pushd $(dirname $(greadlink -f $0)) > /dev/null 2>&1 +fi + # Gather version information -pushd $(dirname $(readlink -f $0)) > /dev/null 2>&1 pushd .. > /dev/null 2>&1 VERSION=`svn info |grep URL|awk -F / '{print $NF}'` popd > /dev/null 2>&1 Modified: trunk/docs/cookbook/debugging =================================================================== --- trunk/docs/cookbook/debugging 2013-02-05 15:10:54 UTC (rev 6235) +++ trunk/docs/cookbook/debugging 2013-02-05 15:43:43 UTC (rev 6236) @@ -1,17 +1,23 @@ Debugging Swift --------------- -Swift errors are logged in several places: +Swift errors are logged in several places. In case of errors, following places +should be inspected for clues: + . All text from standard output and standard error produced by running the swift command + . The .log file from this run. It will be named script.uniqueID.log where "script" is the name of your *.swift script source file, and uniqueID is a long unique id which starts with the date and time you ran the swift command. + . $HOME/.globus/coasters directory on remote machines on which you are running coasters + . $HOME/.globus/scripts directory on the host on which you run the Swift command, when swift is submitting to a local scheduler (Condor, PBS, SGE, Cobalt) + . $HOME/.globus/??? on remote systems that you access via Globus Modified: trunk/docs/utils/gensites.txt =================================================================== --- trunk/docs/utils/gensites.txt 2013-02-05 15:10:54 UTC (rev 6235) +++ trunk/docs/utils/gensites.txt 2013-02-05 15:43:43 UTC (rev 6236) @@ -51,18 +51,11 @@ ----- Running this command will print some information about the template and give -you an idea of what settings you will need to specify. You should see -something like this: +you an idea of what settings you will need to specify. ------ -Description: Template for Intrepid. More information about this system can be found at http://www.alcf.anl.gov/support/gettingstarted/index.php -Required Tokens: host work project queue ------ +The required tokens are required to properly use the templates. These are +placeholder values you will need to specify in the following steps. -The required tokens are required to properly use the templates. These are placeholder -values you will need to specify in the -following steps. - Providing Site Specific Values ------------------------------ From ketan at ci.uchicago.edu Tue Feb 5 20:30:50 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Tue, 5 Feb 2013 20:30:50 -0600 (CST) Subject: [Swift-commit] r6237 - in trunk/docs: cookbook userguide Message-ID: <20130206023050.1231D9CC92@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-05 20:30:49 -0600 (Tue, 05 Feb 2013) New Revision: 6237 Modified: trunk/docs/cookbook/log_processing trunk/docs/userguide/log-processing Log: log processing Modified: trunk/docs/cookbook/log_processing =================================================================== --- trunk/docs/cookbook/log_processing 2013-02-05 15:43:43 UTC (rev 6236) +++ trunk/docs/cookbook/log_processing 2013-02-06 02:30:49 UTC (rev 6237) @@ -2,7 +2,7 @@ --------------- To properly generate log plots, you must enable VDL/Karajan logging. Make sure -log4.properties contains: +log4j.properties contains: ---- log4j.logger.swift=DEBUG log4j.logger.org.globus.cog.abstraction.coaster.service.job.manager.Cpu=DEBUG Modified: trunk/docs/userguide/log-processing =================================================================== --- trunk/docs/userguide/log-processing 2013-02-05 15:43:43 UTC (rev 6236) +++ trunk/docs/userguide/log-processing 2013-02-06 02:30:49 UTC (rev 6237) @@ -3,71 +3,24 @@ -------------- To properly generate log plots, you must enable VDL/Karajan logging. -TODO:How? +This can be done by putting the following lines in log4j.properties file found in the /etc directory of Swift installation: -You should check the scripts that you intend to use to determine -what log lines they require and ensure that you are generating -those lines via log4j.properties - -Make sure log4.properties contains: -------------------------------------- log4j.logger.swift=DEBUG log4j.logger.org.globus.cog.abstraction.coaster.service.job.manager.Cpu=DEBUG log4j.logger.org.globus.cog.abstraction.coaster.service.job.manager.Block=DEBUG -------------------------------------- -TODO: Does it work for coasters-based runs only? -Meaning and interpretation of Swift log messages -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +All the executables, zsh and perl scripts mentioned in the following steps are +available in the libexec/log-processing directory of your Swift installation. -A Swift log file is typically a text file with the name of the Swift run and -its timestamp in the filename and an extension ".log". In addition, a ".rlog" -file is Swift's resume log which is used by Swift when a run is resumed using -the "-resume" option. The .rlog file is only for Swift's internal purpose and -not to be interpreted by the user. - -Each line in the log file is typically made up of three parts. The first part -is the timestamp, the second is the type of log message and the third is the -message itself. The types of log messages follows the java log4j standard types -of TRACE, DEBUG, INFO, WARN, ERROR and FATAL. This section lists the various -Swift log messages and explains the meaning and likely interpretation of those -messages. Please note that the list is not comprehensive at this time. Also -note that we will ignore the timestamps here. - -. _DEBUG Loader arguments: [-sites.file, sites.xml, -config, cf, -tc.file, tc, postproc-gridftp.swift]_ -. _DEBUG Loader Max heap: 5592449024_ -. _DEBUG textfiles BEGIN_ -. _DEBUG Loader kmlversion is_ -. _DEBUG VDL2ExecutionContext Stack dump_ -. _INFO SetFieldValue Set_ -. _INFO get__site STARTCOMPOUND thread=0-8 name=get__site_ -. _INFO vdl:execute START thread=0-8-0 tr=_ -. _INFO GlobalSubmitQueue No global submit throttle set. Using default (1024)_ -. _DEBUG vdl:execute2 THREAD_ASSOCIATION jobid=getsite-ymj72ook thread=0-8-0-1 host=localhost replicationGroup=xmj72ook_ -. _DEBUG vdl:execute2 JOB_START jobid=getsite-ymj72ook tr=getsite arguments=[644] tmpdir=postproc-gridftp-20120319-0942-adf1o1u2/jobs/y/getsite-ymj72ook host=localhost_ -. _INFO GridExec TASK_DEFINITION_ -. _WARN RemoteConfiguration Find: http://140.221.8.62:38260_ -. _INFO AbstractStreamKarajanChannel$Multiplexer Multiplexer 0 started_ -. _INFO AbstractStreamKarajanChannel$Multiplexer (0) Scheduling SC-null for addition_ -. _INFO AbstractStreamKarajanChannel Channel configured_ -. _INFO MetaChannel MetaChannel: 651528505[1478354072: {}] -> null.bind -> SC-null_ -. _INFO ReadBuffer Will ask for 1 buffers for a size of 6070_ -. _INFO ThrottleManager O maxBuffers=512, crtBuffers=0, allowedTransfers=256, active=0, suspended=0_ -. _INFO ThrottleManager mem=113.54 MB, heap=482.88 MB, maxHeap=5.21 GB_ -. _INFO ThrottleManager I maxBuffers=512, crtBuffers=0, allowedTransfers=256, active=0, suspended=0_ -. _INFO PerformanceDiagnosticInputStream [MEM] Heap total: 482.88 MB, Heap used: 118.58 MB_ -. _INFO vdl:execute END_SUCCESS thread=0-8-0 tr=getsite_ -. _INFO WeightedHostScoreScheduler CONTACT_SELECTED host=localhost, score=99.854_ -. _ - - Log plotting ~~~~~~~~~~~~ Normalize event times in the log to the run start time ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -* Generate the log, assuming the log is titled +swift-run.log+ +* Generate the normalized log, assuming the log is titled +swift-run.log+ ------------------------------------------ ./normalize-log.pl file.contains.start.time swift-run.log > swift-run.norm @@ -148,3 +101,48 @@ ------------------------------------------ swift_plotter.zsh -s buckets.cfg buckets.eps buckets.data ------------------------------------------ + + +Meaning and interpretation of Swift log messages +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A Swift log file is typically a text file with the name of the Swift run and +its timestamp in the filename and an extension ".log". In addition, a ".rlog" +file is Swift's resume log which is used by Swift when a run is resumed using +the "-resume" option. The .rlog file is only for Swift's internal purpose and +not to be interpreted by the user. + +Each line in the log file is typically made up of three parts. The first part +is the timestamp, the second is the type of log message and the third is the +message itself. The types of log messages follows the java log4j standard types +of TRACE, DEBUG, INFO, WARN, ERROR and FATAL. This section lists the various +Swift log messages and explains the meaning and likely interpretation of those +messages. Please note that the list is not comprehensive at this time. Also +note that we will ignore the timestamps here. + +. _DEBUG Loader arguments: [-sites.file, sites.xml, -config, cf, -tc.file, tc, postproc-gridftp.swift]_ +. _DEBUG Loader Max heap: 5592449024_ +. _DEBUG textfiles BEGIN_ +. _DEBUG Loader kmlversion is_ +. _DEBUG VDL2ExecutionContext Stack dump_ +. _INFO SetFieldValue Set_ +. _INFO get__site STARTCOMPOUND thread=0-8 name=get__site_ +. _INFO vdl:execute START thread=0-8-0 tr=_ +. _INFO GlobalSubmitQueue No global submit throttle set. Using default (1024)_ +. _DEBUG vdl:execute2 THREAD_ASSOCIATION jobid=getsite-ymj72ook thread=0-8-0-1 host=localhost replicationGroup=xmj72ook_ +. _DEBUG vdl:execute2 JOB_START jobid=getsite-ymj72ook tr=getsite arguments=[644] tmpdir=postproc-gridftp-20120319-0942-adf1o1u2/jobs/y/getsite-ymj72ook host=localhost_ +. _INFO GridExec TASK_DEFINITION_ +. _WARN RemoteConfiguration Find: http://140.221.8.62:38260_ +. _INFO AbstractStreamKarajanChannel$Multiplexer Multiplexer 0 started_ +. _INFO AbstractStreamKarajanChannel$Multiplexer (0) Scheduling SC-null for addition_ +. _INFO AbstractStreamKarajanChannel Channel configured_ +. _INFO MetaChannel MetaChannel: 651528505[1478354072: {}] -> null.bind -> SC-null_ +. _INFO ReadBuffer Will ask for 1 buffers for a size of 6070_ +. _INFO ThrottleManager O maxBuffers=512, crtBuffers=0, allowedTransfers=256, active=0, suspended=0_ +. _INFO ThrottleManager mem=113.54 MB, heap=482.88 MB, maxHeap=5.21 GB_ +. _INFO ThrottleManager I maxBuffers=512, crtBuffers=0, allowedTransfers=256, active=0, suspended=0_ +. _INFO PerformanceDiagnosticInputStream [MEM] Heap total: 482.88 MB, Heap used: 118.58 MB_ +. _INFO vdl:execute END_SUCCESS thread=0-8-0 tr=getsite_ +. _INFO WeightedHostScoreScheduler CONTACT_SELECTED host=localhost, score=99.854_ +. _ + From ketan at ci.uchicago.edu Wed Feb 6 08:24:54 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Wed, 6 Feb 2013 08:24:54 -0600 (CST) Subject: [Swift-commit] r6238 - trunk/libexec/log-processing Message-ID: <20130206142454.ABC879CCFA@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-06 08:24:53 -0600 (Wed, 06 Feb 2013) New Revision: 6238 Modified: trunk/libexec/log-processing/README.txt Log: Update README with notes. most executables mentioned are not available, new README needed Modified: trunk/libexec/log-processing/README.txt =================================================================== --- trunk/libexec/log-processing/README.txt 2013-02-06 02:30:49 UTC (rev 6237) +++ trunk/libexec/log-processing/README.txt 2013-02-06 14:24:53 UTC (rev 6238) @@ -30,6 +30,7 @@ ------------------------------------------ ./normalize-log.pl file.contains.start.time swift-run.log > swift-run.norm ------------------------------------------ +Note: This script not available. Make a basic load plot from Coasters Cpu log lines -------------------------------------------------- @@ -40,12 +41,15 @@ ------------------------------------------ ./cpu-job-load.pl < swift-run.norm > load.data ------------------------------------------ +Note: This script not available. + . Plot with the JFreeChart-based plotter in usertools/plotter: + ------------------------------------------ swift_plotter.zsh -s load.cfg load.eps load.data ------------------------------------------ Note: The load.cfg is available from swift/libexec/log-processing/ +Note: This script not available. Make a basic job completion plot from Coasters Cpu log lines @@ -64,6 +68,7 @@ ------------------------------------------ swift_plotter.zsh -s completed.cfg completed.eps completed.data ------------------------------------------ +Note: This script not available. Make a basic Block allocation plot from Coasters Block log lines ---------------------------------------------------------------- @@ -75,12 +80,14 @@ ------------------------------------------ ./block-level.pl < swift-run.norm > blocks.data ------------------------------------------ +Note: This script not available. . Plot with the JFreeChart-based plotter in usertools/plotter: + ------------------------------------------ swift_plotter.zsh -s blocks.{cfg,eps,data} ------------------------------------------ +Note: This script not available. Make a job run time distribution plot from Coasters Cpu log lines ----------------------------------------------------------------- @@ -98,12 +105,14 @@ ------------------------------------------ ./buckets.pl 1 times.data > buckets.data ------------------------------------------ +Note: This script not available. . Plot with the JFreeChart-based plotter in usertools/plotter: + ------------------------------------------ swift_plotter.zsh -s buckets.cfg buckets.eps buckets.data ------------------------------------------ +Note: This script not available. == Utilities From ketan at ci.uchicago.edu Wed Feb 6 08:56:06 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Wed, 6 Feb 2013 08:56:06 -0600 (CST) Subject: [Swift-commit] r6239 - in trunk/docs: cookbook documentation Message-ID: <20130206145606.2A2569CCFA@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-06 08:56:06 -0600 (Wed, 06 Feb 2013) New Revision: 6239 Modified: trunk/docs/cookbook/debugging trunk/docs/documentation/building Log: small updates Modified: trunk/docs/cookbook/debugging =================================================================== --- trunk/docs/cookbook/debugging 2013-02-06 14:24:53 UTC (rev 6238) +++ trunk/docs/cookbook/debugging 2013-02-06 14:56:06 UTC (rev 6239) @@ -1,23 +1,23 @@ Debugging Swift --------------- -Swift errors are logged in several places. In case of errors, following places +Swift errors are logged in several places. In case of a failed Swift run, following places should be inspected for clues: -. All text from standard output and standard error produced by running the -swift command +. Text from standard output and standard error produced by running +Swift . The .log file from this run. It will be named script.uniqueID.log -where "script" is the name of your *.swift script source file, and +where "script" is the name of your Swift script source file, and uniqueID is a long unique id which starts with the date and time you ran the swift command. -. $HOME/.globus/coasters directory on remote machines on which you are -running coasters - . $HOME/.globus/scripts directory on the host on which you run the Swift command, when swift is submitting to a local scheduler (Condor, PBS, SGE, Cobalt) -. $HOME/.globus/??? on remote systems that you access via Globus +. $HOME/.globus/coasters directory on remote machines on which you are +running coasters +. $HOME/.globus/* files on remote systems accessed via Coaster providers + Modified: trunk/docs/documentation/building =================================================================== --- trunk/docs/documentation/building 2013-02-06 14:24:53 UTC (rev 6238) +++ trunk/docs/documentation/building 2013-02-06 14:56:06 UTC (rev 6239) @@ -10,6 +10,7 @@ * asciidoc and a2x (http://www.methods.co.nz/asciidoc) * dblatex (http://dblatex.sourceforge.net) * source-highlight (http://www.gnu.org/software/src-highlite) +* For Mac OSX users only: coreutils (installation via macports recommended) For CI users, compiled versions of these packages can be found in ~davidk. From ketan at ci.uchicago.edu Thu Feb 7 08:06:23 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Thu, 7 Feb 2013 08:06:23 -0600 (CST) Subject: [Swift-commit] r6240 - trunk/docs/cookbook Message-ID: <20130207140623.818B39CC9C@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-07 08:06:21 -0600 (Thu, 07 Feb 2013) New Revision: 6240 Modified: trunk/docs/cookbook/infrastructures Log: minor mods Modified: trunk/docs/cookbook/infrastructures =================================================================== --- trunk/docs/cookbook/infrastructures 2013-02-06 14:56:06 UTC (rev 6239) +++ trunk/docs/cookbook/infrastructures 2013-02-07 14:06:21 UTC (rev 6240) @@ -1,5 +1,5 @@ -Swift on Diverse Infrastructures ---------------------------------- +Swift on Computational Infrastructures +-------------------------------------- Beagle ~~~~~~ From ketan at ci.uchicago.edu Thu Feb 7 14:20:42 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Thu, 7 Feb 2013 14:20:42 -0600 (CST) Subject: [Swift-commit] r6241 - trunk/docs/cookbook Message-ID: <20130207202042.681AD9CCF8@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-07 14:20:42 -0600 (Thu, 07 Feb 2013) New Revision: 6241 Modified: trunk/docs/cookbook/infrastructures Log: adding fusion Modified: trunk/docs/cookbook/infrastructures =================================================================== --- trunk/docs/cookbook/infrastructures 2013-02-07 14:06:21 UTC (rev 6240) +++ trunk/docs/cookbook/infrastructures 2013-02-07 20:20:42 UTC (rev 6241) @@ -1,6 +1,26 @@ Swift on Computational Infrastructures -------------------------------------- +Introduction +~~~~~~~~~~~~ + +We will use the following Swift example, called "catsn" throughout the present section of this cookbook: + +---- +type file; + +app (file o) cat (file i) +{ + cat @i stdout=@o; +} + +file out[]; +foreach j in [1:@toint(@arg("n","1"))] { + file data<"data.txt">; + out[j] = cat(data); +} +---- + Beagle ~~~~~~ Beagle is a University of Chicago's Computational Institute super computer @@ -63,7 +83,7 @@ To execute your Swift script on the PADS cluster use this command: ---- -swift -tc.file tc -sites.file pbs.xml modis.swift +swift -tc.file tc -sites.file pbs.xml catsn.swift ---- where the contents of a simple pbs.xml sites file could be: [xml] @@ -81,6 +101,41 @@ source~~~~ +Fusion +~~~~~~ +Fusion is an Argonne-LCRC computational facility. More information on Fusion can be found link:http://www.lcrc.anl.gov/using-fusion[here]. + +In the current section, we present a recipe to use Swift on Fusion system. +Fusion employs a PBS schedular. Consequently, we will use the Coasters PBS provider. +The jobmanager string will be "local:pbs" as follows: + +---- + +---- + +The complete sites.xml file is as follows: + +[xml] +source~~~~ + + + + ProteinPrediction + batch + 1000 + 1 + 2 + 2 + + 0.23 + + + /fusion/gpfs/home/${HOME}/SwiftWork + + +source~~~~ + + OSG ~~~ This section describes how to get Swift running on the OSG Grid. We will use a From hategan at ci.uchicago.edu Fri Feb 8 22:36:01 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Fri, 8 Feb 2013 22:36:01 -0600 (CST) Subject: [Swift-commit] r6242 - branches/faster/resources Message-ID: <20130209043601.B4FD29CC9C@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-08 22:36:01 -0600 (Fri, 08 Feb 2013) New Revision: 6242 Modified: branches/faster/resources/Karajan-no-provenance.stg branches/faster/resources/Karajan.stg Log: fixed various issues in code generation Modified: branches/faster/resources/Karajan-no-provenance.stg =================================================================== --- branches/faster/resources/Karajan-no-provenance.stg 2013-02-07 20:20:42 UTC (rev 6241) +++ branches/faster/resources/Karajan-no-provenance.stg 2013-02-09 04:36:01 UTC (rev 6242) @@ -11,4 +11,8 @@ range(from, to, step, datatype) ::= <> +slicearray(parent, memberchild, datatype) ::= << + swift:sliceArray($parent$, "$memberchild$", "$datatype$") +>> + cs() ::= << >> Modified: branches/faster/resources/Karajan.stg =================================================================== --- branches/faster/resources/Karajan.stg 2013-02-07 20:20:42 UTC (rev 6241) +++ branches/faster/resources/Karajan.stg 2013-02-09 04:36:01 UTC (rev 6242) @@ -19,8 +19,8 @@ $endif$ $constants;separator="\n"$ +$declarations;separator="\n"$ $procedures;separator="\n"$ -$declarations;separator="\n"$ $if(statements)$ restartLog() { @@ -33,6 +33,7 @@ ) } $endif$ + $cleanups:swift_cleandataset();separator="\n"$ swift:cleanDataset(shutdown=true) >> @@ -78,7 +79,7 @@ >> compound(outputs, inputs, declarations, statements, config, name, initWaitCounts, cleanups) ::= << -unitStart("COMPOUND", name="$name$", outputs="$outputs:list();separator=","$") +swift:unitStart("COMPOUND", name="$name$", outputs="$outputs:list();separator=","$") $if(initWaitCounts)$ $initWaitCounts;separator="\n"$ $endif$ @@ -90,7 +91,7 @@ $outputs:swift_closedataset();separator="\n"$ $cleanups:swift_cleandataset();separator="\n"$ -unitEnd("COMPOUND", name="$name$") +swift:unitEnd("COMPOUND", name="$name$") >> proc_args(args) ::= << @@ -110,7 +111,7 @@ >> swift_execute(outputs,inputs,attributes,application,name,line) ::= << -unitStart("PROCEDURE", name="$name$", line="$line$", outputs="$outputs:list();separator=","$") +swift:unitStart("PROCEDURE", name="$name$", line="$line$", outputs="$outputs:list();separator=","$") swift:execute( $attributes$ swift:tr("$application.exec$") @@ -119,7 +120,7 @@ $swift_arguments(attributes=application.attributes,arguments=application.arguments, stdin=application.stdin,stdout=application.stdout,stderr=application.stderr)$ ) $outputs:swift_closedataset();separator="\n"$ -unitEnd("PROCEDURE", name="$name$", line="$line$") +swift:unitEnd("PROCEDURE", name="$name$", line="$line$") >> log_param(dir) ::= << @@ -165,7 +166,7 @@ swift_attributes(entries) ::= << swift:attributes( - map( + map:map( $entries;separator="\n"$ ) ) @@ -197,7 +198,7 @@ iterate(declarations,statements,cond,var,cleanups,trace,line) ::= << sys:while($var$, 0) { - if (vdl:getFieldValue($cond$)) { + if (swift:getFieldValue($cond$)) { $sub_comp(declarations=declarations, statements=statements, cleanups=cleanups)$ next($var$ + 1) } @@ -205,21 +206,22 @@ >> foreach(var, in, indexVar, indexVarType, declarations, statements, line, refs, selfClose, cleanups, trace) ::= << -swift:tParallelFor(\$, _traceline="$line$"$if(indexVar)$, _kvar="$indexVar$"$endif$, _vvar="$var$"$if(selfClose)$, selfClose="true"$endif$$if(refs)$, refs="$refs;separator=" "$"$endif$, +swift:tParallelFor(\$, _traceline="$line$"$if(indexVar)$, _kvar="$indexVar$"$endif$, _vvar="$var$"$if(selfClose)$, selfClose=true$endif$$if(refs)$, refs="$refs;separator=" "$"$endif$, $! The iterator !$ getArrayIterator($in$)) { (\$\$, $var$) := each(\$) $if(indexVar)$ - $indexVar$ := swift:new($indexVarType$, \$\$) + $indexVar$ := swift:new("$indexVarType$", value=\$\$) $endif$ - unitStart("FOREACH_IT", line="$line$") + + swift:unitStart("FOREACH_IT", line="$line$") $declarations;separator="\n"$ $if(statements)$ $parallel(statements=statements)$ $cleanups:swift_cleandataset();separator="\n"$ $endif$ - unitEnd("FOREACH_IT", line="$line$") + swift:unitEnd("FOREACH_IT", line="$line$") } >> @@ -229,32 +231,35 @@ callInternal(func, outputs, inputs, line, serialize) ::= << sequential( - unitStart("INTERNALPROC", name="$func$", outputs="$outputs:list();separator=","$") + swift:unitStart("INTERNALPROC", name="$func$", outputs="$outputs:list();separator=","$") $func$( $if(!serialize)$parallel($endif$ $outputs:callInternal_log_output();separator="\n"$ $inputs:callInternal_log_input();separator="\n"$ $if(!serialize)$)$endif$ ) - unitEnd("INTERNALPROC", name="$func$") + swift:unitEnd("INTERNALPROC", name="$func$") ) >> callInternal_log_input() ::= << sequential( - parameterLog("input", "TODO_name_or_pos", vdl:getDatasetProvenanceID($it$)) + swift:parameterLog("input", "TODO_name_or_pos", vdl:getDatasetProvenanceID($it$)) $it$ ) >> callInternal_log_output() ::= << sequential( - parameterLog("output", "TODO_name_or_pos", vdl:getDatasetProvenanceID($it$)) + swift:parameterLog("output", "TODO_name_or_pos", vdl:getDatasetProvenanceID($it$)) $it$ ) >> callUserDefined(func, outputs, inputs, line, serialize, partialClose) ::= << +$if(partialClose)$ +sequential( +$endif$ $func$( $if(!serialize)$parallel($endif$ $outputs;separator=", "$ @@ -263,6 +268,7 @@ ) $if(partialClose)$ $partialClose$ +) $endif$ >> @@ -297,7 +303,7 @@ >> variable_log() ::= << - parameterLog("intermediate", "$name$", swift:getDatasetProvenanceID($name$)) + swift:parameterLog("intermediate", "$name$", swift:getDatasetProvenanceID($name$)) >> swift_mapping(mapping, file) ::= << @@ -313,39 +319,45 @@ >> assign(var, value, line, partialClose) ::= << +$if(partialClose)$ +sequential( +$endif$ swift:setFieldValue($if(line)$_traceline="$line$"$endif$ $var$ $value$ ) $if(partialClose)$ -$partialClose$ +$partialClose$) $endif$ >> append(array, value, partialClose) ::= << +$if(partialClose)$ +sequential( +$endif$ swift:appendArray( $array$ $value$ ) $if(partialClose)$ -$partialClose$ +$partialClose$) $endif$ >> callexpr(call, datatype, prefix) ::= << sequential( - tmp := swift:new("$datatype$", dbgname="swift#callintermediate", + swift#callintermediate := swift:new("$datatype$", dbgname="swift#callintermediate", swift:mapping("concurrent_mapper", swift:parameter("prefix", "_callintermediate-$prefix$") ) ) $call$ - tmp + swift#callintermediate ) >> array(elements, datatype) ::= << -swift:createarray( +swift:createArray( list( $elements;separator="\n"$ ) @@ -356,21 +368,24 @@ sequential( tmp := swift:range($from$, $to$$if(step)$, step = $step$$endif$) tmp - $range_log()$ + $range_log(from=from, to=to, step=step, out=tmp)$ ) >> -range_log() ::= << +range_log(from, to, step, out) ::= << + swift:log(INFO, str:concat("ARRAYRANGE thread=", currentThread(), " array=", getDatasetProvenanceId($out$), + " from=", getDatasetProvenanceId($from$), "to=", getDatasetProvenanceId($to$) + $if(step)$", step=", getDatasetProvenanceId($step$)$else$, "step=none"$endif$)) >> if(condition,vthen,velse,line,trace) ::= << if (swift:getFieldValue($condition$)) { - unitStart("CONDITION_BLOCK") + swift:unitStart("CONDITION_BLOCK") $vthen$ } $if(velse)$ else { - unitStart("CONDITION_BLOCK") + swift:unitStart("CONDITION_BLOCK") $velse$ } $endif$ @@ -394,7 +409,7 @@ if (swift:getFieldValue(swiftop:eq(swc, $case.value$))) { $sub_comp(declarations=case.declarations, statements=case.statements)$ } - else + $if(rest(cases))$else$else$$if(sdefault)$else$endif$$endif$ }$ $if(sdefault)$ { @@ -419,19 +434,20 @@ partialclose(var, count) ::= << -partialCloseDataset($var$$if(count)$, count=$count$$endif$) +swift:partialCloseDataset($var$$if(count)$, count=$count$$endif$) >> setWaitCount(name, waitCount) ::= << -setWaitCount($name$$if(waitCount)$, count=$waitCount$$endif$) +swift:setWaitCount($name$$if(waitCount)$, count=$waitCount$$endif$) + >> unitStart(type, outputs) ::= << - unitStart("$type$", outputs="$outputs$") +swift:unitStart("$type$", outputs="$outputs$") >> unitEnd(type) ::= << - unitEnd("$type$") + swift:unitEnd("$type$") >> operator ::= [ @@ -472,22 +488,24 @@ >> extractarrayelement(parent, arraychild, datatype) ::= << -swift:getfieldsubscript($parent$, $arraychild$) +swift:getFieldSubscript($parent$, $arraychild$) >> extractstructelement(parent, memberchild, datatype) ::= << -getfield($parent$, $memberchild$) +getField($parent$, "$memberchild$") >> slicearray(parent, memberchild, datatype) ::= << sequential( - slice := swift:sliceArray($parent$, $memberchild$, $datatype$) - logSliceArray($memberchild$, $parent$) + slice := swift:sliceArray($parent$, "$memberchild$", "$datatype$") + $logSliceArray(memberchild=memberchild, array=parent, slice=slice)$ slice ) >> -logSliceArray(memberchild, array) ::= << +logSliceArray(memberchild, array, slice) ::= << + swift:log(DEBUG, str:concat("SLICEARRAY thread=", currentThread(), " slice=", swift:getDatasetProvenanceID($slice$), + " member=$member$ array=", swift:getDatasetProvenanceID($array$)) >> From hategan at ci.uchicago.edu Fri Feb 8 22:37:05 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Fri, 8 Feb 2013 22:37:05 -0600 (CST) Subject: [Swift-commit] r6243 - branches/faster/resources Message-ID: <20130209043705.059689CC9C@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-08 22:37:04 -0600 (Fri, 08 Feb 2013) New Revision: 6243 Modified: branches/faster/resources/swiftscript.g Log: fixed escape sequence in string literals; \\b and \\\\b would produce the same result Modified: branches/faster/resources/swiftscript.g =================================================================== --- branches/faster/resources/swiftscript.g 2013-02-09 04:36:01 UTC (rev 6242) +++ branches/faster/resources/swiftscript.g 2013-02-09 04:37:04 UTC (rev 6243) @@ -50,9 +50,7 @@ } String quote(String s) { - String s1 = s.replaceAll("\\\\\"", """); - String s2 = s1.replaceAll("\\\\\\\\", "\\\\"); - return s2; + return s.replaceAll("\\\\\"", """); } } @@ -1287,7 +1285,6 @@ | 'b' | 'f' | '"' - | '\'' | '\\' ) ; From hategan at ci.uchicago.edu Fri Feb 8 22:37:55 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Fri, 8 Feb 2013 22:37:55 -0600 (CST) Subject: [Swift-commit] r6244 - branches/faster/libexec Message-ID: <20130209043755.180669CC9C@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-08 22:37:54 -0600 (Fri, 08 Feb 2013) New Revision: 6244 Modified: branches/faster/libexec/_swiftwrap Log: removed kickstart argument Modified: branches/faster/libexec/_swiftwrap =================================================================== --- branches/faster/libexec/_swiftwrap 2013-02-09 04:37:04 UTC (rev 6243) +++ branches/faster/libexec/_swiftwrap 2013-02-09 04:37:54 UTC (rev 6244) @@ -300,10 +300,6 @@ OUTF=$VALUE shift $SHIFTCOUNT -getarg "-k" "$@" -KICKSTART=$VALUE -shift $SHIFTCOUNT - getarg "-cdmfile" "$@" CDM_FILE= if [ "X$VALUE" != "X" ]; then From hategan at ci.uchicago.edu Fri Feb 8 22:38:08 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Fri, 8 Feb 2013 22:38:08 -0600 (CST) Subject: [Swift-commit] r6245 - branches/faster/libexec Message-ID: <20130209043808.70A7D9CC9C@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-08 22:38:08 -0600 (Fri, 08 Feb 2013) New Revision: 6245 Modified: branches/faster/libexec/swift-int.k branches/faster/libexec/swift.k Log: fixed various issues Modified: branches/faster/libexec/swift-int.k =================================================================== --- branches/faster/libexec/swift-int.k 2013-02-09 04:37:54 UTC (rev 6244) +++ branches/faster/libexec/swift-int.k 2013-02-09 04:38:08 UTC (rev 6245) @@ -284,7 +284,7 @@ dir:make(ldir, host=dhost, provider=provider) policy := cdm:query(query=file) log(LOG:DEBUG, "CDM: {file} : {policy}") - if (policy == "DEFAULT" | policy == "BROADCAST") { + if ((policy == "DEFAULT") | (policy == "BROADCAST")) { restartOnError(2) { task:transfer(srchost=host, srcfile=bname,srcdir=rdir, destdir=ldir, desthost=dhost, destprovider=provider, @@ -367,13 +367,10 @@ replicationGroup, replicationChannel arguments = [], stdin = null, stdout = null, stderr = null, attributes = null) { - log(LOG:INFO, "A ", currentThread()) stagein := list(unique(each(stagein))) stageout := list(unique(each(stageout))) - log(LOG:INFO, "X ", currentThread()) allocateHost(rhost, constraints = jobConstraints(tr, stagein = stagein)) { - log(LOG:INFO, "B ", currentThread()) ddir := initDDir(), (wfdir, sharedDir) := try { @@ -383,7 +380,6 @@ throw(exception("Could not initialize shared directory on {rhost}", exception)) } - log(LOG:INFO, "C ", currentThread()) uid := UID() jobdir := substring(uid, from=0, to=1) jobid := "{tr}-{uid}" @@ -419,7 +415,6 @@ } } - log(LOG:INFO, "D ", currentThread()) setProgress(progress, "Stage in") tmpdir := dircat("{wfdir}/jobs/{jobdir}", jobid) @@ -523,7 +518,7 @@ } else { setProgress(progress, "Failed but can retry") - exception := try(exception(checkErrorFile(rhost, wfdir, jobid, jobdir)), prev) + exception := try(exception(checkErrorFile(rhost, wfdir, jobid, jobdir), prev), prev) log(LOG:DEBUG, "APPLICATION_EXCEPTION jobid={jobid} - Application exception: ", exception) Modified: branches/faster/libexec/swift.k =================================================================== --- branches/faster/libexec/swift.k 2013-02-09 04:37:54 UTC (rev 6244) +++ branches/faster/libexec/swift.k 2013-02-09 04:38:08 UTC (rev 6245) @@ -78,6 +78,7 @@ export(stdin, function(file) { + echo(file) stdin = file } ) @@ -206,8 +207,8 @@ try { execute2( progress, - tr, maybe(arguments=unwrapClosedList(arguments)), - maybe(stdin=stdin), maybe(stdout=stdout), maybe(stderr=stderr), maybe(attributes=attributes), + tr, if(arguments != null, arguments = unwrapClosedList(arguments)), + stdin=stdin, stdout=stdout, stderr=stderr, attributes=attributes, stagein, stageout, restartout, replicationGroup, replicationChannel ) } From hategan at ci.uchicago.edu Fri Feb 8 22:46:54 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Fri, 8 Feb 2013 22:46:54 -0600 (CST) Subject: [Swift-commit] r6246 - in branches/faster/src/org/griphyn/vdl: karajan karajan/lib mapping Message-ID: <20130209044654.D1A9E9CC9C@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-08 22:46:54 -0600 (Fri, 08 Feb 2013) New Revision: 6246 Added: branches/faster/src/org/griphyn/vdl/mapping/ClosedArrayEntries.java branches/faster/src/org/griphyn/vdl/mapping/OpenArrayEntries.java Removed: branches/faster/src/org/griphyn/vdl/karajan/ArrayIndexFutureList.java branches/faster/src/org/griphyn/vdl/karajan/DSHandleFutureWrapper.java branches/faster/src/org/griphyn/vdl/karajan/FuturePairIterator.java branches/faster/src/org/griphyn/vdl/karajan/FutureWrapper.java Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/GetArrayIterator.java branches/faster/src/org/griphyn/vdl/karajan/lib/Tracer.java branches/faster/src/org/griphyn/vdl/mapping/AbstractDataNode.java branches/faster/src/org/griphyn/vdl/mapping/ArrayDataNode.java branches/faster/src/org/griphyn/vdl/mapping/RootArrayDataNode.java branches/faster/src/org/griphyn/vdl/mapping/RootDataNode.java Log: Removed future wrappers. They were deadlock prone since updating them required locking the data node and then the wrapper, while addition of listeners to the wrapper required locking the wrapper first and then the node (to check if closed) Deleted: branches/faster/src/org/griphyn/vdl/karajan/ArrayIndexFutureList.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/ArrayIndexFutureList.java 2013-02-09 04:38:08 UTC (rev 6245) +++ branches/faster/src/org/griphyn/vdl/karajan/ArrayIndexFutureList.java 2013-02-09 04:46:54 UTC (rev 6246) @@ -1,213 +0,0 @@ -/* - * Copyright 2012 University of Chicago - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/* - * Created on Jun 9, 2006 - */ -package org.griphyn.vdl.karajan; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import k.rt.FutureListener; - -import org.globus.cog.karajan.futures.FutureEvaluationException; -import org.globus.cog.karajan.futures.FutureIterator; -import org.globus.cog.karajan.futures.FutureList; -import org.globus.cog.karajan.futures.FutureNotYetAvailable; -import org.griphyn.vdl.mapping.ArrayDataNode; -import org.griphyn.vdl.mapping.DSHandle; - -public class ArrayIndexFutureList implements FutureList, FutureWrapper { - private ArrayList keys; - private Map values; - private LinkedList listeners; - private ArrayDataNode node; - private boolean purged; - - public ArrayIndexFutureList(ArrayDataNode node, Map values) { - this.node = node; - this.values = values; - keys = new ArrayList(); - keys.addAll(values.keySet()); - } - - public Object get(int index) { - synchronized(node) { - Object v = node.getValue(); - if (v instanceof RuntimeException) { - throw (RuntimeException) v; - } - if (!node.isClosed() && index >= keys.size()) { - throw new FutureNotYetAvailable(this); - } - else { - Object key = keys.get(index); - return new Pair(key, values.get(key)); - } - } - } - - public int available() { - synchronized(node) { - return keys.size(); - } - } - - public void addKey(Object key) { - synchronized(node) { - keys.add(key); - } - notifyListeners(); - } - - public FutureIterator futureIterator() { - return new FuturePairIterator(this); - } - - public void close() { - throw new UnsupportedOperationException("Not used here"); - } - - private void purge() { - Set allkeys = new HashSet(values.keySet()); - allkeys.removeAll(keys); - // remaining keys must be added - keys.addAll(allkeys); - purged = true; - } - - public boolean isClosed() { - synchronized(node) { - boolean closed = node.isClosed(); - if (closed && !purged) { - // this is done here because no explicit close() is - // ever called on this object - purge(); - } - return closed; - } - } - - public Object getValue() { - return this; - } - - public DSHandle getHandle() { - return node; - } - - @Override - public void addListener(FutureListener l) { - boolean closed; - synchronized(this) { - if (listeners == null) { - listeners = new LinkedList(); - } - listeners.add(l); - closed = isClosed(); - } - if (closed) { - notifyListeners(); - } - } - - public void notifyListeners() { - List ls; - synchronized(this) { - if (listeners == null) { - return; - } - ls = listeners; - listeners = null; - } - for (FutureListener l : ls) { - l.futureUpdated(this); - } - } - - @Override - public synchronized List getListeners() { - return new LinkedList(listeners); - } - - public int size() { - synchronized(node) { - if (node.isClosed()) { - if (node.getValue() instanceof RuntimeException) { - throw (RuntimeException) node.getValue(); - } - return keys.size(); - } - else { - throw new FutureNotYetAvailable(this); - } - } - } - - public String toString() { - String l; - if (listeners == null) { - l = "no listeners"; - } - else { - l = listeners.size() + " listeners"; - } - if (!isClosed()) { - return "Open, " + keys.size() + " elements, " + l; - } - else { - if (listeners != null) { - System.out.println("Badness"); - } - return "Closed, " + keys.size() + " elements, " + l; - } - } - - public void fail(FutureEvaluationException e) { - synchronized(node) { - node.setValue(e); - } - } - - public FutureEvaluationException getException() { - synchronized(node) { - Object v = node.getValue(); - if (v instanceof FutureEvaluationException) { - return (FutureEvaluationException) v; - } - else { - return null; - } - } - } - - public int listenerCount() { - synchronized(node) { - if (listeners == null) { - return 0; - } - else { - return listeners.size(); - } - } - } -} Deleted: branches/faster/src/org/griphyn/vdl/karajan/DSHandleFutureWrapper.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/DSHandleFutureWrapper.java 2013-02-09 04:38:08 UTC (rev 6245) +++ branches/faster/src/org/griphyn/vdl/karajan/DSHandleFutureWrapper.java 2013-02-09 04:46:54 UTC (rev 6246) @@ -1,115 +0,0 @@ -/* - * Copyright 2012 University of Chicago - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/* - * Created on Jun 8, 2006 - */ -package org.griphyn.vdl.karajan; - -import java.util.LinkedList; -import java.util.List; - -import k.rt.FutureListener; - -import org.globus.cog.karajan.futures.FutureEvaluationException; -import org.griphyn.vdl.mapping.AbstractDataNode; -import org.griphyn.vdl.mapping.DSHandle; - -public class DSHandleFutureWrapper implements FutureWrapper { - private LinkedList listeners; - private AbstractDataNode node; - - public DSHandleFutureWrapper(AbstractDataNode node) { - this.node = node; - } - - public void close() { - node.closeShallow(); - } - - public boolean isClosed() { - return node.isClosed(); - } - - public Object getValue() { - Object v = node.getValue(); - if (v instanceof RuntimeException) { - throw (RuntimeException) v; - } - return v; - } - - public void fail(FutureEvaluationException e) { - node.setValue(e); - } - - @Override - public void addListener(FutureListener l) { - boolean closed; - synchronized(this) { - if (listeners == null) { - listeners = new LinkedList(); - } - WaitingThreadsMonitor.addThread(l, node); - listeners.add(l); - closed = isClosed(); - } - if (closed) { - notifyListeners(); - } - } - - public void notifyListeners() { - List ls; - synchronized(this) { - if (listeners == null) { - return; - } - ls = listeners; - listeners = null; - } - for (FutureListener l : ls) { - WaitingThreadsMonitor.removeThread(l); - l.futureUpdated(this); - } - } - - public int listenerCount() { - synchronized(node) { - if (listeners == null) { - return 0; - } - else { - return listeners.size(); - } - } - } - - @Override - public synchronized List getListeners() { - return new LinkedList(listeners); - } - - public String toString() { - return "F/" + node; - } - - @Override - public DSHandle getHandle() { - return node; - } -} Deleted: branches/faster/src/org/griphyn/vdl/karajan/FuturePairIterator.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/FuturePairIterator.java 2013-02-09 04:38:08 UTC (rev 6245) +++ branches/faster/src/org/griphyn/vdl/karajan/FuturePairIterator.java 2013-02-09 04:46:54 UTC (rev 6246) @@ -1,123 +0,0 @@ -/* - * Copyright 2012 University of Chicago - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/* - * Created on Jun 9, 2006 - */ -package org.griphyn.vdl.karajan; - -import k.rt.FutureListener; -import k.thr.LWThread; - -import org.globus.cog.karajan.futures.FutureEvaluationException; -import org.globus.cog.karajan.futures.FutureIterator; -import org.globus.cog.karajan.futures.FutureIteratorIncomplete; -import org.globus.cog.karajan.futures.FutureNotYetAvailable; - -public class FuturePairIterator implements FutureIterator { - private ArrayIndexFutureList array; - private int crt; - - public FuturePairIterator(ArrayIndexFutureList array) { - this.array = array; - } - - public synchronized boolean hasAvailable() { - return crt < array.available(); - } - - public synchronized int current() { - return crt; - } - - public int count() { - try { - return array.size(); - } - catch (FutureNotYetAvailable e) { - throw new FutureIteratorIncomplete(array, this); - } - } - - public Object peek() { - try { - return array.get(crt); - } - catch (FutureNotYetAvailable e) { - throw new FutureIteratorIncomplete(array, this); - } - } - - public void remove() { - throw new UnsupportedOperationException("remove"); - } - - public synchronized boolean hasNext() { - if (array.isClosed()) { - return crt < array.size(); - } - else { - if (crt < array.available()) { - return true; - } - else { - throw new FutureIteratorIncomplete(array, this); - } - } - } - - public synchronized Object next() { - if (array.isClosed()) { - return array.get(crt++); - } - else { - if (crt < array.available()) { - return array.get(crt++); - } - else { - throw new FutureIteratorIncomplete(array, this); - } - } - } - - public void close() { - // nope - } - - public boolean isClosed() { - return array.isClosed(); - } - - public Object getValue() { - return this; - } - - - - @Override - public void addListener(FutureListener l) { - WaitingThreadsMonitor.addThread(LWThread.currentThread(), array.getHandle()); - array.addListener(l); - - } - - private static volatile int cnt = 0; - - public void fail(FutureEvaluationException e) { - //handled by the list - } -} Deleted: branches/faster/src/org/griphyn/vdl/karajan/FutureWrapper.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/FutureWrapper.java 2013-02-09 04:38:08 UTC (rev 6245) +++ branches/faster/src/org/griphyn/vdl/karajan/FutureWrapper.java 2013-02-09 04:46:54 UTC (rev 6246) @@ -1,35 +0,0 @@ -/* - * Copyright 2012 University of Chicago - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package org.griphyn.vdl.karajan; - -import java.util.List; - -import k.rt.Future; -import k.rt.FutureListener; - -import org.griphyn.vdl.mapping.DSHandle; - -public interface FutureWrapper extends Future { - int listenerCount(); - - List getListeners(); - - void notifyListeners(); - - DSHandle getHandle(); -} Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/GetArrayIterator.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/GetArrayIterator.java 2013-02-09 04:38:08 UTC (rev 6245) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/GetArrayIterator.java 2013-02-09 04:46:54 UTC (rev 6246) @@ -67,7 +67,7 @@ if (logger.isDebugEnabled()) { logger.debug("Using future iterator for " + var); } - return ((ArrayDataNode) var).getFutureList().futureIterator(); + return ((ArrayDataNode) var).entryList(); } } } Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/Tracer.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/Tracer.java 2013-02-09 04:38:08 UTC (rev 6245) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/Tracer.java 2013-02-09 04:46:54 UTC (rev 6246) @@ -19,8 +19,6 @@ import org.apache.log4j.Logger; import org.globus.cog.karajan.analyzer.VariableNotFoundException; import org.globus.cog.karajan.compiled.nodes.Node; -import org.griphyn.vdl.engine.Karajan; -import org.griphyn.vdl.karajan.FutureWrapper; import org.griphyn.vdl.mapping.AbstractDataNode; import org.griphyn.vdl.mapping.DSHandle; import org.griphyn.vdl.mapping.Mapper; @@ -99,7 +97,7 @@ } private String getType(Node fe) { - String t = Karajan.demangle(fe.getTextualName()); + String t = fe.getTextualName(); String nt = NAME_MAPPINGS.get(t); if (nt == null) { return t; @@ -233,12 +231,14 @@ } public static String getFutureName(Future future) { - if (future instanceof FutureWrapper) { + // TODO + /*if (future instanceof FutureWrapper) { return getVarName(((FutureWrapper) future).getHandle()); } else { return future.toString(); - } + }*/ + return future.toString(); } public static Object unwrapHandle(Object o) { Modified: branches/faster/src/org/griphyn/vdl/mapping/AbstractDataNode.java =================================================================== --- branches/faster/src/org/griphyn/vdl/mapping/AbstractDataNode.java 2013-02-09 04:38:08 UTC (rev 6245) +++ branches/faster/src/org/griphyn/vdl/mapping/AbstractDataNode.java 2013-02-09 04:46:54 UTC (rev 6246) @@ -28,15 +28,13 @@ import java.util.List; import java.util.Map; -import k.rt.Future; +import k.rt.FutureListener; +import k.rt.FutureValue; import k.thr.Yield; import org.apache.log4j.Logger; import org.globus.cog.karajan.compiled.nodes.Node; import org.globus.cog.karajan.futures.FutureNotYetAvailable; -import org.griphyn.vdl.karajan.DSHandleFutureWrapper; -import org.griphyn.vdl.karajan.FutureTracker; -import org.griphyn.vdl.karajan.FutureWrapper; import org.griphyn.vdl.karajan.Loader; import org.griphyn.vdl.type.Field; import org.griphyn.vdl.type.Type; @@ -44,7 +42,7 @@ -public abstract class AbstractDataNode implements DSHandle { +public abstract class AbstractDataNode implements DSHandle, FutureValue { static final String DATASET_URI_PREFIX = "dataset:"; @@ -86,8 +84,8 @@ private String identifier; private Path pathFromRoot; - protected FutureWrapper wrapper; private int writeRefCount; + private List listeners; protected AbstractDataNode(Field field) { this.field = field; @@ -631,7 +629,8 @@ logger.debug("Waiting for " + this); } - Yield y = new FutureNotYetAvailable(getFutureWrapper()); + System.out.println("Wait"); + Yield y = new FutureNotYetAvailable(this); y.getState().addTraceElement(who); throw y; } @@ -651,7 +650,7 @@ logger.debug("Waiting for " + this); } - throw new OOBYield(new FutureNotYetAvailable(getFutureWrapper()), this); + throw new OOBYield(new FutureNotYetAvailable(this), this); } else { if (logger.isDebugEnabled()) { @@ -667,26 +666,31 @@ throw new UnsupportedOperationException(); } - public synchronized Future getFutureWrapper() { - if (wrapper == null) { - wrapper = new DSHandleFutureWrapper(this); - FutureTracker.get().add(this, wrapper); + public void addListener(FutureListener l) { + boolean closed; + synchronized(this) { + if (this.listeners == null) { + this.listeners = new ArrayList(); + } + this.listeners.add(l); + closed = this.closed; } - return wrapper; + if (closed) { + notifyListeners(); + } } - + protected void notifyListeners() { - FutureWrapper wrapper; + List l; synchronized(this) { - wrapper = this.wrapper; - if (closed) { - FutureTracker.get().remove(this); - this.wrapper = null; + l = this.listeners; + this.listeners = null; + } + if (l != null) { + for (FutureListener ll : l) { + ll.futureUpdated(this); } } - if (wrapper != null) { - wrapper.notifyListeners(); - } } public synchronized void clean() { @@ -715,7 +719,7 @@ @Override public synchronized int updateWriteRefCount(int delta) { this.writeRefCount += delta; - + if (this.writeRefCount < 0) { throw new IllegalArgumentException("Reference count mismatch for " + this + ". Count is " + this.writeRefCount); } Modified: branches/faster/src/org/griphyn/vdl/mapping/ArrayDataNode.java =================================================================== --- branches/faster/src/org/griphyn/vdl/mapping/ArrayDataNode.java 2013-02-09 04:38:08 UTC (rev 6245) +++ branches/faster/src/org/griphyn/vdl/mapping/ArrayDataNode.java 2013-02-09 04:46:54 UTC (rev 6246) @@ -20,18 +20,16 @@ */ package org.griphyn.vdl.mapping; +import java.util.ArrayList; import java.util.List; import java.util.Map; -import k.rt.Future; - -import org.globus.cog.karajan.futures.FutureList; import org.globus.cog.karajan.futures.FutureNotYetAvailable; -import org.griphyn.vdl.karajan.ArrayIndexFutureList; -import org.griphyn.vdl.karajan.FutureTracker; import org.griphyn.vdl.type.Field; public class ArrayDataNode extends DataNode { + private List> keyList; + protected ArrayDataNode(Field field, DSHandle root, DSHandle parent) { super(field, root, parent); } @@ -39,7 +37,7 @@ public void getFringePaths(List list, Path parentPath) throws HandleOpenException { checkMappingException(); if (!isClosed()) { - throw new FutureNotYetAvailable(getFutureWrapper()); + throw new FutureNotYetAvailable(this); } Map, DSHandle> handles = getHandles(); synchronized (this) { @@ -93,13 +91,12 @@ } private void addKey(Comparable key) { - ArrayIndexFutureList w; - synchronized(this) { - w = (ArrayIndexFutureList) wrapper; - } - if (w != null) { - w.addKey(key); - } + synchronized(this) { + if (keyList != null) { + keyList.add(key); + } + } + notifyListeners(); } @Override @@ -108,20 +105,27 @@ addKey(key); return h; } - - @Override - public synchronized Future getFutureWrapper() { - if (wrapper == null) { - wrapper = new ArrayIndexFutureList(this, this.getArrayValue()); - FutureTracker.get().add(this, wrapper); + + public Iterable> entryList() { + synchronized(this) { + if (isClosed()) { + return new ClosedArrayEntries(getArrayValue()); + } + else { + keyList = new ArrayList>(getArrayValue().keySet()); + return new OpenArrayEntries(keyList, getArrayValue(), this); + } } - return wrapper; } + + @Override + public void closeShallow() { + super.closeShallow(); + synchronized(this) { + keyList = null; + } + } - public FutureList getFutureList() { - return (FutureList) getFutureWrapper(); - } - protected void getFields(List fields, Path path) throws InvalidPathException { if (path.isEmpty()) { fields.add(this); @@ -130,7 +134,7 @@ Path rest = path.butFirst(); if (path.isWildcard(0)) { if (!isClosed()) { - throw new FutureNotYetAvailable(getFutureWrapper()); + throw new FutureNotYetAvailable(this); } for (DSHandle handle : getHandles().values()) { ((AbstractDataNode) handle).getFields(fields, rest); Added: branches/faster/src/org/griphyn/vdl/mapping/ClosedArrayEntries.java =================================================================== --- branches/faster/src/org/griphyn/vdl/mapping/ClosedArrayEntries.java (rev 0) +++ branches/faster/src/org/griphyn/vdl/mapping/ClosedArrayEntries.java 2013-02-09 04:46:54 UTC (rev 6246) @@ -0,0 +1,47 @@ +//---------------------------------------------------------------------- +//This code is developed as part of the Java CoG Kit project +//The terms of the license can be found at http://www.cogkit.org/license +//This message may not be removed or altered. +//---------------------------------------------------------------------- + +/* + * Created on Feb 5, 2013 + */ +package org.griphyn.vdl.mapping; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.griphyn.vdl.karajan.Pair; + +public class ClosedArrayEntries implements Iterable> { + private Map, DSHandle> array; + + public ClosedArrayEntries(Map, DSHandle> array) { + this.array = array; + } + + @Override + public Iterator> iterator() { + final Iterator, DSHandle>> it = array.entrySet().iterator(); + return new Iterator>() { + + @Override + public boolean hasNext() { + return it.hasNext(); + } + + @Override + public List next() { + Map.Entry, DSHandle> e = it.next(); + return new Pair(e.getKey(), e.getValue()); + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } +} Added: branches/faster/src/org/griphyn/vdl/mapping/OpenArrayEntries.java =================================================================== --- branches/faster/src/org/griphyn/vdl/mapping/OpenArrayEntries.java (rev 0) +++ branches/faster/src/org/griphyn/vdl/mapping/OpenArrayEntries.java 2013-02-09 04:46:54 UTC (rev 6246) @@ -0,0 +1,78 @@ +//---------------------------------------------------------------------- +//This code is developed as part of the Java CoG Kit project +//The terms of the license can be found at http://www.cogkit.org/license +//This message may not be removed or altered. +//---------------------------------------------------------------------- + +/* + * Created on Feb 5, 2013 + */ +package org.griphyn.vdl.mapping; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; + +import k.rt.ConditionalYield; + +import org.griphyn.vdl.karajan.Pair; + +public class OpenArrayEntries implements Iterable> { + private List> keyList; + private Map, DSHandle> array; + private ArrayDataNode source; + + public OpenArrayEntries(List> keyList, Map, DSHandle> array, ArrayDataNode source) { + this.keyList = keyList; + this.array = array; + this.source = source; + } + + @Override + public Iterator> iterator() { + return new Iterator>() { + private int index = 0; + + @Override + public boolean hasNext() { + synchronized(source) { + if (index < keyList.size()) { + return true; + } + else { + if (source.isClosed()) { + return false; + } + else { + throw new ConditionalYield(source); + } + } + } + } + + @Override + public List next() { + synchronized(source) { + if (index < keyList.size()) { + Comparable key = keyList.get(index++); + return new Pair(key, array.get(key)); + } + else { + if (source.isClosed()) { + throw new NoSuchElementException(); + } + else { + throw new ConditionalYield(source); + } + } + } + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } +} Modified: branches/faster/src/org/griphyn/vdl/mapping/RootArrayDataNode.java =================================================================== --- branches/faster/src/org/griphyn/vdl/mapping/RootArrayDataNode.java 2013-02-09 04:38:08 UTC (rev 6245) +++ branches/faster/src/org/griphyn/vdl/mapping/RootArrayDataNode.java 2013-02-09 04:46:54 UTC (rev 6246) @@ -67,7 +67,7 @@ waitingMapperParam = params.getFirstOpenParamValue(); if (waitingMapperParam != null) { - waitingMapperParam.getFutureWrapper().addListener(this); + waitingMapperParam.addListener(this); if (tracer.isEnabled()) { tracer.trace(getThread(), getDeclarationLine(), getDisplayableName() + " WAIT " + Tracer.getVarName(waitingMapperParam)); @@ -144,7 +144,7 @@ return null; } else { - throw new FutureNotYetAvailable(waitingMapperParam.getFutureWrapper()); + throw new FutureNotYetAvailable(waitingMapperParam); } } Modified: branches/faster/src/org/griphyn/vdl/mapping/RootDataNode.java =================================================================== --- branches/faster/src/org/griphyn/vdl/mapping/RootDataNode.java 2013-02-09 04:38:08 UTC (rev 6245) +++ branches/faster/src/org/griphyn/vdl/mapping/RootDataNode.java 2013-02-09 04:46:54 UTC (rev 6246) @@ -72,7 +72,7 @@ private synchronized void innerInit() throws HandleOpenException { waitingMapperParam = params.getFirstOpenParamValue(); if (waitingMapperParam != null) { - waitingMapperParam.getFutureWrapper().addListener(this); + waitingMapperParam.addListener(this); if (tracer.isEnabled()) { tracer.trace(getThread(), getDeclarationLine(), getDisplayableName() + " WAIT " + Tracer.getVarName(waitingMapperParam)); @@ -260,7 +260,7 @@ return null; } else { - throw new FutureNotYetAvailable(waitingMapperParam.getFutureWrapper()); + throw new FutureNotYetAvailable(waitingMapperParam); } } From hategan at ci.uchicago.edu Fri Feb 8 23:24:09 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Fri, 8 Feb 2013 23:24:09 -0600 (CST) Subject: [Swift-commit] r6247 - branches/faster/src/org/griphyn/vdl/karajan Message-ID: <20130209052409.0547C9CC9C@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-08 23:24:08 -0600 (Fri, 08 Feb 2013) New Revision: 6247 Modified: branches/faster/src/org/griphyn/vdl/karajan/Monitor.java Log: ... Modified: branches/faster/src/org/griphyn/vdl/karajan/Monitor.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/Monitor.java 2013-02-09 04:46:54 UTC (rev 6246) +++ branches/faster/src/org/griphyn/vdl/karajan/Monitor.java 2013-02-09 05:24:08 UTC (rev 6247) @@ -59,7 +59,6 @@ import org.globus.cog.karajan.analyzer.VariableNotFoundException; import org.globus.cog.karajan.compiled.nodes.Node; -import org.griphyn.vdl.engine.Karajan; import org.griphyn.vdl.mapping.AbstractDataNode; import org.griphyn.vdl.mapping.ArrayDataNode; import org.griphyn.vdl.mapping.DSHandle; @@ -166,13 +165,14 @@ } entry.add(sz); String fs; - if (f instanceof FutureWrapper) { + // TODO + /*if (f instanceof FutureWrapper) { fs = String.valueOf(((FutureWrapper) f).listenerCount()); } - else { + else {*/ fs = f.toString(); fs = fs.substring(fs.indexOf(' ') + 1); - } + //} entry.add(fs); entry.add("2"); al.add(entry); @@ -308,7 +308,7 @@ if (o instanceof Node) { Node n = (Node) o; int line = n.getLine(); - return(Karajan.demangle(n.getTextualName()) + ", " + + return(n.getTextualName() + ", " + fileName(n) + ", line " + line); } } @@ -324,7 +324,7 @@ if (o instanceof Node) { Node n = (Node) o; int line = n.getLine(); - ret.add(Karajan.demangle(n.getTextualName()) + ", " + + ret.add(n.getTextualName() + ", " + fileName(n) + ", line " + line); } @@ -491,12 +491,14 @@ public List getListeners(int wrindex) { Object o = wr.get(wrindex); - if (o instanceof FutureWrapper) { + // TODO + /*if (o instanceof FutureWrapper) { return ((FutureWrapper) o).getListeners(); } else { return null; - } + }*/ + return null; } public void mousePressed(MouseEvent e) { From hategan at ci.uchicago.edu Fri Feb 8 23:26:03 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Fri, 8 Feb 2013 23:26:03 -0600 (CST) Subject: [Swift-commit] r6248 - in branches/faster/src/org/griphyn/vdl: engine karajan/lib Message-ID: <20130209052603.C7C909CC9C@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-08 23:26:03 -0600 (Fri, 08 Feb 2013) New Revision: 6248 Modified: branches/faster/src/org/griphyn/vdl/engine/Karajan.java branches/faster/src/org/griphyn/vdl/karajan/lib/UnitStart.java Log: topo-sort procedures since karajan has lexical scoping now; also remove name mangling since things are now case sensitive Modified: branches/faster/src/org/griphyn/vdl/engine/Karajan.java =================================================================== --- branches/faster/src/org/griphyn/vdl/engine/Karajan.java 2013-02-09 05:24:08 UTC (rev 6247) +++ branches/faster/src/org/griphyn/vdl/engine/Karajan.java 2013-02-09 05:26:03 UTC (rev 6248) @@ -26,6 +26,7 @@ import java.io.InputStreamReader; import java.io.PrintStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -268,7 +269,7 @@ } private void processProcedures(Program prog, VariableScope scope) throws CompilationException { - + Map names = new HashMap(); // Keep track of declared procedures // Check for redefinitions of existing procedures Set procsDefined = new HashSet() ; @@ -284,17 +285,63 @@ ps.setInputArgs(proc.getInputArray()); ps.setOutputArgs(proc.getOutputArray()); proceduresMap.put(procName, ps); + names.put(procName, proc); } + + List sorted = new ArrayList(); + Set unmarked = new HashSet(Arrays.asList(prog.getProcedureArray())); + + while (!unmarked.isEmpty()) { + Set tmp = new HashSet(); + visit(unmarked.iterator().next(), unmarked, sorted, tmp, names); + } - for (int i = 0; i < prog.sizeOfProcedureArray(); i++) { - Procedure proc = prog.getProcedureArray(i); + for (Procedure proc : sorted) { procedure(proc, scope); } - } - public StringTemplate program(Program prog) throws CompilationException { + private void visit(Procedure proc, Set unmarked, + List sorted, Set tmp, Map names) throws CompilationException { + if (tmp.contains(proc)) { + throw new CompilationException("Circular procedure dependency detected"); + } + if (unmarked.contains(proc)) { + tmp.add(proc); + Set dupes = new HashSet(); + for (Call c : getCalls(proc, new ArrayList())) { + String name = c.getProc().getLocalPart(); + if (dupes.contains(name)) { + continue; + } + dupes.add(name); + if (names.containsKey(name)) { + visit(names.get(name), unmarked, sorted, tmp, names); + } + else { + // handled later + } + } + unmarked.remove(proc); + sorted.add(proc); + } + } + + private List getCalls(XmlObject o, List l) { + XmlCursor cursor = o.newCursor(); + cursor.selectPath("*"); + while (cursor.toNextSelection()) { + XmlObject child = cursor.getObject(); + if (child instanceof Call) { + l.add((Call) child); + } + getCalls(child, l); + } + return l; + } + + public StringTemplate program(Program prog) throws CompilationException { VariableScope scope = new VariableScope(this, null, prog); scope.bodyTemplate = template("program"); @@ -326,7 +373,7 @@ StringTemplate procST = template("procedure"); containingScope.bodyTemplate.setAttribute("procedures", procST); procST.setAttribute("line", getLine(proc)); - procST.setAttribute("name", mangle(proc.getName())); + procST.setAttribute("name", proc.getName()); for (int i = 0; i < proc.sizeOfOutputArray(); i++) { FormalParameter param = proc.getOutputArray(i); StringTemplate paramST = parameter(param, innerScope); @@ -373,52 +420,7 @@ } } - - /** - * Convert to a case-insensitive representation by - * pre-pending a '_' to upper case letters. If the - * original name contains a '_' it will be converted - * to "__" (two underscores). - */ - public static String mangle(String name) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < name.length(); i++) { - char c = name.charAt(i); - if (Character.isUpperCase(c) || c == '_') { - sb.append('_'); - } - sb.append(Character.toLowerCase(c)); - } - return sb.toString(); - } - - public static String demangle(String name) { - StringBuilder sb = new StringBuilder(); - boolean upper = false; - for (int i = 0; i < name.length(); i++) { - char c = name.charAt(i); - if (c == '_') { - if (upper) { - sb.append("_"); - upper = false; - } - else { - upper = true; - } - } - else { - if (upper) { - upper = false; - sb.append(Character.toUpperCase(c)); - } - else { - sb.append(Character.toLowerCase(c)); - } - } - } - return sb.toString(); - } - + public StringTemplate parameter(FormalParameter param, VariableScope scope) throws CompilationException { StringTemplate paramST = new StringTemplate("parameter"); StringTemplate typeST = new StringTemplate("type"); @@ -456,7 +458,7 @@ if (!var.isNil()) { if (var.getFile() != null) { StringTemplate fileST = new StringTemplate("file"); - fileST.setAttribute("name", escapeQuotes(var.getFile().getName())); + fileST.setAttribute("name", escape(var.getFile().getName())); fileST.defineFormalArgument("params"); variableST.setAttribute("file", fileST); } @@ -480,8 +482,8 @@ mappingST.setAttribute("descriptor", "concurrent_mapper"); StringTemplate paramST = template("swift_parameter"); paramST.setAttribute("name", "prefix"); - paramST.setAttribute("expr", var.getName() + "-" - + UUIDGenerator.getInstance().generateRandomBasedUUID().toString()); + paramST.setAttribute("expr", "\"" + var.getName() + "-" + + UUIDGenerator.getInstance().generateRandomBasedUUID().toString() + "\""); mappingST.setAttribute("params", paramST); variableST.setAttribute("mapping", mappingST); variableST.setAttribute("nil", Boolean.TRUE); @@ -529,7 +531,7 @@ if (param.getAbstractExpression().getDomNode().getNodeName().equals("stringConstant")) { StringTemplate valueST = template("sConst"); valueST.setAttribute("innervalue", param.getAbstractExpression().getDomNode().getFirstChild().getNodeValue()); - paramST.setAttribute("expr",valueST); + paramST.setAttribute("expr", valueST); } else { paramST.setAttribute("expr",variableReferenceST); @@ -706,7 +708,7 @@ throw new CompilationException ("Unknown procedure invocation mode "+proc.getInvocationMode()); } - callST.setAttribute("func", mangle(procName)); + callST.setAttribute("func", procName); callST.setAttribute("line", getLine(call)); /* Does number of input arguments match */ for (int i = 0; i < proc.sizeOfInputArray(); i++) { @@ -1148,7 +1150,7 @@ public StringTemplate function(Function func, VariableScope scope) throws CompilationException { StringTemplate funcST = template("function"); - funcST.setAttribute("name", mangle(func.getName())); + funcST.setAttribute("name", func.getName()); funcST.setAttribute("line", getLine(func)); ProcedureSignature funcSignature = functionsMap.get(func.getName()); if(funcSignature == null) { @@ -1629,7 +1631,7 @@ for (String key : stringInternMap.keySet()) { String variableName = stringInternMap.get(key); StringTemplate st = template("sConst"); - st.setAttribute("innervalue",escapeQuotesAndMarkup(key)); + st.setAttribute("innervalue",escape(key)); StringTemplate vt = template("globalConstant"); vt.setAttribute("name",variableName); vt.setAttribute("expr",st); @@ -1657,27 +1659,16 @@ } } - String escapeQuotes(String in) { - return in.replaceAll("\"", """); - } - String escapeQuotesAndMarkup(String in) { + String escape(String in) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < in.length(); i++) { char c = in.charAt(i); switch (c) { - case '<': - sb.append("<"); - break; - case '>': - sb.append(">"); - break; case '"': - sb.append("""); + sb.append("\\\""); break; - case '&': - sb.append("&"); - break; + default: sb.append(c); } Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/UnitStart.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/UnitStart.java 2013-02-09 05:24:08 UTC (rev 6247) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/UnitStart.java 2013-02-09 05:26:03 UTC (rev 6248) @@ -25,10 +25,9 @@ import org.globus.cog.karajan.analyzer.Scope; import org.globus.cog.karajan.analyzer.Signature; import org.globus.cog.karajan.analyzer.VarRef; -import org.globus.cog.karajan.compiled.nodes.Node; import org.globus.cog.karajan.compiled.nodes.InternalFunction; +import org.globus.cog.karajan.compiled.nodes.Node; import org.globus.cog.karajan.parser.WrapperNode; -import org.griphyn.vdl.engine.Karajan; import org.griphyn.vdl.karajan.WaitingThreadsMonitor; import org.griphyn.vdl.mapping.DSHandle; @@ -117,7 +116,7 @@ String line = this.line.getValue(); if (tracer != null && tracer.isEnabled()) { - tracer.trace(thr, Karajan.demangle(name) + "(" + tracer.trace(thr, name + "(" + formatArguments(thr.getStack()) + ")"); } @@ -139,7 +138,7 @@ else { sb.append(", "); } - sb.append(Karajan.demangle(nr.name)); + sb.append(nr.name); sb.append(" = "); sb.append(Tracer.unwrapHandle(nr.ref.getValue(stack))); } From hategan at ci.uchicago.edu Fri Feb 8 23:26:59 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Fri, 8 Feb 2013 23:26:59 -0600 (CST) Subject: [Swift-commit] r6249 - in branches/faster/src/org/griphyn/vdl/karajan/lib: . swiftscript Message-ID: <20130209052659.D449C9CC9C@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-08 23:26:59 -0600 (Fri, 08 Feb 2013) New Revision: 6249 Added: branches/faster/src/org/griphyn/vdl/karajan/lib/SwiftBinaryOp.java branches/faster/src/org/griphyn/vdl/karajan/lib/SwiftUnaryOp.java Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/Operators.java branches/faster/src/org/griphyn/vdl/karajan/lib/swiftscript/Misc.java Log: fixed all operators to wait for handle value Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/Operators.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/Operators.java 2013-02-09 05:26:03 UTC (rev 6248) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/Operators.java 2013-02-09 05:26:59 UTC (rev 6249) @@ -22,8 +22,6 @@ import org.apache.log4j.Logger; import org.globus.cog.karajan.compiled.nodes.Node; -import org.globus.cog.karajan.compiled.nodes.functions.BinaryOp; -import org.globus.cog.karajan.compiled.nodes.functions.UnaryOp; import org.griphyn.vdl.mapping.AbstractDataNode; import org.griphyn.vdl.mapping.DSHandle; import org.griphyn.vdl.mapping.RootDataNode; @@ -99,9 +97,9 @@ } } - public static class Sum extends BinaryOp { + public static class Sum extends SwiftBinaryOp { @Override - protected DSHandle value(DSHandle v1, DSHandle v2) { + protected DSHandle value(AbstractDataNode v1, AbstractDataNode v2) { Type t = type(v1, v2); DSHandle r; if (t == Types.STRING) { @@ -118,9 +116,9 @@ } } - public static class Difference extends BinaryOp { + public static class Difference extends SwiftBinaryOp { @Override - protected DSHandle value(DSHandle v1, DSHandle v2) { + protected DSHandle value(AbstractDataNode v1, AbstractDataNode v2) { Type t = type(v1, v2); DSHandle r; if (t == Types.INT) { @@ -134,9 +132,9 @@ } } - public static class Product extends BinaryOp { + public static class Product extends SwiftBinaryOp { @Override - protected DSHandle value(DSHandle v1, DSHandle v2) { + protected DSHandle value(AbstractDataNode v1, AbstractDataNode v2) { Type t = type(v1, v2); DSHandle r; if (t == Types.INT) { @@ -150,9 +148,9 @@ } } - public static class FQuotient extends BinaryOp { + public static class FQuotient extends SwiftBinaryOp { @Override - protected DSHandle value(DSHandle v1, DSHandle v2) { + protected DSHandle value(AbstractDataNode v1, AbstractDataNode v2) { DSHandle r = new RootDataNode(Types.FLOAT, getFloat(this, v1) / getFloat(this, v2)); logBinaryProvenance("fquotient", v1, v2, r); return r; @@ -162,18 +160,18 @@ public static class Quotient extends FQuotient { } - public static class IQuotient extends BinaryOp { + public static class IQuotient extends SwiftBinaryOp { @Override - protected DSHandle value(DSHandle v1, DSHandle v2) { + protected DSHandle value(AbstractDataNode v1, AbstractDataNode v2) { DSHandle r = new RootDataNode(Types.INT, getInt(this, v1) / getInt(this, v2)); logBinaryProvenance("iquotient", v1, v2, r); return r; } } - public static class Remainder extends BinaryOp { + public static class Remainder extends SwiftBinaryOp { @Override - protected DSHandle value(DSHandle v1, DSHandle v2) { + protected DSHandle value(AbstractDataNode v1, AbstractDataNode v2) { Type t = type(v1, v2); DSHandle r; if (t == Types.INT) { @@ -187,81 +185,81 @@ } } - public static class LE extends BinaryOp { + public static class LE extends SwiftBinaryOp { @Override - protected DSHandle value(DSHandle v1, DSHandle v2) { + protected DSHandle value(AbstractDataNode v1, AbstractDataNode v2) { DSHandle r = new RootDataNode(Types.BOOLEAN, getFloat(this, v1) <= getFloat(this, v2)); logBinaryProvenance("le", v1, v2, r); return r; } } - public static class GE extends BinaryOp { + public static class GE extends SwiftBinaryOp { @Override - protected DSHandle value(DSHandle v1, DSHandle v2) { + protected DSHandle value(AbstractDataNode v1, AbstractDataNode v2) { DSHandle r = new RootDataNode(Types.BOOLEAN, getFloat(this, v1) >= getFloat(this, v2)); logBinaryProvenance("ge", v1, v2, r); return r; } } - public static class LT extends BinaryOp { + public static class LT extends SwiftBinaryOp { @Override - protected DSHandle value(DSHandle v1, DSHandle v2) { + protected DSHandle value(AbstractDataNode v1, AbstractDataNode v2) { DSHandle r = new RootDataNode(Types.BOOLEAN, getFloat(this, v1) < getFloat(this, v2)); logBinaryProvenance("lt", v1, v2, r); return r; } } - public static class GT extends BinaryOp { + public static class GT extends SwiftBinaryOp { @Override - protected DSHandle value(DSHandle v1, DSHandle v2) { + protected DSHandle value(AbstractDataNode v1, AbstractDataNode v2) { DSHandle r = new RootDataNode(Types.BOOLEAN, getFloat(this, v1) > getFloat(this, v2)); logBinaryProvenance("gt", v1, v2, r); return r; } } - public static class EQ extends BinaryOp { + public static class EQ extends SwiftBinaryOp { @Override - protected DSHandle value(DSHandle v1, DSHandle v2) { + protected DSHandle value(AbstractDataNode v1, AbstractDataNode v2) { DSHandle r = new RootDataNode(Types.BOOLEAN, v1.getValue().equals(v2.getValue())); logBinaryProvenance("eq", v1, v2, r); return r; } } - public static class NE extends BinaryOp { + public static class NE extends SwiftBinaryOp { @Override - protected DSHandle value(DSHandle v1, DSHandle v2) { + protected DSHandle value(AbstractDataNode v1, AbstractDataNode v2) { DSHandle r = new RootDataNode(Types.BOOLEAN, !v1.getValue().equals(v2.getValue())); logBinaryProvenance("ne", v1, v2, r); return r; } } - public static class And extends BinaryOp { + public static class And extends SwiftBinaryOp { @Override - protected DSHandle value(DSHandle v1, DSHandle v2) { + protected DSHandle value(AbstractDataNode v1, AbstractDataNode v2) { DSHandle r = new RootDataNode(Types.BOOLEAN, getBool(this, v1) && getBool(this, v2)); logBinaryProvenance("and", v1, v2, r); return r; } } - public static class Or extends BinaryOp { + public static class Or extends SwiftBinaryOp { @Override - protected DSHandle value(DSHandle v1, DSHandle v2) { + protected DSHandle value(AbstractDataNode v1, AbstractDataNode v2) { DSHandle r = new RootDataNode(Types.BOOLEAN, getBool(this, v1) || getBool(this, v2)); logBinaryProvenance("or", v1, v2, r); return r; } } - public static class Not extends UnaryOp { + public static class Not extends SwiftUnaryOp { @Override - protected DSHandle value(DSHandle v) { + protected DSHandle value(AbstractDataNode v) { DSHandle r = new RootDataNode(Types.BOOLEAN, !getBool(this, v)); logUnaryProvenance("not", v, r); return r; Added: branches/faster/src/org/griphyn/vdl/karajan/lib/SwiftBinaryOp.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/SwiftBinaryOp.java (rev 0) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/SwiftBinaryOp.java 2013-02-09 05:26:59 UTC (rev 6249) @@ -0,0 +1,28 @@ +//---------------------------------------------------------------------- +//This code is developed as part of the Java CoG Kit project +//The terms of the license can be found at http://www.cogkit.org/license +//This message may not be removed or altered. +//---------------------------------------------------------------------- + +/* + * Created on Feb 4, 2013 + */ +package org.griphyn.vdl.karajan.lib; + +import k.rt.Stack; + +import org.globus.cog.karajan.compiled.nodes.functions.BinaryOp; +import org.griphyn.vdl.mapping.AbstractDataNode; +import org.griphyn.vdl.mapping.DSHandle; + +public abstract class SwiftBinaryOp extends BinaryOp { + + @Override + public DSHandle function(Stack stack) { + AbstractDataNode v1 = this.v1.getValue(stack); + v1.waitFor(this); + AbstractDataNode v2 = this.v2.getValue(stack); + v2.waitFor(this); + return value(v1, v2); + } +} Added: branches/faster/src/org/griphyn/vdl/karajan/lib/SwiftUnaryOp.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/SwiftUnaryOp.java (rev 0) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/SwiftUnaryOp.java 2013-02-09 05:26:59 UTC (rev 6249) @@ -0,0 +1,26 @@ +//---------------------------------------------------------------------- +//This code is developed as part of the Java CoG Kit project +//The terms of the license can be found at http://www.cogkit.org/license +//This message may not be removed or altered. +//---------------------------------------------------------------------- + +/* + * Created on Feb 4, 2013 + */ +package org.griphyn.vdl.karajan.lib; + +import k.rt.Stack; + +import org.globus.cog.karajan.compiled.nodes.functions.UnaryOp; +import org.griphyn.vdl.mapping.AbstractDataNode; +import org.griphyn.vdl.mapping.DSHandle; + +public abstract class SwiftUnaryOp extends UnaryOp { + + @Override + public DSHandle function(Stack stack) { + AbstractDataNode v1 = this.v1.getValue(stack); + v1.waitFor(this); + return value(v1); + } +} Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/swiftscript/Misc.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/swiftscript/Misc.java 2013-02-09 05:26:03 UTC (rev 6248) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/swiftscript/Misc.java 2013-02-09 05:26:59 UTC (rev 6249) @@ -326,7 +326,7 @@ @Override protected Signature getSignature() { - return new Signature(params("array", optional("delim", new RootDataNode(Types.STRING, ", ")))); + return new Signature(params("array", "delim")); } @Override @@ -419,7 +419,7 @@ @Override protected Signature getSignature() { - return new Signature(params("str")); + return new Signature(params("str"), returns(channel("...", 1))); } @Override @@ -450,9 +450,20 @@ @Override public Object function(Stack stack) { AbstractDataNode hstr = str.getValue(stack); - String str = SwiftFunction.unwrap(this, hstr); + Object obj = SwiftFunction.unwrap(this, hstr); - DSHandle handle = new RootDataNode(Types.FLOAT, Double.valueOf(str)); + DSHandle handle; + + if (obj instanceof String) { + handle = new RootDataNode(Types.FLOAT, Double.valueOf((String) obj)); + } + else if (obj instanceof Number) { + handle = new RootDataNode(Types.FLOAT, ((Number) obj).doubleValue()); + } + else { + throw new ExecutionException("Expected a string or int. Got " + obj); + } + if (PROVENANCE_ENABLED) { int provid = SwiftFunction.nextProvenanceID(); From hategan at ci.uchicago.edu Fri Feb 8 23:27:53 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Fri, 8 Feb 2013 23:27:53 -0600 (CST) Subject: [Swift-commit] r6250 - branches/faster/src/org/griphyn/vdl/karajan/lib Message-ID: <20130209052753.4A4899CC9C@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-08 23:27:53 -0600 (Fri, 08 Feb 2013) New Revision: 6250 Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/Stagein.java branches/faster/src/org/griphyn/vdl/karajan/lib/Stageout.java Log: negation operator got lost in translation Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/Stagein.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/Stagein.java 2013-02-09 05:26:59 UTC (rev 6249) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/Stagein.java 2013-02-09 05:27:53 UTC (rev 6250) @@ -22,6 +22,7 @@ import java.util.Collection; +import k.rt.ConditionalYield; import k.rt.ExecutionException; import k.rt.Stack; import k.thr.LWThread; @@ -36,7 +37,6 @@ import org.globus.cog.karajan.compiled.nodes.Node; import org.globus.cog.karajan.futures.FutureFault; import org.globus.cog.karajan.parser.WrapperNode; -import org.griphyn.vdl.engine.Karajan; import org.griphyn.vdl.mapping.AbstractDataNode; import org.griphyn.vdl.mapping.DependentException; import org.griphyn.vdl.mapping.MappingDependentException; @@ -62,7 +62,7 @@ public Node compile(WrapperNode w, Scope scope) throws CompilationException { Node def = getParent().getParent(); - procName = Karajan.demangle(def.getTextualName()); + procName = def.getTextualName(); tracer = Tracer.getTracer(def, "APPCALL"); return super.compile(w, scope); } @@ -70,7 +70,7 @@ @Override public Object function(Stack stack) { AbstractDataNode var = this.var.getValue(stack); - if (var.isPrimitive()) { + if (!var.isPrimitive()) { boolean deperr = false; boolean mdeperr = false; try { @@ -90,7 +90,7 @@ stagein.add(filename(var.getField(p))[0]); } } - catch (FutureFault f) { + catch (ConditionalYield f) { if (tracer.isEnabled()) { tracer.trace(LWThread.currentThread(), procName + " WAIT " + Tracer.getFutureName(f.getFuture())); } Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/Stageout.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/Stageout.java 2013-02-09 05:26:59 UTC (rev 6249) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/Stageout.java 2013-02-09 05:27:53 UTC (rev 6250) @@ -73,7 +73,7 @@ var.waitFor(this); } try { - if (var.isPrimitive()) { + if (!var.isPrimitive()) { retPaths(cr_stageout.get(stack), var); } if (var.isRestartable()) { From hategan at ci.uchicago.edu Fri Feb 8 23:28:44 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Fri, 8 Feb 2013 23:28:44 -0600 (CST) Subject: [Swift-commit] r6251 - in branches/faster/src/org/griphyn/vdl/karajan: . lib Message-ID: <20130209052844.7B4649CC9C@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-08 23:28:44 -0600 (Fri, 08 Feb 2013) New Revision: 6251 Modified: branches/faster/src/org/griphyn/vdl/karajan/VDSAdaptiveScheduler.java branches/faster/src/org/griphyn/vdl/karajan/lib/SiteCatalog.java Log: abort if site catalog has errors or has no resources Modified: branches/faster/src/org/griphyn/vdl/karajan/VDSAdaptiveScheduler.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/VDSAdaptiveScheduler.java 2013-02-09 05:27:53 UTC (rev 6250) +++ branches/faster/src/org/griphyn/vdl/karajan/VDSAdaptiveScheduler.java 2013-02-09 05:28:44 UTC (rev 6251) @@ -457,6 +457,9 @@ @Override public void setResources(ContactSet cs) { + if (cs == null || cs.getContacts() == null) { + throw new IllegalArgumentException("No sites specified"); + } super.setResources(cs); for (BoundContact bc : cs.getContacts()) { if ("passive".equals(bc.getProperty("globus:workerManager")) Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/SiteCatalog.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/SiteCatalog.java 2013-02-09 05:27:53 UTC (rev 6250) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/SiteCatalog.java 2013-02-09 05:28:44 UTC (rev 6251) @@ -63,7 +63,7 @@ } } catch (Exception e) { - System.err.println("Invalid pool entry '" + attr(pools.item(i), "name") + "': " + e.getMessage()); + throw new ExecutionException(this, "Invalid pool entry '" + attr(pools.item(i), "handle") + "': ", e); } } return cs; @@ -76,7 +76,7 @@ String name = attr(n, "handle"); BoundContact bc = new BoundContact(name); - String sysinfo = attr(n, "sysinfo"); + String sysinfo = attr(n, "sysinfo", null); if (sysinfo != null) { bc.addProperty("sysinfo", sysinfo); } @@ -160,23 +160,35 @@ private Service execution(Node n) throws InvalidProviderException, ProviderMethodException { String provider = attr(n, "provider"); - String url = attr(n, "url"); - String jobManager = attr(n, "jobManager"); + String url = attr(n, "url", null); + String jobManager = attr(n, "jobManager", null); ServiceContact contact = null; if (url != null) { contact = new ServiceContactImpl(url); } + else if (provider.equals("local")) { + contact = new ServiceContactImpl("localhost"); + } + else { + throw new IllegalArgumentException("Missing URL"); + } return new ExecutionServiceImpl(provider, contact, AbstractionFactory.newSecurityContext(provider, contact), jobManager); } private Service filesystem(Node n) throws InvalidProviderException, ProviderMethodException { String provider = attr(n, "provider"); - String url = attr(n, "url"); + String url = attr(n, "url", null); ServiceContact contact = null; if (url != null) { contact = new ServiceContactImpl(url); } + else if (provider.equals("local")) { + contact = new ServiceContactImpl("localhost"); + } + else { + throw new IllegalArgumentException("Missing URL"); + } return new ServiceImpl(provider, Service.FILE_OPERATION, contact, AbstractionFactory.newSecurityContext(provider, contact)); } @@ -210,14 +222,30 @@ if (attrs != null) { Node attr = attrs.getNamedItem(name); if (attr == null) { - return null; + throw new IllegalArgumentException("Missing " + name); } else { return attr.getNodeValue(); } } else { - return null; + throw new IllegalArgumentException("Missing " + name); } } + + private String attr(Node n, String name, String defVal) { + NamedNodeMap attrs = n.getAttributes(); + if (attrs != null) { + Node attr = attrs.getNamedItem(name); + if (attr == null) { + return defVal; + } + else { + return attr.getNodeValue(); + } + } + else { + return defVal; + } + } } From hategan at ci.uchicago.edu Fri Feb 8 23:29:51 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Fri, 8 Feb 2013 23:29:51 -0600 (CST) Subject: [Swift-commit] r6252 - branches/faster/src/org/griphyn/vdl/karajan Message-ID: <20130209052951.CE2419CC9C@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-08 23:29:51 -0600 (Fri, 08 Feb 2013) New Revision: 6252 Modified: branches/faster/src/org/griphyn/vdl/karajan/Loader.java Log: use .swiftx for intermediate code and fix cache id Modified: branches/faster/src/org/griphyn/vdl/karajan/Loader.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/Loader.java 2013-02-09 05:28:44 UTC (rev 6251) +++ branches/faster/src/org/griphyn/vdl/karajan/Loader.java 2013-02-09 05:29:51 UTC (rev 6252) @@ -47,7 +47,6 @@ import org.apache.log4j.FileAppender; import org.apache.log4j.Level; import org.apache.log4j.Logger; -import org.globus.cog.abstraction.impl.execution.fake.JobSubmissionTaskHandler; import org.globus.cog.karajan.compiled.nodes.Main; import org.globus.cog.karajan.compiled.nodes.grid.AbstractGridNode; import org.globus.cog.karajan.parser.WrapperNode; @@ -217,7 +216,7 @@ ec.start(context); ec.waitFor(); long end = System.currentTimeMillis(); - System.out.println(JobSubmissionTaskHandler.jobsRun + " jobs, " + JobSubmissionTaskHandler.jobsRun * 1000 / (end - start) + " j/s"); + //System.out.println(JobSubmissionTaskHandler.jobsRun + " jobs, " + JobSubmissionTaskHandler.jobsRun * 1000 / (end - start) + " j/s"); if (ec.isFailed()) { runerror = true; } @@ -287,7 +286,7 @@ File swiftscript = new File(project); debugText("SWIFTSCRIPT", swiftscript); String projectBase = project.substring(0, project.lastIndexOf('.')); - File xml = new File(projectBase + ".xml"); + File xml = new File(projectBase + ".swiftx"); File kml = new File(projectBase + ".kml"); loadBuildVersion(provenanceEnabled); @@ -309,7 +308,8 @@ recompile = true; } else { - String prefix = ""); - String kmlversion = cut.substring(0, endOffset); + String kmlversion = firstLine.substring(offset + prefix.length()); logger.debug("kmlversion is >" + kmlversion + "<"); logger.debug("build version is >" + buildVersion + "<"); if (!(kmlversion.equals(buildVersion))) { From hategan at ci.uchicago.edu Fri Feb 8 23:30:12 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Fri, 8 Feb 2013 23:30:12 -0600 (CST) Subject: [Swift-commit] r6253 - branches/faster/src/org/griphyn/vdl/karajan/lib Message-ID: <20130209053012.6589A9CC9C@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-08 23:30:12 -0600 (Fri, 08 Feb 2013) New Revision: 6253 Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/ThrottledParallelFor.java Log: fixe self-close semantics in foreach Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/ThrottledParallelFor.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/ThrottledParallelFor.java 2013-02-09 05:29:51 UTC (rev 6252) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/ThrottledParallelFor.java 2013-02-09 05:30:12 UTC (rev 6253) @@ -23,7 +23,10 @@ import java.util.List; import java.util.StringTokenizer; +import k.rt.ConditionalYield; import k.rt.ExecutionException; +import k.rt.Future; +import k.rt.FutureListener; import k.rt.KRunnable; import k.rt.Stack; import k.thr.LWThread; @@ -57,6 +60,8 @@ private ArgRef _kvar; private ArgRef _vvar; private ArgRef _traceline; + + private boolean sc; @Override protected Signature getSignature() { @@ -111,6 +116,7 @@ } forTracer = Tracer.getTracer(this, "FOREACH"); iterationTracer = Tracer.getTracer(this, "ITERATION"); + sc = selfClose.getValue(); return super.compileBody(w, argScope, scope); } @@ -152,7 +158,7 @@ protected void runBody(final LWThread thr) { int i = thr.checkSliceAndPopState(); Iterator it = (Iterator) thr.popState(); - ThrottledThreadSet ts = (ThrottledThreadSet) thr.popState(); + TPFThreadSet ts = (TPFThreadSet) thr.popState(); int fc = thr.popIntState(); List drefs = (List) thr.popState(); Stack stack = thr.getStack(); @@ -160,7 +166,13 @@ switch(i) { case 0: it = in.getValue(stack).iterator(); - ts = new ThrottledThreadSet(getMaxThreads()); + if (sc) { + ts = new TPFSCThreadSet(it, getMaxThreads()); + } + else { + ts = new TPFThreadSet(it, getMaxThreads()); + } + drefs = buildRefs(stack); ts.lock(); fc = stack.frameCount() + 1; @@ -175,8 +187,8 @@ ts.checkFailed(); - startBulk(thr, ts, it, fc, drefs); - startRest(thr, ts, it, fc, drefs); + startBulk(thr, ts, fc, drefs); + startRest(thr, ts, fc, drefs); ts.unlock(); decRefs(drefs); @@ -195,12 +207,12 @@ } } - private boolean startBulk(LWThread thr, ThrottledThreadSet ts, Iterator it, int fcf, List refs) { + private boolean startBulk(LWThread thr, TPFThreadSet ts, int fcf, List refs) { int available = ts.freeSlots(); int j = 0; Stack stack = thr.getStack(); - for (; j < available && it.hasNext(); j++) { - if (startOne(thr, ts, it.next(), fcf, refs)) { + for (; j < available && ts.hasNext(); j++) { + if (startOne(thr, ts, ts.next(), fcf, refs)) { // aborted return true; } @@ -208,17 +220,27 @@ return false; } - private boolean startRest(LWThread thr, ThrottledThreadSet ts, Iterator it, int fcf, List refs) { + private boolean startRest(LWThread thr, TPFThreadSet ts, int fcf, List refs) { Stack stack = thr.getStack(); - while (it.hasNext()) { + while (ts.hasNext()) { ts.waitForSlot(); - if (startOne(thr, ts, it.next(), fcf, refs)) { + if (startOne(thr, ts, ts.next(), fcf, refs)) { return true; } } return false; } + private boolean iteratorHasValues(Iterator it) { + try { + it.hasNext(); + return true; + } + catch (ConditionalYield y) { + return false; + } + } + private boolean startOne(final LWThread thr, final ThreadSet ts, final Object value, final int fcf, List refs) { incRefs(refs); LWThread ct = thr.fork(new KRunnable() { @@ -307,4 +329,99 @@ public String getTextualName() { return "foreach"; } + + private static class TPFThreadSet extends ThrottledThreadSet { + protected final Iterator it; + + public TPFThreadSet(Iterator it, int maxThreads) { + super(maxThreads); + this.it = it; + } + + public boolean hasNext() { + return it.hasNext(); + } + + public Object next() { + return it.next(); + } + } + + private static class TPFSCThreadSet extends TPFThreadSet implements FutureListener { + private Helper helper; + private boolean closed; + + public TPFSCThreadSet(Iterator it, int maxThreads) { + super(it, maxThreads); + helper = new Helper(); + } + + public synchronized boolean hasNext() { + if (closed) { + return false; + } + try { + return it.hasNext(); + } + catch (ConditionalYield y) { + helper.resetItUpdated(); + y.getFuture().addListener(this); + throw new ConditionalYield(helper); + } + } + + @Override + public synchronized void threadDone(LWThread thr, ExecutionException e) { + super.threadDone(thr, e); + if (getRunning() == 1 && !iteratorHasValues()) { + closed = true; + helper.awake(); + } + } + + private boolean iteratorHasValues() { + try { + it.hasNext(); + return true; + } + catch (Yield y) { + return false; + } + } + + @Override + public void futureUpdated(Future fv) { + helper.awake(); + } + } + + private static class Helper implements Future { + private FutureListener l; + private boolean itUpdated; + + @Override + public synchronized void addListener(FutureListener l) { + if (itUpdated) { + l.futureUpdated(this); + } + else { + this.l = l; + } + } + + public synchronized void resetItUpdated() { + this.itUpdated = false; + } + + public synchronized void awake() { + if (l == null) { + this.itUpdated = true; + } + else { + FutureListener l = this.l; + this.l = null; + l.futureUpdated(this); + } + } + } } From hategan at ci.uchicago.edu Fri Feb 8 23:30:50 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Fri, 8 Feb 2013 23:30:50 -0600 (CST) Subject: [Swift-commit] r6254 - in branches/faster/src/org/griphyn/vdl: karajan/lib mapping/file Message-ID: <20130209053050.77E849CC9C@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-08 23:30:50 -0600 (Fri, 08 Feb 2013) New Revision: 6254 Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/CreateArray.java branches/faster/src/org/griphyn/vdl/karajan/lib/Execute.java branches/faster/src/org/griphyn/vdl/karajan/lib/GetField.java branches/faster/src/org/griphyn/vdl/karajan/lib/GetFieldSubscript.java branches/faster/src/org/griphyn/vdl/karajan/lib/IsDone.java branches/faster/src/org/griphyn/vdl/karajan/lib/IsLogged.java branches/faster/src/org/griphyn/vdl/mapping/file/CSVMapper.java Log: misc fixes Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/CreateArray.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/CreateArray.java 2013-02-09 05:30:12 UTC (rev 6253) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/CreateArray.java 2013-02-09 05:30:50 UTC (rev 6254) @@ -43,7 +43,7 @@ @Override protected Signature getSignature() { - return new Signature(params("value")); + return new Signature(params("value", optional("_traceline", null))); } public Object function(Stack stack) { Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/Execute.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/Execute.java 2013-02-09 05:30:12 UTC (rev 6253) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/Execute.java 2013-02-09 05:30:50 UTC (rev 6254) @@ -26,7 +26,6 @@ import k.rt.Context; import k.rt.ExecutionException; import k.rt.Stack; -import k.thr.LWThread; import org.apache.log4j.Logger; import org.globus.cog.abstraction.impl.common.StatusEvent; Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/GetField.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/GetField.java 2013-02-09 05:30:12 UTC (rev 6253) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/GetField.java 2013-02-09 05:30:50 UTC (rev 6254) @@ -38,7 +38,7 @@ @Override protected Signature getSignature() { - return new Signature(params("var", optional("path", Path.EMPTY_PATH))); + return new Signature(params("var", "path")); } @Override Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/GetFieldSubscript.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/GetFieldSubscript.java 2013-02-09 05:30:12 UTC (rev 6253) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/GetFieldSubscript.java 2013-02-09 05:30:50 UTC (rev 6254) @@ -24,14 +24,16 @@ import org.globus.cog.karajan.analyzer.ArgRef; import org.globus.cog.karajan.analyzer.Signature; +import org.griphyn.vdl.mapping.AbstractDataNode; import org.griphyn.vdl.mapping.DSHandle; import org.griphyn.vdl.mapping.HandleOpenException; import org.griphyn.vdl.mapping.InvalidPathException; +import org.griphyn.vdl.mapping.OOBYield; import org.griphyn.vdl.mapping.Path; public class GetFieldSubscript extends SwiftFunction { private ArgRef var; - private ArgRef subscript; + private ArgRef subscript; @Override protected Signature getSignature() { @@ -42,9 +44,11 @@ public Object function(Stack stack) { DSHandle var = this.var.getValue(stack); - Object index = this.subscript.getValue(stack); + AbstractDataNode indexh = this.subscript.getValue(stack); try { + indexh.waitFor(); + Object index = indexh.getValue(); Path path; if ("*".equals(index)) { path = Path.CHILDREN; @@ -60,6 +64,9 @@ return fields; } } + catch (OOBYield y) { + throw y.wrapped(this); + } catch (InvalidPathException e) { throw new ExecutionException(this, e); } Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/IsDone.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/IsDone.java 2013-02-09 05:30:12 UTC (rev 6253) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/IsDone.java 2013-02-09 05:30:50 UTC (rev 6254) @@ -22,32 +22,39 @@ import java.util.List; +import k.rt.Context; import k.rt.Stack; import org.globus.cog.karajan.analyzer.ArgRef; -import org.globus.cog.karajan.analyzer.ChannelRef; +import org.globus.cog.karajan.analyzer.Scope; import org.globus.cog.karajan.analyzer.Signature; -import org.globus.cog.karajan.compiled.nodes.restartLog.LogChannelOperator; +import org.globus.cog.karajan.analyzer.VarRef; import org.griphyn.vdl.mapping.DSHandle; import org.griphyn.vdl.mapping.Path; public class IsDone extends SwiftFunction { private ArgRef>> stageout; - private ChannelRef cr_restartLog; + private VarRef context; @Override protected Signature getSignature() { - return new Signature(params("stageout"), returns(channel("...", 1), channel("restartLog"))); + return new Signature(params("stageout"), returns(channel("...", 1))); } @Override + protected void addLocals(Scope scope) { + context = scope.getVarRef("#context"); + super.addLocals(scope); + } + + @Override public Object function(Stack stack) { Iterable> files = stageout.getValue(stack); for (List pv : files) { Path p = (Path) pv.get(0); DSHandle handle = (DSHandle) pv.get(1); - if (!IsLogged.isLogged((LogChannelOperator) cr_restartLog.get(stack), handle, p)) { + if (!IsLogged.isLogged(context.getValue(stack), handle, p)) { return Boolean.FALSE; } } Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/IsLogged.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/IsLogged.java 2013-02-09 05:30:12 UTC (rev 6253) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/IsLogged.java 2013-02-09 05:30:50 UTC (rev 6254) @@ -23,14 +23,16 @@ import java.util.List; import java.util.Map; +import k.rt.Context; import k.rt.ExecutionException; import k.rt.Stack; import org.globus.cog.karajan.analyzer.ArgRef; -import org.globus.cog.karajan.analyzer.ChannelRef; +import org.globus.cog.karajan.analyzer.Scope; import org.globus.cog.karajan.analyzer.Signature; -import org.globus.cog.karajan.compiled.nodes.restartLog.LogChannelOperator; +import org.globus.cog.karajan.analyzer.VarRef; import org.globus.cog.karajan.compiled.nodes.restartLog.LogEntry; +import org.globus.cog.karajan.compiled.nodes.restartLog.RestartLog; import org.globus.cog.karajan.util.TypeUtil; import org.griphyn.vdl.mapping.DSHandle; import org.griphyn.vdl.mapping.MappingParam; @@ -40,12 +42,18 @@ private ArgRef var; private ArgRef path; - private ChannelRef cr_restartLog; + private VarRef context; @Override protected Signature getSignature() { - return new Signature(params("var", "path"), returns(channel("restartLog"))); + return new Signature(params("var", "path")); } + + @Override + protected void addLocals(Scope scope) { + context = scope.getVarRef("#context"); + super.addLocals(scope); + } @Override public Object function(Stack stack) { @@ -58,11 +66,12 @@ else { path = Path.parse(TypeUtil.toString(p)); } - return Boolean.valueOf(isLogged((LogChannelOperator) cr_restartLog.get(stack), var, path)); + return Boolean.valueOf(isLogged(context.getValue(stack), var, path)); } - public static boolean isLogged(LogChannelOperator log, DSHandle var, Path path) throws ExecutionException { - Map logData = log.getLogData(); + public static boolean isLogged(Context ctx, DSHandle var, Path path) throws ExecutionException { + @SuppressWarnings("unchecked") + Map logData = (Map) ctx.getAttribute(RestartLog.LOG_DATA); path = var.getPathFromRoot().append(path); LogEntry entry = LogEntry.build(var.getRoot().getParam(MappingParam.SWIFT_RESTARTID) + "." + path.stringForm()); boolean found = false; Modified: branches/faster/src/org/griphyn/vdl/mapping/file/CSVMapper.java =================================================================== --- branches/faster/src/org/griphyn/vdl/mapping/file/CSVMapper.java 2013-02-09 05:30:12 UTC (rev 6253) +++ branches/faster/src/org/griphyn/vdl/mapping/file/CSVMapper.java 2013-02-09 05:30:50 UTC (rev 6254) @@ -80,7 +80,13 @@ throw new InvalidMappingParameterException("CSV mapper must have a file parameter."); } if (!PARAM_HDELIMITER.isPresent(this)) { - params.set(PARAM_HDELIMITER, PARAM_DELIMITER.getRawValue(this)); + Object raw = PARAM_DELIMITER.getRawValue(this); + if (raw != null) { + params.set(PARAM_HDELIMITER, PARAM_DELIMITER.getRawValue(this)); + } + else { + params.set(PARAM_HDELIMITER, PARAM_DELIMITER.getValue(this)); + } } delim = PARAM_DELIMITER.getStringValue(this); hdelim = PARAM_HDELIMITER.getStringValue(this); From swift at ci.uchicago.edu Sat Feb 9 00:55:11 2013 From: swift at ci.uchicago.edu (swift at ci.uchicago.edu) Date: Sat, 9 Feb 2013 00:55:11 -0600 (CST) Subject: [Swift-commit] cog r3602 Message-ID: <20130209065511.8D28A8D000A2@bridled.ci.uchicago.edu> ------------------------------------------------------------------------ r3602 | hategan | 2013-02-09 00:50:09 -0600 (Sat, 09 Feb 2013) | 1 line added ability to override user home for remote coaster services ------------------------------------------------------------------------ Index: modules/provider-coaster/src/org/globus/cog/abstraction/impl/execution/coaster/ServiceManager.java =================================================================== --- modules/provider-coaster/src/org/globus/cog/abstraction/impl/execution/coaster/ServiceManager.java (revision 3601) +++ modules/provider-coaster/src/org/globus/cog/abstraction/impl/execution/coaster/ServiceManager.java (working copy) @@ -54,7 +54,6 @@ import org.globus.cog.karajan.workflow.service.channels.KarajanChannel; import org.globus.cog.karajan.workflow.service.commands.Command; import org.globus.cog.karajan.workflow.service.commands.Command.Callback; -import org.globus.common.CoGProperties; import org.ietf.jgss.GSSCredential; public class ServiceManager implements StatusListener { @@ -64,6 +63,7 @@ public static final String BOOTSTRAP_JAR = "coaster-bootstrap.jar"; public static final String TASK_ATTR_ID = "coaster:serviceid"; + public static final String ATTR_USER_HOME_OVERRIDE = "userHomeOverride"; private static ServiceManager defaultManager; @@ -108,8 +108,12 @@ return th; } } + + public String reserveService(Service service, String bootHandlerProvider) throws TaskSubmissionException { + return reserveService(service, bootHandlerProvider, null); + } - public String reserveService(Service service, String bootHandlerProvider) throws TaskSubmissionException { + public String reserveService(Service service, String bootHandlerProvider, String userHomeOverride) throws TaskSubmissionException { ServiceContact contact = service.getServiceContact(); if (logger.isDebugEnabled()) { logger.debug("Reserving service " + contact); @@ -121,7 +125,7 @@ if (url == null) { url = startService(service, getBootHandler(bootHandlerProvider), - bootHandlerProvider); + bootHandlerProvider, userHomeOverride); } increaseUsageCount(contact); return url; @@ -133,7 +137,12 @@ public String reserveService(Task task, String bootHandlerProvider) throws TaskSubmissionException { - return reserveService(getService(task), bootHandlerProvider); + String userHomeOverride = null; + if (task.getType() == Task.JOB_SUBMISSION) { + JobSpecification spec = (JobSpecification) task.getSpecification(); + userHomeOverride = (String) spec.getAttribute(ATTR_USER_HOME_OVERRIDE); + } + return reserveService(getService(task), bootHandlerProvider, userHomeOverride); } private Service getService(Task task) { @@ -159,13 +168,13 @@ // private static final String[] STRING_ARRAY = new String[0]; - protected String startService(Service service, TaskHandler bootHandler, - String bootHandlerProvider) throws Exception { + protected String startService(final Service service, TaskHandler bootHandler, + String bootHandlerProvider, String userHomeOverride) throws Exception { ServiceContact contact = service.getServiceContact(); SecurityContext sc = service.getSecurityContext(); try { startLocalService(); - final Task t = buildTask(service); + final Task t = buildTask(service, userHomeOverride); t.addStatusListener(this); if (logger.isDebugEnabled()) { @@ -188,7 +197,8 @@ t.setAttribute(TASK_ATTR_ID, id); new Thread(new Runnable() { public void run() { - CoasterService.main(new String[] { ls, id, "-local" }); + CoasterService.main(new String[] { ls, id, "-local", "-shared.dir", + (String) service.getAttribute(ATTR_USER_HOME_OVERRIDE) }); } }).start(); } @@ -286,7 +296,7 @@ return task.getService(0).getSecurityContext(); } - private Task buildTask(Service service) throws TaskSubmissionException { + private Task buildTask(Service service, String userHomeOverride) throws TaskSubmissionException { try { Task t = new TaskImpl(); t.setType(Task.JOB_SUBMISSION); @@ -297,7 +307,8 @@ t.setAttribute(TASK_ATTR_ID, id); js.addArgument(loadBootstrapScript(new String[] { getBootstrapServiceURL(), getLocalServiceURL(), getMD5(BOOTSTRAP_JAR), getMD5(Bootstrap.BOOTSTRAP_LIST), - id, service.getServiceContact().getHost() })); + id, service.getServiceContact().getHost(), + userHomeOverride })); js.setDelegation(Delegation.FULL_DELEGATION); js.setStdOutputLocation(FileLocation.MEMORY); js.setStdErrorLocation(FileLocation.MEMORY); Index: modules/provider-coaster/src/org/globus/cog/abstraction/impl/execution/coaster/bootstrap/Bootstrap.java =================================================================== --- modules/provider-coaster/src/org/globus/cog/abstraction/impl/execution/coaster/bootstrap/Bootstrap.java (revision 3601) +++ modules/provider-coaster/src/org/globus/cog/abstraction/impl/execution/coaster/bootstrap/Bootstrap.java (working copy) @@ -187,6 +187,8 @@ addDebuggingOptions(args); args.add("-Xmx256M"); args.add("-Dtcp.channel.log.io.performance=true"); + //pass user home override to service + args.add("-Duser.home=" + System.getProperty("user.home")); //args.add("-agentlib:hprof=file=c.hprof"); addProperties(args); args.add("-cp"); Index: modules/provider-coaster/resources/bootstrap.sh =================================================================== --- modules/provider-coaster/resources/bootstrap.sh (revision 3601) +++ modules/provider-coaster/resources/bootstrap.sh (working copy) @@ -3,9 +3,10 @@ EMD5=$3 ID=$5 H=$6 -L=$7 +HO=$7 B="coaster-bootstrap" + error() { echo $1 echo $1 >>$L @@ -54,8 +55,12 @@ eval "$@" } +if [ "$HO" == "" ]; then + HO=$HOME +fi + if [ "$L" == "" ]; then - L=~/$B-$ID.log + L=$HO/$B-$ID.log fi detectPaths DJ=`mktemp /tmp/bootstrap.XXXXXX` @@ -88,9 +93,10 @@ if [ "$AAMD5" != "$EMD5" ]; then error "Bootstrap jar checksum failed: $EMD5 != $AAMD5" fi + echo "JAVA=$JAVA" >>$L if [ -x $JAVA ]; then - CMD="$WR $JAVA -Djava=\"$JAVA\" -DGLOBUS_TCP_PORT_RANGE=\"$GLOBUS_TCP_PORT_RANGE\" -DX509_USER_PROXY=\"$X509_USER_PROXY\" -DX509_CERT_DIR=\"$X509_CERT_DIR\" -DGLOBUS_HOSTNAME=\"$H\" -jar $DJ $BS $LS $ID" + CMD="$WR $JAVA -Djava=\"$JAVA\" -DGLOBUS_TCP_PORT_RANGE=\"$GLOBUS_TCP_PORT_RANGE\" -DX509_USER_PROXY=\"$X509_USER_PROXY\" -DX509_CERT_DIR=\"$X509_CERT_DIR\" -DGLOBUS_HOSTNAME=\"$H\" -Duser.home=\"$HO\" -jar $DJ $BS $LS $ID" echo $CMD >>$L eval $CMD >>$L EC=$? From hategan at ci.uchicago.edu Sun Feb 10 02:44:52 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Sun, 10 Feb 2013 02:44:52 -0600 (CST) Subject: [Swift-commit] r6255 - in trunk: src/org/griphyn/vdl/engine tests/language-behaviour/arrays Message-ID: <20130210084452.4434A9CC8F@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-10 02:44:51 -0600 (Sun, 10 Feb 2013) New Revision: 6255 Added: trunk/tests/language-behaviour/arrays/210-closing-if-full-xor-partial.swift Modified: trunk/src/org/griphyn/vdl/engine/VariableScope.java Log: fixed bug 927 Modified: trunk/src/org/griphyn/vdl/engine/VariableScope.java =================================================================== --- trunk/src/org/griphyn/vdl/engine/VariableScope.java 2013-02-09 05:30:50 UTC (rev 6254) +++ trunk/src/org/griphyn/vdl/engine/VariableScope.java 2013-02-10 08:44:51 UTC (rev 6255) @@ -650,6 +650,9 @@ } private void setPreClose(String name, int count) { + if (inhibitClosing != null && inhibitClosing.contains(name)) { + return; + } setCount("preClose", name, count, new RefCountSetter() { @Override @@ -1035,7 +1038,8 @@ } presentStatementPostStatements.clear(); outputs.clear(); - inhibitClosing = null; + // Cannot set inhibitClosing to null here, since + // it may break then/else linked closing. See bug 927 } private String join(List l) { Added: trunk/tests/language-behaviour/arrays/210-closing-if-full-xor-partial.swift =================================================================== --- trunk/tests/language-behaviour/arrays/210-closing-if-full-xor-partial.swift (rev 0) +++ trunk/tests/language-behaviour/arrays/210-closing-if-full-xor-partial.swift 2013-02-10 08:44:51 UTC (rev 6255) @@ -0,0 +1,22 @@ +type file; + +app (file o) echo () +{ + echo "foo.txt" stdout=@o; +} + +(file fileList[]) createFileArray() { + foreach i in [1:5] { + fileList[i]=echo(); + } +} + +file myFileArray[]; + + + + if (1 == 1) { + myFileArray = createFileArray(); + } else { + myFileArray[0] = echo(); +} \ No newline at end of file From ketan at ci.uchicago.edu Sun Feb 10 20:17:17 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Sun, 10 Feb 2013 20:17:17 -0600 (CST) Subject: [Swift-commit] r6256 - in trunk/docs: cookbook userguide Message-ID: <20130211021717.1BB949CC9D@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-10 20:17:16 -0600 (Sun, 10 Feb 2013) New Revision: 6256 Modified: trunk/docs/cookbook/coasters trunk/docs/userguide/language Log: simple array example in userguide Modified: trunk/docs/cookbook/coasters =================================================================== --- trunk/docs/cookbook/coasters 2013-02-10 08:44:51 UTC (rev 6255) +++ trunk/docs/cookbook/coasters 2013-02-11 02:17:16 UTC (rev 6256) @@ -1,8 +1,8 @@ Coasters -------- Coasters were introduced in Swift v0.6 as an experimental feature. In many -applications, Swift performance can be greatly enhanced by the use of CoG -coasters. CoG coasters provide a low-overhead job submission and file transfer +applications, Swift performance can be greatly enhanced by the use of +coasters. Coasters provide a low-overhead job submission and file transfer mechanism suited for the execution of short jobs (on the order of a few seconds). A detailed information on coasters can be found at http://www.ci.uchicago.edu/swift/guides/userguide.php#coasters. //**Include neat diagrams.** Modified: trunk/docs/userguide/language =================================================================== --- trunk/docs/userguide/language 2013-02-10 08:44:51 UTC (rev 6255) +++ trunk/docs/userguide/language 2013-02-11 02:17:16 UTC (rev 6256) @@ -114,8 +114,14 @@ Arrays and Parallel Execution ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Arrays of values can be declared using the [] suffix. An array be -mapped to a collection of files, one element per file, by using a +Arrays of values can be declared using the [] suffix. Following is an example +of an array of strings: + +---- +string pets[] = ["shane", "noddy", "leo"]; +---- + +An array may be mapped to a collection of files, one element per file, by using a different form of mapping expression. For example, the filesys_mapper maps all files matching a particular unix glob pattern into an array: From ketan at ci.uchicago.edu Mon Feb 11 11:24:41 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Mon, 11 Feb 2013 11:24:41 -0600 (CST) Subject: [Swift-commit] r6257 - trunk/docs/userguide Message-ID: <20130211172441.298789CC8F@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-11 11:24:40 -0600 (Mon, 11 Feb 2013) New Revision: 6257 Modified: trunk/docs/userguide/app_procedures trunk/docs/userguide/language Log: Swift structures and readData Modified: trunk/docs/userguide/app_procedures =================================================================== --- trunk/docs/userguide/app_procedures 2013-02-11 02:17:16 UTC (rev 6256) +++ trunk/docs/userguide/app_procedures 2013-02-11 17:24:40 UTC (rev 6257) @@ -432,25 +432,17 @@ readData ~~~~~~~~ -readData will read data from a specified file. - -The format of the input file is controlled by the type of the return value. - -For scalar return types, such as int, the specified file should contain -a single value of that type. - -For arrays of scalars, the specified file should contain one value per -line. - -For structs of scalars, the file should contain two rows. The first row -should be structure member names separated by whitespace. The second row -should be the corresponding values for each structure member, separated -by whitespace, in the same order as the header row. - -For arrays of structs, the file should contain a heading row listing -structure member names separated by whitespace. There should be one row -for each element of the array, with structure member elements listed in -the same order as the header row and separated by whitespace. (since +readData will read data from a specified file and assign it to Swift variable. The format of the input file is +controlled by the type of the return value. For scalar return types, such as +int, the specified file should contain a single value of that type. For arrays +of scalars, the specified file should contain one value per line. For complex types +of scalars, the file should contain two rows. The first row should be structure +member names separated by whitespace. The second row should be the +corresponding values for each structure member, separated by whitespace, in the +same order as the header row. For arrays of structs, the file should contain a +heading row listing structure member names separated by whitespace. There +should be one row for each element of the array, with structure member elements +listed in the same order as the header row and separated by whitespace. (since Swift 0.4) readStructured Modified: trunk/docs/userguide/language =================================================================== --- trunk/docs/userguide/language 2013-02-11 02:17:16 UTC (rev 6256) +++ trunk/docs/userguide/language 2013-02-11 17:24:40 UTC (rev 6257) @@ -11,20 +11,52 @@ variables. The syntax superficially resembles C and Java. For example, { and } characters are used to enclose blocks of statements. -Types in Swift can be atomic or composite. An atomic type can be -either a primitive type or a mapped type. Swift provides a fixed set -of primitive types, such as integer and string. A mapped type -indicates that the actual data does not reside in CPU addressable memory -(as it would in conventional programming languages), but in POSIX-like -files. Composite types are further subdivided into structures and -arrays. Structures are similar in most respects to structure types in -other languages. Arrays use numeric indices, but are sparse. They can -contain elements of any type, including other array types, but all -elements in an array must be of the same type. We often refer to +Types in Swift can be atomic or composite. An atomic type can be either a +primitive type or a mapped type. Swift provides a fixed set of primitive types, +such as integer and string. A mapped type indicates that the actual data does +not reside in CPU addressable memory (as it would in conventional programming +languages), but in POSIX-like files. Composite types are further subdivided +into structures and arrays. Structures are similar in most respects to +structure types in other languages. In Swift, structures are defined using the +_type_ keyword (there is no struct keyword). Arrays use numeric indices, but +are sparse. They can contain elements of any type, including other array types, +but all elements in an array must be of the same type. We often refer to instances of composites of mapped types as datasets. image:type-hierarchy.png[] +Atomic types such as string, int, float and double work the same way as in +C-like programming languages. A variable of such atomic types can be defined as +follows: + +---- +string astring = "hello"; +---- + +A struct variable is defined using the _type_ keyword as discussed above. +Following is an example of a variable holding employee data: + +---- +type Employee{ + string name; + int id; + string address; +} +---- + +The members of the structure defined above can be accessed using the dot +notation. An example of a variable of type Employee is as follows: + +---- +Employee emp; +emp.name="Thomas"; +emp.id=2222; +emp.address="Chicago"; +---- + +Arrays of structures are allowed in Swift. A convenient way of populating +structures and arrays of structures is to use the _readData()_ function. + Mapped type and composite type variable declarations can be annotated with a mapping descriptor indicating the file(s) that make up that dataset. For example, the following line declares a variable named From ketan at ci.uchicago.edu Mon Feb 11 12:29:44 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Mon, 11 Feb 2013 12:29:44 -0600 (CST) Subject: [Swift-commit] r6258 - trunk/docs/userguide Message-ID: <20130211182944.324BA9CCE5@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-11 12:29:44 -0600 (Mon, 11 Feb 2013) New Revision: 6258 Modified: trunk/docs/userguide/app_procedures trunk/docs/userguide/language Log: readData example Modified: trunk/docs/userguide/app_procedures =================================================================== --- trunk/docs/userguide/app_procedures 2013-02-11 17:24:40 UTC (rev 6257) +++ trunk/docs/userguide/app_procedures 2013-02-11 18:29:44 UTC (rev 6258) @@ -442,9 +442,36 @@ same order as the header row. For arrays of structs, the file should contain a heading row listing structure member names separated by whitespace. There should be one row for each element of the array, with structure member elements -listed in the same order as the header row and separated by whitespace. (since -Swift 0.4) +listed in the same order as the header row and separated by whitespace. The following example shows how readData() can be used to populate an array of Swift struct-like complex type: +---- +type Employee{ + string name; + int id; + string loc; +} + +Employee emps[] = readData("emps.txt"); +---- + +Where the contents of the "emps.txt" file are: + +---- +name id address +Thomas 2222 Chicago +Gina 3333 Boston +Anne 4444 Houston +---- + +This will result in the array "emps" with 3 members. This can be processed within a Swift script using the foreach construct as follows: + +---- +foreach emp in emps{ + tracef("Employee %s lives in %s and has id %d", emp.name, emp.loc, emp.id); +} +---- + + readStructured ~~~~~~~~~~~~~~ readStructured will read data from a specified file, like readdata, but Modified: trunk/docs/userguide/language =================================================================== --- trunk/docs/userguide/language 2013-02-11 17:24:40 UTC (rev 6257) +++ trunk/docs/userguide/language 2013-02-11 18:29:44 UTC (rev 6258) @@ -40,7 +40,7 @@ type Employee{ string name; int id; - string address; + string loc; } ---- @@ -51,7 +51,7 @@ Employee emp; emp.name="Thomas"; emp.id=2222; -emp.address="Chicago"; +emp.loc="Chicago"; ---- Arrays of structures are allowed in Swift. A convenient way of populating From wozniak at ci.uchicago.edu Tue Feb 12 10:41:39 2013 From: wozniak at ci.uchicago.edu (wozniak at ci.uchicago.edu) Date: Tue, 12 Feb 2013 10:41:39 -0600 (CST) Subject: [Swift-commit] r6259 - SwiftTutorials/UofC_2012-11-27 Message-ID: <20130212164139.F00829CCFE@svn.ci.uchicago.edu> Author: wozniak Date: 2013-02-12 10:41:39 -0600 (Tue, 12 Feb 2013) New Revision: 6259 Added: SwiftTutorials/UofC_2012-11-27/SwiftRCCTutorial.2012.1127.pptx Log: Adding SwiftRCCTutorial.2012.1127.pptx Added: SwiftTutorials/UofC_2012-11-27/SwiftRCCTutorial.2012.1127.pptx =================================================================== (Binary files differ) Property changes on: SwiftTutorials/UofC_2012-11-27/SwiftRCCTutorial.2012.1127.pptx ___________________________________________________________________ Added: svn:mime-type + application/vnd.ms-powerpoint From wozniak at ci.uchicago.edu Tue Feb 12 15:19:40 2013 From: wozniak at ci.uchicago.edu (wozniak at ci.uchicago.edu) Date: Tue, 12 Feb 2013 15:19:40 -0600 (CST) Subject: [Swift-commit] r6260 - SwiftTutorials Message-ID: <20130212211940.A42F19CCE5@svn.ci.uchicago.edu> Author: wozniak Date: 2013-02-12 15:19:40 -0600 (Tue, 12 Feb 2013) New Revision: 6260 Added: SwiftTutorials/KIAPS_2012-02-12/ Log: Adding KIAPS_2012-02-12 From wozniak at ci.uchicago.edu Tue Feb 12 15:20:12 2013 From: wozniak at ci.uchicago.edu (wozniak at ci.uchicago.edu) Date: Tue, 12 Feb 2013 15:20:12 -0600 (CST) Subject: [Swift-commit] r6261 - SwiftTutorials/KIAPS_2012-02-12 Message-ID: <20130212212012.CC8E39CCE5@svn.ci.uchicago.edu> Author: wozniak Date: 2013-02-12 15:20:12 -0600 (Tue, 12 Feb 2013) New Revision: 6261 Added: SwiftTutorials/KIAPS_2012-02-12/Swift-KIAPS.2012.0212.pptx Log: Adding Swift-KIAPS.2012.0212.pptx Added: SwiftTutorials/KIAPS_2012-02-12/Swift-KIAPS.2012.0212.pptx =================================================================== (Binary files differ) Property changes on: SwiftTutorials/KIAPS_2012-02-12/Swift-KIAPS.2012.0212.pptx ___________________________________________________________________ Added: svn:mime-type + application/vnd.ms-powerpoint From davidk at ci.uchicago.edu Tue Feb 12 16:50:33 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Tue, 12 Feb 2013 16:50:33 -0600 (CST) Subject: [Swift-commit] r6262 - trunk/tests/language-behaviour/math Message-ID: <20130212225033.BB48C9CCFE@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-12 16:50:33 -0600 (Tue, 12 Feb 2013) New Revision: 6262 Modified: trunk/tests/language-behaviour/math/intdivision.out.expected Log: Fix expected output Modified: trunk/tests/language-behaviour/math/intdivision.out.expected =================================================================== --- trunk/tests/language-behaviour/math/intdivision.out.expected 2013-02-12 21:20:12 UTC (rev 6261) +++ trunk/tests/language-behaviour/math/intdivision.out.expected 2013-02-12 22:50:33 UTC (rev 6262) @@ -1,3 +1 @@ -n = 1 -x = 1.0 -x = 1 +x = 1, y = 1, z = 1 From swift at ci.uchicago.edu Tue Feb 12 20:40:05 2013 From: swift at ci.uchicago.edu (swift at ci.uchicago.edu) Date: Tue, 12 Feb 2013 20:40:05 -0600 (CST) Subject: [Swift-commit] cog r3603 Message-ID: <20130213024006.5EB188D000A2@bridled.ci.uchicago.edu> ------------------------------------------------------------------------ r3603 | hategan | 2013-02-12 20:39:35 -0600 (Tue, 12 Feb 2013) | 1 line broken code left by accident from last change ------------------------------------------------------------------------ Index: modules/provider-coaster/src/org/globus/cog/abstraction/impl/execution/coaster/ServiceManager.java =================================================================== --- modules/provider-coaster/src/org/globus/cog/abstraction/impl/execution/coaster/ServiceManager.java (revision 3602) +++ modules/provider-coaster/src/org/globus/cog/abstraction/impl/execution/coaster/ServiceManager.java (working copy) @@ -197,8 +197,7 @@ t.setAttribute(TASK_ATTR_ID, id); new Thread(new Runnable() { public void run() { - CoasterService.main(new String[] { ls, id, "-local", "-shared.dir", - (String) service.getAttribute(ATTR_USER_HOME_OVERRIDE) }); + CoasterService.main(new String[] { ls, id, "-local" }); } }).start(); } From ketan at ci.uchicago.edu Tue Feb 12 21:56:56 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Tue, 12 Feb 2013 21:56:56 -0600 (CST) Subject: [Swift-commit] r6263 - trunk/docs/userguide Message-ID: <20130213035656.8366C9CCFE@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-12 21:56:56 -0600 (Tue, 12 Feb 2013) New Revision: 6263 Modified: trunk/docs/userguide/app_procedures Log: minor fixes Modified: trunk/docs/userguide/app_procedures =================================================================== --- trunk/docs/userguide/app_procedures 2013-02-12 22:50:33 UTC (rev 6262) +++ trunk/docs/userguide/app_procedures 2013-02-13 03:56:56 UTC (rev 6263) @@ -91,9 +91,10 @@ procedure call must exist. Files will be mapped in the same way as for input files. - (? Is it defined that output subdirectories will be precreated - before execution or should app executables expect to make them? - That's probably determined by the present behaviour of wrapper.sh) + * The output subdirectories will be precreated + before execution by Swift if defined within a Swift script such as the + location attribute of a mapper. App executables expect to make them if + they are referred to in the wrapper scripts. * Output produced by running the application executable on some inputs should be the same no matter how many times, when or where @@ -104,19 +105,19 @@ Things to not assume: - * anything about the path of the application workspace directory + * Anything about the path of the application workspace directory - * that either the application workspace directory will be deleted or + * That either the application workspace directory will be deleted or will continue to exist or will remain unmodified after execution has finished - * that files can be passed(?def) between application procedure + * That files can be passed between application procedure invocations through any mechanism except through files known to Swift through the mapping mechanism (there is some exception here for external datasets - there are a separate set of assertions that hold for external datasets) - * that application executables will run on any particular site of + * That application executables will run on any particular site of those available, or than any combination of applications will run on the same or different sites. From davidk at ci.uchicago.edu Wed Feb 13 11:31:31 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Wed, 13 Feb 2013 11:31:31 -0600 (CST) Subject: [Swift-commit] r6264 - SwiftApps/modis/bin Message-ID: <20130213173131.304B89CCC1@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-13 11:31:30 -0600 (Wed, 13 Feb 2013) New Revision: 6264 Added: SwiftApps/modis/bin/draw_rectangle.pl SwiftApps/modis/bin/getlanduse.pl SwiftApps/modis/bin/grid.ppm.gz Removed: SwiftApps/modis/bin/analyzelanduse.sh.orig SwiftApps/modis/bin/analyzelanduse2.sh SwiftApps/modis/bin/analyzelandusep1.sh SwiftApps/modis/bin/imagehist.sh SwiftApps/modis/bin/ppmhist.pl SwiftApps/modis/bin/setglobushost.sh Modified: SwiftApps/modis/bin/analyzelanduse.sh SwiftApps/modis/bin/getlanduse.sh SwiftApps/modis/bin/markmap.sh Log: The first three steps of the workflow (generating histograms from satellite data, finding areas of interest, and creating a map) are now done without imagemagick Modified: SwiftApps/modis/bin/analyzelanduse.sh =================================================================== --- SwiftApps/modis/bin/analyzelanduse.sh 2013-02-13 03:56:56 UTC (rev 6263) +++ SwiftApps/modis/bin/analyzelanduse.sh 2013-02-13 17:31:30 UTC (rev 6264) @@ -1,45 +1,43 @@ -# -# Return (simple) stats and filenames for the tiles with the $num highest values of $field -# +#!/bin/bash -stats=$1 -tilelist=$2 -field=$3 -num=$4 -shift 4 +# topselected.txt +topselected=$1 -grep " $field" $* | -sed -e 's/:/ /' | -sort -n -k +2 | -tail -${num} >$stats +# selectedtiles.txt +selectedtiles=$2 -( awk '{print $1}' | - sed -e 's/landuse.//' -e 's/\..*/.tif/' -e 's,^,/home/wilde/bigdata/data/modis/2002/,' \ -) <$stats >$tilelist +# Replace usetype name with number +usetype=$( echo $3 | sed \ + -e s/water/0/g \ + -e s/evergreenneedle/1/g \ + -e s/evergreenlead/2/g \ + -e s/deciduousneedle/3/g \ + -e s/deciduousleaf/4/g \ + -e s/mixedforest/5/g \ + -e s/closedshrub/6/g \ + -e s/openshrub/7/g \ + -e s/woody/8/g \ + -e s/savanna/9/g \ + -e s/grassland/10/g \ + -e s/wetland/11/g \ + -e s/cropland/12/g \ + -e s/urban/13/g \ + -e s/vegetartion/14/g \ + -e s/ice/15/g \ + -e s/barren/16/g \ + -e s/unclassified/17/g + ) -exit +# Max limit to analyze +maxnum=$4 -login1$ cat topurban.txt -landuse/h20v04.landuse.byfreq 67312 13 0d -landuse/h28v06.landuse.byfreq 82267 13 0d -landuse/h08v05.landuse.byfreq 92674 13 0d -landuse/h11v04.landuse.byfreq 93702 13 0d -landuse/h13v11.landuse.byfreq 104302 13 0d -landuse/h12v04.landuse.byfreq 110772 13 0d -landuse/h19v04.landuse.byfreq 120908 13 0d -landuse/h27v05.landuse.byfreq 128794 13 0d -landuse/h18v03.landuse.byfreq 142756 13 0d -landuse/h18v04.landuse.byfreq 146486 13 0d - -login1$ cat urbantiles.txt -/home/wilde/bigdata/data/modis/2002landuse/h20v04.tif -/home/wilde/bigdata/data/modis/2002landuse/h28v06.tif -/home/wilde/bigdata/data/modis/2002landuse/h08v05.tif -/home/wilde/bigdata/data/modis/2002landuse/h11v04.tif -/home/wilde/bigdata/data/modis/2002landuse/h13v11.tif -/home/wilde/bigdata/data/modis/2002landuse/h12v04.tif -/home/wilde/bigdata/data/modis/2002landuse/h19v04.tif -/home/wilde/bigdata/data/modis/2002landuse/h27v05.tif -/home/wilde/bigdata/data/modis/2002landuse/h18v03.tif -/home/wilde/bigdata/data/modis/2002landuse/h18v04.tif -login1$ fg +# Write topselected.txt +result=$( grep " $usetype " $( eval echo $5 ) | sed s/':'/' '/g | sort -rnk2 | awk '{print $1 " " $2}' | head -$maxnum ) +echo "$result" > $topselected + +# Write selectedtiles.txt +for r in $( echo "$result" | awk '{print $1}' ) +do + echo $( basename $r ).ppm.gz |sed s/\.landuse\.byfreq//g >> $selectedtiles +done +exit 0 Deleted: SwiftApps/modis/bin/analyzelanduse.sh.orig =================================================================== --- SwiftApps/modis/bin/analyzelanduse.sh.orig 2013-02-13 03:56:56 UTC (rev 6263) +++ SwiftApps/modis/bin/analyzelanduse.sh.orig 2013-02-13 17:31:30 UTC (rev 6264) @@ -1,17 +0,0 @@ -# -# Return (simple) stats and filenames for the tiles with the $num highest values of $field -# - -stats=$1 -tilelist=$2 -field=$3 -num=$4 -shift 4 - -grep " $field" $* | -sed -e 's/:/ /' | -sort -n -k +2 | -tail -${num} >$stats - -awk '{print $1}' | -sed -e 's/\..*/.tif/' -e 's,^,/home/wilde/bigdata/data/modis/,' <$stats >$tilelist Deleted: SwiftApps/modis/bin/analyzelanduse2.sh =================================================================== --- SwiftApps/modis/bin/analyzelanduse2.sh 2013-02-13 03:56:56 UTC (rev 6263) +++ SwiftApps/modis/bin/analyzelanduse2.sh 2013-02-13 17:31:30 UTC (rev 6264) @@ -1,173 +0,0 @@ -# -# Return (simple) stats and filenames for the tiles with the $num highest values of $wanteduses -# - -stats=$1 -tilelist=$2 -wanteduses=$3 -num=$4 -shift 4 - -awk -v wanteduses="$wanteduses" ' - BEGIN { - sum = 0; - filename = ""; - - use["water"]=0 - use["evergreen needleleaf forest"]=1 - use["evergreen broadleaf forest"]=2 - use["deciduous needleleaf forest"]=3 - use["deciduous broadleaf forest"]=4 - use["mixed forests"]=5 - use["closed shrubland"]=6 - use["open shrublands"]=7 - use["woody savannas"]=8 - use["savannas"]=9 - use["grasslands"]=10 - use["permanent wetlands"]=11 - use["croplands"]=12 - use["urban and built-up"]=13 - use["cropland/natural vegetation mosaic"]=14 - use["snow and ice"]=15 - use["barren or sparsely vegetated"]=16 - use["unclassified"]=254 - - split(wanteduses,wants,"[ ,]+") - for (w in wants) { - for (u in use) { - if (index(u, wants[w])) { - wantuse[use[u]] = 1 - } - } - } - } - { - if (FNR==1) { - if(filename != "") { print filename, sum} - filename = FILENAME - sum = 0 - } - } - - wantuse[$2] { - sum += $1 - } - END { print filename, sum} ' $* | -sort -n -k +2 | -tail -${num} >$stats - -( awk '{print $1}' | - sed -e 's,^.*/,/,' -e 's/\..*/.tif/' -e 's,^,/home/wilde/bigdata/data/modis/2002/,' \ -# FIXME: dont hardcode dir path above -# sed -e 's/landuse.//' -e 's/\..*/.tif/' -e 's,^,/home/wilde/bigdata/data/modis/2002/,' \ -) <$stats >$tilelist - -exit - -login1$ cat topselected.txt -modis-2011.0102.1636-urban-50-9/h09v07.landuse.byfreq 5312 -modis-2011.0102.1636-urban-50-9/h08v07.landuse.byfreq 12555 -modis-2011.0102.1636-urban-50-9/h08v06.landuse.byfreq 14824 -modis-2011.0102.1636-urban-50-9/h10v04.landuse.byfreq 14852 -modis-2011.0102.1636-urban-50-9/h09v06.landuse.byfreq 21432 -modis-2011.0102.1636-urban-50-9/h09v04.landuse.byfreq 32954 -modis-2011.0102.1636-urban-50-9/h09v05.landuse.byfreq 38591 -modis-2011.0102.1636-urban-50-9/h10v05.landuse.byfreq 66613 -modis-2011.0102.1636-urban-50-9/h08v05.landuse.byfreq 92674 - -login1$ cat selectedtiles.txt -/home/wilde/bigdata/data/modis/2002/modis-2011.tif -/home/wilde/bigdata/data/modis/2002/modis-2011.tif -/home/wilde/bigdata/data/modis/2002/modis-2011.tif -/home/wilde/bigdata/data/modis/2002/modis-2011.tif -/home/wilde/bigdata/data/modis/2002/modis-2011.tif -/home/wilde/bigdata/data/modis/2002/modis-2011.tif -/home/wilde/bigdata/data/modis/2002/modis-2011.tif -/home/wilde/bigdata/data/modis/2002/modis-2011.tif -/home/wilde/bigdata/data/modis/2002/modis-2011.tif -login1$ - ---- - -login1$ cat topurban.txt -landuse/h20v04.landuse.byfreq 67312 13 0d -landuse/h28v06.landuse.byfreq 82267 13 0d -landuse/h08v05.landuse.byfreq 92674 13 0d -landuse/h11v04.landuse.byfreq 93702 13 0d -landuse/h13v11.landuse.byfreq 104302 13 0d -landuse/h12v04.landuse.byfreq 110772 13 0d -landuse/h19v04.landuse.byfreq 120908 13 0d -landuse/h27v05.landuse.byfreq 128794 13 0d -landuse/h18v03.landuse.byfreq 142756 13 0d -landuse/h18v04.landuse.byfreq 146486 13 0d - -login1$ cat urbantiles.txt -/home/wilde/bigdata/data/modis/2002landuse/h20v04.tif -/home/wilde/bigdata/data/modis/2002landuse/h28v06.tif -/home/wilde/bigdata/data/modis/2002landuse/h08v05.tif -/home/wilde/bigdata/data/modis/2002landuse/h11v04.tif -/home/wilde/bigdata/data/modis/2002landuse/h13v11.tif -/home/wilde/bigdata/data/modis/2002landuse/h12v04.tif -/home/wilde/bigdata/data/modis/2002landuse/h19v04.tif -/home/wilde/bigdata/data/modis/2002landuse/h27v05.tif -/home/wilde/bigdata/data/modis/2002landuse/h18v03.tif -/home/wilde/bigdata/data/modis/2002landuse/h18v04.tif -login1$ - - 0 water - 1 evergreen needleleaf forest - 2 evergreen broadleaf forest - 3 deciduous needleleaf forest - 4 deciduous broadleaf forest - 5 mixed forests - 6 closed shrubland - 7 open shrublands - 8 woody savannas - 9 savannas - 10 grasslands - 11 permanent wetlands - 12 croplands - 13 urban and built-up - 14 cropland/natural vegetation mosaic - 15 snow and ice - 16 barren or sparsely vegetated - 254 unclassified - - use["water"]=0 - use["evergreen needleleaf forest"]=1 - use["evergreen broadleaf forest"]=2 - use["deciduous needleleaf forest"]=3 - use["deciduous broadleaf forest"]=4 - use["mixed forests"]=5 - use["closed shrubland"]=6 - use["open shrublands"]=7 - use["woody savannas"]=8 - use["savannas"]=9 - use["grasslands"]=10 - use["permanent wetlands"]=11 - use["croplands"]=12 - use["urban and built-up"]=13 - use["cropland/natural vegetation mosaic"]=14 - use["snow and ice"]=15 - use["barren or sparsely vegetated"]=16 - use["unclassified"]=254 - - -use["water"]=0 -use["evergreenneedle"]=1 -use["evergreenleaf"]=2 -use["deciduousneedle"]=3 -use["deciduousleaf"]=4 -use["mixedforest"]=5 -use["closedshrub"]=6 -use["openshrub"]=7 -use["woody"]=8 -use["savanna"]=9 -use["grassland"]=10 -use["wetland"]=11 -use["cropland"]=12 -use["urban"]=13 -use["vegetation"]=14 -use["ice"]=15 -use["barren"]=16 -use["unclassified"]=17 Deleted: SwiftApps/modis/bin/analyzelandusep1.sh =================================================================== --- SwiftApps/modis/bin/analyzelandusep1.sh 2013-02-13 03:56:56 UTC (rev 6263) +++ SwiftApps/modis/bin/analyzelandusep1.sh 2013-02-13 17:31:30 UTC (rev 6264) @@ -1,146 +0,0 @@ -# -# Return (simple) stats and filenames for the tiles with the $num highest values of $wanteduses -# - -stats=$1 -tilelist=$2 -wanteduses=$3 -num=$4 -shift 4 - -awk -v wanteduses="$wanteduses" ' - BEGIN { - sum = 0; - filename = ""; - - use["water"]=0 - use["evergreen needleleaf forest"]=1 - use["evergreen broadleaf forest"]=2 - use["deciduous needleleaf forest"]=3 - use["deciduous broadleaf forest"]=4 - use["mixed forests"]=5 - use["closed shrubland"]=6 - use["open shrublands"]=7 - use["woody savannas"]=8 - use["savannas"]=9 - use["grasslands"]=10 - use["permanent wetlands"]=11 - use["croplands"]=12 - use["urban and built-up"]=13 - use["cropland/natural vegetation mosaic"]=14 - use["snow and ice"]=15 - use["barren or sparsely vegetated"]=16 - use["unclassified"]=254 - - split(wanteduses,wants,"[ ,]+") - for (w in wants) { - for (u in use) { - if (index(u, wants[w])) { - wantuse[use[u]] = 1 - } - } - } - } - { - if (FNR==1) { - if(filename != "") { print filename, sum} - filename = FILENAME - sum = 0 - } - } - - wantuse[$2] { - sum += $1 - } - END { print filename, sum} ' $* | -sort -n -k +2 | -tail -${num} >$stats - -( awk '{print $1}' | - sed -e 's/landuse.//' -e 's/\..*/.tif/' -e 's,^,/home/wilde/bigdata/data/modis/2002/,' \ -) <$stats >$tilelist - -exit - -login1$ cat topurban.txt -landuse/h20v04.landuse.byfreq 67312 13 0d -landuse/h28v06.landuse.byfreq 82267 13 0d -landuse/h08v05.landuse.byfreq 92674 13 0d -landuse/h11v04.landuse.byfreq 93702 13 0d -landuse/h13v11.landuse.byfreq 104302 13 0d -landuse/h12v04.landuse.byfreq 110772 13 0d -landuse/h19v04.landuse.byfreq 120908 13 0d -landuse/h27v05.landuse.byfreq 128794 13 0d -landuse/h18v03.landuse.byfreq 142756 13 0d -landuse/h18v04.landuse.byfreq 146486 13 0d - -login1$ cat urbantiles.txt -/home/wilde/bigdata/data/modis/2002landuse/h20v04.tif -/home/wilde/bigdata/data/modis/2002landuse/h28v06.tif -/home/wilde/bigdata/data/modis/2002landuse/h08v05.tif -/home/wilde/bigdata/data/modis/2002landuse/h11v04.tif -/home/wilde/bigdata/data/modis/2002landuse/h13v11.tif -/home/wilde/bigdata/data/modis/2002landuse/h12v04.tif -/home/wilde/bigdata/data/modis/2002landuse/h19v04.tif -/home/wilde/bigdata/data/modis/2002landuse/h27v05.tif -/home/wilde/bigdata/data/modis/2002landuse/h18v03.tif -/home/wilde/bigdata/data/modis/2002landuse/h18v04.tif -login1$ - - 0 water - 1 evergreen needleleaf forest - 2 evergreen broadleaf forest - 3 deciduous needleleaf forest - 4 deciduous broadleaf forest - 5 mixed forests - 6 closed shrubland - 7 open shrublands - 8 woody savannas - 9 savannas - 10 grasslands - 11 permanent wetlands - 12 croplands - 13 urban and built-up - 14 cropland/natural vegetation mosaic - 15 snow and ice - 16 barren or sparsely vegetated - 254 unclassified - - use["water"]=0 - use["evergreen needleleaf forest"]=1 - use["evergreen broadleaf forest"]=2 - use["deciduous needleleaf forest"]=3 - use["deciduous broadleaf forest"]=4 - use["mixed forests"]=5 - use["closed shrubland"]=6 - use["open shrublands"]=7 - use["woody savannas"]=8 - use["savannas"]=9 - use["grasslands"]=10 - use["permanent wetlands"]=11 - use["croplands"]=12 - use["urban and built-up"]=13 - use["cropland/natural vegetation mosaic"]=14 - use["snow and ice"]=15 - use["barren or sparsely vegetated"]=16 - use["unclassified"]=254 - - -use["water"]=0 -use["evergreenneedle"]=1 -use["evergreenleaf"]=2 -use["deciduousneedle"]=3 -use["deciduousleaf"]=4 -use["mixedforest"]=5 -use["closedshrub"]=6 -use["openshrub"]=7 -use["woody"]=8 -use["savanna"]=9 -use["grassland"]=10 -use["wetland"]=11 -use["cropland"]=12 -use["urban"]=13 -use["vegetation"]=14 -use["ice"]=15 -use["barren"]=16 -use["unclassified"]=17 Added: SwiftApps/modis/bin/draw_rectangle.pl =================================================================== --- SwiftApps/modis/bin/draw_rectangle.pl (rev 0) +++ SwiftApps/modis/bin/draw_rectangle.pl 2013-02-13 17:31:30 UTC (rev 6264) @@ -0,0 +1,45 @@ +#!/usr/bin/perl + +# Draw a rectangle on a gzipped PPM +# Usage: draw_rectangle.pl infile.ppm.gz xmin ymin xmax ymax outfile.ppm.gz + +my ($pgm_input_filename, $xmin, $ymin, $xmax, $ymax, $pgm_output_filename) = @ARGV; +open(PGMFILE_INPUT, "gunzip -c $pgm_input_filename |") || die "Unable to open $pgm_input_filename!"; +open(PGMFILE_OUTPUT, "| gzip -c > $pgm_output_filename") || die "Unable to create $pgm_output_filename"; + +# Read header +my $magic = ; +my $resolution = ; +my $maxvalue = ; +(my $xres, my $yres) = split(' ', $resolution); + +# Write new header +print PGMFILE_OUTPUT "$magic" . "$resolution" . "$maxvalue"; + +# Read data three bytes at a time (RGB) +$/ = \3; +my $x=0, $y=0; +while() { + (my $red, my $green, my $blue) = unpack('C3', $_); + + # Left and right of rectangle, 2 pixels wide + if ( $x == $xmin || $x == $xmin+1 || $x == $xmax || $x == $xmax-1 ) { + if ( $y <= $ymax && $y >= $ymin ) { + $red="255"; $blue="0"; $green="0"; } + } + + # Top and bottom, 2 pixels high + if ( $y == $ymin || $y == $ymin-1 || $y == $ymax || $y == $ymax-1 ) { + if ( $x <= $xmax && $x >= $xmin ) { + $red="255"; $blue="0"; $green="0"; + } + } + + print PGMFILE_OUTPUT pack('C3', $red, $green, $blue); + + if($x == $xres-1) { $x = 0; $y++; } + else { $x++; } +} + +close(PGMFILE_INPUT); +close(PGMFILE_OUTPUT); Property changes on: SwiftApps/modis/bin/draw_rectangle.pl ___________________________________________________________________ Added: svn:executable + * Added: SwiftApps/modis/bin/getlanduse.pl =================================================================== --- SwiftApps/modis/bin/getlanduse.pl (rev 0) +++ SwiftApps/modis/bin/getlanduse.pl 2013-02-13 17:31:30 UTC (rev 6264) @@ -0,0 +1,32 @@ +#!/usr/bin/perl -w + +# Input to this program should be a gzipped PGM file +# Usage: pgmhist.pl myfile.pgm.gz + +my $pgm_filename = shift; +open(PGMFILE, "gunzip -c $pgm_filename |") || die "Unable to open $pgm_filename!\n"; + +# Header +my $magic = ; +my $resolution = ; +my $maxvalue = ; + +# Use arrays to count frequencies +my @pixelcount; +foreach my $count(0..$maxvalue) { + $pixelcount[$count] = 0; +} + +# Read values +foreach() { + foreach $word(split) { + $pixelcount[$word]++; + } +} +close(PGMFILE); + +foreach my $count(0..$maxvalue) { + if($pixelcount[$count] == 0){ next; } + printf("%d %d %02x\n", $pixelcount[$count], $count, $count); +} + Property changes on: SwiftApps/modis/bin/getlanduse.pl ___________________________________________________________________ Added: svn:executable + * Modified: SwiftApps/modis/bin/getlanduse.sh =================================================================== --- SwiftApps/modis/bin/getlanduse.sh 2013-02-13 03:56:56 UTC (rev 6263) +++ SwiftApps/modis/bin/getlanduse.sh 2013-02-13 17:31:30 UTC (rev 6264) @@ -1,10 +1,4 @@ #!/bin/bash -# -# Read a MODIS .tif file and return a histogram of pixel values. -# The pixel values signify land use for that region (see legend in notes) -# -# Usage: getlanduse.sh modisFile histogramFile -# - -$3/../../../bin/ppmhist.pl $1 | sort -n -k $2 +BINDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +$BINDIR/getlanduse.pl $1 | sort -rn Added: SwiftApps/modis/bin/grid.ppm.gz =================================================================== (Binary files differ) Property changes on: SwiftApps/modis/bin/grid.ppm.gz ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Deleted: SwiftApps/modis/bin/imagehist.sh =================================================================== --- SwiftApps/modis/bin/imagehist.sh 2013-02-13 03:56:56 UTC (rev 6263) +++ SwiftApps/modis/bin/imagehist.sh 2013-02-13 17:31:30 UTC (rev 6264) @@ -1 +0,0 @@ -convert $1 -format %c histogram:info:- 2>/dev/null | grep : | sort -nr Modified: SwiftApps/modis/bin/markmap.sh =================================================================== --- SwiftApps/modis/bin/markmap.sh 2013-02-13 03:56:56 UTC (rev 6263) +++ SwiftApps/modis/bin/markmap.sh 2013-02-13 17:31:30 UTC (rev 6264) @@ -1,25 +1,18 @@ +#!/bin/bash + # markmap selectedTileFile outputMap +BINDIR=$(cd $(dirname $0); pwd) -bin=$(cd $(dirname $0); pwd) - tilefile=$1 outmap=$2 -cp $bin/grid.gif $outmap +cp $BINDIR/grid.ppm.gz $outmap + cat $tilefile | while read f ; do hv=$(echo $f | sed -e 's,^.*/,,' -e 's/\..*//') h=$(echo $hv | sed -e 's/h//' -e 's/v..//' -e 's/^0//') v=$(echo $hv | sed -e 's/h..//' -e 's/v//' -e 's/^0//') echo hv=$hv h=$h v=$v - convert $outmap -stroke red -linewidth 2 -fill transparent \ - -draw "rectangle $((34+$h*16)),$((51+$v*16)) $((34+14+$h*16)),$((51+14+$v*16))" $outmap + $BINDIR/draw_rectangle.pl $outmap $((34+$h*16)) $((51+$v*16)) $((34+14+$h*16)) $((51+14+$v*16)) $outmap.tmp + mv $outmap.tmp $outmap done - -exit - -# example: - -h=18 -v=8 -cp grid.gif g.gif -convert g.gif -stroke red -linewidth 2 -fill transparent -draw "rectangle $((34+$h*16)),$((51+$v*16)) $((34+14+$h*16)),$((51+14+$v*16))" g.gif Deleted: SwiftApps/modis/bin/ppmhist.pl =================================================================== --- SwiftApps/modis/bin/ppmhist.pl 2013-02-13 03:56:56 UTC (rev 6263) +++ SwiftApps/modis/bin/ppmhist.pl 2013-02-13 17:31:30 UTC (rev 6264) @@ -1,42 +0,0 @@ -#!/usr/bin/perl -w - -use strict; - -# Read file -my $ppm_filename = shift; -open(PPMFILE, "gunzip -c $ppm_filename |") || die "Unable to open $ppm_filename!\n"; -my @ppm_data = ; -close(PPMFILE); - -my %rgbcount = (); -my $count=0; -my $ppmformat="", my $resolution="", my $maxval=""; - -foreach my $line(@ppm_data) { - chomp($line); - if ($count == 0){ $ppmformat=$line; $count++; next; } - if ($count == 1){ $resolution=$line; $count++; next; } - if ($count == 2){ $maxval=$line; $count++; next; } - - my $wordcount=0, my $red="", my $green="", my $blue=""; - foreach my $rgb(split(/\s+/, $line)) { - if($wordcount == 0) { $red=$rgb; $wordcount++; next; } - if($wordcount == 1) { $green=$rgb; $wordcount++; next; } - if($wordcount == 2) { - $blue=$rgb; - if(!defined($rgbcount{"$red $green $blue"})) { - $rgbcount{"$red $green $blue"}=1; - } else { - $rgbcount{"$red $green $blue"}++; - } - $wordcount=0; - } - } - $count++; -} - -while ( my ($key, $value) = each(%rgbcount) ) { - (my $red, my $green, my $blue) = split(/ /, $key); - my $hex = sprintf("%02x",$red); - print "$value $red $hex\n"; -} Deleted: SwiftApps/modis/bin/setglobushost.sh =================================================================== --- SwiftApps/modis/bin/setglobushost.sh 2013-02-13 03:56:56 UTC (rev 6263) +++ SwiftApps/modis/bin/setglobushost.sh 2013-02-13 17:31:30 UTC (rev 6264) @@ -1,2 +0,0 @@ -ipaddr=`/sbin/ifconfig | grep inet | head -1 | cut -d ':' -f 2 |awk '{print $1}'` -export GLOBUS_HOSTNAME=$ipaddr From davidk at ci.uchicago.edu Wed Feb 13 12:12:29 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Wed, 13 Feb 2013 12:12:29 -0600 (CST) Subject: [Swift-commit] r6265 - SwiftApps/modis/data/modis/2002 Message-ID: <20130213181229.4D60A9CCE5@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-13 12:12:28 -0600 (Wed, 13 Feb 2013) New Revision: 6265 Added: SwiftApps/modis/data/modis/2002/README.data Removed: SwiftApps/modis/data/modis/2002/h00v08.ppm.gz SwiftApps/modis/data/modis/2002/h00v09.ppm.gz SwiftApps/modis/data/modis/2002/h00v10.ppm.gz SwiftApps/modis/data/modis/2002/h01v07.ppm.gz SwiftApps/modis/data/modis/2002/h01v08.ppm.gz SwiftApps/modis/data/modis/2002/h01v09.ppm.gz SwiftApps/modis/data/modis/2002/h01v10.ppm.gz SwiftApps/modis/data/modis/2002/h01v11.ppm.gz SwiftApps/modis/data/modis/2002/h02v06.ppm.gz SwiftApps/modis/data/modis/2002/h02v08.ppm.gz SwiftApps/modis/data/modis/2002/h02v09.ppm.gz SwiftApps/modis/data/modis/2002/h02v10.ppm.gz SwiftApps/modis/data/modis/2002/h02v11.ppm.gz SwiftApps/modis/data/modis/2002/h03v06.ppm.gz SwiftApps/modis/data/modis/2002/h03v07.ppm.gz SwiftApps/modis/data/modis/2002/h03v09.ppm.gz SwiftApps/modis/data/modis/2002/h03v10.ppm.gz SwiftApps/modis/data/modis/2002/h03v11.ppm.gz SwiftApps/modis/data/modis/2002/h04v09.ppm.gz SwiftApps/modis/data/modis/2002/h04v10.ppm.gz SwiftApps/modis/data/modis/2002/h04v11.ppm.gz SwiftApps/modis/data/modis/2002/h05v10.ppm.gz SwiftApps/modis/data/modis/2002/h05v11.ppm.gz SwiftApps/modis/data/modis/2002/h05v13.ppm.gz SwiftApps/modis/data/modis/2002/h06v03.ppm.gz SwiftApps/modis/data/modis/2002/h06v11.ppm.gz SwiftApps/modis/data/modis/2002/h07v03.ppm.gz SwiftApps/modis/data/modis/2002/h07v05.ppm.gz SwiftApps/modis/data/modis/2002/h07v06.ppm.gz SwiftApps/modis/data/modis/2002/h07v07.ppm.gz SwiftApps/modis/data/modis/2002/h08v03.ppm.gz SwiftApps/modis/data/modis/2002/h08v04.ppm.gz SwiftApps/modis/data/modis/2002/h08v05.ppm.gz SwiftApps/modis/data/modis/2002/h08v06.ppm.gz SwiftApps/modis/data/modis/2002/h08v07.ppm.gz SwiftApps/modis/data/modis/2002/h08v08.ppm.gz SwiftApps/modis/data/modis/2002/h08v09.ppm.gz SwiftApps/modis/data/modis/2002/h08v11.ppm.gz SwiftApps/modis/data/modis/2002/h09v02.ppm.gz SwiftApps/modis/data/modis/2002/h09v03.ppm.gz SwiftApps/modis/data/modis/2002/h09v04.ppm.gz SwiftApps/modis/data/modis/2002/h09v05.ppm.gz SwiftApps/modis/data/modis/2002/h09v06.ppm.gz SwiftApps/modis/data/modis/2002/h09v07.ppm.gz SwiftApps/modis/data/modis/2002/h09v08.ppm.gz SwiftApps/modis/data/modis/2002/h09v09.ppm.gz SwiftApps/modis/data/modis/2002/h10v02.ppm.gz SwiftApps/modis/data/modis/2002/h10v03.ppm.gz SwiftApps/modis/data/modis/2002/h10v04.ppm.gz SwiftApps/modis/data/modis/2002/h10v05.ppm.gz SwiftApps/modis/data/modis/2002/h10v06.ppm.gz SwiftApps/modis/data/modis/2002/h10v07.ppm.gz SwiftApps/modis/data/modis/2002/h10v08.ppm.gz SwiftApps/modis/data/modis/2002/h10v09.ppm.gz SwiftApps/modis/data/modis/2002/h10v10.ppm.gz SwiftApps/modis/data/modis/2002/h10v11.ppm.gz SwiftApps/modis/data/modis/2002/h11v02.ppm.gz SwiftApps/modis/data/modis/2002/h11v03.ppm.gz SwiftApps/modis/data/modis/2002/h11v04.ppm.gz SwiftApps/modis/data/modis/2002/h11v05.ppm.gz SwiftApps/modis/data/modis/2002/h11v06.ppm.gz SwiftApps/modis/data/modis/2002/h11v07.ppm.gz SwiftApps/modis/data/modis/2002/h11v08.ppm.gz SwiftApps/modis/data/modis/2002/h11v09.ppm.gz SwiftApps/modis/data/modis/2002/h11v10.ppm.gz SwiftApps/modis/data/modis/2002/h11v11.ppm.gz SwiftApps/modis/data/modis/2002/h11v12.ppm.gz SwiftApps/modis/data/modis/2002/h12v01.ppm.gz SwiftApps/modis/data/modis/2002/h12v02.ppm.gz SwiftApps/modis/data/modis/2002/h12v03.ppm.gz SwiftApps/modis/data/modis/2002/h12v04.ppm.gz SwiftApps/modis/data/modis/2002/h12v05.ppm.gz SwiftApps/modis/data/modis/2002/h12v07.ppm.gz SwiftApps/modis/data/modis/2002/h12v08.ppm.gz SwiftApps/modis/data/modis/2002/h12v09.ppm.gz SwiftApps/modis/data/modis/2002/h12v10.ppm.gz SwiftApps/modis/data/modis/2002/h12v11.ppm.gz SwiftApps/modis/data/modis/2002/h12v12.ppm.gz SwiftApps/modis/data/modis/2002/h12v13.ppm.gz SwiftApps/modis/data/modis/2002/h13v01.ppm.gz SwiftApps/modis/data/modis/2002/h13v02.ppm.gz SwiftApps/modis/data/modis/2002/h13v03.ppm.gz SwiftApps/modis/data/modis/2002/h13v04.ppm.gz SwiftApps/modis/data/modis/2002/h13v08.ppm.gz SwiftApps/modis/data/modis/2002/h13v09.ppm.gz SwiftApps/modis/data/modis/2002/h13v10.ppm.gz SwiftApps/modis/data/modis/2002/h13v11.ppm.gz SwiftApps/modis/data/modis/2002/h13v12.ppm.gz SwiftApps/modis/data/modis/2002/h13v13.ppm.gz SwiftApps/modis/data/modis/2002/h13v14.ppm.gz SwiftApps/modis/data/modis/2002/h14v01.ppm.gz SwiftApps/modis/data/modis/2002/h14v02.ppm.gz SwiftApps/modis/data/modis/2002/h14v03.ppm.gz SwiftApps/modis/data/modis/2002/h14v04.ppm.gz SwiftApps/modis/data/modis/2002/h14v09.ppm.gz SwiftApps/modis/data/modis/2002/h14v10.ppm.gz SwiftApps/modis/data/modis/2002/h14v11.ppm.gz SwiftApps/modis/data/modis/2002/h14v14.ppm.gz SwiftApps/modis/data/modis/2002/h14v16.ppm.gz SwiftApps/modis/data/modis/2002/h14v17.ppm.gz SwiftApps/modis/data/modis/2002/h15v01.ppm.gz SwiftApps/modis/data/modis/2002/h15v02.ppm.gz SwiftApps/modis/data/modis/2002/h15v03.ppm.gz SwiftApps/modis/data/modis/2002/h15v05.ppm.gz SwiftApps/modis/data/modis/2002/h15v07.ppm.gz SwiftApps/modis/data/modis/2002/h15v11.ppm.gz SwiftApps/modis/data/modis/2002/h15v14.ppm.gz SwiftApps/modis/data/modis/2002/h15v15.ppm.gz SwiftApps/modis/data/modis/2002/h15v16.ppm.gz SwiftApps/modis/data/modis/2002/h15v17.ppm.gz SwiftApps/modis/data/modis/2002/h16v00.ppm.gz SwiftApps/modis/data/modis/2002/h16v01.ppm.gz SwiftApps/modis/data/modis/2002/h16v02.ppm.gz SwiftApps/modis/data/modis/2002/h16v05.ppm.gz SwiftApps/modis/data/modis/2002/h16v06.ppm.gz SwiftApps/modis/data/modis/2002/h16v07.ppm.gz SwiftApps/modis/data/modis/2002/h16v08.ppm.gz SwiftApps/modis/data/modis/2002/h16v09.ppm.gz SwiftApps/modis/data/modis/2002/h16v12.ppm.gz SwiftApps/modis/data/modis/2002/h16v14.ppm.gz SwiftApps/modis/data/modis/2002/h16v16.ppm.gz SwiftApps/modis/data/modis/2002/h16v17.ppm.gz SwiftApps/modis/data/modis/2002/h17v00.ppm.gz SwiftApps/modis/data/modis/2002/h17v01.ppm.gz SwiftApps/modis/data/modis/2002/h17v02.ppm.gz SwiftApps/modis/data/modis/2002/h17v03.ppm.gz SwiftApps/modis/data/modis/2002/h17v04.ppm.gz SwiftApps/modis/data/modis/2002/h17v05.ppm.gz SwiftApps/modis/data/modis/2002/h17v06.ppm.gz SwiftApps/modis/data/modis/2002/h17v07.ppm.gz SwiftApps/modis/data/modis/2002/h17v08.ppm.gz SwiftApps/modis/data/modis/2002/h17v10.ppm.gz SwiftApps/modis/data/modis/2002/h17v12.ppm.gz SwiftApps/modis/data/modis/2002/h17v13.ppm.gz SwiftApps/modis/data/modis/2002/h17v15.ppm.gz SwiftApps/modis/data/modis/2002/h17v16.ppm.gz SwiftApps/modis/data/modis/2002/h17v17.ppm.gz SwiftApps/modis/data/modis/2002/h18v00.ppm.gz SwiftApps/modis/data/modis/2002/h18v01.ppm.gz SwiftApps/modis/data/modis/2002/h18v02.ppm.gz SwiftApps/modis/data/modis/2002/h18v03.ppm.gz SwiftApps/modis/data/modis/2002/h18v04.ppm.gz SwiftApps/modis/data/modis/2002/h18v05.ppm.gz SwiftApps/modis/data/modis/2002/h18v06.ppm.gz SwiftApps/modis/data/modis/2002/h18v07.ppm.gz SwiftApps/modis/data/modis/2002/h18v08.ppm.gz SwiftApps/modis/data/modis/2002/h18v09.ppm.gz SwiftApps/modis/data/modis/2002/h18v14.ppm.gz SwiftApps/modis/data/modis/2002/h18v15.ppm.gz SwiftApps/modis/data/modis/2002/h18v16.ppm.gz SwiftApps/modis/data/modis/2002/h18v17.ppm.gz SwiftApps/modis/data/modis/2002/h19v00.ppm.gz SwiftApps/modis/data/modis/2002/h19v01.ppm.gz SwiftApps/modis/data/modis/2002/h19v02.ppm.gz SwiftApps/modis/data/modis/2002/h19v03.ppm.gz SwiftApps/modis/data/modis/2002/h19v04.ppm.gz SwiftApps/modis/data/modis/2002/h19v05.ppm.gz SwiftApps/modis/data/modis/2002/h19v06.ppm.gz SwiftApps/modis/data/modis/2002/h19v07.ppm.gz SwiftApps/modis/data/modis/2002/h19v08.ppm.gz SwiftApps/modis/data/modis/2002/h19v09.ppm.gz SwiftApps/modis/data/modis/2002/h19v10.ppm.gz SwiftApps/modis/data/modis/2002/h19v11.ppm.gz SwiftApps/modis/data/modis/2002/h19v12.ppm.gz SwiftApps/modis/data/modis/2002/h19v15.ppm.gz SwiftApps/modis/data/modis/2002/h19v16.ppm.gz SwiftApps/modis/data/modis/2002/h19v17.ppm.gz SwiftApps/modis/data/modis/2002/h20v01.ppm.gz SwiftApps/modis/data/modis/2002/h20v02.ppm.gz SwiftApps/modis/data/modis/2002/h20v03.ppm.gz SwiftApps/modis/data/modis/2002/h20v04.ppm.gz SwiftApps/modis/data/modis/2002/h20v05.ppm.gz SwiftApps/modis/data/modis/2002/h20v06.ppm.gz SwiftApps/modis/data/modis/2002/h20v07.ppm.gz SwiftApps/modis/data/modis/2002/h20v08.ppm.gz SwiftApps/modis/data/modis/2002/h20v09.ppm.gz SwiftApps/modis/data/modis/2002/h20v10.ppm.gz SwiftApps/modis/data/modis/2002/h20v11.ppm.gz SwiftApps/modis/data/modis/2002/h20v12.ppm.gz SwiftApps/modis/data/modis/2002/h20v13.ppm.gz SwiftApps/modis/data/modis/2002/h20v15.ppm.gz SwiftApps/modis/data/modis/2002/h20v16.ppm.gz SwiftApps/modis/data/modis/2002/h20v17.ppm.gz SwiftApps/modis/data/modis/2002/h21v01.ppm.gz SwiftApps/modis/data/modis/2002/h21v02.ppm.gz SwiftApps/modis/data/modis/2002/h21v03.ppm.gz SwiftApps/modis/data/modis/2002/h21v04.ppm.gz SwiftApps/modis/data/modis/2002/h21v05.ppm.gz SwiftApps/modis/data/modis/2002/h21v06.ppm.gz SwiftApps/modis/data/modis/2002/h21v07.ppm.gz SwiftApps/modis/data/modis/2002/h21v08.ppm.gz SwiftApps/modis/data/modis/2002/h21v09.ppm.gz SwiftApps/modis/data/modis/2002/h21v10.ppm.gz SwiftApps/modis/data/modis/2002/h21v11.ppm.gz SwiftApps/modis/data/modis/2002/h21v13.ppm.gz SwiftApps/modis/data/modis/2002/h21v15.ppm.gz SwiftApps/modis/data/modis/2002/h21v16.ppm.gz SwiftApps/modis/data/modis/2002/h21v17.ppm.gz SwiftApps/modis/data/modis/2002/h22v01.ppm.gz SwiftApps/modis/data/modis/2002/h22v02.ppm.gz SwiftApps/modis/data/modis/2002/h22v03.ppm.gz SwiftApps/modis/data/modis/2002/h22v04.ppm.gz SwiftApps/modis/data/modis/2002/h22v05.ppm.gz SwiftApps/modis/data/modis/2002/h22v06.ppm.gz SwiftApps/modis/data/modis/2002/h22v07.ppm.gz SwiftApps/modis/data/modis/2002/h22v08.ppm.gz SwiftApps/modis/data/modis/2002/h22v09.ppm.gz SwiftApps/modis/data/modis/2002/h22v10.ppm.gz SwiftApps/modis/data/modis/2002/h22v11.ppm.gz SwiftApps/modis/data/modis/2002/h22v13.ppm.gz SwiftApps/modis/data/modis/2002/h22v14.ppm.gz SwiftApps/modis/data/modis/2002/h22v15.ppm.gz SwiftApps/modis/data/modis/2002/h22v16.ppm.gz SwiftApps/modis/data/modis/2002/h23v01.ppm.gz SwiftApps/modis/data/modis/2002/h23v02.ppm.gz SwiftApps/modis/data/modis/2002/h23v03.ppm.gz SwiftApps/modis/data/modis/2002/h23v04.ppm.gz SwiftApps/modis/data/modis/2002/h23v05.ppm.gz SwiftApps/modis/data/modis/2002/h23v06.ppm.gz SwiftApps/modis/data/modis/2002/h23v07.ppm.gz SwiftApps/modis/data/modis/2002/h23v08.ppm.gz SwiftApps/modis/data/modis/2002/h23v09.ppm.gz SwiftApps/modis/data/modis/2002/h23v10.ppm.gz SwiftApps/modis/data/modis/2002/h23v11.ppm.gz SwiftApps/modis/data/modis/2002/h23v15.ppm.gz SwiftApps/modis/data/modis/2002/h23v16.ppm.gz SwiftApps/modis/data/modis/2002/h24v02.ppm.gz SwiftApps/modis/data/modis/2002/h24v03.ppm.gz SwiftApps/modis/data/modis/2002/h24v04.ppm.gz SwiftApps/modis/data/modis/2002/h24v05.ppm.gz SwiftApps/modis/data/modis/2002/h24v06.ppm.gz SwiftApps/modis/data/modis/2002/h24v07.ppm.gz SwiftApps/modis/data/modis/2002/h24v12.ppm.gz SwiftApps/modis/data/modis/2002/h24v15.ppm.gz SwiftApps/modis/data/modis/2002/h25v02.ppm.gz SwiftApps/modis/data/modis/2002/h25v03.ppm.gz SwiftApps/modis/data/modis/2002/h25v04.ppm.gz SwiftApps/modis/data/modis/2002/h25v05.ppm.gz SwiftApps/modis/data/modis/2002/h25v06.ppm.gz SwiftApps/modis/data/modis/2002/h25v07.ppm.gz SwiftApps/modis/data/modis/2002/h25v08.ppm.gz SwiftApps/modis/data/modis/2002/h25v09.ppm.gz SwiftApps/modis/data/modis/2002/h26v02.ppm.gz SwiftApps/modis/data/modis/2002/h26v03.ppm.gz SwiftApps/modis/data/modis/2002/h26v04.ppm.gz SwiftApps/modis/data/modis/2002/h26v05.ppm.gz SwiftApps/modis/data/modis/2002/h26v06.ppm.gz SwiftApps/modis/data/modis/2002/h26v07.ppm.gz SwiftApps/modis/data/modis/2002/h26v08.ppm.gz SwiftApps/modis/data/modis/2002/h27v03.ppm.gz SwiftApps/modis/data/modis/2002/h27v04.ppm.gz SwiftApps/modis/data/modis/2002/h27v05.ppm.gz SwiftApps/modis/data/modis/2002/h27v06.ppm.gz SwiftApps/modis/data/modis/2002/h27v07.ppm.gz SwiftApps/modis/data/modis/2002/h27v08.ppm.gz SwiftApps/modis/data/modis/2002/h27v09.ppm.gz SwiftApps/modis/data/modis/2002/h27v10.ppm.gz SwiftApps/modis/data/modis/2002/h27v11.ppm.gz SwiftApps/modis/data/modis/2002/h27v12.ppm.gz SwiftApps/modis/data/modis/2002/h27v14.ppm.gz SwiftApps/modis/data/modis/2002/h28v03.ppm.gz SwiftApps/modis/data/modis/2002/h28v04.ppm.gz SwiftApps/modis/data/modis/2002/h28v05.ppm.gz SwiftApps/modis/data/modis/2002/h28v06.ppm.gz SwiftApps/modis/data/modis/2002/h28v07.ppm.gz SwiftApps/modis/data/modis/2002/h28v08.ppm.gz SwiftApps/modis/data/modis/2002/h28v09.ppm.gz SwiftApps/modis/data/modis/2002/h28v10.ppm.gz SwiftApps/modis/data/modis/2002/h28v11.ppm.gz SwiftApps/modis/data/modis/2002/h28v12.ppm.gz SwiftApps/modis/data/modis/2002/h28v13.ppm.gz SwiftApps/modis/data/modis/2002/h28v14.ppm.gz SwiftApps/modis/data/modis/2002/h29v03.ppm.gz SwiftApps/modis/data/modis/2002/h29v05.ppm.gz SwiftApps/modis/data/modis/2002/h29v06.ppm.gz SwiftApps/modis/data/modis/2002/h29v07.ppm.gz SwiftApps/modis/data/modis/2002/h29v08.ppm.gz SwiftApps/modis/data/modis/2002/h29v09.ppm.gz SwiftApps/modis/data/modis/2002/h29v10.ppm.gz SwiftApps/modis/data/modis/2002/h29v11.ppm.gz SwiftApps/modis/data/modis/2002/h29v12.ppm.gz SwiftApps/modis/data/modis/2002/h29v13.ppm.gz SwiftApps/modis/data/modis/2002/h30v05.ppm.gz SwiftApps/modis/data/modis/2002/h30v06.ppm.gz SwiftApps/modis/data/modis/2002/h30v07.ppm.gz SwiftApps/modis/data/modis/2002/h30v08.ppm.gz SwiftApps/modis/data/modis/2002/h30v09.ppm.gz SwiftApps/modis/data/modis/2002/h30v10.ppm.gz SwiftApps/modis/data/modis/2002/h30v11.ppm.gz SwiftApps/modis/data/modis/2002/h30v12.ppm.gz SwiftApps/modis/data/modis/2002/h30v13.ppm.gz SwiftApps/modis/data/modis/2002/h31v06.ppm.gz SwiftApps/modis/data/modis/2002/h31v07.ppm.gz SwiftApps/modis/data/modis/2002/h31v08.ppm.gz SwiftApps/modis/data/modis/2002/h31v09.ppm.gz SwiftApps/modis/data/modis/2002/h31v10.ppm.gz SwiftApps/modis/data/modis/2002/h31v11.ppm.gz SwiftApps/modis/data/modis/2002/h31v12.ppm.gz SwiftApps/modis/data/modis/2002/h31v13.ppm.gz SwiftApps/modis/data/modis/2002/h32v07.ppm.gz SwiftApps/modis/data/modis/2002/h32v08.ppm.gz SwiftApps/modis/data/modis/2002/h32v09.ppm.gz SwiftApps/modis/data/modis/2002/h32v10.ppm.gz SwiftApps/modis/data/modis/2002/h32v11.ppm.gz SwiftApps/modis/data/modis/2002/h32v12.ppm.gz SwiftApps/modis/data/modis/2002/h33v07.ppm.gz SwiftApps/modis/data/modis/2002/h33v08.ppm.gz SwiftApps/modis/data/modis/2002/h33v09.ppm.gz SwiftApps/modis/data/modis/2002/h33v10.ppm.gz SwiftApps/modis/data/modis/2002/h33v11.ppm.gz SwiftApps/modis/data/modis/2002/h34v07.ppm.gz SwiftApps/modis/data/modis/2002/h34v08.ppm.gz SwiftApps/modis/data/modis/2002/h34v09.ppm.gz SwiftApps/modis/data/modis/2002/h34v10.ppm.gz SwiftApps/modis/data/modis/2002/h35v08.ppm.gz SwiftApps/modis/data/modis/2002/h35v09.ppm.gz SwiftApps/modis/data/modis/2002/h35v10.ppm.gz Log: Remove data from SVN - add a pointer to where to download it from Added: SwiftApps/modis/data/modis/2002/README.data =================================================================== --- SwiftApps/modis/data/modis/2002/README.data (rev 0) +++ SwiftApps/modis/data/modis/2002/README.data 2013-02-13 18:12:28 UTC (rev 6265) @@ -0,0 +1 @@ +Download and extract modis data from http://www.ci.uchicago.edu/swift/modis/modis-2002.tar. It's approximately 140MB. Deleted: SwiftApps/modis/data/modis/2002/h00v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h00v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h00v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h01v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h01v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h01v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h01v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h01v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h02v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h02v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h02v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h02v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h02v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h03v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h03v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h03v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h03v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h03v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h04v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h04v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h04v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h05v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h05v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h05v13.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h06v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h06v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h07v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h07v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h07v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h07v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h08v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h08v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h08v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h08v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h08v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h08v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h08v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h08v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h09v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h09v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h09v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h09v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h09v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h09v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h09v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h09v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h10v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h10v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h10v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h10v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h10v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h10v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h10v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h10v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h10v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h10v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h11v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h11v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h11v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h11v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h11v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h11v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h11v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h11v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h11v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h11v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h11v12.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h12v01.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h12v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h12v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h12v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h12v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h12v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h12v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h12v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h12v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h12v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h12v12.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h12v13.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h13v01.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h13v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h13v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h13v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h13v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h13v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h13v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h13v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h13v12.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h13v13.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h13v14.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h14v01.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h14v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h14v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h14v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h14v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h14v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h14v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h14v14.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h14v16.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h14v17.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h15v01.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h15v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h15v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h15v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h15v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h15v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h15v14.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h15v15.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h15v16.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h15v17.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h16v00.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h16v01.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h16v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h16v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h16v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h16v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h16v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h16v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h16v12.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h16v14.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h16v16.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h16v17.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h17v00.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h17v01.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h17v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h17v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h17v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h17v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h17v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h17v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h17v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h17v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h17v12.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h17v13.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h17v15.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h17v16.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h17v17.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h18v00.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h18v01.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h18v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h18v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h18v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h18v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h18v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h18v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h18v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h18v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h18v14.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h18v15.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h18v16.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h18v17.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h19v00.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h19v01.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h19v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h19v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h19v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h19v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h19v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h19v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h19v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h19v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h19v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h19v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h19v12.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h19v15.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h19v16.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h19v17.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h20v01.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h20v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h20v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h20v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h20v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h20v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h20v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h20v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h20v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h20v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h20v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h20v12.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h20v13.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h20v15.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h20v16.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h20v17.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h21v01.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h21v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h21v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h21v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h21v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h21v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h21v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h21v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h21v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h21v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h21v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h21v13.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h21v15.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h21v16.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h21v17.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h22v01.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h22v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h22v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h22v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h22v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h22v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h22v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h22v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h22v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h22v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h22v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h22v13.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h22v14.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h22v15.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h22v16.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h23v01.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h23v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h23v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h23v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h23v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h23v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h23v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h23v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h23v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h23v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h23v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h23v15.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h23v16.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h24v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h24v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h24v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h24v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h24v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h24v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h24v12.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h24v15.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h25v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h25v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h25v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h25v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h25v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h25v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h25v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h25v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h26v02.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h26v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h26v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h26v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h26v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h26v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h26v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h27v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h27v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h27v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h27v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h27v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h27v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h27v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h27v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h27v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h27v12.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h27v14.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h28v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h28v04.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h28v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h28v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h28v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h28v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h28v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h28v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h28v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h28v12.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h28v13.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h28v14.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h29v03.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h29v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h29v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h29v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h29v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h29v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h29v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h29v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h29v12.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h29v13.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h30v05.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h30v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h30v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h30v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h30v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h30v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h30v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h30v12.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h30v13.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h31v06.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h31v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h31v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h31v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h31v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h31v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h31v12.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h31v13.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h32v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h32v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h32v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h32v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h32v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h32v12.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h33v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h33v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h33v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h33v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h33v11.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h34v07.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h34v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h34v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h34v10.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h35v08.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h35v09.ppm.gz =================================================================== (Binary files differ) Deleted: SwiftApps/modis/data/modis/2002/h35v10.ppm.gz =================================================================== (Binary files differ) From davidk at ci.uchicago.edu Wed Feb 13 12:15:05 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Wed, 13 Feb 2013 12:15:05 -0600 (CST) Subject: [Swift-commit] r6266 - in SwiftApps/modis: . conf Message-ID: <20130213181505.580BE9CCE5@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-13 12:15:05 -0600 (Wed, 13 Feb 2013) New Revision: 6266 Modified: SwiftApps/modis/clean.sh SwiftApps/modis/conf/local.cf SwiftApps/modis/demo SwiftApps/modis/modis.swift Log: Modified: SwiftApps/modis/clean.sh =================================================================== --- SwiftApps/modis/clean.sh 2013-02-13 18:12:28 UTC (rev 6265) +++ SwiftApps/modis/clean.sh 2013-02-13 18:15:05 UTC (rev 6266) @@ -1,3 +1,3 @@ #!/bin/bash -rm -rf run0* +rm -rf run* Modified: SwiftApps/modis/conf/local.cf =================================================================== --- SwiftApps/modis/conf/local.cf 2013-02-13 18:12:28 UTC (rev 6265) +++ SwiftApps/modis/conf/local.cf 2013-02-13 18:15:05 UTC (rev 6266) @@ -8,7 +8,7 @@ #site local JOBTHROTTLE=0.038 #app getlanduse=$PWD/../bin/getlanduse.sh -#app analyzelanduse=$PWD/../bin/analyzelanduse2.sh +#app analyzelanduse=$PWD/../bin/analyzelanduse.sh #app colormodis=$PWD/../bin/colormodis.sh #app assemble=$PWD/../bin/assemble2.sh #app markmap=$PWD/../bin/markmap.sh Modified: SwiftApps/modis/demo =================================================================== --- SwiftApps/modis/demo 2013-02-13 18:12:28 UTC (rev 6265) +++ SwiftApps/modis/demo 2013-02-13 18:15:05 UTC (rev 6266) @@ -3,7 +3,7 @@ # Defaults LANDTYPE=urban NFILES=1000 -NSELECT=12 +NSELECT=10 SITE=local WEBDIR=$HOME/public_html/geo MODISDIR=$PWD/data/modis/2002 Modified: SwiftApps/modis/modis.swift =================================================================== --- SwiftApps/modis/modis.swift 2013-02-13 18:12:28 UTC (rev 6265) +++ SwiftApps/modis/modis.swift 2013-02-13 18:15:05 UTC (rev 6266) @@ -2,28 +2,24 @@ type imagefile; type landuse; -# Define application program interfaces - app (landuse output) getLandUse (imagefile input, int sortfield, string mpath) { getlanduse @input sortfield mpath stdout=@output; } -app (file output, file tilelist) analyzeLandUse - (landuse input[], string usetype, int maxnum) +app (file output, file tilelist) analyzeLandUse (landuse input[], string usetype, int maxnum) { - analyzelanduse @output @tilelist usetype maxnum @filenames(input); + analyzelanduse @output @tilelist usetype maxnum @input; } -app (imagefile output) colorMODIS (imagefile input) +app (imagefile output, file olog, file elog) colorMODIS (imagefile input) { - colormodis @input @output; + colormodis @input @output stdout=@olog stderr=@elog; } -app (imagefile output) assemble - (file selected, imagefile image[], string webdir) +app (imagefile output, file olog, file elog) assemble (file selected, imagefile image[], string webdir) { - assemble @output @selected @filename(image[0]) webdir; + assemble @output @selected @filename(image[0]) webdir stdout=@olog stderr=@elog; } app (imagefile grid) markMap (file tilelist) @@ -32,62 +28,47 @@ } # Constants and command line arguments +int nFiles = @toInt(@arg("nfiles")); +int nSelect = @toInt(@arg("nselect")); +string landType = @arg("landtype"); +string MODISdir = @arg("modisdir"); +string webDir = @arg("webdir"); -int nFiles = @toInt(@arg("nfiles","1000")); -int nSelect = @toInt(@arg("nselect","12")); -string landType = @arg("landtype","urban"); -string MODISdir= @arg("modisdir"); -string webDir = @arg("webdir"); - -string suffix=".ppm.gz"; - # Input Dataset +imagefile geos[] ; -imagefile geos[] ; # site=site - - # Compute the land use summary of each MODIS tile +landuse land[] ; -landuse land[] ; - foreach g,i in geos { land[i] = getLandUse(g,1,MODISdir); } # Find the top N tiles (by total area of selected landuse types) - -file topSelected<"topselected.txt">; -file selectedTiles<"selectedtiles.txt">; +file topSelected <"topselected.txt">; +file selectedTiles <"selectedtiles.txt">; (topSelected, selectedTiles) = analyzeLandUse(land, landType, nSelect); # Mark the top N tiles on a sinusoidal gridded map - -imagefile gridMap<"markedGrid.gif">; +imagefile gridMap<"markedGrid.ppm.gz">; gridMap = markMap(topSelected); # Create multi-color images for all tiles +#imagefile colorImage[] ; -imagefile colorImage[] ; +#foreach g, i in geos { +# file outfile ; +# file errfile ; +# // tracef("calling colorimage %s %s\n", @g, @colorImage[i]); +# (colorImage[i], outfile, errfile) = colorMODIS(g); +#} -foreach g, i in geos { - colorImage[i] = colorMODIS(g); -} - # Assemble a montage of the top selected areas +#imagefile montage<"map.png">; # @arg +#file assemble_olog <"logs/assemble.o.log">; +#file assemble_elog <"logs/assemble.e.log">; +#tracef("Calling assemble %s %s %s %s\n", @montage, @selectedTiles, @colorImage[0], webDir); +#(montage, assemble_olog, assemble_elog) = assemble(selectedTiles,colorImage,webDir); -imagefile montage ; # @arg -montage = assemble(selectedTiles,colorImage,webDir); - -# future args: - -int selectHiThreshold; -int selectLowThreshold; -string upperLeftTile; -string lowerRightTile; -float imageSizes[]; -string displayOptions; - From hategan at ci.uchicago.edu Wed Feb 13 13:34:20 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Wed, 13 Feb 2013 13:34:20 -0600 (CST) Subject: [Swift-commit] r6267 - in branches/faster/src/org/griphyn/vdl/karajan: . lib/swiftscript Message-ID: <20130213193420.29C1A9CCC1@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-13 13:34:19 -0600 (Wed, 13 Feb 2013) New Revision: 6267 Modified: branches/faster/src/org/griphyn/vdl/karajan/AssertFailedException.java branches/faster/src/org/griphyn/vdl/karajan/lib/swiftscript/Assert.java Log: fixed assert Modified: branches/faster/src/org/griphyn/vdl/karajan/AssertFailedException.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/AssertFailedException.java 2013-02-13 18:15:05 UTC (rev 6266) +++ branches/faster/src/org/griphyn/vdl/karajan/AssertFailedException.java 2013-02-13 19:34:19 UTC (rev 6267) @@ -20,6 +20,8 @@ import k.rt.ExecutionException; +import org.globus.cog.karajan.compiled.nodes.Node; + /** * Generated only by SwiftScript @assert(). * @@ -32,7 +34,7 @@ String message = null; - public AssertFailedException(String message) { - super(message); + public AssertFailedException(Node n, String message) { + super(n, message); } } Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/swiftscript/Assert.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/swiftscript/Assert.java 2013-02-13 18:15:05 UTC (rev 6266) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/swiftscript/Assert.java 2013-02-13 19:34:19 UTC (rev 6267) @@ -45,8 +45,14 @@ @Override public Object function(Stack stack) { AbstractDataNode hmessage = this.message.getValue(stack); - hmessage.waitFor(this); - String message = (String) hmessage.getValue(); + String message; + if (hmessage != null) { + hmessage.waitFor(this); + message = (String) hmessage.getValue(); + } + else { + message = "Assertion failed"; + } AbstractDataNode hvalue = this.value.getValue(stack); hvalue.waitFor(this); @@ -70,7 +76,7 @@ throw new ExecutionException(this, "First argument to assert() must be boolean or int!"); } if (!success) { - throw new AssertFailedException(message); + throw new AssertFailedException(this, message); } } } From hategan at ci.uchicago.edu Wed Feb 13 13:34:44 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Wed, 13 Feb 2013 13:34:44 -0600 (CST) Subject: [Swift-commit] r6268 - branches/faster/src/org/griphyn/vdl/karajan/lib Message-ID: <20130213193444.026A69CCC1@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-13 13:34:43 -0600 (Wed, 13 Feb 2013) New Revision: 6268 Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/ThrottledParallelFor.java Log: fixed propagation of errors in foreach Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/ThrottledParallelFor.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/ThrottledParallelFor.java 2013-02-13 19:34:19 UTC (rev 6267) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/ThrottledParallelFor.java 2013-02-13 19:34:43 UTC (rev 6268) @@ -258,7 +258,10 @@ ts.threadDone(thr2, null); } catch (ExecutionException e) { - throw e; + thr2.getStack().dropToFrame(fcf); + ts.threadDone(thr2, e); + ts.abortAll(); + thr.awake(); } catch (Exception e) { thr2.getStack().dropToFrame(fcf); From davidk at ci.uchicago.edu Thu Feb 14 13:55:10 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Thu, 14 Feb 2013 13:55:10 -0600 (CST) Subject: [Swift-commit] r6269 - in SwiftApps/modis: . bin Message-ID: <20130214195510.DC2C79CCF5@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-14 13:55:10 -0600 (Thu, 14 Feb 2013) New Revision: 6269 Added: SwiftApps/modis/bin/grid.ppm Removed: SwiftApps/modis/bin/grid.ppm.gz Modified: SwiftApps/modis/bin/colormodis.sh SwiftApps/modis/bin/draw_rectangle.pl SwiftApps/modis/bin/markmap.sh SwiftApps/modis/demo Log: Make the demo script a little more interactive Start splitting up modis script into simpler examples for future tutorial use Modified: SwiftApps/modis/bin/colormodis.sh =================================================================== --- SwiftApps/modis/bin/colormodis.sh 2013-02-13 19:34:43 UTC (rev 6268) +++ SwiftApps/modis/bin/colormodis.sh 2013-02-14 19:55:10 UTC (rev 6269) @@ -7,49 +7,27 @@ infile=$1 outfile=$2 +BINDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -# Create temp files in current directory since /tmp may not be available -tmp=`mktemp modis.$USER.XXXXXX.ppn.gz` -map=`mktemp colormap.$USER.XXXXXX` - -# Create color set - -( - cat | - sed -e 's/ c.=/ /g' -e 's/[^0-9 ]//g' | - awk '{printf("#%02x%02x%02x #%02x%02x%02x\n", NR-1, NR-1, NR-1, $1, $2, $3)}') >$map < - - - - - - - - - - - - - - - - +# Translation table - edit colors here +cat > translate.txt < $pgm_output_filename") || die "Unable to create $pgm_output_filename"; +open(PGMFILE_INPUT, "$pgm_input_filename") || die "Unable to open $pgm_input_filename!"; +open(PGMFILE_OUTPUT, ">$pgm_output_filename") || die "Unable to create $pgm_output_filename"; # Read header my $magic = ; Added: SwiftApps/modis/bin/grid.ppm =================================================================== (Binary files differ) Property changes on: SwiftApps/modis/bin/grid.ppm ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Deleted: SwiftApps/modis/bin/grid.ppm.gz =================================================================== (Binary files differ) Modified: SwiftApps/modis/bin/markmap.sh =================================================================== --- SwiftApps/modis/bin/markmap.sh 2013-02-13 19:34:43 UTC (rev 6268) +++ SwiftApps/modis/bin/markmap.sh 2013-02-14 19:55:10 UTC (rev 6269) @@ -6,7 +6,7 @@ tilefile=$1 outmap=$2 -cp $BINDIR/grid.ppm.gz $outmap +cp $BINDIR/grid.ppm $outmap cat $tilefile | while read f ; do hv=$(echo $f | sed -e 's,^.*/,,' -e 's/\..*//') Modified: SwiftApps/modis/demo =================================================================== --- SwiftApps/modis/demo 2013-02-13 19:34:43 UTC (rev 6268) +++ SwiftApps/modis/demo 2013-02-14 19:55:10 UTC (rev 6269) @@ -20,6 +20,16 @@ fi } +run() +{ + echo + cp $1 . + eval swiftrun -site $SITE $( basename $1 ) -landtype=$LANDTYPE -nfiles=$NFILES \ + -nselect=$NSELECT -modisdir=$MODISDIR -webdir=$WEBDIR + rm $( basename $1 ) +} + + # Parse command line arguments while [ $# -gt 0 ] do @@ -35,10 +45,39 @@ shift done -echo landtype=$LANDTYPE -echo nfiles=$NFILES -echo nselect=$NSELECT -echo webdir=$WEBDIR +# Select site +echo +echo "Available sites" +prompt="Pick an option: " +options=("local" "midway") +PS3=$prompt +select opt in "${options[@]}" "Quit"; do + case "$REPLY" in + 1) SITE="local"; break;; + 2) SITE="midway"; break;; + $(( ${#options[@]}+1 )) ) echo "Goodbye!"; break;; + *) echo "Invalid option. Try another one.";continue;; + esac +done -eval swiftrun -site $SITE modis.swift -landtype=$LANDTYPE -nfiles=$NFILES \ - -nselect=$NSELECT -modisdir=$MODISDIR -webdir=$WEBDIR +# Select script +echo +prompt="Pick an option:" +options=("Tutorial 1" "Tutorial 2" "Tutorial 3" "Tutorial 4") + +echo "Select script" +PS3="$prompt " +select opt in "${options[@]}" "Quit"; do + + case "$REPLY" in + + 1 ) run tutorial/modis01.swift; break;; + 2 ) run tutorial/modis02.swift; break;; + 3 ) run tutorial/modis03.swift; break;; + 4 ) run tutorial/modis04.swift; break;; + $(( ${#options[@]}+1 )) ) echo "Goodbye!"; break;; + *) echo "Invalid option. Try another one.";continue;; + + esac +done + From davidk at ci.uchicago.edu Thu Feb 14 13:55:19 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Thu, 14 Feb 2013 13:55:19 -0600 (CST) Subject: [Swift-commit] r6270 - in SwiftApps/modis: . tutorial Message-ID: <20130214195519.EC9FB9CCF5@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-14 13:55:19 -0600 (Thu, 14 Feb 2013) New Revision: 6270 Added: SwiftApps/modis/tutorial/ SwiftApps/modis/tutorial/modis01.swift SwiftApps/modis/tutorial/modis02.swift SwiftApps/modis/tutorial/modis03.swift SwiftApps/modis/tutorial/modis04.swift Log: Added: SwiftApps/modis/tutorial/modis01.swift =================================================================== --- SwiftApps/modis/tutorial/modis01.swift (rev 0) +++ SwiftApps/modis/tutorial/modis01.swift 2013-02-14 19:55:19 UTC (rev 6270) @@ -0,0 +1,14 @@ +type imagefile; +type landuse; + +app (landuse output) getLandUse (imagefile input, int sortfield, string mpath) +{ + getlanduse @input sortfield mpath stdout=@output; +} + +# Command line arguments +string MODISdir = @arg("modisdir"); + +imagefile modisImage <"../data/modis/2002/h00v09.pgm.gz">; +landuse result <"landuse/h00v08.landuse.byfreq">; +result = getLandUse(modisImage, 1, MODISdir); Added: SwiftApps/modis/tutorial/modis02.swift =================================================================== --- SwiftApps/modis/tutorial/modis02.swift (rev 0) +++ SwiftApps/modis/tutorial/modis02.swift 2013-02-14 19:55:19 UTC (rev 6270) @@ -0,0 +1,22 @@ +type imagefile; +type landuse; + +app (landuse output) getLandUse (imagefile input, int sortfield, string mpath) +{ + getlanduse @input sortfield mpath stdout=@output; +} + +# Constants and command line arguments +int nFiles = @toInt(@arg("nfiles")); +string MODISdir = @arg("modisdir"); + +# Input Dataset +imagefile geos[] ; + +# Compute the land use summary of each MODIS tile +landuse land[] ; + +foreach g,i in geos { + land[i] = getLandUse(g,1,MODISdir); +} + Added: SwiftApps/modis/tutorial/modis03.swift =================================================================== --- SwiftApps/modis/tutorial/modis03.swift (rev 0) +++ SwiftApps/modis/tutorial/modis03.swift 2013-02-14 19:55:19 UTC (rev 6270) @@ -0,0 +1,35 @@ +type file; +type imagefile; +type landuse; + +app (landuse output) getLandUse (imagefile input, int sortfield, string mpath) +{ + getlanduse @input sortfield mpath stdout=@output; +} + +app (file output, file tilelist) analyzeLandUse (landuse input[], string usetype, int maxnum) +{ + analyzelanduse @output @tilelist usetype maxnum @input; +} + +# Constants and command line arguments +int nFiles = @toInt(@arg("nfiles")); +int nSelect = @toInt(@arg("nselect")); +string landType = @arg("landtype"); +string MODISdir = @arg("modisdir"); +string webDir = @arg("webdir"); + +# Input Dataset +imagefile geos[] ; + +# Compute the land use summary of each MODIS tile +landuse land[] ; + +foreach g,i in geos { + land[i] = getLandUse(g,1,MODISdir); +} + +# Find the top N tiles (by total area of selected landuse types) +file topSelected <"topselected.txt">; +file selectedTiles <"selectedtiles.txt">; +(topSelected, selectedTiles) = analyzeLandUse(land, landType, nSelect); Added: SwiftApps/modis/tutorial/modis04.swift =================================================================== --- SwiftApps/modis/tutorial/modis04.swift (rev 0) +++ SwiftApps/modis/tutorial/modis04.swift 2013-02-14 19:55:19 UTC (rev 6270) @@ -0,0 +1,45 @@ +type file; +type imagefile; +type landuse; + +app (landuse output) getLandUse (imagefile input, int sortfield, string mpath) +{ + getlanduse @input sortfield mpath stdout=@output; +} + +app (file output, file tilelist) analyzeLandUse (landuse input[], string usetype, int maxnum) +{ + analyzelanduse @output @tilelist usetype maxnum @input; +} + +app (imagefile grid) markMap (file tilelist) +{ + markmap @tilelist @grid; +} + +# Constants and command line arguments +int nFiles = @toInt(@arg("nfiles")); +int nSelect = @toInt(@arg("nselect")); +string landType = @arg("landtype"); +string MODISdir = @arg("modisdir"); +string webDir = @arg("webdir"); + +# Input Dataset +imagefile geos[] ; + +# Compute the land use summary of each MODIS tile +landuse land[] ; + +foreach g,i in geos { + land[i] = getLandUse(g,1,MODISdir); +} + +# Find the top N tiles (by total area of selected landuse types) +file topSelected <"topselected.txt">; +file selectedTiles <"selectedtiles.txt">; +(topSelected, selectedTiles) = analyzeLandUse(land, landType, nSelect); + +# Mark the top N tiles on a sinusoidal gridded map +imagefile gridMap<"markedGrid.ppm">; +gridMap = markMap(topSelected); + From davidk at ci.uchicago.edu Thu Feb 14 14:22:34 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Thu, 14 Feb 2013 14:22:34 -0600 (CST) Subject: [Swift-commit] r6271 - in SwiftApps/modis: . conf Message-ID: <20130214202234.8C5A39CCE5@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-14 14:22:34 -0600 (Thu, 14 Feb 2013) New Revision: 6271 Modified: SwiftApps/modis/README SwiftApps/modis/conf/midway.cf Log: Run on midway Update README to describe briefly what the tutorial scripts do Modified: SwiftApps/modis/README =================================================================== --- SwiftApps/modis/README 2013-02-14 19:55:19 UTC (rev 6270) +++ SwiftApps/modis/README 2013-02-14 20:22:34 UTC (rev 6271) @@ -1,51 +1,15 @@ -demo.local ----------- -This script will run the modis demo using only the processors available on the -local machine. Modify tc.local to reflect the path to the modis applications. -Run the demo by running: +tutorial/modis01.swift +----- +Runs a single landuse on h00v09.pgm.gz. Creates landuse/h00v08.landuse.byfreq as output -./demo.local +tutorial/modis02.swift +----- +Runs landuse on all data files. Creates multiple landuse/*.byfreq files. -This will use all 317 input files. To limit the number of task that will be -created, run: +tutorial/modis03.swift +----- +Runs analyzelanduse on output data. Generates topselected.txt and selectedtiles.txt -./demo.local urban - - -demo.pads ---------- -This script will run the demo on PADS using coasters. This should be run -from a PADS login node (login.pads.ci.uchicago.edu) - -Edit the 'swift' application and modify the line -that says: HEAPMAX=256M. Change it to HEAPMAX=1024M. - -Edit tc.pads to reflect the path to the modis applications. - -Make sure that your default PADS project is defined. You can check this -by running the 'projects' command. - -Run the demo with the command: - -nice ./demo.pads - -This will use all 317 input files. to limit the number of tasks that will be -created, run: - -nice ./demo.local urban - - -demo.pads-pbs -------------- -The instructions for running this are the same as for demo.pads. The only -difference between the two is that demo.pads uses coasters while -demo.pads-pbs uses the plain PBS provider. - -nice ./demo.pads-pbs - - -Output ------- -When the script is completed, you should see several output files created in -the landuse directory. Another graphic will be created in the directory -$HOME/public_html/geo. +tutorial/modis04.swift +----- +Also creates a map with top section selected Modified: SwiftApps/modis/conf/midway.cf =================================================================== --- SwiftApps/modis/conf/midway.cf 2013-02-14 19:55:19 UTC (rev 6270) +++ SwiftApps/modis/conf/midway.cf 2013-02-14 20:22:34 UTC (rev 6271) @@ -6,10 +6,10 @@ use.provider.staging=false provider.staging.pin.swiftfiles=false -#site WALLTIME=00:05:00 +#site midway WALLTIME=00:05:00 #app getlanduse=$PWD/../bin/getlanduse.sh -#app analyzelanduse=$PWD/../bin/analyzelanduse2.sh +#app analyzelanduse=$PWD/../bin/analyzelanduse.sh #app colormodis=$PWD/../bin/colormodis.sh #app assemble=$PWD/../bin/assemble2.sh #app markmap=$PWD/../bin/markmap.sh From davidk at ci.uchicago.edu Thu Feb 14 19:23:36 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Thu, 14 Feb 2013 19:23:36 -0600 (CST) Subject: [Swift-commit] r6272 - trunk/etc/sites Message-ID: <20130215012336.096289CCF5@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-14 19:23:35 -0600 (Thu, 14 Feb 2013) New Revision: 6272 Added: trunk/etc/sites/beagle Log: Beagle templa Added: trunk/etc/sites/beagle =================================================================== --- trunk/etc/sites/beagle (rev 0) +++ trunk/etc/sites/beagle 2013-02-15 01:23:35 UTC (rev 6272) @@ -0,0 +1,14 @@ + + + 24 + 100 + 100 + pbs.aprun;pbs.mpp;depth=24 + _WALLTIME_ + 50 + 1 + 12.00 + 10000 + + /lustre/beagle/{env.USER}/swiftwork + From davidk at ci.uchicago.edu Thu Feb 14 19:27:42 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Thu, 14 Feb 2013 19:27:42 -0600 (CST) Subject: [Swift-commit] r6273 - in SwiftApps/modis: . conf Message-ID: <20130215012742.B028D9CCF5@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-14 19:27:42 -0600 (Thu, 14 Feb 2013) New Revision: 6273 Modified: SwiftApps/modis/conf/beagle.cf SwiftApps/modis/demo Log: Add more beagleness Modified: SwiftApps/modis/conf/beagle.cf =================================================================== --- SwiftApps/modis/conf/beagle.cf 2013-02-15 01:23:35 UTC (rev 6272) +++ SwiftApps/modis/conf/beagle.cf 2013-02-15 01:27:42 UTC (rev 6273) @@ -8,7 +8,7 @@ #site beagle WALLTIME=00:05:00 #app getlanduse=$PWD/../bin/getlanduse.sh -#app analyzelanduse=$PWD/../bin/analyzelanduse2.sh +#app analyzelanduse=$PWD/../bin/analyzelanduse.sh #app colormodis=$PWD/../bin/colormodis.sh #app assemble=$PWD/../bin/assemble2.sh #app markmap=$PWD/../bin/markmap.sh Modified: SwiftApps/modis/demo =================================================================== --- SwiftApps/modis/demo 2013-02-15 01:23:35 UTC (rev 6272) +++ SwiftApps/modis/demo 2013-02-15 01:27:42 UTC (rev 6273) @@ -49,12 +49,13 @@ echo echo "Available sites" prompt="Pick an option: " -options=("local" "midway") +options=("local" "midway" "beagle") PS3=$prompt select opt in "${options[@]}" "Quit"; do case "$REPLY" in 1) SITE="local"; break;; 2) SITE="midway"; break;; + 3) SITE="beagle"; break;; $(( ${#options[@]}+1 )) ) echo "Goodbye!"; break;; *) echo "Invalid option. Try another one.";continue;; esac From ketan at ci.uchicago.edu Thu Feb 14 21:27:36 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Thu, 14 Feb 2013 21:27:36 -0600 (CST) Subject: [Swift-commit] r6274 - in trunk/docs: . cookbook merged merged/userguide userguide Message-ID: <20130215032736.8C5C89CCF5@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-14 21:27:36 -0600 (Thu, 14 Feb 2013) New Revision: 6274 Added: trunk/docs/merged/ trunk/docs/merged/build_docs.sh trunk/docs/merged/refmanual/ trunk/docs/merged/userguide/ trunk/docs/merged/userguide/coasters Removed: trunk/docs/cookbook/coasters Modified: trunk/docs/cookbook/cookbook.txt trunk/docs/userguide/commands Log: starting merging docs Deleted: trunk/docs/cookbook/coasters =================================================================== --- trunk/docs/cookbook/coasters 2013-02-15 01:27:42 UTC (rev 6273) +++ trunk/docs/cookbook/coasters 2013-02-15 03:27:36 UTC (rev 6274) @@ -1,110 +0,0 @@ -Coasters --------- -Coasters were introduced in Swift v0.6 as an experimental feature. In many -applications, Swift performance can be greatly enhanced by the use of -coasters. Coasters provide a low-overhead job submission and file transfer -mechanism suited for the execution of short jobs (on the order of a few -seconds). A detailed information on coasters can be found at http://www.ci.uchicago.edu/swift/guides/userguide.php#coasters. -//**Include neat diagrams.** - -Following is a coasters setup case-study for a PBS underlying provider where sites.xml coaster settings were: - -[xml] -source~~~~ - -CI-CCR000013 - - - - - - -pbs.aprun -pbs.mpp=true - - -24 -100000 - -100 -100 - -20 -5 -5 -20.00 -10000 -source~~~~ - -The following table briefly describes the elements on the coasters setup: -[width="70%", cols="^3,10", options="header"] -|============================================================================================= -|profile key | brief description -|slots | How many maximum LRM jobs/worker blocks are allowed -|workersPerNode | How many coaster workers to run per execution node -|nodeGranularity | Each worker block uses a number of nodes that is a multiple of this number -|lowOverallocation | How many times larger than the job walltime should a block's walltime be if all jobs are 1s long -|highOverallocation | How many times larger than the job walltime should a block's walltime be if all jobs are infinitely long -|workersPerNode | How many coaster workers to run per execution node reserve How many seconds to reserve in a block's walltime for starting/shutdown operations -|maxnodes | The maximum number of nodes allowed in a block -|maxtime | The maximum number of walltime allowed for a block coaster service -|jobThrottle |the number of concurrent jobs allowed on a site -|============================================================================================== - -// -//For Beginners -//~~~~~~~~~~~~~~ -//Coasters for beginners. Usage of existing, prebuilt templates. -// -//For Intermediate Users -//~~~~~~~~~~~~~~~~~~~~~~~ -//Coasters for intermediate users. -// -//Using gensites -//^^^^^^^^^^^^^^^ -//Usage of gensites to generate your own sites -//configurations. -// -// -// - -For Advanced Users -~~~~~~~~~~~~~~~~~~ - -//Coasters for advanced users. Getting your hands dirty. - -One of the main reason that one would initially deviate from coaster -defaults into more complex pool entries is to force jobs to fit into some -site-imposed constraint. For instance a typical submission to the experimental -queue requires a user to request upto 3 nodes for under 1 hour. This setup -could be achieved with a careful tuning of coaters parameters. - -//How to run Swift under different Coasters configurations -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -//Manual -//^^^^^^^ -//Todo -// -//Passive -//^^^^^^^^ -//Todo -// -//Persistent -//^^^^^^^^^^^ -//Todo -// -//Summary of Differences Between different Coaster types -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//A tabular representations of highlights of different coaster setups -// -// -//Data Management -// - -Coaster providers: local, ssh, pbs -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Settings and examples for different coaster providers mechanisms. - Modified: trunk/docs/cookbook/cookbook.txt =================================================================== --- trunk/docs/cookbook/cookbook.txt 2013-02-15 01:27:42 UTC (rev 6273) +++ trunk/docs/cookbook/cookbook.txt 2013-02-15 03:27:36 UTC (rev 6274) @@ -11,8 +11,6 @@ include::swift_basics[] -include::coasters[] - include::infrastructures[] include::debugging[] Added: trunk/docs/merged/build_docs.sh =================================================================== --- trunk/docs/merged/build_docs.sh (rev 0) +++ trunk/docs/merged/build_docs.sh 2013-02-15 03:27:36 UTC (rev 6274) @@ -0,0 +1,115 @@ +#!/bin/bash + +# Usage: See usage() for usage + +# crash: Report a problem and exit +crash() +{ + MSG=$1 + echo ${MSG} >&2 + exit 1 +} + +# Output directory mode +CHMOD_DIRECTORY_MODE="775" +# Output file mode +CHMOD_FILE_MODE="664" +# Output group +GROUP="vdl2-svn" +# Make PDFs iff MAKE_PDF=1 +MAKE_PDF=1 + +# See getopts loop below for options +usage() +{ + echo "Usage: ./build_docs.sh " +} + +while getopts "dh" OPTION +do + case ${OPTION} in + d) + MAKE_PDF=0 + shift + ;; + h) + usage + exit 0 + ;; + esac +done + +INSTALLATION_DIRECTORY=$1 + +if [[ $INSTALLATION_DIRECTORY == "" ]] +then + echo "Not given: installation directory" + usage + exit 1 +fi + +INSTALLATION_DIRECTORY=$1 + +# Create installation directory if needed +if [ ! -d "$INSTALLATION_DIRECTORY" ]; then + mkdir $INSTALLATION_DIRECTORY || crash "Unable to create directory $INSTALLATION_DIRECTORY" + chgrp $GROUP $INSTALLATION_DIRECTORY > /dev/null 2>&1 + chmod $CHMOD_DIRECTORY_MODE $INSTALLATION_DIRECTORY > /dev/null 2>&1 +fi + +unamestr=`\uname` +if [[ "$unamestr" == 'Linux' ]]; then + pushd $(dirname $(readlink -f $0)) > /dev/null 2>&1 +else + pushd $(dirname $(greadlink -f $0)) > /dev/null 2>&1 +fi + +# Gather version information +pushd .. > /dev/null 2>&1 +VERSION=`svn info |grep URL|awk -F / '{print $NF}'` +popd > /dev/null 2>&1 +echo Installing docs into $INSTALLATION_DIRECTORY + +# Convert files +DIRECTORIES=`ls -d */ 2>/dev/null` +for directory in $DIRECTORIES +do + pushd $directory > /dev/null 2>&1 + FILES=`ls -1 *.txt 2>/dev/null` + for file in $FILES + do + echo Converting $directory"$file" to HTML + asciidoc -a toc -a toclevels=2 \ + -a max-width=750px \ + -a textwidth=80 \ + -a stylesheet=$(pwd)/../stylesheets/asciidoc.css \ + $file + if (( MAKE_PDF )) + then + echo Converting $directory"$file" to PDF + a2x --format=pdf --no-xmllint $file + fi + done + + if [ ! -d "$INSTALLATION_DIRECTORY/$VERSION" ]; then + mkdir $INSTALLATION_DIRECTORY/$VERSION || crash "Unable to create directory $INSTALLATION_DIRECTORY/$VERSION" + fi + + if [ ! -d "$INSTALLATION_DIRECTORY/$VERSION/$directory" ]; then + mkdir $INSTALLATION_DIRECTORY/$VERSION/$directory || crash "Unable to create directory $INSTALLATION_DIRECTORY/$VERSION/$directory" + fi + + # Copy all files to destination (may include graphics, etc) + for copyfile in `find -L . -type f 2>/dev/null |grep -v .svn` + do + DN=`dirname $copyfile` + mkdir -p $INSTALLATION_DIRECTORY/$VERSION/$directory/$DN > /dev/null 2>&1 + cp $copyfile $INSTALLATION_DIRECTORY/$VERSION/$directory/$DN || crash "Unable to copy $copyfile to $INSTALLATION_DIRECTORY/$VERSION/$directory" + done + + popd > /dev/null 2>&1 +done +popd > /dev/null 2>&1 + +find $INSTALLATION_DIRECTORY/$VERSION -type f -exec chgrp $GROUP {} \; -exec chmod $CHMOD_FILE_MODE {} \; > /dev/null 2>&1 +find $INSTALLATION_DIRECTORY/$VERSION -type d -exec chgrp $GROUP {} \; -exec chmod $CHMOD_DIRECTORY_MODE {} \; > /dev/null 2>&1 Property changes on: trunk/docs/merged/build_docs.sh ___________________________________________________________________ Added: svn:executable + * Added: trunk/docs/merged/userguide/coasters =================================================================== --- trunk/docs/merged/userguide/coasters (rev 0) +++ trunk/docs/merged/userguide/coasters 2013-02-15 03:27:36 UTC (rev 6274) @@ -0,0 +1,202 @@ +Coasters +-------- + +Introduction +~~~~~~~~~~~~ +Coasters are the Swift's implementation of _pilot job abstraction_. + +In many applications, Swift performance can be greatly enhanced by the use of +coasters. Coasters provide a low-overhead job submission and file transfer +mechanism suited for the execution of jobs and the transfer of files for which +other grid protocols such as GRAM and GridFTP are poorly suited. + +Benefits +~~~~~~~~ +Much of the overhead associated with other grid protocols (such as +authentication and authorization, and allocation of worker nodes by the site's +local resource manager) is reduced, because that overhead is associated with +the allocation of a coaster pilot or coaster worker, rather than with every +Swift-level procedure invocation; potentially hundreds or thousands of +Swift-level procedure invocations can be run through a single worker. Coasters +can be configured for two purposes: job execution and file staging. In +practice, the Swift script remains the same while working with coasters. A +detailed description of coaster mechanism is explained in the next section. + +Mechanism +~~~~~~~~~ +Coasters run at the task management layer logically under the Swift script. The +jobs and data movement requirements resulting after the interpretation of a +Swift script are handled by the coasters. The coaster mechanism submits a pilot +job using some other execution mechanism such as GRAM, SGE or PBS scheduler, +and for each worker node that will be used in a remote cluster, it submits a +worker job, again using some other execution mechanism such as GRAM. Details on +the design of the coaster mechanism can be found here: +. The pilot job manages file transfers +and the dispatch of execution jobs to workers. + +Coasters How-to +~~~~~~~~~~~~~~~ +To use for job execution, specify a sites.xml execution element like this: + +---- + +---- + +The jobmanager string contains more detail than with other providers. It +contains either two or three colon separated fields: 1:the provider to +be use to execute the coaster pilot job - this provider will submit from +the Swift client side environment. Commonly this will be one of the GRAM +providers; 2: the provider to be used to execute coaster worker jobs. +This provider will be used to submit from the coaster pilot job +environment, so a local scheduler provider can sometimes be used instead +of GRAM. 3: optionally, the jobmanager to be used when submitting worker +job using the provider specified in field 2. + +To use for file transfer, specify a sites.xml filesystem element like this: + +---- + +---- + +The url parameter should be a pseudo-URI formed with the URI scheme +being the name of the provider to use to submit the coaster pilot job, +and the hostname portion being the hostname to be used to execute the +coaster pilot job. Note that this provider and hostname will be used for +execution of a coaster pilot job, not for file transfer; so for example, +a GRAM endpoint should be specified here rather than a GridFTP endpoint. + +Coasters are affected by the following profile settings, which are +documented in the Globus namespace profile section: + +[options="header, autowidth"] +|================= +|Profile key|Brief description +|slots|How many maximum LRM jobs/worker blocks are allowed +|jobsPerNode|How many coaster workers to run per execution node +|nodeGranularity|Each worker block uses a number of nodes that is a +multiple of this number +|lowOverallocation|How many times larger than the job walltime should a +block's walltime be if all jobs are 1s long +|highOverallocation|How many times larger than the job walltime should a +block's walltime be if all jobs are infinitely long +|overallocationDecayFactor|How quickly should the overallocation curve +tend towards the highOverallocation as job walltimes get larger +|spread|By how much should worker blocks vary in worker size +|jobsPerNode|How many coaster workers to run per execution node +|reserve|How many seconds to reserve in a block's walltime for +starting/shutdown operations +|maxnodes|The maximum number of nodes allowed in a block +|maxtime|The maximum walltime allowed for a block, in integer seconds +|remoteMonitorEnabled|If true, show a graphical display of the status of +the coaster service +|================== +Coasters +-------- +Coasters were introduced in Swift v0.6 as an experimental feature. In many +applications, Swift performance can be greatly enhanced by the use of +coasters. Coasters provide a low-overhead job submission and file transfer +mechanism suited for the execution of short jobs (on the order of a few +seconds). A detailed information on coasters can be found at http://www.ci.uchicago.edu/swift/guides/userguide.php#coasters. +//**Include neat diagrams.** + +Following is a coasters setup case-study for a PBS underlying provider where sites.xml coaster settings were: + +[xml] +source~~~~ + +CI-CCR000013 + + + + + + +pbs.aprun +pbs.mpp=true + + +24 +100000 + +100 +100 + +20 +5 +5 +20.00 +10000 +source~~~~ + +The following table briefly describes the elements on the coasters setup: +[width="70%", cols="^3,10", options="header"] +|============================================================================================= +|profile key | brief description +|slots | How many maximum LRM jobs/worker blocks are allowed +|workersPerNode | How many coaster workers to run per execution node +|nodeGranularity | Each worker block uses a number of nodes that is a multiple of this number +|lowOverallocation | How many times larger than the job walltime should a block's walltime be if all jobs are 1s long +|highOverallocation | How many times larger than the job walltime should a block's walltime be if all jobs are infinitely long +|workersPerNode | How many coaster workers to run per execution node reserve How many seconds to reserve in a block's walltime for starting/shutdown operations +|maxnodes | The maximum number of nodes allowed in a block +|maxtime | The maximum number of walltime allowed for a block coaster service +|jobThrottle |the number of concurrent jobs allowed on a site +|============================================================================================== + +// +//For Beginners +//~~~~~~~~~~~~~~ +//Coasters for beginners. Usage of existing, prebuilt templates. +// +//For Intermediate Users +//~~~~~~~~~~~~~~~~~~~~~~~ +//Coasters for intermediate users. +// +//Using gensites +//^^^^^^^^^^^^^^^ +//Usage of gensites to generate your own sites +//configurations. +// +// +// + +For Advanced Users +~~~~~~~~~~~~~~~~~~ + +//Coasters for advanced users. Getting your hands dirty. + +One of the main reason that one would initially deviate from coaster +defaults into more complex pool entries is to force jobs to fit into some +site-imposed constraint. For instance a typical submission to the experimental +queue requires a user to request upto 3 nodes for under 1 hour. This setup +could be achieved with a careful tuning of coaters parameters. + +//How to run Swift under different Coasters configurations +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +//Manual +//^^^^^^^ +//Todo +// +//Passive +//^^^^^^^^ +//Todo +// +//Persistent +//^^^^^^^^^^^ +//Todo +// +//Summary of Differences Between different Coaster types +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//A tabular representations of highlights of different coaster setups +// +// +//Data Management +// + +Coaster providers: local, ssh, pbs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Settings and examples for different coaster providers mechanisms. + Modified: trunk/docs/userguide/commands =================================================================== --- trunk/docs/userguide/commands 2013-02-15 01:27:42 UTC (rev 6273) +++ trunk/docs/userguide/commands 2013-02-15 03:27:36 UTC (rev 6274) @@ -39,7 +39,7 @@ -resume file - Resumes the execution using a log file + Resumes the execution using a resume-log file .rlog -config file From davidk at ci.uchicago.edu Fri Feb 15 04:34:43 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Fri, 15 Feb 2013 04:34:43 -0600 (CST) Subject: [Swift-commit] r6275 - trunk/etc/sites Message-ID: <20130215103443.3E55E9D0D2@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-15 04:34:41 -0600 (Fri, 15 Feb 2013) New Revision: 6275 Added: trunk/etc/sites/beagle-ssh Log: The SSH Beagle (Darwin's lesser known ship) Added: trunk/etc/sites/beagle-ssh =================================================================== --- trunk/etc/sites/beagle-ssh (rev 0) +++ trunk/etc/sites/beagle-ssh 2013-02-15 10:34:41 UTC (rev 6275) @@ -0,0 +1,15 @@ + + + 24 + 100 + 100 + pbs.aprun;pbs.mpp;depth=24 + _WALLTIME_ + /lustre/beagle/{env.USER}/swiftwork + 50 + 1 + 12.00 + 10000 + + /lustre/beagle/{env.USER}/swiftwork + From davidk at ci.uchicago.edu Fri Feb 15 04:36:37 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Fri, 15 Feb 2013 04:36:37 -0600 (CST) Subject: [Swift-commit] r6276 - in SwiftApps/modis: . conf tutorial Message-ID: <20130215103637.D2BEB9D0D2@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-15 04:36:37 -0600 (Fri, 15 Feb 2013) New Revision: 6276 Added: SwiftApps/modis/conf/beagle-ssh.cf SwiftApps/modis/tutorial/hello.swift Modified: SwiftApps/modis/README SwiftApps/modis/conf/beagle.cf SwiftApps/modis/conf/local.cf SwiftApps/modis/conf/midway.cf SwiftApps/modis/demo SwiftApps/modis/tutorial/modis01.swift SwiftApps/modis/tutorial/modis02.swift SwiftApps/modis/tutorial/modis03.swift SwiftApps/modis/tutorial/modis04.swift Log: Some simplifications of the app calls hello world script beagle-ssh config Some more info in README Modified: SwiftApps/modis/README =================================================================== --- SwiftApps/modis/README 2013-02-15 10:34:41 UTC (rev 6275) +++ SwiftApps/modis/README 2013-02-15 10:36:37 UTC (rev 6276) @@ -1,15 +1,63 @@ -tutorial/modis01.swift +Setup ----- -Runs a single landuse on h00v09.pgm.gz. Creates landuse/h00v08.landuse.byfreq as output +To install modis, use SVN to check out the required scripts: -tutorial/modis02.swift ------ -Runs landuse on all data files. Creates multiple landuse/*.byfreq files. +$ svn co https://svn.ci.uchicago.edu/svn/vdl2/SwiftApps/modis -tutorial/modis03.swift ------ -Runs analyzelanduse on output data. Generates topselected.txt and selectedtiles.txt +Once you do this, you all also need the associated modis data. +To download the images, run: +$ cd modis/data/modis/2002 +$ wget http://www.ci.uchicago.edu/swift/modis/modis-2002.tar +$ tar xf modis-2002.tar + +Hello world +----------- +The script tutorial/hello.swift demonstrates a simple "hello world" +script. It demonstrates how to define apps, passing arguments to +an app, and how to work with files. In this example, a file called +hello.txt gets created with with the contents of "Hello, world!". + +To run the application, the command is: + +$ swiftrun -site local tutorial/hello.swift + +modis01.swift +------------- +The first modis example defines one app function called getLandUse. +This app takes a sallite image (data/modis/2002/h00v09.pgm.gz) as +input. getLandUse creates a text file called landuse/h00v08.landuse.byfreq +that counts the frequency of each land type defined in the input image. + +To run modis01.swift: + +$ swiftrun -site local tutorial/modis01.swift + +modis02.swift +------------- +The second modis example expands upon the first example by running getLandUse +with multiple (317) input files. Ouptut files are stored in the landuse directory. + +To run modis02.swift: + +$ swiftrun -site local tutorial/modis02.swift + +modis03.swift +------------- +The third modis example builds on the previous example. It defines a new app function +called analyzeLandUse. The analyzeLandUse app examines the data generated by getLandUse +and creates two summary files called topselected.txt and selectedtiles.txt. These +files contain information about the top 10 urban areas. + +In the previous example, you have have noticed that running all 317 input files on +your laptop, even with 4 tasks a time, is not very efficient. In the next example, +instead of running locally, we will use a cluster called midway at the University of +Chicago to improve performance. + +To run modis03.swift: + +$ swiftrun -site midway tutorial/modis03.swift + tutorial/modis04.swift ----- Also creates a map with top section selected Added: SwiftApps/modis/conf/beagle-ssh.cf =================================================================== --- SwiftApps/modis/conf/beagle-ssh.cf (rev 0) +++ SwiftApps/modis/conf/beagle-ssh.cf 2013-02-15 10:36:37 UTC (rev 6276) @@ -0,0 +1,15 @@ +wrapperlog.always.transfer=true +sitedir.keep=true +execution.retries=0 +status.mode=provider +use.provider.staging=true +provider.staging.pin.swiftfiles=false + +#site beagle-ssh WALLTIME=00:05:00 + +#app getlanduse=/lustre/beagle/davidk/modis/bin/getlanduse.sh +#app analyzelanduse=/lustre/beagle/davidk/modis/bin/analyzelanduse.sh +#app colormodis=/lustre/beagle/davidk/modis/bin/colormodis.sh +#app assemble=/lustre/beagle/davidk/modis/bin/assemble2.sh +#app markmap=/lustre/beagle/davidk/modis/bin/markmap.sh +#app echo=/bin/echo Modified: SwiftApps/modis/conf/beagle.cf =================================================================== --- SwiftApps/modis/conf/beagle.cf 2013-02-15 10:34:41 UTC (rev 6275) +++ SwiftApps/modis/conf/beagle.cf 2013-02-15 10:36:37 UTC (rev 6276) @@ -12,3 +12,4 @@ #app colormodis=$PWD/../bin/colormodis.sh #app assemble=$PWD/../bin/assemble2.sh #app markmap=$PWD/../bin/markmap.sh +#app echo=/bin/echo Modified: SwiftApps/modis/conf/local.cf =================================================================== --- SwiftApps/modis/conf/local.cf 2013-02-15 10:34:41 UTC (rev 6275) +++ SwiftApps/modis/conf/local.cf 2013-02-15 10:36:37 UTC (rev 6276) @@ -12,4 +12,4 @@ #app colormodis=$PWD/../bin/colormodis.sh #app assemble=$PWD/../bin/assemble2.sh #app markmap=$PWD/../bin/markmap.sh - +#app echo=/bin/echo Modified: SwiftApps/modis/conf/midway.cf =================================================================== --- SwiftApps/modis/conf/midway.cf 2013-02-15 10:34:41 UTC (rev 6275) +++ SwiftApps/modis/conf/midway.cf 2013-02-15 10:36:37 UTC (rev 6276) @@ -13,3 +13,4 @@ #app colormodis=$PWD/../bin/colormodis.sh #app assemble=$PWD/../bin/assemble2.sh #app markmap=$PWD/../bin/markmap.sh +#app echo=/bin/echo Modified: SwiftApps/modis/demo =================================================================== --- SwiftApps/modis/demo 2013-02-15 10:34:41 UTC (rev 6275) +++ SwiftApps/modis/demo 2013-02-15 10:36:37 UTC (rev 6276) @@ -49,13 +49,14 @@ echo echo "Available sites" prompt="Pick an option: " -options=("local" "midway" "beagle") +options=("local" "midway" "beagle" "beagle-ssh") PS3=$prompt select opt in "${options[@]}" "Quit"; do case "$REPLY" in 1) SITE="local"; break;; 2) SITE="midway"; break;; 3) SITE="beagle"; break;; + 4) SITE="beagle-ssh"; break;; $(( ${#options[@]}+1 )) ) echo "Goodbye!"; break;; *) echo "Invalid option. Try another one.";continue;; esac @@ -69,16 +70,13 @@ echo "Select script" PS3="$prompt " select opt in "${options[@]}" "Quit"; do - case "$REPLY" in - - 1 ) run tutorial/modis01.swift; break;; - 2 ) run tutorial/modis02.swift; break;; - 3 ) run tutorial/modis03.swift; break;; - 4 ) run tutorial/modis04.swift; break;; - $(( ${#options[@]}+1 )) ) echo "Goodbye!"; break;; - *) echo "Invalid option. Try another one.";continue;; - + 1 ) run tutorial/modis01.swift; break;; + 2 ) run tutorial/modis02.swift; break;; + 3 ) run tutorial/modis03.swift; break;; + 4 ) run tutorial/modis04.swift; break;; + $(( ${#options[@]}+1 )) ) echo "Goodbye!"; break;; + *) echo "Invalid option. Try another one.";continue;; esac done Added: SwiftApps/modis/tutorial/hello.swift =================================================================== --- SwiftApps/modis/tutorial/hello.swift (rev 0) +++ SwiftApps/modis/tutorial/hello.swift 2013-02-15 10:36:37 UTC (rev 6276) @@ -0,0 +1,8 @@ +type file; + +app (file f) greeting() { + echo "Hello, world!" stdout=@filename(f); +} + +file outfile <"hello.txt">; +outfile = greeting(); Modified: SwiftApps/modis/tutorial/modis01.swift =================================================================== --- SwiftApps/modis/tutorial/modis01.swift 2013-02-15 10:34:41 UTC (rev 6275) +++ SwiftApps/modis/tutorial/modis01.swift 2013-02-15 10:36:37 UTC (rev 6276) @@ -1,14 +1,11 @@ type imagefile; type landuse; -app (landuse output) getLandUse (imagefile input, int sortfield, string mpath) +app (landuse output) getLandUse (imagefile input) { - getlanduse @input sortfield mpath stdout=@output; + getlanduse @filename(input) stdout=@filename(output); } -# Command line arguments -string MODISdir = @arg("modisdir"); - imagefile modisImage <"../data/modis/2002/h00v09.pgm.gz">; landuse result <"landuse/h00v08.landuse.byfreq">; -result = getLandUse(modisImage, 1, MODISdir); +result = getLandUse(modisImage); Modified: SwiftApps/modis/tutorial/modis02.swift =================================================================== --- SwiftApps/modis/tutorial/modis02.swift 2013-02-15 10:34:41 UTC (rev 6275) +++ SwiftApps/modis/tutorial/modis02.swift 2013-02-15 10:36:37 UTC (rev 6276) @@ -1,14 +1,14 @@ type imagefile; type landuse; -app (landuse output) getLandUse (imagefile input, int sortfield, string mpath) +app (landuse output) getLandUse (imagefile input) { - getlanduse @input sortfield mpath stdout=@output; + getlanduse @filenames(input) stdout=@filename(output); } # Constants and command line arguments -int nFiles = @toInt(@arg("nfiles")); -string MODISdir = @arg("modisdir"); +int nFiles = @toInt(@arg("nfiles", "1000")); +string MODISdir = @arg("modisdir", "../data/modis/2002"); # Input Dataset imagefile geos[] ; @@ -17,6 +17,6 @@ landuse land[] ; foreach g,i in geos { - land[i] = getLandUse(g,1,MODISdir); + land[i] = getLandUse(g); } Modified: SwiftApps/modis/tutorial/modis03.swift =================================================================== --- SwiftApps/modis/tutorial/modis03.swift 2013-02-15 10:34:41 UTC (rev 6275) +++ SwiftApps/modis/tutorial/modis03.swift 2013-02-15 10:36:37 UTC (rev 6276) @@ -2,9 +2,9 @@ type imagefile; type landuse; -app (landuse output) getLandUse (imagefile input, int sortfield, string mpath) +app (landuse output) getLandUse (imagefile input) { - getlanduse @input sortfield mpath stdout=@output; + getlanduse @filename(input) stdout=@filename(output); } app (file output, file tilelist) analyzeLandUse (landuse input[], string usetype, int maxnum) @@ -13,11 +13,10 @@ } # Constants and command line arguments -int nFiles = @toInt(@arg("nfiles")); -int nSelect = @toInt(@arg("nselect")); -string landType = @arg("landtype"); -string MODISdir = @arg("modisdir"); -string webDir = @arg("webdir"); +int nFiles = @toInt(@arg("nfiles", "1000")); +int nSelect = @toInt(@arg("nselect", "10")); +string landType = @arg("landtype", "urban"); +string MODISdir = @arg("modisdir", "../data/modis/2002"); # Input Dataset imagefile geos[] ; @@ -26,7 +25,7 @@ landuse land[] ; foreach g,i in geos { - land[i] = getLandUse(g,1,MODISdir); + land[i] = getLandUse(g); } # Find the top N tiles (by total area of selected landuse types) Modified: SwiftApps/modis/tutorial/modis04.swift =================================================================== --- SwiftApps/modis/tutorial/modis04.swift 2013-02-15 10:34:41 UTC (rev 6275) +++ SwiftApps/modis/tutorial/modis04.swift 2013-02-15 10:36:37 UTC (rev 6276) @@ -2,9 +2,9 @@ type imagefile; type landuse; -app (landuse output) getLandUse (imagefile input, int sortfield, string mpath) +app (landuse output) getLandUse (imagefile input) { - getlanduse @input sortfield mpath stdout=@output; + getlanduse @filename(input) stdout=@filename(output); } app (file output, file tilelist) analyzeLandUse (landuse input[], string usetype, int maxnum) @@ -22,7 +22,6 @@ int nSelect = @toInt(@arg("nselect")); string landType = @arg("landtype"); string MODISdir = @arg("modisdir"); -string webDir = @arg("webdir"); # Input Dataset imagefile geos[] ; @@ -31,7 +30,7 @@ landuse land[] ; foreach g,i in geos { - land[i] = getLandUse(g,1,MODISdir); + land[i] = getLandUse(g); } # Find the top N tiles (by total area of selected landuse types) From davidk at ci.uchicago.edu Fri Feb 15 04:58:23 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Fri, 15 Feb 2013 04:58:23 -0600 (CST) Subject: [Swift-commit] r6277 - trunk/bin Message-ID: <20130215105823.388869D0D2@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-15 04:58:22 -0600 (Fri, 15 Feb 2013) New Revision: 6277 Modified: trunk/bin/swiftrun Log: Make sure we are running from the local copy of the swift script Modified: trunk/bin/swiftrun =================================================================== --- trunk/bin/swiftrun 2013-02-15 10:36:37 UTC (rev 6276) +++ trunk/bin/swiftrun 2013-02-15 10:58:22 UTC (rev 6277) @@ -97,8 +97,8 @@ timestamp=$( date +%s ) ln -s $PWD $HOME/.swift/runs/current/$rundir.$timestamp if [ -n "$CONFIG" ]; then - eval time swift -sites.file sites.xml -tc.file tc.data -config $CONFIG $script $args 2>&1 | tee swift.out + eval time swift -sites.file sites.xml -tc.file tc.data -config $CONFIG $( basename $script ) $args 2>&1 | tee swift.out else - eval time swift -sites.file sites.xml -tc.file tc.data $script $args 2>&1 | tee swift.out + eval time swift -sites.file sites.xml -tc.file tc.data $( basename $script ) $args 2>&1 | tee swift.out fi mv $HOME/.swift/runs/current/$rundir.$timestamp $HOME/.swift/runs/completed From davidk at ci.uchicago.edu Fri Feb 15 05:33:29 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Fri, 15 Feb 2013 05:33:29 -0600 (CST) Subject: [Swift-commit] r6278 - in SwiftApps/modis: . tutorial Message-ID: <20130215113330.039F59D598@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-15 05:33:21 -0600 (Fri, 15 Feb 2013) New Revision: 6278 Modified: SwiftApps/modis/README SwiftApps/modis/tutorial/modis04.swift Log: Use defaults arg values for all scripts Modified: SwiftApps/modis/README =================================================================== --- SwiftApps/modis/README 2013-02-15 10:58:22 UTC (rev 6277) +++ SwiftApps/modis/README 2013-02-15 11:33:21 UTC (rev 6278) @@ -58,6 +58,12 @@ $ swiftrun -site midway tutorial/modis03.swift -tutorial/modis04.swift ------ -Also creates a map with top section selected +modis04.swift +------------- +The fourth modis example adds another app called markMap that looks at selectedtiles.txt +and highlights the selected areas on a map. It will create a new image called +markedGrid.ppm. + +To run modis04.swift: + +$ swiftrun -site midway tutorial/modis04.swift Modified: SwiftApps/modis/tutorial/modis04.swift =================================================================== --- SwiftApps/modis/tutorial/modis04.swift 2013-02-15 10:58:22 UTC (rev 6277) +++ SwiftApps/modis/tutorial/modis04.swift 2013-02-15 11:33:21 UTC (rev 6278) @@ -18,10 +18,10 @@ } # Constants and command line arguments -int nFiles = @toInt(@arg("nfiles")); -int nSelect = @toInt(@arg("nselect")); -string landType = @arg("landtype"); -string MODISdir = @arg("modisdir"); +int nFiles = @toInt(@arg("nfiles", "1000")); +int nSelect = @toInt(@arg("nselect", "10")); +string landType = @arg("landtype", "urban"); +string MODISdir = @arg("modisdir", "../data/modis/2002"); # Input Dataset imagefile geos[] ; From davidk at ci.uchicago.edu Fri Feb 15 06:10:51 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Fri, 15 Feb 2013 06:10:51 -0600 (CST) Subject: [Swift-commit] r6279 - in SwiftApps/modis: bin tutorial Message-ID: <20130215121051.1C2CC9D598@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-15 06:10:42 -0600 (Fri, 15 Feb 2013) New Revision: 6279 Added: SwiftApps/modis/bin/is_land.pl Modified: SwiftApps/modis/bin/analyzelanduse.sh SwiftApps/modis/bin/getlanduse.pl SwiftApps/modis/bin/markmap.sh SwiftApps/modis/tutorial/modis03.swift Log: Start of ascii map generation Modified: SwiftApps/modis/bin/analyzelanduse.sh =================================================================== --- SwiftApps/modis/bin/analyzelanduse.sh 2013-02-15 11:33:21 UTC (rev 6278) +++ SwiftApps/modis/bin/analyzelanduse.sh 2013-02-15 12:10:42 UTC (rev 6279) @@ -31,13 +31,33 @@ # Max limit to analyze maxnum=$4 +# ASCII map name +asciimap=$6 + +BINDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + # Write topselected.txt result=$( grep " $usetype " $( eval echo $5 ) | sed s/':'/' '/g | sort -rnk2 | awk '{print $1 " " $2}' | head -$maxnum ) echo "$result" > $topselected # Write selectedtiles.txt +selected_tiles="" for r in $( echo "$result" | awk '{print $1}' ) do - echo $( basename $r ).ppm.gz |sed s/\.landuse\.byfreq//g >> $selectedtiles + tile=$( basename $r ).ppm.gz |sed s/\.landuse\.byfreq//g + echo $tile >> $selectedtiles + selected_tiles="$selected_tiles $tile" done + +# Write ASCII map +for image in $( eval echo $5 ) +do + is_land=$( $BINDIR/is_land.pl $image ) + if [ "$is_land" == "1" ]; then + echo $image is land >> $asciimap + else + echo $image is water >> $asciimap + fi +done + exit 0 Modified: SwiftApps/modis/bin/getlanduse.pl =================================================================== --- SwiftApps/modis/bin/getlanduse.pl 2013-02-15 11:33:21 UTC (rev 6278) +++ SwiftApps/modis/bin/getlanduse.pl 2013-02-15 12:10:42 UTC (rev 6279) @@ -1,7 +1,7 @@ #!/usr/bin/perl -w # Input to this program should be a gzipped PGM file -# Usage: pgmhist.pl myfile.pgm.gz +# Usage: getlanduse.pl myfile.pgm.gz my $pgm_filename = shift; open(PGMFILE, "gunzip -c $pgm_filename |") || die "Unable to open $pgm_filename!\n"; Added: SwiftApps/modis/bin/is_land.pl =================================================================== --- SwiftApps/modis/bin/is_land.pl (rev 0) +++ SwiftApps/modis/bin/is_land.pl 2013-02-15 12:10:42 UTC (rev 6279) @@ -0,0 +1,34 @@ +#!/usr/bin/perl -w + +# Usage: is_land.pl myfile.pgm.gz +# Returns 0 if image is land, 1 if water + +my $pgm_filename = shift; +open(PGMFILE, "gunzip -c $pgm_filename |") || die "Unable to open $pgm_filename!\n"; + +# Header +my $magic = ; +my $resolution = ; +my $maxvalue = ; +my ($xres, $yres) = split(' ', $resolution); + +# Use arrays to count frequencies +my @pixelcount; +foreach my $count(0..$maxvalue) { + $pixelcount[$count] = 0; +} + +# Read values +foreach() { + foreach $word(split) { + $pixelcount[$word]++; + } +} +close(PGMFILE); + +my $total_pixel_count=$xres*$yres; +my $water_count=$pixelcount[0]; + +if($water_count >= ($total_pixel_count/2)) { print "0\n"; } +else { print "1\n"; } + Property changes on: SwiftApps/modis/bin/is_land.pl ___________________________________________________________________ Added: svn:executable + * Modified: SwiftApps/modis/bin/markmap.sh =================================================================== --- SwiftApps/modis/bin/markmap.sh 2013-02-15 11:33:21 UTC (rev 6278) +++ SwiftApps/modis/bin/markmap.sh 2013-02-15 12:10:42 UTC (rev 6279) @@ -12,7 +12,8 @@ hv=$(echo $f | sed -e 's,^.*/,,' -e 's/\..*//') h=$(echo $hv | sed -e 's/h//' -e 's/v..//' -e 's/^0//') v=$(echo $hv | sed -e 's/h..//' -e 's/v//' -e 's/^0//') - echo hv=$hv h=$h v=$v $BINDIR/draw_rectangle.pl $outmap $((34+$h*16)) $((51+$v*16)) $((34+14+$h*16)) $((51+14+$v*16)) $outmap.tmp mv $outmap.tmp $outmap done + + Modified: SwiftApps/modis/tutorial/modis03.swift =================================================================== --- SwiftApps/modis/tutorial/modis03.swift 2013-02-15 11:33:21 UTC (rev 6278) +++ SwiftApps/modis/tutorial/modis03.swift 2013-02-15 12:10:42 UTC (rev 6279) @@ -7,9 +7,9 @@ getlanduse @filename(input) stdout=@filename(output); } -app (file output, file tilelist) analyzeLandUse (landuse input[], string usetype, int maxnum) +app (file output, file tilelist, file asciimap) analyzeLandUse (landuse input[], string usetype, int maxnum) { - analyzelanduse @output @tilelist usetype maxnum @input; + analyzelanduse @output @tilelist usetype maxnum @input @filename(asciimap); } # Constants and command line arguments @@ -31,4 +31,5 @@ # Find the top N tiles (by total area of selected landuse types) file topSelected <"topselected.txt">; file selectedTiles <"selectedtiles.txt">; -(topSelected, selectedTiles) = analyzeLandUse(land, landType, nSelect); +file asciiMap <"map.txt">; +(topSelected, selectedTiles, asciiMap) = analyzeLandUse(land, landType, nSelect); From davidk at ci.uchicago.edu Fri Feb 15 10:51:30 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Fri, 15 Feb 2013 10:51:30 -0600 (CST) Subject: [Swift-commit] r6280 - in SwiftApps/modis: bin tutorial Message-ID: <20130215165130.8E3AE9CCF5@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-15 10:51:30 -0600 (Fri, 15 Feb 2013) New Revision: 6280 Modified: SwiftApps/modis/bin/analyzelanduse.sh SwiftApps/modis/bin/getlanduse.sh SwiftApps/modis/bin/markmap.sh SwiftApps/modis/tutorial/modis03.swift SwiftApps/modis/tutorial/modis04.swift Log: Some updates for ascii maps Modified: SwiftApps/modis/bin/analyzelanduse.sh =================================================================== --- SwiftApps/modis/bin/analyzelanduse.sh 2013-02-15 12:10:42 UTC (rev 6279) +++ SwiftApps/modis/bin/analyzelanduse.sh 2013-02-15 16:51:30 UTC (rev 6280) @@ -31,33 +31,13 @@ # Max limit to analyze maxnum=$4 -# ASCII map name -asciimap=$6 - -BINDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - # Write topselected.txt result=$( grep " $usetype " $( eval echo $5 ) | sed s/':'/' '/g | sort -rnk2 | awk '{print $1 " " $2}' | head -$maxnum ) echo "$result" > $topselected # Write selectedtiles.txt -selected_tiles="" for r in $( echo "$result" | awk '{print $1}' ) do - tile=$( basename $r ).ppm.gz |sed s/\.landuse\.byfreq//g - echo $tile >> $selectedtiles - selected_tiles="$selected_tiles $tile" + echo $( basename $r ).ppm.gz |sed s/\.landuse\.byfreq//g >> $selectedtiles done - -# Write ASCII map -for image in $( eval echo $5 ) -do - is_land=$( $BINDIR/is_land.pl $image ) - if [ "$is_land" == "1" ]; then - echo $image is land >> $asciimap - else - echo $image is water >> $asciimap - fi -done - exit 0 Modified: SwiftApps/modis/bin/getlanduse.sh =================================================================== --- SwiftApps/modis/bin/getlanduse.sh 2013-02-15 12:10:42 UTC (rev 6279) +++ SwiftApps/modis/bin/getlanduse.sh 2013-02-15 16:51:30 UTC (rev 6280) @@ -2,3 +2,4 @@ BINDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" $BINDIR/getlanduse.pl $1 | sort -rn +$BINDIR/is_land.pl $1 > $2 Modified: SwiftApps/modis/bin/markmap.sh =================================================================== --- SwiftApps/modis/bin/markmap.sh 2013-02-15 12:10:42 UTC (rev 6279) +++ SwiftApps/modis/bin/markmap.sh 2013-02-15 16:51:30 UTC (rev 6280) @@ -5,6 +5,9 @@ tilefile=$1 outmap=$2 +asciimap=$3 +modisdir=$4 +is_land_files=$5 cp $BINDIR/grid.ppm $outmap @@ -16,4 +19,23 @@ mv $outmap.tmp $outmap done +for h in {0..35}; do + h=$( printf %02d $h ); + for v in {0..17}; do + v=$( printf %02d $v ); + hv=h${h}v${v} + #echo hv is $hv >> $asciimap + if [ -f "landuse/$hv.is_land" ]; then + is_land=$( cat landuse/$hv.is_land ) + if [ "$is_land" == 0 ]; then + echo -n "X" >> $asciimap + else + echo -n "_" >> $asciimap + fi + else + echo -n " " >> $asciimap + fi + done + echo "" >> $asciimap +done Modified: SwiftApps/modis/tutorial/modis03.swift =================================================================== --- SwiftApps/modis/tutorial/modis03.swift 2013-02-15 12:10:42 UTC (rev 6279) +++ SwiftApps/modis/tutorial/modis03.swift 2013-02-15 16:51:30 UTC (rev 6280) @@ -2,14 +2,14 @@ type imagefile; type landuse; -app (landuse output) getLandUse (imagefile input) +app (landuse output, landuse island) getLandUse (imagefile input) { - getlanduse @filename(input) stdout=@filename(output); + getlanduse @filename(input) @filename(island) stdout=@filename(output); } -app (file output, file tilelist, file asciimap) analyzeLandUse (landuse input[], string usetype, int maxnum) +app (file output, file tilelist) analyzeLandUse (landuse input[], string usetype, int maxnum) { - analyzelanduse @output @tilelist usetype maxnum @input @filename(asciimap); + analyzelanduse @output @tilelist usetype maxnum @input; } # Constants and command line arguments @@ -23,13 +23,13 @@ # Compute the land use summary of each MODIS tile landuse land[] ; +landuse is_land[] ; foreach g,i in geos { - land[i] = getLandUse(g); + (land[i], is_land[i]) = getLandUse(g); } # Find the top N tiles (by total area of selected landuse types) file topSelected <"topselected.txt">; file selectedTiles <"selectedtiles.txt">; -file asciiMap <"map.txt">; -(topSelected, selectedTiles, asciiMap) = analyzeLandUse(land, landType, nSelect); +(topSelected, selectedTiles) = analyzeLandUse(land, landType, nSelect); Modified: SwiftApps/modis/tutorial/modis04.swift =================================================================== --- SwiftApps/modis/tutorial/modis04.swift 2013-02-15 12:10:42 UTC (rev 6279) +++ SwiftApps/modis/tutorial/modis04.swift 2013-02-15 16:51:30 UTC (rev 6280) @@ -2,9 +2,9 @@ type imagefile; type landuse; -app (landuse output) getLandUse (imagefile input) +app (landuse output, landuse island) getLandUse (imagefile input) { - getlanduse @filename(input) stdout=@filename(output); + getlanduse @filename(input) @filename(island) stdout=@filename(output); } app (file output, file tilelist) analyzeLandUse (landuse input[], string usetype, int maxnum) @@ -12,9 +12,9 @@ analyzelanduse @output @tilelist usetype maxnum @input; } -app (imagefile grid) markMap (file tilelist) +app (imagefile grid, file asciimap) markMap (file tilelist, string mdir, landuse island[]) { - markmap @tilelist @grid; + markmap @tilelist @grid @filename(asciimap) mdir @island; } # Constants and command line arguments @@ -27,10 +27,11 @@ imagefile geos[] ; # Compute the land use summary of each MODIS tile -landuse land[] ; +landuse land[] ; +landuse is_land[] ; foreach g,i in geos { - land[i] = getLandUse(g); + (land[i], is_land[i]) = getLandUse(g); } # Find the top N tiles (by total area of selected landuse types) @@ -39,6 +40,6 @@ (topSelected, selectedTiles) = analyzeLandUse(land, landType, nSelect); # Mark the top N tiles on a sinusoidal gridded map -imagefile gridMap<"markedGrid.ppm">; -gridMap = markMap(topSelected); - +imagefile gridMap <"markedGrid.ppm">; +file asciiMap <"map.txt">; +(gridMap, asciiMap) = markMap(topSelected, MODISdir, is_land); From davidk at ci.uchicago.edu Fri Feb 15 12:31:32 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Fri, 15 Feb 2013 12:31:32 -0600 (CST) Subject: [Swift-commit] r6281 - SwiftApps/modis/tutorial Message-ID: <20130215183132.797B69CCF5@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-15 12:31:32 -0600 (Fri, 15 Feb 2013) New Revision: 6281 Modified: SwiftApps/modis/tutorial/modis01.swift SwiftApps/modis/tutorial/modis02.swift Log: Adjust for is_land test Modified: SwiftApps/modis/tutorial/modis01.swift =================================================================== --- SwiftApps/modis/tutorial/modis01.swift 2013-02-15 16:51:30 UTC (rev 6280) +++ SwiftApps/modis/tutorial/modis01.swift 2013-02-15 18:31:32 UTC (rev 6281) @@ -1,11 +1,12 @@ type imagefile; type landuse; -app (landuse output) getLandUse (imagefile input) +app (landuse output, landuse is_land) getLandUse (imagefile input) { - getlanduse @filename(input) stdout=@filename(output); + getlanduse @filename(input) @filename(is_land) stdout=@filename(output); } imagefile modisImage <"../data/modis/2002/h00v09.pgm.gz">; landuse result <"landuse/h00v08.landuse.byfreq">; -result = getLandUse(modisImage); +landuse land_result <"landuse/h00v08.is_land">; +(result, land_result) = getLandUse(modisImage); Modified: SwiftApps/modis/tutorial/modis02.swift =================================================================== --- SwiftApps/modis/tutorial/modis02.swift 2013-02-15 16:51:30 UTC (rev 6280) +++ SwiftApps/modis/tutorial/modis02.swift 2013-02-15 18:31:32 UTC (rev 6281) @@ -1,9 +1,9 @@ type imagefile; type landuse; -app (landuse output) getLandUse (imagefile input) +app (landuse output, landuse island) getLandUse (imagefile input) { - getlanduse @filenames(input) stdout=@filename(output); + getlanduse @filename(input) @filename(island) stdout=@filename(output); } # Constants and command line arguments @@ -15,8 +15,9 @@ # Compute the land use summary of each MODIS tile landuse land[] ; +landuse is_land[] ; foreach g,i in geos { - land[i] = getLandUse(g); + (land[i], is_land[i]) = getLandUse(g); } From davidk at ci.uchicago.edu Fri Feb 15 14:00:26 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Fri, 15 Feb 2013 14:00:26 -0600 (CST) Subject: [Swift-commit] r6282 - branches Message-ID: <20130215200026.60EBE9D0D2@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-15 14:00:26 -0600 (Fri, 15 Feb 2013) New Revision: 6282 Removed: branches/release-0.94/ Log: From davidk at ci.uchicago.edu Fri Feb 15 14:01:15 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Fri, 15 Feb 2013 14:01:15 -0600 (CST) Subject: [Swift-commit] r6283 - branches Message-ID: <20130215200115.ADDF49D0D2@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-15 14:01:15 -0600 (Fri, 15 Feb 2013) New Revision: 6283 Added: branches/release-0.94/ Log: From davidk at ci.uchicago.edu Fri Feb 15 14:10:43 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Fri, 15 Feb 2013 14:10:43 -0600 (CST) Subject: [Swift-commit] r6284 - branches/release-0.94/libexec Message-ID: <20130215201043.D730D9CCF5@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-15 14:10:43 -0600 (Fri, 15 Feb 2013) New Revision: 6284 Modified: branches/release-0.94/libexec/release.txt Log: Version 0.94RC4 Modified: branches/release-0.94/libexec/release.txt =================================================================== --- branches/release-0.94/libexec/release.txt 2013-02-15 20:01:15 UTC (rev 6283) +++ branches/release-0.94/libexec/release.txt 2013-02-15 20:10:43 UTC (rev 6284) @@ -1 +1 @@ -trunk +0.94RC4 From swift at ci.uchicago.edu Fri Feb 15 16:25:04 2013 From: swift at ci.uchicago.edu (swift at ci.uchicago.edu) Date: Fri, 15 Feb 2013 16:25:04 -0600 (CST) Subject: [Swift-commit] cog r3609 Message-ID: <20130215222504.E26468D000A2@bridled.ci.uchicago.edu> ------------------------------------------------------------------------ r3609 | davidkelly999 | 2013-02-15 16:21:59 -0600 (Fri, 15 Feb 2013) | 2 lines User control of exclusive vs. shared nodes (#933) ------------------------------------------------------------------------ Index: modules/provider-localscheduler/src/org/globus/cog/abstraction/impl/scheduler/slurm/SlurmExecutor.java =================================================================== --- modules/provider-localscheduler/src/org/globus/cog/abstraction/impl/scheduler/slurm/SlurmExecutor.java (revision 3608) +++ modules/provider-localscheduler/src/org/globus/cog/abstraction/impl/scheduler/slurm/SlurmExecutor.java (working copy) @@ -113,6 +113,8 @@ Task task = getTask(); JobSpecification spec = getSpec(); Properties properties = Properties.getProperties(); + boolean exclusive_defined=false; + validate(task); writeHeader(wr); @@ -123,7 +125,6 @@ wr.write("#SBATCH --output=" + quote(stdout) + '\n'); wr.write("#SBATCH --error=" + quote(stderr) + '\n'); wr.write("#SBATCH --nodes=" + count + '\n'); - wr.write("#SBATCH --exclusive\n"); wr.write("#SBATCH --ntasks-per-node=1\n"); writeNonEmptyAttr("ppn", "--cpus-per-task", wr); writeNonEmptyAttr("project", "--account", wr); @@ -134,10 +135,24 @@ for (String a : spec.getAttributeNames()) { if (a != null && a.startsWith("slurm.")) { String attributeName[] = a.split("slurm."); - wr.write("#SBATCH --" + attributeName[1] + "=" + spec.getAttribute(a) + '\n'); + if (attributeName[1].equals("exclusive")) { + exclusive_defined=true; + if(spec.getAttribute(a).equals("true")) { + wr.write("#SBATCH --exclusive"); + } else { + wr.write("#SBATCH --share"); + } + + } else { + wr.write("#SBATCH --" + attributeName[1] + "=" + spec.getAttribute(a) + '\n'); + } } } - + + if(!exclusive_defined) { + wr.write("#SBATCH --exclusive\n"); + } + wr.write("\n"); for (String name : spec.getEnvironmentVariableNames()) { wr.write("export " + name + '=' + quote(spec.getEnvironmentVariable(name)) + '\n'); From ketan at ci.uchicago.edu Sat Feb 16 10:38:44 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Sat, 16 Feb 2013 10:38:44 -0600 (CST) Subject: [Swift-commit] r6285 - in trunk/docs: . merged merged/userguide Message-ID: <20130216163844.BFC619CFDD@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-16 10:38:43 -0600 (Sat, 16 Feb 2013) New Revision: 6285 Modified: trunk/docs/build_docs.sh trunk/docs/merged/build_docs.sh trunk/docs/merged/userguide/coasters Log: minor updates Modified: trunk/docs/build_docs.sh =================================================================== --- trunk/docs/build_docs.sh 2013-02-15 20:10:43 UTC (rev 6284) +++ trunk/docs/build_docs.sh 2013-02-16 16:38:43 UTC (rev 6285) @@ -48,8 +48,6 @@ exit 1 fi -INSTALLATION_DIRECTORY=$1 - # Create installation directory if needed if [ ! -d "$INSTALLATION_DIRECTORY" ]; then mkdir $INSTALLATION_DIRECTORY || crash "Unable to create directory $INSTALLATION_DIRECTORY" Modified: trunk/docs/merged/build_docs.sh =================================================================== --- trunk/docs/merged/build_docs.sh 2013-02-15 20:10:43 UTC (rev 6284) +++ trunk/docs/merged/build_docs.sh 2013-02-16 16:38:43 UTC (rev 6285) @@ -113,3 +113,4 @@ find $INSTALLATION_DIRECTORY/$VERSION -type f -exec chgrp $GROUP {} \; -exec chmod $CHMOD_FILE_MODE {} \; > /dev/null 2>&1 find $INSTALLATION_DIRECTORY/$VERSION -type d -exec chgrp $GROUP {} \; -exec chmod $CHMOD_DIRECTORY_MODE {} \; > /dev/null 2>&1 + Modified: trunk/docs/merged/userguide/coasters =================================================================== --- trunk/docs/merged/userguide/coasters 2013-02-15 20:10:43 UTC (rev 6284) +++ trunk/docs/merged/userguide/coasters 2013-02-16 16:38:43 UTC (rev 6285) @@ -3,7 +3,7 @@ Introduction ~~~~~~~~~~~~ -Coasters are the Swift's implementation of _pilot job abstraction_. +Coasters are the Swift's implementation of the _pilot job abstraction_. In many applications, Swift performance can be greatly enhanced by the use of coasters. Coasters provide a low-overhead job submission and file transfer @@ -39,7 +39,7 @@ To use for job execution, specify a sites.xml execution element like this: ---- - + ---- The jobmanager string contains more detail than with other providers. It @@ -55,7 +55,7 @@ To use for file transfer, specify a sites.xml filesystem element like this: ---- - + ---- The url parameter should be a pseudo-URI formed with the URI scheme @@ -93,10 +93,11 @@ Coasters -------- Coasters were introduced in Swift v0.6 as an experimental feature. In many -applications, Swift performance can be greatly enhanced by the use of -coasters. Coasters provide a low-overhead job submission and file transfer -mechanism suited for the execution of short jobs (on the order of a few -seconds). A detailed information on coasters can be found at http://www.ci.uchicago.edu/swift/guides/userguide.php#coasters. +applications, Swift performance can be greatly enhanced by the use of coasters. +Coasters provide a low-overhead job submission and file transfer mechanism +suited for the execution of short jobs (on the order of a few seconds). A +detailed information on coasters can be found at +http://www.ci.uchicago.edu/swift/guides/userguide.php#coasters. //**Include neat diagrams.** Following is a coasters setup case-study for a PBS underlying provider where sites.xml coaster settings were: @@ -129,7 +130,7 @@ 10000 source~~~~ -The following table briefly describes the elements on the coasters setup: +The following table briefly describes the elements of the coasters setup: [width="70%", cols="^3,10", options="header"] |============================================================================================= |profile key | brief description @@ -144,36 +145,19 @@ |jobThrottle |the number of concurrent jobs allowed on a site |============================================================================================== -// -//For Beginners -//~~~~~~~~~~~~~~ -//Coasters for beginners. Usage of existing, prebuilt templates. -// -//For Intermediate Users -//~~~~~~~~~~~~~~~~~~~~~~~ -//Coasters for intermediate users. -// -//Using gensites -//^^^^^^^^^^^^^^^ -//Usage of gensites to generate your own sites -//configurations. -// -// -// - For Advanced Users ~~~~~~~~~~~~~~~~~~ //Coasters for advanced users. Getting your hands dirty. -One of the main reason that one would initially deviate from coaster -defaults into more complex pool entries is to force jobs to fit into some -site-imposed constraint. For instance a typical submission to the experimental -queue requires a user to request upto 3 nodes for under 1 hour. This setup -could be achieved with a careful tuning of coaters parameters. +One of the main reason that one would initially deviate from coaster defaults +into more complex pool entries is to force jobs to fit into some site-imposed +constraint. For instance a typical submission to a fast PBS queue requires a +user to request upto 3 nodes for under 1 hour. This setup could be achieved +with a careful tuning of coaters parameters. -//How to run Swift under different Coasters configurations -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Coasters configurations +~~~~~~~~~~~~~~~~~~~~~~~ // //Manual //^^^^^^^ From ketan at ci.uchicago.edu Sun Feb 17 18:39:04 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Sun, 17 Feb 2013 18:39:04 -0600 (CST) Subject: [Swift-commit] r6286 - in trunk/docs: userguide utils Message-ID: <20130218003904.76AF49CC9A@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-17 18:39:03 -0600 (Sun, 17 Feb 2013) New Revision: 6286 Modified: trunk/docs/userguide/transformation_catalog trunk/docs/utils/gensites.txt Log: minor improvements Modified: trunk/docs/userguide/transformation_catalog =================================================================== --- trunk/docs/userguide/transformation_catalog 2013-02-16 16:38:43 UTC (rev 6285) +++ trunk/docs/userguide/transformation_catalog 2013-02-18 00:39:03 UTC (rev 6286) @@ -8,12 +8,12 @@ Swift configuration file or on the command line. The format is one line per executable per site, with fields separated by -tabs. +tab or space. Some example entries: ---- -localhost echo /bin/echo INSTALLED INTEL32::LINUX null -TGUC touch /usr/bin/touch INSTALLED INTEL32::LINUX GLOBUS::maxwalltime="0:1" +localhost echo /bin/echo INSTALLED INTEL32::LINUX null +TGUC touch /usr/bin/touch INSTALLED INTEL32::LINUX GLOBUS::maxwalltime="0:1" ---- The fields are: site, transformation name, executable path, installation @@ -40,7 +40,7 @@ the following application sets an environment variable called R_LIBS to /home/user/R_libs. ----- -localhost R /usr/bin/R INSTALLED INTEL32::LINUX env::R_LIBS=/home/user/r_libs +localhost R /usr/bin/R INSTALLED INTEL32::LINUX env::R_LIBS=/home/user/r_libs ----- Setting Multiple Profiles @@ -49,5 +49,5 @@ sets two environment variables: R_LIBS and R_HOME. ----- -localhost R /usr/bin/R INSTALLED INTEL32::LINUX env::R_LIBS=/home/user/r_libs;env::R_HOME=/home/user/r +localhost R /usr/bin/R INSTALLED INTEL32::LINUX env::R_LIBS=/home/user/r_libs;env::R_HOME=/home/user/r ----- Modified: trunk/docs/utils/gensites.txt =================================================================== --- trunk/docs/utils/gensites.txt 2013-02-16 16:38:43 UTC (rev 6285) +++ trunk/docs/utils/gensites.txt 2013-02-18 00:39:03 UTC (rev 6286) @@ -9,8 +9,8 @@ -------- To simplify this configuration process, versions of Swift starting with 0.92 include a utility called gensites. The gensites command is used -to generate a sites.xml file for running a swift workflow on a given -site. It accomplishes this by using a series of templates. The templates +to generate a sites.xml file for running a Swift script on a given +site. It accomplishes this by using site templates. The templates used by gensites are the same templates used for internal testing, so they are likely up to date and known to work on a given site. @@ -25,21 +25,25 @@ You should see output similar to this: ----- +beagle +beagle-ssh intrepid local -local-pbs-coasters +midway pads +persistent-coasters queenbee sge-local -ssh ssh-pbs-coasters +stampede surveyor +uc3 ----- You will notice that the templates can be specific to a particular set of machines like Intrepid and Queenbee, or they may be more general and aim to work across a variety of machines, as in the case of -local-pbs-coasters. Gensites will look in three directories for available +ssh-pbs-coasters. Gensites will look in three directories for available templates: your current directory, $SWIFT_HOME/etc/sites and $HOME/.swift/sites. Listing the Template @@ -50,19 +54,19 @@ $ gensites -l templatename ----- -Running this command will print some information about the template and give -you an idea of what settings you will need to specify. +Running this command will print the contents of sites.xml file corresponding to +the template and give you an idea of what settings you will need to specify. -The required tokens are required to properly use the templates. These are -placeholder values you will need to specify in the following steps. +The tokens are required to properly use the templates. These are placeholder +values you will need to specify in the following steps. Providing Site Specific Values ------------------------------ -The gensites script needs to know how to replace the placeholder values -in the template. This is done by configuring the swift.properties file. -Gensites will first look for a swift.properties file in the current -directory. If it does not exist, it will next look in $HOME/.swift. +The gensites script needs to know how to replace the placeholder values in the +template. This is done by configuring the swift.properties file. Gensites will +first look for a swift.properties file in the current directory. If it does not +exist, it will next look in $HOME/.swift. To add site specific values to swift.properties, add a line in the follow format: @@ -71,9 +75,8 @@ #site templatename setting=value ----- -Continuing the previous example, here is what you could add to -swift.properties to replace the values of project, queue and work for -the surveyor template: +For example, here is what you could add to swift.properties to replace the +values of project, queue and work for the surveyor template: ----- #site surveyor project=MyProject @@ -119,7 +122,7 @@ This first example shows a site specific application. The #app definition tells gensites this is related to an application rather than a #site definition. In the second part, echo=/usr/bin/echo, the left hand side -is the name of the application that will be called from within swift. The +is the name of the application that will be called from within Swift. The right hand site is the path name which points to the binary. ----- @@ -159,18 +162,19 @@ to the swift.properties, use: ----- -$ gensites surveyor -p myswift.properties > myconfig.xml +$ gensites surveyor -p myswift.properties > sites.surveyor.xml ----- -Next, provide the configuration filename to swift: +Next, provide the configuration filename to Swift: ----- -$ swift -sites.file myconfig.xml myscript.swift +$ swift -sites.file sites.surveyor.xml myscript.swift ----- Alternatively, if you have specified applications, be sure to load that into -Swift +Swift: + ----- -$ swift -sites.file myconfig.xml -tc.file tc.data mycript.swift +$ swift -sites.file sites.surveyor.xml -tc.file tc.data mycript.swift ----- Providing Default Values for All Templates From ketan at ci.uchicago.edu Sun Feb 17 19:22:59 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Sun, 17 Feb 2013 19:22:59 -0600 (CST) Subject: [Swift-commit] r6287 - in trunk/docs: quickstart userguide Message-ID: <20130218012259.099259CC9A@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-17 19:22:58 -0600 (Sun, 17 Feb 2013) New Revision: 6287 Modified: trunk/docs/quickstart/quickstart.txt trunk/docs/userguide/commands Log: minor improvements Modified: trunk/docs/quickstart/quickstart.txt =================================================================== --- trunk/docs/quickstart/quickstart.txt 2013-02-18 00:39:03 UTC (rev 6286) +++ trunk/docs/quickstart/quickstart.txt 2013-02-18 01:22:58 UTC (rev 6287) @@ -14,9 +14,9 @@ In general, they are more stable, have fewer bugs, and have been tested on a variety of systems. -The development version of Swift is aimed at developers and testers. The development -code has the highest chance of containing buggy and untested code. If you need stability -please use the latest stable release. +The development version of Swift is aimed at developers and testers. The +development code has the highest chance of containing buggy and/or untested +code. If you need stability, use the latest stable release. Downloading a Swift Distribution -------------------------------- @@ -64,7 +64,7 @@ directory is located. If you installed Swift from a binary release, it will be in the swift-0.93/bin directory where you installed it. If you followed the instructions above for installing Swift from a source repository, it -will be located in swift-0.93/cog/modules/swift/dist/swift-svn/bin. +will be located in swift-/cog/modules/swift/dist/swift-svn/bin. Add the following line to the bottom of ~/.bashrc: @@ -82,11 +82,11 @@ Running Swift Examples ---------------------- The Swift examples can be found in the examples directory in the Swift -distribution. The examples are written in the SwiftScript language, and +distribution. The examples are written in the Swift scripting language, and have .swift as a file extension. -Execution of a Swift workflow is done using the swift command, which -takes the Swift workflow file name as an argument: +Execution of a Swift script is done using the swift command, which +takes the Swift script file name as an argument: ----- cd examples/tutorial @@ -98,4 +98,4 @@ Swift script! More documentation on how to run Swift can be found at -http://www.ci.uchicago.edu/swift/docs/index.php, +http://www.ci.uchicago.edu/swift/docs/index.php Modified: trunk/docs/userguide/commands =================================================================== --- trunk/docs/userguide/commands 2013-02-18 00:39:03 UTC (rev 6286) +++ trunk/docs/userguide/commands 2013-02-18 01:22:58 UTC (rev 6287) @@ -74,6 +74,30 @@ unique with respect to all other run IDs that might be used, irrespective of (at least) expected execution sites, program or user. +-version + + Display Swift version and exit + +-recompile + + Forces Swift to re-compile the invoked Swift script. While Swift + is meant to detect when recompilation is necessary, in some + special cases it fails to do so. This flag helps with those + special cases. + +-cdm.file + + Specifies a CDM policy file. + +-reduced.logging + + Makes logging more terse by disabling provenance information and + low-level task messages + +-minimal.logging + + Makes logging much more terse: reports warnings only + -tui Displays an interactive text mode monitor during a run. (since Swift From davidk at ci.uchicago.edu Mon Feb 18 09:28:03 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Mon, 18 Feb 2013 09:28:03 -0600 (CST) Subject: [Swift-commit] r6288 - in SwiftApps/modis: bin data/modis/2002 Message-ID: <20130218152803.149E79CC8F@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-18 09:28:01 -0600 (Mon, 18 Feb 2013) New Revision: 6288 Modified: SwiftApps/modis/bin/getlanduse.pl SwiftApps/modis/data/modis/2002/README.data Log: Change getlanduse.pl to use rgb files Modified: SwiftApps/modis/bin/getlanduse.pl =================================================================== --- SwiftApps/modis/bin/getlanduse.pl 2013-02-18 01:22:58 UTC (rev 6287) +++ SwiftApps/modis/bin/getlanduse.pl 2013-02-18 15:28:01 UTC (rev 6288) @@ -1,32 +1,23 @@ #!/usr/bin/perl -w -# Input to this program should be a gzipped PGM file -# Usage: getlanduse.pl myfile.pgm.gz +# Input to this program should be a raw, greyscale RGB file +# Usage: getlanduse.pl myfile.rgb -my $pgm_filename = shift; -open(PGMFILE, "gunzip -c $pgm_filename |") || die "Unable to open $pgm_filename!\n"; +my $image_filename = shift; +open(IMAGEFILE, "$image_filename") || die "Unable to open $image_filename!\n"; +binmode IMAGEFILE; -# Header -my $magic = ; -my $resolution = ; -my $maxvalue = ; - -# Use arrays to count frequencies my @pixelcount; -foreach my $count(0..$maxvalue) { - $pixelcount[$count] = 0; -} +foreach my $count (0..255) { $pixelcount[$count] = 0; } -# Read values -foreach() { - foreach $word(split) { - $pixelcount[$word]++; - } +# Read values, three bytes at a time +$/ = \3; +foreach() { + $pixelcount[unpack('C', $_)]++; } -close(PGMFILE); +close(IMAGEFILE); -foreach my $count(0..$maxvalue) { - if($pixelcount[$count] == 0){ next; } +foreach my $count (0..255) { + if($pixelcount[$count] == 0) { next; } printf("%d %d %02x\n", $pixelcount[$count], $count, $count); } - Modified: SwiftApps/modis/data/modis/2002/README.data =================================================================== --- SwiftApps/modis/data/modis/2002/README.data 2013-02-18 01:22:58 UTC (rev 6287) +++ SwiftApps/modis/data/modis/2002/README.data 2013-02-18 15:28:01 UTC (rev 6288) @@ -1 +1 @@ -Download and extract modis data from http://www.ci.uchicago.edu/swift/modis/modis-2002.tar. It's approximately 140MB. +Download and extract modis data from http://www.ci.uchicago.edu/swift/modis/modis-2002.tar.gz. It's approximately 130MB. From ketan at ci.uchicago.edu Mon Feb 18 14:28:51 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Mon, 18 Feb 2013 14:28:51 -0600 (CST) Subject: [Swift-commit] r6289 - trunk/tests Message-ID: <20130218202851.C514B9CCC1@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-18 14:28:51 -0600 (Mon, 18 Feb 2013) New Revision: 6289 Modified: trunk/tests/README Log: minor fix Modified: trunk/tests/README =================================================================== --- trunk/tests/README 2013-02-18 15:28:01 UTC (rev 6288) +++ trunk/tests/README 2013-02-18 20:28:51 UTC (rev 6289) @@ -1,6 +1,6 @@ USAGENOTES contains instructions on how to operate the test suite. It is an asciidoc document, in order to properly build it run the following command: -$ asciidoc -a toc USAGENOTES +$ asciidoc -a toc USAGENOTES.txt It will generate an HTML file called USAGENOTES. Warning: From davidk at ci.uchicago.edu Mon Feb 18 14:36:02 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Mon, 18 Feb 2013 14:36:02 -0600 (CST) Subject: [Swift-commit] r6290 - in SwiftApps/modis: . tutorial Message-ID: <20130218203602.E5C319CCC1@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-18 14:36:02 -0600 (Mon, 18 Feb 2013) New Revision: 6290 Modified: SwiftApps/modis/modis.swift SwiftApps/modis/tutorial/modis01.swift SwiftApps/modis/tutorial/modis02.swift SwiftApps/modis/tutorial/modis03.swift SwiftApps/modis/tutorial/modis04.swift Log: Fix path names to images Modified: SwiftApps/modis/modis.swift =================================================================== --- SwiftApps/modis/modis.swift 2013-02-18 20:28:51 UTC (rev 6289) +++ SwiftApps/modis/modis.swift 2013-02-18 20:36:02 UTC (rev 6290) @@ -35,7 +35,7 @@ string webDir = @arg("webdir"); # Input Dataset -imagefile geos[] ; +imagefile geos[] ; # Compute the land use summary of each MODIS tile landuse land[] ; Modified: SwiftApps/modis/tutorial/modis01.swift =================================================================== --- SwiftApps/modis/tutorial/modis01.swift 2013-02-18 20:28:51 UTC (rev 6289) +++ SwiftApps/modis/tutorial/modis01.swift 2013-02-18 20:36:02 UTC (rev 6290) @@ -6,7 +6,7 @@ getlanduse @filename(input) @filename(is_land) stdout=@filename(output); } -imagefile modisImage <"../data/modis/2002/h00v09.pgm.gz">; -landuse result <"landuse/h00v08.landuse.byfreq">; -landuse land_result <"landuse/h00v08.is_land">; +imagefile modisImage <"../data/modis/2002/h00v09.rgb">; +landuse result <"landuse/h00v09.landuse.byfreq">; +landuse land_result <"landuse/h00v09.is_land">; (result, land_result) = getLandUse(modisImage); Modified: SwiftApps/modis/tutorial/modis02.swift =================================================================== --- SwiftApps/modis/tutorial/modis02.swift 2013-02-18 20:28:51 UTC (rev 6289) +++ SwiftApps/modis/tutorial/modis02.swift 2013-02-18 20:36:02 UTC (rev 6290) @@ -11,7 +11,7 @@ string MODISdir = @arg("modisdir", "../data/modis/2002"); # Input Dataset -imagefile geos[] ; +imagefile geos[] ; # Compute the land use summary of each MODIS tile landuse land[] ; Modified: SwiftApps/modis/tutorial/modis03.swift =================================================================== --- SwiftApps/modis/tutorial/modis03.swift 2013-02-18 20:28:51 UTC (rev 6289) +++ SwiftApps/modis/tutorial/modis03.swift 2013-02-18 20:36:02 UTC (rev 6290) @@ -19,7 +19,7 @@ string MODISdir = @arg("modisdir", "../data/modis/2002"); # Input Dataset -imagefile geos[] ; +imagefile geos[] ; # Compute the land use summary of each MODIS tile landuse land[] ; Modified: SwiftApps/modis/tutorial/modis04.swift =================================================================== --- SwiftApps/modis/tutorial/modis04.swift 2013-02-18 20:28:51 UTC (rev 6289) +++ SwiftApps/modis/tutorial/modis04.swift 2013-02-18 20:36:02 UTC (rev 6290) @@ -24,7 +24,7 @@ string MODISdir = @arg("modisdir", "../data/modis/2002"); # Input Dataset -imagefile geos[] ; +imagefile geos[] ; # Compute the land use summary of each MODIS tile landuse land[] ; From davidk at ci.uchicago.edu Tue Feb 19 11:55:52 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Tue, 19 Feb 2013 11:55:52 -0600 (CST) Subject: [Swift-commit] r6291 - branches/release-0.94/etc/sites Message-ID: <20130219175552.249159CC8F@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-19 11:55:51 -0600 (Tue, 19 Feb 2013) New Revision: 6291 Added: branches/release-0.94/etc/sites/fusion Log: A fusion template for testing Added: branches/release-0.94/etc/sites/fusion =================================================================== --- branches/release-0.94/etc/sites/fusion (rev 0) +++ branches/release-0.94/etc/sites/fusion 2013-02-19 17:55:51 UTC (rev 6291) @@ -0,0 +1,15 @@ + + + + 3600 + 8 + shared + 1 + 1 + 1 + 1.0 + 100 + 100 + 100 + /home/{env.USER}/swiftwork + From davidk at ci.uchicago.edu Tue Feb 19 12:01:06 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Tue, 19 Feb 2013 12:01:06 -0600 (CST) Subject: [Swift-commit] r6292 - SwiftApps/modis/conf Message-ID: <20130219180106.7D2899CC8F@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-19 12:01:06 -0600 (Tue, 19 Feb 2013) New Revision: 6292 Added: SwiftApps/modis/conf/fusion.cf Log: Fusion config Added: SwiftApps/modis/conf/fusion.cf =================================================================== --- SwiftApps/modis/conf/fusion.cf (rev 0) +++ SwiftApps/modis/conf/fusion.cf 2013-02-19 18:01:06 UTC (rev 6292) @@ -0,0 +1,14 @@ +wrapperlog.always.transfer=true +sitedir.keep=true +execution.retries=0 +lazy.errors=false +status.mode=provider +use.provider.staging=false +provider.staging.pin.swiftfiles=false + +#app getlanduse=$PWD/../bin/getlanduse.sh +#app analyzelanduse=$PWD/../bin/analyzelanduse.sh +#app colormodis=$PWD/../bin/colormodis.sh +#app assemble=$PWD/../bin/assemble2.sh +#app markmap=$PWD/../bin/markmap.sh +#app echo=/bin/echo From davidk at ci.uchicago.edu Tue Feb 19 12:08:38 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Tue, 19 Feb 2013 12:08:38 -0600 (CST) Subject: [Swift-commit] r6293 - branches/release-0.94/etc/sites Message-ID: <20130219180838.1B6459CC8F@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-19 12:08:37 -0600 (Tue, 19 Feb 2013) New Revision: 6293 Added: branches/release-0.94/etc/sites/local-coasters Log: Local-coasters template Added: branches/release-0.94/etc/sites/local-coasters =================================================================== --- branches/release-0.94/etc/sites/local-coasters (rev 0) +++ branches/release-0.94/etc/sites/local-coasters 2013-02-19 18:08:37 UTC (rev 6293) @@ -0,0 +1,7 @@ + + + _JOBTHROTTLE_ + 10000 + + {env.HOME}/swiftwork + From davidk at ci.uchicago.edu Tue Feb 19 12:08:55 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Tue, 19 Feb 2013 12:08:55 -0600 (CST) Subject: [Swift-commit] r6294 - SwiftApps/modis/conf Message-ID: <20130219180855.AA95E9CC8F@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-19 12:08:55 -0600 (Tue, 19 Feb 2013) New Revision: 6294 Added: SwiftApps/modis/conf/local-coasters.cf Log: local-coasters config Added: SwiftApps/modis/conf/local-coasters.cf =================================================================== --- SwiftApps/modis/conf/local-coasters.cf (rev 0) +++ SwiftApps/modis/conf/local-coasters.cf 2013-02-19 18:08:55 UTC (rev 6294) @@ -0,0 +1,15 @@ +wrapperlog.always.transfer=true +sitedir.keep=true +execution.retries=0 +lazy.errors=false +status.mode=provider +use.provider.staging=false +provider.staging.pin.swiftfiles=false +#site local-coasters JOBTHROTTLE=0.038 + +#app getlanduse=$PWD/../bin/getlanduse.sh +#app analyzelanduse=$PWD/../bin/analyzelanduse.sh +#app colormodis=$PWD/../bin/colormodis.sh +#app assemble=$PWD/../bin/assemble2.sh +#app markmap=$PWD/../bin/markmap.sh +#app echo=/bin/echo From hategan at ci.uchicago.edu Tue Feb 19 13:50:13 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Tue, 19 Feb 2013 13:50:13 -0600 (CST) Subject: [Swift-commit] r6295 - branches/faster/src/org/griphyn/vdl/karajan/lib Message-ID: <20130219195013.429A3178884@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-19 13:50:13 -0600 (Tue, 19 Feb 2013) New Revision: 6295 Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/SiteCatalog.java Log: better backwards compatibility with previous site catalog parsing scheme Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/SiteCatalog.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/SiteCatalog.java 2013-02-19 18:08:55 UTC (rev 6294) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/SiteCatalog.java 2013-02-19 19:50:13 UTC (rev 6295) @@ -18,6 +18,7 @@ import org.globus.cog.abstraction.impl.common.task.InvalidProviderException; import org.globus.cog.abstraction.impl.common.task.ServiceContactImpl; import org.globus.cog.abstraction.impl.common.task.ServiceImpl; +import org.globus.cog.abstraction.interfaces.ExecutionService; import org.globus.cog.abstraction.interfaces.Service; import org.globus.cog.abstraction.interfaces.ServiceContact; import org.globus.cog.karajan.analyzer.ArgRef; @@ -162,35 +163,39 @@ String provider = attr(n, "provider"); String url = attr(n, "url", null); String jobManager = attr(n, "jobManager", null); + + ExecutionService s = new ExecutionServiceImpl(); + s.setProvider(provider); ServiceContact contact = null; if (url != null) { contact = new ServiceContactImpl(url); + s.setServiceContact(contact); + s.setSecurityContext(AbstractionFactory.newSecurityContext(provider, contact)); } - else if (provider.equals("local")) { - contact = new ServiceContactImpl("localhost"); + + if (jobManager != null) { + s.setJobManager(jobManager); } - else { - throw new IllegalArgumentException("Missing URL"); - } - return new ExecutionServiceImpl(provider, contact, - AbstractionFactory.newSecurityContext(provider, contact), jobManager); + + return s; } private Service filesystem(Node n) throws InvalidProviderException, ProviderMethodException { String provider = attr(n, "provider"); String url = attr(n, "url", null); + + Service s = new ServiceImpl(); + s.setType(Service.FILE_OPERATION); + s.setProvider(provider); + ServiceContact contact = null; if (url != null) { contact = new ServiceContactImpl(url); + s.setServiceContact(contact); + s.setSecurityContext(AbstractionFactory.newSecurityContext(provider, contact)); } - else if (provider.equals("local")) { - contact = new ServiceContactImpl("localhost"); - } - else { - throw new IllegalArgumentException("Missing URL"); - } - return new ServiceImpl(provider, Service.FILE_OPERATION, - contact, AbstractionFactory.newSecurityContext(provider, contact)); + + return s; } private void env(BoundContact bc, Node n) { From ketan at ci.uchicago.edu Tue Feb 19 21:04:04 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Tue, 19 Feb 2013 21:04:04 -0600 (CST) Subject: [Swift-commit] r6296 - in trunk/docs: cookbook siteguide userguide utils Message-ID: <20130220030404.EA1BF9CC9A@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-19 21:04:04 -0600 (Tue, 19 Feb 2013) New Revision: 6296 Modified: trunk/docs/cookbook/log_processing trunk/docs/siteguide/futuregrid trunk/docs/siteguide/intrepid trunk/docs/siteguide/prereqs trunk/docs/userguide/log-processing trunk/docs/utils/gensites.txt Log: improvements Modified: trunk/docs/cookbook/log_processing =================================================================== --- trunk/docs/cookbook/log_processing 2013-02-19 19:50:13 UTC (rev 6295) +++ trunk/docs/cookbook/log_processing 2013-02-20 03:04:04 UTC (rev 6296) @@ -84,7 +84,7 @@ Problem Reporting ~~~~~~~~~~~~~~~~~ -When reporting problems to swift-user at ci.uchicago.edu, please attach the +When reporting problems to swift-user at ci.uchicago.edu, attach the following files and information: . tc.data and sites.xml (or whatever you named these files) Modified: trunk/docs/siteguide/futuregrid =================================================================== --- trunk/docs/siteguide/futuregrid 2013-02-19 19:50:13 UTC (rev 6295) +++ trunk/docs/siteguide/futuregrid 2013-02-20 03:04:04 UTC (rev 6296) @@ -111,8 +111,8 @@ $ swift -sites.file sites.xml -tc.file tc.data -config cf ----- -If you would like to create a custom tc file for repeated use, rename it to something other -than tc.data to prevent it from being overwritten. The sites.xml however will need to be +If you like to create a custom tc and/or cf file for repeated use, rename it to something other +than tc.data/cf to prevent it from being overwritten. The sites.xml however will need to be regenerated every time you start the coaster service. If you need to repeatedly modify some sites.xml options, you may edit the template in Swift's etc/sites/persistent-coasters. You may also create your own custom tc files with the hostname of persistent-coasters. More @@ -132,6 +132,6 @@ More Help ~~~~~~~~~ The best place for additional help is the Swift user mailing list. You can subscribe to this list at -http://mail.ci.uchicago.edu/mailman/listinfo/swift-user. When submitting information, please send +http://mail.ci.uchicago.edu/mailman/listinfo/swift-user. When submitting information, send your sites.xml file, your tc.data, and any error messages you run into. Modified: trunk/docs/siteguide/intrepid =================================================================== --- trunk/docs/siteguide/intrepid 2013-02-19 19:50:13 UTC (rev 6295) +++ trunk/docs/siteguide/intrepid 2013-02-20 03:04:04 UTC (rev 6296) @@ -165,7 +165,10 @@ Catsn.swift ~~~~~~~~~~~ -The swift script we will run is called catsn.swift. It simply cats a file and saves the result. This is a nice simple test to ensure jobs are running correctly. Create a file called data.txt which contains some simple input - a "hello world" will do the trick. +The swift script we will run is called catsn.swift. It simply cats a file and +saves the result. This is a nice simple test to ensure jobs are running +correctly. Create a file called data.txt which contains some simple input - a +"hello world" will do the trick. ----- include::../../examples/misc/catsn.swift[] @@ -179,13 +182,17 @@ swift -sites.file sites.xml -tc.file tc.data catsn.swift -n=10 ----- -You should see several new files being created, called catsn.0001.out, catsn.0002.out, etc. Each of these -files should contain the contents of what you placed into data.txt. If this happens, your job has run -successfully on PADS! +You should see several new files being created, called catsn.0001.out, +catsn.0002.out, etc. Each of these files should contain the contents of what +you placed into data.txt. If this happens, your job has run successfully on +PADS! More Help ~~~~~~~~~ -The best place for additional help is the Swift user mailing list. You can subscribe to this list at -https://lists.ci.uchicago.edu/cgi-bin/mailman/listinfo/swift-user. When submitting information, please send your sites.xml file, your tc.data, and any Swift log files that were created during your attempt. +The best place for additional help is the Swift user mailing list. You can +subscribe to this list at +https://lists.ci.uchicago.edu/cgi-bin/mailman/listinfo/swift-user. When +submitting information, send your sites.xml file, your tc.data, and any Swift +log files that were created during your attempt. Modified: trunk/docs/siteguide/prereqs =================================================================== --- trunk/docs/siteguide/prereqs 2013-02-19 19:50:13 UTC (rev 6295) +++ trunk/docs/siteguide/prereqs 2013-02-20 03:04:04 UTC (rev 6296) @@ -4,5 +4,5 @@ This guide assumes that you have already downloaded and installed Swift. It assumes that Swift is in your PATH and that you have a working version of Sun Java 1.5+. For more information on downloading and -installing Swift, please see the +installing Swift, see the http://www.ci.uchicago.edu/swift/guides/release-0.93/quickstart/quickstart.html[Swift Quickstart Guide]. Modified: trunk/docs/userguide/log-processing =================================================================== --- trunk/docs/userguide/log-processing 2013-02-19 19:50:13 UTC (rev 6295) +++ trunk/docs/userguide/log-processing 2013-02-20 03:04:04 UTC (rev 6296) @@ -112,18 +112,20 @@ the "-resume" option. The .rlog file is only for Swift's internal purpose and not to be interpreted by the user. -Each line in the log file is typically made up of three parts. The first part +Each line in the log file typically consists of three parts. The first part is the timestamp, the second is the type of log message and the third is the message itself. The types of log messages follows the java log4j standard types of TRACE, DEBUG, INFO, WARN, ERROR and FATAL. This section lists the various Swift log messages and explains the meaning and likely interpretation of those -messages. Please note that the list is not comprehensive at this time. Also +messages. Note that the list is not comprehensive at this time. Also note that we will ignore the timestamps here. . _DEBUG Loader arguments: [-sites.file, sites.xml, -config, cf, -tc.file, tc, postproc-gridftp.swift]_ + Swift commandline arguments . _DEBUG Loader Max heap: 5592449024_ + The java runtime heap size . _DEBUG textfiles BEGIN_ -. _DEBUG Loader kmlversion is_ + A dump of config and source files associated with this run . _DEBUG VDL2ExecutionContext Stack dump_ . _INFO SetFieldValue Set_ . _INFO get__site STARTCOMPOUND thread=0-8 name=get__site_ Modified: trunk/docs/utils/gensites.txt =================================================================== --- trunk/docs/utils/gensites.txt 2013-02-19 19:50:13 UTC (rev 6295) +++ trunk/docs/utils/gensites.txt 2013-02-20 03:04:04 UTC (rev 6296) @@ -142,7 +142,7 @@ WARNING: Running gensites with #app definitions will replace any file called tc.data in your current directory. If a file called tc.data exists, it will be renamed to tc.data.old. If you run gensites twice, the original -contents of your tc.data will be lost. Please either rename your tc file +contents of your tc.data will be lost. Either rename your tc file or copy to a different location. Running Swift With the New Configuration From ketan at ci.uchicago.edu Wed Feb 20 11:28:17 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Wed, 20 Feb 2013 11:28:17 -0600 (CST) Subject: [Swift-commit] r6297 - in trunk/docs: merged/userguide userguide Message-ID: <20130220172817.B3DF99CC8F@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-20 11:28:17 -0600 (Wed, 20 Feb 2013) New Revision: 6297 Modified: trunk/docs/merged/userguide/coasters trunk/docs/userguide/app_procedures Log: adding toString and camelcase to functions Modified: trunk/docs/merged/userguide/coasters =================================================================== --- trunk/docs/merged/userguide/coasters 2013-02-20 03:04:04 UTC (rev 6296) +++ trunk/docs/merged/userguide/coasters 2013-02-20 17:28:17 UTC (rev 6297) @@ -145,8 +145,8 @@ |jobThrottle |the number of concurrent jobs allowed on a site |============================================================================================== -For Advanced Users -~~~~~~~~~~~~~~~~~~ +Advanced User-Guide +~~~~~~~~~~~~~~~~~~~ //Coasters for advanced users. Getting your hands dirty. @@ -158,29 +158,9 @@ Coasters configurations ~~~~~~~~~~~~~~~~~~~~~~~ -// -//Manual -//^^^^^^^ -//Todo -// -//Passive -//^^^^^^^^ -//Todo -// -//Persistent -//^^^^^^^^^^^ -//Todo -// -//Summary of Differences Between different Coaster types -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -//A tabular representations of highlights of different coaster setups -// -// -//Data Management -// -Coaster providers: local, ssh, pbs -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Coaster providers +~~~~~~~~~~~~~~~~~ Settings and examples for different coaster providers mechanisms. Modified: trunk/docs/userguide/app_procedures =================================================================== --- trunk/docs/userguide/app_procedures 2013-02-20 03:04:04 UTC (rev 6296) +++ trunk/docs/userguide/app_procedures 2013-02-20 17:28:17 UTC (rev 6297) @@ -292,9 +292,9 @@ Swift trace: hello ---- - at extractint + at extractInt ~~~~~~~~~~~ - at extractint(file) will read the specified file, parse an integer from + at extractInt(file) will read the specified file, parse an integer from the file contents and return that integer. @@ -406,18 +406,24 @@ parallel). - at toint + at toInt ~~~~~~ - at toint(input) will parse its input string into an integer. This can be + at toInt(input) will parse its input string into an integer. This can be used with @arg to pass input parameters to a Swift script as integers. - at tofloat -~~~~~~ - at tofloat(input) will parse its input string into a floating point number. This can be + at toFloat +~~~~~~~~ + at toFloat(input) will parse its input string into a floating point number. This can be used with @arg to pass input parameters to a Swift script as floating point numbers. + at toString +~~~~~~~~ + at toString(input) will parse its input into a string. This can be +used with @arg to pass input parameters to a Swift script as +strings. + @length ~~~~~~ @length(array) will return the length of an array in Swift. This function will wait for all elements in the array to be written before returning the length. From davidk at ci.uchicago.edu Wed Feb 20 12:37:33 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Wed, 20 Feb 2013 12:37:33 -0600 (CST) Subject: [Swift-commit] r6298 - SwiftApps/modis/conf Message-ID: <20130220183733.3968A9CC9A@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-20 12:37:33 -0600 (Wed, 20 Feb 2013) New Revision: 6298 Added: SwiftApps/modis/conf/raven.cf Log: Raven config Added: SwiftApps/modis/conf/raven.cf =================================================================== --- SwiftApps/modis/conf/raven.cf (rev 0) +++ SwiftApps/modis/conf/raven.cf 2013-02-20 18:37:33 UTC (rev 6298) @@ -0,0 +1,15 @@ +wrapperlog.always.transfer=true +sitedir.keep=true +execution.retries=0 +status.mode=provider +use.provider.staging=false +provider.staging.pin.swiftfiles=false + +#site raven PROJECT=CI-SES000031 + +#app getlanduse=$PWD/../bin/getlanduse.sh +#app analyzelanduse=$PWD/../bin/analyzelanduse.sh +#app colormodis=$PWD/../bin/colormodis.sh +#app assemble=$PWD/../bin/assemble2.sh +#app markmap=$PWD/../bin/markmap.sh +#app echo=/bin/echo From davidk at ci.uchicago.edu Wed Feb 20 12:39:21 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Wed, 20 Feb 2013 12:39:21 -0600 (CST) Subject: [Swift-commit] r6299 - branches/release-0.94/etc/sites Message-ID: <20130220183921.F26AA9CC9A@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-20 12:39:21 -0600 (Wed, 20 Feb 2013) New Revision: 6299 Added: branches/release-0.94/etc/sites/raven Log: Raven template Added: branches/release-0.94/etc/sites/raven =================================================================== --- branches/release-0.94/etc/sites/raven (rev 0) +++ branches/release-0.94/etc/sites/raven 2013-02-20 18:39:21 UTC (rev 6299) @@ -0,0 +1,16 @@ + + + + _PROJECT_ + 24 + pbs.aprun;pbs.mpp;depth=24 + 13800 + 03:00:00 + 50 + 4 + 4 + 60.99 + 10000 + + /lus/scratch/{env.USER}/swiftwork + From ketan at ci.uchicago.edu Thu Feb 21 10:47:51 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Thu, 21 Feb 2013 10:47:51 -0600 (CST) Subject: [Swift-commit] r6300 - trunk/docs/siteguide Message-ID: <20130221164752.016C39CD2E@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-21 10:47:51 -0600 (Thu, 21 Feb 2013) New Revision: 6300 Added: trunk/docs/siteguide/stampede Modified: trunk/docs/siteguide/beagle trunk/docs/siteguide/siteguide.txt Log: siteguide for stampede Modified: trunk/docs/siteguide/beagle =================================================================== --- trunk/docs/siteguide/beagle 2013-02-20 18:39:21 UTC (rev 6299) +++ trunk/docs/siteguide/beagle 2013-02-21 16:47:51 UTC (rev 6300) @@ -129,9 +129,6 @@ Final status: time: Sun, 18 Dec 2011 02:46:43 +0000 Finished successfully:1 ---- -Note: Running from sandbox node or requesting 30 minutes walltime for upto 3 nodes -will get fast prioritized execution. Suitable for small tests. - Larger Runs on Beagle ~~~~~~~~~~~~~~~~~~~~~ A key factor in scaling up Swift runs on Beagle is to setup the sites.xml parameters. Modified: trunk/docs/siteguide/siteguide.txt =================================================================== --- trunk/docs/siteguide/siteguide.txt 2013-02-20 18:39:21 UTC (rev 6299) +++ trunk/docs/siteguide/siteguide.txt 2013-02-21 16:47:51 UTC (rev 6300) @@ -23,3 +23,5 @@ include::mcs[] include::uc3[] + +include::stampede[] Added: trunk/docs/siteguide/stampede =================================================================== --- trunk/docs/siteguide/stampede (rev 0) +++ trunk/docs/siteguide/stampede 2013-02-21 16:47:51 UTC (rev 6300) @@ -0,0 +1,155 @@ +Stampede +--------- + +Stampede is a 10 petaflop supercomputer available as part of XSEDE resources. It employs a batch-oriented +computational model where-in a SLURM schedular accepts user's jobs and queues +them in the queueing system for execution. The computational model requires +a user to prepare the submit files, track job submissions, chackpointing, +managing input/output data and handling exceptional conditions manually. + +Running Swift under Stampede can accomplish the above tasks with least manual +user intervention. In the following sections, we discuss more about specifics of +running Swift on Stampede. A more detailed information about Swift and its +workings can be found on Swift documentation page here: +http://www.ci.uchicago.edu/swift/wwwdev/docs/index.php +More information on Stampede can be found on XSEDE Stampede website here: +https://www.xsede.org/stampede + +Requesting Access +~~~~~~~~~~~~~~~~~ +Initial access to XSEDE resources could be obtained by submitting a startup proposal. Advanced users could submit a proposal for research allocation. An educational allocation is available for teaching and/or training purposes. More on XSEDE allocations can be found here: +https://www.xsede.org/allocations + +Connecting to a login node +~~~~~~~~~~~~~~~~~~~~~~~~~~ +Once you have an account, you should be able to access a Stampede login +node with the following command: + +----- +ssh yourusername at stampede.tacc.utexas.edu +----- + +Follow the steps outlined below to get started with Swift on Stampede: + +*step 1.* Install Swift using one of the installation methods documented on Swift home: http://www.ci.uchicago.edu/swift/downloads/index.php, if installing from source, java can be loaded on Stampede using +module load jdk32+ and apache ant could be downloaded from here: http://ant.apache.org + +*step 2.* Create and change to a directory where your Swift related work will +stay. (say, +mkdir swift-work+, followed by, +cd swift-work+) + +*step 3.* To get started with a simple example running the Linux +/bin/cat+ command to read an +input file +data.txt+ and write it to an output file, start with writing a simple Swift source script as follows: + +----- +type file; + +/* App definitio */ +app (file o) cat (file i) +{ + cat @i stdout=@o; +} + +file out[]; +file data<"data.txt">; + +/* App invocation: n times */ +foreach j in [1:@toint(@arg("n","1"))] { + out[j] = cat(data); +} +----- + +Make sure a file named +data.txt+ is available in the current directory where the above Swift source file will be saved. + +*step 4.* The next step is to create a sites file. An example sites file (sites.xml) is shown as follows: + +----- + + + + + + TG-EAR130015 + + 1 + 00:11:00 + 800 + + 100 + 100 + + + development + + + myemail at dept.org + ALL + + + /path/to/workdir + + +----- + +*step 5.* In this step, we will see the config and tc files. The config file (cf) is as follows: + +----- +wrapperlog.always.transfer=true +sitedir.keep=true +execution.retries=0 +lazy.errors=false +status.mode=provider +use.provider.staging=false +provider.staging.pin.swiftfiles=false +use.wrapper.staging=false +----- + +The tc file (tc) is as follows: + +----- +stampede cat /bin/cat null null null +----- + +More about config and tc file options can be found in the Swift userguide here: http://www.ci.uchicago.edu/swift/wwwdev/guides/release-0.93/userguide/userguide.html#_swift_configuration_properties. + +*step 6.* Run the example using following commandline: + +----- +swift -config cf -tc.file tc -sites.file sites.xml catsn.swift -n=1 +----- + +You can further change the value of +-n+ to any arbitrary number to run that +many number of +cat+ in parallel + +*step 7.* Swift will show a status message as "done" after the job has completed its run in the queue. Check the output in the generated +outdir+ directory (+ls outdir+) + +---- +login3$ swift -sites.file sites.stampede.xml -config cf -tc.file tc catsn.swiftSwift trunk swift-r6290 cog-r3609 + +RunID: 20130221-1030-faapk389 +Progress: time: Thu, 21 Feb 2013 10:30:21 -0600 +Progress: time: Thu, 21 Feb 2013 10:30:22 -0600 Submitting:1 +Progress: time: Thu, 21 Feb 2013 10:30:29 -0600 Submitted:1 +Progress: time: Thu, 21 Feb 2013 10:30:51 -0600 Active:1 +Progress: time: Thu, 21 Feb 2013 10:30:54 -0600 Finished successfully:1 +Final status: Thu, 21 Feb 2013 10:30:54 -0600 Finished successfully:1 +---- + +Troubleshooting +~~~~~~~~~~~~~~~ + +In this section we will discuss some of the common issues and remedies while using Swift on Stampede. The origin of these issues can be Swift or Stampede's configuration, state and usage load among other factors. We try to identify maximum known issues and address them here: + +* Command not found: Make sure the +bin+ directory of Swift installation is in +PATH+. + + +* Failed to transfer wrapperlog for job cat-nmobtbkk and/or Job failed with an exit code of 254. Check the element on the sites.xml file. + +----- +/work/your/path/swift.workdir +----- + +It is likely that it is set to a path where the compute nodes can not write or no space available, e.g. your /home directory. The remedy for this error is to set your workdirectory to the path where Swift could write from compute nodes and there is enough space, e.g. /scratch directory. + +* If the jobs are not getting to active state for a long time, check the job status using the slurm squeue command: +---- +$ squeue -u `whoami` +---- From ketan at ci.uchicago.edu Thu Feb 21 11:05:23 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Thu, 21 Feb 2013 11:05:23 -0600 (CST) Subject: [Swift-commit] r6301 - trunk/docs/siteguide Message-ID: <20130221170523.6575C9CD2E@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-21 11:05:23 -0600 (Thu, 21 Feb 2013) New Revision: 6301 Modified: trunk/docs/siteguide/beagle trunk/docs/siteguide/stampede Log: Formatting Modified: trunk/docs/siteguide/beagle =================================================================== --- trunk/docs/siteguide/beagle 2013-02-21 16:47:51 UTC (rev 6300) +++ trunk/docs/siteguide/beagle 2013-02-21 17:05:23 UTC (rev 6301) @@ -107,7 +107,8 @@ pbs cat /bin/cat null null null ----- -More about config and tc file options can be found in the swift userguide here: http://www.ci.uchicago.edu/swift/wwwdev/guides/release-0.93/userguide/userguide.html#_swift_configuration_properties. +More about config and tc file options can be found in the swift userguide here: +http://www.ci.uchicago.edu/swift/guides/trunk/userguide/userguide.html#_swift_configuration_properties *step 6.* Run the example using following commandline: Modified: trunk/docs/siteguide/stampede =================================================================== --- trunk/docs/siteguide/stampede 2013-02-21 16:47:51 UTC (rev 6300) +++ trunk/docs/siteguide/stampede 2013-02-21 17:05:23 UTC (rev 6301) @@ -1,17 +1,19 @@ Stampede --------- -Stampede is a 10 petaflop supercomputer available as part of XSEDE resources. It employs a batch-oriented -computational model where-in a SLURM schedular accepts user's jobs and queues -them in the queueing system for execution. The computational model requires -a user to prepare the submit files, track job submissions, chackpointing, -managing input/output data and handling exceptional conditions manually. +Stampede is a 10 petaflop supercomputer available as part of XSEDE resources. +It employs a batch-oriented computational model where-in a SLURM schedular +accepts user's jobs and queues them in the queueing system for execution. The +computational model requires a user to prepare the submit files, track job +submissions, chackpointing, managing input/output data and handling exceptional +conditions manually. Running Swift under Stampede can accomplish the above tasks with least manual user intervention. In the following sections, we discuss more about specifics of running Swift on Stampede. A more detailed information about Swift and its workings can be found on Swift documentation page here: http://www.ci.uchicago.edu/swift/wwwdev/docs/index.php + More information on Stampede can be found on XSEDE Stampede website here: https://www.xsede.org/stampede @@ -31,10 +33,12 @@ Follow the steps outlined below to get started with Swift on Stampede: -*step 1.* Install Swift using one of the installation methods documented on Swift home: http://www.ci.uchicago.edu/swift/downloads/index.php, if installing from source, java can be loaded on Stampede using +module load jdk32+ and apache ant could be downloaded from here: http://ant.apache.org +*step 1.* Install Swift using one of the installation methods documented on Swift home: http://www.ci.uchicago.edu/swift/downloads/index.php, +if installing from source, java can be loaded on Stampede using +module load jdk32+ and apache ant could be downloaded from here: http://ant.apache.org + *step 2.* Create and change to a directory where your Swift related work will -stay. (say, +mkdir swift-work+, followed by, +cd swift-work+) +stay. (say, +mkdir swift-work+, followed by, +cd swift-work+) *step 3.* To get started with a simple example running the Linux +/bin/cat+ command to read an input file +data.txt+ and write it to an output file, start with writing a simple Swift source script as follows: @@ -80,7 +84,7 @@ development - myemail at dept.org + me at dept.org ALL @@ -108,7 +112,8 @@ stampede cat /bin/cat null null null ----- -More about config and tc file options can be found in the Swift userguide here: http://www.ci.uchicago.edu/swift/wwwdev/guides/release-0.93/userguide/userguide.html#_swift_configuration_properties. +More about config and tc file options can be found in the Swift userguide here: +http://www.ci.uchicago.edu/swift/guides/trunk/userguide/userguide.html#_swift_configuration_properties. *step 6.* Run the example using following commandline: @@ -122,7 +127,8 @@ *step 7.* Swift will show a status message as "done" after the job has completed its run in the queue. Check the output in the generated +outdir+ directory (+ls outdir+) ---- -login3$ swift -sites.file sites.stampede.xml -config cf -tc.file tc catsn.swiftSwift trunk swift-r6290 cog-r3609 +login3$ swift -sites.file sites.stampede.xml -config cf -tc.file tc catsn.swift +Swift trunk swift-r6290 cog-r3609 RunID: 20130221-1030-faapk389 Progress: time: Thu, 21 Feb 2013 10:30:21 -0600 @@ -153,3 +159,9 @@ ---- $ squeue -u `whoami` ---- + +The output will give an indication of the status of jobs. See the slurm manual for more information on job management commands: + +---- +$ man slurm +---- From ketan at ci.uchicago.edu Thu Feb 21 12:53:23 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Thu, 21 Feb 2013 12:53:23 -0600 (CST) Subject: [Swift-commit] r6302 - trunk/docs/userguide Message-ID: <20130221185323.BA4189CC8F@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-21 12:53:23 -0600 (Thu, 21 Feb 2013) New Revision: 6302 Modified: trunk/docs/userguide/app_procedures Log: update Modified: trunk/docs/userguide/app_procedures =================================================================== --- trunk/docs/userguide/app_procedures 2013-02-21 17:05:23 UTC (rev 6301) +++ trunk/docs/userguide/app_procedures 2013-02-21 18:53:23 UTC (rev 6302) @@ -539,6 +539,7 @@ Specifiers: +%s+:: Format a string. ++%b+:: Format a boolean. +%i+:: Format a number as an integer. +%f+:: Format a number as a floating point number. +%q+:: Format an array. From ketan at ci.uchicago.edu Thu Feb 21 19:36:09 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Thu, 21 Feb 2013 19:36:09 -0600 (CST) Subject: [Swift-commit] r6303 - trunk/docs/userguide Message-ID: <20130222013609.097D09CC8F@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-21 19:36:08 -0600 (Thu, 21 Feb 2013) New Revision: 6303 Modified: trunk/docs/userguide/configuration_properties trunk/docs/userguide/kickstart trunk/docs/userguide/profiles Log: cleanup and format Modified: trunk/docs/userguide/configuration_properties =================================================================== --- trunk/docs/userguide/configuration_properties 2013-02-21 18:53:23 UTC (rev 6302) +++ trunk/docs/userguide/configuration_properties 2013-02-22 01:36:08 UTC (rev 6303) @@ -416,6 +416,13 @@ directory. In such cases, relative mode must be used. (since Swift 0.9) +use.wrapper.staging + + Valid values: true, false + Default value: false + + Determines if the Swift wrapper should do file staging. + wrapper.parameter.mode Controls how Swift will supply parameters to the remote wrapper Modified: trunk/docs/userguide/kickstart =================================================================== --- trunk/docs/userguide/kickstart 2013-02-21 18:53:23 UTC (rev 6302) +++ trunk/docs/userguide/kickstart 2013-02-22 01:36:08 UTC (rev 6303) @@ -27,5 +27,5 @@ ---- -There are various kickstat.* properties, which have sensible default +There are various kickstart.* properties, which have sensible default values. These are documented in the properties section. Modified: trunk/docs/userguide/profiles =================================================================== --- trunk/docs/userguide/profiles 2013-02-21 18:53:23 UTC (rev 6302) +++ trunk/docs/userguide/profiles 2013-02-22 01:36:08 UTC (rev 6303) @@ -39,35 +39,47 @@ swift namespace ~~~~~~~~~~~~~~~ -storagesize limits the amount of space that will be used on the remote -site for temporary files. When more than that amount of space is used, -the remote temporary file cache will be cleared using the algorithm -specified in the caching.algorithm property. -wrapperInterpreter - The wrapper interpreter indicates the command -(executable) to be used to run the Swift wrapper script. The default is -"/bin/bash" on Unix sites and "cscript.exe" on Windows sites. +storagesize -wrapperInterpreterOptions - Allows specifying additional options to the -executable used to run the Swift wrapper. The defaults are no options on -Unix sites and "Nologo" on Windows sites. + limits the amount of space that will be used on the remote site for temporary + files. When more than that amount of space is used, the remote temporary file + cache will be cleared using the algorithm specified in the caching.algorithm + property. -wrapperScript - Specifies the name of the wrapper script to be used on a -site. The defaults are "_swiftwrap" on Unix sites and "_swiftwrap.vbs" -on Windows sites. If you specify a custom wrapper script, it must be -present in the "libexec" directory of the Swift installation. +wrapperInterpreter -cleanupCommand Indicates the command to be run at the end of a Swift -run to clean up the run directories on a remote site. Defaults are -"/bin/rm" on Unix sites and "cmd.exe" on Windows sites + The wrapper interpreter indicates the command (executable) to be used to run + the Swift wrapper script. The default is "/bin/bash" on Unix sites and + "cscript.exe" on Windows sites. -cleanupCommandOptions Specifies the options to be passed to the -cleanup command above. The options are passed in the argument list to -the cleanup command. After the options, the last argument is the -directory to be deleted. The default on Unix sites is "-rf". The default -on Windows sites is ["/C", "del", "/Q"]. +wrapperInterpreterOptions + Allows specifying additional options to the executable used to run the Swift + wrapper. The defaults are no options on Unix sites and "Nologo" on Windows + sites. +wrapperScript + + Specifies the name of the wrapper script to be used on a site. The defaults are + "_swiftwrap" on Unix sites and "_swiftwrap.vbs" on Windows sites. If you + specify a custom wrapper script, it must be present in the "libexec" directory + of the Swift installation. + +cleanupCommand + + Indicates the command to be run at the end of a Swift run to clean up the run + directories on a remote site. Defaults are "/bin/rm" on Unix sites and + "cmd.exe" on Windows sites + +cleanupCommandOptions + + Specifies the options to be passed to the cleanup command above. The options + are passed in the argument list to the cleanup command. After the options, the + last argument is the directory to be deleted. The default on Unix sites is + "-rf". The default on Windows sites is ["/C", "del", "/Q"]. + + Globus namespace ~~~~~~~~~~~~~~~~ maxwalltime specifies a walltime limit for each job, in minutes. @@ -80,29 +92,28 @@ Example: ---- -localhost echo /bin/echo INSTALLED INTEL32::LINUX GLOBUS::maxwalltime="00:20:00" +localhost echo /bin/echo INSTALLED INTEL32::LINUX GLOBUS::maxwalltime="00:20:00" ---- -When replication is enabled (see replication), then -walltime will also be enforced at the Swift client side: when a job has -been active for more than twice the maxwalltime, Swift will kill the job -and regard it as failed. +When replication is enabled (see replication), then walltime will also be +enforced at the Swift client side: when a job has been active for more than +twice the maxwalltime, Swift will kill the job and regard it as failed. -When clustering is used, maxwalltime will be used to select which jobs -will be clustered together. More information on this is available in the -clustering section. +When clustering is used, maxwalltime will be used to select which jobs will be +clustered together. More information on this is available in the clustering +section. -When coasters as used, maxwalltime influences the default coaster -worker maxwalltime, and which jobs will be sent to which workers. More -information on this is available in the coasters section. +When coasters as used, maxwalltime influences the default coaster worker +maxwalltime, and which jobs will be sent to which workers. More information on +this is available in the coasters section. -queue is used by the PBS, GRAM2 and GRAM4 providers. This profile -entry specifies which queue jobs will be submitted to. The valid queue -names are site-specific. +queue is used by the PBS, GRAM2 and GRAM4 providers. This profile entry +specifies which queue jobs will be submitted to. The valid queue names are +site-specific. -host_types specifies the types of host that are permissible for a job -to run on. The valid values are site-specific. This profile entry is -used by the GRAM2 and GRAM4 providers. +host_types specifies the types of host that are permissible for a job to run +on. The valid values are site-specific. This profile entry is used by the GRAM2 +and GRAM4 providers. condor_requirements allows a requirements string to be specified when Condor is used as an LRM behind GRAM2. Example: @@ -111,113 +122,144 @@ Arch == "X86_64" || Arch="INTEL" ---- -slots When using coasters, this parameter specifies the -maximum number of jobs/blocks that the coaster scheduler will have -running at any given time. The default is 20. +slots -jobsPerNode - This parameter determines how many coaster workers are -started one each compute node. The default value is 1. + When using coasters, this parameter specifies the maximum number of jobs/blocks + that the coaster scheduler will have running at any given time. The default is + 20. -nodeGranularity - When allocating a coaster worker block, this parameter -restricts the number of nodes in a block to a multiple of this value. -The total number of workers will then be a multiple of workersPerNode * -nodeGranularity. The default value is 1. +jobsPerNode -allocationStepSize - Each time the coaster block scheduler computes a -schedule, it will attempt to allocate a number of slots from the number -of available slots (limited using the above slots profile). This -parameter specifies the maximum fraction of slots that are allocated in -one schedule. Default is 0.1. + This parameter determines how many coaster workers are started one each compute + node. The default value is 1. -lowOverallocation - Overallocation is a function of the walltime of a -job which determines how long (time-wise) a worker job will be. For -example, if a number of 10s jobs are submitted to the coaster service, -and the overallocation for 10s jobs is 10, the coaster scheduler will -attempt to start worker jobs that have a walltime of 100s. The -overallocation is controlled by manipulating the end-points of an -overallocation function. The low endpoint, specified by this parameter, -is the overallocation for a 1s job. The high endpoint is the -overallocation for a (theoretical) job of infinite length. The -overallocation for job sizes in the [1s, +inf) interval is determined -using an exponential decay function: overallocation(walltime) = walltime -* (lowOverallocation - highOverallocation) * exp(-walltime * -overallocationDecayFactor) + highOverallocation The default value of -lowOverallocation is 10. +nodeGranularity -highOverallocation - The high overallocation endpoint (as described -above). Default: 1 + When allocating a coaster worker block, this parameter restricts the number of + nodes in a block to a multiple of this value. The total number of workers will + then be a multiple of workersPerNode * nodeGranularity. The default value is 1. -overallocationDecayFactor - The decay factor for the overallocation -curve. Default 0.001 (1e-3). +allocationStepSize -spread - When a large number of jobs is submitted to the a coaster -service, the work is divided into blocks. This parameter allows a rough -control of the relative sizes of those blocks. A value of 0 indicates -that all work should be divided equally between the blocks (and blocks -will therefore have equal sizes). A value of 1 indicates the largest -possible spread. The existence of the spread parameter is based on the -assumption that smaller overall jobs will generally spend less time in -the queue than larger jobs. By submitting blocks of different sizes, -submitted jobs may be finished quicker by smaller blocks. Default: 0.9. + Each time the coaster block scheduler computes a schedule, it will attempt to + allocate a number of slots from the number of available slots (limited using + the above slots profile). This parameter specifies the maximum fraction of + slots that are allocated in one schedule. Default is 0.1. -reserve - Reserve time is a time in the allocation of a worker that sits -at the end of the worker time and is useable only for critical -operations. For example, a job will not be submitted to a worker if it -overlaps its reserve time, but a job that (due to inaccurate walltime -specification) runs into the reserve time will not be killed (note that -once the worker exceeds its walltime, the queuing system will kill the -job anyway). Default 10 (s). +lowOverallocation -maxnodes - Determines the maximum number of nodes that can be allocated -in one coaster block. Default: unlimited. + Overallocation is a function of the walltime of a job which determines how + long (time-wise) a worker job will be. For example, if a number of 10s jobs + are submitted to the coaster service, and the overallocation for 10s jobs + is 10, the coaster scheduler will attempt to start worker jobs that have a + walltime of 100s. The overallocation is controlled by manipulating the + end-points of an overallocation function. The low endpoint, specified by + this parameter, is the overallocation for a 1s job. The high endpoint is + the overallocation for a (theoretical) job of infinite length. The + overallocation for job sizes in the [1s, +inf) interval is determined using + an exponential decay function: + + overallocation(walltime) = walltime * (lowOverallocation - + highOverallocation) * exp(-walltime * overallocationDecayFactor) + + highOverallocation -maxtime - Indicates the maximum walltime, in seconds, that a coaster -block can have. -Default: unlimited. + The default value of lowOverallocation is 10. -remoteMonitorEnabled - If set to "true", the client side will get a -Swing window showing, graphically, the state of the coaster scheduler -(blocks, jobs, etc.). Default: false +highOverallocation -internalhostname - If the head node has multiple network interfaces, -only one of which is visible from the worker nodes. The choice of -which interface is the one that worker nodes can connect to is a -matter of the particular cluster. This must be set in the your -sites file to clarify to the workers which exact interface on the -head node they are to try to connect to. + The high overallocation endpoint (as described above). Default: 1 +overallocationDecayFactor + + The decay factor for the overallocation curve. Default 0.001 (1e-3). + +spread + + When a large number of jobs is submitted to coaster service, the work is + divided into blocks. This parameter allows a rough control of the relative + sizes of those blocks. A value of 0 indicates that all work should be divided + equally between the blocks (and blocks will therefore have equal sizes). A + value of 1 indicates the largest possible spread. The existence of the spread + parameter is based on the assumption that smaller overall jobs will generally + spend less time in the queue than larger jobs. By submitting blocks of + different sizes, submitted jobs may be finished quicker by smaller blocks. + Default: 0.9. + +reserve + + Reserve time is a time in the allocation of a worker that sits + at the end of the worker time and is useable only for critical + operations. For example, a job will not be submitted to a worker if it + overlaps its reserve time, but a job that (due to inaccurate walltime + specification) runs into the reserve time will not be killed (note that + once the worker exceeds its walltime, the queuing system will kill the + job anyway). Default 10 (s). + +maxnodes + + Determines the maximum number of nodes that can be allocated + in one coaster block. Default: unlimited. + +maxtime + + Indicates the maximum walltime, in seconds, that a coaster + block can have. + Default: unlimited. + +remoteMonitorEnabled + + If set to "true", the client side will get a Swing window showing, graphically, + the state of the coaster scheduler (blocks, jobs, etc.). Default: false + +internalhostname + + If the head node has multiple network interfaces, + only one of which is visible from the worker nodes. The choice of + which interface is the one that worker nodes can connect to is a + matter of the particular cluster. This must be set in the your + sites file to clarify to the workers which exact interface on the + head node they are to try to connect to. + env namespace ~~~~~~~~~~~~~ + Profile keys set in the env namespace will be set in the unix environment of the executed job. Some environment variables influence the worker-side behaviour of Swift: -PATHPREFIX - set in env namespace profiles. This path is prefixed onto -the start of the PATH when jobs are executed. It can be more useful -than setting the PATH environment variable directly, because setting -PATH will cause the execution site's default path to be lost. +PATHPREFIX -SWIFT_JOBDIR_PATH - set in env namespace profiles. If set, then Swift -will use the path specified here as a worker-node local temporary -directory to copy input files to before running a job. If unset, Swift -will keep input files on the site-shared filesystem. In some cases, -copying to a worker-node local directory can be much faster than having -applications access the site-shared filesystem directly. + set in env namespace profiles. This path is prefixed onto the start of the + PATH when jobs are executed. It can be more useful than setting the PATH + environment variable directly, because setting PATH will cause the + execution site's default path to be lost. -SWIFT_EXTRA_INFO - set in env namespace profiles. If set, then Swift -will execute the command specified in SWIFT_EXTRA_INFO on execution -sites immediately before each application execution, and will record the -stdout of that command in the wrapper info log file for that job. This -is intended to allow software version and other arbitrary information -about the remote site to be gathered and returned to the submit side. -(since Swift 0.9) +SWIFT_JOBDIR_PATH -SWIFT_GEN_SCRIPTS - set in the env namespace profiles. This variable -just needs to be set, it doesn't matter what it is set to. If set, then Swift -will keep the script that was used to execute the job in the job directory. -The script will be called run.sh and will have the command line that Swift -tried to execute with. + set in env namespace profiles. If set, then Swift will use the path + specified here as a worker-node local temporary directory to copy input + files to before running a job. If unset, Swift will keep input files on the + site-shared filesystem. In some cases, copying to a worker-node local + directory can be much faster than having applications access the + site-shared filesystem directly. +SWIFT_EXTRA_INFO + + set in env namespace profiles. If set, then Swift will execute the command + specified in SWIFT_EXTRA_INFO on execution sites immediately before each + application execution, and will record the stdout of that command in the + wrapper info log file for that job. This is intended to allow software + version and other arbitrary information about the remote site to be + gathered and returned to the submit side. (since Swift 0.9) + +SWIFT_GEN_SCRIPTS + + set in the env namespace profiles. This variable just needs to be set, it + doesn't matter what it is set to. If set, then Swift will keep the script + that was used to execute the job in the job directory. The script will be + called run.sh and will have the command line that Swift tried to execute + with. + === Dynamic profiles To set a profile setting based on the value of a Swift variable, you From davidk at ci.uchicago.edu Fri Feb 22 11:49:53 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Fri, 22 Feb 2013 11:49:53 -0600 (CST) Subject: [Swift-commit] r6304 - branches/release-0.94/tests/stress/persistent-coasters/mcs/10x10 Message-ID: <20130222174953.5DE369CC8F@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-22 11:49:53 -0600 (Fri, 22 Feb 2013) New Revision: 6304 Modified: branches/release-0.94/tests/stress/persistent-coasters/mcs/10x10/coaster-service.conf Log: Some fixes for updated gensites Modified: branches/release-0.94/tests/stress/persistent-coasters/mcs/10x10/coaster-service.conf =================================================================== --- branches/release-0.94/tests/stress/persistent-coasters/mcs/10x10/coaster-service.conf 2013-02-22 01:36:08 UTC (rev 6303) +++ branches/release-0.94/tests/stress/persistent-coasters/mcs/10x10/coaster-service.conf 2013-02-22 17:49:53 UTC (rev 6304) @@ -5,7 +5,7 @@ export SWIFT= # Where to place/launch worker.pl on the remote machine -export WORKER_WORK=/nfs/proj-davidk/swiftwork +export WORKER_LOCATION=/home/$USER # How to launch workers: local, ssh, futuregrid, or cobalt export WORKER_MODE=ssh @@ -37,7 +37,9 @@ # export WORKER_RELAY_HOST="login.mcs.anl.gov" export WORKER_LOGGING_LEVEL=DEBUG -export WORKER_LOG_DIR="/nfs/proj-davidk/logs" +export WORKER_LOG_DIR="/home/$USER/logs" +export JOBSPERNODE="4" +export JOBTHROTTLE=100 # Set applications here #app cat=/bin/cat From davidk at ci.uchicago.edu Fri Feb 22 12:42:07 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Fri, 22 Feb 2013 12:42:07 -0600 (CST) Subject: [Swift-commit] r6305 - in branches/release-0.94/tests/stress/persistent-coasters/mcs: 10x10 500x10 Message-ID: <20130222184207.D7B469CC8F@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-22 12:42:07 -0600 (Fri, 22 Feb 2013) New Revision: 6305 Modified: branches/release-0.94/tests/stress/persistent-coasters/mcs/10x10/coaster-service.conf branches/release-0.94/tests/stress/persistent-coasters/mcs/500x10/coaster-service.conf Log: Some updates to the configs Modified: branches/release-0.94/tests/stress/persistent-coasters/mcs/10x10/coaster-service.conf =================================================================== --- branches/release-0.94/tests/stress/persistent-coasters/mcs/10x10/coaster-service.conf 2013-02-22 17:49:53 UTC (rev 6304) +++ branches/release-0.94/tests/stress/persistent-coasters/mcs/10x10/coaster-service.conf 2013-02-22 18:42:07 UTC (rev 6305) @@ -28,7 +28,7 @@ export IPADDR= # Gensites values -export WORK=$HOME/work +export WORK=/sandbox/$USER # If SHARED_FILESYSTEM is set to no, provider staging will be turned on export SHARED_FILESYSTEM=no Modified: branches/release-0.94/tests/stress/persistent-coasters/mcs/500x10/coaster-service.conf =================================================================== --- branches/release-0.94/tests/stress/persistent-coasters/mcs/500x10/coaster-service.conf 2013-02-22 17:49:53 UTC (rev 6304) +++ branches/release-0.94/tests/stress/persistent-coasters/mcs/500x10/coaster-service.conf 2013-02-22 18:42:07 UTC (rev 6305) @@ -5,7 +5,7 @@ export SWIFT= # Where to place/launch worker.pl on the remote machine -export WORKER_WORK=/nfs/proj-davidk/swiftwork +export WORKER_LOCATION=/home/$USER # How to launch workers: local, ssh, futuregrid, or cobalt export WORKER_MODE=ssh @@ -28,7 +28,7 @@ export IPADDR= # Gensites values -export WORK=$HOME/work +export WORK=/sandbox/$USER # If SHARED_FILESYSTEM is set to no, provider staging will be turned on export SHARED_FILESYSTEM=no @@ -37,7 +37,9 @@ # export WORKER_RELAY_HOST="login.mcs.anl.gov" export WORKER_LOGGING_LEVEL=DEBUG -export WORKER_LOG_DIR="/nfs/proj-davidk/logs" +export WORKER_LOG_DIR="/home/$USER/logs" +export JOBSPERNODE="4" +export JOBTHROTTLE=100 # Set applications here #app cat=/bin/cat From davidk at ci.uchicago.edu Fri Feb 22 14:08:23 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Fri, 22 Feb 2013 14:08:23 -0600 (CST) Subject: [Swift-commit] r6306 - in www: downloads inc main Message-ID: <20130222200823.D8C299CF84@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-22 14:08:23 -0600 (Fri, 22 Feb 2013) New Revision: 6306 Modified: www/downloads/archive.php www/downloads/index.php www/inc/downloads_sidebar.php www/main/index.php Log: Links to 0.94RC4 Modified: www/downloads/archive.php =================================================================== --- www/downloads/archive.php 2013-02-22 18:42:07 UTC (rev 6305) +++ www/downloads/archive.php 2013-02-22 20:08:23 UTC (rev 6306) @@ -24,11 +24,11 @@

Older releases

 

-

Swift 0.93RC4 - 2011/11

+

Swift 0.93 - 2011/11

Precompiled binary distribution -[swift-0.93RC3.tar.gz] +[swift-0.93.tar.gz]

 

Modified: www/downloads/index.php =================================================================== --- www/downloads/index.php 2013-02-22 18:42:07 UTC (rev 6305) +++ www/downloads/index.php 2013-02-22 20:08:23 UTC (rev 6306) @@ -37,22 +37,22 @@

Latest Release

-

Swift 0.93 - 2012/01/05

+

Swift 0.94RC4 - 2013/02/22

For the majority of users, this is the version you will want to download. This package contains the latest Stable release of Swift. Since Swift is written in Java, this -package will run on all supported platforms with Java Runtime Environment 1.5 or greater. +package will run on all supported platforms with Java Runtime Environment 1.6 or greater.

Precompiled binary distribution -[swift-0.93.tar.gz] +[swift-0.94RC4.tar.gz]

Source Code

The source code for Swift is available to developers who have an interest in contributing -new features. The code is +new features. The code is browsable online, or accessible through Subversion. To download and compile the source code, you will need Apache Ant and Java JDK. @@ -64,11 +64,11 @@

- $ mkdir swift-0.93 - $ cd swift-0.93 - $ svn co https://cogkit.svn.sourceforge.net/svnroot/cogkit/branches/4.1.9/src/cog + $ mkdir swift-0.94 + $ cd swift-0.94 + $ svn co https://cogkit.svn.sourceforge.net/svnroot/cogkit/branches/4.1.10/src/cog $ cd cog/modules - $ svn co https://svn.ci.uchicago.edu/svn/vdl2/branches/release-0.93 swift + $ svn co https://svn.ci.uchicago.edu/svn/vdl2/branches/release-0.94 swift $ cd swift $ ant redist
Modified: www/inc/downloads_sidebar.php =================================================================== --- www/inc/downloads_sidebar.php 2013-02-22 18:42:07 UTC (rev 6305) +++ www/inc/downloads_sidebar.php 2013-02-22 20:08:23 UTC (rev 6306) @@ -1,7 +1,7 @@

Latest Release

- -0.93 current version
2012/01/05 + +0.94RC4 current version
2013/02/22

 

Modified: www/main/index.php =================================================================== --- www/main/index.php 2013-02-22 18:42:07 UTC (rev 6305) +++ www/main/index.php 2013-02-22 20:08:23 UTC (rev 6306) @@ -62,7 +62,7 @@
-
0.93 current version
2012/01/05 +
0.94RC4 current version
2013/02/22
Read our Quick Start Guide and start using Swift today!
From davidk at ci.uchicago.edu Fri Feb 22 16:19:48 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Fri, 22 Feb 2013 16:19:48 -0600 (CST) Subject: [Swift-commit] r6307 - in SwiftApps/modis: . bin tutorial Message-ID: <20130222221948.9A7B69CC8F@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-22 16:19:48 -0600 (Fri, 22 Feb 2013) New Revision: 6307 Removed: SwiftApps/modis/modis.swift Modified: SwiftApps/modis/bin/getlanduse.sh SwiftApps/modis/bin/markmap.sh SwiftApps/modis/tutorial/modis01.swift SwiftApps/modis/tutorial/modis02.swift SwiftApps/modis/tutorial/modis03.swift SwiftApps/modis/tutorial/modis04.swift Log: Simplify things a bit by removing the is_land script. This is not really needed for map generation. If an image exists, it covers land (which is why there aren't more than 317 tiles) Modified: SwiftApps/modis/bin/getlanduse.sh =================================================================== --- SwiftApps/modis/bin/getlanduse.sh 2013-02-22 20:08:23 UTC (rev 6306) +++ SwiftApps/modis/bin/getlanduse.sh 2013-02-22 22:19:48 UTC (rev 6307) @@ -2,4 +2,3 @@ BINDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" $BINDIR/getlanduse.pl $1 | sort -rn -$BINDIR/is_land.pl $1 > $2 Modified: SwiftApps/modis/bin/markmap.sh =================================================================== --- SwiftApps/modis/bin/markmap.sh 2013-02-22 20:08:23 UTC (rev 6306) +++ SwiftApps/modis/bin/markmap.sh 2013-02-22 22:19:48 UTC (rev 6307) @@ -6,8 +6,6 @@ tilefile=$1 outmap=$2 asciimap=$3 -modisdir=$4 -is_land_files=$5 cp $BINDIR/grid.ppm $outmap @@ -19,23 +17,3 @@ mv $outmap.tmp $outmap done -for h in {0..35}; do - h=$( printf %02d $h ); - for v in {0..17}; do - v=$( printf %02d $v ); - hv=h${h}v${v} - #echo hv is $hv >> $asciimap - if [ -f "landuse/$hv.is_land" ]; then - is_land=$( cat landuse/$hv.is_land ) - if [ "$is_land" == 0 ]; then - echo -n "X" >> $asciimap - else - echo -n "_" >> $asciimap - fi - else - echo -n " " >> $asciimap - fi - done - echo "" >> $asciimap -done - Deleted: SwiftApps/modis/modis.swift =================================================================== --- SwiftApps/modis/modis.swift 2013-02-22 20:08:23 UTC (rev 6306) +++ SwiftApps/modis/modis.swift 2013-02-22 22:19:48 UTC (rev 6307) @@ -1,74 +0,0 @@ -type file; -type imagefile; -type landuse; - -app (landuse output) getLandUse (imagefile input, int sortfield, string mpath) -{ - getlanduse @input sortfield mpath stdout=@output; -} - -app (file output, file tilelist) analyzeLandUse (landuse input[], string usetype, int maxnum) -{ - analyzelanduse @output @tilelist usetype maxnum @input; -} - -app (imagefile output, file olog, file elog) colorMODIS (imagefile input) -{ - colormodis @input @output stdout=@olog stderr=@elog; -} - -app (imagefile output, file olog, file elog) assemble (file selected, imagefile image[], string webdir) -{ - assemble @output @selected @filename(image[0]) webdir stdout=@olog stderr=@elog; -} - -app (imagefile grid) markMap (file tilelist) -{ - markmap @tilelist @grid; -} - -# Constants and command line arguments -int nFiles = @toInt(@arg("nfiles")); -int nSelect = @toInt(@arg("nselect")); -string landType = @arg("landtype"); -string MODISdir = @arg("modisdir"); -string webDir = @arg("webdir"); - -# Input Dataset -imagefile geos[] ; - -# Compute the land use summary of each MODIS tile -landuse land[] ; - -foreach g,i in geos { - land[i] = getLandUse(g,1,MODISdir); -} - -# Find the top N tiles (by total area of selected landuse types) -file topSelected <"topselected.txt">; -file selectedTiles <"selectedtiles.txt">; -(topSelected, selectedTiles) = analyzeLandUse(land, landType, nSelect); - -# Mark the top N tiles on a sinusoidal gridded map -imagefile gridMap<"markedGrid.ppm.gz">; -gridMap = markMap(topSelected); - -# Create multi-color images for all tiles -#imagefile colorImage[] ; - -#foreach g, i in geos { -# file outfile ; -# file errfile ; -# // tracef("calling colorimage %s %s\n", @g, @colorImage[i]); -# (colorImage[i], outfile, errfile) = colorMODIS(g); -#} - -# Assemble a montage of the top selected areas -#imagefile montage<"map.png">; # @arg -#file assemble_olog <"logs/assemble.o.log">; -#file assemble_elog <"logs/assemble.e.log">; -#tracef("Calling assemble %s %s %s %s\n", @montage, @selectedTiles, @colorImage[0], webDir); -#(montage, assemble_olog, assemble_elog) = assemble(selectedTiles,colorImage,webDir); - Modified: SwiftApps/modis/tutorial/modis01.swift =================================================================== --- SwiftApps/modis/tutorial/modis01.swift 2013-02-22 20:08:23 UTC (rev 6306) +++ SwiftApps/modis/tutorial/modis01.swift 2013-02-22 22:19:48 UTC (rev 6307) @@ -1,12 +1,11 @@ type imagefile; type landuse; -app (landuse output, landuse is_land) getLandUse (imagefile input) +app (landuse output) getLandUse (imagefile input) { - getlanduse @filename(input) @filename(is_land) stdout=@filename(output); + getlanduse @filename(input) stdout=@filename(output); } imagefile modisImage <"../data/modis/2002/h00v09.rgb">; landuse result <"landuse/h00v09.landuse.byfreq">; -landuse land_result <"landuse/h00v09.is_land">; -(result, land_result) = getLandUse(modisImage); +result = getLandUse(modisImage); Modified: SwiftApps/modis/tutorial/modis02.swift =================================================================== --- SwiftApps/modis/tutorial/modis02.swift 2013-02-22 20:08:23 UTC (rev 6306) +++ SwiftApps/modis/tutorial/modis02.swift 2013-02-22 22:19:48 UTC (rev 6307) @@ -1,9 +1,9 @@ type imagefile; type landuse; -app (landuse output, landuse island) getLandUse (imagefile input) +app (landuse output) getLandUse (imagefile input) { - getlanduse @filename(input) @filename(island) stdout=@filename(output); + getlanduse @filename(input) stdout=@filename(output); } # Constants and command line arguments @@ -15,9 +15,8 @@ # Compute the land use summary of each MODIS tile landuse land[] ; -landuse is_land[] ; foreach g,i in geos { - (land[i], is_land[i]) = getLandUse(g); + land[i] = getLandUse(g); } Modified: SwiftApps/modis/tutorial/modis03.swift =================================================================== --- SwiftApps/modis/tutorial/modis03.swift 2013-02-22 20:08:23 UTC (rev 6306) +++ SwiftApps/modis/tutorial/modis03.swift 2013-02-22 22:19:48 UTC (rev 6307) @@ -2,9 +2,9 @@ type imagefile; type landuse; -app (landuse output, landuse island) getLandUse (imagefile input) +app (landuse output) getLandUse (imagefile input) { - getlanduse @filename(input) @filename(island) stdout=@filename(output); + getlanduse @filename(input) stdout=@filename(output); } app (file output, file tilelist) analyzeLandUse (landuse input[], string usetype, int maxnum) @@ -23,10 +23,9 @@ # Compute the land use summary of each MODIS tile landuse land[] ; -landuse is_land[] ; foreach g,i in geos { - (land[i], is_land[i]) = getLandUse(g); + land[i] = getLandUse(g); } # Find the top N tiles (by total area of selected landuse types) Modified: SwiftApps/modis/tutorial/modis04.swift =================================================================== --- SwiftApps/modis/tutorial/modis04.swift 2013-02-22 20:08:23 UTC (rev 6306) +++ SwiftApps/modis/tutorial/modis04.swift 2013-02-22 22:19:48 UTC (rev 6307) @@ -2,9 +2,9 @@ type imagefile; type landuse; -app (landuse output, landuse island) getLandUse (imagefile input) +app (landuse output) getLandUse (imagefile input) { - getlanduse @filename(input) @filename(island) stdout=@filename(output); + getlanduse @filename(input) stdout=@filename(output); } app (file output, file tilelist) analyzeLandUse (landuse input[], string usetype, int maxnum) @@ -12,9 +12,9 @@ analyzelanduse @output @tilelist usetype maxnum @input; } -app (imagefile grid, file asciimap) markMap (file tilelist, string mdir, landuse island[]) +app (imagefile grid) markMap (file tilelist) { - markmap @tilelist @grid @filename(asciimap) mdir @island; + markmap @tilelist @grid; } # Constants and command line arguments @@ -28,10 +28,9 @@ # Compute the land use summary of each MODIS tile landuse land[] ; -landuse is_land[] ; foreach g,i in geos { - (land[i], is_land[i]) = getLandUse(g); + land[i] = getLandUse(g); } # Find the top N tiles (by total area of selected landuse types) @@ -42,4 +41,4 @@ # Mark the top N tiles on a sinusoidal gridded map imagefile gridMap <"markedGrid.ppm">; file asciiMap <"map.txt">; -(gridMap, asciiMap) = markMap(topSelected, MODISdir, is_land); +gridMap = markMap(topSelected); From davidk at ci.uchicago.edu Sat Feb 23 06:45:14 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Sat, 23 Feb 2013 06:45:14 -0600 (CST) Subject: [Swift-commit] r6308 - in SwiftApps/modis: bin tutorial Message-ID: <20130223124516.D4921178884@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-23 06:44:52 -0600 (Sat, 23 Feb 2013) New Revision: 6308 Added: SwiftApps/modis/bin/rgb_to_png.py Removed: SwiftApps/modis/bin/is_land.pl Modified: SwiftApps/modis/bin/draw_rectangle.pl SwiftApps/modis/bin/markmap.sh SwiftApps/modis/tutorial/modis04.swift Log: Fix draw_rectangle.pl to work with rgb images Added rgb_to_png.py and integrate into modis04 Modified: SwiftApps/modis/bin/draw_rectangle.pl =================================================================== --- SwiftApps/modis/bin/draw_rectangle.pl 2013-02-22 22:19:48 UTC (rev 6307) +++ SwiftApps/modis/bin/draw_rectangle.pl 2013-02-23 12:44:52 UTC (rev 6308) @@ -1,26 +1,18 @@ #!/usr/bin/perl -# Draw a rectangle on a PPM -# Usage: draw_rectangle.pl infile.ppm xmin ymin xmax ymax outfile.ppm +# Draw a rectangle on an RGB file +# Usage: draw_rectangle.pl infile.rgb xmin ymin xmax ymax outfile.rgb -my ($pgm_input_filename, $xmin, $ymin, $xmax, $ymax, $pgm_output_filename) = @ARGV; -open(PGMFILE_INPUT, "$pgm_input_filename") || die "Unable to open $pgm_input_filename!"; -open(PGMFILE_OUTPUT, ">$pgm_output_filename") || die "Unable to create $pgm_output_filename"; +my ($input_filename, $xres, $yres, $xmin, $ymin, $xmax, $ymax, $output_filename) = @ARGV; +open(FILE_INPUT, "$input_filename") || die "Unable to open $input_filename!"; +open(FILE_OUTPUT, ">$output_filename") || die "Unable to create $output_filename"; -# Read header -my $magic = ; -my $resolution = ; -my $maxvalue = ; -(my $xres, my $yres) = split(' ', $resolution); - -# Write new header -print PGMFILE_OUTPUT "$magic" . "$resolution" . "$maxvalue"; - # Read data three bytes at a time (RGB) $/ = \3; my $x=0, $y=0; -while() { +while() { (my $red, my $green, my $blue) = unpack('C3', $_); + #print "$red $green $blue\n"; # Left and right of rectangle, 2 pixels wide if ( $x == $xmin || $x == $xmin+1 || $x == $xmax || $x == $xmax-1 ) { @@ -35,11 +27,11 @@ } } - print PGMFILE_OUTPUT pack('C3', $red, $green, $blue); + print FILE_OUTPUT pack('C3', $red, $green, $blue); if($x == $xres-1) { $x = 0; $y++; } else { $x++; } } -close(PGMFILE_INPUT); -close(PGMFILE_OUTPUT); +close(FILE_INPUT); +close(FILE_OUTPUT); Deleted: SwiftApps/modis/bin/is_land.pl =================================================================== --- SwiftApps/modis/bin/is_land.pl 2013-02-22 22:19:48 UTC (rev 6307) +++ SwiftApps/modis/bin/is_land.pl 2013-02-23 12:44:52 UTC (rev 6308) @@ -1,34 +0,0 @@ -#!/usr/bin/perl -w - -# Usage: is_land.pl myfile.pgm.gz -# Returns 0 if image is land, 1 if water - -my $pgm_filename = shift; -open(PGMFILE, "gunzip -c $pgm_filename |") || die "Unable to open $pgm_filename!\n"; - -# Header -my $magic = ; -my $resolution = ; -my $maxvalue = ; -my ($xres, $yres) = split(' ', $resolution); - -# Use arrays to count frequencies -my @pixelcount; -foreach my $count(0..$maxvalue) { - $pixelcount[$count] = 0; -} - -# Read values -foreach() { - foreach $word(split) { - $pixelcount[$word]++; - } -} -close(PGMFILE); - -my $total_pixel_count=$xres*$yres; -my $water_count=$pixelcount[0]; - -if($water_count >= ($total_pixel_count/2)) { print "0\n"; } -else { print "1\n"; } - Modified: SwiftApps/modis/bin/markmap.sh =================================================================== --- SwiftApps/modis/bin/markmap.sh 2013-02-22 22:19:48 UTC (rev 6307) +++ SwiftApps/modis/bin/markmap.sh 2013-02-23 12:44:52 UTC (rev 6308) @@ -5,15 +5,19 @@ tilefile=$1 outmap=$2 -asciimap=$3 +xres=721 +yres=361 -cp $BINDIR/grid.ppm $outmap +cp $BINDIR/world.rgb $outmap.step cat $tilefile | while read f ; do hv=$(echo $f | sed -e 's,^.*/,,' -e 's/\..*//') h=$(echo $hv | sed -e 's/h//' -e 's/v..//' -e 's/^0//') v=$(echo $hv | sed -e 's/h..//' -e 's/v//' -e 's/^0//') - $BINDIR/draw_rectangle.pl $outmap $((34+$h*16)) $((51+$v*16)) $((34+14+$h*16)) $((51+14+$v*16)) $outmap.tmp - mv $outmap.tmp $outmap + $BINDIR/draw_rectangle.pl $outmap.step $xres $yres $(( $h * 20 )) $(( $v * 20 )) $(( $h * 20 + 20 )) $(( $v * 20 + 20)) $outmap.tmp + mv $outmap.tmp $outmap.step done +# Convert output to PNG +$BINDIR/rgb_to_png.py $outmap.step $xres $yres $outmap +rm $outmap.step Added: SwiftApps/modis/bin/rgb_to_png.py =================================================================== --- SwiftApps/modis/bin/rgb_to_png.py (rev 0) +++ SwiftApps/modis/bin/rgb_to_png.py 2013-02-23 12:44:52 UTC (rev 6308) @@ -0,0 +1,54 @@ +#!/usr/bin/env python +import struct, sys + +def be32(n): + return struct.pack('>I', n) + +def png_chunk(ty, data): + return be32(len(data)) + ty + data + be32(crc(ty + data)) + +def png_header(width, height): + return png_chunk('IHDR', + struct.pack('>IIBBBBB', width, height, 8, 2, 0, 0, 0)) + +MAX_DEFLATE = 0xffff +def deflate_block(data, last=False): + n = len(data) + assert n <= MAX_DEFLATE + return struct.pack('> 1) + return c ^ 0xffffffff + +def adler32(data): + s1, s2 = 1, 0 + for x in data: + s1 = (s1 + ord(x)) % 65521 + s2 = (s2 + s1) % 65521 + return (s2 << 16) + s1 + +img = open(sys.argv[1], 'r').read() +w, h = int(sys.argv[2]), int(sys.argv[3]) +open(sys.argv[4], 'wb').write(to_png(w, h, img)) Property changes on: SwiftApps/modis/bin/rgb_to_png.py ___________________________________________________________________ Added: svn:executable + * Modified: SwiftApps/modis/tutorial/modis04.swift =================================================================== --- SwiftApps/modis/tutorial/modis04.swift 2013-02-22 22:19:48 UTC (rev 6307) +++ SwiftApps/modis/tutorial/modis04.swift 2013-02-23 12:44:52 UTC (rev 6308) @@ -39,6 +39,5 @@ (topSelected, selectedTiles) = analyzeLandUse(land, landType, nSelect); # Mark the top N tiles on a sinusoidal gridded map -imagefile gridMap <"markedGrid.ppm">; -file asciiMap <"map.txt">; -gridMap = markMap(topSelected); +imagefile gridmap <"gridmap.png">; +gridmap = markMap(topSelected); From davidk at ci.uchicago.edu Sat Feb 23 06:48:04 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Sat, 23 Feb 2013 06:48:04 -0600 (CST) Subject: [Swift-commit] r6310 - SwiftApps/modis/bin Message-ID: <20130223124804.4ACF3178884@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-23 06:48:03 -0600 (Sat, 23 Feb 2013) New Revision: 6310 Removed: SwiftApps/modis/bin/grid.ppm Log: Remove unused grid.ppm Deleted: SwiftApps/modis/bin/grid.ppm =================================================================== (Binary files differ) From davidk at ci.uchicago.edu Sat Feb 23 13:18:21 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Sat, 23 Feb 2013 13:18:21 -0600 (CST) Subject: [Swift-commit] r6311 - in SwiftApps/modis: bin conf tutorial Message-ID: <20130223191821.154A9178884@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-23 13:18:20 -0600 (Sat, 23 Feb 2013) New Revision: 6311 Added: SwiftApps/modis/bin/adjust_color.pl SwiftApps/modis/tutorial/modis05.swift Modified: SwiftApps/modis/bin/colormodis.sh SwiftApps/modis/conf/local.cf Log: Color map Added: SwiftApps/modis/bin/adjust_color.pl =================================================================== --- SwiftApps/modis/bin/adjust_color.pl (rev 0) +++ SwiftApps/modis/bin/adjust_color.pl 2013-02-23 19:18:20 UTC (rev 6311) @@ -0,0 +1,35 @@ +#!/usr/bin/perl + +# Usage: adjust_color.pl input.rgb table.txt output.rgb + +my ($input_filename, $translation_table, $output_filename) = @ARGV; +open(FILE_INPUT, "$input_filename") || die "Unable to open $input_filename!"; +open(FILE_OUTPUT, ">$output_filename") || die "Unable to create $output_filename"; + +# Read translation table into a hash +my %tr_table = (); +open(TRANSLATION_TABLE, "$translation_table") || die "Unable to open $translation_table"; +while() { + my ($from, $to) = split; + $tr_table{$from} = $to; +} + +# Read data +$/ = \3; +while() { + my $hex = sprintf ("#%2.2X%2.2X%2.2X", unpack('C3', $_)); + + if(defined($tr_table{$hex})) { + my $new_value = $tr_table{$hex}; + print FILE_OUTPUT pack('C3', + hex(substr($new_value,1,2)), + hex(substr($new_value,3,2)), + hex(substr($new_value,5,2)) + ); + } + + else { print FILE_OUTPUT $_; } +} + +close(FILE_INPUT); +close(FILE_OUTPUT); Property changes on: SwiftApps/modis/bin/adjust_color.pl ___________________________________________________________________ Added: svn:executable + * Modified: SwiftApps/modis/bin/colormodis.sh =================================================================== --- SwiftApps/modis/bin/colormodis.sh 2013-02-23 12:48:03 UTC (rev 6310) +++ SwiftApps/modis/bin/colormodis.sh 2013-02-23 19:18:20 UTC (rev 6311) @@ -2,11 +2,13 @@ # Return a new modis files with the 0-16 pixel values changed to # colors that reflect the land use of that region. (See legend) # -# usage: colormodis.sh modis.ppm.gz recolored.tif +# usage: colormodis.sh original.rgb recolored.rgb # infile=$1 outfile=$2 +xres=2400 +yres=2400 BINDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # Translation table - edit colors here Modified: SwiftApps/modis/conf/local.cf =================================================================== --- SwiftApps/modis/conf/local.cf 2013-02-23 12:48:03 UTC (rev 6310) +++ SwiftApps/modis/conf/local.cf 2013-02-23 19:18:20 UTC (rev 6311) @@ -1,6 +1,6 @@ wrapperlog.always.transfer=true sitedir.keep=true -execution.retries=0 +execution.retries=5 lazy.errors=false status.mode=provider use.provider.staging=false Added: SwiftApps/modis/tutorial/modis05.swift =================================================================== --- SwiftApps/modis/tutorial/modis05.swift (rev 0) +++ SwiftApps/modis/tutorial/modis05.swift 2013-02-23 19:18:20 UTC (rev 6311) @@ -0,0 +1,62 @@ +type file; +type imagefile; +type landuse; + +app (landuse output) getLandUse (imagefile input) +{ + getlanduse @filename(input) stdout=@filename(output); +} + +app (file output, file tilelist) analyzeLandUse (landuse input[], string usetype, int maxnum) +{ + analyzelanduse @output @tilelist usetype maxnum @input; +} + +app (imagefile grid) markMap (file tilelist) +{ + markmap @tilelist @grid; +} + +app (imagefile output) colorModis (imagefile input) +{ + colormodis @input @output; +} + +# Constants and command line arguments +int nFiles = @toInt(@arg("nfiles", "1000")); +int nSelect = @toInt(@arg("nselect", "10")); +string landType = @arg("landtype", "urban"); +string MODISdir = @arg("modisdir", "../data/modis/2002"); + +# Input Dataset +imagefile geos[] ; + +# Compute the land use summary of each MODIS tile +landuse land[] ; + +foreach g,i in geos { + land[i] = getLandUse(g); +} + +# Find the top N tiles (by total area of selected landuse types) +file topSelected <"topselected.txt">; +file selectedTiles <"selectedtiles.txt">; +(topSelected, selectedTiles) = analyzeLandUse(land, landType, nSelect); + +# Mark the top N tiles on a sinusoidal gridded map +imagefile gridmap <"gridmap.png">; +gridmap = markMap(topSelected); + +# Create multi-color images for all tiles +imagefile colorImage[] ; + +foreach g, i in geos { + colorImage[i] = colorModis(g); +} + +# Assemble a montage of the top selected areas +#imagefile montage<"map.png">; # @arg +#file assemble_olog <"logs/assemble.o.log">; +#file assemble_elog <"logs/assemble.e.log">; +#tracef("Calling assemble %s %s %s %s\n", @montage, @selectedTiles, @colorImage[0], webDir); +#(montage, assemble_olog, assemble_elog) = assemble(selectedTiles,colorImage,webDir); From hategan at ci.uchicago.edu Sat Feb 23 15:09:56 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Sat, 23 Feb 2013 15:09:56 -0600 (CST) Subject: [Swift-commit] r6312 - branches/release-0.94/docs/userguide Message-ID: <20130223210956.7C30E178884@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-23 15:09:56 -0600 (Sat, 23 Feb 2013) New Revision: 6312 Modified: branches/release-0.94/docs/userguide/language Log: added section about associative arrays Modified: branches/release-0.94/docs/userguide/language =================================================================== --- branches/release-0.94/docs/userguide/language 2013-02-23 19:18:20 UTC (rev 6311) +++ branches/release-0.94/docs/userguide/language 2013-02-23 21:09:56 UTC (rev 6312) @@ -182,6 +182,64 @@ some initial condition, and then repeatedly run the simulate procedure, using each execution's outputs as input to the next step. +Associative Arrays +~~~~~~~~~~~~~~~~~~ + +By default, array keys are integers. However, other primitive types are also +allowed as array keys. The syntax for declaring an array with a key type different +than the default is: + +---- +[] array; +---- + +For example, the following code declares and assigns items to an array with string +keys and float values: + +---- +float[string] a; +a["one"] = 0.2; +a["two"] = 0.4; +---- + +In addition to primitive types, a special type named *auto* can be used to +declare an array for which an additional *append* operation is available: + +---- +int[auto] array; + +foreach i in [1:100] { + append(array, i * 2); +} + +foreach v in array { + trace(v); +} +---- + +Items in an array with *auto* keys cannot be accessed directly using a primitive +type. The following example results in a compile-time error: + +---- +int[auto] array; +array[0] = 1; +---- + +However, it is possible to use *auto* key values from one array to access another: + +---- +int[auto] a; +int[auto] b; + +append(a, 1); +append(a, 2); + +foreach v, k in a { + b[k] = a[k] * 2; +} +---- + + Ordering of execution ~~~~~~~~~~~~~~~~~~~~~ Non-array variables are single-assignment, which means that they must From hategan at ci.uchicago.edu Sat Feb 23 23:21:18 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Sat, 23 Feb 2013 23:21:18 -0600 (CST) Subject: [Swift-commit] r6313 - branches/release-0.94/docs/userguide Message-ID: <20130224052118.BC014178884@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-23 23:21:18 -0600 (Sat, 23 Feb 2013) New Revision: 6313 Modified: branches/release-0.94/docs/userguide/mappers Log: added clarifications about the behavioud of iterate Modified: branches/release-0.94/docs/userguide/mappers =================================================================== --- branches/release-0.94/docs/userguide/mappers 2013-02-23 21:09:56 UTC (rev 6312) +++ branches/release-0.94/docs/userguide/mappers 2013-02-24 05:21:18 UTC (rev 6313) @@ -248,8 +248,7 @@ iterate ^^^^^^^ iterate expressions allow a block of code to be evaluated repeatedly, -with an integer parameter sweeping upwards from 0 until a termination -condition holds. +with an iteration variable being incremented after each iteration. The general form is: @@ -259,10 +258,30 @@ } until (terminationExpression); ---- -with the variable var starting at 0 and increasing by one in each -iteration. That variable is in scope in the statements block and when -evaluating the termination expression. +Here _var_ is the iteration variable. Its initial value is 0. After each iteration, +but before _terminationExpression_ is evaluated, the iteration variable is incremented. +This means that if the termination expression is a function of only the iteration variable, +the body will never be executed while the termination expression is true. +Example: + +---- +iterate i { + trace(i); // will print 0, 1, and 2 +} until (i == 3); +---- + +Variables declared inside the body of _iterate_ can be used in the termination expression. +However, their values will reflect the values calculated as part of the last invocation +of the body, and may not reflect the incremented value of the iteration variable: + +---- +iterate i { + trace(i); + int j = i; // will print 0, 1, 2, and 3 +} until (j == 3); +---- + Operators ~~~~~~~~~ The following infix operators are available for use in Swift script From hategan at ci.uchicago.edu Tue Feb 26 21:22:36 2013 From: hategan at ci.uchicago.edu (hategan at ci.uchicago.edu) Date: Tue, 26 Feb 2013 21:22:36 -0600 (CST) Subject: [Swift-commit] r6314 - in branches/faster: resources src/org/globus/swift/catalog/site src/org/griphyn/vdl/karajan/lib Message-ID: <20130227032236.78FF49CC97@svn.ci.uchicago.edu> Author: hategan Date: 2013-02-26 21:22:36 -0600 (Tue, 26 Feb 2013) New Revision: 6314 Added: branches/faster/resources/swift-sites-2.0.xsd branches/faster/src/org/globus/swift/catalog/site/SiteCatalogParser.java Removed: branches/faster/src/org/globus/swift/catalog/site/Parser.java Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/SiteCatalog.java Log: better sites file parsing Added: branches/faster/resources/swift-sites-2.0.xsd =================================================================== --- branches/faster/resources/swift-sites-2.0.xsd (rev 0) +++ branches/faster/resources/swift-sites-2.0.xsd 2013-02-27 03:22:36 UTC (rev 6314) @@ -0,0 +1,243 @@ + + + + + defines the legal namespaces of execution profiles. + + + + + + + + + + + + + A set of attributes to define a Globus version. + + + + + + + + + + + + + + + + + + Root element aggregating all sites information there is. This is the + preferred choice for version 2.0 of the sites file + + + + + + Describes a single site. + + + + + + + + + + + + + + + + + + + + + roo t element aggregating all sites information there is. + + + + + + Describes a single site. + + + + + + + + + + + + + + + + + + + + + + + + Administrative profile defaults associated with a pool. + + + + + + + + + + + + + Each pool may have one and only one work directory mount point. + + < xs:complexType> + + + + + + + + + + + + TODO + + + + + + Describes the mechanism used to submit jobs to the pool + + + + + + + + + + + + Describes the mechanism used to interact with the filesystem on the given pool + + + + + + + + + + Each pool may have multiple gridftp servers. + + + + + + Stores the bandwidth informaion related to each gridftp server. + + + + + + + + + + + + + + + + The URL (actually, it may be more a URI, but hey, so what) is the access URL to the gridftp server. Each pool may have multiple gridftp servers, or run multiple versions of Globus on different ports. + + + + + This element is the storage mount point prefix. Of course, this may get turned over into other things, augmented by user and system requirements etc. I believe that default works quite well for default Globus setups. + + + + + + + + + + Each pool supports various (usually two) jobmanagers. + + + + + The universe name is actually the primary key for the jobmanager identification. + + + + + The contact string is the secondary key for any job manager. + + + + + Any pool may have multiple versions of Globus installed, and these versions may have multiple jobmanagers listening on different ports. + + + + + + + + + + + + + + + + + + + Allows specifying an environment variable that all applications on this site will see + + + + + + + + Specifies the details of an application installed on a site + + + + + + + + + + \ No newline at end of file Deleted: branches/faster/src/org/globus/swift/catalog/site/Parser.java =================================================================== --- branches/faster/src/org/globus/swift/catalog/site/Parser.java 2013-02-24 05:21:18 UTC (rev 6313) +++ branches/faster/src/org/globus/swift/catalog/site/Parser.java 2013-02-27 03:22:36 UTC (rev 6314) @@ -1,55 +0,0 @@ -//---------------------------------------------------------------------- -//This code is developed as part of the Java CoG Kit project -//The terms of the license can be found at http://www.cogkit.org/license -//This message may not be removed or altered. -//---------------------------------------------------------------------- - -/* - * Created on Jan 7, 2013 - */ -package org.globus.swift.catalog.site; - -import java.io.File; -import java.io.IOException; -import java.net.URL; - -import javax.xml.XMLConstants; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.dom.DOMSource; -import javax.xml.validation.Schema; -import javax.xml.validation.SchemaFactory; -import javax.xml.validation.Validator; - -import org.w3c.dom.Document; -import org.xml.sax.SAXException; - -public class Parser { - public static final String SCHEMA_RESOURCE = "swift-sites-1.0.xsd"; - - private File src; - - public Parser(String fileName) { - this.src = new File(fileName); - } - - public Document parse() throws ParserConfigurationException, SAXException, IOException { - URL schemaURL = Parser.class.getClassLoader().getResource(SCHEMA_RESOURCE); - - if (schemaURL == null) { - throw new IllegalStateException("Sites schema not found in resources: " + SCHEMA_RESOURCE); - } - - SchemaFactory sfactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); - Schema schema = sfactory.newSchema(schemaURL); - - DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance(); - dfactory.setSchema(schema); - DocumentBuilder dbuilder = dfactory.newDocumentBuilder(); - Document doc = dbuilder.parse(src); - - return doc; - } - -} Added: branches/faster/src/org/globus/swift/catalog/site/SiteCatalogParser.java =================================================================== --- branches/faster/src/org/globus/swift/catalog/site/SiteCatalogParser.java (rev 0) +++ branches/faster/src/org/globus/swift/catalog/site/SiteCatalogParser.java 2013-02-27 03:22:36 UTC (rev 6314) @@ -0,0 +1,93 @@ +//---------------------------------------------------------------------- +//This code is developed as part of the Java CoG Kit project +//The terms of the license can be found at http://www.cogkit.org/license +//This message may not be removed or altered. +//---------------------------------------------------------------------- + +/* + * Created on Jan 7, 2013 + */ +package org.globus.swift.catalog.site; + +import java.io.File; +import java.io.IOException; +import java.net.URL; + +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.validation.Schema; +import javax.xml.validation.SchemaFactory; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.xml.sax.ErrorHandler; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + +public class SiteCatalogParser { + public static final Logger logger = Logger.getLogger(SiteCatalogParser.class); + + public static final String SCHEMA_RESOURCE = "swift-sites-2.0.xsd"; + static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; + + private File src; + + public SiteCatalogParser(String fileName) { + this.src = new File(fileName); + } + + public Document parse() throws ParserConfigurationException, SAXException, IOException { + URL schemaURL = SiteCatalogParser.class.getClassLoader().getResource(SCHEMA_RESOURCE); + + if (schemaURL == null) { + throw new IllegalStateException("Sites schema not found in resources: " + SCHEMA_RESOURCE); + } + + SchemaFactory sfactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); + Schema schema = sfactory.newSchema(schemaURL); + + DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance(); + dfactory.setNamespaceAware(true); + dfactory.setSchema(schema); + + DocumentBuilder dbuilder = dfactory.newDocumentBuilder(); + dbuilder.setErrorHandler(new CErrorHandler()); + Document doc = dbuilder.parse(src); + + return doc; + } + + private class CErrorHandler implements ErrorHandler { + + @Override + public void warning(SAXParseException e) throws SAXException { + print(e, "Warning", false); + } + + @Override + public void error(SAXParseException e) throws SAXException { + print(e, "Error", true); + } + + @Override + public void fatalError(SAXParseException e) throws SAXException { + print(e, "Fatal", true); + } + + private void print(SAXParseException e, String header, boolean err) { + String msg = "[" + header + "] " + src.getName() + ", line " + + e.getLineNumber() + ", col " + e.getColumnNumber() + ": " + e.getMessage(); + if (err) { + System.err.println(msg); + } + else { + System.out.println(msg); + } + if (logger.isInfoEnabled()) { + logger.info(msg); + } + } + } +} Modified: branches/faster/src/org/griphyn/vdl/karajan/lib/SiteCatalog.java =================================================================== --- branches/faster/src/org/griphyn/vdl/karajan/lib/SiteCatalog.java 2013-02-24 05:21:18 UTC (rev 6313) +++ branches/faster/src/org/griphyn/vdl/karajan/lib/SiteCatalog.java 2013-02-27 03:22:36 UTC (rev 6314) @@ -26,7 +26,7 @@ import org.globus.cog.karajan.compiled.nodes.functions.AbstractSingleValuedFunction; import org.globus.cog.karajan.util.BoundContact; import org.globus.cog.karajan.util.ContactSet; -import org.globus.swift.catalog.site.Parser; +import org.globus.swift.catalog.site.SiteCatalogParser; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; @@ -34,6 +34,10 @@ public class SiteCatalog extends AbstractSingleValuedFunction { private ArgRef fileName; + + private enum Version { + V1, V2; + } @Override protected Param[] getParams() { @@ -43,7 +47,7 @@ @Override public Object function(Stack stack) { String fn = fileName.getValue(stack); - Parser p = new Parser(fn); + SiteCatalogParser p = new SiteCatalogParser(fn); try { Document doc = p.parse(); return buildResources(doc); @@ -54,27 +58,68 @@ } private Object buildResources(Document doc) { + Node root = getRoot(doc); + + if (root.getLocalName().equals("config")) { + return parse(root, Version.V1); + } + else if (root.getLocalName().equals("sites")) { + return parse(root, Version.V1); + } + else { + throw new IllegalArgumentException("Illegal sites file root node: " + root.getLocalName()); + } + } + + + + private Object parse(Node config, Version v) { ContactSet cs = new ContactSet(); - NodeList pools = doc.getElementsByTagName("config").item(0).getChildNodes(); + NodeList pools = config.getChildNodes(); for (int i = 0; i < pools.getLength(); i++) { - try { - BoundContact bc = pool(pools.item(i)); - if (bc != null) { - cs.addContact(bc); + Node n = pools.item(i); + if (n.getNodeType() == Node.ELEMENT_NODE) { + try { + BoundContact bc = pool(n, v); + if (bc != null) { + cs.addContact(bc); + } } + catch (Exception e) { + throw new ExecutionException(this, "Invalid site entry '" + poolName(n, v) + "': ", e); + } } - catch (Exception e) { - throw new ExecutionException(this, "Invalid pool entry '" + attr(pools.item(i), "handle") + "': ", e); - } } return cs; } - private BoundContact pool(Node n) throws InvalidProviderException, ProviderMethodException { + private String poolName(Node site, Version v) { + if (site.getLocalName().equals("pool")) { + return attr(site, "handle"); + } + else if (site.getLocalName().equals("site")) { + return attr(site, "name"); + } + else { + throw new IllegalArgumentException("Invalid node: " + site.getLocalName()); + } + } + + private Node getRoot(Document doc) { + NodeList l = doc.getChildNodes(); + for (int i = 0; i < l.getLength(); i++) { + if (l.item(i).getNodeType() == Node.ELEMENT_NODE) { + return l.item(i); + } + } + throw new IllegalArgumentException("Missing root element"); + } + + private BoundContact pool(Node n, Version v) throws InvalidProviderException, ProviderMethodException { if (n.getNodeType() != Node.ELEMENT_NODE) { return null; } - String name = attr(n, "handle"); + String name = poolName(n, v); BoundContact bc = new BoundContact(name); String sysinfo = attr(n, "sysinfo", null); @@ -91,10 +136,10 @@ } String ctype = c.getNodeName(); - if (ctype.equals("gridftp")) { + if (v == Version.V1 && ctype.equals("gridftp")) { bc.addService(gridftp(c)); } - else if (ctype.equals("jobmanager")) { + else if (v == Version.V1 && ctype.equals("jobmanager")) { bc.addService(jobmanager(c)); } else if (ctype.equals("execution")) { @@ -115,13 +160,19 @@ else if (ctype.equals("profile")) { profile(bc, c); } + else if (v == Version.V2 && ctype.equals("application")) { + application(bc, c); + } else { - System.err.println("Unknown node type: " + ctype); + throw new IllegalArgumentException("Unknown node type: " + ctype); } } return bc; } + private void application(BoundContact bc, Node c) { + } + private Service jobmanager(Node n) throws InvalidProviderException, ProviderMethodException { String provider; String url = attr(n, "url"); @@ -163,6 +214,9 @@ String provider = attr(n, "provider"); String url = attr(n, "url", null); String jobManager = attr(n, "jobManager", null); + if (jobManager == null) { + jobManager = attr(n, "jobmanager", null); + } ExecutionService s = new ExecutionServiceImpl(); s.setProvider(provider); @@ -230,7 +284,7 @@ throw new IllegalArgumentException("Missing " + name); } else { - return attr.getNodeValue(); + return expandProps(attr.getNodeValue()); } } else { @@ -246,11 +300,47 @@ return defVal; } else { - return attr.getNodeValue(); + return expandProps(attr.getNodeValue()); } } else { return defVal; } } + + private String expandProps(String v) { + if (v == null) { + return null; + } + StringBuilder sb = new StringBuilder(); + int li = -1; + for (int i = 0; i < v.length(); i++) { + char c = v.charAt(i); + switch (c) { + case '{': + if (li != -1) { + li = -1; + sb.append('{'); + } + else { + li = i; + } + break; + case '}': + if (li != -1) { + sb.append(System.getProperty(v.substring(li + 1, i))); + li = -1; + } + else { + sb.append(c); + } + break; + default: + if (li == -1) { + sb.append(c); + } + } + } + return sb.toString(); + } } From ketan at ci.uchicago.edu Tue Feb 26 22:03:46 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Tue, 26 Feb 2013 22:03:46 -0600 (CST) Subject: [Swift-commit] r6315 - SwiftApps/modis Message-ID: <20130227040346.F0E0C9CC97@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-26 22:03:46 -0600 (Tue, 26 Feb 2013) New Revision: 6315 Modified: SwiftApps/modis/README Log: Reading README and minor updates Modified: SwiftApps/modis/README =================================================================== --- SwiftApps/modis/README 2013-02-27 03:22:36 UTC (rev 6314) +++ SwiftApps/modis/README 2013-02-27 04:03:46 UTC (rev 6315) @@ -4,11 +4,11 @@ $ svn co https://svn.ci.uchicago.edu/svn/vdl2/SwiftApps/modis -Once you do this, you all also need the associated modis data. -To download the images, run: +Once you do this, you also need the associated modis data. +To download the image data, run: $ cd modis/data/modis/2002 -$ wget http://www.ci.uchicago.edu/swift/modis/modis-2002.tar +$ wget http://www.ci.uchicago.edu/swift/modis/modis-2002.tar $ tar xf modis-2002.tar Hello world @@ -16,7 +16,7 @@ The script tutorial/hello.swift demonstrates a simple "hello world" script. It demonstrates how to define apps, passing arguments to an app, and how to work with files. In this example, a file called -hello.txt gets created with with the contents of "Hello, world!". +hello.txt gets created with the contents of "Hello, world!". To run the application, the command is: @@ -25,7 +25,7 @@ modis01.swift ------------- The first modis example defines one app function called getLandUse. -This app takes a sallite image (data/modis/2002/h00v09.pgm.gz) as +This app takes a satellite image (data/modis/2002/h00v09.pgm.gz) as input. getLandUse creates a text file called landuse/h00v08.landuse.byfreq that counts the frequency of each land type defined in the input image. @@ -49,7 +49,7 @@ and creates two summary files called topselected.txt and selectedtiles.txt. These files contain information about the top 10 urban areas. -In the previous example, you have have noticed that running all 317 input files on +In the previous example, you have noticed that running all 317 input files on your laptop, even with 4 tasks a time, is not very efficient. In the next example, instead of running locally, we will use a cluster called midway at the University of Chicago to improve performance. From ketan at ci.uchicago.edu Wed Feb 27 20:13:14 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Wed, 27 Feb 2013 20:13:14 -0600 (CST) Subject: [Swift-commit] r6316 - trunk/docs/userguide Message-ID: <20130228021314.D87B99CCC2@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-27 20:13:14 -0600 (Wed, 27 Feb 2013) New Revision: 6316 Modified: trunk/docs/userguide/commands Log: formatting and cleanup Modified: trunk/docs/userguide/commands =================================================================== --- trunk/docs/userguide/commands 2013-02-27 04:03:46 UTC (rev 6315) +++ trunk/docs/userguide/commands 2013-02-28 02:13:14 UTC (rev 6316) @@ -142,20 +142,22 @@ The swift is influenced by the following environment variables: -GLOBUS_HOSTNAME, GLOBUS_TCP_PORT_RANGE - set in the environment -before running Swift. These can be set to inform Swift of the -configuration of your local firewall. More information can be found in -the Globus firewall How-to . +GLOBUS_HOSTNAME, GLOBUS_TCP_PORT_RANGE -COG_OPTS - set in the environment before running Swift. Options set in -this variable will be passed as parameters to the Java Virtual Machine -which will run Swift. The parameters vary between virtual machine -imlementations, but can usually be used to alter settings such as -maximum heap size. Typing 'java -help' will sometimes give a list of -commands. The Sun Java 1.4.2 command line options are documented here -. + Set in the environment before running Swift. These can be set to inform Swift + of the configuration of your local firewall. More information can be found in + the Globus firewall How-to . +COG_OPTS + Set in the environment before running Swift. Options set in + this variable will be passed as parameters to the Java Virtual Machine + which will run Swift. The parameters vary between virtual machine + imlementations, but can usually be used to alter settings such as + maximum heap size. Typing 'java -help' will sometimes give a list of + commands. + + swift-osg-ress-site-catalog ~~~~~~~~~~~~~~~~~~~~~~~~~~~ The swift-osg-ress-site-catalog command generates a site catalog based From ketan at ci.uchicago.edu Wed Feb 27 20:36:11 2013 From: ketan at ci.uchicago.edu (ketan at ci.uchicago.edu) Date: Wed, 27 Feb 2013 20:36:11 -0600 (CST) Subject: [Swift-commit] r6317 - in trunk/docs: cookbook documentation siteguide tutorial userguide Message-ID: <20130228023611.5370A9CCC2@svn.ci.uchicago.edu> Author: ketan Date: 2013-02-27 20:36:11 -0600 (Wed, 27 Feb 2013) New Revision: 6317 Modified: trunk/docs/cookbook/cookbook.txt trunk/docs/documentation/documentation.txt trunk/docs/siteguide/siteguide.txt trunk/docs/tutorial/tutorial.txt trunk/docs/userguide/userguide.txt Log: adding link back to Swift homepage Modified: trunk/docs/cookbook/cookbook.txt =================================================================== --- trunk/docs/cookbook/cookbook.txt 2013-02-28 02:13:14 UTC (rev 6316) +++ trunk/docs/cookbook/cookbook.txt 2013-02-28 02:36:11 UTC (rev 6317) @@ -16,3 +16,6 @@ include::debugging[] include::log_processing[] + +link:http://www.ci.uchicago.edu/swift/docs/index.php[home] + Modified: trunk/docs/documentation/documentation.txt =================================================================== --- trunk/docs/documentation/documentation.txt 2013-02-28 02:13:14 UTC (rev 6316) +++ trunk/docs/documentation/documentation.txt 2013-02-28 02:36:11 UTC (rev 6317) @@ -9,3 +9,5 @@ include::automation[] +link:http://www.ci.uchicago.edu/swift/docs/index.php[home] + Modified: trunk/docs/siteguide/siteguide.txt =================================================================== --- trunk/docs/siteguide/siteguide.txt 2013-02-28 02:13:14 UTC (rev 6316) +++ trunk/docs/siteguide/siteguide.txt 2013-02-28 02:36:11 UTC (rev 6317) @@ -25,3 +25,6 @@ include::uc3[] include::stampede[] + +link:http://www.ci.uchicago.edu/swift/docs/index.php[home] + Modified: trunk/docs/tutorial/tutorial.txt =================================================================== --- trunk/docs/tutorial/tutorial.txt 2013-02-28 02:13:14 UTC (rev 6316) +++ trunk/docs/tutorial/tutorial.txt 2013-02-28 02:36:11 UTC (rev 6317) @@ -15,3 +15,6 @@ include::runtime_features[] include::bits[] + +link:http://www.ci.uchicago.edu/swift/docs/index.php[home] + Modified: trunk/docs/userguide/userguide.txt =================================================================== --- trunk/docs/userguide/userguide.txt 2013-02-28 02:13:14 UTC (rev 6316) +++ trunk/docs/userguide/userguide.txt 2013-02-28 02:36:11 UTC (rev 6317) @@ -39,3 +39,5 @@ include::cdm[] include::log-processing[] + +link:http://www.ci.uchicago.edu/swift/docs/index.php[home] From davidk at ci.uchicago.edu Thu Feb 28 10:55:05 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Thu, 28 Feb 2013 10:55:05 -0600 (CST) Subject: [Swift-commit] r6318 - in SwiftApps/modis: . bin conf tutorial Message-ID: <20130228165505.D652A9CCC2@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-28 10:55:05 -0600 (Thu, 28 Feb 2013) New Revision: 6318 Added: SwiftApps/modis/bin/assemble.sh SwiftApps/modis/bin/gray.rgb SwiftApps/modis/bin/rgb_adjust_color.pl SwiftApps/modis/bin/rgb_downscale.pl SwiftApps/modis/bin/rgb_draw_rectangle.pl SwiftApps/modis/bin/rgb_histogram.pl SwiftApps/modis/tutorial/modis06.swift Removed: SwiftApps/modis/bin/adjust_color.pl SwiftApps/modis/bin/assemble.sh SwiftApps/modis/bin/assemble.sh.orig SwiftApps/modis/bin/assemble.sh.v2 SwiftApps/modis/bin/assemble2.sh SwiftApps/modis/bin/draw_rectangle.pl SwiftApps/modis/bin/erasewater.sh SwiftApps/modis/bin/getlanduse.pl SwiftApps/modis/bin/gray.png SwiftApps/modis/bin/setborder.sh Modified: SwiftApps/modis/bin/colormodis.sh SwiftApps/modis/bin/getlanduse.sh SwiftApps/modis/bin/markmap.sh SwiftApps/modis/conf/beagle-ssh.cf SwiftApps/modis/conf/beagle.cf SwiftApps/modis/conf/fusion.cf SwiftApps/modis/conf/local-coasters.cf SwiftApps/modis/conf/local.cf SwiftApps/modis/conf/midway.cf SwiftApps/modis/conf/raven.cf SwiftApps/modis/demo SwiftApps/modis/tutorial/modis05.swift Log: Starting work towards the assembly step Added rgb_downscale.pl to resample an image Some clean up Deleted: SwiftApps/modis/bin/adjust_color.pl =================================================================== --- SwiftApps/modis/bin/adjust_color.pl 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/bin/adjust_color.pl 2013-02-28 16:55:05 UTC (rev 6318) @@ -1,35 +0,0 @@ -#!/usr/bin/perl - -# Usage: adjust_color.pl input.rgb table.txt output.rgb - -my ($input_filename, $translation_table, $output_filename) = @ARGV; -open(FILE_INPUT, "$input_filename") || die "Unable to open $input_filename!"; -open(FILE_OUTPUT, ">$output_filename") || die "Unable to create $output_filename"; - -# Read translation table into a hash -my %tr_table = (); -open(TRANSLATION_TABLE, "$translation_table") || die "Unable to open $translation_table"; -while() { - my ($from, $to) = split; - $tr_table{$from} = $to; -} - -# Read data -$/ = \3; -while() { - my $hex = sprintf ("#%2.2X%2.2X%2.2X", unpack('C3', $_)); - - if(defined($tr_table{$hex})) { - my $new_value = $tr_table{$hex}; - print FILE_OUTPUT pack('C3', - hex(substr($new_value,1,2)), - hex(substr($new_value,3,2)), - hex(substr($new_value,5,2)) - ); - } - - else { print FILE_OUTPUT $_; } -} - -close(FILE_INPUT); -close(FILE_OUTPUT); Deleted: SwiftApps/modis/bin/assemble.sh =================================================================== --- SwiftApps/modis/bin/assemble.sh 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/bin/assemble.sh 2013-02-28 16:55:05 UTC (rev 6318) @@ -1,13 +0,0 @@ -output=$1 -shift -inputs=$(ls -1 $*) -labels="" -for f in $inputs; do - labels="$labels -label $(echo $f | sed -e 's/^.*\(h..v..\).*/\1/') $f" -done - -echo doing: -echo montage $labels -font Courier-Regular $inputs $output - -montage $labels -font Courier-Regular $output - Copied: SwiftApps/modis/bin/assemble.sh (from rev 6307, SwiftApps/modis/bin/assemble2.sh) =================================================================== --- SwiftApps/modis/bin/assemble.sh (rev 0) +++ SwiftApps/modis/bin/assemble.sh 2013-02-28 16:55:05 UTC (rev 6318) @@ -0,0 +1,68 @@ +#!/bin/bash + +output=$(cd $(dirname $1); echo $PWD/$(basename $1)) # Full pathname of output file +selected=$(cd $(dirname $2); echo $PWD/$(basename $2)) # Full pathname of input text file "selected" +indir=$(cd $(dirname $3); echo $PWD/$(basename $3)) # Full pathname of image input dir +webdir=$4 + +echo output=$output +echo selected=$selected +echo indir=$indir +echo webdir=$webdir + +if [ ! -d $webdir ]; then + mkdir -p $webdir + if [ $? -ne 0 ]; then + echo Unable to create $webdir, quitting + exit 1 + fi +fi + +tmpdir=$( eval mktemp -d $PWD/modis.assemble.XXXX ) +bindir=$(cd $(dirname $0); pwd) +graytile=$bindir/gray.rgb + +# input files are expected to start with hNNvNN. +# we reverse this to form the final image + +cd $indir + +for h in {0..35}; do + h=$( printf %02d $h ); + + for v in {0..17}; do + v=$( printf %02d $v ); + hv=h${h}v${v} + vh=v${v}h${h} + + # Use graytile if the expected section is not found + if [ ! -f $indir/$hv.color.rgb ]; then + echo $indir/$hv.color.rgb does not exist + cp $graytile $tmpdir + mv $tmpdir/gray.rgb $tmpdir/$vh.rgb + + # Otherwise, downscale input images + #elif grep $hv $selected >&/dev/null; then + # convert $hv.png -resize 290x290 $tmpdir/t.png + # convert $tmp/t.png -bordercolor red -border 5x5 $tmpdir/$vh.png + else + $bindir/rgb_downscale.pl $indir/$hv.color.rgb 2400 2400 8 $tmpdir/$vh.rgb + fi + done +done + +#montage -tile 36x18 -geometry +0+0 $tmpdir/v*png $tmpdir/bigmap.png +#cp $tmp/bigmap.png $output + +########### + +exit 0 + +inputs=$(ls -1 $*) +labels="" +for f in $inputs; do + labels="$labels -label $(echo $f | sed -e 's/^.*\(h..v..\).*/\1/') $f" +done + +montage $labels -font Courier-Regular $output + Deleted: SwiftApps/modis/bin/assemble.sh.orig =================================================================== --- SwiftApps/modis/bin/assemble.sh.orig 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/bin/assemble.sh.orig 2013-02-28 16:55:05 UTC (rev 6318) @@ -1,4 +0,0 @@ -output=$1 -shift -inputs=$(ls -1 $*) -montage -label '%f' -font Courier-Regular $inputs $output \ No newline at end of file Deleted: SwiftApps/modis/bin/assemble.sh.v2 =================================================================== --- SwiftApps/modis/bin/assemble.sh.v2 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/bin/assemble.sh.v2 2013-02-28 16:55:05 UTC (rev 6318) @@ -1,10 +0,0 @@ -output=$1 -shift -inputs=$(ls -1 $*) -labels="" -for f in $inputs; do - labels="$labels -label $(echo $f | sed -e 's/^.*\(h..v..\).*/\1/') $f" -done - -montage $label -font Courier-Regular $inputs $output - Deleted: SwiftApps/modis/bin/assemble2.sh =================================================================== --- SwiftApps/modis/bin/assemble2.sh 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/bin/assemble2.sh 2013-02-28 16:55:05 UTC (rev 6318) @@ -1,69 +0,0 @@ -#!/bin/bash - -output=$(cd $(dirname $1); echo $(pwd)/$(basename $1)) # get full pathname of output file -selected=$(cd $(dirname $2); echo $(pwd)/$(basename $2)) # get full pathname of input file "selected" -indir=$(cd $(dirname $3); pwd) # get full pathname of input dir "geos" -webdir=$4 - -if [ ! -d $webdir ]; then - mkdir -p $webdir - if [ $? -ne 0 ]; then - echo Unable to create $webdir, quitting - exit 1 - fi -fi - -tmpdir=$PWD/$( basename $( mktemp -d modis.assemble.XXXX ) ) -ls -ld $tmpdir - -bindir=$(cd $(dirname $0); pwd) -graytile=$bindir/gray.png - -# input files are expected to start with hNNvNN. -# we reverse this to form the final image - -cd $indir - -for h in {0..35}; do - h=$( printf %02d $h ); - - for v in {0..17}; do - v=$( printf %02d $v ); - hv=h${h}v${v} - vh=v${v}h${h} - - if [ ! -f $hv*png ]; then - cp $graytile $tmpdir/$vh.png - elif grep $hv $selected >&/dev/null; then - echo "adding border to $hv" - # add red border - convert $hv*png -resize 290x290 $tmp/t.png - convert $tmp/t.png -bordercolor red -border 5x5 $tmp/$vh.png - else - cp $hv*png $tmp/$vh.png - fi - done -done - -montage -tile 36x18 -geometry +0+0 $tmp/v*png $tmp/bigmap.png -convert $tmp/bigmap.png -resize 20% $tmp/map.png -cp $tmp/map.png $output -cp $tmp/bigmap.png $output - -if [ -d "$webdir" ]; then - cp $tmp/map.png $webdir -fi - - -########### - -exit 0 - -inputs=$(ls -1 $*) -labels="" -for f in $inputs; do - labels="$labels -label $(echo $f | sed -e 's/^.*\(h..v..\).*/\1/') $f" -done - -montage $labels -font Courier-Regular $output - Modified: SwiftApps/modis/bin/colormodis.sh =================================================================== --- SwiftApps/modis/bin/colormodis.sh 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/bin/colormodis.sh 2013-02-28 16:55:05 UTC (rev 6318) @@ -1,9 +1,9 @@ -# +#!/bin/bash + # Return a new modis files with the 0-16 pixel values changed to # colors that reflect the land use of that region. (See legend) # # usage: colormodis.sh original.rgb recolored.rgb -# infile=$1 outfile=$2 @@ -32,4 +32,4 @@ #101010 #949494 EOF -$BINDIR/adjust_color.pl $infile translate.txt $outfile +$BINDIR/rgb_adjust_color.pl $infile translate.txt $outfile Deleted: SwiftApps/modis/bin/draw_rectangle.pl =================================================================== --- SwiftApps/modis/bin/draw_rectangle.pl 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/bin/draw_rectangle.pl 2013-02-28 16:55:05 UTC (rev 6318) @@ -1,37 +0,0 @@ -#!/usr/bin/perl - -# Draw a rectangle on an RGB file -# Usage: draw_rectangle.pl infile.rgb xmin ymin xmax ymax outfile.rgb - -my ($input_filename, $xres, $yres, $xmin, $ymin, $xmax, $ymax, $output_filename) = @ARGV; -open(FILE_INPUT, "$input_filename") || die "Unable to open $input_filename!"; -open(FILE_OUTPUT, ">$output_filename") || die "Unable to create $output_filename"; - -# Read data three bytes at a time (RGB) -$/ = \3; -my $x=0, $y=0; -while() { - (my $red, my $green, my $blue) = unpack('C3', $_); - #print "$red $green $blue\n"; - - # Left and right of rectangle, 2 pixels wide - if ( $x == $xmin || $x == $xmin+1 || $x == $xmax || $x == $xmax-1 ) { - if ( $y <= $ymax && $y >= $ymin ) { - $red="255"; $blue="0"; $green="0"; } - } - - # Top and bottom, 2 pixels high - if ( $y == $ymin || $y == $ymin-1 || $y == $ymax || $y == $ymax-1 ) { - if ( $x <= $xmax && $x >= $xmin ) { - $red="255"; $blue="0"; $green="0"; - } - } - - print FILE_OUTPUT pack('C3', $red, $green, $blue); - - if($x == $xres-1) { $x = 0; $y++; } - else { $x++; } -} - -close(FILE_INPUT); -close(FILE_OUTPUT); Deleted: SwiftApps/modis/bin/erasewater.sh =================================================================== --- SwiftApps/modis/bin/erasewater.sh 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/bin/erasewater.sh 2013-02-28 16:55:05 UTC (rev 6318) @@ -1,78 +0,0 @@ -# -# Return a new modis files with the 0-16 pixel values changed to -# colors that reflect the land use of that region. (See legend) -# -# usage: colormodis.sh modis.tif recolored.tif -# - -infile=$1 -outfile=$2 -tmp=`mktemp /tmp/modis.$USER.XXXXXX` -mv $tmp $tmp.tif -tmp=$tmp.tif -tmp=$2 -map=`mktemp /tmp/colormap.$USER.XXXXXX` - -# Create color set - -( - cat | - sed -e 's/ c.=/ /g' -e 's/[^0-9 ]//g' | - awk '{printf("#%02x%02x%02x #%02x%02x%02x\n",$1,$2,$3,255,255,255)}') >$map < -EOF - -cp $infile $tmp - -# output logged to stdout/error is ignored by swift for this app() - -while read mval color ; do - echo color $mval is $color - echo convert $tmp "-fill" "$color" "-opaque" "$mval" $tmp - convert $tmp "-fill" "$color" "-opaque" "$mval" $tmp -done <$map - -exit - -#cp $tmp $outfile -convert -thumbnail 300x300 $tmp $outfile - -# rm $tmp $map # Keep these for debugging, for now. - -cat >/dev/null < -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -EOF \ No newline at end of file Deleted: SwiftApps/modis/bin/getlanduse.pl =================================================================== --- SwiftApps/modis/bin/getlanduse.pl 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/bin/getlanduse.pl 2013-02-28 16:55:05 UTC (rev 6318) @@ -1,23 +0,0 @@ -#!/usr/bin/perl -w - -# Input to this program should be a raw, greyscale RGB file -# Usage: getlanduse.pl myfile.rgb - -my $image_filename = shift; -open(IMAGEFILE, "$image_filename") || die "Unable to open $image_filename!\n"; -binmode IMAGEFILE; - -my @pixelcount; -foreach my $count (0..255) { $pixelcount[$count] = 0; } - -# Read values, three bytes at a time -$/ = \3; -foreach() { - $pixelcount[unpack('C', $_)]++; -} -close(IMAGEFILE); - -foreach my $count (0..255) { - if($pixelcount[$count] == 0) { next; } - printf("%d %d %02x\n", $pixelcount[$count], $count, $count); -} Modified: SwiftApps/modis/bin/getlanduse.sh =================================================================== --- SwiftApps/modis/bin/getlanduse.sh 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/bin/getlanduse.sh 2013-02-28 16:55:05 UTC (rev 6318) @@ -1,4 +1,4 @@ #!/bin/bash BINDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -$BINDIR/getlanduse.pl $1 | sort -rn +$BINDIR/rgb_histogram.pl $1 | sort -rn Deleted: SwiftApps/modis/bin/gray.png =================================================================== (Binary files differ) Added: SwiftApps/modis/bin/gray.rgb =================================================================== (Binary files differ) Property changes on: SwiftApps/modis/bin/gray.rgb ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: SwiftApps/modis/bin/markmap.sh =================================================================== --- SwiftApps/modis/bin/markmap.sh 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/bin/markmap.sh 2013-02-28 16:55:05 UTC (rev 6318) @@ -14,7 +14,7 @@ hv=$(echo $f | sed -e 's,^.*/,,' -e 's/\..*//') h=$(echo $hv | sed -e 's/h//' -e 's/v..//' -e 's/^0//') v=$(echo $hv | sed -e 's/h..//' -e 's/v//' -e 's/^0//') - $BINDIR/draw_rectangle.pl $outmap.step $xres $yres $(( $h * 20 )) $(( $v * 20 )) $(( $h * 20 + 20 )) $(( $v * 20 + 20)) $outmap.tmp + $BINDIR/rgb_draw_rectangle.pl $outmap.step $xres $yres $(( $h * 20 )) $(( $v * 20 )) $(( $h * 20 + 20 )) $(( $v * 20 + 20)) $outmap.tmp mv $outmap.tmp $outmap.step done Copied: SwiftApps/modis/bin/rgb_adjust_color.pl (from rev 6311, SwiftApps/modis/bin/adjust_color.pl) =================================================================== --- SwiftApps/modis/bin/rgb_adjust_color.pl (rev 0) +++ SwiftApps/modis/bin/rgb_adjust_color.pl 2013-02-28 16:55:05 UTC (rev 6318) @@ -0,0 +1,35 @@ +#!/usr/bin/perl + +# Usage: rgb_adjust_color.pl input.rgb table.txt output.rgb + +my ($input_filename, $translation_table, $output_filename) = @ARGV; +open(FILE_INPUT, "$input_filename") || die "Unable to open $input_filename!"; +open(FILE_OUTPUT, ">$output_filename") || die "Unable to create $output_filename"; + +# Read translation table into a hash +my %tr_table = (); +open(TRANSLATION_TABLE, "$translation_table") || die "Unable to open $translation_table"; +while() { + my ($from, $to) = split; + $tr_table{$from} = $to; +} + +# Read data +$/ = \3; +while() { + my $hex = sprintf ("#%2.2X%2.2X%2.2X", unpack('C3', $_)); + + if(defined($tr_table{$hex})) { + my $new_value = $tr_table{$hex}; + print FILE_OUTPUT pack('C3', + hex(substr($new_value,1,2)), + hex(substr($new_value,3,2)), + hex(substr($new_value,5,2)) + ); + } + + else { print FILE_OUTPUT $_; } +} + +close(FILE_INPUT); +close(FILE_OUTPUT); Added: SwiftApps/modis/bin/rgb_downscale.pl =================================================================== --- SwiftApps/modis/bin/rgb_downscale.pl (rev 0) +++ SwiftApps/modis/bin/rgb_downscale.pl 2013-02-28 16:55:05 UTC (rev 6318) @@ -0,0 +1,43 @@ +#!/usr/bin/perl + +# Downscale an rgb image +# Usage: rgb_downscale.pl input.rgb xres yres scalefactor output.rgb + +sub array_avg { + my $result=0; + foreach(@_){ $result += $_; } + return int($result/@_); +} + +my ($input_filename, $xres, $yres, $scalefactor, $output_filename) = @ARGV; + +open(FILE_OUTPUT, ">$output_filename") || die "Unable to write to $output_filename!"; +open(FILE_INPUT, "$input_filename") || die "Unable to open $input_filename!"; +local $/; +my @values = unpack('C*', ); +close(FILE_INPUT); + +my $x=0, $y=0; +while($y < $yres) { + my (@reds, @greens, @blues) = (); + + foreach my $yloc ($y..$y+($scalefactor-1)) { + foreach my $xloc ($x..$x+($scalefactor-1)) { + my $index = ($yloc * $xres + $xloc) * 3; + push(@reds, $values[$index]); + push(@greens, $values[$index+1]); + push(@blues, $values[$index+2]); + } + } + + my $red = &array_avg(@reds); + my $green = &array_avg(@greens); + my $blue = &array_avg(@blues); + print FILE_OUTPUT pack('C3', $red, $green, $blue); + + if( ($x+$scalefactor) >= $xres ) { $x = 0; $y += $scalefactor; } + else { $x += $scalefactor; } +} + +close(FILE_INPUT); +close(FILE_OUTPUT); Property changes on: SwiftApps/modis/bin/rgb_downscale.pl ___________________________________________________________________ Added: svn:executable + * Copied: SwiftApps/modis/bin/rgb_draw_rectangle.pl (from rev 6308, SwiftApps/modis/bin/draw_rectangle.pl) =================================================================== --- SwiftApps/modis/bin/rgb_draw_rectangle.pl (rev 0) +++ SwiftApps/modis/bin/rgb_draw_rectangle.pl 2013-02-28 16:55:05 UTC (rev 6318) @@ -0,0 +1,36 @@ +#!/usr/bin/perl + +# Draw a rectangle on an RGB file +# Usage: draw_rectangle.pl infile.rgb xmin ymin xmax ymax outfile.rgb + +my ($input_filename, $xres, $yres, $xmin, $ymin, $xmax, $ymax, $output_filename) = @ARGV; +open(FILE_INPUT, "$input_filename") || die "Unable to open $input_filename!"; +open(FILE_OUTPUT, ">$output_filename") || die "Unable to create $output_filename"; + +# Read data three bytes at a time (RGB) +$/ = \3; +my $x=0, $y=0; +while() { + (my $red, my $green, my $blue) = unpack('C3', $_); + + # Left and right of rectangle, 2 pixels wide + if ( $x == $xmin || $x == $xmin+1 || $x == $xmax || $x == $xmax-1 ) { + if ( $y <= $ymax && $y >= $ymin ) { + $red="255"; $blue="0"; $green="0"; } + } + + # Top and bottom, 2 pixels high + if ( $y == $ymin || $y == $ymin-1 || $y == $ymax || $y == $ymax-1 ) { + if ( $x <= $xmax && $x >= $xmin ) { + $red="255"; $blue="0"; $green="0"; + } + } + + print FILE_OUTPUT pack('C3', $red, $green, $blue); + + if($x == $xres-1) { $x = 0; $y++; } + else { $x++; } +} + +close(FILE_INPUT); +close(FILE_OUTPUT); Copied: SwiftApps/modis/bin/rgb_histogram.pl (from rev 6307, SwiftApps/modis/bin/getlanduse.pl) =================================================================== --- SwiftApps/modis/bin/rgb_histogram.pl (rev 0) +++ SwiftApps/modis/bin/rgb_histogram.pl 2013-02-28 16:55:05 UTC (rev 6318) @@ -0,0 +1,23 @@ +#!/usr/bin/perl -w + +# Input to this program should be a raw, greyscale RGB file +# Usage: rgb_histogram.pl myfile.rgb + +my $image_filename = shift; +open(IMAGEFILE, "$image_filename") || die "Unable to open $image_filename!\n"; +binmode IMAGEFILE; + +my @pixelcount; +foreach my $count (0..255) { $pixelcount[$count] = 0; } + +# Read values, three bytes at a time +$/ = \3; +foreach() { + $pixelcount[unpack('C', $_)]++; +} +close(IMAGEFILE); + +foreach my $count (0..255) { + if($pixelcount[$count] == 0) { next; } + printf("%d %d %02x\n", $pixelcount[$count], $count, $count); +} Deleted: SwiftApps/modis/bin/setborder.sh =================================================================== --- SwiftApps/modis/bin/setborder.sh 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/bin/setborder.sh 2013-02-28 16:55:05 UTC (rev 6318) @@ -1 +0,0 @@ -convert $1 -bordercolor red -border 20 $2 Modified: SwiftApps/modis/conf/beagle-ssh.cf =================================================================== --- SwiftApps/modis/conf/beagle-ssh.cf 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/conf/beagle-ssh.cf 2013-02-28 16:55:05 UTC (rev 6318) @@ -10,6 +10,6 @@ #app getlanduse=/lustre/beagle/davidk/modis/bin/getlanduse.sh #app analyzelanduse=/lustre/beagle/davidk/modis/bin/analyzelanduse.sh #app colormodis=/lustre/beagle/davidk/modis/bin/colormodis.sh -#app assemble=/lustre/beagle/davidk/modis/bin/assemble2.sh +#app assemble=/lustre/beagle/davidk/modis/bin/assemble.sh #app markmap=/lustre/beagle/davidk/modis/bin/markmap.sh #app echo=/bin/echo Modified: SwiftApps/modis/conf/beagle.cf =================================================================== --- SwiftApps/modis/conf/beagle.cf 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/conf/beagle.cf 2013-02-28 16:55:05 UTC (rev 6318) @@ -10,6 +10,6 @@ #app getlanduse=$PWD/../bin/getlanduse.sh #app analyzelanduse=$PWD/../bin/analyzelanduse.sh #app colormodis=$PWD/../bin/colormodis.sh -#app assemble=$PWD/../bin/assemble2.sh +#app assemble=$PWD/../bin/assemble.sh #app markmap=$PWD/../bin/markmap.sh #app echo=/bin/echo Modified: SwiftApps/modis/conf/fusion.cf =================================================================== --- SwiftApps/modis/conf/fusion.cf 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/conf/fusion.cf 2013-02-28 16:55:05 UTC (rev 6318) @@ -9,6 +9,6 @@ #app getlanduse=$PWD/../bin/getlanduse.sh #app analyzelanduse=$PWD/../bin/analyzelanduse.sh #app colormodis=$PWD/../bin/colormodis.sh -#app assemble=$PWD/../bin/assemble2.sh +#app assemble=$PWD/../bin/assemble.sh #app markmap=$PWD/../bin/markmap.sh #app echo=/bin/echo Modified: SwiftApps/modis/conf/local-coasters.cf =================================================================== --- SwiftApps/modis/conf/local-coasters.cf 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/conf/local-coasters.cf 2013-02-28 16:55:05 UTC (rev 6318) @@ -10,6 +10,6 @@ #app getlanduse=$PWD/../bin/getlanduse.sh #app analyzelanduse=$PWD/../bin/analyzelanduse.sh #app colormodis=$PWD/../bin/colormodis.sh -#app assemble=$PWD/../bin/assemble2.sh +#app assemble=$PWD/../bin/assemble.sh #app markmap=$PWD/../bin/markmap.sh #app echo=/bin/echo Modified: SwiftApps/modis/conf/local.cf =================================================================== --- SwiftApps/modis/conf/local.cf 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/conf/local.cf 2013-02-28 16:55:05 UTC (rev 6318) @@ -10,6 +10,6 @@ #app getlanduse=$PWD/../bin/getlanduse.sh #app analyzelanduse=$PWD/../bin/analyzelanduse.sh #app colormodis=$PWD/../bin/colormodis.sh -#app assemble=$PWD/../bin/assemble2.sh +#app assemble=$PWD/../bin/assemble.sh #app markmap=$PWD/../bin/markmap.sh #app echo=/bin/echo Modified: SwiftApps/modis/conf/midway.cf =================================================================== --- SwiftApps/modis/conf/midway.cf 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/conf/midway.cf 2013-02-28 16:55:05 UTC (rev 6318) @@ -11,6 +11,6 @@ #app getlanduse=$PWD/../bin/getlanduse.sh #app analyzelanduse=$PWD/../bin/analyzelanduse.sh #app colormodis=$PWD/../bin/colormodis.sh -#app assemble=$PWD/../bin/assemble2.sh +#app assemble=$PWD/../bin/assemble.sh #app markmap=$PWD/../bin/markmap.sh #app echo=/bin/echo Modified: SwiftApps/modis/conf/raven.cf =================================================================== --- SwiftApps/modis/conf/raven.cf 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/conf/raven.cf 2013-02-28 16:55:05 UTC (rev 6318) @@ -10,6 +10,6 @@ #app getlanduse=$PWD/../bin/getlanduse.sh #app analyzelanduse=$PWD/../bin/analyzelanduse.sh #app colormodis=$PWD/../bin/colormodis.sh -#app assemble=$PWD/../bin/assemble2.sh +#app assemble=$PWD/../bin/assemble.sh #app markmap=$PWD/../bin/markmap.sh #app echo=/bin/echo Modified: SwiftApps/modis/demo =================================================================== --- SwiftApps/modis/demo 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/demo 2013-02-28 16:55:05 UTC (rev 6318) @@ -65,7 +65,13 @@ # Select script echo prompt="Pick an option:" -options=("Tutorial 1" "Tutorial 2" "Tutorial 3" "Tutorial 4") +options=( + "Tutorial 1 - Analyze landuse for a single image" + "Tutorial 2 - Analyze landuse for 317 images" + "Tutorial 3 - Create text files summarizing results" + "Tutorial 4 - Highlight top areas on a map" + "Tutorial 5 - Create colored images" +) echo "Select script" PS3="$prompt " @@ -75,6 +81,7 @@ 2 ) run tutorial/modis02.swift; break;; 3 ) run tutorial/modis03.swift; break;; 4 ) run tutorial/modis04.swift; break;; + 5 ) run tutorial/modis05.swift; break;; $(( ${#options[@]}+1 )) ) echo "Goodbye!"; break;; *) echo "Invalid option. Try another one.";continue;; esac Modified: SwiftApps/modis/tutorial/modis05.swift =================================================================== --- SwiftApps/modis/tutorial/modis05.swift 2013-02-28 02:36:11 UTC (rev 6317) +++ SwiftApps/modis/tutorial/modis05.swift 2013-02-28 16:55:05 UTC (rev 6318) @@ -48,7 +48,7 @@ gridmap = markMap(topSelected); # Create multi-color images for all tiles -imagefile colorImage[] ; +imagefile colorImage[] ; foreach g, i in geos { colorImage[i] = colorModis(g); Added: SwiftApps/modis/tutorial/modis06.swift =================================================================== --- SwiftApps/modis/tutorial/modis06.swift (rev 0) +++ SwiftApps/modis/tutorial/modis06.swift 2013-02-28 16:55:05 UTC (rev 6318) @@ -0,0 +1,59 @@ +type file; +type imagefile; +type landuse; + +app (landuse output) getLandUse (imagefile input) +{ + getlanduse @filename(input) stdout=@filename(output); +} + +app (file output, file tilelist) analyzeLandUse (landuse input[], string usetype, int maxnum) +{ + analyzelanduse @output @tilelist usetype maxnum @input; +} + +app (imagefile grid) markMap (file tilelist) +{ + markmap @tilelist @grid; +} + +app (imagefile output) colorModis (imagefile input) +{ + colormodis @input @output; +} + +# Constants and command line arguments +int nFiles = @toInt(@arg("nfiles", "1000")); +int nSelect = @toInt(@arg("nselect", "10")); +string landType = @arg("landtype", "urban"); +string MODISdir = @arg("modisdir", "../data/modis/2002"); + +# Input Dataset +imagefile geos[] ; + +# Compute the land use summary of each MODIS tile +landuse land[] ; + +foreach g,i in geos { + land[i] = getLandUse(g); +} + +# Find the top N tiles (by total area of selected landuse types) +file topSelected <"topselected.txt">; +file selectedTiles <"selectedtiles.txt">; +(topSelected, selectedTiles) = analyzeLandUse(land, landType, nSelect); + +# Mark the top N tiles on a sinusoidal gridded map +imagefile gridmap <"gridmap.png">; +gridmap = markMap(topSelected); + +# Create multi-color images for all tiles +imagefile colorImage[] ; + +foreach g, i in geos { + colorImage[i] = colorModis(g); +} + +# Assemble a montage of the top selected areas +imagefile montage<"map.png">; +assemble(selectedTiles,colorImage,webDir); From davidk at ci.uchicago.edu Thu Feb 28 14:10:51 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Thu, 28 Feb 2013 14:10:51 -0600 (CST) Subject: [Swift-commit] r6319 - www/docs Message-ID: <20130228201051.2FAF29CD0A@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-28 14:10:51 -0600 (Thu, 28 Feb 2013) New Revision: 6319 Modified: www/docs/index.php Log: Link to 0.94 docs Modified: www/docs/index.php =================================================================== --- www/docs/index.php 2013-02-28 16:55:05 UTC (rev 6318) +++ www/docs/index.php 2013-02-28 20:10:51 UTC (rev 6319) @@ -27,9 +27,9 @@ This guide describes the steps needed to download, install, configure, and run the basic examples for Swift.

    -
  • Latest (0.93) - [html] - [pdf] +
  • Latest (0.94RC4) + [html] + [pdf]

 

@@ -41,12 +41,12 @@ depth.

    -
  • Latest (0.93) - [html] [pdf] +
  • Latest (0.94RC4) + [html] [pdf]
  • -
  • Previous (0.92.1) - [html] [pdf] +
  • Previous (0.93) + [html] [pdf]
  • Trunk @@ -62,12 +62,12 @@ the material in the Quickstart and Tutorial documents.

      -
    • Latest (0.93) - [html] [pdf] +
    • Latest (0.94RC4) + [html] [pdf]
    • -
    • Previous (0.92.1) - [html] [pdf] +
    • Previous (0.93) + [html] [pdf]
    • Trunk @@ -81,8 +81,8 @@ This document will guide new users to run Swift in a variety of different environments.

       

      From davidk at ci.uchicago.edu Thu Feb 28 16:02:16 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Thu, 28 Feb 2013 16:02:16 -0600 (CST) Subject: [Swift-commit] r6320 - branches/faster/tests/language-behaviour/math Message-ID: <20130228220216.3E4599CCC2@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-28 16:02:16 -0600 (Thu, 28 Feb 2013) New Revision: 6320 Modified: branches/faster/tests/language-behaviour/math/intdivision.out.expected Log: Fix formatting of output so test passes Modified: branches/faster/tests/language-behaviour/math/intdivision.out.expected =================================================================== --- branches/faster/tests/language-behaviour/math/intdivision.out.expected 2013-02-28 20:10:51 UTC (rev 6319) +++ branches/faster/tests/language-behaviour/math/intdivision.out.expected 2013-02-28 22:02:16 UTC (rev 6320) @@ -1,3 +1 @@ -n = 1 -x = 1.0 -x = 1 +x = 1, y = 1, z = 1 From davidk at ci.uchicago.edu Sat Feb 23 06:46:25 2013 From: davidk at ci.uchicago.edu (davidk at ci.uchicago.edu) Date: Sat, 23 Feb 2013 12:46:25 -0000 Subject: [Swift-commit] r6309 - SwiftApps/modis/bin Message-ID: <20130223124623.D024D178884@svn.ci.uchicago.edu> Author: davidk Date: 2013-02-23 06:46:21 -0600 (Sat, 23 Feb 2013) New Revision: 6309 Added: SwiftApps/modis/bin/world.rgb Removed: SwiftApps/modis/bin/grid.gif Log: Update background image for markmap Deleted: SwiftApps/modis/bin/grid.gif =================================================================== (Binary files differ) Added: SwiftApps/modis/bin/world.rgb =================================================================== --- SwiftApps/modis/bin/world.rgb (rev 0) +++ SwiftApps/modis/bin/world.rgb 2013-02-23 12:46:21 UTC (rev 6309) @@ -0,0 +1,7219 @@ +???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiifffff fffffffffffffffffffbbbTTT??????]]]NNNsssjjjeeecccdddddddddggglllhhhTTT???fffWWWnnnLLL{{{???zzzMMMrrrfff]]]ooohhheee]]]cccgggeeeooommmSSSYYYppphhh```zzzUUUkkklllffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbN NN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnfffffffffffffffffffffffffffffffffffffffffffffffffffNNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + +ccc### TTT?????????????????????>>> + + +ZZZNNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ fffeeeYYYeeeYYYeeeYYYeeeYYYeeeYYYeeeYYYeeeYYYeee YYYeee + + +\\\ + + +UUU???????????????????????????????????????>>>ccceeeYYYeeeYYYeeeYYYeeeYYYeeeYYYeeeYYYeeeYYYee eYYYfffppp iii ppp iii ppp iii ppp iii ppp iii ppp iii ppp iii ppp  iii ppp  + + +xxx + + +%%%XXX?????????????????????????????????????????????????????????TTT   uuu ppp iii ppp iii ppp iii ppp iii ppp iii ppp iii ppp iii  ppp iii fff```aaa```aaa```aaa```aaa```aaa```aaa```aaa``` aaa```RRR !!!?????????????????????????????????????????????????????????????????????????????????222 ddd ```aaa```aaa```aaa```aaa```aaa``` aaa```aaa```aaafffiii  iiiiii  iiiiii  iiiiii  iiiiii  iiiiii  iii iii  iiiiii  iiiiii  + + +jjj???????????????????????????????????????????????????????????????????????????????????????????????????JJJiii iii  iiiiii  iiiiii  iiiiii  iii iii  iiiiii  iiiiii  iiiiii  iiifffhhhdddhhhdddhhhdddhhhdddhhh dddhhhdddhhhdddhhhdddhhhPPPqqq??????????????????????????????????????????????????????????????????????????????????????????????????????????????????MMMhhhdddhhhdddhhh dddhhhdddhhhdddhhhdddhhhdddhhhdddffflll + + +iiilll + + +iiilll + + +iiilll + + +iiilll + + +iiilll + + +iiilll + + +iiilll + + +iiilll + + + ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????lll + + +iiilll + + +iiilll + + +iiilll + + +iiilll + + +iiilll + + +iiilll + + +iiilll + + +iiifffddd```ddd```ddd```ddd```ddd```ddd```ddd```ddd ``` + + +___  ;;;?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????555 + + +mmm + + +```ddd```ddd```ddd```ddd```ddd```ddd```ddd```fffddd ```ddd```ddd```ddd```ddd```ddd```ddd```ddd``````  PPP???????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????pppttt```ddd```ddd```ddd```ddd```ddd```ddd``` ddd```fffddd```ddd```ddd```ddd```ddd```ddd```ddd``` ddd```eee ^^^????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????%%% ppp ```ddd```ddd```ddd```ddd```ddd ```ddd```ddd```fffddd```ddd```ddd```ddd```ddd```ddd ```ddd```ddd``` www;;;?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????444XXX ```ddd```ddd```ddd``` ddd```ddd```ddd```ddd```fffddd```ddd```ddd```ddd``` ddd```ddd```ddd```ddd```XXXfff???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????DDDQQQ""" ```ddd```ddd ```ddd```ddd```ddd```ddd```ddd```fffddd```ddd```ddd ```ddd```ddd```ddd```ddd```ddd``` WWW???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????qqq + + +111 ```ddd```ddd```ddd```ddd```ddd```ddd```ddd```fffddd ```ddd```ddd```ddd```ddd```ddd```ddd```ddd```666??????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + + + ```ddd```ddd```ddd```ddd```ddd```ddd``` ddd```fffddd```ddd```ddd```ddd```ddd```ddd```ddd``` ddd```,,,????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ```ddd```ddd```ddd```ddd```ddd ```ddd```ddd```fffggg bbbggg bbbggg bbbggg bbbggg bbbggg  bbbggg bbbqqq + + + ccc(((GGG???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????jgz?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????MMM + + +###jjj + + + ggg bbbggg bbbggg bbbggg bbbggg bbbggg bbbggg bbbfff]]]^^^ ]]]^^^]]]^^^]]]^^^]]]^^^]]]^^^]]]^^^eee $$$eee{{{??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ??`\w +!=&4:^TZ~%A^e?????????????????????????????????????????????????????????????????????????????????????????????????????????????bbbzzz + + + + + +  ]]]^^^]]]^^^]]]^^^]]]^^^]]]^^^]]]^^^]]] ^^^fffiii   + + +ccciii   + + +ccciii   + + +ccciii   + + +ccciii   + + +ccciii   + + +ccciii   + + +cccaaa  + + +  bbb?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????QShKMb6 'B* 67238Uv{?zs?LEo- 72 <HV^????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????  UUUWWWUUUWWWUUUWWWUUUWWWUUUWWW UUUWWWUUUWWWfff???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhh ooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???XXXfffkkk\\\nnnlllggg{{{dddYYYhhhwwwqqqbbbYYYiii???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????xv????jm?wz?PY?lu?~??{????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????lll???vvv^^^___[[[XXXlllrrryyyooo\\\]]]oooppp```???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\ \ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiiggggggggggggggggggggggggggggggggggggggggggggggggfffMMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRJJJ!!!SSS???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 'AEOh???????????????Z[?"#S3 +H< +RS +N!J7ei?Y]x??????JMl8#DHe??????????????????????????????????????????????????????????????????????????????????????????????????????????????????LLL + + +MMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRfffqqq cccqqq cccqqq cccqqq cccqqq cccqqq cccqqq cccjjj + + +000???????????????????????????????????????????????????????????????????????????????????????????????????????????????xys????????????????????????????????????????????????????????????????????????????????????????C\w{????|??BLe ,Zew????????????rr?03\D JSD +H:: +I @[^? :777[???ad? 9(48^???????????????U[qLRhv}????????????????????????????????????????????????????????????????????????????????????????????????????;;;$$$qqq cccqqq cccqqq cccqqq cccqqq cccqqq cccqqq ccc fffiiihhhiiihhhiiihhhiiihhhiiihhhiiihhhiiihhhhhh """?????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? +, )_f?"?5/=J???????????????:@dBNB> J"dHN +Knq? A) +9@ +FG;+ +?OR{??????z~?=B_ .17O?????????????????????????????????????????????????????????????????????????????????????????????????????????SSS iiihhhiiihhhiiihhhiiihhhiiihhhiiihhhiiihhh fffddd```ddd```ddd```ddd```ddd```ddd```dddeee   yyy HHH????????????????????????????????????????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????????????????????????????????fj?T +DXc?H 6 +E.IAVqi????????he?yw?<F@3 C +JOKKVl? +F AF R7 +ROF +J> b M +WOG[ E*d???????????????????????????????????????????????????????????????????????????????????????????????????????????????@@@vvv ^^^ddd```ddd```ddd```ddd```ddd```ddd```fffddd ```ddd```ddd```ddd```ddd```ddd```ddd[[[ + + +ggg___???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????vupu{y?????????ALNXceZb e?????????????????????????????????????????????????????????????????????15[# D +E=Tfn?V :90!4UTj??????ad?ko?<FG8 +MNROPYr?LGMAIP9W\: U:PWD +U S FIU??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????fffqqq  YYYddd```ddd```ddd```ddd```ddd```ddd``` fffddd```ddd```ddd```ddd```ddd```ddd```dddZZZ + + + ooo??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????fp|+Q[g?????????????????????????????????????????????????????????????????????jo?]b?H+; +G O %iho?_ +B:+>/?as?????KVvIU{7CL A RQVST\z?PL"SA"^N9$^ +S9MY?&` EH C T \?JXa~8QVl????????????oik??????????????????????????????????????????????????????????????????????????????????????????????????????'''!!! ppp ddd```ddd```ddd```ddd```ddd```ddd ```fffddd```ddd```ddd```ddd```ddd```ddd```dddfff + + + ?????????????????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????????????ow?"*A:????????????????????????????????????????????????????????????????????????+1c,2d +K=YVK P\c? Y +I K:? +F6BrPd?%9\2\ 5@N +CNRWSU\|?RM%S +S UMM +OG>K???z?? +K6GNNFXjt? H%0_]r?????????d\O????????????????????????????????????????????????????????????????????????????????????????????????????????????HHH fffddd```ddd```ddd```ddd```ddd```ddd```fffddd ```ddd```ddd```ddd```ddd```ddd```dddmmm  + + +>>>???????????????????????????????????????????????????????????????????????????????????????????????~??}????????????????????????????????????????????????ir?9'+?"NYc?HRv9>T???????????????????????????????????????????????????????????????$ZQ@: J KI M\a? PB N K +I9O1ZGE> +D U HMQVOQ[v?OI!P^HNX =3Ar?????????&Q?E=B I TNX?$.s#W +E88P??????qmjjdNrlVg`DunR??x??t??t???????????????????????????????????????????????????????????????????????????????????????????????????&&&  + + +\\\ ddd```ddd```ddd```ddd```ddd```ddd```fffddd```ddd``` ddd```ddd```ddd```ddd```dddhhhQQQ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????.9Y))E+` F7"S. (????????????????????????????????????????????????????????????}|?%2iUIIKM RTek?L7B H +J:KBE @OI YOSNSLMZo?GBH V M +P O5hv???????2Bf4 F 97UU?es? d6 +A48Qlp?zwp}zsvoUe^DbY8}tS??gohK\V>oiQ??s???????????????????????????????????????~?kqu^?????????????????????????????????????????????????????????VVV rrrddd```ddd```ddd```ddd```ddd```ddd```fffddd ```ddd```ddd```ddd```ddd```ddd```ddd aaa }}}?????????????????????????????????????????????????????????????????????????????????????????????????????????|||???????????????????????????????????????????????????p}?98#VP>B.;?J Fad?????????????????????????????????? ???????????????????????????JIO +T AB +NG @ >6cj?E4>A B8L= OA [GV R Z PT +K +K^i? C +<BT]IK +6DS|??????- ?7AYUKZj?cH!V 6$:97+nl`ibE[T7ncC?{[|rWkaFaVDWL:;@"V[=????????????????????????????????????????????????????????????????????????????????????????????????????????????tttmmmddd```ddd```ddd```ddd```ddd```ddd``` fffddd```ddd```ddd```ddd```ddd```ddd```ddd___AAA????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????~~????yz?cdvfh}ln?BD[Yj ?D> +EV\P +XP"c???????????????????????????????????????????????????????????????'ZAC OA +<? 8W]? +=9E D=3 F=V@\@MN +Y +Q +U K Kbg?B: ? Z!f? +S9)]n????+ +EM@@b^p?[3=.(/B31$LJ=b\<^X8{pP?uUbV at fZDl`ROC5chHLQ1FI6ehU??????????????????????????????????????????????????????????????????????????????????????????????????????????????????555 XXXddd```ddd```ddd```ddd```ddd```ddd``` fffddd```ddd```ddd```ddd```ddd```ddd```\X3    + #!  +ph[???????????????????????????????????????????????????????????????????????????????????????????????}e[RhaO|uc???????????????????????????????????????????????????XU`%&E???%+_HY +Nip? AF SG ST>y????????????????????????????????????????????????????????br?Ue~DRw; +J +J H G +G FAAcj? C; C6 >9<@BGE +LNX]`] K Jbi?E : + =Z]!YV . /5D[x??:F^*;$N LDegav?4 DJ W#q!!SN9;-KM?hi/uv9; > +@F +D +JLY_bbWWaq?O B C!eb "Z +#[:3*DGUo???".H) +C#b JO +[cy?5CB< M "K:?}f{lUznVuiQ???/$F?,leRzwf??z???????????????????????????????????????????????????????????????????????????????????????????????????????????????DE=  +  ccc  ```ddd```ddd```ddd```ddd```ddd``` fffddd```ddd```ddd```ddd```ddd```ddd```[Rq + +! )4$????????????????????????????????????????????????????????????????????????????????????????????????????}`|sVvmPwnQsmM{uU??|????????????????????????ljo?????????????????????YTPwt}ifo???????I|AD Yep?> I QJ +TE +N???????????????????????????????????????????????????}??N\i2 at M'F&EI+ +J +J H G +G FAAbi? B: B5=8;9 ; B A +HKZ` c#fb!d`{?]ST$ha X(`!I:1#@???@Kg*.$_ V +Radv?"6&K,Q4/5BFcLMESTL__;bb>b]7\W1YP3VM0QH'\S2f]<_V5???WQ1YT6FA#ieH`\?PN5KI0^^D??i??????rq\PO:HG3~j??????????????????????????????????????????????????????????????????????????????????????????`_d  +  + bbb + + +```ddd```ddd```ddd```ddd```ddd```fffddd```ddd```ddd ```ddd```ddd```ddd```pm? MXR?????????z??BMzS^?~???GuW[?SW??????????qq?RO`xu????????????????????????????????????????????????????ps`ikSfhPlf6c]-ha3yrD|wO{vN??m?????u????????????plmKHO???ig[??u????????};5'>:1???gfl{z????+0N2 ?YVhv?BP TQ\ +C/:h??????????????????????????????????????????????????????Tar)6G4( ;A +J +J H G +G FAAah? +A9 +A4=8:9; @ @ DHW!]"`&d"c$e[~?c`d^\W)b&QB03EPpZe?,8b- +D +SW +_cr?6)5OHTn,3M0 )/;9<5BE>SS;]]Eb^A]Yp >'IJv????????????????????????????????????????????????STO\]XhjUkmXhkNWZ=??Gsn4lf2wq=zRzR??g??w?????????a^Y??? gbf307IFMNH8??????haOslZ??????`ZN?????????2I^Q]r? ;OR[&.m!&Njo???????????????????????????????????????????????????????JVn'? +C=@? +J +J H G +G FAA`g? @9 +A3<79;=?? ?CM!SQ!UVUSu?VW_V[ +"^'c PD7;CV`?MY?"LGGDMjs? 5 +?R]qPY^8AF%!"($GJCBE>??3>>2EE-PP8[[9bb at ef<_`6Z[1OP&??nHGON"ED87 KJgd7yvIurE`]0KH?<knCVY.GI!MO'Y[6\^9\\@\\@??????????????????????~yFK-FK-LP5aeJ??u?????????????????????????????????????????????????????????[[Y + +  qqq ```ddd```ddd```ddd```ddd```ddd```fffddd```ddd```ddd ```ddd```ddd```ddd```iyT +>I[Q\nIR{&/X:G+4y^EL$> &?!Dq{?/:;#ZS M26cPVv]c?U[qEKa1|????????t|?ks??????????_axMNRdeiGH812"QQ5hhLa\%sn7xJwpBjdD}wW???????????????~z{?~?-(,VTW???????}f[EqfP???????}orl^??????u?*#VJ +OT_w? ;N +HR#,e@????????????????????????????????????????????????????????P[w; +<9D +R +J +J H G +G FAA`g? @8 @2;68BDAA +;?BG? FGEXo?@ +BJV` +%c $bKB;@ +?(Q*6^1=e*;f!LA +"Oqt? < +&7=SJTKPZQ?H7:C2BE>@C<@A9CD\^_~??"\ + Z=Bych?``|?????????????????????????????????????????????iomFLJ19DW_j*5U C$\ +UE +J +J H G +G FAA_f??7?2:57LMEC 3 +4-2.A/>Q)GP3PYC#??nFJ)UU1CCNJ$D@IBXQ'cX+]R%ZO"^S&KL*MN,QS.QS.EG":<@BOQ*??_Z]2JM PS&GJFISV'WZ+S[,NV'GO AI?FAHEL"GN$MT+IP'06ioI??nNT.8>TZ6PQKBC=RSM??????????????????????????????????????????DDD```ddd```ddd```ddd```ddd```ddd```fff???KKKdddnnnYYYccceeeiiiffffff ffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffdffdffdffdffffffffhffhPPRyy{cbgVUZ???TSYYX^qpviaye]u`Zha[ihdalheceXZ\O]d\^e]Yeq[gs]k?iw?s??}??q??CV?Wj?bu?]p?_r?[kxl|?u?zy?~??x??}??y??x??q??o??f??n???g???nzxx??p??Qd?Zm?dx?fz?ew?bt?hwzl{~??|qwmnqzy|?yw?ki?pn{????????t??y??x??h??r??g??g????????????????????????????????????????????????????????~yu??????????????????k??_v?Zv?Qm?Wm?aw?[p?Uj??????~?????????????????????????????????????????????? ??????????????????ck?`h?el?el?_e?\b?\m?\m?^m?]l?]k?\j?]i?]i?{??GQudl?mu?X^?bh?gl?ns?]h?U`?Wc?bn?ou?qw?}?r??}??o??}???{n???afipw?ls?au?`t?ho?jq?op?op?dt?aq?X~W}~R{?Qz?^l?`n?qc?rd????Zc?hs?ny?gt}n{?p}t????????}??r??w??u??q??r??x??e??r??w}?_???y}\??|????z??t??p??x???????v??k??x??y??{??{??y??u??q??n???wxX??o??|??t??t??h??w??l??n??r??t??t??s??p??o??t?????u??j?????^??m??y?????|??u??u??????????????????????????????????????????????????~ii]`c\gjcpvtlrpakmYceT_eWbh\irboxkm_??wXZMDF9}tZ\QabZpqiefaefaffdffdeeedddbbdaacffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffff ffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnfffffffffffffffffffffffffffffffffffffffffffffffffffNNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + +VUZ   +*#1K,:T!3W%IE@Zk?"N94& ->.:8JVTBK:EN=LP7OS:RS4RS4QP2ON0MM]]+cgFVZ9???9 at 94@N".<$9'<+8 .;&20+754 at 2:F8:<.FH:YX^UTZ0.D%"!/JIW???dhZipNX_=DN+MW4 at I.AJ/MQC{q??????nqh at C:894YZUWWW????????????\Y`QNW>;D$3J5D[JJB@@8N@%qcH??|???bl?9Cf #`!^%WO; +$C]q?';`.M.=\JPf?????????????????????????????????????????????????????????#)I55 : J JMLBBAA>=<;IR} 4 : +>, +7 +3 2 M +O;; !(0%E.Q/R![T ] +\\e?&O(I$-N"-?(3E)+)35=G>5?66>1=E8BH:@F8BH:IOAJP.OU3MS1:@??h=@!TU5NO/ON/ON/TQ.XU2\X3]Y4\W1ZU/QR2QR2QR2PQ1OP0LM-JK+HI)}~^BC#HI)NO/IJ*KL,;<DE%@BBDEG HJ#KM&LN'MO(MO(GI"Y[4OQ*TV/??cOQ*MO(KM&RS3MN.FG'BC#DE&LM.UU;[[A??p??v??}??{??x??x?????????f`H_ZDwr\???????zIJ<   + fgbNNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ fffeeeYYYeeeYYYeeeYYYeeeYYYeeeYYYeeeYYW + +  4=GN&S!N>85!315'+=A&lpUz}h????????}???KIV@Res.AO:@4HNBWR5xsV???tup!4^ FW`_X?E`s? ? &8F`?????????????????????????????????????????????????????????:@`4+3< IFJ N +C +C @ @=<;:bi? @26, <3-?P ?6+36GN/NU6AIDLBK4=z?e+63@,)6"09 at 2;B50N% > A=Z$h_&i 1n/l YQ +MQhq?(G$:%0F3=IAKW1:?2;@)//#))$()+/0./4)*/**2119JP4IO3EL-;B#??qBG'LP-?C BDFH#NL&NL&KI"MK$TP*ZV0LM+KL*IJ(GH&EF$EF$EF$EF$??rKL*AB BC!AB HI'78=>=?>@@BCEGI"KM&PR+RT-ACLN'ACQS,??jWY2NP)FH!FH CE@B<>8:6846461289?@ BC#BC$GH)QQ5ZZ>????wX??i?}`c^AjeH`[EWRC/8=)69=@#RQ%a`4kh1mj3]Z;VS4QMDMI@;8C'$/"-'+6x??6B@#83-(*7*@M"9X)@_>:;512" +)MP1]`AcjAy?W??y??{z}rLOD}?<>MNMoFEgBV]")$4=,JJ.{{_q{z#-, RJj'w ,s$kQ "To?%<&1C??????????????????????????????????????????????????????TZ~18dD +G +CK PS +L R ZOOON +K J I Ilr? I9 A<L +E +BAW$G@%.-ENMRZ3BJ#?I +;E 8C 1<~?]/<4D(8399?#A=4:6-* 9'?;5|:??|4q(J(J 6A1GRx??/;7*5-5 at 8COAR^PEN=HQ at JQAFM=ILCLOFHHF==;:9>@?D?H3 at I4DL4AI1??yCJ)KR)@G@F@FAD@CCDHI!PN(US-MO(KM&GI"DFCEEG GI"HJ#??pMO(DFDFDFMO(ACJL%DFCECEDFGI"LN'QS,UW0LN'PR+ at BMO(??eTV/TV/UW0QT%MP!FI@C>A?BCFEH2569 :=:=8;:=ADGJ??te]6nfAe]8G?QI%OI'MG%SL/ZS6d_BidG\V>:4   |z?   ppp iii ppp iii ppp iii ppp iii ppp  iii fff```aaa```aaa```aaa```aaa```aaa```hj]KHYYM;;/? C e Z +V TD$T*>G:NWAVC at UB??yY[6ST,NO'FHNPJJZZ$ONMLKHHEEAD@F>F>PIJCD@<8??e/09=$6:!25/233 +==PJYS!]TRL*@:/)-','+)$(#$"#????KA2C;.?7(;I1DR0T1U6.+KC at SPA[XI``DKK/<@MQ0pv\X^D8=7lo?14GNQtFIl!37 !37OVDcjXux]??????HVYKN q)z +(n f K +"Oy??%3 at JT]???????????????????????????????????????x}?EJt!%R26c`f? 9: +CI DF GF?H +SIIHHEDBAY_?>5@7?:?? +G , +$.&JTLNW,1:8B/9-9-9}?V,:/@%6 .91<=?GILJ5EC.&3F&9 /a6h +L1= :FIR%HQ$MS/QW3JM2G2??s5?BK?HAI8@ +1728?BGJII#FF FH DFAC>@>@?ABDDF??_FH FH GI!ACGI!>@LN&>@<>:<8:9;;=?AACEG LN'@BNP)??^DFGI"RT-SV'OR#JMCF=A9= 7; 6:EIFJEIBF?C>B?CBF??b=: +96 B?FCb_4]X0RM%b]7gb*@EGBEUX!DGCFEEDDCBBAA?A?GEB@EE#HH&??y8=;A'4: 487; AAJJ(XP)[S,]P$YL RL*QK)KD2B;)72,83-AB4NOA??~TZ>PZ?T^CNYUP[W;BU=DWTK:bYH`YG\UCXTHD at 4::2PPHUVX;<>/3>&|??%,?4;U#=#))06KL<`aQ??z??????>F +.A.%8% /F;RJbMe$K6!H34O ;V??XHXGWEU>MCR +>KN[=HAL +KRSZ$NQ$ADAAHH"$/))4.;F6CN>??z6D!EQ!FR"NY!BM8A :CHN PV(MR*FK#KN#JM"IL!HK HK IL!JM"KN#??fPS(RU*RU*IL!LO$BEOR'LN'KM&IK$FH!DFDFDFDFBDNP)LN'bd=??oJL%DFLN'IL!NQ&TW*WZ-UX)NQ"DH>BIMHLEJCHBGAFBGBG??qU[-]c5X^0HL3JXe&4A*(#J-T#I8$<+C"3+'806<:@KFQL??mCC)@A!CD$?AAC+1/5-4/62:4< 5<4;291848-129:A ??u'1$0(%-,4<;&BA,IA*JB+PA*QB+MH*TO1UN;KD1 at 8+B:-MI,YU8??WJJLLSS!RN1VR5IB=bi?;3 +A120 >@ 4 +$7CN at VaSOX-:C1:)2,62<~?g$/ +)7 )7 5L:*A/'7%50?9H4M&4M&,95B@YE^'F7$C40B0Bu?M6E7D 8E +6B?K +;ELV>F +DLRV#[_,UV,GHGEOM'!--(((4(5A5??t0>8F4B +:H 4B0;1<6>:B9@6=?B@CADBECFBEAD@C??aEH?B@C@CHK;>CFGI"GI"GI"FH!DFAC>@=?=?>@68QS,??fDF:<?A8:>@FH!MO(QS+QS+OR%LO"MQKOHLFJGLGLGLFK??n/?,9 +9F:FKW)EL ?//1248>CI'07 +07 +09 +3< +7CI:G8E=G%0:.93> ~?s!/#2.*(3#8:-<>1B90C:1M?6SEH%5@3>/8 5>*25= 58 ;>HI!OP(FC"522.954?C%04(5+8E;???EHGJKN!MP#MP#LO"ILGJ??mGJ8;=@HKY\/JM NQ$EG GI"IK$IK$HJ#EG AC?AUW0EG +-DF??dMO(IK$OQ*RS3NO/HI'EF$GI"NP)VX0\^6TW*PS&LPJNININGLFK?i6K AT'GZ-1B6G;HER&CLAJBHDJJM OR%TU)UV*OW&`h7GN"U\0??w[a=X\Crv]  + +  +lll + + +iiilll + + +iiilll + + +iiilll + + +iiilll + + +iiifffddd```ddd```ddd```ddd```ddd``` bfW +  +B) +oV7v^BpXI'2(3 8C=H 3>2=?J"DO'=H >I!?J"AL$AL$?J":E5@1<??i=@:==@03@C?B@C8;;>>A?BH/OY at AS97I/RN1:6LOVy|?_i?5?p"2n#3o66%."???sldo]SO=3EO4 OZT???u??)9l4OM*SH-m}?????????????????????????????????????mt?N%5 /-<;?:>AAAA??mB?KG!A=?@=>6@ 4> +,A,A'C(D1B3D8I;L=NOH@J85,%(! r~z8D at SeeWiiWb8P[1LW-HS)=H/:*5 /:7B6A5@4?4?5@5@6A??`698;?B7:HK GJHK FIOR'TW,NQ&AD8;9<>A)4$+6&2:/-5*x}w"'!-/*&(#57,8:/<>(<>(>??@EFHICEDFJH!NL%UK(RH%K>D7??pQF*XT;a]DHM6LQ:7C+-9!C=%_YA???|{?29g ::7)7R8'-++1/???haNaO9XF0 !+5 BMJ%`;8,:GAO\??????????????????????????????GRn+6RE < A:@E J J 8 +9oq?79HRIBD;4YOCOE9?; S +T P +QH +G? +>`h? 83 ==H +H JN +G&7>HSOEA46463 (=9*2#o?}4&3"62301&0",&0#- >= +$?*E23"67,7,7698;{?_%4 '75E):0A +*<-?0B+=4EDU>N)9$30?8>7=>@=???i@>HD?;>?=>6@ 4> +-@-@*D*D.? 0A +3D6G9J:K;L;L??f8I9J@Q5FBS=N;LEQDPDPCOBNAM@L@L>J;G=I:F??c7C?K6B>E@GBIEL IO#LR&PS(QT)NO%PQ'TR)US*VS*TQ(SN&QL$??vS_1LX*IU'DM HQ$;BEL @GAHCIEKIL!KN#LO$LO$VR,VR,YV+UR'??pQO][*XV%IFTQ&]X8]X8XQ>JC0-%   +dbp  +```ddd```ddd```ddd```ddd```fffddd```ddd```ddd```ddd ```ddd```ddb B2 +3(Q;MsCU{1Ji";Z.A1D%=A-EI???6G=;H6*7%>I.9.9@K!BM#2=3>DO%2=0;-8,7 +.93>9D):;;<AAGG!KL MN"NK MJMH"OJ$TI)SH(PB(K=#??rNB,XQ>_XEBC1AB038$05!d]K}vd|v?@:F%8UXE???PG&S@p]<'.@*1;I5?P I\6 3 ,81=I???????????????????????????&< -",0>>?@YO 8Brw}05;TT<__GfeI??h???lmg:?\ )0 +JO P K L +G F @ ?bj?72@ AMH E?@ &&;AAMK=;.4173$91&'g?t.!!1&607/6(3&1-'+%+6*5)2-62& 4()6 +8 +4=8A{?_$3&62B'8.?);-?/A+=2C @Q=M,< (7 2A3;2:9>8=??d:;DB:8=><=6> +4< .? .? +B +,C .? .? .? 0A +2C6G9J:K??d6G7H>O2C?P;L8IBNBNAMAM@L@L?K?K=I;G=I9E??c7C?K6B5>7@:C?HEMJR#NT&PV(ILKN!QP$TS'VU)WV*XU*XU*??oTW,QT)SV+OU)X^2MT(Y`4 at G?F6B9E?9:77<<JH!SQ*VS*TQ(VO%OHG?D<G="MC(QE5SG7???LB8G at 8LE=:7.EB9EE9LL at MF>KD<>7I) +/2.SDEc*+I9=<:>=lmNghI??xOG fV2??b:Am >26[\V PLBA += +lu~????????????????????????-:Z &PEA += @ +A +C + D`N7 Ioy{#-/NU6krSsyW??????~?}!F'GZGH G G E E +@ ?dl? +;2@ =I +>9 *3%- :B5EE66*3/87!9 +& e}p.!%3*8'2(3$3 +%4 "5!$7#!80!803)5+$8#7&7(91>6C{?_#2$40@$5,=(:,>,>(:->7H7G,< *90?-:,9 +3<2;??_58 +@>75 <:;95; +39 /; 0< -? +.@1B/@ ,= +<,= /@ 2C4E??a2C4E;L/@ K;H6H5G5I5IKJ,KJ,PO0ML-??xLL(Z[1UV,WY*PR#BD9; +ACQS"TV%NPKLD56. + + + + ihp + +  +  ```ddd```ddd```ddd```ddd```fffddd```ddd```ddd```ddd ```ddd```^e & +. 9 +4 +A +G$PQU(b+e&aU$V0b,I,I +22 44p?k%< ?H:C1= +7@:*D>.A=:?;8???97<,+198>;9>NLQPNOVTUzw~JGN%!:,8!F5350bcDOP1??}pkK?y`??lR +CE L SL P\J<;#.NQU^????????????????????????FOlFE NI +@97< > >WD5 +Jhv#,6 +@ +52 ')26?$;?15(5-::&:&*+!"is1%-418"3"3#4%6 #8%:%;$%;$&=!(?#*@'=':&9*>.Bz?^"1"2-= !2*;'9,>);%7'8->.> +*: (7 *9'9&8.: +.: +??Z17 ><42 86 +75 36 25 +.7 /8 +.;/<4E1B-> +*;(9):+<,= ??]/@ 1B7H,= 9J4E2C7I7I7I8J8J8J8J8J8J5G7I4F??a1C9K0B8I8I:H9G9F8E:D:DCKCKCJCJEIFJHJHJ??mVQ)PM$PM$JK!QR(CINT(R[.QZ-KX*HU'BT$AS#?S">R!GH(HI)LM+JK)??wIJ(VX1RT-GJQT'UY&QU"NSPULRDJ SVCHK8;>+47$13%(* +`a\  + ```ddd```ddd```ddd```ddd```fffddd```ddd ```ddd```ddd```ddd```  ) +*ev? +IM +#TEN!P +Z0O %D"@,J7R:U>NBR=>AB0K:/J9??s->5B+8 1= HT"HT";GS_-??Z??Z]i7+7.:1= 3? +2> .:)5&2??Y25 +9<FIBEWZ/X[0Y\1JM"@C7:58 +9<:=36 ,/7:47697:??k:;>>11 A=A=E?HB MC(KA&E:$@583<7@?+IH4FKG?D@/7D$,9s{? +, +('-E14G=@S13B.0????GN`#F:2468489DHIX\K15$???rrhcad:8;D +FPT +OBBO@ H-JSp????????????????????????6<06&6)98+9,+1%+q?z"6+0404&:&:%8 $7 +!64 +32(<*>,B*@'<%:&<(>z?^!0 0*: 0(9&8,>*<&8#4%6'7(8&5 +$3#:"9*;*;??W/7;<122020/0./,1 -2 +-5/72C0A +.? +<):(9(9(9}?Z,= .? 4E):6G1B/@ 3G3G4H4H5I5I6J6J6J3G5I2F??`/C7K.B +3F3F5F5F6G6G:G:G@J?I>G;D;B;B3!?1&@2';=%<>&:@4=C75BK-:C-I#?Th?- 3,S"+L )J30">/H!-WK < -#;CNS[fgoq-57nt?A@^e? B7 +<$ +1 +3"@2?+5B.=E8@4=1:%8 +#62+5.*4(2w??%9.02 +-"7 "7 5 4 1 /-,0$5 )<*=%<#:#:%<z?^ /.(8.&7%7+=.@*<$5"3%5(8&5 +!0"<!;*=)<?U.8;<12.*.*,*,**,,. +1 +,2*;+<,= -> +-> +,= +<*;{?X*;+<2C&74E/@ -> +.E/F/F0G1H2I3J3J3J1H3J/F?`-D5L,C +2G 3H +4H +4H +6H6H9H9H;H:G9D 6A 7@ 7@ 9B :C z?X9E8D=I@ILU(FM!SZ.?FBIHN"KQ%MP%JM"EHBECNCNGQBL??k>GKS*FN%NV-PX/JT"AKBMJUKWFR>FGOQY&V^+U]*RZ'QY*QY*??{DJ(=?135' ```ddd```ddd```ddd```ddd```fffddd```ddd ```ddd```ddd```ddd```" .5K R +%a(dXz?$d'c/k"W+`2a ?nH2O94Y8:_>@M/<=9HDB8I?QNTQ??{MX-SiEPfBLY$ /</<2? +6C8E??aCFUX-eh=VY.SV+:=),=@?B?B:=47 36 8;>A53$,*)'*(??f?> QM*JF#<6?9C8">39+ :,!B30J;8AF26;'"-'" +, +,??^y?J +P$8j+U$N +:@'>`*L"R +L AIE7/FQcv??7CQS\} 3 IK 7 9?A@?E !P;&Z`x??????????????????su? +* BA +H J NVM@3< +72 % +'BJao?UbTScK@ > C(#/077>>@?Z`? +D +9>#18&2LIV:GT8FO;D6?3<#9 3 -) +1-)5*6|??(91// ''/ / /0 0 +1 !0!0$+"5': %; +#9":#; z?^ /-'7-&7%7+=2D.@&7"3%5*: '6 !0!= <)>(=??V.8;<23+'+')&)&((***. ++/#4&7*;.? 1B1B/@ .? z?W(9*;1B%62C.? +<-D-D.E/F0G1H2I3J3J1H2I/F~?_,C +4K+B 8M8M6K5J4H +3G 2D +2D +8G6E 7B +5@6?8A +;D +=F}?`:N5G5G4A:G2;=FEKJP$UV,[\2_\3[X/VQ)RM%DPDPGRBM??h+QN;BLFPBO9F-@ 3FFZ)Ym39 5; AGLR"??vHS(FQ&?J$/,7 +/:7B1;0:.8,6)2&/%.$-.8/9;7>:???@48H96<-*H?F=@??>;?>B!@BACED!QIN +K\^` ]LZ?\>A/%0D+35>FHUR%VS&XVARP;20>4 += KX-={RWn?4#K8 J +K JLKLEF7+:[!&9??????????????????+3d0< A +C; G>>AADEFG IF +NVbh? J MEBBCCDEEFGM +F E84:=ee?;+ 9 !,BO;u?ndc7YX,JQ0GN-4K'>@D79 *,f +hjz?-Q > ++6.$$& -. -2&( $ +(7$?"? 9{?`.A311(< /"6(=(='<&;%:$9#8"7"3$5+<,=?W,;3@ +'45? +1;-4'.&*%)'+)-%1(4,8 +/; +/; +,8 +(4%1t?R,8 +$0(4+7 2>!-%1+=,>-?/A1C2D4F +4F +5G 1C3E 2D??[4F +9K,>8J8J7I +6H 5G 4F +3E 2D6H 5G 4F +3E 4F +5G 7I +8J??^6G,= -> +0A +:K,= 3D5F7H>>AA?I3='51?FW+_pDk|Xm~ZbqP)8x`??????utVb]?HC%????????f589=@D#26<@8=>CAF=B8>9?DJNT(??j7B5@7B)4 +6A5@6A%/ &0 +(2*4+4+4+4*36=7>@>%@>%???C84PD4I=-70<5 ?>A@7:'-0 1)J D +H GVX\ +Xfu?b 32&+4C5;7GMIPN%SQ(UR?MJ7,*8 1 +<9E#`SYo?E H +2 L LMNMNHH 09`f|???????????????{??6+= B C54;;==@AAB<8 +A J\c?>?8<<==>?? @EI +A?318;np? + I5 ?)5 776<44,$i%jp??$7W.M ?/+'''&)$ #' 27 +85x?]1D(< )= )= +4H)=4H$9$9#8"7!6 5 54-? ,> +2C2C??`3A .8*4'/#+#)$*(+*-#/%1)5,8 +,8 +)5%1#/??a.: 5A&2/; +$5%6&7(9):+<,=->4Hl?}/F at 9H+;J-;CD:@5;6<>EFM$??a*5 +'2-8 +$/2=(3 !,)3,60:4>6? 6? 4=3<*-+.20-+}vc/(B<B<@>CA@D!>B059!&* +:0 G DIJVWUR_l? M$!29?7:/CF;QQ-YY5]^NTUE43A" 4 +;? IN +WTh?$W "L>OOOPOOII H-KUp???LN]??????KHOgp? +4( 0,9 7 +8569 : = = +> +> =8? +F]e? <@9899 : +; +; < <H +J @ =32< ?VZ?B47"0+<*;L:ah2EL(2&0(< (< >;. +* +T R`s?(F%D ?55 5$"7& 4+,# +,03": +#; #=#=k~P*='; +%91!5)"6*?*?*?)>(=(='<'<#6 3#4 1r?U"2.;&30;.9-6 +4 ,3 /6 385:,8 +.: 1=3?3?1=.: ,8 +r~P/; +)5'3 ,&2)+7 (8)9*: +; +-= .> +/?/?-= /?3C,< v?U%54D2B9I9I8H8H7G7G6F6F2B3C5E6F7G7G7G6Fv?S5F3D2C*;,= 0*;8I8I8I8I:K=N?PARJR!EMBJ9A??\4< CK?GGODLCKHP!PW+SZ.OV,JQ' &=,C-a 1e%-n&.o-3S06V??~CR54J +2H4KCZ,+ at 1%:+ #` +$a +&\*`,U'P +7.  +abfiii   + + +ccciii   + + +ccciii   + + +ccciii   + + +cccfffUUUWWWUUUWWWUUUWWWUUUWWWUUU +LP\ *, - 9<KPX +[NS +L +L 4&:%901EG?????????????????????ZbJ1:5>#.7.72;&/$. &0(2%/ !+!+&1 ,7??`0;4?>I6ADO%=H 8C&0 +(2+5-7-6*3'0$-79,79,<;'43?^63LKPO!DF=?,2$%4 +/IIEDFFKJ +D BO]? @.&/@@C -A"61E#8#8#8"7"7"7"7"7.C)>*<%7w?`(86E/>)5(4'1 %/ +'/ +)1 *2 +,4&2(4)5+7 +7 )5(4&2kwI0<3?5A/; +5A.: ?K"1"1#2$3%4 &5 +&5 +'6 4C8G=L!3Bz?^(7 M",;,;+:+:+:+:+:*9#2%4 (7 *9+:+:*9)8 +l}I3D9J=N6G;L2CAR6G5F3D2C2C2C3D4EKW)IU'IU%?K??_7DIV JW!KX"ERAMEQ!OZ/U`5S^6NY17;15"D +<M Q M&Sv??J\\Le>7P)#?3O4O$A\1+j%d YUPPHF66 +SYgUUUWWWUUUWWWUUUWWWUUUWWWfff???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggg gggggggggggggggggggggggggggggggggggggg???JINTTVggi__]iighidopkghbghbghbghbfgbfgbfgbfgb`bndfrY_oSYi???NXqWe?ky?\m?`q?bv?h|?i}?i}?g{?fz?^o?gx?t??{?????????????????s?V??`??j??l??p??j??v??????????????????ky?bp?ep?Wb~???????????????????????n??q?????s|?g??nx?a??j??l??i??h??f??f??g??i???]h=mxM{?[p{Q??a??f??k??g??i??l??m??o??m??j~?h~w|}u}?eux]???wzO??e??f?????|t}?hq?[i?^l?_s?ey?lu?lu?ju?hs?er?cp?cr?ds????Q]uinq{????r??{??a??j?????????|?zor?ps?w{????qw?u{?[e?eo????Vd?Wh?ev?gp?gp?eq?eq?_r?_r?]s?\r?Vl?t??gx?Sd???????QVsns????OZzhr?q{?ak?nx?cl?W`?bk?cl?cl?dm?em?em?fn?fn?iq?\d?W_?V^????S[?ck?em?bj?ck?ck?dl?em?em?fn?fn?ir?hq?eq?dp?eq?eq?eo?dn????MU?^h?[e?GVkbq?y???????k??`~?y??{?ry?lw?H|?Mj?Tj?Tg{?\p????Pf?`?ra?sp??r??v??w??y??w??x??x??s?lx?q??i??k??^??\??V??W???dwIm?Pt?Wp?Qx?Yq?P??`~?[~?[~?Z?[?Y?Y?Y?Yq?^l?Yi?VczP???f{Rv?_p?Y??n??m??k??i??g??g??f??f??`??a??b??b??b??b??a??`???nzLw?U|?Zv?Tz?Xo{M|?Z??d??d??d??e??e??f??f??fs?Wv?Z{?_r?V???gvKz?^}?a??j??j??j??j??j??j??k??k?c??d??f??i??j ??k??l??l???p?Mw?T}?Zy?V??]y?V??f??g??g??e??e??e??f??g??h}?^}?^~?[u?R???o~G??V??W??`??Z|?^}?_??p??s??y??v?????{{??r?~n??o??q??t??~??e|???????s?tt?u`{Z]xWw??q??h?e|?b?d??d??d??i??e??[o?Pd????S]xZ_rej}dchdchddbddbde]ef^egYegYgi\gi\ghcghcgfkgfkgerger???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiiggggggggggggggggggggggggggggggggggggggggggggggggfffMMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRMLQ + +  +%'Wd?09BEHPSSQNKO +$V2M(=X2G at 3HA5F$2C!??m at Q'5E*.># 0/%54+;*:J;AY"(@ ++ /< +G H5#I(1BV_p????????~???9G#),;+9?4:??]7=BF/;?()'B +@GGDEJJE A 6 6/3dqz,9B<@2AE7C>JE%IA[S%>F9/7*  &47>[BIf1 7?IJT?37 < C CEFKKMMSM R%X C +8% <@ : +; +; < = = +> +>A +?5754 ;7KU? P!W!W +$ 3 5.7LE.A&9 #-,#-,'$*0D.B +'9O.D]s?M4@2>0(2*4(4(2!4#!9%=#1 2 +"4$6)8)8(8'7k~P-@.B1E,@ +0D#7.B + 5!6!6"7"7#8#8$9.H)C'A!; r?Z#; 0F*@&7 +&7 +%5$4$1"/!. -$0$0#/#/#/#/$0$0nzL2>5A:F4@5A%1.: #3#3#3#3#3#3#3#3.> +/?3C,< w?V%54D2B(8(8)9)9*: +; ++; ++; +&6&6&6'7)9,< /?1At?Q5F6G:K6G +-> +,= ,= -> +/@ 1B2C6F4D6G2C??Z0A +=N8I@P#>N!:G-5B(094-61+2:+2:+ + -124.0 +%:3Je?)F1F'BW9RWE^c(B95, 6 6 C %H*Z*Z$b]&d#aF >Tb? 0 +)4 MMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRfffqqq cccqqq cccqqq cccqqq cccqpu "$--1 +6 +: @ds?NPSYWQOIIEE/[0\:O,H]@XKC[N?T36K*???AT8-11 +;Qc@ 9< +A +QM:7#M 6`mv???????????kEL"5F4EP&8%8%8&9)<-A.B.B-A??e8C;F8A"9A19/7.6??a3:346#$& E +Gb dWT;9 +JKC +? +37 0%9???>JHBD,AC+E>NGNA ^Q?IA3=5)( '/<@HUFMi>Ea5,CChp? : D +; +@ AEFLMRS +%cVN$]C6 F.px?E53,37<>> @ @ C +D +D E J BE I[b? +A IF?? @ @ +A B B C?>8< = +;<5Yd? +H BL ' !822G #8$4&6$(3!%0!.%2)<&9/C';Wm?R'LDB,"E/%G."D+ ?=%@)D.D(>(9):3@6C 6A1<v?[0C)= )= $8';).,A -B +-B .C +/D 0E +1F 1F (E +#@#@;n?R8)B ";+? ++? +-? .@ /@ .? -> +,= .: .: -9 ,8 +,8 +-9 .: .: t?R/; +)5*6)50<".)5,=,=,=,=,=+<+<+<&7$5'8$5s?M"3+<#4->.?.?/@ 0A +1B 2C 2C 2C /@ ,=+<.?3D +:K>O~?[7H1B1B0A +7H*;2C:K9J8I8I9J:K BDMOVWC#<|W GH7 M6\d?21 D B +G;:??BCEFHHDALUag? +H +H@CCDEEF G GDD +>#D'G$DC +9ky? +G7L,1 "84'<% " +) 5&(=+4,5,= '8/C*>^s? _([PF'#J+)M)%I%?8 +570G%< 1"3/<5B +4=.7k~P$7 3&: -A9M+? +1E,A ,A -B .C +/D 0E +1F 1F ,J)G )G %Cu?V#?.G +&?":$<(=+@.A .A /@ /@ -9 ,8 +*6)5)5*6,8 +-9 |?Z0<#/$0)58D/; +9E);););(:(:(:'9'9*<&8(:'9z?P);.@!3#5#5$6%7&8'9(:(:+=(:#5 2#5*<3E 9K??e=N2C3D5F?P1B7H0A +/@ -> +,= ,= -> +.? /@ .@(:*=-@ ??`6I8J(:?N1FU8FPR6 at B!F 4 A +Fr +o[ _T WQMOo? YT +*b+P*O&8,CUH_K9P<=?.0)I+K-g0j"h(n"e"ecv?H12LK; 8   iiihhhiiihhhiiihhhiiihhhfffddd```ddd```ddd``` ddd```  bdO   +0 ?BH +GIKW^\`cw?`[ aSPJKJJHE"+.,:C8FO7DT*7G#? 3fo?8 :A= EEGC@A I7. &8.9= '4"~?y???&5":H4C5DBQ&Sb7P`1:J(8%5#4&7*<.@/A-?+=);??c-126BF#8<?C 8<;??C 7;.2*. +/ .21515,5.70A1Bw?z4 -E5ZT +X VGJ32gq ] T"& 36/??h>?IJ ST*CEJL%?C":>IK AC;@KP'U_TNXM%4I)79 8:^l?6 -0 E E E E E E E E F F E +D CBA@`g? =6 ?6 +?;= +A +A F G G +HJJEGCE]q?IHLN +KQT +RK OZ5"?'0A+4E .7"+0+Zi?GQ] NUDEL +7 3; +U"f'G;99]]lx? +C?@ +*<1C :;$>?'=&$:#): +): +1C .@)=&:#:&='B*E??a3H4I8M*?3H+@&;'<(=*?,A/D 1F +3H4I9N6K6K2G?[+@2G(=)>*?-B /D /D -B *?(=)>)>'<&;$9#8"7!6|?X)>'<,A4.C +,A+@,B+A(>'=&<&<&;'<)>"7&;+@{?Z#7+? ';/C)=$8&:-A 0D,@ &:-A +? +(<%9%9&:(<*> ??j9=;A@F3;DLFO JS?I?I?H?H?G?G?F?F:J8H;L9J??\5G M&GU$,: =L!4C2B6F2B'7#4):(9(9(:(:);+=,>-???g0437@D!489=153737.2(, '++/ /315151; 2< +4D3Cy?z!7"4J +&<^Z`_PP;9 d c +JG (4+,$9:2??nEE#NO%VW-DFKM&@D!;?GHFGFJ%SW2R[VENI,F,<= < +>^k?< +2 +5 E E E E E E E E +D +D CBAA@@`g? =6 ?6 +?<> +A B F G +H +HJJEGBD^o?I +HKO H J +N +P +MU _3%A-9E6BN2AH%4;$= +3cp?K +V_ NUCC=9$>,FW\ @9= ?"g eq~?I +PU65:9!=/">0%=$<-? 0B1C.@(<%9"9%<'B*E??]1F +3H9N,A7L0E ,A/D 0E 1F +4I6K8M:O;P4I2G4I0E ??\.C +6K-B *?,A.C +/D 0E /D .C +-B ,A,A,A+@*?*?)>)>|?X(=&;)>1)>%:#8)?(>'='='=)?*?,A(=!6%:*?z?Y"6)= +&:&:(<*> )=&:$8#7#7*> (<';&:(<*> -A /C??h;?AGGM!:A FMCL +DMJSIRGPDMAI>F +9TA/P3*K.,N=3UD +<-- +\dY```ddd```ddd```ddd```fffddd```ddd```ddd```ddd````dm  +*7 ; N O +WTRPQTJMEEWm?CBJ "Q !P "N&R-W1[1[/Y$M!JE +?; 764bj? =8 @7 ?;>C<4; +4;"/8.;Dx?{??????\jP??pAP'P]/7D6F-=(8 )9 +'7#3%6,= ->*;&7$5%7(:-?0B??i0617:;->?1??oGG#MN"RS'@BFH :@6<BAIHNQ6RU:CKN/7:> .BD D G_j? +C : = +D +D +D +D +D +D +D +DBAA@@??>_f? =7 ?7 @= +@ B B G G +HIJKEGBD_n?H +FIQ FA FMNS\ ,(;1 at E@OT>PP/AA)= .iv? LW +^ NT @ @ +/ =, at G4HO(WN;89= #hcjy? +@ +[d D(!E)%E "B%@ +&A1E6J +2E.A(<$8!8%<'B+F~?Z.C +1F +9N.C +:O4I1F +,A-B /D 1F +3H5J6K7L2G0E 3H1F +??^2G;P3H-B .C +/D 0E 1F +2G3H3H0E 0E 1F +1F +2G2G3H3H??].C +,A/D 5,A&;$9)?(>(>(>*@,B/D 0E +*?"7&;*?z?Y"6)= +%9#7+? +2F/C%923$8&:&:&:';*> -A 0D2F??eGHQAK?I +MWLVJTGQDMAJ?H>G9I7G:K8I??[4F;O +1E8K 4G2C +2C +6E8G 7D(5B&$K@ F +G^bV +Md?!PC"JHRc$j??5K =12 ' ' + + _f_```ddd```ddd```ddd```fffddd```ddd```ddd```ddd```^e?$& +13 ? +FJSSTP +K +KOTBE@@at? +H + K+V&P"L I I + H + H +EA +I E>:8:;>_f?>8 +@4 =8;. +51-(5JYTs?}???hw`:J&9I%??v.=0=0=$4(80A +8I9J4E-> +*;+<):'8%6&7(9*;,=??e(2 +)34>&0 +5$. &0 +5)3)3-73=7A7A5?:A +8? 6B3? +z?o(;(>K4AMK _b` b +PM +F?+4'(-67)?>)??jDBFGIJ39 +:@18.5 ><HFKM8EG2*0<' +72 H +JI +K_i? +J @ C C C C C C C C C?????>>>_f? =7 @8 +B ? A C C +H +HIJKKEF CE`m?G CFMB= +DJIJ O"'.(<::NL>SL/D=&4ft?E P XJQ @ +A/ +!A1P@;ZJ5W*L>;8%:":&>(C,G}?Y-B 0E 7L,A8M2G/D -B .C +/D 0E 2G4I5J6K7L5J8M6K??c6K?T7L2G1F +1F +1F +2G5J7L9N1F +2G3H5J6K8M9N:O??f7L7L7 +@4 =7 :)0 +-,):JGbt^}?yO+?P&2Cy?]!0$0 &70A ;LARAR;L1B '8%6'8):+<*;(9&6$4x?^!-"..:".*6&2 *6.:+7*6,80<2>1=.:9= 6:3= 0:y?e(:*?@!67FCUVTUGE-2"&/(,511'44*<8=9??eB?ACCE.46</8 +.7 CAIG!FG59:(!/ + +7 +: +I KJ M_h? M B +F C C C C C C C C>>>?????_f?<7 +A9C +@ +C +D +D +HIJJLLFH +B D`k?G +@ +CD=<DF +A ?C %"4&/G9:RB3K;07 $`m?;H +PD M AD> +$I*O.6[:">V8P#D9=2:9:9&\S\z?&i t$N )S2W3X3Q .L2G2G3G1E,A*?'?)A*F ,H +?[.C +0E 6K)>4I-B )>8M8M9N:O;P=R>S>S@U=R?TK2?BO!DQ#GT&?M?M?M?M?N?N?N?N7G6F9J6G??\3E 9L +/B/C1E3G5I6I8K ;N=P9OM,B@,E +7K O + [%`\r?IAG +>FT]'Z"UV Y )U1];:<;0R1S %-)]'[!ZWZXXX +OM@>24 3 +5`iz +  ```ddd```ddd```ddd```fffddd```ddd```ddd```ddd```  ( + +23[k?C DO +L VSVR TQPGG F!K(L*N"IFix? C +D K>; : : +> +> +;7?ABCA@<;^e?>8 A5 ?; +> &% --:M9NaMH]65J#%!51C); m|Q()5$0 +6H;M;M4F 2C 3D +0A ):#4&7*: ,< +; (8 #3 0r?Z)+)8.)8'6,;+:'6#2 "1 +%4 +'6&5$3 462419/7y?^(9 ++?3"6*.I(C OJ E E75#).*79.8:/53/-60;5??cB=A@CB-58@3?4@IGJHAC.57"$0%> ? F HH +K_i?K +AEBBBBBBBB>??@@AAB_f?<7 +A:D BE +DEIJKKMM GIA +C`i? +F? B +=: <B? : +; E/#+/"?)6R;=YB4IL'S$ETU{n#lt&Q ,W6[7\7T0M 1F/D2E2E2G2G/H/H+H+H??\0E 1F +7L*?5J-B )>8M9N9N:O;PS??i;PCX:O=R8M3H/D .C +2G8M *> )=';%9$8?^/?0@5E(79H=L#AP'BQ&AP%?O0B4F5G 3E2D4F6H +.H!2L%2GB+@;.O%F"P#Ql??&O !G&LFKSW#LN|?uw 7=$;A3P7T??j0L2G("7;M8J2N .J &U $S +[ +[ ]ZQ K?=88`h? .$ ,# + ```ddd```ddd```ddd```fffddd```ddd```ddd```ddd```  1 3 CEO PZm?LIUOXPQ T W!Q P D A += > +? +B=:[h?316 =:;= C +E +EC23445420_f? =7 +A9D +@ +C )+%9-0D8=R1;P/#:7L& "5{?^)'37C2D8J 5G +=+=3E 5F/@ +(9(9(8 (8 '7 +%5$3#2r?[**'7-(8'7,<)9$4 +-,/#3 $4 +$4 +31 +20 2929|?[+; ++B("9*>I!5@(F#A#<&?*5*5147:%>>$994//* +6.<4 +??Z;7 +:9 >= +*28@6B9EFEBA8:"46)08!(0A8 @ BC +G_j?G ?CAAAAAAAA@@AAB C +D +D^e?<7B;E +CGEEJJKLMN G HC Ebh? E> A +; +;=> +5 4E'0[.O<?,3:0N2?]ABXV;QOcq?7C +J? I? C `&f"R",\,>Q:M?b7Z -R#H13\?h +:+z1?,V/Y6Z4X3O.J2E +2E +1C4F +7L :O7Q +4N-L*I??]1F +3H;P/D ;P5J2G6K6K6K7L7L8M8M8MS?T??f:O>SG\#SH^F\DZAW?U>T>S>S -A /C/C.B +,@ +? +{?Y,> +/@4E%51A/?0@AQ, at P+>O";L8K5H3H2G6H 4F +7I5G +??^1B 8I.? .? 2C4E2C.? .? 2C +7H+I1O6P+3M()y?o+G!4R+I ++L;'H7 @?98.F +)A +"R PYZ]\RL @;`g? @4 =+ +4& ) + ```ddd```ddd```ddd```fffddd```ddd```ddd```ddd```00 +CD T +U ` `Zp?NMXMUNO R V%O#M ?9009>< <]i? 95: A>?@F +HEB 0 0 0 +1 4 5 : +;`h? :8B;E CF + 5HFTiXLaP4J#"82,11';.B~?a"2&2)1,>2D/A4F ?Q?P6G-= *: &6"2!0#2%4 '6 +u?^,,'7-'7%5+;+;%5., 0 &6*:,<3/ +3/ +596:??Z/=/D#$9+A?#97.?+<0:(9C2B?5EB?B#=@!::331,1,81=6 ?~P5.2165$,4< 3A7E== 77.12508;(03= +, +> @@ D_k?E +;?AAAAAAAA@AB C +D E F F^e?<7B;FDGEEJKKLNN +H JB Eah? C= A < == :/ +3'P=FoIlT/R:96'F&9X8>WQ:SMjx? +; GL@I> +Ae +(p(Z)0b1;P 2G7d2_;i .\ 5'S4IBW>S;P>S>S>S>S?T?T?T@U5J4I8M7L??f;PEZ!>SCX=R3H+@)>-B 3H8MS?T?T@U@U??l at UDY K`'?TI^%AV +1B6G%5,<$3!0;K';K';L;L;N;N;P;P5H4G7I +5G ??_1B 8H.>2B4D3C.>*: ++;4DVAV?T:O7L2E +/B ++<%6"3%6.=4C ??i+:*97F-<3B)8 +)8 +%4 %4 %4 $3$3#2#2#2K;>.64?= +|??0$>Q&GZ 0J4N8@$="5""5" +I$BL +D> @8;`f? +DIL G +FDCCD +F GBD +F H +I +I H H[h? B=H @KILEEEEEEEE::33]d?>JNP X <6#6G=C\#9RBSC,=-5.70A*J3EJ*OT4n?)9,e mc# &12DE0XW:ba8]U/TL/P=/P=C`D8U91I%%=w?_,>@Q$>O"9K +9K +9K +9K +:L:L;M;M:L9K +9K +ODUDU=N7H;M8J8J5G??e9KEW#?QBT =O4F,> +*</A +9KASGQGQHR JT"KU#MW%NX&NX&??jQ[)OY'R\*PZ(Wa/KU#U_-NV%OW&OW&OW&MW%LV$GU"FT!5F4E8J6H??e4H;O2F=$B,J 3Q5Q.J%>5,C ++B 1E6J7I0B-=-=??`:A,:,:&= 0G;'C5$@*2L18R7:S7P:V>Z1N *G-J2O ??\*G2O .K&C-J4Q2O +H&C'D*G6F5E1C/A,@ ,@ +@,As?o6. 0" +%92<:"?= +4^ 3]-^)Z"\XYWQWKL_v?H&H3U1[-.X*'N1B%34 -. *F-INMRQQSSU]}?NEI> EACDC 40`bW ddd```ddd```ddd```fffddd```ddd```ddd```ddd _a` +  + + 35 +E +E +J KJLEGABgt? M J TIOFFGFECB @ ? +>:=9=be? @:=<<<<<<<<3489<< :9R_?==%C%13=6NXHW.9H+:$3+( 2.@$60B;M1Ct?Q!61F/D >SAVF["J_&K^&GZ"BU?R?R>Q;L6G0A +.?.?/@ ??d&5 +%4 2A'6 -<$3#2%4 $3$3$3$3$3$3#2?;62-5/7q?|4'>K;H=P>Q">?">?/<",934123:3:28 28 04.2+.*-??j253647"'.3 .417 9#=';"';" ,D!9 +E => +@79`f? +DI M G +F EDD E +F GBC E G H H G G^k?E @J +AKHK +D +D +D +D +D +D +D +D==55]d?<DH P +X<1 ++=/O8I +,> +8JEW#JT"JT"KU#LV$MW%NX&OY'OY'??jOY'JT"KU#JT"T^,LV$Zd2V^-V^-U],T\+Q[)OY'KW%JV$CQAO@QZ?[ 7P+D "6%9.@8J?O ?O ?O"@P#??a?F3A 2@ +B 6M*D6P+-3##:&(?+-E-E2J4L5R-J0M 3P??]*G1N -J'D*G.K .K ,I+H,I.K 4G3F0D.B+@*?&=&=u?i":9$>#2'B/$@1$@1CW@T;U +5O *S$MROGLHIYm?FF !P + 1 $G at 3VO2SX%FK4H *> +*L &HLGMOWZ_w?GCJ AG?@D +C 8 +6(& ^`] ddd```ddd```ddd```fffddd```ddd```ddd```ddd  +^bm,-68FFO +N M MJKDFBCco?GC +MBH +A +ACB +A @ ? =<<:=9=be? @:=<<<<<<<<?@AB @ +A +< +EV :KHY"K\%Pa*Te.Uf/Sd-O`)M^'M^'K\%GX!AR:K3D +,=(9??d&5 +#2/>$3*9"1!0$3$3$3$3$3$3$3$3,7+6"74 k?}$F6$MQ;?$KP"IN(D8$@4/;,855443; 2: 1807 +/5-3 +,2,2z?\,207 +6=&.08,5+44">+@!*? *=. ;7 : <7 :ag? ELO G +F EDD E +F GCD +F H H H G +Fcp?I CL +AKFI C C C C C C C C +D +D88]e? :=A +LQ +7 +-  +>+>X?Y.S[P=OO>O@QCTCT?P.;??_DJ;H9F.C 5J(@6N*!9+7)!5,%90.A#3F(8K7J:T2L +3M6P??_,F4N0J -G*D)C*D.H 1K 2L +1K 3I 3I 3I 2H +/G +,D +(A +'@ w?a'A)D0K#?/K")E&B#L>!J<E@A<9E5A.N,LCGJJXj? LIO.8 +)>4I;F?J$EL'HO9H2A%G>KLZ^bq?>< +E =B== +C +C +? > 8 8 3 3' (^`m ddd```ddd```ddd```fffddd```ddd```ddd```dddbh? +* 8 < I I +M +M +TRTSSSLLCC>>`j? +B=F; +B;< +? +? >=<;:::=9=be? @:=<<<<<<<<GGEE?@ 7 8hr?2(L_LRgHAV7->'8$5 #4!0%4 ;HR_1[g7Ye5LX&0< +}?S$9!4& +9 : +; =8 +;ag? FM P H G +F E E +F G H G HJKKJ +I Hfs?LE M +AJ +DG B B B B B B B B K K<<]e? 76 : DC-.,6H:BZ(=U#"Ka:P:B GO5U,;[2^R^R??nISm}dt??|?+qU$jN:T @ZE_D^AW;Q :N ;O +;J 8GP?Q??c8I;LCT:KHY"EVCTARARARARBSBSAR@QDRBPES CQ??pES P^+HV#KY&R`-Vd1P^+DR=K@NFT!X[,X[,X[,X[,Y\-Y\-Y\-Y\-??mUX)OR#OR#LO TW(KNWZ+_a2_a2]`1\_0Z`0[a1[c2[c2cm;\f4T`.JV$??oAOHY%@Q>X0J +"<7#;'?':!4&7-> +2@/= .: .: )4 !,??bNQ$ITHS8L9M'=3I".B6';/"2/$411 at -9H5>M$9:<<<;;::::=9=be? @:=<<<<<<<< LJEB:;-.lu? +5A7XgHfuV?P#0.@'9&7 (9 +)8 +-<BN Vb4ktEMV'>D@F??nRV$fh7kmPASCUCUBQ@OANBOFP@J=F8A??gBIT[1RY/FXEWCUBT@R>P=O G??cPQ'QX"U\&JZJZ2H9O!,?+#6"*#*#'4 0=)8D 8D 7L.C +0E 4I??b2G>S>S?T7L.C +-B 1F +4I1F +,A'F(G,I/L +1N 2O +3P3P??X,G)D,G9,G*C)B%E&F'F +)H+G-I!.F8/G90;0;#I"Hjy?R +Q P +im`aDB /"1:C:C6P4N*[ #T[Whq?<2 7- 8 9 += ? ? GIPQTUCF =?el?: + - ddd```ddd```ddd```fffddd```ddd```ddd```ddd  + .6:dr?FHKQQQQNK +I GMKH E @>;:af??8 @5=9;;;;;;;:::=9=be? @:=<<<<<<<< E C=;23 ) +*gnx"?G8?????|oyT5A%1-?$6 #4):0?3B@LLX*ci;CI?AUW(???ki9|xI??R??P?~N}{JwuDlncj?D G +KJ +I H G G H +IJNNOPOMKJdq?I BJ>F +A CEEEEEEEE +T +T==]f? +1/ +3 D:5 @$@ +G!(076M Pg8_J6]HSUVX??{Oi<8??*??2?|n],X #OIW$CQ;I5C5CP=O=O;M6H +1C0B3E5G 5G 3E??h=N@QGX!bh8]e4U],??wKU#S]+JT":OQ>QFY"AT0 9 6 +: +< +< +E F OQWXCF +CGfr? G= +@ 3 -ddd```ddd```ddd```fffddd```ddd```ddd```ddd#&=> +Q +TQSaq?NACCCDC@> +; : @ ? @?@?A@fi? +A9 +A5?:=;;;;<<<<:=9=be? @:=<<<<<<<< +;943/ 3 ,/lqw).4eiX?????tagA6= +8? ,A 5 +1*=9H=L!CLGP#WZ-UX+b_2liig6`^-VZ'RV#R\'HR8I5F7L:O4L.F ??d"1*#2%,&( / /"1#2%4 &5 +(7 (7 9922488<??j(2)7!/ )9'7$5 !2$1%2(4)5$5 "3 /--0#4%6 |?g%5!/&4&'2*&')#'!8 2 P +NY Z M O< ?dl?A BEJ +I H G G H +IJKLLLKJ H +F_l?E?G<E @ CHHHHHHHH V V==]g? // +3H +DL +Q +K +H 4.#0 +6R!Jf&SN!NI=O%HZ0z???eL4?? u|1u\Y at FMKRGX"@Q6G1B 1D 7J>QCV>S:O8M3H +??[5K + at X:R@R?Q?Q?Q?Q>P>P>P=O:L7I 7I 9K +:L7I 4F??j?PARHY"=NK\%GX!EVEVGX!HY"EVARARFW L]&PV&PV&V\,W]-??~W]-^d4TZ*U[+TZ*V\,Z`0_e5ag7_e5[a1b_2c`3eb5he8kh;nk>pm at qnA??nk>nk>qnAmj=qnAa^1if9fb5d`3`]0^[.^]/a`2ce6fh9gj;cf7bh8\b2??T\+[c2QY(7K7K6H2D +1@ 2A +8E=JIS!Yc1]e6QY*PV*Y_3VX0EG??rGB$8:<> @MMZ8M ;P:M9L7G#4D 6C;HHTO[P>P>P?Q?QDVBT@RASCUBT>P:L??k at QBSIZ#>OK\%GX!EVEVHY"IZ#FW @Q@QGX!M^'RX(RX(X^.Y_/???X^._e5U[+MS#SY)Z`0]c3\b2]c3bh8gm=b_2c`3fc6jg:mj=qnAtqDurE???qnAnk>qnAol?xuHnk>yvInj=kg:fb5b^1`]0a^1cb4ed6fh9eg8dj:ag7???Zb1`h7U],EW?Q8J6H:I:I6C2? +9CMW%X^0QW)Y\1knCkmE[]5???c\@DFACDQ TaAUDXN!4A-:/90:/<1>1B 3D +2F3G6L%.D1-v??/0'4'4IN[\a_ce_bY\ $O +%P +'G &FWu?]X*eNM 5/ 7 7>? +G H +PQ=@@C_n?H +D F =A ; > +/) ddd```ddd```ddd```fff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffailailcigbhfbj_bj_bhZbhZ??zORGmmmwww^Zhb^lbZqf^uai?ai?ai?ai?ai?ai?ai?ai?ai?dl?dl?QY????HPbj?hp?bh?bh?bh?bh?bh?bh?bh?bh?`f?`f?`f?`f?`f?`f?`f?`f?}??IOqfl?ou?W]_e?ag?hn?bh?bh?bh?bh?bh?bh?bh?bh?Xa?gp?_h?IR{???IR{\e?mv?en?bk?_h?\e?[d?\e?^g? `i?dk?_f?^e?dk?ow?s{?mwoeogq{cv?h?????yt|W~?a|?\??ct?bz?h??m??n??n??v??????????????????????????????????????~??y??p??o??m??m??g??m??x??t??o~?g|?k~?m??uao>ud{?jlti|?ywpnvg{?d{?d{?\{?\z?cz?cz?py?o}?X??`??\foB???hqF??f??h|?b}?c|?g|?gz?gx?ev?ct?ad?}h??l??f?_t?]r?fv?n~?y??JX}kx?t??[f?bm?iu?t??gpkhqlgm?dj?ad?ad?dh?im?T\?bj?es?Q_|???L[|ap?]l?`o?_n?^m?]l?]l?^m?_n?`o?ap?ap?ap?ap?ap?ap?ap?ap????MXtgr?oz?W^?_f?ag?hn?_f?`g?]k?_m?^q?`s?^v?_w?^u?^u?\n?EW}???CPrdm?mv?dm?dm?bo?cp?_q?_q?[r?[r?oy?hr?eo?gq?el?`g?gn?ry?|??nv?????????r??y??W??V??n??p??r??t??t??r??o??liwS??q??n??l???q[|?f??q??a??f??k??l??k??j??l??n??n??k??i??k??n??n??j??f???z_??s??~??v??w??m??~????}??{??z??z??}????????`?????|??m????????????????????????????????????????|??|??????????????~??????????????????????????????????~????????z??q??s??w?????z???????????????????????w~?p}?o??r??u??????????????????????????????????????m??m??|??x?????}??v??z??x??mx?j~?p??m????p??g???evLm?W{?e??j??i??l??w??????????????w??{??y??r??e??_|?^??b?? }j?P?d??n??d??d}?Z??j??c??c?`~?_|?[{?Zz?[y?Z?e??k??qgxX???ap[v?wqrw??n~~au?_s~\z?b??]?[}?Vw?Uv?Xs?Xs?`q?bs?ht?jv????[]?iu?p|?d{?m??[z?a??ay?]u?al?\g?h_?i`?u^?w`?]c?ms?gm?RXz???NTv]c?lr?dj?ci?bh?ci?gm?kq?pv?sy?ch~ch~bhv`ftafi_dg_d]_d]??|KNEgfbqpl^Y_fage_khbnddddddddddddddddddddddddYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnfffffffffffffffffffffffffffffffffffffffffffffffffffNNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ MRN + ,0 +< +< +< +< +< +< +< +< := +A7IQ?/ @> 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3JOw/ +7<+ +50/ 1 1 1 1 1 1 1 10 +?:-OX?/ : +C : 9 +9 8 8 : +>?< +8 +1- ,:+81.;4lza/=$0>2@3? +-> +-@.A.?.?.=.=)27@@I5>{?[-8 +6C*7 &5 '6 +'7(8&8%7!5 42(5+27,1"; +!:%N,UQ_?.)"16!2(-#(#, ' @ A +J L< +FB3KZ?7 Q +IBA?>>?ABBBBBBBBBNYy/ ;?5 @ C BKKJJHIFF>D HAP\?/ 5 0 +1 5 ?C I +GGD GA;;/ 7$0>=IWs?yHUNRaDKZ=FV'Wg8M\#KZ!GV+GV+GV+FU*DS(AP%?N#=L!5DGV+da8a^5??pebCokRqmTjeOb]G]X;_Z=f`>jdBld=ld=ijBhiAhf?fd=hd>okEysO?zV?????_?_tT|oO??c??a??k?rG?sH?rIpGykDug at rf@rf at g_:g_:rlHga=??grnKrnKrnKnrOfjGY_;OU1EQ+AM'=L%;J#=I#GS-[a=msO?~]??g??k??l?????b|rO{qNrP?{Y}pNYL*ysOjd@[`8_dP();m}b 00?*(7".-.-0;2=3P0M (W#RUTTSMLGFVW?CH"O&T,Z O )X +Z'V KC84 / /-< +:-TY?+ 1 8 10/0 +2 6 9<32 +( $ +PRM +  + +  + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ fffeeeYYYeeeYYYeeeYYYahp/7655555555228 :QY?5 +;10000000022222222dh? ;04, 90,00000000* 5 +51Ya?55666:;ABCD3716 +'6%6.->6???,?#,(:3D3D/(:$1'47>PW+rpG??[??`??^?tN??ZxpIwoH??veb9`a7_`6Oa/M_-J]&GZ#FZEYEYFZFZ>R2D);#4 + 1-*y?e.>-;$&4"/$4%5%:%:&='>)?*@+?+?&0/98D5A??a/<,<(!2"3#5 $6 #8"7 6 66&4$+0 $);9I Mr? +F '-7L-4M,E $2%& +% +:<DA ?C C +AHL\f? +> +;--3 +> +ELIG C77, 4((2E)L_C??{Vi;K])BT GW([kO>O>O?P4E9J&73Dt?QBS>O8IK@M!BN LX*?KFR ISHRIRJSMUOWRZT\ TZ,_e7XY1ef>??vd`=qhI?wX?~^~qQsc?qa=|k@?qF~l>uc5wpDyrFzqFtk at qe;sg=}pF?yO????wN?|T??\??Y??\?pI?tM?rF?yM?~S?zOpG{lC}qI?xPulEof?yqLskF??t?zVztRwqO?wR|nIne>i`9b`7_]4SY-LR&V]1U\0TZ.V\0ec:wuL??a??p?????m??V??a??p??|??jwj@?yNqh=^`1`b3\h6Wc1K])HZ&JL%]_8QX/V]4??b>K 2A-<8E=JKP(TY1b^9miD|rO?yV?|Z?|Z?X?}VyzNlmATb/IW$??`;R4M8Q;UB\2J7O7L4I/E+A)?(>)?*@3H +;P?S"1Ev?`#5 +,=!2("+%,3*1 #?:JJYZ\\UQIGmo?H =HRTM'_ ,d(` TL@:20,664[_?511.--,-/13 +7 6,) imp YYYeeeYYYeeeYYYfffppp iii ppp iii ppp iii  +  + +gm?$(4<HB ; +A +A +A +A +A +A +A +A ?8 = Fah? F F9 +C +C +C +C +C +C +C +C@@@@@@@@np? + E9A<J B> +C +C +C +C +C +C +C +C +8< :=hp? E +@> +F G K L +Q +Q S S6B(D,H,3*11%$8,??z;P/6L9O!1E+? +43H,6=G^b/~?O??b??b??T}uF|tE??QvrByuE??wkm;dk7ah4Mb'La&Ka!I_H_G^G^G^F\=S2G.C /B/B);#5|??(42*0#)%)"1)8#(=)>*B,D.E0G1F2G5C/=,:)7z?Y,< /A1)<*=*A,C-D-D*D*D,K;$C33=)3 GD QPP]??$&13*3;'E1A4!1$+# F +J R MKIH J_p?!Y cQNM +K J J +KMNNNNNNNNNor? B;E J\ ][!f + e ` ^XVQP +]RMR`i? +MO E; ?H +M W WXVA F*?1 at U?S:?S:D\Kc%??TMfI_J`Rc/`q=IU1?K'=OS??g-A/B#6 '9)%7'/.#"--K&U +%c'e*l,n+j +&e"^Zmr? H;MXVT3r6t4r 2k-f'Z"UMK= B? Djl?J B@ B BAA@AAA??;; 2 +3 ' 'sv? + + +iii ppp iii ppp iii fff```aaa```aaa```aaa V^?(1@ +< >4488888888 +@23>Y`? ? +@7<<<<<<<<::::::::[]?95A6=8<<<<<<<<< 84,1]d?;67>>BADDEE' 3*6,8)#+%%9 0D+??tNc:G[(4H#6-@ '81B 5<MTqt???U??X??Mvn=ld3sk:}uDge2ki6??i_d.U`(P[#C\C\B[B[A[?Y>X=W6O0I+B *A ,A(=2)hq?8 1 0 +3'$$30 5 +!6 ":$<&=(? )=*>3D +%6.-q?M#6(< 16 8 : +"< ">">">!= +&C>83%5-DDM +Idq?+X2DHBTX-D,C.J>Z +"2/# +(#FL +T P GB +?GYl?PXFFEDCCDEFGGGGGGGG\]?67 +FFQW^cb^[SP J +H[I@GV_? +E +F @::?A H +LSU +A B!60?TG[?H\@B\>X|?;A[D[ G^ HZ Oa'Q5H8K .A)<4GGZQd$K^@S??eDV&DV$EW%?REX!mj7fc0XX$``,qq=??S??_??Vsm;[U#??e??M??O??Y??T??`??{?????j??W|p:J +MFD&g*j*j,g*e%Z UKG@<5:ac?C=?????>=<;::9:45/0^b +aaa```aaa```aaafffiii  iiiiii  iiiiii  iii  !"-.fl? +? +? +I8::G>>>>>>>>M<< +H`g? +D G +D????????AAAAAAAAbd?A@M;:6@???????? +G A6 =cj? ?: +A +A ?<;< +>B D)$ /*'7**:-1A&@P5Yj at l}S???drAER,9/9JTAKY2K0I.E,C(> 6) +!fo? +> : A,!?.+*:7#:$;$>&@'?(@)=!)=!/C%9';.B??_,A+D 8(C)D)E+G*H*H)G(F9F*73.B H MHjw??$$7%.$-3-7",:7W \ c +b +VOJ$Scy? + RYKML J I I JLMMMMMMMMMff? + +> +DSMPW'd +k*j %f"c +ZW +Q PW +I I +Xfo?G C; C +A +A @ INW[ P +H 6,L9K=EWINe-Tk3??]QiMdI`CWI]BQO^%BTAS?Qln?}L??R??b??v??y????????k??Q?wE?vD}vBwp5 +B02- +<======== F7< +J[a?:==6666666688888888cf?83 A320:66666666B>9 Cah?8- +9 +52)((07<#.+66B@L&JV&Wc3it8%B +&C &D'E$E#D!B + A 2T B 1,6<81s??9&:;#F>"B40 C @U Y +_aTME +!MZr?@E = CBA@@AB C C C C C C C C Cki?79 IEIN&]&^%] YVPNGFI> B +Sak?92/5477=? G +HHC5@$/%3>@R:XjR??qI](?TO>O>O>O__-QQ9HBQS6L 2H2H*@0F9O??h1F6J2F676 8/&!  B D&T +)W0]4a9c:d`?1] PKNRF +LUY X + Z +QK@ ; @:4 +G +Gcg?@8M +=:*0JJJJJJJJ +F:DT_e?;<= 9 9 9 9 9 9 9 977777777jn?3, +:375 +A 9 9 9 9 9 9 9 9DDC +Oho?;- :52 +' +'( 3 ->(5F,4;CQZ#bk4jr6go3ci)^d$??Q3843RQUS"KIGCmi)A0H +??])C3O6R,I-J,K,K)J'H$G"E8M|#8g + KC A D:0[i?-5 +J K +LP^89N K]^ aeUMC "JVp?5<9 A @ +? > > +? @ A +B +B +B +B +B +B +B +Bts? 4/ +CFO$V2d(['Z#W!UNLGFQ BA +M[f?02 701 7 9 ? > +A?FL I +M +6 >6EBXgd??EV4?SG[J`OeAVH]6G;LCT K\(Rc/Wh4Yj6Zk78I7H+<@Qu?R0A +2CBS>NEU$N^-Qa0M],FV%AQ ?O@PCS"BR!9I1A6FGW&Xh7??~OZ0AQ*JZ3QiEbzVKlMMnO8cH9dI3iR3iR.iW*eS#cS `P?\$Kh0I\$Zm5??uuxCwI?xJyW?]uxcdgRTh_Ui`5SS00)^T;??u????????|???????????}??v??P?}F??y?????|???????????y??m??g??m??t??s??a??k??i?????`??i?????_??g??j??ar}RkvKr}R|?\SX/glC~zT{U{mJ|nK?~]??q??????????????c?wQ??_??l?\??q????y??u??z??}??z??m??o?~Q?uH??x~wI??[??h??f??b??a??f??l??m??f??_??i??n??o??k??b??_??`??f???rG~zJxtDXe-S`(BZUm1cuMewOfyLdwJ^r=Ui4K`%EZ;Q/E3H=R??p9MAU$@T#3S,L&@%?)9&6)/!'==#J$K,T0X6[8]e??;`!LBO+aN +F +HNSZ$V!SJ F +:76 @ei?0, 968 ; +> ? +> < +:12: = G J +O Pim?B2H + +8 9( ,iiilll + + +iiilll + + +iiifffddd```ddd```dddaaW#&12>>>>>>>>dg? @: C8 +A= @ @ @ @ @ @ @ @ @<>:=be??9;<<<<<<<<::::::::be?>8 +A6?;=>>>>>>>>47< Cco?M CB9 +1),9'7?5=MT(_f:gmAW]1DJAGKL"QR(??c75 B?^[2`[3idui??yO}yLkg:hg9dc5_b3X[,??xNV%T^,JT"ET3BQ0?R$?R$>W=V7T2O-L(G$B'E ,H"-I#$@)8!s?e4&> ,Da).r&/Z$-X4I*,A"#@"?&A*E*@(>,G+F6Q +>Y??_+I,K%D,L +K +(I&G%G&H&J&J5'5'14.1%A; JGdo?N GN9 +A5 +7BD FILMIIJKBA^h? <57 C C C C C C C CEEEEEEEEYm?D +@KCMJLUTVTSQOOAC < +>^k?< 6 +: 7 +8 9889@ + C0 5 >:/ +;*7=GTZ???I^5;U:T +;U E_8P@X=Q N0BPWc1CT BS@W!7N?a+D +6Q2M6O;T=U 7O'@86,9/$5:KBf +0T KIMH\x?FX,h"r (xgcPQHH +J +G NK>@;>bb?B>BBBBCCDDD C C C C C C C Cag? +D@ I? +GA C<<10 bcg    ddd```ddd```fffddd```ddd```ddd`aY .1 < +=>>>>>>>>dg? @: B8 +A=?????????<>:=be??9;<<<<<<<<::::::::be?>8 +A6?;=>>>>>>>>9;9=[g? C66"6"14'69%2,9LS)fmC\b6Y_3RX,KQ%OR'OR'AB./??aSQ(`]4UR)<7VQ)ld=yqJn_6?uL?U?tJzqFvKtpCc_2ji;ed6^d4V\,??xLV$S]+IS!CT(@Q%=R>S>W=V8T 4P0N2P +2O/L(C"!<5"2n?b'<+8K$1D E H +8B!64<&C1L;V?U. at V/>Y4O3N 1L{?V#@,J+I + > +!? "A%D'G")I$)K**L+ 5814)8!0<7E +Dcn?PFM9 +A 4 6DFHJLMIIIJAA^h? <58 C C C C C C C CEEEEEEEE\m?D @K +CLIKONPOO +N M M?A < +>^j?>9 =789887:;99A E5 7*2=JR??~H]4R +DVBT@RASDVFXGYGY0B5G +9K7I +5G oj@?U????????????????????g??V??j??j??k??n??s??w??y??y??c??g??{??y???????????????????????x??p??n??r??v???????????~??~??~??v??i????yQrmG??`??f??]{{UqqKba3a`2_a2eg8msCx~Ny?Qv?NIZ&AR:N3G??c1J8S.I81+;P/Uj#Lx&RN%\k?? +'EM#U[$g"b&f %U"RE? +DB N +OB D>Ace? D?BBCCCCCC D C C C C C C C Cag? +D@ I? +GA CED86&%abdddd```ddd```fffddd```ddd```ddd_a\+-; += H H========cf??9 B7 @<?<<<<<<<<<>:=be??9;<<<<<<<<;;;;;;;;be?>8 +A6?;=>>>>>>>>?@9:Xb?8)-!.'3'6B6FN)OW2\c/dk7DJRX,WZ/GJ9::;ECKI ??pjg>lg?OJ";3 ld=??Z??^eX.{nD?zP|pFqj>sl at nk>eb5ikR;Q=S>W>W9T6Q 5Q;WY2M +/I +.H y?_"=+F)D369&!<)#?3#?3 >6=5(D#? =5 +> = +J Lbm?Q EL7? +5 7 +G IJLMNIIGH +@ +@`g?<69 C C C C C C C CEEEEEEEE]m?D @J BKHJ G G J J L L +K +K=? < +>^j?B> B +A @A?>=<;E=B O=4$5?H??pCU+;S 6N.F6N0F@V3=4GQHLaLaPmIfE[QgNVYYad at Ao2bkj$-,?S6J9L +9L +DA>!HE'W#+['=f":cF]%BY!??tXZ+sm=tn>dl;z?Qp?|i?uC??8? +g?K?Lgb}??????????r??q??~??????????????Y????U??????????????v??Z??W??p?????????????????x?????n??i??j??W??`??g??g??i??f??Y?vH?rEyk>?yM??Y?{Q?|R??b??e?????b??j??|????????}??k??V??S??P?~N??P??V??^??c??r??n??y??v?????????????????????????y??}?????????????????????????????z?????^?xR??l??x??q??c?uOml>ba3ZY+a`2orC??T??]??_kyFZh5HZ&::::::::<>:=be??9;<<<<<<<<<<<<<<<8 +A6?;=>>>>>>>>A C66]e? 1#+ &$&,*5;!DJ0TW*Y\/X["TWMN$XY/WX.FG><LJ!he<{xO??}ZU-UL%UL%cZ3??g??k?}W|pFsIulAe\1^Z-ie8on at on@gj;be6[e3S]+??uES LZ'BP=S +;Q:Q W>W:S6O:T%:T%5N.,E%!:%6!8+" ?_f? =7: C C C C C C C CEEEEEEEE_l?D @J +AJ FHCDGH K +L M M=? +> @^i? +EB FCA<<::2/J<:I6+ +4=B??mIZ-E[@V6K=R8JK])?L0[hLOa#>PE[8N2DSe)NXPOYQEIbekw 8C3=H87I +6H 8K =PCWDX>R 8L;O +AUGZJ]L^$Qc)Zk5art?Kq?xr?yI??%]t5x^@NQ??????????????u??}????????????????????]???????????????????????~??v??g??o??r?????v?????q??o??r??g??k??k??d??d??c??Z?yL|k?n]1?tI?Ttg=}pF??`?}V??y??S??Y??`??w?????q??{??j??g??a??Z??T??S??V??Z??~??u??{??u???????????z?????????????????????????????????????????????????????v??l??????t??d?vNqm at b^1ZW*da4rtEz|MyOyOr~Leq?Te1DU!??g1E4K(? /B0C4M >WCcAa 1X&MG#L +=/ /!(S3^+{mZ|?%/&=4K +)H0O *B,D (3$/-& : ; +S U F +GA Cag? +D?B +D +D +D C CBBB C C C C C C C Cag? +D@ I? +GA C S S KJ ?> /.^ddddd```ddd```fffddd```ddd```ddd `cv "66@@GHLL<<<<<<<7 @6?:=99999999<>:=be??9;<<<<<<<<<<<<<<<8 +A6?;=>>>>>>>>38,/dk~**,+*)JI4kiCjhBUS"JHZY#po9~|Sfd;LJ!LJ!kh???Y?{Sje=??wJAQEuiC?~Y??o??\|nI??[?xMjc7\U)]Z-jg:km>fh9_g6Zb1Ua/MY'??rARFX$=OV9P"6M9Q/0H&$<"!9%>(-F00L62N8???0"-'(88DTT7I=%7+3 +#9*C +/H1K/I -F ,E -C#9$8)="w??.%*6 ++%?&@&G$E +A90 +CE I K +OPSS`k? +MBJ:B : +<KLLMLK E D +A B<=_f? =8; C C C C C C C CEEEEEEEE`k?E ?I@H D FDEI J +M O +P +P?A +? A^h? ID +H:8.3 . +/ % +>.*4#5?6??rUe4Tg%Re#HY%L])ER4UbDDV^p4JW=)6!)+;E:@O( +);1CBVPd>R DXL_Re%Se+Se+Sd0Sd0???D^E!/l +X +m t +GR +!JF`aae '?&> +1$>#,F+??v?O+T^)PZ%[m/\n0YwSc?]Qx?4[l1mS )?J\?????????????????????????????????????????????????????????????z??c??d??g??x??n?????o??k??k??_??b??`??Z??^??d??b??Xzl?rd7?S??]znD|pF?|Tqe=?????PyIyI??W??_?xJ??Y??c??g??j??g??`??[??[??]??g??b??n??n????????{??t???????????????????????????????????????????????????????????????z??p??`xLle9^Z-fb5on at rqCruFy|Mbl:ak9\j7KY&??e/A +(B.H 5V9Z2W,QD'M@- -F +)Q'x !rSt?0":2J (@2J1:7@/*/*+/'+B< Q N D +F@ B_h? D@ +C E E D +C +C BAA C C C C C C C Cag? +D@ I? +GA C +R +R +M +M +E +E < +;, +.^eoddd```ddd```fffddd```ddd```dddac?-25@@CCCCCB;;;;;;;;ad?=7?5>:<::::::::<>:=be??9;<<<<<<<<========be?>8 +A6?;=>>>>>>>>" * &quv#$1/@>)ZR-ia6;M?HZL8K5;N8*? !6/ 6(@-E-F ,E ,F-G:L>%7)'&"!^m?+ A:GHIIEA 9 6 +H JLML +I +FD_k? +G?H;D ? +AKLKK J +HA@>@:<_f? +>9 += C C C C C C C CEEEEEEEEbk?E?H?GC DF G +K L O P +Q +Q +DF E G^h? JD +H :9 +*4(.#.4!,&'!!$-&%$'0;D'??fQ^&P]%P]%FO2FO2598>BA5E@P17E(933EVFW ShEZ???Ca1<.f To yOYKKns +w xMI'#/39'>D???;N;Ma,I](MdG^@[&Fa,Eb^:WS4\?1;<:G???????????????????????????????????t??q??????????????????????????r??m??v??j?????i??^??X??]??]??V??L?~L??O?~MuD}uF?yJ??]??a??V?RwtI^[0??p_a0TS#_^.~|L??Vjb4nf8sf:rF??U??\??\??\??_??c??e??c??p??m?????|??s??n??y??~????????|??v??r??q??r??v??v??x???????????????????????????????????{??u??[yrFxqEwtGxuH??V??jz?P~?Tz?Tdp>??r4E?P@Q4K/F)B'@'F)H)J)J,N;7)-I;"8_A\-u[y?A="E1)C79.FH%>+'@-%@7"=40K#>N F DF A Dal?I +EHGF +E D +B A@? C C C C C C C Cag? +D@ I? +GA C +H +H +H +H +H +H +C +C +9 ;, -ag ddd```ddd```fffddd```ddd```ddd$'+0df? +=BEIIFE?>:9::::::::`c?<6?4=9<;;;;;;;;<>:=be??9;<<<<<<<<>>>>>>>>be?>8 +A6?;=>>>>>>>> ( %(??u16"FAVQ+?}M|p at tf7{m>?|U??]?}]rRc^6upH}xPniA^V/[S,bY2g^7????zU??w??}?|X?wS?uQ?}YwsFpl?li&-E-4P(:V.:Z(:Z(z??5EBBUAK^J8N(:P*.E*A)?.D3J 2I,E (A'B)D-;D%. -)Va? 9O +H P P M MFG@@CCB +A +> +> +> +>^k?B=F=G +D +GKKJI GD=<<>8;_e? +>: > C C C C C C C CEEEEEEEEdk?E? +H> FAC G +H K K +N +N O O +HJH +J^g? L@ D55#*22A,=L7727021!1'< + 5,. +3BJY2Pa-Yj6???"" 019;EMOKW?DP87G-= >Q>Q>Q@SBTDVCTBS???1I)P ?]iCOFFj o +t +tIDNS*O0Uw??0EFF`0E_/@] ?\ +:T 5O=Q6CW > B B +F +F G G +F H: +:=be??9;<<<<<<<<>>>>>>>>be?>8 +A6?;=>>>>>>>>!)./'(91??|AF(WO h`1?v??|E?}M?uEzjHxhF?rY?~e|wOxsKnf?c[4i`9{rK?~X??Z?????]??q??]r`kh;kjS;P;P:M-9L,3E5. at 0)"7(3K1 ; > C C C C C C C CEEEEEEEEdk?E? +H> EAB G GJJLLLL KMJ +L^g? L> B%%(#1C?Q)@T;Obm1w?F{?Phr=`j6is?eq3Ua#??_O[IR'GP%=>C127 4, TE0 @ * )$ + 0:/7A8U_V???DNC *'((3%?J +=]_ d d ;6 +] +]OQ]u?1=4Q!7T$3Q>\@Y9RFW-[lBU^]&W!RILINjy?VT!XHGF +D B @?> C C C C C C C Cag? +D@ I? +GA C 6 6 +; < E EKK L +N C Edj? </ 1   ddd```ddd```fffggg bbbggg bbbkeq +  $'23 + E +C;=eg? +H D +F<<<<<<<<>>>>>>>>ce??: +F> + E;8EEEEEEEE JH@Bcd? MI +KEEEEEEEEEEEEEEEEma? +c; +F + ( & +$>G +^\EC 09#/*6@Fdj>??l]X0ugB?sN?pM~jG?qM?|X?rNm]9nbV"0)F4/L:3PK6SN2PR'EG9>16u?r,F)$B&D(K1T"H(N"F$H'G+K-H.I/F2/F2ZPS [`o?WTH +O N N +MLLKK +I +I +I +I +I +I +I +Ibj? KE +Q +I PFCMLJIFFCCEHBC`b?BAI +I H HGFFEECCDEEFGGaj? +A; E@K G GDF J L O O Q +P +LJ8:]j?? +=? ;0!:DC.QP;UUTT??A??8?uDl^-XH&rb@??V??X??u[[HPJR'10$# ><:A)2 (5..J" '&(5GIV???QYAHU4A " ##!"6?F4X_M]k-Zh*H[7J@SWj[k M]??t;`-)< +%8hgjf7&B73:6/D'<Z[nl L(iTl?-G5'+C5,C;R&DX;O=K +IWR^ O[4N3,14 Yb?R???????????????????????w?????d??e??f??o???????????????????????z?????j??b??g??O?N~xFoi7aa/ee3jq>qxEntD`f6xwKnmA??c?????s???????vV??]?????u??y??i??Z??Y?wI??W???????????????????????????????????????????????????????????????????????????????????????????????????????????v??m??t??e??T??N}?Ls{B]f-KTTb'\j/Zi.gv;??fVj-Nb%3G +3J2I0G/F,F+E&B$@/I&#= +%% +- /IN]p?RR + [Y(h bY +^[QPK +Q&S*W +WPS WXj?V ` +^VSH D : +9 5 +6FFFFFFFFdj? ID P +H OEBBBBBBBBBL J@B`f? JE GJI<9#  jjjbbbggg bbbfff]]]^^^]]]^^^_Za.09 :8;7:ad?<7;;;;;;;;;::::::::Y\?51;1;7:;;;;;;;;;>:=_a??:> B B B B B B B B B B B B B B B BaY?G*4 $ - +1DEJI4 ;)#1=@:=@>db9??{?zS??_?yU?zV??^?uQm]9ne>??^??k??`|pFymCsI??`??}?????w??a????~T?~T?zP?tJ?|RwkAxlBpzElvAdq;an8^k5 Zg1O`)J[$ATH[#;PLa(??bE]#?W>V@Y=V9 D: +C@ +CFFEDCB>>7=9;]`?85; +C +C B BA@@?<<==>??@T^?52 +=6 @<??@ G +H I I J +I@C7:Yf? 5153,"$;JI4\[Fee)gg+??L??G??Y?wJqa@?tS??c??a??kj*ag9\b409@ )0 E= A G, 3!)##=)/0D???LRFZe:Wb7VXe/1> + (*7 at G7KRBBOMZ"P`CS7F8G=J@M??eVv76LJ53 @9G"P(A=,EA1P.5T23O@*F73H*?"d a?)VRhu)61)?*4G}qAwq?oi7dd2bb0ae3dh6nqBeh9vuIhg;?zS??j?zW??z?????w????????p??k??z????????~??w???????????????????????????????????????????????????????????????????????????????????????????????y??k??q??~??}??u??i??`??W??S??QuyF^g2NW"KX"P]'M\%]l5??eVi1Uj1 at U@T=Q8P7O6P 5O1L .I0J)C1* +"2 +,BDZk?MLR +K +[XU WSFB9<:> P @>@L\? IWU WTKH> +=::????????Za?<8 B8 B> +A>>>>>>>>;>9;\c?=8; JI=;)'___^^^]]]^^^fffiii   + + +ccciii   + + +cccgef +  + +    +. / < += +E +E6 > > ?dh?74 +< +9 +9 +9 +9 +9 +9 +9 +966666666ei? > : ?-207555555557 ? ? + + at be?85 += = = = = = = = = = = = = = = = =ki?7 , 0 &6 >QK< A+$*:2:%6>)KC\T-k_9?zT?????o??x??d?yU?vR~rL??Z????????jTW,ZP,]S/nd@??^??s??irhDQG#??llb>zpLuQxnJ}sOj`N:J7ICU#:NI]*{?^9P4K7N7K7K7K8L7M5K1H/FB[D]B_A^>\9W4R0N??b6H(=%: :+E<*H 6U)0O#$C39)+7$0<: +NI +N +Q[k?D L J IH +GE +C A @?88888888em? EA E386 +>@@>>;:877 += : ;cg?51 6 < < < +; :9998889 : +; +; +;_h? =<C24/39 : +> @ +C B B BC +K +AB]i? 33 +; 71$,-BRP9caJom0us6?zD~s=?rIwh?eU4scB?{V?wR???b]3CE-"$ 55+-%++C'!$0psz/29PWE]dRglfW\V69> +6<.Y_QCN#KV+Yf0an8Yd[d9OX-R5I.1E*-D,C-G,F(C$?0I4M3E5);+#A +3EDZi?NP S G VV Y"UR +B>57 !4#6@ 7?I]l?IMA +X VPMFEAA +; +; +; +; +; +; +; +;fn? EA +F497 +> = = = = = = = =7??@`h?97? I I A +@ +2 1 +# " hhh   + + +ccciii   + + +cccfffUUUWWWUUUWWWOQP   + +''44<;BB/ 8 62W\?'* 6........,,,,,,,,QV?-2 :'+* +4--------- 6 +40UZ?'( +4................UYe '),> +HA>&2(,59*9@ +6= +A/ uc???a??j????yW??d?zX?wT?mJ??f????????}fmAIP$xoPqhIpgHypQ{rSmdEXO0KB#??jjaB}tU?z[{rSvWofGtkLYa8T\3MX.KV,LW-KV,ET)AP%EV*Qb6GZ-Qd7?g=S%>T&F\.EQGSGUESAQAQBUFY:O +9N 6M4K0J.H,H,H?W=O;N?R:P"@V(-D(5L0510, &;2?=II<9@AP_?0=@ : 9 +86420/////////QX?0 +4 <)-- 633320/--2 5+)Y^?&$+/..-,,++../00122PX|* 1 +:%''./0346543=F;7R[?'* 62/ +"(&;D@'MI0WS\X?sIvi?{lEwhAhX6rb@?uV?rS???IA,&$' +  ,JI +4<$1*46C\]r at AV +1'&%IIc %+.3W^Lip^inhFKE $'#&CI?gmcnwZYbEKT5IR36<2 emD:B"$!#...GGGKL:/0MROTW^dkqw1w}7wwCtt at O\RR_UBO=N[I??tR`=_l>n{M^i1Va)Xa(`i0bf3X\)Y]+bf4ih0sr:sujlncOW{8 at d!.X#Mp}???????????????????????????????????????????????????????????????g??\??\??R?Q??S??V??QwsCkj:ji9XW)lk=xsItoE?Z??d??a??r?????~??g??j???????????????????????????????????????????????????????????????????????????????????t????????????????????????????????|??|????????k??WzkJ}nM?tR?yW?|X?{WyySvvPah?V]4DQ&P]2y?_EX+Lb4DZ,;UR6PM1N82O99V&:W'7U1O3&> +1B//@-!)@.95FS?< +BH8FH +N +DB66 - + 1&/)2 <4::P^?3 B @ONJHC A +> =22222222RZ?5 : B/32<333333330 9 +85U]?,0===8922))  SSS WWWUUUWWWfff???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiiggggggggggggggggggggggggeeeeeeeeeeeeeeeeeeeeeeee???GJOWYelnzbdykm?jm?tw?il?il?ek?dj?ci?bh?bh?bh?bg?hm?af?Z_????RW?Z_?jo?ch?ch?ch?ch?ch?ch?ch?ch?ej?ej?ej?ej?ej?ej?ej?ej????JOyX]?jo?_d?gl?gl?pu?ej?ej?ej?ej?ej?ej?ej?ej?`e?fk?_d?X]????PU}X]?hm?ch?ch?ch?ch?ch?ch?ch?ch?ch?ch?ch?ch?ch?ch?ch?ch????JRTV]yho?[b?dk?gm?qw?^f?em?w}}?????y??}??e??_??h??????????????????????????????????????c??h??????????????}??r??i??o??~?????z??????????????y????????{??t??p??o??n??j??g??f??p|?b??i???r?Zw?_??k??e??g??e? ?c??_??`??b??g??l??i??d??a??^??_??_??`??ug}?v?[??k??????k~?o??l?i|?bt?^p?Ym?Zn?\q?^s?Yh?Wf?]l?_n????P]?aj?dm?gn?fm?gk?ei?eh?cf?be?ad?gl?gl?gl?gl?gl?gl?gl?gl????KPxY^?lq?`e?hm?hm?qv?gk?fj?fj?ei?dh?dh?ch?ch?ej?ej?Z`?U[???V\~Y_?ci?fk?fk?ej?ej?di?ch?ch?ch?di?di?ej?ej?fk?gl?gl?hm????MSuX^?hn?[a?ci?ej?ot?ej?fk?gk?hl?hl?gk?ei?dh?ba?hg?`b?Y[????NV}V]?fm?fh?gi?{x????????????g??m?????z?????????????????????^SQWQkc]w`c?wz?ak?LV?^[?da?TTpZZv\^kvx???????pn?ig?hd?c_????SQydd|kk?v}m??x???txwknuoryrvupts?????|?????????pszpo???????????????????????????????????}??y??t??o??w??z??~?????t??|?????t??x?????n??i??n??v??z??s??q??t??X??n?????????{??ew?`r?p??p?????????????????????????????????????????????????????????????????????????????????????{??y????g??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????u??c??o???}?c??m??ju??n??i??l??w??z??x?yr?st?p??|????????? w??hm?`e????Q^?[g?dp?Ua?bn?bn?eq?dq?cp?bq?cr?ev?iz?m?o?????y??m}?[k????HV{gs?y??ju?ju?jt?is?hs?fq?ep?do?dl?dl?dl?dl?dl?dl?dl?dl????KS?Ya?ks?`h?hp?hp?qy?ck?ck?ck?ck?ck?ck?ck?ck?]e?ck?]e?W_????QY?Zb?jr?ci?ci?ci?dj?fi?gj?ik?ik?ln?km?il?hk?hi?fg?eg~df}???JJJWWWkkkbbbiiieeejjjgggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiiggggggggggggggggggggggggggggggggggggggggggggggggfffMMM + + +RRRMMM + + +RRRFI\,+ +025<<>>>=<<7 +91+QU?+/ +<4444444466666666IM|+1 +@26/2........1 3+'OT~') 6////////////////JR_+ +:AG: ?!&18>"CI-KJJIOIRL??z??w??b??^????}[??f?wW??|??x??i?vS}qK?yS??]??_{wQhd>ZV0WS-QM'MI#]Y3uqK??|rnHwsMsoIkgAsoIhd>okEen?^g8T`0NZ*LX(KW'EU$BR!BT"HZ(7K@T!r?U5L9PBY%@O&?N%>M"=L!=N"?P$?R$?R$.D,B&A $? +#@ +$A 'D )Ff?N0N?1,2 +7OW?,5455443322////////JMx'.=/3,/ 9 9886532 1 1$#PVz"% 0332110//,,,-.///OSx#& 1$*)/5 6 9 99865=?/+OTz#' 4 0:1*F& +, +%'6STh>?S'$7 Q??????????????????????????????????????????????????x??????????????Z?uH~m??tF?xJ}rD{wH??T??b?????n??m??}??v??x??g?????}?????????????????????????????????????????????????????????????????????????????y??x??|??v??j??t?????????????????????????????????????????{?????s??m??f??`??Z?yRvqGni?gm?V\.BPUc2~?_EY&Ld0Kc/(do[fQ^S`)Ye+[g)Q[ HR6> += +; : 3 +2 +* +* & &")&- 0?/>`n? (<=DEIIH +F D +C +; +; +; +; +; +; +; +;JR?18G9 =69 : : : : : : : : : <4/PX?/5 B6689==>>=<65,+%%NNN + + +RRRMMM + + +RRRfffqqq cccqqq ccckn?3 7?9 <64??== 6 +7 +4 +4 > +?:;be? +?< @::::::::::::::::mp?H AG7:00111111117 834`d? 85 +93333333333333333pt?: + ELI N,-/:)CN=\c/Za-VR#WS$scI?z`??|??g?rM?yT????vT??a?{[??~??j?}\??j????????kygCba3KJBARQ#^]/_^0gf8xwI???|{M{zLxwIsrD}|Non at rqC^h3Wa,LY#FSERER@Q>O?RDW6KF["~?\@X;S;S8P3K +/G 1I 5O7Q0N*H +1P/N,N+M*N,P.R0T{?w;e78[E.Q;3D +$559KKEC53'' >6; D\c? ? C;6678899:11111111op?C <B25++>>;:87445 +934_d?1. +55544322101123344mo?: 5;-1++78::;:98 > +?12ae? +/- 1 .?A:JaZjwnQwnQu0?~9seBgY6{o5??M?????l_2ib4voA??l?????i??k?????x??|?{\?????c??~???????????????????????????????????????????????????????????????????????????????????}??t??Y??[??]??a??f??s???????????????????????l??a??h?????}??u??q??k??\ztDga1fj7UY&CR\k4??bG_%Lh-Mi.io]cNdMcLxKw 9r-f4d4d9N'CX5PA5PA-G"#=kv?< +8 94 BE +C C B +@ ? : : 7 7 + (7>@OV???!-C 9% ? +A +G IJ H ED????????nu?O +HN> +A77 @ @ @ @ @ @ @ @ +DE? @ah? C? +D4498??CCDD>>65//vvv cccqqq cccfffiiihhhiiihhhef?1-8: FGHAA;; 3 +4 +. +.687>fh? D96========;;;;;;;;eg?=3:3@=@66666666/107dg? +=2/6666666666666666jl?;@HE U 04AL*Va?io/]c#PIWP$?pe?????f??b??b??u????yU??h??u?dEzY:?vW???????rRpV5}cBnp>OQDF_a/z|J?O??P??W??|oq?ln66666666if?8.4. ;8 ;==<;:966.33 9ae?4,/66544322899: ; ; +< +<`^?-+3. +:779:<<<:8635)0fi? /'$" +4<4C_WfujLtiK{q,?z5?|Wm_:la!wl,tk?x+??b??k?}?. +E + +:0'H V 9 :' + 2&3 +;`]?4 ,"*B(%TB +6 +9! "&%7=/EK=RVWOST*+?hft-+910edPxy=pq5}0??B?y6??A??^??t?????|??a??O?wB??^??^??a????|LrFyl@|pF?}Sum?SK^V'??W??h??W??J?{6y?R??ca~|+HF+\6g\~? +uB330)????????}??p??m??z????????????????????????????????????????????n??Y??W?}Puh;ld6vn@??c?????^??g???????????f????|R??z????????????????????????????????????????????????????????????????????????????????{??q??g?????s??Tnj=ra6?tI??g???????????????????s??a??b?????|??x??z??y??g?zFg`,fk3UZ"ET_n3??aE]Gd$Fc#uvghToPk I?E?0?"wfc?/P+K67WB7X.O???*D +5.*: +A?=>?AAD C +D + + .1}??!.A?& < = +GHJ H GECCCCCCCCfl? G<D< J G J G G G G G G G GAC@ Gek? J>;3376@@DDLL E E ? ?89qqqhhhiiihhhfffddd```ddd```  +%(34bb?82;0957888888884737bb?:476666666611111111bc?3-6+402/////////2.2bc?5/26666666644566788cp?)=> KC$)<;@SlqHbg>]\ZYp_3?wK??~?????z??f??g??`????uT?jJ?nNsY8?yX??u??t??^tkDXS+GBQT'WZ-bd5oqBz|K}N{{IuuC??pmk8po9qp:nk4vs=E +JHB S S+BdkdDKD:D*487E&&3$#%;98HGFVOQLMOJ6;' fg|/"$#CEDZ[;fgGnn.??P??=zx%sk??3??h??|??j??H?H|m6?H??O???sm3zz>hh,psvzH~?P??_??c??d??a?V??e??a??T?nIgS.?J(3???K?E?;xK{????????????h??S??m??~??t??y?????????????????????w??x?????z??n??h??g??_?|P?mA|e;?rH?{R?}T??_??n??w??u?????l???????????????????????????????????????????????????????????????????????????????????????????}??s??c??SxvEki8\`-VZ'?????a??`??????????????o??q??|??y??k??k??r??crH[X+^[.PV&flW(Lf1Uo??o,K6/ " +!9@AECB878 + +<:C  'y?v(;% 1'* . 2 +S T +LG31????????_h? +A; +D9 B> +A > > ? +@ +@ABB +@B >A]m?C += ?>>>>>>>> +@ +@ +@ +@ +@ +@ +@ + at hh? + +<0 +6 % ```ddd```fffddd```ddd```  +-/89bb?82;0957888888884737bb?:476666666611111111bc?3-6+402/////////2.2bc?5/26666666644566788bo? +6 +L BGG>@LXZfwzOfi>]X\Wud8?|P??y?????s??e??e?wU??v?qP?mM?qQ??v??x??h|hEUL%I@FAGBQR&WX,ce6qsD}|L~}MxxFqq???uppzs?|uA?wI?yK?uKsI}yS??d??b??c??\?qEGVQ(72J??HoX?j?,2?E??u?????S??^??n??{??}??|??}?????x??g??k??j????????????????????????????s??d??W??]??Z??^??h??v??{??{??w?????l??p??????????????????????????????????????????????????????????????????????????????????????????????v??j??^?|Mll:__-??Ua_.l[/?}Q??f??v??~??u??w?????|??h??`??b?Uth>?}Pol?JP Z`0??lNZ(ARCT Jd +F` C_.Jf5Bc\8YR-Tc1Xg%Q^ LYDM;D +2D 0B/K 1M~??+A?1K0=W<+D$#< (!II]\@A +!> E &w?o+?#'; !5 .; &// +D +M?3 > > > > > > > >_i? @: +B8 A= +? +> +> ? ? @ +A +AB ?B +> +A_l?B< ?>>>>>>>> +@ +@ +@ +@ +@ +@ +@ + at fg? A5 ='- ```ddd```fffddd```ddd``` + +**78@@bb?82;0957777777774737bb?:476666666611111111bc?3-6+402/////////2.2bc?5/26666666644566788^k??P?>(+N^][pomxsImh>mc(yo4??W??i??z??t??r??l??l?yW????i??j??g???????????gsjCcZ3^Y1^Y1[X-`]2hg9tsE|{K{zJttBll:??vppT5K 1R2S6P 6P 8L7K6I 4G1H7N1P*I$G+N,Q0*O.bx?:+/)/+-11111111/1/2bc?6134478:;==99999999ad?93 <1:6911111111/2.2bc?5/2////////11111111de?5.6+3.111111111= ?14`f? -*,6171/T956401ZU8??lu|SovMZ^CVZ?ef^TUM!* d_}"* +2' L!H +< . $ 5//.,*'RO at wpxD=E0%C"~u?&3=5JTSs%$D""2346 ;)#-,N;fN.V>:G'4CAhw?&_%@-?ZG<^:\#<. F +AdaCFKN + ){?o5J)5M1I6J.30 6?:;;;;;;;;`g? =7 @5 +>: = = +> +> ? @ @ +A +A ?B = @_k?B< +>>>>>>>>> ? ? ? ? ? ? ? ?df? F< D2 9() ```ddd```fffddd```ddd```  +))65==DDbb?82;0957666666664737bb?:476666666611111111bc?3-6+402/////////2.2bc?5/26666666644566788[g? >= +2/.lj9??umm9gj3`c,X]#^c)MSNTCYT:P>T;Q0$\k? +3)2) +4..11111111/1/2bc?6134478:;==88888888`c?92;0:5811111111/2.2bc?5/2////////11111111de?5.6+3.1111111118 :-0`e?.13<56 +@ +,#aXS7CY3?U /! =2[Xm,)>?7BA9DE;:h^]vlc?xomZVp]YoM?|Z?y8zl+?u8??O????t[ +[Kz +9.3!J 2)-<964094209 +&^]?= +/ +/ %!63Dpkr>9@ + +MCBxnm}sroed! &vm????????i??p??x??t??i??g??e??a??]??W??k??i??U??`??e??p??n??U?????oN_W at QIFXHDVFNT8\bF??R??}?????y??k??z?????u????????????????????y??y??????????????????????????h?yN?tI??]??e??V?~W??g?????????????????????????????????????????????????????z?????{?????{??v??{??e??g??k??v????????????????????????????????x?????\om\FdBf Hl&GfD8W56P !;ZZaq?P"59"B3S".K+H/1%' @ +9@@ +64KM&u?g1G#5P 2M0J 5O1D./ +&7@88888888`f? ;4 =2 +<7:=== > +? +? @ @ > A= @`j? A;=>>>>>>>>>>>>>>>>bf? HA K< D5 7'&```ddd```fffddd```ddd```  +%&55;;?>BBbb?82;0957666666664737bb?:476666666611111111bc?3-6+402/////////2.2bc?5/26666666644566788`k?; +0SOFwsj??_tfC|e9?uI??^??m??s??m??e??_??]?rN?sQ?xV????????s?rR??c??y??{?{X\S,NE[V.niA??W?yPzqFulAtm?tm?pn=nl;??wkn9ch0Z_'PXW_$FPHR9O4J +1G5K ?UE[DZ@V>T;Q CF:DF T<::./*H???uv??i??e??Q??o??f??x????????{??m??P??_??h??_????o9"2 [L?,T@A++/7<6352> 9,& 47 1cb?,%%0?*+6#%0!yow????????p??????????????????????????}?????r??Q?|K??T??n??x??p????????~??e??bstU{^?????????????y??z??~??{??u??i??t????????????????????~??????z??u??q??r??s??q??]??X??`??WxlB|sJ??e?????g?????????????????????????????????????????|?????x?????{?????w??p??s??d??c??b??f??k??o??n??m?????{??u??w??|??|??s??i?????c??[??a??PuwExzHsuC?uK??]??l??k??`??TwtGmj=BDQS$JP ]c3??nWa/LX&HT"Ud-M\%IX!L[$I\EXF^NfA]Ea@[<1L-,UDnqd| ?/ +,< !<)>Y2L?:TG-J$A0 $51ed6; + m?c$9(C(C+H;XH_3>U)"/@%?>66666666ae?81 +:0 947<<==> ? ? ?= +@< ?ah? +@:=>>>>>>>>>>>>>>>>`g? B? +JB +KA +C64%#```ddd```fffddd```ddd```')34::<<<;::bb?82;0957555555554737bb?:476666666611111111bc?3-6+402/////////2.2bc?5/26666666644566788gq?A'$*:oiI??d??X?u@??m??t?????z??l??b??[??]?{Wuc?hF?}[???????zZwZ:?}\??p??u?\pg at ne>~yQ??c??]?|U}qGvj at rj74 +;?370 >? + 52+,K' nfu?????????????????????????????????????????|??a?}K??Q??i??}????????y??m????????u??t???????????v???????????}??w??n??s?????v??????????????{??w??s??n??n??m??p??p??d??\??Y??Tsl@\U)^Y/rmC??i`aAz]??w???????????????????????????????????|????????????????????{??~????{??p??f??Y?}P?yJ?wH??w??r??k??h??i??k??k??j?????d??Q??OkoKT:44444444bd?608.735;;<<=>>?=?;>af? @:<>>>>>>>>========^j?8:DAJG ICB64" ```ddd```fffddd ```ddd``` !)*45;<;;::3311bb?82;0957444444444737bb?:476666666611111111bc?3-6+402/////////2.2bc?5/26666666644566788eo? I'+4<@Itl=}uF??L??T??????????????s??c??J?~E?rNiW3}fD??f?????s?qQ?eE~dC?sR?~[?{X?{T?|U?|T|wO?wQ?rL|mDyjAtl>sk=mi9jf6??qcf1U^%JS>LHV;K ?O2H8N@VCYBX?U>T=S;Q8N9O6L ??Z2H:P0F,K-L3L +5N 9L:M:L:LK]):L(?%(?% 6N%= L@ec?2)3,5.-11111111/1/2bc?6134478:;==66666666^a?609.73611111111/2.2bc?5/2////////11111111de?5.6+3.1111111116 8+.`f? -13<:6; +  +D9=rgkm\L]L]C4?iV????????u??i??x????????n??????????????r??l?????????????????? "wx?(3 H4 7 +4.*+/ 3 :');<+1Nkr|3:D16L$:0*3 E5; >7$;GOfs{? D&6->???????????????????????????????????????????????e??f??j??{????????s??U??p????????????????????????????????????????????????????????????????{??v??u??z??z??w??p?~S??X??[??SvrEfb5\[/[Z.??relCqqOnnLvlS??y????????????????????????????v?????z????????????????????h??k??h??c??Y??X??]??d??c??d??c??^??Z??Y??^??c?????_so?ie5TV$PR Z^+Z^+UT&ZY+ce6qsDxzKtvGjm>dg8lrBek;GOX`/??|?SksBS[*@^:X:V@\E[@VCYI_JfGc;]+1S!AG39%VP\v?< +FMGX #?.J+H4.K7-I09 3 +%T +Z1,=5.?7???0A;2F*8L0 at Y"2K'>)@0>K(6CT<11111111bc?3-6+403:;;<==>><?:>be??9;>>>>>>>><<<<<<<<^m?- +1:= EJLNNEC42('```ddd```fffddd```ddd```+,12<<BB==77/0) *bb?82;0957444444444737bb?:476666666611111111bc?3-6+402/////////2.2bc?5/26666666644566788\f?M8;@JMRla)h]%??@??f????~????????y??a?o2nZq_;XF"u^G2B=M/B4G4J +>TI_J` CY;Q8N8N9O6L 8N5K ??Z2H:P1G-K.L3K +5M9K9K:K9J/@, + +2'N_ic?2*4- 82311111111/1/2bc?6134478:;==66666666^a?609.73511111111/2.2bc?5/2////////11111111de?5.6+3.1111111118 :+.`f? -02=>96*XOJ?????1?w"??]?????{??Y??h??g????????????????????|?????????????????????????????????WDb%0_d? 7#:&*-. 0 +2,$%-0)3 +? <,_hg) 654C?/."/"5!.A,! +??????????????????????????????????????z???????????~??p??y??{????????|??b??U????????????????????????????????????????????????????????z??}??u??r??u??~??|??r??f??[??g??q??n??l??f??VonB??lJS$DFKM&e^B?~b?sa?tb????????~??~??z??|??o??h??k??c??n??n?????x??v??}???????{??k??V?yL?}N??U??[??_??^??R{nApc6pc6uh;??g{pBsm=?|LwuDjh7\^,KMOR#KNNQ"[^/eh9eh9]c3Y_/7= +U[+X`/dl;??p^f5Ya0T\+KsDlFhJlLhD`E^ Jc>_=^5^6_+XA$Q:BQ9Hj?? + lNL$3!51E"8O+AX/B` 3Q 8 )*30-?/0B2???)8=+<23D:>T.6L&'<+ +" +BC////////dc?1+ 4)2.0::;<<=>><>:=cd??9;>>>>>>>><<<<<<<<^o?$ ++4: BJLUTLK>=32```ddd```fffddd```ddd + + bcw!////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402444444446847bb?9354444444444566788]p?)d"+MBG at y~we`6?|R??{????????w??y??m?vaw\G]f;Yb78:GI!??z|tO?sQ??_?wV??c??n??k??_?yV?|Y??a?|L}wGzvF~zJ?~MzxGei6VZ'??gKTN]&N]&2C 5F0C 3F5J9N=R>S>T>T?UAW,?= 31bwV)-@ .A!'31!-+: +0:9 = +?11111111bc?3-6+402/////////2.2bc?5/28888888888888888be?:4 +=2;7966666666),!baqddd```fffddd```ddd bb| #&////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402444444446847bb?9354444444444566788MZ?I 'CVVLjj`??m??m??g??o??p??g??k??d?u]~`Hfi>\_4DAUR)??z??\??`?vT?pN?yW??`??a?~[?zW?}Y??]?zJysCrn>tp at vvDssAfj7[_,??iEOAP@O(;1D 0E 4IEZEZDZ@V:P5K +2I1H6L 4J 6L4J ??a4I=Q5IAS?Q;J#3B(2)%) "--444411bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+40211111111?A)+]d?#(+1 +C*B>,VrZN??t??M?{???]??o???????????????????????????????????????????????????????????????????????????ldaum?##<203; < 9 +: 9D%' 3% * fh? <.3893 E224 = 3* "> N)???????????????????????????????????????????????????????????n?????Y??O??`??n??{??{??g?????z???????????????????????????????????????????????{??t??s??m??i??_??]??Z??n??t?????^??X?~O??n?????^{?Nbi5JSPY$LS[b.}{J??]??p??q??g??c??i??q??q??j??n??d?????r??m??k??n??o??m??l??g??a??[??W??Y??O??K??J?~Dvp6no5uv@(:K4E2C "72G3K6N;Q:P:Q +:Q +:Q 9P9Q8P2I1H6L 6L ??e8MAU$8L>J45A+'1(! +" 334411//bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+40211111111=?-/]c?'$(<4YiWe?q??????????|5??m??{?????????????????????????????????????????????????????????????????????????????????dKDU:A[@G + ! /*009F<? '#!+)4# a`?B< L +PB:E5=4) +$<<2?????p??h??k????????????????????????????????z??|?????????????????i??Y??_??b??o??x??m?????v??t?????????????????????????????????????????????????z??r??q??j??j??^??m????????t??W??]????????n??g??Pah2W^(CJHO`c.twB??^??p??s??n??j??j??l??l??v??j?????m??n??s??j??i??f??e??a??_??]??\??c??S?{E?wA?yB|u>vw>yzA??v_g.T['NU!KMSU#ML[Z*NU!OV"NU!JQENCLBOFSAP3B .?0A +??^1D W>W6N6NP(3E#)5!-( ,.4444//++bc?3-6+402//// ////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+40211111111:;03^c?/!% +xp???????????d?}2??R??t??~??????????????????????????????????????????????????????????????????????????????????????????????~o66@2HT<5 D /~q?????????????jj?6''/87L@ + G @2,02- I: +%90K???????x??n??????????????????????????????????????z??z?????????????????r??Y??Z??p??w??????????????????????????????????????????????????????????????????????????p??z???????????h??n????????p??q??`x}Esx@`h/hp7JRS["nn8??R??c??j??o??v??e??g??v??o?????s??k??j??o??m??h??d??a??a??b??c??g??\??O?yE|u?wp:rr??yel8cj7ah5[].[].LKUT&ELGNIPJQIRHQERFS@O3B 0A +4E??a3F=./ +*j{s!2*'61$10550011111111bc?3-6+402/////////2.2bc?5/26666666666666666be?:4 +=2;7966666666;=47ba?/ddd```fffddd```ddd + !$),`b?525////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402444444446847bb?9354444444444566788b^w  LBK^T]??????????????|??n??]??Q?|P?vJ?sL?sL??j??t???????????x?????g??u??m??d??a??a??]?|S?rIsuCpr at lnK??]/@ +@2G&?6O.J*F 6K1F-C-C2J5M4M1J?W ?W CX@U??w2D3C)$4 2/,(-.256633//++bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402111111113558_c?8#&@85???????????c??H?|9??m??????????????????????????????????????????????????????????????????????????????????????????? ?????????????% + F=. ::.OZGRJR\d)tukqAio?_`4\]1ML VU)PW#OV"NU!LSIRDMn9i.n$dVPCB <8 '+]lq%*,9B.;D 4094463611111111bc?3-6+402/////////2.2bc?5/26666666666666666be?:4 +=2;7966666666;=6:`b?5)+   ddd```fffddd```ddd!"*,,/]d?3-/////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402444444446847bb?9354444444444566788nk? ZS[????xk]OB?^?????q??^?xI?qB?nE?oF?vQ??[??l??????????????w??????????????s??h??_?T?sFvh;mq>lp=fm9`g3T](HQ9H2A +v?Q(;*B3K$@/K'E #A3F-@(=+@4K;R ;S9QBYAXDX'>R!??}'6"/(122222113311////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+40211111111* ,58`b?@% + (?ym?????{??_??W??U??Z??v??????????????????????????????????????????????????????????????????????????????????????????????????????????hF + + ,1 *<21??????????????????????????~?bz]PKH*%"#2 ">GM N6,`UQ?????????????????????????????????????????????????????????????????x??q???????????|??R??i??y?????????????????????????????????????????????????????????????????????????????~???????????j?????}????????s??`s}@r|?fv7P`!BPESNZYe'v~B??`?????{??r??^?????p??r??t??r??n??d??^??X??U??T??T??V??b??f??Svn?kc4ed4dc3??ydj:ag9[a3OP&OP&ECSQ(NU!KRJQKRKTKTCP?L>M6E9JAR??ox?T.C +3L:S%C.L*I ++J5F$.?(; +-@:PDZE\CZ=SQDW>Q>T=SUF]I`G^CZAYAY??k9J:V ?['S5a0c5h*ZN'WK Gr=h /m$bUP KB 3 +4MYq +) + +E + +BGB9:2311111111bc?3-6+402/////////2.2bc?5/24444444444444444be?:4 +=2;7966666666(+.2^d?:9;:91/'%ddd```fffddd```ddd#%/024,/]h? +(////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402444444446847bb?9354444444444566788mr?X]q???GGQ ??r??~??k}oRh[9eX6g^=ofE~yY??n??l????g??`????mD?qH??g??V?~S?zL?qCsk:kc2ca.b`-ah4\c/QZ%EN7D1>.?0A +??^:O=Y@\!)H 2Q3R9XN^CBR77I!5G;P>S;Q5K +6K6K8I)1B"u??%//..-/,-++//1144bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+40211111111 "59ab?K , +/??t??|??j??f??f??z????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????FL>::"????????????????????????????????????????????????????????Yz?0~?4??????????????????????????????????????????????????????????????????????????????????????????????????h??j??o??q??y??~?????z?????x???????????????????????????????????????????????????????????^???????????p????u??[??U?I??Uu?Edy4[r,Zq+Ja5LK8EM\%@O;L>O??l>QI\$FY!?U>T=S;Q8N3I /E-C</.11111111bc?3-6+402/////////2.2bc?5/24444444444444444be?:4 +=2;7966666666#&(,_e?:<?@?;9.,%$ddd```fff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffgefgefgfbgfbfg_fg_ci]ci]???LSKbkjhqpOX_Zcj_gthp}`c?`c?`c?`c?`c?`c?`c?`c?Y\{hk?`c?JMl???JMl]`nq?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?}?IKrfh?oq?WY?_a?ac?hj?`b?`b?`b?`b?`b?`b?`b?`b?Y[?hj?`b?JLs???JLs]_?np?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?}?IKrfh?oq?WY?_a?ac?hj?`b?`b?`b?`b?`b?`b?`b?`b?Y[?hj?`b?JLs???JLs]_?np?`c?`c?`c?`c?`d?`d?`d?`d?dg?]``c?il?hj?]_?]_?fh?????????t\??y??????q??R?????{????????w??y????????v??????????????????????????????????????z??{?????M??Q????????????????????}t?^z?Zq?Q|????????i??in?di?ch?hm?pv?w}?~?????v?l???l|_u?h???amiMUjlt?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?}?IKrfh?oq?WY?_a?ac?hj?`b?`b?`b?`b?` b?`b?`b?`b?Y[?hj?`b?JLs???JLs]_?np?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?}?IKrfh?oq?WY?_a?ac?hj?`b?`b?`b?`b?`b?`b?`b?`b?Y[?hj?`b?JLs???JLs]_?np?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?}??ILofi?or?WZ}_b?ad?hk?ad?be?_b?]`?`c?eh?eh?`c?J]?n??dn?HRv???if{?x|?rv?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????}????????????????????~??r??r??|??^??t??s??j????????????????????????????????????????????????????????????????????????????????????????????t??p??b?????l??p??i??}??cz?T??}?U??e??k??l??l??l??j??h??e??b??`??a??c??f??h??j??k??k??k???o?Z??u??w|?`??p??[y?N}?S??a????xq??g??Uv?Hi?]j?kx?hu?JWy???P[{ fo?Zc?`g?`g?af?af?bf?bf?dfdf`b?`b?`b?`b?`b?`b?`b?`b?}?IKrfh?oq?WY?_a?ac?hj?`b?`b?`b?`b?`b?`b?`b?`b?Y[?hj?`b?JLs???JLs]_?np?`c?`c?`c?`c?`c?`c?`c?`c?be?be?be?be?be?be?be?be?}??ILkfi?or?WZy_b?ad?hk?be?be?be?be?be?be?be?be?Y\{hk?`c?JMl???JMl]`nq?`c?`c?`c?`c?`c?`c?`c?`c?dk}cj|bkr`ip_i`]g^^gT]fS??|LSCggeoomZVgb^ob[ze^}ffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnfffffffffffffffffffffffffffffffffffffffffffffffffffNNN + + + + + + QQQ LSL   ........'6 1$PRx$-6................JLu- + 5:) +3.-11111111*9 4'PR{'091111111111111111JLu- + 5:) +3.-11111111*9 4'PR{'09//.... , , 1+, +4 7 +3<H??w??K6{-]QLP?{??T??7inFX]5RKCSLD\S*bY0wfJ?y]??t????X??o?????j?vV?zZ??`|iIe[8g]:cc=^^8V]3X_5Kg4Hd1?US2HF#7\2W:P#?Ux??BmR7j?*]2*[X9jg 6fA =45 +< 5 5"((394C.SbM.>$&6FQS  /................JLu- + 5:) +3.-11111111*9 4'PR{'091111111111111111JLu- + 5:) +3.-11111111*9 4'PR{'09................JLr* + 27& +0+* + 2 4 +3.*+. 1=,, +4VNc@,-???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????^???????????|??????????????}??????????????????????????????????????????????????????!-0"VeUV??????????o????????m??????????????????????????????????????????????????????????????????????????????????????h??h???????????{??p??i??Whp?We2We2S] _i,T_'Q\$|?X[g7ksLU]6??p??k??e??f??W?sH?kP6K/D/K5Q1S /Q*NL)MK:b)Q6< =/HQx- 8-**((&&&&11111111JLu- + 5:) +3.-11111111*9 4'PR{'09........,,,,,,,,JLr* + 27& +0+*,,,,,,,,'6 1$PRx$-6........%%OUG +  + + + + + QQQ fffeeeYYY`fd  --------)31-Z[?/,-----------------de?4)-'2)'++++++++'1/+Z[?-*+++++++++++++++++de?4)-'2)'++++++++'1/+Z[?-*+------//,*,0+'+4?????sC3r:*iwwu?????Tw?%]c3PV&KE5LF6YRf_+pI??\??l??j?tL??j???yf>dQ)vc;??]~oHgb8kfBC#)TLJ????????]??@??P??g?????}???????????????????????????????????????????????????????????????????????????????q???????????????????????u??\{?Jv~Ebs%`q#TfZl"|?PEZI\$nnQ>Q=Rii? + +C:8;;;;;;;;;;;;;;;;no? + 9-50>62444444444 +84 7ij? +<314444444444444444no? + 9-50>62444444444 +84 7ij? +<317799====9< ; ;20 2:?????d1'c-#_sxq?????.TiJSFOKF0QL6f]"xo4?Q??`??X??o??i??r???mZ/tb4??X??W?zMvtKvtKlwObmEM]8 at P+/B':E +8DF +GLNk?3 "2LHII +F88 + +D0& )EOXFTCBP?=K>mu? +C<;;;;;;;;;;;;;;;;no? + 9-50>62444444444 +84 7ij? +<314444444444444444no? + 9-50>62444444444 +84 7ij? +<31;;;;;;;;;;;;;;;;np? + 5)1,: 2.0/ 4;=99=#&G4 (??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????y`B??k????^T??????????????v??{??????????????????????????????????????????????????????RWj +% #h`]???????????i??e??o??W??j??j????z\?}m???????????????????????????????????????????????????????????~??u??p???????????????????????{??i??Z??Sx?0m}%`tq?0??XIbEa>ZC\Tm,v?P??l??w??u??{?????S??]??b??W??O??O??R??N????|J??S~zJ??u??`srBgf6ai:|?U??v??]??}|?Vs}Kbl:@LKW%>JKW%??bS`+DR4B +CT +CT +AU +AU +AWCYC[D\:T +:T +9U +9U +8W 9X ;Z<[??^)D,ED]AVBW8O62444444444 +84 7ij? +<31;;;;;;;;>>>>>>>>nn? + +@4<7E=9>>>>>>>>; ?;>ii? + +C:8;;;;;;;;<<0/  kpl  iii fff```aaaY]h  (,155555555:623^]?9235555555555555555[\?-+5+1,0........3/+,^_?2+,................[\?-+5+1,0........3/+,^_?2+,..3388::8:20 +1#%LFIh_b????jsT + F5?IApzr[t Jc7B +=HLH-VR7ld&~v8?M??S?~S??s??q??`??|{i9??P??e?yN?{PwxXghHGU>0>', &#)'.124gk? 5' 3 903 C:52;&#(*MXZCR=/>)(6)dk?B:5555555555555555[\?-+5+1,0........3/+,^_?2+,................[\?-+5+1,0........3/+,^_?2+,5555555555555555[\?)'1'-(, + 7.0@H@ +64(:6DH=C????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????~c???oMK?]W?~x????????k??o?????????????????????????????????????????????????????????0/+P7$Cg\???????????????~??y??~??g?????k???????????????????????????????????????????????????????????X??N??j??z????????????????????v??e??U??G~}=~?6q})jy&??>??eWoQnNkUs)KiG`F_J]&Re.lzI??`??q??????????????????z?????n??w??q?????rcdBNO-;LL]&izC_p9??ky?Qt?Mdr=?MCQ3? +DP??bS_-HT">J9K8J5J5J6L8N:RAZBWCX6M7N(F/M(N"HE!L! KBG>Y87 G]c?85655331111........[\?-+5+1,0........3/+,^_?2+,5555555577777777[Z?42<283777777777:623^]?923 55555555:922%%X[baaafffiii  iii  cfu + &40/3 ><<<<<<<< A;29dd?;6=<<<<<<<<<<<<<<<!$ 20 -/ 0 +11 +.e\? .#(##" 27867" +.2?8Vc\TdG8H+'5$ +ls?NF<<<<<<<<<<<<<<<11@C 7/4???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????{?xI??s????????????????????????????????????????????????????????????????????????????????????0B'.??v?????x??~????????????????????????????????????????????????????????????@=vI <K!8;+R?????????????????n?????U??h?????????????????????????????????????????????????s?????c??]??????????????????????????r??c??Z??Q??F??M??F??A??W??|u?8p?:j?4]y.So$Lg$Je"F^$=U>PCU#qrF??Z??k??m??j??j??j??c???msMnxSisN??xs}ZR^:LX4AZD]CYX5 = 6 +7#7,50&/6E2IXEDV.*<" +ip? #IE1111111111111111cc?4/ =/..64444444451.8bb?0.74444444444444444cc?4/ =/..64444444451.8bb?0.71111111111111111cd?1, +:,++3/++1++,F6, ?????????????????z??l???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????h??k????????????????????????????????????????????????????????????????????????????????????I4= + !#SDA?yv?????????????????????????????????????????????????????????????????????kps (6-!5^Nr???????????????dfQptu????????????????????{??w??{???????????????????????v?????z??z?????????????????y??}??v??f??]??]??X??M?T?T??L??Y??{{?Au?=gy/`{.^y,g?C< ?##-?6$ +",6 at P6GW=3F2mu?1 + NK2222222222222222jj?3.:375 + +A77777777446Bii?3.97777777777777777jj?3.:375 + +A77777777446Bii?3.92222222222222222jk?0+7042 +>208 +=/+KHIy???????????????????????????????????????????????????????????????????????????????????????????????z???????????}??x??x??v??x??????????????????????????????????????????????????{????????????????????????????????????????????????????????????????????????????????????zju0#=RHP??z?????t???????????u???????????????????????????????}?????????????????????! +29 5 +6%1KNUBELpx?!)W?????z???????????????????????????????????????????????????????????????????????}????????q??h??h??`??R??g??m??a??f?????N??Ily4q?>aw.Wq*c}6u?My?Qx?Tv?Rg'm?-n?0h?*f+h?-`|(Vr??V@` +Bc6WTw'9\ 3UGi<\Tt)@`Ss*?ZId!2HNd$Te.Uf/GTVc.??iOX)LS'QX,M]K[EXBUAVDYG]I_@Y=V8S5P +2O 5R9V;X??V=Y;S0H &8BT"BV6J6R3O$J!G#N +V(L7<' +;7 9 +;V^? 7 +9.2200..--77777777jj?3.:375 + +A77777777446Bii?3.92222222244444444jk?.)5.20 +<44444444//1=ij?.)422222222---.,-**sr?!  iiifffddd``b!#/0bb?809+4*,////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.066--))44I +O5< +. +*?KKs??? ?.,>T]?rBiW3W'4X(:DMWkb'sj/~wA??_???????????m??Z?{K???~qE??z??j???fe`$%A : BQHFF??44++ac?,(0.79= +:8/+&6(0G:BY2:O$ +)ej? 24.11111111////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////^f?5& +.# +25 K<= > # $QML?????????????????????????????????????????????????????????????????????????????????????????????????????r?????????????????s??p??o?????????????????u????????????????????????????????????????????????????????????????????????????????????????????????????????????????????{?q?) !5???????????u??U??h??u???????????????????????????????????????????????????IM6hr?bl?DAGL +P9Z]~JMn A=K???????????????????????????????????????????????????????????v??f????????????????????}??a??O}?I??M??T??_??P??R??znr7rx:??H??K{?Cp}7n{5r?;{?D??J??N??P??R??Ju{=sx8x}=z=v{9??cfp+\q$Od9YAa7]CiL^ Se'>Wh?@[{8)I > +" (=gtjz?}|~?8,%>T\?tAlY.R"'K=E +RZre.zm6?wF??\??v?????i??_?Qo^0????{S???}c[ZX986 +,9 BOG??9922++bd?.+3078:8;8 <;$J3:WAHe1" &3af?- 3/11111111////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////^g?3& +.# +57<R3L"????????????????????????????????????????????????????????????????????????????????????????????????????????x????????????????????q???????????????????{????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????_NX/-CKI_????????^??k?qV??g????????????????????????????????????????????????????????????#RE [Q :,??????@:< )2Cehq?????????????????????????????????????????????????????x??s??{?????????????????m??Z??V??X??Y??`??N??R??~tx=v|>??H??K|?Ds~:q|8t?;{?B~?G??I??Y??\??U??I?~A??C~>xw7??hns0fs+YfAY F^5W?a +BVH\9Raz9Zy61P +Cf"Fi%Kk(Ll)Un-Ng&??oHVX]#RWJY"FUARBSEYH\!G]E[B[?X;V;V9W8V3Q /M??a8R8R:T)C5O3L5N4M5N5O1K-G/I +8R@Z"+d +O)2iv?%!44@A;<11////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////++//2222bc?1&  `a[fffddd```$%//bc?5/8+4.0////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.088//((//7?),'`js???ZiTjt?3+ ?T[?xEtb0T&CDGX[$}g5?p>?wJ??X??i??k?sB??a?}PRG????|[? ?s_YK# :?F@4422//++`a?0095=<>775727 7<  +,!C"D^c?* 1,11111111////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////^e?3' /& .69:J.G DHT??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????1-D +#????????l??s??i??s????????????????????????????????????????????????????????????/>U""????????u'042,% 15*RTIq[QtG=`-)J#@!!C##EB:rsnklg???????????z??f??{??s??y??~??p??d??P??R??R??]??`??J??Q???|}Dz~C??I??K~?Fw??v>x??|?C|?C{?B??Z??`??]??U??O??Q??K?}B??pxw7qx4el(M_N`:R?W @V@V7QWq0Ts07VFe"Lk(Mj(Li'Tj*Nd$??oKYYc'S]!JY"GVCT DUFZG[ DZAWAZ>W;V;VY7R +.I/J>YLg"/9n K/w??"+ )*7845,-////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////--//1111bc?1!(`a\fffddd``^  "#()--bc?3-6-624////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.099//((//F8%- $hsw???N^Cgt?:.9OT?tGwg:[0%FII[['?e6?pA?xR??`??i??e??L? ?j?{QMF???pjRQML)%$)+::=:++++++--_`?43 + +>8@;= D +E B +A;:45'B,1W"'M^c?, 1&11111111////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////ad?1' /( 19; +H:@>...??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????~?,&2:-6??????????????t????????????????????????????????????????????????????????????x??# !+-894AB=?????????ubD!R <1 < E833Q + F95571,`_.;6=???????????v??u??x??y??x??f??\??I??M??M??^??^}zG??P????~K}~E??H??I}?Fz?B{?C}?E?G~?F|?D??T??[??Y??T??U??\??[??V??v?y>z|;qs2[h"\i#CWEYE_>X9VMj(Mj(:WB\Lf%F_C\H\EY?? kK[Zh+Uc&N]&KZ#FW FW G[ G[ BX>TC\@Y\@^?]=[??h;UX-H7R +3O2N5Q9U +:V 5Q.I0K??zjydfq?=,$=@l_ at l_>]4-L#NJ]Y)`4?mA?{W??g??p??i??[??Yig @PN'???OM@!,#&336434))++--11cd?608,3*+,,.024771C %OF]b? 4 +5%11111111////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bd?/' +0* +3;=I92+;\?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????|??????????yz "#54+>?jw???????{d??l??????????????????????????????????????????????????????????????~???????????????????????m?t?=.A("4Q358921,-nn?0//Knl`????????????????????x??k??[??\??\??]??]~vH?Q????{K|zG}J~F|}Dz~C}?F??H??K??I~?F??S??X??W??R??R??]??^??[??x?y@|~?vx9er-gt/NbNbFf#7W<[CbHb!D^DZSi)Pd%I]HZCU??iI[Wi+Qc%JY"HW DUFW J^#L`%Ka#I _!Ib!D]?Z?Z@^B`B`@^??h=W?ZC^2N;W +6R6R4P2N0K0K5N:S>V$@X& +G +Js???OL/>9 --11+*////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////2211//++bd?-&.%.),    +``^fffddd  +`a["#5522,,**bd?-+4.779////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.044++))44::9N %6WcaVb`ff?> ( (%JC0UNA;'^!|???????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????~???????????????????????????????????????????????????????????????????????~??????????????????????????????????????????????????????????????????????????t????????????)!#2]Ll?????y?xa???????????????????????????????????????????????????????????????????????????????????????????{??????}s~3)407== 3/ +) +ik?:' +;$45Gpre?????????????????u??j??b??`??_??c?yO??V???wI~xH?~N}{HzxExy at z{B|?E~?G|?Ey}B??T??Z??Y??R??P??W??V??Q??y{y at u{=rx:du1j{7Ri#Qh"Ch#-R +=\:YE^Rk*L^ _q3n|?bp3Xh*N^ ??nJ^Rk*Jc"FUCR@QDUL`%Ui.Yo1[q3Qj)Le$D_B]A_B`B`@^??e>XC^Hc8TB^=Z +lx:ht6[r.cz6Ih"Ih"Hp*,TAa5UDZZp0N\es6??Ps~Baq3Td&??tNd$Uo.Ke$O^'IX!CTEVL`%Wk0]s5aw9Zs2Sl+Id!D_A_A_?]=[??b?ZEaLh>[ HeC_B^Ke&Mg(Mc=H^8?QE5G;- + +21:966////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////8822++((ac?+*32;<?32$# +```fffddd  +`a[  !/0BB;:11))be?*) 2.79;////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0//((++==JjRO HE 4 jV?G 4%..'??=P2_T E<:; C ;7`i?./?= C9=0/ODCchda?~{??c??a??B?|:??j??t??d??f???sI?{M??Z?}M|vFrocu7]o1Qn+Yv3Ae@dT}73\Ii&5UAWYo/IT`k/??Qs}Abp3Uc&??vRh(Xu3Ol*^m6Ve.J[$GX!J^#Rf+Wm/Zp2`y8Xq0Mh%FaA_@^>\;Y??`@[GcOk A^LiHdFbF_&Le,MaF>R7"14 PC( =^mp +;JG  +54<;;:////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////8822++&&ac?+,64>AD 76)'```fffggg bbb -.9922222222cd?3. :2 + 9/,22222222 +86,.ab?613>C@0).417799;;;;cd?3. :2 + 9/,22222222 +86,.ab?6132222222222222222cd?3. :2 + 9/,22222222 +86,.ab?61399999999;;;;;;;;Ze?Q"4$ -A(=KESRY#OV fd4??R??YzrCi^(eZ$JZGWXg at 5Ddno +(.A>>?> B +; :9@ &! % +!_a?9@WC&(O + S T $+17I EWHZFX098 +,5hh?1%1-2< 7*(1004499<DU9/~?????????????????????????????????????????????????????????????r??d??g??k??r??????????????????????????????????????????????????????????????????????????????????????????{??????????????????????????????????}????????????????????????????????????????????????????????????????????????????????????????????????4)1 6- +????q????????????????????????????????????????????????????????????????????????????????????????????????????????????fi` ,+ +7 6 +; +;[i? +/.:29(%&)8[^m??{??yz?Pz?P~?Ax;??j??c?}O??f??}?o8?uC?wE?~W?vOksNemHan at boAeq3dp2]\#qp7??H??P??J?B?t8{k/??oga-gvOpXKnVLoW/bS$WHDcLk.W]5^dC^?@[_hm ..A@@>43+,,#'.2(9/):0&2`c?19<)=!" + HA#06D BP,9C8 *  +`b?%);D +83 + 9 +6-)-..124577YZ?,)2)2.111111111-0+-]^?/*-1111111111111111YZ?,)2)2.111111111-0+-]^?/*-4444444422222222b`?.9>CU?:!54??????????????????????????????????????????????????????????????}??t??x??????????????????????????????????????????????????????????????????????????????????????????????????z????????????????????~?????{??x??y??{???????????????????????????????????????????????????????????????????????????????????m??r?????????g]e+% +~sq?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + +))2154U]?&'0)2*-#9DJFflh??q??weq?/; ixYcrSng9?yK??j?m5?vB?o;?xO}tKltOltOkwGlxHnv:ks7rq;~H??R??W??P??K?}I?zF???pl?YfJMZ>,L?;[N%SPC@FhJl,NZ.P\=P:AT>R\'Xb-mu,??Q??Hq}3??]Qf%Nk1If,Up-Ql)Mh%Lg$Lg$Mh%Lg$Kf#Yt1^y6a|9[v3Pk(Je"Mh%Sn+??i3L +&<04J>9TOSniCh<1V*7:!+] PND %),')]_?+&),+)((*-/00000000YZ?,)2)2.111111111-0+-]^?/*-4444444444444444YZ?,)2)2.111111111-0+-]^?/*-1111111111111111YZ?,)2)2.17722)) aaYfffiii   + + +bag  %&24<<22222222ef? :6 +;).,322222222.66 7ab?0.6#  *99(& /,,..0022ef? :6 +;).,322222222.66 7ab?0.62222222222222222ef? :6 +;).,322222222.66 7ab?0.600000000........Ve? D )7 66L&>PCU:E +EPST,YZ2d`;hd?c\2VO%6D>R7 ./kp? 47;'1! ' +3,"" *#,+5>=UbHQ^D=I5&2lq?: E?2*.422400234555ef? :6 +;).,322222222.66 7ab?0.62222222222222222ef? :6 +;).,322222222.66 7ab?0.600000000........ed?7 E I M_"Q#R":>??????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????z??w??k??l??q??v???????????????????????????????????????????????????????????????????????????????????????????????????*(M 1 ??????????????{??y?????????????????????????????????????????????????????????????????????????????????????????????+;: + + ++3243hf? 1 +2 7).,3 ,' +&5P\XmyuN_M/MoT[}bu~S??d????M?Hxc,kg8jf7ai at emDjrAltCop6lm3vtDzxH?|L?~N?zJ?vF?tH?vJ???xsU\gY3>0#.#79*/%,71JN-Y]++!& +!%1?<3OLCPO0?`??_??b??~ju9_o.Xh'Tm4Pi0Pi0Vo6^w>_x?Wp7Ng.F_&Ib)Le,Jc*E^%D]$F_&Jc*}??#C X +T?[+EBE_\"87EL&#&/.+VX?%& +3'(*+++)(00000000QR?-2 :)+*4,,,,,,,,*32/VW?)* 7%%%%%%%%%%%%%%%%QR?-2 :)+*4,,,,,,,,*32/VW?)* 7,,,,,,,,,,,,,,,,QR?-2 :)+*4....**%%# +VTWfff???JJJTTTggg___iiihhhooogggggggggggggggggggggggg`^_fde`^cYW\???RP^XXpii?cc?cc?ac?bd?ad?be?bd?bd?ef?ef?ef?ef?ef?ef?ef?ef????JKyXY?jk?_`?gh?gh?pq?ef?ef?ef?ef?ef?ef?ef?ef?^_?de?^_?XY????RS?[\?kl?jn?`dko??????dg?]`?mp?eh?eh?eg?eg?eg?eg?eg?eg????JKyXY?jk?_`?gh?gh?pq?ef?ef?ef?ef?ef?ef?ef?ef?^_?de?^_?XY????RS?[\?kl?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef????JKyXY?jk?_`?gh?gh?pq?ef?ef?ef?ef?ef?ef?ef?ef?^_?de?^_?XY????RS?[\?kl?eg?eg?eg?eg?eg?eg?eg?eg?gi?gi?gi?gi?gi?gi?gi?gi????HU?k}????z?c}?f?R??]~?R??`??n??c??j??}?????y??u??o???R^J???RXnUX?UX?ko?mq?ir?aj?Zkubs}x????? ??K??S??gu?Wi|igzggsdp|???GNkY]?os?fg?jk?ec?hf?^cvej}lk?ml?hc?gb?kl?pq?hsc??{??nt?^???bjmnm?~?owyy?????|??rv?im?eg?df?ab?bc?bc?cd?de?ef?fh?fh????JKyXY?jk?_`?gh?gh?pq?ef?ef?ef?ef?ef?ef?ef?ef?^_?de?^_?XY????RS?[\?kl?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef????JKyXY?jk?_`?gh?gh?pq?ef?ef?ef?ef?ef?ef?ef?ef?^_?de?^_?XY????RS?[\?kl?eg?eg?eg?eg?eg?eg?eg?eg?gi?gi?gi?gi?gi?gi?gi?gi????X\Zi?hw?Vt?g??b??c??l??|?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????WGRff?SSoG at R???????????????????????????????????????????????????????????????????????????????????????????????????????????u??Ys?Ys?\o?[n?bj?ai?ef?ef????SIn_W?qi?d^?lf?ig?rp?WY?gi?lt?fn?[f?_j?jw?r??????????????????i??z??v????x??v??t??v??}??z??|??}??x??|????????|??}??????? ????z??KTXa?Vb?Q]?ip?ho?hk?dg?fg?jk?wt?|???{?????|??{?????a??d??m??o??j??f??i??p??s??r??n??h??i??j??g??c??a??a??b???NQp]]?jj?O[?Ua?_zgw????o?t\j?Sa?^a?cf?bht\bn^`?df?^`?XZ????RT}[]?km?eg?eg?fh?fh?eg?ce?ac?_a?fg?fg?fg?fg?fg?fg?fg?fg????JKyXY?jk?_`?gh?gh?pq?ef?ef?ef?ef?ef?ef?ef?ef?^_?de?^_?XY????RS?[\?kl?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg????JKyXY?jk?_`?gh?gh?pq?ef?ef?ef?ef?ef?ef?ef?ef?^_?de?^_?XY????RS?[\?kl?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef????JKyXY?jk?_`?gh?gh?pq?`c?`c?`b?`b?aa?aa?ca?ca?db?hf?c_xZVo???ROXZXYkijggggggggggggggggggggggggggggggggggggggggggggggggfffMMM + + +PM` *))//111122222222IJx)- +<.2+.2222222213+)QR?), + 9#7),M$'J /"",,..0022IJx)- +<.2+.2222222213+)QR?), + 92222222222222222IJx)- +<.2+.2222222213+)QR?), + 900000000........FP?C$5=ARZ9P$>U)$ NUg 6 <24  #%>6O'#B.M.G 2  ('NTv! *%,6<$%2068/4 LR`6/2S\]=_`@???6921 + %;UZG./0,++""+9?KCP6ZgM??i\p1YqWoNh+Lf)Ic&Ga$Ga$Ke(Qk.Uo2Nh+Mg*Ke(Hb%F`#C] A[@Zru? +!8F3(H+G!C_93O'8, 38 +-/'%QS|%( + 5,++*))((--------IJx)- +<.2+.2222222213+)QR?), + 90000000000000000IJx)- +<.2+.2222222213+)QR?), + 92222222222222222IJx)- +<.2+.**00557756TP_   fffqqq b_t * 11143220011111111mn?? +8>.1))111111116 712bc?516#*7>< 2+'11446666mn?? +8>.1))111111116 712bc?5161111111111111111mn?? +8>.1))111111116 712bc?5164444444422222222W`? F +)9H2H!CY2=W;U9S 4N4J 6L6J 7K DYTi$[j/@OCP2%2]ep %+*.'4*B7T>[;W=Y1E<+" 91:7lq? +< +$ +'"(38:6##&& +>5.7dh? ( 2:=Zo$Xm"N_(@Q;G14@*%/  *)100/,+mn?? +8>.1))111111116 712bc?5161111111111111111mn?? +8>.1))111111116 712bc?5164444444422222222cj? +1K W$pkh1ml6??J??SptBciEgmI???"' 3;EE15? @DC AE"<,A.Yn[??f?CUtFeKf#Oj'Ql)Lg$FaFaNi&Wr/Lg$Je"GbFaE`C^A\?Z???&++ 0&@Hb;=W4&@=.EJ + . +, 2 +3-.bd?1- 2+*))+. 2 + 5........mn?? +8>.1))111111116 712bc?5164444444444444444mn?? +8>.1))111111116 712bc?5161111111111111111mn?? +8>.1))((//99==; += + -idz + fffiiifby ''445433..////////ef?1).)414////////-/,3fg?6*)-31))-9944668888ef?1).)414////////-/,3fg?6*)////////////////ef?1).)414////////-/,3fg?6*)6666666688888888go?G 6*@G]7=X2MHb;U 9RAZAX:Q G__w)Td#7GES0;I&w?? & 5 )J#,M(870@?5O6P 2Q-L4N!*D#- >BONSW?,  ++9;FE# ++ "B>Jl??? G'3>.ZrNf=R7LFT0P^::BD"$// +9 + 7 7410ef?1).)414////////-/,3fg?6*)////////////////ef?1).)414////////-/,3fg?6*)6666666688888888kr? / +@Fc/}5x1t1I$> 32) +(]k?-%*# +.+.+- 6 +7 60 6> 10$!bW_????wX?H?w@?q8|m4on8qp:wv@~}G?~C?D?~Cnl1lm1??E??QrwAgoHowP??? +&56L +`-/85<<99%3 #>/x?WOo.SwRvFbPl"Ws)Rn$GcC_LhWs)Nj KgIeIeJfJfHdFb???$$0EG%'0H(;Q:%;$ H6LQ:;)+(/fh? 2&%.,+,1 +8?D33333333ef?1).)414////////-/,3fg?6*)6666666666666666ef?1).)414////////-/,3fg?6*)////////////////ef?1).)414((//99??37*3pk? +fffddb"ac?-.12288;;??////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402/// /////13/2bc?4.0////////////////da?I1 >  $*8-9!9E-=NBSDXBV@UH]Zpi-4N9SC]@Z??_6Q +A]Z +9U4P1M1M?HG('+)C@6:bhx +  )CE $  +,"=*.I*.I&*E#! 'jn?/ +.),K"A2$#'1"A,/N&)H3$# +)bd?) +6+3'3/3344666613/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.044444444../147:DP $/88994411bc?3-6+402////////L +W'!'7???wtK?~F??H?oM?kI?]JyVC?d@?wS??I??G?z[n_@~yAzBPW^e"mxZHS5ch? +*AI4< #))))11??:E .)t?hYeMu?A^r*et1SbP__n)\p(L`G]RhGaOiPn$Nl"Po)Xw1Xx5Rr/??|M].4@,( +2> PK?@ 2 213(+bd?-13<;46 +#,7&KVEAM5" + 91:Aba?<) 2'024////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0fffddd! $ac?--02288;;==////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////ed?@-6-! /< 7D(?P@Q>R AULaWl4M4M9S6P??X.I7S /K9U +7S4P3O5P 9T=X?Z)/;"()CA67bf! +$-CE%! ++ 0 -'"&#(eh? + +. * - + 2 /*&%&)+"+6 +5+#&+bd?) +6+3'3/3344666613/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.044444444;:753222se? ,@ DQa!b,m8JYx???????????????r??u?????????????????????????????????????????????????????????????????????????????????????????????????????????????????}??v??y???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????s?????????%M+*"S)???rln??z??u??l??v????????????????????????????????????????????????????????????nwv098 )/1999922--bc?3-6+402////////GJ'??xifE?sB?vE?uR?rO?gP?aJ?lF?~X??O??M??f?tQ?H?{D^c)^c)Q[C(2ch? +*>F2:!$++))//==@E-'graDO>l?i|53&$35),be?+02><34 + +=H:O]:2@ ++(; + Ebb?8) 2'035////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0fffddf #"'ac?.-/22668899////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?0)0'-#&*$*62>*:F2Y2M3N/J-H1L 7Q9S4M.G1!+0EC97be?* (+4@B 1+&',-'%(+(,`b?/),)),/00/.)+021036bd?) +6+3'3/3344666613/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.044444444 @ ?<96310on?2 +EJP^#Z 3j'CNx????????????????g??q??}??x??????????????????????????????????????????????????????????????????????????????????????????????????????????}??{?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????z??~?????h][ A+Q7g`?1*K??o?????k??h??}??????????????????????????????????????????????????uhnzCIU4, + 3;2;;8811))bc?3-6+402////////DA??sRQ?rf@}qK?sQ?uS?qS?oQ?yQ??b??\??Y??e??]?}OzsEhjBXZ2/6. + cg? ,8@08'*//++--88FB-+]g_.80dtE}?^n?fWuOIf8Jg9He+?\"D_Ql)QgVl$Xi#RcWc!`l*dp2am/??e[o*_o@\l=GRD3>0( $'+8:753446),be?+.0>;54*3.J['FW#1<. +9<?1=$0+1=4A%;H,DUJ[%EY=:N25K$2H!??m=U!F`:T*E*E/I 9S>V"3K2'!&- +: 90+bc?1+4.7:<8413796314/2__?3-/57:;;841><99:;;9bd?) +6+3'3/3344666613/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.044444444789;;;;:go? +6DN +NZ*W@m2NO????????y??}?????k??|??q??m??x??n?????j??s????????}??{???????????????????????????????????????????????k??o??}??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????n??w??? 5:>Znd? +<>=9944--((bc?3-6+402////////@@ $ttv99;`XAzr[|lJ?tR?xO?{R??X??f??g??d?|O??Y?xSkc>]\HDC/#cg? .3;.6,/44--))44@838]dn%/XeK??ud?}Hna4W?4W?>_4;\1=Y>ZMaQe U`OZV[bg'll0jj.??c_t%`r4^p2O]9GU1/914>6 % +(57=<8:),be?),.>:77 &. + +09&%'0/2>&9E-+;: 0/,,t?d/E=V6O/I.H2L:T=U#0H. $ $ !$*) &bc?14=2;35311268756846``?602?>=;:987 A;535752bd?) +6+3'3/3344666613/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.044444444258< + +> ? ? ?_k? +7 CQLW +1S+OqLh\????????i??t?????o?????{??q??t??c????[??g??{??z??u??s??y???????????????????????}??x??????????????{??f??l??|????????}?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????u??w???????????U??????d`q -T=lf?;,?????e?????g??????????????????????????????????????????G6<7;=6558 B8811++&&bc?3-6+402////////8?32dd|2DA:khaqiE~vR??M??P??V??^??d??]|p^FGgOHc0@[(J]Ob U_Q[\\jj*up6to5??_\r \p(Zn&Oa%L^":H$BP,+5-# 16B>:<+.be?'(*:69=+) +"2FYPc#;H. 5)bc?1' 0+49;////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0## +fffdbm %&.1-0`a?2,.//111111////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////cf?'+ +329:;:9,-# *',? 6! bub 3 6N5M/913=52>(.:$/<"0=#'0-$!be?*6?2;*,554433225736bb?6027632369<85225776bd?) +6+3'3/3344666613/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444468; + +> + +><97_e?7B +TGQ4M6Xqm?s?????|??d??e??l??f??q?????v??r??\??y??V??_??p??u??p??m??r??}???????????y???????o??l??z?????~????????u??}???????????????????}??w??{????????????????????????????????????????????????????????????????????????????????????????????????????????????????????x??????????????????????????????????????v??{??{??n??a??a??s?????t??]?????^??tLM??@\VT?-+????~`?????H??v???????????????????????????????????????2)> - B7336=7211--))((bc?3-6+402////////-6<;YZ?/##+JJRdbYPHa7F_5M` Sf&ZfWc`e"mr/vv8ss5??gcx-g|/i~1]r'Uj=OASBP/.<" ,-@==?+.bf? &')74;A52 )5Pa-Uf2=H:  :5bc?5' 0)257////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0.-#"fffdbo + +!- +/2502`a?3-/////----////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////de?2(/%+&(30-+.045 +N J2 /Xhg'&4J#:P);U8R5P 4O +5O8R;T=VHW0M\5J\ AS?RDW@N-4B!bg} 6?.7"$34431012.0-0bc?2,.---.03572466667 9bd?) +6+3'3/3344666613/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0444444447:< + +> =941fc?:AT +BI3B;[j????????n??a??P??S??Z??]??t??b??_??P??t??T??Y??e??g??b??_??e??p??x??x??u??g??w??x??i??h??w??}??t????????~???????????????????????~??k??k??|??????????????????????????????????????????????????????????????????????????????????????z??????????????????????????w??????????????????????????????????{??a??`??^??W??Q??N??Q??T?yI??a??T??SouG??]\f]8B9jn? %TPi?~i?{f?}8??Z??????????????????????????????xnmD:9st?.K..,0 +>A2'++))))))bc?3-6+402/////////1=B]]?8 + "':GK&_c>?|;??G??U??Y??j?|b??E??E??yj^P/"=8cf?1  ('/<?BB11""&&95?AWW?6 /%OR += +=!169O+I_;La Sh'Yi Ue[gdp(ip-dk(??l`s1ez-h}0]sWm@UEZ EV >O0;-& * ;@?A-0bf? &%'84>D;6* + 2*8?M*DLN*24 8-=@bb?8) 2'035////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.065)( fffdbp  " 2 43513`a?3-///----++////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////aa?6(0& " (%//>?GEVT;5M[d #-C7M)0J 5O;V=X;V8S7Q7QBTGYCY6L5L=TBU >B/:;Yd???{?x??_??]??D??E??T??R??S}{B|?Ew{@??n??R??U??]??U?P??O??U??b??j??l??i??Y??n??t??h??g??v??x??l????????{??????????????????????????l??h???????????????????????????????????????????????????????????????????????????t??b?????}??d??i??s??}??z??|??z?????????????????????????????????????????y??s??P??J?F?F??I{Dht6\h*~kC?pHvp4?z>??N??T??{??????  (???zsa??F??M??z????????????????}??q($hn? 697671*##&.&&(())++bc?3-6+402//////// 5/> Igh?E +(,2 JP*vr+??@??X??b??{??v??H?}ADD22!!$$63@A]\?J?)V d QD#/B"ObBI]Pd%UgPbRbWgXe Q^??cM_#LaLaE\H_Dab at mnL?r>??P??\??d??g??f?yX?~]_[Z  + )ac?66?.7.044442211/5-+ac? +6,%5;@>0 8!%%04J]0Tg:JbD\RjMe>TAW??dDXATEX9K +HZFZDXMaNbTd7Rb57>D.013/2bc?4.0////////  + -7 at 2><+) ,(5A=w?? + +1 @; + +PF1111111113/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0==22""fffdaj ..::13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////6847bb?9354444444444444444bb?82;0957////////13/2bc?4.04444444444444444bc?1-6-6356688::;; +C +C78__?8+ +1 +#."&;3H'?Y)Ic3AcFhGeFdG\=0kl?' +3%3+*11. 3@ 3 3 +4 331/.kl? +6/ +81 + ;54235699;;13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444466666666cf?)> OYP.'DbIp;Gn9Ps +Uxjz"p?(zzHzzHa}3a}3[u,Ic??hSj"fw1Zk%hu0y?A??G{?A??H??[??^??R??O??Q??R??Q??O??T??\??d?????[??f??m??k??z??s??}????|??q??k??e??l??r??{???????????}?????s???????{?????x??W??I??[??r??y??s??s??p??h??_??Z??Y??Z?????W??\??Y??[??m??Y??O?|E??t??????????????u??l??q??~??|????????}?????y??P?|Dxx??P??P??Q??[??YwnM?}\lhg&ac?66?.7.044442211.5-,bd? +8/(38>;/2 !+=N,RcAQg)F\K`%Qf+Pc5Uh:??aEYFYJ];N GZCX BW +SiPfSd-Te.BKF!*% + 2,13/2bc?4.0//////// +$ ):+6<*0??"(5.)@:1111111113/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0==22$$fffdaj ./::13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////6847bb?9354444444444444444bb?82;0957////////13/2bc?4.04444444444444444bc?1-6-6356688::;;6836^`?8/3!&&"-D4BYIDe +Ef Ol*\y7VjO4H-'`e?/09-6.095248;83893.ee?.4 ? 1*(+*&%+))))&$ gh?4/ + 93 +=5433669:;<13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444466666666cg? (7 +DJG53QmGnBDk?LoPs`tfz#nt6ms5Yu+Ws)Rl#E_??dMd_p*Vg!\i$jw2r{8mv3v{9??H??K??A??Gwx>qp7vu??_??\zqP??czvu,('"ac?66?.7.044442211.4..eg?; 2-/4<9//#!/DRAPa=9J&+; 6F+DREGUH??gMaSf$Xk)DXK_F]F]Qi IaH\NbHT@/;'+13/2bc?4.0////////.("4#,=$->  t~?($5  )-#1111111113/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0;;44&& + fffdah  + "119813/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////6847bb?9354444444444444444bb?82;0957////////13/2bc?4.04444444444444444bc?1-6-6356688::;;/348`c?=68? +A8, %(9- at QEe@` +Pl2f?HYlY(;(" +`d?32;.7.0>=8732--) + 900||?B2I2147:40011,-+-+,cd?1, +82 + ;324477:;<<13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444466666666eg? '0 8=?=7Vu:bJ>fNNs.W|7f.c|+`n#WeQl'Lg"Ib@Y??eF]Yi(Rb!Wc#am-gp1cl-im0sw:vw;op4ku8fp3em1ow;??K??[??`??`????H??H??E??B??U??V??f??j??c??Z??Z??W??W??L??F??F??H??e??g?????i??i??p??`??g??_??H~}:??B??O??U??L??N??P??L??Dy???F~?Bzz:??B{s5w9??S??q??r??d??i??k??m??|??k??g??V??T??{??N??]??U??Qtx;^j*\h(Wj(Pc!E\CZG`Yr!Zl Sebi&bi&pj6??O???zmJ??z?}m???fWTF7,33)////////bc?3-6+402////////6 814`d?4.0"*&77Ca]@xtW?|B|v 5 0,0;:63!$:EGUbX6C9 +"*?$9??fCTN_(Uf/CWK_H_JaJcAZw?C}?I??L??O??st}:t{5mt.fn%v~5v|4??C??]??Y??Q??U??V??U??I??A??B??:??O??X?????n??h??d??G??K??I??D??B??F??E~?A|?@?C|?Cx??n~5eu,_q'^p&??gev0ly4kx3ir/v\:XJb[s%Zl Pb[bV]_[uq4????wM??n?{d?xu:+( +BCFBD L 6+  1z|?8@ F)DI1)4 + 9.////////bc?3-6+402////////=?-0af? )*,73(@BE4\_Nlr6qw;bV"rf2^U4riHc_^%! * + )ac?66?.7.044442211.4./fh?> 5 0*-:<;:,- +%4=L^hqGQZ * +!A2huY!./=>L)8IK\%OfTkMfG`BXE[IV8;H* .13/2bc?4.0////////5:31 +/9, +"is " & +$/5(39!,0 +1111111113/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.08844//&& + fffdbc  +*+213213/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////6847bb?9354444444444444444bb?82;0957////////13/2bc?4.04444444444444444bc?1-6-6356688::;;3 79 +>ci? GEGP +U +UN><AK-J +.K =V.Ha91B< (`c?:7@09027:1.  +9B?gpkqzu???(/5???EBS52C2)/A>HI J J B?75ij?4*2+4/05689<<>>13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444466666666cb? + ,).7;E7j$Hh#Gg(KD.QJ>_*Ef1NjNjHb!?Y?X@Y??iAWSc%Rb$Wb&Ze)^f+_g,dg.eh/fg.ef-_k-jv8v?Dw?Ep|??=rt+yz6???????a??Y??Pco'r~6?D|?Ao|4fs+dv,i{1cx-ez/e{0bx-Zr&Tl SkTl ??cUl$Uk#Xn&^m(o~9r{8??I??S??a??\??\??l??i??^??e??T}?Efo0kt5??\Zf&^q/Wj(k?>]t0Mk%Nl&Kj$A`8Y7XBYRi#RcL][bW^\Xnj*?????p{nN~qQRD;eWN1"% + 3 B=))$ /!B4)[RKwng???53K>5)3 +8,)2 71////////bc?3-6+402////////BD),bg{ +')D;1>%!5;7N^ br4pd0?xDofE|sRgcb'#" +(#ac?66?.7.044442211.4..eg?; 2-,.:<AB43##8PYhNWf6% + +D2W_b + ,6.4BUc at au-h|4TlUmQfLaHT> $13/2bc?4.0////////37 +74'$ #???&7#, +#%%02(441111111113/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0664422++!  fffdbc  +%&./213213/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////6847bb?9354444444444444444bb?82;0957////////13/2bc?4.04444444444444444bc?1-6-6356688::;;6 8:>_h? FF I^ _ZRA934(D +4PD\:C[9'77")`c?<9B2;24;4"*%")3&1!$/VdA at N+'6Q`9???\jGVcEjwY`dAPT103  +  (* +3 +B#L&G @2*tu?<.2+5246699<=>?13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444466666666d_? +0)/; >E\%H?#F~&I\*M`8Z5>`;EfDeHb#=W>VC[??oBXSb'Ud)P[!Q\"X`'^f-eh1gj3jj4mm7ks7s{?y?EwCox9kt5lw5r};??vy?@y?>p}5dr'ky.`n#hv+qt=x{D?F??J??D??B?=??>y7ek#gl)in+??f??J}?I{~G^p&gy/q?9s?;g|1\q&Xn#[q&Zr&[s'Ws&Rn!LhJfIhLk??`FdF`NhWm%dz2cp+q~9z?>??N??M??L??U??M??G??Wt?Ceu4Sf$at2??]Ri%Vo+Oh$Vt.Nl&Ij#Kl%Ci 6\-U /W5(2)>-13/2bc?4.0////////,) /; 1  &x??#+@)3? + #(,$001111111113/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0446644//&$fffdca  +'(01532013/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////6847bb?9354444444444444444bb?82;0957////////13/2bc?4.04444444444444444bc?1-6-6356688::;;8 :9;[e? DE I\[ TQHC; +9,G@[&RjJIaA)8;(*`b?=;D2;24 B2 ,.68HPRHU7>K-8I;LN`$??Y??{N`&N_)ct>V^T\FN8@5>:C$,73$ #1B3FW7O[/GS9=-1|}?C24+658669:<=??13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444466666666c]? 4+0A CI S g(o;^+Mp at cEFiKHkCfHb#VE]??qCYTc(Wf+ITJURZ!]e,gj3jm6oo9tt>jn3lp5mq6lp5jp2lr4ox7t}y?:hr)is.dn)??^u}Ax?G?Nq?;dy.]s(g}2t??r?=`{.Sn!\x+\x+Vu'On FgCdEfHi??_Aa=[HfTk#\s+QbZk%^g$mv3mo.ce$hd%b^og)??Ij?=[r.Le!^w3??aOj%On(Gf Gh!EfEk"Gm$=e.V +(R+U >R!I],IXJY bi&^e"XU^[??s??H??Z??c????????????qeY?|p?????????????????????????????????THL? +8 7-*25/-1////////bc?3-6+402////////JL$'dio #%QOOQ %BLi)ma-s?kbA?|[???JFE8ac?66?.7.044442211/5-+ac? +6,%85:9<=.- )(2>GQ]3 ?1cb?;#,4M"8LI]K\&5F$&4+13/2bc?4.0////////$ ("D#E +, +.[cz$;8AP'6(1$-(* 1111111113/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.044666622+)fff~?zFIB_cfjnqWYhbdsbf?fj?_c?_c?^b?^b?\c?\c?\c?\c?Y[?hj?`b?JLs???JLs]_?np?`b?`b?`b?`b?`b?`b?`b?`b?be?be?be?be?be?be?be?be?}??ILkfi?or?WZy_b?ad?hk?be?be?be?be?be?be?be?be?Y\{hk?`c?JMl???JMl]`nq?be?be?be?be?be?be?be?be?dg?dg?dg?dg?dg?dg?dg?dg?}??ILkfi?or?WZy_b?ad?hk?be?be?be?be?be?be?be?be?Y\{hk?`c?JMl???JMl]`nq?`c?`c?`c?`c?`c?`c?`c?`c?be?be?be?be?be?be?be?be?}??ILkfi?or?WZy_b?ad?hk?`c?`c?`c?`c?`c?`c?`c?`c?Y\{hk?`c?JMl???JMl]`nq?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?}??IMffj?os?W[x_c?ad?hk?`c?`c?ad?ad?bd?ce?ce?df?]o?ew?Wi?ASy???DV|Pb?Zl?gy?fx?cu?`r?]o?Zl?Xj?Wi?z???????g??k??kz?]gk?Z^?zy?TS?U^olu?bnnUaaad?nq? mn?Z[?Vb`nzx??_??k??g??`??????x??r|?????w??g??w??d??a??`??c??g??f??c??[??e??f??g??c|?`z?^x?`{?co??Xx?Zr?Yq?R\?U_?lk?ml?ic?ga?ec?ge?fl?fl?`k?\g?Y[?ik?bd?NPw???JLsY[?hj?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?}?IKrfh?oq?WY?_a?ac?hj?`b?`b?`b?`b?`b?`b?`b?`b?Y[?hj?`b?JLs???JLs]_?np?`b?`b?`b?`b?`b?`b?`b?`b?bd?bd?bd?bd?bd?bd?bd?bd?{?GKxbj?ks?R\Zd?Ze?al?bl?jt?r??x??y????????????b?????s~?_????a??r??r??k??n??q??v??v??x??u??u??r??w??}??|??x??w??z???????t????????x?????|?????????????????????????n??p??~??q??j?????g??~????????~??z??{????????}??x??i??m??s??w??x??u??p??m???u?U??h??s??j??j??^??n??a??e??h??k??j??e??]??Y??w??z??e??i?????c??o?????u??t??q??o??k??f??a??^??Y??[??c??c??k??m??x??|??????????????????????????????????????????????????????????????????_Gww_?bd?bd?bd?bd?bd?bd?bd?bd?`b?`b?`b?`b?`b?`b?`b?`b?}?IKrfh?oq?WY?_a?ac?hj?`b?`b?`b?`b?`b?`b?`b?`b?Y\{hk?`c?JMl???JMl]`nq?jm?]`[^}dg?ad?[^}or??????i??k?????????t{?ej?ty?pu?V[oko?bfXY?mn?ge?ge?`c?`c?`c?`c?`c?`c?`c?`c?Y\{hk ?`c?JMl???JMl]`nq?db?db?bc?bc?ae?ae?`f?`f?fp?Yc~fr????u??N\wM[vm{?ho?ELh]d?cj?]e|mu?q}{????????????~?{enW`q\`?fj?Y[?hj?`b?JLs???JLs]_?np?`b?`b?`b?`b?`b?`b?`b?`b?SS?jj?yy?pp?bc?^_?df?hj?lp?TXs??????s{}???u~yajeciydjzdf?df?ca?b`?a`?`_?Y[?hj?`exJOb???JOc]`nq?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?`c?}?IKrfh?oq?WY?_a?ac?hj?`b?`b?`b?`b?`b?`b?`b?`b?Y[?hj?`b?JLs???JLs]_?np?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?`b?}?IKrfh?oq?WY?_a?ac?hj?`b?`b?`b?`b?`b?`b?`b?`b?Y[?hj?`b?JLs???JLs]_?np?\e?\e?\d?\d?^c?^c?_b?_b?`b?`b?dd?ccbcu_`r__k]]ifffMOJ + + &$1155 5 5 5 5*9 4'PR{'0911111111,,,,,,,,JLr* + 27& +0+*,,,,,,,,'6 1$PRx$-6,,,,,,,,,,,,,,,,JLr* + 27& +0+*,,,,,,,,'6 1$PRx$-6........,,,,,,,,JLr* + 27& +0+*........'6 1$PRx$-6................JMl$ + +,1" ,)(// 2 +3 5 +6 + 7 + 79 FA 6Ud?= E"M!LJ +G C>: 7 +5 1902D;O/C3LO?M#.20<8'3/='/41>4E\H_F]H_+;!?O5p}Gbo9cp:dj941002 %3"=P#?R%*70!T^j1;G)6,4A71>5/<3*2I 706F,P`FOgBZAYJb&3E=L5UdM??uNa4 at X 6N?[?[D\JbVfYi"]f#Zc Z` bh(ir3js4\j,LZ;M3E???/KW  .*.,4348882.'//-\]?/+*++++++++++++++++de?4)-'2)'++++++++'1/+Z[?-*+++++++++))))))))ce?9%)  ++)5765  +3.E;I`VNdI_>T \r*??dH^9N >SEZG\I^LaMb!Nc"Ma"Ma"Ve$Tc"Q`M\KZQ`[j)cr1??qn}??zq{?kt=gp9f{8_t1Wl)Sh%Sh%Ti&Sh%Rg$Ti&Sh%Rg$Pe"MbK`I^G\??iB[!8Q3L-G +6P/I +=W5P +6Q9TDT??? +.#9D--------)31-Z[?/,-..++'' .>>>>>>>nn? + +@4<7E=9>>>>>>>>; ?;>ii? + +C:8>>>>>>>><<<<<<<>>>>>>>; ?;>ii? + +C:8;;;;;;;;>>>>>>>>nn? + +@4<7E=9;;;;;;;;; ?;>ii? + +C:8;;;;;;;;;;;;;;;;no? + ;/73A;7::=>?@CC C +M L Lfo?H CF +M L IF B?<;DB!+/?"AQ4FV9DT7y?vQ_N6D7'5((!-:3ITXNY]4A:GTMasKj|TXp&?W +;S E]&:>R?Q'Oa7??cLa(F^AY 8^:` AaGgTiYn!cm&dn'qv3qv3ns1di'R[EN +152 7jk?>534444444444444444no? + 9-50>62444444444 +84 7ij? +<3144444444 7 7 7 7 7 7 7 7nn? + +@'/%3 +40A +GF? +' 5)<@DW[Vn$Sk!>V +Ld??LD] AZG` +F_G`JbMeOf Qh"Sj&Sj&Th RfOcL`MaRfXl$^r*??uj~6au-Zn&[o'p?Y8S7R +7R 9T +[ 6244444444; ?;>ii? + +C:8<8: A=5:F(1,LUP[bl7>H  ,;AM???"*,  + +3,9Q;;;;;;;;; ?;>ii? + +C:8665511** +  '6;DXMK_T-B/  ^c?+0 @ +M +J>$'^05[!G +,#8 >QM4 +84 7ij? +<3144444444./0%* +04.df?& #B!'7%5!))08ET+7F"+& +)'9=7 ;0 +3ij? +<<:;;;;;;;;;;;;;;;;no? + 9-50>62444444444 +84 7ij? +<314444444444444444no? + 9-50>62444444444 +84 7ij? +<31 0 022666611 + + * fff_`b $)..1133113/+,^_?2+,........77777777[Z?42<283777777777:623^]?9237777777799999999[Z?42<283777777777:623^]?9235555555577777777[Z?42<283755555555:623^]?9235555555555555555[[?.,6.4154477:;;< @ +A;!???HWD  +(.4B1.<+VgCTeAUi6Pd1?V,C*A2I6L F\;PBWw?L?U@X AY +3Y5[<\ ?_ I^LaXbZdch%ch%`e#W\HQ=F6A4?cyb)?(1*1F?-A, +699@F +H G<60-++^_?4-/................[\?-+5+1,0........3/+,^_?2+,........00000000]Z?4%/"$(6<A:%,."2AZZA\ E`JdOiSl(Un*KaJ`J`J`LbMcNdMc??n]s(SiOeRhdz/\r'cy.k{:cs2TeIZM`XkWjNafy'u?6k~/q?5??lar+Td#K[B]?Z +;V 7R6Q:UA\FaIdE`?Z +9T5P4O4O5Px?S,F :"<(C7R,G4O +7R 5P 2N0L1M4P8T ;W :XA_4RB`z?M;Z7V9X +6U7V7W6V4T1Q.N,L?V>U>V D\Ma"Pd%Q^(MZ$???rtCcV)vi5K6(>)_f?,6H?<G:4))22CE3/+,^_?2+,........25539@72_a?# '-9-8')4#'5?M*EW9K%0 %3484)*^^?3345555555555555555[\?-+5+1,0........3/+,^_?2+,................[\?-+5+1,0........3/+,^_?2+,**,,////++$$fffcdh  +$-88<<>><< =7.5dd?72988888888::::::::bb?<;H651;:::::::: A;29dd?;6=::::::::<<<<<<<>?BB +D @9 ?dj? =: C;;<< = +> +> +>2 +7 + IE*( ??? FMPOD > >6-3cc?74 + +<8888888888888888bb?87D21-788888888 =7.5dd?7298888888866666666g^? A0=! #-6:CA3 7 1!;2I]BJ`9G]6}?\Sl2Ok!;W +C`DaGdKhQm#Xt*^y6a|9Tl"Rj QiRj Tl"Tl"PhLd??YJbIaQiXp&g5_w-j?8n?Aex8Wk$PdZo"f{.bx&UkOef|*cx+l?4??ePd?R5H:V ;W :V 7S6R9U +@\FbFbC_?[:V 8T 8T 8T 9U +??\:T2M +5P +7R +A\1L7R ?[]Ba3R Ba}?TAa>^?_?`?`?`?`=_ ;] 8Z7YHcE`E`KfUl(Xo+Ve,O^%??rhj8hZ+??Q??_??^??Z??U?~V?yQ?qQ?nN?oS?vZ??Z??_??n??g???U=%~?( +H=6666666688888888bb?87D21-788888888 A;29dd?;6=::<==;99-4 84$ -&.1=EH???NYH:D; ,?@<<<<<<<< A;29dd?;6= +6 +6 +: +: ? ? +? +? 5 6 "139MBFZOv??!'%(AC< +P5: 521.9> =7.5dd?729888888886;@<AGA8qs?-#*4)% 0BR#M`CV2>( ,3 *>= +C=+2de?44;<<<<<<<<<<<<<<<cvIRi#=T-B ,A1E3G7K=Q=TMd AY +F^w?H;R 9N8MJ^K_L[DS?H :C>DBH ;CAICPDQ:O3H+D +)B?N?S4.E3OC/K?0H& 8 ;FNNMA +;94.6__?..84444444444444444cc?4/ =/..64444444451.8bb?0.74444444422222222h_?=(6 (65;;46*+ (0 4+;OF??tLd@@\!1M;YX?RE_Pj#a{4h?;q?Dg?:t?GOc&Qe(Nc"La Tj"_u-_v(VmZq#p?9j?8j?8??dI^AU?S,J/M1O/M+I+I0N5S 4R +3Q 1O0N/M0N0N1Ox?P3N .I/J-H4O&B/K1M0L.J,H+H+H+H,I-M +3S&F9Yv?R:[4U3T +<^=_=_=_<^9[7Z +6Y ?_ +;[A?B +CFOV"LS=N3D$?#>%F +*Kw?8FY&>+C *G39VB4Xh"FVADP&X+Y*X"LE:76 @ee?0.97777777777777777jj?3.:375 + +A77777777446Bii?3.97777777799999999pe?<' 3"%1G + +@CA;<,( ) ,6GQ???NcPC]-B\,He"Gd!GeIgLi&Qn+Wt4Zw7az8Vo-Jc!D]F_Ib Ib G`??]Ng%[t2i?@e~4I?TBS +=N`m(UbMU@H ??`FKZ\+Y[*`j.Wa%EU9I .D/E0J 5O=W:T5K +A(8'71;7At?Y/@'<-B-G*8ZJ=<FER_%YfXpMe?\5R!B , +K,88S__^s8Vk0_yw?6??Tj?+Jb>V +??_;R +AY +;S2Q4S7V +:Y +:Y +8W 6U 4S1P/N+J)H)H+J.M1Pz?H;S 9S ;U 4P7S'F1P1Q0P.P,N(M&K$K#J-Q,P-U-U?\1Z>e7^ +3R@_PdMaPUNSURVS FPNXQa"Qa"B];V?cc?@ HC +* )55Q]]Xm5G\$5J3H +AVMb!RcN_Xe R_PZJT??kOT\`.W[)Xb&OY?O4D+A+A-G1K +5O3M 1G,B-=0@=G EOx?M1G'?)A&B0L!A*J!C&A$A-A-D9H=MHQLB[%>P9tZ? +:=3++ ( (66HH////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////77!*ry)066B*DP8Xk>\t*i?7ax0Kb=S8N??\1G?VAX8V :X=[?]?]>\;Y9W +/M.L.L/M/M1O2P3Q|?K////////////////bc?3-6+402////////6847bb?9356666666611111111ij? + 92 +8,3-/////////13/2bc?4.0 %424;= &J!"! (%=@}?k)>.?5F" -& " ;;FF88$$/202^`?77<760/+2;$D+J%D$<%=,9 +( 1 0fl?2& +-&.13 * +/ ++ &+$/1/2bc?613////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////ffd\ci + (2;9;--&&//;;6847bb?9354444444444444444bb?82;0957444444446847bb?9354444444466666666bb?82;0957444444446847bb?9354444444444444444bb?82;0957444444446847bb?9354444444444444444bc?1-6-6356688::;;6847bb?9355555555544./+,9:ee?@GC +503>BT_cTg0H[$>R?SL_Uh(Yj$Uf N]M\S_ !R^ ??vS\%\c0RY&LVEO7G /?'=(>*D-G.H-G-C*@-=3CAKJT??K:V.I+F%A*F7 ?$C>859!C+O2V&3cmIS$6^Ak`?7 +B5// * *66DD////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////8@20^cw ""!.76=H:AL>EP at EP@LQJ:5 +.6KUdMbqZexKi|OI\/EX+HZ2DV.??j.BZA]C_C_A]>ZT :P;Q 4K7N%A-I+I+I*J*J(J(J(J(J0P,L +)L&Iv?Q*P9^4Y A]B^M\Sbbc*hi0tn?xK?wP??b??c??v??}??v??h??b??T??a??~??s???K== ,gm?2- ;////////////////bc?3-6+402////////6847bb?9356666666611111111]^?.)2)2.1////////13/2bc?4.0/141) 2".%/;&3*(5,%2+' ."67t?f+A1F2G #3*:#* +//==33## %)ab?@BBA>*.#"//)!4.&D=7'?'4D$4 8 2ej? 1' /'/35$**&(/ 2./1/2bc?602////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////fff\ci + (2;9;--&&//;;6847bb?9354444444444444444bb?82;0957444444446847bb?9354444444466666666bb?82;0957444444446847bb?9354444444444444444bb?82;0957444444446847bb?9354444444444444444bc?1-6-6356688::; ;6847bb?9356666666600))'(66de?@G= - .5 at FVagUc.N\'HWIXO_ Rb#RaO^M\L[P^ O]??sMX T^*ISBL=G 3C-='=(>)C+E.H-G,B(>+;0@>H GQ??`Gc:U4O,F.H6%<(=)>*?+@,?,?+>*=/]S'UK,H^1G^i?; +IC44--44??////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////6@ 96Z]?#!1-2E(-@ %9. +'0007 + 7 +6.'gh?65>E + SPKC9$C8CEDOQESFESF1>46C9CQBESD??M FT=K=G :D2B.>)?*@)C+E.H-G.D,B0@7G FPPZ??tLd*>V8P3F5H%7+=,;/>7B:E 9C3=,6'1=!J,$MOCEMp?: +FA::1133::////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////6<7;de?3*-/+)),.8=:869 +: +:2.ef?2/80526 JA.5 (&    $$**5;???K[@Sh/EZ!=S>T@VAW@V>T:P8N +0F,B&<$:(>1G;QBX??Y at P7G6F2E8K &;+@*@*@'B(C(C(C'D'D&B(D/N 2Q??\3U <[ +2QF^~eZ]?; 9(////////////////bc?3-6+402////////6847bb?9356666666611111111hi? + 91 7*1+-////////13/2bc?4.06786)'"*%6*;&3)& # Ul\/&?!,E'%>6O( 3   ////((  + +')ab?>??35!, 8&>"?82<-D'/F)+>#/4ae?4' /*37:335972-,35/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////fek\ci + (2;9;--&&//;;6847bb?9354444444444444444bb?82;0957444444446847bb?9354444444466666666bb?82;0957444444446847bb?9354444444444444444bb?82;0957444444446847bb?9354444444444444444bc?1-6-6356688::;;6847bb?9357 7777777>>44-,55ce?< ;,  +$6D5LZKOV#RY&T]&T]&Q]Q]RaUdL]FW?R6I ??Z/C:M2E9C8B2B0@+A*@(B(B+E,F0F1G9I DTV`$ak/??yJ]/>O"8I2D5G%5,< +0> +/= 0< +0< +3= 4> 5? 6@ 6'M!VF(]MS??8STD??331144////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////45/8kk? + +?3...37<===2.''(*'%^`?)% 1"""-;;10%%'(0. +"2??|KZCQg):PAUCWDXEYDX@T=Q:N-A)=#7!5$8-A7K >R??Y at K3A3A3C:J '9,>*>*>)?)?&?&?%?%?$>&@.K 2O +??]7U +A]7SF\;QAJ KT\W hc,?P??s?yP?wN?|S??Y?sKw^6wY3?f@??{?`<'&  #32C#4E%*9$.[ps(+6#+D1'A3M*4  --4411* -00_a?62 +:' ,$0$$>$>;55&C6M34K1(> !/ :_c?4(1,58;636=<6254614bc?4,.////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////fem\ci + (2;9;--&&//;;6847bb?9354444444444444444bb?82;0957444444446847bb?935444444 4466666666bb?82;0957444444446847bb?9354444444444444444bb?82;0957444444446847bb?9354444444444444444bc?1-6-6356688::;;6847bb?93588888888KK >=5476dg?60-(*(35AQ4 at P3PT"TX&W\&SX"ISFPIVO\BS +=N8M 1F}?W+@4I,A 6@6@1A0@*@(>$>#=)C*D.D0F9I CSV`$ak/??oJ[%>O9J2C +6G$7+>*=)<(=)>+@.C 1F3HC0UV75rSg??&r? AuSBB 4 4//11////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////32-3ee? + +<649< + +> ? =7-, +62006 +864cd?-' 7((% + 2242358AAK F,2y?qBQ:Ka 2HASBTCUDVBT>P:L8J'9'9&8'9*<.@2D5G ??Y=H1<2=3A,>+=)=(<&<%;":":%=$<(B*D~?T3Q E`@[H]=REK MSWP`Y#?}O??~??s?W?yR??d?~YsY4qP-?hE???oM?pO?iH?dC?qP?^>?Y9iX tc+?q???^????pS,!)+> G<^a? > +"&////////////////bc?3-6+402////////6847bb?9356666666611111111[\?,)1)2.1////////13/2bc?4.0 67NOHG +'"(5HCV(=R1Fp??+>0'(B9'A$.H+!9#2  //::::6 ?97]a?- +(':&,%"7%:!<8987#@.D--C,&> $08^b?4)2,6:=@9; D A97>4614bc?2,.////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////fdo\ci + (2;9;--&&//;;6847bb?9354444444444444444bb?82;0957444444446847bb?935444444 4466666666bb?82;0957444444446847bb?9354444444444444444bb?82;0957444444446847bb?9354444444444444444bc?1-6-6356688::;;6847bb?93588888888 T T +E D +: 987fi?1( 16C7D=J9J6G5J 2G??Z-B2I(?3=3=/?.>(>&< :9*D*D,B+A1A9I ISS]!??eQ`CT=N +5I8L&;-B 9$=)D.I+J(G#B> D)MG!0rLr??A??Y?*[DD66 / ///////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////33-,\\?57 =5511//---,.29::7ih?70 ?23+4;:5267<9CA' +n}f=L5Of=T =L>M?N@O>M:I6E +3B#2'6,;1@3B3B1@/>??X*>(<%;#9"8!7&>!9!: 9v?J1LGbGbK]BT +JOPUSL[T?}O?????~?uN|hC??d??g?fCa???_???yY?|\?cCuR2?hH?gG?lLxi.?|A?sA?tB?nTL4  +0 GB>eh?9-////////////////bc?3-6+402////////6847bb?9356666666611111111bc?3,4)2-/////////13/2bc?4.0 +31RTVVG7 + '<:O6N)A???1L--(@@'A(,F-&>(,D.  11????>G?=\a )##/;;'9+=#,C'>848!=675!7 ":&02]a?3*3.8=? H>;B<3284614bc?2*,////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////fdo^`?/066DA9DDBB==99 ?=35aa?=8:;;;;;;;;;;;;;;;;cc?:5 A9 + +@63;;;;;;;; ?=35aa?=8:;;;;;;;;;;;;;;;;cc?:5 A9 + +@63;;;;;;;; ?=35aa?=8:;;;;;;;;;;;;;;;;cc?:5 A9 + +@63;;;;;;;; A ?57cc? ?:<::::::::<<<<<<<>AADEFG +5; NEW ` +RGh|? +&H[EJZ+O_0_i47A MbLaI^DY ?T 8M3G0D3G1E2F*>u?F!4,?':6M 5L2I/F-D,C,C-D,C,C,C-D.E/F/F/F??f=N.?.?1C :L'9*<:L8J 4G1D0C1D3F4GA6K@ +MD]??>??B??ay]QBD1)99999999cc?:5 A9 + +@6399999999 ?=35aa?=8:9999999999999999cd?3. :2 + 9/,22222222 +86,.ab?6134444444444444444cd?3. :2 + 9/,BB994477 @7nzfBN:Tf*?Q=Q 9M;OBVDX;O +0C)<!4"5$6&8(:*<,>-?q?W+>';.B3H#+*2 +*,?#e}c*B(-;-;C@ VS_W\TSV!KNN`6w?_?|???E??Z??Y?vb?vb?|d??k??z??P?n,?g%nb&sg+nk8\Y&IV8WdFZdY?I>+-< DB:'JD;>CF<> + 2*6 <E9 0[lb,0D( 5&;,B*@#<8!<%@#A"@!8"9!.?"3 7)_c?0%++4:= #((&&,/H6. +1B:K+<1B 1C /A,>);(:);*<,>@0B2FHR???w0????/lYF G>= +2 633333333YY?/,5,5144444444403.0]]?2-04444444444444444YZ?,)2)2.111111111-0+-]^?/*-////////////////YZ?,)2)2.1;;22--22-.!.|?tCO;GY+=9L +9L +~?d8K1E1E.C +4I%;-C'=%;"74122 3(52? &9 ?. +9 +9 += += @ A A + +B0 7L J +Y_QLcy?>TaP;M7I +3E 1C +<,=1B ,=w?T!2):!2/D .C ,A )>(=(=(=(=+@,A ,A -B +.C .C /D /D q?U-<)8 +)8 +#3'7 +'.0@/?->+<+<+<,=-><#;"?E???dM??&??T?4fJC::3511111111ef? 84 +9',*100000000,44 5ab?.,40000000000000000ef? :6 +;).,322222222.66 7ab?0.60000000000000000ef? :6 +;).,3::22,,2213 )8??zCO9DV+=@REWHZEW=O4F ->(9+<+<,< .> +/?0@1A2Bt?Z2E-A*> "7&;2)?4J 1G -B )>%9#7"5!4+"504H q?G4J +,B*@8O >U2H-CCYH^;S B"+%%%55}?m+A.F!9(@$< 7 + 7 +#; &> 'A&@A*L5P4O):2)! & dnx&%')35"*#+)+762 ++%#) - CA +3(_a? + 3 0.8777764421//----ef? 84 +9',*1.........66 7ab?0.62222222222222222ef? :6 +;).,3........,44 5ab?.,4................ef{LQg% ("(/311//))((#,+(VX~"# +0((((((((((((((((QSy&+ +3"$#-((((((((#,+(VX~"# +0((((((((((((((((QSy&+ +3"$#-((((((((#,+(VX~"# +0((((((((((((((((QSy&+ +3"$#-((((((((%.-*XZ?"% + 2****************OT~+2 +:+--711335566 +,*,%GLr# 6 +5..114567+1EEN +P@@^vz???t?fAW3Pa+gxB]h0JU->.?.?->,=):'8%65E4D5E.>y?\'7 +2A-<%8 +$7 "5 322 3 3122 3!4!4"5"5r?\4B5D6E/>2A$3/>%5%5$4#3#3#3$5$5M4 U<8X31Q,K??bG??.??&;"630/!5*> &5so?ea1QT5y?K|?N??b??Yx?\w?[~?d??i??c??`??j??u??????mx?Ze?X_?^e????RXzY_uhn?_dxhm?hi?no?mp?kn?gj?be?^a?`c?gk?mq?mq?uy?dh?OSp???`ddh?bf?ae?ae?ad?be?bc?bc?bb?bb?gg?ff?ff?ee?de?cd?bd?bd????JLr XZ?jl?_a?gi?gi?pr?gi?gi?gi?gi?gi?gi?gi?gi?^_?de?^_?XY????RS?[\?kl?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef????JKyXY?jk?_`?gh?gh?pq?gi?gi?gi?gi?gi?gi?gi?gi?^`?df?^`?XZ????RTz[]?km?gi?gi?gi?gi?gi?gi?gi?gi?gi?gi?gi?gi?gi?gi?gi?gi?ef{DHe$ -)430553300,,/1)'QR~'* + 7................IJv'+ +:,0),......../1)'QR~'* + 7................IJv'+ +:,0),......../1)'QR~'* + 7................IJv'+ +:,0),........13+'ST?', +95555555544444444GLv'- <04.17799;;<<) +:$LEUZ?'234488;<<=9 7 +CE +F D8*Gi?um?yOg5;S!Pb&AS0;AL*;+<,=,=,=+<):(92B-=+;!1m|Q.0?.=10/../01 3 3!4"5"5#6$7 $7 pT-<+:-<*: +0@"2+; 0"2$5%6&7&7%6$59= LPBU'': ]?a M$$cFQ4[??;}o UYFJ3I +&<4 .++++++++IJv'+ +:,0),00000000/1)'QR~'* + 70000000000000000IJx)- +<.2+.2222222213+)QR?), + 90000000000000000IJx)- +<.2+.55,,''**,.+$)<}?l*70D*>+=4F +4F +,>/A9K4E#4(9(9'7&6$4#3"2"2cvI(;-A3G/D 0E 5(>!7"8#8$9$8"6 325"!:'%):>?~QLI9S:=W>9~?.szq?=??s??V??GY3AS-GMKQRNSO aN-p]M +?;;*)/D,<;/?>t?Z4.J2N,G'B";!:":$<$=#<3)A5GG-??!J 200[`?+ # ! "*+*'$&+ 1 - 0"QUr  +'/ +  +* (437765,+%$IJv'+ +:,0),........13+)QR?), + 92222222222222222IJx)- +<.2+........./1)'QR~'* + 7................ef{hk?7 +6 +6.852;;8844119:45bb?8492222222222222222mm?B ;A14,,222222229:45bb?8492222222222222222mm?B ;A14,,222222229:45bb?8492222222222222222mm?B ;A14,,22222222 ; + +<67dd?:6 ;::::::::88888888kp?= 8 +>03,,6688::;;6 ?NMae? 9 @6<<=>ABBB: +5 @DCD(?)?V???z?azAWp7Rd&-?"- +? +? ,@ +,@ +?^5E)9'7%6*;(,*<,>.@1C2D1C0B/A0I0I5F,=z?W/= :S):S)LvR;eA%W.1))111111116 712bc?516////////////////mn?? +8>.1))22))$$((* +1#)9:@P??~4B!4H.B0C7J4G0C=PQd$K]4F6H 5G 4E2C 0A .? ->,=p?V+>&:(< &;+@1"8'=(>*?+@*> (< %8 #6 .8(,AE??GSM4R.5S/'|[^Tb??Y??2ud/C;ONXR\[Z![Z!fY-qd8?uJ??Z????wL_V9XO222:+%B9..2 7 2/ 0 +1+,bd?/+ 04444444444444444mn?? +8>.1))111111116 712bc?5161111111111111111mn?? +8>.1))111111116 712bc?5164433//--$+*$) +3 +3+hen,)2+;6F.R6ZM 'V-STDE +$XF :99< -)7D|?i4 +$?&A4O +5P 5N2K-F*C +D +,E %>+D-A8$8/=. 0 2|?? :!&-!$"*-% 1342./1 +67 + 3(+cf? ,2$'F*8(6#.(' 1 .:9:920+*mm?B ;A14,,222222226 712bc?5161111111111111111mn?? +8>.1))222222229:45bb?8492222222222222222ef{`b?-)*0 ?DAAA??::66463:ff?=108888888888888888ee?8050;8;88888888463:ff?=108888888888888888ee?8050;8;88888888463:ff?=108888888888888888ee?8050;8;88888888685?SYm(Re#7J2E1D/A-?+=);'9&8u?[)<003)>3%;#9$:%:&;$8!50-2@4:RX??Fa\ +:]'6Y#.??phqu-??Z??&qR)>6!2::,0 +:8)'%,')(/fg?4*)6666666666666666ef?1).)414////////-/,3fg?6*)////////////////ef?1).)414////////-/,3fg?6*)2211--++) 0 2+1<=3h`w'6!-+7'L4YM(V+QR FG*]L;; +PB"*D?s#8(C,G/J4O +8Q4M+D $=%?)C*F ">)$/{??"( ,"--8'&9<<;6557 +6-$ +1gi?-4*-P4E0A +(6,  +!?> + +A @ + ; 9 21ee?8050;8;88888888-/,3fg?6*)////////////////ef?1).)41488888888463:ff?=108888888888888888ef{\`{ *)268;;;;886613/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444466666666`e?1- 6-6356688::;;/1/2`d?6134589=>@A= LVPUU,U at Y???????y}X\`;J\"1>?0G.E+A)?)?+A.D0F(=!6%:)>y?V!6(<%9'@ ";8 9&?(A +$=8!: 97667 9!:y?Z&:$8(<1*?(='<.C/D /E0F1G1G2H2H*@'=*@(>z?P,B7M +0F3I 8N7M +1G2H:P;Q7M +!; 57/99ILPR?QR U:E=?****'&'&*,-0bb?735////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402;;22//44.0.??s3> +<(96;9>9?:@CL +PYO[FRM]>N/C-A*@%;$<*Bw?X%<%<*A 5,C +(? '>(? !8!8'>"9,-!8 4 7;@5:??vYJ+0JB\/G?`W?pV?|H?nO?P9k:_S9g[AfP)v`9j1u`'nZvb?p=?zG???WI at 40K 7++.=4444221113-0bd?0(*11111111////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////111111 11`iz +$ +%6#$>2L-K/M.J1M9R?:S@ 88 7 8 %r?j%9*L5W +3[1Y,Q$I!@"A-F3L +2C#) 2/ $(7u?a$6': (; + CE BKG >12,'#), 3in? 833&9#+>(.?9*;5+<, +( ( -# 0-'=!7,[b~ %()5@MNHG64! & !&(+&)_b?$&$+-78:6////////bc?3-6+402////////13/2bc?4.0////////////////hev\`{ *)2689999884413/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444466666666`e?1- 6-6356688::;;/1/2`d?6134589=>@A;GRV&e#b)N*Di??????hmEOT,CU#5$D'G-C,B*@(>(>*@,B-C)>"7&;*?z?Y"6)=%9&?";8!:%>'@ $=8!: 97667 9! :{?\(< &:*> 3-B +*?)>+@+@,B-C-C.D/E/E/E-C.D+A|?R,B7M +/E1G6L 6L 0F1G9O58AB:;??u^N,9IHX+=?EK?SO?_J?ZYyHMm%49 % +"".':'/E.D$=3v??)-.*) 2:7><34+ +. % %372 +8jl?7 . 1*()+68;9////////bc?3-6+402////////13/2bc?4.0////////////////hft\`y ('0468888662213/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444466666666`e?1- 6-6356688::;;/1/2`d?6134589=>@A@FLV1k)c>)J??????X]4DI >P);&E )H *@)?'=&<&<'=)>*?*?#8&:+? +{?\#7*> &:$="; 9!:$=%>#< 9!: 97667 9!:}?^)= +(<,@ 4.C +@+@(=(=)?*@*@+A,B,B5K 2H2H.D}?S,B5K -C.D4J +4J +.D0F9OG;D @KKVLZGU>M8G 6H >P=Q1E';%9t?S"6!5&:.';#7"6$8"6%9*> &:33&:6:FE<; +??pcQ)CFNQ"tc+hWeWug(?wK?S???%!%1 @ 704444221113-0bd?0(*11111111////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////11111111`c? 4 +!+, 50E +,K0O-N-N2N9U%2FM29 F? #L<% ,m??&;P$AE%BF.PB'I;#F&#F&,M /P#0N,J3=F#, -*13..7H??w' +'2D$00-4.1,, .8 +0 %2657rx?6 / / + %+;;5EE+<2)03%<.E5M6N2J-E??r->'5$$2! + % 3/03 8 80*;?7=fg? <1 4/**+37;:////////bc?3-6+402////////13/2bc?4.0////////////////ger\aw +'%.246666441113/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444466666666`e?1- 6-6356688::;;/1/2`d?6134589=>@A GLLQ)_"X4,D???v?tMS%AG "6&:+? z?]"6*> +&: ";!:!:!:";";";!:!: 97667 9!:{?\(< &:*> 3,A *?)>(=(=(>)?*@+A+A+A7M +3I 3I -C|?R*@2H*@-C2H3I .D0F9OL8F 9H +BQBR8H +/?.>{?Y(:(:,> +1,> +(:&8-? /A +0B/A +(: 20 2 4%9DC76??i`Q&GCNJM\#Wf-gt@A +J ROMQ R1C8Ug???UcL>E>E9K3E ;9%:%:&;&;&;&;%9%9(< !5$8)= y?^!4(; +$7 9!:!:!: 9 9 9!:!: 97667 9!:w?X$8"6&:/)>&;%:)>)>)?*@+A,B,B,B3I /E/E*@y?O(>1G(>.D4J +4J +/E0F9O;Q7M +4J2H3I 2H +3I4J7L9N??bFUPWGEL</ +"/1%'26><;8;=47bd?0%'////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402==33--66@ I CB^g? +2&'-;<@MFS%ER$=J=KES IV!FSCP:G8F ?MCN=H :F?+,??cYR&G@KDVT!b`-zp;?~I?|L?tD?`6?U+l]6m^7h^)dZ%eb+kh1``DSS7on| ++45 A654444221113-0bd?0(*11111111////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////11111111ec?4 (!+ .CYF`9S*:"PP%)14We? J QX !]V? F-71;+# "M?7</+ +%%.=??? -;..9;$& 33** +/: . +! +$ % +)ek? +-*+)41!4!!- 537#<&?%>!:63w?E.F9OCY3G:N3C&0@#*( ( 36@?@A8:ab?7-0= +61,1365////////bc?3-6+402////////13/2bc?4.0////////////////ffh\br +#"+-/2222//--13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444466666666`e?1- 6-6356688::;;/1/2`d?6134589=>@AE SSMJ&S*HS]{???}:I,6= 1C9KBTL["Q`'??uAL!DI5LQ=?>C=>44..99H +Q R R`h? +> /%=8IAR(DU)>O#ICM@J +BK HQ??[.:-91= #//; *6(4+76B=I;G9E:F9E4@06288>#??aNS+DCEDSK_W)xg9?uG?xF?r@|f4t^,fX1fX1^X&_Y'_a/_a/CK4*2di +#7=5=494444221113-0bd?0(*11111111////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////11111111id?*',4!-.:$0EF[Od,8M/ OR'/: =\b?@D M +HD6 :46( +"I@4= )# !#-9???  +&17)3? *6" #8:30/ +7* !$#(af? +0/245 ,+ %%$$7!-@*9O(@V/?W#9Q4M1Jw?L.D7M +0E ++>+>)8% /(**?C(+$)be? + +. + +,19 +31-6686////////bc?3-6+402////////13/2bc?4.0////////////////eec\bp ! )+-1111--++13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444466666666`e?1- 6-6356688::;;/1/2`d?6134589=>@ACRPLG"L#BGTsx???@P,BJEM2D5G 7"@ $9&;(<*> *> (< &: $8"5.2#6 s?[-"4 +05 9#<!:647#<!: 97667 9!:w?X$8"6&:/(=&;%:%:%:&<'='=(>)?)?*@'=*@)?|?R.D:P3I 9O>T 0< +4@&22> -9*6+7:FBN?K>JCOBN;G9;#9;#2?!v?cEV2AI"AI"NFXP)iZ/o`5ic1e_-[c*[c*gY2bT-UQ!TP S[,OW(+8& ak? '7=7?4 +94444221113-0bd?0(*11111111////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////11111111ig /78 +G +&-,:>L+AQ**: & NN 17 7 :cc?96 +;76667888KB/7 #)3=v? !6!8%< & + @GB=6;1*-0.2dh? +<; > 8557 <? +4 +1$4(5E?QAOaQSk;Og7Je Gb??h6I9M6J2"72 4,=*;"., &!7 ? fk~'(. - +*00<<@=////////bc?3-6+402////////13/2bc?4.0////////////////de_\bp '+-////--))13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444466666666`e?1- 6-6356688::;;/1/2`d?6134589=>@ABQNKB@ +.3RU???WgBX`$QY3E 5G 6&D%9';*> +? ++? *> '; +%9 3,/!3 q?Y+ 2 +.4 9#<";537#<!: 97667 9!:y?Z&:$8(<1*?(='<"7"7#9#9$:%;%;&<(>'=+A+A?U3I @V:P=SAW?U7M +5K :P;Q5K -A3G,6.)/8:47bc?2%'////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402?? 3 3 +- +-::P SWY_f? RD K)=9M*DU1AR.>O%@Q'BO!=JCM;E=E GONTJPJOMR??f;E9C DNLV$EOBLFPCM9C@A/>?-1A' +n?eA[8 at N*?M)NJ%TP+\S*XO&GNDK>XF`#h\4`T,NLKIJS&EN!, +al? '7<7B5 +74444221113-0bd?0(*11111111////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////11111111igu +9BLR--#-"0:/-<'  KFA=-0ga? 5++()3166@ DPF,2&2GF@583/13/2^a?:9= ; 8B +JZWH<' +<*:9AQPJa3I`2EaC_???J[;HZ2 at R*$8';%9)=*</A-:0+! &/ 8 & & sz?!)*$0 " .1 + B +CFC////////bc?3-6+402////////13/2bc?4.0////////////////de]baq #* 3649944++$$13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402111111114737bb?:4766666666// GCU`(Y(6g??????_l4;H>A +EH:2ME!'<)>+@)>&;"7!6"7$81!5%9u?X1$7 !4 4 4!5"6#7#7$8$833 4!5"6$8$8%9{?c74'? +4$<677 9";$=%?%?%?$> ;0K:S,Ew?L.DDT=MDPAMAI +CKJNKOKLIJ2@2@9F@MAJE#EL*>E#%, +w}Y>D UW0DF[\4PQ)NL#RP'SP%VS(if;?~SqxB^e/MUHPDL5=! +dd?(9B5>02////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////44444444bb?82;0957////////13/2bc?4.0////////////////bg} & /5>EG@B +9I*0 at +1A'$?899c_? +TPO>B;;%!;B +C + B2,%(fh?.-43?B +G1031435458/3`b?.&)6+2$N,X B==> E +">":V:W;?\@7W*J???XbaPe,EZ!+I&D5(D2O)F.G5N:C)2A9 #1).D-2H??7/ 0*/%!+&+A!//+))0477bb?62;2;79////////13/2bc?4.0--116699:;54.,$#fffbao ' 1428844++$$13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402111111114737bb?:4766666666* . I I W] Q)Z???j{ugtFCP"FJZ^,>:($*?+@+@)>%:"7 5 5%92!5&:v?Y1%8 +!4!5 4 4 4!5"6$8%9 4 4!5"6#7$8$8%9z?b73'? +5$<788 9#<$=%?%?%?$>'A2L :S0I?U7M +K[BRITFQEMFNLOMPMNJK9G 8F ?IFPFNBJIN&TY1??vPR+XY-ab6XX&jj8qp:xwA\h*Ye'CJ8&% ;?:<-0^f? 0.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+4026677899:6959be? <6936G>G66?.CP=J3@CP 4;9@ + at BCEEE!GG#MN$QR(??jFH#=?;=:<HJ#EHUX-GJHKILJMIMHLGKEI02////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////44444444bb?82;0957////////13/2bc?4.0////////////////bd?-095>:<-0!$+58E+ at M3:J2B!-& + + pt?564= +88478::=:1.')(+gi? +0,2.57:&(.078<<7:04bd?0'*80 6 M&R>: > AE6.F*G(6S4<\<\y?t?L:A[Ga>]@_1L;V)!<8(B6P>H#.8L +B +*/gi?,*.,3*$ ++"?3 +3.*).132bb?62;2;79////////13/2bc?4.0--1166888843,)" fffcck # +-108844++$$13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402111111114737bb?:4766666666(- GKXYK MUfn4EML[>N]@U\3\c:::$$,A+@)>'<%:"7 54%92"6&:v?Y2%8 +!4"6 4212 4$8&:!5!5"6"6#7$8$8$8y?a63&> 5%= 78!:";$=%>&@%?%?$>*D.H 4L/G ??]=SO^#DSNYJUIQIQNQNQMMJJDO@KDMKTKQ#HN OQ*Y[4??{QQ+WV*a`4ZX'mk:nk6ol7Xd&\h*LSA*1 + +!9=:<-0^f? 0.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402566788995848be?;58$&=8 at 3=E8HU @M8DEQ5<9@ +?A@B@@AAEFHI??hFH#?A?A>@IK$BEPS(KN!KN!LO KNJNHLFJDH>E#8?9@4;|?^(. +BDNP)FGFGOM$YW.\Y.[X-`]2jg02////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////44444444bb?82;0957////////13/2bc?4.0////////////////bb?:7@7@35  +4E@QAV =R4A%/< %2*7??8E'2>*1=):BE*25= +3 +M N ]X @<66 2 + 5 +3 +3ce?-)0+202)+/041207:26cd?4),=8 :IG 8 +9C +<C #4+<:#A.O4Uy?a9K!7U@^@aGh5P-:U28S*.I -G0J1:' ?5"$#']^?./3.60(+;8 , 5 0+*...,bc?5090957////////13/2bc?4.0--1166885611(&fffcdf  (006644++&&13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402111111114737bb?:4766666666/3 AEOOGFbs?/'$O^[^hMKU:7>EL#,A)>&;%:&;&;%:#8&:3#7';w?Z3&9 "5#7!5201 4$8';#7#7#7#7$8$8$8 $8x?`52&> 5%= 8 9";#<%>&?&@&@$>$>(B&@*B*B??_=RL["BQOZ"LWJQIPNQMPKKHHKSEMELLSOR%LO"RR,[[5???US-UR'\Y.UQ!c_/_Y%ZT Ua#\h*QXF07%0"8::<-0^f? 0.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402555677884747ad?:571+2*;B:BN;G02////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////44444444bb?82;0957////////13/2bc?4.0////////////////bb?64=5>57 %% + %!-#1 +!/ ,8",8"(62@??{HX'FW#IZ&5C"(6!.*>>'(-/*%""_a?+' +1) +303&' +- +-2..,6937ef? 5,.@@ +=E=3 +:GA +$P7K# 9>"A??c9P,M1R5VBc0K:5P?MfS:S@,E $=* 53 + 9 702aa?723086-,7 +; +87 + 2.,.-,(bc?1/8.735////////13/2bc?4.0//22446633,,!fffdfa +#,,4422--((13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402111111114737bb?:476666666698<= CEIIp??7%=MdQ_PO]NGT)P]2/D *?%:%:)>+@*?(='; 4#7(< x?[ 4': #6#7"6 43 4"6%9';%9%9%9%9$8$8$8$8w?_42&> 5&> + 9";$=%>&?'@'A&@$>#=(A";&>+C ??b;PKZ#DSMW"JTHOGNLNKMIIFFMREJCGJNOP$NO#US-][5???UQ,WP&_X.VNd\-\U!VOT`"Ye'MTB-4" +/#88:<-0^f? 0.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402445567773636`c?946 0641<,7 8CDOELGNKM&HJ#EECCDFGI??hHJ%DFEG ACHJ#02////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////44444444bb?82;0957////////13/2bc?4.0////////////////be?() 22;>@?=5737 0/ " %  "??u.;!.=2A'6 +'6 +$0'  ) , ,6=9 /). +5hj? + 2* +3& 0 - 0 " $ + +, . +6 5 + ; +:4737ef? 7.0BC? +A +62?J$U1b)@_)@_#=07*#?*Fz?`0H'G1Q7Y'Ac1+FQ*EP'>D284 + 9&4& > 89:27cc?7,,/56/.4<>4 1 +- +- +0 /,(bd?/+4+424////////13/2bc?4.011224444//&&fffdg\*+4422--))13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402111111114737bb?:4766666666 +B>55 +;@KK`q?T +I%6d4DC_onatG=P#9N1F (='<+@.C ++@'<(<!5$8)= +y?\ 4(; +$7 #7$8$8%9&:';';';';';&:&:%9$8$8$8v?^31&> 5'? !:#<&?'@(A(A'A&@$>#=*C +$=+B +1H??e8MJX#JX#KU!HRGNGNLNLNKJGFMPCF@BGIPO#RQ%XT/`\7??|YQ-_V-h_6`U'nc5j`-g]*Ua#S_!@G5!( *#87:<-0^f? 0.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402334456673626_b?936-%8=A2<,6>IHSDJFLIK$GI"CD@AACCE??kJL'EG DF@BFH!;>FIHKILILILHLFJCGBF8?-45<AH&??n,2BDUW0VW/\]5`^5_]4`]2_\1TQ&GD02////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////44444444bb?82;0957////////13/2bc?4.0////////////////bf?#& /09ACIILKJLNO,/#*hn|" (&0''1( )(%$&.$+3',B(-C%)D:67!G+-Ssu?; -3#. +(-!&9$7714 /203615cd?6.1DD;;4 +7DJ Z#^%T +N+ +#0!8&0G5t?q1H.0M9V&5TE1PA +#RJ35, *C#7H(&73'397 + +>ij? + 9,,*-1/23:< + +, * ++ - 2 1 /+bd?-) 2)202////////13/2bc?4.022444422,,"! fffdhY&(2222//))13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402111111114737bb?:4766666666EA24:>PMYi? +ba,o,3Pdke|NAX*H]"=R0E ++@-B -B '<!6(<!5%9)= +y?\!5(; +$7 "6%9)=,@ -A +? +(<&:(<(<';&:%9$8$8#7u?]21&> 6'? ";#<(A(A)B)B(B&@$>#=&?#<,C +3J??c/CDRKY&KU#HR HNIOOQ"PR#ON LKOODD?? +HHSP%WT)^X4e_;??}`V3l`8th at fY,re8pd2sg5Wc%MY18&$$:6:<-0^f? 0.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402233455662515_b?835@) $-MQZ at J'5?GQLV!DJFLIK&GI$CD@AACCE??oLN)EG CE>@EG :=FICFDGEHFIFJEICGBF29-44;JL%PR+?@IJ"QO&SQ(ZW,_\1UR'DA:A CJCK?G EMJR#.4( +dd?(9B5>02////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////44444444bb?82;0957////////13/2bc?4.0////////////////bd?/-6099;89::6779+0.1bc?1*,##$(&&% & " + + .26 + 2oq?6& . + 1 0"(8)/;#)52'' &%03/3bc?4,/CA667>KJXV +OI1:#11?s??- at F#=0"OK @ +B( %?"3H$9# +8 B?Bjl? 2) /'%*,5355%%' + +,34 +3 /bd?,' 0'0.0////////13/2bc?4.022444422'(fffdhW&(2222//))13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402111111114737bb?:4766666666DA3 +8;=P Kev?[\/| "/-CPWsC]yITi.F[ 6K.C-B +@#8/)=!5%9*> y?\!5)<%8 +"6&:,@ 1E1E.B +)=&:)=)=(<';&:$8$8#7u?]20&> 6'? ";$=(A)B )B)B(B&@$>#=76)@ /F}?^$8 +JHVQ'\W-d\8kc????g]:th at xlDdW*l_2k_-oc1Ye'HT'. $;5:<-0^f? 0.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402223445662515^a?825A+ $/TXcDN,4>CMCMGMIO!LN)JL'FGDEEGGI??qNP+EG AC<>DF:=GJ@CADCFDGDHDHCGBF3:188?DAMJIF;8 +9@ +DKFNBJIQ"PX)4:.dd?(9B5>02////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////44444444bb?82;0957////////13/2bc?4.0////////////////ba?=6?0902"$ +  + (+bb?8@C RLGJH +J=6   315R15R?%ac?) +' #6)/;6>>>UX? ; ? +C9,T'Af6PuaXGf]LdW4OB<592,9*7A"GH$9h~W4 +;>14/?0@1A2B0@.> ++; +)92B/?/?3C:J=M:J6FdtE$4%5*: )9 +1A&62B5E5E=MJZ+JZ+CP$9FA=@9=7;4?7B9G;I~_GH(HI)DE%AB MN,>@?ACE@B=@@CFIILGJDGHI'HI'OP. at A?`:;TU6FG(GG+KK/RR8DD*RR:FE0HG2 at D!DH%DJDJGO KS$>F1.6!Y\m 00'3 , ...002233 + 91 + 95KLx,=.,,,,,,,,,,,,,,,,JLu- + 5:) +3.-11111111*9 4'PR{'09////////,,,,,,,,JLr* + 27& +0+*,,,,,,,,'6 1$PRx$-6................JLr* + 27& +0+*........*9 4'PR{'0911111111 *$ % +/40 *UXw -4; +2% ( ( / +0 ; ;=;<:75UZ? 29 175 +7:@@? : +;69B? 7 +7@PRy 2 +8 7* +:4+/ 0 +* ,&)$%37 *VYz( , +---//1111,,. / 1 +3 4 4JLr* + 27& +0+*11111111*9 4'PR{'09 . .33::<< 31fffgfa "#)*,+*))31-Z[?/,-++++++++++++++++de?4)-'2)'++++++++'1/+Z[?-*+--------++++++++de?6+/)4+)--------'1/+Z[?-*+++++++++++++++++de?4)-'2)'++++++++'1/+Z[?-*+----------------de?6+/)4+)--------)31-Z[?/,-........468:<<<;lm?E9 < 9#S-[2`]`Wfi`kfHVQ3E>;4.6+3;;=9 +s?Z'=6;"'*;+<,=->,=+<):(9*;'8$5'8.?6G;L=N??_/?-.&66F*: 1A6F-= .> +;KBR!8H*: "2%37E4BDR~?XBN=G8BMS#IOILNQ"WY*\^/Y[,UW(?E@FFE)NM1[RA`WFdY;cX:??^f_(bb[[TZag'KS"DL' ) -743=62Z\?+!"----------------de?4)-'2)'++++++++'1/+Z[?-*+++++++++++++++++de?4)-'2)'++++++++)31-Z[?/,-36 (1:MV;NQ"69 +CD@A<>:<5>7@6E +8G ??yMN.<=78;<JK)8:57BD?A=@>A@CAD?B@KM(FH#68??h<=HI)LM-BC$IJ+QQ7??%FF,??'GG/>BGK&LR"IOHP!JR#AI26>'ru? "'')3&",,-.,+++++5 9XX?58,++++++++++++++++de?4)-'2)'++++++++'1/+Z[?-*+))))))))++++++++de?6+/)4+)++++++++)31-Z[?/,-----------------de?6+/)4+)--------'1/+Z[?-*+********(%%%)-)%ac? +601%+&%(*.04465= :7 :_h? +2*;8;>JLKEBCBG=9; Gux? 2#()2,,//**%%!! +1/&(eg?:/)--..0000++,./012de?6+/)4+)++++++++'1/+Z[?-*+''++00//$#fffpok + + "#,-1033; ?;>ii? + +C:8>>>>>>>>44444444no? + 9-50>62444444444 +84 7ij? +<31;;;;;;;;>>>>>>>>nn? + +@4<7E=9;;;;;;;;4 +84 7ij? +<314444444444444444no? + 9-50>62444444444 +84 7ij? +<31;;;;;;;;;;;;;;;;nn? + +@4<7E=9;;;;;;;;; ?;>ii? + +C:8<<<<<<<<C D F H I I H Hjj? JC MJ#[ "X "XCT[Vgnpr]hjUaZ&SLAC79)?&< > + > +}?\-A 7?%--?.@.@/A/A/A/A/A/A+=&8%7*<3E O5F>O=N1B-> +2C5F0A +,= .? $33B 1@ IX!??_IV ?I8B +SZ&OV"OS SW$[]+ac1ce3ac1LN&KM%QM2WS8bWCg\Hi\9gZ7??[`[WYXZV_^g&9E)5 ,(+,8:>;@ D;>ij? +<-+;;;;;;;;;;;;;;;;no? + 9-50>62444444444 +84 7ij? +<314444444444444444no? + 9-50>62>>>>>>>>; ?;>ii? + +C:8E C +(39OU;TV%DFSR"QP KL GHBKBKCODP??zJK+:;9:>?LM+<>=?BDAC@CADBEBEBEAD9;NP(@B02 ??q?AAB RS1EF&NO/VW8 at A" + +CC'??%LL2AFNS*U\(RY%NV%NV%HP9AI2nq? + + , 78E /&=>=>9720/16 + +>>>>>>>>>>>>>>>no? + 9-50>62444444444 +84 7ij? +<31 7 7 7 7 7 7 7 7>>>>>>>>nn? + +@4<7E=9>>>>>>>>; ?;>ii? + +C:8;;;;;;;;;;;;;;;;nn? + +@4<7E=9;;;;;;;;4 +84 7ij? +<31 7 7 7 7 7 7 7 7<957;<95hh? + +>6;0 + +> ?D < +>AB==:<'G!A%=)Av?? +=%3 +9 : +DBKJSSPR J +I 8 +=#B)2Q???0" /266 ?@@?>;:77 + ; 92 +:ss?K;/>>@@AACC9:;;<=>>nn? + +@4<7E=9444444444 +84 7ij? +<3100224400 (' fff^][  ((--:623^]?92377777777........[\?-+5+1,0........3/+,^_?2+,5555555577777777[Z?42<2837555555553/+,^_?2+,................[\?-+5+1,0........3/+,^_?2+,5555555555555555[Z?42<283755555555:623^]?92355555555=>@ABA@@WW?;9E<IM X,H)GcU`\_jfmf:aZ.NI ;6.8)3 76r?P1/6'."4"4"4#5$6&8'9(:1C-?'9#5"4'90B6H x?S/@ +%6#4"3.? '85F+<,=2C +8I2C +&7$5*;"1,;(7BQ??XAN:D8B +IPELEIFJMOSU#XZ(Z\*KI"JH!LE)PI-WK3YM5YM%VJ"??NPL JMRUOY$OY$!/ +,+./3333:6./^_?2'(5555555555555555[\?-+5+1,0........3/+,^_?2+,................[\?-+5+1,077777777:623^]?92380 +%1;@ ?D$BBDDNLKIFEBA=A=A;E?AB 24 +;=8:9;;>@=?PR-CD"LM+ST4=> +=>99EE)5; +BHIPFMBKDM>F/7?(Z]p,939''8945,+%$ + 2 +0''__?6557777777777777777[\?-+5+1,0........3/+,^_?2+,0000000077777777[Z?42<283777777777:623^]?9235555555555555555[Z?42<2837555555553/+,^_?2+,00000000:8667864hg?>4<3838<?;9,- +) 0&6 0#*#,3???8 at B=CA,20#-(2$@31,9B??,' +##0)2?8sw?! +,+2=::::8866./,3bb?71288::<<<<34455666[Z?42<2837........3/+,^_?2+,****&&!! fffecd #%0177 A;29dd?;6=::::::::88888888bb?87D21-788888888 =7.5dd?729< <<<<<<<::::::::bb?<;H651;<<<<<<<< =7.5dd?7298888888888888888bb?87D21-788888888 =7.5dd?729<<<<<<<<<<<<<<< F8G #Y&=s#W:nBScWhx}tU~uVsd)^OFF;;-;-;|?Y'54< 19->->,=->/@ 2C 5F7H=NO:K/@ 3D +,= 7E2@ +LZ'??aEQCMJT"U[+RX(PS$OR#SU&Y[,ac4fh9]X.[V,]R4_T6dV;eW47/ +:<;33)+ & +(48S+/J ,$lm? + ;3 D::::::::::::::::bb?87D21-788888888 =7.5dd?72966666666::::::::bb?<;H651;:::::::: A;29dd?;6=<<<<<<<<<<<<<<< + CD +G >:)0,$,9FLJ>DBAE7CG9???UVD`_KUT at FRHEQG:BM"*5 2%9 B += > +"  #/#7G#>N*sw? ,+90+2?<=;<;<88565 +:cc?23 + +A::====??;;;;;;;;bb?<;H651;88888888 =7.5dd?7295511 , , % % fffb`a +  *+112.+5bc?-+4////////44444444cc?4/ =/..64444444451.8bb?0.711111111////////cd?1, +:,++31111111151.8bb?0.74444444444444444cc?4/ =/..64444444451.8bb?0.71111111111111111cd?1, +:,++3111111112.+5bc?-+4////////:;<==<:9jk?>5?3<H/a#n*u2T.Egg\Jzo]?j8pZ(XOC:-53; +??h0;3;(0 '7&6&6'7)9.> +2B4D2B5E6F1A)9#3"2#3|?T;M9K7I/A4F ,>;M'9+=8JEWBT1C $6"4+8 4A2?LY-??b:E;DIR'RW.OT+LN&HJ"JK#PQ)YZ2`a9ZR$YQ#ZM+]P.bS6cT7`R-]O*??[SMLN&KM%2<3#-$ + 79650/*+*&",bd?$"+1111111111111111cc?4/ =/..64444444451.8bb?0.74444444444444444cc?4/ =/..6////////2.+5bc?-+4"8IOCV\PTV'KMNLOMQJOHIC#F@ C@!DA"CEDF??eDE%KL,WX8MN,AB ,.:<68;=>AANQ"9< + at CIL??k at CQS+HJ"KM&NP)RT/@BGH&8989=DBIDLEMKTPY"DL46>&mo?.733,752&%  IO];AO $km?/. =////////////////cc?4/ =/..64444444451.8bb?0.722222222////////cd?1, +:,++3////////2.+5bc?-+41111111111111111cd?1, +:,++31111111151.8bb?0.70000000002321123aa?00<9 + +@<D=?30,,-/?@B[\JVWEXU6RO0??yRL(^V1VN)MWL>H='-;%4/@B<>"%#1<.:I4Cil? ++&.)..2440/**%%-**1_`?)+7002244660000////cd?1, +:,++34444444451.8bb?0.711++$$ ffffdg ,-66//1=ij?.)44444444477777777jj?3.:375 + +A77777777446Bii?3.92222222244444444jk?.)5.20 +<22222222446Bii?3.97777777777777777jj?3.:375 + +A77777777446Bii?3.92222222222222222jk?.)5.20 +<22222222//1=ij?.)400000000:;<<<;98hi?:6 I>> 9E/?(L*XTG>uh_?pB~f8wj5YLADMP#???PZ5GN,29&5 +%4 %4 &5 +)8 +-<2A5D7F=L!BQ&?N#5D,;(7 (7 y?Q5G +1C 3E 4F @R9KFXI[!;M3E 9K?Q;M7I7I4@AM'CO)]iC??tCM(DL'V^9TX5QU2MN,HI'HH&NN,XX6``>[P"ZO![M*_Q.fU9hW;eW4bT1??k^W+QT5HK,(/5#) 25766-,)+$$&2il?#)2222222222222222jj?3.:375 + +A77777777446Bii?3.97777777777777777jj?3.:375 + +A44444444//1=ij?.)4 FLXkp\RWC?B +JM[YXVUMRJND)LB'GC*HD+GH(IJ*??qJK+OP0`aA]^@JL%BDFH IL!EH>A:==@ADX[,69 +EHUX)??gBE[^3FIVX0VX0Y[6JL' !TU3 at A<=@GAHAJ CL +MVT]$EM53;#gi~0 BCD27 + ;7(& +"  &W^dHOU $or?*+84444444444444444jj?3.:375 + +A77777777446Bii?3.99999999944444444jk?.)5.20 +<44444444//1=ij?.)42222222222222222jk?.)5.20 +<22222222446Bii?3.97777777724664469rr?8.<6:5 =AD +6 5%#$8EE=\\TVR5VR5]V,YR(??q\O"j\/fX+IOO/55+= D VQIO 5?/51GMIFR.6Bil? ,$)+= ;7 9831('"! 1*& 2gi?+'0446677991000////jk?.)5.20 +<77777777446Bii?3.944..%% + fffdck +')6 7/2.2bc?5/211111111////////bc?3-6+402////////13/2bc?4.0////////11111111bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////66666666bb?82;0957)q*rDGXTS?????m?e>?_(xSkQ cI???`Z:fl^\bT]]!GG +4%.$7-@0J 5O:T 6:6:}?["4"44F5FFW#GU"JX%KW%JV$JR!IQ IOIOIOJP QO&RP'WU,SQ(??uLJ!VT+PN%SQ(PN%MK"LJ!MK"RP'WU,ZX/aSH_QFaW$e[(j]0k^1iUTeQP???\O?GKAE'1",4////////13/2bc?4.0////////////////bc?3-6+402/// /////13/2bc?4.0////////////////bc?3-6+4024488;;== +C=, ;]b?+ . ??lSL2SL2MH+[V9RO.ZW6II#II#FL FL FLFLEMEM??t<<??YY3XX2YY3BB77==BBGG!II#FF BB@@@@WU"QOOMIG??hLKYZ.TU)SU-VX0SY3KQ+>F!7?9@=D"B:#ME.PM$JGGIOQ HM-=B"ksv%$ . TW*'21=< B=71,& +(\b?:>=////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.011111111 0 +/:5<=[e?>' 5 !#8328EDJK> +' :664GGEaQ7jZ at oY2v`9p[<\G(???dYGe`ZKF@/-^!P: +4 + 3 298E0"23ROWHAI:1@ 2A +jm?$".-24;886611//13/2bc?4.0////////////////ef?0 + 9+2)424444221166,-^`?.)-44-- +fffdci +#$23/2.2bc?5/211111111////////bc?3-6+402////////13/2bc?4.0////////11111111bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////66666666bb?82;0957 PbMC!'5Y_m??r??zzd=?mF?l?}h;??xbT-lcDulMkm^Y;]X:JG$NK(GG!HH"GJGJFLFLGMGM??o><DB\Z4ZX2_]7PN(JH"NL&TR,WU/RP*IG!ECJH"PN(RPNLMKHF??gJIUV*OP$GI!KM%MT+MT+HP)CK$AI$@H#HDOK&NMKJKORV#HN2;A%bht ( 42 +;-,BF# +)"#<=-KJ+KJ+<90-*! + +%^b?7::////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.011111111 +.,1.6; +CH]e? ; +,%)D1.5JGN[TLjc[+?Z2M#-90:FLH^N-???ZS at TTJ66, ?E +@208<313 5HD]Z[KOP at GNLS???8, + 2,02:886611//13/2bc?4.0////////////////de?0 +;.5)524444221113-/ac?.')++%%  fffdch  + )*/2.2bc?5/211111111////////bc?3-6+402////////13/2bc?4.0////////11111111bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////66666666bb?82;0957 +P` +XH -!EEOYfpz?????v\O-tgE??z?P}b+lQnoOnoO`hCKS..?$5 &> .F ;(C 1J4M0H )A&:$8~?\#5#53E/@ =N>LCQHT"GS!JR!JR!MS#OU%QW'SY)ZX/VT+TR)LJ!??nKI ][2\Z1SQ(RP'QO&RP'TR)YW.^\3a_6^UF\SD]V^W aW&`V%\KDWF????]R at NUNU7C#/ --////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+4024488;;==;84 +>di?,#0laC??ne\=g^?ga?^X6JF!SO*NL%OM&NO%OP&OR%PS&OU'OU'??tJF!QM(b^9ZV1a]8YU0YU0OK&TP+UQ,NJ%EAD@MI$XT/MKJHLJIG??iIHRS'JK?BCFFM#NU+RZ1PX/IQ*CK$LLLLIMIMMT OV"?D0,1]_x9 + +D8>14+0 +!,@@$VV:TV1FH#33'&& +"^c? 134////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.011111111 +D?;:9> ; +=mn?=4/5OJP]P at sfV~mQ?vZZ``NTTQOC[YMj_Ch]AlZ2m[3iX,ra5oeAbX4???VV>IOA*0"1@ +D76A>4#AG?L[S`_WBYQ. 1*-1:886611//13/2bc?4.0////////////////cd?1>3 :,5144442211-0,0bd?.%&&%  fffddf +   /2.2bc?5/211111111////////bc?3-6+402////////13/2bc?4.0////////11111111bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////66666666bb?82;0957 WSRSKIE-T at R`m?{zh?????s?k;X?p/giTcePVZAHL3M&,; +41////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+4024488;;==?978af?* '-O??x??oh^:\R.dZ6^T0RM'c^8[X/[X/[Y0][2\]3]^4^_3_`4??\V2b\8ic?XR.`Z6\V2_Y5PJ&PJ&PJ&NH$NH$PJ&TN*XR.MJKHNK MJ??oLKST*JK!FIEHDKKR&R[0R[0IR'AJIOEKBJGOMU&EM*-&a`?/AE78-6*&43/&A=4RS+\]5QS+ at B')! ^c?.,.////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.011111111NKCE<<"???@9AVI9i\LmY6kH?lriJjaBm`=wjG?oDyh=tb4tb4h Z-n`3nfBf^:???[^CR[F8A,A8>=ED:<, at 7RcXRbWQ^N4\L2]J)UB!x{? .$-).2:886611//13/2bc?4.0////////////////cd?2@6=.6044442211.0),^`?-'*$# + fffddb/2.2bc?5/211111111////////bc?3-6+402////////13/2bc?4.0////////11111111bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////66666666bb?82;0957@8BQ^XQX1,FiSX[????????s?tA??M~{ hmjWUS>D#($1)>/D )F&C"B"B??`+= -? ;M3D?PCQKY&HT"GS!HPGOHNIOJP KQ!TR)TR)YW.VT+??ySQ(_]4YW.VT+VT+WU,YW.[Y0^\3a_6b`7c^H`[E]]\\^Y"ZUTH$ gd? ;>A.81"AK99ZHHcY at e[B`_/^]-OT,CH #!_c?-*-////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////// //////bc?3-6+402////////13/2bc?4.011111111JI=@ +0 +4???^PEnY:wbCqV)?f9?f1?f1{g4vb/ye2?o{e4r]0r]0eV-eV-c[7_W3???a`BcgLRV;3H[0.; M=.C@:>YSWkbE`W:`P/dT3^H1K5fi?"".-117886611//13/2bc?4.0////////////////cd?2@6=.604444221122(([]?-* 0 ' + % + fffde`/2.2bc?5/211111111////////bc?3-6+402////////13/2bc?4.0////////11111111bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////66666666bb?82;095727 +EG HES(f+ZE+7O?????????????|??itiKf[=siFzpMZR+.&)+.0,9/<)A+C*J .N +??b.@ /A +:L-> +6G9GAO@L?KAIAICIEKFLHNRP'TR)[Y0ZX/??}VT+`^5ZX/XV-XV-YW.[Y0\Z1][2^\3_]4a_F][B\^Z\ XVQH9LC4??sIH*AQM]@V(,B+#////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+4024488;;==?4 +=.fk?=8?????r|n?zl?]O"sf9tg:h]0eZ-ja8i`7fa9fa9eb9eb9ea;ea;??zbX5j`=lb?^T1oeBoeBlb?ka>e[8aW4aW4cY6^T1QG$F<YU2VR/XT/UQ,??{US,^_5VW-WZ-RU(IQ EMBL@J=G:DEO-;E#8A$>G*;@9&+$ +)ic?@6?%#"B7;?jAuZ-?k>?k3 :,514444221123*+^`?0- 2$ + +  fffde]/2.2bc?5/211111111////////bc?3-6+402////////13/2bc?4.0////////11111111bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////66666666bb?82;0957 6 +> B735 BI K I +6 +9Qb?/@^ew??????i??j??^?wN?zP??Y?uJmX-[N!YLIKAC1C 1C 0L5Q??m9K8J=O+<.? /= +7E3? +3? +7?:B>DCIFLIOVT+VT+ZX/WU,??zVT+db9`^5YW.ZX/[Y0\Z1\Z1[Y0ZX/ZX/\\@YY=V[UZWWTTNG5IB0??wKL,CTPaDZ+0F +.#////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+4024488;;== B6B,af? +2$?????kzj7?LgW$?tE??R?|O|oBpgld=hc=gb#==GPW8`gHkL0tU9s]4mW.[T&QJ48!!% + 23__?927////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.011111111*<$(A15NB<ueL??||d>?qH?sJzb>H&&0D)!PB:QSKbde=^_7^_cdmi:hd5PEA7,(kn?'$ +31549886611//13/2bc?4.0////////////////de?0 +;.5)5244442211,1/ 5ik? +6-. + fffde]/2.2bc?5/211111111////////bc?3-6+402////////13/2bc?4.0////////11111111bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////66666666bb?82;0957 +/ 1-* 7D +<, > + +B +QIIg?E(Y'X?wC??\??e??V??S??a??i??b?yJ?qBjg4VS +-> ++92@ +(4)5/74<  -?????y?t@??[hX$?xG??e??q??dymCymCulCsjAogBme at jd@ic???gZ8l_=l_=aT2tgEj];ZM+YL*eX6m`>eX6UH&RE#aT2reC_ZI=H>I07A$." "1 =f_?@' +;"#EF at S[(^f3|Y9~[;u^2pY-b[-VO!-2 !8:_^?>5 :////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////// //13/2bc?4.011111111 =KKWddppfZkaUwcB|hG??w?i=?xO?yP{fG?tUmUvdLj+}h)i7?n<|hCp\7lV?pZCt^IkU at lT:mU;???nT1wZ0nQ'X[$uxAmhe:52'AJ>dkcpnfsdf4Z\*Yadljl;Y[*;63$hk?!"+,49 B886611//13/2bc?4.0////////////////ef?0 + 9+2)4244442211)/3>rt?;,( +  fffggg   ib?4<=@@::00))22222222cd?3. :2 + 9/,22222222 +86,.ab?6139999999999999999cc?:5 A9 + +@6399999999 +86,.ab?6132222222222222222cd?3. :2 + 9/,22222222 +86,.ab?6139999999999999999cd?3. :2 + 9/,22222222 +86,.ab?6132222222222222222cd?3. :2 + 9/,CCCCCCCC + LFH +Kab?TXI +M!d}}??????I?u?h>??wcW-`T*l`6nb8rf<7< BH0T7){^L?iWz`GtZA?jH?|Z???~P{n7?v?~t6|r4}t3sj)ze:~i>?lAj?{f;va6u`5va6|ghd>]Y3QMBEA6)%3 +cd?3. :2 + 9/,22222222 1 /&(ab?4134025=?<8........fg?60 :1 7,))),,0022,= A%$Fyy?(fff]]]c\?(25==99//((11111111YZ?,)2)2.111111111-0+-]^?/*-4444444444444444YY?/,5,51444444444-0+-]^?/*-1111111111111111YZ?,)2)2.111111111-0+-]^?/*-4444444444444444YZ?,)2)2.111111111-0+-]^?/*-1111111111111111YZ?,)2)2.1========<;A D[]? +E +H: +NS00GLIBM;I%5C1=1)5)# +66//--44ov?6"&:<7VXSdi at LQ(q\#p["eU1ZJ&A81+"#'*')Yb?&30/1575344444444YZ?,)2)2.111111111-0+-]^?/*-1111111111111111YZ?,)2)2.111111111-0+-]^?/*-4444444444444444YZ?,)2)2.121/-,+++ +6%2+^]?2C77<?=11 5?kM5~`H?v[?|a?vX?pR?vQ?}X?????V?sB?yH~qj??n8?v@?{U?|V?tY?kP{hHyfFui?ui?gc=ZV0KG<;7,& +YZ?,)2)2.111111111'*%']_?+*-5455:<;;00000000\]?.)2)0,/**++////#. +-0ff~fffiii     +d^?"1 :997722,,22222222ef? :6 +;).,322222222.66 7ab?0.60000000000000000ef? 84 +9',*100000000.66 7ab?0.62222222222222222ef? :6 +;).,322222222.66 7ab?0.60000000000000000ef? :6 +;).,322222222.66 7ab?0.62222222222222222ef? :6 +;).,3777777776:DE\_? < A7>> 4??k??t?r;??V??i??n??r?]?xVrPge>QO(??UFGEG>@49?D6>BJ@K>I:F=IBO$HU*IU1IU1A?US,QO(^\5??l[Y2WU.US,US,US,US,US,US,US,US,US,ZX%[Y&\X2[W1VS2OL+FGAB??XRV$QX/HO&:<7572 +%00000000,44 5ab?.,40000000000000000ef? :6 +;).,322222222.66 7ab?0.62222222222222222ef? :6 +;).,32222222241 +5 =^j?= A=?pR?????r??V??S??Z??_??p??_jgDTW?mC?rH?xN?yO?tJ?nD?kA?j@?uK?uK??a??c?????X?uK?tJ?h2?n8?rL?qK?jO{`En[;kX8eY/fZ0[W1PL&C?451&" ef? :6 +;).,322222222( 0 2 +3ac?,,46786338;44444444fg? +< 7 +;)-+2++..0000' / + ( '_`t fffUUU +UQj# + 2**--,,**,,,,,,,,QR?-2 :)+*4,,,,,,,,*32/VW?)* 7%%%%%%%%%%%%%%%%QSy&+ +3"$#-%%%%%%%%*32/VW?)* 7,,,,,,,,,,,,,,,,QR?-2 :)+*4,,,,,,,,*32/VW?)* 7%%%%%%%%%%%%%%%%QR?-2 :)+*4,,,,,,,,*32/VW?)* 7,,,,,,,,,,,,,,,,QR?-2 :)+*4*********/ 8 +4NS}(2-OW + ?qd[??z??X??e?yJ??_??k??_??_??ZtjGUK(??ZJJ$QR(ST*JNOS!CJPW!7B +6A 4@8DK =I#:F FF$\\:XX6bb@??s[[9\\:]];``>``>aa?aa?``>__=^^<]];dc-ed.gd;fc:b_>\Y8SS-OO)??WVY*Y_=PV4FGIIJL($E1%%%%%%%%#,+(VX~"# +0%%%%%%%%%%%%%%%%QR?-2 :)+*4,,,,,,,,*32/VW?)* 7,,,,,,,,,,,,,,,,QR?-2 :)+*4,,,,,,,, <1 4+;Gq.D1L at 0?????y?wW?~O?sDyc2?{JlhC_[6ZZ>ooS??_??d?|R?xN???~pVtfL\N4XJ0{mS~pV?tZj\Bj\Bj\Bl^Dm_Ej\BeW=`R8d^>nhH`\6miC??ylk=X^0IO!4::@$19;!)+8 +0:3))$$$$//\_?:?;713HBDkeEnhHcV*]P$MF,?8(&) & *32/TZ~" )'$"#'(&#%%%%%%%%QR?-2 :)+*4,,,,,,,,*32/VW?)* 7,,,,,,,,,,,,,,,,QR?-2 :)+*4,,,,,,,,*32/VW?)* 7%%%%%%%%%%%%%%%%QR?-2 :)+*4.....//0B>C>NU?0 0'' +& + +'L>>ng?????U?~Q?zM?zM?|S?}T?{U?xR???~\?wV?}\?nP?hJ?rW?uZ?}T?~U?~U?zQ?tK?pG?pG?qH?qH?oF??Y??X??{?vM?jA?kB?p:?s=?uO?tN?nSdIp]=jW7dX.i]3ea;b^8^ZOWSH>:H'#1QR?-2 :)+*4,,,,,,,,&/.+VX?%( 5+-/,))+0--------RS?.2 :)+*3&&((**(((+VXe  +fff???JJJTTTggg___iiihhhoooggggggggggggggggggggggggcb]fe`_]`WUX???SQ_\\xnn?ee?ee?cd?cd?bd?bd?bd?bd?ef?ef?ef?ef?ef?ef?ef?ef????JKyXY?jk?_`?gh?gh?pq?ef?ef?ef?ef?ef?ef?ef?ef?^_?de?^_?XY????RS?[\?kl?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg????JLrXZ?jl?_a?gi?gi?pr?eg?eg?eg?eg?eg?eg?eg?eg?^_?de?^_?XY????RS?[\?kl?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef????JKyXY?jk?_`?gh?gh?pq?ef?ef?ef?ef?ef?ef?ef?ef?^_?de?^_?XY????RS?[\?kl?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg????JKyXY?jk?_`?gh?gh?pq?ef?ef?ef?ef?ef?ef?ef?ef?^_?de?^_?XY????RS?[\?kl?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef????JKyXY?jk?_`?gh?gh?pq?ch?ch?ch?ch?ch?ch?ch?ch?]b?_d?ch?\a????SX?bg?af?RZ?RZ?gf?ed?{o}????????????????????|???????????z???~_??g??r??f??d|?P??[??`??`??d??h??r??t??t??p??e??w??o??u?????p??u??z??x??x??z??z??y??w??t??s??`??a??q??q??v??p??f??c?????`??s??n{{?}}?_Z?RMueg?eg?eg?eg?eg?eg?eg?eg?^`?df?^`?XZ????RTz[]?km?eg?eg?eg?eg?eg?eg?eg?eg?eg ?eg?eg?eg?eg?eg?eg?eg????JKyXY?jk?_`?gh?gh?pq?ef?ef?ef?ef?ef?ef?ef?ef?^_?de?^_?XY????RS?[\?kl?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef????JKyXY?jk?_`?gh?gh?pq?ge?ge?ef?ef?dg?dg?cg?cg?bi?`g?dm?T]????R^?p|?am?YXV??????????????|??]??r??p??t???????????????????????????????????????????????????????????~??x??s???????m??s?????k??g??]?????????nt?_a?_a?``?^^?fi?fi?ek?ek?cl?cl?cj?cj????::n`X}c[??wu?????}??~???????????uxx?nnx`f?^d?Ya?_g?Z`?TZ????PU{[^}kn?hj?eg?ce?df?gi?hj?eg?bd?eg?eg?eg?eg?eg?eg?eg?eg????JKyXY?jk?_`?gh?gh?pq?ef?ef?ef?ef?ef?ef?ef?ef?^_?de?^_?XY????RS?[\?kl?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef?ef????JKyXY?jk?_`?gh?gh?pq?ef?ef?ef?ef?ef?ef?ef?ef?^_?de?^_?XY????RS?[\?kl?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg?eg????JKyXY?jk?_`?gh?gh?pq?`a?bc?ef?gh?gh?de?`a?^_?lw?cn?RZ?BJy???OTtvs????{???????????????????????????????????????????????????????????????????????????????????x??v??{?????}??w?????~?????v??p??u??{??|??????????????z??r??b??j??v??y?????????uq???JKyX Y?jk?_`?gh?gh?pq?ef?ef?ef?ef?ef?ef?ef?ef?^_?de?^`?XZ????RT}[]?km?bd?df?fh?fh?df?bd?ce?df?de?de?de?de?de?de?de?de????IJxWX?jk?_`?gh?gh?pq?ai?ai?ai?ai?ch?ch?dh?dh?cf?cf?[\pXYm???X[b\^]dfeggggggggggggggggggggggggggggggggggggggggggggggggfffMMM + + +POU +""**225522222222IJx)- +<.2+.2222222213+)QR?), + 90000000000000000IJv'+ +:,0),0000000013+)QR?), + 92222222222222222IJx)- +<.2+.2222222213+)QR?), + 90000000000000000IJx)- +<.2+.2222222213+)QR?), + 92222222222222222IJx)- +<.2+.000000000.0+INx( 51N>LJ4qe?????zu??a??i??d??b??d??R?nX?eO?~e?=$GF(WV8UW0SU. +2> 6B:Gm`@l_?hb at oiGXU,ZW.??_SR$GL#AFFK5~^7_8?e>?lE?X?wP??Z?zS??v?tM?qJ?xQ??K??K??Z??[?~c?uZ~kKtaA]Q'eY/d`:ea;b^S\XMC?M+'5IJx)- +<.2+.22222222/1)'QS|%& + 3''( +- 0 /("11111111GHv), +<.3,0..0000++ SWXfffqqq  ccc ((116611111111mn?? +8>.1))111111116 712bc?5164444444444444444mm?B ;A14,,444444446 712bc?5161111111111111111mn?? +8>.1))111111116 712bc?5164444444444444444mn?? +8>.1))111111116 712bc?5161111111111111111mn?? +8>.1))3333333375 : ;\`? >B6=:>;9E8n?{??????S??X??Y??n??s?}K\I|YF??}EB/?=$NL3RT/SU0>DIO!GQDNBNEQJW)N[-MZ/LY.NX&Yc1KU#U_-??gZd2V`.R\*R\*T^,V`.Wa/U_-Q[)LV$IS!SRUTYV+[X-YV7UR3NN,KK)??oKM&JM8RU at 98H),3444444449:45bb?8494444444444444444mn?? +8>.1))111111116 712bc?5161111111111111111mn?? +8>.1))11111111* +=99jv? A +7 B&#/Gia_????????w?sKc;~qNrO?}^??g??a?zZ?zQ??Y?????_?}W?vPymG?zT?~X??o??l??\ymGoc=oc=rf at rf@oc=`Z8jdBXU,]Z1??_UT$IO!CIOU;@F, '- +*0F@==22++--jd? +97)@C5Lq_GygO?p3p\TV>GI103, +/1 +? @89ad?1$ +) ;745774144444444mn?? +8>.1))111111116 712bc?5161111111111111111mn?? +8>.1))111111116 712bc?5164444444444444444mn?? +8>.1))20.-.3 +8 +ea;]YNPLA3/="mn?? +8>.1))111111116 7/0bd?1* /&#" .99 +)22222222kl?= 7=.2))//////** ]b^fffiii ije $$//66////////ef?1).)414////////-/,3fg?6*)6666666666666666ee?8050;8;66666666-/,3fg?6*)////////////////ef?1).)414////////-/,3fg?6*)6666666666666666ef?1).)414////////-/,3fg?6*)////////////////ef?1).)414444444440/8 + + at be?D A.8S NAE I_M[?????d??V??G??\??e?uB?fW?yj???HE486CA*KL*PQ/?ELR&;E9C5A8D=JBO!DQ&CP%FPQ[&DNR\'??fYc.OY$DNOY$Q[&T^)U_*S](NX#ISFPRQUTXU*ZW,YV7UR3OO-KK)??}NP+LO<\_LB at U+.=66666666463:ff?=106666666666666666ef?1).)414////////-/,3fg?6*)////////////////ef?1).)414////////1 >))my? +@+ +C!>)Fkfj???????????\~b:ykFpb=hcEqlN~sS?vV?zS??\???sI?zP??c??d??Zqe;th>nb8i]3h\2nb8wkAwkAma7bV,UO/c]=WT+a^5??eYX(KQ#CIBH,39 # ,=4DD::1111hc?$HWIZXJ[mZ:jW7?p)?q*HL5:>'!(! + +/3793:eh? 2=:77996366666666ef?1).)414////////-/,3fg?6*)////////////////ef?1).)414////////-/,3fg?6*)6666666666666666ef?1).)4143/++4B$%S./]qVC?r_?kP?sX??{?pL?wJ??S?h;?qD?yS?|V?uX?nQ?hR?hR?lO?qT?x[?{^?z\?tV?lN?gI????uT?eC?oM?nK?mJ?pL?gCxV0]7?f@?jD?jD?jD?jD?lF?vP?sM??_??]????{U?sM?uO??K?I?}W??Z??e?y^?oOvcCj^4pd:jf at d`:ZVKKG<+'5 ef?1).)414////////-/*1fh? 2#"%  0 $?!%@+33333333bc?/)-)54 7------((  +_d^fffddd  +`a[ !#1 2BB;:11))be?*) 2.79;////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402/////////2.2bc?5/23L?;9'2"/????????r?~W??`??f??]??i??r???''11 UU/@BOQ*SY- at FJS$NW(MY'DP7E2@ 8F@NJHT"KW%??wJV$O[)CO^j8]i7\h6Xd2S_-NZ(IU#FR XW)TS%NP!LNLQKPDO +AL??X?OBQ*GV/(.F 8NJ////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402--//11224649]g? A? C[ h'4G???????????\?wBugDvhEwlX~s_?vW?xY??L??U?????c?}V??Z?yU?yU?zX{kI?uT|lKp_CjY=kZ at o^DraGtcIkbSf]N\W:OJ-??tTR)U[/BHAF/?D-(.: +7;RJ((66??--xmuODLaQ:]M6^J)p\;jS4nW8>GD"+( +##49=?69bd?0!#4444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.06666666666666666abw +#./MWCK +8%& X>1oUH?`M?iV{bC?gHqW6~dC??{?dC?fE?mL?nM?kJ?jI?oN?vT?wU?nN?gG?pG?vM?}S?U?|S?rI?jC?d=????sP?sS?mM?bH?iO?YC? ]GoX8|eE?qO?tR?nF?iA?j>?oC?k>?}P??U??Z????V??\?kE??S??R??\??_??f?x^?jH{^<}h;s^1dV3cU2ZQLH?:"4bc?3-6+402////////13/2bc?4.0620 7AB + 9/////////bc?3,4)1,/ KJ97``bfffddd  `a[ +  !,-==88/.))bd?,) 2.79;////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402/////////2.2bc?5/25 I== ?,0"1???????????`??e??i??c??n??t???11 +55TT. at BMO(NT(=CFO KT%KW%DP9G4B +8F?M?K@LHT"KW%??xNZ(Ua/KW%T`.S_-Q]+NZ(KW%HT"FR EQQUOSMP!NQ"NS+LQ)EN#@I??q9D5@/5@/9 /@@////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0//////////// ////bc?3-6+402--//11224649]g? A? C\b';???????????X?o8~nJoKs]?v`?vU?xW?}J??Q?????`?zS?}V?wS?{W?~\?qO|lKwgFq`Dp_CraGudJudJtcId\E`XAYT4NI)??uXV-[`7JO&=B,5:$!- /7OH++88==))xmqSHLk]@n`Cn\4we=bN+ZF#4<>$& %#37;=47bd?0#%4444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.06666666666666666acz +&.0HO>D&4$%`PQ?jY?o^?lZ?o]z_A~cEoR2z]=??s|[:?\;?cB?cB?fE?lK?tS?yW?wU?pO?jI?b E6'1{r?????????a??e??m??q??}??????AA>>TT.DFPR+LR&>D@IENHT"EQCG86:;.23???&+.".".*)8=////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0/// /////////////bc?3-6+402--//11224649]g? A? C``2~??????????Y?n6?uP?xS?{d?yb?xW?zY?~J??N?????^?vO?zS?tP?zV??_?vTxhGvfEtcGudHwfLveKq`Fm\Ba[;^X8XT.MI#??pUT(Z_7KP(EJ649%%*4F?//99;;$$wpjQJDh`;nfApe7vk=YJ!K<$+5")&15:<47bc?2%'4444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.06666666666666666`d */2AD3< -^JC?sl?|h?p\?fS?hU~aC?eGqR3{\=??rzW7X7?_>?bA?jI?tS?yX?wT?pM?iG?fD?\=?jK?xV?rP?dA?Z7?c=?mG???iD?hDya=tZ9?fEy\:>G <+LH_????????k??g??h??o??z??{???OO+CCPP*HJ#TV/KQ%CI;D@IDPDP>L:H9G;IAM?KCOCO??rMY'\h6Wc1P\*LX&GS!COAMCOFR HT"FZDXBO$>K 8????????~??p??a??e??m??h???TT0>>CCDFRT-EKCI9B=F@LAM=K;I9G9G?KJ=I??kFR Ua/P\*O[)KW%EQ?KG9E8D7E8F7E6DBN?K@LJ=I;G:F8D8D7C 9$/'44<;fj? :& .$,-.////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402--//11224649]g? A? CM +R!shx?????m??L?~D?vO??a??t??j??b??v??k??c?????n??[?~WoK{kGxhFhX6^N-]M,]L0bQ5iX>n]Cn]Cm\BMHXS)`[>TO2???:2/1,B. +3&.3:66<118888$$qt{QT[ejfZ_[?>L10> ,"3/075.,213/2bc?4024444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.06666666666666666Yg? 9,7, +6B"/}]j?]D?qX??S??R?zS?uN?fQ?XC?_G?cK?T9?`E??|?`C?dD?kK?eB?`=?[7?Z6?^7?c?f??]G?\F?]E?_G?fI?fI?dB?`>??u?b??d@?fB?c@?sP?jG?sP?pH?wO??Y??e??l??o??l??i??i??b??`??i????eL?iVdQqh?kb9aQ7RB(I6%K8'UD*`O5_R/dW4_[@TP578< !% /(bc?3-6+402////////13/2bc?4.03331/./0////////bc?3,4)1,/```fffddd``b!#/0bb?809+4*,////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////// //13/2bc?4.0////////////////bc?3-6+402/////////2.2bc?5/2/+ B +F DQ +C 0 `TX??t??l?oK?wS??`??`???{{WPP*>>LN'XZ3=CFL DM?H8D5A5C6D6D6DEQBNCO?K??f9E@L6B=I>J@LAMAM@L?K>J)AC354 %1134ek? +*5 +8////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402--//11224649]g? A? CTQ +qdu?????u??P?|C?zQ??d??x??l??c??w??j??a?????l??[??Y?qM|lHxhFgW5eU4eU4gV:kZ>n]CkZ at dS9]L2IDTO'YS=HB,?y~ & 90:CB73;//8888((]am6:F=@I&)2& '09745;5.,3/1-0bc?6024444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.06666666666666666Vg? :,8*!8R/6?pw?a@?wV??R?|I?pH?pH?jV?dP?fN?jR?X>?bH??}?`C?cC?jJ?eB?_I$/@K!@K!?J :E4?1<2=5@#//(( +1#=DG>`c?<+ +4-6:<////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402444444445725aa?958Q &qkal?????k??C??=??_??n????????d??e??W??m?????g??c?vY?iL?oR{dE?kLwbCmX9eR2jW7ueDxhGm]oYDsdCufEhd>a]7QT7OR5?EA(.* +)19bc?3-6+402////////13/2bc?4.0////////''++1244fc?/ +&```fffddd```  +dd?*+3.757////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402/////////2.2bc?5/277=>BC>> +/ EgWa????t`?}i??i?~X?????e??_na?GE[Y3IQ(08=L!8G:I@O$CN$=HAI HP'/:0;2=%3&!/". 49B;`c?8+ +4-6<>////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402444444445725aa?958Td`Xg????????\??O??]??_??s??r??^??e??T??^?????o??l?{^?lN?rT?lM?yZu`Ap[/6$po?&5744//2299////////de?5.6+3.1////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444^g?G"""DJ91n]U?aE?gK?nW?nW?lZ?kY?jP?eK?c=?`:zW9?dF|W:?aD??}?dG?bF?aE?\A?\A?[A?[A?[A?\B?\B?\B?^??_@?bB?aA?`=^;~`:a;??n?oF?vN??e?{S??Y????????r??e??q??y??p? ?k??g?vN?yS??a?xU?vS??v_=mZ9kX7hQ?oXFwcJ{gNsfDi\:YU2SO,OQDE B B&@=1=????o^?|k??|??c?????f??^dW575PN(MT+?FDQ&?L!AN#HU*KS*CK"@GDK";F>IAL"@////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402444444445725aa?958 +UO +>;P????????c??S??h??^?{b?}d??a??l??Y??X?????c?{]?kMu^??iJ|gH?vWtaAubBvfEyiHxiHpa at aT2VI'LU(PY,=B;!&ec?$7?44--22;;////////de?5.6+3.1////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444455555555fl?;75M`PAxhY?eG?mO?nW?kT?dQ?^K?^D?^D?d=?e>~[=?hJZ=?aD??|?bE?_C?]A?^C?^C?\B?\B?\B?[A?[A?[A?^??`A?aA?]=~\7?^9?iB?rK????uL?f*+% - 3>7bc?3-6+402////////13/2bc?4.0////////553322**dc?# + ``` fffddd```  +bev $#-.1////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402/////////2.2bc?5/267>?FF +E +E. 7&????ym?rf????~b????rS?uTrbAD>KE!KP(UZ2IT*CN$DO%LW-OV-DK">C>CAL">I>I9D??i9D@K!5@8C=HBM#CN$>I8C5@4?-?/A&3*"!34`e?1) +209AC////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402444444445725aa?958]J +.bX5\R/X^BLR6+.3a^?,8>22--22;;////////de?5.6+3.1////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444466666666bg?/"KIVjYEveQ?aA?rR?kT?gP?_N?YH?\@?]A?c9?fFF +E +E +@1 kfz???{ha????v^???v]??}]??uyqMVN*>@PR+NU,FM$EL#MT+OT,EJ">><<IT*AL"?iK?\??fI????iL?hL?fJ?_D?_D?^D?^D?]C?]C?]C?]C?`B?`B?`>?];?aI>I4D'3C&&13,+85`d?5) +2.7>@////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402444444445725aa?958 +UOB +;,2\io??g??|??j??m??g??c??c??[??^?}[???yfFlY9n[;zjI??a?tR}pNxnKqgDh`////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402444444445725aa?958GM9D)"9Iwb??t??j??m??h??i??q??g??k?c???xhGueDueDvgF?uTtgEtgEskGia=\V2ZT0]Y4[W2RN)HD'%;()/ha?D;A//))22??////////de?5.6+3.1////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444488888888lnk=??_;?iE?~V??f??k??l????????d??e????????a??Y?oH??]??}??o?\8k E!wY7?fD}dF?mOn]AudH???n`FaW>XN5HP+FN)AE49=,+.7%+ 347733/0bc?3-6+402////////13/2bc?4.0////////,+#!]b\```fffddd````iX  !////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402/////////2.2bc?5 /2//77ABCD.!Q "1NEF????p`?????y?kO?}^~gHZM+pcAa]8HDacILW-Q\2JU+JU+GR(?J 7B2=2=4?7CC/;;#@ -C FF<`c?<+ +4-6:<////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402444444445725aa?958P [> X4 +&<{ue?o??^??_??X??^??p??g??l?v^????qP?xW?tSviG{nLlb?siFogCc[7VP,WQ-[W2VR-CA20 +!+6e^?>: + J//((22@@////////de?5.6+3.1////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444488888888prgCE:d_BgbEeP%ze:zV2hD R?}P=xN>vL?hJ~YWS.SO*LP-W[8ox[=F)DN5-78 +5 +0+))+-........JLr* + 27& +0+*........)7 5'PQ*6 +?33 +* +* + + + +NNN + + + + + + QQQ fffeeeYYYeee   !%140Y\?,+.----------------de?4)-'2)'++++++++'1/+Z[?-*+++++++++++++++++de?4)-'2)'++++++++'1/+Z[?-*+----------------de?4)-'2)'++++++++'1/+Z[?-*+++++++++++++++++de?4)-'2)'++++++++'1/+Z[?-*+0178@@BB5 >7 2 +#!:OM[sq????pR?sU??yyjKcT5i_rbHq`BkZxnKf\9k[7zjF?sI?qG?l;?q@?t@?t@?xZ?tV?tS?wV?\??^?}X?wR?????`??]?~X?vR? |X?eB?c@?hZtXJ`K.]H+cU(j\/c^&]X IIJJJM.RU6uzt-2,'+7 /,)))))*--------de?6+/)4+)--------)22/ZZ?301**"!eeeYYYfffppp iii ppp & / + 9 :eg? +=:>;;;;;;;;;;;;;;;;no? + 9-50>62444444444 +84 7ij? +<314444444444444444no? + 9-50>62444444444 +84 7ij? +<31;;;;;;;;;;;;;;;;no? + 9-50>62444444444 +84 7ij? +<314444444444444444no? + 9-50>62444444444 +84 7ij? +<31 > >AB H +I +K +KKOG@ +3@.2UFJm??????~oNWH'?vS??p}uP_W2UP(\W/ed8lk?mo at km>gj;eh9W^5X_6FM$W^5??s[b9V]4T[2U\3PW.KR)IP'JQ(KR)JQ(GN%=]?'Gm%O84 9 @ @pm? @4<5C;7;;;;;;;;; ?;>ii? + +C:84444444444444444no? + 9-50>62444444444 +84 7ij? +<314444444444444444no? + 9-50>62;;;;;;;;< + +@< + + at kk?F=; M KORIO(3GAL`?xkwi\?eC?sQ?{Y?pNvhNvhN???{kTk]:?xU?{Fvl7nk(mj'nm5`_'DC1*) +0 (L P4 +84 7ij? +<31 7 7 7 7 7 7 7 744444444no? + 9-50>62444444444 +84 7ij? +<31;;;;;;;;;;;;;;;;no? + 9-50>62444444444 +84 7ij? +<314444444444444444no? + 9-50>62444444445 +84 7ij? +;20 +L +L A A +;<AB +H +H? <! 1;C8W_T??x|lHl\8wgCk[7^N*_O-_O-[H']J)_L+cP/hU4n[:t`?wcBqgNkaHd]J]VC???E?1GA371#IA,YQ?u=?|D??l?~_?oO?fF?jI?rQ?{Y?]????xT?tP?lH?b>?hD~X4?[7n\FgU?_Q,^P+^Y`[!Z[UVNSLQGL8 at E1sv?. +<)<;988:<=;;;;;;;;nn? + +@4<7E=9;;;;;;;;8<9=ii?@54 +2 +2 +) (  ppp iii fff```aaa``` #&Z\?13:5555555555555555[\?-+5+1,0........3/+,^_?2+,................[\?-+5+1,0........3/+,^_?2+,5555555555555555[\?-+5+1,0........3/+,^_?2+,................[\?-+5+1,0........3/+,^_?2+,679:??CCLJ C@< @C +H??y?????m_T6~tQ??y??dqiDMHQL"VS&^[.db2fd4cc1aa/T[1U\2CJ SZ0??mT[1MT*JQ'LS)HO%EL"EL"HO%IP&HO%EL"%Cw/cJ<7778]Z?20:284855555555:623^]?923................[\?-+5+1,0........3/+,^_?2+,................[\?-+5+1,0555555559625a`?=67FG +OSFE7'3Kui]yma?fEv\;xaA?mMxlTi]E???p]LeY1~rJvr3fb#df%ik*quPPT/"!) ,,AD3/+,^_?2+,00000000........[\?-+5+1,0........3/+,^_?2+,5555555555555555[\?-+5+1,0........3/+,^_?2+,................[\?-+5+1,0........2.+,^_?3+,FF;<67;;7<.,%'AH'V]QD$RE%M? %QC)TH2YM7ZM8ZOIfU9jY={e55db?89F654><<<<<<<< A;29dd?;6=8888888888888888bb?87D21-788888888 =7.5dd?7298888888888888888bb?87D21-7<<<<<<<< + +@:2;gg? ?; BG JTZOO,?1 at SbYJtk\?hDpX4o[8?rO?y^ukP???i\g[5nb<]\#UTV]3Y`6JNM.21 +5':B@: =7.5dd?7296666666688888888bb?87D21-788888888 =7.5dd?729<<<<<<<<<<<<<<<? 8 9 +< +<2 < +.4(/BI7\e,en5???xqCWP&ZS)PJ*HB"IC-F@*PIAQJBOIKLFHC=I82>.'7' 0KEF2hj?9 @ @,A?;IWSacZIaXGob@~qOx[9|_=?eC?nL?tT?zZ?_??a????}]??a?tRr^9nZ5_P)j[4OR%\_2ek?`f:PT/BF!=C)@F,162',( 7kl?2 G + +H99::;;;;<<<<<<<F6>'C?,kQL > 5+.ed?+* 8-,2:111111112.+5bc?-+44444444444444444cc?4/ =/..64444444451.8bb?0.74444444444444444cc?4/ =/..6111111110-+6de?2. +:@? +FJ?D.<4FT^XBjdNi@~h?xf>}kC|vV?zZ????rfi\:dW5RS)QR(GMA4:. /&<<< A )"51.8bb?0.72222222244444444cc?4/ =/..64444444451.8bb?0.71111111111111111cc?4/ =/..64444444451.8bb?0.74444444444444444cc?4/ =/..6444444443/.8bb?2.9>>56/033-9)!+5>FX`9en`i??na`0BCKL$FF,<<"45-*+#--7**4!"@9: 23/75@7jq?BDG* +@79EPR^WU>KI2RN!`\/WI$_Q,o[8yeB?hG?jI?gH?gH????jJkHs_lm?2. +;KFED9A2;:NWTN6TN6p[.?k>tc7_N"[U1rlH??}v^RYL,VI)JK+JK+)08 CCTV +=;446Bii?3.99999999977777777jj?3.:375 + +A77777777446Bii?3.92222222222222222jj?3.:375 + +A77777777446Bii?3.97777777777777777jj?3.:375 + +A77777777114Bjj?4/<BB : +; +4566 +9$F(246 at BT\+iq at kt[d??aSZ'=DOV-OT=EJ38>>*000 ++ 93?AMP34 +C3u???;=3%HCKM[ce\`;HL'KLWXe`:gbm`=q]456688::;;6847bb?9354444444444444444bb?82;09571111111113/2bc?4.06666666666666666``?609.735666666666847bb?9356666666666666666bb?82;0957332221113637ge? +:58B@??4 9 $* +:BS'Te9WeLKY at 8BA*43jm?GG!TIL A >88766544.),4ah? ?8@$D2=];BJ)08/2!IL;[[9TT2qe;pd:ob at m`>k_Gk_Gk`NlaO???jbK_]6XV/Z["kl3Y_U[2<1+5*!), + +%43:<69bc?2#%11114488 DBB@BBEFgd?/*009> D>>;;6744 dar ddd```fffddd```ddd```,,..////--//////bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402444444444737bb?: 476678:;== B CHKOT Y "[fp?75>;6?G]H>T?KkFDd?8_25\/2[;3\<1WH/UF3u(jU +J>>77bf?84 =7 +@@ C<<<<::8813-1ab?0+-4444444466666666bb?82;0957444444442515_b?8354444444444444444^a?609.736666666666959be? <69L M EC 7<8!?#/E&2H*6L*6L$0H%= +3,di? : 9@04/36688::;;6847bb?9354444444444444444bb?82;09571111111113/2bc?4.06666666666666666``?609.736666666666847bb?9356666666666666666bb?82;0957333222223737ee?:58DBBB9 += +(+&4%,:+4C,6E./;7 ,(* dg? ? +=H += B9888766544 + :53 nfAoiEpjF???njEec=_]7]^6hiAQT)JM"%(!$) !+(66;=69bd?0#%11224466::>=??@@a`?)) 79C?<;;8822..caoddd```fffddd```ddd```!"#$'(,,++//1111bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402///// ///13/2bc?4.0////////////////bc?3-6+402444444444737bb?:476678:;== B B +GJNRW Ykv?/ *+/9:FK-?????yd`:f]@cZ=bWAeZDe^Ad]@_\1[X-VZ(LPDH#=A??t at K)G^4 at W-Bg3:_+*X3-[6-_^/a`%VwMn-o +#eQ H==66cg? 95 =8 AA C>>>>==994614ad?3-/5555555566666666bb?82;0957555555553626_b?9365555555555555555_b?719/846666666666959be? <69RSOMBB @ +DEDD B +DBDDZ_?.- 6,54 +:6688::;;6847bb?9354444444444444444bb?82;09571111111113/2bc?4.06666666666666666aa?719/846666666666847bb?9356666666666666666bb?82;0957555555557:6:df? <79 FDGFDG6 +9**$" 0+96cf? <6 + +@4 <5688766544 +:519_g?6.943$!+41HL3Z^Ecc=aa;h`;h`;fb5gc6ih0lk3no3pq5??l[^)QR0LM+EF8IJ<--+''% + +, *-)33<=?A47bd?0!#11224466679:=<;:Z^?(-BDJ<27732)($#calddd```fffddd```ddd```!'())--1144bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+40244444444 4737bb?:476678:;== A +B GILPTWp~?9!1>D-3????????asgMh\BbUBfYFi^@dY;^W+\U)_`6WX.NS*DI ??k=F9 BA +DAAAA??>>8;47ae?6026666666666666666bb?82;0957666666663636`c?9466666666666666666_b?81:0947666666666959be? <69CF I GA??AFEEDHJMNej? 61 8. 87 ;6688::;;6847bb?9354444444444444444bb?82;09571111111113/2bc?4.06666666666666666aa?81:0947666666666847bb?9356666666666666666bb?82;095766778899;=9=dg? +?9; F +DKJNO B C++((= A X [hk? + +@8 ?4 +=9 <8876654442/9aj? 7.<*$//9.NXMchH[`@ST*NO%ifCheBff4dd2af#af#ai ai ??[DL4: -3%$2&%3 0 .98;:@BEG?A47bd?.#%2222444456:;:864[a? +- +7#G@A4110*(  bag +ddd```fffddd```ddd```  +&&--2266bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402444444444737bb?:476678:;==AA E GJMRThz? F5CN5=&T\E???????u]nbJfUCkZHl^AdV9^S&_T'Z`4X^2Z\4SU-??pAG@P4D.L ,J +"O20]@.c?(]| B?,}!c[L F>?87dh? ;6 +?9 +CB ECCCCAA??? +A8 ;`f?:136666666666666666bb?82;0957666666664747ad?:576666666666666666`c?92;0:58666666666959be? <69, +177 +869 : ? +@ B B B +A @?ej? +4,4+4136688::;;6847bb?9354444444444444444bb?82;09571111111113/2bc?4.06666666666666666bb?92;0:58666666666847bb?9356666666666666666bb?82;0957889:;<==? +A= @bg? +A;=A +@ JIRRKK +> = 9 +8GGYYkn? A8 ?4 >; >88766544<;5 +=dm?6 -)> + + 1=)P\H`f at W]7UW&Y[*hjEegB]d1W^+QZLUGSFR??l9D#*#"79>DDDDCCCCC;=25bd?0%'44442222554431/.am?6=%C / -* 1(' bbdddd```fffddd```ddd```  ""--4499bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0/// /////////////bc?3-6+402444444444737bb?:476678:;==@@E F +HKOQXm? M +*;K=F3"+????????kvjRjWFo\Kq`BfU7^Q%aT(LV$OY'Y^5V[2??{MN$QU"GKBS;L(J)+M,#Qa!O_ +Az6o`YK +G @ B ;:ei? ;7@: +C C FGGFFDDBB CE ? + at ah? =467777777766666666bb?82;0957777777775848be?;587777777777777777ad?93 <1:69666666666959be? <69& *22 6 +5 +9 ;677 8 42*(af?0*4/ :556688::;;6847bb?9354444444444444444bb?82;09571111111113/2bc?4.06666666666666666cc?93<1:69666666666847bb?9356666666666666666bb?82;095799:;=>? @ +A +D? Bbi? B;=:: H +GSSMM +< +< 9 +: FDRQfi? +=5 <1:7:88766544>=27Yc?& ,%$5+;H*DQ3LS'OV*Z](ad/W^5SZ1KT)CL!9D2=-8+6?|(3%) $ 9 +=@ N@@?>;:766814bc?2*,66442211/.+*)+-/iy?"988!"! , + ab]ddd```fffddd```ddd```!!--66;;bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402////////13/2bc?4.04444444444444444bc?3-6+402////////13/2bc?4.0////////////////bc?3-6+402444444444737bb?:476678:;==@@DE GJNOUk? +#U"';,7''2"rqU?????y~oZlYHr_NvcEiV8aP$eT(CRGVTY0RW.???S N0aY5\T0QR&MN" =fj? <8@;D +D F H H H H G G +E +EGI +A C`j? @788888888866666666bb?82;0957888888886959be? <698888888888888888be?:4 <2;79666666666959be? <696 +8 ? =?=EH@@:910))bg?1- +:6 +@746688::;;6847bb?9354444444444444444bb?82;09571111111113/2bc?4.06666666666666666dd?:4<2;79666666666847bb?9356666666666666666bb?82;0957:;<>@A B +C EG B E`i? D=? +/0 A +B +Q +Q +J +J01 + . ;= L +Mcf?;5 +=2:5788766544<<04U`~  '4G4ATAHV2??r????s^p[JvaPydGjU8bO$gT)CXDYQX.LS)???QI4gVBeT at PH$UM)OW0QY2fj? <8 A;D +D +G J J H H H H +E +EHJ B C`j? @9:8888888866666666bb?82;0957888888886959cf? <698888888888888888be?:4 +=2;7:666666666959be? <69H IOKKIPSSQEC8;7 :af?0+ +72 +9,,6688::;;6847bb?9354444444444444444bb?82;09571111111113/2bc?4.06666666666666666dd?:4 =2;7:666666666847bb?9356666666666666666bb?82;0957<=>@B D +E F +HJ +E Gaj? F?A *, +>? +N +N +H G98*( / / += >dg? +=8 A6 +=7888766544D F: + at cn?.!#&8:)<&:M7?N%2A>FNV#GJ*-+)$!11\c?<6> +A C5E344510-,-/-0bc?613666622//.-*- +3@'*K/2Sp??) +!- abZddd```fffggg bbbggg bbb  +  +km? +C8?5>8899999999 ?=35aa?=8:7777777777777777cc?:5 A9 + +@6377777777 ?=35aa?=8:9999999977777777cc?:5 A9 + +@63;;;;;;;; ?=35aa?=8:;;;;;;;;99999999cc?:5 A9 + +@63;;;;;;;; ?=35aa?=8:99;;==>><<??BCDETn?RM#]A(L"'#%*&??r?Smg-mg-ug at n`9fSDdQBd^:_Y5FDTR!??QV]Vf`p%Lb!G]>X1 at Z3>>>>>>>df?@; +F= + E:7:::::::: D B8:ac? B=?<<<<<<<<<<<<<<<A<;\^?:: B::::::::::::::::ce??: +F> + E;8<<<<<<<< D B8:ac? B=?::::::::<<<<<<< +H? + E:7::::9999 +J? = +LVh~'!*A;C^=>#*,/'<*? '@ $={?4 $ % bbbggg bbbfff]]]^^^]]]^^^ []?3.708488899888703.1]]?2-01111111133333333YY?/,5,5141111111103.0]]?2-00000000011111111YY?/,5,5142222222203.0]]?2-02222222244444444YY?/,5,51422222 22203.0]]?2-011112266;;=>@ABBRh? E?I 3#K/47?DGkmFwyR?{Dto8qc>oaO,QCWUOLFEAAZa? ?? +C>MN K K K K K I I +H +H@<B +JY`?<>8 +> = =<;;::;;;;;;;;[b?<7 +A6>:= @ @ @ @ @ @ @ @ +A9= +DY`?> +A: B B B B B B B B @ @ @ @ @ @ @ @U\?85 +A8 +A= @FFEEBA?>=56 =T[?6809999999999999999Z]?51;1:6:999999996946]`?8367777777777777777X[?2040649334556772756Z]?4069999999999999999Y\?51;1;7:888888886946]`?8365555555599999999Z]?61;1;7: +D E E F +G +GHH@I +D@Ye?H C@DDDDDDDD H H G +F +F EDD^a?94=2;7:::::9999=32=Sd? ) +#2%:? 5:2053$:8"86-+ +#!G +C =85578X`?51 +;1 +;7 :88888866/416ae?813974202.0 ,2'* .1#4"!2 /+nj?   ^^^]]]^^^fffiii   + + +ccciii   + + +ccc ac? + 5 4;+//57787:987- 5 5 +6bc?/-4////////////////ef? 84 +9',*1////////,44 5ab?.,4--------////////ef? 84 +9',*1........,44 5ab?.,4........00000000ef? 84 +9',*1........,44 5ab?.,4,,,,..0077;; > +? +? @\p?LIM4 +F$-68AJBI*pwX??^yxHmc?ukGveUdSCZJMcSVUHB_RL??yOL;GNBI^i?<? +8==<<; +: +: 9 +: +: +: +: +: +: +: +:fn? +FA E275 <????????@ = +FK`h? = +C@AAAAAAAA????????^f?AAI8 +;6 : +D C C B +@ +@ = = 85< BYb?2 +8 4 8 8 8 8 8 8 8 877777777ei? > : ?-20 8 8 8 8 8 8 8 8 82 : : ;ae?42 :5555555555555555cg? +<6 :+..6122344553 87 +9ae?627 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8ei? > : ?-207444444442 : : ;ae?42 :3333333355555555ei? ? ; +@-31 +9CCDDEFFG< J JE]j?DBD +C +C +C +C +C +C +C +C FEED +C +C B Bhl?B +=A.31 8 8 8 8 8 +9 +9 +9 +9A +; 9dl? +C? D275 <222244551: < ?cf?=< C +GD87 , 3-!2$/5$/5$/1!,.'+ $ +ol? +   + + +ccciii   + + +cccfffUUUWWWUUUWWW  PPl#-$) 2.-102122$--*WY"$ 1))))))))%%%%%%%%QSy&+ +3"$#-))))))))#,+(VX~"# +0''''''''))))))))QSy&+ +3"$#-((((((((#,+(VX~"# +0((((((((%%%%%%%%QSy&+ +3"$#-((((((((#,+(VX~"# +0&&(())++,,//2345FT?7F +Q9 =&2(3"P[JpuMch@^X6f`>teRqbOkXTq^ZWI at UG>?zlIC5LODUXM8FI,:=)F +<RRa_KIB@99 +5 +5KT} 4 +BH +;B +B A ? ? +> +> +> +> +: +:<5 8 +@T\?0<> 7 7 7 7 7 7 7 755555555MU?2 9D253 :::8743221/ 57NW~% 0 3--------00000000PU,1 :',, 5--------* 32/V[?'* +70000000000000000OT~+/ +7'((2,,--.//0.1,,X]?+*2----------------QV?-2 :'+* +4********* 32/V[?'* +7........,,,,,,,,QV?.2 ;)-- +7 +9 +9 +9 : ; +< +< +<4CB +9R`?6 :A88888888 +; : :98877TY?0 +4 +<)-, 5...//000 C E C;JX?@E2 :7;? +J KLG765568 : 3 9 +!4,,#11!.'*#"$"!RP^   WWWUUUWWWfff???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiighbghbghcghcghcghcggeggeffffffffhggiggihhjhhjhhj???LJWWVfihx^_tjk?op?{|?gk?fj?cj?bi?`g?_f?^e?^e?`b?fh?ac?Z\????UW}]_?mo?fh?fh?fh?fh?fh?fh?fh?fh?eg?eg?eg?eg?eg?eg?eg?eg????JLrXZ?jl?_a?gi?gi?pr?fh?fh?fh?fh?fh?fh?fh?fh?^`?df?^`?XZ????RTz[]?km?gi?gi?gi?gi?gi?gi?gi?gi?fh?fh?fh?fh?fh?fh?fh?fh????JLrXZ?jl?_a?gi?gi?pr?gi?gi?gi?gi?gi?gi?gi?gi?^`?df?^`?XZ????RTz[]?km?gi?gi?gi?gi?gi?gi?gi?gi?eg?eg?eg?eg?eg?eg?eg?eg????JLrXZ?jl?_a?gi?gi?pr?gi?gi?gi?gi?gi?gi?gi?gi?^`?df?^`?XZ????RTz[]?km?ek?ek?ek?ek?ej?ej?ej?ej?b g?bg?bf?cg?dh?ei?ei?ei????KT}Ze?mx?[j?_n?^q?h{?_olk{x??s?????}??v??|?????{?????m??h?????g??v??x??????q??d|?Yu?Yu?Xw?Yx?_?^~?_z?]x?at?at?fr?gs????PY?]h?kv?\l?k{?h|?k?cp?cp?cp?cp?cp?cp?cq?cq?ft?[i?Yh?Zi????Ud?bq?cr?fu?et?et?ds?cr?cr?bq?bq?ap?ap?ap?ap?ap?ap?ap?ap????KS?Ya?lt?`h?hp?iq?rz?em?em?em?em?em?em?em?em?dl?_g?bj?`h????S[?dl?iq?go?go?go?go?go?go?go?go?em?em?em?em?em?em?em?em????KS?W_?hp?^f?hp?ks?v~?el?dk?dl?ck?bj?bj?ai?ai?aj?\e?_h?]f????PY?aj?gp?di?di?di?di?di?di?di?di?fk?fk?fk?fk?fk?fk?fk?fk????HMwV[?jo?_d?hm?in?rw?di?di?di?di?di?di?di?di?^c?di?^c?X]????RW?[`?kp?fk?fk?fk?fk?fk?fk?fk?fk?fk?fk?fk?fk?fk?fk?fk?fk????HMwV[?in?^c?ej?ej?mr?bg?bg?ch?di?di?ej?fk?fk?ch?ch?Y^?UZ????X]?\a?gl?di?di?di?di?di?di?di?di?di?di?di?di?di?di?di?di????JOyX]?jo?_d?gl?gl?pu?ch?ch?ch?ch?ch?ch?ch?ch?^c?di?^c?X]????RW?[`?kp?di?di?di?di?di?di?di?di?ej?ej?ej?ej?ej?ej?ej?ej????JOyY^?lq?bg?jo?kp?uz?ao?ao?bp?bp?cq?dr?dr?es?Zh?ft?`n?Tb????Tb?]k?gu?em?em?em?em?em?em?em?em?fn?fn?fn?em?dl?ck?ck?ck????KPz Y^?lq?af?in?in?rw?di?di?ej?fk?gl?hm?hm?in?\f?bl?do?Wb????Zh?gw?\l?fw?du?ct?ct?du?du?`q?^o?go?fn?em?em?em?em?fn?go????IQ?W_?iq?^f?fn?fn?ow?gl?gl?gl?gl?gl?gl?gl?gl?`d?ei?]a?VZ????PT?Z^?ko?Vc?[h?dr?m{?u??z???????w?s{ov~howeg?bd}a_?a_????JIQ[Z`nmsa`fgflfejonsggiggiggggggggggggggegge\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiiggggggggggggggggggggggggggggggggggggggggggggggggfffMMM + + +RRRMMM + + +RRRPLK  +  ((11:;>>2 5,(TU?'- +:--------11111111IJv'+ +:,0),--------/1)'QR~'* + 7////////--------IJv'+ +:,0),......../1)'QR~'* + 7........00000000IJv'+ +:,0),......../1)'QR~'* + 7,,,,..0022669::;RVy&=G? G>I$;C#:B at M9anZxx^hhN^Q>ZM:oZ/?k at m^5pa8??ve_=OT>>C- at PP6FF8O*A OM[!]RQJHBA<=LT?4 ? +G?LNNGGGGEECCK ? +8 7HY?2@AFFEEDCCBAAAAAAAAIQ?19H +;?9 < < < < < < < < <A888LT?0 +>A +> +> +> +> +> +> +> +> < < < < < < < =::=543KT) +8:5555555511111111EIx+/ ?3 8265555555557/+QU?+0 +=3333333333333333FJy+1A36.0//001223 8 8.+SW?-1 +<5555555555555555IM|+1 +@26/24444444457/+QU?+0 +=1111111177777777HL{+2B6 ;5 +9 @ @ +ABBCDD ?G ?4MZ?: @G +@ +@ +@ +@ +@ +@ +@ +@ A +@ +@ ?>>==IM|+2B4 +9265567 +9 : ; +< +IJIEO^? 3 +53*)%#"  +; +; +; : :998HP?/6 E7 +;4755554400+.&$U[( .<?CB#G$=!:* &  + +GGIRRRMMM + + +RRRfffqqq cccqqq cccpl`  !"-. 8 : @ @ + +< >89ee? ;8 =3333333366666666mm?B ;A14,,333333339:45bb?8494444444433333333mm?B ;A14,,222222229:45bb?8492222222244444444mm?B ;A14,,222222229:45bb?84911112266::;<?@@@uv?7C GF NCJ*!2!3%:L>^`HfhPaVBNC/cJ"sZ2`L+fR1??ycXBCD>()#4AR/F8<44;;;;;;;; +? @:;be? >: +?9999999999999999jm?F + +BI9;0055677899 +? + +B > >be?=< C;;;;;;;;;;;;;;;;mp?H AG7:0088888888 +? @:;be? >: +?77777777<<<<<<< @ + +B C C +:/ +5+Eo??#9%;"81196 = < +A C99 +; < < < +; +;lt?HAG7 :00??;;6611 0 5 +-2qy?3.2 #? $@"C +!B @:2 /opk + + cccqqq cccfffiiihhhiiihhhd_L  +*,7 +9 @ +A8:7>jj? A52<<<<<<<<88888888ee?8050;8;<<<<<<<<463:ff?=10::::::::<<<<<<< IC O I I +N +N K KHGFE E<@ Kah?E +@2????????????????ac?9393 BA D????????9;8?fh? B63AAAAAAAAAAAAAAAAbd?<3=6A<==>>?@@AA6>@ Deg??7:????????????????eg?=3:3@=@999999999;8?fh? B63????????========eg?=3=7 +F + EI L +M +MNOOPPE +M +J Kbm? TH? +L +L +L +L +L +L +L +L +L +L KJJIHHdf?=3;5 +C B + E>?@ B D +F G +H !  56??.7!91=> R +Qaaor9 : =?A B BAdl? :/7/ = : =FFCC<<33.4-"7|??%1 /-2.4132*)jke hhhiiihhhfffddd```ddd```df[   +RUJM[h? B3 5 / / 2 2 8 +9 ? +@>>=<<;::cd?>7?4<79666666666847`c?93588888888<<<<<<< @]k?@ +;?AAAAAAAAAAAAAAAAah? +>8 +A8 A> @ E E I I I I +J +JB +D>A_e? C>B +DBA??@AB +> +> +> +> +> +> +> +>_f? =7 @5 =68=>@@@@>=>A=@_e?A;>AAAAAAAA C CBAA@??gk? <5 <1957<<==??AA8;7;`c?>8;::::::::????????ag? +D@ I? +GA C C C C C C C C CEG CFan?H B +D C C C C C C C C +D C CA@?>>_h? +53 +<8 +BC FHHCD>?<<#3 8%";(u?? *79 +I +I L L +I +IEE QKIUM @7>ax?=:H<=AR_bMK&(;L<=N>*94#fs? (1*LK; 8   ddd```ddd```fffddd```ddd```df[  +< ?; ?^j?B; +=::889977>>==<;;:be?>7?4<7:666666666948`c?93588888888<<<<<<<R[g{px??_K0wcHziO?y_???eVA\UMhaY8 @]k?@ +;?AAAAAAAAAAAAAAAAah? +>8 +A8 A> +A E E I I I I +J +J C +D?A`f? C?B CBA@?@AB = = = = = = = =`g? +>8 +A6 =78>?@AA@?>@ C?B`f? C=?AAAAAAAA C CBAA@??fj? <4 ;1957<<==??AA8;7;ad?>9;::::::::????????ag? +D@ I? +GA C C C C C C C C CEG CFan?H B +D C C C C C C C C +D C CBA@??_h? 63 +<: +D D G +D EBD?A?@*3 0--*i{?, 8= J J L L +I +ICC OC>FJ +F DJQe?:8 J72).13+, +"-",6.8B&4+99-bh? B H E 8 7 )' ddd```ddd```fffddd```ddd```de]  +  # (bj?=F IGGBB8811?>>=<<;;af??8 @4=8:666666667958ad?:4699999999<<<<<<< @]k?@ +;?BBBBBBBBBBBBBBBBbi? ?9 +A9 B? +A E E I I I I +J +J C E?A`f? +D?B CBA@@A C +D +? +? +? +? +? +? +? +?_i? A;D9 @:<?@ABBA@?B EA +Dci? E?BBBBBBBBB C CBAA@??ei? ;4 ;1968==>>@@BB9<8==<<`g? ?9 A5>9;666666667:69be?:47::::::::<<<<<<<J* +9>^"bWSMKMRX +[au?TNWLUQSRRRRPPMMLNGJ`v?LHKRQPNLJI +HMMLLK +J +J +Jan?H +D M CKEGFFFE +D +D C C +DF BE`m?IEHIHF +D C +D +DEEEEEEEEE_l?E?H=F B +D +H +H G G G G C C +BD +> @]k?@ +;? C C C C C C C C C C C C C C C Cbi? @9B: +C? B E E I I I I +J +J +D F@Bag? E@ C CBAAA C +D F +@ +@ +@ +@ +@ +@ +@ + at _j? +C>G; +C=>AA C +D +D CAA E +G C Fek?HB +D C C C C C C C C C CBAA@??dh? +:3 ;2:79>>??AACC9<9= + +8 J +LJ OGGce?:)( ddd```ddd```fffddd```ddd```de_acz25 +G +G I I +@ ?:: @ @ +? +? >===_i? @9 A6 +?:<666666668;7:cf?;57::::::::<<<<<<<89-H??x??zplOlhK??swnC~sE~sEhcE`[=Ac!eURNKKPW \au?TNWLUQSRRRRPPMMMOHKaw?MILRQPNLJI +HLLLK +J +J I Ian?H +D M CKEGGGFFE +D +D +DEF +A +D_l?G CGHGE C C C +D +DEEEEEEEE_l?E?H=F B +D +H +H G G G G C C +BD +> @]k?@ +;? C C C C C C C C C C C C C C C Ccj? +A:C:D @ C E E I I I I +J +J E FA Cbh? EA +D CBAAB +D FH +D +D +D +D +D +D +D +D`m?G +AJ?G @ BB C E E E E CB EH +D +Gfl?HB E C C C C C C C C C CBAA@??cg? 93 ;2:8:>>??AACC:=:=cf? @;=<<<<<<<<AAAAAAAAag? +D@ I? +GA C C C C C C C C CEG CFan?H B +D C C C C C C C C C C C C +D +D +D +Dai? =<FBL +K +NOOLKED??B GE +H^i? +O NT N N J JEEBB/9C :1.8 + at Z]?@#(H=Bb:CTCL]8EM6CK(8Y+L +C 5>B +Q +W + I + I / 1eir +ddd```ddd```fffddd```ddd```de```j / / 9 :BCFG +A +A @ @ ? +> +> =_k? +A:B7 ?: =666666669 <7:cf? <68;;;;;;;;<<<<<<< @]k?@ +;? +D +D +D +D +D +D +D +D +D +D +D +D +D +D +D +Ddk? +A; D;D +A +D E E I I I I +J +J E +GB +Dci? FB EBBAB C FH IJJJJJJJJ`o?L GP +EL F G +D E F +G +G F E +D E +G C Fek?HB +D +D +D +D +D +D +D +D +D C CBAA@??bf?82 ;2;9;??@@BBDD;>:>dg? +A;>========BBBBBBBBag? +D@ I? +GA C C C C C C C C CEG CFan?H B +D C C C C C C C C C C C +D E E F Fbi? B?HDM NQTSNMFEA@ KO KNal? LDE J J +I +I +G +GEE : ? 4%"2/-C???KI^GI`HJa-4Q*1NA 6<@ +O[^ U<5,) + dhWddd```ddd```fffddd```ddd```ddb  ab] + $ +& ? +A R SB +A +A @ ? ? +> +>_l?B;C7 @; =666666669 <8;dg? <69<<<<<<<<<<<<<<< @]k?@ +;? E E E E E E E E E E E E E E E Eel?B< D<E B +D E E I I I I +J +J FHB +Dci? +GB EBBBB +D +G I KMMMMMMMM`p?N +HQ FM G +H E F +GHH +G F E +D FB Edj? +GA C E E E E E E E E C CBAA@??ae?82 ;2 <9< @ @AACCEE<?;?dg? B<?>>>>>>>> C C C C C C C Cag? +D@ I? +GA C C C C C C C C CEG CFan?H B +D C C C C C C C CB C C +D E F +G +Gcj? BB KFP PSSSONIHCCNO +IKam?I? @EE +G +G +I +I +I +I BE -)149KK?QQE???XXN9;J!#20 8JI + [O=6/ 6/1ceZddd```ddd```fffddd```ddd```ddb + ccY< ?W XBBA +@ +@ ? > >]m?B;C8 +@; >66666666: <8;dg? +=79<<<<<<<<<<<<<<<@C@ +H SOBH!Z,HUegleotm??wi_;tb0vd2tfAm_:FGL%&+HGmmOSVSM +JLQau?TNWLUQSRRRRPPMMJLEH^t?JFILLLMMNNNKKJ +I I H +G +Gan?H +D M CKEGIIHGGFEEEG +A C]j? +D? CFE C B +A +A B CEEEEEEEE_l?E?H=F B +D +H +H G G G G C C +BD +> @]k?@ +;? E E E E E E E E E E E E E E E Eel?B< +E<E BE E E I I I I +J +J FH C Edj? +GB FBBBB +D +G +J LPPPPPPPP^q?OJS GOIJ F FH I IH F FB EA +Dci? E?B E E E E E E E E C CBAA@??ae?71 +:2 <:< @ @AACCEE<?;?eh? B<?>>>>>>>> C C C C C C C Cag? +D@ I? +GA C C C C C C C C CEG CFan?H B +D C C C C C C C CB C C E F +GHHcj? +DB KFP +R +U R RMNIJGGJI +? Aan?IEIBBEE +I +I L LAF 2"BEH?fi`ppNccAwvZ"! + +5 I + +j + +j9 +7 -1&$ + +  +fcn   ddd```ddd```fffddd```ddd```ddd``` + + +=?GHPM +P N`n?Q CL8A57 +K J H G +F E @ @:=7;Zh? +> +; +> ?>><;:99:9987766fh? 92 +:/847::<<==??7:69]d?:47::::::::44444444fd?81 9.613889::;<<<>:=_f? ?9;????????<<=>@AABef?>8 A8 +A> @>?D F HJLM*A %<1>D??????zuaWG%rb at g[A{oUINT"(#OE R` +HORNKJ +H D_o?OMYN TLLMMMMMMMMMPLPaw?SMPNPQSTTSRUUTSRPPOaq?OK +UJQIIKKJII +H G G BE +A +D_l?E? B C C C C C C C CEEEEEEEEan?G +AJ?H +DF +J +J +H G GFAA +DF +@ Bcj? ?8:E +D B +A +A B +DEE +D B +A +A B +DEan?G +AJ?H +DGGGFEE +D C C +DF +A C]j?E @ +D @>> BHLLJPOMMMMOP\o?M +HQ +EM G +H +G B<< +@ +C A>> +@< ?ah? A;= +D +D +D C CBBB E E +D C CBAA_f?<6 ?6 ?<> C C G G G GHH ? +A< +>_i? +B> B B C +HI +H G F +EFFFGGHHH_l?E?H=F B +D +H +H G G G G C CDF @B_m?B =A G G G G G G G G E E +F G G H +I +Iam?L H Q GO +IK +F G G HJKKLFH CE_l?G BFEEEEEEEE%9*>"0A70A7)6I)< D :^h? JJTEL @ +A ' +% + `a\ddd```ddd```fffddd```ddd```ddd``` +, .8;EEKJ^l?KAJ:C 8; +K +K +I +I H G B B= +?9 >=<;:::::98777ei? +92 :0857<<==????9<8;_f?<68::::::::44444444dd?819.614899:;;<<< ?:>_f? ?9;????????>>???@@@ef?>8 A8 +A> @??E F H +ILL +$G &I -=?????????xiHteDn_BxiLZYTA@;$5O$>FJ +EIMMMNNL_o?OL +XM TLLNNNNNNNNMPLPav?SMPOQRTUUTSTTSRQPPOaq?OK +UJQIIKKJII +H G G +DF BE`m?G +A C C C C C C C C CEEEEEEEEan?G +AJ?H +DF +J +J +H G GFAA CE +@ Bcj? ?9;E +D B +A +A B +DEE +D B +A +A B +DEan?G +AI?H +DFGFFE +D +D C C +DF +A C]j?E @ +D B?? BGKJHNMLKKLMN^n?L FO DL +E G> ? +@ ?<::;> +@< ?ah? A;= +D C C C C C CB E E +D C CBAA_f?<6 ?6 ?<? C C G G G GHH ? +A< +>_i? +B> B +A B +HII +H +H GGGGGGFFF_l?E?H=F BE +H +H G G G G C CDF @B_m?B =A G G G G G G G G E +F +F G H H +I +Iam?L H Q GO +IK G G H +I +IJKKFH CE_l?G BFEEEEEEEE(")#&/%.= 6 ?:bj?L +E N +<B +4 5 ! +  `a\ddd```ddd```fffddd```ddd```ddd```" & +24@@]j? +B@H<E ADMLKJJ +IE +D AC< +>[i? =8 +; @ @ @?>>==>==<;;::bh? +:4 <3 ;8;??AACCCC > A= @`j? A; > > > > > > > > >88888888df?;4 <094699::;<<== ?;>`g? +@:<@@@@@@@@AAA@@???ef?>8 A8 +A> @?@E F H +IKLHS5O^}???????????y?pNrb at pfMqgNRSNBC>2:E%-8LKKMNMMN`p?OK VLSLLOOOOOOOOLOKOav?RLOQRTUVVUTSSRRQPPPaq?OK +UJQIIKKJII +H G GFH +DGbo?I CE C C C C C C C CEEEEEEEEan?G +AJ?H +DF +J +J +H G GFAA BE ? Bcj? @9;E +D B +A +A B +DEE +D B +A +A B +DE`m?F @I>G CFFFEE +D C C B +DF +A C]j?E @ +D +D B @ BFHG +DMLKJJKLM^m?K FOCK +E F: +@D +C<8:>> +@< ?ah? A;= C C C C C C C C E E +D C CBAA`g? =7 ?7 +@=? C C G G G GHH ? +A< +>_i? +B> B? @ GIJJKJIIHGF +D +D C`m?F @H>G CE I I H H H H +D +DDF @B_m?B =A H H H H H H H H +F +F G G H +I +IJam?L H Q GO +IK G H H +I +IJJKFH CE_l?G BFEEEEEEEE 20 +4 0::ABgn? +H : B +(.    + ``^ddd```ddd```fffddd```ddd```ddd``` +, -_k?8 ;D?IHKMMLKKKGGFG ? @\j? =79 +A +A +A +A @ @ @ @ @ @??>==5 +>=?BBDDFFFF BE ADbm?E ? A +@ +@ +@ +@ +@ +@ +@ +@;;;;;;;;cf?=7 +?3<79::;;<==== +@< ?ah? +@:=AAAAAAAA +D CBA@?>>ef?>8 A8 +A> @AA F +G G H +J +J +S_7#3d??????????????pxhD|jB?zRxiJufGsdMXI2!\ TNON +H F +H`p?OJ TJRKMPPPPPPPPKNKNcs?QLNQRTVWVVUQQQQPPPPaq?OK +UJQIIKKJII +H G GGJFIcp?J +DF C C C C C C C CEEEEEEEEan?G +AJ?H +DF +J +J +H G GFAA +A +D ? Acj? @:<E +D B +A +A B +DEE +D B +A +A B +DE_l?F?H=G BEEE +D +D C B B B +DF +A C]j?E @ +DF C +A BEF +D +AGGE +D +DEGG`m?F +AJ?F @ +A> +@ B A +@ +@ +C +G> +@< ?ah? A;=BBB C C +D +D +D E E +D C CBAA`g? +>7 @8 A= @ C C G G G GHH ? +A< +>_i? +B> B> @ GIKLMMJJHF +D C +A +A`m?G @I?H CF J J +I +I +I +IEEDF @B_m?B =A +I +I +I +I +I +I +I +I G G H H +IJJJam?L H Q GO +IK H +I +I +I +I +I +IJFH CE_l?G BFEEEEEEEE +H GEDEH +G Jgn? > +' +.   +  ``^ddd```ddd```fffddd```ddd```ddd``` + bk?-2<<FILLLKKKLHHII +AB]k? +>8 : +C +C +C +C D D D D D +C +C BAA@@_i? >:C: CA +C F F +H +H +I +I +I +IFH +DGbo?I CE +D +D +D +D +D +D +D +D????????bg? @9 +A6?:<;;;<==>>> A= + at bi? A;=AAAAAAAA +D +D CBA@?>ef?>8 A8 +A> @ B B F +G G H I Iag? Uw??NXq???????????bnB?sG?i;?tF?vIpU(+f VLOO +H +EJ`p?NIR +HPKMOOOOOOOOJMJMcr?PKMPRSUVVUTOOOOPPPPaq?OK +UJQIIKKJII +H G GGJFIcp?J +DF C C C C C C C CEEEEEEEEan?G +AJ?H +DF +J +J +H G GFAA @ C> Acj? +A; +>E +D B +A +A B +DEE +D B +A +A B +DE^k?E>G=F +A +D +D +D +D C B B +A +A +DF +A C]j?E @ +DG C +A +A +D +D B?D +C A A A A +CD`k?D>G< +C= ? A><= A F H I> +@< ?ah? A;=AAB C C +D E E E E +D C CBAAah? ?8 +A8 B> +A C C G G G GHH ? +A< +>_i? +B> B? +A GJLMNNIIGF +D B @ @an?H +AJ?I +DG J J +I +I +I +IEEDF @B_m?B =A +I +I +I +I +I +I +I +I H H H +IJJKKam?L H Q GO +IKJ +I +I +I +I +I +I HFH CE_l?G BFEEEEEEEEPQ O Q L N +D Eei? +- ```ddd```ddd```fffddd```ddd```ddd```ch{ % /3= AD I J +IJJKGHIJCC_m?@ : < +G +G +G H I I +J +J I I H H +G F FE]i? @;D=F D G I I J J L L N NJMIL`o?M GIIIIIIIII +A +A +A +A +A +A +A +Abi? B; C8 @;>;<<=>> ? ? ? B= + at bi? B<>BBBBBBBB C C CBBAAAef?>8 A8 +A> @ +C +C +G +G G G H H +Ya ESj}? 3Qhvv??????????~Wpg at v`1?pA?kF<E +A C +D C C B +A +A @ @ +DF +A C]j?E @ +DE B @ @ C +D B? A @ +? > > +? @ A`j? +B<E: +B;=; ? +CED +C +CD> +@< ?ah? A;=?@AB +D E F +G E E +D C CBAAbi? ?9B9 B? B C C G G G GHH ? +A< +>_i? +B> B +A CIKLMMMGFF +D C B +A +Abo?H BK @IEH +K +KJJJJFFDF @B_m?B =AJJJJJJJJ H +I +IJKKLLam?L H Q GO +IKKJJ +I +I H H GFH CE_l?G BFEEEEEEEEG I IK? = /-df} ```ddd```ddd```fffddd```ddd```ddd```cck + # .3 7 G G G H +I +IFFIJCD`n?B <? +F G G H +IJKKJJJ +I H G G G\i? A=G?I HKLLNNPP +R +RIL +HK_o?L FIKKKKKKKK E E E E E E E Eaj? E> +F: +C>@<<==> ? ? +@ ? B> Acj? B< ? C C C C C C C CBBB C C C +D +Def?>8 A8 +A> @ D +C +G +G G G H +GDV +EIk??)KIbi???????????}ihJr`:mGb:rU-#3n T +ENSKK Vaq?N GO DNJN +J +J +J +J +J +J +J +J IL HLeo?O +JLLMOQQQPPLLMNOPPQaq?OK +UJQIIKKJII +H G G +DF BE`m?G +A C C C C C C C C CEEEEEEEEan?G +AJ?H +DF +J +J +H G GFAA> +A= Adk?B = ?E +D B +A +A B +DEE +D B +A +A B +DE]j? C=F; +D @ C C C B B +A @ @? +DF +A C]j?E @ +D C @> @ C +D B @ +> =<;;< = +>ah? ?:C7 ?9:5L%,b%,bP ?< A> +@< ?ah? A;=??AB +D E +G +G E E +D C CBAAcj? @:B: +C @ B C C G G G GHH ? +A< +>_i? +B> B +DFKLMLLK +D +D +D C C C C Ccp?I CK +AJFHLLKKKKGGDF @B_m?B =AKKKKKKKK +I +IJJKLLMam?L H Q GO +IKKKJ +I +I H G GFH CE_l?G BFEEEEEEEE +: +: 6 +4(%ceq```ddd```ddd```fffddd```ddd```ddd```___  " +(,EE E +F G HEFHJCDao?C +>A +G H H +JKLMMLLKK +J I I HZi? C=G@J +HKLLPPRRRRJL +HK\o?M GILLLLLLLL G G G G G G G Gaj? G@ +H= +E@C<<=>> ? +@ +@ +@ B> Acj? +C= ? C C C C C C C C@AAB +D E F Fef?>8 A8 +A> @ D D H +G G +F +G +GA WB5[x?54?]}??????????ks^wiL?rU}eC}eC/?z [IPR F DOaq?N FNCNJN I I I I I I I I IL HLdn?O IL +JKMOPOONKKLMNPPQaq?OK +UJQIIKKJII +H G G BE +A +D_l?E? B C C C C C C C CEEEEEEEEan?G +AJ?H +DF +J +J +H G GFAA> +A= Adk?B = @E +D B +A +A B +DEE +D B +A +A B +DE]j? C=F; +D @ B C C B +A +A @?? +DF +A C]j?E @ +D +A?=? CE C +A = =;::; = =ah? ?:C7 ?8:4&\EL?CJ? ']>9D> +@< ?ah? A;=>?@B +D F +GH E E +D C CBAAcj? @:C: +C @ C C C G G G GHH ? +A< +>_i? +B> BFGLMMKKI B B B C C +D +D +Dcp?I CL +AJFILLKKKKGGDF @B_m?B =AKKKKKKKK +I +IJKKLMMam?L H Q GO +IKLKKJ H G G +FFH CE_l?G BFEEEEEEEE41("  cfk   +``bddd```ddd```fff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiii_q}_q}^o?^o?_k?_k?ah?ah?cg?ko?^`?IK????VW?gi?uw?gs?eq?co?am?`l?`l?am?am?`l?`l?am?bn?co?dp?eq?eq?v??JW?iv?mz?Ub?_l?^k?\i?]j?]j?^k?_l?`m?an?bo?bo?ly?ly?an?GT????MZ?gt?dq? fs?er?er?dq?cp?cp?bo?bo?bk?bk?bk?bk?bk?bk?bk?bk?|??OX?kt?ox?W`?en?gp?gp?_b?`c?`c?`c?ad?ad?ad?ad?hk?hk?eh?WZ????UX?hk?fi?ap?ap?ap?ap?ap?ap?ap?ap?\k?\k?]l?^m?_n?`o?ap?ap????KTen?mv?U^?^g?bk?js?bk?bk?bk?cl?cl?cl?dm?dm?kn?gj?[i?KY~???Hc~]?_??x????????????????y??W??T???~??dh?cg?bj?ai?^p?fx?n??B\wc}?i??Te?`q?cj?ah?ah?bi?dk?fm?gn?fm?el?el?^e?ho?gn?PW????NU?ip?ip?bo?bo?bo?cp?dq?er?er?er?er?er?er?dq?cp?bo?bo?bo?z??K^?ex?gz?Ob?_r?cv?ex?`s?`s?_r?^q?]p?\o?[n?[n?`i?ir?ir?PY????MV}gp?gp?en?dm?dm?cl?bk?bk?aj?aj?aj?aj?aj?aj?aj?aj?aj?aj?~??JSzgp?r{?[d?cl?fo?lu?bj?bj?bk?aj?`i?_h?_h?_h?\f?fp?eo?NX{???LWwgr?gr?]l?]l?]l?]l?]l?]l?]l?]l?`o?^m?\k?[j?\k?^m?ap?ds???JS~fo?nw?W`?_h?cl?js?^g?^g?^g?^g?^g?^g?^g?^g?cl?aj?]f?NW????OX?en?en?`i?`i?`i?`i?`i?`i?`i?`i?aj?aj?aj?aj?aj?aj?aj?aj???IRycl?kt?S\?]f?bk?js?ag?ag?ag?`f?_e?^d?^d?^d?V\~gm?bh?OUw???OUw_e?nt?cf?cf?dg?dg?eh?fi?fi?gj?eh?eh?eh?eh?eh?eh?eh?eh?|??HQxen?ox?Yb?aj?dm?js?`i?`i?`i?`i?`i?`i?`i?`i?[d?en?en?NW????LU?gp?gp?bk?bk?cl?dm?en?fo?gp?gp?^m?^m ?^m?^m?^m?^m?^m?^m?v??KZ?m|?s??[j?et?bq?_n?Zm?\o?_r?at?at?_r?\o?Zm?^q?dw?_r?CV~???DWcv?ex?an?an?an?an?an?an?an?an?^k?_l?`m?an?bo?cp?dq?dq?~??NW?ir?kt?U^?en?js?mv?cl?cl?cl?cl?cl?cl?cl?cl?]c{gm?hm?QVv???PUjp?jp?^e?`g?al?cn?bp?_m?]l?Zi?ffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnfffffffffffffffffffffffffffffffffffffffffffffffffffNNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + +   +. +2 +BD EP K=UZ?? DL +H G +ECBAAA==>?@AABLY? +D ML 9HA 8>??@AB C C @ KQFQ]?DN @HHGGFEED +A +A +A +A +A +A +A +AJR??HG5E +A +9 8 8 8 8 8 +7 +7 +7 +; =A +:TX?4A +;>>>>>>>>>>?@ABBCPX?= CF5 @== +< +< +< +< +<=== +G +GB9E_?2#E B4V8Pr??????????zvr+jf6?<*30%I"F +^Q R[CZ?A !; : 1 AP +H D DCCCCCC ?IL =KR?<L +EH I I +J K K L L L L K K +J I IHL_?F"M J9 J +HBEDDCBA@@9BE 6JS~ 4E = ? ? +> = =<;;;;;;;;;;KT 7 @F +5 @<; B BAA>=< +; 6 ?A 2HQx.=5>>>>>>>>A@>=>@C +ELT? ; BF5 @ +< ;========>? +A 8MU?5 +D @????????;;;;;;;;LU? 6< @.: 7 7 +5 +5 4 4 3 +2 +2 1* +: 8-UZ?- 4< 9 9 9 +: +; < < < +; +; +; +; +; +; +; +;IR} 6 ?D 4 +>:9<<<<<<<< +9 CF7IQ?6G? @ @ +A B C +D +DEAAAAAAAAO]? D GB1 D D@@ACEECA@ 7D!L@J]?;F; I I I I I I I IGGH I +J K K LKS??E C3E C>>>>>>>>>5>E 5JP?8L +D C C +9 8 - +*  NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ fffeeeYYYeeeYYYeeeYYYeee , .2 @ FB[h? +B ? +AKJIGED +B +B @ A A +B +BCCDiv?UHE< PG: +A B B C C +D +DE; G +U SYe?N Q@ H G G +F E EDD B B B B B B B Bcl? M +CA8 +L +C5;;:976556: +D EY_?<B9???????? @ @ @ +A B B C Chq? +L@ +C;J B;>>>>>>>>BEEGOf?9E< :=,7Us~???????ji;UT&S^M2=,.%RT`_au?[;8 ++$E!F +=FD @=<= > +?; AG +BS]?C H8 G H H +IJJKKKKJJ +I H H Gev? +THD< +QI=EEDD +C B B B7 = D ?T[? +A F6 = = =<;:::::::::::el?C9 =6 D<4CC@@=<;:6<@ +;RZ? :>.???????? +A @?? @ B +DEdm?H>A9G>6>>>>>>>>=?GGR[?? +F>@@@@@@@@::::::::el? +A580 ?7044332110,886^b?844677899::::::::::bl?B8 <5C:3;;;;;;;;= +CI DR[? EJ: B B B +C D D E E +D +D +D +D +D +D +D +Dhu? +Q +A<5KG= A +CDEED +C A: +CONWh?LM9 H H H H H H H H +I +I +IJKKLLbk? MA>7 M E9>>>>>>>>CIOJS\? +H +I8 7 +5% eeeYYYeeeYYYeeeYYYfffppp iii ppp iii ppp iii ppp   + * 6 CGhz? IGIWWWVTRPOSTTTTTUUo}?[KK F\ WNPPPQQQQQW X +\ +YYg? +Y!b X +Y +Y X XWVVUOOOOOOOOlv?W JL +H\ T I M +LJ +I G EDC +F E +OVdj? MQJPPPPPPPPMMMMNNNNq{? +U I QM[ T Q QPPPOONN O +P +Q"Y_t?HOFIU P!-]PVbw}?y~j[`LbnVLX@/9C *4!W!Wpoj{? +kIM;)<]3DV2CU$Z VP +KHI +K MGF +K Mbm?RR ?TTTUVWWWWWWVUTTTiy? WJL G \TJPPPPOOOO H H M +Oci?UUC K KJ +I +I H G G H H H H H H H Hou? NBJ +FU NJ +O +O +O N K +J I I F E G Iah?MM: +K +K +K +K +K +K +K +KLLLLMNOPlv? +RFN JWN I +K +K +K +K +K +K +K +K +K J +RX`j?N S +KMMMMMMMM H H H H H H H Hms? +L? +FAP HD B B BA@???@ DA + Eln?K B@DD E E +F G G H H H H H H H H Hku?MAJ FUMIJJJJJJJJNM +R Tak?XXEOOOOPPPP R R R R R R R Rdo? TM +SN!_ +SEOOPPPPOO WSSR\l?[%aRUUUUUUUUWWW X X X X Xku?V I +K G]VLLLLLLLLLVVX\cm?ZN ;0 +, ppp iii ppp iii ppp iii fff```aaa```aaa```aaa```  )^n?5 +7>MNOPOMK +INNNNNMMM[k?O +H +KAPNNMMLLLLL +K [TS +PO^? OXRTTSRRQ +P +P +J +J +J +J +J +J +J +JYd? LG +MBO +JH +H GFDB@?>F=B JV^?C IF I I I I I I I IHHHGGGGG[f? IER IP KO L L K +J IHHGNG DNUi? +?I CI\[ +V#.NGRr[flT_eFQAT_OVaeBMQ*K4 +MSVg? \K +R5)O$6D+=KV +QKF C CEGE=> CWd?JK< +M N N O +P +PQQQQ +P +P O N N +MUe? +K GMBO I G I I I I I J J J G>?EY_?L M>DCCBAA@@BBBBBBBB\b?B> J@ +HC +HIIHHEDBAE=:?W]? EE5EEEEEEEEEEFGH I IHXc?FCPF KDGFFFFFFFF I@FNU`?F LHHHHHHHHHBBBBBBBBY_??; G<C=A<<;;:998?<59`b?A;<>??@AABBBBBBBBBBXd?B>KA HD H E E E E E E E E +MEF +JXc?QSC +J +J +J I I I I I L L L L L L L LP[?GHRHS ID J I I I I I I JV +K G +HSc?S YN +P +P +P +P +P +P +P +PRRRRQQQQVa? +JF +MCP K +J I I I I I I I ISJBFU_? +> .```aaa```aaa```aaafffiii  iiiiii  iiiiii  iiiiii       +do?'+5NPSV WVSRQPPOONNMau? +YW"]MSPVVVUUTTSS[U[#bau?ZYNWWVVUTTSQQQQQQQQ`n? T TZ HM IM +O NMLKJI +HSCCM\f? FMMLLLLLLLLPPOONMMM^l?NP"_ON ISQPONLK +J +J ZL +D Q]o?ANLYO T +a J J, at XYm?~??krzLWY5 at B(;B&9@)K9at?]] b ?J 5%> [X +TOMLMM S +HIP\k? S +WNTUUVWWXXXXWWVUUT`p? W W#_MQKOOOOPQQRRP E E K_e? +LP +FJJ +I H H G +F +F +I +I +I +I +I +I +I +Idj? +I +IV +F EA +L P P +O +O L K J I +J?> +D]d? FK BLLLLLLLL JLNPPPON]k?NP!^M +JCKMMMMMMMMSD +GS\j?LRROOOOOOOO +I +I +I +I +I +I +I +I`f? +F GUCA; E +C +C B BA@@? +HA7>eg? B? +H +H +H +HIJKKKIIIIIIII_n?KKXG +F +CMLLLLLLLL +U +JKR^l? +UYPRRQQPOOOQQQQQQQQcn? +SN RBLM +VRQONNOQRSKPZdt? X +V +IWWWWWWWWYYXWWVVV\j?RS[KO +JNRRRRRRRRL? +46Za{!  iii  iiiiii  iiiiii  iiifffhhhdddhhhdddhhhdddhhhadk >A +GKN NLJ F F E E +D CBB]r?MJSEKFLOONMLKKJN GO"]cw?UR GNMMLKKJJIIIIIIII`q?LGO@ +E +BHCCCCC +B +B +B +L9:GYf?< @ +? C C C C C C C CH +G +G F E +D C C[l? C +B +SF +E@LIHGF D +B A@SA7G[m?7CB +a +RS[F +A*K9Stz}?eh?DOU2=C1G:;QD'CF,/cy?JX^DG0 5ONMKI G F +EIA GQYi?KPKJKKLMMNNNNMMLKKJ`q?MK T +EI CH +E +EFGHIIJE< @ +H[b?> +A;???>=<<<????????dk? @; J<<9E G GDDA@>=<48BZb? :? : C C C C C C C CAB EHH +G F +D]n? +E D UF +B; +E +E +E +E +E +E +E +E +EJ9=O\m?FIHGGGGGGGG????????`g?<9 I:83<::998776<72;ad?64 A @ @ A +B +BCDD +? +? +? +? +? +? +? +?_p? +A =L +> =:GCCCCCCCCH@FQ[l?KOKJIIHGF +E +E F F F F F F F Fco?I@ +G9 C F QJHF +E +EFHJG +BKW_p?IH>NNNNNNNNNMMLKJII\m?IG R CG +BGGGGGGGGG  +W[\hhhdddhhhdddhhhdddffflll + + +iiilll + + +iiilll + + +iiilll + + +  gfd8< B I L L K I IHGFE +D C C[r?A:HBLHLONNLKJIITGJ Vax? V%[URRQPPONNHHHHHHHHey?G +=HAKIOBBBCCCDD L9 < M_o? +> = +;FFFFFFFFGFEDC +B A A^r? +=6KFJF +QMLKIGEDCS@ 7 Ibt?7CBBU d +XJU@,O\\???????PiL2K..M;9XFj??>U `W ]G JSSTSROMK +H DO!\_r?OSOJJKKLMMNNMMLKKJJbs?D<IBJEICCDEFGHIB< FPcj? = +>9 ? +> +> =<<;; ? ? ? ? ? ? ? ?ls?<2 D =B +AM F E C B +A +A = =62 ;Hbj? := : +B +B +B +B +B +B +B +B +? ADGGFD +Bbv? +@:NGHBKDDDDDDDDG7 > Scw?IHEFFFFFFFF ? ? ? ? ? ? ? ?fm?80C< ?: D 98876655755 +Ahl?51 @AABCCDEE????????ez?>4F?DC OCCCCCCCCC ?J$Wau?JNJIHGFEDCCCCCCCCCC^k? +?: KF +OH +LIGDCCDGI +OEJ QYj? +AGFNNNNNNNNLLKJIHGG`t?D +=KENINDDDDDDDD `bT  lll + + +iiilll + + +iiilll + + +iiifffddd```ddd```ddd```ddd``` - 1 L N__^]RPGFfm? IEPD KCDGGJKQ S#Y%[[]X[`|?!`\#`[[ \ \ [YVUOONMMLKK\k?H +DN +E NILYYXWSRPOMOHJ\o?KFIIIJK L MNO I I +JKLMNOar?H @H ?JHLIJOPRQO +N +JL F I`j?K F +J H +JLNNL +J HS&c-DpH_?Xs?Vq?Hfd;YW???8WR5@)8'IGDSSRRPOLLIJ +A C\l?EBFMOQSSQOM +L _^ V!/n>L?%3r<[n?JGRHQJKIIIIJLNODGBDan?D> +@ +A +A +A +A A A A A G G G G G G G Gci? JE OE M G I I I I I I I I I +H JDFag? ID G J J +K L L MNNQPONMLKKam?L GPDL E G G G G G G G G GNPKM`p?OJNKKKKKKKKGGFEE +D C C`m?G +AJ>E? @ = =;::; = =; +A ? +Aah? +>: ? +C +C +C +C +C +C +C +C +C B A ? ? +@ A A^m?J +F QIROQ M M P +QTUVVPRMO_t?QLPMMLKKJIIKKKKKKKK]m?K +ENBIC DGGHIIJKK +FKHJ^m?IGN Y YUTPOJJ =@E +IKJ G EVy?SLRJVTY L +J +94```ddd```ddd```ddd```fffddd```ddd```ddd```ddd```/0FISUVRMIak?K +DN CMILKKKLOR!W"X\^Z]a}?"a ]#`\ ]"^"^"] [YWQQPPONNM^o?J +FP FNIKYYYXVUSSNPIK]p?KGJJ K +K L M +NOOLMMNOPQQar?H +AI +@JHLJKOPRQPOKL +G Iak?K +G +J +JLNOONL +JLL +?J :SPj??????????\y}A\o"=P $J&LEDSSSRPPMMJK B C\l?EBFNOQSSQON +I VT J]1?~6D?!/n[n?KHSIQKLIHHHHIJKEGCE_o?E +? A +A +A +A +A A A A A G G G G G G G Gci? +KF OE M G I I I I I I I I I J +KF +Hci? JF I J +K +K L M MNNOPQRQPNLam?L GPDL +F G G G G G G G G GNPKM`p?OJNKKKKKKKKGGFFE +D +D C`m?G +AJ>F? +A +> =<;;< = +>< +A ? +Abi? +>: @ +C +C +C +C +C +C +C +CD +C A +@ +@ A B +C`o?LG QIRMOOORSVWXXPRMO_t?QLPLLLKKKKKKKKKKKKK]m?K +ENCJ D +EIIJKKLMMHMJL`o?KJPQQOONNMMMMLKKK +M NUt?NLWOYP S < +: ($```ddd```ddd```ddd```fffddd```ddd```ddd```ddd```   !8 @ +!SQUQ`r?Q KREOLPPPNONPST]_Z]a}?!`\#`"_"_$`%a%`#^"] [ VUUTSSRR_t?PKTIQKLXXXYWXVVOQJL]r?MHK M MNNOOPPPPPQRRSSar?HBJ BKIKJKOPRQPOKM G +I`l?L GJLMNOONML j +iTI6 #I/J_Lg|???_z?Mf?2Ki,]$UKOSSSSQQNNLMDE\m?FBGOPRSSRPOPUR +H GU&d,j[p?NKVLTNOLKKJJIIIHKFH_p?H B +D D D D D +D +D +D +D +H +H +H +H +H +H +H +Hbj? +KF +PEN +H J J J J J J J J JLN +H Jck?M +H +K +K +K L L +MNNOMPTWXURObn?M GP EM +F H H H H H H H H HNPKM`p?OJNLLLLLLLLHGGFEE +D +D`m?G +AJ?G +A B A @ +? > > +? @ A >D +BD`j? A= +BFFFFFFFFGFE +D +DEFGbs?NI RIQLMSSVVYZZZPRMO_t?QLPKKKLLLMMKKKKKKKK^n?K FO DL +E GLMMNOOPPLQNPaq?OM T I IJKOPSS"_[XTRTWY]w?OL +$XH N>>#"```ddd```ddd```ddd```fffddd```ddd```ddd```ddd ``` !? C R Rdz?VSZ +OU P PXXQQOQOP\^X[_{?]Y\#`$a&b'c(c'b%`$_!W!W!W VUTTT`y?UOXLSLNUVWXWXWWPRLN^u?NJMPPPQQQQQPPQQQQQR`q?HCLDLIKKLPQSRQPLN +HJ_n?M +HKKKLLLLKKM Z_ `H +> 0 +1p??.Fh'>h6`'^&]TZRRSSRRPPNOFF\p?GCGQQRRRRQQTTXXOCDM\r?PM YOWPQPPPONMKJLNIL_r?L +EGGG G G G G G G I I I I I I I Ibl?L +G +Q FN I +JKKKKKKKKN P +JMdn?O +JM L LMMNOOOLPW + \ !]ZURco?N H Q +FM G +I +I +I +I +I +I +I +I +INPKM`p?OJNMMMMMMMMHHHGFFEE_l?G +AK @H B +DD +C A A A A +CD +@FDE`k? +C ?DIIIIIIIIJIHHHJLMcv?QKSJQKLWWYY\\\\PRMO_t?QLPKKLLMMNNKKKKKKKK^n?L GQ FN +HILMMNOOPPMROQ_r?PNUEFKMTU\]'j%h!eb\]]^l? + KA +G03 + +```ddd```ddd```ddd```fffddd```ddd``` ddd```ddd```   +#7 +:^s?FI#VT +ZXX]]WVQROPZ\VX\x?ZUX$a%b'c)e*e)d(c'b"\"\![ Z ZYXX^|?[U"^RYSTTUUWVWVVRTMO\w?PKNTTTSSSSSPPOOOOON`q?ID NFNIKLMQRTSRQMNIK_o?MILJJIIIIJJUV PUPSKKOf?FFO +!\(cUYRRSTSTRRQRHH\r?HDHSSRRRRSSSNT%b'dXRW[u?VS!^T\VWWXYYXUSQORMO`u?OIKIIII +I +I I I +I +I +I +I +I +I +I +Ibn?M H +R GOJKKKKKKKKKO QKMdp?PKNMMMNOOPPMRX !] #^!\WSdp?N +I +R GN H +I +I +I +I +I +I +I +I +INPKM`p?OJNMMMMMMMMIIHHGFFF_l?F BL +AJ +DFGGE +D +DEGG CHFH`m?E BGKKKKKKKKMMLLMOQRcx?QLTJRLMZZ[[]]]]PRMO_t?QLPMMMMNNNNKKKKKKKK_o?M +HR +HPJLOPPQRRSSQVST^r?TRXHIQS\ ]#f$g%j&k(g)h'b$_!WUoy? +: ( +*  ```ddd```ddd```ddd```fffddd```ddd ```ddd```ddd```  Ye{ " .? H"S ] +_a`\\WX T!U\]WY\x?ZUX#`$a'c)e*e*e)d(c'a'a%`%`$_#^"^!]\~?!^Y%bW!_YZXXXYWXVVTUOQ\z?QMPWWVVUUTTPPPONNMM`q?IE PHOJJMNRSUTSRMOJL]r?NJMMLJIIJLM+u jXRJLDBVl?KAK +X$]LQRRSTTUSTTTJJZt?IDHUTRQQRTU[QNU \[YYZv?ZV#bX!`YZYZ]^^\XVTVRT`v?TMOMMMMMM +M +MJJJJJJJJ`o?NIR +HPJLLLLLLLLLNPKMbq?OKNMNNOPPQQQTY!\"\ ZVTdp?OJ S GO +IJJJJJJJJJNPKM`p?OJNNNNNNNNNJJIIHGGF_l?F BL BKFHMLKJJKLM +HMKM_n?J FKOOOOOOOORQQQSUWY_x?QKULSNP[[\\]\\\PRMO_t?QLPQPOONMLLKKKKKKKK_o?MISIRMOSSTUUVWWUZWY]u?XW]"O#P#W%Y%c&d'j'j"a$c&]'^ #OK<8di}```ddd ```ddd```ddd```fffddd```ddd```ddd```ddd``` + + _d`  ) +: QXbaa`!["\%Y&Z ` "b[]_{?]X["_#`&b(d*e*e)d(c.i.i.i-h+g*f)f)fX~?"`['e[%d^ `___^\[YYU WPR\|? SNQ"Z!Y YXWVUUTSSRQPOO_p?IF +RI PJJMNRSUTSRNPJL]r?OJMRPNMMNPR PTTVPOHH_u? "SFLNN CRQRSUUVTU!V!VLKZv?IEHVUSQQSUV!\ [UOORPJZx?]Z%e[#c]^VY] `!a^[YWZUW_w?WQSPPPPPPPPKKKKKKKK`p?NIS +HQKMMMMMMMMMMOIK_o?NILNNOOPQQRVWXYXWUTeq?PJ S HP +IKKKKKKKKKNPKM`p?OJNOOOOOOOOKJJIHHGG_l?F B M CLGINMLKKLMN +HNLN^n?K GLRRRRRRRRUTTUWY \ +]\w?OK UMUQS[[\[\[[ZPRMO_t?QLPTSRPNLJIKKKKKKKK_o?NJ TK TOQZZ[\\]^^] b_ab{?`^ +#e)U)U)[)[(e(e'f'f \ZGC, +&__i   ```ddd```ddd```ddd```fffddd```ddd```ddd```ddd```   nm[ +  ?I!c b"c!b%_%_)\*] %e +&f!`"ac?"a[!^ ]"_%a'c)d)d)d(c4o3n3n2m1l1l/k/kW?"_[(f\(f"a$c%e%e$d#c"`!_ \ \U WQS]}? SOR$[$["Z!YXWVUWWVUTSRQ_p?IGSJ PJJMNSTVUSRNPKM]s?OJNWURPPRUWNW ZVIEH QVl?MDHBB +?(ZQRSUUWUV"W"WML[w?JEIWUSQQSUWL!\(c!\Y #^ZN[y?]Z&f\$d]^RVZ^_^[XXZUX_y?XQSPPPPPPPPKKKKKKKK^q?OJSIQKMMMMMMMMMLNHJ\o?MHKNNOPPQRRYXWVUTSSeq?PK T HPJKKKKKKKKKNPKM`p?OJNOOOOOOOOKKJIIHGG^k?F B M C MHJPOMMMMOPIOMO]p?L +HMRRRRRRRRUUUVXZ ] _Zu?NJ UM WSU[Z \Z[ZYYPRMO_t?QLP WVSQNKIGKKKKKKKK`p?NJ +UK +UPR___`a b b b b %g "d +#eg?? +#e!c'i-W,V*]*](d(d&d&d!YS6,cad ```ddd```ddd```ddd```fffggg bbbggg bbbggg bbbggg bbb nck    + : E%e'g$u#t-b*_[ \[??%kk l l!m$g$g&^$\$T#S'g#c#c(h ,l +-m +0p4tY|?1q$d"b!a)i[#c%p'r(p#ke g)n3x &ha^^\t? $b)eW&g^X[%f *k&g a___^^]]\[i?VV +_X_PBX]e +"j mk f cR +OTY\o? +_ _ M[ZYY[!_%c +(fb^VRKOR"VIg? TNMU^Waadh!k !if`] +aZWX[j? +Z \ L!_S"gM] lQ've[$a )f*Z+[$K6]Ur?Y I'eZ +P +\ [ QTU YSON"T _SRX[o?WYNU&e> +] +IOTOPUUQSXU Lh}?QI +`XT MYTTTSR +Q +Q +Q \JK +[bo?W +[YUPPUWTQPXZZWSRUYcw?`UVI YO +J@"_B)g +IPSSG)_Q>Tn?YT\ L "e$h ODT X M`TRQ +DI6 +Dlu? +D; +G +HQ +PQSV[__\WTUOX `Um?OVV_^]\]^_a_^^^^^]]Us?$`V \ \!]LX *fQJZ +(d[SU"a +L +#cUi??N"dVVUUUUTTTIPVVRPW ][s?XXVW_F[-a!UU%\"\S[ /k'g +,l#f ca? +(n haop!a!a E@"ggg bbbggg bbbggg bbbggg bbbfff]]]^^^]]]^^^]]]^^^]]]^^^ aZb  # +(CH[]O"RS V\~?!acf$k%l(i(i(a&_&X%WYZ"^&b)e,h2n9u_??6r*f -i2n=y -i +1m``"e-p +3t-nXG#_["\#]]w? %^(`P&c%b$a#`#`$a&c'd\[YXVTRQdt? XRUO)d ++g ++gORY]`` `^PNQRVj?T YLUSRQRT W"Y_b$c %d#[TJEd??5i &^%] %d.m`"eY[]_^\VTUSUUVi?PQC;G'e GT'l T`[ +%m/m,jIT@I\z? 'cO)fX K OE!b_ ZYW!Z *`1g[TX ^]q?VXPOY +LUMVUOLQPI GKIBZm? FAQIOM WSRQPONMLKE +JS\j?P TLHILNMLOTNPPNJIKOWk?RKO +ETPM!_\ I +M +NU[[FI BMb|?LCW !`>>-m#1pF@#cAGO JHUE @OY?CU'aOQZ,lQQPOMLKKWR Z&a`t?U$_%`XWVUUVXYTTUVXYZZ[y? )eY#_&b.j 'c8tP$` +(dWQZ 'c +(dO CRR]v?KWNRRRQPPOOQOONPRSR^{? (d[W]2p +(f={/g0h.f+c)d*e)g(f(h2r .n*je?? -p'j#f$g +"e !SM1*  +]]]^^^]]]^^^]]]^^^]]]^^^fffiii   + + +ccciii   + + +ccciii   + + +ccciii   + + +cccjgp + + & 9 +>C!L#R 'Vf?? $[#_,h#c%e(e*g-d-d.b-a(\-a +/c+_%Y$X)] .bX}? +2f&Z(\+_ +2fRS/h,e$[OHO(^7m)\'Z +\ +-^`~? ++]-]O$Y *_ +.c *_!VT%Z +.c/d +.c ,a)^&[#X!V Uar? PLK =MR"WU VY![ _ !` a a"W U"WQTi?L%Y T +&X %W$V#U$U&W'X )Z+n $gZTQ#Y.`6hWu? +(ZQQX#_QSY["^$`$^"\WUTW&\ +$ZZo?MOEA ="WPV$_U +"cb)lHU +G$A{5k.d\? +-gN +)bZ "^/m&dQN +I HLQSR ] Z%b*gcw?X ]YST&cNR +!^UQ +NTTKH M PLbo?SRT C O +N P S R +QONLJJFO"X +T\m? +T%[MINPLHIP +$WP S!TRNMNQ`v?%V%W'YKSQOW +I[Z%j'lSISSIK[r?HG U!W.d#Y97IP B[ #a Z DELN=??!VEFAM +K J%Z"WQLJKMOIEJLRf?G T U$Z#Y!W V V!W"X#YSTU!W$Z&\ '] +(^]z? (bPOJN EWU#] &`WQV +'a.hPOM +)[Sm?QONQQPONMLL'^VPS&],c*a$[Mr?-d!VRR*_#X)^"[(a&_!Z%_1k +2m+fZ*f'd ]Ww?ZVWKH6 +/ iii   + + +ccciii   + + +ccciii   + + +ccciii   + + +cccfffUUUWWWUUUWWWUUUWWWUUUWWWTT\   + +*49:[q?>L+[MOV#Z&_(a*b*b$S-\ /^&ULL"Q%TRx?8g7f:i7f=l +0_:i P%U .[5b8e4a +,Z'U!NK MKNo?J$QFJO#S PJHO&V +/_ +/_ -] +[)Y(X&V&VZp?'V4a:g)V +.[(U'T$V#UTRRSUWLKK@AW?7IIKKKL M"O#P$Q _ +&e-g/i *^Q>4Ml? +Z )].b+e0j^ +&eQSU VUTPNKN#RKKc? +;GC+X.2KK +< +A#Z ![/i@ !]D&bUOMp? .dQ +*]IDF3GLSV 'c/k -l$cROUVQf? DQSPK,e +CIUJJ +AH IBB +JN LKW?HO +M; L IDKKIGECAA =N#UDI]?I%WGN OJBAGJIILNMIGGILb?? L&RGPTU0qX +P LG)mV"g A +(^6i([[p?J +E4++@,Y(YAA +Q +FJJ +DP=PAYc?43 AO/i+g $` +PNJFEFIK'Y$V%W +!S[o? +P,^+]%T$S"R P P P!Q"RNNOP R!S!S"TYt?)`"Y +(_ &] '^R+b/fJ +AV)`SN"YN $SA $S:U?F>CGGGFEDCCTS T'[0d3g0b,^Iu?Ct:jDt@p=m3`)V-h(c)b1j +5l1h.b0d4h?s8i +*[_{? P$S,[  UUUWWWUUUWWWUUUWWWUUUWWWfff???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggg gggggggggggggggggggggggggggggggggggg???IJOSTXfgk__]iigkhcrojje_je_lb`lb`nbdoceocgpdhZbyai?\fZd}???Xf?_r?q??j??l??j??l??k??k??i??i??V|?c??g??^??[??d??k??j??y??Ek?Rx?W}?Qw?Y?Z??q?????k??Uv?Vw?f??l??]??Jm?a??\~?Y~?Rw????Qv?]??W|?\~?\~?[}?\~?^??a??d??e??d??d??d??e??e??e??f??f?????C[?Ur?f??Wy?`??U~?T}?e??a??`??[|?\v?[u?_u?`v?cw?bv?au?Vj????Ka?[s?[s?Vr?Ws?Xw?[z?\}?^?`??`??a~?a~?a~?b?c??f??h??i??~??Hg?Sq?[y?Ur?Yv?Pm?_|?W|?X}?Y|?Z}?Z~?Y}?\|?[{?`?^}?`|?Vr????Ni?_z?_z?u??Wm?Rh?bx?Yo?Zp?k??Zo??S?g{?\p????k|?\m?iz?s??{??Sr?\w?j??Zp?^t?o??_q?ew?hz?_t?Uj?Rk?]v?\x?Uq?ez?_t?_t?[p????Nc?`u?g|?^s?`u?i~?_t?Zo?cx?^s?dy?aq?eu?cs?]m?`p?hx?hx?aq????Rb?br?iy?^n?p??m}?gw?j??i?h~?f|?dz?cy?bx?aw?Yo?f|?g}?Rh????Zp?m??aw?i??h??_z?Wr?^y?l??l??a|?\w?`{?c~?c~?_z?[v?[v?]x????Nb?Yr?g??Xx?h??f??j??e??l??]{?|??_u????ev?u??f??[z?[u?Ic????>Oznx???????y?eo?`j?bt?hz?_t?Ti?^w?\u?dw?i|????ER?q|?ju????T_?w????Xk?Vi?Sl?]v?`x?ay?bz?c{?e}?e}?f~?f~?^v?]u?[s?Ph????Ld?Zr?Tl?]??\??[??Y??Y??Y??\??\??`??`??`??_?a}?`| ?_{?^z?|??=T?H_?]t?ax?d{?Wn?f}?l??e|?cz?j??q??q??k??f}?_z?g??Sn?^y????Xs?Xs?_z?a}?a}?a}?a}?a}?a}?_~?`?M??X??f??l??i??c??`??^?????R??Er?`??`??Q{?U?Nx?^??V??i????????_??Pq?Xy?Zw?b?Zr?F^????AVuI\zTg?maek_ci]_h\^h^\ka_kf`mhbjgbjgbggeggefgkfgkfglfgl???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiiggggggggggggggggggggggggggggggggggggggggggggggggfffMMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRLMQ +  + QWg  +*= > +!M "N!Z Y`_#W-a+_RQ(\)]RFk?5iJz[s?2Jl&9W$B-Dkv??????????^k?-:] O +MVQ#XMJGJ_? @P +T A +"W:!6kKDDM URLIR$YO >DY?CK !VHPHEPOONNMMMMNK >>X?C"UNFMIAH &Y([OHMQQNJHIGY? +5E !ON%[$`#_U +4pI@v*X5c!3Y,R(^;N0Kz|??D8n@p=m .^Uw?*Z6f +,\1`/^,\*Z'X'X%X&Y&Z%Y!WUSQONPe?$Y(]2g(] +T @L +?,a1fF +?#X%Z AENJH +E !Z&_'k)m +.j4p +.j!](d9u5q"^]??=y5q +.j!]!]Q"^ M,GtPm?Li?%Dr#QP )Z3g5ipMJM+c%]V#[6n$Ay0hOj??$\V+cUVPWSTTUUVWW +'`UTVUo?T #\XK'`-fVN Y +&_!ZSX $] %^!ZUSTjx?$U +$Z)_ ^*h#aZG?K?=H6Qo"=[???z????2U?)YNq|?r}??????????hgu????????}??:W $A B8n(k?????????#/YC=F3f*`K3f2e0c/b1d 4g +8k:m:m@s@s0cOz?.a9l,_qFZ?Zn???????dx?"6iVj?w??DX?-`#7j]&h3H?%fj??S 'f HXZ!]$`*e.i 1l +2m2k+d%\&]+].`)W#Q^???i#Ie??{??Qk???????q????????4Hi'*  pfZ +  iiihhhiiihhhiiihhhiiihhhfffddd```ddd```ddd``` ddd```ddd``` + + + ?????????Zf?ETJ"P?Q5L~}?????7U?3m5oB?:x#c@?J2a @o6e/^*Jy]}????7W?E#R0_~??>^?,L{.]%G B/Kp{?????Yv?9h#R.d2h3n +f!` _)i4tGv? ;i!O-[0a0a0b%W%Y)]+d+d)b(a*e-h+oc)lZ`?.nSX +(ZK? +*V;Wc?v??x?? 1e0d+W)U78z#e>!@w???????????????????????????{??AXwqP?4f?Dv?CvN??k??0ck?? +>>```ddd```ddd```ddd```ddd```fffddd```ddd```ddd```ddd ```ddd``` &&&W`o?????????????????????n??Vu?,Kh-PpNq?0Tv8Zq??k??c}?Rl?5Or9\#=`4Nq??????i??(Beg??Ke?l??j?????x??>Sr1Fe5Ln;RtQh?o??b}?Zu?Ie?3O?9o *`#[#[d??&K?(_&] Z%_2n +1m$b#a `]`&h2v; *`G.b-K???Tp?Xs????H_?-Dm&H<.MCXwo????????????????????DJ`\^k???????????????Zg?????????,\4d?sAu 1l$_+iLo?????????p??????????????????????????F]|?VuJa??????????r??A8Ns "G$M2[s??(>g3^9Ny????????????s????????>Nhjz?y??n~?Vf?fv???????????????????|??????????????????????????????????????Yn?Pe?w??????????????????????????r|?E\n0GY=[sQo???????HLXKO[????????????????????????f{? +:/!8X}??x?????????????????m??Nb{fz??????????s??=Qj*>W(U&Hup?????????????????Cp?Dq?7m?!W?>>??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ??????????????????????????????WWW eee + + +ddd```ddd```ddd```ddd```ddd```fffddd```ddd```ddd``` ddd```ddd```ddd SSS MMM?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????UUUVVVddd```ddd```ddd```ddd```ddd```fff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffff ffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffeeeoooddd]]]??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????WWWTTTtttffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffffffffffffffffffffffffffffffffffff???KKKdddnnnYYYccceeeiiiffffffffffffffffffffffffYYYiiibbbNNN???MMM^^^nnnffffffffffffffff fffffffffffffffffffffffffffffffffffNNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ  + + + + + +???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????GGG### + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ NNN + + + + + + QQQ fffeeeYYYeeeYYYeeeYYYeeeYYYeeeYYYeeeYYY + + +___...???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????000]]]YYYeeeYYYeee YYYeeeYYYeeeYYYeeeYYYfffppp iii ppp iii ppp iii ppp iii ppp  iii ppp iii ttt TTT?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ddd iii  ppp iii ppp iii ppp iii ppp iii ppp iii fff```aaa```aaa```aaa ```aaa```aaa```aaa  YYY + + +MMM?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????III + + + zzzaaa```aaa```aaa```aaa```aaa```aaafffiii  iiiiii  iiiiii   iiiiii  iiiiii  iiiiii  iii^^^ BBB??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????www NNN iiiiii  iiiiii  iiiiii  iiiiii  iiiiii  iiifffhhhddd hhhdddhhhdddhhhdddhhhdddhhhddd + + + + + +bbb + + + + + +===?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????ZZZ""" ppp dddhhhdddhhh dddhhhdddhhhdddhhhdddffflll + + +iiilll + + +iiilll + + +iiilll + + +iiilll + + +iiilll + + +iii + + + + + +ggg  + + + + + +MMM???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????VZ] ZZZ + + +iiilll + + +iiilll + + +iiilll + + +iiilll + + +iiilll + + +iiifffddd```ddd```ddd```ddd```ddd```ddd```dddzzz??????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ddd```ddd```ddd```ddd``` ddd```ddd```fffddd```ddd```ddd```ddd```ddd```ddd``` ddd???===??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????%%% + + +CCC ddd```ddd```ddd```ddd```ddd```ddd```fffddd```ddd``` ddd```ddd```ddd```ddd```dddddd""" ooo?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????xxx + + +\\\ + + +ddd```ddd```ddd```ddd```ddd```ddd```fffddd```ddd``` ddd```ddd```ddd```ddd```ddd + + +qqq  VVV?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????aaa??? + + +ddd```ddd```ddd```ddd```ddd```ddd```fffddd```ddd``` ddd```ddd```ddd```ddd```ddd eee BBB????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? $$$rrrddd```ddd```ddd```ddd```ddd```ddd```fffddd ```ddd```ddd```ddd```ddd```ddd```dddyyy + + + ///???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????_cf rrrddd```ddd```ddd```ddd```ddd``` ddd```fffddd```ddd```ddd```ddd```ddd```ddd```ddd mmm + + +  jjj??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????MQT   iiiddd```ddd```ddd```ddd ```ddd```ddd```fffddd```ddd```ddd```ddd```ddd```ddd ```dddccc  QQQ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????korcgj  + + fff ddd```ddd```ddd```ddd```ddd```ddd```fffggg bbbggg  bbbggg bbbggg bbbggg bbbggg bbbggg bbbUUU MMM???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????IIIggg bbbggg bbbggg bbbggg bbbggg bbbggg bbbggg bbb fff]]]^^^]]]^^^]]]^^^]]]^^^]]]^^^]]]^^^]]]^^^vvv + + + ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????FFF + + + + + +]]]^^^]]]^^^]]]^^^]]]^^^]]] ^^^]]]^^^]]]^^^fffiii   + + +ccciii   + + +ccciii   + + +ccciii   + + +ccciii   + + +ccciii   + + +ccciii   + + +cccggg 444????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????iii   + + +ccciii   + + +ccciii   + + +ccciii   + + +ccciii   + + +ccciii   + + +ccciii   + + +cccfffUUUWWWUUUWWWUUUWWWUUUWWWUUUWWWUUUWWWUUUWWWiiiTTT????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????WWWUUUWWWUUUWWWUUUWWWUUUWWWUUUWWW UUUWWWUUUWWWfff???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhh ooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiiggggggggggggggggggggggggggggggggggggggggggggggggfffNNNrrrhhhQQQpppvvvjjjwww\\\QQQeeeuuupppggghhhPPP??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????ppp???___JJJvvvuuuYYYjjjkkkuuu]]]KKKdddrrrfffeee???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\ \ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiigggggggggggggggggggggggggggggggggggggggggggggggg???JJJTTTggg___iiihhhooogggggggggggggggggggggggg\\\ccc___ZZZ???SSSZZZiiiggggggggggggggggggggggggggggggggggggggggggggggggfffMMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRaaa  + + +  + + +???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????  MMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRMMM + + +RRRfffqqq cccqqq cccqqq cccqqq cccqqq cccqqq cccqqq ccc???   + + + &&&```777?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????DDD```qqq cccqqq cccqqq cccqqq cccqqq ccc qqq cccqqq cccfffiiihhhiiihhhiiihhhiiihhhiiihhhiiihhh iiihhh]]]  jjj  \`c?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????aehwww  + + +iiihhhiiihhhiiihhhiiihhhiiihhhiiihhhiiihhhfffddd```ddd ```ddd```ddd```ddd```ddd```ddd```ddd``` [[[????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????????????????????????????????????OOO```ddd```ddd```ddd```ddd```ddd```ddd```ddd``` fffddd```ddd```ddd```ddd```ddd```ddd```ddd```ddd```11 1????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + + +```ddd```ddd```ddd```ddd```ddd```ddd```ddd```fffddd``` ddd```ddd```ddd```ddd```ddd```ddd```ddd```!!!??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????  ```ddd```ddd```ddd```ddd```ddd```ddd```ddd ```fffddd```ddd```ddd```ddd```ddd```ddd```ddd```ddd ```$$$fff???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????[[[  ```ddd```ddd```ddd```ddd```ddd``` ddd```ddd```fffddd```ddd```ddd```ddd```ddd```ddd``` ddd```ddd```JHM[Y^???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????7;>___ ```ddd```ddd```ddd```dd d```ddd```ddd```ddd```fffddd```ddd```ddd```ddd```ddd ```ddd```ddd```ddd``` jhm *).?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????6:=!UUU + + +```ddd```ddd ```ddd```ddd```ddd```ddd```ddd```fffddd```ddd```ddd``` ddd```ddd```ddd```ddd```ddd```  usx*).  bgj????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????"&) + + +lll```ddd```ddd```ddd```ddd```ddd```ddd```ddd```fffddd ```ddd```ddd```ddd```ddd```ddd```ddd```ddd``` hfk #! &.0???????????????? ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????LPS + +uuu + + +```ddd```ddd```ddd```ddd```ddd```ddd```ddd```fffddd ```ddd```ddd```ddd```ddd```ddd```ddd```ddd```ddd + + +JJJ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????MMM ddd```ddd```ddd```ddd```ddd```ddd```ddd ```ddd```fffddd```ddd```ddd```ddd```ddd```ddd```ddd``` ddd```ddd + + +!,(??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? + + + +ddd```ddd```ddd```ddd```ddd```ddd```ddd```ddd``` fffddd```ddd```ddd```ddd```ddd```ddd```ddd```ddd```ddd   +KTQR[X???????????????????????????????????????????????????????????????????????????????????????????????????????????????u~{PYV$! +ddd```ddd```ddd```ddd```ddd```ddd```ddd```ddd``` fffddd```ddd```ddd```ddd```ddd```ddd```ddd```ddd```ddd   + + +lrp! +???????????????????????????????????????????????????????????????????????????????????????????????????8><`fd ddd```ddd```ddd```ddd```ddd```ddd```ddd``` ddd```fffddd```ddd```ddd```ddd```ddd```ddd```ddd``` ddd```ddd + + + + + +lpo (,+?????????????????????????????????????????????????????????????????????????????????HLK iml + ddd```ddd```ddd```ddd```ddd```ddd```ddd```ddd``` fffddd```ddd```ddd```ddd```ddd```ddd```ddd```ddd```ddd   gggRRR?????????????????????????????????????????????????????????RRR + + + + + +eee ddd```ddd```ddd```ddd```ddd```ddd```ddd ```ddd```fffddd```ddd```ddd```ddd```ddd```ddd```ddd ```ddd```ddd + + + + + + + igh  +JNQ???????????????????????????????????????7;>xvwddd```ddd```ddd```ddd```ddd```ddd```ddd``` ddd```fffddd```ddd```ddd```ddd```ddd```ddd```ddd```ddd ```ddd + ][\ +  269?????????????????????!$ # + YWXddd```ddd```ddd```ddd```ddd```ddd```ddd``` ddd```ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcccfffgggfffcccdddhhhlll???iiigggfffiii\\\lllcccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff \ No newline at end of file