From 76a479f668b59b48720f5e3b5fc3065a1533e30c Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Sat, 19 Apr 2008 11:09:59 +0000 Subject: [PATCH] Support for getting embedded sounds from slide show git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@649796 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/hslf/record/RecordTypes.java | 5 +- .../src/org/apache/poi/hslf/record/Sound.java | 136 ++++++++++++++++++ .../poi/hslf/record/SoundCollection.java | 73 ++++++++++ .../org/apache/poi/hslf/record/SoundData.java | 103 +++++++++++++ .../apache/poi/hslf/usermodel/SlideShow.java | 8 ++ .../apache/poi/hslf/usermodel/SoundData.java | 93 ++++++++++++ .../org/apache/poi/hslf/data/ringin.wav | Bin 0 -> 10026 bytes .../org/apache/poi/hslf/data/sound.ppt | Bin 0 -> 43520 bytes .../org/apache/poi/hslf/record/TestSound.java | 86 +++++++++++ .../poi/hslf/usermodel/TestSoundData.java | 63 ++++++++ 10 files changed, 565 insertions(+), 2 deletions(-) create mode 100755 src/scratchpad/src/org/apache/poi/hslf/record/Sound.java create mode 100755 src/scratchpad/src/org/apache/poi/hslf/record/SoundCollection.java create mode 100755 src/scratchpad/src/org/apache/poi/hslf/record/SoundData.java create mode 100755 src/scratchpad/src/org/apache/poi/hslf/usermodel/SoundData.java create mode 100755 src/scratchpad/testcases/org/apache/poi/hslf/data/ringin.wav create mode 100755 src/scratchpad/testcases/org/apache/poi/hslf/data/sound.ppt create mode 100755 src/scratchpad/testcases/org/apache/poi/hslf/record/TestSound.java create mode 100755 src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestSoundData.java diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java b/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java index a1bc49945..45038f7a2 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java @@ -70,9 +70,10 @@ public class RecordTypes { public static final Type List = new Type(2000,null); public static final Type FontCollection = new Type(2005,FontCollection.class); public static final Type BookmarkCollection = new Type(2019,null); + public static final Type SoundCollection = new Type(2020,SoundCollection.class); public static final Type SoundCollAtom = new Type(2021,null); - public static final Type Sound = new Type(2022,null); - public static final Type SoundData = new Type(2023,null); + public static final Type Sound = new Type(2022,Sound.class); + public static final Type SoundData = new Type(2023,SoundData.class); public static final Type BookmarkSeedAtom = new Type(2025,null); public static final Type ColorSchemeAtom = new Type(2032,ColorSchemeAtom.class); public static final Type ExObjRefAtom = new Type(3009,null); diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/Sound.java b/src/scratchpad/src/org/apache/poi/hslf/record/Sound.java new file mode 100755 index 000000000..211a9b0ee --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/record/Sound.java @@ -0,0 +1,136 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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.apache.poi.hslf.record; + +import org.apache.poi.util.POILogger; + +import java.io.OutputStream; +import java.io.IOException; + +/** + * A container holding information about a sound. It contains: + *

+ *

  • 1. CString (4026), Instance 0: Name of sound (e.g. "crash") + *
  • 2. CString (4026), Instance 1: Type of sound (e.g. ".wav") + *
  • 3. CString (4026), Instance 2: Reference id of sound in sound collection + *
  • 4. CString (4026), Instance 3, optional: Built-in id of sound, for sounds we ship. This is the id that?s in the reg file. + *
  • 5. SoundData (2023), optional + *

    + * + * @author Yegor Kozlov + */ +public class Sound extends RecordContainer { + /** + * Record header data. + */ + private byte[] _header; + + // Links to our more interesting children + private CString _name; + private CString _type; + private SoundData _data; + + + /** + * Set things up, and find our more interesting children + * + * @param source the source data as a byte array. + * @param start the start offset into the byte array. + * @param len the length of the slice in the byte array. + */ + protected Sound(byte[] source, int start, int len) { + // Grab the header + _header = new byte[8]; + System.arraycopy(source,start,_header,0,8); + + // Find our children + _children = Record.findChildRecords(source,start+8,len-8); + findInterestingChildren(); + } + + private void findInterestingChildren() { + // First child should be the ExHyperlinkAtom + if(_children[0] instanceof CString) { + _name = (CString)_children[0]; + } else { + logger.log(POILogger.ERROR, "First child record wasn't a CString, was of type " + _children[0].getRecordType()); + } + + // Second child should be the ExOleObjAtom + if (_children[1] instanceof CString) { + _type = (CString)_children[1]; + } else { + logger.log(POILogger.ERROR, "Second child record wasn't a CString, was of type " + _children[1].getRecordType()); + } + + for (int i = 2; i < _children.length; i++) { + if(_children[i] instanceof SoundData){ + _data = (SoundData)_children[i]; + break; + } + } + + } + + /** + * Returns the type (held as a little endian in bytes 3 and 4) + * that this class handles. + * + * @return the record type. + */ + public long getRecordType() { + return RecordTypes.Sound.typeID; + } + + /** + * Have the contents printer out into an OutputStream, used when + * writing a file back out to disk. + * + * @param out the output stream. + * @throws java.io.IOException if there was an error writing to the stream. + */ + public void writeOut(OutputStream out) throws IOException { + writeOut(_header[0],_header[1],getRecordType(),_children,out); + } + + /** + * Name of the sound (e.g. "crash") + * + * @return name of the sound + */ + public String getSoundName(){ + return _name.getText(); + } + + /** + * Type of the sound (e.g. ".wav") + * + * @return type of the sound + */ + public String getSoundType(){ + return _type.getText(); + } + + /** + * The sound data + * + * @return the sound data. + */ + public byte[] getSoundData(){ + return _data == null ? null : _data.getData(); + } +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/SoundCollection.java b/src/scratchpad/src/org/apache/poi/hslf/record/SoundCollection.java new file mode 100755 index 000000000..c244859ea --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/record/SoundCollection.java @@ -0,0 +1,73 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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.apache.poi.hslf.record; + +import org.apache.poi.util.POILogger; + +import java.io.OutputStream; +import java.io.IOException; + +/** + * Is a container for all sound related atoms and containers. It contains: + *
  • 1. SoundCollAtom (2021) + *
  • 2. Sound (2022), for each sound, if any + * + * @author Yegor Kozlov + */ +public class SoundCollection extends RecordContainer { + /** + * Record header data. + */ + private byte[] _header; + + /** + * Set things up, and find our more interesting children + * + * @param source the source data as a byte array. + * @param start the start offset into the byte array. + * @param len the length of the slice in the byte array. + */ + protected SoundCollection(byte[] source, int start, int len) { + // Grab the header + _header = new byte[8]; + System.arraycopy(source,start,_header,0,8); + + // Find our children + _children = Record.findChildRecords(source,start+8,len-8); + } + + /** + * Returns the type (held as a little endian in bytes 3 and 4) + * that this class handles. + * + * @return the record type. + */ + public long getRecordType() { + return RecordTypes.SoundCollection.typeID; + } + + /** + * Have the contents printer out into an OutputStream, used when + * writing a file back out to disk. + * + * @param out the output stream. + * @throws java.io.IOException if there was an error writing to the stream. + */ + public void writeOut(OutputStream out) throws IOException { + writeOut(_header[0],_header[1],getRecordType(),_children,out); + } +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/SoundData.java b/src/scratchpad/src/org/apache/poi/hslf/record/SoundData.java new file mode 100755 index 000000000..42be48f2a --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/record/SoundData.java @@ -0,0 +1,103 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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.apache.poi.hslf.record; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.zip.InflaterInputStream; + +import org.apache.poi.util.LittleEndian; + +/** + * Storage for embedded sounds. + * + * @author Yegor Kozlov + */ +public class SoundData extends RecordAtom { + + /** + * Record header. + */ + private byte[] _header; + + /** + * Record data. + */ + private byte[] _data; + + /** + * Constructs a new empty sound container. + */ + protected SoundData() { + _header = new byte[8]; + _data = new byte[0]; + + LittleEndian.putShort(_header, 2, (short)getRecordType()); + LittleEndian.putInt(_header, 4, _data.length); + } + + /** + * Constructs the link related atom record from its + * source data. + * + * @param source the source data as a byte array. + * @param start the start offset into the byte array. + * @param len the length of the slice in the byte array. + */ + protected SoundData(byte[] source, int start, int len) { + // Get the header. + _header = new byte[8]; + System.arraycopy(source,start,_header,0,8); + + // Get the record data. + _data = new byte[len-8]; + System.arraycopy(source,start+8,_data,0,len-8); + } + + /** + * Returns the sound data. + * + * @return the sound data + */ + public byte[] getData() { + return _data; + } + + /** + * Gets the record type. + * + * @return the record type. + */ + public long getRecordType() { + return RecordTypes.SoundData.typeID; + } + + /** + * Write the contents of the record back, so it can be written + * to disk. + * + * @param out the output stream to write to. + * @throws java.io.IOException if an error occurs. + */ + public void writeOut(OutputStream out) throws IOException { + out.write(_header); + out.write(_data); + } +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java index 418dc3d2f..828255087 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java @@ -494,6 +494,14 @@ public class SlideShow public ObjectData[] getEmbeddedObjects() { return _hslfSlideShow.getEmbeddedObjects(); } + + /** + * Returns the data of all the embedded sounds in the SlideShow + */ + public SoundData[] getSoundData() { + return SoundData.find(_documentRecord); + } + /** * Return the current page size */ diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SoundData.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/SoundData.java new file mode 100755 index 000000000..ad7922ef6 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/SoundData.java @@ -0,0 +1,93 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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.apache.poi.hslf.usermodel; + +import org.apache.poi.hslf.record.*; + +import java.util.ArrayList; + +/** + * A class that represents sound data embedded in a slide show. + * + * @author Yegor Kozlov + */ +public class SoundData { + /** + * The record that contains the object data. + */ + private Sound _container; + + /** + * Creates the object data wrapping the record that contains the sound data. + * + * @param container the record that contains the sound data. + */ + public SoundData(Sound container) { + this._container = container; + } + + /** + * Name of the sound (e.g. "crash") + * + * @return name of the sound + */ + public String getSoundName(){ + return _container.getSoundName(); + } + + /** + * Type of the sound (e.g. ".wav") + * + * @return type of the sound + */ + public String getSoundType(){ + return _container.getSoundType(); + } + + /** + * Gets an input stream which returns the binary of the sound data. + * + * @return the input stream which will contain the binary of the sound data. + */ + public byte[] getData() { + return _container.getSoundData(); + } + + /** + * Find all sound records in the supplied Document records + * + * @param document the document to find in + * @return the array with the sound data + */ + public static SoundData[] find(Document document){ + ArrayList lst = new ArrayList(); + Record[] ch = document.getChildRecords(); + for (int i = 0; i < ch.length; i++) { + if(ch[i].getRecordType() == RecordTypes.SoundCollection.typeID){ + RecordContainer col = (RecordContainer)ch[i]; + Record[] sr = col.getChildRecords(); + for (int j = 0; j < sr.length; j++) { + if(sr[j] instanceof Sound){ + lst.add(new SoundData((Sound)sr[j])); + } + } + } + + } + return (SoundData[])lst.toArray(new SoundData[lst.size()]); + } +} diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/data/ringin.wav b/src/scratchpad/testcases/org/apache/poi/hslf/data/ringin.wav new file mode 100755 index 0000000000000000000000000000000000000000..f8d4292d0fb411872b8676e3ed8fd1938e03d40e GIT binary patch literal 10026 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 L|42+7neY4`JMe+U literal 0 HcmV?d00001 diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/data/sound.ppt b/src/scratchpad/testcases/org/apache/poi/hslf/data/sound.ppt new file mode 100755 index 0000000000000000000000000000000000000000..2d1316acf38e23b0d278271084f8fb5df5e2e445 GIT binary patch literal 43520 zcmeIb37lL-wLg9*Gh~6l1Ok`{kBqng$`Tk5ctSS95+PxdIGJ%4d$AXLv2S;7_sv~$ z_uPf<+x9{)^kVmnvpAEyEQBbFfh2}am?tPA=mP_yf{2m;LPA3Nf2t>g0r3g%|M~xa zzRz!J^1W5JmQ&}Psyer-`rgWuPn`Nf|DB(H5&Mu^fHh)AYcsH^$Hg~57@_WFVb~N1 zp!=h>T5UWM!yq{6{ugQBJ>c~V$J($7{1X7E&8GoY0cHSB1e^qz2{;*W3ZNMPT>v{3 za2jAX;B>$lfHMJ~0?Yx-1$-KC7T|2azX8qx%mcIlJ_9%x@L9m;0G|h-{)BKogf9Sm z5%49zg@B6y7XvN<%m-WwxD3z=xEyc=;LCt30apR82K+nVD}ZYN*8&y*76KLl76X<5 zt^+IuTo1Sba3kO*z%syB0XG9~0W1fs0Ne^_1FQrfURNLUA^5+_t-^5l3qxC6j|ISA zi_sv-$9HE!kC_m-5sJ- z?3++;1Zs9-#CYT>S!M+VC zNGt!?oqw!;G%LXb{OINL?yEfi{pyi*S7dD`Tvl6r=^XKz=2?qw8NBE1U;fPXom)}8dm zd%ya^_g}WYarmX1KYMjMz4H1imR-wlS$O?xW5OBIV|S$f8ouzp7aDhzPkyxNYHaTU z5j*$S4bR-VBl!G}c&onQdn<;^mGky0H{Uqto~DCysHUblO%LsubG>>R0-YEPV6G z{fGX#eCjDb+&A;JvoD-kn_HNBw08LM-DCgx(C&vGzvQvKdp_5=R!k(GIIrcslcKd3 zw>P$k!GC|@mw!CvCy!72)OUaQ)`@MiZ+~X$yFI7BmRKk(XualsL6N?jonilrrSFAZ z^A^3^tcb>#WyL9LzMgFS^rt`F_FL}p+(k#ux-wv5zn}iQrWvyqb^crMO^5#Kd#!(3 z@$5Z^FSzZdO_$EU>}KrGhfdh>(n)(?f88Q^UYOlD?Y!AfzFZSOv;R}CT$Q|zZ=HVI zPeN}5@4P@7J3+&){Du9_cJ?oW7VeTC{pGdBKYVKU*?Z!zf&T2$w0Ba&zu&j;xf9*4 zgO40M`m-5R&pGw$QyZ4~rrz)cQmgIS)$rNmsgJr`2M_(}vwMGZ(g?)uu?b6_Z{g-XK?7b{jIBV|Q8DDLj zCLWx>>ZaOtKRmk$n=<{v1BVW&otK`vX6oX_pP9PGYJc~wch6}&>7{0E*TTxBM-IQ8 zdGVRVr)KV2u*-Vzy+2>Ew>l4>JLf9LoNpZ2ZhQ6zhp*oI^hxXXfF|cmIs2NP-4`CJ zeyVHEXAYm4Ig`Kc(yz)*(_4bmkJJw3N{6mIYwy-~-kJ04oLcKOKUx=C+-*@_eBzlK zcTcz34?fZ~lW*H`>7|z*Iofc`dp+mQJaf-QGk^Qof6e_4UKrc`Q%>9S@P76b;enmsv>ts&dhwa>yJyxGK4+y4yfU}(sn_3`S$p6b+rhv7 z^@6>-w%#gw#W^?C-aVLk@p0WfbLQ*cx$M!$qL=QU{`mZz+{a9KUkj&LZv{49>mRK4p5#w#IKfaCFc9H-2^2)QkUe$;=CPuRl8bj=%io z0qQ?@&)9+Wth{VH_SC$y8e7l%()=dAb^ZExlox;VXLb=+o%5G{>mRjx2WDJ;;vKV( z3Jo_jJlG%{Jz{(Hu`8aD&wOa?riU&)@A9+cry3Vw(!cFL@=$fxJGkIHGk;|7{`cN% z-lp%nruNg8-6wqY;G$Dz-L-A|{B1}7U_JQed*|)_uPbYF&)j;|-u*AXY?*rP@>8Z> zdmY{Po@LG*4+!>yZyug^)hRo7?)=RX?$BA@1Hz7`=`Jt~&o&5G(O)>{E49&^-h6Z6 z)Xy|nmo$Fy{&)6&YJSK3OM!TUQkikb14l32*6{d|d6wFg*?+c7J>lrSnb8xUoB1%= zHS_1&<=qz^j=%Ww>sQX)#n+C;GY74Ig<0{eMb>G*xQOrg#w$;J>Hc?q@kH%pV%J+XS#ujgP5O<$T(dmBG;cJpBC;!y6@&%gHOD}Q-r?v?Y7xK<`z z&KF*EG`ViP!Fo>Z@%?Abxuz!Fx%TyjZC^h9gonR!_!8?YSntC}sxR*SQ+{T3*U|e= zIQciVq1lPUUp*k)O&vZ|dpFnfGV$yeKM$5;$zxmly8d+1Ea8s(|NQ5*jjguCo9phF zd(JgL_Rup6wOjYqE?s}PVdl|=wLPC7d;IQ2j~sEzgUqa{xp|jV7JT#IyXt|9AHD9) zm!Ej~wV&So+>hTl^y=joopHfCKYi#^_|wau`>psJ)P=sVV@c!bLf@C4hxl8YH~#UY z|N8FEhacU4M z{VzWL`uA@-c^36htL?`du3W@?e%4m$*C$;(4Vz-L#a?;h)yCJ~e)W|%55Io(3Fb=) zVJ_eB{1cDtoq6%RbFMu!bL{i}nda^b-~HXu+1eBPYWFv3KmTTO&y#OsQN8bHM`qu< z0-N3&iCBl)bg9rX}%D?qW$v>ZWv~~T_sb4%@`fFp`;lFlU_RL7f73IaZH$O7- ziG4@D^4OlwPTzP!ji3GYk(2*=0dslndJ@)cr#^N5d%_>zetDn!FGrsH-sX#v_xy4C zwjVZlf8UsMyDxsPDW~n5^P30W9SiP%@@Zk+IYw_Lfv^}WOK%RhIa_=fE9czSNiN!L6Y{mm&$e|T1lIOow<&bn;LOK1M#hmBX< z|4?7&EaU1W*Iie*bHuH#S#sekr+~h0n7??*zF8N&d&hw*?tbzYm)ZVw)|94MFD-iK zJJ80r*~ErLVgvTj%}?LgJgemh%)qc^*RNQ*Wr9O? zA30R+YooIXY!-neh!p(HFmjIc- zjW#1WQFsbA7YZ%H2Aa{z3)Z*qq1}RWTQJN4J_hCMJ_=)trl2b-Rja*@g7sBct%mkQ z>Iwh_wluVis{+D{ri_%vTu3s;P)vFC7VK3&sx{McN9iX!{SPR@E*3kaQ%hSFHrB^Mx;f8a;?^wL% zde^tZEzrO~y#YHFS|6bSn~phbVcUDK{9@-j#12ijuEVj@zGNYynF zo!Zu)^xw#Y%1=iX?*cNqafs2D_ZIL(#-CJ7v0Jn=d*TUZv6C9UFH>B#G!`yz=VTWl z_===&h*V-7KBqox4%)7X*wXiB%+4O%w=EOSTY@HG5NehkWmk(9?e4xlXOFXY+vfN{ zXE#IlMdLOSH0jzHm6K$G;^dXlymS}ccPzrALLLaUFr{JNpN$OY!c$y++#F777nX#fnAFShNUTHv8Sn zh+E7bXZu|@c3X!A(*4UVlC_jk(vb{pi!PJyH*=)w>rPYmKInHuBEkO0RUvzGC>z;$ zPu}AcyNOMDCV?wbpfgeucRmvNV>L~IPL%S=&B^*Q|^dT855uHCVk z-7{QPy6k~;!7PUZ$zVj~Fd?TQ!g7VPvYvQNp$w169aS4v3t5xCVGPj1ZypdoXqq8bTyt1?+-=wy%z z5DGV(@GC1V8FMJj`<5$)a<4&~K1ogHnZaZr8HBPo(Qvp(t;e=?h6D?);8FpC=wZ$vBwGl{OO z8p!avp{IK})iTs4=K`UyzC|e}Rwz=aEGZOeS~;yFl_p{?k2BoQq?5}ce6TN_VuMLn zYzQxwm@F?-%somb-5%$twBAPqv@RtR%yNOSL+Ig#ysEI0qLq9y?;w-CW|7QloIuC% z#5Tf=bx@L-jpceBW^b%NqBCI}Py4w+7jJY$I6bBpEjG=~7Lo(Hk=5ve(~}LDBXKiKdOSnAHeh!Ngpn`FF2QE6^0BxO zv=AO*qsgT@J2|eD8K757F8bb5ChqsU<0*B!;y1dSYGNo?W^N=M#I}?Y>FKeg3(6Lz zQ|t;RGDR`&T_zCHu2f95Maa^o*l1)KA5uoD6(3EtrxVg>l%zZnf4Yq4d^htUwJ)Pt zJkGX!n(d2te7H!Lvc5#HO^RswOu9QF+Ka<_p7MHvajJiFI40r=HD82w@v}X}lCO~W z`+FF@ys=kjTFsI%s0KSdS!VOlGKH|lrFewfBo)M~1U++iI(p0MoN~`yPTuY-n1dl- zrbjbwiV)I>nOS*LJh=7YFxTEDC3nXCv1O5=a88V9d^yl-b{qF_F-Lotxu?u07pzIL zqj`>ZNf_jYt!hh+Y+H0nK1hR9*p&9QIYSBDUp$`6=Y|ouc$5c zIz4-mY^)6z;w3!GIyZA#+v(Eye(|#0*gVVJ;*jeJNsjpAj4M zxH=+z(YuVBB{#V}lMUgby+7?JvGkBCdqT;`UF8mOjcu?pD0qUmWCtQc!Coa2rD(&F zEm~9V?u0oK zLrS$>P%Xn*p6iSR;`iV(xlm7l!DYJek}F}hn^7SV5bVt6NLssrQR1WVM7N_57#y}M zG@TLil&=_0l^q-rFUHMIyB4gDco>h*R0jxLYflX`CJ_|HLDCoNiVZMPuagqD>ZExS zQx?mV-|w#|Ql_0uky(Za*b6+LUE$Hma)J$5GE!o556*bG+g89uQx$i=t18QYTn zoSC|@t5>{N%J}E&VrA_IPrU%_G(XP7Es< zk1LLEEL}%=?N!5cxAQk<@3vGzT{$Jgc@nnrmep~ub8BUrXw^Fk_Xh|4Z6-CGCQF_2 zU~i7-N=M3Kx3ZMk8XDo+ct^3w_T5Zmx~sA;8OZ7WY8y4|+ho|8o^(dPr^{t5E9HcY zRS9}G*|~COIUb62MipkKo6we}iph;$#nZWsP=C-R$GmB#K!i3~J>o4&B2l#m*W9v+ zOK$F@Ja|RhEZNFE#Au*gh~}MfZ}&F6bbnBE2der5$qs#?Z+m=H_XKZF$ktJ3AlF4X zZH9kidR263@21R-l+$yqHYh$!S)$ftQZIW8IcvYiQk6I6!qin{fqg_>9a>76iQ#UZ zx}hTCeMD3y%q5g*-&w%r^Fw})oj2X+g=v##1 zrn|dI=aS)~R&~>1uH3EaU0c$GvJ&UBdm?h+>Y-9*G?841%b{(Ba3?L;%?ul3R(9Ybmr2=4HjpVQg2?!lxL?Z)*+kIE#^alZg8|Bu7)gsH(aYs% zIfau^8mD4(qCXJeJxpIoVTg`UMNj4ZE?}Eg3b{PgrqDO!S95 z(NHMOc-g3-XT9ADqYY^;Zzv@7D_$87<>IUy6T}kl)M;*@qOvlW@QRd#DQYUJ$3pIu zPMCba$Vg$*))P-e3>+ToVj@GjVj|ceKW#{Ig7-#~QYGpR3xZNIeTGitbF`!jR7~h$ z#Xz*M?a6+UvIw!{)~?=|xBmxf;06a>cv2yRo0J`c zl`s<^@8Y@C8hI!c>-Adwdy;~5NxPcas7jqT6~x#`w~wXMjP7b5j>ksZyGeD&;Gp*k zHl#i%*I4sQ!r{Hv>pOqSJxr2)I?UOil? zrd;l}*fwPpzdGbkR0Y-|YEDz?O+@8EDqxRP6Pt6ZeXMr(UStxkG1hcq0>R>o$G%=`o_!aoJST%3+y3Cl=@A75bax%cv z2`vy?)sdm|{eI`_NYuDbuxY(~#f+1x>>p(8eXP;PDBh5w+#RNe_zv9@38s>z{3^!q^~ZyBC@$*8%|SIV5O=vdX))Kg z#!q(@`gPUAk;XvABc4DwQchNx&N!)Tp(7j#Q+0W@5n^{Jk${yJhmxJL%Q*~&(;LDEQtcjI>5q0$ zLO443K)_S9<$fR~$S!&C0miAVG477%T%Gd39@PXRBSuFxp^FlY`xsnYA(s+)AL)1YGr?3hlU7qMGVH%A#Uxj` z63HzwJ=~T}8{27IrV6T|cBWz87wDy^O4{TX1bJdh)EDezm}sF#lDe~EKnfZXSZPAC zjtr9btDalULg)hij7}>(&UN#63yD-N)dv$B5<2b{g*SY(pt;uBdVjyV8`^8eBgC&DGH7Sxg51;CdXOt2{d0b^BGtx_hooO?#dUcz>=+;u9 zScC~$Q;aa;_ESB2td#M9J*;r?Qb@!(-CvYK17t*ZOKPSX)IBS+a%!05Jh(~rXFR!3 zFiA!gy&Q^)s}j1gNtQg07*!qdnS{;cvr#VNq~qO2f-WmC-!<^)RzjiMVV0C<(>7!gZYtZ$BCDC9!uz}GRsc_xAM@?!a zXISe<#=?0H)_pO%I2bC#EWBUK8bf{@CVOSEB#68>Px2$dSjr=Xm6R|-yJH=EMJe%g zq&F)v8*$e3D2$vU`$T)v7J(F*rhzK6mBKZLEUIa5itkDJ0!2QflH4jS5#FMBRVS~T zeL+)c&j{g)WXhD$qh@`>alc}xMSUbJiOV#Vu5x0;8*}n`cOm6Byp$|$;>Fl% zYBPi4u-`CU8o{WMJ~o_b55&lFTw>QqL}Uvs#Owkqr@{rnop%!%I+rk_7MTugiOLCU zB%)N=tk9K=go~6ebEZQOY<)>S=MIFKemNUmDbx6XuFD}4o-OuVDx3|6$WTd&=U0=g zyA+SgZplfNeTjrOMo~PTW0k5UBG_~3blf94gTrhp>r_ZK4znJz?53kmGaAbU6sNr^ zCaZ2T5YF%w$(ir~XK>b9IfRY{TXnBhX7 z*YNjdltP-;d$@F<5)Gy!qC}*EW}h!kcN;>wz(+g1316j%YyODB6eCQ*p&2$XOj#lA zu*Ln^VM_D*Bx*nnXKYkDU~2xRY&+((81vS87kB3ibt|0tGT11D~CtQtjT#< zXS&E#ecehho!4T$jO4DWp$ws_q~X$X;i_nneFkjzxB`N;SmdCXKo%oX+MSAe3_qKY zt0BLzCSFm>As^u{Nm{;Fj`}m4pwlHfY<7r6p(=z!j=UZlb`i2G9gRl)Ns=gf*esRP zSf(c?Nn64}zE?L>Ij`ckmm)AP*LYrYMR{VBrj#B|PF2IIZ%s~&_Jh5m&uyaa&x-MA@iAOga-h zo)tj@qFo!LQ{);hlF7=69z5>LCUGMSqdVbZs$@3mU_CPp)5#`6-dC(BYid zNWm&!ic14whiWkf^o&11`1%b#Z;iyr6eB5knGGbYbU`c91m0aRl>w)l#naI^Y$LG# zN{EaxX-O11qb9eR4ZuK*=L>d@wD%igJfP50!mcX*0VN_>MJYAlt*3CRxgf>GY!EF4!T(Mg*l&!n?qkS`J6>0yj5M4eKHfx*mTz4Z%BfZXH!G40`JV4=}ZW$Yn4jLJxK+gDWVsCgG=(O zW!VG`bbB*oA#Gs@GA){3PtqSx+n5NGH9 zwNGBCtBHuWKcSI!k%(4Z4DT$&RK})+<0F1D+?C8_<1WU|ZWK(VN7Bp` zp?RobI;M1sdalGOz3u^}Qm~UDy$~(<9O+1+tpXmmyk#Y}HF z;N6^*R0~XN%0VI0Q;G40jS!N3VaDH<%b7)o%f$_7X|YXK#eN!AG9@mhtP-Q@s2XuN z^IBh}D?|hba&g+Ohm%7dfyE1Hld&jdVh6znyJNY&q=&W;TO?EKX2n!8Bs=^gf-0|$ zaQQMVuj$CC*@`3J=JRqX&>bgr=+8J`1be$ur4rjz%H}epO(~1y2=|*YGN43CS*zj? z4P;UgJB3%aP%+nhV^l$O@;Jhh1rakvpPr4Cl2wrbv>MN0OSYyn^IKtVAa zValu$B5N;XdBYiIlbaY3UttteeWceB>Ql332d_y*iN=Yl9FMg{RAV^KT6;{TIP3tc zkWHs4mrAGuewxK|sSMf81*1QZ*xKbKXc_z8G?b z?bQ(_?&=lwN|X^g^&FK7xn;eihRKy;pVmiqd4l;|%3ST$A_K`V?Kib(vX?Nq!3>UD zjbv%W=?Xh?LvhU+iHIXKt2(1ORd$oCyj2WStA%2@6!zPk14%R06%^DQFX7&jCYqfA z*&I+s%c@u`I}&jF@LZzI^{QdHpC;iUU}Tt80vX+^Q*Nsi9VxjvySJK13IQgP&id7$ zzb_GIVTNBA6%FUAs97yikuEML7I-U|?w9gVxrAAzKB2cR2`EDvKY~o4SjWA5nB2dysAwYCX=}OKKvU-NHreVXG zSeZ5mSHaNGhC^ylP~5B1sUqxj*r;;6BCQcArNVJOHX~*EHKGvRsIk3HLm4ePBTj!M zoh3cIH{j-a*1uWT3G0Yr9wOyX2<~z2dWBttosq+0Ry^1))&U^}3HZq)){;#BvaNHrB}#ng@`{y^rekhhZpvI;xvd9 zHOpSVOy*%KV>MuI<9E@)T*;KWNmke-lZ;(XBoiKnCWbUxw2Sdf&PU+xft(iY#ktsk zB#}KP{D6ap8L=WOY`30@RwI5qR5H_gN0{da4TgYCrbOCGaa1|V5jIT*yH5nYg=|u= zQ6XiR7AafQNNQdd=ZAQK?vkRpY>={h`=VyFhoJQ$Zv-3})yR4xtWuFN zyH?O26KNU!%Nch1c1D)3waYjp0CfFtOnG!EpsU%-k9TKS)B+X4Exr*sv zf=}%`jyg$s#dJi1=O z!*MC9Mb@u_pY9FF&MO+pQA$)W*5QhvB?LaqsA58f1%(h3Wp=&F#S}tfgt)5E5s@+D ztU{8ia+}DBq;eapa|bxm!c2`nyS2B zTF+^MD6W@8MPjA(Km)20gbk`7uV-XY-T*m8n0X7VB8oC6aN-7W1IQ^zAlP~iF}_}c z9}`5VUlumV4EU%PPFybo4Sqe8g3PR>aFW2uk^rM z4<2ffr42xXlNC|op~r53%)BHcW`J$Du7`ZGAn+Vwix(sjNQk@wRdH~G*a4A1EkGF3 zL=IN)kR34tYy&okby~nFWJQsXCQ8tvz>EkTLy+L-9s%WqTcD4!K?t%z6F?kFfnq!_ z35YF}4U!>*2ttY^@b#Q^!bk(4MU)L?gtkH)!c~wE<3Ix?z(oL6j@QCNKDkZmQ`Bw8X-DgC{jT2ye&1H;(&vf)8Ir?w=3WMtEfoy$^}rB}DJmp?CA90g!7N_v$`M zLofEt!y5Kq2)-Sgw*PbBPo4UAU)f;jJ2XUR!YSBE^}3`6pg3JYNz=8(D0NrEEO^Ur zH~QLZ`a|`YTEleUrC|!xH+>Oy&H?mBA1Z}%ptyJ7bG&)j{^qk$aqP`T^zIiYY96Z8sWHEayf+B$}9b=Tgf_nWs5)agvnLwv*^23}lH z>B#Z)epS!6Zr!@NU#q=?wT_KpwYD~>|8My);J+?QS10(8;IL!g#veff0{)gy1S%+B z&pZs<_w(E9{69cj>t&w$-rV>31F7oyuvU-}^0y+swjuUvSncJ8ggA?oPq7z9mn7oAuM6J1RL9dVP>Tdq#S5QpCC8<-HXKy zALGU13!x;|2qPP)tcT$E>&XotdOaBp-)8}f>f;?5sSm!M+yXJE1BzhJX1DyJp#{QI z-~(-Re{Rc@Q&71n@B#OD`u_Th%2VJ2Z*>17Y}N^4y_2{6x35T}&%BXCv_9$;>6s`R z4FaIqQs-biyr^FLc-UI6c|0s0dquhpYDJ$TLNTlX#?v^Faev|-$%7=AxF6@C@%?)% zXb_FmiS%)KtUwuYRWFP(fD1w#YAsaTxI=oH$bocJ7Y~w6 zuo?Tut=6%Mj(JnC6YJ#=aU@qW*0lfU;GcFZehS2+xBhR3hY|XiUI0obU?PUC?`hEM zTp#~<+6B*rQ;$8EY7m}r?2!cg)oa-dt!q7lYi!0&J;u%6lO}9l1J(nd5}dsMYfuY@ zRqLMt)PvYaa|;Bn^LxJOYYF2mPKPJlvfKtgD6ee^d%}Ka3jxbZCx(3wJ~10VMgW!D zSbvHCGY}frEt2d^2u?`Wcuca1$Lxe;Z~ZQgeG-}WHzJv4H-A_rRO^&uGF1>m$7CAk zW~AP4KUyXy6&@FfIC-`6n|Q#{;&+lx|H)tbmS^om_y#<(HvFw)2{(9L6JewUG}=B> zuMr*5(14+SJf(hILt{OR1RvMV>Uug{>h1n0_!HV``Ul#IY98Jg$$7%Y#zK^^02jF}RzM z=Y)SC&x5!3G<=fQ{zmh*X-}T=_wu08K4Z$bJjf#bV|n09nqyL+*<-^8BzpG~NQ6c? z8kryNzc1YJNhNBTWj*8XB|_w<{|_XZ@&SpS{U;LL1hq`G5t`?s4mu%`gqjj2zF?Q8 z-`?<@Y7EOX{O0~|!SweuCKBz&HTj9r$8ZO$B{io{rPG`+joWub3-y*( zu;ZseP(Y*_nifNqpiiW|2^&3Y`U@xao%G~%G-5j;7Q^B%738_j5L3(JlAJbEGzveC6FN^jc#f!0SH{{PhacY;7@oLG z$%`7696)NT&p8m0U)DAEHzKGQQuzBWI~z?TYe=DgN2JaGw)g;=>7hc$7ew4F#6ExE zLhv!{{QANWrPn7*^*BWEngi$=0VV5_q4Zlnq6~DO_uWU8L4ut85rUvXAJz)00||oC z=0RQKJ!PCf6gT0J&>v1mRiN?{y$#iyMG@Es6^LT~r}d(;i0-wYknZJB?)}z9l_#-d zO^pckP24~j)+xtQ(1`f3j3~qL4)JnlJ>r8hqAHG;5q(rS7vd&#+l*ayfUcMO$^m4< zP+r8zET|kEz|U_dA@NaV{@IZDs4}pZ@xJ@0VT559)SGHNlL+!ofp0RATl*4_QrvipJaj3__0QZ1@BsVZSx2AjJff>$K#sTh`1POF zhtkm_?fhfo_`3SZPw4C?bk0%>)(#I-bQ;sgb)Wtp)Q=Ri^y60WG4g#<`9B89Pn6~V zP5nn<1LlN=38VVAYEeIWL9M=V=+!OJ;@{wCqzm8w(;fJ1j|9mqPdm~^3R$Hij z(3qT#-8Rb&0;44|);M+n3iY3daw2XUVK)~|4^FB#1`5rb^0O&>8fU;g?Bq610c~KI zcb)HfoWwS^)*X7yxZNBIUIL3V<;HY}LXaQVwkXfX z7*a0M4BSIbs2esYQ5+~6ZF;&;KJdo?H3+vtSr;k~7z5M*s6ko*u6q3t58>LeMrwtI zazVHN{urRXc?-3IX6hP%*!mx8V6=(s0u%safEoZbF4~+$8>a>E#{e}5quuLPfD2Fn zi~(u@)CtfAvI|fEi~(u@xPUGo9(X8#KL)6wIH(s0TUbKH53OMzb>c~PHKWIhz7JHY8L?71g@bv zAbtooVJsF4hBlKmO~cS8`s0s3j&0w*9ed`PXRzm=e;#}3rI)Z*UwsujaNq!T@ZdqL zc6dM5*Ea~mSVWS5yzuW>04PJaeuH_zdQQjWy0y3*tU?oHoz~D;w;_v9Y5{FfFxf=z z$tk<*(=7C)?E@eSjm~$dyPLk?%YsHV8d<1E z*LxKb4{C>g1b^cr3-#){$iNG-ENCR7(S>?CLf<`zRS*T~% zRRw&YQH(|v>eWbf$hx7?gnBfLCHO-l5!46ujQ_zs@P(`^rV14NPiaQUjA3 znAE_e1|~HysewriOln|K1Ctt<)WD<$CN(grfk_QaYG6_WlNy-Rz@!EyH881xNexVD zU{V8<8kp3;qy{E6FsXq_4SY}o@1IEw=VJZe<^Iw6ujmlcDNq0B)8&iLnss{~&VRk| z(3YhTcfyC_eg~(L_5sittLT7I1Aw%d1fa8AM*vNL9e}BTod9%3?1KPw9w8ixRzD+l z;%wOG;Qmv9-vQ7Wv9AFTZFFYrY`_r!`p*=apfYr3EIK=OCiv*cZp8D%S+S_ht$~Y( zZ?1JZ11+n+g~R_*bo{xnh{qk*kMjz_V`nCR@czT`e>mf$@pEe-p?-etNBHMJ#fUbN zb@5t{&0p8TQm4xn@rPTMIthzZTtD2&=;jdLx5 z&eNUHB`SyV|6})d^XDM(bbw`d>ZN<&4C