[auto ekmett@gmail.com**20090407062534 Ignore-this: 4b1df6cf5d7cd8ca198795add3dbd910 ] { hunk ./doc/html/unboxed-containers/Data-Set-Unboxed.html 22 ->unboxed-containers-0.0.1: Self-optimizing unboxed sets using view patterns and data familiesunboxed-containers-0.0.2: Self-optimizing unboxed sets using view patterns and data families
Portabilitynon-portable (type families, view patterns, unboxed tuples)
Stabilityexperimental
Maintainerekmett@gmail.com
Description

An efficient implementation of sets. +

Since many function names (but not the type name) clash with + Prelude names, this module is usually imported qualified, e.g. +

  import Data.Set.Unboxed (USet)
+  import qualified Data.Set.Unboxed as USet
+

The implementation of USet is based on size balanced binary trees (or + trees of bounded balance) as described by: +

Note that the implementation is left-biased -- the elements of a + first argument are always preferred to the second, for example in + union or insert. Of course, left-biasing can only be observed + when equality is an equivalence relation instead of structural + equality. +

Modified from Data.Set to use type families for automatic unboxing +

a {
getBoxed :: a
}US ((,) Char Char)US ((,) Double Double)US ((,) Float Float)US ((,) Int Int)US ((,) Int8 Int8)US ((,) Int16 Int16)US ((,) Int32 Int32)US ((,) Int64 Int64)US ((,) Integer Integer)US ((,) Word8 Word8)US ((,) Word16 Word16)US ((,) Word32 Word32)US ((,) Word64 Word64)US ((,) (Boxed a) (Boxed b))US ((,,) Char Char Char)US ((,,) Double Double Double)US ((,,) Float Float Float)US ((,,) Int Int Int)US ((,,) Int8 Int8 Int8)US ((,,) Int16 Int16 Int16)US ((,,) Int32 Int32 Int32)US ((,,) Int64 Int64 Int64)US ((,,) Integer Integer Integer)US ((,,) Word8 Word8 Word8)US ((,,) Word16 Word16 Word16)US ((,,) Word32 Word32 Word32)US ((,,) Word64 Word64 Word64)US ((,,) (Boxed a) (Boxed b) (Boxed c))US ((,,,) Char Char Char Char)US ((,,,) Double Double Double Double)US ((,,,) Float Float Float Float)US ((,,,) Int Int Int Int)US ((,,,) Int8 Int8 Int8 Int8)US ((,,,) Int16 Int16 Int16 Int16)US ((,,,) Int32 Int32 Int32 Int32)US ((,,,) Int64 Int64 Int64 Int64)US ((,,,) Integer Integer Integer Integer)US ((,,,) Word8 Word8 Word8 Word8)US ((,,,) Word16 Word16 Word16 Word16)US ((,,,) Word32 Word32 Word32 Word32)US ((,,,) Word64 Word64 Word64 Word64)US ((,,,) (Boxed a) (Boxed b) (Boxed c) (Boxed d))US ((,,,,) Char Char Char Char Char)US ((,,,,) Double Double Double Double Double)US ((,,,,) Float Float Float Float Float)US ((,,,,) Int Int Int Int Int)US ((,,,,) Int8 Int8 Int8 Int8 Int8)US ((,,,,) Int16 Int16 Int16 Int16 Int16)US ((,,,,) Int32 Int32 Int32 Int32 Int32)US ((,,,,) Int64 Int64 Int64 Int64 Int64)US ((,,,,) Integer Integer Integer Integer Integer)US ((,,,,) Word8 Word8 Word8 Word8 Word8)US ((,,,,) Word16 Word16 Word16 Word16 Word16)US ((,,,,) Word32 Word32 Word32 Word32 Word32)US ((,,,,) Word64 Word64 Word64 Word64 Word64)US ((,,,,) (Boxed a) (Boxed b) (Boxed c) (Boxed d) (Boxed e))US ((,,,,,) Char Char Char Char Char Char)US ((,,,,,) Double Double Double Double Double Double)US ((,,,,,) Float Float Float Float Float Float)US ((,,,,,) Int Int Int Int Int Int)US ((,,,,,) Int8 Int8 Int8 Int8 Int8 Int8)US ((,,,,,) Int16 Int16 Int16 Int16 Int16 Int16)US ((,,,,,) Int32 Int32 Int32 Int32 Int32 Int32)US ((,,,,,) Int64 Int64 Int64 Int64 Int64 Int64)US ((,,,,,) Integer Integer Integer Integer Integer Integer)US ((,,,,,) Word8 Word8 Word8 Word8 Word8 Word8)US ((,,,,,) Word16 Word16 Word16 Word16 Word16 Word16)US ((,,,,,) Word32 Word32 Word32 Word32 Word32 Word32)US ((,,,,,) Word64 Word64 Word64 Word64 Word64 Word64)US ((,,,,,) (Boxed a) (Boxed b) (Boxed c) (Boxed d) (Boxed e) (Boxed f))US ((,,,,,,) Char Char Char Char Char Char Char)US ((,,,,,,) Double Double Double Double Double Double Double)US ((,,,,,,) Float Float Float Float Float Float Float)US ((,,,,,,) Int Int Int Int Int Int Int)US ((,,,,,,) Int8 Int8 Int8 Int8 Int8 Int8 Int8)US ((,,,,,,) Int16 Int16 Int16 Int16 Int16 Int16 Int16)US ((,,,,,,) Int32 Int32 Int32 Int32 Int32 Int32 Int32)US ((,,,,,,) Int64 Int64 Int64 Int64 Int64 Int64 Int64)US ((,,,,,,) Integer Integer Integer Integer Integer Integer Integer)US ((,,,,,,) Word8 Word8 Word8 Word8 Word8 Word8 Word8)US ((,,,,,,) Word16 Word16 Word16 Word16 Word16 Word16 Word16)US ((,,,,,,) Word32 Word32 Word32 Word32 Word32 Word32 Word32)US ((,,,,,,) Word64 Word64 Word64 Word64 Word64 Word64 Word64)US ((,,,,,,) (Boxed a) (Boxed b) (Boxed c) (Boxed d) (Boxed e) (Boxed f) (Boxed g))US ((,,,,,,,) Char Char Char Char Char Char Char Char)US ((,,,,,,,) Double Double Double Double Double Double Double Double)US ((,,,,,,,) Float Float Float Float Float Float Float Float)US ((,,,,,,,) Int Int Int Int Int Int Int Int)US ((,,,,,,,) Int8 Int8 Int8 Int8 Int8 Int8 Int8 Int8)US ((,,,,,,,) Int16 Int16 Int16 Int16 Int16 Int16 Int16 Int16)US ((,,,,,,,) Int32 Int32 Int32 Int32 Int32 Int32 Int32 Int32)US ((,,,,,,,) Int64 Int64 Int64 Int64 Int64 Int64 Int64 Int64)US ((,,,,,,,) Integer Integer Integer Integer Integer Integer Integer Integer)US ((,,,,,,,) Word8 Word8 Word8 Word8 Word8 Word8 Word8 Word8)US ((,,,,,,,) Word16 Word16 Word16 Word16 Word16 Word16 Word16 Word16)US ((,,,,,,,) Word32 Word32 Word32 Word32 Word32 Word32 Word32 Word32)US ((,,,,,,,) Word64 Word64 Word64 Word64 Word64 Word64 Word64 Word64)US ((,,,,,,,) (Boxed a) (Boxed b) (Boxed c) (Boxed d) (Boxed e) (Boxed f) (Boxed g) (Boxed h))US ((,,,,,,,,) Char Char Char Char Char Char Char Char Char)US ((,,,,,,,,) Double Double Double Double Double Double Double Double Double)US ((,,,,,,,,) Float Float Float Float Float Float Float Float Float)US ((,,,,,,,,) Int Int Int Int Int Int Int Int Int)US ((,,,,,,,,) Int8 Int8 Int8 Int8 Int8 Int8 Int8 Int8 Int8)US ((,,,,,,,,) Int16 Int16 Int16 Int16 Int16 Int16 Int16 Int16 Int16)US ((,,,,,,,,) Int32 Int32 Int32 Int32 Int32 Int32 Int32 Int32 Int32)US ((,,,,,,,,) Int64 Int64 Int64 Int64 Int64 Int64 Int64 Int64 Int64)US ((,,,,,,,,) Integer Integer Integer Integer Integer Integer Integer Integer Integer)US ((,,,,,,,,) Word8 Word8 Word8 Word8 Word8 Word8 Word8 Word8 Word8)US ((,,,,,,,,) Word16 Word16 Word16 Word16 Word16 Word16 Word16 Word16 Word16)US ((,,,,,,,,) Word32 Word32 Word32 Word32 Word32 Word32 Word32 Word32 Word32)US ((,,,,,,,,) Word64 Word64 Word64 Word64 Word64 Word64 Word64 Word64 Word64)US ((,,,,,,,,) (Boxed a) (Boxed b) (Boxed c) (Boxed d) (Boxed e) (Boxed f) (Boxed g) (Boxed h) (Boxed i))
aunboxed-containers-0.0.1: Self-optimizing unboxed sets using view patterns and data families (Index)unboxed-containers-0.0.2: Self-optimizing unboxed sets using view patterns and data families (Index)unboxed-containers-0.0.1: Self-optimizing unboxed sets using view patterns and data familiesunboxed-containers-0.0.2: Self-optimizing unboxed sets using view patterns and data familiesgetBoxedunboxed-containers-0.0.2: Self-optimizing unboxed sets using view patterns and data familiesunboxed-containers-0.0.1: Self-optimizing unboxed sets using view patterns and data familiesunboxed-containers-0.0.2: Self-optimizing unboxed sets using view patterns and data families -{------------------------------------------------------------------------------ --- | --- Module : Data.Set.Unboxed --- Copyright : (c) Edward Kmett 2009 --- (c) Daan Leijen 2002 --- License : BSD3 --- Maintainer : ekmett@gmail.com --- Stability : experimental --- Portability : non-portable (type families, view patterns, unboxed tuples) --- --- An efficient implementation of sets. --- --- Since many function names (but not the type name) clash with --- "Prelude" names, this module is usually imported @qualified@, e.g. --- --- > import Data.Set.Unboxed (USet) --- > import qualified Data.Set.Unboxed as USet --- --- The implementation of 'USet' is based on /size balanced/ binary trees (or --- trees of /bounded balance/) as described by: --- --- * Stephen Adams, \"/Efficient sets: a balancing act/\", --- Journal of Functional Programming 3(4):553-562, October 1993, --- <http://www.swiss.ai.mit.edu/~adams/BB/>. --- --- * J. Nievergelt and E.M. Reingold, --- \"/Binary search trees of bounded balance/\", --- SIAM journal of computing 2(1), March 1973. --- --- Note that the implementation is /left-biased/ -- the elements of a --- first argument are always preferred to the second, for example in --- 'union' or 'insert'. Of course, left-biasing can only be observed --- when equality is an equivalence relation instead of structural --- equality. --- --- Modified from "Data.Set" to use type families for automatic unboxing --- ------------------------------------------------------------------------------ --} - -moduleData.Set.Unboxed( --- * Set type -USet-- instance Eq,Ord,Show,Read,Data,Typeable -,US -,Boxed(Boxed) +----------------------------------------------------------------------------- +-- | +-- Module : Data.Set.Unboxed +-- Copyright : (c) Edward Kmett 2009 (c) Daan Leijen 2002 +-- License : BSD3 +-- Maintainer : ekmett@gmail.com +-- Stability : experimental +-- Portability : non-portable (type families, view patterns, unboxed tuples) +-- +-- An efficient implementation of sets. +-- +-- Since many function names (but not the type name) clash with +-- "Prelude" names, this module is usually imported @qualified@, e.g. +-- +-- > import Data.Set.Unboxed (USet) +-- > import qualified Data.Set.Unboxed as USet +-- +-- The implementation of 'USet' is based on /size balanced/ binary trees (or +-- trees of /bounded balance/) as described by: +-- +-- * Stephen Adams, \"/Efficient sets: a balancing act/\", +-- Journal of Functional Programming 3(4):553-562, October 1993, +-- <http://www.swiss.ai.mit.edu/~adams/BB/>. +-- +-- * J. Nievergelt and E.M. Reingold, +-- \"/Binary search trees of bounded balance/\", +-- SIAM journal of computing 2(1), March 1973. +-- +-- Note that the implementation is /left-biased/ -- the elements of a +-- first argument are always preferred to the second, for example in +-- 'union' or 'insert'. Of course, left-biasing can only be observed +-- when equality is an equivalence relation instead of structural +-- equality. +-- +-- Modified from "Data.Set" to use type families for automatic unboxing +-- +----------------------------------------------------------------------------- + +moduleData.Set.Unboxed( +-- * Set type +USet-- instance Eq,Ord,Show,Read +,US +,Boxed(Boxed,getBoxed) + +-- * Operators +,(\\) hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 58 --- * Operators -,(\\) - --- * Query -,null -,size -,member -,notMember -,isSubsetOf -,isProperSubsetOf - --- * Construction -,empty -,singleton -,insert -,delete - --- * Combine -,union,unions -,difference -,intersection - --- * Filter -,filter -,partition -,split -,splitMember - --- * Map -,map -,mapMonotonic +-- * Query +,null +,size +,member +,notMember +,isSubsetOf +,isProperSubsetOf + +-- * Construction +,empty +,singleton +,insert +,delete + +-- * Combine +,union,unions +,difference +,intersection + +-- * Filter +,filter +,partition +,split +,splitMember + +-- * Map +,map +,mapMonotonic + +-- * Fold +,fold hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 90 --- * Fold -,fold - --- * Min\/Max -,findMin -,findMax -,deleteMin -,deleteMax -,deleteFindMin -,deleteFindMax -,maxView -,minView - --- * Conversion - --- ** List -,elems -,toList -,fromList - --- ** Ordered list -,toAscList -,fromAscList -,fromDistinctAscList - --- * Debugging -,showTree -,showTreeWith -,valid -)where - -importPreludehiding(filter,foldr,null,map) -importqualifiedData.ListasList -importData.Monoid(Monoid(..)) -importData.Word -importData.Int - -{- --- just for testing -import Test.QuickCheck -import Data.List (nub,sort) -import qualified Data.List as List --} - -#if __GLASGOW_HASKELL__ -importText.Read -#endif - -{-------------------------------------------------------------------- - Operators ---------------------------------------------------------------------} -infixl9\\-- - --- | /O(n+m)/. See 'difference'. -(\\)::(USa,Orda)=>USeta->USeta->USeta -m1\\m2=differencem1m2 - -{-------------------------------------------------------------------- - Sets are size balanced trees ---------------------------------------------------------------------} -typeSize=Int - --- | A set of values @a@. -dataSeta=Tip -|Bin{-# UNPACK #-}!Size!a!(USeta)!(USeta) - -classUSawhere -dataUSeta - +-- * Min\/Max +,findMin +,findMax +,deleteMin +,deleteMax +,deleteFindMin +,deleteFindMax +,maxView +,minView + +-- * Conversion + +-- ** List +,elems +,toList +,fromList + +-- ** Ordered list +,toAscList +,fromAscList +,fromDistinctAscList + +-- * Debugging +,showTree +,showTreeWith +,valid +)where + +importPreludehiding(filter,foldr,null,map) +importqualifiedData.ListasList +importData.Monoid(Monoid(..)) +importData.Word +importData.Int +importData.Complex + +{- +-- just for testing +import Test.QuickCheck +import Data.List (nub,sort) +import qualified Data.List as List +-} + +#if __GLASGOW_HASKELL__ +importText.Read +#endif + +{-------------------------------------------------------------------- + Operators +--------------------------------------------------------------------} +infixl9\\-- + +-- | /O(n+m)/. See 'difference'. +(\\)::(USa,Orda)=>USeta->USeta->USeta +m1\\m2=differencem1m2 + +{-------------------------------------------------------------------- + Sets are size balanced trees +--------------------------------------------------------------------} +typeSize=Int + +-- | A set of values @a@. +dataSeta=Tip +|Bin{-# UNPACK #-}!Size!a!(USeta)!(USeta) + +classUSawhere +dataUSeta + +-- | Extract and rebox the specialized node format +view::USeta->Seta hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 160 --- | Extract and rebox the specialized node format -view::USeta->Seta - --- | Apply the view to tip and bin continuations -viewk::b->(Size->a->USeta->USeta->b)->USeta->b -viewkfkx=caseviewxof -Binsilr->ksilr -Tip->f - --- | View just the value and left and right child of a bin -viewBin::USeta->(#a,USeta,USeta#) -viewBinx=caseviewxof -Bin_ilr->(#i,l,r#) -Tip->error"Data.Set.Unboxed.viewBin" - --- | /O(1)/. The number of elements in the set. -size::USeta->Size -size=viewk0size'where -size's___=s - --- | /O(1)/. Is this the empty set? -null::USeta->Bool -nullx=sizex==0 +-- | Apply the view to tip and bin continuations +viewk::b->(Size->a->USeta->USeta->b)->USeta->b +viewkfkx=caseviewxof +Binsilr->ksilr +Tip->f + +-- | View just the value and left and right child of a bin +viewBin::USeta->(#a,USeta,USeta#) +viewBinx=caseviewxof +Bin_ilr->(#i,l,r#) +Tip->error"Data.Set.Unboxed.viewBin" + +-- | /O(1)/. The number of elements in the set. +size::USeta->Size +size=viewk0size'where +size's___=s + +-- | /O(1)/. Is this the empty set? +null::USeta->Bool +nullx=sizex==0 + +-- | Smart tip constructor +tip::USeta hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 184 --- | Smart tip constructor -tip::USeta +-- | Smart bin constructor +bin::Size->a->USeta->USeta->USeta hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 187 --- | Smart bin constructor -bin::Size->a->USeta->USeta->USeta - --- | Balance the tree -balance::a->USeta->USeta->USeta -balancexlr -|sizeL+sizeR<=1=binsizeXxlr -|sizeR>=delta*sizeL=caseviewBinrof -(#v,ly,ry#) -|sizely<ratio*sizery->bin_v(bin_xlly)ry -|(#x3,t2,t3#)<-viewBinly->bin_x3(bin_xlt2)(bin_vt3ry) -|sizeL>=delta*sizeR=caseviewBinlof -(#v,ly,ry#) -|sizery<ratio*sizely->bin_vly(bin_xryr) -|(#x3,t2,t3#)<-viewBinry->bin_x3(bin_vlyt2)(bin_xt3r) -|otherwise=binsizeXxlr -where -sizeL=sizel -sizeR=sizer -sizeX=sizeL+sizeR+1 - - - -instance(USa,Orda)=>Monoid(USeta)where -mempty=empty -mappend=union -mconcat=unions - -{- -instance US a => Generator (USet a) where - type Elem (USet a) = a - mapReduce _ (null -> True) = mempty - mapReduce f (view -> Bin _s k l r) = mapReduce f l `mappend` f k `mappend` mapReduce f r --} - -{-------------------------------------------------------------------- - Query ---------------------------------------------------------------------} --- | /O(log n)/. Is the element in the set? -member::(USa,Orda)=>a->USeta->Bool -memberx=gowhere -cmpx=comparex -go=viewkFalse$\_ylr->casecmpxyof -LT->gol -GT->gor -EQ->True - --- | /O(log n)/. Is the element not in the set? -notMember::(USa,Orda)=>a->USeta->Bool -notMemberxt=not$memberxt - -{-------------------------------------------------------------------- - Construction ---------------------------------------------------------------------} --- | /O(1)/. The empty set. -empty::USa=>USeta -empty=tip - --- | /O(1)/. Create a singleton set. -singleton::USa=>a->USeta -singletonx=bin1xtiptip - -{-------------------------------------------------------------------- - Deletion ---------------------------------------------------------------------} - --- | /O(log n)/. Delete an element from a set. -delete::(USa,Orda)=>a->USeta->USeta -deletex=gowhere -go=viewktip$\_ylr->casecomparexyof -LT->balancey(gol)r -GT->balanceyl(gor) -EQ->gluelr - -{-------------------------------------------------------------------- - Subset ---------------------------------------------------------------------} --- | /O(n+m)/. Is this a proper subset? (ie. a subset but not equal). -isProperSubsetOf::(USa,Orda)=>USeta->USeta->Bool -isProperSubsetOfs1s2=(sizes1<sizes2)&&(isSubsetOfs1s2) - --- | /O(n+m)/. Is this a subset? --- @(s1 `isSubsetOf` s2)@ tells whether @s1@ is a subset of @s2@. -isSubsetOf::(USa,Orda)=>USeta->USeta->Bool -isSubsetOft1t2=(sizet1<=sizet2)&&(isSubsetOfXt1t2) - -isSubsetOfX::(USa,Orda)=>USeta->USeta->Bool -isSubsetOfX_(null->True)=False -isSubsetOfX(null->True)_=True -isSubsetOfX(view->Bin_xlr)t=found&&isSubsetOfXllt&&isSubsetOfXrgt -where -(lt,found,gt)=splitMemberxt - - -{-------------------------------------------------------------------- - Minimal, Maximal ---------------------------------------------------------------------} --- | /O(log n)/. The minimal element of a set. -findMin::USa=>USeta->a -findMin(view->Bin_x(null->True)_)=x -findMin(view->Bin__l_)=findMinl -findMin_=error"Data.Set.Unboxed.findMin: empty set has no minimal element" - --- | /O(log n)/. The maximal element of a set. -findMax::USa=>USeta->a -findMax(view->Bin_x_(null->True))=x -findMax(view->Bin___r)=findMaxr -findMax_=error"Data.Set.Unboxed.findMax: empty set has no maximal element" - --- | /O(log n)/. Delete the minimal element. -deleteMin::USa=>USeta->USeta -deleteMin(view->Bin__(null->True)r)=r -deleteMin(view->Bin_xlr)=balancex(deleteMinl)r -deleteMin_=tip - --- | /O(log n)/. Delete the maximal element. -deleteMax::USa=>USeta->USeta -deleteMax(view->Bin__l(null->True))=l -deleteMax(view->Bin_xlr)=balancexl(deleteMaxr) -deleteMax_=tip - -{-------------------------------------------------------------------- - Union. ---------------------------------------------------------------------} --- | The union of a list of sets: (@'unions' == 'foldl' 'union' 'empty'@). -unions::(USa,Orda)=>[USeta]->USeta -unionsts -=foldlStrictunionemptyts - - --- | /O(n+m)/. The union of two sets, preferring the first set when --- equal elements are encountered. --- The implementation uses the efficient /hedge-union/ algorithm. --- Hedge-union is more efficient on (bigset `union` smallset). -union::(USa,Orda)=>USeta->USeta->USeta -union(null->True)t2=t2 -uniont1(null->True)=t1 -uniont1t2=hedgeUnion(constLT)(constGT)t1t2 - -hedgeUnion::(USa,Orda)=>(a->Ordering)->(a->Ordering)->USeta->USeta->USeta -hedgeUnion__t1(null->True)=t1 -hedgeUnioncmplocmphi(null->True)(view->Bin_xlr)=joinx(filterGtcmplol)(filterLtcmphir) -hedgeUnioncmplocmphi(view->Bin_xlr)t2=joinx(hedgeUnioncmplocmpxl(trimcmplocmpxt2))(hedgeUnioncmpxcmphir(trimcmpxcmphit2)) -where -cmpx=comparex - -{-------------------------------------------------------------------- - Difference ---------------------------------------------------------------------} --- | /O(n+m)/. Difference of two sets. --- The implementation uses an efficient /hedge/ algorithm comparable with /hedge-union/. -difference::(USa,Orda)=>USeta->USeta->USeta -difference(null->True)_=tip -differencet1(null->True)=t1 -differencet1t2=hedgeDiff(constLT)(constGT)t1t2 - -hedgeDiff::(USa,Orda)=>(a->Ordering)->(a->Ordering)->USeta->USeta->USeta -hedgeDiff__(null->True)_=tip -hedgeDiffcmplocmphi(view->Bin_xlr)(null->True)=joinx(filterGtcmplol)(filterLtcmphir) -hedgeDiffcmplocmphit(view->Bin_xlr)=merge(hedgeDiffcmplocmpx(trimcmplocmpxt)l)(hedgeDiffcmpxcmphi(trimcmpxcmphit)r) -where -cmpx=comparex - -{-------------------------------------------------------------------- - Intersection ---------------------------------------------------------------------} --- | /O(n+m)/. The intersection of two sets. --- Elements of the result come from the first set, so for example --- --- > import qualified Data.Set as S --- > data AB = A | B deriving Show --- > instance Ord AB where compare _ _ = EQ --- > instance Eq AB where _ == _ = True --- > main = print (S.singleton A `S.intersection` S.singleton B, --- > S.singleton B `S.intersection` S.singleton A) --- --- prints @(fromList [A],fromList [B])@. -intersection::(USa,Orda)=>USeta->USeta->USeta -intersection(null->True)_=tip -intersection_(null->True)=tip -intersectiont1@(view->Bins1x1l1r1)t2@(view->Bins2x2l2r2)= -ifs1>=s2then -let(lt,found,gt)=splitLookupx2t1 -tl=intersectionltl2 -tr=intersectiongtr2 -incasefoundof -Justx->joinxtltr -Nothing->mergetltr -elselet(lt,found,gt)=splitMemberx1t2 -tl=intersectionl1lt -tr=intersectionr1gt -iniffoundthenjoinx1tltr -elsemergetltr - -{-------------------------------------------------------------------- - Filter and partition ---------------------------------------------------------------------} --- | /O(n)/. Filter all elements that satisfy the predicate. -filter::(USa,Orda)=>(a->Bool)->USeta->USeta -filterp=gowhere -go=viewktip -(\_xlr-> -ifpx -thenjoinx(gol)(gor) -elsemerge(gol)(gor) -) - --- | /O(n)/. Partition the set into two sets, one with all elements that satisfy --- the predicate and one with all elements that don't satisfy the predicate. --- See also 'split'. -partition::(USa,Orda)=>(a->Bool)->USeta->(USeta,USeta) -partitionp=gowhere -go=viewk(tip,tip) -(\_xlr-> -let -(l1,l2)=gol -(r1,r2)=gor -inifpx -then(joinxl1r1,mergel2r2) -else(mergel1r1,joinxl2r2) -) - -{---------------------------------------------------------------------- - Map -----------------------------------------------------------------------} - --- | /O(n*log n)/. --- @'map' f s@ is the set obtained by applying @f@ to each element of @s@. --- --- It's worth noting that the size of the result may be smaller if, --- for some @(x,y)@, @x \/= y && f x == f y@ +-- | Balance the tree +balance::a->USeta->USeta->USeta +balancexlr +|sizeL+sizeR<=1=binsizeXxlr +|sizeR>=delta*sizeL=caseviewBinrof +(#v,ly,ry#) +|sizely<ratio*sizery->bin_v(bin_xlly)ry +|(#x3,t2,t3#)<-viewBinly->bin_x3(bin_xlt2)(bin_vt3ry) +|sizeL>=delta*sizeR=caseviewBinlof +(#v,ly,ry#) +|sizery<ratio*sizely->bin_vly(bin_xryr) +|(#x3,t2,t3#)<-viewBinry->bin_x3(bin_vlyt2)(bin_xt3r) +|otherwise=binsizeXxlr +where +sizeL=sizel +sizeR=sizer +sizeX=sizeL+sizeR+1 + + + +instance(USa,Orda)=>Monoid(USeta)where +mempty=empty +mappend=union +mconcat=unions + +{- +instance US a => Generator (USet a) where + type Elem (USet a) = a + mapReduce _ (null -> True) = mempty + mapReduce f (view -> Bin _s k l r) = mapReduce f l `mappend` f k `mappend` mapReduce f r +-} + +{-------------------------------------------------------------------- + Query +--------------------------------------------------------------------} +-- | /O(log n)/. Is the element in the set? +member::(USa,Orda)=>a->USeta->Bool +memberx=gowhere +cmpx=comparex +go=viewkFalse$\_ylr->casecmpxyof +LT->gol +GT->gor +EQ->True + +-- | /O(log n)/. Is the element not in the set? +notMember::(USa,Orda)=>a->USeta->Bool +notMemberxt=not$memberxt + +{-------------------------------------------------------------------- + Construction +--------------------------------------------------------------------} +-- | /O(1)/. The empty set. +empty::USa=>USeta +empty=tip + +-- | /O(1)/. Create a singleton set. +singleton::USa=>a->USeta +singletonx=bin1xtiptip + +{-------------------------------------------------------------------- + Deletion +--------------------------------------------------------------------} + +-- | /O(log n)/. Delete an element from a set. +delete::(USa,Orda)=>a->USeta->USeta +deletex=gowhere +go=viewktip$\_ylr->casecomparexyof +LT->balancey(gol)r +GT->balanceyl(gor) +EQ->gluelr + +{-------------------------------------------------------------------- + Subset +--------------------------------------------------------------------} +-- | /O(n+m)/. Is this a proper subset? (ie. a subset but not equal). +isProperSubsetOf::(USa,Orda)=>USeta->USeta->Bool +isProperSubsetOfs1s2=(sizes1<sizes2)&&(isSubsetOfs1s2) + +-- | /O(n+m)/. Is this a subset? +-- @(s1 `isSubsetOf` s2)@ tells whether @s1@ is a subset of @s2@. +isSubsetOf::(USa,Orda)=>USeta->USeta->Bool +isSubsetOft1t2=(sizet1<=sizet2)&&(isSubsetOfXt1t2) + +isSubsetOfX::(USa,Orda)=>USeta->USeta->Bool +isSubsetOfX_(null->True)=False +isSubsetOfX(null->True)_=True +isSubsetOfX(view->Bin_xlr)t=found&&isSubsetOfXllt&&isSubsetOfXrgt +where +(lt,found,gt)=splitMemberxt + + +{-------------------------------------------------------------------- + Minimal, Maximal +--------------------------------------------------------------------} +-- | /O(log n)/. The minimal element of a set. +findMin::USa=>USeta->a +findMin(view->Bin_x(null->True)_)=x +findMin(view->Bin__l_)=findMinl +findMin_=error"Data.Set.Unboxed.findMin: empty set has no minimal element" + +-- | /O(log n)/. The maximal element of a set. +findMax::USa=>USeta->a +findMax(view->Bin_x_(null->True))=x +findMax(view->Bin___r)=findMaxr +findMax_=error"Data.Set.Unboxed.findMax: empty set has no maximal element" + +-- | /O(log n)/. Delete the minimal element. +deleteMin::USa=>USeta->USeta +deleteMin(view->Bin__(null->True)r)=r +deleteMin(view->Bin_xlr)=balancex(deleteMinl)r +deleteMin_=tip + +-- | /O(log n)/. Delete the maximal element. +deleteMax::USa=>USeta->USeta +deleteMax(view->Bin__l(null->True))=l +deleteMax(view->Bin_xlr)=balancexl(deleteMaxr) +deleteMax_=tip + +{-------------------------------------------------------------------- + Union. +--------------------------------------------------------------------} +-- | The union of a list of sets: (@'unions' == 'foldl' 'union' 'empty'@). +unions::(USa,Orda)=>[USeta]->USeta +unionsts +=foldlStrictunionemptyts + + +-- | /O(n+m)/. The union of two sets, preferring the first set when +-- equal elements are encountered. +-- The implementation uses the efficient /hedge-union/ algorithm. +-- Hedge-union is more efficient on (bigset `union` smallset). +union::(USa,Orda)=>USeta->USeta->USeta +union(null->True)t2=t2 +uniont1(null->True)=t1 +uniont1t2=hedgeUnion(constLT)(constGT)t1t2 + +hedgeUnion::(USa,Orda)=>(a->Ordering)->(a->Ordering)->USeta->USeta->USeta +hedgeUnion__t1(null->True)=t1 +hedgeUnioncmplocmphi(null->True)(view->Bin_xlr)=joinx(filterGtcmplol)(filterLtcmphir) +hedgeUnioncmplocmphi(view->Bin_xlr)t2=joinx(hedgeUnioncmplocmpxl(trimcmplocmpxt2))(hedgeUnioncmpxcmphir(trimcmpxcmphit2)) +where +cmpx=comparex + +{-------------------------------------------------------------------- + Difference +--------------------------------------------------------------------} +-- | /O(n+m)/. Difference of two sets. +-- The implementation uses an efficient /hedge/ algorithm comparable with /hedge-union/. +difference::(USa,Orda)=>USeta->USeta->USeta +difference(null->True)_=tip +differencet1(null->True)=t1 +differencet1t2=hedgeDiff(constLT)(constGT)t1t2 + +hedgeDiff::(USa,Orda)=>(a->Ordering)->(a->Ordering)->USeta->USeta->USeta +hedgeDiff__(null->True)_=tip +hedgeDiffcmplocmphi(view->Bin_xlr)(null->True)=joinx(filterGtcmplol)(filterLtcmphir) +hedgeDiffcmplocmphit(view->Bin_xlr)=merge(hedgeDiffcmplocmpx(trimcmplocmpxt)l)(hedgeDiffcmpxcmphi(trimcmpxcmphit)r) +where +cmpx=comparex + +{-------------------------------------------------------------------- + Intersection +--------------------------------------------------------------------} +-- | /O(n+m)/. The intersection of two sets. +-- Elements of the result come from the first set, so for example +-- +-- > import qualified Data.Set as S +-- > data AB = A | B deriving Show +-- > instance Ord AB where compare _ _ = EQ +-- > instance Eq AB where _ == _ = True +-- > main = print (S.singleton A `S.intersection` S.singleton B, +-- > S.singleton B `S.intersection` S.singleton A) +-- +-- prints @(fromList [A],fromList [B])@. +intersection::(USa,Orda)=>USeta->USeta->USeta +intersection(null->True)_=tip +intersection_(null->True)=tip +intersectiont1@(view->Bins1x1l1r1)t2@(view->Bins2x2l2r2)= +ifs1>=s2then +let(lt,found,gt)=splitLookupx2t1 +tl=intersectionltl2 +tr=intersectiongtr2 +incasefoundof +Justx->joinxtltr +Nothing->mergetltr +elselet(lt,found,gt)=splitMemberx1t2 +tl=intersectionl1lt +tr=intersectionr1gt +iniffoundthenjoinx1tltr +elsemergetltr + +{-------------------------------------------------------------------- + Filter and partition +--------------------------------------------------------------------} +-- | /O(n)/. Filter all elements that satisfy the predicate. +filter::(USa,Orda)=>(a->Bool)->USeta->USeta +filterp=gowhere +go=viewktip +(\_xlr-> +ifpx +thenjoinx(gol)(gor) +elsemerge(gol)(gor) +) + +-- | /O(n)/. Partition the set into two sets, one with all elements that satisfy +-- the predicate and one with all elements that don't satisfy the predicate. +-- See also 'split'. +partition::(USa,Orda)=>(a->Bool)->USeta->(USeta,USeta) +partitionp=gowhere +go=viewk(tip,tip) +(\_xlr-> +let +(l1,l2)=gol +(r1,r2)=gor +inifpx +then(joinxl1r1,mergel2r2) +else(mergel1r1,joinxl2r2) +) + +{---------------------------------------------------------------------- + Map +----------------------------------------------------------------------} + +-- | /O(n*log n)/. +-- @'map' f s@ is the set obtained by applying @f@ to each element of @s@. +-- +-- It's worth noting that the size of the result may be smaller if, +-- for some @(x,y)@, @x \/= y && f x == f y@ + +map::(USa,USb,Orda,Ordb)=>(a->b)->USeta->USetb +mapf=fromList.List.mapf.toList hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 419 -map::(USa,USb,Orda,Ordb)=>(a->b)->USeta->USetb -mapf=fromList.List.mapf.toList - --- | /O(n)/. The --- --- @'mapMonotonic' f s == 'map' f s@, but works only when @f@ is monotonic. --- /The precondition is not checked./ --- Semi-formally, we have: --- --- > and [x < y ==> f x < f y | x <- ls, y <- ls] --- > ==> mapMonotonic f s == map f s --- > where ls = toList s - -mapMonotonic::(USa,USb)=>(a->b)->USeta->USetb -mapMonotonicf(view->Binszxlr)=binsz(fx)(mapMonotonicfl)(mapMonotonicfr) -mapMonotonic__=tip - - -{-------------------------------------------------------------------- - Fold ---------------------------------------------------------------------} --- | /O(n)/. Fold over the elements of a set in an unspecified order. -fold::USa=>(a->b->b)->b->USeta->b -foldfzs=foldrfzs - --- | /O(n)/. Post-order fold. -foldr::USa=>(a->b->b)->b->USeta->b ---foldr f z (view -> Bin _ x l r) = foldr f (f x (foldr f z r)) l ---foldr _ z _ = z +-- | /O(n)/. The +-- +-- @'mapMonotonic' f s == 'map' f s@, but works only when @f@ is monotonic. +-- /The precondition is not checked./ +-- Semi-formally, we have: +-- +-- > and [x < y ==> f x < f y | x <- ls, y <- ls] +-- > ==> mapMonotonic f s == map f s +-- > where ls = toList s + +mapMonotonic::(USa,USb)=>(a->b)->USeta->USetb +mapMonotonicf(view->Binszxlr)=binsz(fx)(mapMonotonicfl)(mapMonotonicfr) +mapMonotonic__=tip + + +{-------------------------------------------------------------------- + Fold +--------------------------------------------------------------------} +-- | /O(n)/. Fold over the elements of a set in an unspecified order. +fold::USa=>(a->b->b)->b->USeta->b +foldfzs=foldrfzs + +-- | /O(n)/. Post-order fold. +foldr::USa=>(a->b->b)->b->USeta->b +--foldr f z (view -> Bin _ x l r) = foldr f (f x (foldr f z r)) l +--foldr _ z _ = z + +foldrfzx|nullx=z +|(#x,l,r#)<-viewBinx=foldrf(fx(foldrfzr))l hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 449 -foldrfzx|nullx=z -|(#x,l,r#)<-viewBinx=foldrf(fx(foldrfzr))l - -{-------------------------------------------------------------------- - List variations ---------------------------------------------------------------------} --- | /O(n)/. The elements of a set. -elems::USa=>USeta->[a] -elemsx=toListx - -{-------------------------------------------------------------------- - Lists ---------------------------------------------------------------------} --- | /O(n)/. Convert the set to a list of elements. -toList::USa=>USeta->[a] -toListx=toAscListx - --- | /O(n)/. Convert the set to an ascending list of elements. -toAscList::USa=>USeta->[a] -toAscList=foldr(:)[] - - --- | /O(n*log n)/. Create a set from a list of elements. -fromList::(USa,Orda)=>[a]->USeta -fromList=foldlStrictinsempty -where -instx=insertxt - -{-------------------------------------------------------------------- - Building trees from ascending/descending lists can be done in linear time. - - Note that if [xs] is ascending that: - fromAscList xs == fromList xs ---------------------------------------------------------------------} --- | /O(n)/. Build a set from an ascending list in linear time. --- /The precondition (input list is ascending) is not checked./ -fromAscList::(USa,Eqa)=>[a]->USeta -fromAscListxs -=fromDistinctAscList(combineEqxs) -where --- [combineEq xs] combines equal elements with [const] in an ordered list [xs] -combineEqxs' -=casexs'of -[]->[] -[x]->[x] -(x:xx)->combineEq'xxx - -combineEq'z[]=[z] -combineEq'z(x:xs') -|z==x=combineEq'zxs' -|otherwise=z:combineEq'xxs' - - --- | /O(n)/. Build a set from an ascending list of distinct elements in linear time. --- /The precondition (input list is strictly ascending) is not checked./ -fromDistinctAscList::USa=>[a]->USeta -fromDistinctAscListxs -=buildconst(lengthxs)xs -where --- 1) use continutations so that we use heap space instead of stack space. --- 2) special case for n==5 to build bushier trees. -buildc0xs'=ctipxs' -buildc5xs'=casexs'of -(x1:x2:x3:x4:x5:xx) -->c(bin_x4(bin_x2(singletonx1)(singletonx3))(singletonx5))xx -_->error"Data.Set.Unboxed.fromDistinctAscList build 5" -buildcnxs'=seqnr$build(buildRnrc)nlxs' -where -nl=n`div`2 -nr=n-nl-1 - -buildRncl(x:ys)=build(buildBlxc)nys -buildR___[]=error"Data.Set.Unboxed.fromDistinctAscList buildR []" -buildBlxcrzs=c(bin_xlr)zs - -{-------------------------------------------------------------------- - Eq converts the set to a list. In a lazy setting, this - actually seems one of the faster methods to compare two trees - and it is certainly the simplest :-) ---------------------------------------------------------------------} -instance(USa,Eqa)=>Eq(USeta)where -t1==t2=(sizet1==sizet2)&&(toAscListt1==toAscListt2) - -{-------------------------------------------------------------------- - Ord ---------------------------------------------------------------------} +{-------------------------------------------------------------------- + List variations +--------------------------------------------------------------------} +-- | /O(n)/. The elements of a set. +elems::USa=>USeta->[a] +elemsx=toListx + +{-------------------------------------------------------------------- + Lists +--------------------------------------------------------------------} +-- | /O(n)/. Convert the set to a list of elements. +toList::USa=>USeta->[a] +toListx=toAscListx + +-- | /O(n)/. Convert the set to an ascending list of elements. +toAscList::USa=>USeta->[a] +toAscList=foldr(:)[] + + +-- | /O(n*log n)/. Create a set from a list of elements. +fromList::(USa,Orda)=>[a]->USeta +fromList=foldlStrictinsempty +where +instx=insertxt + +{-------------------------------------------------------------------- + Building trees from ascending/descending lists can be done in linear time. + + Note that if [xs] is ascending that: + fromAscList xs == fromList xs +--------------------------------------------------------------------} +-- | /O(n)/. Build a set from an ascending list in linear time. +-- /The precondition (input list is ascending) is not checked./ +fromAscList::(USa,Eqa)=>[a]->USeta +fromAscListxs +=fromDistinctAscList(combineEqxs) +where +-- [combineEq xs] combines equal elements with [const] in an ordered list [xs] +combineEqxs' +=casexs'of +[]->[] +[x]->[x] +(x:xx)->combineEq'xxx + +combineEq'z[]=[z] +combineEq'z(x:xs') +|z==x=combineEq'zxs' +|otherwise=z:combineEq'xxs' + + +-- | /O(n)/. Build a set from an ascending list of distinct elements in linear time. +-- /The precondition (input list is strictly ascending) is not checked./ +fromDistinctAscList::USa=>[a]->USeta +fromDistinctAscListxs +=buildconst(lengthxs)xs +where +-- 1) use continutations so that we use heap space instead of stack space. +-- 2) special case for n==5 to build bushier trees. +buildc0xs'=ctipxs' +buildc5xs'=casexs'of +(x1:x2:x3:x4:x5:xx) +->c(bin_x4(bin_x2(singletonx1)(singletonx3))(singletonx5))xx +_->error"Data.Set.Unboxed.fromDistinctAscList build 5" +buildcnxs'=seqnr$build(buildRnrc)nlxs' +where +nl=n`div`2 +nr=n-nl-1 + +buildRncl(x:ys)=build(buildBlxc)nys +buildR___[]=error"Data.Set.Unboxed.fromDistinctAscList buildR []" +buildBlxcrzs=c(bin_xlr)zs + +{-------------------------------------------------------------------- + Eq converts the set to a list. In a lazy setting, this + actually seems one of the faster methods to compare two trees + and it is certainly the simplest :-) +--------------------------------------------------------------------} +instance(USa,Eqa)=>Eq(USeta)where +t1==t2=(sizet1==sizet2)&&(toAscListt1==toAscListt2) + +{-------------------------------------------------------------------- + Ord +--------------------------------------------------------------------} + +instance(USa,Orda)=>Ord(USeta)where +compares1s2=compare(toAscLists1)(toAscLists2) hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 536 -instance(USa,Orda)=>Ord(USeta)where -compares1s2=compare(toAscLists1)(toAscLists2) - -{-------------------------------------------------------------------- - Show ---------------------------------------------------------------------} -instance(USa,Showa)=>Show(USeta)where -showsPrecpxs=showParen(p>10)$ -showString"fromList ".shows(toListxs) - -{-------------------------------------------------------------------- - Read ---------------------------------------------------------------------} -instance(USa,Reada,Orda)=>Read(USeta)where -#ifdef __GLASGOW_HASKELL__ -readPrec=parens$prec10$do -Ident"fromList"<-lexP -fromList`fmap`readPrec - -readListPrec=readListPrecDefault -#else -readsPrecp=readParen(p>10)$\r->do -("fromList",s)<-lexr -(xs,t)<-readss -return(fromListxs,t) -#endif - -{-------------------------------------------------------------------- - Utility functions that return sub-ranges of the original - tree. Some functions take a comparison function as argument to - allow comparisons against infinite values. A function [cmplo x] - should be read as [compare lo x]. - - [trim cmplo cmphi t] A tree that is either empty or where [cmplo x == LT] - and [cmphi x == GT] for the value [x] of the root. - [filterGt cmp t] A tree where for all values [k]. [cmp k == LT] - [filterLt cmp t] A tree where for all values [k]. [cmp k == GT] - - [split k t] Returns two trees [l] and [r] where all values - in [l] are <[k] and all keys in [r] are >[k]. - [splitMember k t] Just like [split] but also returns whether [k] - was found in the tree. ---------------------------------------------------------------------} - -{-------------------------------------------------------------------- - [trim lo hi t] trims away all subtrees that surely contain no - values between the range [lo] to [hi]. The returned tree is either - empty or the key of the root is between @lo@ and @hi@. ---------------------------------------------------------------------} -trim::USa=>(a->Ordering)->(a->Ordering)->USeta->USeta -trimcmplocmphit@(view->Bin_xlr) -=casecmploxof -LT->casecmphixof -GT->t -_->trimcmplocmphil -_->trimcmplocmphir -trim___=tip - -{-------------------------------------------------------------------- - [filterGt x t] filter all values >[x] from tree [t] - [filterLt x t] filter all values <[x] from tree [t] ---------------------------------------------------------------------} -filterGt::USa=>(a->Ordering)->USeta->USeta -filterGtcmp(view->Bin_xlr) -=casecmpxof -LT->joinx(filterGtcmpl)r -GT->filterGtcmpr -EQ->r -filterGt__=tip - -filterLt::USa=>(a->Ordering)->USeta->USeta -filterLtcmp(view->Bin_xlr) -=casecmpxof -LT->filterLtcmpl -GT->joinxl(filterLtcmpr) -EQ->l -filterLt__=tip - - -{-------------------------------------------------------------------- - Split ---------------------------------------------------------------------} --- | /O(log n)/. The expression (@'split' x set@) is a pair @(set1,set2)@ --- where @set1@ comprises the elements of @set@ less than @x@ and @set2@ --- comprises the elements of @set@ greater than @x@. -split::(USa,Orda)=>a->USeta->(USeta,USeta) -splitx(view->Bin_ylr) -=casecomparexyof -LT->let(lt,gt)=splitxlin(lt,joinygtr) -GT->let(lt,gt)=splitxrin(joinyllt,gt) -EQ->(l,r) -split__=(tip,tip) - --- | /O(log n)/. Performs a 'split' but also returns whether the pivot --- element was found in the original set. -splitMember::(USa,Orda)=>a->USeta->(USeta,Bool,USeta) -splitMemberxt=let(l,m,r)=splitLookupxtin -(l,maybeFalse(constTrue)m,r) - --- | /O(log n)/. Performs a 'split' but also returns the pivot --- element that was found in the original set. -splitLookup::(USa,Orda)=>a->USeta->(USeta,Maybea,USeta) -splitLookupx(view->Bin_ylr) -=casecomparexyof -LT->let(lt,found,gt)=splitLookupxlin(lt,found,joinygtr) -GT->let(lt,found,gt)=splitLookupxrin(joinyllt,found,gt) -EQ->(l,Justy,r) -splitLookup__=(tip,Nothing,tip) - -{-------------------------------------------------------------------- - Utility functions that maintain the balance properties of the tree. - All constructors assume that all values in [l] < [x] and all values - in [r] > [x], and that [l] and [r] are valid trees. - - In order of sophistication: - [Bin sz x l r] The type constructor. - [bin_ x l r] Maintains the correct size, assumes that both [l] - and [r] are balanced with respect to each other. - [balance x l r] Restores the balance and size. - Assumes that the original tree was balanced and - that [l] or [r] has changed by at most one element. - [join x l r] Restores balance and size. - - Furthermore, we can construct a new tree from two trees. Both operations - assume that all values in [l] < all values in [r] and that [l] and [r] - are valid: - [glue l r] Glues [l] and [r] together. Assumes that [l] and - [r] are already balanced with respect to each other. - [merge l r] Merges two trees and restores balance. - - Note: in contrast to Adam's paper, we use (<=) comparisons instead - of (<) comparisons in [join], [merge] and [balance]. - Quickcheck (on [difference]) showed that this was necessary in order - to maintain the invariants. It is quite unsatisfactory that I haven't - been able to find out why this is actually the case! Fortunately, it - doesn't hurt to be a bit more conservative. ---------------------------------------------------------------------} - -{-------------------------------------------------------------------- - Join ---------------------------------------------------------------------} -join::USa=>a->USeta->USeta->USeta -joinx(null->True)r=insertMinxr -joinxl(null->True)=insertMaxxl -joinxl@(view->BinsizeLylyry)r@(view->BinsizeRzlzrz) -|delta*sizeL<=sizeR=balancez(joinxllz)rz -|delta*sizeR<=sizeL=balanceyly(joinxryr) -|otherwise=bin_xlr - - --- insertMin and insertMax don't perform potentially expensive comparisons. -insertMax,insertMin::USa=>a->USeta->USeta -insertMaxxt -=caseviewtof -Bin_ylr->balanceyl(insertMaxxr) -_->singletonx - -insertMinxt -=caseviewtof -Bin_ylr->balancey(insertMinxl)r -_->singletonx - -{-------------------------------------------------------------------- - [merge l r]: merges two trees. ---------------------------------------------------------------------} -merge::USa=>USeta->USeta->USeta -merge(null->True)r=r -mergel(null->True)=l -mergel@(view->BinsizeLxlxrx)r@(view->BinsizeRylyry) -|delta*sizeL<=sizeR=balancey(mergelly)ry -|delta*sizeR<=sizeL=balancexlx(mergerxr) -|otherwise=gluelr - -{-------------------------------------------------------------------- - [glue l r]: glues two trees together. - Assumes that [l] and [r] are already balanced with respect to each other. ---------------------------------------------------------------------} -glue::USa=>USeta->USeta->USeta -glue(null->True)r=r -gluel(null->True)=l -gluelr -|sizel>sizer=let(m,l')=deleteFindMaxlinbalanceml'r -|otherwise=let(m,r')=deleteFindMinrinbalancemlr' - - --- | /O(log n)/. Delete and find the minimal element. --- --- > deleteFindMin set = (findMin set, deleteMin set) - -deleteFindMin::USa=>USeta->(a,USeta) -deleteFindMint -=caseviewtof -Bin_x(null->True)r->(x,r) -Bin_xlr->let(xm,l')=deleteFindMinlin(xm,balancexl'r) -Tip->(error"Data.Set.Unboxed.deleteFindMin: can not return the minimal element of an empty set",tip) - --- | /O(log n)/. Delete and find the maximal element. --- --- > deleteFindMax set = (findMax set, deleteMax set) -deleteFindMax::USa=>USeta->(a,USeta) -deleteFindMaxt -=caseviewtof -Bin_xl(null->True)->(x,l) -Bin_xlr->let(xm,r')=deleteFindMaxrin(xm,balancexlr') -_->(error"Data.Set.Unboxed.deleteFindMax: can not return the maximal element of an empty set",tip) - --- | /O(log n)/. Retrieves the minimal key of the set, and the set --- stripped of that element, or 'Nothing' if passed an empty set. -minView::USa=>USeta->Maybe(a,USeta) -minView(null->True)=Nothing -minViewx=Just(deleteFindMinx) - --- | /O(log n)/. Retrieves the maximal key of the set, and the set --- stripped of that element, or 'Nothing' if passed an empty set. -maxView::USa=>USeta->Maybe(a,USeta) -maxView(null->True)=Nothing -maxViewx=Just(deleteFindMaxx) - -{-------------------------------------------------------------------- - [balance x l r] balances two trees with value x. - The sizes of the trees should balance after decreasing the - size of one of them. (a rotation). - - [delta] is the maximal relative difference between the sizes of - two trees, it corresponds with the [w] in Adams' paper, - or equivalently, [1/delta] corresponds with the $\alpha$ - in Nievergelt's paper. Adams shows that [delta] should - be larger than 3.745 in order to garantee that the - rotations can always restore balance. - - [ratio] is the ratio between an outer and inner sibling of the - heavier subtree in an unbalanced setting. It determines - whether a double or single rotation should be performed - to restore balance. It is correspondes with the inverse - of $\alpha$ in Adam's article. - - Note that: - - [delta] should be larger than 4.646 with a [ratio] of 2. - - [delta] should be larger than 3.745 with a [ratio] of 1.534. - - - A lower [delta] leads to a more 'perfectly' balanced tree. - - A higher [delta] performs less rebalancing. - - - Balancing is automatic for random data and a balancing - scheme is only necessary to avoid pathological worst cases. - Almost any choice will do in practice - - - Allthough it seems that a rather large [delta] may perform better - than smaller one, measurements have shown that the smallest [delta] - of 4 is actually the fastest on a wide range of operations. It - especially improves performance on worst-case scenarios like - a sequence of ordered insertions. - - Note: in contrast to Adams' paper, we use a ratio of (at least) 2 - to decide whether a single or double rotation is needed. Allthough - he actually proves that this ratio is needed to maintain the - invariants, his implementation uses a (invalid) ratio of 1. - He is aware of the problem though since he has put a comment in his - original source code that he doesn't care about generating a - slightly inbalanced tree since it doesn't seem to matter in practice. - However (since we use quickcheck :-) we will stick to strictly balanced - trees. ---------------------------------------------------------------------} -delta,ratio::Int -delta=4 -ratio=2 - - - -{-------------------------------------------------------------------- - Utilities ---------------------------------------------------------------------} -foldlStrict::(a->b->a)->a->[b]->a -foldlStrictfzxs -=casexsof -[]->z -(x:xx)->letz'=fzxinseqz'(foldlStrictfz'xx) - - -{-------------------------------------------------------------------- - Debugging ---------------------------------------------------------------------} --- | /O(n)/. Show the tree that implements the set. The tree is shown --- in a compressed, hanging format. -showTree::(USa,Showa)=>USeta->String -showTrees -=showTreeWithTrueFalses - - -{- | /O(n)/. The expression (@showTreeWith hang wide map@) shows - the tree that implements the set. If @hang@ is - @True@, a /hanging/ tree is shown otherwise a rotated tree is shown. If - @wide@ is 'True', an extra wide version is shown. - -> Set> putStrLn $ showTreeWith True False $ fromDistinctAscList [1..5] -> 4 -> +--2 -> | +--1 -> | +--3 -> +--5 -> -> Set> putStrLn $ showTreeWith True True $ fromDistinctAscList [1..5] -> 4 -> | -> +--2 -> | | -> | +--1 -> | | -> | +--3 -> | +{-------------------------------------------------------------------- + Show +--------------------------------------------------------------------} +instance (US a, Show a) => Show (USet a) where + showsPrec p xs = showParen (p > 10) $ + showString "fromList " . shows (toList xs) + +{-------------------------------------------------------------------- + Read +--------------------------------------------------------------------} +instance (US a, Read a, Ord a) => Read (USet a) where +#ifdef __GLASGOW_HASKELL__ + readPrec = parens $ prec 10 $ do + Ident "fromList" <- lexP + fromList `fmap` readPrec + + readListPrec = readListPrecDefault +#else + readsPrec p = readParen (p > 10) $ \ r -> do + ("fromList",s) <- lex r + (xs,t) <- reads s + return (fromList xs,t) +#endif + +{-------------------------------------------------------------------- + Utility functions that return sub-ranges of the original + tree. Some functions take a comparison function as argument to + allow comparisons against infinite values. A function [cmplo x] + should be read as [compare lo x]. + + [trim cmplo cmphi t] A tree that is either empty or where [cmplo x == LT] + and [cmphi x == GT] for the value [x] of the root. + [filterGt cmp t] A tree where for all values [k]. [cmp k == LT] + [filterLt cmp t] A tree where for all values [k]. [cmp k == GT] + + [split k t] Returns two trees [l] and [r] where all values + in [l] are <[k] and all keys in [r] are >[k]. + [splitMember k t] Just like [split] but also returns whether [k] + was found in the tree. +--------------------------------------------------------------------} + +{-------------------------------------------------------------------- + [trim lo hi t] trims away all subtrees that surely contain no + values between the range [lo] to [hi]. The returned tree is either + empty or the key of the root is between @lo@ and @hi@. +--------------------------------------------------------------------} +trim :: US a => (a -> Ordering) -> (a -> Ordering) -> USet a -> USet a +trim cmplo cmphi t@(view -> Bin _ x l r) + = case cmplo x of + LT -> case cmphi x of + GT -> t + _ -> trim cmplo cmphi l + _ -> trim cmplo cmphi r +trim _ _ _ = tip + +{-------------------------------------------------------------------- + [filterGt x t] filter all values >[x] from tree [t] + [filterLt x t] filter all values <[x] from tree [t] +--------------------------------------------------------------------} +filterGt :: US a => (a -> Ordering) -> USet a -> USet a +filterGt cmp (view -> Bin _ x l r) + = case cmp x of + LT -> join x (filterGt cmp l) r + GT -> filterGt cmp r + EQ -> r +filterGt _ _ = tip + +filterLt :: US a => (a -> Ordering) -> USet a -> USet a +filterLt cmp (view -> Bin _ x l r) + = case cmp x of + LT -> filterLt cmp l + GT -> join x l (filterLt cmp r) + EQ -> l +filterLt _ _ = tip + + +{-------------------------------------------------------------------- + Split +--------------------------------------------------------------------} +-- | /O(log n)/. The expression (@'split' x set@) is a pair @(set1,set2)@ +-- where @set1@ comprises the elements of @set@ less than @x@ and @set2@ +-- comprises the elements of @set@ greater than @x@. +split :: (US a, Ord a) => a -> USet a -> (USet a,USet a) +split x (view -> Bin _ y l r) + = case compare x y of + LT -> let (lt,gt) = split x l in (lt,join y gt r) + GT -> let (lt,gt) = split x r in (join y l lt,gt) + EQ -> (l,r) +split _ _ = (tip,tip) + +-- | /O(log n)/. Performs a 'split' but also returns whether the pivot +-- element was found in the original set. +splitMember :: (US a, Ord a) => a -> USet a -> (USet a,Bool,USet a) +splitMember x t = let (l,m,r) = splitLookup x t in + (l,maybe False (const True) m,r) + +-- | /O(log n)/. Performs a 'split' but also returns the pivot +-- element that was found in the original set. +splitLookup :: (US a, Ord a) => a -> USet a -> (USet a,Maybe a,USet a) +splitLookup x (view -> Bin _ y l r) + = case compare x y of + LT -> let (lt,found,gt) = splitLookup x l in (lt,found,join y gt r) + GT -> let (lt,found,gt) = splitLookup x r in (join y l lt,found,gt) + EQ -> (l,Just y,r) +splitLookup _ _ = (tip,Nothing,tip) + +{-------------------------------------------------------------------- + Utility functions that maintain the balance properties of the tree. + All constructors assume that all values in [l] < [x] and all values + in [r] > [x], and that [l] and [r] are valid trees. + + In order of sophistication: + [Bin sz x l r] The type constructor. + [bin_ x l r] Maintains the correct size, assumes that both [l] + and [r] are balanced with respect to each other. + [balance x l r] Restores the balance and size. + Assumes that the original tree was balanced and + that [l] or [r] has changed by at most one element. + [join x l r] Restores balance and size. + + Furthermore, we can construct a new tree from two trees. Both operations + assume that all values in [l] < all values in [r] and that [l] and [r] + are valid: + [glue l r] Glues [l] and [r] together. Assumes that [l] and + [r] are already balanced with respect to each other. + [merge l r] Merges two trees and restores balance. + + Note: in contrast to Adam's paper, we use (<=) comparisons instead + of (<) comparisons in [join], [merge] and [balance]. + Quickcheck (on [difference]) showed that this was necessary in order + to maintain the invariants. It is quite unsatisfactory that I haven't + been able to find out why this is actually the case! Fortunately, it + doesn't hurt to be a bit more conservative. +--------------------------------------------------------------------} + +{-------------------------------------------------------------------- + Join +--------------------------------------------------------------------} +join :: US a => a -> USet a -> USet a -> USet a +join x (null -> True) r = insertMin x r +join x l (null -> True) = insertMax x l +join x l@(view -> Bin sizeL y ly ry) r@(view -> Bin sizeR z lz rz) + | delta*sizeL <= sizeR = balance z (join x l lz) rz + | delta*sizeR <= sizeL = balance y ly (join x ry r) + | otherwise = bin_ x l r + + +-- insertMin and insertMax don't perform potentially expensive comparisons. +insertMax,insertMin :: US a => a -> USet a -> USet a +insertMax x t + = case view t of + Bin _ y l r -> balance y l (insertMax x r) + _ -> singleton x + +insertMin x t + = case view t of + Bin _ y l r -> balance y (insertMin x l) r + _ -> singleton x + +{-------------------------------------------------------------------- + [merge l r]: merges two trees. +--------------------------------------------------------------------} +merge :: US a => USet a -> USet a -> USet a +merge (null -> True) r = r +merge l (null -> True) = l +merge l@(view -> Bin sizeL x lx rx) r@(view -> Bin sizeR y ly ry) + | delta*sizeL <= sizeR = balance y (merge l ly) ry + | delta*sizeR <= sizeL = balance x lx (merge rx r) + | otherwise = glue l r + +{-------------------------------------------------------------------- + [glue l r]: glues two trees together. + Assumes that [l] and [r] are already balanced with respect to each other. +--------------------------------------------------------------------} +glue :: US a => USet a -> USet a -> USet a +glue (null -> True) r = r +glue l (null -> True) = l +glue l r + | size l > size r = let (m,l') = deleteFindMax l in balance m l' r + | otherwise = let (m,r') = deleteFindMin r in balance m l r' + + +-- | /O(log n)/. Delete and find the minimal element. +-- +-- > deleteFindMin set = (findMin set, deleteMin set) + +deleteFindMin :: US a => USet a -> (a,USet a) +deleteFindMin t + = case view t of + Bin _ x (null -> True) r -> (x,r) + Bin _ x l r -> let (xm,l') = deleteFindMin l in (xm,balance x l' r) + Tip -> (error "Data.Set.Unboxed.deleteFindMin: can not return the minimal element of an empty set", tip) + +-- | /O(log n)/. Delete and find the maximal element. +-- +-- > deleteFindMax set = (findMax set, deleteMax set) +deleteFindMax :: US a => USet a -> (a,USet a) +deleteFindMax t + = case view t of + Bin _ x l (null -> True) -> (x,l) + Bin _ x l r -> let (xm,r') = deleteFindMax r in (xm,balance x l r') + _ -> (error "Data.Set.Unboxed.deleteFindMax: can not return the maximal element of an empty set", tip) + +-- | /O(log n)/. Retrieves the minimal key of the set, and the set +-- stripped of that element, or 'Nothing' if passed an empty set. +minView :: US a => USet a -> Maybe (a, USet a) +minView (null -> True) = Nothing +minView x = Just (deleteFindMin x) + +-- | /O(log n)/. Retrieves the maximal key of the set, and the set +-- stripped of that element, or 'Nothing' if passed an empty set. +maxView :: US a => USet a -> Maybe (a, USet a) +maxView (null -> True) = Nothing +maxView x = Just (deleteFindMax x) + +{-------------------------------------------------------------------- + [balance x l r] balances two trees with value x. + The sizes of the trees should balance after decreasing the + size of one of them. (a rotation). + + [delta] is the maximal relative difference between the sizes of + two trees, it corresponds with the [w] in Adams' paper, + or equivalently, [1/delta] corresponds with the $\alpha$ + in Nievergelt's paper. Adams shows that [delta] should + be larger than 3.745 in order to garantee that the + rotations can always restore balance. + + [ratio] is the ratio between an outer and inner sibling of the + heavier subtree in an unbalanced setting. It determines + whether a double or single rotation should be performed + to restore balance. It is correspondes with the inverse + of $\alpha$ in Adam's article. + + Note that: + - [delta] should be larger than 4.646 with a [ratio] of 2. + - [delta] should be larger than 3.745 with a [ratio] of 1.534. + + - A lower [delta] leads to a more 'perfectly' balanced tree. + - A higher [delta] performs less rebalancing. + + - Balancing is automatic for random data and a balancing + scheme is only necessary to avoid pathological worst cases. + Almost any choice will do in practice + + - Allthough it seems that a rather large [delta] may perform better + than smaller one, measurements have shown that the smallest [delta] + of 4 is actually the fastest on a wide range of operations. It + especially improves performance on worst-case scenarios like + a sequence of ordered insertions. + + Note: in contrast to Adams' paper, we use a ratio of (at least) 2 + to decide whether a single or double rotation is needed. Allthough + he actually proves that this ratio is needed to maintain the + invariants, his implementation uses a (invalid) ratio of 1. + He is aware of the problem though since he has put a comment in his + original source code that he doesn't care about generating a + slightly inbalanced tree since it doesn't seem to matter in practice. + However (since we use quickcheck :-) we will stick to strictly balanced + trees. +--------------------------------------------------------------------} +delta,ratio :: Int +delta = 4 +ratio = 2 + + + +{-------------------------------------------------------------------- + Utilities +--------------------------------------------------------------------} +foldlStrict :: (a -> b -> a) -> a -> [b] -> a +foldlStrict f z xs + = case xs of + [] -> z + (x:xx) -> let z' = f z x in seq z' (foldlStrict f z' xx) + + +{-------------------------------------------------------------------- + Debugging +--------------------------------------------------------------------} +-- | /O(n)/. Show the tree that implements the set. The tree is shown +-- in a compressed, hanging format. +showTree :: (US a, Show a) => USet a -> String +showTree s + = showTreeWith True False s + + +{- | /O(n)/. The expression (@showTreeWith hang wide map@) shows + the tree that implements the set. If @hang@ is + @True@, a /hanging/ tree is shown otherwise a rotated tree is shown. If + @wide@ is 'True', an extra wide version is shown. + +> Set> putStrLn $ showTreeWith True False $ fromDistinctAscList [1..5] +> 4 +> +--2 +> | +--1 +> | +--3 +> +--5 +> +> Set> putStrLn $ showTreeWith True True $ fromDistinctAscList [1..5] +> 4 +> | +> +--2 +> | | +> | +--1 +> | | +> | +--3 +> | +> +--5 +> +> Set> putStrLn $ showTreeWith False True $ fromDistinctAscList [1..5] hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 847 -> -> Set> putStrLn $ showTreeWith False True $ fromDistinctAscList [1..5] -> +--5 -> | -> 4 -> | -> | +--3 -> | | -> +--2 -> | -> +--1 - --} -showTreeWith :: (US a, Show a) => Bool -> Bool -> USet a -> String -showTreeWith hang wide t - | hang = (showsTreeHang wide [] t) "" - | otherwise = (showsTree wide [] [] t) "" - -showsTree :: (US a, Show a) => Bool -> [String] -> [String] -> USet a -> ShowS -showsTree wide lbars rbars t - = case view t of - Tip -> showsBars lbars . showString "|\n" - Bin _ x (null -> True) (null -> True) - -> showsBars lbars . shows x . showString "\n" - Bin _ x l r - -> showsTree wide (withBar rbars) (withEmpty rbars) r . - showWide wide rbars . - showsBars lbars . shows x . showString "\n" . - showWide wide lbars . - showsTree wide (withEmpty lbars) (withBar lbars) l - -showsTreeHang :: (US a, Show a) => Bool -> [String] -> USet a -> ShowS -showsTreeHang wide bars t - = case view t of - Tip -> showsBars bars . showString "|\n" - Bin _ x (null -> True) (null -> True) - -> showsBars bars . shows x . showString "\n" - Bin _ x l r - -> showsBars bars . shows x . showString "\n" . - showWide wide bars . - showsTreeHang wide (withBar bars) l . - showWide wide bars . - showsTreeHang wide (withEmpty bars) r - -showWide :: Bool -> [String] -> String -> String -showWide wide bars - | wide = showString (concat (reverse bars)) . showString "|\n" - | otherwise = id - -showsBars :: [String] -> ShowS -showsBars bars - = case bars of - [] -> id - _ -> showString (concat (reverse (tail bars))) . showString node +> | +> 4 +> | +> | +--3 +> | | +> +--2 +> | +> +--1 + +-} +showTreeWith::(USa,Showa)=>Bool->Bool->USeta->String +showTreeWithhangwidet +|hang=(showsTreeHangwide[]t)"" +|otherwise=(showsTreewide[][]t)"" + +showsTree::(USa,Showa)=>Bool->[String]->[String]->USeta->ShowS +showsTreewidelbarsrbarst +=caseviewtof +Tip->showsBarslbars.showString"|\n" +Bin_x(null->True)(null->True) +->showsBarslbars.showsx.showString"\n" +Bin_xlr +->showsTreewide(withBarrbars)(withEmptyrbars)r. +showWidewiderbars. +showsBarslbars.showsx.showString"\n". +showWidewidelbars. +showsTreewide(withEmptylbars)(withBarlbars)l + +showsTreeHang::(USa,Showa)=>Bool->[String]->USeta->ShowS +showsTreeHangwidebarst +=caseviewtof +Tip->showsBarsbars.showString"|\n" +Bin_x(null->True)(null->True) +->showsBarsbars.showsx.showString"\n" +Bin_xlr +->showsBarsbars.showsx.showString"\n". +showWidewidebars. +showsTreeHangwide(withBarbars)l. +showWidewidebars. +showsTreeHangwide(withEmptybars)r + +showWide::Bool->[String]->String->String +showWidewidebars +|wide=showString(concat(reversebars)).showString"|\n" +|otherwise=id + +showsBars::[String]->ShowS +showsBarsbars +=casebarsof +[]->id +_->showString(concat(reverse(tailbars))).showStringnode + +node::String +node="+--" hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 902 -node::String -node="+--" - -withBar,withEmpty::[String]->[String] -withBarbars="| ":bars -withEmptybars=" ":bars - -{-------------------------------------------------------------------- - Assertions ---------------------------------------------------------------------} --- | /O(n)/. Test if the internal set structure is valid. -valid::(USa,Orda)=>USeta->Bool -validt -=balancedt&&orderedt&&validsizet - -ordered::(USa,Orda)=>USeta->Bool -orderedt -=bounded(constTrue)(constTrue)t -where -boundedlohit' -=caseviewt'of -Bin_xlr->(lox)&&(hix)&&boundedlo(<x)l&&bounded(>x)hir -_->True - -balanced::USa=>USeta->Bool -balancedt -=caseviewtof -Bin__lr->(sizel+sizer<=1||(sizel<=delta*sizer&&sizer<=delta*sizel))&& -balancedl&&balancedr -_->True - -validsize::USa=>USeta->Bool -validsizet -=(realsizet==Just(sizet)) -where -realsizet' -=caseviewt'of -Binsz_lr->case(realsizel,realsizer)of -(Justn,Justm)|n+m+1==sz->Justsz -_->Nothing -_->Just0 - -{- -{-------------------------------------------------------------------- - Testing ---------------------------------------------------------------------} -testTree :: [Int] -> USet Int -testTree xs = fromList xs -test1 = testTree [1..20] -test2 = testTree [30,29..10] -test3 = testTree [1,4,6,89,2323,53,43,234,5,79,12,9,24,9,8,423,8,42,4,8,9,3] - -{-------------------------------------------------------------------- - QuickCheck ---------------------------------------------------------------------} - -{- -qcheck prop - = check config prop - where - config = Config - { configMaxTest = 500 - , configMaxFail = 5000 - , configSize = \n -> (div n 2 + 3) - , configEvery = \n args -> let s = show n in s ++ [ '\b' | _ <- s ] - } --} - - -{-------------------------------------------------------------------- - Arbitrary, reasonably balanced trees ---------------------------------------------------------------------} -instance (US a, Enum a) => Arbitrary (USet a) where - arbitrary = sized (arbtree 0 maxkey) - where maxkey = 10000 - -arbtree :: (US a, Enum a) => Int -> Int -> Int -> Gen (USet a) -arbtree lo hi n - | n <= 0 = return tip - | lo >= hi = return tip - | otherwise = do{ i <- choose (lo,hi) - ; m <- choose (1,30) - ; let (ml,mr) | m==(1::Int)= (1,2) - | m==2 = (2,1) - | m==3 = (1,1) - | otherwise = (2,2) - ; l <- arbtree lo (i-1) (n `div` ml) - ; r <- arbtree (i+1) hi (n `div` mr) - ; return (bin_ (toEnum i) l r) - } - - -{-------------------------------------------------------------------- - Valid tree's ---------------------------------------------------------------------} -forValid :: (US a, Enum a,Show a,Testable b) => (USet a -> b) -> Property -forValid f - = forAll arbitrary $ \t -> --- classify (balanced t) "balanced" $ - classify (size t == 0) "empty" $ - classify (size t > 0 && size t <= 10) "small" $ - classify (size t > 10 && size t <= 64) "medium" $ - classify (size t > 64) "large" $ - balanced t ==> f t - -forValidIntTree :: Testable a => (USet Int -> a) -> Property -forValidIntTree f - = forValid f - -forValidUnitTree :: Testable a => (USet Int -> a) -> Property -forValidUnitTree f - = forValid f - +withBar, withEmpty :: [String] -> [String] +withBar bars = "| ":bars +withEmpty bars = " ":bars + +{-------------------------------------------------------------------- + Assertions +--------------------------------------------------------------------} +-- | /O(n)/. Test if the internal set structure is valid. +valid :: (US a, Ord a) => USet a -> Bool +valid t + = balanced t && ordered t && validsize t + +ordered :: (US a, Ord a) => USet a -> Bool +ordered t + = bounded (const True) (const True) t + where + bounded lo hi t' + = case view t' of + Bin _ x l r -> (lo x) && (hi x) && bounded lo (<x) l && bounded (>x) hi r + _ -> True + +balanced :: US a => USet a -> Bool +balanced t + = case view t of + Bin _ _ l r -> (size l + size r <= 1 || (size l <= delta*size r && size r <= delta*size l)) && + balanced l && balanced r + _ -> True + +validsize :: US a => USet a -> Bool +validsize t + = (realsize t == Just (size t)) + where + realsize t' + = case view t' of + Bin sz _ l r -> case (realsize l,realsize r) of + (Just n,Just m) | n+m+1 == sz -> Just sz + _ -> Nothing + _ -> Just 0 + +{- +{-------------------------------------------------------------------- + Testing +--------------------------------------------------------------------} +testTree :: [Int] -> USet Int +testTree xs = fromList xs +test1 = testTree [1..20] +test2 = testTree [30,29..10] +test3 = testTree [1,4,6,89,2323,53,43,234,5,79,12,9,24,9,8,423,8,42,4,8,9,3] + +{-------------------------------------------------------------------- + QuickCheck +--------------------------------------------------------------------} + +{- +qcheck prop + = check config prop + where + config = Config + { configMaxTest = 500 + , configMaxFail = 5000 + , configSize = \n -> (div n 2 + 3) + , configEvery = \n args -> let s = show n in s ++ [ '\b' | _ <- s ] + } +-} + + +{-------------------------------------------------------------------- + Arbitrary, reasonably balanced trees +--------------------------------------------------------------------} +instance (US a, Enum a) => Arbitrary (USet a) where + arbitrary = sized (arbtree 0 maxkey) + where maxkey = 10000 + +arbtree :: (US a, Enum a) => Int -> Int -> Int -> Gen (USet a) +arbtree lo hi n + | n <= 0 = return tip + | lo >= hi = return tip + | otherwise = do{ i <- choose (lo,hi) + ; m <- choose (1,30) + ; let (ml,mr) | m==(1::Int)= (1,2) + | m==2 = (2,1) + | m==3 = (1,1) + | otherwise = (2,2) + ; l <- arbtree lo (i-1) (n `div` ml) + ; r <- arbtree (i+1) hi (n `div` mr) + ; return (bin_ (toEnum i) l r) + } + + +{-------------------------------------------------------------------- + Valid tree's +--------------------------------------------------------------------} +forValid :: (US a, Enum a,Show a,Testable b) => (USet a -> b) -> Property +forValid f + = forAll arbitrary $ \t -> +-- classify (balanced t) "balanced" $ + classify (size t == 0) "empty" $ + classify (size t > 0 && size t <= 10) "small" $ + classify (size t > 10 && size t <= 64) "medium" $ + classify (size t > 64) "large" $ + balanced t ==> f t + +forValidIntTree :: Testable a => (USet Int -> a) -> Property +forValidIntTree f + = forValid f + +forValidUnitTree :: Testable a => (USet Int -> a) -> Property +forValidUnitTree f + = forValid f + + +prop_Valid + = forValidUnitTree $ \t -> valid t hunk ./doc/html/unboxed-containers/src/Data-Set-Unboxed.html 1016 -prop_Valid - = forValidUnitTree $ \t -> valid t - -{-------------------------------------------------------------------- - Single, Insert, Delete ---------------------------------------------------------------------} -prop_Single :: Int -> Bool -prop_Single x - = (insert x empty == singleton x) - -prop_InsertValid :: Int -> Property -prop_InsertValid k - = forValidUnitTree $ \t -> valid (insert k t) - -prop_InsertDelete :: Int -> USet Int -> Property -prop_InsertDelete k t - = not (member k t) ==> delete k (insert k t) == t - -prop_DeleteValid :: Int -> Property -prop_DeleteValid k - = forValidUnitTree $ \t -> - valid (delete k (insert k t)) - -{-------------------------------------------------------------------- - Balance ---------------------------------------------------------------------} -prop_Join :: Int -> Property -prop_Join x - = forValidUnitTree $ \t -> - let (l,r) = split x t - in valid (join x l r) - -prop_Merge :: Int -> Property -prop_Merge x - = forValidUnitTree $ \t -> - let (l,r) = split x t - in valid (merge l r) - - -{-------------------------------------------------------------------- - Union ---------------------------------------------------------------------} -prop_UnionValid :: Property -prop_UnionValid - = forValidUnitTree $ \t1 -> - forValidUnitTree $ \t2 -> - valid (union t1 t2) - -prop_UnionInsert :: Int -> USet Int -> Bool -prop_UnionInsert x t - = union t (singleton x) == insert x t - -prop_UnionAssoc :: USet Int -> USet Int -> USet Int -> Bool -prop_UnionAssoc t1 t2 t3 - = union t1 (union t2 t3) == union (union t1 t2) t3 - -prop_UnionComm :: USet Int -> USet Int -> Bool -prop_UnionComm t1 t2 - = (union t1 t2 == union t2 t1) - - -prop_DiffValid - = forValidUnitTree $ \t1 -> - forValidUnitTree $ \t2 -> - valid (difference t1 t2) - -prop_Diff :: [Int] -> [Int] -> Bool -prop_Diff xs ys - = toAscList (difference (fromList xs) (fromList ys)) - == List.sort ((List.\\) (nub xs) (nub ys)) - -prop_IntValid - = forValidUnitTree $ \t1 -> - forValidUnitTree $ \t2 -> - valid (intersection t1 t2) - -prop_Int :: [Int] -> [Int] -> Bool -prop_Int xs ys - = toAscList (intersection (fromList xs) (fromList ys)) - == List.sort (nub ((List.intersect) (xs) (ys))) - -{-------------------------------------------------------------------- - Lists ---------------------------------------------------------------------} -prop_Ordered - = forAll (choose (5,100)) $ \n -> - let xs = [0..n::Int] - in fromAscList xs == fromList xs - -prop_List :: [Int] -> Bool -prop_List xs - = (sort (nub xs) == toList (fromList xs)) --} - --- | /O(log n)/. Insert an element in a set. --- If the set already contains an element equal to the given value, --- it is replaced with the new value. -insert :: (US a, Ord a) => a -> USet a -> USet a -insert x = go where - cmpx = compare x - go = viewk (singleton x) $ \sz y l r -> case cmpx y of - LT -> balance y (go l) r - GT -> balance y l (go r) - EQ -> bin sz x l r -{- -{-# SPECIALIZE INLINE insert :: Int -> USet Int -> USet Int #-} -{-# SPECIALIZE INLINE insert :: Integer -> USet Integer -> USet Integer #-} -{-# SPECIALIZE INLINE insert :: Char -> USet Char -> USet Char #-} -{-# SPECIALIZE INLINE insert :: Int8 -> USet Int8 -> USet Int8 #-} -{-# SPECIALIZE INLINE insert :: Int16 -> USet Int16 -> USet Int16 #-} -{-# SPECIALIZE INLINE insert :: Int32 -> USet Int32 -> USet Int32 #-} -{-# SPECIALIZE INLINE insert :: Int64 -> USet Int64 -> USet Int64 #-} -{-# SPECIALIZE INLINE insert :: Word8 -> USet Word8 -> USet Word8 #-} -{-# SPECIALIZE INLINE insert :: Word16 -> USet Word16 -> USet Word16 #-} -{-# SPECIALIZE INLINE insert :: Word32 -> USet Word32 -> USet Word32 #-} -{-# SPECIALIZE INLINE insert :: Word64 -> USet Word64 -> USet Word64 #-} -{-# SPECIALIZE INLINE insert :: Double -> USet Double -> USet Double #-} -{-# SPECIALIZE INLINE insert :: Float -> USet Float -> USet Float #-} -{-# SPECIALIZE INLINE insert :: (Int,Int)-> USet (Int,Int) -> USet (Int,Int) #-} --} - -bin_ :: US a => a -> USet a -> USet a -> USet a -bin_ x l r = bin (size l + size r + 1) x l r -{- -{-# SPECIALIZE INLINE bin_ :: Int -> USet Int -> USet Int -> USet Int #-} -{-# SPECIALIZE INLINE bin_ :: Integer -> USet Integer -> USet Integer -> USet Integer #-} -{-# SPECIALIZE INLINE bin_ :: Char -> USet Char -> USet Char -> USet Char #-} -{-# SPECIALIZE INLINE bin_ :: Int8 -> USet Int8 -> USet Int8 -> USet Int8 #-} -{-# SPECIALIZE INLINE bin_ :: Int16 -> USet Int16 -> USet Int16 -> USet Int16 #-} -{-# SPECIALIZE INLINE bin_ :: Int32 -> USet Int32 -> USet Int32 -> USet Int32 #-} -{-# SPECIALIZE INLINE bin_ :: Int64 -> USet Int64 -> USet Int64 -> USet Int64 #-} -{-# SPECIALIZE INLINE bin_ :: Word8 -> USet Word8 -> USet Word8 -> USet Word8 #-} -{-# SPECIALIZE INLINE bin_ :: Word16 -> USet Word16 -> USet Word16 -> USet Word16 #-} -{-# SPECIALIZE INLINE bin_ :: Word32 -> USet Word32 -> USet Word32 -> USet Word32 #-} -{-# SPECIALIZE INLINE bin_ :: Word64 -> USet Word64 -> USet Word64 -> USet Word64 #-} -{-# SPECIALIZE INLINE bin_ :: Double -> USet Double -> USet Double -> USet Double #-} -{-# SPECIALIZE INLINE bin_ :: Float -> USet Float -> USet Float -> USet Float #-} -{-# SPECIALIZE INLINE bin_ :: (Int,Int)-> USet (Int,Int) -> USet (Int,Int) -> USet (Int,Int) #-} --} - -newtype Boxed a = Boxed a deriving (Eq,Ord,Show,Read,Bounded) - -{-- everything below this point AUTOMATICALLY GENERATED by instances.pl. Don't edit by hand! --} - -instance US Int where - data USet Int = IntTip | IntBin {-# UNPACK #-} !Size {-# UNPACK #-} !Int !(USet Int) !(USet Int) - view IntTip = Tip - view (IntBin s i l r) = Bin s i l r - tip = IntTip - bin = IntBin - -instance US Char where - data USet Char = CharTip | CharBin {-# UNPACK #-} !Size {-# UNPACK #-} !Char !(USet Char) !(USet Char) - view CharTip = Tip - view (CharBin s i l r) = Bin s i l r - tip = CharTip - bin = CharBin - -instance US Int8 where - data USet Int8 = Int8Tip | Int8Bin {-# UNPACK #-} !Size {-# UNPACK #-} !Int8 !(USet Int8) !(USet Int8) - view Int8Tip = Tip - view (Int8Bin s i l r) = Bin s i l r - tip = Int8Tip - bin = Int8Bin - -instance US Int16 where - data USet Int16 = Int16Tip | Int16Bin {-# UNPACK #-} !Size {-# UNPACK #-} !Int16 !(USet Int16) !(USet Int16) - view Int16Tip = Tip - view (Int16Bin s i l r) = Bin s i l r - tip = Int16Tip - bin = Int16Bin - -instance US Int32 where - data USet Int32 = Int32Tip | Int32Bin {-# UNPACK #-} !Size {-# UNPACK #-} !Int32 !(USet Int32) !(USet Int32) - view Int32Tip = Tip - view (Int32Bin s i l r) = Bin s i l r - tip = Int32Tip - bin = Int32Bin - -instance US Int64 where - data USet Int64 = Int64Tip | Int64Bin {-# UNPACK #-} !Size {-# UNPACK #-} !Int64 !(USet Int64) !(USet Int64) - view Int64Tip = Tip - view (Int64Bin s i l r) = Bin s i l r - tip = Int64Tip - bin = Int64Bin - -instance US Word8 where - data USet Word8 = Word8Tip | Word8Bin {-# UNPACK #-} !Size {-# UNPACK #-} !Word8 !(USet Word8) !(USet Word8) - view Word8Tip = Tip - view (Word8Bin s i l r) = Bin s i l r - tip = Word8Tip - bin = Word8Bin - -instance US Word16 where - data USet Word16 = Word16Tip | Word16Bin {-# UNPACK #-} !Size {-# UNPACK #-} !Word16 !(USet Word16) !(USet Word16) - view Word16Tip = Tip - view (Word16Bin s i l r) = Bin s i l r - tip = Word16Tip - bin = Word16Bin - -instance US Word32 where - data USet Word32 = Word32Tip | Word32Bin {-# UNPACK #-} !Size {-# UNPACK #-} !Word32 !(USet Word32) !(USet Word32) - view Word32Tip = Tip - view (Word32Bin s i l r) = Bin s i l r - tip = Word32Tip - bin = Word32Bin - -instance US Word64 where - data USet Word64 = Word64Tip | Word64Bin {-# UNPACK #-} !Size {-# UNPACK #-} !Word64 !(USet Word64) !(USet Word64) - view Word64Tip = Tip - view (Word64Bin s i l r) = Bin s i l r - tip = Word64Tip - bin = Word64Bin - -instance US Double where - data USet Double = DoubleTip | DoubleBin {-# UNPACK #-} !Size {-# UNPACK #-} !Double !(USet Double) !(USet Double) - view DoubleTip = Tip - view (DoubleBin s i l r) = Bin s i l r - tip = DoubleTip - bin = DoubleBin - -instance US Float where - data USet Float = FloatTip | FloatBin {-# UNPACK #-} !Size {-# UNPACK #-} !Float !(USet Float) !(USet Float) - view FloatTip = Tip - view (FloatBin s i l r) = Bin s i l r - tip = FloatTip - bin = FloatBin - -instance US Integer where - data USet Integer = IntegerTip | IntegerBin {-# UNPACK #-} !Size {-# UNPACK #-} !Integer !(USet Integer) !(USet Integer) - view IntegerTip = Tip - view (IntegerBin s i l r) = Bin s i l r - tip = IntegerTip - bin = IntegerBin - -instance US (Boxed a) where - data USet (Boxed a) = BoxedTip | BoxedBin {-# UNPACK #-} !Size (Boxed a) !(USet (Boxed a)) !(USet (Boxed a)) - view BoxedTip = Tip - view (BoxedBin s i l r) = Bin s i l r - tip = BoxedTip - bin = BoxedBin - +{-------------------------------------------------------------------- + Single, Insert, Delete +--------------------------------------------------------------------} +prop_Single :: Int -> Bool +prop_Single x + = (insert x empty == singleton x) + +prop_InsertValid :: Int -> Property +prop_InsertValid k + = forValidUnitTree $ \t -> valid (insert k t) + +prop_InsertDelete :: Int -> USet Int -> Property +prop_InsertDelete k t + = not (member k t) ==> delete k (insert k t) == t + +prop_DeleteValid :: Int -> Property +prop_DeleteValid k + = forValidUnitTree $ \t -> + valid (delete k (insert k t)) + +{-------------------------------------------------------------------- + Balance +--------------------------------------------------------------------} +prop_Join :: Int -> Property +prop_Join x + = forValidUnitTree $ \t -> + let (l,r) = split x t + in valid (join x l r) + +prop_Merge :: Int -> Property +prop_Merge x + = forValidUnitTree $ \t -> + let (l,r) = split x t + in valid (merge l r) + + +{-------------------------------------------------------------------- + Union +--------------------------------------------------------------------} +prop_UnionValid :: Property +prop_UnionValid + = forValidUnitTree $ \t1 -> + forValidUnitTree $ \t2 -> + valid (union t1 t2) + +prop_UnionInsert :: Int -> USet Int -> Bool +prop_UnionInsert x t + = union t (singleton x) == insert x t + +prop_UnionAssoc :: USet Int -> USet Int -> USet Int -> Bool +prop_UnionAssoc t1 t2 t3 + = union t1 (union t2 t3) == union (union t1 t2) t3 + +prop_UnionComm :: USet Int -> USet Int -> Bool +prop_UnionComm t1 t2 + = (union t1 t2 == union t2 t1) + + +prop_DiffValid + = forValidUnitTree $ \t1 -> + forValidUnitTree $ \t2 -> + valid (difference t1 t2) + +prop_Diff :: [Int] -> [Int] -> Bool +prop_Diff xs ys + = toAscList (difference (fromList xs) (fromList ys)) + == List.sort ((List.\\) (nub xs) (nub ys)) + +prop_IntValid + = forValidUnitTree $ \t1 -> + forValidUnitTree $ \t2 -> + valid (intersection t1 t2) + +prop_Int :: [Int] -> [Int] -> Bool +prop_Int xs ys + = toAscList (intersection (fromList xs) (fromList ys)) + == List.sort (nub ((List.intersect) (xs) (ys))) + +{-------------------------------------------------------------------- + Lists +--------------------------------------------------------------------} +prop_Ordered + = forAll (choose (5,100)) $ \n -> + let xs = [0..n::Int] + in fromAscList xs == fromList xs + +prop_List :: [Int] -> Bool +prop_List xs + = (sort (nub xs) == toList (fromList xs)) +-} + +-- | /O(log n)/. Insert an element in a set. +-- If the set already contains an element equal to the given value, +-- it is replaced with the new value. +insert::(USa,Orda)=>a->USeta->USeta +insertx=gowhere +cmpx=comparex +go=viewk(singletonx)$\szylr->casecmpxyof +LT->balancey(gol)r +GT->balanceyl(gor) +EQ->binszxlr + +bin_::USa=>a->USeta->USeta->USeta +bin_xlr=bin(sizel+sizer+1)xlr + +newtypeBoxeda=Boxed{getBoxed::a}deriving(Eq,Ord,Show,Read,Bounded) + +{-- everything below this point AUTOMATICALLY GENERATED by instances.pl. Don't edit by hand! --} + +#include "UnboxedInstances.hs" + binary ./doc/html/unboxed-containers/unboxed-containers.haddock oldhex *0d0cface00040000000000005682000000000000511b2b00000000000000000000000000000000 *000000000000000100000000000000010000000000000000000000000000000100000000000000 *020000000000000000000000000000000100000000000000030000000000000000000000000000 *000100000000000000040000000000000000000000000000000100000000000000050000000000 *000000000000000000000100000000000000060000000000000000000000000000000100000000 *000000070000000000000000000000000000000100000000000000080000000000000000000000 *0000000001000000000000000900000000000000000000000000000001000000000000000a0000 *0000000000000000000000000001000000000000000b0000000000000000000000000000000100 *0000000000000c00000000000000000000000000000001000000000000000d0000000000000000 *0000000000000001000000000000000e0000000000000000000000000000000100000000000000 *0f0000000000000000000000000000000100000000000000100000000000000000000000000000 *000100000000000000110000000000000000000000000000000100000000000000120000000000 *000000000000000000000100000000000000130000000000000000000000000000000100000000 *000000140000000000000000000000000000000100000000000000150000000000000000000000 *000000000100000000000000160000000000000000000000000000000100000000000000170000 *000000000000000000000000000100000000000000180000000000000000000000000000000100 *0000000000001900000000000000000000000000000001000000000000001a0000000000000000 *0000000000000001000000000000001b0000000000000000000000000000000100000000000000 *1c00000000000000000000000000000001000000000000001d0000000000000000000000000000 *0001000000000000001e00000000000000000000000000000001000000000000001f0000000000 *000000000000000000000100000000000000200000000000000000000000000000000100000000 *000000210000000000000000000000000000000100000000000000220000000000000000000000 *000000000100000000000000230000000000000000000000000000000100000000000000240000 *000000000000000000000000000100000000000000250000000000000000000000000000000100 *000000000000260000000000000000000000000000000100000000000000270000000000000000 *000000000000000100000000000000280000000000000000000000000000000100000000000000 *2900000000000000000000000000000001000000000000002a0000000000000000000000000000 *000101000000000000000000000000000000010000000030000000000000002b03022e00000045 *00000078000000740000007200000061000000630000007400000020000000610000006e000000 *64000000200000007200000065000000620000006f000000780000002000000074000000680000 *0065000000200000007300000070000000650000006300000069000000610000006c0000006900 *00007a0000006500000064000000200000006e0000006f00000064000000650000002000000066 *0000006f000000720000006d00000061000000740000000a000000000000002c03022c00000041 *00000070000000700000006c000000790000002000000074000000680000006500000020000000 *7600000069000000650000007700000020000000740000006f0000002000000074000000690000 *007000000020000000610000006e000000640000002000000062000000690000006e0000002000 *0000630000006f0000006e00000074000000690000006e00000075000000610000007400000069 *0000006f0000006e000000730000000a000000000000002d030236000000560000006900000065 *00000077000000200000006a000000750000007300000074000000200000007400000068000000 *650000002000000076000000610000006c000000750000006500000020000000610000006e0000 *0064000000200000006c00000065000000660000007400000020000000610000006e0000006400 *000020000000720000006900000067000000680000007400000020000000630000006800000069 *0000006c00000064000000200000006f0000006600000020000000610000002000000062000000 *690000006e0000000a000000000000000403010602040000004f00000028000000310000002902 *250000002e00000020000000540000006800000065000000200000006e000000750000006d0000 *00620000006500000072000000200000006f0000006600000020000000650000006c0000006500 *00006d000000650000006e000000740000007300000020000000690000006e0000002000000074 *0000006800000065000000200000007300000065000000740000002e0000000a00000000000000 *0503010602040000004f00000028000000310000002902190000002e0000002000000049000000 *730000002000000074000000680000006900000073000000200000007400000068000000650000 *0020000000650000006d0000007000000074000000790000002000000073000000650000007400 *00003f0000000a000000000000002e030216000000530000006d00000061000000720000007400 *00002000000074000000690000007000000020000000630000006f0000006e0000007300000074 *000000720000007500000063000000740000006f000000720000000a000000000000002f030216 *000000530000006d0000006100000072000000740000002000000062000000690000006e000000 *20000000630000006f0000006e0000007300000074000000720000007500000063000000740000 *006f000000720000000a000000000000003003021100000042000000610000006c000000610000 *006e00000063000000650000002000000074000000680000006500000020000000740000007200 *000065000000650000000a00000000000000310301021000000041000000200000007300000065 *00000074000000200000006f000000660000002000000076000000610000006c00000075000000 *650000007300000020010702010000006102020000002e0000000a000000000000000603010602 *060000004f000000280000006e0000002b0000006d000000290102060000002e00000020000000 *530000006500000065000000200104010000000000000000140000000000000000000000000000 *000102020000002e0000000a000000000000000703010602080000004f000000280000006c0000 *006f00000067000000200000006e00000029021d0000002e000000200000004900000073000000 *2000000074000000680000006500000020000000650000006c000000650000006d000000650000 *006e0000007400000020000000690000006e000000200000007400000068000000650000002000 *00007300000065000000740000003f0000000a000000000000000803010602080000004f000000 *280000006c0000006f00000067000000200000006e0000002902210000002e0000002000000049 *000000730000002000000074000000680000006500000020000000650000006c00000065000000 *6d000000650000006e00000074000000200000006e0000006f0000007400000020000000690000 *006e00000020000000740000006800000065000000200000007300000065000000740000003f00 *00000a000000000000000903010602040000004f00000028000000310000002902110000002e00 *00002000000054000000680000006500000020000000650000006d000000700000007400000079 *000000200000007300000065000000740000002e0000000a000000000000000a03010602040000 *004f000000280000003100000029021a0000002e00000020000000430000007200000065000000 *61000000740000006500000020000000610000002000000073000000690000006e000000670000 *006c00000065000000740000006f0000006e000000200000007300000065000000740000002e00 *00000a000000000000000b03010602080000004f000000280000006c0000006f00000067000000 *200000006e0000002902200000002e0000002000000044000000650000006c0000006500000074 *0000006500000020000000610000006e00000020000000650000006c000000650000006d000000 *650000006e000000740000002000000066000000720000006f0000006d00000020000000610000 *00200000007300000065000000740000002e0000000a000000000000000c03010602060000004f *000000280000006e0000002b0000006d0000002902390000002e00000020000000490000007300 *000020000000740000006800000069000000730000002000000061000000200000007000000072 *0000006f0000007000000065000000720000002000000073000000750000006200000073000000 *65000000740000003f000000200000002800000069000000650000002e00000020000000610000 *002000000073000000750000006200000073000000650000007400000020000000620000007500 *000074000000200000006e0000006f000000740000002000000065000000710000007500000061 *0000006c000000290000002e0000000a000000000000000d03010602060000004f000000280000 *006e0000002b0000006d000000290102140000002e000000200000004900000073000000200000 *007400000068000000690000007300000020000000610000002000000073000000750000006200 *00007300000065000000740000003f0000000a0102010000002001070102040000002800000073 *000000310000002001040100000000000000000d00000000000000000000000000000001020400 *00002000000073000000320000002901020f0000002000000074000000650000006c0000006c00 *000073000000200000007700000068000000650000007400000068000000650000007200000020 *010702020000007300000031010210000000200000006900000073000000200000006100000020 *000000730000007500000062000000730000006500000074000000200000006f00000066000000 *2001070202000000730000003202020000002e0000000a000000000000000e0301060208000000 *4f000000280000006c0000006f00000067000000200000006e0000002902200000002e00000020 *000000540000006800000065000000200000006d000000690000006e000000690000006d000000 *610000006c00000020000000650000006c000000650000006d000000650000006e000000740000 *00200000006f000000660000002000000061000000200000007300000065000000740000002e00 *00000a000000000000000f03010602080000004f000000280000006c0000006f00000067000000 *200000006e0000002902200000002e00000020000000540000006800000065000000200000006d *0000006100000078000000690000006d000000610000006c00000020000000650000006c000000 *650000006d000000650000006e00000074000000200000006f0000006600000020000000610000 *00200000007300000065000000740000002e0000000a000000000000001003010602080000004f *000000280000006c0000006f00000067000000200000006e00000029021e0000002e0000002000 *000044000000650000006c00000065000000740000006500000020000000740000006800000065 *000000200000006d000000690000006e000000690000006d000000610000006c00000020000000 *650000006c000000650000006d000000650000006e000000740000002e0000000a000000000000 *001103010602080000004f000000280000006c0000006f00000067000000200000006e00000029 *021e0000002e0000002000000044000000650000006c0000006500000074000000650000002000 *0000740000006800000065000000200000006d0000006100000078000000690000006d00000061 *0000006c00000020000000650000006c000000650000006d000000650000006e00000074000000 *2e0000000a00000000000000120301021e00000054000000680000006500000020000000750000 *006e000000690000006f0000006e000000200000006f0000006600000020000000610000002000 *00006c000000690000007300000074000000200000006f00000066000000200000007300000065 *00000074000000730000003a000000200000002801070104010000000000000000120000000000 *0000000000000000000001010204000000200000003d0000003d00000020010401000000000000 *000032000000000000000200000000000000030102010000002001040100000000000000001300 *000000000000000000000000000001010201000000200401000000000000000009000000000000 *000000000000000000010203000000290000002e0000000a000000000000001303010602060000 *004f000000280000006e0000002b0000006d000000290102370000002e00000020000000540000 *00680000006500000020000000750000006e000000690000006f0000006e000000200000006f00 *0000660000002000000074000000770000006f0000002000000073000000650000007400000073 *0000002c0000002000000070000000720000006500000066000000650000007200000072000000 *690000006e00000067000000200000007400000068000000650000002000000066000000690000 *007200000073000000740000002000000073000000650000007400000020000000770000006800 *0000650000006e0000000a01022100000020000000650000007100000075000000610000006c00 *000020000000650000006c000000650000006d000000650000006e000000740000007300000020 *00000061000000720000006500000020000000650000006e000000630000006f00000075000000 *6e00000074000000650000007200000065000000640000002e0000000a01022700000020000000 *54000000680000006500000020000000690000006d000000700000006c000000650000006d0000 *00650000006e000000740000006100000074000000690000006f0000006e000000200000007500 *000073000000650000007300000020000000740000006800000065000000200000006500000066 *00000066000000690000006300000069000000650000006e00000074000000200106020b000000 *68000000650000006400000067000000650000002d000000750000006e000000690000006f0000 *006e01020c00000020000000610000006c000000670000006f0000007200000069000000740000 *00680000006d0000002e0000000a01022a00000020000000480000006500000064000000670000 *00650000002d000000750000006e000000690000006f0000006e00000020000000690000007300 *0000200000006d0000006f00000072000000650000002000000065000000660000006600000069 *0000006300000069000000650000006e00000074000000200000006f0000006e00000020000000 *280000006200000069000000670000007300000065000000740000002001040100000000000000 *001300000000000000000000000000000001020c00000020000000730000006d00000061000000 *6c0000006c000000730000006500000074000000290000002e0000000a00000000000000140301 *0602060000004f000000280000006e0000002b0000006d0000002901021b0000002e0000002000 *0000440000006900000066000000660000006500000072000000650000006e0000006300000065 *000000200000006f000000660000002000000074000000770000006f0000002000000073000000 *6500000074000000730000002e000000200000000a010226000000200000005400000068000000 *6500000020000000690000006d000000700000006c000000650000006d000000650000006e0000 *00740000006100000074000000690000006f0000006e0000002000000075000000730000006500 *00007300000020000000610000006e000000200000006500000066000000660000006900000063 *00000069000000650000006e000000740000002001060205000000680000006500000064000000 *670000006501021b00000020000000610000006c000000670000006f0000007200000069000000 *74000000680000006d00000020000000630000006f0000006d0000007000000061000000720000 *0061000000620000006c0000006500000020000000770000006900000074000000680000002001 *06020b00000068000000650000006400000067000000650000002d000000750000006e00000069 *0000006f0000006e02020000002e0000000a00000000000000150103010602060000004f000000 *280000006e0000002b0000006d000000290102200000002e000000200000005400000068000000 *6500000020000000690000006e0000007400000065000000720000007300000065000000630000 *0074000000690000006f0000006e000000200000006f0000006600000020000000740000007700 *00006f00000020000000730000006500000074000000730000002e0000000a0240000000200000 *00450000006c000000650000006d000000650000006e0000007400000073000000200000006f00 *000066000000200000007400000068000000650000002000000072000000650000007300000075 *0000006c0000007400000020000000630000006f0000006d000000650000002000000066000000 *720000006f0000006d000000200000007400000068000000650000002000000066000000690000 *00720000007300000074000000200000007300000065000000740000002c000000200000007300 *00006f00000020000000660000006f00000072000000200000006500000078000000610000006d *000000700000006c000000650000000a010b01022000000020000000690000006d000000700000 *006f0000007200000074000000200000007100000075000000610000006c000000690000006600 *000069000000650000006400000020000000440000006100000074000000610000002e00000053 *000000650000007400000020000000610000007300000020000000530000000a01021f00000020 *00000064000000610000007400000061000000200000004100000042000000200000003d000000 *2000000041000000200000007c0000002000000042000000200000006400000065000000720000 *006900000076000000690000006e000000670000002000000053000000680000006f0000007700 *00000a01022800000020000000690000006e0000007300000074000000610000006e0000006300 *000065000000200000004f00000072000000640000002000000041000000420000002000000077 *0000006800000065000000720000006500000020000000630000006f0000006d00000070000000 *610000007200000065000000200000005f000000200000005f000000200000003d000000200000 *0045000000510000000a01022400000020000000690000006e0000007300000074000000610000 *006e00000063000000650000002000000045000000710000002000000041000000420000002000 *00007700000068000000650000007200000065000000200000005f000000200000003d0000003d *000000200000005f000000200000003d0000002000000054000000720000007500000065000000 *0a01023d000000200000006d00000061000000690000006e000000200000003d00000020000000 *7000000072000000690000006e000000740000002000000028000000530000002e000000730000 *00690000006e000000670000006c00000065000000740000006f0000006e000000200000004100 *00002000000060000000530000002e000000690000006e00000074000000650000007200000073 *000000650000006300000074000000690000006f0000006e000000600000002000000053000000 *2e00000073000000690000006e000000670000006c00000065000000740000006f0000006e0000 *0020000000420000002c0000000a023d0000002000000020000000200000002000000020000000 *200000002000000020000000200000002000000020000000200000002000000020000000200000 *00530000002e00000073000000690000006e000000670000006c00000065000000740000006f00 *00006e00000020000000420000002000000060000000530000002e000000690000006e00000074 *000000650000007200000073000000650000006300000074000000690000006f0000006e000000 *6000000020000000530000002e00000073000000690000006e000000670000006c000000650000 *00740000006f0000006e0000002000000041000000290000000a03010207000000700000007200 *0000690000006e000000740000007300000020010701020c000000280000006600000072000000 *6f0000006d0000004c000000690000007300000074000000200000005b00000041010201000000 *5d01020c0000002c00000066000000720000006f0000006d0000004c0000006900000073000000 *74000000200000005b000000420102010000005d02010000002902020000002e0000000a000000 *000000001603010602040000004f000000280000006e0000002902320000002e00000020000000 *46000000690000006c00000074000000650000007200000020000000610000006c0000006c0000 *0020000000650000006c000000650000006d000000650000006e00000074000000730000002000 *000074000000680000006100000074000000200000007300000061000000740000006900000073 *000000660000007900000020000000740000006800000065000000200000007000000072000000 *650000006400000069000000630000006100000074000000650000002e0000000a000000000000 *001703010602040000004f000000280000006e000000290102460000002e000000200000005000 *00006100000072000000740000006900000074000000690000006f0000006e0000002000000074 *00000068000000650000002000000073000000650000007400000020000000690000006e000000 *740000006f0000002000000074000000770000006f000000200000007300000065000000740000 *00730000002c000000200000006f0000006e000000650000002000000077000000690000007400 *00006800000020000000610000006c0000006c00000020000000650000006c000000650000006d *000000650000006e00000074000000730000002000000074000000680000006100000074000000 *20000000730000006100000074000000690000007300000066000000790000000a010231000000 *200000007400000068000000650000002000000070000000720000006500000064000000690000 *006300000061000000740000006500000020000000610000006e00000064000000200000006f00 *00006e00000065000000200000007700000069000000740000006800000020000000610000006c *0000006c00000020000000650000006c000000650000006d000000650000006e00000074000000 *73000000200000007400000068000000610000007400000020000000640000006f0000006e0102 *010000002701021900000074000000200000007300000061000000740000006900000073000000 *660000007900000020000000740000006800000065000000200000007000000072000000650000 *006400000069000000630000006100000074000000650000002e0000000a01020a000000200000 *0053000000650000006500000020000000610000006c000000730000006f000000200104010000 *000000000000210000000000000000000000000000000102020000002e0000000a000000000000 *001801030106020a0000004f000000280000006e0000002a0000006c0000006f00000067000000 *200000006e000000290102030000002e000000200000000a010201000000200107010401000000 *000000000018000000000000000000000000000000010204000000200000006600000020000000 *730102210000002000000069000000730000002000000074000000680000006500000020000000 *730000006500000074000000200000006f000000620000007400000061000000690000006e0000 *006500000064000000200000006200000079000000200000006100000070000000700000006c00 *000079000000690000006e00000067000000200107020100000066010214000000200000007400 *00006f000000200000006500000061000000630000006800000020000000650000006c00000065 *0000006d000000650000006e00000074000000200000006f000000660000002001070201000000 *7302020000002e0000000a0301020200000049000000740102010000002701023e000000730000 *0020000000770000006f000000720000007400000068000000200000006e0000006f0000007400 *0000690000006e0000006700000020000000740000006800000061000000740000002000000074 *00000068000000650000002000000073000000690000007a00000065000000200000006f000000 *660000002000000074000000680000006500000020000000720000006500000073000000750000 *006c00000074000000200000006d00000061000000790000002000000062000000650000002000 *0000730000006d000000610000006c0000006c0000006500000072000000200000006900000066 *0000002c0000000a01020a00000020000000660000006f0000007200000020000000730000006f *0000006d00000065000000200107020500000028000000780000002c0000007900000029010202 *0000002c00000020010701020200000078000000200102010000002f0102040000003d00000020 *00000079000000200102010000002601020100000026020b000000200000006600000020000000 *78000000200000003d0000003d0000002000000066000000200000007902010000000a00000000 *000000190103010602040000004f000000280000006e0000002902070000002e00000020000000 *540000006800000065000000200000000a01030107010401000000000000000019000000000000 *0000000000000000000101020800000020000000660000002000000073000000200000003d0000 *003d00000020010401000000000000000018000000000000000000000000000000010204000000 *200000006600000020000000730102160000002c00000020000000620000007500000074000000 *20000000770000006f000000720000006b00000073000000200000006f0000006e0000006c0000 *0079000000200000007700000068000000650000006e00000020010702010000006601020f0000 *00200000006900000073000000200000006d0000006f0000006e0000006f000000740000006f00 *00006e00000069000000630000002e0000000a0102010000002001060220000000540000006800 *00006500000020000000700000007200000065000000630000006f0000006e0000006400000069 *00000074000000690000006f0000006e000000200000006900000073000000200000006e000000 *6f0000007400000020000000630000006800000065000000630000006b00000065000000640000 *002e0102010000000a02190000002000000053000000650000006d000000690000002d00000066 *0000006f000000720000006d000000610000006c0000006c000000790000002c00000020000000 *770000006500000020000000680000006100000076000000650000003a0000000a0b01022f0000 *0020000000610000006e00000064000000200000005b00000078000000200000003c0000002000 *000079000000200000003d0000003d0000003e0000002000000066000000200000007800000020 *0000003c00000020000000660000002000000079000000200000007c0000002000000078000000 *200000003c0000002d000000200000006c000000730000002c0000002000000079000000200000 *003c0000002d000000200000006c000000730000005d000000200000000a010235000000200000 *002000000020000000200000002000000020000000200000002000000020000000200000002000 *000020000000200000002000000020000000200000002000000020000000200000002000000020 *0000003d0000003d0000003e000000200000006d00000061000000700000004d0000006f000000 *6e0000006f000000740000006f0000006e00000069000000630000002000000066000000200000 *0073000000200000003d0000003d000000200000006d0000006100000070000000200000006600 *000020000000730000000a02190000002000000020000000200000002000000020000000770000 *0068000000650000007200000065000000200000006c00000073000000200000003d0000002000 *0000740000006f0000004c00000069000000730000007400000020000000730000000a00000000 *0000001a03010602040000004f000000280000006e00000029023b0000002e0000002000000046 *0000006f0000006c00000064000000200000006f00000076000000650000007200000020000000 *74000000680000006500000020000000650000006c000000650000006d000000650000006e0000 *007400000073000000200000006f00000066000000200000006100000020000000730000006500 *00007400000020000000690000006e00000020000000610000006e00000020000000750000006e *000000730000007000000065000000630000006900000066000000690000006500000064000000 *200000006f000000720000006400000065000000720000002e0000000a00000000000000330301 *0602040000004f000000280000006e0000002902130000002e00000020000000500000006f0000 *0073000000740000002d0000006f00000072000000640000006500000072000000200000006600 *00006f0000006c000000640000002e0000000a000000000000001b03010602040000004f000000 *280000006e0000002902190000002e000000200000005400000068000000650000002000000065 *0000006c000000650000006d000000650000006e0000007400000073000000200000006f000000 *660000002000000061000000200000007300000065000000740000002e0000000a000000000000 *001c03010602040000004f000000280000006e0000002902290000002e00000020000000430000 *006f0000006e000000760000006500000072000000740000002000000074000000680000006500 *00002000000073000000650000007400000020000000740000006f000000200000006100000020 *0000006c000000690000007300000074000000200000006f000000660000002000000065000000 *6c000000650000006d000000650000006e00000074000000730000002e0000000a000000000000 *001d03010602040000004f000000280000006e0000002902340000002e00000020000000430000 *006f0000006e000000760000006500000072000000740000002000000074000000680000006500 *00002000000073000000650000007400000020000000740000006f00000020000000610000006e *00000020000000610000007300000063000000650000006e00000064000000690000006e000000 *67000000200000006c000000690000007300000074000000200000006f00000066000000200000 *00650000006c000000650000006d000000650000006e00000074000000730000002e0000000a00 *0000000000001e030106020a0000004f000000280000006e0000002a0000006c0000006f000000 *67000000200000006e0000002902280000002e0000002000000043000000720000006500000061 *000000740000006500000020000000610000002000000073000000650000007400000020000000 *66000000720000006f0000006d0000002000000061000000200000006c00000069000000730000 *0074000000200000006f0000006600000020000000650000006c000000650000006d0000006500 *00006e00000074000000730000002e0000000a000000000000001f03010602040000004f000000 *280000006e000000290102350000002e000000200000004200000075000000690000006c000000 *640000002000000061000000200000007300000065000000740000002000000066000000720000 *006f0000006d00000020000000610000006e000000200000006100000073000000630000006500 *00006e00000064000000690000006e00000067000000200000006c000000690000007300000074 *00000020000000690000006e000000200000006c000000690000006e0000006500000061000000 *720000002000000074000000690000006d000000650000002e0000000a01020100000020010602 *3a00000054000000680000006500000020000000700000007200000065000000630000006f0000 *006e000000640000006900000074000000690000006f0000006e00000020000000280000006900 *00006e000000700000007500000074000000200000006c00000069000000730000007400000020 *000000690000007300000020000000610000007300000063000000650000006e00000064000000 *690000006e0000006700000029000000200000006900000073000000200000006e0000006f0000 *007400000020000000630000006800000065000000630000006b00000065000000640000002e02 *010000000a000000000000002003010602040000004f000000280000006e0000002901024a0000 *002e000000200000004200000075000000690000006c0000006400000020000000610000002000 *00007300000065000000740000002000000066000000720000006f0000006d0000002000000061 *0000006e00000020000000610000007300000063000000650000006e0000006400000069000000 *6e00000067000000200000006c000000690000007300000074000000200000006f000000660000 *002000000064000000690000007300000074000000690000006e00000063000000740000002000 *0000650000006c000000650000006d000000650000006e00000074000000730000002000000069 *0000006e000000200000006c000000690000006e00000065000000610000007200000020000000 *74000000690000006d000000650000002e0000000a010201000000200106024300000054000000 *680000006500000020000000700000007200000065000000630000006f0000006e000000640000 *006900000074000000690000006f0000006e0000002000000028000000690000006e0000007000 *00007500000074000000200000006c000000690000007300000074000000200000006900000073 *000000200000007300000074000000720000006900000063000000740000006c00000079000000 *20000000610000007300000063000000650000006e00000064000000690000006e000000670000 *0029000000200000006900000073000000200000006e0000006f00000074000000200000006300 *00006800000065000000630000006b00000065000000640000002e02010000000a000000000000 *002103010602080000004f000000280000006c0000006f00000067000000200000006e00000029 *0102120000002e0000002000000054000000680000006500000020000000650000007800000070 *00000072000000650000007300000073000000690000006f0000006e0000002000000028010701 *040100000000000000002100000000000000000000000000000001020600000020000000780000 *002000000073000000650000007401020c00000029000000200000006900000073000000200000 *00610000002000000070000000610000006900000072000000200107020b000000280000007300 *00006500000074000000310000002c000000730000006500000074000000320000002901020100 *00000a010207000000200000007700000068000000650000007200000065000000200107020400 *00007300000065000000740000003101021b00000020000000630000006f0000006d0000007000 *000072000000690000007300000065000000730000002000000074000000680000006500000020 *000000650000006c000000650000006d000000650000006e000000740000007300000020000000 *6f00000066000000200107020300000073000000650000007401020b000000200000006c000000 *650000007300000073000000200000007400000068000000610000006e00000020010702010000 *007801020500000020000000610000006e00000064000000200107020400000073000000650000 *0074000000320102010000000a01021b00000020000000630000006f0000006d00000070000000 *720000006900000073000000650000007300000020000000740000006800000065000000200000 *00650000006c000000650000006d000000650000006e0000007400000073000000200000006f00 *000066000000200107020300000073000000650000007401020e00000020000000670000007200 *00006500000061000000740000006500000072000000200000007400000068000000610000006e *00000020010702010000007802020000002e0000000a000000000000002203010602080000004f *000000280000006c0000006f00000067000000200000006e0000002901020d0000002e00000020 *000000500000006500000072000000660000006f000000720000006d0000007300000020000000 *610000002001040100000000000000002100000000000000000000000000000001010224000000 *2000000062000000750000007400000020000000610000006c000000730000006f000000200000 *0072000000650000007400000075000000720000006e0000007300000020000000770000006800 *000065000000740000006800000065000000720000002000000074000000680000006500000020 *0000007000000069000000760000006f000000740000000a022800000020000000650000006c00 *0000650000006d000000650000006e000000740000002000000077000000610000007300000020 *000000660000006f000000750000006e0000006400000020000000690000006e00000020000000 *740000006800000065000000200000006f000000720000006900000067000000690000006e0000 *00610000006c000000200000007300000065000000740000002e0000000a000000000000003403 *010602080000004f000000280000006c0000006f00000067000000200000006e0000002901020d *0000002e00000020000000500000006500000072000000660000006f000000720000006d000000 *730000002000000061000000200104010000000000000000210000000000000000000000000000 *000101021c0000002000000062000000750000007400000020000000610000006c000000730000 *006f0000002000000072000000650000007400000075000000720000006e000000730000002000 *0000740000006800000065000000200000007000000069000000760000006f000000740000000a *022d00000020000000650000006c000000650000006d000000650000006e000000740000002000 *000074000000680000006100000074000000200000007700000061000000730000002000000066 *0000006f000000750000006e0000006400000020000000690000006e0000002000000074000000 *6800000065000000200000006f000000720000006900000067000000690000006e000000610000 *006c000000200000007300000065000000740000002e0000000a00000000000000230103010602 *080000004f000000280000006c0000006f00000067000000200000006e0000002902270000002e *0000002000000044000000650000006c0000006500000074000000650000002000000061000000 *6e000000640000002000000066000000690000006e000000640000002000000074000000680000 *0065000000200000006d000000690000006e000000690000006d000000610000006c0000002000 *0000650000006c000000650000006d000000650000006e000000740000002e0000000a0b023200 *00002000000064000000650000006c00000065000000740000006500000046000000690000006e *000000640000004d000000690000006e0000002000000073000000650000007400000020000000 *3d000000200000002800000066000000690000006e000000640000004d000000690000006e0000 *00200000007300000065000000740000002c0000002000000064000000650000006c0000006500 *000074000000650000004d000000690000006e0000002000000073000000650000007400000029 *0000000a00000000000000240103010602080000004f000000280000006c0000006f0000006700 *0000200000006e0000002902270000002e0000002000000044000000650000006c000000650000 *00740000006500000020000000610000006e000000640000002000000066000000690000006e00 *00006400000020000000740000006800000065000000200000006d000000610000007800000069 *0000006d000000610000006c00000020000000650000006c000000650000006d00000065000000 *6e000000740000002e0000000a0b02320000002000000064000000650000006c00000065000000 *740000006500000046000000690000006e000000640000004d0000006100000078000000200000 *00730000006500000074000000200000003d000000200000002800000066000000690000006e00 *0000640000004d0000006100000078000000200000007300000065000000740000002c00000020 *00000064000000650000006c0000006500000074000000650000004d0000006100000078000000 *20000000730000006500000074000000290000000a000000000000002503010602080000004f00 *0000280000006c0000006f00000067000000200000006e000000290102340000002e0000002000 *000052000000650000007400000072000000690000006500000076000000650000007300000020 *000000740000006800000065000000200000006d000000690000006e000000690000006d000000 *610000006c000000200000006b0000006500000079000000200000006f00000066000000200000 *00740000006800000065000000200000007300000065000000740000002c000000200000006100 *00006e000000640000002000000074000000680000006500000020000000730000006500000074 *0000000a01021e0000002000000073000000740000007200000069000000700000007000000065 *00000064000000200000006f000000660000002000000074000000680000006100000074000000 *20000000650000006c000000650000006d000000650000006e000000740000002c000000200000 *006f00000072000000200104010000000000000000350000000000000002000000000000000402 *190000002000000069000000660000002000000070000000610000007300000073000000650000 *006400000020000000610000006e00000020000000650000006d00000070000000740000007900 *0000200000007300000065000000740000002e0000000a00000000000000260301060208000000 *4f000000280000006c0000006f00000067000000200000006e000000290102340000002e000000 *200000005200000065000000740000007200000069000000650000007600000065000000730000 *0020000000740000006800000065000000200000006d0000006100000078000000690000006d00 *0000610000006c000000200000006b0000006500000079000000200000006f0000006600000020 *000000740000006800000065000000200000007300000065000000740000002c00000020000000 *610000006e00000064000000200000007400000068000000650000002000000073000000650000 *00740000000a01021e000000200000007300000074000000720000006900000070000000700000 *006500000064000000200000006f00000066000000200000007400000068000000610000007400 *000020000000650000006c000000650000006d000000650000006e000000740000002c00000020 *0000006f0000007200000020010401000000000000000035000000000000000200000000000000 *040219000000200000006900000066000000200000007000000061000000730000007300000065 *0000006400000020000000610000006e00000020000000650000006d0000007000000074000000 *79000000200000007300000065000000740000002e0000000a0000000000000027030106020400 *00004f000000280000006e0000002901023b0000002e0000002000000053000000680000006f00 *000077000000200000007400000068000000650000002000000074000000720000006500000065 *000000200000007400000068000000610000007400000020000000690000006d00000070000000 *6c000000650000006d000000650000006e00000074000000730000002000000074000000680000 *0065000000200000007300000065000000740000002e0000002000000054000000680000006500 *000020000000740000007200000065000000650000002000000069000000730000002000000073 *000000680000006f000000770000006e0000000a022200000020000000690000006e0000002000 *00006100000020000000630000006f0000006d0000007000000072000000650000007300000073 *00000065000000640000002c0000002000000068000000610000006e0000006700000069000000 *6e0000006700000020000000660000006f000000720000006d00000061000000740000002e0000 *000a00000000000000280103010602040000004f000000280000006e000000290102120000002e *000000200000005400000068000000650000002000000065000000780000007000000072000000 *650000007300000073000000690000006f0000006e00000020000000280107021a000000730000 *00680000006f000000770000005400000072000000650000006500000057000000690000007400 *0000680000002000000068000000610000006e0000006700000020000000770000006900000064 *00000065000000200000006d000000610000007001020800000029000000200000007300000068 *0000006f00000077000000730000000a0102260000002000000074000000680000006500000020 *000000740000007200000065000000650000002000000074000000680000006100000074000000 *20000000690000006d000000700000006c000000650000006d000000650000006e000000740000 *007300000020000000740000006800000065000000200000007300000065000000740000002e00 *0000200000004900000066000000200107020400000068000000610000006e0000006701020400 *00002000000069000000730000000a010201000000200107020400000054000000720000007500 *0000650102040000002c0000002000000061000000200106020700000068000000610000006e00 *000067000000690000006e00000067010235000000200000007400000072000000650000006500 *00002000000069000000730000002000000073000000680000006f000000770000006e00000020 *0000006f0000007400000068000000650000007200000077000000690000007300000065000000 *200000006100000020000000720000006f00000074000000610000007400000065000000640000 *002000000074000000720000006500000065000000200000006900000073000000200000007300 *0000680000006f000000770000006e0000002e0000002000000049000000660000000a01020100 *000020010702040000007700000069000000640000006501020400000020000000690000007300 *0000200104010000000000000000360000000000000005000000000000000602220000002c0000 *0020000000610000006e0000002000000065000000780000007400000072000000610000002000 *000077000000690000006400000065000000200000007600000065000000720000007300000069 *0000006f0000006e0000002000000069000000730000002000000073000000680000006f000000 *770000006e0000002e0000000a0b010246000000200000005300000065000000740000003e0000 *00200000007000000075000000740000005300000074000000720000004c0000006e0000002000 *0000240000002000000073000000680000006f0000007700000054000000720000006500000065 *000000570000006900000074000000680000002000000054000000720000007500000065000000 *2000000046000000610000006c0000007300000065000000200000002400000020000000660000 *00720000006f0000006d00000044000000690000007300000074000000690000006e0000006300 *0000740000004100000073000000630000004c000000690000007300000074000000200000005b *000000310000002e0000002e000000350000005d0000000a01020300000020000000340000000a *010206000000200000002b0000002d0000002d000000320000000a010209000000200000007c00 *000020000000200000002b0000002d0000002d000000310000000a010209000000200000007c00 *000020000000200000002b0000002d0000002d000000330000000a010206000000200000002b00 *00002d0000002d000000350000000a010202000000200000000a01024500000020000000530000 *0065000000740000003e0000002000000070000000750000007400000053000000740000007200 *00004c0000006e00000020000000240000002000000073000000680000006f0000007700000054 *000000720000006500000065000000570000006900000074000000680000002000000054000000 *720000007500000065000000200000005400000072000000750000006500000020000000240000 *002000000066000000720000006f0000006d000000440000006900000073000000740000006900 *00006e00000063000000740000004100000073000000630000004c000000690000007300000074 *000000200000005b000000310000002e0000002e000000350000005d0000000a01020300000020 *000000340000000a010203000000200000007c0000000a010206000000200000002b0000002d00 *00002d000000320000000a010206000000200000007c00000020000000200000007c0000000a01 *0209000000200000007c00000020000000200000002b0000002d0000002d000000310000000a01 *0206000000200000007c00000020000000200000007c0000000a010209000000200000007c0000 *0020000000200000002b0000002d0000002d000000330000000a010203000000200000007c0000 *000a010206000000200000002b0000002d0000002d000000350000000a01020200000020000000 *0a010246000000200000005300000065000000740000003e000000200000007000000075000000 *740000005300000074000000720000004c0000006e000000200000002400000020000000730000 *00680000006f000000770000005400000072000000650000006500000057000000690000007400 *0000680000002000000046000000610000006c0000007300000065000000200000005400000072 *000000750000006500000020000000240000002000000066000000720000006f0000006d000000 *44000000690000007300000074000000690000006e000000630000007400000041000000730000 *00630000004c000000690000007300000074000000200000005b000000310000002e0000002e00 *0000350000005d0000000a010206000000200000002b0000002d0000002d000000350000000a01 *0203000000200000007c0000000a01020300000020000000340000000a01020300000020000000 *7c0000000a010209000000200000007c00000020000000200000002b0000002d0000002d000000 *330000000a010206000000200000007c00000020000000200000007c0000000a01020600000020 *0000002b0000002d0000002d000000320000000a01020600000020000000200000002000000020 *0000007c0000000a0209000000200000002000000020000000200000002b0000002d0000002d00 *0000310000000a000000000000002903010602040000004f000000280000006e00000029022f00 *00002e000000200000005400000065000000730000007400000020000000690000006600000020 *00000074000000680000006500000020000000690000006e000000740000006500000072000000 *6e000000610000006c000000200000007300000065000000740000002000000073000000740000 *007200000075000000630000007400000075000000720000006500000020000000690000007300 *00002000000076000000610000006c00000069000000640000002e0000000a000000000000002a *03010602080000004f000000280000006c0000006f00000067000000200000006e000000290102 *1e0000002e00000020000000490000006e00000073000000650000007200000074000000200000 *00610000006e00000020000000650000006c000000650000006d000000650000006e0000007400 *000020000000690000006e0000002000000061000000200000007300000065000000740000002e *0000000a0102420000002000000049000000660000002000000074000000680000006500000020 *00000073000000650000007400000020000000610000006c000000720000006500000061000000 *640000007900000020000000630000006f0000006e0000007400000061000000690000006e0000 *007300000020000000610000006e00000020000000650000006c000000650000006d0000006500 *00006e0000007400000020000000650000007100000075000000610000006c0000002000000074 *0000006f0000002000000074000000680000006500000020000000670000006900000076000000 *650000006e0000002000000076000000610000006c00000075000000650000002c0000000a0224 *000000200000006900000074000000200000006900000073000000200000007200000065000000 *700000006c00000061000000630000006500000064000000200000007700000069000000740000 *006800000020000000740000006800000065000000200000006e00000065000000770000002000 *000076000000610000006c00000075000000650000002e0000000a2b0000000000000000000000 *000000000100000000000000020000000000000003000000000000000400000000000000050000 *000000000006000000000000000700000000000000080000000000000009000000000000000a00 *0000000000000b000000000000000c000000000000000d000000000000000e000000000000000f *000000000000001000000000000000110000000000000012000000000000001300000000000000 *140000000000000015000000000000001600000000000000170000000000000018000000000000 *0019000000000000001a000000000000001b000000000000001c000000000000001d0000000000 *00001e000000000000001f00000000000000200000000000000021000000000000002200000000 *000000230000000000000024000000000000002500000000000000260000000000000027000000 *00000000280000000000000029000000000000002a2b0000000000000003000000000000000200 *000000000000000000000000000001000000000000000600000000000000050000000000000004 *00000000000000070000000000000008000000000000000d000000000000000c00000000000000 *09000000000000000a000000000000002a000000000000000b0000000000000013000000000000 *001200000000000000140000000000000015000000000000001600000000000000170000000000 *000021000000000000002200000000000000180000000000000019000000000000001a00000000 *0000000e000000000000000f000000000000001000000000000000110000000000000023000000 *000000002400000000000000260000000000000025000000000000001b000000000000001c0000 *00000000001e000000000000001d000000000000001f0000000000000020000000000000002700 *000000000000280000000000000029000000000000003700000000000000000000000000000001 *030000000000000007000000000000000000000000000000010100000000000000070000000000 *000000000000000000000103000000000000000800000000000000000000000000000001030000 *0000000000090000000000000000000000000000000100000000000000000a0000000000000000 *000000000000000100000000000000000b00000000000000000000000000000001000000000000 *00000c0000000000000000000000000000000100000000000000000d0000000000000000000000 *000000000100000000000000000e0000000000000000000000000000000100000000000000000f *000000000000000000000000000000010000000000000000100000000000000000000000000000 *000100000000000000001100000000000000000000000000000001000000000000000012000000 *000000000000000000000000010000000000000000130000000000000000000000000000000100 *000000000000001400000000000000000000000000000001000000000000000015000000000000 *000000000000000000010000000000000000160000000000000000000000000000000100000000 *000000001700000000000000000000000000000001000000000000000018000000000000000000 *000000000000010000000000000000190000000000000000000000000000000100000000000000 *001a0000000000000000000000000000000100000000000000001b000000000000000000000000 *0000000100000000000000001c0000000000000000000000000000000100000000000000001d00 *00000000000000000000000000000100000000000000001e000000000000000000000000000000 *0100000000000000001f0000000000000000000000000000000100000000000000002000000000 *000000000000000000000001000000000000000021000000000000000000000000000000010000 *000000000000220000000000000000000000000000000100000000000000002300000000000000 *000000000000000001000000000000000024000000000000000000000000000000010000000000 *000000250000000000000000000000000000000100000000000000002600000000000000000000 *000000000001000000000000000027000000000000000000000000000000010000000000000000 *280000000000000000000000000000000100000000000000002900000000000000000000000000 *00000100000000000000002a0000000000000000000000000000000100000000000000002b0000 *000000000000000000000000000100000000000000002c00000000000000000000000000000001 *00000000000000002d0000000000000000000000000000000100000000000000002e0000000000 *000000000000000000000100000000000000002f00000000000000000000000000000001000000 *000000000030000000000000000000000000000000010000000000000000310000000000000000 *000000000000000100000000000000003200000000000000000000000000000001000000000000 *000033000000000000000000000000000000010000000000000000340000000000000000000000 *000000000100000000000000003500000000000000000000000000000001000000000000000036 *000000000000000000000000000000010300000000000000370000000000000002000000000000 *00380000000000000000390000000000000000000000000000000100000000000000003a000000 *0000000000000000000000000100000000000000003b0000000000000002000000000000000401 *000000000000003c0000000000000005000000000000000601000000000000003d000000000000 *003e0000000000000018756e626f7865642d636f6e7461696e6572732d302e302e310000000000 *000010446174612e5365742e556e626f7865640000000000000004626173650000000000000009 *446174612e4c697374000000000000000a446174612e4d6179626500000000000000086768632d *7072696d00000000000000084748432e426f6f6c0000000000000005426f786564000000000000 *00025553000000000000000455536574000000000000000473697a6500000000000000046e756c *6c00000000000000025c5c00000000000000066d656d62657200000000000000096e6f744d656d *6265720000000000000005656d707479000000000000000973696e676c65746f6e000000000000 *000664656c6574650000000000000010697350726f7065725375627365744f6600000000000000 *0a69735375627365744f66000000000000000766696e644d696e000000000000000766696e644d *6178000000000000000964656c6574654d696e000000000000000964656c6574654d6178000000 *0000000006756e696f6e730000000000000005756e696f6e000000000000000a64696666657265 *6e6365000000000000000c696e74657273656374696f6e000000000000000666696c7465720000 *000000000009706172746974696f6e00000000000000036d6170000000000000000c6d61704d6f *6e6f746f6e69630000000000000004666f6c640000000000000005656c656d7300000000000000 *06746f4c6973740000000000000009746f4173634c697374000000000000000866726f6d4c6973 *74000000000000000b66726f6d4173634c697374000000000000001366726f6d44697374696e63 *744173634c697374000000000000000573706c6974000000000000000b73706c69744d656d6265 *72000000000000000d64656c65746546696e644d696e000000000000000d64656c65746546696e *644d617800000000000000076d696e5669657700000000000000076d6178566965770000000000 *00000873686f7754726565000000000000000c73686f7754726565576974680000000000000005 *76616c69640000000000000006696e736572740000000000000004766965770000000000000005 *766965776b00000000000000077669657742696e00000000000000037469700000000000000003 *62696e000000000000000762616c616e6365000000000000000353657400000000000000084748 *432e4c6973740000000000000005666f6c646c0000000000000005666f6c647200000000000000 *0b73706c69744c6f6f6b757000000000000000074e6f7468696e67000000000000000454727565 * newhex *0d0cface0004000000000000582200000000000052a22c00000000000000000000000000000000 *000000000000000100000000000000010000000000000000000000000000000100000000000000 *020000000000000000000000000000000100000000000000030000000000000000000000000000 *000100000000000000040000000000000000000000000000000100000000000000050000000000 *000000000000000000000100000000000000060000000000000000000000000000000100000000 *000000070000000000000000000000000000000100000000000000080000000000000000000000 *0000000001000000000000000900000000000000000000000000000001000000000000000a0000 *0000000000000000000000000001000000000000000b0000000000000000000000000000000100 *0000000000000c00000000000000000000000000000001000000000000000d0000000000000000 *0000000000000001000000000000000e0000000000000000000000000000000100000000000000 *0f0000000000000000000000000000000100000000000000100000000000000000000000000000 *000100000000000000110000000000000000000000000000000100000000000000120000000000 *000000000000000000000100000000000000130000000000000000000000000000000100000000 *000000140000000000000000000000000000000100000000000000150000000000000000000000 *000000000100000000000000160000000000000000000000000000000100000000000000170000 *000000000000000000000000000100000000000000180000000000000000000000000000000100 *0000000000001900000000000000000000000000000001000000000000001a0000000000000000 *0000000000000001000000000000001b0000000000000000000000000000000100000000000000 *1c00000000000000000000000000000001000000000000001d0000000000000000000000000000 *0001000000000000001e00000000000000000000000000000001000000000000001f0000000000 *000000000000000000000100000000000000200000000000000000000000000000000100000000 *000000210000000000000000000000000000000100000000000000220000000000000000000000 *000000000100000000000000230000000000000000000000000000000100000000000000240000 *000000000000000000000000000100000000000000250000000000000000000000000000000100 *000000000000260000000000000000000000000000000100000000000000270000000000000000 *000000000000000100000000000000280000000000000000000000000000000100000000000000 *2900000000000000000000000000000001000000000000002a0000000000000000000000000000 *0001000000000000002b0000000000000000000000000000000101000000000000000000000000 *0000000100013b0000006e0000006f0000006e0000002d000000700000006f0000007200000074 *00000061000000620000006c000000650000002000000028000000740000007900000070000000 *650000002000000066000000610000006d000000690000006c0000006900000065000000730000 *002c00000020000000760000006900000065000000770000002000000070000000610000007400 *00007400000065000000720000006e000000730000002c00000020000000750000006e00000062 *0000006f000000780000006500000064000000200000007400000075000000700000006c000000 *650000007300000029010c0000006500000078000000700000006500000072000000690000006d *000000650000006e00000074000000610000006c0110000000650000006b0000006d0000006500 *0000740000007400000040000000670000006d00000061000000690000006c0000002e00000063 *0000006f0000006d30000000000000002c03022e00000045000000780000007400000072000000 *61000000630000007400000020000000610000006e000000640000002000000072000000650000 *00620000006f000000780000002000000074000000680000006500000020000000730000007000 *0000650000006300000069000000610000006c000000690000007a000000650000006400000020 *0000006e0000006f000000640000006500000020000000660000006f000000720000006d000000 *61000000740000000a000000000000002d03022c0000004100000070000000700000006c000000 *790000002000000074000000680000006500000020000000760000006900000065000000770000 *0020000000740000006f0000002000000074000000690000007000000020000000610000006e00 *0000640000002000000062000000690000006e00000020000000630000006f0000006e00000074 *000000690000006e000000750000006100000074000000690000006f0000006e00000073000000 *0a000000000000002e03023600000056000000690000006500000077000000200000006a000000 *750000007300000074000000200000007400000068000000650000002000000076000000610000 *006c000000750000006500000020000000610000006e00000064000000200000006c0000006500 *0000660000007400000020000000610000006e0000006400000020000000720000006900000067 *0000006800000074000000200000006300000068000000690000006c0000006400000020000000 *6f0000006600000020000000610000002000000062000000690000006e0000000a000000000000 *000503010602040000004f00000028000000310000002902250000002e00000020000000540000 *006800000065000000200000006e000000750000006d0000006200000065000000720000002000 *00006f0000006600000020000000650000006c000000650000006d000000650000006e00000074 *0000007300000020000000690000006e0000002000000074000000680000006500000020000000 *7300000065000000740000002e0000000a000000000000000603010602040000004f0000002800 *0000310000002902190000002e0000002000000049000000730000002000000074000000680000 *0069000000730000002000000074000000680000006500000020000000650000006d0000007000 *00007400000079000000200000007300000065000000740000003f0000000a000000000000002f *030216000000530000006d00000061000000720000007400000020000000740000006900000070 *00000020000000630000006f0000006e0000007300000074000000720000007500000063000000 *740000006f000000720000000a0000000000000030030216000000530000006d00000061000000 *72000000740000002000000062000000690000006e00000020000000630000006f0000006e0000 *007300000074000000720000007500000063000000740000006f000000720000000a0000000000 *00003103021100000042000000610000006c000000610000006e00000063000000650000002000 *000074000000680000006500000020000000740000007200000065000000650000000a00000000 *00000032030102100000004100000020000000730000006500000074000000200000006f000000 *660000002000000076000000610000006c00000075000000650000007300000020010702010000 *006102020000002e0000000a000000000000000703010602060000004f000000280000006e0000 *002b0000006d000000290102060000002e00000020000000530000006500000065000000200104 *010000000000000000150000000000000000000000000000000102020000002e0000000a000000 *000000000803010602080000004f000000280000006c0000006f00000067000000200000006e00 *000029021d0000002e000000200000004900000073000000200000007400000068000000650000 *0020000000650000006c000000650000006d000000650000006e00000074000000200000006900 *00006e00000020000000740000006800000065000000200000007300000065000000740000003f *0000000a000000000000000903010602080000004f000000280000006c0000006f000000670000 *00200000006e0000002902210000002e0000002000000049000000730000002000000074000000 *680000006500000020000000650000006c000000650000006d000000650000006e000000740000 *00200000006e0000006f0000007400000020000000690000006e00000020000000740000006800 *000065000000200000007300000065000000740000003f0000000a000000000000000a03010602 *040000004f00000028000000310000002902110000002e00000020000000540000006800000065 *00000020000000650000006d000000700000007400000079000000200000007300000065000000 *740000002e0000000a000000000000000b03010602040000004f00000028000000310000002902 *1a0000002e00000020000000430000007200000065000000610000007400000065000000200000 *00610000002000000073000000690000006e000000670000006c00000065000000740000006f00 *00006e000000200000007300000065000000740000002e0000000a000000000000000c03010602 *080000004f000000280000006c0000006f00000067000000200000006e0000002902200000002e *0000002000000044000000650000006c0000006500000074000000650000002000000061000000 *6e00000020000000650000006c000000650000006d000000650000006e00000074000000200000 *0066000000720000006f0000006d00000020000000610000002000000073000000650000007400 *00002e0000000a000000000000000d03010602060000004f000000280000006e0000002b000000 *6d0000002902390000002e00000020000000490000007300000020000000740000006800000069 *0000007300000020000000610000002000000070000000720000006f0000007000000065000000 *72000000200000007300000075000000620000007300000065000000740000003f000000200000 *002800000069000000650000002e00000020000000610000002000000073000000750000006200 *000073000000650000007400000020000000620000007500000074000000200000006e0000006f *0000007400000020000000650000007100000075000000610000006c000000290000002e000000 *0a000000000000000e03010602060000004f000000280000006e0000002b0000006d0000002901 *02140000002e000000200000004900000073000000200000007400000068000000690000007300 *00002000000061000000200000007300000075000000620000007300000065000000740000003f *0000000a0102010000002001070102040000002800000073000000310000002001040100000000 *000000000e00000000000000000000000000000001020400000020000000730000003200000029 *01020f0000002000000074000000650000006c0000006c00000073000000200000007700000068 *000000650000007400000068000000650000007200000020010702020000007300000031010210 *000000200000006900000073000000200000006100000020000000730000007500000062000000 *730000006500000074000000200000006f00000066000000200107020200000073000000320202 *0000002e0000000a000000000000000f03010602080000004f000000280000006c0000006f0000 *0067000000200000006e0000002902200000002e00000020000000540000006800000065000000 *200000006d000000690000006e000000690000006d000000610000006c00000020000000650000 *006c000000650000006d000000650000006e00000074000000200000006f000000660000002000 *000061000000200000007300000065000000740000002e0000000a000000000000001003010602 *080000004f000000280000006c0000006f00000067000000200000006e0000002902200000002e *00000020000000540000006800000065000000200000006d000000610000007800000069000000 *6d000000610000006c00000020000000650000006c000000650000006d000000650000006e0000 *0074000000200000006f0000006600000020000000610000002000000073000000650000007400 *00002e0000000a000000000000001103010602080000004f000000280000006c0000006f000000 *67000000200000006e00000029021e0000002e0000002000000044000000650000006c00000065 *000000740000006500000020000000740000006800000065000000200000006d00000069000000 *6e000000690000006d000000610000006c00000020000000650000006c000000650000006d0000 *00650000006e000000740000002e0000000a000000000000001203010602080000004f00000028 *0000006c0000006f00000067000000200000006e00000029021e0000002e000000200000004400 *0000650000006c0000006500000074000000650000002000000074000000680000006500000020 *0000006d0000006100000078000000690000006d000000610000006c0000002000000065000000 *6c000000650000006d000000650000006e000000740000002e0000000a00000000000000130301 *021e00000054000000680000006500000020000000750000006e000000690000006f0000006e00 *0000200000006f000000660000002000000061000000200000006c000000690000007300000074 *000000200000006f0000006600000020000000730000006500000074000000730000003a000000 *200000002801070104010000000000000000130000000000000000000000000000000101020400 *0000200000003d0000003d00000020010401000000000000000033000000000000000200000000 *000000030102010000002001040100000000000000001400000000000000000000000000000001 *01020100000020040100000000000000000a000000000000000000000000000000010203000000 *290000002e0000000a000000000000001403010602060000004f000000280000006e0000002b00 *00006d000000290102370000002e00000020000000540000006800000065000000200000007500 *00006e000000690000006f0000006e000000200000006f00000066000000200000007400000077 *0000006f00000020000000730000006500000074000000730000002c0000002000000070000000 *720000006500000066000000650000007200000072000000690000006e00000067000000200000 *007400000068000000650000002000000066000000690000007200000073000000740000002000 *0000730000006500000074000000200000007700000068000000650000006e0000000a01022100 *000020000000650000007100000075000000610000006c00000020000000650000006c00000065 *0000006d000000650000006e000000740000007300000020000000610000007200000065000000 *20000000650000006e000000630000006f000000750000006e0000007400000065000000720000 *0065000000640000002e0000000a01022700000020000000540000006800000065000000200000 *00690000006d000000700000006c000000650000006d000000650000006e000000740000006100 *000074000000690000006f0000006e000000200000007500000073000000650000007300000020 *000000740000006800000065000000200000006500000066000000660000006900000063000000 *69000000650000006e00000074000000200106020b000000680000006500000064000000670000 *00650000002d000000750000006e000000690000006f0000006e01020c00000020000000610000 *006c000000670000006f000000720000006900000074000000680000006d0000002e0000000a01 *022a0000002000000048000000650000006400000067000000650000002d000000750000006e00 *0000690000006f0000006e000000200000006900000073000000200000006d0000006f00000072 *000000650000002000000065000000660000006600000069000000630000006900000065000000 *6e00000074000000200000006f0000006e00000020000000280000006200000069000000670000 *007300000065000000740000002001040100000000000000001400000000000000000000000000 *000001020c00000020000000730000006d000000610000006c0000006c00000073000000650000 *0074000000290000002e0000000a000000000000001503010602060000004f000000280000006e *0000002b0000006d0000002901021b0000002e0000002000000044000000690000006600000066 *0000006500000072000000650000006e0000006300000065000000200000006f00000066000000 *2000000074000000770000006f00000020000000730000006500000074000000730000002e0000 *00200000000a0102260000002000000054000000680000006500000020000000690000006d0000 *00700000006c000000650000006d000000650000006e0000007400000061000000740000006900 *00006f0000006e000000200000007500000073000000650000007300000020000000610000006e *00000020000000650000006600000066000000690000006300000069000000650000006e000000 *740000002001060205000000680000006500000064000000670000006501021b00000020000000 *610000006c000000670000006f000000720000006900000074000000680000006d000000200000 *00630000006f0000006d00000070000000610000007200000061000000620000006c0000006500 *00002000000077000000690000007400000068000000200106020b000000680000006500000064 *00000067000000650000002d000000750000006e000000690000006f0000006e02020000002e00 *00000a00000000000000160103010602060000004f000000280000006e0000002b0000006d0000 *00290102200000002e0000002000000054000000680000006500000020000000690000006e0000 *0074000000650000007200000073000000650000006300000074000000690000006f0000006e00 *0000200000006f000000660000002000000074000000770000006f000000200000007300000065 *00000074000000730000002e0000000a024000000020000000450000006c000000650000006d00 *0000650000006e0000007400000073000000200000006f00000066000000200000007400000068 *0000006500000020000000720000006500000073000000750000006c0000007400000020000000 *630000006f0000006d000000650000002000000066000000720000006f0000006d000000200000 *007400000068000000650000002000000066000000690000007200000073000000740000002000 *00007300000065000000740000002c00000020000000730000006f00000020000000660000006f *00000072000000200000006500000078000000610000006d000000700000006c00000065000000 *0a010b01022000000020000000690000006d000000700000006f00000072000000740000002000 *00007100000075000000610000006c000000690000006600000069000000650000006400000020 *000000440000006100000074000000610000002e00000053000000650000007400000020000000 *610000007300000020000000530000000a01021f00000020000000640000006100000074000000 *61000000200000004100000042000000200000003d0000002000000041000000200000007c0000 *002000000042000000200000006400000065000000720000006900000076000000690000006e00 *0000670000002000000053000000680000006f000000770000000a010228000000200000006900 *00006e0000007300000074000000610000006e0000006300000065000000200000004f00000072 *000000640000002000000041000000420000002000000077000000680000006500000072000000 *6500000020000000630000006f0000006d00000070000000610000007200000065000000200000 *005f000000200000005f000000200000003d0000002000000045000000510000000a0102240000 *0020000000690000006e0000007300000074000000610000006e00000063000000650000002000 *000045000000710000002000000041000000420000002000000077000000680000006500000072 *00000065000000200000005f000000200000003d0000003d000000200000005f00000020000000 *3d00000020000000540000007200000075000000650000000a01023d000000200000006d000000 *61000000690000006e000000200000003d000000200000007000000072000000690000006e0000 *00740000002000000028000000530000002e00000073000000690000006e000000670000006c00 *000065000000740000006f0000006e00000020000000410000002000000060000000530000002e *000000690000006e00000074000000650000007200000073000000650000006300000074000000 *690000006f0000006e0000006000000020000000530000002e00000073000000690000006e0000 *00670000006c00000065000000740000006f0000006e00000020000000420000002c0000000a02 *3d0000002000000020000000200000002000000020000000200000002000000020000000200000 *00200000002000000020000000200000002000000020000000530000002e000000730000006900 *00006e000000670000006c00000065000000740000006f0000006e000000200000004200000020 *00000060000000530000002e000000690000006e00000074000000650000007200000073000000 *650000006300000074000000690000006f0000006e0000006000000020000000530000002e0000 *0073000000690000006e000000670000006c00000065000000740000006f0000006e0000002000 *000041000000290000000a030102070000007000000072000000690000006e0000007400000073 *00000020010701020c0000002800000066000000720000006f0000006d0000004c000000690000 *007300000074000000200000005b000000410102010000005d01020c0000002c00000066000000 *720000006f0000006d0000004c000000690000007300000074000000200000005b000000420102 *010000005d02010000002902020000002e0000000a000000000000001703010602040000004f00 *0000280000006e0000002902320000002e0000002000000046000000690000006c000000740000 *00650000007200000020000000610000006c0000006c00000020000000650000006c0000006500 *00006d000000650000006e00000074000000730000002000000074000000680000006100000074 *000000200000007300000061000000740000006900000073000000660000007900000020000000 *740000006800000065000000200000007000000072000000650000006400000069000000630000 *006100000074000000650000002e0000000a000000000000001803010602040000004f00000028 *0000006e000000290102460000002e000000200000005000000061000000720000007400000069 *00000074000000690000006f0000006e0000002000000074000000680000006500000020000000 *73000000650000007400000020000000690000006e000000740000006f00000020000000740000 *00770000006f00000020000000730000006500000074000000730000002c000000200000006f00 *00006e00000065000000200000007700000069000000740000006800000020000000610000006c *0000006c00000020000000650000006c000000650000006d000000650000006e00000074000000 *730000002000000074000000680000006100000074000000200000007300000061000000740000 *00690000007300000066000000790000000a010231000000200000007400000068000000650000 *002000000070000000720000006500000064000000690000006300000061000000740000006500 *000020000000610000006e00000064000000200000006f0000006e000000650000002000000077 *00000069000000740000006800000020000000610000006c0000006c0000002000000065000000 *6c000000650000006d000000650000006e00000074000000730000002000000074000000680000 *00610000007400000020000000640000006f0000006e0102010000002701021900000074000000 *200000007300000061000000740000006900000073000000660000007900000020000000740000 *006800000065000000200000007000000072000000650000006400000069000000630000006100 *000074000000650000002e0000000a01020a000000200000005300000065000000650000002000 *0000610000006c000000730000006f000000200104010000000000000000220000000000000000 *000000000000000102020000002e0000000a000000000000001901030106020a0000004f000000 *280000006e0000002a0000006c0000006f00000067000000200000006e00000029010203000000 *2e000000200000000a010201000000200107010401000000000000000019000000000000000000 *000000000000010204000000200000006600000020000000730102210000002000000069000000 *730000002000000074000000680000006500000020000000730000006500000074000000200000 *006f000000620000007400000061000000690000006e0000006500000064000000200000006200 *000079000000200000006100000070000000700000006c00000079000000690000006e00000067 *00000020010702010000006601021400000020000000740000006f000000200000006500000061 *000000630000006800000020000000650000006c000000650000006d000000650000006e000000 *74000000200000006f0000006600000020010702010000007302020000002e0000000a03010202 *00000049000000740102010000002701023e0000007300000020000000770000006f0000007200 *00007400000068000000200000006e0000006f00000074000000690000006e0000006700000020 *000000740000006800000061000000740000002000000074000000680000006500000020000000 *73000000690000007a00000065000000200000006f000000660000002000000074000000680000 *006500000020000000720000006500000073000000750000006c00000074000000200000006d00 *0000610000007900000020000000620000006500000020000000730000006d000000610000006c *0000006c00000065000000720000002000000069000000660000002c0000000a01020a00000020 *000000660000006f0000007200000020000000730000006f0000006d0000006500000020010702 *0500000028000000780000002c00000079000000290102020000002c0000002001070102020000 *0078000000200102010000002f0102040000003d00000020000000790000002001020100000026 *01020100000026020b00000020000000660000002000000078000000200000003d0000003d0000 *002000000066000000200000007902010000000a000000000000001a0103010602040000004f00 *0000280000006e0000002902070000002e00000020000000540000006800000065000000200000 *000a0103010701040100000000000000001a000000000000000000000000000000010102080000 *0020000000660000002000000073000000200000003d0000003d00000020010401000000000000 *000019000000000000000000000000000000010204000000200000006600000020000000730102 *160000002c0000002000000062000000750000007400000020000000770000006f000000720000 *006b00000073000000200000006f0000006e0000006c0000007900000020000000770000006800 *0000650000006e00000020010702010000006601020f0000002000000069000000730000002000 *00006d0000006f0000006e0000006f000000740000006f0000006e00000069000000630000002e *0000000a0102010000002001060220000000540000006800000065000000200000007000000072 *00000065000000630000006f0000006e000000640000006900000074000000690000006f000000 *6e000000200000006900000073000000200000006e0000006f0000007400000020000000630000 *006800000065000000630000006b00000065000000640000002e0102010000000a021900000020 *00000053000000650000006d000000690000002d000000660000006f000000720000006d000000 *610000006c0000006c000000790000002c00000020000000770000006500000020000000680000 *006100000076000000650000003a0000000a0b01022f00000020000000610000006e0000006400 *0000200000005b00000078000000200000003c0000002000000079000000200000003d0000003d *0000003e00000020000000660000002000000078000000200000003c0000002000000066000000 *2000000079000000200000007c0000002000000078000000200000003c0000002d000000200000 *006c000000730000002c0000002000000079000000200000003c0000002d000000200000006c00 *0000730000005d000000200000000a010235000000200000002000000020000000200000002000 *000020000000200000002000000020000000200000002000000020000000200000002000000020 *0000002000000020000000200000002000000020000000200000003d0000003d0000003e000000 *200000006d00000061000000700000004d0000006f0000006e0000006f000000740000006f0000 *006e000000690000006300000020000000660000002000000073000000200000003d0000003d00 *0000200000006d0000006100000070000000200000006600000020000000730000000a02190000 *002000000020000000200000002000000020000000770000006800000065000000720000006500 *0000200000006c00000073000000200000003d00000020000000740000006f0000004c00000069 *000000730000007400000020000000730000000a000000000000001b03010602040000004f0000 *00280000006e00000029023b0000002e00000020000000460000006f0000006c00000064000000 *200000006f00000076000000650000007200000020000000740000006800000065000000200000 *00650000006c000000650000006d000000650000006e0000007400000073000000200000006f00 *00006600000020000000610000002000000073000000650000007400000020000000690000006e *00000020000000610000006e00000020000000750000006e000000730000007000000065000000 *630000006900000066000000690000006500000064000000200000006f00000072000000640000 *0065000000720000002e0000000a000000000000003403010602040000004f000000280000006e *0000002902130000002e00000020000000500000006f00000073000000740000002d0000006f00 *00007200000064000000650000007200000020000000660000006f0000006c000000640000002e *0000000a000000000000001c03010602040000004f000000280000006e0000002902190000002e *0000002000000054000000680000006500000020000000650000006c000000650000006d000000 *650000006e0000007400000073000000200000006f000000660000002000000061000000200000 *007300000065000000740000002e0000000a000000000000001d03010602040000004f00000028 *0000006e0000002902290000002e00000020000000430000006f0000006e000000760000006500 *000072000000740000002000000074000000680000006500000020000000730000006500000074 *00000020000000740000006f0000002000000061000000200000006c0000006900000073000000 *74000000200000006f0000006600000020000000650000006c000000650000006d000000650000 *006e00000074000000730000002e0000000a000000000000001e03010602040000004f00000028 *0000006e0000002902340000002e00000020000000430000006f0000006e000000760000006500 *000072000000740000002000000074000000680000006500000020000000730000006500000074 *00000020000000740000006f00000020000000610000006e000000200000006100000073000000 *63000000650000006e00000064000000690000006e00000067000000200000006c000000690000 *007300000074000000200000006f0000006600000020000000650000006c000000650000006d00 *0000650000006e00000074000000730000002e0000000a000000000000001f030106020a000000 *4f000000280000006e0000002a0000006c0000006f00000067000000200000006e000000290228 *0000002e0000002000000043000000720000006500000061000000740000006500000020000000 *61000000200000007300000065000000740000002000000066000000720000006f0000006d0000 *002000000061000000200000006c000000690000007300000074000000200000006f0000006600 *000020000000650000006c000000650000006d000000650000006e00000074000000730000002e *0000000a000000000000002003010602040000004f000000280000006e00000029010235000000 *2e000000200000004200000075000000690000006c000000640000002000000061000000200000 *007300000065000000740000002000000066000000720000006f0000006d000000200000006100 *00006e00000020000000610000007300000063000000650000006e00000064000000690000006e *00000067000000200000006c00000069000000730000007400000020000000690000006e000000 *200000006c000000690000006e0000006500000061000000720000002000000074000000690000 *006d000000650000002e0000000a010201000000200106023a0000005400000068000000650000 *0020000000700000007200000065000000630000006f0000006e00000064000000690000007400 *0000690000006f0000006e0000002000000028000000690000006e000000700000007500000074 *000000200000006c00000069000000730000007400000020000000690000007300000020000000 *610000007300000063000000650000006e00000064000000690000006e00000067000000290000 *00200000006900000073000000200000006e0000006f0000007400000020000000630000006800 *000065000000630000006b00000065000000640000002e02010000000a00000000000000210301 *0602040000004f000000280000006e0000002901024a0000002e00000020000000420000007500 *0000690000006c0000006400000020000000610000002000000073000000650000007400000020 *00000066000000720000006f0000006d00000020000000610000006e0000002000000061000000 *7300000063000000650000006e00000064000000690000006e00000067000000200000006c0000 *00690000007300000074000000200000006f000000660000002000000064000000690000007300 *000074000000690000006e000000630000007400000020000000650000006c000000650000006d *000000650000006e000000740000007300000020000000690000006e000000200000006c000000 *690000006e0000006500000061000000720000002000000074000000690000006d000000650000 *002e0000000a010201000000200106024300000054000000680000006500000020000000700000 *007200000065000000630000006f0000006e000000640000006900000074000000690000006f00 *00006e0000002000000028000000690000006e000000700000007500000074000000200000006c *000000690000007300000074000000200000006900000073000000200000007300000074000000 *720000006900000063000000740000006c00000079000000200000006100000073000000630000 *00650000006e00000064000000690000006e000000670000002900000020000000690000007300 *0000200000006e0000006f0000007400000020000000630000006800000065000000630000006b *00000065000000640000002e02010000000a000000000000002203010602080000004f00000028 *0000006c0000006f00000067000000200000006e000000290102120000002e0000002000000054 *000000680000006500000020000000650000007800000070000000720000006500000073000000 *73000000690000006f0000006e0000002000000028010701040100000000000000002200000000 *000000000000000000000001020600000020000000780000002000000073000000650000007401 *020c00000029000000200000006900000073000000200000006100000020000000700000006100 *00006900000072000000200107020b00000028000000730000006500000074000000310000002c *00000073000000650000007400000032000000290102010000000a010207000000200000007700 *000068000000650000007200000065000000200107020400000073000000650000007400000031 *01021b00000020000000630000006f0000006d0000007000000072000000690000007300000065 *000000730000002000000074000000680000006500000020000000650000006c00000065000000 *6d000000650000006e0000007400000073000000200000006f0000006600000020010702030000 *0073000000650000007401020b000000200000006c000000650000007300000073000000200000 *007400000068000000610000006e00000020010702010000007801020500000020000000610000 *006e000000640000002001070204000000730000006500000074000000320102010000000a0102 *1b00000020000000630000006f0000006d00000070000000720000006900000073000000650000 *00730000002000000074000000680000006500000020000000650000006c000000650000006d00 *0000650000006e0000007400000073000000200000006f00000066000000200107020300000073 *000000650000007401020e00000020000000670000007200000065000000610000007400000065 *00000072000000200000007400000068000000610000006e000000200107020100000078020200 *00002e0000000a000000000000002303010602080000004f000000280000006c0000006f000000 *67000000200000006e0000002901020d0000002e00000020000000500000006500000072000000 *660000006f000000720000006d0000007300000020000000610000002001040100000000000000 *002200000000000000000000000000000001010224000000200000006200000075000000740000 *0020000000610000006c000000730000006f000000200000007200000065000000740000007500 *0000720000006e0000007300000020000000770000006800000065000000740000006800000065 *000000720000002000000074000000680000006500000020000000700000006900000076000000 *6f000000740000000a022800000020000000650000006c000000650000006d000000650000006e *000000740000002000000077000000610000007300000020000000660000006f00000075000000 *6e0000006400000020000000690000006e00000020000000740000006800000065000000200000 *006f000000720000006900000067000000690000006e000000610000006c000000200000007300 *000065000000740000002e0000000a000000000000003503010602080000004f00000028000000 *6c0000006f00000067000000200000006e0000002901020d0000002e0000002000000050000000 *6500000072000000660000006f000000720000006d000000730000002000000061000000200104 *010000000000000000220000000000000000000000000000000101021c00000020000000620000 *00750000007400000020000000610000006c000000730000006f00000020000000720000006500 *00007400000075000000720000006e000000730000002000000074000000680000006500000020 *0000007000000069000000760000006f000000740000000a022d00000020000000650000006c00 *0000650000006d000000650000006e000000740000002000000074000000680000006100000074 *0000002000000077000000610000007300000020000000660000006f000000750000006e000000 *6400000020000000690000006e00000020000000740000006800000065000000200000006f0000 *00720000006900000067000000690000006e000000610000006c00000020000000730000006500 *0000740000002e0000000a00000000000000240103010602080000004f000000280000006c0000 *006f00000067000000200000006e0000002902270000002e000000200000004400000065000000 *6c00000065000000740000006500000020000000610000006e0000006400000020000000660000 *00690000006e0000006400000020000000740000006800000065000000200000006d0000006900 *00006e000000690000006d000000610000006c00000020000000650000006c000000650000006d *000000650000006e000000740000002e0000000a0b02320000002000000064000000650000006c *00000065000000740000006500000046000000690000006e000000640000004d00000069000000 *6e00000020000000730000006500000074000000200000003d0000002000000028000000660000 *00690000006e000000640000004d000000690000006e0000002000000073000000650000007400 *00002c0000002000000064000000650000006c0000006500000074000000650000004d00000069 *0000006e00000020000000730000006500000074000000290000000a0000000000000025010301 *0602080000004f000000280000006c0000006f00000067000000200000006e0000002902270000 *002e0000002000000044000000650000006c000000650000007400000065000000200000006100 *00006e000000640000002000000066000000690000006e00000064000000200000007400000068 *00000065000000200000006d0000006100000078000000690000006d000000610000006c000000 *20000000650000006c000000650000006d000000650000006e000000740000002e0000000a0b02 *320000002000000064000000650000006c00000065000000740000006500000046000000690000 *006e000000640000004d0000006100000078000000200000007300000065000000740000002000 *00003d000000200000002800000066000000690000006e000000640000004d0000006100000078 *000000200000007300000065000000740000002c0000002000000064000000650000006c000000 *6500000074000000650000004d0000006100000078000000200000007300000065000000740000 *00290000000a000000000000002603010602080000004f000000280000006c0000006f00000067 *000000200000006e000000290102340000002e0000002000000052000000650000007400000072 *000000690000006500000076000000650000007300000020000000740000006800000065000000 *200000006d000000690000006e000000690000006d000000610000006c000000200000006b0000 *006500000079000000200000006f00000066000000200000007400000068000000650000002000 *00007300000065000000740000002c00000020000000610000006e000000640000002000000074 *0000006800000065000000200000007300000065000000740000000a01021e0000002000000073 *00000074000000720000006900000070000000700000006500000064000000200000006f000000 *66000000200000007400000068000000610000007400000020000000650000006c000000650000 *006d000000650000006e000000740000002c000000200000006f00000072000000200104010000 *000000000000360000000000000002000000000000000402190000002000000069000000660000 *002000000070000000610000007300000073000000650000006400000020000000610000006e00 *000020000000650000006d00000070000000740000007900000020000000730000006500000074 *0000002e0000000a000000000000002703010602080000004f000000280000006c0000006f0000 *0067000000200000006e000000290102340000002e000000200000005200000065000000740000 *007200000069000000650000007600000065000000730000002000000074000000680000006500 *0000200000006d0000006100000078000000690000006d000000610000006c000000200000006b *0000006500000079000000200000006f0000006600000020000000740000006800000065000000 *200000007300000065000000740000002c00000020000000610000006e00000064000000200000 *00740000006800000065000000200000007300000065000000740000000a01021e000000200000 *007300000074000000720000006900000070000000700000006500000064000000200000006f00 *000066000000200000007400000068000000610000007400000020000000650000006c00000065 *0000006d000000650000006e000000740000002c000000200000006f0000007200000020010401 *000000000000000036000000000000000200000000000000040219000000200000006900000066 *000000200000007000000061000000730000007300000065000000640000002000000061000000 *6e00000020000000650000006d0000007000000074000000790000002000000073000000650000 *00740000002e0000000a000000000000002803010602040000004f000000280000006e00000029 *01023b0000002e0000002000000053000000680000006f00000077000000200000007400000068 *000000650000002000000074000000720000006500000065000000200000007400000068000000 *610000007400000020000000690000006d000000700000006c000000650000006d000000650000 *006e00000074000000730000002000000074000000680000006500000020000000730000006500 *0000740000002e0000002000000054000000680000006500000020000000740000007200000065 *000000650000002000000069000000730000002000000073000000680000006f00000077000000 *6e0000000a022200000020000000690000006e000000200000006100000020000000630000006f *0000006d000000700000007200000065000000730000007300000065000000640000002c000000 *2000000068000000610000006e00000067000000690000006e0000006700000020000000660000 *006f000000720000006d00000061000000740000002e0000000a00000000000000290103010602 *040000004f000000280000006e000000290102120000002e000000200000005400000068000000 *650000002000000065000000780000007000000072000000650000007300000073000000690000 *006f0000006e00000020000000280107021a00000073000000680000006f000000770000005400 *000072000000650000006500000057000000690000007400000068000000200000006800000061 *0000006e000000670000002000000077000000690000006400000065000000200000006d000000 *6100000070010208000000290000002000000073000000680000006f0000007700000073000000 *0a0102260000002000000074000000680000006500000020000000740000007200000065000000 *65000000200000007400000068000000610000007400000020000000690000006d000000700000 *006c000000650000006d000000650000006e000000740000007300000020000000740000006800 *000065000000200000007300000065000000740000002e00000020000000490000006600000020 *0107020400000068000000610000006e000000670102040000002000000069000000730000000a *0102010000002001070204000000540000007200000075000000650102040000002c0000002000 *000061000000200106020700000068000000610000006e00000067000000690000006e00000067 *010235000000200000007400000072000000650000006500000020000000690000007300000020 *00000073000000680000006f000000770000006e000000200000006f0000007400000068000000 *650000007200000077000000690000007300000065000000200000006100000020000000720000 *006f00000074000000610000007400000065000000640000002000000074000000720000006500 *0000650000002000000069000000730000002000000073000000680000006f000000770000006e *0000002e0000002000000049000000660000000a01020100000020010702040000007700000069 *000000640000006501020400000020000000690000007300000020010401000000000000000037 *0000000000000005000000000000000602220000002c00000020000000610000006e0000002000 *000065000000780000007400000072000000610000002000000077000000690000006400000065 *0000002000000076000000650000007200000073000000690000006f0000006e00000020000000 *69000000730000002000000073000000680000006f000000770000006e0000002e0000000a0b01 *0246000000200000005300000065000000740000003e0000002000000070000000750000007400 *00005300000074000000720000004c0000006e0000002000000024000000200000007300000068 *0000006f0000007700000054000000720000006500000065000000570000006900000074000000 *6800000020000000540000007200000075000000650000002000000046000000610000006c0000 *00730000006500000020000000240000002000000066000000720000006f0000006d0000004400 *0000690000007300000074000000690000006e0000006300000074000000410000007300000063 *0000004c000000690000007300000074000000200000005b000000310000002e0000002e000000 *350000005d0000000a01020300000020000000340000000a010206000000200000002b0000002d *0000002d000000320000000a010209000000200000007c00000020000000200000002b0000002d *0000002d000000310000000a010209000000200000007c00000020000000200000002b0000002d *0000002d000000330000000a010206000000200000002b0000002d0000002d000000350000000a *010202000000200000000a010245000000200000005300000065000000740000003e0000002000 *00007000000075000000740000005300000074000000720000004c0000006e0000002000000024 *0000002000000073000000680000006f0000007700000054000000720000006500000065000000 *570000006900000074000000680000002000000054000000720000007500000065000000200000 *005400000072000000750000006500000020000000240000002000000066000000720000006f00 *00006d00000044000000690000007300000074000000690000006e000000630000007400000041 *00000073000000630000004c000000690000007300000074000000200000005b00000031000000 *2e0000002e000000350000005d0000000a01020300000020000000340000000a01020300000020 *0000007c0000000a010206000000200000002b0000002d0000002d000000320000000a01020600 *0000200000007c00000020000000200000007c0000000a010209000000200000007c0000002000 *0000200000002b0000002d0000002d000000310000000a010206000000200000007c0000002000 *0000200000007c0000000a010209000000200000007c00000020000000200000002b0000002d00 *00002d000000330000000a010203000000200000007c0000000a010206000000200000002b0000 *002d0000002d000000350000000a010202000000200000000a0102460000002000000053000000 *65000000740000003e000000200000007000000075000000740000005300000074000000720000 *004c0000006e00000020000000240000002000000073000000680000006f000000770000005400 *000072000000650000006500000057000000690000007400000068000000200000004600000061 *0000006c0000007300000065000000200000005400000072000000750000006500000020000000 *240000002000000066000000720000006f0000006d000000440000006900000073000000740000 *00690000006e00000063000000740000004100000073000000630000004c000000690000007300 *000074000000200000005b000000310000002e0000002e000000350000005d0000000a01020600 *0000200000002b0000002d0000002d000000350000000a010203000000200000007c0000000a01 *020300000020000000340000000a010203000000200000007c0000000a01020900000020000000 *7c00000020000000200000002b0000002d0000002d000000330000000a01020600000020000000 *7c00000020000000200000007c0000000a010206000000200000002b0000002d0000002d000000 *320000000a010206000000200000002000000020000000200000007c0000000a02090000002000 *00002000000020000000200000002b0000002d0000002d000000310000000a000000000000002a *03010602040000004f000000280000006e00000029022f0000002e000000200000005400000065 *000000730000007400000020000000690000006600000020000000740000006800000065000000 *20000000690000006e0000007400000065000000720000006e000000610000006c000000200000 *007300000065000000740000002000000073000000740000007200000075000000630000007400 *00007500000072000000650000002000000069000000730000002000000076000000610000006c *00000069000000640000002e0000000a000000000000002b03010602080000004f000000280000 *006c0000006f00000067000000200000006e0000002901021e0000002e00000020000000490000 *006e0000007300000065000000720000007400000020000000610000006e000000200000006500 *00006c000000650000006d000000650000006e0000007400000020000000690000006e00000020 *00000061000000200000007300000065000000740000002e0000000a0102420000002000000049 *000000660000002000000074000000680000006500000020000000730000006500000074000000 *20000000610000006c000000720000006500000061000000640000007900000020000000630000 *006f0000006e0000007400000061000000690000006e0000007300000020000000610000006e00 *000020000000650000006c000000650000006d000000650000006e000000740000002000000065 *0000007100000075000000610000006c00000020000000740000006f0000002000000074000000 *680000006500000020000000670000006900000076000000650000006e00000020000000760000 *00610000006c00000075000000650000002c0000000a0224000000200000006900000074000000 *200000006900000073000000200000007200000065000000700000006c00000061000000630000 *006500000064000000200000007700000069000000740000006800000020000000740000006800 *000065000000200000006e00000065000000770000002000000076000000610000006c00000075 *000000650000002e0000000a2c0000000000000000000000000000000100000000000000020000 *000000000003000000000000000400000000000000050000000000000006000000000000000700 *000000000000080000000000000009000000000000000a000000000000000b000000000000000c *000000000000000d000000000000000e000000000000000f000000000000001000000000000000 *110000000000000012000000000000001300000000000000140000000000000015000000000000 *0016000000000000001700000000000000180000000000000019000000000000001a0000000000 *00001b000000000000001c000000000000001d000000000000001e000000000000001f00000000 *000000200000000000000021000000000000002200000000000000230000000000000024000000 *000000002500000000000000260000000000000027000000000000002800000000000000290000 *00000000002a000000000000002b2c000000000000000400000000000000030000000000000000 *000000000000000100000000000000020000000000000007000000000000000600000000000000 *0500000000000000080000000000000009000000000000000e000000000000000d000000000000 *000a000000000000000b000000000000002b000000000000000c00000000000000140000000000 *000013000000000000001500000000000000160000000000000017000000000000001800000000 *0000002200000000000000230000000000000019000000000000001a000000000000001b000000 *000000000f00000000000000100000000000000011000000000000001200000000000000240000 *00000000002500000000000000270000000000000026000000000000001c000000000000001d00 *0000000000001f000000000000001e000000000000002000000000000000210000000000000028 *0000000000000029000000000000002a0000000000000038000000000000000000000000000000 *010300000000000000070000000000000000000000000000000101000000000000000700000000 *000000000000000000000001000000000000000008000000000000000000000000000000010300 *000000000000090000000000000000000000000000000103000000000000000a00000000000000 *00000000000000000100000000000000000b000000000000000000000000000000010000000000 *0000000c0000000000000000000000000000000100000000000000000d00000000000000000000 *00000000000100000000000000000e000000000000000000000000000000010000000000000000 *0f0000000000000000000000000000000100000000000000001000000000000000000000000000 *000001000000000000000011000000000000000000000000000000010000000000000000120000 *000000000000000000000000000100000000000000001300000000000000000000000000000001 *000000000000000014000000000000000000000000000000010000000000000000150000000000 *000000000000000000000100000000000000001600000000000000000000000000000001000000 *000000000017000000000000000000000000000000010000000000000000180000000000000000 *000000000000000100000000000000001900000000000000000000000000000001000000000000 *00001a0000000000000000000000000000000100000000000000001b0000000000000000000000 *000000000100000000000000001c0000000000000000000000000000000100000000000000001d *0000000000000000000000000000000100000000000000001e0000000000000000000000000000 *000100000000000000001f00000000000000000000000000000001000000000000000020000000 *000000000000000000000000010000000000000000210000000000000000000000000000000100 *000000000000002200000000000000000000000000000001000000000000000023000000000000 *000000000000000000010000000000000000240000000000000000000000000000000100000000 *000000002500000000000000000000000000000001000000000000000026000000000000000000 *000000000000010000000000000000270000000000000000000000000000000100000000000000 *002800000000000000000000000000000001000000000000000029000000000000000000000000 *0000000100000000000000002a0000000000000000000000000000000100000000000000002b00 *00000000000000000000000000000100000000000000002c000000000000000000000000000000 *0100000000000000002d0000000000000000000000000000000100000000000000002e00000000 *00000000000000000000000100000000000000002f000000000000000000000000000000010000 *000000000000300000000000000000000000000000000100000000000000003100000000000000 *000000000000000001000000000000000032000000000000000000000000000000010000000000 *000000330000000000000000000000000000000100000000000000003400000000000000000000 *000000000001000000000000000035000000000000000000000000000000010000000000000000 *360000000000000000000000000000000100000000000000003700000000000000000000000000 *0000010300000000000000380000000000000002000000000000003900000000000000003a0000 *000000000000000000000000000100000000000000003b00000000000000000000000000000001 *00000000000000003c0000000000000002000000000000000401000000000000003d0000000000 *000005000000000000000601000000000000003e000000000000003f0000000000000018756e62 *6f7865642d636f6e7461696e6572732d302e302e320000000000000010446174612e5365742e55 *6e626f7865640000000000000004626173650000000000000009446174612e4c69737400000000 *0000000a446174612e4d6179626500000000000000086768632d7072696d000000000000000847 *48432e426f6f6c0000000000000005426f7865640000000000000008676574426f786564000000 *00000000025553000000000000000455536574000000000000000473697a650000000000000004 *6e756c6c00000000000000025c5c00000000000000066d656d62657200000000000000096e6f74 *4d656d6265720000000000000005656d707479000000000000000973696e676c65746f6e000000 *000000000664656c6574650000000000000010697350726f7065725375627365744f6600000000 *0000000a69735375627365744f66000000000000000766696e644d696e00000000000000076669 *6e644d6178000000000000000964656c6574654d696e000000000000000964656c6574654d6178 *0000000000000006756e696f6e730000000000000005756e696f6e000000000000000a64696666 *6572656e6365000000000000000c696e74657273656374696f6e000000000000000666696c7465 *720000000000000009706172746974696f6e00000000000000036d6170000000000000000c6d61 *704d6f6e6f746f6e69630000000000000004666f6c640000000000000005656c656d7300000000 *00000006746f4c6973740000000000000009746f4173634c697374000000000000000866726f6d *4c697374000000000000000b66726f6d4173634c697374000000000000001366726f6d44697374 *696e63744173634c697374000000000000000573706c6974000000000000000b73706c69744d65 *6d626572000000000000000d64656c65746546696e644d696e000000000000000d64656c657465 *46696e644d617800000000000000076d696e5669657700000000000000076d6178566965770000 *00000000000873686f7754726565000000000000000c73686f7754726565576974680000000000 *00000576616c69640000000000000006696e736572740000000000000004766965770000000000 *000005766965776b00000000000000077669657742696e00000000000000037469700000000000 *00000362696e000000000000000762616c616e6365000000000000000353657400000000000000 *084748432e4c6973740000000000000005666f6c646c0000000000000005666f6c647200000000 *0000000b73706c69744c6f6f6b757000000000000000074e6f7468696e67000000000000000454 *727565 addfile ./unboxed-containers-0.0.2.tar.gz binary ./unboxed-containers-0.0.2.tar.gz oldhex * newhex *1f8b0800000000000003ed7d7b7bdb36b277ff3dfc145837cf5adad2b2653b4eea8db2761227d5 *ae13676d67bbfb383e2925d1163794a892542ca7e9f9ecefcc0024c1ab008a4e93be559e582201 *0ce6f21b5c0600399f0ebc853dda187ad3d072a6b61f6c6c75b63adb9bdf34f7d982cf83fbf7e9 *1b3ed96ffadded76f7f6ee3fd8dadbdbf966abbb737fbbfb0dbbdf200fa59f79105a3eb0b22a9d *ac705fc9675e66ffe3fed3a35767474dd481fad8dbdd2db3fff683fb0f32f6dfbdbf0bf6ff2c4a *fcffdcfe4fbdd9adef5c8f43d61ab6d9f6d6d6f7ec687463f923f68f891d86c6a1eb324a0f986f *07b6ffc11e750ce3d41e3941e83b8379e87853664d476c1ed8cc99b2c09bfb439bee0c9ca9e5df *b22bcf9f0426bb71c231f37cfaf6e6a131f146ce9533b49080c92cdf6633db9f3861688fd8ccf7 *3e3823f8118ead10fed840c475bd1b677acd00a823070b0558c80026f70d83c1e72f2ccd55c0bc *ab889da137b2d9044c0d4220cc89a635f03e6092500011616cea85ced0362187133017e82119b9 *d2e928c311543a742d6762fb9d324ea046491b112720e6680edcc5cc08166296f4991114129698 *1076e40de7131b7c3c32d826d8c283149f4dacd0f61dcb0d62bd0b2a64322a2c0913cbf8ca76a8 *3866985a131b59eb079635647ff7a67600bc2769640baa2d1671ca297a7e000cdcb2818d080269 *3c664f4770d746b00043132fb419d7146070049c7e8819bc8264ae9bc0bb0a6f1044025e2c98d9 *43c417147510753e226bca3116045c8ef31ffa67ecece4f9f98f87a7470c7ebf3e3df957ffd9d1 *33f6e43fecfc8723f6f4e4f57f4efb2f7e38673f9c1c3f3b3a3d6387af9ec1dd57e7a7fd276fce *4f4ecf8cb5c33328b9460987affec38efefdfaf4e8ec8c9d9cb2fecbd7c77d2006d44f0f5f9df7 *8fce4cd67ff5f4f8cdb3feab17260302ecd5c9b971dc7fd93f876ce72726559a2fc64e9eb39747 *a74f7f80cbc327fde3fef97fa8bee7fdf35758d7f39353e390bd3e3c3def3f7d737c78ca5ebf39 *7d7d7276c450ac67fdb3a7c787fd9747cf3a503bd4c88efe75f4ea9c9dfd70787c9c96d238f9f1 *d5d129b22e8bc89e1cb1e3fee193e323ac88847cd63f3d7a7a8ed224bf9e82e280bd63d3387b7d *f4b40f3f40174720cbe1e97f4c41f3ece89f6f201324b267872f0f5f8068ad251a01933c7d737a *f4125906359cbd797276de3f7f737ec45e9c9c3c233d9f1d9dfe0b3aabb3bfb2e3933352d69bb3 *23d37876787e48150309d01424c3ef276fcefaa4b3feabf3a3d3d337afcffb27afda60de1f412b *c0e321147d46ca3d7985a202468e4e4eff83445107a47b93fdf8c311dc3f457d92a60e510567a0 *b1a7e77236a80f14786e2432b257472f8efb2f8e5e3d3dc2d413a4f263ffeca80da6ea9f61863e *550bc6873adf90c86822e0caa09f12604d3224eb3f6787cffed547b6456630fd595fc08454f6f4 *07a1ee8e916bff4bfbff27f674389e58fefbce3858b18f59d2ffef6e777732fdfffd07bb0ffee8 *ff3fc7c799cc3c3f6467b741684f3aa7d0317813237df31cfa917e18dd7c8a2db7e7768e16437b *469d49cbfe60b973e844dad93caf2ddf725ddbed9c853ea45f3b766044797e9e5b2e34d0d0e43f *b342ab736687cc0ad85949727f1a8a1cfd72029d371ccc98ed8d61205b6cc216acc766f3105860 *ad09fbee3bb6c6d6daecf16316925c09fb6cd136a07b1edac7d8d14e980b05058d96cb7e9a07d0 *bffec466964fe9fef4aa6d1853c8b3fdbfdd8720d614803485debcc595c8162613bf6edbacf738 *ba682d4cb8be81ae9077f73ebf7d0d845a2dcb1cb4cdebf57539037e20e11a6ef6e2dc49ca80e7 *4f92d625b2a740d3b54c17a8b6c696391eb4db7a350101283fb6da1555629e01d2c6ba2bf5608a *1f1fb30a313f56a9c41c12ab0d6885d28682989458a833d31d466a33c74359738a0c692baf9445 *cc35442688d7bc8e6f621d2fd5f68da9a06f73c405bc739553ea28aa4b4e2e3389e98e24ab98e3 *51da30aa9cdf956dca85c27c23e4974b674c701ed28381399571a175bb66703d797f168e5ec050 *75773b260663e4fd7d76018de0a57cafc742eb3d0cb0598bd710b0eb36a527add81a50b2a1edc5 *798ad0ed743e194037bf061428736807e113f9e28d7c11fdded8a0cb3e5e1b2221e13e608f3678 *5bb9060309982cc0601dabc4363bfaacb17becac834376de7e065956b1059fd8c81c4b7fb0e4c4 *9ab1d695ebcc8086c814b463669e2871f3043b07c112d27c9370d342fa6f3a940368e5d41815cd *3198e6adf526cad089a8b5653edf28f1f946525b86cfbcd6de94a92dcdd99b8cd67ed930227b2e *6748f4be31d97e15433c73014b6986fa6986367ecd8f4dfff8dcfda774fc0f369ccf3aeeca83ff *6f96c77fbb7bf7b3e3ff9d9dbd3fc6ff9fe3f3ed9f36e781bf3970a69bfe7c3ab682f7b6eb1a8f *d9c41bcd5d9bbdc44eaa855d55d49f429a18803f93a3426770d3a554ead7a0bbea9fb0563bba86 *26c6beb2e66e8804fff0f42fe753eaffd11833e8ccdc15eb58e2ff3b7b0fb2febfb7055f7ff8ff *67f848fe3fb37dd730308e8f7e3d8419f64deb830583a1bf1a46301fb099e7deb2d6bd7b6df60b *a34e7f8297e1edcc36ef413e1ce91ebcfb2b1fb643e7e143c3c1c74d0c93d7ccb55672d5ce5d72 *12ce15238accfe590cbad632149f7ad8d02cd8bd2e9248ae90e22f1bdfb237af5e1f3efd07fb76 *e357f6a77472a686deffb1c9a6c8d0eafca5bd99ae4808467f7384e9b6a0f857e357ae9f7856f6 *4b5a3b81ac19b88ba5e0cef70fe23b0798cd995e7938fe8711d22fec82947def9dc98663bf8525 *befbae7dc97e65079c64422cb470f6f35f0f1ad9f575b3207d0e02428e6068b950af4867bd1eeb *b2bf715560cd175b9717dd4bb6cfd65beb30782582ad7513287286eebddb780c799083a8481bf2 *adb7d793aaf8802e90d9910a6fa70aa7b411f1c8eb2eac7aa7ba6a2042cb233d519a5596e6e566 *be330590ffdc9226d46fce228d25b3c791155a7c4c1e2bf3de2fa0f65fcf6118fb49fc7e020267 *5172e67cb42159a805f1285169672ea9aa0f8e7d2311ef31f89b24b492aa8244649791eb257739 *93709b4fe2884e4c93ee0d32797bac883247b637f7b9e6d0aed022c0f09e3d1d0392e0c743fcd3 *ddc3bf3bdbf8776f97fde8f9a387f41712f00b52f00b929e79f301d4f6dcf5ac1073dbd730fce7 *93a4bff27a86de64e24df315c5d453a52282a95ab0b582d9886d0dc71cffe8ebad03e188a2e58a *ed7d41e99724e9b76cfabfdb2cb06d9848871eae48859ec702d7bb3159e0316fe2f0b5c8209c5f *5df1a5c9a1377747ecbfb89c37b059d4878e70d10d9c0d19a57a8d6fb31c7581252e2cf00435f3 *29542acbb69c85f13c05bc77791bb50d3250965f8d6f852cdf33276037d62d0a83527438a3ce74 *e8ce4736ae3fda215f47ec686bcc8cf4569aa69a432f5f9ddcf5cbac5ab299f23115b02b6fb3d6 *de4edf4ea1636ca0ff2f1dffe5133a436b60d5190b2edbffb1757f2f3dfedbdedae9feb1fef359 *3eb83abfff3fff8300cd5bdcf8007fa081d8a774c285e13a437b1ad8fcd693b3673bd19d8d2bc7 *b5f7e1a6d8396458f370ecf982b8d85472d811fb4a7056c86bd92f4a678fecf7f87d700d19dd0e *b4838f0d30d4c0719df09697b017306075684f836b8cbd893db3ae055be3309ced6f6e42296f6a *8db0f426346f23db3786b80ce5f982042e1c19c1edd49b054ec06f9dd9eed586370b9d89f31143 *5f4229d02d8401a32520de17cfac30b47db10583460857d604b883c67e640743dfa1b5b1fd8648 *c63b42f6791f90ddab13ab753077dcd106b6173ca7989693e76e44d664ec71af0ba634b012325b *b08fadbc3ce53322fd602068532cacf5e30ce3c000bb0f7ccbbf859cbcd6117428d3112705f72c *98483ceeb15df6e73fb3476cb7b36dd2fd045d980a8802546df13c5b9d1dbc30c8b65e0050e451 *88603fe6465ee6839bd7e3216916fab07db67135f536401dd30d0f2475add90c54bb116b75e364 *1bb28c6062136c0cc7b635330c7b610fe7802a184344e007a36c0ca2a56fa80171ba01e060f27a *784ee44a8945dc1d52ba285ea7cbd3bb1dba54d58a294673131b862194e7fb2847977446db6bee *5863bf756bf5c7a7e94f69ff4fbedf4c1dcbe2bf5bb9fdbfbb3b0fb6ffd8fffb393ed5f6c7b67f *f53af4ed7fbfbb7dff0ffb7f8ecf72fb17f4fd9a75548effb7b7777677b7b2e3ff07bbdb7f8cff *3fc7271dfbc2984b51e00beff7f02f0f79c18fd27857f6261615912ef8d9967f27912d41391bef *12f5c088381de56a59ed4c7c8b1390825b98a5c71202693929ae54242825f4e88b8b8abf9465a5 *d24240fcdd4e5d248245e4b3f2469529082c48e4249648e44cfbb0ccb60fb9aa1ec6d67da863de *87924d1fb65317290b3f2c31f143751b3f2c31f2c33291bb7b6532434a8f7fc75277f774c40602 *89a8ddbd76fa2a2539afa340745ea39aec44a448f898484efa9ded32e921a5c7bf63e977b675a4 *070289bc3bdbedf4554a7a5e4781f4bc4635e9894891f431919cf47bbb65d2434a8f7fc7d2efed *ea480f041279f776dbe9ab94f4bc8e02e9798d6ad2139122e9632269e97910be487a9ed2e3df5c *7afaa92c3d2720e4a58b76fa2a9132ae232b7d5ca382f411919cf43291bcf4258e2f927ae247a2 *000ddf173424a125ef1797692514fb7f52ada21a8a5b801499bc224ada0091d4133f1245683403 *828624b9d41088cbb4228a9b82a45a45451437062932794594340722a9277e248ad06811040d49 *72a94d1097694514b70a49b58a8a286e175264d28a102b66458a10493df1832b82ff565684a021 *24e757edcc65226f5251561149b50a8a88c9e41491229356045f842cd2034fe9f16fae05faa9ac *044e40084d17edf45522685c475601718d0af2474472e2cb4472bd232da396f48f94d68b7ec57d *245ee8f4924426e919f1b29dbd4ef595516d05bd6554b75a7f290815f59812a1b44ec47614ab5d *a89524b5c7179fb956e867a94e924242eaf846c19d44de987e560f716d0a5a8888e4742013c968 *00d463d224ad5003712ae9519e0c6ace072ba6887125edfc9d1454ca678cd2a471905592392800 *4bc1dc11f3f5588658b1b2962b2cadb48cde56579d82368b355aacd54ac5a6743bcc6bd71c16eb *b750c598b9c78a08976b5a4ddb398de7957e277a573445b9394a4db2cc2a19c38c8a4c638e4a8d *53621f2cd1cbe92caea4da4ceaa62a3257a1c53e97d134ec586dcb2a7b2a98346755bbd8aea65d *65d952e362b15cd64c85cb6dac67e7125b9799fb37b4b826089603610918d4f0500089ab325098 *574b6051810c2c5b943f57b91a40f441520e940aac7c5970a9812035142d479232980af1745d8e *28f37a39a62a6185044a0a1530a28eae7a08ab445935d0be78acd5849f3a049560a883c412308e *abe0688e9500b9049348a5bc6421537ad0ac0fcf65105d8ad2af11a82b60570fbfaa18d6847129 *929d6a2c9b8e2a9a97021a4955162f6130836b5c5034f96266217aa574befa985e3bd55e3fad5a *53952a6b17dd4bafb056adb2ca2bad0a5102895c419c2047b04c854a7acc2933afd04694aaa6e8 *526d97aa7c99dad3aa570a22644817c6114ac8579a42dd1e85462936cc9d1947c360d556ab349d *8af9b226540c371454531272a8ac6cb94935ed5a6adc72037f5623eb1a5ec1fa4b21a00a833c14 *946314255596062a14aa5684461d7c5482a41a28bf39586a014815454a50d2815311a434621c15 *d557443a9419d181586d9c2d05db72c07d91a0ab0f442d342a43521796c5d0d40a972c61a5326a *a2c996365457c3ab1268d580fbd580774540eba35a0bda75e05d0671cd208c025b4b8231b598ac *07f90670af0c7e7507f8aa9da009c7a8e91dda2e52d74dca5d453bcaa3c8e2d270cf0a2ce7e399 *0f3138f6b03c6a19a5f32dd8fdd406f2beee26f2aa8de55265eda27ba9f05dcc48d156f3beb4dd *5c6d774844ae787f489a60990a95f49853665ea18d28554dd1a5da2e55f932b5a755afba79e461 *b909e2fd2345e42b4da16e8f42a3141be6ce8ca361b06aab559a4ec57c5913aa6f33c95653bed5 *a4bcb2e526d5b46ba971cb0dfc598dac6b7805eb2f85802a0cf250d0d99b525465d5069565552b *42a30e3e2a41520d94df1c2cb500a48a222528e9c0a908527a7b5bcaaaafdee1a2c6880ec46ae3 *6c29d89603ee8b045d7d206aa1511992bab02c86a6ee36992a5696ed96d1614b1baaabe15509b4 *6ac0fd6ac0bb22a0f551ad05ed3af02e83b8fee69b656c2ddf84a3cf643dc837807b65f0ab3bc0 *57ed044d38464defd07691ba6e52ee2a7576f7a8b0a8b2cda72ecb79d7e9ee997d7ea4bdcc3392 *1ce2047a3f7390beaf7f9abef0a68c81b8d276f1dd94e125960acfddf7e5c3f76a91a08464712c *284bb45cb1aaea2d5272a1a69b52b7b20daa2c51650f05a3642ca31a28ca5450162b2aa96499ad *f42c566ab772e3dda90535cdbadcb84b4dac6ae79cb1d5434a45d5958795aa2b55337f1d105443 *61091e3e3f286a2145152f6aa8d1824e017e74e250a5955705a39498d041547d5c29a04b05625f *08ce56009f1e043580a88fc64248eac5b1aa59a98e66e930a50fd255a1aa0a5865d47ec9d05d19 *cf7550ad8bed9a002f41b96e484c81b16591b11a4cd6c57d33e8d7f2013d47f8eabca12117a9ef *28b5dc65159f29751cfd409b2a9bcb036ef5995ecd959a74287db7aae15bbf0f076bd4eb56f5bd *fa1eb8b21b56f8629d489e16d32a21bd9585c87be7ceb6d9e70f6c2cf3b9248778be623ff398c8 *befeb3220b6fca80892b6d17df4d814362a9f0a9927df9d1926ab1bd8464716c2f4bb45cb1aaea *2d5272a1a69b52b7b20daa2c51650f05a3642ca31adbcb545016db2ba96499adf42c566ab772e3 *dda90535cdbadcb84b4dac6ae79cb1d5637b45d595c7f6aa2b55337f1d10544361091e3e3f286a *2145152f6aa8d1824e017e74627ba59557c5f69498d041547d5c29a04b05625f08ce56009f1e04 *3580a88fc64248eac5f6aa59a98eede930a50fd255a1aa0a5865d47ec9d05d19cf7550ad8bed9a *002f41b96e6c4f81b165b1bd1a4cd6c57d33e8d7f2013d47f8eabca12117a9ef28b5dc65159f29 *751cfdd89e2a9bcb637bf5995ecd959a74287db7aae15bbf0f076bd4eb56f5bdfa1eb8b21b56f8 *629dd89e16d32ab1bd9585c87be7deaed9e7af2329f3b92487787b483ff31294befe9b500a6fca *80892b6d17df4d814362a9f09d297df9c5296ab1bd8464716c2f4bb45cb1aaea2d5272a1a69b52 *b7b20daa2c51650f05a3642ca31adbcb545016db2ba96499adf42c566ab772e3dda90535cdbadc *b84b4dac6ae79cb1d5637b45d595c7f6aa2b55337f1d10544361091e3e3f286a2145152f6aa8d1 *824e017e74627ba59557c5f69498d041547d5c29a04b05625f08ce56009f1e043580a88fc64248 *eac5f6aa59a98eede930a50fd255a1aa0a5865d47ec9d05d19cf7550ad8bed9a002f41b96e6c4f *81b165b1bd1a4cd6c57d33e8d7f2013d47f8eabca12117a9ef28b5dc65159f29751cfdd89e2a9b *cb637bf5995ecd959a74287db7aae15bbf0f076bd4eb56f5bdfa1eb8b21b56f8629dd89e16d32a *b1bd9585c87827bdead6142fdb2df4b9540ef16edcec2b7e6bbce7b7f0660c18b9d276f1ddc4b8 *69960adf089c7a2db0426c2f45b220b65740b45cb1aaea2d5272a1a69b52b7b20daa2c51650f05 *a3642ca314dbcb575018db2baf6499adf42c566ab772e3dda90535cdbadcb84b4dac6ae79cb115 *637b25d595c4f69656aa66fe3a20a886c2123c7c7e50d4428a2a5ed450a3059d02fc28c7f6aa2a *2f8deda932a183a8fab85240970ac4be109cad003e3d086a00511f8d8590d488ed2d65a522b6a7 *c9943e485785aa2a609551fb254377653cd741b52eb66b02bc04e55ab13d35c62a637bf598ac8b *fb66d0afe5037a8ef0d57943432e52df516ab9cb2a3e53ea389ab13d0d3697c4f656627a35576a *d2a1f4ddaa866ffd3e1cac51af5bd5f7ea7be0ca6e58e18bdab13d5da697c6f69a10a2c03bbb7b *26ffaaf03a290fe7a3bbc7ff26ce12ddd1f285fc69707e37059da4f276d9fd345464e68a9020b3 *aa11ed93c896c4fb7284abd4ada1f512e59799a04143e89867899596184bcd6459c329070373d5 *94c6034bab5230a6be4d2b4d5b6de03b37730de3ab6140090a3a80c8c342236c58526d45e87069 *e5ea50a98d1805e0a8c0e73702517d6869214c0368fa702b029d56acb1928dca80a3323bda405c *158fcab05407e71705d195815b07bfda30ae0be662486bc62a15d85a12b1d466b02ecc1b42bb26 *e875a1ff153840536eb18277d47492d55ca5cc61b4c39eca6c2e8d7ed6667945276ad6976ab954 *3dc7fa6addab61a75bddf75672c1261cb1dc1d6b045335d95608aaae2c44332e7a279eba82c3ae *e2b6bf33e7bd1b976eccb31b70f0e6dcbccad96b456b6b89a114b66d4cac82066067dbe45f15fe *2ce5e10ced6cf3bf89d34577b45c297fe29fdf4de12ca9bc5d763f0d2799b92290c8ac6ac46f25 *b225f1db1ce12a756b68bd44f9652668d0103ae65962a525c6523359d670caf1db5c35a5f1dbd2 *aa148ca96fd34ad3561bf8cecd5cc3f86a185082820e20f2b0d088df96545b11bf5d5ab93a546a *234601382af0f98d40541f5a5a08d3009a3edc8a40a715bfad64a3327eabcc8e361057c5a3322c *d5c1f945417465e0d6c1af368ceb82b918d29af15b05b696c46fb519ac0bf386d0ae097a5de87f *050ed0945bace01d359d643557297318edf8ad329b4be3b7b5595ed1899af5a55a2e55cfb1be5a *f76ad8e956f7bd955cb009472c77c71af15b4db615e2b72b0bd18c8bde89a7aee0b0abb8edefcc *79efc6a51bf3ec061cbc3937af72f65af1db5a6228c56f1b13aba001d8db35f957853f4b793843 *7bbbfc6fe274d11d2d57ca3fd581df4de12ca9bc5d763f0d2799b92290c8ac6ac46f25b225f1db *1ce12a756b68bd44f9652668d0103ae65962a525c6523359d670caf1db5c35a5f1dbd2aa148ca9 *6fd34ad3561bf8cecd5cc3f86a185082820e20f2b0d088df96545b11bf5d5ab93a546a23460138 *2af0f98d40541f5a5a08d3009a3edc8a40a715bfad64a3327eabcc8e361057c5a3322cd5c1f945 *417465e0d6c1af368ceb82b918d29af15b05b696c46fb519ac0bf386d0ae097a5de87f050ed094 *5bace01d359d643557297318edf8ad329b4be3b7b5595ed1899af5a55a2e55cfb1be5af76ad8e9 *56f7bd955cb009472c77c71af15b4db615e2b72b0bd18c8bde89a7aee0b0abb8edefcc79efc6a5 *1bf3ec061cbc3937af72f65af1db5a6228c56f1b132bd3003cf3e603d736f957893f67f2f418ff *c5ff72a793ef28bb12cf5e7c37c659baf276d9fd040559e6b220c9b2aa18bfcd902d88df1612ae *52b786d64b945f6682060da1639e25565a622c3593650da714bf2daca6307e5b59958231f56d5a *69da6a03dfb9996b185f0d034a50d001441e168af1db8a6a4be2b74a95ab43a536621480a3029f *df0844f5a1a585300da0e9c3ad0874caf1dba56c94c66fb5d8d106e2aa785486a53a38bf2888ae *0cdc3af8d586715d3017435a237eabc85645fcb616837561de10da3541af0bfdafc0019a728b15 *bca3a693ace62a650ea315bfd562b3327ebb12cb2b3a51b3be54cba5ea39d657eb5e0d3bddeabe *b7920b36e188e5eea819bfadc1f692f86d234234e3a277e2a92b38ec2a6efb3b73debb71e9c63c *bb01076fcecdab9c5d3b7e5b5b8ca5f1db46c5ca3400cf5dcf0a4dfa5be2cda91c3d463fe80f77 *b7e45ad9852877e1cd185d72a5ede2bb89ddd32c6541916650315a9b225910ab2d205aae5855f5 *1629b950d34da95bd9065596a8b28782513296510ac7e62b288cc59657b2cc567a162bb55bb9f1 *eed4829a665d6edca52656b573ced88a41d692ea4a02ac4b2b55337f1d10544361091e3e3f286a *2145152f6aa8d1824e017e94e3a5559597864a5599d041547d5c29a04b05625f08ce56009f1e04 *3580a88fc642486ac43b97b25211e9d4644a1fa4ab425515b0caa8fd92a1bb329eeba05a17db35 *015e8272ad20a51a6395d1c97a4cd6c57d33e8d7f2013d47f8eabca12117a9ef28b5dc65159f29 *751ccd70a2069b4bc2882b31bd9a2b35e950fa6e55c3b77e1f0ed6a8d7adea7bf53d706537acf0 *45ed689f2ed34b837c4d0891f1cefe34b4af6ddf14df257e97cbd563e2a7f8e22e93bea7ec1322 *7fc9ed18445926dae52989e1f36c669191675a31fe97235d10032c215e6d043d63941ba5c236cd *9a48d372cb2db8dc92ca06cdd955297a585659610c7159856ad6ae67f5a5d65f0e82cf82859a10 *51878a32647491530020c588e492ea4b2293ca4ce8c16a3578a9c24c196dbf25e856c4a23e2675 *b15913a28548558e7daa31541a05d567ac1e7e9bc1b1269e7561fd05a2bb21d0d7077f4d2758cd *174a5c4223f6aac562451c760566577394661da69ee3d4f49fafc78d1af6aed5bd6c356f6bc4e9 *4a7d4f2b225c87e9caf870130234e39177e3992b79e86a8efad5fbeb1db97173eedc885b37e9dd *154eae19bd5e418c25d1ec46856ad6f5efb60968a22968a445f8bd360c77dc5e34df6e34d97edc *413352d99a68c7df57176c6944fe6e04cdb4314fbc853d6296c9bf07256d452e17280a7fd21fee *bec975a9274664daad984e04bd6c0515290914d22c647192664831ee9e225910732f205aad50f1 *3d54536c923b5555a1963555dd8a49976836ae5b2147910d540c91b68652b43c5f41619cbcbc12 *35fb88ef919e9d9252790eca8d56d772adb8b625068ad9d2c8596a5265bb668dab18c92ea9ae24 *82bdb4523d738befb29344caa54b185b82819581d08a1950b473cc718d12d508d183491e2bcab1 *e4aaca4b23c8aa4cd4438ff8be5a0d4509952a7e5520d51cae5a314f9a70898559a1a402e06aa0 *ae087a1a31dba5ac54c46935995a0d8ce2fbba195026d4968aa18cd03b80692b66b326ea62391b *a0a08adfba202e46b25604548db1ca98673d269bc1b6f81e378bf184aa9a747a80bf4bd4b762ce *57046fac82062969b9c34a3e51e6189a51430d369744095762ba595711dfceddb84c425d43e81a *fef3599ca8150bd3900fc4dab9038afadeb5ba8b95fb99763c4d97e9a5d1b32684308c6f7ee79f *f97480f26f0cbd69683953db0f36b63a5b9dedcd67d0246c024237dff01c9d7150b78e2df8eced *eed2377cd2dfddeefded077bdf74bbddbdbdfb0fb6f6f676bed9ea3ee86e75bf615b4d0a5af699 *43cbea032babd2c90af7957cb0fd3c3e7cf5e2cde18b23767e3bb39f5b13c775ecc0644f5fbf36 *d9bfa041786d85a1ed4fe1d64bebda19fe6005639309589ccf672e6616795ecc2d7f0497cf5d7b *e10c5cfb29c0ca5e84d29dbee8ca026caf0dacfee4f579ffe4d5d9bb173f3c651b57536fe3c6f2 *a71bde07db77add9cc995e6fcc04035464a3c90f50639ff0cf4b6f34776d469f7dc610fd1d407f *478889599e7ab35bdfb91e873c4b6bd8664723e075c4fe31b1c3906d6f6d7d4f779f59d6941ddb *ce7fed29dedcc6c2c7ced09e067644ffc9d9b31daa167c8efb1dddb6df23a583eb89e5b89da137 *c12c67a135008b84b7bca4bd98d9be33b1a1988bc9af3d3fce00c9536fba31a35b204d2b0483b2 *abd8a2d4bacf626b0adf6721d9b06d70751c4e997d75e50c1da882391348a2ca42c79b32ef8a05 *76187444d63307c724136b7acbaee6d32165995a13b06d6b300f81979085639b111778bfcd862e *8087dd38e118cbafbdf66d773eb2d7782913723b019b7053c0af7930b75cf716b9009180d3839f *e18673e5d8a30393d99deb8891c74ce4c9198e5137db4e678aa9e4b35b018d8304dd73e03eaf82 *75ccb18e0c0eac00cac0ddcd00c71d03cb45688f36b163b2fc5b16fa362ac3f39118bf80f29b03 *6f3e1d616fcff36fb6b1da911d0c7d6780b76ff745fdf0f90b00c09e8d014a87236b023a7abbb6 *7914db07adb18ffd1651025f61d630dc7cbb6652e9bf7b737f6ab958e773611fb87aed7bd7be35 *9960ee9dd66e7bfffefd9d8dfb7bdb263b1986de00a0d8fdfefb1d4ee1d1380c67fb9b9b373737 *9de0c609828ee574264ed8b147f3cdffb390a3cd274f361f776486ffde61af1c1bfcf7da764366 *4d47eca8f3b2c34e6da8d173479c3288f1842b29b02d7f384ed493d54e24cd59fff025fb6f2212 *f8c76c1ea214dbad6e1b1b2724d3fdfec14ec4cd2b2f04f48d2d0ec38c21c17c9bae7d156e0c1c *b4e226431341369b6722562ca472e5f80188e15fcff13efcb099e5de58b7019bf9f695edfbe842 *1e950d6ce8474726bbf27c70540b2b64ce1489accfa750e93a83847518cddb7eb8de61ec04a598 *fb816db298151468080d883705e40f6ce60d20f707de04dd200e6c822fb83b4860d1a5f3c1726d *74457027211cb4b2b63522870dfdf9309cfbbcb9880a472a82768f7bc295ef4dd85ae40f6b28d1 *3c10be1bb5202497350fbd09d432e4ed07b0cb4935d92a1ba20dc87b333398f40101c03f60188d *6ca652189fcec839e349d4d1cfe6893f32cfc6de8d790a5a4a15849eed2c738346887c506cb26b *3ba45fed4c269c781879e64ea0b5b642cf0f32d95b6fdfb60bb2ff736efbb799acd3b9eb666e61 *6b93b935b127e0bad9a25ef8b2e8be139ccd0156e1c9552e015a0760b93039cf2e74ef1c5e80b9 *0c257b320bb39220b65d3bcce5e50e91b93902470ceda50c4ca0a9cdea827c4d7c65150f70079f *456fc93101dd2238704e967cadcf1d37cce9f4aae8e6ccf243a7403bc10c9cb0e89e3057bece97 *d62c6bf1a23b2f3db0b937758605249e43e39b651a6f1554e64cdf6ebeb4163911a723482aba9b *cbcbcd97cf2dee97e47f5e588394962b37b1163846cdde75a674b710b2d0330568925ce25f6098 *1664cd82fd411644a15790115bd0dced823aa0edb1b1cf70f32442ef301896902e4f7906b76124 *1616e5a8e4853db307f3eb6b6cc2d35403681acfa13f2eb9fd238edfd249d00339697045f12543 *0cbac4588f8d9d1176712dee2f2622d037b18d3301be6da378888672e12089e493877a887707fa *05feddea74daed543abe4a2475a33f4d138016047ae985015311ec0fff0bf341eae6421b957a1d *e53d87cbce3fe7cef0fdd3b13d7ccf523488bbd6743e3003b8a724034c648c6f9d2bf6eedd8be3 *c3b317273fbefbe1f0ec1f47c7c7efde25552ec20ef54fdfda5368b690c5263a5726754a4d10fc *d570a657cec265dfb3b76f19f6de38a9629b27ade97793f666073a689bad27edee7ac7c0de8fed *efe3e09c59267a04b3daacf79877da16dbc8ff32265d243fd9663da90d677077b2dd9c66a0aa80 *4678a9f13c1f9b36a42c1a515198123fb4cb4b68ec1087f3386403679ac368ebc03ae818149ae5 *baa0ec18afcb78f827561a09fd9315051aadb6f4cb30702286531d205b1406b678e3486c1d2d42 *1f66153490f76d1887f1a1eecc1e3a80ef8fa09ea9077e0d4e03c3c2248a08e64d6c98a579389b *c1e816e9505e1c3e835c580386f43018e54ce734940d628aef91e400a9b54836f8518814fc3568 *67ae252a57ec3d5b80268730ece7d52f40e9b14e792890e29758f27d741167400b40c295240ef6 *35bce92091d07c240c0eeab9de286e301c3b2e8dc92d143366096b4c69abf52d7a05bf8ebed9b7 *ed5481bc042c25c2bb440420e7c004c384ab6fdb593160fe02addd5a76a4dd11f5ac4952824777 *d19f71563c9de338056b8de74b50299f03851d2a432e944641346ca5a49eb0c7165dae731c2642 *f09b010882ff7a2c28e0a41ff09001cddb70c089b5ff8df2618f92aefd89e7b94912ea8fd8801f *3db625113f9bc0a08df0388c86b75e12a98e49e64a08e4a64a0cb86997e23547f2096f7a78fc24 *ea89457b8414975192b32f52f0fd44621fb3efe8fb943deab12e6f5a289a0ef7fe5d58e2943dee *e1482cb4fec209c80044c4f9b217e10770f70170770bc0bb05e4659bad8830e4608f988fde4e94 *31b7f8a0e73ad377ec036bd137f2e5deb659668ec46941758b1d18436dc3ff1dacefd146cc1b54 *11d15aec48c4c2edb6b8fa8085fcdb764e4f29a94f7352bb75a5f63352bb0552c3bd8857c8eeb7 *35a5f60ba426a289d80b125b96da03c8f9378e8855469f727424dd47f4e17a13eee5e6924ea324 *3f97f46f9194a0f33bd68d7319d242686ee4100d04a32e2e616bc25b06209dcc4961a839834115 *dca34922bf07ce3bb4c2e85e40434279e5d5c27a5ed8533e782aaa8afaf623681093c49e7046a8 *f1d41ecd81d23b1c2a420b04a639f7e7b43b6d92e24ce4bb622d6adbb1e9c2063d80be482caac9 *995cf69390e627eada922b39974f23cea686493c4cd104b15fe3c1a2eb5db369dca8c77138a95b *f99bc1831c8523c74c33488dbdc88e4dfdb5279969389951f709437f1cebf12925e4887aa4e796 *0bf0bfc7debe63b751274a4e4f056f658f3f3ec744289be0fc45742bc1f7d13f236b1b4be5c5a8 *b92c731cc351163b2901de0d4221c57b2c5646d81c0e52f19f2668267088471a71bfde31f84fea *81b9338ace8edfef61ff6ca4093cf56d2b84b158127ae294924b899adc7f261916a2edeba2ea60 *00409534a5c06718d9684e797970510536c58905be28d06b7135f0c08a0ab0845a44819c4749ce *833a02d76139df89bcadc881a2a10af477e84b6dc9775e6432b89445eab2b8735de3981bfba5e6 *e68214036d18d6624a1c0d5c2d36a3782b0ba8b2bfb1966377d03a74c9a255348adab73b46363c *ab3c87a67621573ae8b200e7d32dea8ee1ea11ef9803181efcf9cfc04b90cedace4ded13398400 *98e1a005b97f4a0aff84450f5868bb6e8098c101063b08ba074c2a8953898360fb0085ac2b5e5c *2eecc21027160cae1e8921479893ecdf3c338826dfab59f1bff39d7b3280a25e2595399bf55d92 *99fa8a54ded458808fc1dad0bc43de2b5c3043b1e4fc30500eb3f77c768d13f4c46d5b6e685269 *f39a9e642885a07947d19833bd74a6cec47271956e813fee6af0803dc684d715b77834e1a6f64e *04b0f35d084dcee2e49cae33867a87ba5a94657f07ba7fd7262b4639dc382fce64cba6dc22cf7e *d2e5b1b1154003909568ada0a127c1b96ecb04b716958243724ef02c9cdb2c913c9f1ffff96d96 *880e59fc38f352d1ad4591e869998a44177d5c98377dd4c395da3cd5ad15da32637a1a7efbe505 *845fd284299e7eb792ecd4b52597efb2a39642a1d22a88852ab3675aa82233b939b3f600a3a505 *0a857263b1d0ca6da9742c54538dc71b9c8f7558936d06ba0b4df3b893e05a4cb4bb059afe03be *5c1fac636c681d9728dcf578097f9d30ba7e00fd31cf55d85b5c702b5c4a0611b9430c69f668e9 *cd3d0b7d67180a4e38f62139d7cda6b80d6f3ce2d38cf61fe0720ae2846f5440dfc17d02f16a7f *12a1c3e1973d1d42831fe20a54a7648bcb3cb0c59424de67b239b647d7f606f1b0c92cf7daf39d *703c210a3f24498cb6eff87249b8d91a38d7c8d54f940746030066e80ac34881ba2b01bc50c631 *a1bf47d86d8b54e8d4b3bd2ba47693541a1f90546f38390addc170b41dfd7c013f29a36148f98a *786d1177b4ae07b6a0d073c1ad0a8924fa7c0cc0ff160891ff9058120198a3ba1efe1d3bd9d2c5 *6edd63fff528a02c96e45e848206b455e2d6712808829f9755553c3ed94eb31ad55444849a14f0 *87897c0b4666ed6cf645c44c923dba85d953239cdc54bfb9a95bb291a0098ab92942425f767a6a *054b9dd69ae67c56f256a105da1a885bf0d25e0ddd4a52a3a6474a25b343258e50e80da43c65ce *99ce42d8113e8aca507051ca76771e4ae40b0605518797645aee19b918a0be13e66a0a4b3d7c82 *9bf1841fa58b2d0a7cae4db5a632470e96f7b8369f8b7f0e97ebcb5b749aa099733a722ca99694 *eb61e6236977207691be1dcc61a205c2da3cb292ea884d1678f266c078bb6ae94654dc2070c6f3 *d06aece11350e5212e083104ea07eceb71e39a201345a711e990952fa1459ae7eb6647ffcce43d *fa39c9fa0e0738efa2f926e59b58009d1e8c2d400fac75d649226187eca7b38eac9d9f989cfcc4 *14bb6c539f548e6a0287d11664aa3b6007ad684b0dbb38bc34938b27976d8c13c876d26cb05265 *4bbc3995a720689fcb13760f52fe1774d9a2cbdc2ef3bbd8136612b7d9629bb9dbccdf0662e838 *0e45591ef73029c4011c57a08ba7848ae6e9c79ef77e3e432a61b24602830637dde5a65804a8ba *db7266bf22f37508cc89ccb8b689513c1e6b88e3777fc735ef05ca249a2fa83d8c6277afbc708c *788554defec48936c6d74b058b0210d4b0cbfc558b06aa4eef7daa14ceeff260482c1ea89f0b87 *ba17e27453f2d0875897c569ac75e3bb0a69bb40b26db009da522b876d5c548f2bcd0c68937400 *2389e08a6fcb80a9c5c8195aa18db103ca5fdead6210acb0ff8c8ace96848b63fdb6de8a3e0b69 *a46c09d601a8a7ef49868ac2c63c349cce26592c952bce84fb61521a7a1da93f5a8541e878d2c4 *cb9b8a1154a9120db19b3cd623d9b5a2dc08a696a526c0b316366e3b87ee649d7c64bd63c420d1 *338d589934c502a544a6ca4c2db09309ffdb2ac642cfce2d55b7dcaee9625b975e2d8b93fdaee9 *47c9e99561ee9cc5e66f09fb532b6b722bf346358f819648a6ac51b974de7643eecc639ed6aca1 *7df1d2cacef42f71888862edeb136bb6cea0eba0687a84576f40a78af02c09b370af15b6c30757 *07b8d3cab68663394478101c10c2f07f3f5c0fd80d0c4dc6b8eec0030be2f804c5cfd3a39e8945 *2714683e0f6eee5cd10800c73b018e870e5a0bf3b67d60b283057bbbd963b7188fbee21b6eaed8 *ed816100ef1278e1ef4040987f0d0492371e67f773d1af0195bfc2584a3434e8d0eeca0ebfdf89 *f6e9a6bd1bc77862a041da8bb74c931a29e213ebd4a4251850c8fb801fc8a01318a8488a748882 *a4becd73eeb37802c4894e98e0e2cd10378cdaa3ce2677e389b3415be55cdc227263b3b1f5c1de *8ff4ff989a898b057b04daea81f0a8ae47a82d1060817b3b5c687e6ef98f4b5634e0e21f2c2bcb *1689c635132405f938d00d704043dac28d56a9926903299844ae343de6f998cc4806fcba050242 *839c29e5e66f417b9dbaf32e093336d703e36ef82668657b5c0fb7fd7d0017c91d3012bd0bcedc *e753da5349d3010fa7a5d0f5624129c6cb1bf541b2c37190dde64825aed847b43685187d7e95ed *e1bc20dca04a2813afc9d7ab6a6323a15f36ef8c72a099e14f9c1f9f3ae9c614dec11db4e647c3 *48b22c805db153af10e0905bbee63ba1e26d8ef236a8c53246587310220ffa60f90edfbcda68cc *5a6ec07220ea187450a17845e0c2ba14c98bc4cf1b9c9823bdbb91951fd708e38e0dfaaf245a1f *29a16308914a858f4426e9c5390954c0d2bac03383216ebf87aeb0a8da885645cd51960884adfd *36bbb8340abbf464bf8a1defd4c8571b7777850b0ff29a034bf2a6571c1cc066b4e92c19f0e15d *ae257e24abd9dd424fe68e4b8ae4473db978917637f1fcaba4e8800e41c2e8628483665c3983f1 *8c052da833b1717fb1c1a4e39d303cbc58407f88fb09622a98b2cf878cd2f919b6a07e3056cba2 *a97dfd292891a82933e6809415a97008d172a6331880f0029270edfce0429631c1c5d1cfe5b048 *34c217a4f2478930ce4a07ec80cc2290c37cc0ed859c76c9c455905d74a2f9ce05c56b2f454fe7 *4927a0c870405026b66ef0169e220e7029ef17bab8a42ff4aecbe4e6e232bab948eeb616fb8b05 *f55d31f17540f46261c8f5ad432f00447bece2e365f63e5208d6f9f4e013fbd8eb2da2ce279331 *e259de3e0b3dd47eba62c86468e3043c7f24ac92da6baf0d9e803c1fc6b0cb50940581d4b615a0 *289b5ba0694092f1307dcbb5a7d7800280104f4e5a1c60bcdba693c6e2d047283acec0e3ae0d23 *644c1ddb30700d66d6d04e9f6db686eff9ed4e440ee690e26c4a14b1f2d9b4d7bb8fcd39676a30 *0fc60e0ec6b019eaf01642b0cbb6086f883d8a4c44768d92efc7c905d0cc7c5a8beefe627b7fb1 *b3bfd8dd5fdc272c96e58d303d8cb665ef463fb6711353bc171174255feeb4d3d7f7e17ab128ab *e45dd5798f225372a9efafa554308d5410d83fb3a9cfee8994167d9de2ad619b4ddd5877994f7e *bf78fc81423da0ffd3c8f9f013db2ec9e3539e0dcc0cd83112dea06a7aa23038ed6dd08e21c8f9 *7ac27020898cb1db402ec377ad8856a562834a997a4ea1aca420510f8c413f068ce328396d0043 *e28f4173fd29b495433e6409f2e3a30eeb4ff1a7f591b6d3e05c5e3c5f034a5ac3903f5923b071 *50883dac98d95f590146ec267638f64601928b561330fac53b6e2400b354875a9521546f395371 *9a2ba055496c3336da8d1d2e4c6ff98f7b34f891db821f76b173e77b01e2cd7fbdcce6bf644826 *b227d7db4d058080171c9235b5afb7fcdc03fe2a388910592ddae2195d4bc207d8984897dbed06 *e741628d6af54f1e00485a084f3f73d2e331e5e035f4841833c47930de780dd2439738638f5977 *abcdee9196300107c4d0d7aec523c235d6e124503ba24b6b101674a2b7095a79cd20e9343ae84e *4641df3a5723bbf8e4316330ff1891ea7ab8086143477c8f0615a034f835f2486dfd11860e638d *ad5138ca5ebc8ec7daa4b59fae26d6eca798a221a8639aa841be7c665f59733734bec550adc81a *1991e7cc5a90bde5a167c1542be1c70cda822511496e2d0233a47b4496f11ec0b7c3b90f14a5b9 *00e46afcb4f59b903f9d297a449208f88bda83f960c3b7a6d776bca4ecf9ceb533b530448eed6d *879dd1e27252da7a8f3344eed14e00fd7efcf0252b489e5313a25aa091070f49b242fab585b061 *78667bea84e2b42a0c830e1332177c33000da5c113e63866b2497558c345d49650960edaf522bd *8500b70540877a48fc8b191acc0b1cdaf8cd77b94127cb238f515dd8101f9f5f960e90282eca69 *53de17e797fc9c7e7ce0162701517cdaf3e810ea85bc998278c28fe08bd74f8fb471dde8ccf5c5 *fbcb0ed5c3de271c5dc81b30ea900166494db47403b72212f43925200452077be15e7279fd4b41 *3e215daa2098125039c8fd08aa270258ecbd7d4bf3052486898f91b79819b1d61ab3440bbaae03 *08e3e9971400a785275ff019ede0073aa5ccdc5881584d15479908c94df5864d7926872da08f03 *16afc0416eac5b521c782637075fd79bfb360c72c4731261d604e585b107767863db5c4e726530 *84778963a78bb173c9e3755c79e2510289370091d81fb038184bc6303d634c503f70bd0332eac1 *d839684a95a4805cd457779f949177ff83c288b0114f9d22af8fa74ffc1c5094465e9e9b5af1a3 *40d9079cbca399538e856889b124d9e74ccbdb2d1bdfb79c343f0bc4d755b2f02e90f318db2cbe *6d08617111a65b9b92528ff2a59a60f8572366b71a1125cbfca2955d6ef8bcd98bf6bec9a7c0b8 *e153a951123ffde5273c240b433c8311abb39654c7f5a54a117053a244abcfe9bd7dc9a6042e95 *9bf07017cb5d67f410aa2688951cc4b11730740c028a451d887d0b20354c470fdafcecd7cc727c *3c2f66875d13fe6cb70fc463eea0a33ac0bb07347881b18b1de416cf30c3018cf2026aa2a1855c *8806122911a16565af29dceec7c53b06efa1150e4466b751f082b9a313b759a0149d82e47089f6 *43493ba1082278c8046e13646e6953563b85a5e2723e951385f03018a6a7d0d5724d3fe29bc32b *dee451701ee5b5ede3b2351a2db264e9c88076af381fbc90ce20889d06b9214134ce152772a5d1 *8886fa71834bda06a9a3cf5c37e6c4f473dbe6188e81b9423087750b435c7ef05b6c2ee6fbfcb0 *684d7514aa810735157421f8d4d0c54b922103c958dc326056223303cdd23d88094c799602b066 *d05a4e2a8fdc386f442a06300d576f631c0b1a129ac51e4481ea3b9ed24dc4d37cc9a4d149297e *c0377492091e1f0bc30402ba74e98131b8bc13c0dc8dd392fa7b31b27f44339c68581fcf06c4d0 *9e963e4c4aa6f2f21c02cd4a0f6813216fbe7cd6170b311448f7604c1484b8dd0cc4d9273d5fc8 *5b366876701e3dcc57e29ac7dd2f9218a798da444f36e66e30f47c98ca87148733859c4269030f *d787dcb2b9842c43fc3c2e5a5382ae658634a32d4db4f212b1233ffa06393ab50360567404512a *d2468e3a25751fca7ca6dc94cffcac20610968955089cd01637c94040f360ec7384fe0dbb30037 *1eaef34cede4841f09110f12229dc642e4046038bd7c3ef7510578008b7616e1026a6c29682aa6 *f8a42d649c8f1da3e966873d411378f45038f1c4ad6548ccdcf32f0b81878422e8094c45c7f4e3 *09f00b3e5f96d01a7ad7d48d74d2fa17594a941c41c472314c71ab0115b1293061e925de90a7e3 *fcc16769d553d80317a0f7997860996f0554013ea6793d80910de8d38c96af5a8f7aed5418462c *620111f0bed6a36c22373ef833674f2847d47d496b56f430425ab8632d8cd92487672edb14bfb4 *47117061a885589dda43182be123979dc8f531c6e4a5db2d674adb5770a301ebd30cf4e739c689 *e653be39d542afbfe5a4fbb47b0d37ae02a101ce52e9701190c403bdccc3bd73e35bce018ef7a2 *65076a12a0d3f9137beef9e17c0a8330dc0de7109d91670748723cf749a1d8a7b18113f2938508 *68dbff00ac7cf8f2020a7f478f6d8829f2fee2a793144e57a23954e6bc328b3773bca474df48e6 *1eb9335822a3b5c0f43863e6e0023d9fe9161f23e5e3a3b8f2a9a7ec23733f32ff23f6d79f52cf *0c13cf6138958f127f4c36f14231a0f83153ec342a762c17230ea292d1d3b12a1f5f253a28be06 *9fe884d6b262c1f93eec191fdeb11978f8347408b4f8e4fd6900b0937d158fa188a2664272a9d9 *0c59d361323de04f434cc65fd2588d36ddc94f419149c4a32c5ae3955684d3cda52123a14eb52d *998034415f526d630195a4b1dee75bfaa576baa9d680d75171b25e723a71ac20e773f4908088d9 *dc195e3c6c2f128b7c0b340b165d94f856e479e5be25fb48b4e73d796c5e8967a58ef62fa272fe *a2d2af7a77f0d89d6488b04fd4e59e381e1a18ac7070506f18d004e3bf1ac4b61a6a286b0e3408 *19217beeac991ba520b68ce4c989ecb178945e34d79d98ee3a16483d329bcfce22fb4e98bb4e8e *9b376a4cc4cf12a1e73ba689305fdece947fe2d4880f020a1fcb116f774f57813b187a18138b2f *a50789e325cce1d2250a15de4ae6c0e9dc34bea86cf30a3a5024b830e316560a003216cf681705 *8aa7a743e25c161225e75a4f5a6b7c066bf2c18acaf69fa4c8eed3d01e376e8945c4021dd3c6e0 *69f23c9535939544760a0d967de44891c1ac45ca60fc527ac23b3758ba8086bd2c852eaa6018c3 *cde52e35570ee256147a489b0b609eea5c554c844fb2293251c1f379944c746a873ebe51254859 *5a5a2c22c55bc278013db58cf6fbcd66f688e7b1e2dd8326bd84440446d6e968154cf7680a2b3f *6c4f3c42bfd8623cd4d48a9f4edc8eb3e79a2e51519c01771753d8a69576958582e0427f772c38 *7fa380b2e0227bb9e02243a1e0387a6b3030950d7c884bb90fa59e90af982fb01f3d1767bb52e1 *a9205ef78f220d5718271fd943e85703f1c01983c587c2921d64930e2eaef81edfc7d9e6db0368 *c471191d508bccc8df5603e369e9b90ff25a6ac49534988cc5a0c92245958299371d09b1b0d4c5 *0d6d33a6b725ad8b69b844010fe3476fcc0971d279d1dd14ec1592bbf7d6726763eb9e4402a827 *ef378aa6fa1d5ea3d839c40725822e57a5440010e45a505a2c3cec741eecde4fe6e4303ab9b67c *9880dbc9cb8ba4c2916af90679f12622119e88a313c9d01bd54f719d58fd74152b1ab763cfa373 *c7ce14df44163803174dcc0d2a553db6ad0f0e7f58215fc616e796e25196d8684881831140dc9f *e08e708942b44260c13c6b8ea1023c2b48d386582e69c7899885d9b2ee422f2f2c0f5324e6b325 *fb39f4ba0f590a102b326a049475dc37133a433789ebf0e30370b191b163d67abb9dbddd3d71aa *375635d4b1dd5128cc4d9f2fdceddcdfd91571da0d76c85cef06775c085a2e6d62a2ad9e141359 *4745d9b8b77b3dfdce828e283e76aec752f959b478416b67be1dbf3d8ca4df100f1f470860d026 *7edf13ee71015c8ebc097f360585a293578ff11d754368026883031d974c424ec8ed077c42f3cc *0ac71e34f0ce109a801b0f9f94811d7cc0c371872e0543f19572c3b1e70cf1bc3434ab230f4d35 *c3f71038e2cd3d5c34d7056af3eb3136077c332b8f5922ca516452762c381e588da6f6e000218f *80316e8be8182bb465f83a250b777cf0f5420c7291634fa5e3b0943b88bddc10d0dacd05ba684b *2d057881ad1b67146d12c166338eb9228889842d36aff3d7def91ef67d82656a88810a296d8346 *45b893dff21d2fa03d3b44000f13fc3c8f9e1b141db5e0f376aaa9327219379951e4d212ed0586 *294174805e10b66973369480fe00e549bc5af8320045f877ecd578d2c0b647304e4a8c66609392 *284b489b042d79cd71c96ca892163fa260a5c928c858f450248c5a500cba9dc8d2a518ea0f8454 *eb06a78ca2f7032606f8006f01ab805e7138b6296a8fa72968e35df4606ab19d3a59bdf3e6fe10 *e34323d1748fed389c39a479e90063a2d7fc19e2f4ba3e2c1fb8f87a08b4f834e5bea276278c89 *20c4b91a08bc924f7079a099c063a62d5e5098f0e72452bcbfd1c6bbe453b8dcf31e89c50743e2 *ca0dd66c48855cc4e4ca876115bef2846ec18868d7e0b77b80a906f736f0153aa7b1b7b6c867e7 *704936391d6bd194839ff71bd0e9182b959bceb2068674682419d2248799a2c3acc999259ca77c *5cc77359741896e6bf3fe39d5686fa3a5be010b2c16752472f856a8260e6601cedd88e4699626b *68e4b3f12906be7b24da29470d2f0fd98a6dafb8a904dfc5878b68e844fcd5331d237a3f95b468 *2e6d1697de43425bbe93ecdc3af2dbad68102fb60304a4dbecf95b796b4baa2432c59bf989353b *e04b3150c17299fb57ec000be3b3050c76801c1cc0dc866d0a3137d31a91823762bc2ded2ea41c *481208212ff4bc827524b96ed27407dfe9c3b9146f434b4a1906bdafe7313677a0a9e329bb57aa *9b7b85a7062fba9dcefd4b20b30bffbfdbd8d886af4f0c7f75e35f3b3ce93e7c29d5477f14aafb *94aaf253b6e64f29063ea933c1e555e14210fc243124d5c8640e19bf6282437c4743aad2421ce3 *9697e8d92ee9f06206d719388614f2a36bfae00919c42666fd21ce054d12f4ef6b6b46f6306392 *39ce18e73592b44a962f388797d9df92087822c3c854e50e2c1f4603f4b7222424de6844859f60 *5e5eae933ae6f1e9ed74ad3ae297be94260ea5b4f1587dba16a884656a71534fb589682542b670 *1600a4b99c6d7e7d44610971c767998d0a48e1471a80d1a8927394cfa2ca702575b7947a4604ce *b22b098142896b57820a614e192ea51049a0ab8d8f1278642d57890f56069066f0a146aac3aa4c *5769b9447db1ad84a9aaf1a043944342809823800881f18b4c2d244b3768999aa979a24bfaf464 *95b4c48b7c5abe4d737f5e73bbc4d2e956ce19098492e281c1146309f262bb247023bee4a11d94 *88df89f92e366919932d98d6b882d50caff87e3dc3a0b7ece1cbc4b852e832f9f4d81af421d014 *0b2b9a2cd17c468ce8b7211b9c9380ee696d9fc44adb0dd3589cd6d850f3308866a577f29c149c *753b57220c842fbde71b2ce35762d3508966861d83ef8fab7e8c24bded416ca433a4bd08708907 *4ba3b9365d50367eecd430a21405f231115e8178177a6a4b6aea22fd428728bf38d3121dc04e35 *889933ebf202096daaf4f0894c784e160f61d02f896aebd1029b06e966eb31dca1031509cd7751 *f36818b18a0ac3e92472a2c565cb3def622ec5f2e777d1f227bdc5eed3a738e191fcd636480786 *939c528adb46098b3795c57c7179a3abd49e072e6462ec72296540d0e0cbb7614849d778448caf *0cf0ebcc33ac938caaf60c3e26aaa29c4965ae19fff4db154f2fa04f8bb89af26db693363696d3 *ef26dff123d51fa949a3a4e063259977d91b502e5a1dc98086c86dd1abd79a6a64cec59b7c9b20 *f7ab81a1bc68a07bd19f86c9e004a31a71ea8237a8f2636630ad8b8738a23c3863d8debaa484ed *54c2ce96b9fd7da7d315893be952e6aeb9673efcdedcded9de31efef98bb3bf073d7bc6f3ef8de *ec6e9b90b00b7f1e9abb908c7f21ff43b8b173d9e40be0a2372137b705cff899c7a870c3346f08 *e8121abb2be73aba2b9f70a7fb3d7c6c13fc1040fa45dc7f692da8f9efb1fb5b5b22cd4cd29e63 *5f4b69d9c4e8cdbc3df6764a2dcdc8f9c0a66c1b9a9a9d7626ef11f4dcb7515ecbbf0ea2b84d74 *e81c0aa237b2efbe63176cfded601d1ce81d1e430e58b4dff9577a315f733daa3f70606aefe3eb *276d2bf0a6d6400eec35f922e3dc8319a6f389e8d3622ef287f3ad3889ef3c820e046e51dc620b *5706dfdbb7e94777f2c3403c0555dddd42a3195121e9514749fde08a688af4d70b3c3d1eadda46 *c5794739a571e014fb86ada8de5ebc724f47c93e61d6c73dcc5d9c9cde4b039d8cf70b83bc60ec *e1d8f3b00d763d73ece4dfe1c93f7f659354e6aeb9b3559e976fd371cd894f8df2a4d76b75f7f7 *41d0760f8b6e9795cc7ca864f48a0628b96d76754aee2425bb1a25254d519da5dc829ca413c958 *2d67031f5b113d2466e29697f553655bce775d1aa724650bdea71a97158f06a05da3add0236c39 *edf8cc4cc1e7577a4169537efcaff8b8c67a73216cff5f99412e7719934fbd4d6c3069ffb678c8 *67f675dafced71e16d42e9cae06fb2f1f1284be2d9f7d85bf2381c8ec387de35ee5ce1bb6ce376 *a8cdd6a28b35f1308e245b322ada827cb435a334d363f4d8687417d238100bd1f25c45a1ee56ba *d0de2e149ad823673ea92845b9684931ca24cd00f8e35a4323560fb863345288556b259a15cd92 *55acdba870ace248e3718e37536705fa71e97c0506f6b5eff8652a312e1319389a0b35772495d6 *0f4de01d2786a6d89bd690039058bc06b10a150fcee5a4051f9ec74f40146f17edc9fb9bdb4249 *9ccfd8ad04c958d9b93cef55f41955fd9e85e97a9ec5afeb1415c9762eaa5414782fa61cb81dad *35899ff8d026c88ea23c72b5f45824513727522da39c67898ce43642d0c2ba1bdc0e25dea2de24 *7efe2e8e6564d4c0a4d445a502487e712ed5974fecf2f57f282f94931cff8a50f032da995e5c39 *4f6ea8f678a77d934b8bf40aa726ad41046368a63199a4956ba41ba9a430753b4a153a915e1e16 *99842ae1ce56e29749fb22e78df6b60a92a9a7f891f7c90f604d4a1f068137e44186a486b2df99 *9a7959fe62a57047aebd1b8b862954bd78c79a2c311692c83df526932a4e32b553f650bcd2a397 *a29cd487f577db510f84ef1e6ad47ed9f74bb5a58a52f3f9f8472204e58159fd2d8ff84a0f8d93 *c9cacf926a4b57b7419b8f1bf19942f874be005fffd36ad1efb76f6951614065f82fca1fb5e461 *a34ac8bcb24652031a6e8916304bb112d26fd4d153034a2c74119369e343bb501d58a6c12e811e *55dd641374c203b6f248b8154de2ee9b305b6dd3b3caa672e34b4fa5bbd8ea74a63469bb8cdade *eae714f3faa247b21658477efe6a2b512deab1173ff63b659bb651f8d670d148496f0da7bd17b4 *3d1adf1211efbd8e0fda88e722057219fe20607c710a64be763ed853beef98de12c19f1ee9db33 *d78acfe7603e3ca44cb9a293751a6f278fdbcccc7b4c726f24c39bf2cb4d528d2f182bf8987d79 *3952b893f7960fa443f68641f34d8d439fc9a9467ec4311f18ff0e9faf2ba8836ee9f8fe133caf *8015885fbfb06b3be43fa16e0ba6b2f1bbc65a473f9ba0769a229af83441f3098ffb739764b878 *75cb5ff334b05ddadb03669d79f8f2b0c337e7272f0fcffb4f0f8f8fffc35e1cbd3a3a3d3c3f7a *8687dea3d851d099b91df68cce5cc2e42bc4b4b1351dfd895150f05b673a74e7239bad894316fd *b8dc3858338c6ffef8fcf1f9e3f3c7e78f4fcdcfff031bded12500fc0100 }
getBoxed :: a
unboxed-containers-0.0.1: Self-optimizing unboxed sets using view patterns and data familiesunboxed-containers-0.0.2: Self-optimizing unboxed sets using view patterns and data familiesunboxed-containers-0.0.1: Self-optimizing unboxed sets using view patterns and data families